@cjhyy/code-shell-core 0.7.1 → 0.8.0

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 (594) hide show
  1. package/README.md +36 -23
  2. package/dist/agent/agent-definition-registry.d.ts +2 -2
  3. package/dist/agent/agent-definition-registry.js +47 -10
  4. package/dist/agent/agent-definition.d.ts +5 -0
  5. package/dist/agent/agent-definition.js +14 -0
  6. package/dist/automation/index.d.ts +7 -4
  7. package/dist/automation/index.js +4 -2
  8. package/dist/automation/runner.js +3 -1
  9. package/dist/automation/scheduler.d.ts +57 -1
  10. package/dist/automation/scheduler.js +123 -23
  11. package/dist/automation/store.d.ts +6 -2
  12. package/dist/automation/store.js +7 -3
  13. package/dist/capabilities/index.d.ts +109 -0
  14. package/dist/capabilities/index.js +80 -0
  15. package/dist/capability-control/disabled-lists.d.ts +2 -1
  16. package/dist/capability-control/disabled-lists.js +3 -5
  17. package/dist/capability-control/overlay.d.ts +14 -1
  18. package/dist/capability-control/overlay.js +40 -0
  19. package/dist/capability-control/service.js +6 -4
  20. package/dist/cli/agent-server-stdio.d.ts +1 -1
  21. package/dist/cli/agent-server-stdio.js +66 -6
  22. package/dist/cli/agent-server-tcp.js +7 -3
  23. package/dist/context/compaction.d.ts +39 -3
  24. package/dist/context/compaction.js +151 -39
  25. package/dist/context/manager.d.ts +17 -1
  26. package/dist/context/manager.js +36 -1
  27. package/dist/credentials/access.d.ts +3 -1
  28. package/dist/credentials/access.js +24 -3
  29. package/dist/credentials/index.d.ts +1 -1
  30. package/dist/credentials/index.js +1 -1
  31. package/dist/credentials/oauth.d.ts +4 -1
  32. package/dist/credentials/oauth.js +14 -0
  33. package/dist/credentials/store.d.ts +15 -1
  34. package/dist/credentials/store.js +17 -4
  35. package/dist/credentials/types.d.ts +24 -0
  36. package/dist/credentials/use-credential-tool.js +15 -1
  37. package/dist/engine/auxiliary-pipeline.d.ts +40 -0
  38. package/dist/engine/auxiliary-pipeline.js +181 -0
  39. package/dist/{settings → engine}/disk-defaults.d.ts +2 -2
  40. package/dist/{settings → engine}/disk-defaults.js +5 -2
  41. package/dist/engine/dynamic-tool-defs.d.ts +4 -0
  42. package/dist/engine/dynamic-tool-defs.js +4 -0
  43. package/dist/engine/engine.d.ts +254 -195
  44. package/dist/engine/engine.js +1812 -2041
  45. package/dist/engine/file-history-hook.d.ts +11 -0
  46. package/dist/engine/file-history-hook.js +31 -0
  47. package/dist/engine/goal-judge-context.d.ts +9 -0
  48. package/dist/engine/goal-judge-context.js +234 -0
  49. package/dist/engine/injected-context-cache.d.ts +6 -0
  50. package/dist/engine/injected-context-cache.js +13 -0
  51. package/dist/engine/input-attachments.d.ts +1 -1
  52. package/dist/engine/model-facade.d.ts +3 -3
  53. package/dist/engine/model-facade.js +15 -14
  54. package/dist/engine/permission-controller.d.ts +55 -0
  55. package/dist/engine/permission-controller.js +148 -0
  56. package/dist/engine/prompt-cache-diagnostics.d.ts +58 -0
  57. package/dist/engine/prompt-cache-diagnostics.js +178 -0
  58. package/dist/engine/run-accounting.d.ts +41 -0
  59. package/dist/engine/run-accounting.js +126 -0
  60. package/dist/engine/run-context.d.ts +44 -0
  61. package/dist/engine/run-context.js +88 -0
  62. package/dist/engine/run-environment.d.ts +30 -0
  63. package/dist/engine/run-environment.js +77 -0
  64. package/dist/engine/run-finalize.d.ts +58 -0
  65. package/dist/engine/run-finalize.js +245 -0
  66. package/dist/engine/run-goal.d.ts +58 -0
  67. package/dist/engine/run-goal.js +188 -0
  68. package/dist/engine/run-image-input.d.ts +1 -1
  69. package/dist/engine/run-image-input.js +5 -3
  70. package/dist/engine/run-session-open.d.ts +41 -0
  71. package/dist/engine/run-session-open.js +186 -0
  72. package/dist/engine/run-setup.d.ts +42 -0
  73. package/dist/engine/run-setup.js +58 -0
  74. package/dist/engine/run-tooling.d.ts +125 -0
  75. package/dist/engine/run-tooling.js +283 -0
  76. package/dist/engine/run-types.d.ts +139 -0
  77. package/dist/engine/run-types.js +12 -0
  78. package/dist/engine/run-workspace.d.ts +50 -0
  79. package/dist/engine/run-workspace.js +114 -0
  80. package/dist/engine/steer-queue.d.ts +1 -1
  81. package/dist/engine/subagent-spawner.d.ts +32 -0
  82. package/dist/engine/subagent-spawner.js +287 -0
  83. package/dist/engine/tool-summary.d.ts +2 -2
  84. package/dist/engine/tool-summary.js +2 -2
  85. package/dist/engine/turn-loop.d.ts +49 -10
  86. package/dist/engine/turn-loop.js +370 -104
  87. package/dist/engine/types.d.ts +30 -3
  88. package/dist/engine/types.js +1 -1
  89. package/dist/{engine/goal.d.ts → goal/lifecycle.d.ts} +76 -4
  90. package/dist/goal/lifecycle.js +482 -0
  91. package/dist/hooks/events.d.ts +24 -10
  92. package/dist/hooks/goal-stop-hook.d.ts +17 -28
  93. package/dist/hooks/goal-stop-hook.js +110 -465
  94. package/dist/hooks/registry.js +1 -1
  95. package/dist/index.d.ts +48 -108
  96. package/dist/index.extension.d.ts +51 -0
  97. package/dist/index.extension.js +39 -0
  98. package/dist/index.internal.d.ts +86 -0
  99. package/dist/index.internal.js +92 -0
  100. package/dist/index.js +34 -123
  101. package/dist/links/cli.d.ts +48 -0
  102. package/dist/links/cli.js +617 -0
  103. package/dist/links/http.d.ts +40 -0
  104. package/dist/links/http.js +166 -0
  105. package/dist/links/index.d.ts +4 -0
  106. package/dist/links/index.js +3 -0
  107. package/dist/links/link-action-tool.d.ts +5 -0
  108. package/dist/links/link-action-tool.js +241 -0
  109. package/dist/links/providers.d.ts +8 -0
  110. package/dist/links/providers.js +665 -0
  111. package/dist/links/types.d.ts +44 -0
  112. package/dist/llm/client-base.d.ts +7 -0
  113. package/dist/llm/client-base.js +60 -0
  114. package/dist/llm/model-pool.d.ts +1 -1
  115. package/dist/llm/model-pool.js +1 -1
  116. package/dist/llm/providers/anthropic.d.ts +1 -0
  117. package/dist/llm/providers/anthropic.js +9 -0
  118. package/dist/llm/providers/openai.d.ts +1 -0
  119. package/dist/llm/providers/openai.js +17 -0
  120. package/dist/model-catalog/index.js +15 -2
  121. package/dist/model-catalog/resolve.d.ts +13 -1
  122. package/dist/model-catalog/resolve.js +37 -2
  123. package/dist/model-catalog/types.d.ts +74 -48
  124. package/dist/model-catalog/types.js +16 -5
  125. package/dist/model-catalog/upsert.d.ts +3 -1
  126. package/dist/model-catalog/upsert.js +9 -0
  127. package/dist/onboarding.d.ts +0 -1
  128. package/dist/onboarding.js +1 -22
  129. package/dist/panel-apps/bindings.d.ts +24 -0
  130. package/dist/panel-apps/bindings.js +69 -0
  131. package/dist/panel-apps/github-archive.d.ts +21 -0
  132. package/dist/panel-apps/github-archive.js +98 -0
  133. package/dist/panel-apps/index.d.ts +4 -0
  134. package/dist/panel-apps/index.js +4 -0
  135. package/dist/panel-apps/installer.d.ts +68 -0
  136. package/dist/panel-apps/installer.js +622 -0
  137. package/dist/panel-apps/manifest.d.ts +364 -0
  138. package/dist/panel-apps/manifest.js +189 -0
  139. package/dist/panel-apps/paths.d.ts +13 -0
  140. package/dist/panel-apps/paths.js +38 -0
  141. package/dist/panel-apps/registry.d.ts +51 -0
  142. package/dist/panel-apps/registry.js +99 -0
  143. package/dist/panel-apps/runtime.d.ts +80 -0
  144. package/dist/panel-apps/runtime.js +154 -0
  145. package/dist/plugins/gitOps.js +8 -1
  146. package/dist/plugins/installedPlugins.d.ts +2 -1
  147. package/dist/plugins/installedPlugins.js +146 -8
  148. package/dist/plugins/installer/codex/convertAgents.d.ts +4 -1
  149. package/dist/plugins/installer/codex/convertAgents.js +62 -8
  150. package/dist/plugins/installer/codex/convertCommands.d.ts +5 -5
  151. package/dist/plugins/installer/codex/convertCommands.js +35 -12
  152. package/dist/plugins/installer/codex/convertHooks.d.ts +10 -0
  153. package/dist/plugins/installer/codex/convertHooks.js +82 -0
  154. package/dist/plugins/installer/codex/convertSkills.js +41 -6
  155. package/dist/plugins/installer/install.d.ts +7 -1
  156. package/dist/plugins/installer/install.js +21 -87
  157. package/dist/plugins/installer/installFromArchive.d.ts +26 -4
  158. package/dist/plugins/installer/installFromArchive.js +44 -27
  159. package/dist/plugins/installer/installFromNpm.d.ts +31 -0
  160. package/dist/plugins/installer/installFromNpm.js +273 -0
  161. package/dist/plugins/installer/loadPluginAgents.js +17 -4
  162. package/dist/plugins/installer/loadPluginMcp.d.ts +14 -0
  163. package/dist/plugins/installer/loadPluginMcp.js +245 -35
  164. package/dist/plugins/installer/normalizeManifest.d.ts +13 -0
  165. package/dist/plugins/installer/normalizeManifest.js +306 -0
  166. package/dist/plugins/installer/npmTar.d.ts +13 -0
  167. package/dist/plugins/installer/npmTar.js +321 -0
  168. package/dist/plugins/installer/parseSource.d.ts +11 -0
  169. package/dist/plugins/installer/parseSource.js +48 -0
  170. package/dist/plugins/installer/preview.d.ts +101 -0
  171. package/dist/plugins/installer/preview.js +336 -0
  172. package/dist/plugins/installer/projectPluginSource.d.ts +14 -0
  173. package/dist/plugins/installer/projectPluginSource.js +140 -0
  174. package/dist/plugins/installer/types.d.ts +775 -0
  175. package/dist/plugins/installer/types.js +100 -0
  176. package/dist/plugins/installer/unzip.d.ts +11 -0
  177. package/dist/plugins/installer/unzip.js +123 -9
  178. package/dist/plugins/installer/update.d.ts +2 -2
  179. package/dist/plugins/installer/update.js +43 -4
  180. package/dist/plugins/loadPluginHooks.d.ts +19 -2
  181. package/dist/plugins/loadPluginHooks.js +97 -86
  182. package/dist/plugins/pluginAutomationTemplates.d.ts +18 -0
  183. package/dist/plugins/pluginAutomationTemplates.js +50 -0
  184. package/dist/plugins/pluginCatalog.d.ts +45 -0
  185. package/dist/plugins/pluginCatalog.js +87 -0
  186. package/dist/plugins/pluginCommandHook.d.ts +6 -0
  187. package/dist/plugins/pluginCommandHook.js +25 -8
  188. package/dist/plugins/pluginCommandsLoader.d.ts +19 -0
  189. package/dist/plugins/pluginCommandsLoader.js +181 -7
  190. package/dist/plugins/pluginContent.d.ts +10 -1
  191. package/dist/plugins/pluginContent.js +87 -30
  192. package/dist/plugins/pluginHookApproval.d.ts +30 -0
  193. package/dist/plugins/pluginHookApproval.js +160 -0
  194. package/dist/plugins/pluginHookIntegrity.d.ts +69 -0
  195. package/dist/plugins/pluginHookIntegrity.js +361 -0
  196. package/dist/plugins/pluginInstaller.js +71 -12
  197. package/dist/plugins/pluginMcpApproval.d.ts +19 -0
  198. package/dist/plugins/pluginMcpApproval.js +110 -0
  199. package/dist/plugins/pluginMcpIntegrity.d.ts +21 -0
  200. package/dist/plugins/pluginMcpIntegrity.js +74 -0
  201. package/dist/plugins/types.d.ts +30 -0
  202. package/dist/plugins/varRewrite.d.ts +9 -5
  203. package/dist/plugins/varRewrite.js +26 -17
  204. package/dist/preset/index.d.ts +11 -8
  205. package/dist/preset/index.js +62 -203
  206. package/dist/product/define.js +9 -3
  207. package/dist/product/types.d.ts +0 -2
  208. package/dist/profile/activation.d.ts +36 -0
  209. package/dist/profile/activation.js +57 -0
  210. package/dist/profile/catalog-store.d.ts +77 -0
  211. package/dist/profile/catalog-store.js +346 -0
  212. package/dist/profile/catalog.d.ts +54 -0
  213. package/dist/profile/catalog.js +152 -0
  214. package/dist/profile/index.d.ts +7 -0
  215. package/dist/profile/index.js +7 -0
  216. package/dist/profile/requirements.d.ts +76 -0
  217. package/dist/profile/requirements.js +117 -0
  218. package/dist/profile/resolve.d.ts +11 -0
  219. package/dist/profile/resolve.js +41 -0
  220. package/dist/profile/store.d.ts +17 -0
  221. package/dist/profile/store.js +167 -0
  222. package/dist/profile/types.d.ts +321 -0
  223. package/dist/profile/types.js +104 -0
  224. package/dist/prompt/composer.d.ts +46 -7
  225. package/dist/prompt/composer.js +78 -48
  226. package/dist/prompt/instruction-scanner.d.ts +6 -5
  227. package/dist/prompt/instruction-scanner.js +8 -23
  228. package/dist/prompt/section-loader.d.ts +2 -2
  229. package/dist/prompt/section-loader.js +7 -4
  230. package/dist/prompt/sections/browser.md +10 -9
  231. package/dist/prompt/sections/harness-base.md +9 -0
  232. package/dist/protocol/chat-session-manager.d.ts +64 -1
  233. package/dist/protocol/chat-session-manager.js +104 -0
  234. package/dist/protocol/chat-session.d.ts +61 -10
  235. package/dist/protocol/chat-session.js +135 -25
  236. package/dist/protocol/client.d.ts +33 -3
  237. package/dist/protocol/client.js +96 -5
  238. package/dist/protocol/index.d.ts +2 -2
  239. package/dist/protocol/index.js +2 -2
  240. package/dist/protocol/mobile-remote-types.d.ts +406 -0
  241. package/dist/protocol/mobile-remote-types.js +1 -0
  242. package/dist/protocol/server.d.ts +127 -3
  243. package/dist/protocol/server.js +1309 -182
  244. package/dist/protocol/types.d.ts +152 -34
  245. package/dist/protocol/types.js +16 -0
  246. package/dist/run/ArtifactTracker.d.ts +6 -1
  247. package/dist/run/ArtifactTracker.js +29 -21
  248. package/dist/run/EngineRunner.d.ts +2 -0
  249. package/dist/run/EngineRunner.js +1 -0
  250. package/dist/run/RunManager.d.ts +26 -0
  251. package/dist/run/RunManager.js +82 -11
  252. package/dist/run/factory.d.ts +3 -0
  253. package/dist/run/factory.js +2 -0
  254. package/dist/runtime/safe-spawn.d.ts +6 -0
  255. package/dist/runtime/safe-spawn.js +8 -13
  256. package/dist/services/auto-dream.d.ts +13 -1
  257. package/dist/services/auto-dream.js +56 -8
  258. package/dist/services/dream-consolidation.js +10 -1
  259. package/dist/services/memory-orchestrator.js +6 -2
  260. package/dist/services/oauth.js +4 -1
  261. package/dist/services/session-memory.d.ts +4 -4
  262. package/dist/services/session-memory.js +13 -10
  263. package/dist/session/memory.d.ts +26 -7
  264. package/dist/session/memory.js +79 -21
  265. package/dist/session/session-manager.d.ts +182 -28
  266. package/dist/session/session-manager.js +910 -130
  267. package/dist/session/session-message.d.ts +22 -0
  268. package/dist/session/session-message.js +1 -0
  269. package/dist/session/transcript.d.ts +46 -5
  270. package/dist/session/transcript.js +159 -3
  271. package/dist/settings/feature-flags.d.ts +40 -0
  272. package/dist/settings/feature-flags.js +40 -0
  273. package/dist/settings/manager.d.ts +39 -1
  274. package/dist/settings/manager.js +102 -41
  275. package/dist/settings/migrate-config.js +4 -2
  276. package/dist/settings/schema.d.ts +511 -177
  277. package/dist/settings/schema.js +98 -25
  278. package/dist/skills/scanner.d.ts +6 -2
  279. package/dist/skills/scanner.js +160 -9
  280. package/dist/sources/adapter.d.ts +14 -0
  281. package/dist/sources/adapter.js +7 -0
  282. package/dist/sources/adapters/local-files.d.ts +10 -0
  283. package/dist/sources/adapters/local-files.js +127 -0
  284. package/dist/sources/adapters/mcp-resource.d.ts +17 -0
  285. package/dist/sources/adapters/mcp-resource.js +41 -0
  286. package/dist/sources/adapters/mock.d.ts +3 -0
  287. package/dist/sources/adapters/mock.js +29 -0
  288. package/dist/sources/binding.d.ts +6 -0
  289. package/dist/sources/binding.js +24 -0
  290. package/dist/sources/catalog.d.ts +6 -0
  291. package/dist/sources/catalog.js +64 -0
  292. package/dist/sources/context-summary.d.ts +8 -0
  293. package/dist/sources/context-summary.js +13 -0
  294. package/dist/sources/credential-status.d.ts +2 -0
  295. package/dist/sources/credential-status.js +13 -0
  296. package/dist/sources/index.d.ts +10 -0
  297. package/dist/sources/index.js +10 -0
  298. package/dist/sources/resolve.d.ts +28 -0
  299. package/dist/sources/resolve.js +47 -0
  300. package/dist/sources/truncate-utf8.d.ts +7 -0
  301. package/dist/sources/truncate-utf8.js +18 -0
  302. package/dist/sources/types.d.ts +71 -0
  303. package/dist/sources/types.js +26 -0
  304. package/dist/testing/fetch-stub.d.ts +32 -0
  305. package/dist/testing/fetch-stub.js +24 -0
  306. package/dist/themes/image.d.ts +18 -0
  307. package/dist/themes/image.js +117 -0
  308. package/dist/themes/index.d.ts +4 -0
  309. package/dist/themes/index.js +4 -0
  310. package/dist/themes/installer.d.ts +50 -0
  311. package/dist/themes/installer.js +290 -0
  312. package/dist/themes/manifest.d.ts +102 -0
  313. package/dist/themes/manifest.js +86 -0
  314. package/dist/themes/paths.d.ts +14 -0
  315. package/dist/themes/paths.js +33 -0
  316. package/dist/tool-system/browser-bridge.d.ts +53 -11
  317. package/dist/tool-system/browser-bridge.js +8 -9
  318. package/dist/tool-system/builtin/agent-heartbeat.d.ts +2 -2
  319. package/dist/tool-system/builtin/agent-heartbeat.js +20 -6
  320. package/dist/tool-system/builtin/agent-notifications.d.ts +127 -72
  321. package/dist/tool-system/builtin/agent-notifications.js +291 -101
  322. package/dist/tool-system/builtin/agent-output-file.js +1 -3
  323. package/dist/tool-system/builtin/agent-progress.d.ts +6 -0
  324. package/dist/tool-system/builtin/agent-progress.js +83 -0
  325. package/dist/tool-system/builtin/agent-registry.d.ts +38 -2
  326. package/dist/tool-system/builtin/agent-registry.js +178 -9
  327. package/dist/tool-system/builtin/agent-transcript-translator.js +1 -1
  328. package/dist/tool-system/builtin/agent.d.ts +2 -0
  329. package/dist/tool-system/builtin/agent.js +274 -33
  330. package/dist/tool-system/builtin/background-jobs.d.ts +55 -2
  331. package/dist/tool-system/builtin/background-jobs.js +96 -4
  332. package/dist/tool-system/builtin/background-work.d.ts +6 -0
  333. package/dist/tool-system/builtin/background-work.js +8 -1
  334. package/dist/tool-system/builtin/bash.js +5 -2
  335. package/dist/tool-system/builtin/browser-tools.d.ts +6 -3
  336. package/dist/tool-system/builtin/browser-tools.js +89 -23
  337. package/dist/tool-system/builtin/edit-model-catalog.d.ts +6 -0
  338. package/dist/tool-system/builtin/edit-model-catalog.js +172 -12
  339. package/dist/tool-system/builtin/edit.js +2 -6
  340. package/dist/tool-system/builtin/file-cache.d.ts +2 -0
  341. package/dist/tool-system/builtin/file-cache.js +4 -0
  342. package/dist/tool-system/builtin/generate-image.js +17 -10
  343. package/dist/tool-system/builtin/generate-video.js +26 -7
  344. package/dist/tool-system/builtin/grep.js +2 -2
  345. package/dist/tool-system/builtin/image-uploader.js +7 -1
  346. package/dist/tool-system/builtin/index.d.ts +32 -7
  347. package/dist/tool-system/builtin/index.js +237 -167
  348. package/dist/tool-system/builtin/memory.d.ts +6 -0
  349. package/dist/tool-system/builtin/memory.js +36 -15
  350. package/dist/tool-system/builtin/panel.d.ts +9 -0
  351. package/dist/tool-system/builtin/panel.js +314 -0
  352. package/dist/tool-system/builtin/read.js +5 -1
  353. package/dist/tool-system/builtin/send-message-to-session.d.ts +6 -0
  354. package/dist/tool-system/builtin/send-message-to-session.js +67 -0
  355. package/dist/tool-system/builtin/sources.d.ts +8 -0
  356. package/dist/tool-system/builtin/sources.js +137 -0
  357. package/dist/tool-system/builtin/tool-search.js +7 -2
  358. package/dist/tool-system/builtin/update-automation-memory.js +2 -0
  359. package/dist/tool-system/builtin/web-fetch.js +17 -13
  360. package/dist/tool-system/builtin/web-search.js +1 -3
  361. package/dist/tool-system/capability-module.d.ts +93 -0
  362. package/dist/tool-system/capability-module.js +53 -0
  363. package/dist/tool-system/context.d.ts +77 -19
  364. package/dist/tool-system/executor.js +75 -50
  365. package/dist/tool-system/external-tool-exposure.d.ts +60 -0
  366. package/dist/tool-system/external-tool-exposure.js +304 -0
  367. package/dist/tool-system/mcp-manager.d.ts +11 -1
  368. package/dist/tool-system/mcp-manager.js +19 -4
  369. package/dist/tool-system/mcp-tool-policy.d.ts +9 -0
  370. package/dist/tool-system/mcp-tool-policy.js +34 -0
  371. package/dist/tool-system/panel-bridge.d.ts +53 -0
  372. package/dist/tool-system/panel-bridge.js +1 -0
  373. package/dist/tool-system/permission.d.ts +26 -0
  374. package/dist/tool-system/permission.js +46 -0
  375. package/dist/tool-system/registry.d.ts +12 -1
  376. package/dist/tool-system/registry.js +31 -7
  377. package/dist/tool-system/sandbox/index.js +3 -8
  378. package/dist/tool-system/sandbox/seatbelt.js +2 -6
  379. package/dist/tool-system/session-tool-host.d.ts +139 -0
  380. package/dist/tool-system/session-tool-host.js +167 -0
  381. package/dist/tool-system/testing/tool-registry-harness.d.ts +31 -0
  382. package/dist/tool-system/testing/tool-registry-harness.js +51 -0
  383. package/dist/tool-system/validation.d.ts +14 -7
  384. package/dist/tool-system/validation.js +701 -7
  385. package/dist/types.d.ts +186 -20
  386. package/dist/{cc-orchestrator → utils}/cwd-normalize.d.ts +1 -0
  387. package/dist/{cc-orchestrator → utils}/cwd-normalize.js +1 -0
  388. package/dist/utils/file-mutex.d.ts +65 -0
  389. package/dist/utils/file-mutex.js +145 -0
  390. package/dist/utils/json.d.ts +2 -4
  391. package/dist/utils/json.js +2 -4
  392. package/dist/utils/lockfile.d.ts +30 -1
  393. package/dist/utils/lockfile.js +2 -2
  394. package/dist/utils/secret-scrubber.d.ts +8 -0
  395. package/dist/utils/secret-scrubber.js +227 -0
  396. package/dist/utils/toolDisplay.js +1 -1
  397. package/package.json +20 -5
  398. package/THIRD_PARTY_NOTICES.md +0 -206
  399. package/dist/arena/arena.d.ts +0 -45
  400. package/dist/arena/arena.js +0 -362
  401. package/dist/arena/context/context-tools.d.ts +0 -16
  402. package/dist/arena/context/context-tools.js +0 -272
  403. package/dist/arena/context/within-root.d.ts +0 -7
  404. package/dist/arena/context/within-root.js +0 -15
  405. package/dist/arena/detect-mode.d.ts +0 -20
  406. package/dist/arena/detect-mode.js +0 -78
  407. package/dist/arena/digest-builder.d.ts +0 -25
  408. package/dist/arena/digest-builder.js +0 -120
  409. package/dist/arena/index.d.ts +0 -29
  410. package/dist/arena/index.js +0 -29
  411. package/dist/arena/iterate/convergence.d.ts +0 -25
  412. package/dist/arena/iterate/convergence.js +0 -103
  413. package/dist/arena/iterate/formats/index.d.ts +0 -22
  414. package/dist/arena/iterate/formats/index.js +0 -283
  415. package/dist/arena/iterate/index.d.ts +0 -11
  416. package/dist/arena/iterate/index.js +0 -9
  417. package/dist/arena/iterate/iterative-arena.d.ts +0 -23
  418. package/dist/arena/iterate/iterative-arena.js +0 -237
  419. package/dist/arena/iterate/parse.d.ts +0 -42
  420. package/dist/arena/iterate/parse.js +0 -123
  421. package/dist/arena/iterate/phases/argue.d.ts +0 -22
  422. package/dist/arena/iterate/phases/argue.js +0 -165
  423. package/dist/arena/iterate/phases/revise.d.ts +0 -16
  424. package/dist/arena/iterate/phases/revise.js +0 -62
  425. package/dist/arena/iterate/phases/tournament.d.ts +0 -34
  426. package/dist/arena/iterate/phases/tournament.js +0 -113
  427. package/dist/arena/iterate/tools/web-tools.d.ts +0 -13
  428. package/dist/arena/iterate/tools/web-tools.js +0 -54
  429. package/dist/arena/iterate/types.d.ts +0 -152
  430. package/dist/arena/iterate/types.js +0 -8
  431. package/dist/arena/ledger.d.ts +0 -47
  432. package/dist/arena/ledger.js +0 -159
  433. package/dist/arena/lenses/architecture.d.ts +0 -5
  434. package/dist/arena/lenses/architecture.js +0 -22
  435. package/dist/arena/lenses/engineering.d.ts +0 -5
  436. package/dist/arena/lenses/engineering.js +0 -22
  437. package/dist/arena/lenses/general.d.ts +0 -5
  438. package/dist/arena/lenses/general.js +0 -20
  439. package/dist/arena/lenses/index.d.ts +0 -16
  440. package/dist/arena/lenses/index.js +0 -47
  441. package/dist/arena/lenses/product.d.ts +0 -5
  442. package/dist/arena/lenses/product.js +0 -22
  443. package/dist/arena/model-presets.d.ts +0 -23
  444. package/dist/arena/model-presets.js +0 -44
  445. package/dist/arena/phases/adjudication.d.ts +0 -25
  446. package/dist/arena/phases/adjudication.js +0 -142
  447. package/dist/arena/phases/build-consensus.d.ts +0 -30
  448. package/dist/arena/phases/build-consensus.js +0 -85
  449. package/dist/arena/phases/claim-registry.d.ts +0 -26
  450. package/dist/arena/phases/claim-registry.js +0 -60
  451. package/dist/arena/phases/cross-review.d.ts +0 -47
  452. package/dist/arena/phases/cross-review.js +0 -224
  453. package/dist/arena/phases/debate-rounds.d.ts +0 -28
  454. package/dist/arena/phases/debate-rounds.js +0 -161
  455. package/dist/arena/phases/participant-research.d.ts +0 -39
  456. package/dist/arena/phases/participant-research.js +0 -316
  457. package/dist/arena/phases/planning-detail-expansion.d.ts +0 -39
  458. package/dist/arena/phases/planning-detail-expansion.js +0 -120
  459. package/dist/arena/planner.d.ts +0 -28
  460. package/dist/arena/planner.js +0 -312
  461. package/dist/arena/providers/docs.d.ts +0 -7
  462. package/dist/arena/providers/docs.js +0 -111
  463. package/dist/arena/providers/git.d.ts +0 -8
  464. package/dist/arena/providers/git.js +0 -174
  465. package/dist/arena/providers/index.d.ts +0 -32
  466. package/dist/arena/providers/index.js +0 -132
  467. package/dist/arena/providers/none.d.ts +0 -7
  468. package/dist/arena/providers/none.js +0 -11
  469. package/dist/arena/providers/repo.d.ts +0 -7
  470. package/dist/arena/providers/repo.js +0 -258
  471. package/dist/arena/render/session.d.ts +0 -17
  472. package/dist/arena/render/session.js +0 -190
  473. package/dist/arena/render/terminal.d.ts +0 -34
  474. package/dist/arena/render/terminal.js +0 -286
  475. package/dist/arena/strategies/discussion.d.ts +0 -25
  476. package/dist/arena/strategies/discussion.js +0 -143
  477. package/dist/arena/strategies/index.d.ts +0 -15
  478. package/dist/arena/strategies/index.js +0 -28
  479. package/dist/arena/strategies/language-wrapper.d.ts +0 -17
  480. package/dist/arena/strategies/language-wrapper.js +0 -102
  481. package/dist/arena/strategies/lens-wrapper.d.ts +0 -16
  482. package/dist/arena/strategies/lens-wrapper.js +0 -236
  483. package/dist/arena/strategies/planning.d.ts +0 -30
  484. package/dist/arena/strategies/planning.js +0 -225
  485. package/dist/arena/strategies/review.d.ts +0 -26
  486. package/dist/arena/strategies/review.js +0 -168
  487. package/dist/arena/strategies/utils.d.ts +0 -36
  488. package/dist/arena/strategies/utils.js +0 -603
  489. package/dist/arena/tools/selector.d.ts +0 -17
  490. package/dist/arena/tools/selector.js +0 -61
  491. package/dist/arena/transitions.d.ts +0 -53
  492. package/dist/arena/transitions.js +0 -97
  493. package/dist/arena/types.d.ts +0 -518
  494. package/dist/arena/types.js +0 -27
  495. package/dist/cc-orchestrator/agent-adapter.d.ts +0 -54
  496. package/dist/cc-orchestrator/agent-adapter.js +0 -143
  497. package/dist/cc-orchestrator/cc-capability.d.ts +0 -19
  498. package/dist/cc-orchestrator/cc-capability.js +0 -53
  499. package/dist/cc-orchestrator/codex-session-discovery.d.ts +0 -24
  500. package/dist/cc-orchestrator/codex-session-discovery.js +0 -191
  501. package/dist/cc-orchestrator/codex-session-history.d.ts +0 -38
  502. package/dist/cc-orchestrator/codex-session-history.js +0 -247
  503. package/dist/cc-orchestrator/external-agent-bindings.d.ts +0 -27
  504. package/dist/cc-orchestrator/external-agent-bindings.js +0 -150
  505. package/dist/cc-orchestrator/external-agent-changes.d.ts +0 -19
  506. package/dist/cc-orchestrator/external-agent-changes.js +0 -231
  507. package/dist/cc-orchestrator/external-agent-driver.d.ts +0 -19
  508. package/dist/cc-orchestrator/external-agent-driver.js +0 -284
  509. package/dist/cc-orchestrator/external-agent-session-store.d.ts +0 -23
  510. package/dist/cc-orchestrator/external-agent-session-store.js +0 -146
  511. package/dist/cc-orchestrator/index.d.ts +0 -8
  512. package/dist/cc-orchestrator/index.js +0 -8
  513. package/dist/cc-orchestrator/relevance-judge.d.ts +0 -15
  514. package/dist/cc-orchestrator/relevance-judge.js +0 -29
  515. package/dist/cc-orchestrator/session-discovery.d.ts +0 -46
  516. package/dist/cc-orchestrator/session-discovery.js +0 -125
  517. package/dist/cc-orchestrator/session-history.d.ts +0 -54
  518. package/dist/cc-orchestrator/session-history.js +0 -150
  519. package/dist/cron/cron-runtime.d.ts +0 -2
  520. package/dist/cron/cron-runtime.js +0 -2
  521. package/dist/cron/cron-store.d.ts +0 -2
  522. package/dist/cron/cron-store.js +0 -2
  523. package/dist/cron/scheduler.d.ts +0 -7
  524. package/dist/cron/scheduler.js +0 -7
  525. package/dist/engine/goal.js +0 -206
  526. package/dist/external-agents/config.d.ts +0 -2
  527. package/dist/external-agents/config.js +0 -15
  528. package/dist/external-agents/types.d.ts +0 -31
  529. package/dist/git/parse-log.d.ts +0 -13
  530. package/dist/git/parse-log.js +0 -21
  531. package/dist/git/utils.d.ts +0 -49
  532. package/dist/git/utils.js +0 -161
  533. package/dist/git/worktree/crud.d.ts +0 -72
  534. package/dist/git/worktree/crud.js +0 -235
  535. package/dist/git/worktree/diff.d.ts +0 -14
  536. package/dist/git/worktree/diff.js +0 -82
  537. package/dist/git/worktree/git-exec.d.ts +0 -7
  538. package/dist/git/worktree/git-exec.js +0 -87
  539. package/dist/git/worktree/index.d.ts +0 -5
  540. package/dist/git/worktree/index.js +0 -5
  541. package/dist/git/worktree/query.d.ts +0 -43
  542. package/dist/git/worktree/query.js +0 -128
  543. package/dist/git/worktree/slug.d.ts +0 -11
  544. package/dist/git/worktree/slug.js +0 -58
  545. package/dist/git/worktree.d.ts +0 -1
  546. package/dist/git/worktree.js +0 -5
  547. package/dist/lsp/client.d.ts +0 -41
  548. package/dist/lsp/client.js +0 -186
  549. package/dist/lsp/manager.d.ts +0 -40
  550. package/dist/lsp/manager.js +0 -155
  551. package/dist/lsp/root-path.d.ts +0 -9
  552. package/dist/lsp/root-path.js +0 -12
  553. package/dist/lsp/servers.d.ts +0 -16
  554. package/dist/lsp/servers.js +0 -60
  555. package/dist/prompt/sections/coding.md +0 -35
  556. package/dist/quota/credentials.d.ts +0 -3
  557. package/dist/quota/credentials.js +0 -80
  558. package/dist/quota/index.d.ts +0 -36
  559. package/dist/quota/index.js +0 -155
  560. package/dist/quota/types.d.ts +0 -48
  561. package/dist/quota/types.js +0 -13
  562. package/dist/review/review-prompt.d.ts +0 -28
  563. package/dist/review/review-prompt.js +0 -81
  564. package/dist/state.d.ts +0 -160
  565. package/dist/state.js +0 -267
  566. package/dist/tool-system/builtin/apply-patch/applier.d.ts +0 -26
  567. package/dist/tool-system/builtin/apply-patch/applier.js +0 -308
  568. package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +0 -10
  569. package/dist/tool-system/builtin/apply-patch/backup-targets.js +0 -30
  570. package/dist/tool-system/builtin/apply-patch/index.d.ts +0 -20
  571. package/dist/tool-system/builtin/apply-patch/index.js +0 -105
  572. package/dist/tool-system/builtin/apply-patch/parser.d.ts +0 -17
  573. package/dist/tool-system/builtin/apply-patch/parser.js +0 -212
  574. package/dist/tool-system/builtin/apply-patch/seek-sequence.d.ts +0 -18
  575. package/dist/tool-system/builtin/apply-patch/seek-sequence.js +0 -123
  576. package/dist/tool-system/builtin/apply-patch/types.d.ts +0 -49
  577. package/dist/tool-system/builtin/apply-patch/types.js +0 -13
  578. package/dist/tool-system/builtin/arena.d.ts +0 -31
  579. package/dist/tool-system/builtin/arena.js +0 -416
  580. package/dist/tool-system/builtin/brief.d.ts +0 -6
  581. package/dist/tool-system/builtin/brief.js +0 -41
  582. package/dist/tool-system/builtin/check-quota.d.ts +0 -15
  583. package/dist/tool-system/builtin/check-quota.js +0 -34
  584. package/dist/tool-system/builtin/drive-claude-code.d.ts +0 -51
  585. package/dist/tool-system/builtin/drive-claude-code.js +0 -698
  586. package/dist/tool-system/builtin/lsp.d.ts +0 -7
  587. package/dist/tool-system/builtin/lsp.js +0 -144
  588. package/dist/tool-system/builtin/notebook-edit.d.ts +0 -7
  589. package/dist/tool-system/builtin/notebook-edit.js +0 -127
  590. package/dist/tool-system/builtin/worktree.d.ts +0 -11
  591. package/dist/tool-system/builtin/worktree.js +0 -363
  592. /package/dist/{external-agents → links}/types.js +0 -0
  593. /package/dist/{engine/session-usage.d.ts → session/usage.d.ts} +0 -0
  594. /package/dist/{engine/session-usage.js → session/usage.js} +0 -0
@@ -29,6 +29,7 @@
29
29
  * transport is stdio NDJSON and the protocol surface is unchanged, this
30
30
  * bootstrap is invisible to them.
31
31
  */
32
+ import { join } from "node:path";
32
33
  import { Engine } from "../engine/engine.js";
33
34
  import { EngineRuntime } from "../engine/runtime.js";
34
35
  import { ChatSessionManager } from "../protocol/chat-session-manager.js";
@@ -36,8 +37,9 @@ import { SessionManager } from "../session/session-manager.js";
36
37
  import { validateSettings } from "../settings/schema.js";
37
38
  import { AgentServer } from "../protocol/server.js";
38
39
  import { StdioTransport } from "../protocol/transport.js";
39
- import { createNotification } from "../protocol/types.js";
40
+ import { createNotification, Methods } from "../protocol/types.js";
40
41
  import { setCronChangedSink } from "../tool-system/builtin/cron.js";
42
+ import { setModelCatalogChangedSink } from "../tool-system/builtin/edit-model-catalog.js";
41
43
  import { SettingsManager, noRepoDir } from "../settings/manager.js";
42
44
  import { personalizationFrom } from "../settings/personalization.js";
43
45
  import { MCPManager } from "../tool-system/mcp-manager.js";
@@ -51,6 +53,34 @@ import { cronScheduler } from "../automation/scheduler.js";
51
53
  import { CronStore, defaultCronStorePath } from "../automation/store.js";
52
54
  import { resolveLLMConfigForTag } from "../engine/resolve-llm-config.js";
53
55
  import { createIpcCredentialAccess, setDefaultCredentialAccess } from "../credentials/access.js";
56
+ async function loadConfiguredExtensionModules() {
57
+ const specs = (process.env.CODE_SHELL_CAPABILITY_MODULES ?? "")
58
+ .split(",")
59
+ .map((entry) => entry.trim())
60
+ .filter(Boolean);
61
+ const modules = [];
62
+ for (const spec of specs) {
63
+ const [moduleId, exportName = "createCapability"] = spec.split("#", 2);
64
+ if (!moduleId)
65
+ continue;
66
+ try {
67
+ const loaded = (await import(moduleId));
68
+ const factory = loaded[exportName];
69
+ if (typeof factory !== "function") {
70
+ throw new Error(`export ${exportName} is not a capability factory`);
71
+ }
72
+ modules.push(factory());
73
+ }
74
+ catch (err) {
75
+ logger.warn("capability.module_unavailable", {
76
+ moduleId,
77
+ exportName,
78
+ error: err instanceof Error ? err.message : String(err),
79
+ });
80
+ }
81
+ }
82
+ return modules;
83
+ }
54
84
  /**
55
85
  * Resolve per-session agent config: protocol slice overrides win, else fall
56
86
  * back to disk settings.agent.*. Fixes the bug where settings.agent.* never
@@ -58,7 +88,7 @@ import { createIpcCredentialAccess, setDefaultCredentialAccess } from "../creden
58
88
  */
59
89
  export function resolveSessionAgentConfig(slice, settings) {
60
90
  return {
61
- preset: slice.preset ?? settings.agent.preset,
91
+ preset: slice.preset ?? settings.agent.preset ?? settings.profile?.preset,
62
92
  customSystemPrompt: slice.customSystemPrompt ?? settings.agent.customSystemPrompt,
63
93
  appendSystemPrompt: slice.appendSystemPrompt ?? settings.agent.appendSystemPrompt,
64
94
  };
@@ -81,6 +111,15 @@ export function resolveSessionCwd(slice) {
81
111
  }
82
112
  // ─── Read base config from environment / settings ─────────────────
83
113
  const cwd = process.env.AGENT_CWD ?? process.cwd();
114
+ const extensionModules = await loadConfiguredExtensionModules();
115
+ // Injectable data root (identity dimension foundations, Task 3). Server
116
+ // Phase 2 per-user workers spawn this entry with CODE_SHELL_DATA_ROOT set to
117
+ // the user's isolated data root; session persistence (engine session store,
118
+ // the disk goal/wakeup readers) and cron persistence then live under it.
119
+ // Unset (every existing host today) keeps the default `~/.code-shell` layout
120
+ // byte-for-byte.
121
+ const dataRoot = process.env.CODE_SHELL_DATA_ROOT?.trim() || undefined;
122
+ const dataSessionsDir = dataRoot ? join(dataRoot, "sessions") : undefined;
84
123
  // Load settings once to derive llm config for the seed engine.
85
124
  // Desktop is a host application: read the full disk hierarchy (incl. the
86
125
  // user's ~/.code-shell). The SDK default 'project' would skip user config.
@@ -115,16 +154,17 @@ const llmConfig = seedLlm;
115
154
  const seedEngine = new Engine({
116
155
  llm: llmConfig,
117
156
  cwd,
118
- preset: settings.agent.preset,
157
+ preset: settings.agent.preset ?? settings.profile?.preset,
119
158
  enabledBuiltinTools: settings.agent.enabledBuiltinTools,
120
159
  disabledBuiltinTools: settings.agent.disabledBuiltinTools,
121
160
  builtinToolHost: "desktop",
161
+ extensionModules,
122
162
  settingsScope: "full",
123
163
  // No runtime — Engine.populateModelPoolFromSettings() runs in ctor.
124
164
  });
125
165
  // ─── Step 2: extract shared resources ────────────────────────────
126
166
  const modelPool = seedEngine.getModelPool();
127
- const toolRegistry = seedEngine.getToolRegistry();
167
+ const toolRegistry = seedEngine.getRuntimeToolRegistry();
128
168
  // Capture the seed engine's resolved llmConfig + clientDefaults
129
169
  // (post-populateModelPoolFromSettings). Session engines inherit defaults so
130
170
  // the temperature ClientDefault / images.detail apply uniformly without each
@@ -222,6 +262,7 @@ const chatManager = new ChatSessionManager({
222
262
  // session it creates is a desktop-origin session.
223
263
  origin: "desktop",
224
264
  builtinToolHost: "desktop",
265
+ extensionModules,
225
266
  // Inherit full scope so spawned subagents read user config too.
226
267
  settingsScope: "full",
227
268
  // MCP servers from settings — the worker reads the full disk
@@ -252,11 +293,17 @@ const chatManager = new ChatSessionManager({
252
293
  ...personalizationFrom(live.agent),
253
294
  maxTurns: slice.maxTurns,
254
295
  maxContextTokens: slice.maxContextTokens,
296
+ // Session persistence root: an identity-derived manager passes an
297
+ // explicit per-identity dir through the slice; otherwise the worker's
298
+ // injected data root (CODE_SHELL_DATA_ROOT) applies; otherwise
299
+ // undefined keeps the engine's default sessions root (today's path).
300
+ sessionStorageDir: slice.sessionStorageDir ?? dataSessionsDir,
255
301
  // cwd already set to sessionCwd above (slice.cwd → no-repo fallback).
256
302
  });
257
303
  },
258
304
  maxSessions: 16,
259
305
  idleTtlMs: 30 * 60 * 1000,
306
+ ...(dataRoot ? { dataRoot } : {}),
260
307
  });
261
308
  chatManager.startIdleSweeper();
262
309
  // ─── Cron persistence ────────────────────────────────────────────
@@ -270,7 +317,7 @@ chatManager.startIdleSweeper();
270
317
  // main process owns execution); persistence is its only cron role. Without
271
318
  // this, loadJobs()/CronCreate would arm timers in this process too, double-
272
319
  // running jobs and corrupting run stats.
273
- cronScheduler.setStore(new CronStore(defaultCronStorePath()));
320
+ cronScheduler.setStore(new CronStore(defaultCronStorePath(dataRoot)));
274
321
  cronScheduler.setExecutionEnabled(false);
275
322
  cronScheduler.loadJobs();
276
323
  // ─── Step 5: AgentServer over stdio ──────────────────────────────
@@ -283,21 +330,34 @@ setDefaultCredentialAccess(createIpcCredentialAccess(stdioTransport));
283
330
  setCronChangedSink(() => {
284
331
  stdioTransport.send(createNotification("agent/cronChanged", {}));
285
332
  });
333
+ // EditModelCatalog writes in this worker process, while the mounted settings
334
+ // and connection pages live in the desktop renderer. Notify them immediately
335
+ // after a successful write instead of relying on a later turn_complete event.
336
+ setModelCatalogChangedSink(() => {
337
+ stdioTransport.send(createNotification(Methods.SettingsChanged, {}));
338
+ });
286
339
  // Disk-only active-goal reader for agent/goalGet. In worker mode there is no
287
340
  // legacyEngine, and reopening a session after restart doesn't create a live
288
341
  // ChatSession (that only happens on a send), so chatManager.get() misses. This
289
342
  // reads the same ~/.code-shell/sessions/<id>/state.json every Engine writes, so
290
343
  // the goal block re-surfaces on load ("goal 还在但页面不显示" fix).
291
- const goalDiskReader = new SessionManager();
344
+ const goalDiskReader = new SessionManager(dataSessionsDir);
292
345
  const agentServer = new AgentServer({
293
346
  chatManager,
294
347
  transport: stdioTransport,
348
+ extensionModules,
295
349
  workspaceBridge: true,
350
+ panelBridge: true,
351
+ // Cold background-wakeup rehydrate must read the same sessions store the
352
+ // engines write when the data root is relocated (undefined → default root).
353
+ sessionDiskRoot: dataSessionsDir,
296
354
  // Config hot-reload (layer 2) reads disk through the SAME closure the
297
355
  // engineFactory uses for new sessions, so a reloaded running session and a
298
356
  // newly-created session converge on identical disk config (no divergence).
299
357
  settingsReader: freshSettings,
300
358
  readActiveGoalFromDisk: (sessionId) => goalDiskReader.readActiveGoal(sessionId),
359
+ updateActiveGoalOnDisk: (sessionId, patch) => goalDiskReader.updateActiveGoal(sessionId, patch)?.goal,
360
+ clearActiveGoalOnDisk: (sessionId, expected) => goalDiskReader.clearActiveGoal(sessionId, expected),
301
361
  });
302
362
  // Clean up on termination signals. Without this, SIGTERM (parent kill),
303
363
  // SIGINT (Ctrl+C), or SIGHUP would drop the process without closing sessions,
@@ -35,6 +35,7 @@ import { CronStore, defaultCronStorePath } from "../automation/store.js";
35
35
  import { resolveLLMConfigForTag } from "../engine/resolve-llm-config.js";
36
36
  import { randomUUID } from "node:crypto";
37
37
  import { getApprovalRouter } from "../tool-system/permission.js";
38
+ import { SessionManager } from "../session/session-manager.js";
38
39
  const cwd = process.env.AGENT_CWD ?? process.cwd();
39
40
  const port = Number(process.env.AGENT_TCP_PORT ?? "4321");
40
41
  const host = process.env.AGENT_TCP_HOST ?? "127.0.0.1";
@@ -47,15 +48,14 @@ const settingsManager = new SettingsManager(cwd, "full");
47
48
  const settings = settingsManager.get();
48
49
  const seedLlm = resolveLLMConfigForTag(settings, "text", settings.defaults?.text);
49
50
  if (!seedLlm) {
50
- console.error(`[agent-server] 没有可用的文本模型连接(defaults.text=${settings.defaults?.text ?? "未设置"})。` +
51
- `请在「连接」页添加并填写凭证。`);
51
+ console.error(`[agent-server] 没有可用的文本模型连接(defaults.text=${settings.defaults?.text ?? "未设置"})。` + `请在「连接」页添加并填写凭证。`);
52
52
  process.exit(1);
53
53
  }
54
54
  const llmConfig = seedLlm;
55
55
  // ── Shared runtime (same bootstrap as stdio) ─────────────────────
56
56
  const seedEngine = new Engine({ llm: llmConfig, cwd, settingsScope: "full" });
57
57
  const modelPool = seedEngine.getModelPool();
58
- const toolRegistry = seedEngine.getToolRegistry();
58
+ const toolRegistry = seedEngine.getRuntimeToolRegistry();
59
59
  const resolvedLlmConfig = seedEngine.getConfig().llm;
60
60
  const resolvedClientDefaults = seedEngine.getConfig().clientDefaults;
61
61
  const mcpPool = new MCPManager(toolRegistry);
@@ -115,12 +115,16 @@ const automation = startAutomation({
115
115
  // ── Serve over TCP ──────────────────────────────────────────────
116
116
  // One AgentServer per accepted connection, all sharing the same chatManager.
117
117
  const servers = new Set();
118
+ const goalDiskManager = new SessionManager();
118
119
  listenTcp({ port, host }, (transport, socket) => {
119
120
  const server = new AgentServer({
120
121
  chatManager,
121
122
  transport,
122
123
  connectionId: randomUUID(),
123
124
  approvalRouter: getApprovalRouter(),
125
+ readActiveGoalFromDisk: (sessionId) => goalDiskManager.readActiveGoal(sessionId),
126
+ updateActiveGoalOnDisk: (sessionId, patch) => goalDiskManager.updateActiveGoal(sessionId, patch)?.goal,
127
+ clearActiveGoalOnDisk: (sessionId, expected) => goalDiskManager.clearActiveGoal(sessionId, expected),
124
128
  });
125
129
  servers.add(server);
126
130
  socket.once("close", () => {
@@ -177,12 +177,48 @@ export declare function applyToolResultBudget(messages: Message[], maxTotalChars
177
177
  * Returns the truncated string with a notice.
178
178
  */
179
179
  export declare function truncateToolResult(result: string, maxChars?: number): string;
180
+ export declare function buildSummarizationPrompt(messagesToSummarize: Message[], priorSummary?: string, options?: {
181
+ maxTextChars?: number;
182
+ }): string;
183
+ /** Target size for a portable context package (roughly one background page). */
184
+ export declare const CONTEXT_PACKAGE_TARGET_TOKENS = 1500;
185
+ /** Hard output ceiling; the design allows a 1,500-2,000 token final package. */
186
+ export declare const CONTEXT_PACKAGE_MAX_OUTPUT_TOKENS = 2000;
187
+ export interface SerializedContextPackage {
188
+ /** Complete textual representation. Image bytes are replaced by explicit metadata placeholders. */
189
+ text: string;
190
+ /** False when the selection contains images/placeholders but no facts a text model can summarize. */
191
+ hasSummarizableContent: boolean;
192
+ }
193
+ /**
194
+ * Serialize a selected context range without head-only truncation. Text, tool
195
+ * arguments/results, nested structured results, and reasoning are retained in
196
+ * full. Raw image bytes are intentionally not copied into a text prompt; an
197
+ * explicit metadata placeholder makes that conversion visible and bounded.
198
+ */
199
+ export declare function serializeContextPackageMessages(messages: Message[]): SerializedContextPackage;
200
+ export declare function buildContextPackagePromptFromSerialized(serializedConversation: string, priorSummary?: string): string;
180
201
  /**
181
- * Build a structured summarization prompt from messages to be compacted.
182
- * Produces a 9-section summary preserving key details.
202
+ * Build the session-transfer variant on top of the same structured prompt used
203
+ * by /compact. Keeping this wrapper small makes changes to the canonical nine
204
+ * sections flow into both compaction and context packaging.
183
205
  */
184
- export declare function buildSummarizationPrompt(messagesToSummarize: Message[], priorSummary?: string): string;
206
+ export declare function buildContextPackagePrompt(messagesToSummarize: Message[], priorSummary?: string): string;
185
207
  export declare function extractAnchoredSummary(messages: Message[]): string | undefined;
208
+ /**
209
+ * Build the single anchored-summary message that replaces a compacted span.
210
+ * Emits the same `<anchored-summary>` marker `extractAnchoredSummary` reads, so
211
+ * a later compaction pass can feed it back for a rolling merge-update. The
212
+ * optional referenced-file list points the model at paths it may want to Read
213
+ * back; the transcript path lets it recover exact detail on demand. Shared by
214
+ * applySummaryCompaction (recency-window compaction) and any caller that
215
+ * collapses a specific span into one summary, keeping the marker format
216
+ * identical across both.
217
+ */
218
+ export declare function buildAnchoredSummaryMessage(summary: string, options?: {
219
+ transcriptPath?: string;
220
+ referencedFiles?: string[];
221
+ }): Message;
186
222
  /**
187
223
  * Apply LLM-generated summary compaction (hybrid mode).
188
224
  *
@@ -251,11 +251,7 @@ export function snipCompact(messages, keepFirstN = 3, keepLastM = 8) {
251
251
  content: `<system-reminder>[${snippedCount} messages snipped to save context. ` +
252
252
  `Use the transcript file to review details if needed.]</system-reminder>`,
253
253
  };
254
- return [
255
- ...messages.slice(0, keepFirstN),
256
- snipMarker,
257
- ...messages.slice(lastStart),
258
- ];
254
+ return [...messages.slice(0, keepFirstN), snipMarker, ...messages.slice(lastStart)];
259
255
  }
260
256
  /**
261
257
  * Window strategy: keep first message + last N messages.
@@ -669,19 +665,27 @@ export function truncateToolResult(result, maxChars = 30_000) {
669
665
  const tailSize = Math.floor(maxChars * 0.2);
670
666
  const head = result.slice(0, headSize);
671
667
  const tail = result.slice(-tailSize);
672
- return (head +
673
- `\n\n... [${result.length - headSize - tailSize} characters truncated] ...\n\n` +
674
- tail);
668
+ return (head + `\n\n... [${result.length - headSize - tailSize} characters truncated] ...\n\n` + tail);
675
669
  }
676
670
  /**
677
671
  * Build a structured summarization prompt from messages to be compacted.
678
672
  * Produces a 9-section summary preserving key details.
679
673
  */
680
- export function buildSummarizationPrompt(messagesToSummarize, priorSummary) {
674
+ const SUMMARY_SECTION_LIST = "1. **Primary Request**: What the user originally asked for\n" +
675
+ "2. **Key Concepts**: Important technical terms, patterns, file paths\n" +
676
+ "3. **Files Referenced**: List of files read/edited with key content\n" +
677
+ "4. **Errors & Fixes**: Any errors encountered and how they were resolved\n" +
678
+ "5. **Actions Taken**: Tools used and their outcomes\n" +
679
+ "6. **User Messages**: All distinct user requests (verbatim if short)\n" +
680
+ "7. **Pending Tasks**: Anything started but not finished\n" +
681
+ "8. **Current State**: Where things stand right now\n" +
682
+ "9. **Next Steps**: What should happen next\n";
683
+ export function buildSummarizationPrompt(messagesToSummarize, priorSummary, options = {}) {
681
684
  const parts = [];
685
+ const maxTextChars = options.maxTextChars ?? 3_000;
682
686
  for (const msg of messagesToSummarize) {
683
687
  if (typeof msg.content === "string") {
684
- parts.push(`[${msg.role}]: ${msg.content.slice(0, 3000)}`);
688
+ parts.push(`[${msg.role}]: ${msg.content.slice(0, maxTextChars)}`);
685
689
  }
686
690
  else {
687
691
  for (const block of msg.content) {
@@ -699,15 +703,6 @@ export function buildSummarizationPrompt(messagesToSummarize, priorSummary) {
699
703
  }
700
704
  }
701
705
  }
702
- const sectionList = "1. **Primary Request**: What the user originally asked for\n" +
703
- "2. **Key Concepts**: Important technical terms, patterns, file paths\n" +
704
- "3. **Files Referenced**: List of files read/edited with key content\n" +
705
- "4. **Errors & Fixes**: Any errors encountered and how they were resolved\n" +
706
- "5. **Actions Taken**: Tools used and their outcomes\n" +
707
- "6. **User Messages**: All distinct user requests (verbatim if short)\n" +
708
- "7. **Pending Tasks**: Anything started but not finished\n" +
709
- "8. **Current State**: Where things stand right now\n" +
710
- "9. **Next Steps**: What should happen next\n";
711
706
  if (priorSummary) {
712
707
  return ("You are updating an anchored conversation summary. A prior summary is " +
713
708
  "shown first, followed by NEW conversation that occurred after that " +
@@ -719,7 +714,7 @@ export function buildSummarizationPrompt(messagesToSummarize, priorSummary) {
719
714
  "- Stays in the same 9-section structure below\n" +
720
715
  "- Is factual; preserves file paths, function names, and error " +
721
716
  "messages exactly\n\n" +
722
- sectionList +
717
+ SUMMARY_SECTION_LIST +
723
718
  "\n=== Prior summary ===\n" +
724
719
  priorSummary +
725
720
  "\n\n=== New conversation ===\n\n" +
@@ -727,10 +722,110 @@ export function buildSummarizationPrompt(messagesToSummarize, priorSummary) {
727
722
  }
728
723
  return ("Summarize the following conversation into these sections. " +
729
724
  "Be factual. Preserve file paths, function names, and error messages exactly.\n\n" +
730
- sectionList +
725
+ SUMMARY_SECTION_LIST +
731
726
  "\nConversation:\n\n" +
732
727
  parts.join("\n"));
733
728
  }
729
+ /** Target size for a portable context package (roughly one background page). */
730
+ export const CONTEXT_PACKAGE_TARGET_TOKENS = 1_500;
731
+ /** Hard output ceiling; the design allows a 1,500-2,000 token final package. */
732
+ export const CONTEXT_PACKAGE_MAX_OUTPUT_TOKENS = 2_000;
733
+ function serializeContextPackageBlock(block) {
734
+ switch (block.type) {
735
+ case "text": {
736
+ const text = block.text ?? "";
737
+ return { text, hasSummarizableContent: text.trim().length > 0 };
738
+ }
739
+ case "reasoning": {
740
+ const text = block.reasoningContent ?? block.text ?? "";
741
+ return {
742
+ text: `[reasoning]: ${text}`,
743
+ hasSummarizableContent: text.trim().length > 0,
744
+ };
745
+ }
746
+ case "tool_use": {
747
+ const args = JSON.stringify(block.input ?? {});
748
+ const name = block.name ?? "unknown_tool";
749
+ return {
750
+ text: `[tool_use id=${block.id ?? "unknown"}]: ${name}(${args})`,
751
+ hasSummarizableContent: name !== "unknown_tool" || args !== "{}",
752
+ };
753
+ }
754
+ case "tool_result": {
755
+ if (typeof block.content === "string") {
756
+ return {
757
+ text: `[tool_result tool_use_id=${block.tool_use_id ?? "unknown"}${block.is_error ? " is_error=true" : ""}]: ${block.content}`,
758
+ hasSummarizableContent: block.content.trim().length > 0,
759
+ };
760
+ }
761
+ const nested = (block.content ?? []).map(serializeContextPackageBlock);
762
+ return {
763
+ text: `[tool_result tool_use_id=${block.tool_use_id ?? "unknown"}${block.is_error ? " is_error=true" : ""}]:\n` +
764
+ nested.map((item) => item.text).join("\n"),
765
+ hasSummarizableContent: nested.some((item) => item.hasSummarizableContent),
766
+ };
767
+ }
768
+ case "image": {
769
+ const source = block.source;
770
+ const mediaType = source?.media_type ?? "unknown";
771
+ const encoding = source?.type ?? "unknown";
772
+ const encodedChars = source?.data.length ?? 0;
773
+ return {
774
+ text: `[image media_type=${mediaType} encoding=${encoding} encoded_chars=${encodedChars}; binary payload intentionally represented by metadata]`,
775
+ hasSummarizableContent: false,
776
+ };
777
+ }
778
+ default: {
779
+ return {
780
+ text: `[unknown content block]: ${JSON.stringify(block)}`,
781
+ hasSummarizableContent: true,
782
+ };
783
+ }
784
+ }
785
+ }
786
+ /**
787
+ * Serialize a selected context range without head-only truncation. Text, tool
788
+ * arguments/results, nested structured results, and reasoning are retained in
789
+ * full. Raw image bytes are intentionally not copied into a text prompt; an
790
+ * explicit metadata placeholder makes that conversion visible and bounded.
791
+ */
792
+ export function serializeContextPackageMessages(messages) {
793
+ const lines = [];
794
+ let hasSummarizableContent = false;
795
+ for (const message of messages) {
796
+ if (typeof message.content === "string") {
797
+ lines.push(`[${message.role}]: ${message.content}`);
798
+ if (message.content.trim())
799
+ hasSummarizableContent = true;
800
+ continue;
801
+ }
802
+ for (const block of message.content) {
803
+ const serialized = serializeContextPackageBlock(block);
804
+ lines.push(`[${message.role}] ${serialized.text}`);
805
+ hasSummarizableContent ||= serialized.hasSummarizableContent;
806
+ }
807
+ }
808
+ return { text: lines.join("\n"), hasSummarizableContent };
809
+ }
810
+ export function buildContextPackagePromptFromSerialized(serializedConversation, priorSummary) {
811
+ const instruction = "Create a portable background context package for a new session. " +
812
+ "Target about 1,500 tokens (never more than 2,000). Preserve the selected " +
813
+ "range's questions, conclusions, failed attempts, files and symbols, commands, " +
814
+ "exact errors, unresolved items, and concrete next steps. Do not imply that work " +
815
+ "outside the supplied range occurred. Be factual and retain explicit image placeholders.\n\n";
816
+ return (instruction +
817
+ buildSummarizationPrompt([{ role: "user", content: serializedConversation }], priorSummary, {
818
+ maxTextChars: Number.POSITIVE_INFINITY,
819
+ }));
820
+ }
821
+ /**
822
+ * Build the session-transfer variant on top of the same structured prompt used
823
+ * by /compact. Keeping this wrapper small makes changes to the canonical nine
824
+ * sections flow into both compaction and context packaging.
825
+ */
826
+ export function buildContextPackagePrompt(messagesToSummarize, priorSummary) {
827
+ return buildContextPackagePromptFromSerialized(serializeContextPackageMessages(messagesToSummarize).text, priorSummary);
828
+ }
734
829
  // ─── Anchored summary marker ────────────────────────────────────────
735
830
  //
736
831
  // applySummaryCompaction wraps the LLM-generated summary in these tags so the
@@ -757,6 +852,37 @@ export function extractAnchoredSummary(messages) {
757
852
  }
758
853
  return undefined;
759
854
  }
855
+ /**
856
+ * Build the single anchored-summary message that replaces a compacted span.
857
+ * Emits the same `<anchored-summary>` marker `extractAnchoredSummary` reads, so
858
+ * a later compaction pass can feed it back for a rolling merge-update. The
859
+ * optional referenced-file list points the model at paths it may want to Read
860
+ * back; the transcript path lets it recover exact detail on demand. Shared by
861
+ * applySummaryCompaction (recency-window compaction) and any caller that
862
+ * collapses a specific span into one summary, keeping the marker format
863
+ * identical across both.
864
+ */
865
+ export function buildAnchoredSummaryMessage(summary, options = {}) {
866
+ const { transcriptPath, referencedFiles = [] } = options;
867
+ let body = `This session is being continued from a previous conversation that ran out of context. ` +
868
+ `The summary below covers the earlier portion of the conversation.\n\n` +
869
+ `${ANCHORED_OPEN}\n${summary}\n${ANCHORED_CLOSE}`;
870
+ if (transcriptPath) {
871
+ body +=
872
+ `\n\nIf you need specific details from before compaction (like exact code snippets, ` +
873
+ `error messages, or content you generated), read the full transcript at: ${transcriptPath}`;
874
+ }
875
+ if (referencedFiles.length > 0) {
876
+ body +=
877
+ `\n\nFiles referenced before compaction (use Read tool if you need their current content):\n` +
878
+ referencedFiles.map((f) => `- ${f}`).join("\n");
879
+ }
880
+ body += `\n\nRecent messages are preserved verbatim below. Continue from where you left off.`;
881
+ return {
882
+ role: "user",
883
+ content: `<system-reminder>${body}</system-reminder>`,
884
+ };
885
+ }
760
886
  /**
761
887
  * Apply LLM-generated summary compaction (hybrid mode).
762
888
  *
@@ -777,24 +903,10 @@ export function applySummaryCompaction(messages, summary, keepRecentN, transcrip
777
903
  const recent = messages.slice(startIndex);
778
904
  // Extract file paths (not contents) that were referenced before compaction
779
905
  const referencedFiles = extractReferencedFilePaths(compactedMessages);
780
- let body = `This session is being continued from a previous conversation that ran out of context. ` +
781
- `The summary below covers the earlier portion of the conversation.\n\n` +
782
- `${ANCHORED_OPEN}\n${summary}\n${ANCHORED_CLOSE}`;
783
- if (transcriptPath) {
784
- body +=
785
- `\n\nIf you need specific details from before compaction (like exact code snippets, ` +
786
- `error messages, or content you generated), read the full transcript at: ${transcriptPath}`;
787
- }
788
- if (referencedFiles.length > 0) {
789
- body +=
790
- `\n\nFiles referenced before compaction (use Read tool if you need their current content):\n` +
791
- referencedFiles.map((f) => `- ${f}`).join("\n");
792
- }
793
- body += `\n\nRecent messages are preserved verbatim below. Continue from where you left off.`;
794
- const summaryMsg = {
795
- role: "user",
796
- content: `<system-reminder>${body}</system-reminder>`,
797
- };
906
+ const summaryMsg = buildAnchoredSummaryMessage(summary, {
907
+ ...(transcriptPath ? { transcriptPath } : {}),
908
+ referencedFiles,
909
+ });
798
910
  return [first, summaryMsg, ...recent];
799
911
  }
800
912
  // ─── API Round Grouping & Progressive Recovery ──────────────────────
@@ -31,7 +31,7 @@ export interface ContextManagerConfig {
31
31
  * Injected by the Engine so the ContextManager doesn't depend on LLM directly.
32
32
  */
33
33
  export type SummarizeFn = (prompt: string, signal?: AbortSignal) => Promise<string>;
34
- export type CompactStrategy = "micro" | "summary" | "window" | "snip" | "emergency";
34
+ export type CompactStrategy = "micro" | "summary" | "window" | "snip" | "emergency" | "range";
35
35
  export type OnCompactFn = (info: {
36
36
  strategy: CompactStrategy;
37
37
  before: number;
@@ -127,6 +127,22 @@ export declare class ContextManager {
127
127
  * gets summarized here.
128
128
  */
129
129
  forceSummarize(messages: Message[], signal?: AbortSignal): Promise<Message[]>;
130
+ /**
131
+ * Generic range archival: summarize a caller-chosen contiguous index window
132
+ * `[range.start, range.end)` into a single anchored summary message, leaving
133
+ * everything outside the window untouched. Unlike manage()/forceSummarize,
134
+ * the window is caller-specified, not derived from a pressure heuristic — the
135
+ * caller decides which span to collapse. Returns the input unchanged when no
136
+ * summarizeFn is set, when the (clamped) window is empty, or when the summary
137
+ * is empty/too short. The emitted summary uses the same anchored marker the
138
+ * rolling-summary path reads, so a later compaction can merge-update it.
139
+ */
140
+ summarizeRange(messages: Message[], range: {
141
+ start: number;
142
+ end: number;
143
+ }, opts?: {
144
+ signal?: AbortSignal;
145
+ }): Promise<Message[]>;
130
146
  /**
131
147
  * Persist large tool_result blocks to disk and replace them with a
132
148
  * preview + filepath. No-op when transcript path hasn't been set
@@ -5,7 +5,7 @@
5
5
  * Tier 2: LLM summary (async) — generate summary of older messages via model call
6
6
  * Tier 3: window compact (sync, emergency) — aggressive truncation fallback
7
7
  */
8
- import { estimateTokens, microcompact, dedupeFileReads, maskOldObservations, snipCompact, windowCompact, truncateToolResult, buildSummarizationPrompt, applySummaryCompaction, applyToolResultBudget, extractAnchoredSummary, } from "./compaction.js";
8
+ import { estimateTokens, microcompact, dedupeFileReads, maskOldObservations, snipCompact, windowCompact, truncateToolResult, buildSummarizationPrompt, applySummaryCompaction, applyToolResultBudget, extractAnchoredSummary, buildAnchoredSummaryMessage, extractReferencedFilePaths, } from "./compaction.js";
9
9
  import { applyToolResultPersistence, createContentReplacementState, reconstructContentReplacementState, resolveToolResultsDir, } from "./tool-result-storage.js";
10
10
  import { logger } from "../logging/logger.js";
11
11
  const DEFAULT_CONFIG = {
@@ -529,6 +529,41 @@ export class ContextManager {
529
529
  }
530
530
  return result;
531
531
  }
532
+ /**
533
+ * Generic range archival: summarize a caller-chosen contiguous index window
534
+ * `[range.start, range.end)` into a single anchored summary message, leaving
535
+ * everything outside the window untouched. Unlike manage()/forceSummarize,
536
+ * the window is caller-specified, not derived from a pressure heuristic — the
537
+ * caller decides which span to collapse. Returns the input unchanged when no
538
+ * summarizeFn is set, when the (clamped) window is empty, or when the summary
539
+ * is empty/too short. The emitted summary uses the same anchored marker the
540
+ * rolling-summary path reads, so a later compaction can merge-update it.
541
+ */
542
+ async summarizeRange(messages, range, opts = {}) {
543
+ const start = Math.max(0, Math.min(range.start, messages.length));
544
+ const end = Math.max(start, Math.min(range.end, messages.length));
545
+ if (!this.summarizeFn || end - start < 1)
546
+ return messages;
547
+ const window = messages.slice(start, end);
548
+ // Feed a prior anchored summary back so the LLM merge-updates rather than
549
+ // re-summarizes from scratch, matching the rolling-summary behavior of
550
+ // trySummaryCompact().
551
+ const priorSummary = extractAnchoredSummary(messages) ?? this.lastSummary;
552
+ const prompt = buildSummarizationPrompt(window, priorSummary);
553
+ const summary = await this.summarizeFn(prompt, opts.signal);
554
+ if (!summary || summary.length <= 50)
555
+ return messages;
556
+ this.lastSummary = summary;
557
+ const summaryMessage = buildAnchoredSummaryMessage(summary, {
558
+ ...(this.transcriptPath ? { transcriptPath: this.transcriptPath } : {}),
559
+ referencedFiles: extractReferencedFilePaths(window),
560
+ });
561
+ const before = this.estimateTokensHybrid(messages);
562
+ const out = [...messages.slice(0, start), summaryMessage, ...messages.slice(end)];
563
+ const after = this.estimateTokensHybrid(out);
564
+ this.onCompact?.({ strategy: "range", before, after });
565
+ return out;
566
+ }
532
567
  /**
533
568
  * Persist large tool_result blocks to disk and replace them with a
534
569
  * preview + filepath. No-op when transcript path hasn't been set
@@ -18,11 +18,13 @@ export interface CredentialAccess {
18
18
  listMasked(cwd: string | undefined, scope: CredentialAccessScope): CredentialMetadata[];
19
19
  resolveMeta(cwd: string | undefined, id: string, scope: CredentialAccessScope): CredentialMetadata | undefined;
20
20
  envExposures(cwd: string | undefined, scope: CredentialAccessScope): Record<string, string>;
21
+ /** Subscribe to host credential snapshot changes (desktop worker uses this to cancel in-flight Links). */
22
+ subscribe?(listener: () => void): () => void;
21
23
  resolveValue?(req: {
22
24
  cwd?: string;
23
25
  id: string;
24
26
  scope: CredentialAccessScope;
25
- purpose: "use" | "mcp";
27
+ purpose: "use" | "mcp" | "link";
26
28
  }): Promise<string>;
27
29
  /** Resolve only the bearer material needed by an MCP request. */
28
30
  resolveOAuthAccess?(req: {