Skip to content

[Refactor] simplify agent extension#881

Merged
dingyi222666 merged 3 commits into
v1-devfrom
fix/simplify-agent
May 27, 2026
Merged

[Refactor] simplify agent extension#881
dingyi222666 merged 3 commits into
v1-devfrom
fix/simplify-agent

Conversation

@dingyi222666
Copy link
Copy Markdown
Member

This pr simplifies the ChatLuna agent extension implementation across computer backends, tools, skills, sub-agents, and service wiring.

New Features

None

Bug fixes

  • Keep sub-agent markdown file names safe while satisfying lint for control-character filtering.
  • Preserve default tool availability and backend behavior through smaller helper paths.

Other Changes

  • Refactor computer backend/session/service code to reduce redundant locals and branches.
  • Simplify tool registry defaults and permission/config item normalization.
  • Simplify skills and sub-agent catalog, parsing, rendering, scanning, and runtime helpers.
  • Validation: yarn lint-fix completed with no errors. Existing max-len warnings remain in read_chat_message.ts and extension-agent/src/sub-agent/builtin.ts.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 27, 2026

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: d710d35e-d632-4ae3-bb20-051e3091b1a2

📥 Commits

Reviewing files that changed from the base of the PR and between 4cb0aa1 and 55638dc.

📒 Files selected for processing (5)
  • packages/core/src/llm-core/platform/model.ts
  • packages/extension-agent/resources/skills/agentcli/bin/agentcli.cjs
  • packages/extension-agent/src/skills/catalog.ts
  • packages/extension-agent/src/skills/scan.ts
  • packages/extension-agent/src/trigger/executor.ts
💤 Files with no reviewable changes (1)
  • packages/extension-agent/src/skills/catalog.ts
✅ Files skipped from review due to trivial changes (1)
  • packages/core/src/llm-core/platform/model.ts
🚧 Files skipped from review as they are similar to previous changes (2)
  • packages/extension-agent/src/trigger/executor.ts
  • packages/extension-agent/src/skills/scan.ts

<review_stack_artifact_start>
<stack_title>重构与内联化大全</stack_title>
<stack_summary>将大量辅助函数内联、能力声明统一、临时目录与环境注入规范化,并对后端、会话、技能、子代理、权限与工具调用路径进行广泛等价重构。</stack_summary>

跨多个子系统的等价重构与实现内联,覆盖计算机后端、会话管理、文件 I/O、技能扫描/导入/渲染、子代理与权限合并等。 local/e2b/open_terminal 后端:能力声明内联、临时目录与 TMP env 规范、bubblewrap 探测与绑挂、桌面能力降级/移除等。 range_69431494ff2d range_12448b58918f range_681d6e2057dd range_bd973019f0e5 range_383cd3354aed range_6dac145b7dad range_334f4827e0d4 range_59ed5149c613 range_2660bbb4be7f range_86420e0d545f range_f0938d33466a range_56ae265316c0 range_40ef18a8e382 range_ba17e79d45ff range_887d8d44d41d range_2854e3c95d1a range_61535abaf9d6 range_ad2597a76646 range_01d0dfaad888 range_0f82a844fd81 range_5aeab017b37d range_d89555da152d range_e5def9b418f9 range_da0fb4ea311f range_9a69e269ccf3 range_a0424629d567 range_100d5a0a889d range_de2bda62df03 range_ddbe35554274 range_fe4931eab6ca range_b06466847568 range_8365377bb226 range_50686c288de1 range_479bd0a20879 range_07bd32204472 range_1d5842ab2cca range_6e798444336e 子进程运行与输出解码、readFile/writeFile/editFile/glob/grep 实现重构;Skill materialize 的本地/远端路径与删除流程内联。 range_681d6e2057dd range_bd973019f0e5 range_59ed5149c613 range_2660bbb4be7f range_4fb1650ef604 range_420d6b4ad4ef range_2b8bc8192e9f range_2c415f156307 range_db7aedcf350a range_865c241d80a8 range_7db68556c43c range_c36d7a4c89f7 range_cce9e661a111 range_3b0322404183 range_8adc0f4e778f range_36604cb63f2b range_2ff67ef5c31e range_3ba729767d88 range_be8b8abd603f range_b8907a99d386 range_ea0dc3937f2e range_1971e94a9543 range_a239fddaf37c range_6193e491cd85 range_8c8aa1df5f30 range_37ea6bc51a1e range_44ff1c88ba0b range_140448f88984 range_82d64ca4544b range_e2226f8b2cc2 open_terminal 的 asset/stream/headers/url/toWebSocket 重构,e2b 的 run/mapCommandResult 与桌面接口降级改动。 range_d42f4c415648 range_8d4ea7493677 range_f1e7a795c0bf range_4791b1894e03 range_faac1b18c6e1 range_80ff3901c57a range_83028f074d3a range_ed8f0182a2cc range_1886c4fa52f1 range_6dbb34784400 range_0251cad6ddcf range_e436405286ad range_04556164eaf7 range_9ba6290a9bfe range_b030f6d1850c range_7be7b456bd61 range_003a0777bde3 range_937943c33e83 range_1d511aefa167 range_f4412af94890 range_fe4931eab6ca range_b06466847568 range_8365377bb226 range_50686c288de1 range_479bd0a20879 range_07bd32204472 range_1d5842ab2cca range_6e798444336e shell 命令解析(git-bash/PowerShell)、terminal 创建环境注入、BashTool 后台任务与 run/execute wiring 重构。 range_fa2ffff520a5 range_bff8f045ae9d range_315800dbe669 range_58ba44fe27e8 range_d4909d948d4e range_e4c740e38187 range_673124d654ae range_5569eae33ba8 range_acff0e8e053d range_82a4a5132a9a range_da4f499ba823 range_ef903f95d81c range_5adb6290e357 range_78e902336424 range_1dda22e2dd29 range_97e2e972092f range_377ae18459ec range_a0104d84b156 range_037948291f75 range_ce8250e4044e range_c4cc7e18fedf range_bec1aa23ea20 ComputerSessionStore 查找抽取、permissions 工具/后端可用性重写、createMainToolMask 与 canUseTool 的合并逻辑调整。 range_44d820810e2e range_d1deac5fbf93 range_68c55ad1f21d range_ce8250e4044e range_c4cc7e18fedf range_bec1aa23ea20 range_fb0e1041b904 range_a4cc5a592c63 range_f3218864884d range_b0ff24f272d7 range_eaf42dba80cb range_712384ab3cf0 range_c4574d927062 range_c5c334bca78f range_fc1b9d8f672b range_033f2f52a4c0 scan/import/render/manage/watch 大量重构:scanSkill/parseSkillText/availability、importFromGithub/zip 解压、renderSkillContent、exportSkillArchive 等。 range_3e6f7c7a5480 range_1230aaf05bdc range_5ca6bd034668 range_bf6c6f664f63 range_8039318320a0 range_7f775ae8e14d range_fd330ed6f2c2 range_01d23379628f range_fdf6da36e3ca range_c54391c0b9a4 range_819cb3b419d1 range_72c2a89861fd range_87ff04486060 range_bed6fbcc6a9d range_987ca16d3607 range_5e1565a99959 range_23ddc528de5d range_f9c864259f4a range_78e429ab2ed9 range_b441deeb6f4f range_42ad49122346 range_15b4f30d01d6 range_29291e8a7f38 range_3d685f1d07fc range_4b53d099a64a range_2d1276af9b10 range_d443947bf0c3 range_0496b48b3be7 range_808734a3ea4b range_c385d42e0428 range_85cb54671ea3 range_7ecbaedbc086 range_333f28f5cc0e range_6301219feb4d range_a09bf5e3b5f8 range_1ce8e9e831c4 range_1bfb82da1cf3 range_141c335865db range_087fcd0fb2dd range_ef2fc983b8a9 range_0df3e4b5722a range_c30020a27e10 range_97b6251c18d9 range_b0cf8593a7ee range_6efe18d562a2 range_13294f5b5fab range_b6d2d5b0d886 range_dbf47dc77a6e range_0bf9e20c3bda range_7884df3c1e88 range_5acc03d11e1d range_0259dfbe1fb4 range_129fa218dfb3 range_f16ea5830754 range_4d3eed5e8cd2 range_d9cff6913bb0 range_87fc2d48d627 range_be8b8abd603f range_b8907a99d386 range_ea0dc3937f2e range_1971e94a9543 range_a239fddaf37c range_6193e491cd85 range_8c8aa1df5f30 range_37ea6bc51a1e range_44ff1c88ba0b range_c70a83b9db49 range_2053451c24d3 range_cca6ea5949ba range_e926dfed226e range_da4eff6de0d4 range_f6bdfa7047f0 range_52ab7d78f2f5 range_6b59f7c28859 range_877414533e79 range_6363c3d8ca8c range_6714b2e1d1fc range_7a5fce00b46f range_3c8d6353f74b range_454861c67e70 range_062f5a996003 range_9959c37ae456 range_e52823d07f52 range_93cea517644f range_5395ab3fc123 range_7795f58e5a87 range_fc51c3a82d88 range_88baca674e8b range_11365cfd46e5 range_c8eefb55550c range_2ac31cd38af6 range_6578c75c477b range_d8f6dff67a1c range_8dde90ff4b02 range_1217d239f75d range_f9c6aa071e87 range_39ef609ad2d9 range_9c647153814b range_25f376ec07f0 range_9fe408facd97 range_15b5396a33bc range_0ca5d905e2a4 range_0f9bc482efc7 range_4ac18523503e range_9e9dbf955d21 range_c8bde46f9be0 range_1263c6408d94 range_fbc0d7b588ba range_a3528aa4b721 range_b10387c82185 range_3c444c79a1fd range_2fa8e8324f09 range_2e37543ddfbe range_dc9b44d28d98 range_d0c52eb4f152 range_055187f9bf54 range_560be0edc70d range_ec5317928596 range_dd733d5305a3 range_40c5aaea2366 range_40fd70feda6f range_67ce82465608 range_dceccdbe788b range_a35071874809 range_774cea57ad73 range_db2b7b7946eb range_be41891e1a8c sub-agent parse/run/scan/manual/preset/render 等内联重构;createInnerAgent 的模型/embeddings/工具/提示组装内联。 range_02bea5833a85 range_ca6444015892 range_494fc63a5761 range_7022124ffa88 range_7022124ffa88_2 range_a7e0c8ae562b range_100d5a0a889d range_de2bda62df03 range_ddbe35554274 range_f744754e2d8e range_140448f88984 range_82d64ca4544b range_45723ce4b5d9 range_aac0fec575b4 range_6006e191eaa1 range_8fcc78450ef8 range_84ff3ff57758 range_682b58e1f44f range_7c8d738a9724 range_a9930856af30 range_893e65e6e695 range_11cb39ba280e range_ea7df238a204 range_65a119c68d82 range_02c0b747bdef range_629ff6466dcf range_856e8fc67cc3 range_d427b98d7b34 range_f36af6054dae range_206f0badd45d range_7eb21ecf01e2 range_72782e7d71a3 range_3cae6e539ada range_1d11fb9da17f range_a14c2a8217a8 range_d76a973433ce range_2f389f035d3b range_b895e9fa4d2d range_db8340f01746 range_f9d770f4129d range_0b0384a737cf range_0f8789fbf386 range_5a949b6b3657 range_24bca86da8b3 range_9eb1b7e163e8 range_56fd5d2c2b07 range_2941aaf65a9f range_e3b34ca62b9c range_d13ea0bae56a range_33d4b79ebf7c range_0bb897f86ad6 range_c71128cc3b55 range_ff5ca3e64c5d range_b2405e4e2a95 range_afbfe5af5ad4 range_dd7f02c694d7 range_d10d8ef324c0 range_8291da7bffa1 range_1e9613a892e0 range_e312ab18ecbb range_21b552f47c3f range_8caef38585c4 range_df49f0d80ad0 range_5a0caff87612 range_802d94d56764 range_40d85b6be24d range_5824903b0a9d range_d30fb20e924d range_cd1d6bee43be range_0574d7e718f0 range_71d180b8a0af range_eb423d9b31b9

Walkthrough

改动为一次大规模等价重构:将许多辅助函数内联、能力声明统一为类内数组、规范临时目录与环境注入、重写技能扫描/导入/子代理解析与权限合并逻辑,并删除或合并多个模块级常量与小型辅助函数,保留大部分对外签名兼容性。

Changes

单一变更集合

Layer / File(s) Summary
All edits (多个子系统)
packages/extension-agent/...
覆盖计算机后端(local/e2b/open_terminal)能力声明与临时目录管理、沙箱与 shell、会话查找/管理、文件读写/编辑、技能扫描/导入/渲染、子代理解析/运行、配置与权限合并、MCP/触发/工具调用、若干日志文案内联与辅助函数删除,均为等价重构或实现内联,绝大多数对外签名保持不变(变更摘要已标注的少数参数重命名/移除除外)。

Estimated code review effort: 🎯 5 (Critical) | ⏱️ ~120 minutes

Possibly related PRs

  • ChatLunaLab/chatluna#801: 与本次在 local/sandbox 中关于 bubblewrap 探测与 BWRAP_PROBE_CACHE 的重构直接关联。
  • ChatLunaLab/chatluna#794: 与本次对 open_terminal 与 e2b 的桌面/流/命令结果处理变更存在交集。
  • ChatLunaLab/chatluna#832: 与 materialize/技能同步(remote skill dir reset/materialize)逻辑的改动有重叠。

Poem

我是只爱整理的兔子,
把函数与常量都揉成一朵,
能力搬回类里住,临时目录有了规矩,
扫描、物化与权限都排好队,
代码短了,夜更静了。 🐇

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/simplify-agent

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request refactors and simplifies various components of the extension agent, including backend sessions, sub-agent parsing, catalog building, and path utilities. The review feedback highlights several critical type safety and runtime robustness issues: a potential TypeScript compilation error under strictNullChecks in store.ts due to un-narrowed map lookups, a potential runtime TypeError in run.ts from accessing the computer service without optional chaining, an unsafe property access on a potentially null error object in agentcli_sync.ts, and a type mismatch in e2b.ts where getDesktopInfo returns null instead of the declared undefined type.

Comment thread packages/extension-agent/src/computer/backends/local/store.ts
Comment thread packages/extension-agent/src/sub-agent/run.ts Outdated
Comment thread packages/extension-agent/src/utils/agentcli_sync.ts Outdated
Comment thread packages/extension-agent/src/computer/backends/e2b.ts
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: ffebac582d

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread packages/extension-agent/src/sub-agent/scan.ts Outdated
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 6

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/extension-agent/src/sub-agent/parse.ts (1)

374-397: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

readNames 的兼容映射作用域过宽,可能错误改写 skill/mcp 名称

Line 374-397 对所有名称都执行 mapCompatToolName(),但该函数只适用于工具别名。当前 readNames() 同时用于 skills/mcpServers/通用权限字段,可能把合法技能名或 MCP 名称错误映射为工具名(如 readfile_read)。

🔧 建议修复
 function readNames(value: unknown) {
     if (typeof value === 'string') {
         return value
             .split(/\s*,\s*|\s+/)
             .map((s) => s.trim())
             .filter(Boolean)
-            .flatMap((s) => mapCompatToolName(s))
     }

     if (!Array.isArray(value)) return []

     return value
         .flatMap((item) => {
             if (typeof item === 'string') return item
             if (typeof item === 'object' && item != null) {
                 const keys = Object.keys(item as Record<string, unknown>)
                 return keys.length > 0 ? keys[0] : []
             }
             return []
         })
         .map((s) => s.trim())
         .filter(Boolean)
-        .flatMap((s) => mapCompatToolName(s))
 }

并在仅工具解析处显式映射(例如 Claude/OpenCode 的 tools 分支)。

Also applies to: 119-124, 283-287

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/extension-agent/src/sub-agent/parse.ts` around lines 374 - 397, The
readNames function incorrectly applies mapCompatToolName to every name
(affecting skills and mcpServers); change readNames to return raw normalized
names without calling mapCompatToolName, and instead apply mapCompatToolName
only at the tool-specific parsing locations (e.g., where Claude/OpenCode tools
are handled). Concretely: remove or gate the .flatMap((s) =>
mapCompatToolName(s)) call inside readNames (or add a boolean parameter like
applyToolMapping defaulting to false), update callers that expect tool alias
mapping to call mapCompatToolName explicitly after readNames (or pass true), and
ensure callers for skills and mcpServers use the unmapped result so skill/MCP
names are not transformed.
🧹 Nitpick comments (3)
packages/extension-agent/src/computer/background.ts (1)

67-80: 💤 Low value

lines.pop() 返回类型为 string | undefined,可能导致类型推断问题。

虽然 split(/\r?\n/) 总是返回至少一个元素,所以运行时 lines.pop() 不会返回 undefined,但 TypeScript 仍会将 rest 推断为 string | undefined。如果启用严格空检查,{ pending: rest } 可能导致类型错误。

♻️ 建议添加非空断言以明确类型
     const lines = (pending + data).split(/\r?\n/)
-    const rest = lines.pop()
+    const rest = lines.pop()!
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/extension-agent/src/computer/background.ts` around lines 67 - 80,
The variable `rest` is inferred as `string | undefined` because `lines.pop()`
can return undefined; update the `const rest = lines.pop()` declaration in the
block that iterates `lines` (using the same `lines`, `rest`, and `marker`
identifiers) to assert non-null so the returned object `{ pending: rest }`
matches the expected `string` type—e.g. replace the assignment with a non-null
assertion (or a `?? ''` fallback) so `rest` is definitively a `string` before
returning.
packages/extension-agent/src/computer/backends/open_terminal.ts (1)

239-309: 💤 Low value

editFile 中检测多重匹配的 indexOf 偏移量与 e2b.ts 不一致。

这里使用 content.indexOf(oldString) + oldString.length 作为第二次查找的起始偏移,而 e2b.ts (line 305) 使用 firstIdx + 1。两种写法都能正确检测第二次出现,但 firstIdx + 1 更简洁且与另一个后端实现保持一致。

♻️ 建议保持一致性
         if (replaceCount === 1) {
+            const firstIdx = content.indexOf(oldString)
             if (
                 content.indexOf(
                     oldString,
-                    content.indexOf(oldString) + oldString.length
+                    firstIdx + 1
                 ) !== -1
             ) {
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/extension-agent/src/computer/backends/open_terminal.ts` around lines
239 - 309, The multi-match detection in editFile uses content.indexOf(oldString,
content.indexOf(oldString) + oldString.length) which is inconsistent with the
e2b backend; change it to capture the first match index (e.g., const firstIdx =
content.indexOf(oldString)) and then check for a second match with
content.indexOf(oldString, firstIdx + 1) so the logic is simpler and consistent
with the e2b.ts implementation; update the editFile function accordingly (use
firstIdx variable) while keeping the same error throw when a second match is
found.
packages/extension-agent/src/service/trigger.ts (1)

692-710: 💤 Low value

建议使用 ??= 简化 Map 初始化。

当前模式先检查再设置,可以用更简洁的写法。

♻️ 建议的简化写法
 private _queueDeferred(
     key: string,
     pendingKey: string,
     item: DeferredWakeup
 ) {
-    if (!this._deferred.has(pendingKey)) {
-        this._deferred.set(pendingKey, new Map())
-    }
-    this._deferred.get(pendingKey).set(key, item)
+    const map = this._deferred.get(pendingKey) ?? new Map<string, DeferredWakeup>()
+    map.set(key, item)
+    this._deferred.set(pendingKey, map)
 }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/extension-agent/src/service/trigger.ts` around lines 692 - 710, In
_queueDeferred, replace the explicit check-and-set with a nullish-coalescing
fallback when initializing the per-key Map: instead of the if
(!this._deferred.has(pendingKey)) { this._deferred.set(pendingKey, new Map()) }
pattern, use this._deferred.set(pendingKey, this._deferred.get(pendingKey) ??
new Map()) so the entry is created only if missing, then call
this._deferred.get(pendingKey).set(key, item); keep the rest of _queueDeferred
and _replayDeferred unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@packages/extension-agent/src/computer/backends/e2b.ts`:
- Around line 504-506: The getDesktopInfo method currently returns null while
its signature is Promise<DesktopInfo | undefined>, causing a type mismatch;
update the implementation of getDesktopInfo to return undefined instead of null
(or if null is intended, change the return type to include null), locating the
function named getDesktopInfo and the DesktopInfo type to ensure the return
value matches the declared Promise<DesktopInfo | undefined>.

In `@packages/extension-agent/src/config/defaults.ts`:
- Around line 47-49: Remove the banned helper function normalizeMode and inline
its logic at every call site: replace calls to normalizeMode(value) with the
conditional expression (value === 'allow' || value === 'deny' ? value : 'all');
update the callers createToolItemConfig and createSkillItemConfig to use that
inlined expression where they currently invoke normalizeMode, then delete the
normalizeMode function declaration and any imports/refs to it.

In `@packages/extension-agent/src/config/read.ts`:
- Around line 63-68: The current items construction replaces default
base.tool.items with cfg?.items, losing defaults; instead merge base.tool.items
with cfg?.items (shallow, so cfg overrides same keys) then feed the merged
object into Object.entries before mapping to createToolItemConfig; update the
items assignment that uses Object.fromEntries(... Object.entries(cfg?.items ??
{}) ...) to use the merged object (referencing base.tool.items, cfg?.items, and
createToolItemConfig) so missing or partial user configs preserve default tool
items.

In `@packages/extension-agent/src/sub-agent/parse.ts`:
- Around line 63-67: The detection logic treats 'maxTurns' as evidence for
Claude (the clause checking 'disallowedTools' || 'permissionMode' ||
'maxTurns'), but ChatLuna also supports 'maxTurns' in its branch (see the
chatluna branch around the frontmatter handling at lines ~157-160), causing
ChatLuna agents with maxTurns to be misclassified as Claude; fix by removing
'maxTurns' from the Claude-detection condition (or alternatively move the
ChatLuna-specific detection to run before the Claude check) so that only
properties unique to Claude (e.g., 'disallowedTools' or 'permissionMode')
trigger the Claude branch while 'maxTurns' is left to the ChatLuna branch
(update the condition that references frontmatter accordingly).

In `@packages/extension-agent/src/sub-agent/scan.ts`:
- Around line 73-77: The hint selection in scan.ts incorrectly only checks
combined.includes('/claude/agents') so paths like '.claude/agents' miss and fall
back to 'chatluna'; update the condition that assigns hint (the ternary using
combined and ScanTarget['hint']) to detect both variants — e.g., check
combined.includes('claude/agents') (or add an OR for
combined.includes('.claude/agents')) so that any path containing "claude/agents"
sets hint to 'claude' and preserves correct later defaulting of format.

In `@packages/extension-agent/src/utils/agentcli_sync.ts`:
- Around line 149-150: The helper isMissingFileError calls (err as
Error).message.toLowerCase() which can throw if err isn't an Error; change the
guard to safely extract a message: check for NodeJS.ErrnoException code 'ENOENT'
first, then derive msg using a safe expression (e.g., if err is an object with a
message use that, otherwise stringify err) and call toLowerCase() on the
resulting string so non-Error values (null, string, etc.) won't cause a
TypeError; update the code around isMissingFileError to use this safe message
extraction.

---

Outside diff comments:
In `@packages/extension-agent/src/sub-agent/parse.ts`:
- Around line 374-397: The readNames function incorrectly applies
mapCompatToolName to every name (affecting skills and mcpServers); change
readNames to return raw normalized names without calling mapCompatToolName, and
instead apply mapCompatToolName only at the tool-specific parsing locations
(e.g., where Claude/OpenCode tools are handled). Concretely: remove or gate the
.flatMap((s) => mapCompatToolName(s)) call inside readNames (or add a boolean
parameter like applyToolMapping defaulting to false), update callers that expect
tool alias mapping to call mapCompatToolName explicitly after readNames (or pass
true), and ensure callers for skills and mcpServers use the unmapped result so
skill/MCP names are not transformed.

---

Nitpick comments:
In `@packages/extension-agent/src/computer/backends/open_terminal.ts`:
- Around line 239-309: The multi-match detection in editFile uses
content.indexOf(oldString, content.indexOf(oldString) + oldString.length) which
is inconsistent with the e2b backend; change it to capture the first match index
(e.g., const firstIdx = content.indexOf(oldString)) and then check for a second
match with content.indexOf(oldString, firstIdx + 1) so the logic is simpler and
consistent with the e2b.ts implementation; update the editFile function
accordingly (use firstIdx variable) while keeping the same error throw when a
second match is found.

In `@packages/extension-agent/src/computer/background.ts`:
- Around line 67-80: The variable `rest` is inferred as `string | undefined`
because `lines.pop()` can return undefined; update the `const rest =
lines.pop()` declaration in the block that iterates `lines` (using the same
`lines`, `rest`, and `marker` identifiers) to assert non-null so the returned
object `{ pending: rest }` matches the expected `string` type—e.g. replace the
assignment with a non-null assertion (or a `?? ''` fallback) so `rest` is
definitively a `string` before returning.

In `@packages/extension-agent/src/service/trigger.ts`:
- Around line 692-710: In _queueDeferred, replace the explicit check-and-set
with a nullish-coalescing fallback when initializing the per-key Map: instead of
the if (!this._deferred.has(pendingKey)) { this._deferred.set(pendingKey, new
Map()) } pattern, use this._deferred.set(pendingKey,
this._deferred.get(pendingKey) ?? new Map()) so the entry is created only if
missing, then call this._deferred.get(pendingKey).set(key, item); keep the rest
of _queueDeferred and _replayDeferred unchanged.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: fa20caf3-c93c-4deb-bd9a-a05095539374

📥 Commits

Reviewing files that changed from the base of the PR and between 90a781b and ffebac5.

📒 Files selected for processing (56)
  • packages/extension-agent/src/computer/backends/e2b.ts
  • packages/extension-agent/src/computer/backends/local/index.ts
  • packages/extension-agent/src/computer/backends/local/sandbox.ts
  • packages/extension-agent/src/computer/backends/local/security.ts
  • packages/extension-agent/src/computer/backends/local/shell.ts
  • packages/extension-agent/src/computer/backends/local/store.ts
  • packages/extension-agent/src/computer/backends/open_terminal.ts
  • packages/extension-agent/src/computer/backends/types.ts
  • packages/extension-agent/src/computer/background.ts
  • packages/extension-agent/src/computer/materialize.ts
  • packages/extension-agent/src/computer/proxy.ts
  • packages/extension-agent/src/computer/session.ts
  • packages/extension-agent/src/computer/tools/base.ts
  • packages/extension-agent/src/computer/tools/bash.ts
  • packages/extension-agent/src/computer/tools/file_edit.ts
  • packages/extension-agent/src/computer/tools/file_read.ts
  • packages/extension-agent/src/computer/tools/file_write.ts
  • packages/extension-agent/src/computer/tools/glob.ts
  • packages/extension-agent/src/computer/tools/grep.ts
  • packages/extension-agent/src/computer/tools/publish_file.ts
  • packages/extension-agent/src/config/defaults.ts
  • packages/extension-agent/src/config/read.ts
  • packages/extension-agent/src/service/computer.ts
  • packages/extension-agent/src/service/index.ts
  • packages/extension-agent/src/service/mcp.ts
  • packages/extension-agent/src/service/permissions.ts
  • packages/extension-agent/src/service/skills.ts
  • packages/extension-agent/src/service/sub_agent.ts
  • packages/extension-agent/src/service/trigger.ts
  • packages/extension-agent/src/skills/builtin.ts
  • packages/extension-agent/src/skills/catalog.ts
  • packages/extension-agent/src/skills/import.ts
  • packages/extension-agent/src/skills/manage.ts
  • packages/extension-agent/src/skills/render.ts
  • packages/extension-agent/src/skills/scan.ts
  • packages/extension-agent/src/skills/slash.ts
  • packages/extension-agent/src/skills/tool.ts
  • packages/extension-agent/src/skills/watch.ts
  • packages/extension-agent/src/sub-agent/builtin.ts
  • packages/extension-agent/src/sub-agent/catalog.ts
  • packages/extension-agent/src/sub-agent/manual.ts
  • packages/extension-agent/src/sub-agent/markdown.ts
  • packages/extension-agent/src/sub-agent/parse.ts
  • packages/extension-agent/src/sub-agent/preset.ts
  • packages/extension-agent/src/sub-agent/render.ts
  • packages/extension-agent/src/sub-agent/run.ts
  • packages/extension-agent/src/sub-agent/runtime.ts
  • packages/extension-agent/src/sub-agent/scan.ts
  • packages/extension-agent/src/sub-agent/session.ts
  • packages/extension-agent/src/sub-agent/tool.ts
  • packages/extension-agent/src/utils/agentcli_sync.ts
  • packages/extension-agent/src/utils/fs.ts
  • packages/extension-agent/src/utils/path.ts
  • packages/extension-agent/src/utils/remote_path.ts
  • packages/extension-agent/src/utils/runtime_sync.ts
  • packages/extension-agent/src/utils/shadow.ts

Comment thread packages/extension-agent/src/computer/backends/e2b.ts
Comment thread packages/extension-agent/src/config/defaults.ts Outdated
Comment thread packages/extension-agent/src/config/read.ts
Comment thread packages/extension-agent/src/sub-agent/parse.ts
Comment thread packages/extension-agent/src/sub-agent/scan.ts Outdated
Comment thread packages/extension-agent/src/utils/agentcli_sync.ts Outdated
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@packages/extension-agent/src/trigger/executor.ts`:
- Around line 274-279: 检查分支在判断 target 是否为对象并使用 'bot' in target 时缺乏对 null 的保护;在
executor.ts 中定位使用 target、session 和类型 Session 的代码块并在结构性检查前添加 target !==
null(或等效的非空检查),例如把 typeof target === 'object' 改为先确认 target !== null 然后再检查 'bot'
in target,以避免在 target 为 null 时抛出 TypeError。
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 23a5dcc4-5b64-43ee-9555-139542554994

📥 Commits

Reviewing files that changed from the base of the PR and between ffebac5 and 4cb0aa1.

📒 Files selected for processing (28)
  • packages/extension-agent/src/commands/agent.ts
  • packages/extension-agent/src/commands/mcp.ts
  • packages/extension-agent/src/computer/backends/e2b.ts
  • packages/extension-agent/src/computer/backends/open_terminal.ts
  • packages/extension-agent/src/computer/background.ts
  • packages/extension-agent/src/config/defaults.ts
  • packages/extension-agent/src/config/read.ts
  • packages/extension-agent/src/index.ts
  • packages/extension-agent/src/mcp/content.ts
  • packages/extension-agent/src/mcp/storage.ts
  • packages/extension-agent/src/mcp/tool_call.ts
  • packages/extension-agent/src/mcp/transport.ts
  • packages/extension-agent/src/service/trigger.ts
  • packages/extension-agent/src/sub-agent/parse.ts
  • packages/extension-agent/src/sub-agent/run.ts
  • packages/extension-agent/src/sub-agent/scan.ts
  • packages/extension-agent/src/trigger/dsl.ts
  • packages/extension-agent/src/trigger/executor.ts
  • packages/extension-agent/src/trigger/listener.ts
  • packages/extension-agent/src/trigger/provider_registry.ts
  • packages/extension-agent/src/trigger/providers/activity.ts
  • packages/extension-agent/src/trigger/providers/cron.ts
  • packages/extension-agent/src/trigger/render.ts
  • packages/extension-agent/src/trigger/scheduler.ts
  • packages/extension-agent/src/trigger/task_registry.ts
  • packages/extension-agent/src/trigger/tool.ts
  • packages/extension-agent/src/utils/agentcli_sync.ts
  • packages/extension-agent/src/webui/index.ts
✅ Files skipped from review due to trivial changes (4)
  • packages/extension-agent/src/webui/index.ts
  • packages/extension-agent/src/trigger/providers/cron.ts
  • packages/extension-agent/src/trigger/listener.ts
  • packages/extension-agent/src/mcp/storage.ts
🚧 Files skipped from review as they are similar to previous changes (9)
  • packages/extension-agent/src/utils/agentcli_sync.ts
  • packages/extension-agent/src/config/read.ts
  • packages/extension-agent/src/sub-agent/run.ts
  • packages/extension-agent/src/sub-agent/parse.ts
  • packages/extension-agent/src/computer/backends/e2b.ts
  • packages/extension-agent/src/sub-agent/scan.ts
  • packages/extension-agent/src/computer/background.ts
  • packages/extension-agent/src/service/trigger.ts
  • packages/extension-agent/src/computer/backends/open_terminal.ts

Comment thread packages/extension-agent/src/trigger/executor.ts
@dingyi222666 dingyi222666 merged commit b272a80 into v1-dev May 27, 2026
4 of 5 checks passed
@dingyi222666 dingyi222666 deleted the fix/simplify-agent branch May 27, 2026 09:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant