@cjhyy/code-shell-core 0.7.1 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (595) hide show
  1. package/README.md +36 -23
  2. package/dist/agent/agent-definition-registry.d.ts +2 -2
  3. package/dist/agent/agent-definition-registry.js +47 -10
  4. package/dist/agent/agent-definition.d.ts +5 -0
  5. package/dist/agent/agent-definition.js +14 -0
  6. package/dist/automation/index.d.ts +7 -4
  7. package/dist/automation/index.js +4 -2
  8. package/dist/automation/runner.js +3 -1
  9. package/dist/automation/scheduler.d.ts +57 -1
  10. package/dist/automation/scheduler.js +123 -23
  11. package/dist/automation/store.d.ts +6 -2
  12. package/dist/automation/store.js +7 -3
  13. package/dist/capabilities/index.d.ts +109 -0
  14. package/dist/capabilities/index.js +80 -0
  15. package/dist/capability-control/disabled-lists.d.ts +2 -1
  16. package/dist/capability-control/disabled-lists.js +3 -5
  17. package/dist/capability-control/overlay.d.ts +14 -1
  18. package/dist/capability-control/overlay.js +40 -0
  19. package/dist/capability-control/service.js +6 -4
  20. package/dist/cli/agent-server-stdio.d.ts +1 -1
  21. package/dist/cli/agent-server-stdio.js +66 -6
  22. package/dist/cli/agent-server-tcp.js +7 -3
  23. package/dist/context/compaction.d.ts +39 -3
  24. package/dist/context/compaction.js +151 -39
  25. package/dist/context/manager.d.ts +17 -1
  26. package/dist/context/manager.js +36 -1
  27. package/dist/credentials/access.d.ts +3 -1
  28. package/dist/credentials/access.js +24 -3
  29. package/dist/credentials/index.d.ts +1 -1
  30. package/dist/credentials/index.js +1 -1
  31. package/dist/credentials/oauth.d.ts +4 -1
  32. package/dist/credentials/oauth.js +14 -0
  33. package/dist/credentials/store.d.ts +15 -1
  34. package/dist/credentials/store.js +17 -4
  35. package/dist/credentials/types.d.ts +24 -0
  36. package/dist/credentials/use-credential-tool.js +15 -1
  37. package/dist/engine/auxiliary-pipeline.d.ts +40 -0
  38. package/dist/engine/auxiliary-pipeline.js +181 -0
  39. package/dist/{settings → engine}/disk-defaults.d.ts +2 -2
  40. package/dist/{settings → engine}/disk-defaults.js +5 -2
  41. package/dist/engine/dynamic-tool-defs.d.ts +4 -0
  42. package/dist/engine/dynamic-tool-defs.js +4 -0
  43. package/dist/engine/engine.d.ts +254 -195
  44. package/dist/engine/engine.js +1812 -2041
  45. package/dist/engine/file-history-hook.d.ts +11 -0
  46. package/dist/engine/file-history-hook.js +31 -0
  47. package/dist/engine/goal-judge-context.d.ts +9 -0
  48. package/dist/engine/goal-judge-context.js +234 -0
  49. package/dist/engine/injected-context-cache.d.ts +6 -0
  50. package/dist/engine/injected-context-cache.js +13 -0
  51. package/dist/engine/input-attachments.d.ts +1 -1
  52. package/dist/engine/model-facade.d.ts +3 -3
  53. package/dist/engine/model-facade.js +15 -14
  54. package/dist/engine/permission-controller.d.ts +55 -0
  55. package/dist/engine/permission-controller.js +148 -0
  56. package/dist/engine/prompt-cache-diagnostics.d.ts +58 -0
  57. package/dist/engine/prompt-cache-diagnostics.js +178 -0
  58. package/dist/engine/run-accounting.d.ts +41 -0
  59. package/dist/engine/run-accounting.js +126 -0
  60. package/dist/engine/run-context.d.ts +44 -0
  61. package/dist/engine/run-context.js +88 -0
  62. package/dist/engine/run-environment.d.ts +30 -0
  63. package/dist/engine/run-environment.js +77 -0
  64. package/dist/engine/run-finalize.d.ts +58 -0
  65. package/dist/engine/run-finalize.js +245 -0
  66. package/dist/engine/run-goal.d.ts +58 -0
  67. package/dist/engine/run-goal.js +188 -0
  68. package/dist/engine/run-image-input.d.ts +1 -1
  69. package/dist/engine/run-image-input.js +5 -3
  70. package/dist/engine/run-session-open.d.ts +41 -0
  71. package/dist/engine/run-session-open.js +186 -0
  72. package/dist/engine/run-setup.d.ts +42 -0
  73. package/dist/engine/run-setup.js +58 -0
  74. package/dist/engine/run-tooling.d.ts +125 -0
  75. package/dist/engine/run-tooling.js +283 -0
  76. package/dist/engine/run-types.d.ts +139 -0
  77. package/dist/engine/run-types.js +12 -0
  78. package/dist/engine/run-workspace.d.ts +50 -0
  79. package/dist/engine/run-workspace.js +114 -0
  80. package/dist/engine/steer-queue.d.ts +1 -1
  81. package/dist/engine/subagent-spawner.d.ts +32 -0
  82. package/dist/engine/subagent-spawner.js +287 -0
  83. package/dist/engine/tool-summary.d.ts +2 -2
  84. package/dist/engine/tool-summary.js +2 -2
  85. package/dist/engine/turn-loop.d.ts +49 -10
  86. package/dist/engine/turn-loop.js +370 -104
  87. package/dist/engine/types.d.ts +30 -3
  88. package/dist/engine/types.js +1 -1
  89. package/dist/{engine/goal.d.ts → goal/lifecycle.d.ts} +76 -4
  90. package/dist/goal/lifecycle.js +482 -0
  91. package/dist/hooks/events.d.ts +24 -10
  92. package/dist/hooks/goal-stop-hook.d.ts +17 -28
  93. package/dist/hooks/goal-stop-hook.js +110 -465
  94. package/dist/hooks/registry.js +1 -1
  95. package/dist/index.d.ts +48 -108
  96. package/dist/index.extension.d.ts +51 -0
  97. package/dist/index.extension.js +39 -0
  98. package/dist/index.internal.d.ts +86 -0
  99. package/dist/index.internal.js +92 -0
  100. package/dist/index.js +34 -123
  101. package/dist/links/cli.d.ts +48 -0
  102. package/dist/links/cli.js +617 -0
  103. package/dist/links/http.d.ts +40 -0
  104. package/dist/links/http.js +166 -0
  105. package/dist/links/index.d.ts +4 -0
  106. package/dist/links/index.js +3 -0
  107. package/dist/links/link-action-tool.d.ts +5 -0
  108. package/dist/links/link-action-tool.js +241 -0
  109. package/dist/links/providers.d.ts +8 -0
  110. package/dist/links/providers.js +665 -0
  111. package/dist/links/types.d.ts +44 -0
  112. package/dist/llm/client-base.d.ts +7 -0
  113. package/dist/llm/client-base.js +60 -0
  114. package/dist/llm/model-pool.d.ts +1 -1
  115. package/dist/llm/model-pool.js +1 -1
  116. package/dist/llm/providers/anthropic.d.ts +1 -0
  117. package/dist/llm/providers/anthropic.js +9 -0
  118. package/dist/llm/providers/openai.d.ts +1 -0
  119. package/dist/llm/providers/openai.js +17 -0
  120. package/dist/model-catalog/index.js +15 -2
  121. package/dist/model-catalog/resolve.d.ts +13 -1
  122. package/dist/model-catalog/resolve.js +37 -2
  123. package/dist/model-catalog/types.d.ts +74 -48
  124. package/dist/model-catalog/types.js +16 -5
  125. package/dist/model-catalog/upsert.d.ts +3 -1
  126. package/dist/model-catalog/upsert.js +9 -0
  127. package/dist/onboarding.d.ts +0 -1
  128. package/dist/onboarding.js +1 -22
  129. package/dist/panel-apps/bindings.d.ts +24 -0
  130. package/dist/panel-apps/bindings.js +69 -0
  131. package/dist/panel-apps/github-archive.d.ts +21 -0
  132. package/dist/panel-apps/github-archive.js +98 -0
  133. package/dist/panel-apps/index.d.ts +4 -0
  134. package/dist/panel-apps/index.js +4 -0
  135. package/dist/panel-apps/installer.d.ts +68 -0
  136. package/dist/panel-apps/installer.js +622 -0
  137. package/dist/panel-apps/manifest.d.ts +364 -0
  138. package/dist/panel-apps/manifest.js +189 -0
  139. package/dist/panel-apps/paths.d.ts +13 -0
  140. package/dist/panel-apps/paths.js +38 -0
  141. package/dist/panel-apps/registry.d.ts +51 -0
  142. package/dist/panel-apps/registry.js +99 -0
  143. package/dist/panel-apps/runtime.d.ts +80 -0
  144. package/dist/panel-apps/runtime.js +154 -0
  145. package/dist/plugins/gitOps.js +8 -1
  146. package/dist/plugins/installedPlugins.d.ts +2 -1
  147. package/dist/plugins/installedPlugins.js +146 -8
  148. package/dist/plugins/installer/codex/convertAgents.d.ts +4 -1
  149. package/dist/plugins/installer/codex/convertAgents.js +62 -8
  150. package/dist/plugins/installer/codex/convertCommands.d.ts +5 -5
  151. package/dist/plugins/installer/codex/convertCommands.js +35 -12
  152. package/dist/plugins/installer/codex/convertHooks.d.ts +10 -0
  153. package/dist/plugins/installer/codex/convertHooks.js +82 -0
  154. package/dist/plugins/installer/codex/convertSkills.js +41 -6
  155. package/dist/plugins/installer/install.d.ts +7 -1
  156. package/dist/plugins/installer/install.js +21 -87
  157. package/dist/plugins/installer/installFromArchive.d.ts +26 -4
  158. package/dist/plugins/installer/installFromArchive.js +44 -27
  159. package/dist/plugins/installer/installFromNpm.d.ts +31 -0
  160. package/dist/plugins/installer/installFromNpm.js +273 -0
  161. package/dist/plugins/installer/loadPluginAgents.js +17 -4
  162. package/dist/plugins/installer/loadPluginMcp.d.ts +14 -0
  163. package/dist/plugins/installer/loadPluginMcp.js +245 -35
  164. package/dist/plugins/installer/normalizeManifest.d.ts +13 -0
  165. package/dist/plugins/installer/normalizeManifest.js +306 -0
  166. package/dist/plugins/installer/npmTar.d.ts +13 -0
  167. package/dist/plugins/installer/npmTar.js +321 -0
  168. package/dist/plugins/installer/parseSource.d.ts +11 -0
  169. package/dist/plugins/installer/parseSource.js +48 -0
  170. package/dist/plugins/installer/preview.d.ts +101 -0
  171. package/dist/plugins/installer/preview.js +336 -0
  172. package/dist/plugins/installer/projectPluginSource.d.ts +14 -0
  173. package/dist/plugins/installer/projectPluginSource.js +140 -0
  174. package/dist/plugins/installer/types.d.ts +775 -0
  175. package/dist/plugins/installer/types.js +100 -0
  176. package/dist/plugins/installer/unzip.d.ts +11 -0
  177. package/dist/plugins/installer/unzip.js +123 -9
  178. package/dist/plugins/installer/update.d.ts +2 -2
  179. package/dist/plugins/installer/update.js +43 -4
  180. package/dist/plugins/loadPluginHooks.d.ts +19 -2
  181. package/dist/plugins/loadPluginHooks.js +97 -86
  182. package/dist/plugins/pluginAutomationTemplates.d.ts +18 -0
  183. package/dist/plugins/pluginAutomationTemplates.js +50 -0
  184. package/dist/plugins/pluginCatalog.d.ts +45 -0
  185. package/dist/plugins/pluginCatalog.js +87 -0
  186. package/dist/plugins/pluginCommandHook.d.ts +6 -0
  187. package/dist/plugins/pluginCommandHook.js +25 -8
  188. package/dist/plugins/pluginCommandsLoader.d.ts +19 -0
  189. package/dist/plugins/pluginCommandsLoader.js +181 -7
  190. package/dist/plugins/pluginContent.d.ts +10 -1
  191. package/dist/plugins/pluginContent.js +87 -30
  192. package/dist/plugins/pluginHookApproval.d.ts +30 -0
  193. package/dist/plugins/pluginHookApproval.js +160 -0
  194. package/dist/plugins/pluginHookIntegrity.d.ts +69 -0
  195. package/dist/plugins/pluginHookIntegrity.js +361 -0
  196. package/dist/plugins/pluginInstaller.js +71 -12
  197. package/dist/plugins/pluginMcpApproval.d.ts +19 -0
  198. package/dist/plugins/pluginMcpApproval.js +110 -0
  199. package/dist/plugins/pluginMcpIntegrity.d.ts +21 -0
  200. package/dist/plugins/pluginMcpIntegrity.js +74 -0
  201. package/dist/plugins/types.d.ts +30 -0
  202. package/dist/plugins/varRewrite.d.ts +9 -5
  203. package/dist/plugins/varRewrite.js +26 -17
  204. package/dist/preset/index.d.ts +11 -8
  205. package/dist/preset/index.js +62 -203
  206. package/dist/product/define.js +9 -3
  207. package/dist/product/types.d.ts +0 -2
  208. package/dist/profile/activation.d.ts +36 -0
  209. package/dist/profile/activation.js +57 -0
  210. package/dist/profile/catalog-store.d.ts +77 -0
  211. package/dist/profile/catalog-store.js +346 -0
  212. package/dist/profile/catalog.d.ts +54 -0
  213. package/dist/profile/catalog.js +152 -0
  214. package/dist/profile/index.d.ts +7 -0
  215. package/dist/profile/index.js +7 -0
  216. package/dist/profile/requirements.d.ts +76 -0
  217. package/dist/profile/requirements.js +117 -0
  218. package/dist/profile/resolve.d.ts +11 -0
  219. package/dist/profile/resolve.js +41 -0
  220. package/dist/profile/store.d.ts +17 -0
  221. package/dist/profile/store.js +167 -0
  222. package/dist/profile/types.d.ts +321 -0
  223. package/dist/profile/types.js +104 -0
  224. package/dist/prompt/composer.d.ts +46 -7
  225. package/dist/prompt/composer.js +78 -48
  226. package/dist/prompt/instruction-scanner.d.ts +6 -5
  227. package/dist/prompt/instruction-scanner.js +8 -23
  228. package/dist/prompt/section-loader.d.ts +2 -2
  229. package/dist/prompt/section-loader.js +7 -4
  230. package/dist/prompt/sections/browser.md +10 -9
  231. package/dist/prompt/sections/harness-base.md +9 -0
  232. package/dist/protocol/chat-session-manager.d.ts +64 -1
  233. package/dist/protocol/chat-session-manager.js +104 -0
  234. package/dist/protocol/chat-session.d.ts +61 -10
  235. package/dist/protocol/chat-session.js +135 -25
  236. package/dist/protocol/client.d.ts +33 -3
  237. package/dist/protocol/client.js +96 -5
  238. package/dist/protocol/index.d.ts +2 -2
  239. package/dist/protocol/index.js +2 -2
  240. package/dist/protocol/mobile-remote-types.d.ts +406 -0
  241. package/dist/protocol/mobile-remote-types.js +1 -0
  242. package/dist/protocol/server.d.ts +127 -3
  243. package/dist/protocol/server.js +1309 -182
  244. package/dist/protocol/types.d.ts +152 -34
  245. package/dist/protocol/types.js +16 -0
  246. package/dist/run/ArtifactTracker.d.ts +6 -1
  247. package/dist/run/ArtifactTracker.js +29 -21
  248. package/dist/run/EngineRunner.d.ts +2 -0
  249. package/dist/run/EngineRunner.js +1 -0
  250. package/dist/run/RunManager.d.ts +26 -0
  251. package/dist/run/RunManager.js +82 -11
  252. package/dist/run/factory.d.ts +3 -0
  253. package/dist/run/factory.js +2 -0
  254. package/dist/runtime/safe-spawn.d.ts +6 -0
  255. package/dist/runtime/safe-spawn.js +8 -13
  256. package/dist/services/auto-dream.d.ts +13 -1
  257. package/dist/services/auto-dream.js +56 -8
  258. package/dist/services/dream-consolidation.js +10 -1
  259. package/dist/services/memory-orchestrator.js +6 -2
  260. package/dist/services/oauth.js +4 -1
  261. package/dist/services/session-memory.d.ts +4 -4
  262. package/dist/services/session-memory.js +13 -10
  263. package/dist/session/memory.d.ts +26 -7
  264. package/dist/session/memory.js +79 -21
  265. package/dist/session/session-manager.d.ts +182 -28
  266. package/dist/session/session-manager.js +910 -130
  267. package/dist/session/session-message.d.ts +22 -0
  268. package/dist/session/session-message.js +1 -0
  269. package/dist/session/transcript.d.ts +46 -5
  270. package/dist/session/transcript.js +159 -3
  271. package/dist/settings/feature-flags.d.ts +40 -0
  272. package/dist/settings/feature-flags.js +40 -0
  273. package/dist/settings/manager.d.ts +39 -1
  274. package/dist/settings/manager.js +102 -41
  275. package/dist/settings/migrate-config.js +4 -2
  276. package/dist/settings/schema.d.ts +511 -177
  277. package/dist/settings/schema.js +98 -25
  278. package/dist/skills/scanner.d.ts +6 -2
  279. package/dist/skills/scanner.js +160 -9
  280. package/dist/sources/adapter.d.ts +14 -0
  281. package/dist/sources/adapter.js +7 -0
  282. package/dist/sources/adapters/local-files.d.ts +10 -0
  283. package/dist/sources/adapters/local-files.js +127 -0
  284. package/dist/sources/adapters/mcp-resource.d.ts +17 -0
  285. package/dist/sources/adapters/mcp-resource.js +41 -0
  286. package/dist/sources/adapters/mock.d.ts +3 -0
  287. package/dist/sources/adapters/mock.js +29 -0
  288. package/dist/sources/binding.d.ts +6 -0
  289. package/dist/sources/binding.js +24 -0
  290. package/dist/sources/catalog.d.ts +6 -0
  291. package/dist/sources/catalog.js +64 -0
  292. package/dist/sources/context-summary.d.ts +8 -0
  293. package/dist/sources/context-summary.js +13 -0
  294. package/dist/sources/credential-status.d.ts +2 -0
  295. package/dist/sources/credential-status.js +13 -0
  296. package/dist/sources/index.d.ts +10 -0
  297. package/dist/sources/index.js +10 -0
  298. package/dist/sources/resolve.d.ts +28 -0
  299. package/dist/sources/resolve.js +47 -0
  300. package/dist/sources/truncate-utf8.d.ts +7 -0
  301. package/dist/sources/truncate-utf8.js +18 -0
  302. package/dist/sources/types.d.ts +71 -0
  303. package/dist/sources/types.js +26 -0
  304. package/dist/testing/fetch-stub.d.ts +32 -0
  305. package/dist/testing/fetch-stub.js +24 -0
  306. package/dist/themes/image.d.ts +18 -0
  307. package/dist/themes/image.js +117 -0
  308. package/dist/themes/index.d.ts +4 -0
  309. package/dist/themes/index.js +4 -0
  310. package/dist/themes/installer.d.ts +50 -0
  311. package/dist/themes/installer.js +290 -0
  312. package/dist/themes/manifest.d.ts +102 -0
  313. package/dist/themes/manifest.js +86 -0
  314. package/dist/themes/paths.d.ts +14 -0
  315. package/dist/themes/paths.js +33 -0
  316. package/dist/tool-system/browser-bridge.d.ts +53 -11
  317. package/dist/tool-system/browser-bridge.js +8 -9
  318. package/dist/tool-system/builtin/agent-heartbeat.d.ts +2 -2
  319. package/dist/tool-system/builtin/agent-heartbeat.js +20 -6
  320. package/dist/tool-system/builtin/agent-notifications.d.ts +127 -72
  321. package/dist/tool-system/builtin/agent-notifications.js +291 -101
  322. package/dist/tool-system/builtin/agent-output-file.js +1 -3
  323. package/dist/tool-system/builtin/agent-progress.d.ts +6 -0
  324. package/dist/tool-system/builtin/agent-progress.js +83 -0
  325. package/dist/tool-system/builtin/agent-registry.d.ts +38 -2
  326. package/dist/tool-system/builtin/agent-registry.js +178 -9
  327. package/dist/tool-system/builtin/agent-transcript-translator.js +1 -1
  328. package/dist/tool-system/builtin/agent.d.ts +2 -0
  329. package/dist/tool-system/builtin/agent.js +274 -33
  330. package/dist/tool-system/builtin/background-jobs.d.ts +55 -2
  331. package/dist/tool-system/builtin/background-jobs.js +96 -4
  332. package/dist/tool-system/builtin/background-work.d.ts +6 -0
  333. package/dist/tool-system/builtin/background-work.js +8 -1
  334. package/dist/tool-system/builtin/bash.js +5 -2
  335. package/dist/tool-system/builtin/browser-tools.d.ts +6 -3
  336. package/dist/tool-system/builtin/browser-tools.js +89 -23
  337. package/dist/tool-system/builtin/edit-model-catalog.d.ts +6 -0
  338. package/dist/tool-system/builtin/edit-model-catalog.js +172 -12
  339. package/dist/tool-system/builtin/edit.js +2 -6
  340. package/dist/tool-system/builtin/file-cache.d.ts +2 -0
  341. package/dist/tool-system/builtin/file-cache.js +4 -0
  342. package/dist/tool-system/builtin/generate-image.js +17 -10
  343. package/dist/tool-system/builtin/generate-video.js +26 -7
  344. package/dist/tool-system/builtin/grep.js +2 -2
  345. package/dist/tool-system/builtin/image-uploader.js +7 -1
  346. package/dist/tool-system/builtin/index.d.ts +32 -7
  347. package/dist/tool-system/builtin/index.js +237 -167
  348. package/dist/tool-system/builtin/memory.d.ts +6 -0
  349. package/dist/tool-system/builtin/memory.js +36 -15
  350. package/dist/tool-system/builtin/panel.d.ts +9 -0
  351. package/dist/tool-system/builtin/panel.js +314 -0
  352. package/dist/tool-system/builtin/read.js +5 -1
  353. package/dist/tool-system/builtin/send-message-to-session.d.ts +6 -0
  354. package/dist/tool-system/builtin/send-message-to-session.js +67 -0
  355. package/dist/tool-system/builtin/sources.d.ts +8 -0
  356. package/dist/tool-system/builtin/sources.js +137 -0
  357. package/dist/tool-system/builtin/tool-search.js +7 -2
  358. package/dist/tool-system/builtin/update-automation-memory.js +2 -0
  359. package/dist/tool-system/builtin/web-fetch.js +17 -13
  360. package/dist/tool-system/builtin/web-search.js +1 -3
  361. package/dist/tool-system/capability-module.d.ts +93 -0
  362. package/dist/tool-system/capability-module.js +53 -0
  363. package/dist/tool-system/context.d.ts +77 -19
  364. package/dist/tool-system/executor.js +75 -50
  365. package/dist/tool-system/external-tool-exposure.d.ts +60 -0
  366. package/dist/tool-system/external-tool-exposure.js +304 -0
  367. package/dist/tool-system/mcp-manager.d.ts +11 -1
  368. package/dist/tool-system/mcp-manager.js +19 -4
  369. package/dist/tool-system/mcp-tool-policy.d.ts +9 -0
  370. package/dist/tool-system/mcp-tool-policy.js +34 -0
  371. package/dist/tool-system/panel-bridge.d.ts +53 -0
  372. package/dist/tool-system/panel-bridge.js +1 -0
  373. package/dist/tool-system/path-policy.js +99 -2
  374. package/dist/tool-system/permission.d.ts +26 -0
  375. package/dist/tool-system/permission.js +46 -0
  376. package/dist/tool-system/registry.d.ts +12 -1
  377. package/dist/tool-system/registry.js +31 -7
  378. package/dist/tool-system/sandbox/index.js +3 -8
  379. package/dist/tool-system/sandbox/seatbelt.js +2 -6
  380. package/dist/tool-system/session-tool-host.d.ts +139 -0
  381. package/dist/tool-system/session-tool-host.js +167 -0
  382. package/dist/tool-system/testing/tool-registry-harness.d.ts +31 -0
  383. package/dist/tool-system/testing/tool-registry-harness.js +51 -0
  384. package/dist/tool-system/validation.d.ts +14 -7
  385. package/dist/tool-system/validation.js +701 -7
  386. package/dist/types.d.ts +186 -20
  387. package/dist/{cc-orchestrator → utils}/cwd-normalize.d.ts +1 -0
  388. package/dist/{cc-orchestrator → utils}/cwd-normalize.js +1 -0
  389. package/dist/utils/file-mutex.d.ts +65 -0
  390. package/dist/utils/file-mutex.js +145 -0
  391. package/dist/utils/json.d.ts +2 -4
  392. package/dist/utils/json.js +2 -4
  393. package/dist/utils/lockfile.d.ts +30 -1
  394. package/dist/utils/lockfile.js +2 -2
  395. package/dist/utils/secret-scrubber.d.ts +8 -0
  396. package/dist/utils/secret-scrubber.js +227 -0
  397. package/dist/utils/toolDisplay.js +1 -1
  398. package/package.json +20 -5
  399. package/THIRD_PARTY_NOTICES.md +0 -206
  400. package/dist/arena/arena.d.ts +0 -45
  401. package/dist/arena/arena.js +0 -362
  402. package/dist/arena/context/context-tools.d.ts +0 -16
  403. package/dist/arena/context/context-tools.js +0 -272
  404. package/dist/arena/context/within-root.d.ts +0 -7
  405. package/dist/arena/context/within-root.js +0 -15
  406. package/dist/arena/detect-mode.d.ts +0 -20
  407. package/dist/arena/detect-mode.js +0 -78
  408. package/dist/arena/digest-builder.d.ts +0 -25
  409. package/dist/arena/digest-builder.js +0 -120
  410. package/dist/arena/index.d.ts +0 -29
  411. package/dist/arena/index.js +0 -29
  412. package/dist/arena/iterate/convergence.d.ts +0 -25
  413. package/dist/arena/iterate/convergence.js +0 -103
  414. package/dist/arena/iterate/formats/index.d.ts +0 -22
  415. package/dist/arena/iterate/formats/index.js +0 -283
  416. package/dist/arena/iterate/index.d.ts +0 -11
  417. package/dist/arena/iterate/index.js +0 -9
  418. package/dist/arena/iterate/iterative-arena.d.ts +0 -23
  419. package/dist/arena/iterate/iterative-arena.js +0 -237
  420. package/dist/arena/iterate/parse.d.ts +0 -42
  421. package/dist/arena/iterate/parse.js +0 -123
  422. package/dist/arena/iterate/phases/argue.d.ts +0 -22
  423. package/dist/arena/iterate/phases/argue.js +0 -165
  424. package/dist/arena/iterate/phases/revise.d.ts +0 -16
  425. package/dist/arena/iterate/phases/revise.js +0 -62
  426. package/dist/arena/iterate/phases/tournament.d.ts +0 -34
  427. package/dist/arena/iterate/phases/tournament.js +0 -113
  428. package/dist/arena/iterate/tools/web-tools.d.ts +0 -13
  429. package/dist/arena/iterate/tools/web-tools.js +0 -54
  430. package/dist/arena/iterate/types.d.ts +0 -152
  431. package/dist/arena/iterate/types.js +0 -8
  432. package/dist/arena/ledger.d.ts +0 -47
  433. package/dist/arena/ledger.js +0 -159
  434. package/dist/arena/lenses/architecture.d.ts +0 -5
  435. package/dist/arena/lenses/architecture.js +0 -22
  436. package/dist/arena/lenses/engineering.d.ts +0 -5
  437. package/dist/arena/lenses/engineering.js +0 -22
  438. package/dist/arena/lenses/general.d.ts +0 -5
  439. package/dist/arena/lenses/general.js +0 -20
  440. package/dist/arena/lenses/index.d.ts +0 -16
  441. package/dist/arena/lenses/index.js +0 -47
  442. package/dist/arena/lenses/product.d.ts +0 -5
  443. package/dist/arena/lenses/product.js +0 -22
  444. package/dist/arena/model-presets.d.ts +0 -23
  445. package/dist/arena/model-presets.js +0 -44
  446. package/dist/arena/phases/adjudication.d.ts +0 -25
  447. package/dist/arena/phases/adjudication.js +0 -142
  448. package/dist/arena/phases/build-consensus.d.ts +0 -30
  449. package/dist/arena/phases/build-consensus.js +0 -85
  450. package/dist/arena/phases/claim-registry.d.ts +0 -26
  451. package/dist/arena/phases/claim-registry.js +0 -60
  452. package/dist/arena/phases/cross-review.d.ts +0 -47
  453. package/dist/arena/phases/cross-review.js +0 -224
  454. package/dist/arena/phases/debate-rounds.d.ts +0 -28
  455. package/dist/arena/phases/debate-rounds.js +0 -161
  456. package/dist/arena/phases/participant-research.d.ts +0 -39
  457. package/dist/arena/phases/participant-research.js +0 -316
  458. package/dist/arena/phases/planning-detail-expansion.d.ts +0 -39
  459. package/dist/arena/phases/planning-detail-expansion.js +0 -120
  460. package/dist/arena/planner.d.ts +0 -28
  461. package/dist/arena/planner.js +0 -312
  462. package/dist/arena/providers/docs.d.ts +0 -7
  463. package/dist/arena/providers/docs.js +0 -111
  464. package/dist/arena/providers/git.d.ts +0 -8
  465. package/dist/arena/providers/git.js +0 -174
  466. package/dist/arena/providers/index.d.ts +0 -32
  467. package/dist/arena/providers/index.js +0 -132
  468. package/dist/arena/providers/none.d.ts +0 -7
  469. package/dist/arena/providers/none.js +0 -11
  470. package/dist/arena/providers/repo.d.ts +0 -7
  471. package/dist/arena/providers/repo.js +0 -258
  472. package/dist/arena/render/session.d.ts +0 -17
  473. package/dist/arena/render/session.js +0 -190
  474. package/dist/arena/render/terminal.d.ts +0 -34
  475. package/dist/arena/render/terminal.js +0 -286
  476. package/dist/arena/strategies/discussion.d.ts +0 -25
  477. package/dist/arena/strategies/discussion.js +0 -143
  478. package/dist/arena/strategies/index.d.ts +0 -15
  479. package/dist/arena/strategies/index.js +0 -28
  480. package/dist/arena/strategies/language-wrapper.d.ts +0 -17
  481. package/dist/arena/strategies/language-wrapper.js +0 -102
  482. package/dist/arena/strategies/lens-wrapper.d.ts +0 -16
  483. package/dist/arena/strategies/lens-wrapper.js +0 -236
  484. package/dist/arena/strategies/planning.d.ts +0 -30
  485. package/dist/arena/strategies/planning.js +0 -225
  486. package/dist/arena/strategies/review.d.ts +0 -26
  487. package/dist/arena/strategies/review.js +0 -168
  488. package/dist/arena/strategies/utils.d.ts +0 -36
  489. package/dist/arena/strategies/utils.js +0 -603
  490. package/dist/arena/tools/selector.d.ts +0 -17
  491. package/dist/arena/tools/selector.js +0 -61
  492. package/dist/arena/transitions.d.ts +0 -53
  493. package/dist/arena/transitions.js +0 -97
  494. package/dist/arena/types.d.ts +0 -518
  495. package/dist/arena/types.js +0 -27
  496. package/dist/cc-orchestrator/agent-adapter.d.ts +0 -54
  497. package/dist/cc-orchestrator/agent-adapter.js +0 -143
  498. package/dist/cc-orchestrator/cc-capability.d.ts +0 -19
  499. package/dist/cc-orchestrator/cc-capability.js +0 -53
  500. package/dist/cc-orchestrator/codex-session-discovery.d.ts +0 -24
  501. package/dist/cc-orchestrator/codex-session-discovery.js +0 -191
  502. package/dist/cc-orchestrator/codex-session-history.d.ts +0 -38
  503. package/dist/cc-orchestrator/codex-session-history.js +0 -247
  504. package/dist/cc-orchestrator/external-agent-bindings.d.ts +0 -27
  505. package/dist/cc-orchestrator/external-agent-bindings.js +0 -150
  506. package/dist/cc-orchestrator/external-agent-changes.d.ts +0 -19
  507. package/dist/cc-orchestrator/external-agent-changes.js +0 -231
  508. package/dist/cc-orchestrator/external-agent-driver.d.ts +0 -19
  509. package/dist/cc-orchestrator/external-agent-driver.js +0 -284
  510. package/dist/cc-orchestrator/external-agent-session-store.d.ts +0 -23
  511. package/dist/cc-orchestrator/external-agent-session-store.js +0 -146
  512. package/dist/cc-orchestrator/index.d.ts +0 -8
  513. package/dist/cc-orchestrator/index.js +0 -8
  514. package/dist/cc-orchestrator/relevance-judge.d.ts +0 -15
  515. package/dist/cc-orchestrator/relevance-judge.js +0 -29
  516. package/dist/cc-orchestrator/session-discovery.d.ts +0 -46
  517. package/dist/cc-orchestrator/session-discovery.js +0 -125
  518. package/dist/cc-orchestrator/session-history.d.ts +0 -54
  519. package/dist/cc-orchestrator/session-history.js +0 -150
  520. package/dist/cron/cron-runtime.d.ts +0 -2
  521. package/dist/cron/cron-runtime.js +0 -2
  522. package/dist/cron/cron-store.d.ts +0 -2
  523. package/dist/cron/cron-store.js +0 -2
  524. package/dist/cron/scheduler.d.ts +0 -7
  525. package/dist/cron/scheduler.js +0 -7
  526. package/dist/engine/goal.js +0 -206
  527. package/dist/external-agents/config.d.ts +0 -2
  528. package/dist/external-agents/config.js +0 -15
  529. package/dist/external-agents/types.d.ts +0 -31
  530. package/dist/git/parse-log.d.ts +0 -13
  531. package/dist/git/parse-log.js +0 -21
  532. package/dist/git/utils.d.ts +0 -49
  533. package/dist/git/utils.js +0 -161
  534. package/dist/git/worktree/crud.d.ts +0 -72
  535. package/dist/git/worktree/crud.js +0 -235
  536. package/dist/git/worktree/diff.d.ts +0 -14
  537. package/dist/git/worktree/diff.js +0 -82
  538. package/dist/git/worktree/git-exec.d.ts +0 -7
  539. package/dist/git/worktree/git-exec.js +0 -87
  540. package/dist/git/worktree/index.d.ts +0 -5
  541. package/dist/git/worktree/index.js +0 -5
  542. package/dist/git/worktree/query.d.ts +0 -43
  543. package/dist/git/worktree/query.js +0 -128
  544. package/dist/git/worktree/slug.d.ts +0 -11
  545. package/dist/git/worktree/slug.js +0 -58
  546. package/dist/git/worktree.d.ts +0 -1
  547. package/dist/git/worktree.js +0 -5
  548. package/dist/lsp/client.d.ts +0 -41
  549. package/dist/lsp/client.js +0 -186
  550. package/dist/lsp/manager.d.ts +0 -40
  551. package/dist/lsp/manager.js +0 -155
  552. package/dist/lsp/root-path.d.ts +0 -9
  553. package/dist/lsp/root-path.js +0 -12
  554. package/dist/lsp/servers.d.ts +0 -16
  555. package/dist/lsp/servers.js +0 -60
  556. package/dist/prompt/sections/coding.md +0 -35
  557. package/dist/quota/credentials.d.ts +0 -3
  558. package/dist/quota/credentials.js +0 -80
  559. package/dist/quota/index.d.ts +0 -36
  560. package/dist/quota/index.js +0 -155
  561. package/dist/quota/types.d.ts +0 -48
  562. package/dist/quota/types.js +0 -13
  563. package/dist/review/review-prompt.d.ts +0 -28
  564. package/dist/review/review-prompt.js +0 -81
  565. package/dist/state.d.ts +0 -160
  566. package/dist/state.js +0 -267
  567. package/dist/tool-system/builtin/apply-patch/applier.d.ts +0 -26
  568. package/dist/tool-system/builtin/apply-patch/applier.js +0 -308
  569. package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +0 -10
  570. package/dist/tool-system/builtin/apply-patch/backup-targets.js +0 -30
  571. package/dist/tool-system/builtin/apply-patch/index.d.ts +0 -20
  572. package/dist/tool-system/builtin/apply-patch/index.js +0 -105
  573. package/dist/tool-system/builtin/apply-patch/parser.d.ts +0 -17
  574. package/dist/tool-system/builtin/apply-patch/parser.js +0 -212
  575. package/dist/tool-system/builtin/apply-patch/seek-sequence.d.ts +0 -18
  576. package/dist/tool-system/builtin/apply-patch/seek-sequence.js +0 -123
  577. package/dist/tool-system/builtin/apply-patch/types.d.ts +0 -49
  578. package/dist/tool-system/builtin/apply-patch/types.js +0 -13
  579. package/dist/tool-system/builtin/arena.d.ts +0 -31
  580. package/dist/tool-system/builtin/arena.js +0 -416
  581. package/dist/tool-system/builtin/brief.d.ts +0 -6
  582. package/dist/tool-system/builtin/brief.js +0 -41
  583. package/dist/tool-system/builtin/check-quota.d.ts +0 -15
  584. package/dist/tool-system/builtin/check-quota.js +0 -34
  585. package/dist/tool-system/builtin/drive-claude-code.d.ts +0 -51
  586. package/dist/tool-system/builtin/drive-claude-code.js +0 -698
  587. package/dist/tool-system/builtin/lsp.d.ts +0 -7
  588. package/dist/tool-system/builtin/lsp.js +0 -144
  589. package/dist/tool-system/builtin/notebook-edit.d.ts +0 -7
  590. package/dist/tool-system/builtin/notebook-edit.js +0 -127
  591. package/dist/tool-system/builtin/worktree.d.ts +0 -11
  592. package/dist/tool-system/builtin/worktree.js +0 -363
  593. /package/dist/{external-agents → links}/types.js +0 -0
  594. /package/dist/{engine/session-usage.d.ts → session/usage.d.ts} +0 -0
  595. /package/dist/{engine/session-usage.js → session/usage.js} +0 -0
@@ -0,0 +1,11 @@
1
+ import type { HookRegistry } from "../hooks/registry.js";
2
+ import type { RunScopedDisposer } from "./run-types.js";
3
+ import type { CapabilityFileHistoryContribution } from "../capabilities/index.js";
4
+ export interface RegisterFileHistoryHookOptions {
5
+ hooks: Pick<HookRegistry, "register" | "unregister">;
6
+ sessionDir: string;
7
+ cwd: string;
8
+ getTurnSeq: () => number | undefined;
9
+ contributions?: readonly CapabilityFileHistoryContribution[];
10
+ }
11
+ export declare function registerFileHistoryHook(options: RegisterFileHistoryHookOptions): RunScopedDisposer;
@@ -0,0 +1,31 @@
1
+ import { FileHistory } from "../session/file-history.js";
2
+ export function registerFileHistoryHook(options) {
3
+ const history = FileHistory.loadFromDir(options.sessionDir);
4
+ const handler = async (context) => {
5
+ const toolName = context.data?.toolName;
6
+ const args = context.data?.args;
7
+ const turnSeq = options.getTurnSeq();
8
+ if ((toolName === "Write" || toolName === "Edit") && typeof args?.file_path === "string") {
9
+ if (history.saveSnapshot(args.file_path, turnSeq) === null && turnSeq !== undefined) {
10
+ history.recordCreated(args.file_path, turnSeq);
11
+ }
12
+ }
13
+ else if (args) {
14
+ const contribution = options.contributions?.find((item) => item.toolName === toolName);
15
+ for (const target of contribution?.resolveTargets(args, options.cwd) ?? []) {
16
+ history.saveSnapshot(target, turnSeq);
17
+ }
18
+ }
19
+ return {};
20
+ };
21
+ options.hooks.register("on_tool_start", handler, 100, "file_history_backup");
22
+ let disposed = false;
23
+ return {
24
+ dispose() {
25
+ if (disposed)
26
+ return;
27
+ disposed = true;
28
+ options.hooks.unregister("on_tool_start", handler);
29
+ },
30
+ };
31
+ }
@@ -0,0 +1,9 @@
1
+ import type { GoalJudgeRuntimeContext } from "../hooks/goal-stop-hook.js";
2
+ import type { Message } from "../types.js";
3
+ export interface BuildGoalJudgeContextOptions {
4
+ maxRounds?: number;
5
+ maxEstimatedTokens?: number;
6
+ maxChars?: number;
7
+ sensitiveToolResultRedactions?: ReadonlyMap<string, string>;
8
+ }
9
+ export declare function buildGoalJudgeRuntimeContext(messages: readonly Message[], options?: BuildGoalJudgeContextOptions): GoalJudgeRuntimeContext;
@@ -0,0 +1,234 @@
1
+ import { createHash } from "node:crypto";
2
+ import { estimateTokens, groupMessagesByApiRound } from "../context/compaction.js";
3
+ import { sanitizeMessages } from "../logging/sanitize-messages.js";
4
+ import { scrubSecrets, scrubSecretValue } from "../utils/secret-scrubber.js";
5
+ const DEFAULT_MAX_ROUNDS = 6;
6
+ const DEFAULT_MAX_ESTIMATED_TOKENS = 3_000;
7
+ const DEFAULT_MAX_CHARS = 12_000;
8
+ function sanitizeNestedBlocks(blocks) {
9
+ return blocks.map((block) => {
10
+ if (block.type === "reasoning") {
11
+ return { type: "reasoning", text: "[reasoning omitted]" };
12
+ }
13
+ if (block.type === "image" && block.source?.type === "base64") {
14
+ return {
15
+ type: "image",
16
+ source: {
17
+ type: "base64",
18
+ media_type: block.source.media_type,
19
+ bytes: block.source.data?.length ?? 0,
20
+ omitted: true,
21
+ },
22
+ };
23
+ }
24
+ if (block.type === "tool_result" && Array.isArray(block.content)) {
25
+ return scrubSecretValue({
26
+ ...block,
27
+ content: sanitizeNestedBlocks(block.content),
28
+ });
29
+ }
30
+ return scrubSecretValue({ ...block });
31
+ });
32
+ }
33
+ function sanitizeConversation(messages, sensitiveToolResultRedactions) {
34
+ return sanitizeMessages(messages, { sensitiveToolResultRedactions }).map((message) => ({
35
+ ...message,
36
+ content: typeof message.content === "string"
37
+ ? scrubSecrets(message.content)
38
+ : sanitizeNestedBlocks(message.content),
39
+ }));
40
+ }
41
+ function stableJson(value) {
42
+ if (Array.isArray(value))
43
+ return `[${value.map(stableJson).join(",")}]`;
44
+ if (value && typeof value === "object") {
45
+ return `{${Object.entries(value)
46
+ .sort(([left], [right]) => left.localeCompare(right))
47
+ .map(([key, entry]) => `${JSON.stringify(key)}:${stableJson(entry)}`)
48
+ .join(",")}}`;
49
+ }
50
+ const serialized = JSON.stringify(value);
51
+ return serialized === undefined ? "null" : serialized;
52
+ }
53
+ function renderBlock(block, role) {
54
+ const roleLabel = role.toUpperCase();
55
+ if (block.type === "text")
56
+ return `${roleLabel}:\n${block.text ?? ""}`;
57
+ if (block.type === "reasoning")
58
+ return `${roleLabel}:\n[reasoning omitted]`;
59
+ if (block.type === "tool_use") {
60
+ return `${roleLabel} TOOL_USE id=${block.id ?? "(missing)"} name=${block.name ?? "(missing)"} input=${stableJson(block.input ?? {})}`;
61
+ }
62
+ if (block.type === "tool_result") {
63
+ const content = Array.isArray(block.content)
64
+ ? block.content.map((entry) => renderBlock(entry, role)).join("\n")
65
+ : (block.content ?? "");
66
+ return `TOOL_RESULT tool_use_id=${block.tool_use_id ?? "(missing)"} error=${block.is_error === true}:\n${content}`;
67
+ }
68
+ if (block.type === "image") {
69
+ const source = block.source;
70
+ return `${roleLabel} IMAGE media_type=${source?.media_type ?? "unknown"} bytes=${source?.bytes ?? 0} omitted=true`;
71
+ }
72
+ return `${roleLabel}:\n[unsupported content omitted]`;
73
+ }
74
+ function renderConversation(rounds) {
75
+ if (rounds.length === 0)
76
+ return "(无最近对话)";
77
+ return rounds
78
+ .map((round, index) => {
79
+ const renderedMessages = round.map((message) => {
80
+ if (typeof message.content === "string") {
81
+ return `${message.role.toUpperCase()}:\n${message.content}`;
82
+ }
83
+ return message.content.map((block) => renderBlock(block, message.role)).join("\n");
84
+ });
85
+ return `[round ${index + 1}]\n${renderedMessages.join("\n")}`;
86
+ })
87
+ .join("\n\n");
88
+ }
89
+ function truncationMarker(originalChars) {
90
+ return `[truncated for goal judge; originalChars=${originalChars}]`;
91
+ }
92
+ function truncateString(value, maxChars) {
93
+ if (value.length <= maxChars)
94
+ return value;
95
+ const marker = truncationMarker(value.length);
96
+ if (maxChars <= marker.length)
97
+ return marker;
98
+ return `${value.slice(0, maxChars - marker.length)}${marker}`;
99
+ }
100
+ function truncateUnknown(value, maxChars) {
101
+ if (typeof value === "string")
102
+ return truncateString(value, maxChars);
103
+ if (Array.isArray(value))
104
+ return value.map((entry) => truncateUnknown(entry, maxChars));
105
+ if (value && typeof value === "object") {
106
+ return Object.fromEntries(Object.entries(value).map(([key, entry]) => [
107
+ key,
108
+ truncateUnknown(entry, maxChars),
109
+ ]));
110
+ }
111
+ return value;
112
+ }
113
+ function truncateBlock(block, maxChars) {
114
+ if (block.type === "text")
115
+ return { ...block, text: truncateString(block.text ?? "", maxChars) };
116
+ if (block.type === "tool_use") {
117
+ return {
118
+ ...block,
119
+ input: truncateUnknown(block.input ?? {}, maxChars),
120
+ };
121
+ }
122
+ if (block.type === "tool_result") {
123
+ return {
124
+ ...block,
125
+ content: Array.isArray(block.content)
126
+ ? block.content.map((entry) => truncateBlock(entry, maxChars))
127
+ : truncateString(block.content ?? "", maxChars),
128
+ };
129
+ }
130
+ return { ...block };
131
+ }
132
+ function emergencyTruncate(round, maxChars, maxTokens) {
133
+ let fieldBudget = Math.max(48, Math.floor(maxChars / 3));
134
+ let candidate = round;
135
+ for (let attempt = 0; attempt < 16; attempt++) {
136
+ candidate = round.map((message) => ({
137
+ ...message,
138
+ content: typeof message.content === "string"
139
+ ? truncateString(message.content, fieldBudget)
140
+ : message.content.map((block) => truncateBlock(block, fieldBudget)),
141
+ }));
142
+ if (renderConversation([candidate]).length <= maxChars &&
143
+ estimateTokens(candidate) <= maxTokens) {
144
+ return candidate;
145
+ }
146
+ fieldBudget = Math.max(0, Math.floor(fieldBudget / 2));
147
+ }
148
+ return candidate;
149
+ }
150
+ function structuralFallback(round, maxChars, maxTokens) {
151
+ const perMessageBudget = Math.max(0, Math.floor(maxChars / Math.max(1, round.length)) - 32);
152
+ const candidate = round.map((message) => {
153
+ if (typeof message.content === "string") {
154
+ return { ...message, content: truncateString(message.content, perMessageBudget) };
155
+ }
156
+ const text = message.content
157
+ .filter((block) => block.type === "text")
158
+ .map((block) => block.text ?? "")
159
+ .join("\n");
160
+ const blocks = [];
161
+ if (text)
162
+ blocks.push({ type: "text", text: truncateString(text, perMessageBudget) });
163
+ for (const block of message.content) {
164
+ if (block.type === "text")
165
+ continue;
166
+ if (block.type === "tool_use") {
167
+ blocks.push({ ...block, input: {} });
168
+ }
169
+ else if (block.type === "tool_result") {
170
+ blocks.push({ ...block, content: "" });
171
+ }
172
+ else {
173
+ blocks.push({ ...block });
174
+ }
175
+ }
176
+ return { ...message, content: blocks };
177
+ });
178
+ return renderConversation([candidate]).length <= maxChars && estimateTokens(candidate) <= maxTokens
179
+ ? candidate
180
+ : [];
181
+ }
182
+ export function buildGoalJudgeRuntimeContext(messages, options = {}) {
183
+ const maxRounds = Math.max(1, options.maxRounds ?? DEFAULT_MAX_ROUNDS);
184
+ const maxEstimatedTokens = Math.max(1, options.maxEstimatedTokens ?? DEFAULT_MAX_ESTIMATED_TOKENS);
185
+ const maxChars = Math.max(1, options.maxChars ?? DEFAULT_MAX_CHARS);
186
+ const sanitized = sanitizeConversation(messages, options.sensitiveToolResultRedactions);
187
+ const allRounds = groupMessagesByApiRound(sanitized);
188
+ let selected = allRounds.slice(-maxRounds);
189
+ let truncated = selected.length !== allRounds.length;
190
+ while (selected.length > 1) {
191
+ const conversation = selected.flat();
192
+ if (estimateTokens(conversation) <= maxEstimatedTokens &&
193
+ renderConversation(selected).length <= maxChars) {
194
+ break;
195
+ }
196
+ selected = selected.slice(1);
197
+ truncated = true;
198
+ }
199
+ if (selected.length === 1) {
200
+ const conversation = selected[0];
201
+ if (estimateTokens(conversation) > maxEstimatedTokens ||
202
+ renderConversation(selected).length > maxChars) {
203
+ selected = [emergencyTruncate(conversation, maxChars, maxEstimatedTokens)];
204
+ truncated = true;
205
+ if (estimateTokens(selected[0]) > maxEstimatedTokens ||
206
+ renderConversation(selected).length > maxChars) {
207
+ const fallback = structuralFallback(conversation, maxChars, maxEstimatedTokens);
208
+ selected = fallback.length > 0 ? [fallback] : [];
209
+ }
210
+ }
211
+ }
212
+ let conversation = selected.flat();
213
+ let renderedConversation = renderConversation(selected);
214
+ // Absolute postcondition: even pathological structural overhead must not
215
+ // escape the advertised hard limits. The ellipsis is deterministic and the
216
+ // empty conversation has zero estimated tokens.
217
+ if (renderedConversation.length > maxChars ||
218
+ estimateTokens(conversation) > maxEstimatedTokens) {
219
+ selected = [];
220
+ conversation = [];
221
+ renderedConversation = "…".slice(0, maxChars);
222
+ truncated = true;
223
+ }
224
+ return {
225
+ conversation,
226
+ renderedConversation,
227
+ digest: createHash("sha256").update(renderedConversation).digest("hex").slice(0, 16),
228
+ selectedRoundCount: selected.length,
229
+ sourceRoundCount: allRounds.length,
230
+ estimatedTokens: estimateTokens(conversation),
231
+ chars: renderedConversation.length,
232
+ truncated,
233
+ };
234
+ }
@@ -0,0 +1,6 @@
1
+ import type { Message } from "../types.js";
2
+ /**
3
+ * Remove run-scoped context messages before caching the durable conversation.
4
+ * Identity checks are intentional: equal user-authored content must survive.
5
+ */
6
+ export declare function stripInjectedContextMessages(messages: Message[], userContextMsg: Message | null, dynamicContextMsg: Message | null): Message[];
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Remove run-scoped context messages before caching the durable conversation.
3
+ * Identity checks are intentional: equal user-authored content must survive.
4
+ */
5
+ export function stripInjectedContextMessages(messages, userContextMsg, dynamicContextMsg) {
6
+ const withoutDynamicContext = dynamicContextMsg
7
+ ? messages.filter((message) => message !== dynamicContextMsg)
8
+ : [...messages];
9
+ if (!userContextMsg || messages[0] !== userContextMsg) {
10
+ return withoutDynamicContext;
11
+ }
12
+ return withoutDynamicContext.slice(1);
13
+ }
@@ -1,4 +1,4 @@
1
- import type { InputAttachmentMeta } from "../protocol/types.js";
1
+ import type { InputAttachmentMeta } from "../types.js";
2
2
  import type { ParsedImage } from "./parse-task.js";
3
3
  export interface InputAttachmentContext {
4
4
  text: string;
@@ -4,6 +4,7 @@
4
4
  import type { LLMClientBase } from "../llm/client-base.js";
5
5
  import type { Message, ToolDefinition, LLMResponse, StreamCallback } from "../types.js";
6
6
  import { Transcript } from "../session/transcript.js";
7
+ import { type PromptPrefixFingerprint } from "./prompt-cache-diagnostics.js";
7
8
  export interface ModelCallRecordingOptions {
8
9
  sensitiveToolResultRedactions?: ReadonlyMap<string, string>;
9
10
  }
@@ -21,15 +22,14 @@ export declare class ModelFacade {
21
22
  private readonly client;
22
23
  private readonly transcript;
23
24
  constructor(client: LLMClientBase, transcript: Transcript);
25
+ getPromptPrefixFingerprint(systemPrompt: string, tools: readonly ToolDefinition[]): PromptPrefixFingerprint;
24
26
  call(systemPrompt: string, messages: Message[], tools: ToolDefinition[], onStream?: StreamCallback, signal?: AbortSignal, recordingOptions?: ModelCallRecordingOptions): Promise<LLMResponse>;
25
27
  /**
26
28
  * Call without streaming — used as fallback when streaming fails.
27
29
  */
28
30
  callWithoutStreaming(systemPrompt: string, messages: Message[], tools: ToolDefinition[], signal?: AbortSignal, recordingOptions?: ModelCallRecordingOptions): Promise<LLMResponse>;
29
- /** Record API timing and token usage to bootstrap state. */
30
- private recordUsage;
31
31
  /** Optional summarize function for tool use summaries. */
32
- summarize?: (systemPrompt: string, userMessage: string) => Promise<string>;
32
+ summarize?: (systemPrompt: string, userMessage: string, signal?: AbortSignal) => Promise<string>;
33
33
  /** Get cumulative output tokens (for token budget). */
34
34
  getOutputTokens?(): number;
35
35
  private recordResponse;
@@ -4,8 +4,8 @@
4
4
  import { logger, getCurrentSid } from "../logging/logger.js";
5
5
  import { recordLLMError, recordLLMRequest, recordLLMResponse, } from "../logging/session-recorder.js";
6
6
  import { sanitizeMessages } from "../logging/sanitize-messages.js";
7
- import { addAPIDuration, addToModelUsage, addInputTokens, addOutputTokens } from "../state.js";
8
- import { cacheHitRateFromUsage } from "./session-usage.js";
7
+ import { cacheHitRateFromUsage } from "../session/usage.js";
8
+ import { createPromptPrefixFingerprint, } from "./prompt-cache-diagnostics.js";
9
9
  let _reqSeq = 0;
10
10
  function nextReqId() {
11
11
  _reqSeq += 1;
@@ -30,6 +30,15 @@ export class ModelFacade {
30
30
  this.client = client;
31
31
  this.transcript = transcript;
32
32
  }
33
+ getPromptPrefixFingerprint(systemPrompt, tools) {
34
+ const client = this.client;
35
+ const fallbackIdentity = {
36
+ provider: client.provider ?? "unknown",
37
+ model: client.model ?? "unknown",
38
+ identityVersion: "legacy-client-v1",
39
+ };
40
+ return createPromptPrefixFingerprint(systemPrompt, tools, client.getPromptCacheConfigIdentity?.() ?? fallbackIdentity, client.getPromptCacheScopeIdentity?.() ?? fallbackIdentity);
41
+ }
33
42
  async call(systemPrompt, messages, tools, onStream, signal, recordingOptions) {
34
43
  const startMs = Date.now();
35
44
  const msgCount = messages.length;
@@ -87,6 +96,7 @@ export class ModelFacade {
87
96
  throw err;
88
97
  }
89
98
  const latencyMs = Date.now() - startMs;
99
+ const promptPrefix = this.getPromptPrefixFingerprint(systemPrompt, tools);
90
100
  logger.info("llm.request", {
91
101
  stream: true,
92
102
  latencyMs,
@@ -96,6 +106,7 @@ export class ModelFacade {
96
106
  textLen: response.text?.length ?? 0,
97
107
  usage: response.usage,
98
108
  cacheHitRate: cacheHitRate(response.usage),
109
+ promptPrefix,
99
110
  });
100
111
  recordLLMResponse(sid, {
101
112
  text: response.text,
@@ -104,7 +115,6 @@ export class ModelFacade {
104
115
  usage: response.usage,
105
116
  durationMs: latencyMs,
106
117
  }, reqId);
107
- this.recordUsage(response, latencyMs);
108
118
  this.recordResponse(response);
109
119
  return response;
110
120
  }
@@ -141,6 +151,7 @@ export class ModelFacade {
141
151
  throw err;
142
152
  }
143
153
  const latencyMs = Date.now() - startMs;
154
+ const promptPrefix = this.getPromptPrefixFingerprint(systemPrompt, tools);
144
155
  logger.info("llm.request", {
145
156
  stream: false,
146
157
  latencyMs,
@@ -150,6 +161,7 @@ export class ModelFacade {
150
161
  textLen: response.text?.length ?? 0,
151
162
  usage: response.usage,
152
163
  cacheHitRate: cacheHitRate(response.usage),
164
+ promptPrefix,
153
165
  });
154
166
  recordLLMResponse(sid, {
155
167
  text: response.text,
@@ -158,20 +170,9 @@ export class ModelFacade {
158
170
  usage: response.usage,
159
171
  durationMs: latencyMs,
160
172
  }, reqId);
161
- this.recordUsage(response, latencyMs);
162
173
  this.recordResponse(response);
163
174
  return response;
164
175
  }
165
- /** Record API timing and token usage to bootstrap state. */
166
- recordUsage(response, latencyMs) {
167
- addAPIDuration(latencyMs);
168
- const u = response.usage;
169
- if (u) {
170
- addInputTokens(u.promptTokens ?? 0);
171
- addOutputTokens(u.completionTokens ?? 0);
172
- addToModelUsage(this.client.model ?? "unknown", u.promptTokens ?? 0, u.completionTokens ?? 0, u.cacheReadTokens ?? 0, u.cacheCreationTokens ?? 0);
173
- }
174
- }
175
176
  /** Optional summarize function for tool use summaries. */
176
177
  summarize;
177
178
  recordResponse(response) {
@@ -0,0 +1,55 @@
1
+ import type { PermissionRule } from "../types.js";
2
+ import { type ApprovalBackend, type ApprovalRouter, type PermissionClassifier } from "../tool-system/permission.js";
3
+ import type { EngineConfig } from "./types.js";
4
+ type PermissionMode = NonNullable<EngineConfig["permissionMode"]>;
5
+ export interface ComposePermissionRulesOptions {
6
+ mode: PermissionMode;
7
+ cwd: string;
8
+ presetRules: readonly PermissionRule[];
9
+ settingsScope?: EngineConfig["settingsScope"];
10
+ projectTrusted?: boolean;
11
+ }
12
+ /**
13
+ * Compose the permission rule list for a session: preset rules, the standing
14
+ * memory-scope carve-outs, mode-derived rules, and finally the user's own
15
+ * `settings.permissions.rules` at highest precedence.
16
+ *
17
+ * Extracted from {@link PermissionController.build} so that a non-Engine caller
18
+ * — notably `SessionToolHost`, which exposes tools to an external Agent Runtime
19
+ * — composes rules the SAME way instead of being handed the obligation and
20
+ * silently getting it wrong. That mattered concretely: a user rule denying a
21
+ * tool lives only in settings, so a path that skips this leaves the user's
22
+ * explicit "no" unenforced for the external runtime while the Native Engine
23
+ * honors it.
24
+ */
25
+ export declare function composePermissionRules(options: ComposePermissionRulesOptions): PermissionRule[];
26
+ export declare class PermissionController {
27
+ private readonly deps;
28
+ private mode;
29
+ private inPlanMode;
30
+ private pendingMode;
31
+ private pendingPlanMode;
32
+ private activePermission;
33
+ private activeApprovalRouter;
34
+ private readonly interactiveBackends;
35
+ constructor(deps: {
36
+ config: () => EngineConfig;
37
+ updateConfig: (next: EngineConfig) => void;
38
+ presetRules: () => PermissionRule[];
39
+ runInProgress: () => boolean;
40
+ });
41
+ get permissionMode(): PermissionMode;
42
+ get planMode(): boolean;
43
+ attach(permission: PermissionClassifier, approvalRouter?: ApprovalRouter): void;
44
+ build(mode: PermissionMode, cwd: string, approvalRouter?: ApprovalRouter): {
45
+ rules: PermissionRule[];
46
+ backend: ApprovalBackend;
47
+ };
48
+ setPermissionMode(mode: PermissionMode): void;
49
+ applyPending(): void;
50
+ getPermissionMode(): PermissionMode;
51
+ getPermissionRules(): PermissionRule[];
52
+ setPlanMode(value: boolean): void;
53
+ private apply;
54
+ }
55
+ export {};
@@ -0,0 +1,148 @@
1
+ import { SettingsManager } from "../settings/manager.js";
2
+ import { AutoApprovalBackend, HeadlessApprovalBackend, InteractiveApprovalBackend, getInteractiveApprovalBackend, } from "../tool-system/permission.js";
3
+ /**
4
+ * Compose the permission rule list for a session: preset rules, the standing
5
+ * memory-scope carve-outs, mode-derived rules, and finally the user's own
6
+ * `settings.permissions.rules` at highest precedence.
7
+ *
8
+ * Extracted from {@link PermissionController.build} so that a non-Engine caller
9
+ * — notably `SessionToolHost`, which exposes tools to an external Agent Runtime
10
+ * — composes rules the SAME way instead of being handed the obligation and
11
+ * silently getting it wrong. That mattered concretely: a user rule denying a
12
+ * tool lives only in settings, so a path that skips this leaves the user's
13
+ * explicit "no" unenforced for the external runtime while the Native Engine
14
+ * honors it.
15
+ */
16
+ export function composePermissionRules(options) {
17
+ const { mode, cwd } = options;
18
+ const rules = [...options.presetRules];
19
+ rules.push({
20
+ tool: "MemorySave",
21
+ argsPattern: { scope: "^dream$" },
22
+ decision: "allow",
23
+ reason: "Dream scope is the LLM's auto-consolidation workspace",
24
+ });
25
+ rules.push({
26
+ tool: "MemoryDelete",
27
+ argsPattern: { scope: "^dream$" },
28
+ decision: "allow",
29
+ reason: "Dream scope is the LLM's auto-consolidation workspace",
30
+ });
31
+ if (mode === "acceptEdits" || mode === "bypassPermissions") {
32
+ rules.push({ tool: "Write", decision: "allow" });
33
+ rules.push({ tool: "Edit", decision: "allow" });
34
+ }
35
+ if (mode === "bypassPermissions")
36
+ rules.push({ tool: "Bash", decision: "allow" });
37
+ try {
38
+ const settings = new SettingsManager(cwd, options.settingsScope ?? "project", options.projectTrusted !== false).get();
39
+ // unshift: the user's own rules outrank every default.
40
+ if (settings.permissions?.rules?.length)
41
+ rules.unshift(...settings.permissions.rules);
42
+ }
43
+ catch {
44
+ // Settings are optional; preset and mode defaults remain usable.
45
+ }
46
+ return rules;
47
+ }
48
+ export class PermissionController {
49
+ deps;
50
+ mode;
51
+ inPlanMode;
52
+ pendingMode = null;
53
+ pendingPlanMode = null;
54
+ activePermission;
55
+ activeApprovalRouter;
56
+ interactiveBackends = new WeakMap();
57
+ constructor(deps) {
58
+ this.deps = deps;
59
+ this.mode = deps.config().permissionMode ?? "acceptEdits";
60
+ this.inPlanMode = this.mode === "plan";
61
+ }
62
+ get permissionMode() {
63
+ return this.mode;
64
+ }
65
+ get planMode() {
66
+ return this.inPlanMode;
67
+ }
68
+ attach(permission, approvalRouter) {
69
+ this.activePermission = permission;
70
+ this.activeApprovalRouter = approvalRouter;
71
+ }
72
+ build(mode, cwd, approvalRouter) {
73
+ const config = this.deps.config();
74
+ const rules = composePermissionRules({
75
+ mode,
76
+ cwd,
77
+ presetRules: this.deps.presetRules(),
78
+ settingsScope: config.settingsScope,
79
+ projectTrusted: config.projectTrusted,
80
+ });
81
+ if (config.approvalBackend) {
82
+ return {
83
+ rules,
84
+ backend: mode === "auto"
85
+ ? new AutoApprovalBackend(config.approvalBackend)
86
+ : config.approvalBackend,
87
+ };
88
+ }
89
+ if (mode === "auto")
90
+ return { rules, backend: new AutoApprovalBackend() };
91
+ let interactive;
92
+ if (approvalRouter) {
93
+ interactive =
94
+ this.interactiveBackends.get(approvalRouter) ??
95
+ new InteractiveApprovalBackend(approvalRouter);
96
+ this.interactiveBackends.set(approvalRouter, interactive);
97
+ }
98
+ else {
99
+ interactive = getInteractiveApprovalBackend();
100
+ }
101
+ const backend = interactive.hasPromptFn()
102
+ ? interactive
103
+ : new HeadlessApprovalBackend(mode === "bypassPermissions" ? "approve-all" : "deny-all");
104
+ return { rules, backend };
105
+ }
106
+ setPermissionMode(mode) {
107
+ if (this.deps.runInProgress()) {
108
+ this.pendingMode = mode;
109
+ this.pendingPlanMode = mode === "plan";
110
+ return;
111
+ }
112
+ this.apply(mode, mode === "plan");
113
+ }
114
+ applyPending() {
115
+ if (this.pendingMode === null)
116
+ return;
117
+ const mode = this.pendingMode;
118
+ const planMode = this.pendingPlanMode ?? mode === "plan";
119
+ this.pendingMode = null;
120
+ this.pendingPlanMode = null;
121
+ this.apply(mode, planMode);
122
+ }
123
+ getPermissionMode() {
124
+ return this.deps.config().permissionMode ?? "acceptEdits";
125
+ }
126
+ getPermissionRules() {
127
+ const config = this.deps.config();
128
+ return this.build(this.getPermissionMode(), config.cwd ?? process.cwd(), this.activeApprovalRouter).rules;
129
+ }
130
+ setPlanMode(value) {
131
+ if (value) {
132
+ this.setPermissionMode("plan");
133
+ }
134
+ else if ((this.pendingMode ?? this.mode) === "plan") {
135
+ this.setPermissionMode("acceptEdits");
136
+ }
137
+ }
138
+ apply(mode, planMode) {
139
+ const config = { ...this.deps.config(), permissionMode: mode };
140
+ this.deps.updateConfig(config);
141
+ this.mode = mode;
142
+ this.inPlanMode = planMode;
143
+ if (!this.activePermission)
144
+ return;
145
+ const { rules, backend } = this.build(mode, config.cwd ?? process.cwd(), this.activeApprovalRouter);
146
+ this.activePermission.reconfigure(mode, backend, rules);
147
+ }
148
+ }