@cjhyy/code-shell-core 0.5.0-rc.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 (484) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +162 -0
  3. package/dist/agent/coordinator.d.ts +49 -0
  4. package/dist/agent/coordinator.js +77 -0
  5. package/dist/arena/arena.d.ts +43 -0
  6. package/dist/arena/arena.js +334 -0
  7. package/dist/arena/context/context-tools.d.ts +16 -0
  8. package/dist/arena/context/context-tools.js +231 -0
  9. package/dist/arena/detect-mode.d.ts +20 -0
  10. package/dist/arena/detect-mode.js +78 -0
  11. package/dist/arena/digest-builder.d.ts +25 -0
  12. package/dist/arena/digest-builder.js +120 -0
  13. package/dist/arena/index.d.ts +29 -0
  14. package/dist/arena/index.js +29 -0
  15. package/dist/arena/iterate/convergence.d.ts +25 -0
  16. package/dist/arena/iterate/convergence.js +103 -0
  17. package/dist/arena/iterate/formats/index.d.ts +22 -0
  18. package/dist/arena/iterate/formats/index.js +283 -0
  19. package/dist/arena/iterate/index.d.ts +11 -0
  20. package/dist/arena/iterate/index.js +9 -0
  21. package/dist/arena/iterate/iterative-arena.d.ts +23 -0
  22. package/dist/arena/iterate/iterative-arena.js +237 -0
  23. package/dist/arena/iterate/parse.d.ts +42 -0
  24. package/dist/arena/iterate/parse.js +123 -0
  25. package/dist/arena/iterate/phases/argue.d.ts +22 -0
  26. package/dist/arena/iterate/phases/argue.js +159 -0
  27. package/dist/arena/iterate/phases/revise.d.ts +16 -0
  28. package/dist/arena/iterate/phases/revise.js +62 -0
  29. package/dist/arena/iterate/phases/tournament.d.ts +34 -0
  30. package/dist/arena/iterate/phases/tournament.js +113 -0
  31. package/dist/arena/iterate/tools/web-tools.d.ts +13 -0
  32. package/dist/arena/iterate/tools/web-tools.js +54 -0
  33. package/dist/arena/iterate/types.d.ts +152 -0
  34. package/dist/arena/iterate/types.js +8 -0
  35. package/dist/arena/ledger.d.ts +47 -0
  36. package/dist/arena/ledger.js +151 -0
  37. package/dist/arena/lenses/architecture.d.ts +5 -0
  38. package/dist/arena/lenses/architecture.js +22 -0
  39. package/dist/arena/lenses/engineering.d.ts +5 -0
  40. package/dist/arena/lenses/engineering.js +22 -0
  41. package/dist/arena/lenses/general.d.ts +5 -0
  42. package/dist/arena/lenses/general.js +20 -0
  43. package/dist/arena/lenses/index.d.ts +16 -0
  44. package/dist/arena/lenses/index.js +47 -0
  45. package/dist/arena/lenses/product.d.ts +5 -0
  46. package/dist/arena/lenses/product.js +22 -0
  47. package/dist/arena/model-presets.d.ts +23 -0
  48. package/dist/arena/model-presets.js +44 -0
  49. package/dist/arena/phases/adjudication.d.ts +24 -0
  50. package/dist/arena/phases/adjudication.js +144 -0
  51. package/dist/arena/phases/build-consensus.d.ts +29 -0
  52. package/dist/arena/phases/build-consensus.js +86 -0
  53. package/dist/arena/phases/claim-registry.d.ts +26 -0
  54. package/dist/arena/phases/claim-registry.js +60 -0
  55. package/dist/arena/phases/cross-review.d.ts +45 -0
  56. package/dist/arena/phases/cross-review.js +224 -0
  57. package/dist/arena/phases/debate-rounds.d.ts +27 -0
  58. package/dist/arena/phases/debate-rounds.js +162 -0
  59. package/dist/arena/phases/participant-research.d.ts +38 -0
  60. package/dist/arena/phases/participant-research.js +317 -0
  61. package/dist/arena/phases/planning-detail-expansion.d.ts +38 -0
  62. package/dist/arena/phases/planning-detail-expansion.js +121 -0
  63. package/dist/arena/planner.d.ts +27 -0
  64. package/dist/arena/planner.js +312 -0
  65. package/dist/arena/providers/docs.d.ts +6 -0
  66. package/dist/arena/providers/docs.js +108 -0
  67. package/dist/arena/providers/git.d.ts +8 -0
  68. package/dist/arena/providers/git.js +174 -0
  69. package/dist/arena/providers/index.d.ts +32 -0
  70. package/dist/arena/providers/index.js +132 -0
  71. package/dist/arena/providers/none.d.ts +7 -0
  72. package/dist/arena/providers/none.js +11 -0
  73. package/dist/arena/providers/repo.d.ts +6 -0
  74. package/dist/arena/providers/repo.js +255 -0
  75. package/dist/arena/render/session.d.ts +17 -0
  76. package/dist/arena/render/session.js +190 -0
  77. package/dist/arena/render/terminal.d.ts +34 -0
  78. package/dist/arena/render/terminal.js +286 -0
  79. package/dist/arena/strategies/discussion.d.ts +25 -0
  80. package/dist/arena/strategies/discussion.js +143 -0
  81. package/dist/arena/strategies/index.d.ts +15 -0
  82. package/dist/arena/strategies/index.js +28 -0
  83. package/dist/arena/strategies/language-wrapper.d.ts +17 -0
  84. package/dist/arena/strategies/language-wrapper.js +102 -0
  85. package/dist/arena/strategies/lens-wrapper.d.ts +16 -0
  86. package/dist/arena/strategies/lens-wrapper.js +236 -0
  87. package/dist/arena/strategies/planning.d.ts +30 -0
  88. package/dist/arena/strategies/planning.js +225 -0
  89. package/dist/arena/strategies/review.d.ts +26 -0
  90. package/dist/arena/strategies/review.js +168 -0
  91. package/dist/arena/strategies/utils.d.ts +39 -0
  92. package/dist/arena/strategies/utils.js +647 -0
  93. package/dist/arena/tools/selector.d.ts +17 -0
  94. package/dist/arena/tools/selector.js +61 -0
  95. package/dist/arena/transitions.d.ts +48 -0
  96. package/dist/arena/transitions.js +92 -0
  97. package/dist/arena/types.d.ts +508 -0
  98. package/dist/arena/types.js +27 -0
  99. package/dist/cli/agent-server-stdio.d.ts +32 -0
  100. package/dist/cli/agent-server-stdio.js +116 -0
  101. package/dist/colorizer.d.ts +23 -0
  102. package/dist/colorizer.js +12 -0
  103. package/dist/context/compaction.d.ts +116 -0
  104. package/dist/context/compaction.js +534 -0
  105. package/dist/context/manager.d.ts +145 -0
  106. package/dist/context/manager.js +423 -0
  107. package/dist/context/token-counter.d.ts +27 -0
  108. package/dist/context/token-counter.js +91 -0
  109. package/dist/context/tool-result-storage.d.ts +96 -0
  110. package/dist/context/tool-result-storage.js +296 -0
  111. package/dist/cost-tracker.d.ts +64 -0
  112. package/dist/cost-tracker.js +314 -0
  113. package/dist/cron/scheduler.d.ts +34 -0
  114. package/dist/cron/scheduler.js +115 -0
  115. package/dist/data/deepseek-models.json +46 -0
  116. package/dist/data/gemini-models.json +67 -0
  117. package/dist/data/openai-models.json +175 -0
  118. package/dist/data/openrouter-models.d.ts +35 -0
  119. package/dist/data/openrouter-models.js +36 -0
  120. package/dist/data/openrouter-models.json +4626 -0
  121. package/dist/data/openrouter-sync.d.ts +16 -0
  122. package/dist/data/openrouter-sync.js +53 -0
  123. package/dist/data/static-catalogs.d.ts +25 -0
  124. package/dist/data/static-catalogs.js +26 -0
  125. package/dist/data/zai-models.json +56 -0
  126. package/dist/engine/cost-store.d.ts +22 -0
  127. package/dist/engine/cost-store.js +15 -0
  128. package/dist/engine/engine.d.ts +295 -0
  129. package/dist/engine/engine.js +1467 -0
  130. package/dist/engine/model-facade.d.ts +24 -0
  131. package/dist/engine/model-facade.js +194 -0
  132. package/dist/engine/parse-task.d.ts +59 -0
  133. package/dist/engine/parse-task.js +135 -0
  134. package/dist/engine/patch-orphaned-tools.d.ts +52 -0
  135. package/dist/engine/patch-orphaned-tools.js +95 -0
  136. package/dist/engine/query.d.ts +50 -0
  137. package/dist/engine/query.js +107 -0
  138. package/dist/engine/runtime.d.ts +50 -0
  139. package/dist/engine/runtime.js +59 -0
  140. package/dist/engine/streaming-tool-queue.d.ts +34 -0
  141. package/dist/engine/streaming-tool-queue.js +61 -0
  142. package/dist/engine/token-budget.d.ts +22 -0
  143. package/dist/engine/token-budget.js +40 -0
  144. package/dist/engine/tool-summary.d.ts +13 -0
  145. package/dist/engine/tool-summary.js +35 -0
  146. package/dist/engine/turn-loop.d.ts +122 -0
  147. package/dist/engine/turn-loop.js +602 -0
  148. package/dist/engine/turn-state.d.ts +20 -0
  149. package/dist/engine/turn-state.js +17 -0
  150. package/dist/exceptions.d.ts +61 -0
  151. package/dist/exceptions.js +116 -0
  152. package/dist/git/utils.d.ts +35 -0
  153. package/dist/git/utils.js +98 -0
  154. package/dist/git/worktree.d.ts +36 -0
  155. package/dist/git/worktree.js +139 -0
  156. package/dist/hooks/events.d.ts +114 -0
  157. package/dist/hooks/events.js +4 -0
  158. package/dist/hooks/inject.d.ts +19 -0
  159. package/dist/hooks/inject.js +29 -0
  160. package/dist/hooks/registry.d.ts +15 -0
  161. package/dist/hooks/registry.js +84 -0
  162. package/dist/hooks/shell-runner.d.ts +45 -0
  163. package/dist/hooks/shell-runner.js +173 -0
  164. package/dist/index.d.ts +117 -0
  165. package/dist/index.js +145 -0
  166. package/dist/llm/api-key-sanitize.d.ts +22 -0
  167. package/dist/llm/api-key-sanitize.js +81 -0
  168. package/dist/llm/capabilities/index.d.ts +20 -0
  169. package/dist/llm/capabilities/index.js +39 -0
  170. package/dist/llm/capabilities/rules.d.ts +26 -0
  171. package/dist/llm/capabilities/rules.js +215 -0
  172. package/dist/llm/capabilities/types.d.ts +114 -0
  173. package/dist/llm/capabilities/types.js +24 -0
  174. package/dist/llm/client-base.d.ts +29 -0
  175. package/dist/llm/client-base.js +137 -0
  176. package/dist/llm/client-factory.d.ts +10 -0
  177. package/dist/llm/client-factory.js +29 -0
  178. package/dist/llm/model-cache.d.ts +21 -0
  179. package/dist/llm/model-cache.js +46 -0
  180. package/dist/llm/model-fetcher.d.ts +29 -0
  181. package/dist/llm/model-fetcher.js +282 -0
  182. package/dist/llm/model-pool.d.ts +95 -0
  183. package/dist/llm/model-pool.js +246 -0
  184. package/dist/llm/provider-catalog.d.ts +32 -0
  185. package/dist/llm/provider-catalog.js +50 -0
  186. package/dist/llm/provider-kinds.d.ts +21 -0
  187. package/dist/llm/provider-kinds.js +132 -0
  188. package/dist/llm/providers/anthropic.d.ts +19 -0
  189. package/dist/llm/providers/anthropic.js +267 -0
  190. package/dist/llm/providers/openai.d.ts +64 -0
  191. package/dist/llm/providers/openai.js +606 -0
  192. package/dist/llm/retry.d.ts +12 -0
  193. package/dist/llm/retry.js +17 -0
  194. package/dist/llm/stream-watchdog.d.ts +42 -0
  195. package/dist/llm/stream-watchdog.js +70 -0
  196. package/dist/llm/token-counter.d.ts +17 -0
  197. package/dist/llm/token-counter.js +36 -0
  198. package/dist/llm/types.d.ts +37 -0
  199. package/dist/llm/types.js +4 -0
  200. package/dist/logging/logger.d.ts +109 -0
  201. package/dist/logging/logger.js +390 -0
  202. package/dist/logging/sanitize-messages.d.ts +42 -0
  203. package/dist/logging/sanitize-messages.js +150 -0
  204. package/dist/logging/session-recorder.d.ts +90 -0
  205. package/dist/logging/session-recorder.js +304 -0
  206. package/dist/lsp/client.d.ts +41 -0
  207. package/dist/lsp/client.js +166 -0
  208. package/dist/lsp/manager.d.ts +40 -0
  209. package/dist/lsp/manager.js +124 -0
  210. package/dist/lsp/servers.d.ts +16 -0
  211. package/dist/lsp/servers.js +60 -0
  212. package/dist/migrate-models.d.ts +45 -0
  213. package/dist/migrate-models.js +179 -0
  214. package/dist/onboarding.d.ts +189 -0
  215. package/dist/onboarding.js +625 -0
  216. package/dist/plugins/gitOps.d.ts +32 -0
  217. package/dist/plugins/gitOps.js +62 -0
  218. package/dist/plugins/installedPlugins.d.ts +15 -0
  219. package/dist/plugins/installedPlugins.js +56 -0
  220. package/dist/plugins/knownMarketplaces.d.ts +10 -0
  221. package/dist/plugins/knownMarketplaces.js +46 -0
  222. package/dist/plugins/loadPluginHooks.d.ts +52 -0
  223. package/dist/plugins/loadPluginHooks.js +162 -0
  224. package/dist/plugins/marketplaceManager.d.ts +49 -0
  225. package/dist/plugins/marketplaceManager.js +142 -0
  226. package/dist/plugins/parseMarketplaceInput.d.ts +16 -0
  227. package/dist/plugins/parseMarketplaceInput.js +73 -0
  228. package/dist/plugins/pluginCommandHook.d.ts +54 -0
  229. package/dist/plugins/pluginCommandHook.js +180 -0
  230. package/dist/plugins/pluginCommandsLoader.d.ts +25 -0
  231. package/dist/plugins/pluginCommandsLoader.js +114 -0
  232. package/dist/plugins/pluginInstaller.d.ts +36 -0
  233. package/dist/plugins/pluginInstaller.js +228 -0
  234. package/dist/plugins/schemas.d.ts +9 -0
  235. package/dist/plugins/schemas.js +136 -0
  236. package/dist/plugins/types.d.ts +75 -0
  237. package/dist/plugins/types.js +7 -0
  238. package/dist/plugins/varRewrite.d.ts +42 -0
  239. package/dist/plugins/varRewrite.js +129 -0
  240. package/dist/preset/index.d.ts +60 -0
  241. package/dist/preset/index.js +159 -0
  242. package/dist/product/define.d.ts +60 -0
  243. package/dist/product/define.js +123 -0
  244. package/dist/product/index.d.ts +5 -0
  245. package/dist/product/index.js +4 -0
  246. package/dist/product/types.d.ts +111 -0
  247. package/dist/product/types.js +21 -0
  248. package/dist/prompt/composer.d.ts +49 -0
  249. package/dist/prompt/composer.js +168 -0
  250. package/dist/prompt/instruction-scanner.d.ts +54 -0
  251. package/dist/prompt/instruction-scanner.js +187 -0
  252. package/dist/prompt/section-cache.d.ts +15 -0
  253. package/dist/prompt/section-cache.js +31 -0
  254. package/dist/prompt/section-loader.d.ts +26 -0
  255. package/dist/prompt/section-loader.js +53 -0
  256. package/dist/prompt/sections/base.md +35 -0
  257. package/dist/prompt/sections/coding.md +31 -0
  258. package/dist/prompt/sections/orchestration.md +16 -0
  259. package/dist/prompt/sections/tone.md +9 -0
  260. package/dist/protocol/chat-session-manager.d.ts +33 -0
  261. package/dist/protocol/chat-session-manager.js +65 -0
  262. package/dist/protocol/chat-session.d.ts +49 -0
  263. package/dist/protocol/chat-session.js +86 -0
  264. package/dist/protocol/client.d.ts +104 -0
  265. package/dist/protocol/client.js +260 -0
  266. package/dist/protocol/factories.d.ts +93 -0
  267. package/dist/protocol/factories.js +64 -0
  268. package/dist/protocol/helpers.d.ts +42 -0
  269. package/dist/protocol/helpers.js +55 -0
  270. package/dist/protocol/index.d.ts +4 -0
  271. package/dist/protocol/index.js +4 -0
  272. package/dist/protocol/server.d.ts +80 -0
  273. package/dist/protocol/server.js +855 -0
  274. package/dist/protocol/transport.d.ts +37 -0
  275. package/dist/protocol/transport.js +85 -0
  276. package/dist/protocol/types.d.ts +221 -0
  277. package/dist/protocol/types.js +61 -0
  278. package/dist/remote/bridge.d.ts +37 -0
  279. package/dist/remote/bridge.js +103 -0
  280. package/dist/run/ArtifactTracker.d.ts +38 -0
  281. package/dist/run/ArtifactTracker.js +132 -0
  282. package/dist/run/CheckpointWriter.d.ts +53 -0
  283. package/dist/run/CheckpointWriter.js +135 -0
  284. package/dist/run/EngineRunner.d.ts +72 -0
  285. package/dist/run/EngineRunner.js +119 -0
  286. package/dist/run/Evaluator.d.ts +56 -0
  287. package/dist/run/Evaluator.js +62 -0
  288. package/dist/run/FileRunStore.d.ts +39 -0
  289. package/dist/run/FileRunStore.js +176 -0
  290. package/dist/run/Heartbeat.d.ts +54 -0
  291. package/dist/run/Heartbeat.js +123 -0
  292. package/dist/run/RunApprovalBackend.d.ts +53 -0
  293. package/dist/run/RunApprovalBackend.js +85 -0
  294. package/dist/run/RunLock.d.ts +40 -0
  295. package/dist/run/RunLock.js +98 -0
  296. package/dist/run/RunManager.d.ts +82 -0
  297. package/dist/run/RunManager.js +587 -0
  298. package/dist/run/RunQueue.d.ts +27 -0
  299. package/dist/run/RunQueue.js +73 -0
  300. package/dist/run/RunStore.d.ts +25 -0
  301. package/dist/run/RunStore.js +9 -0
  302. package/dist/run/factory.d.ts +63 -0
  303. package/dist/run/factory.js +51 -0
  304. package/dist/run/index.d.ts +17 -0
  305. package/dist/run/index.js +23 -0
  306. package/dist/run/types.d.ts +136 -0
  307. package/dist/run/types.js +28 -0
  308. package/dist/runtime/safe-spawn.d.ts +118 -0
  309. package/dist/runtime/safe-spawn.js +268 -0
  310. package/dist/services/analytics.d.ts +29 -0
  311. package/dist/services/analytics.js +84 -0
  312. package/dist/services/auto-dream.d.ts +49 -0
  313. package/dist/services/auto-dream.js +124 -0
  314. package/dist/services/diagnostics.d.ts +41 -0
  315. package/dist/services/diagnostics.js +99 -0
  316. package/dist/services/extract-memories.d.ts +31 -0
  317. package/dist/services/extract-memories.js +71 -0
  318. package/dist/services/index.d.ts +11 -0
  319. package/dist/services/index.js +17 -0
  320. package/dist/services/memory-orchestrator.d.ts +60 -0
  321. package/dist/services/memory-orchestrator.js +133 -0
  322. package/dist/services/notifier.d.ts +25 -0
  323. package/dist/services/notifier.js +69 -0
  324. package/dist/services/oauth.d.ts +27 -0
  325. package/dist/services/oauth.js +153 -0
  326. package/dist/services/session-memory.d.ts +37 -0
  327. package/dist/services/session-memory.js +81 -0
  328. package/dist/session/file-history.d.ts +41 -0
  329. package/dist/session/file-history.js +115 -0
  330. package/dist/session/memory.d.ts +104 -0
  331. package/dist/session/memory.js +310 -0
  332. package/dist/session/session-manager.d.ts +41 -0
  333. package/dist/session/session-manager.js +261 -0
  334. package/dist/session/transcript.d.ts +39 -0
  335. package/dist/session/transcript.js +186 -0
  336. package/dist/settings/manager.d.ts +36 -0
  337. package/dist/settings/manager.js +187 -0
  338. package/dist/settings/schema.d.ts +1219 -0
  339. package/dist/settings/schema.js +246 -0
  340. package/dist/skills/frontmatter.d.ts +13 -0
  341. package/dist/skills/frontmatter.js +70 -0
  342. package/dist/skills/index.d.ts +7 -0
  343. package/dist/skills/index.js +6 -0
  344. package/dist/skills/scanner.d.ts +31 -0
  345. package/dist/skills/scanner.js +171 -0
  346. package/dist/state.d.ts +160 -0
  347. package/dist/state.js +267 -0
  348. package/dist/tool-system/builtin/agent-notifications.d.ts +84 -0
  349. package/dist/tool-system/builtin/agent-notifications.js +197 -0
  350. package/dist/tool-system/builtin/agent-registry.d.ts +67 -0
  351. package/dist/tool-system/builtin/agent-registry.js +126 -0
  352. package/dist/tool-system/builtin/agent-transcript-translator.d.ts +22 -0
  353. package/dist/tool-system/builtin/agent-transcript-translator.js +160 -0
  354. package/dist/tool-system/builtin/agent.d.ts +16 -0
  355. package/dist/tool-system/builtin/agent.js +364 -0
  356. package/dist/tool-system/builtin/apply-patch/applier.d.ts +26 -0
  357. package/dist/tool-system/builtin/apply-patch/applier.js +250 -0
  358. package/dist/tool-system/builtin/apply-patch/index.d.ts +20 -0
  359. package/dist/tool-system/builtin/apply-patch/index.js +101 -0
  360. package/dist/tool-system/builtin/apply-patch/parser.d.ts +17 -0
  361. package/dist/tool-system/builtin/apply-patch/parser.js +212 -0
  362. package/dist/tool-system/builtin/apply-patch/seek-sequence.d.ts +18 -0
  363. package/dist/tool-system/builtin/apply-patch/seek-sequence.js +123 -0
  364. package/dist/tool-system/builtin/apply-patch/types.d.ts +49 -0
  365. package/dist/tool-system/builtin/apply-patch/types.js +13 -0
  366. package/dist/tool-system/builtin/arena.d.ts +31 -0
  367. package/dist/tool-system/builtin/arena.js +416 -0
  368. package/dist/tool-system/builtin/ask-user.d.ts +20 -0
  369. package/dist/tool-system/builtin/ask-user.js +99 -0
  370. package/dist/tool-system/builtin/bash.d.ts +21 -0
  371. package/dist/tool-system/builtin/bash.js +149 -0
  372. package/dist/tool-system/builtin/brief.d.ts +6 -0
  373. package/dist/tool-system/builtin/brief.js +41 -0
  374. package/dist/tool-system/builtin/config.d.ts +6 -0
  375. package/dist/tool-system/builtin/config.js +67 -0
  376. package/dist/tool-system/builtin/cron.d.ts +10 -0
  377. package/dist/tool-system/builtin/cron.js +61 -0
  378. package/dist/tool-system/builtin/edit.d.ts +6 -0
  379. package/dist/tool-system/builtin/edit.js +100 -0
  380. package/dist/tool-system/builtin/file-cache.d.ts +11 -0
  381. package/dist/tool-system/builtin/file-cache.js +39 -0
  382. package/dist/tool-system/builtin/glob.d.ts +7 -0
  383. package/dist/tool-system/builtin/glob.js +76 -0
  384. package/dist/tool-system/builtin/grep.d.ts +7 -0
  385. package/dist/tool-system/builtin/grep.js +150 -0
  386. package/dist/tool-system/builtin/index.d.ts +20 -0
  387. package/dist/tool-system/builtin/index.js +449 -0
  388. package/dist/tool-system/builtin/lsp.d.ts +6 -0
  389. package/dist/tool-system/builtin/lsp.js +141 -0
  390. package/dist/tool-system/builtin/mcp-tools.d.ts +10 -0
  391. package/dist/tool-system/builtin/mcp-tools.js +102 -0
  392. package/dist/tool-system/builtin/memory.d.ts +26 -0
  393. package/dist/tool-system/builtin/memory.js +226 -0
  394. package/dist/tool-system/builtin/notebook-edit.d.ts +6 -0
  395. package/dist/tool-system/builtin/notebook-edit.js +124 -0
  396. package/dist/tool-system/builtin/plan.d.ts +15 -0
  397. package/dist/tool-system/builtin/plan.js +55 -0
  398. package/dist/tool-system/builtin/powershell.d.ts +11 -0
  399. package/dist/tool-system/builtin/powershell.js +64 -0
  400. package/dist/tool-system/builtin/read.d.ts +6 -0
  401. package/dist/tool-system/builtin/read.js +70 -0
  402. package/dist/tool-system/builtin/remote-trigger.d.ts +6 -0
  403. package/dist/tool-system/builtin/remote-trigger.js +54 -0
  404. package/dist/tool-system/builtin/repl.d.ts +11 -0
  405. package/dist/tool-system/builtin/repl.js +82 -0
  406. package/dist/tool-system/builtin/send-message.d.ts +6 -0
  407. package/dist/tool-system/builtin/send-message.js +47 -0
  408. package/dist/tool-system/builtin/skill-prompt.d.ts +20 -0
  409. package/dist/tool-system/builtin/skill-prompt.js +52 -0
  410. package/dist/tool-system/builtin/skill.d.ts +9 -0
  411. package/dist/tool-system/builtin/skill.js +55 -0
  412. package/dist/tool-system/builtin/sleep.d.ts +6 -0
  413. package/dist/tool-system/builtin/sleep.js +33 -0
  414. package/dist/tool-system/builtin/task.d.ts +48 -0
  415. package/dist/tool-system/builtin/task.js +139 -0
  416. package/dist/tool-system/builtin/tool-search.d.ts +11 -0
  417. package/dist/tool-system/builtin/tool-search.js +90 -0
  418. package/dist/tool-system/builtin/web-fetch.d.ts +10 -0
  419. package/dist/tool-system/builtin/web-fetch.js +328 -0
  420. package/dist/tool-system/builtin/web-search.d.ts +25 -0
  421. package/dist/tool-system/builtin/web-search.js +174 -0
  422. package/dist/tool-system/builtin/worktree.d.ts +10 -0
  423. package/dist/tool-system/builtin/worktree.js +95 -0
  424. package/dist/tool-system/builtin/write.d.ts +6 -0
  425. package/dist/tool-system/builtin/write.js +36 -0
  426. package/dist/tool-system/context.d.ts +165 -0
  427. package/dist/tool-system/context.js +18 -0
  428. package/dist/tool-system/executor.d.ts +49 -0
  429. package/dist/tool-system/executor.js +495 -0
  430. package/dist/tool-system/investigation-guard.d.ts +46 -0
  431. package/dist/tool-system/investigation-guard.js +155 -0
  432. package/dist/tool-system/mcp-manager.d.ts +67 -0
  433. package/dist/tool-system/mcp-manager.js +249 -0
  434. package/dist/tool-system/permission.d.ts +111 -0
  435. package/dist/tool-system/permission.js +774 -0
  436. package/dist/tool-system/registry.d.ts +32 -0
  437. package/dist/tool-system/registry.js +131 -0
  438. package/dist/tool-system/sandbox/bwrap.d.ts +13 -0
  439. package/dist/tool-system/sandbox/bwrap.js +63 -0
  440. package/dist/tool-system/sandbox/index.d.ts +78 -0
  441. package/dist/tool-system/sandbox/index.js +222 -0
  442. package/dist/tool-system/sandbox/off.d.ts +2 -0
  443. package/dist/tool-system/sandbox/off.js +8 -0
  444. package/dist/tool-system/sandbox/seatbelt.d.ts +18 -0
  445. package/dist/tool-system/sandbox/seatbelt.js +109 -0
  446. package/dist/tool-system/task-guard.d.ts +29 -0
  447. package/dist/tool-system/task-guard.js +70 -0
  448. package/dist/tool-system/validation.d.ts +5 -0
  449. package/dist/tool-system/validation.js +39 -0
  450. package/dist/types.d.ts +376 -0
  451. package/dist/types.js +4 -0
  452. package/dist/updater.d.ts +65 -0
  453. package/dist/updater.js +405 -0
  454. package/dist/utils/debug.d.ts +41 -0
  455. package/dist/utils/debug.js +110 -0
  456. package/dist/utils/earlyInput.d.ts +43 -0
  457. package/dist/utils/earlyInput.js +166 -0
  458. package/dist/utils/env.d.ts +24 -0
  459. package/dist/utils/env.js +104 -0
  460. package/dist/utils/envUtils.d.ts +51 -0
  461. package/dist/utils/envUtils.js +135 -0
  462. package/dist/utils/execFileNoThrow.d.ts +39 -0
  463. package/dist/utils/execFileNoThrow.js +74 -0
  464. package/dist/utils/format.d.ts +44 -0
  465. package/dist/utils/format.js +236 -0
  466. package/dist/utils/intl.d.ts +22 -0
  467. package/dist/utils/intl.js +83 -0
  468. package/dist/utils/lockfile.d.ts +15 -0
  469. package/dist/utils/lockfile.js +30 -0
  470. package/dist/utils/memoize.d.ts +19 -0
  471. package/dist/utils/memoize.js +14 -0
  472. package/dist/utils/semver.d.ts +6 -0
  473. package/dist/utils/semver.js +13 -0
  474. package/dist/utils/sliceAnsi.d.ts +12 -0
  475. package/dist/utils/sliceAnsi.js +62 -0
  476. package/dist/utils/systemTheme.d.ts +40 -0
  477. package/dist/utils/systemTheme.js +108 -0
  478. package/dist/utils/task-sanitizer.d.ts +6 -0
  479. package/dist/utils/task-sanitizer.js +24 -0
  480. package/dist/utils/theme.d.ts +93 -0
  481. package/dist/utils/theme.js +544 -0
  482. package/dist/utils/toolDisplay.d.ts +31 -0
  483. package/dist/utils/toolDisplay.js +188 -0
  484. package/package.json +72 -0
@@ -0,0 +1,132 @@
1
+ /**
2
+ * ArtifactTracker — records meaningful artifact refs during run execution.
3
+ *
4
+ * Listens to StreamEvents and identifies:
5
+ * - Files written or edited (Write / Edit tool results)
6
+ * - Files created by Bash commands (mkdir, touch, cp, git commit, etc.)
7
+ * - Structured outputs (e.g., generated configs, test results)
8
+ *
9
+ * Design constraint (§14):
10
+ * - Only record artifacts valuable for recovery, display, evaluation, or audit
11
+ * - Do NOT record every Read or every tool output
12
+ * - Judgment: file writes are artifacts, reads are not
13
+ */
14
+ import { nanoid } from "nanoid";
15
+ export class ArtifactTracker {
16
+ config;
17
+ pendingCalls = new Map();
18
+ recordedPaths = new Set();
19
+ constructor(config) {
20
+ this.config = config;
21
+ }
22
+ /**
23
+ * Feed a StreamEvent to the tracker.
24
+ */
25
+ async onStreamEvent(event) {
26
+ switch (event.type) {
27
+ case "tool_use_start":
28
+ this.pendingCalls.set(event.toolCall.id, {
29
+ toolName: event.toolCall.toolName,
30
+ args: event.toolCall.args,
31
+ });
32
+ break;
33
+ case "tool_result": {
34
+ const call = this.pendingCalls.get(event.result.id);
35
+ if (!call)
36
+ break;
37
+ this.pendingCalls.delete(event.result.id);
38
+ // Only track successful results
39
+ if (event.result.isError || event.result.error)
40
+ break;
41
+ await this.processToolResult(call, event.result.result);
42
+ break;
43
+ }
44
+ }
45
+ }
46
+ /** Get all recorded artifact paths. */
47
+ getRecordedPaths() {
48
+ return [...this.recordedPaths];
49
+ }
50
+ // ─── Internal ──────────────────────────────────────────────────
51
+ async processToolResult(call, resultText) {
52
+ switch (call.toolName) {
53
+ case "Write":
54
+ await this.recordFileArtifact(call.args.file_path, "output", "file");
55
+ break;
56
+ case "Edit":
57
+ await this.recordFileArtifact(call.args.file_path, "output", "file");
58
+ break;
59
+ case "Bash":
60
+ await this.extractBashArtifacts(call.args.command, resultText);
61
+ break;
62
+ case "NotebookEdit":
63
+ if (call.args.notebook_path) {
64
+ await this.recordFileArtifact(call.args.notebook_path, "output", "document");
65
+ }
66
+ break;
67
+ }
68
+ }
69
+ async recordFileArtifact(filePath, role, kind) {
70
+ if (!filePath)
71
+ return;
72
+ // Reject path traversal attempts
73
+ if (filePath.includes(".."))
74
+ return;
75
+ // Deduplicate — only record each path once per run
76
+ if (this.recordedPaths.has(filePath))
77
+ return;
78
+ this.recordedPaths.add(filePath);
79
+ const ref = {
80
+ artifactRefId: nanoid(12),
81
+ runId: this.config.runId,
82
+ kind,
83
+ title: extractFileName(filePath),
84
+ locator: filePath,
85
+ role,
86
+ version: null,
87
+ metadata: {},
88
+ };
89
+ await this.config.store.appendArtifactRef(ref);
90
+ }
91
+ /**
92
+ * Extract artifact refs from Bash commands.
93
+ * Only track commands that clearly produce files.
94
+ */
95
+ async extractBashArtifacts(command, _resultText) {
96
+ if (!command)
97
+ return;
98
+ const trimmed = command.trim();
99
+ // git commit — the commit itself is an artifact
100
+ if (/^git\s+commit\b/.test(trimmed)) {
101
+ const ref = {
102
+ artifactRefId: nanoid(12),
103
+ runId: this.config.runId,
104
+ kind: "resource",
105
+ title: "git commit",
106
+ locator: "git:HEAD",
107
+ role: "output",
108
+ version: null,
109
+ metadata: { command: trimmed.slice(0, 200) },
110
+ };
111
+ await this.config.store.appendArtifactRef(ref);
112
+ return;
113
+ }
114
+ // Redirect output: command > file or command >> file
115
+ const redirectMatch = trimmed.match(/>\s*(\S+)\s*$/);
116
+ if (redirectMatch) {
117
+ await this.recordFileArtifact(redirectMatch[1], "output", "file");
118
+ return;
119
+ }
120
+ // cp / mv — destination is an artifact
121
+ const cpMvMatch = trimmed.match(/^(?:cp|mv)\s+.*\s+(\S+)\s*$/);
122
+ if (cpMvMatch) {
123
+ await this.recordFileArtifact(cpMvMatch[1], "output", "file");
124
+ return;
125
+ }
126
+ }
127
+ }
128
+ // ─── Helpers ─────────────────────────────────────────────────────
129
+ function extractFileName(filePath) {
130
+ const parts = filePath.split("/");
131
+ return parts[parts.length - 1] || filePath;
132
+ }
@@ -0,0 +1,53 @@
1
+ /**
2
+ * CheckpointWriter — extracts structured checkpoints from Engine execution.
3
+ *
4
+ * Checkpoint sources (per design doc §12):
5
+ * 1. Lifecycle — run started, resumed, completed (handled by RunManager)
6
+ * 2. Phase boundary — detected from assistant messages via keyword heuristics
7
+ * 3. Waiting — entering waiting_input / waiting_approval (handled by RunManager)
8
+ * 4. Final — terminal state (handled by RunManager)
9
+ *
10
+ * This writer handles #2 (phase boundary) and periodic turn-based checkpoints.
11
+ * It listens to StreamEvents and writes checkpoints to RunStore when triggered.
12
+ *
13
+ * Design constraints (§12.1):
14
+ * - Do NOT checkpoint every tool call
15
+ * - Do NOT depend on model real-time summarization
16
+ * - Checkpoint = "state summary + pointers", not "full text copy"
17
+ */
18
+ import type { StreamEvent } from "../types.js";
19
+ import type { RunStore } from "./RunStore.js";
20
+ export interface CheckpointWriterConfig {
21
+ runId: string;
22
+ objective: string;
23
+ store: RunStore;
24
+ /** Write a periodic checkpoint every N turns. 0 = disabled. Default: 10 */
25
+ turnInterval?: number;
26
+ }
27
+ export declare class CheckpointWriter {
28
+ private readonly config;
29
+ private readonly turnInterval;
30
+ private currentTurn;
31
+ private lastCheckpointTurn;
32
+ private touchedTools;
33
+ private lastAssistantText;
34
+ private sessionId;
35
+ private detectedPhases;
36
+ constructor(config: CheckpointWriterConfig);
37
+ /**
38
+ * Feed a StreamEvent to the writer. Called for every event during execution.
39
+ */
40
+ onStreamEvent(event: StreamEvent): Promise<void>;
41
+ /** Set the linked session ID (called once known after Engine.run starts). */
42
+ setSessionId(id: string): void;
43
+ /** Get accumulated touched tools for use in final checkpoint. */
44
+ getTouchedTools(): string[];
45
+ private checkPhaseBoundary;
46
+ private writePeriodicCheckpoint;
47
+ private writeCheckpoint;
48
+ /**
49
+ * Extract a short summary from assistant text.
50
+ * Takes the first ~300 chars, truncated at sentence boundary.
51
+ */
52
+ private extractSummary;
53
+ }
@@ -0,0 +1,135 @@
1
+ /**
2
+ * CheckpointWriter — extracts structured checkpoints from Engine execution.
3
+ *
4
+ * Checkpoint sources (per design doc §12):
5
+ * 1. Lifecycle — run started, resumed, completed (handled by RunManager)
6
+ * 2. Phase boundary — detected from assistant messages via keyword heuristics
7
+ * 3. Waiting — entering waiting_input / waiting_approval (handled by RunManager)
8
+ * 4. Final — terminal state (handled by RunManager)
9
+ *
10
+ * This writer handles #2 (phase boundary) and periodic turn-based checkpoints.
11
+ * It listens to StreamEvents and writes checkpoints to RunStore when triggered.
12
+ *
13
+ * Design constraints (§12.1):
14
+ * - Do NOT checkpoint every tool call
15
+ * - Do NOT depend on model real-time summarization
16
+ * - Checkpoint = "state summary + pointers", not "full text copy"
17
+ */
18
+ import { nanoid } from "nanoid";
19
+ /**
20
+ * Known phase keywords — when an assistant message contains these patterns,
21
+ * we infer a phase transition and write a boundary checkpoint.
22
+ */
23
+ const PHASE_PATTERNS = [
24
+ { pattern: /\bplan\b.*\b(ready|complete|done|finalized)\b/i, phase: "plan_ready" },
25
+ { pattern: /\bresearch\b.*\b(complete|done|finished)\b/i, phase: "research_complete" },
26
+ { pattern: /\banalysis\b.*\b(complete|done|finished)\b/i, phase: "analysis_complete" },
27
+ { pattern: /\bimplementation\b.*\b(complete|done|finished)\b/i, phase: "implementation_complete" },
28
+ { pattern: /\bdraft\b.*\b(generated|ready|complete)\b/i, phase: "draft_generated" },
29
+ { pattern: /\btests?\b.*\b(pass|passing|green|complete)\b/i, phase: "tests_passing" },
30
+ { pattern: /\breview\b.*\b(complete|done|finished)\b/i, phase: "review_complete" },
31
+ { pattern: /\brefactor\b.*\b(complete|done|finished)\b/i, phase: "refactor_complete" },
32
+ ];
33
+ export class CheckpointWriter {
34
+ config;
35
+ turnInterval;
36
+ currentTurn = 0;
37
+ lastCheckpointTurn = 0;
38
+ touchedTools = new Set();
39
+ lastAssistantText = "";
40
+ sessionId = null;
41
+ detectedPhases = new Set();
42
+ constructor(config) {
43
+ this.config = config;
44
+ this.turnInterval = config.turnInterval ?? 10;
45
+ }
46
+ /**
47
+ * Feed a StreamEvent to the writer. Called for every event during execution.
48
+ */
49
+ async onStreamEvent(event) {
50
+ switch (event.type) {
51
+ case "stream_request_start":
52
+ this.currentTurn = event.turnNumber;
53
+ break;
54
+ case "tool_use_start":
55
+ this.touchedTools.add(event.toolCall.toolName);
56
+ break;
57
+ case "assistant_message": {
58
+ const text = typeof event.message.content === "string"
59
+ ? event.message.content
60
+ : event.message.content
61
+ .filter((b) => b.type === "text")
62
+ .map((b) => b.text ?? "")
63
+ .join("");
64
+ this.lastAssistantText = text;
65
+ // Check for phase boundary
66
+ await this.checkPhaseBoundary(text);
67
+ break;
68
+ }
69
+ case "turn_complete":
70
+ // Periodic checkpoint
71
+ if (this.turnInterval > 0 &&
72
+ this.currentTurn - this.lastCheckpointTurn >= this.turnInterval) {
73
+ await this.writePeriodicCheckpoint();
74
+ }
75
+ break;
76
+ }
77
+ }
78
+ /** Set the linked session ID (called once known after Engine.run starts). */
79
+ setSessionId(id) {
80
+ this.sessionId = id;
81
+ }
82
+ /** Get accumulated touched tools for use in final checkpoint. */
83
+ getTouchedTools() {
84
+ return [...this.touchedTools];
85
+ }
86
+ // ─── Internal ──────────────────────────────────────────────────
87
+ async checkPhaseBoundary(text) {
88
+ for (const { pattern, phase } of PHASE_PATTERNS) {
89
+ if (pattern.test(text) && !this.detectedPhases.has(phase)) {
90
+ this.detectedPhases.add(phase);
91
+ await this.writeCheckpoint(phase, this.extractSummary(text));
92
+ break; // One phase per message
93
+ }
94
+ }
95
+ }
96
+ async writePeriodicCheckpoint() {
97
+ this.lastCheckpointTurn = this.currentTurn;
98
+ await this.writeCheckpoint(`turn_${this.currentTurn}`, this.extractSummary(this.lastAssistantText));
99
+ }
100
+ async writeCheckpoint(phase, summary) {
101
+ const checkpoint = {
102
+ checkpointId: nanoid(12),
103
+ runId: this.config.runId,
104
+ createdAt: Date.now(),
105
+ phase,
106
+ objective: this.config.objective,
107
+ summary,
108
+ nextAction: null,
109
+ linkedSessionId: this.sessionId,
110
+ touchedTools: [...this.touchedTools],
111
+ touchedArtifacts: [],
112
+ waitingFor: null,
113
+ evaluator: null,
114
+ metadata: { turn: this.currentTurn },
115
+ };
116
+ await this.config.store.saveCheckpoint(checkpoint);
117
+ }
118
+ /**
119
+ * Extract a short summary from assistant text.
120
+ * Takes the first ~300 chars, truncated at sentence boundary.
121
+ */
122
+ extractSummary(text) {
123
+ if (!text)
124
+ return "(no summary available)";
125
+ const truncated = text.slice(0, 400);
126
+ // Try to break at last sentence boundary
127
+ const lastPeriod = truncated.lastIndexOf(".");
128
+ const lastNewline = truncated.lastIndexOf("\n");
129
+ const breakPoint = Math.max(lastPeriod, lastNewline);
130
+ if (breakPoint > 100) {
131
+ return truncated.slice(0, breakPoint + 1).trim();
132
+ }
133
+ return truncated.trim() + (text.length > 400 ? "..." : "");
134
+ }
135
+ }
@@ -0,0 +1,72 @@
1
+ /**
2
+ * EngineRunner — bridges a RunSnapshot into an Engine.run() call.
3
+ *
4
+ * Responsibilities:
5
+ * - Prepare EngineConfig from run snapshot
6
+ * - Start or resume a session
7
+ * - Inject run-aware approval backend and askUser adapter
8
+ * - Forward stream events to RunManager
9
+ * - Return execution result (does NOT manage run state transitions)
10
+ */
11
+ import { type EngineConfig, type EngineHookConfig } from "../engine/engine.js";
12
+ import type { LLMConfig, RegisteredTool } from "../types.js";
13
+ import type { RunSnapshot, RunExecutionContext, RunExecutionResult } from "./types.js";
14
+ import { type RunLifecycleHooks } from "./RunApprovalBackend.js";
15
+ /**
16
+ * Handles returned from execute() to allow RunManager to resolve
17
+ * pending approvals and user input while Engine is suspended.
18
+ */
19
+ export interface RunExecutionHandle {
20
+ /** Resolve a pending tool approval. Returns false if nothing was pending. */
21
+ resolveApproval: (approved: boolean, reason?: string) => boolean;
22
+ /** Resolve a pending user input request. Returns false if nothing was pending. */
23
+ resolveInput: (answer: string) => boolean;
24
+ /** Check if there's a pending approval. */
25
+ hasPendingApproval: () => boolean;
26
+ /** Check if there's a pending input request. */
27
+ hasPendingInput: () => boolean;
28
+ }
29
+ /**
30
+ * The contract for executing a Run. RunManager delegates to this interface.
31
+ *
32
+ * EngineRunner is the built-in implementation (calls CodeShell's LLM Engine).
33
+ * External services can implement this to plug in any execution backend:
34
+ * - CI/CD pipeline runners
35
+ * - ETL orchestrators
36
+ * - Multi-agent coordinators
37
+ * - Custom API call chains
38
+ */
39
+ export interface RunExecutor {
40
+ execute(run: RunSnapshot, context: RunExecutionContext, lifecycleHooks?: RunLifecycleHooks, onHandleReady?: (handle: RunExecutionHandle) => void): Promise<{
41
+ result: RunExecutionResult;
42
+ handle: RunExecutionHandle;
43
+ }>;
44
+ }
45
+ export interface CustomToolEntry {
46
+ definition: RegisteredTool;
47
+ execute: (args: Record<string, unknown>) => Promise<string>;
48
+ }
49
+ export interface EngineRunnerConfig {
50
+ llm: LLMConfig;
51
+ maxTurns?: number;
52
+ maxContextTokens?: number;
53
+ sessionStorageDir?: string;
54
+ permissionMode?: EngineConfig["permissionMode"];
55
+ enabledBuiltinTools?: string[];
56
+ disabledBuiltinTools?: string[];
57
+ customSystemPrompt?: string;
58
+ appendSystemPrompt?: string;
59
+ mcpServers?: EngineConfig["mcpServers"];
60
+ /** Custom tools registered by the product adapter. */
61
+ customTools?: CustomToolEntry[];
62
+ /** Hooks registered into each Engine instance before run execution. */
63
+ hooks?: EngineHookConfig[];
64
+ }
65
+ export declare class EngineRunner implements RunExecutor {
66
+ private readonly config;
67
+ constructor(config: EngineRunnerConfig);
68
+ execute(run: RunSnapshot, context: RunExecutionContext, lifecycleHooks?: RunLifecycleHooks, onHandleReady?: (handle: RunExecutionHandle) => void): Promise<{
69
+ result: RunExecutionResult;
70
+ handle: RunExecutionHandle;
71
+ }>;
72
+ }
@@ -0,0 +1,119 @@
1
+ /**
2
+ * EngineRunner — bridges a RunSnapshot into an Engine.run() call.
3
+ *
4
+ * Responsibilities:
5
+ * - Prepare EngineConfig from run snapshot
6
+ * - Start or resume a session
7
+ * - Inject run-aware approval backend and askUser adapter
8
+ * - Forward stream events to RunManager
9
+ * - Return execution result (does NOT manage run state transitions)
10
+ */
11
+ import { Engine } from "../engine/engine.js";
12
+ import { RunApprovalBackend, createRunAskUserFn, } from "./RunApprovalBackend.js";
13
+ import { createInProcessClient } from "../protocol/helpers.js";
14
+ // ─── EngineRunner (built-in RunExecutor) ────────────────────────
15
+ export class EngineRunner {
16
+ config;
17
+ constructor(config) {
18
+ this.config = config;
19
+ }
20
+ async execute(run, context, lifecycleHooks, onHandleReady) {
21
+ // Create run-aware approval backend
22
+ const approvalBackend = new RunApprovalBackend();
23
+ // Create run-aware askUser adapter
24
+ let resolveInputFn = () => false;
25
+ let hasPendingInputFn = () => false;
26
+ let askUserFn;
27
+ if (lifecycleHooks) {
28
+ approvalBackend.setHooks(lifecycleHooks);
29
+ const askAdapter = createRunAskUserFn(lifecycleHooks);
30
+ askUserFn = askAdapter.askUserFn;
31
+ resolveInputFn = askAdapter.resolveInput;
32
+ hasPendingInputFn = askAdapter.hasPendingInput;
33
+ }
34
+ const handle = {
35
+ resolveApproval: (approved, reason) => approvalBackend.resolveApproval(approved ? { approved: true } : { approved: false, reason }),
36
+ resolveInput: resolveInputFn,
37
+ hasPendingApproval: () => approvalBackend.hasPendingApproval(),
38
+ hasPendingInput: hasPendingInputFn,
39
+ };
40
+ // Expose handle immediately so RunManager can resolve approvals/input
41
+ // while Engine is suspended
42
+ onHandleReady?.(handle);
43
+ const engineConfig = {
44
+ llm: this.config.llm,
45
+ cwd: run.cwd,
46
+ maxTurns: this.config.maxTurns ?? 30,
47
+ maxContextTokens: this.config.maxContextTokens ?? 200_000,
48
+ permissionMode: this.config.permissionMode ?? "acceptEdits",
49
+ preset: run.preset,
50
+ enabledBuiltinTools: this.config.enabledBuiltinTools,
51
+ disabledBuiltinTools: this.config.disabledBuiltinTools,
52
+ customSystemPrompt: this.config.customSystemPrompt,
53
+ appendSystemPrompt: this.config.appendSystemPrompt,
54
+ sessionStorageDir: this.config.sessionStorageDir,
55
+ mcpServers: this.config.mcpServers,
56
+ hooks: this.config.hooks,
57
+ approvalBackend,
58
+ askUser: askUserFn,
59
+ ...context.engineConfigOverrides,
60
+ };
61
+ const engine = new Engine(engineConfig);
62
+ // Register custom tools from product adapter
63
+ if (this.config.customTools?.length) {
64
+ for (const ct of this.config.customTools) {
65
+ engine.registerCustomTool(ct.definition, ct.execute);
66
+ }
67
+ }
68
+ // Wrap the engine in an in-process AgentServer + AgentClient pair so
69
+ // the run path goes through the same protocol surface as REPL and
70
+ // headless CLI. Side effects unique to the server (TaskManager
71
+ // stream subscription, status notifications, in-process running
72
+ // lock) now apply to RunManager-launched runs too.
73
+ //
74
+ // Approval flow stays on the engineConfig.approvalBackend path that
75
+ // RunManager already wired — we don't subscribe client.onApprovalRequest
76
+ // because RunApprovalBackend intercepts approvals inside the engine
77
+ // before they reach the server's interactive-approval hook.
78
+ const { client, close } = createInProcessClient(engine, {
79
+ onStream: context.onStream,
80
+ });
81
+ // External AbortSignal → client.cancel. The signal is owned by
82
+ // RunManager (queue cancel, manual cancel); when it aborts we ask
83
+ // the server to stop the run, which aborts the underlying engine.run.
84
+ const onAbort = () => {
85
+ client.cancel().catch(() => {
86
+ // best-effort — server may already have torn down
87
+ });
88
+ };
89
+ if (context.signal) {
90
+ if (context.signal.aborted) {
91
+ onAbort();
92
+ }
93
+ else {
94
+ context.signal.addEventListener("abort", onAbort, { once: true });
95
+ }
96
+ }
97
+ try {
98
+ const result = await client.run(run.objective, {
99
+ cwd: run.cwd,
100
+ sessionId: run.sessionId ?? undefined,
101
+ });
102
+ return {
103
+ result: {
104
+ text: result.text,
105
+ reason: result.reason,
106
+ sessionId: result.sessionId,
107
+ turnCount: result.turnCount,
108
+ },
109
+ handle,
110
+ };
111
+ }
112
+ finally {
113
+ if (context.signal) {
114
+ context.signal.removeEventListener("abort", onAbort);
115
+ }
116
+ close();
117
+ }
118
+ }
119
+ }
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Evaluator — contract for run completion evaluation.
3
+ *
4
+ * An evaluator inspects a completed (or about-to-complete) run and produces
5
+ * a structured verdict. This enables:
6
+ * - Automated quality gates before marking a run as "completed"
7
+ * - Product-specific acceptance criteria
8
+ * - CI/CD integration for agent-driven workflows
9
+ *
10
+ * The evaluator is intentionally decoupled from the Engine:
11
+ * - It runs AFTER the Engine finishes, not during the turn loop
12
+ * - It receives the run snapshot + final checkpoint, not raw messages
13
+ * - Its result is written into the checkpoint's `evaluator` field
14
+ *
15
+ * Phase 5 provides the contract; concrete implementations are domain-specific.
16
+ */
17
+ import type { RunSnapshot, RunCheckpoint, RunArtifactRef } from "./types.js";
18
+ export type EvaluatorVerdict = "passed" | "failed" | "warning";
19
+ export interface EvaluatorResult {
20
+ verdict: EvaluatorVerdict;
21
+ findings: string[];
22
+ /** Optional structured data for programmatic consumption. */
23
+ details?: Record<string, unknown>;
24
+ }
25
+ export interface EvaluatorContext {
26
+ run: RunSnapshot;
27
+ checkpoint: RunCheckpoint;
28
+ artifacts: RunArtifactRef[];
29
+ }
30
+ export interface Evaluator {
31
+ /** Human-readable name for logging and display. */
32
+ readonly name: string;
33
+ /**
34
+ * Evaluate a run's final state.
35
+ * Should NOT have side effects beyond reading files/state.
36
+ * Must be safe to call multiple times on the same run.
37
+ */
38
+ evaluate(context: EvaluatorContext): Promise<EvaluatorResult>;
39
+ }
40
+ /**
41
+ * Default evaluator that always passes. Used when no evaluator is configured.
42
+ */
43
+ export declare class NoopEvaluator implements Evaluator {
44
+ readonly name = "noop";
45
+ evaluate(): Promise<EvaluatorResult>;
46
+ }
47
+ /**
48
+ * Runs multiple evaluators and merges their results.
49
+ * The overall verdict is the worst across all evaluators.
50
+ */
51
+ export declare class CompositeEvaluator implements Evaluator {
52
+ readonly name: string;
53
+ private readonly evaluators;
54
+ constructor(evaluators: Evaluator[]);
55
+ evaluate(context: EvaluatorContext): Promise<EvaluatorResult>;
56
+ }
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Evaluator — contract for run completion evaluation.
3
+ *
4
+ * An evaluator inspects a completed (or about-to-complete) run and produces
5
+ * a structured verdict. This enables:
6
+ * - Automated quality gates before marking a run as "completed"
7
+ * - Product-specific acceptance criteria
8
+ * - CI/CD integration for agent-driven workflows
9
+ *
10
+ * The evaluator is intentionally decoupled from the Engine:
11
+ * - It runs AFTER the Engine finishes, not during the turn loop
12
+ * - It receives the run snapshot + final checkpoint, not raw messages
13
+ * - Its result is written into the checkpoint's `evaluator` field
14
+ *
15
+ * Phase 5 provides the contract; concrete implementations are domain-specific.
16
+ */
17
+ // ─── Built-in: Noop Evaluator ────────────────────────────────────
18
+ /**
19
+ * Default evaluator that always passes. Used when no evaluator is configured.
20
+ */
21
+ export class NoopEvaluator {
22
+ name = "noop";
23
+ async evaluate() {
24
+ return { verdict: "passed", findings: [] };
25
+ }
26
+ }
27
+ // ─── Built-in: Composite Evaluator ──────────────────────────────
28
+ /**
29
+ * Runs multiple evaluators and merges their results.
30
+ * The overall verdict is the worst across all evaluators.
31
+ */
32
+ export class CompositeEvaluator {
33
+ name;
34
+ evaluators;
35
+ constructor(evaluators) {
36
+ this.evaluators = evaluators;
37
+ this.name = `composite(${evaluators.map((e) => e.name).join(", ")})`;
38
+ }
39
+ async evaluate(context) {
40
+ const allFindings = [];
41
+ let worstVerdict = "passed";
42
+ const details = {};
43
+ for (const evaluator of this.evaluators) {
44
+ const result = await evaluator.evaluate(context);
45
+ allFindings.push(...result.findings.map((f) => `[${evaluator.name}] ${f}`));
46
+ if (result.verdict === "failed") {
47
+ worstVerdict = "failed";
48
+ }
49
+ else if (result.verdict === "warning" && worstVerdict !== "failed") {
50
+ worstVerdict = "warning";
51
+ }
52
+ if (result.details) {
53
+ details[evaluator.name] = result.details;
54
+ }
55
+ }
56
+ return {
57
+ verdict: worstVerdict,
58
+ findings: allFindings,
59
+ details: Object.keys(details).length > 0 ? details : undefined,
60
+ };
61
+ }
62
+ }
@@ -0,0 +1,39 @@
1
+ /**
2
+ * FileRunStore — local filesystem implementation of RunStore.
3
+ *
4
+ * Layout:
5
+ * ~/.code-shell/runs/<runId>/
6
+ * run.json — current snapshot
7
+ * events.jsonl — append-only event log
8
+ * checkpoints/<id>.json — structured checkpoints
9
+ * approvals/<id>.json — approval records
10
+ * artifacts/refs.jsonl — artifact reference log
11
+ */
12
+ import type { RunStore } from "./RunStore.js";
13
+ import type { RunSnapshot, RunEvent, RunCheckpoint, RunApproval, RunArtifactRef, ListRunsQuery } from "./types.js";
14
+ export declare class FileRunStore implements RunStore {
15
+ private readonly runsDir;
16
+ constructor(storageDir?: string);
17
+ private runDir;
18
+ private ensureRunDir;
19
+ private writeJson;
20
+ private readJson;
21
+ /** Serializes concurrent JSONL appends per file path. */
22
+ private readonly appendLocks;
23
+ private appendJsonl;
24
+ private readJsonl;
25
+ create(snapshot: RunSnapshot): Promise<void>;
26
+ update(snapshot: RunSnapshot): Promise<void>;
27
+ get(runId: string): Promise<RunSnapshot | null>;
28
+ list(query?: ListRunsQuery): Promise<RunSnapshot[]>;
29
+ delete(runId: string): Promise<void>;
30
+ appendEvent(event: RunEvent): Promise<void>;
31
+ listEvents(runId: string): Promise<RunEvent[]>;
32
+ saveCheckpoint(cp: RunCheckpoint): Promise<void>;
33
+ getLatestCheckpoint(runId: string): Promise<RunCheckpoint | null>;
34
+ saveApproval(approval: RunApproval): Promise<void>;
35
+ getApproval(runId: string, approvalId: string): Promise<RunApproval | null>;
36
+ getPendingApproval(runId: string): Promise<RunApproval | null>;
37
+ appendArtifactRef(ref: RunArtifactRef): Promise<void>;
38
+ listArtifactRefs(runId: string): Promise<RunArtifactRef[]>;
39
+ }