@cjhyy/code-shell-core 0.5.0-rc.2 → 0.6.0-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (387) hide show
  1. package/README.md +13 -10
  2. package/dist/agent/agent-definition-registry.d.ts +3 -0
  3. package/dist/agent/agent-definition-registry.js +3 -1
  4. package/dist/agent/agent-definition.d.ts +15 -0
  5. package/dist/agent/agent-definition.js +27 -3
  6. package/dist/arena/context/context-tools.js +47 -4
  7. package/dist/arena/ledger.js +9 -1
  8. package/dist/arena/strategies/utils.d.ts +1 -4
  9. package/dist/arena/strategies/utils.js +7 -84
  10. package/dist/automation/cron-expr.d.ts +10 -0
  11. package/dist/automation/cron-expr.js +23 -5
  12. package/dist/automation/runner.d.ts +21 -4
  13. package/dist/automation/runner.js +48 -12
  14. package/dist/automation/scheduler.d.ts +38 -0
  15. package/dist/automation/scheduler.js +89 -12
  16. package/dist/automation/store.js +5 -2
  17. package/dist/capability-control/disabled-lists.d.ts +25 -0
  18. package/dist/capability-control/disabled-lists.js +57 -0
  19. package/dist/capability-control/overlay.d.ts +15 -0
  20. package/dist/capability-control/overlay.js +27 -0
  21. package/dist/cc-orchestrator/agent-adapter.d.ts +50 -0
  22. package/dist/cc-orchestrator/agent-adapter.js +133 -0
  23. package/dist/cc-orchestrator/cc-capability.d.ts +19 -0
  24. package/dist/cc-orchestrator/cc-capability.js +53 -0
  25. package/dist/cc-orchestrator/codex-session-discovery.d.ts +24 -0
  26. package/dist/cc-orchestrator/codex-session-discovery.js +191 -0
  27. package/dist/cc-orchestrator/codex-session-history.d.ts +25 -0
  28. package/dist/cc-orchestrator/codex-session-history.js +187 -0
  29. package/dist/cc-orchestrator/external-agent-changes.d.ts +19 -0
  30. package/dist/cc-orchestrator/external-agent-changes.js +214 -0
  31. package/dist/cc-orchestrator/external-agent-driver.d.ts +18 -0
  32. package/dist/cc-orchestrator/external-agent-driver.js +69 -0
  33. package/dist/cc-orchestrator/index.d.ts +8 -0
  34. package/dist/cc-orchestrator/index.js +8 -0
  35. package/dist/cc-orchestrator/relevance-judge.d.ts +15 -0
  36. package/dist/cc-orchestrator/relevance-judge.js +29 -0
  37. package/dist/cc-orchestrator/session-discovery.d.ts +46 -0
  38. package/dist/cc-orchestrator/session-discovery.js +125 -0
  39. package/dist/cc-orchestrator/session-history.d.ts +19 -0
  40. package/dist/cc-orchestrator/session-history.js +67 -0
  41. package/dist/cli/agent-server-stdio.d.ts +15 -1
  42. package/dist/cli/agent-server-stdio.js +115 -17
  43. package/dist/cli/agent-server-tcp.js +40 -26
  44. package/dist/context/compaction.d.ts +56 -0
  45. package/dist/context/compaction.js +186 -0
  46. package/dist/context/manager.js +25 -4
  47. package/dist/cost-tracker.js +5 -61
  48. package/dist/credentials/cipher.d.ts +49 -0
  49. package/dist/credentials/cipher.js +45 -0
  50. package/dist/credentials/cookie-jar.d.ts +24 -0
  51. package/dist/credentials/cookie-jar.js +40 -0
  52. package/dist/credentials/index.d.ts +7 -0
  53. package/dist/credentials/index.js +5 -0
  54. package/dist/credentials/inject-credential-tool.d.ts +20 -0
  55. package/dist/credentials/inject-credential-tool.js +130 -0
  56. package/dist/credentials/store.d.ts +72 -0
  57. package/dist/credentials/store.js +184 -0
  58. package/dist/credentials/types.d.ts +56 -0
  59. package/dist/credentials/use-credential-tool.d.ts +29 -0
  60. package/dist/credentials/use-credential-tool.js +205 -0
  61. package/dist/credentials/use-gate.d.ts +56 -0
  62. package/dist/credentials/use-gate.js +52 -0
  63. package/dist/data/model-metadata.d.ts +77 -0
  64. package/dist/data/model-metadata.js +56 -0
  65. package/dist/data/model-metadata.json +216 -0
  66. package/dist/data/openrouter-models.d.ts +18 -7
  67. package/dist/data/openrouter-models.js +35 -8
  68. package/dist/engine/aux-key.d.ts +10 -0
  69. package/dist/engine/aux-key.js +11 -0
  70. package/dist/engine/dynamic-tool-defs.d.ts +19 -0
  71. package/dist/engine/dynamic-tool-defs.js +36 -0
  72. package/dist/engine/engine.d.ts +267 -138
  73. package/dist/engine/engine.js +957 -191
  74. package/dist/engine/friendly-error.d.ts +18 -0
  75. package/dist/engine/friendly-error.js +63 -0
  76. package/dist/engine/goal.d.ts +145 -0
  77. package/dist/engine/goal.js +144 -0
  78. package/dist/engine/image-policy.d.ts +13 -0
  79. package/dist/engine/image-policy.js +24 -0
  80. package/dist/engine/model-connections-pool.d.ts +17 -0
  81. package/dist/engine/model-connections-pool.js +66 -0
  82. package/dist/engine/model-facade.d.ts +10 -0
  83. package/dist/engine/model-facade.js +25 -0
  84. package/dist/engine/patch-orphaned-tools.js +3 -0
  85. package/dist/engine/resolve-llm-config.d.ts +16 -0
  86. package/dist/engine/resolve-llm-config.js +44 -0
  87. package/dist/engine/runtime.js +2 -1
  88. package/dist/engine/sandbox-cache-key.d.ts +10 -0
  89. package/dist/engine/sandbox-cache-key.js +9 -0
  90. package/dist/engine/sandbox-config.d.ts +31 -0
  91. package/dist/engine/sandbox-config.js +38 -0
  92. package/dist/engine/session-usage.d.ts +19 -0
  93. package/dist/engine/session-usage.js +25 -0
  94. package/dist/engine/steer-queue.d.ts +32 -0
  95. package/dist/engine/steer-queue.js +26 -0
  96. package/dist/engine/streaming-tool-queue.d.ts +12 -0
  97. package/dist/engine/streaming-tool-queue.js +50 -10
  98. package/dist/engine/turn-loop.d.ts +67 -3
  99. package/dist/engine/turn-loop.js +292 -41
  100. package/dist/engine/types.d.ts +175 -0
  101. package/dist/engine/types.js +13 -0
  102. package/dist/external-agents/config.d.ts +2 -0
  103. package/dist/external-agents/config.js +15 -0
  104. package/dist/external-agents/types.d.ts +31 -0
  105. package/dist/external-agents/types.js +1 -0
  106. package/dist/git/utils.js +11 -6
  107. package/dist/git/worktree.d.ts +48 -0
  108. package/dist/git/worktree.js +86 -10
  109. package/dist/hooks/goal-stop-hook.d.ts +28 -0
  110. package/dist/hooks/goal-stop-hook.js +186 -9
  111. package/dist/hooks/registry.d.ts +8 -0
  112. package/dist/hooks/registry.js +19 -0
  113. package/dist/hooks/shell-runner.js +10 -21
  114. package/dist/index.d.ts +49 -6
  115. package/dist/index.js +60 -4
  116. package/dist/llm/capabilities/param-specs.d.ts +14 -0
  117. package/dist/llm/capabilities/param-specs.js +62 -0
  118. package/dist/llm/capabilities/rules.js +4 -0
  119. package/dist/llm/capabilities/types.d.ts +10 -0
  120. package/dist/llm/client-base.d.ts +28 -1
  121. package/dist/llm/client-base.js +119 -13
  122. package/dist/llm/model-cache.js +4 -2
  123. package/dist/llm/model-pool.d.ts +14 -0
  124. package/dist/llm/model-pool.js +13 -0
  125. package/dist/llm/provider-auth.d.ts +41 -0
  126. package/dist/llm/provider-auth.js +76 -0
  127. package/dist/llm/provider-catalog.d.ts +4 -0
  128. package/dist/llm/providers/anthropic.js +64 -14
  129. package/dist/llm/providers/openai.d.ts +36 -0
  130. package/dist/llm/providers/openai.js +257 -51
  131. package/dist/llm/reasoning-setting.d.ts +3 -3
  132. package/dist/llm/reasoning-setting.js +9 -1
  133. package/dist/llm/stream-watchdog.js +5 -1
  134. package/dist/llm/token-counter.js +9 -2
  135. package/dist/llm/types.d.ts +4 -0
  136. package/dist/logging/sanitize-messages.js +22 -0
  137. package/dist/lsp/manager.d.ts +1 -1
  138. package/dist/lsp/manager.js +40 -10
  139. package/dist/model-catalog/builtin.d.ts +12 -0
  140. package/dist/model-catalog/builtin.js +407 -0
  141. package/dist/model-catalog/gen-connections.d.ts +20 -0
  142. package/dist/model-catalog/gen-connections.js +28 -0
  143. package/dist/model-catalog/index.d.ts +41 -0
  144. package/dist/model-catalog/index.js +90 -0
  145. package/dist/model-catalog/params.d.ts +20 -0
  146. package/dist/model-catalog/params.js +45 -0
  147. package/dist/model-catalog/resolve.d.ts +48 -0
  148. package/dist/model-catalog/resolve.js +33 -0
  149. package/dist/model-catalog/save-entry.d.ts +32 -0
  150. package/dist/model-catalog/save-entry.js +104 -0
  151. package/dist/model-catalog/types.d.ts +561 -0
  152. package/dist/model-catalog/types.js +93 -0
  153. package/dist/model-catalog/upsert.d.ts +9 -0
  154. package/dist/model-catalog/upsert.js +8 -0
  155. package/dist/onboarding.d.ts +12 -82
  156. package/dist/onboarding.js +61 -326
  157. package/dist/plugins/gitOps.d.ts +19 -0
  158. package/dist/plugins/gitOps.js +73 -4
  159. package/dist/plugins/installer/checkUpdate.d.ts +16 -0
  160. package/dist/plugins/installer/checkUpdate.js +32 -0
  161. package/dist/plugins/installer/codex/convertCommands.d.ts +19 -0
  162. package/dist/plugins/installer/codex/convertCommands.js +46 -0
  163. package/dist/plugins/installer/codex/convertMcp.d.ts +5 -2
  164. package/dist/plugins/installer/codex/convertMcp.js +45 -5
  165. package/dist/plugins/installer/install.js +25 -1
  166. package/dist/plugins/installer/installFromArchive.d.ts +43 -0
  167. package/dist/plugins/installer/installFromArchive.js +134 -0
  168. package/dist/plugins/installer/installFromSource.js +8 -2
  169. package/dist/plugins/installer/loadPluginAgents.js +6 -2
  170. package/dist/plugins/installer/loadPluginMcp.d.ts +9 -2
  171. package/dist/plugins/installer/loadPluginMcp.js +35 -2
  172. package/dist/plugins/installer/pruneDisabled.d.ts +24 -0
  173. package/dist/plugins/installer/pruneDisabled.js +73 -0
  174. package/dist/plugins/installer/types.d.ts +5 -2
  175. package/dist/plugins/installer/types.js +1 -0
  176. package/dist/plugins/installer/uninstall.js +4 -0
  177. package/dist/plugins/installer/unzip.d.ts +14 -0
  178. package/dist/plugins/installer/unzip.js +82 -0
  179. package/dist/plugins/installer/update.d.ts +14 -0
  180. package/dist/plugins/installer/update.js +53 -21
  181. package/dist/plugins/loadPluginHooks.d.ts +47 -1
  182. package/dist/plugins/loadPluginHooks.js +73 -1
  183. package/dist/plugins/marketplaceManager.d.ts +7 -0
  184. package/dist/plugins/marketplaceManager.js +20 -0
  185. package/dist/plugins/pluginCommandHook.js +4 -18
  186. package/dist/plugins/pluginContent.d.ts +30 -0
  187. package/dist/plugins/pluginContent.js +83 -0
  188. package/dist/plugins/pluginInstaller.d.ts +13 -0
  189. package/dist/plugins/pluginInstaller.js +42 -8
  190. package/dist/plugins/schemas.js +1 -0
  191. package/dist/plugins/types.d.ts +6 -0
  192. package/dist/preset/index.d.ts +7 -1
  193. package/dist/preset/index.js +96 -6
  194. package/dist/product/types.d.ts +1 -1
  195. package/dist/prompt/composer.d.ts +27 -0
  196. package/dist/prompt/composer.js +67 -21
  197. package/dist/prompt/instruction-scanner.js +5 -3
  198. package/dist/prompt/section-loader.js +1 -0
  199. package/dist/prompt/sections/base.md +1 -0
  200. package/dist/prompt/sections/browser.md +10 -0
  201. package/dist/prompt/sections/coding.md +4 -0
  202. package/dist/protocol/chat-session-manager.d.ts +8 -2
  203. package/dist/protocol/chat-session-manager.js +36 -0
  204. package/dist/protocol/chat-session.d.ts +65 -0
  205. package/dist/protocol/chat-session.js +94 -2
  206. package/dist/protocol/client.d.ts +27 -0
  207. package/dist/protocol/client.js +38 -0
  208. package/dist/protocol/server.d.ts +112 -0
  209. package/dist/protocol/server.js +586 -16
  210. package/dist/protocol/transport.js +3 -2
  211. package/dist/protocol/types.d.ts +46 -0
  212. package/dist/protocol/types.js +16 -0
  213. package/dist/quota/credentials.d.ts +3 -0
  214. package/dist/quota/credentials.js +80 -0
  215. package/dist/quota/index.d.ts +36 -0
  216. package/dist/quota/index.js +155 -0
  217. package/dist/quota/types.d.ts +48 -0
  218. package/dist/quota/types.js +13 -0
  219. package/dist/review/review-prompt.d.ts +28 -0
  220. package/dist/review/review-prompt.js +81 -0
  221. package/dist/run/FileRunStore.js +8 -3
  222. package/dist/run/RunApprovalBackend.js +25 -5
  223. package/dist/run/RunManager.d.ts +12 -0
  224. package/dist/run/RunManager.js +35 -0
  225. package/dist/run/factory.d.ts +1 -1
  226. package/dist/runtime/background-shell.d.ts +139 -0
  227. package/dist/runtime/background-shell.js +495 -0
  228. package/dist/runtime/output-clean.d.ts +24 -0
  229. package/dist/runtime/output-clean.js +41 -0
  230. package/dist/runtime/ring-file.d.ts +64 -0
  231. package/dist/runtime/ring-file.js +174 -0
  232. package/dist/runtime/safe-spawn.js +15 -34
  233. package/dist/runtime/spawn-common.d.ts +148 -0
  234. package/dist/runtime/spawn-common.js +303 -0
  235. package/dist/runtime/truncate-output.d.ts +22 -0
  236. package/dist/runtime/truncate-output.js +49 -0
  237. package/dist/runtime/utf8-cut.d.ts +11 -0
  238. package/dist/runtime/utf8-cut.js +23 -0
  239. package/dist/services/auto-dream.d.ts +4 -0
  240. package/dist/services/auto-dream.js +26 -26
  241. package/dist/services/diagnostics.d.ts +1 -2
  242. package/dist/services/diagnostics.js +12 -7
  243. package/dist/services/extract-memories.d.ts +14 -1
  244. package/dist/services/extract-memories.js +45 -6
  245. package/dist/services/memory-orchestrator.d.ts +21 -0
  246. package/dist/services/memory-orchestrator.js +125 -50
  247. package/dist/services/session-memory.js +24 -12
  248. package/dist/session/file-history.d.ts +124 -1
  249. package/dist/session/file-history.js +222 -6
  250. package/dist/session/memory.d.ts +116 -2
  251. package/dist/session/memory.js +250 -28
  252. package/dist/session/session-manager.d.ts +40 -0
  253. package/dist/session/session-manager.js +113 -3
  254. package/dist/session/simple-diff.d.ts +23 -0
  255. package/dist/session/simple-diff.js +84 -0
  256. package/dist/session/transcript.d.ts +25 -1
  257. package/dist/session/transcript.js +35 -2
  258. package/dist/session/undo-target.d.ts +67 -0
  259. package/dist/session/undo-target.js +144 -0
  260. package/dist/settings/disk-defaults.d.ts +9 -2
  261. package/dist/settings/disk-defaults.js +11 -2
  262. package/dist/settings/feature-flags.d.ts +64 -0
  263. package/dist/settings/feature-flags.js +61 -0
  264. package/dist/settings/manager.d.ts +68 -1
  265. package/dist/settings/manager.js +266 -29
  266. package/dist/settings/migrate-config.d.ts +45 -0
  267. package/dist/settings/migrate-config.js +125 -0
  268. package/dist/settings/schema-export.d.ts +25 -0
  269. package/dist/settings/schema-export.js +38 -0
  270. package/dist/settings/schema.d.ts +1186 -771
  271. package/dist/settings/schema.js +268 -97
  272. package/dist/skills/scanner.d.ts +9 -0
  273. package/dist/skills/scanner.js +30 -2
  274. package/dist/stt/resolve-transcribe.d.ts +31 -0
  275. package/dist/stt/resolve-transcribe.js +108 -0
  276. package/dist/stt/transcribe.d.ts +51 -0
  277. package/dist/stt/transcribe.js +65 -0
  278. package/dist/tool-system/browser-bridge.d.ts +226 -0
  279. package/dist/tool-system/browser-bridge.js +163 -0
  280. package/dist/tool-system/builtin/agent-heartbeat.d.ts +49 -0
  281. package/dist/tool-system/builtin/agent-heartbeat.js +89 -0
  282. package/dist/tool-system/builtin/agent-notifications.d.ts +12 -3
  283. package/dist/tool-system/builtin/agent-notifications.js +9 -3
  284. package/dist/tool-system/builtin/agent-output-file.d.ts +38 -0
  285. package/dist/tool-system/builtin/agent-output-file.js +72 -0
  286. package/dist/tool-system/builtin/agent-registry.d.ts +12 -0
  287. package/dist/tool-system/builtin/agent-registry.js +8 -0
  288. package/dist/tool-system/builtin/agent.d.ts +21 -1
  289. package/dist/tool-system/builtin/agent.js +489 -42
  290. package/dist/tool-system/builtin/apply-patch/applier.js +66 -8
  291. package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +10 -0
  292. package/dist/tool-system/builtin/apply-patch/backup-targets.js +30 -0
  293. package/dist/tool-system/builtin/apply-patch/index.js +0 -15
  294. package/dist/tool-system/builtin/background-jobs.d.ts +76 -0
  295. package/dist/tool-system/builtin/background-jobs.js +124 -0
  296. package/dist/tool-system/builtin/background-shell-tools.d.ts +20 -0
  297. package/dist/tool-system/builtin/background-shell-tools.js +108 -0
  298. package/dist/tool-system/builtin/background-work.d.ts +67 -0
  299. package/dist/tool-system/builtin/background-work.js +86 -0
  300. package/dist/tool-system/builtin/bash-output-style.d.ts +32 -0
  301. package/dist/tool-system/builtin/bash-output-style.js +40 -0
  302. package/dist/tool-system/builtin/bash.d.ts +5 -2
  303. package/dist/tool-system/builtin/bash.js +98 -62
  304. package/dist/tool-system/builtin/browser-tools.d.ts +33 -0
  305. package/dist/tool-system/builtin/browser-tools.js +312 -0
  306. package/dist/tool-system/builtin/cancel-goal.d.ts +31 -0
  307. package/dist/tool-system/builtin/cancel-goal.js +64 -0
  308. package/dist/tool-system/builtin/check-quota.d.ts +15 -0
  309. package/dist/tool-system/builtin/check-quota.js +34 -0
  310. package/dist/tool-system/builtin/config.js +7 -0
  311. package/dist/tool-system/builtin/cron.d.ts +7 -0
  312. package/dist/tool-system/builtin/cron.js +55 -3
  313. package/dist/tool-system/builtin/drive-claude-code.d.ts +30 -0
  314. package/dist/tool-system/builtin/drive-claude-code.js +157 -0
  315. package/dist/tool-system/builtin/edit-model-catalog.d.ts +3 -0
  316. package/dist/tool-system/builtin/edit-model-catalog.js +94 -0
  317. package/dist/tool-system/builtin/edit.js +20 -16
  318. package/dist/tool-system/builtin/eol.d.ts +29 -0
  319. package/dist/tool-system/builtin/eol.js +37 -0
  320. package/dist/tool-system/builtin/file-cache.d.ts +6 -0
  321. package/dist/tool-system/builtin/file-cache.js +8 -0
  322. package/dist/tool-system/builtin/generate-image.d.ts +35 -0
  323. package/dist/tool-system/builtin/generate-image.js +278 -50
  324. package/dist/tool-system/builtin/generate-video.d.ts +55 -0
  325. package/dist/tool-system/builtin/generate-video.js +361 -0
  326. package/dist/tool-system/builtin/glob.js +0 -7
  327. package/dist/tool-system/builtin/grep.js +6 -8
  328. package/dist/tool-system/builtin/image-providers.d.ts +86 -0
  329. package/dist/tool-system/builtin/image-providers.js +190 -0
  330. package/dist/tool-system/builtin/image-uploader.d.ts +33 -0
  331. package/dist/tool-system/builtin/image-uploader.js +74 -0
  332. package/dist/tool-system/builtin/index.d.ts +7 -1
  333. package/dist/tool-system/builtin/index.js +249 -25
  334. package/dist/tool-system/builtin/mcp-tools.js +23 -3
  335. package/dist/tool-system/builtin/memory.js +45 -7
  336. package/dist/tool-system/builtin/notebook-edit.js +0 -7
  337. package/dist/tool-system/builtin/powershell.js +4 -1
  338. package/dist/tool-system/builtin/read.js +10 -10
  339. package/dist/tool-system/builtin/repl.js +4 -1
  340. package/dist/tool-system/builtin/skill.js +9 -0
  341. package/dist/tool-system/builtin/sleep.js +3 -2
  342. package/dist/tool-system/builtin/tool-search.js +25 -7
  343. package/dist/tool-system/builtin/video-providers.d.ts +154 -0
  344. package/dist/tool-system/builtin/video-providers.js +235 -0
  345. package/dist/tool-system/builtin/web-fetch.js +12 -2
  346. package/dist/tool-system/builtin/web-search.js +21 -7
  347. package/dist/tool-system/builtin/worktree.d.ts +2 -1
  348. package/dist/tool-system/builtin/worktree.js +31 -4
  349. package/dist/tool-system/builtin/write.js +0 -6
  350. package/dist/tool-system/context.d.ts +154 -6
  351. package/dist/tool-system/executor.d.ts +3 -1
  352. package/dist/tool-system/executor.js +172 -88
  353. package/dist/tool-system/investigation-guard.js +1 -1
  354. package/dist/tool-system/mcp-manager.d.ts +42 -4
  355. package/dist/tool-system/mcp-manager.js +186 -20
  356. package/dist/tool-system/path-policy.d.ts +5 -0
  357. package/dist/tool-system/path-policy.js +307 -8
  358. package/dist/tool-system/permission.d.ts +36 -1
  359. package/dist/tool-system/permission.js +281 -69
  360. package/dist/tool-system/plan-mode-allowlist.d.ts +13 -2
  361. package/dist/tool-system/plan-mode-allowlist.js +24 -2
  362. package/dist/tool-system/registry.d.ts +1 -0
  363. package/dist/tool-system/registry.js +16 -2
  364. package/dist/tool-system/sandbox/index.d.ts +8 -0
  365. package/dist/tool-system/sandbox/index.js +7 -2
  366. package/dist/tool-system/validate-tool-metadata.d.ts +36 -0
  367. package/dist/tool-system/validate-tool-metadata.js +63 -0
  368. package/dist/types.d.ts +217 -6
  369. package/dist/updater.js +20 -9
  370. package/dist/utils/envUtils.d.ts +0 -9
  371. package/dist/utils/envUtils.js +3 -28
  372. package/dist/utils/exec.d.ts +40 -0
  373. package/dist/utils/exec.js +144 -0
  374. package/dist/utils/json.d.ts +12 -0
  375. package/dist/utils/json.js +92 -0
  376. package/dist/utils/theme.d.ts +1 -1
  377. package/dist/utils/theme.js +1 -1
  378. package/dist/utils/toolDisplay.js +0 -1
  379. package/package.json +13 -7
  380. package/dist/agent/coordinator.d.ts +0 -49
  381. package/dist/agent/coordinator.js +0 -77
  382. package/dist/settings/manager.test.js +0 -73
  383. package/dist/tool-system/builtin/remote-trigger.d.ts +0 -6
  384. package/dist/tool-system/builtin/remote-trigger.js +0 -54
  385. package/dist/tool-system/builtin/send-message.d.ts +0 -6
  386. package/dist/tool-system/builtin/send-message.js +0 -47
  387. /package/dist/{settings/manager.test.d.ts → credentials/types.js} +0 -0
@@ -4,6 +4,8 @@
4
4
  import { readToolDef, readTool } from "./read.js";
5
5
  import { writeToolDef, writeTool } from "./write.js";
6
6
  import { generateImageToolDef, generateImageTool, isGenerateImageAvailable } from "./generate-image.js";
7
+ import { editModelCatalogToolDef, editModelCatalogTool } from "./edit-model-catalog.js";
8
+ import { generateVideoToolDef, generateVideoTool, isGenerateVideoAvailable } from "./generate-video.js";
7
9
  import { viewImageToolDef, viewImageTool } from "./view-image.js";
8
10
  import { editToolDef, editTool } from "./edit.js";
9
11
  import { applyPatchToolDef, applyPatchTool } from "./apply-patch/index.js";
@@ -13,27 +15,33 @@ import { bashToolDef, bashTool } from "./bash.js";
13
15
  import { webSearchToolDef, webSearchTool, isWebSearchAvailable } from "./web-search.js";
14
16
  import { webFetchToolDef, webFetchTool } from "./web-fetch.js";
15
17
  import { askUserToolDef, askUserTool } from "./ask-user.js";
16
- import { agentToolDef, agentTool, agentStatusToolDef, agentStatusTool, agentCancelToolDef, agentCancelTool, } from "./agent.js";
18
+ import { agentToolDef, agentTool, agentStatusToolDef, agentStatusTool, agentCancelToolDef, agentCancelTool, agentSendInputToolDef, agentSendInputTool, } from "./agent.js";
17
19
  import { enterPlanModeToolDef, enterPlanModeTool, exitPlanModeToolDef, exitPlanModeTool } from "./plan.js";
18
20
  import { toolSearchToolDef, toolSearchTool } from "./tool-search.js";
19
21
  import { todoWriteToolDef, todoWriteTool } from "./task.js";
20
22
  import { enterWorktreeToolDef, enterWorktreeTool, exitWorktreeToolDef, exitWorktreeTool } from "./worktree.js";
21
- import { sendMessageToolDef, sendMessageTool } from "./send-message.js";
22
23
  import { sleepToolDef, sleepTool } from "./sleep.js";
23
24
  import { configToolDef, configTool } from "./config.js";
24
25
  import { notebookEditToolDef, notebookEditTool } from "./notebook-edit.js";
25
26
  import { lspToolDef, lspTool } from "./lsp.js";
26
27
  import { cronCreateToolDef, cronCreateTool, cronDeleteToolDef, cronDeleteTool, cronListToolDef, cronListTool } from "./cron.js";
28
+ import { driveClaudeCodeToolDef, driveClaudeCodeTool, driveAgentToolDef, driveAgentTool } from "./drive-claude-code.js";
29
+ import { checkQuotaToolDef, checkQuotaTool } from "./check-quota.js";
27
30
  import { skillToolDef, skillTool } from "./skill.js";
28
31
  import { mcpToolDef, mcpToolExecute, listMcpResourcesToolDef, listMcpResourcesTool, readMcpResourceToolDef, readMcpResourceTool } from "./mcp-tools.js";
29
- import { remoteTriggerToolDef, remoteTriggerTool } from "./remote-trigger.js";
30
32
  import { replToolDef, replTool } from "./repl.js";
31
33
  import { briefToolDef, briefTool } from "./brief.js";
32
34
  import { powershellToolDef, powershellTool } from "./powershell.js";
33
35
  import { arenaToolDef, arenaTool } from "./arena.js";
34
36
  import { memoryListToolDef, memoryListTool, memoryReadToolDef, memoryReadTool, memorySaveToolDef, memorySaveTool, memoryDeleteToolDef, memoryDeleteTool, } from "./memory.js";
35
37
  import { completeGoalToolDef, completeGoalTool } from "./complete-goal.js";
38
+ import { cancelGoalToolDef, cancelGoalTool } from "./cancel-goal.js";
36
39
  import { addMarketplaceToolDef, addMarketplaceTool } from "./add-marketplace.js";
40
+ import { bashOutputToolDef, bashOutputTool, killShellToolDef, killShellTool, listShellsToolDef, listShellsTool, } from "./background-shell-tools.js";
41
+ import { browserObserveToolDef, browserObserveTool, browserActToolDef, browserActTool, browserNavigateToolDef, browserNavigateTool, } from "./browser-tools.js";
42
+ import { useCredentialToolDef, useCredentialTool } from "../../credentials/use-credential-tool.js";
43
+ import { injectCredentialToolDef, injectCredentialTool, isInjectCredentialAvailable, } from "../../credentials/inject-credential-tool.js";
44
+ import { CredentialStore } from "../../credentials/store.js";
37
45
  export const BUILTIN_TOOLS = [
38
46
  {
39
47
  definition: {
@@ -42,6 +50,7 @@ export const BUILTIN_TOOLS = [
42
50
  permissionDefault: "allow",
43
51
  isReadOnly: true,
44
52
  isConcurrencySafe: true,
53
+ pathPolicy: [{ kind: "arg", arg: "file_path", operation: "read" }],
45
54
  },
46
55
  execute: readTool,
47
56
  },
@@ -52,20 +61,58 @@ export const BUILTIN_TOOLS = [
52
61
  permissionDefault: "ask",
53
62
  isReadOnly: false,
54
63
  isConcurrencySafe: false,
64
+ pathPolicy: [{ kind: "arg", arg: "file_path", operation: "write" }],
55
65
  },
56
66
  execute: writeTool,
57
67
  },
68
+ {
69
+ definition: {
70
+ ...editModelCatalogToolDef,
71
+ source: "builtin",
72
+ permissionDefault: "ask", // writes user config — confirm before each write
73
+ isReadOnly: false,
74
+ isConcurrencySafe: false, // serializes writes to the single catalog file
75
+ },
76
+ execute: editModelCatalogTool,
77
+ },
58
78
  {
59
79
  definition: {
60
80
  ...generateImageToolDef,
61
81
  source: "builtin",
62
82
  permissionDefault: "ask",
63
83
  isReadOnly: false,
64
- isConcurrencySafe: false,
84
+ // Independent external I/O with no shared state — same class as WebFetch/GenerateVideo.
85
+ // Each call writes its own collision-free file (Date.now()+random suffix), so N images
86
+ // in one turn run concurrently (~3min for 6 instead of ~15min serial). Dependent chains
87
+ // (image → video) are forced across turns and serialize naturally via the drain barrier.
88
+ isConcurrencySafe: true,
65
89
  timeoutMs: 600_000, // 10min — high-quality / large image generation routinely exceeds the 120s default; give slow renders ample room while still bounding a hung request (Stop / ctx.signal cancels sooner)
90
+ // `referenceImages` are local files read off disk and shipped to the
91
+ // provider — gate them through the path-policy layer like Read, so an
92
+ // out-of-workspace ref ("../../etc/passwd") prompts for approval instead
93
+ // of silently leaking. (array arg → executor enforces each element)
94
+ pathPolicy: [{ kind: "arg", arg: "referenceImages", operation: "read" }],
66
95
  },
67
96
  execute: generateImageTool,
68
97
  },
98
+ {
99
+ definition: {
100
+ ...generateVideoToolDef,
101
+ source: "builtin",
102
+ permissionDefault: "ask",
103
+ isReadOnly: false,
104
+ isConcurrencySafe: true,
105
+ // Returns fast (fire-and-forget: submits + backgrounds the poll loop),
106
+ // so the default timeout is plenty — the long poll runs detached.
107
+ // `images`/`image` may be local files (uploaded to the provider) — same
108
+ // path-policy gating as GenerateImage's referenceImages.
109
+ pathPolicy: [
110
+ { kind: "arg", arg: "images", operation: "read" },
111
+ { kind: "arg", arg: "image", operation: "read" },
112
+ ],
113
+ },
114
+ execute: generateVideoTool,
115
+ },
69
116
  {
70
117
  definition: {
71
118
  ...viewImageToolDef,
@@ -73,6 +120,7 @@ export const BUILTIN_TOOLS = [
73
120
  permissionDefault: "allow",
74
121
  isReadOnly: true,
75
122
  isConcurrencySafe: true,
123
+ pathPolicy: [{ kind: "arg", arg: "path", operation: "read" }],
76
124
  },
77
125
  execute: viewImageTool,
78
126
  },
@@ -83,6 +131,7 @@ export const BUILTIN_TOOLS = [
83
131
  permissionDefault: "ask",
84
132
  isReadOnly: false,
85
133
  isConcurrencySafe: false,
134
+ pathPolicy: [{ kind: "arg", arg: "file_path", operation: "write" }],
86
135
  },
87
136
  execute: editTool,
88
137
  },
@@ -93,6 +142,7 @@ export const BUILTIN_TOOLS = [
93
142
  permissionDefault: "ask",
94
143
  isReadOnly: false,
95
144
  isConcurrencySafe: false,
145
+ pathPolicy: [{ kind: "apply_patch", arg: "patch", operation: "write" }],
96
146
  },
97
147
  execute: applyPatchTool,
98
148
  },
@@ -103,6 +153,7 @@ export const BUILTIN_TOOLS = [
103
153
  permissionDefault: "allow",
104
154
  isReadOnly: true,
105
155
  isConcurrencySafe: true,
156
+ pathPolicy: [{ kind: "arg", arg: "path", operation: "read", defaultToCwd: true }],
106
157
  },
107
158
  execute: globTool,
108
159
  },
@@ -113,6 +164,7 @@ export const BUILTIN_TOOLS = [
113
164
  permissionDefault: "allow",
114
165
  isReadOnly: true,
115
166
  isConcurrencySafe: true,
167
+ pathPolicy: [{ kind: "arg", arg: "path", operation: "read", defaultToCwd: true }],
116
168
  },
117
169
  execute: grepTool,
118
170
  },
@@ -127,6 +179,37 @@ export const BUILTIN_TOOLS = [
127
179
  },
128
180
  execute: bashTool,
129
181
  },
182
+ // ─── Background shells (Bash run_in_background companions) ──────
183
+ {
184
+ definition: {
185
+ ...bashOutputToolDef,
186
+ source: "builtin",
187
+ permissionDefault: "allow",
188
+ isReadOnly: true,
189
+ isConcurrencySafe: true,
190
+ },
191
+ execute: bashOutputTool,
192
+ },
193
+ {
194
+ definition: {
195
+ ...killShellToolDef,
196
+ source: "builtin",
197
+ permissionDefault: "allow",
198
+ isReadOnly: false,
199
+ isConcurrencySafe: false,
200
+ },
201
+ execute: killShellTool,
202
+ },
203
+ {
204
+ definition: {
205
+ ...listShellsToolDef,
206
+ source: "builtin",
207
+ permissionDefault: "allow",
208
+ isReadOnly: true,
209
+ isConcurrencySafe: true,
210
+ },
211
+ execute: listShellsTool,
212
+ },
130
213
  {
131
214
  definition: {
132
215
  ...webSearchToolDef,
@@ -189,6 +272,17 @@ export const BUILTIN_TOOLS = [
189
272
  },
190
273
  execute: agentCancelTool,
191
274
  },
275
+ {
276
+ definition: {
277
+ ...agentSendInputToolDef,
278
+ source: "builtin",
279
+ permissionDefault: "allow",
280
+ isReadOnly: true,
281
+ isConcurrencySafe: true,
282
+ timeoutMs: 1_800_000, // 30min — a continuation may execute many tool calls, like Agent
283
+ },
284
+ execute: agentSendInputTool,
285
+ },
192
286
  {
193
287
  definition: {
194
288
  ...enterPlanModeToolDef,
@@ -250,16 +344,6 @@ export const BUILTIN_TOOLS = [
250
344
  },
251
345
  execute: exitWorktreeTool,
252
346
  },
253
- {
254
- definition: {
255
- ...sendMessageToolDef,
256
- source: "builtin",
257
- permissionDefault: "allow",
258
- isReadOnly: false,
259
- isConcurrencySafe: true,
260
- },
261
- execute: sendMessageTool,
262
- },
263
347
  // ─── Phase 5: Utility Tools ────────────────────────────────────
264
348
  {
265
349
  definition: {
@@ -288,6 +372,13 @@ export const BUILTIN_TOOLS = [
288
372
  permissionDefault: "ask",
289
373
  isReadOnly: false,
290
374
  isConcurrencySafe: false,
375
+ pathPolicy: [
376
+ {
377
+ kind: "arg",
378
+ arg: "file_path",
379
+ operation: { fromArg: "action", readValues: ["read"], default: "write" },
380
+ },
381
+ ],
291
382
  },
292
383
  execute: notebookEditTool,
293
384
  },
@@ -299,6 +390,7 @@ export const BUILTIN_TOOLS = [
299
390
  permissionDefault: "allow",
300
391
  isReadOnly: true,
301
392
  isConcurrencySafe: true,
393
+ pathPolicy: [{ kind: "arg", arg: "file_path", operation: "read" }],
302
394
  },
303
395
  execute: lspTool,
304
396
  },
@@ -333,6 +425,43 @@ export const BUILTIN_TOOLS = [
333
425
  },
334
426
  execute: cronListTool,
335
427
  },
428
+ // ─── Drive external coding-agent CLI (claude / codex) ──────────
429
+ {
430
+ definition: {
431
+ ...driveAgentToolDef,
432
+ source: "builtin",
433
+ permissionDefault: "ask",
434
+ isReadOnly: false,
435
+ isConcurrencySafe: false,
436
+ },
437
+ execute: driveAgentTool,
438
+ },
439
+ // Back-compat alias: DriveClaudeCode = DriveAgent pinned to cli:claude. Kept
440
+ // registered so old prompts/memories that name DriveClaudeCode still resolve.
441
+ {
442
+ definition: {
443
+ ...driveClaudeCodeToolDef,
444
+ source: "builtin",
445
+ permissionDefault: "ask",
446
+ isReadOnly: false,
447
+ isConcurrencySafe: false,
448
+ },
449
+ execute: driveClaudeCodeTool,
450
+ },
451
+ // ─── Check remaining CC/Codex subscription quota ──────────────
452
+ {
453
+ definition: {
454
+ ...checkQuotaToolDef,
455
+ source: "builtin",
456
+ // Read-only intent (reports quota, mutates nothing). Note: the "claude"
457
+ // path sends a 1-token probe (Anthropic exposes quota only via response
458
+ // headers) — that tiny cost is documented in the tool description.
459
+ permissionDefault: "allow",
460
+ isReadOnly: true,
461
+ isConcurrencySafe: true,
462
+ },
463
+ execute: checkQuotaTool,
464
+ },
336
465
  // ─── Phase 7: Missing tools from restored-src ─────────────────
337
466
  {
338
467
  definition: {
@@ -368,22 +497,17 @@ export const BUILTIN_TOOLS = [
368
497
  definition: {
369
498
  ...readMcpResourceToolDef,
370
499
  source: "builtin",
371
- permissionDefault: "allow",
500
+ // Reading resource CONTENT (unlike enumerating names) can pull arbitrary
501
+ // data — potentially secrets — from a connected MCP server. Default to ask
502
+ // rather than the old unconditional allow so a default-mode session
503
+ // confirms the read; the executor also gates the target server against the
504
+ // session's allowedMcpServers.
505
+ permissionDefault: "ask",
372
506
  isReadOnly: true,
373
507
  isConcurrencySafe: true,
374
508
  },
375
509
  execute: readMcpResourceTool,
376
510
  },
377
- {
378
- definition: {
379
- ...remoteTriggerToolDef,
380
- source: "builtin",
381
- permissionDefault: "ask",
382
- isReadOnly: false,
383
- isConcurrencySafe: false,
384
- },
385
- execute: remoteTriggerTool,
386
- },
387
511
  {
388
512
  definition: {
389
513
  ...replToolDef,
@@ -485,6 +609,21 @@ export const BUILTIN_TOOLS = [
485
609
  },
486
610
  execute: completeGoalTool,
487
611
  },
612
+ // ─── Goal mode: user-initiated cancellation ────────────────────
613
+ // Distinct from complete_goal — the user explicitly asked to abandon the
614
+ // goal. The turn-loop short-circuits on this call (only when confirm===true)
615
+ // AND clears the persisted goal. The tool itself only records an
616
+ // acknowledgement string, so it's read-only and concurrency-safe.
617
+ {
618
+ definition: {
619
+ ...cancelGoalToolDef,
620
+ source: "builtin",
621
+ permissionDefault: "allow",
622
+ isReadOnly: true,
623
+ isConcurrencySafe: true,
624
+ },
625
+ execute: cancelGoalTool,
626
+ },
488
627
  // ─── Plugin marketplace: model-driven source registration ──────
489
628
  {
490
629
  definition: {
@@ -497,6 +636,73 @@ export const BUILTIN_TOOLS = [
497
636
  },
498
637
  execute: addMarketplaceTool,
499
638
  },
639
+ // Browser automation — 3 semantic tools driving the in-app webview via the
640
+ // BrowserBridge (CDP). All serial on one webview (isConcurrencySafe:false).
641
+ // browser_observe is read-only. browser_act is permissionDefault "allow"; its
642
+ // sensitive actions (click/type/select) are escalated to "ask" by a preset
643
+ // PermissionRule keyed on argsPattern { action } (see preset/index.ts §4.6) —
644
+ // so one tool carries per-action gating. Sensitive-action + domain-whitelist
645
+ // enforcement also lives main-side in the bridge. Tools self-gate to
646
+ // unavailable when no bridge is wired (headless).
647
+ {
648
+ definition: {
649
+ ...browserObserveToolDef,
650
+ source: "builtin",
651
+ permissionDefault: "allow",
652
+ isReadOnly: true,
653
+ isConcurrencySafe: false,
654
+ timeoutMs: 30_000, // wait/observe can sit through a load; RPC headroom
655
+ },
656
+ execute: browserObserveTool,
657
+ },
658
+ {
659
+ definition: {
660
+ ...browserActToolDef,
661
+ source: "builtin",
662
+ permissionDefault: "allow", // per-action gating via preset rule (argsPattern.action)
663
+ isReadOnly: false,
664
+ isConcurrencySafe: false,
665
+ timeoutMs: 30_000, // the wait action internally bounds; give RPC headroom
666
+ },
667
+ execute: browserActTool,
668
+ },
669
+ {
670
+ definition: {
671
+ ...browserNavigateToolDef,
672
+ source: "builtin",
673
+ permissionDefault: "allow",
674
+ isReadOnly: false,
675
+ isConcurrencySafe: false,
676
+ },
677
+ execute: browserNavigateTool,
678
+ },
679
+ // ─── Credentials: AI 取用已存凭证(token/link/cookie) ──────────
680
+ // permissionDefault:"allow" —— 取用审批由工具内部的 CredentialUseGate 负责
681
+ // (默认问/本会话记住/全自动),不走工具级权限层,避免双重弹窗。
682
+ // 读取凭证库本身不写文件(cookie 物化成临时 cookies.txt 是用完即弃的副产物)。
683
+ {
684
+ definition: {
685
+ ...useCredentialToolDef,
686
+ source: "builtin",
687
+ permissionDefault: "allow",
688
+ isReadOnly: true,
689
+ isConcurrencySafe: true,
690
+ },
691
+ execute: useCredentialTool,
692
+ },
693
+ // InjectCredential:把 cookie 凭证注入内置浏览器(恢复登录态)。审批由工具内部
694
+ // CredentialUseGate 负责(逐条 autoInjectByAI),故 permissionDefault:"allow"。
695
+ // 改浏览器登录态有副作用 → 非 read-only。
696
+ {
697
+ definition: {
698
+ ...injectCredentialToolDef,
699
+ source: "builtin",
700
+ permissionDefault: "allow",
701
+ isReadOnly: false,
702
+ isConcurrencySafe: false,
703
+ },
704
+ execute: injectCredentialTool,
705
+ },
500
706
  ];
501
707
  /**
502
708
  * Per-tool availability predicates. A tool listed here is filtered OUT of the
@@ -507,4 +713,22 @@ export const BUILTIN_TOOLS = [
507
713
  export const BUILTIN_TOOL_GUARDS = new Map([
508
714
  [webSearchToolDef.name, isWebSearchAvailable],
509
715
  [generateImageToolDef.name, isGenerateImageAvailable],
716
+ [generateVideoToolDef.name, isGenerateVideoAvailable],
717
+ // UseCredential is hidden until at least one credential exists — keeps it out
718
+ // of the tool list (and the context) for the common no-credentials case,
719
+ // matching the spec's "quiet when empty" intent (true ToolSearch-deferral for
720
+ // builtins isn't wired in the engine).
721
+ [useCredentialToolDef.name, isUseCredentialAvailable],
722
+ // InjectCredential hidden until ≥1 cookie credential exists (browser injection
723
+ // is cookie-only). Also degrades at call time if no browser bridge is wired.
724
+ [injectCredentialToolDef.name, isInjectCredentialAvailable],
510
725
  ]);
726
+ /** UseCredential is available when the cwd's CredentialStore has ≥1 credential. */
727
+ export function isUseCredentialAvailable(cwd) {
728
+ try {
729
+ return new CredentialStore(cwd).listMasked().length > 0;
730
+ }
731
+ catch {
732
+ return false;
733
+ }
734
+ }
@@ -28,10 +28,13 @@ export async function mcpToolExecute(args) {
28
28
  const server = args.server;
29
29
  const tool = args.tool;
30
30
  const toolArgs = args.arguments ?? {};
31
+ // Forward the run's abort signal (registry injects __signal) so Stop cancels
32
+ // an in-flight MCP call instead of waiting out the SDK's default timeout.
33
+ const signal = args.__signal;
31
34
  try {
32
35
  const { MCPManager } = await import("../mcp-manager.js");
33
36
  const manager = MCPManager.getInstance();
34
- const result = await manager.callTool(server, tool, toolArgs);
37
+ const result = await manager.callTool(server, tool, toolArgs, signal);
35
38
  return typeof result === "string" ? result : JSON.stringify(result, null, 2);
36
39
  }
37
40
  catch (err) {
@@ -54,10 +57,26 @@ export const listMcpResourcesToolDef = {
54
57
  };
55
58
  export async function listMcpResourcesTool(args) {
56
59
  const server = args.server ?? "";
60
+ // The executor injects the session's allowed-server set (see executor.ts).
61
+ // When no explicit server filter is given, we must only enumerate resources
62
+ // from servers THIS session enabled — otherwise a shared worker leaks another
63
+ // session's MCP resources. An undefined set means "no gating" (legacy/sub-agent).
64
+ const allowed = args.__allowedMcpServers;
57
65
  try {
58
66
  const { MCPManager } = await import("../mcp-manager.js");
59
67
  const manager = MCPManager.getInstance();
60
- const resources = await manager.listResources(server || undefined);
68
+ // Forward the run's abort signal (registry injects __signal) so Stop cancels
69
+ // promptly instead of waiting out the SDK's default request timeout.
70
+ const signal = args.__signal;
71
+ let resources = await manager.listResources(server || undefined, signal);
72
+ if (allowed && resources) {
73
+ resources = resources.filter((r) => {
74
+ // Resource entries may carry the owning server on `serverName`/`server`;
75
+ // when unknown, drop it under gating rather than risk a cross-session leak.
76
+ const owner = (r.serverName ?? r.server);
77
+ return owner ? allowed.has(owner) : false;
78
+ });
79
+ }
61
80
  if (!resources || resources.length === 0) {
62
81
  return "No MCP resources available.";
63
82
  }
@@ -93,7 +112,8 @@ export async function readMcpResourceTool(args) {
93
112
  try {
94
113
  const { MCPManager } = await import("../mcp-manager.js");
95
114
  const manager = MCPManager.getInstance();
96
- const content = await manager.readResource(server, uri);
115
+ const signal = args.__signal;
116
+ const content = await manager.readResource(server, uri, signal);
97
117
  return typeof content === "string" ? content : JSON.stringify(content, null, 2);
98
118
  }
99
119
  catch (err) {
@@ -25,9 +25,23 @@ function parseScope(raw) {
25
25
  }
26
26
  return raw;
27
27
  }
28
- function mmFor(ctx, scope) {
29
- return new MemoryManager({ projectDir: ctx?.cwd, scope });
28
+ /** Location: "global" → cross-project store (no projectDir); "project"
29
+ * (default, back-compat) this repo's store. Anything else → "project". */
30
+ function parseLocation(raw) {
31
+ return raw === "global" ? "global" : "project";
30
32
  }
33
+ function mmFor(ctx, scope, location = "project") {
34
+ // location=global → omit projectDir so the manager points at the global store.
35
+ return new MemoryManager({
36
+ projectDir: location === "global" ? undefined : ctx?.cwd,
37
+ scope,
38
+ });
39
+ }
40
+ const LOCATION_SCHEMA = {
41
+ type: "string",
42
+ enum: ["global", "project"],
43
+ description: 'Which store: "global" (applies across all projects) or "project" (this repo only). Defaults to "project".',
44
+ };
31
45
  // ─── MemoryList ────────────────────────────────────────────────────────────
32
46
  export const memoryListToolDef = {
33
47
  name: "MemoryList",
@@ -43,6 +57,7 @@ export const memoryListToolDef = {
43
57
  enum: ["user", "dream"],
44
58
  description: "Which scope to list",
45
59
  },
60
+ location: LOCATION_SCHEMA,
46
61
  },
47
62
  required: ["scope"],
48
63
  },
@@ -53,7 +68,7 @@ export async function memoryListTool(args, ctx) {
53
68
  return scope;
54
69
  }
55
70
  try {
56
- const mm = mmFor(ctx, scope);
71
+ const mm = mmFor(ctx, scope, parseLocation(args.location));
57
72
  const entries = mm.loadAll();
58
73
  if (entries.length === 0)
59
74
  return `(no memories in scope "${scope}")`;
@@ -78,6 +93,7 @@ export const memoryReadToolDef = {
78
93
  enum: ["user", "dream"],
79
94
  description: "Which scope to read from",
80
95
  },
96
+ location: LOCATION_SCHEMA,
81
97
  name: {
82
98
  type: "string",
83
99
  description: "The memory entry's name (from MemoryList output)",
@@ -91,15 +107,32 @@ export async function memoryReadTool(args, ctx) {
91
107
  if (typeof scope !== "string" || !VALID_SCOPES.includes(scope)) {
92
108
  return scope;
93
109
  }
110
+ const location = parseLocation(args.location);
94
111
  const name = args.name;
95
112
  if (typeof name !== "string" || !name)
96
113
  return "Error: name is required";
97
114
  try {
98
- const mm = mmFor(ctx, scope);
115
+ const mm = mmFor(ctx, scope, location);
99
116
  const entries = mm.loadAll();
100
117
  const entry = entries.find((e) => e.name === name || e.fileName === name);
101
118
  if (!entry)
102
119
  return `Error: no memory named "${name}" in scope "${scope}"`;
120
+ // Recall signal (用户拍板 C + 可见性): reading a memory bumps its usage so
121
+ // the recall-TTL sweep keeps frequently-read memories alive, and emits a
122
+ // stream event so the UI can show the user this memory was actually used.
123
+ // Best-effort — never let accounting failure break the read.
124
+ try {
125
+ mm.recordRecall(entry.name);
126
+ const cb = ctx?.streamCallback;
127
+ if (cb) {
128
+ // scope here is always "user"|"dream" (validated above); pending is
129
+ // never tool-readable, so the narrower event type is correct.
130
+ void cb({ type: "memory_recalled", name: entry.name, scope: scope, location });
131
+ }
132
+ }
133
+ catch {
134
+ // ignore — the read result below is what matters
135
+ }
103
136
  return (`name: ${entry.name}\n` +
104
137
  `description: ${entry.description}\n` +
105
138
  `type: ${entry.type}\n` +
@@ -120,6 +153,8 @@ export const memorySaveToolDef = {
120
153
  "feedback (how to approach work), " +
121
154
  "project (non-obvious facts about ongoing work), " +
122
155
  "reference (pointers to external resources). " +
156
+ "Pick `location`: global (a lesson/preference true in ANY project) vs project (this repo only). " +
157
+ "If a memory in the injected index is now stale or wrong, overwrite it (same name) or MemoryDelete it — keep the store correct rather than letting contradictions pile up. " +
123
158
  "The `description` is a one-line summary shown in the index; the `content` is the full body.",
124
159
  inputSchema: {
125
160
  type: "object",
@@ -129,6 +164,7 @@ export const memorySaveToolDef = {
129
164
  enum: ["user", "dream"],
130
165
  description: "Which scope to save to",
131
166
  },
167
+ location: LOCATION_SCHEMA,
132
168
  name: {
133
169
  type: "string",
134
170
  description: "Short kebab-case identifier (also becomes the filename slug)",
@@ -169,14 +205,15 @@ export async function memorySaveTool(args, ctx) {
169
205
  return `Error: type must be one of ${VALID_TYPES.join(", ")}`;
170
206
  }
171
207
  try {
172
- const mm = mmFor(ctx, scope);
208
+ const location = parseLocation(args.location);
209
+ const mm = mmFor(ctx, scope, location);
173
210
  const fileName = mm.save({
174
211
  name,
175
212
  description,
176
213
  type: type,
177
214
  content,
178
215
  });
179
- return `Saved memory "${name}" → ${scope}/${fileName}`;
216
+ return `Saved memory "${name}" → ${location}/${scope}/${fileName}`;
180
217
  }
181
218
  catch (err) {
182
219
  return `Error saving memory: ${err.message}`;
@@ -197,6 +234,7 @@ export const memoryDeleteToolDef = {
197
234
  enum: ["user", "dream"],
198
235
  description: "Which scope to delete from",
199
236
  },
237
+ location: LOCATION_SCHEMA,
200
238
  name: {
201
239
  type: "string",
202
240
  description: "The memory entry's name (from MemoryList output)",
@@ -214,7 +252,7 @@ export async function memoryDeleteTool(args, ctx) {
214
252
  if (typeof name !== "string" || !name)
215
253
  return "Error: name is required";
216
254
  try {
217
- const mm = mmFor(ctx, scope);
255
+ const mm = mmFor(ctx, scope, parseLocation(args.location));
218
256
  const ok = mm.delete(name);
219
257
  return ok
220
258
  ? `Deleted memory "${name}" from scope "${scope}" (moved to memory-trash/)`
@@ -2,7 +2,6 @@
2
2
  * NotebookEditTool — read and edit Jupyter notebook (.ipynb) cells.
3
3
  */
4
4
  import { readFileSync, writeFileSync, existsSync } from "node:fs";
5
- import { enforcePathPolicy } from "../path-policy.js";
6
5
  export const notebookEditToolDef = {
7
6
  name: "NotebookEdit",
8
7
  description: "Edit a Jupyter notebook (.ipynb) file. Supports actions: " +
@@ -44,12 +43,6 @@ export async function notebookEditTool(args, ctx) {
44
43
  return "Error: file_path is required";
45
44
  if (!filePath.endsWith(".ipynb"))
46
45
  return "Error: file must be a .ipynb file";
47
- // Path policy: 'read' goes through the read-side rules (sensitive paths
48
- // still ask), all other actions are writes and use the stricter rules.
49
- const op = action === "read" ? "read" : "write";
50
- const blocked = enforcePathPolicy(filePath, op, ctx?.cwd);
51
- if (blocked)
52
- return blocked;
53
46
  if (action === "read") {
54
47
  if (!existsSync(filePath))
55
48
  return `Error: File not found: ${filePath}`;
@@ -27,7 +27,10 @@ export const powershellToolDef = {
27
27
  const PS_MAX_BUFFER = 5 * 1024 * 1024;
28
28
  export async function powershellTool(args, ctx) {
29
29
  const command = args.command;
30
- const timeout = args.timeout ?? 120_000;
30
+ // `??` only catches null/undefined — a non-positive timeout (0/-5) would slip
31
+ // through to setTimeout (clamped to 0 → near-instant kill). Floor to default.
32
+ const rawTimeout = args.timeout;
33
+ const timeout = typeof rawTimeout === "number" && rawTimeout > 0 ? rawTimeout : 120_000;
31
34
  if (!command.trim()) {
32
35
  return "Error: command is required.";
33
36
  }