@cjhyy/code-shell-core 0.7.0 → 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 (621) 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 +20 -5
  23. package/dist/context/compaction.d.ts +39 -3
  24. package/dist/context/compaction.js +151 -39
  25. package/dist/context/manager.d.ts +20 -4
  26. package/dist/context/manager.js +42 -7
  27. package/dist/context/token-counter.js +5 -3
  28. package/dist/context/tool-result-storage.d.ts +6 -0
  29. package/dist/context/tool-result-storage.js +25 -4
  30. package/dist/credentials/access.d.ts +13 -2
  31. package/dist/credentials/access.js +99 -4
  32. package/dist/credentials/index.d.ts +3 -2
  33. package/dist/credentials/index.js +2 -1
  34. package/dist/credentials/oauth.d.ts +9 -1
  35. package/dist/credentials/oauth.js +80 -1
  36. package/dist/credentials/store.d.ts +16 -2
  37. package/dist/credentials/store.js +33 -11
  38. package/dist/credentials/types.d.ts +62 -1
  39. package/dist/credentials/types.js +16 -1
  40. package/dist/credentials/use-credential-tool.js +15 -1
  41. package/dist/engine/auxiliary-pipeline.d.ts +40 -0
  42. package/dist/engine/auxiliary-pipeline.js +181 -0
  43. package/dist/{settings → engine}/disk-defaults.d.ts +2 -2
  44. package/dist/{settings → engine}/disk-defaults.js +5 -2
  45. package/dist/engine/dynamic-tool-defs.d.ts +4 -0
  46. package/dist/engine/dynamic-tool-defs.js +4 -0
  47. package/dist/engine/engine.d.ts +272 -184
  48. package/dist/engine/engine.js +1869 -1864
  49. package/dist/engine/file-history-hook.d.ts +11 -0
  50. package/dist/engine/file-history-hook.js +31 -0
  51. package/dist/engine/goal-judge-context.d.ts +9 -0
  52. package/dist/engine/goal-judge-context.js +234 -0
  53. package/dist/engine/injected-context-cache.d.ts +6 -0
  54. package/dist/engine/injected-context-cache.js +13 -0
  55. package/dist/engine/input-attachments.d.ts +1 -1
  56. package/dist/engine/model-facade.d.ts +3 -3
  57. package/dist/engine/model-facade.js +15 -14
  58. package/dist/engine/permission-controller.d.ts +55 -0
  59. package/dist/engine/permission-controller.js +148 -0
  60. package/dist/engine/prompt-cache-diagnostics.d.ts +58 -0
  61. package/dist/engine/prompt-cache-diagnostics.js +178 -0
  62. package/dist/engine/run-accounting.d.ts +41 -0
  63. package/dist/engine/run-accounting.js +126 -0
  64. package/dist/engine/run-context.d.ts +44 -0
  65. package/dist/engine/run-context.js +88 -0
  66. package/dist/engine/run-environment.d.ts +30 -0
  67. package/dist/engine/run-environment.js +77 -0
  68. package/dist/engine/run-finalize.d.ts +58 -0
  69. package/dist/engine/run-finalize.js +245 -0
  70. package/dist/engine/run-goal.d.ts +58 -0
  71. package/dist/engine/run-goal.js +188 -0
  72. package/dist/engine/run-image-input.d.ts +1 -1
  73. package/dist/engine/run-image-input.js +5 -3
  74. package/dist/engine/run-session-open.d.ts +41 -0
  75. package/dist/engine/run-session-open.js +186 -0
  76. package/dist/engine/run-setup.d.ts +42 -0
  77. package/dist/engine/run-setup.js +58 -0
  78. package/dist/engine/run-tooling.d.ts +125 -0
  79. package/dist/engine/run-tooling.js +283 -0
  80. package/dist/engine/run-types.d.ts +139 -0
  81. package/dist/engine/run-types.js +12 -0
  82. package/dist/engine/run-workspace.d.ts +50 -0
  83. package/dist/engine/run-workspace.js +114 -0
  84. package/dist/engine/session-title.d.ts +2 -1
  85. package/dist/engine/session-title.js +4 -1
  86. package/dist/engine/steer-queue.d.ts +1 -1
  87. package/dist/engine/subagent-spawner.d.ts +32 -0
  88. package/dist/engine/subagent-spawner.js +287 -0
  89. package/dist/engine/tool-summary.d.ts +2 -2
  90. package/dist/engine/tool-summary.js +2 -2
  91. package/dist/engine/turn-loop.d.ts +67 -10
  92. package/dist/engine/turn-loop.js +538 -97
  93. package/dist/engine/types.d.ts +35 -4
  94. package/dist/engine/types.js +1 -1
  95. package/dist/{engine/goal.d.ts → goal/lifecycle.d.ts} +80 -6
  96. package/dist/goal/lifecycle.js +482 -0
  97. package/dist/hooks/events.d.ts +26 -9
  98. package/dist/hooks/events.js +0 -3
  99. package/dist/hooks/goal-stop-hook.d.ts +28 -29
  100. package/dist/hooks/goal-stop-hook.js +344 -144
  101. package/dist/hooks/registry.js +4 -1
  102. package/dist/hooks/shell-runner.d.ts +12 -1
  103. package/dist/hooks/shell-runner.js +160 -9
  104. package/dist/index.d.ts +51 -110
  105. package/dist/index.extension.d.ts +51 -0
  106. package/dist/index.extension.js +39 -0
  107. package/dist/index.internal.d.ts +86 -0
  108. package/dist/index.internal.js +92 -0
  109. package/dist/index.js +37 -125
  110. package/dist/links/cli.d.ts +48 -0
  111. package/dist/links/cli.js +617 -0
  112. package/dist/links/http.d.ts +40 -0
  113. package/dist/links/http.js +166 -0
  114. package/dist/links/index.d.ts +4 -0
  115. package/dist/links/index.js +3 -0
  116. package/dist/links/link-action-tool.d.ts +5 -0
  117. package/dist/links/link-action-tool.js +241 -0
  118. package/dist/links/providers.d.ts +8 -0
  119. package/dist/links/providers.js +665 -0
  120. package/dist/links/types.d.ts +44 -0
  121. package/dist/llm/client-base.d.ts +7 -0
  122. package/dist/llm/client-base.js +72 -10
  123. package/dist/llm/model-pool.d.ts +1 -1
  124. package/dist/llm/model-pool.js +1 -1
  125. package/dist/llm/providers/anthropic.d.ts +1 -0
  126. package/dist/llm/providers/anthropic.js +9 -0
  127. package/dist/llm/providers/openai.d.ts +1 -0
  128. package/dist/llm/providers/openai.js +17 -0
  129. package/dist/llm/types.d.ts +12 -5
  130. package/dist/model-catalog/index.js +15 -2
  131. package/dist/model-catalog/resolve.d.ts +13 -1
  132. package/dist/model-catalog/resolve.js +37 -2
  133. package/dist/model-catalog/types.d.ts +74 -48
  134. package/dist/model-catalog/types.js +16 -5
  135. package/dist/model-catalog/upsert.d.ts +3 -1
  136. package/dist/model-catalog/upsert.js +9 -0
  137. package/dist/onboarding.d.ts +0 -1
  138. package/dist/onboarding.js +1 -22
  139. package/dist/panel-apps/bindings.d.ts +24 -0
  140. package/dist/panel-apps/bindings.js +69 -0
  141. package/dist/panel-apps/github-archive.d.ts +21 -0
  142. package/dist/panel-apps/github-archive.js +98 -0
  143. package/dist/panel-apps/index.d.ts +4 -0
  144. package/dist/panel-apps/index.js +4 -0
  145. package/dist/panel-apps/installer.d.ts +68 -0
  146. package/dist/panel-apps/installer.js +622 -0
  147. package/dist/panel-apps/manifest.d.ts +364 -0
  148. package/dist/panel-apps/manifest.js +189 -0
  149. package/dist/panel-apps/paths.d.ts +13 -0
  150. package/dist/panel-apps/paths.js +38 -0
  151. package/dist/panel-apps/registry.d.ts +51 -0
  152. package/dist/panel-apps/registry.js +99 -0
  153. package/dist/panel-apps/runtime.d.ts +80 -0
  154. package/dist/panel-apps/runtime.js +154 -0
  155. package/dist/plugins/gitOps.js +8 -1
  156. package/dist/plugins/installedPlugins.d.ts +2 -1
  157. package/dist/plugins/installedPlugins.js +146 -8
  158. package/dist/plugins/installer/codex/convertAgents.d.ts +4 -1
  159. package/dist/plugins/installer/codex/convertAgents.js +62 -8
  160. package/dist/plugins/installer/codex/convertCommands.d.ts +5 -5
  161. package/dist/plugins/installer/codex/convertCommands.js +35 -12
  162. package/dist/plugins/installer/codex/convertHooks.d.ts +10 -0
  163. package/dist/plugins/installer/codex/convertHooks.js +82 -0
  164. package/dist/plugins/installer/codex/convertSkills.js +41 -6
  165. package/dist/plugins/installer/install.d.ts +7 -1
  166. package/dist/plugins/installer/install.js +21 -87
  167. package/dist/plugins/installer/installFromArchive.d.ts +26 -4
  168. package/dist/plugins/installer/installFromArchive.js +44 -27
  169. package/dist/plugins/installer/installFromNpm.d.ts +31 -0
  170. package/dist/plugins/installer/installFromNpm.js +273 -0
  171. package/dist/plugins/installer/loadPluginAgents.js +17 -4
  172. package/dist/plugins/installer/loadPluginMcp.d.ts +14 -0
  173. package/dist/plugins/installer/loadPluginMcp.js +245 -35
  174. package/dist/plugins/installer/normalizeManifest.d.ts +13 -0
  175. package/dist/plugins/installer/normalizeManifest.js +306 -0
  176. package/dist/plugins/installer/npmTar.d.ts +13 -0
  177. package/dist/plugins/installer/npmTar.js +321 -0
  178. package/dist/plugins/installer/parseSource.d.ts +11 -0
  179. package/dist/plugins/installer/parseSource.js +48 -0
  180. package/dist/plugins/installer/preview.d.ts +101 -0
  181. package/dist/plugins/installer/preview.js +336 -0
  182. package/dist/plugins/installer/projectPluginSource.d.ts +14 -0
  183. package/dist/plugins/installer/projectPluginSource.js +140 -0
  184. package/dist/plugins/installer/types.d.ts +775 -0
  185. package/dist/plugins/installer/types.js +100 -0
  186. package/dist/plugins/installer/unzip.d.ts +11 -0
  187. package/dist/plugins/installer/unzip.js +123 -9
  188. package/dist/plugins/installer/update.d.ts +2 -2
  189. package/dist/plugins/installer/update.js +43 -4
  190. package/dist/plugins/loadPluginHooks.d.ts +19 -2
  191. package/dist/plugins/loadPluginHooks.js +97 -86
  192. package/dist/plugins/pluginAutomationTemplates.d.ts +18 -0
  193. package/dist/plugins/pluginAutomationTemplates.js +50 -0
  194. package/dist/plugins/pluginCatalog.d.ts +45 -0
  195. package/dist/plugins/pluginCatalog.js +87 -0
  196. package/dist/plugins/pluginCommandHook.d.ts +10 -4
  197. package/dist/plugins/pluginCommandHook.js +133 -18
  198. package/dist/plugins/pluginCommandsLoader.d.ts +19 -0
  199. package/dist/plugins/pluginCommandsLoader.js +181 -7
  200. package/dist/plugins/pluginContent.d.ts +10 -1
  201. package/dist/plugins/pluginContent.js +87 -30
  202. package/dist/plugins/pluginHookApproval.d.ts +30 -0
  203. package/dist/plugins/pluginHookApproval.js +160 -0
  204. package/dist/plugins/pluginHookIntegrity.d.ts +69 -0
  205. package/dist/plugins/pluginHookIntegrity.js +361 -0
  206. package/dist/plugins/pluginInstaller.js +71 -12
  207. package/dist/plugins/pluginMcpApproval.d.ts +19 -0
  208. package/dist/plugins/pluginMcpApproval.js +110 -0
  209. package/dist/plugins/pluginMcpIntegrity.d.ts +21 -0
  210. package/dist/plugins/pluginMcpIntegrity.js +74 -0
  211. package/dist/plugins/types.d.ts +30 -0
  212. package/dist/plugins/varRewrite.d.ts +9 -5
  213. package/dist/plugins/varRewrite.js +26 -17
  214. package/dist/preset/index.d.ts +11 -8
  215. package/dist/preset/index.js +62 -203
  216. package/dist/product/define.js +9 -3
  217. package/dist/product/types.d.ts +0 -2
  218. package/dist/profile/activation.d.ts +36 -0
  219. package/dist/profile/activation.js +57 -0
  220. package/dist/profile/catalog-store.d.ts +77 -0
  221. package/dist/profile/catalog-store.js +346 -0
  222. package/dist/profile/catalog.d.ts +54 -0
  223. package/dist/profile/catalog.js +152 -0
  224. package/dist/profile/index.d.ts +7 -0
  225. package/dist/profile/index.js +7 -0
  226. package/dist/profile/requirements.d.ts +76 -0
  227. package/dist/profile/requirements.js +117 -0
  228. package/dist/profile/resolve.d.ts +11 -0
  229. package/dist/profile/resolve.js +41 -0
  230. package/dist/profile/store.d.ts +17 -0
  231. package/dist/profile/store.js +167 -0
  232. package/dist/profile/types.d.ts +321 -0
  233. package/dist/profile/types.js +104 -0
  234. package/dist/prompt/composer.d.ts +46 -7
  235. package/dist/prompt/composer.js +78 -48
  236. package/dist/prompt/instruction-scanner.d.ts +6 -5
  237. package/dist/prompt/instruction-scanner.js +8 -23
  238. package/dist/prompt/section-loader.d.ts +2 -2
  239. package/dist/prompt/section-loader.js +7 -4
  240. package/dist/prompt/sections/browser.md +10 -9
  241. package/dist/prompt/sections/harness-base.md +9 -0
  242. package/dist/protocol/chat-session-manager.d.ts +77 -3
  243. package/dist/protocol/chat-session-manager.js +194 -18
  244. package/dist/protocol/chat-session.d.ts +72 -9
  245. package/dist/protocol/chat-session.js +151 -16
  246. package/dist/protocol/client.d.ts +37 -4
  247. package/dist/protocol/client.js +118 -6
  248. package/dist/protocol/index.d.ts +2 -2
  249. package/dist/protocol/index.js +2 -2
  250. package/dist/protocol/mobile-remote-types.d.ts +406 -0
  251. package/dist/protocol/mobile-remote-types.js +1 -0
  252. package/dist/protocol/server.d.ts +152 -14
  253. package/dist/protocol/server.js +1574 -229
  254. package/dist/protocol/types.d.ts +182 -32
  255. package/dist/protocol/types.js +18 -0
  256. package/dist/run/ArtifactTracker.d.ts +6 -1
  257. package/dist/run/ArtifactTracker.js +29 -21
  258. package/dist/run/EngineRunner.d.ts +2 -0
  259. package/dist/run/EngineRunner.js +1 -0
  260. package/dist/run/RunManager.d.ts +26 -0
  261. package/dist/run/RunManager.js +82 -11
  262. package/dist/run/factory.d.ts +3 -0
  263. package/dist/run/factory.js +2 -0
  264. package/dist/runtime/safe-spawn.d.ts +6 -0
  265. package/dist/runtime/safe-spawn.js +8 -13
  266. package/dist/services/auto-dream.d.ts +13 -1
  267. package/dist/services/auto-dream.js +56 -8
  268. package/dist/services/dream-consolidation.d.ts +3 -0
  269. package/dist/services/dream-consolidation.js +14 -2
  270. package/dist/services/index.d.ts +1 -1
  271. package/dist/services/index.js +1 -1
  272. package/dist/services/memory-orchestrator.js +6 -2
  273. package/dist/services/oauth.d.ts +34 -10
  274. package/dist/services/oauth.js +236 -98
  275. package/dist/services/session-memory.d.ts +4 -4
  276. package/dist/services/session-memory.js +13 -10
  277. package/dist/session/memory.d.ts +26 -7
  278. package/dist/session/memory.js +79 -21
  279. package/dist/session/session-manager.d.ts +208 -25
  280. package/dist/session/session-manager.js +1232 -116
  281. package/dist/session/session-message.d.ts +22 -0
  282. package/dist/session/session-message.js +1 -0
  283. package/dist/session/transcript.d.ts +76 -6
  284. package/dist/session/transcript.js +278 -7
  285. package/dist/settings/feature-flags.d.ts +40 -0
  286. package/dist/settings/feature-flags.js +40 -0
  287. package/dist/settings/manager.d.ts +39 -1
  288. package/dist/settings/manager.js +102 -41
  289. package/dist/settings/migrate-config.js +4 -2
  290. package/dist/settings/schema.d.ts +511 -177
  291. package/dist/settings/schema.js +98 -25
  292. package/dist/skills/scanner.d.ts +6 -2
  293. package/dist/skills/scanner.js +160 -9
  294. package/dist/sources/adapter.d.ts +14 -0
  295. package/dist/sources/adapter.js +7 -0
  296. package/dist/sources/adapters/local-files.d.ts +10 -0
  297. package/dist/sources/adapters/local-files.js +127 -0
  298. package/dist/sources/adapters/mcp-resource.d.ts +17 -0
  299. package/dist/sources/adapters/mcp-resource.js +41 -0
  300. package/dist/sources/adapters/mock.d.ts +3 -0
  301. package/dist/sources/adapters/mock.js +29 -0
  302. package/dist/sources/binding.d.ts +6 -0
  303. package/dist/sources/binding.js +24 -0
  304. package/dist/sources/catalog.d.ts +6 -0
  305. package/dist/sources/catalog.js +64 -0
  306. package/dist/sources/context-summary.d.ts +8 -0
  307. package/dist/sources/context-summary.js +13 -0
  308. package/dist/sources/credential-status.d.ts +2 -0
  309. package/dist/sources/credential-status.js +13 -0
  310. package/dist/sources/index.d.ts +10 -0
  311. package/dist/sources/index.js +10 -0
  312. package/dist/sources/resolve.d.ts +28 -0
  313. package/dist/sources/resolve.js +47 -0
  314. package/dist/sources/truncate-utf8.d.ts +7 -0
  315. package/dist/sources/truncate-utf8.js +18 -0
  316. package/dist/sources/types.d.ts +71 -0
  317. package/dist/sources/types.js +26 -0
  318. package/dist/testing/fetch-stub.d.ts +32 -0
  319. package/dist/testing/fetch-stub.js +24 -0
  320. package/dist/themes/image.d.ts +18 -0
  321. package/dist/themes/image.js +117 -0
  322. package/dist/themes/index.d.ts +4 -0
  323. package/dist/themes/index.js +4 -0
  324. package/dist/themes/installer.d.ts +50 -0
  325. package/dist/themes/installer.js +290 -0
  326. package/dist/themes/manifest.d.ts +102 -0
  327. package/dist/themes/manifest.js +86 -0
  328. package/dist/themes/paths.d.ts +14 -0
  329. package/dist/themes/paths.js +33 -0
  330. package/dist/tool-system/browser-bridge.d.ts +53 -11
  331. package/dist/tool-system/browser-bridge.js +8 -9
  332. package/dist/tool-system/builtin/agent-heartbeat.d.ts +2 -2
  333. package/dist/tool-system/builtin/agent-heartbeat.js +20 -6
  334. package/dist/tool-system/builtin/agent-notifications.d.ts +127 -72
  335. package/dist/tool-system/builtin/agent-notifications.js +291 -101
  336. package/dist/tool-system/builtin/agent-output-file.js +1 -3
  337. package/dist/tool-system/builtin/agent-progress.d.ts +6 -0
  338. package/dist/tool-system/builtin/agent-progress.js +83 -0
  339. package/dist/tool-system/builtin/agent-registry.d.ts +38 -2
  340. package/dist/tool-system/builtin/agent-registry.js +178 -9
  341. package/dist/tool-system/builtin/agent-transcript-translator.js +1 -1
  342. package/dist/tool-system/builtin/agent.d.ts +2 -0
  343. package/dist/tool-system/builtin/agent.js +279 -34
  344. package/dist/tool-system/builtin/background-jobs.d.ts +63 -7
  345. package/dist/tool-system/builtin/background-jobs.js +111 -15
  346. package/dist/tool-system/builtin/background-work.d.ts +12 -1
  347. package/dist/tool-system/builtin/background-work.js +12 -1
  348. package/dist/tool-system/builtin/bash.d.ts +3 -5
  349. package/dist/tool-system/builtin/bash.js +14 -6
  350. package/dist/tool-system/builtin/browser-tools.d.ts +8 -5
  351. package/dist/tool-system/builtin/browser-tools.js +89 -23
  352. package/dist/tool-system/builtin/edit-model-catalog.d.ts +6 -0
  353. package/dist/tool-system/builtin/edit-model-catalog.js +172 -12
  354. package/dist/tool-system/builtin/edit.d.ts +2 -1
  355. package/dist/tool-system/builtin/edit.js +14 -10
  356. package/dist/tool-system/builtin/file-cache.d.ts +2 -0
  357. package/dist/tool-system/builtin/file-cache.js +4 -0
  358. package/dist/tool-system/builtin/generate-image.js +17 -10
  359. package/dist/tool-system/builtin/generate-video.d.ts +4 -0
  360. package/dist/tool-system/builtin/generate-video.js +164 -28
  361. package/dist/tool-system/builtin/glob.d.ts +2 -1
  362. package/dist/tool-system/builtin/glob.js +28 -3
  363. package/dist/tool-system/builtin/grep.d.ts +1 -0
  364. package/dist/tool-system/builtin/grep.js +82 -17
  365. package/dist/tool-system/builtin/image-uploader.js +7 -1
  366. package/dist/tool-system/builtin/index.d.ts +57 -18
  367. package/dist/tool-system/builtin/index.js +280 -167
  368. package/dist/tool-system/builtin/memory.d.ts +6 -0
  369. package/dist/tool-system/builtin/memory.js +36 -15
  370. package/dist/tool-system/builtin/panel.d.ts +9 -0
  371. package/dist/tool-system/builtin/panel.js +314 -0
  372. package/dist/tool-system/builtin/read.js +5 -1
  373. package/dist/tool-system/builtin/send-message-to-session.d.ts +6 -0
  374. package/dist/tool-system/builtin/send-message-to-session.js +67 -0
  375. package/dist/tool-system/builtin/sources.d.ts +8 -0
  376. package/dist/tool-system/builtin/sources.js +137 -0
  377. package/dist/tool-system/builtin/tool-search.js +7 -2
  378. package/dist/tool-system/builtin/update-automation-memory.js +2 -0
  379. package/dist/tool-system/builtin/video-providers.d.ts +12 -15
  380. package/dist/tool-system/builtin/video-providers.js +1 -0
  381. package/dist/tool-system/builtin/view-image.d.ts +2 -2
  382. package/dist/tool-system/builtin/web-fetch.js +60 -15
  383. package/dist/tool-system/builtin/web-search.js +1 -3
  384. package/dist/tool-system/builtin/write.d.ts +2 -1
  385. package/dist/tool-system/builtin/write.js +14 -4
  386. package/dist/tool-system/capability-module.d.ts +93 -0
  387. package/dist/tool-system/capability-module.js +53 -0
  388. package/dist/tool-system/context.d.ts +94 -24
  389. package/dist/tool-system/executor.js +99 -58
  390. package/dist/tool-system/external-tool-exposure.d.ts +60 -0
  391. package/dist/tool-system/external-tool-exposure.js +304 -0
  392. package/dist/tool-system/mcp-manager.d.ts +17 -1
  393. package/dist/tool-system/mcp-manager.js +72 -7
  394. package/dist/tool-system/mcp-tool-policy.d.ts +9 -0
  395. package/dist/tool-system/mcp-tool-policy.js +34 -0
  396. package/dist/tool-system/panel-bridge.d.ts +53 -0
  397. package/dist/tool-system/panel-bridge.js +1 -0
  398. package/dist/tool-system/path-policy.d.ts +19 -0
  399. package/dist/tool-system/path-policy.js +62 -1
  400. package/dist/tool-system/permission.d.ts +69 -3
  401. package/dist/tool-system/permission.js +429 -30
  402. package/dist/tool-system/registry.d.ts +15 -3
  403. package/dist/tool-system/registry.js +82 -40
  404. package/dist/tool-system/sandbox/index.js +3 -8
  405. package/dist/tool-system/sandbox/seatbelt.js +2 -6
  406. package/dist/tool-system/session-tool-host.d.ts +139 -0
  407. package/dist/tool-system/session-tool-host.js +167 -0
  408. package/dist/tool-system/testing/tool-registry-harness.d.ts +31 -0
  409. package/dist/tool-system/testing/tool-registry-harness.js +51 -0
  410. package/dist/tool-system/validation.d.ts +14 -7
  411. package/dist/tool-system/validation.js +701 -7
  412. package/dist/types.d.ts +201 -20
  413. package/dist/{cc-orchestrator → utils}/cwd-normalize.d.ts +1 -0
  414. package/dist/{cc-orchestrator → utils}/cwd-normalize.js +1 -0
  415. package/dist/utils/file-mutex.d.ts +65 -0
  416. package/dist/utils/file-mutex.js +145 -0
  417. package/dist/utils/json.d.ts +2 -4
  418. package/dist/utils/json.js +2 -4
  419. package/dist/utils/lockfile.d.ts +30 -1
  420. package/dist/utils/lockfile.js +2 -2
  421. package/dist/utils/secret-scrubber.d.ts +8 -0
  422. package/dist/utils/secret-scrubber.js +227 -0
  423. package/dist/utils/toolDisplay.js +1 -1
  424. package/package.json +20 -5
  425. package/THIRD_PARTY_NOTICES.md +0 -206
  426. package/dist/arena/arena.d.ts +0 -43
  427. package/dist/arena/arena.js +0 -333
  428. package/dist/arena/context/context-tools.d.ts +0 -16
  429. package/dist/arena/context/context-tools.js +0 -272
  430. package/dist/arena/context/within-root.d.ts +0 -7
  431. package/dist/arena/context/within-root.js +0 -15
  432. package/dist/arena/detect-mode.d.ts +0 -20
  433. package/dist/arena/detect-mode.js +0 -78
  434. package/dist/arena/digest-builder.d.ts +0 -25
  435. package/dist/arena/digest-builder.js +0 -120
  436. package/dist/arena/index.d.ts +0 -29
  437. package/dist/arena/index.js +0 -29
  438. package/dist/arena/iterate/convergence.d.ts +0 -25
  439. package/dist/arena/iterate/convergence.js +0 -103
  440. package/dist/arena/iterate/formats/index.d.ts +0 -22
  441. package/dist/arena/iterate/formats/index.js +0 -283
  442. package/dist/arena/iterate/index.d.ts +0 -11
  443. package/dist/arena/iterate/index.js +0 -9
  444. package/dist/arena/iterate/iterative-arena.d.ts +0 -23
  445. package/dist/arena/iterate/iterative-arena.js +0 -237
  446. package/dist/arena/iterate/parse.d.ts +0 -42
  447. package/dist/arena/iterate/parse.js +0 -123
  448. package/dist/arena/iterate/phases/argue.d.ts +0 -22
  449. package/dist/arena/iterate/phases/argue.js +0 -165
  450. package/dist/arena/iterate/phases/revise.d.ts +0 -16
  451. package/dist/arena/iterate/phases/revise.js +0 -62
  452. package/dist/arena/iterate/phases/tournament.d.ts +0 -34
  453. package/dist/arena/iterate/phases/tournament.js +0 -113
  454. package/dist/arena/iterate/tools/web-tools.d.ts +0 -13
  455. package/dist/arena/iterate/tools/web-tools.js +0 -54
  456. package/dist/arena/iterate/types.d.ts +0 -152
  457. package/dist/arena/iterate/types.js +0 -8
  458. package/dist/arena/ledger.d.ts +0 -47
  459. package/dist/arena/ledger.js +0 -159
  460. package/dist/arena/lenses/architecture.d.ts +0 -5
  461. package/dist/arena/lenses/architecture.js +0 -22
  462. package/dist/arena/lenses/engineering.d.ts +0 -5
  463. package/dist/arena/lenses/engineering.js +0 -22
  464. package/dist/arena/lenses/general.d.ts +0 -5
  465. package/dist/arena/lenses/general.js +0 -20
  466. package/dist/arena/lenses/index.d.ts +0 -16
  467. package/dist/arena/lenses/index.js +0 -47
  468. package/dist/arena/lenses/product.d.ts +0 -5
  469. package/dist/arena/lenses/product.js +0 -22
  470. package/dist/arena/model-presets.d.ts +0 -23
  471. package/dist/arena/model-presets.js +0 -44
  472. package/dist/arena/phases/adjudication.d.ts +0 -24
  473. package/dist/arena/phases/adjudication.js +0 -141
  474. package/dist/arena/phases/build-consensus.d.ts +0 -29
  475. package/dist/arena/phases/build-consensus.js +0 -83
  476. package/dist/arena/phases/claim-registry.d.ts +0 -26
  477. package/dist/arena/phases/claim-registry.js +0 -60
  478. package/dist/arena/phases/cross-review.d.ts +0 -45
  479. package/dist/arena/phases/cross-review.js +0 -218
  480. package/dist/arena/phases/debate-rounds.d.ts +0 -27
  481. package/dist/arena/phases/debate-rounds.js +0 -159
  482. package/dist/arena/phases/participant-research.d.ts +0 -38
  483. package/dist/arena/phases/participant-research.js +0 -314
  484. package/dist/arena/phases/planning-detail-expansion.d.ts +0 -38
  485. package/dist/arena/phases/planning-detail-expansion.js +0 -119
  486. package/dist/arena/planner.d.ts +0 -27
  487. package/dist/arena/planner.js +0 -311
  488. package/dist/arena/providers/docs.d.ts +0 -7
  489. package/dist/arena/providers/docs.js +0 -111
  490. package/dist/arena/providers/git.d.ts +0 -8
  491. package/dist/arena/providers/git.js +0 -174
  492. package/dist/arena/providers/index.d.ts +0 -32
  493. package/dist/arena/providers/index.js +0 -132
  494. package/dist/arena/providers/none.d.ts +0 -7
  495. package/dist/arena/providers/none.js +0 -11
  496. package/dist/arena/providers/repo.d.ts +0 -7
  497. package/dist/arena/providers/repo.js +0 -258
  498. package/dist/arena/render/session.d.ts +0 -17
  499. package/dist/arena/render/session.js +0 -190
  500. package/dist/arena/render/terminal.d.ts +0 -34
  501. package/dist/arena/render/terminal.js +0 -286
  502. package/dist/arena/strategies/discussion.d.ts +0 -25
  503. package/dist/arena/strategies/discussion.js +0 -143
  504. package/dist/arena/strategies/index.d.ts +0 -15
  505. package/dist/arena/strategies/index.js +0 -28
  506. package/dist/arena/strategies/language-wrapper.d.ts +0 -17
  507. package/dist/arena/strategies/language-wrapper.js +0 -102
  508. package/dist/arena/strategies/lens-wrapper.d.ts +0 -16
  509. package/dist/arena/strategies/lens-wrapper.js +0 -236
  510. package/dist/arena/strategies/planning.d.ts +0 -30
  511. package/dist/arena/strategies/planning.js +0 -225
  512. package/dist/arena/strategies/review.d.ts +0 -26
  513. package/dist/arena/strategies/review.js +0 -168
  514. package/dist/arena/strategies/utils.d.ts +0 -36
  515. package/dist/arena/strategies/utils.js +0 -603
  516. package/dist/arena/tools/selector.d.ts +0 -17
  517. package/dist/arena/tools/selector.js +0 -61
  518. package/dist/arena/transitions.d.ts +0 -53
  519. package/dist/arena/transitions.js +0 -97
  520. package/dist/arena/types.d.ts +0 -514
  521. package/dist/arena/types.js +0 -27
  522. package/dist/cc-orchestrator/agent-adapter.d.ts +0 -54
  523. package/dist/cc-orchestrator/agent-adapter.js +0 -143
  524. package/dist/cc-orchestrator/cc-capability.d.ts +0 -19
  525. package/dist/cc-orchestrator/cc-capability.js +0 -53
  526. package/dist/cc-orchestrator/codex-session-discovery.d.ts +0 -24
  527. package/dist/cc-orchestrator/codex-session-discovery.js +0 -191
  528. package/dist/cc-orchestrator/codex-session-history.d.ts +0 -38
  529. package/dist/cc-orchestrator/codex-session-history.js +0 -247
  530. package/dist/cc-orchestrator/external-agent-bindings.d.ts +0 -27
  531. package/dist/cc-orchestrator/external-agent-bindings.js +0 -150
  532. package/dist/cc-orchestrator/external-agent-changes.d.ts +0 -19
  533. package/dist/cc-orchestrator/external-agent-changes.js +0 -231
  534. package/dist/cc-orchestrator/external-agent-driver.d.ts +0 -19
  535. package/dist/cc-orchestrator/external-agent-driver.js +0 -284
  536. package/dist/cc-orchestrator/external-agent-session-store.d.ts +0 -23
  537. package/dist/cc-orchestrator/external-agent-session-store.js +0 -146
  538. package/dist/cc-orchestrator/index.d.ts +0 -8
  539. package/dist/cc-orchestrator/index.js +0 -8
  540. package/dist/cc-orchestrator/relevance-judge.d.ts +0 -15
  541. package/dist/cc-orchestrator/relevance-judge.js +0 -29
  542. package/dist/cc-orchestrator/session-discovery.d.ts +0 -46
  543. package/dist/cc-orchestrator/session-discovery.js +0 -125
  544. package/dist/cc-orchestrator/session-history.d.ts +0 -54
  545. package/dist/cc-orchestrator/session-history.js +0 -150
  546. package/dist/cron/cron-runtime.d.ts +0 -2
  547. package/dist/cron/cron-runtime.js +0 -2
  548. package/dist/cron/cron-store.d.ts +0 -2
  549. package/dist/cron/cron-store.js +0 -2
  550. package/dist/cron/scheduler.d.ts +0 -7
  551. package/dist/cron/scheduler.js +0 -7
  552. package/dist/engine/goal.js +0 -206
  553. package/dist/external-agents/config.d.ts +0 -2
  554. package/dist/external-agents/config.js +0 -15
  555. package/dist/external-agents/types.d.ts +0 -31
  556. package/dist/git/parse-log.d.ts +0 -13
  557. package/dist/git/parse-log.js +0 -21
  558. package/dist/git/utils.d.ts +0 -49
  559. package/dist/git/utils.js +0 -161
  560. package/dist/git/worktree/crud.d.ts +0 -69
  561. package/dist/git/worktree/crud.js +0 -206
  562. package/dist/git/worktree/diff.d.ts +0 -14
  563. package/dist/git/worktree/diff.js +0 -82
  564. package/dist/git/worktree/git-exec.d.ts +0 -7
  565. package/dist/git/worktree/git-exec.js +0 -51
  566. package/dist/git/worktree/index.d.ts +0 -5
  567. package/dist/git/worktree/index.js +0 -5
  568. package/dist/git/worktree/query.d.ts +0 -42
  569. package/dist/git/worktree/query.js +0 -121
  570. package/dist/git/worktree/slug.d.ts +0 -11
  571. package/dist/git/worktree/slug.js +0 -58
  572. package/dist/git/worktree.d.ts +0 -1
  573. package/dist/git/worktree.js +0 -5
  574. package/dist/lsp/client.d.ts +0 -41
  575. package/dist/lsp/client.js +0 -186
  576. package/dist/lsp/manager.d.ts +0 -40
  577. package/dist/lsp/manager.js +0 -155
  578. package/dist/lsp/root-path.d.ts +0 -9
  579. package/dist/lsp/root-path.js +0 -12
  580. package/dist/lsp/servers.d.ts +0 -16
  581. package/dist/lsp/servers.js +0 -60
  582. package/dist/prompt/sections/coding.md +0 -35
  583. package/dist/quota/credentials.d.ts +0 -3
  584. package/dist/quota/credentials.js +0 -80
  585. package/dist/quota/index.d.ts +0 -36
  586. package/dist/quota/index.js +0 -155
  587. package/dist/quota/types.d.ts +0 -48
  588. package/dist/quota/types.js +0 -13
  589. package/dist/review/review-prompt.d.ts +0 -28
  590. package/dist/review/review-prompt.js +0 -81
  591. package/dist/state.d.ts +0 -160
  592. package/dist/state.js +0 -267
  593. package/dist/tool-system/builtin/apply-patch/applier.d.ts +0 -26
  594. package/dist/tool-system/builtin/apply-patch/applier.js +0 -308
  595. package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +0 -10
  596. package/dist/tool-system/builtin/apply-patch/backup-targets.js +0 -30
  597. package/dist/tool-system/builtin/apply-patch/index.d.ts +0 -20
  598. package/dist/tool-system/builtin/apply-patch/index.js +0 -105
  599. package/dist/tool-system/builtin/apply-patch/parser.d.ts +0 -17
  600. package/dist/tool-system/builtin/apply-patch/parser.js +0 -212
  601. package/dist/tool-system/builtin/apply-patch/seek-sequence.d.ts +0 -18
  602. package/dist/tool-system/builtin/apply-patch/seek-sequence.js +0 -123
  603. package/dist/tool-system/builtin/apply-patch/types.d.ts +0 -49
  604. package/dist/tool-system/builtin/apply-patch/types.js +0 -13
  605. package/dist/tool-system/builtin/arena.d.ts +0 -31
  606. package/dist/tool-system/builtin/arena.js +0 -415
  607. package/dist/tool-system/builtin/brief.d.ts +0 -6
  608. package/dist/tool-system/builtin/brief.js +0 -41
  609. package/dist/tool-system/builtin/check-quota.d.ts +0 -15
  610. package/dist/tool-system/builtin/check-quota.js +0 -34
  611. package/dist/tool-system/builtin/drive-claude-code.d.ts +0 -51
  612. package/dist/tool-system/builtin/drive-claude-code.js +0 -698
  613. package/dist/tool-system/builtin/lsp.d.ts +0 -7
  614. package/dist/tool-system/builtin/lsp.js +0 -144
  615. package/dist/tool-system/builtin/notebook-edit.d.ts +0 -7
  616. package/dist/tool-system/builtin/notebook-edit.js +0 -127
  617. package/dist/tool-system/builtin/worktree.d.ts +0 -11
  618. package/dist/tool-system/builtin/worktree.js +0 -345
  619. /package/dist/{external-agents → links}/types.js +0 -0
  620. /package/dist/{engine/session-usage.d.ts → session/usage.d.ts} +0 -0
  621. /package/dist/{engine/session-usage.js → session/usage.js} +0 -0
@@ -0,0 +1,22 @@
1
+ /** A host-authorized project Session that may receive a model-sent message. */
2
+ export interface SessionMessageTarget {
3
+ sessionId: string;
4
+ title: string;
5
+ workspaceRoot: string;
6
+ workspaceProfile?: string;
7
+ }
8
+ export interface RouteSessionMessageInput {
9
+ sourceSessionId: string;
10
+ target: SessionMessageTarget;
11
+ message: string;
12
+ /** Full same-project catalog so the target can send a later message onward. */
13
+ catalog: readonly SessionMessageTarget[];
14
+ }
15
+ export type SessionMessageRouter = (input: RouteSessionMessageInput) => Promise<void>;
16
+ export interface SessionMessageToolService {
17
+ targets: readonly SessionMessageTarget[];
18
+ send(input: {
19
+ targetSessionId: string;
20
+ message: string;
21
+ }): Promise<SessionMessageTarget>;
22
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -3,12 +3,55 @@
3
3
  * toMessages() derives Message[] from events for sending to LLM.
4
4
  */
5
5
  import type { TranscriptEvent, TranscriptEventType, Message, ContentBlock } from "../types.js";
6
+ import type { EngineResult } from "../engine/types.js";
7
+ type TranscriptWriter = (filePath: string, data: string, encoding: "utf-8") => void;
8
+ type ParsedEvents = {
9
+ events: TranscriptEvent[];
10
+ malformedLineCount: number;
11
+ };
12
+ export interface TranscriptFlushFailure {
13
+ errno: string | number;
14
+ code?: string;
15
+ message: string;
16
+ timestamp: number;
17
+ attempts: 2;
18
+ recoverable: false;
19
+ filePath: string;
20
+ }
21
+ export interface ContextEventRange {
22
+ fromEventId: string;
23
+ toEventId: string;
24
+ }
25
+ export interface SelectedContextRange {
26
+ events: TranscriptEvent[];
27
+ messages: Message[];
28
+ sourceEventCount: number;
29
+ }
30
+ export type SummaryAppendMetadata = {
31
+ fromTurn: number;
32
+ toTurn: number;
33
+ eventCount: number;
34
+ } | {
35
+ trigger: "context_transfer";
36
+ sourceRange: {
37
+ sessionId: string;
38
+ fromEventId: string;
39
+ toEventId: string;
40
+ };
41
+ sourceEventCount: number;
42
+ estimatedTokens: number;
43
+ summaryVersion: number;
44
+ summaryHash: string;
45
+ };
6
46
  export declare class Transcript {
7
47
  private events;
8
48
  private filePath;
9
49
  private currentTurn;
50
+ private readonly writer;
51
+ private dirty;
52
+ private lastFlushFailure;
10
53
  getFilePath(): string;
11
- constructor(filePath: string);
54
+ constructor(filePath: string, writer?: TranscriptWriter);
12
55
  append(type: TranscriptEventType, data: Record<string, unknown>): TranscriptEvent;
13
56
  /**
14
57
  * Append a chat message to the transcript.
@@ -24,8 +67,21 @@ export declare class Transcript {
24
67
  injected?: boolean;
25
68
  steerId?: string;
26
69
  clientMessageId?: string;
70
+ displayText?: string;
71
+ authority?: "user" | "agent" | "system" | "policy";
72
+ source?: "agent-direction" | "goal-control";
73
+ envelopeIds?: string[];
74
+ correlationIds?: string[];
27
75
  }): TranscriptEvent;
28
76
  hasClientMessageId(clientMessageId: string): boolean;
77
+ /**
78
+ * Persist the exact response associated with one idempotent submit. The
79
+ * receipt stays outside toMessages(), so replay support does not change the
80
+ * model's conversation history.
81
+ */
82
+ appendRunResult(clientMessageId: string, result: EngineResult): TranscriptEvent;
83
+ /** Return the newest valid durable response for an idempotent submit. */
84
+ findRunResultByClientMessageId(clientMessageId: string): EngineResult | undefined;
29
85
  appendToolUse(toolName: string, toolCallId: string, args: Record<string, unknown>): TranscriptEvent;
30
86
  appendToolResult(toolCallId: string, toolName: string, result?: string, error?: string, contentBlocks?: ContentBlock[]): TranscriptEvent;
31
87
  /** Anchor for a spawned sub-agent (see TranscriptEventType "subagent").
@@ -41,11 +97,7 @@ export declare class Transcript {
41
97
  * can hit more than one abort return for a single Stop).
42
98
  */
43
99
  appendTurnStopped(): TranscriptEvent | undefined;
44
- appendSummary(summary: string, compactedRange: {
45
- fromTurn: number;
46
- toTurn: number;
47
- eventCount: number;
48
- }): TranscriptEvent;
100
+ appendSummary(summary: string, metadata: SummaryAppendMetadata): TranscriptEvent;
49
101
  appendError(error: string, details?: Record<string, unknown>): TranscriptEvent;
50
102
  /**
51
103
  * Derive Message[] from transcript events for sending to the LLM.
@@ -55,13 +107,31 @@ export declare class Transcript {
55
107
  getEvents(type?: TranscriptEventType): TranscriptEvent[];
56
108
  get turnNumber(): number;
57
109
  get eventCount(): number;
110
+ /** True once any event failed both persistence attempts. Sticky by design. */
111
+ flushFailed(): boolean;
112
+ /** Structured details for the most recent unrecoverable flush failure. */
113
+ getFlushFailure(): TranscriptFlushFailure | undefined;
58
114
  private findMessageByClientId;
59
115
  private flush;
116
+ private errorErrno;
117
+ private errorMessage;
60
118
  /**
61
119
  * Repair tool_result pairing issues:
62
120
  * - Orphaned tool_results (no matching tool_use) get removed
63
121
  * - Missing tool_results (tool_use with no result) get synthetic error results
64
122
  */
65
123
  repairToolResultPairs(): void;
124
+ static readEvents(filePath: string): ParsedEvents;
125
+ static eventsToMessages(events: readonly TranscriptEvent[]): Array<{
126
+ role: string;
127
+ content: string | ContentBlock[];
128
+ }>;
129
+ /**
130
+ * Select one inclusive, stable event-id range and project only LLM-context
131
+ * events from it. Audit/UI events remain part of sourceEventCount but never
132
+ * enter the package prompt.
133
+ */
134
+ static selectContextRange(events: readonly TranscriptEvent[], range: ContextEventRange): SelectedContextRange;
66
135
  static loadFromFile(filePath: string): Transcript;
67
136
  }
137
+ export {};
@@ -6,15 +6,26 @@ import { appendFileSync, readFileSync, existsSync, mkdirSync, writeFileSync } fr
6
6
  import { dirname } from "node:path";
7
7
  import { nanoid } from "nanoid";
8
8
  import { logger } from "../logging/logger.js";
9
+ const CONTEXT_EVENT_TYPES = new Set([
10
+ "message",
11
+ "tool_use",
12
+ "tool_result",
13
+ "summary",
14
+ "context_transfer",
15
+ ]);
9
16
  export class Transcript {
10
17
  events = [];
11
18
  filePath;
12
19
  currentTurn = 0;
20
+ writer;
21
+ dirty = false;
22
+ lastFlushFailure;
13
23
  getFilePath() {
14
24
  return this.filePath;
15
25
  }
16
- constructor(filePath) {
26
+ constructor(filePath, writer = appendFileSync) {
17
27
  this.filePath = filePath;
28
+ this.writer = writer;
18
29
  mkdirSync(dirname(filePath), { recursive: true });
19
30
  if (!existsSync(filePath)) {
20
31
  writeFileSync(filePath, "", "utf-8");
@@ -60,11 +71,37 @@ export class Transcript {
60
71
  ...(opts?.injected ? { injected: true } : {}),
61
72
  ...(opts?.steerId ? { steerId: opts.steerId } : {}),
62
73
  ...(opts?.clientMessageId ? { clientMessageId: opts.clientMessageId } : {}),
74
+ ...(opts?.displayText ? { displayText: opts.displayText } : {}),
75
+ ...(opts?.authority ? { authority: opts.authority } : {}),
76
+ ...(opts?.source ? { source: opts.source } : {}),
77
+ ...(opts?.envelopeIds ? { envelopeIds: opts.envelopeIds } : {}),
78
+ ...(opts?.correlationIds ? { correlationIds: opts.correlationIds } : {}),
63
79
  });
64
80
  }
65
81
  hasClientMessageId(clientMessageId) {
66
82
  return this.findMessageByClientId(clientMessageId) !== undefined;
67
83
  }
84
+ /**
85
+ * Persist the exact response associated with one idempotent submit. The
86
+ * receipt stays outside toMessages(), so replay support does not change the
87
+ * model's conversation history.
88
+ */
89
+ appendRunResult(clientMessageId, result) {
90
+ return this.append("run_result", { clientMessageId, result });
91
+ }
92
+ /** Return the newest valid durable response for an idempotent submit. */
93
+ findRunResultByClientMessageId(clientMessageId) {
94
+ for (let index = this.events.length - 1; index >= 0; index -= 1) {
95
+ const event = this.events[index];
96
+ if (event.type !== "run_result" || event.data.clientMessageId !== clientMessageId)
97
+ continue;
98
+ const result = event.data.result;
99
+ if (!isEngineResultReceipt(result))
100
+ return undefined;
101
+ return result;
102
+ }
103
+ return undefined;
104
+ }
68
105
  appendToolUse(toolName, toolCallId, args) {
69
106
  return this.append("tool_use", { toolName, toolCallId, args });
70
107
  }
@@ -100,11 +137,15 @@ export class Transcript {
100
137
  return undefined;
101
138
  return this.append("turn_stopped", {});
102
139
  }
103
- appendSummary(summary, compactedRange) {
140
+ appendSummary(summary, metadata) {
141
+ if ("trigger" in metadata) {
142
+ const { trigger: _trigger, ...provenance } = metadata;
143
+ return this.append("context_transfer", { summary, ...provenance });
144
+ }
104
145
  return this.append("summary", {
105
146
  summary,
106
147
  trigger: "auto",
107
- compactedRange,
148
+ compactedRange: metadata,
108
149
  preservedSegment: {
109
150
  headEventId: this.events[0]?.id,
110
151
  tailEventId: this.events[this.events.length - 1]?.id,
@@ -162,7 +203,17 @@ export class Transcript {
162
203
  });
163
204
  break;
164
205
  }
165
- // turn_boundary, session_meta, file_history, plan_operation, error
206
+ case "context_transfer": {
207
+ const { summary, handoffId } = event.data;
208
+ messages.push({
209
+ role: "user",
210
+ content: handoffId
211
+ ? `<system-reminder>Session handoff received:\n${summary}</system-reminder>`
212
+ : `<system-reminder>Background context transferred from a selected conversation range:\n${summary}</system-reminder>`,
213
+ });
214
+ break;
215
+ }
216
+ // turn_boundary, run_result, session_meta, file_history, plan_operation, error
166
217
  // are not included in LLM messages
167
218
  }
168
219
  }
@@ -179,18 +230,65 @@ export class Transcript {
179
230
  get eventCount() {
180
231
  return this.events.length;
181
232
  }
233
+ /** True once any event failed both persistence attempts. Sticky by design. */
234
+ flushFailed() {
235
+ return this.dirty;
236
+ }
237
+ /** Structured details for the most recent unrecoverable flush failure. */
238
+ getFlushFailure() {
239
+ return this.lastFlushFailure ? { ...this.lastFlushFailure } : undefined;
240
+ }
182
241
  findMessageByClientId(clientMessageId) {
183
242
  return this.events.find((event) => event.type === "message" &&
184
243
  event.data.clientMessageId === clientMessageId);
185
244
  }
186
245
  flush(event) {
246
+ const line = JSON.stringify(event) + "\n";
187
247
  try {
188
- appendFileSync(this.filePath, JSON.stringify(event) + "\n", "utf-8");
248
+ this.writer(this.filePath, line, "utf-8");
249
+ return true;
189
250
  }
190
- catch {
191
- // Silently fail on flush errors — events are still in memory
251
+ catch (firstError) {
252
+ try {
253
+ this.writer(this.filePath, line, "utf-8");
254
+ logger.warn("transcript.flush_retry_recovered", {
255
+ filePath: this.filePath,
256
+ errno: this.errorErrno(firstError),
257
+ message: this.errorMessage(firstError),
258
+ });
259
+ return true;
260
+ }
261
+ catch (retryError) {
262
+ const err = retryError;
263
+ const failure = {
264
+ errno: this.errorErrno(retryError),
265
+ ...(typeof err?.code === "string" ? { code: err.code } : {}),
266
+ message: this.errorMessage(retryError),
267
+ timestamp: Date.now(),
268
+ attempts: 2,
269
+ recoverable: false,
270
+ filePath: this.filePath,
271
+ };
272
+ // Sticky: a later successful append cannot restore an earlier missing
273
+ // JSONL event, so the transcript remains degraded for this instance.
274
+ this.dirty = true;
275
+ this.lastFlushFailure = failure;
276
+ logger.error("transcript.flush_failed", { ...failure });
277
+ return false;
278
+ }
192
279
  }
193
280
  }
281
+ errorErrno(error) {
282
+ const err = error;
283
+ if (typeof err?.errno === "number" || typeof err?.errno === "string")
284
+ return err.errno;
285
+ if (typeof err?.code === "string")
286
+ return err.code;
287
+ return "UNKNOWN";
288
+ }
289
+ errorMessage(error) {
290
+ return error instanceof Error ? error.message : String(error);
291
+ }
194
292
  /**
195
293
  * Repair tool_result pairing issues:
196
294
  * - Orphaned tool_results (no matching tool_use) get removed
@@ -227,6 +325,111 @@ export class Transcript {
227
325
  return true;
228
326
  });
229
327
  }
328
+ static readEvents(filePath) {
329
+ let raw;
330
+ try {
331
+ raw = readFileSync(filePath, "utf-8");
332
+ }
333
+ catch {
334
+ return { events: [], malformedLineCount: 0 };
335
+ }
336
+ const lines = raw.split("\n").filter((line) => line.trim().length > 0);
337
+ const events = [];
338
+ let malformedLineCount = 0;
339
+ for (const line of lines) {
340
+ try {
341
+ events.push(JSON.parse(line));
342
+ }
343
+ catch {
344
+ malformedLineCount++;
345
+ }
346
+ }
347
+ return { events, malformedLineCount };
348
+ }
349
+ static eventsToMessages(events) {
350
+ const messages = [];
351
+ for (const event of events) {
352
+ switch (event.type) {
353
+ case "message": {
354
+ const { role, content } = event.data;
355
+ messages.push({ role, content });
356
+ break;
357
+ }
358
+ case "tool_use":
359
+ break;
360
+ case "tool_result": {
361
+ const { toolCallId, result, error, contentBlocks } = event.data;
362
+ const block = {
363
+ type: "tool_result",
364
+ tool_use_id: toolCallId,
365
+ content: error
366
+ ? `Error: ${error}`
367
+ : Array.isArray(contentBlocks) && contentBlocks.length > 0
368
+ ? contentBlocks
369
+ : (result ?? "(no output)"),
370
+ };
371
+ const last = messages[messages.length - 1];
372
+ if (last?.role === "user" && Array.isArray(last.content)) {
373
+ last.content.push(block);
374
+ }
375
+ else {
376
+ messages.push({ role: "user", content: [block] });
377
+ }
378
+ break;
379
+ }
380
+ case "summary": {
381
+ const { summary } = event.data;
382
+ messages.push({
383
+ role: "user",
384
+ content: `<system-reminder>Previous conversation was summarized:\n${summary}</system-reminder>`,
385
+ });
386
+ break;
387
+ }
388
+ case "context_transfer": {
389
+ const { summary, handoffId } = event.data;
390
+ messages.push({
391
+ role: "user",
392
+ content: handoffId
393
+ ? `<system-reminder>Session handoff received:\n${summary}</system-reminder>`
394
+ : `<system-reminder>Background context transferred from a selected conversation range:\n${summary}</system-reminder>`,
395
+ });
396
+ break;
397
+ }
398
+ }
399
+ }
400
+ return messages;
401
+ }
402
+ /**
403
+ * Select one inclusive, stable event-id range and project only LLM-context
404
+ * events from it. Audit/UI events remain part of sourceEventCount but never
405
+ * enter the package prompt.
406
+ */
407
+ static selectContextRange(events, range) {
408
+ const fromMatches = events
409
+ .map((event, index) => (event.id === range.fromEventId ? index : -1))
410
+ .filter((index) => index >= 0);
411
+ const toMatches = events
412
+ .map((event, index) => (event.id === range.toEventId ? index : -1))
413
+ .filter((index) => index >= 0);
414
+ if (fromMatches.length !== 1 || toMatches.length !== 1) {
415
+ throw new Error("Context range endpoints must each identify exactly one source event");
416
+ }
417
+ const fromIndex = fromMatches[0];
418
+ const toIndex = toMatches[0];
419
+ if (fromIndex > toIndex)
420
+ throw new Error("Context range endpoints are out of order");
421
+ const frozen = structuredClone(events.slice(fromIndex, toIndex + 1));
422
+ if (frozen[0]?.type === "session_meta" || frozen.at(-1)?.type === "session_meta") {
423
+ throw new Error("Context range cannot use session metadata as a boundary");
424
+ }
425
+ const selected = frozen.filter((event) => CONTEXT_EVENT_TYPES.has(event.type));
426
+ validateSelectedToolPairs(selected);
427
+ return {
428
+ events: selected,
429
+ messages: Transcript.eventsToMessages(selected),
430
+ sourceEventCount: frozen.length,
431
+ };
432
+ }
230
433
  static loadFromFile(filePath) {
231
434
  const transcript = new Transcript(filePath);
232
435
  if (!existsSync(filePath))
@@ -250,3 +453,71 @@ export class Transcript {
250
453
  return transcript;
251
454
  }
252
455
  }
456
+ function isEngineResultReceipt(value) {
457
+ if (!value || typeof value !== "object" || Array.isArray(value))
458
+ return false;
459
+ const result = value;
460
+ const usage = result.usage;
461
+ return (typeof result.text === "string" &&
462
+ typeof result.reason === "string" &&
463
+ typeof result.sessionId === "string" &&
464
+ typeof result.turnCount === "number" &&
465
+ Number.isSafeInteger(result.turnCount) &&
466
+ Boolean(usage) &&
467
+ typeof usage?.promptTokens === "number" &&
468
+ typeof usage?.completionTokens === "number" &&
469
+ typeof usage?.totalTokens === "number");
470
+ }
471
+ function validateSelectedToolPairs(events) {
472
+ const providerUses = [];
473
+ const metadataUses = [];
474
+ const results = [];
475
+ for (const event of events) {
476
+ if (event.type === "message") {
477
+ const content = event.data.content;
478
+ if (!Array.isArray(content))
479
+ continue;
480
+ for (const block of content) {
481
+ if (block.type === "tool_use" && typeof block.id === "string")
482
+ providerUses.push(block.id);
483
+ }
484
+ }
485
+ else if (event.type === "tool_use") {
486
+ if (typeof event.data.toolCallId === "string")
487
+ metadataUses.push(event.data.toolCallId);
488
+ }
489
+ else if (event.type === "tool_result") {
490
+ if (typeof event.data.toolCallId === "string")
491
+ results.push(event.data.toolCallId);
492
+ }
493
+ }
494
+ if (new Set(providerUses).size !== providerUses.length) {
495
+ throw new Error("Context range contains duplicate provider tool metadata");
496
+ }
497
+ if (new Set(metadataUses).size !== metadataUses.length) {
498
+ throw new Error("Context range contains duplicate tool metadata");
499
+ }
500
+ if (new Set(results).size !== results.length) {
501
+ throw new Error("Context range contains duplicate tool results");
502
+ }
503
+ if (providerUses.length !== metadataUses.length ||
504
+ providerUses.some((id, index) => metadataUses[index] !== id)) {
505
+ throw new Error("Context range has orphaned or mismatched tool metadata");
506
+ }
507
+ const pending = new Set();
508
+ for (const event of events) {
509
+ if (event.type === "tool_use") {
510
+ const id = event.data.toolCallId;
511
+ if (typeof id === "string")
512
+ pending.add(id);
513
+ }
514
+ else if (event.type === "tool_result") {
515
+ const id = event.data.toolCallId;
516
+ if (typeof id !== "string" || !pending.delete(id)) {
517
+ throw new Error("Context range contains an orphaned or out-of-order tool result");
518
+ }
519
+ }
520
+ }
521
+ if (pending.size > 0)
522
+ throw new Error("Context range ends with an unfinished tool round");
523
+ }
@@ -43,6 +43,46 @@ export declare const FEATURE_FLAGS: {
43
43
  readonly default: false;
44
44
  readonly description: "Capture full command stdout/stderr snapshots";
45
45
  };
46
+ /**
47
+ * Run a session on an EXTERNAL Agent Runtime (Codex / Claude Code) instead of
48
+ * the native Engine.
49
+ *
50
+ * Default ON, which reverses the original §20 decision. The reasoning behind
51
+ * "off" was that the native path must not depend on an external binary — that
52
+ * still holds, and is now enforced by a better mechanism than a flag: the
53
+ * picker only lists a runtime whose binary is actually installed
54
+ * (external-runtime-availability.ts), and every non-prefixed model key still
55
+ * routes to the native Engine. A machine without `codex` sees exactly what it
56
+ * saw before.
57
+ *
58
+ * What the flag actually did in practice was hide the feature from everyone,
59
+ * including the people who installed Codex on purpose: the entries never
60
+ * appeared, with no hint that a setting was responsible. An opt-in nobody can
61
+ * discover is indistinguishable from a missing feature.
62
+ *
63
+ * Turning it off remains the escape hatch — it hides the entries outright.
64
+ */
65
+ readonly external_agent_runtime: {
66
+ readonly default: true;
67
+ readonly description: "Allow a session to run on Codex or Claude Code instead of the native engine";
68
+ };
69
+ /**
70
+ * Expose CodeShell Host Tools to an external runtime. Separate from the flag
71
+ * above so the runtime can be trialled with NO tool surface at all — §20 asks
72
+ * for exactly that split, because the tool bridge is the part that carries the
73
+ * security burden.
74
+ *
75
+ * Also default ON now, for a blunt reason: with it off the runtime has an
76
+ * EMPTY tool surface — no skills, no memory, no file access — which is not a
77
+ * usable Agent Runtime, so shipping that as the default just means the
78
+ * feature appears broken. Every exposed tool still executes through
79
+ * ToolExecutor, so the user's permission rules and the approval dialog apply
80
+ * exactly as they do on the native path.
81
+ */
82
+ readonly external_host_tools: {
83
+ readonly default: true;
84
+ readonly description: "Expose allowlisted CodeShell tools to an external Agent Runtime";
85
+ };
46
86
  };
47
87
  export type FeatureFlagName = keyof typeof FEATURE_FLAGS;
48
88
  /** The settings overlay shape: a partial map of known flags → boolean. */
@@ -28,6 +28,46 @@ export const FEATURE_FLAGS = {
28
28
  undo: { default: false, description: "Per-session file undo (/undo)" },
29
29
  /** Shell snapshot: capture full stdout/stderr of commands. */
30
30
  shell_snapshot: { default: false, description: "Capture full command stdout/stderr snapshots" },
31
+ /**
32
+ * Run a session on an EXTERNAL Agent Runtime (Codex / Claude Code) instead of
33
+ * the native Engine.
34
+ *
35
+ * Default ON, which reverses the original §20 decision. The reasoning behind
36
+ * "off" was that the native path must not depend on an external binary — that
37
+ * still holds, and is now enforced by a better mechanism than a flag: the
38
+ * picker only lists a runtime whose binary is actually installed
39
+ * (external-runtime-availability.ts), and every non-prefixed model key still
40
+ * routes to the native Engine. A machine without `codex` sees exactly what it
41
+ * saw before.
42
+ *
43
+ * What the flag actually did in practice was hide the feature from everyone,
44
+ * including the people who installed Codex on purpose: the entries never
45
+ * appeared, with no hint that a setting was responsible. An opt-in nobody can
46
+ * discover is indistinguishable from a missing feature.
47
+ *
48
+ * Turning it off remains the escape hatch — it hides the entries outright.
49
+ */
50
+ external_agent_runtime: {
51
+ default: true,
52
+ description: "Allow a session to run on Codex or Claude Code instead of the native engine",
53
+ },
54
+ /**
55
+ * Expose CodeShell Host Tools to an external runtime. Separate from the flag
56
+ * above so the runtime can be trialled with NO tool surface at all — §20 asks
57
+ * for exactly that split, because the tool bridge is the part that carries the
58
+ * security burden.
59
+ *
60
+ * Also default ON now, for a blunt reason: with it off the runtime has an
61
+ * EMPTY tool surface — no skills, no memory, no file access — which is not a
62
+ * usable Agent Runtime, so shipping that as the default just means the
63
+ * feature appears broken. Every exposed tool still executes through
64
+ * ToolExecutor, so the user's permission rules and the approval dialog apply
65
+ * exactly as they do on the native path.
66
+ */
67
+ external_host_tools: {
68
+ default: true,
69
+ description: "Expose allowlisted CodeShell tools to an external Agent Runtime",
70
+ },
31
71
  };
32
72
  /** All known flag names, for iteration (e.g. the /features listing). */
33
73
  export function featureFlagNames() {
@@ -71,6 +71,15 @@ export declare class SettingsManager {
71
71
  * host (desktop) passes the real trust decision from its trust-store.
72
72
  */
73
73
  private readonly projectTrusted;
74
+ /**
75
+ * Override the user-level config directory (the `~/.code-shell` layer:
76
+ * settings.managed.json / settings.json live directly inside it). When
77
+ * absent the manager keeps today's behavior — `join(userHome(),
78
+ * ".code-shell")` resolved per call so `$HOME` overrides still work.
79
+ * Injection point for identity-scoped server deployments (a per-user
80
+ * worker passes `<dataRoot>` here instead of relocating `$HOME`).
81
+ */
82
+ private readonly userConfigDirOverride?;
74
83
  private sources;
75
84
  private merged;
76
85
  constructor(cwd?: string, scope?: SettingsScope,
@@ -86,7 +95,18 @@ export declare class SettingsManager {
86
95
  * Defaults to `true` so existing embedders/tests keep their behavior; the
87
96
  * host (desktop) passes the real trust decision from its trust-store.
88
97
  */
89
- projectTrusted?: boolean);
98
+ projectTrusted?: boolean,
99
+ /**
100
+ * Override the user-level config directory (the `~/.code-shell` layer:
101
+ * settings.managed.json / settings.json live directly inside it). When
102
+ * absent the manager keeps today's behavior — `join(userHome(),
103
+ * ".code-shell")` resolved per call so `$HOME` overrides still work.
104
+ * Injection point for identity-scoped server deployments (a per-user
105
+ * worker passes `<dataRoot>` here instead of relocating `$HOME`).
106
+ */
107
+ userConfigDirOverride?: string | undefined);
108
+ /** User-layer config dir: explicit override wins, else `~/.code-shell`. */
109
+ private userConfigDir;
90
110
  /**
91
111
  * Load settings from all sources.
92
112
  */
@@ -143,6 +163,24 @@ export declare class SettingsManager {
143
163
  private projectSettingsPath;
144
164
  private readJsonObject;
145
165
  private atomicWriteJson;
166
+ /**
167
+ * Read-modify-write a settings file under a cross-process lock.
168
+ *
169
+ * Atomic rename alone only prevents a half-written file; it does NOT prevent a
170
+ * lost update. Every writer here used to read its own snapshot outside any
171
+ * lock, so two processes changing DIFFERENT keys still clobbered each other:
172
+ * 48 concurrent writers each setting a distinct key left only 17 keys on disk.
173
+ *
174
+ * Real multi-writer paths, not a theoretical concern: the desktop settings
175
+ * page, the Agent `Config` tool, an automation worker, the TUI and a second
176
+ * desktop instance all write the same files. The desktop settings service
177
+ * already locked correctly; this brings Core's own writers onto the same
178
+ * protocol so they interlock rather than race past one another.
179
+ *
180
+ * `mutate` receives the CURRENT on-disk object (re-read inside the lock) and
181
+ * mutates it in place; returning false skips the write.
182
+ */
183
+ private mutateSettingsFile;
146
184
  private loadJsonFile;
147
185
  private deepMerge;
148
186
  }