@cjhyy/code-shell-core 0.7.1 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (594) hide show
  1. package/README.md +36 -23
  2. package/dist/agent/agent-definition-registry.d.ts +2 -2
  3. package/dist/agent/agent-definition-registry.js +47 -10
  4. package/dist/agent/agent-definition.d.ts +5 -0
  5. package/dist/agent/agent-definition.js +14 -0
  6. package/dist/automation/index.d.ts +7 -4
  7. package/dist/automation/index.js +4 -2
  8. package/dist/automation/runner.js +3 -1
  9. package/dist/automation/scheduler.d.ts +57 -1
  10. package/dist/automation/scheduler.js +123 -23
  11. package/dist/automation/store.d.ts +6 -2
  12. package/dist/automation/store.js +7 -3
  13. package/dist/capabilities/index.d.ts +109 -0
  14. package/dist/capabilities/index.js +80 -0
  15. package/dist/capability-control/disabled-lists.d.ts +2 -1
  16. package/dist/capability-control/disabled-lists.js +3 -5
  17. package/dist/capability-control/overlay.d.ts +14 -1
  18. package/dist/capability-control/overlay.js +40 -0
  19. package/dist/capability-control/service.js +6 -4
  20. package/dist/cli/agent-server-stdio.d.ts +1 -1
  21. package/dist/cli/agent-server-stdio.js +66 -6
  22. package/dist/cli/agent-server-tcp.js +7 -3
  23. package/dist/context/compaction.d.ts +39 -3
  24. package/dist/context/compaction.js +151 -39
  25. package/dist/context/manager.d.ts +17 -1
  26. package/dist/context/manager.js +36 -1
  27. package/dist/credentials/access.d.ts +3 -1
  28. package/dist/credentials/access.js +24 -3
  29. package/dist/credentials/index.d.ts +1 -1
  30. package/dist/credentials/index.js +1 -1
  31. package/dist/credentials/oauth.d.ts +4 -1
  32. package/dist/credentials/oauth.js +14 -0
  33. package/dist/credentials/store.d.ts +15 -1
  34. package/dist/credentials/store.js +17 -4
  35. package/dist/credentials/types.d.ts +24 -0
  36. package/dist/credentials/use-credential-tool.js +15 -1
  37. package/dist/engine/auxiliary-pipeline.d.ts +40 -0
  38. package/dist/engine/auxiliary-pipeline.js +181 -0
  39. package/dist/{settings → engine}/disk-defaults.d.ts +2 -2
  40. package/dist/{settings → engine}/disk-defaults.js +5 -2
  41. package/dist/engine/dynamic-tool-defs.d.ts +4 -0
  42. package/dist/engine/dynamic-tool-defs.js +4 -0
  43. package/dist/engine/engine.d.ts +254 -195
  44. package/dist/engine/engine.js +1812 -2041
  45. package/dist/engine/file-history-hook.d.ts +11 -0
  46. package/dist/engine/file-history-hook.js +31 -0
  47. package/dist/engine/goal-judge-context.d.ts +9 -0
  48. package/dist/engine/goal-judge-context.js +234 -0
  49. package/dist/engine/injected-context-cache.d.ts +6 -0
  50. package/dist/engine/injected-context-cache.js +13 -0
  51. package/dist/engine/input-attachments.d.ts +1 -1
  52. package/dist/engine/model-facade.d.ts +3 -3
  53. package/dist/engine/model-facade.js +15 -14
  54. package/dist/engine/permission-controller.d.ts +55 -0
  55. package/dist/engine/permission-controller.js +148 -0
  56. package/dist/engine/prompt-cache-diagnostics.d.ts +58 -0
  57. package/dist/engine/prompt-cache-diagnostics.js +178 -0
  58. package/dist/engine/run-accounting.d.ts +41 -0
  59. package/dist/engine/run-accounting.js +126 -0
  60. package/dist/engine/run-context.d.ts +44 -0
  61. package/dist/engine/run-context.js +88 -0
  62. package/dist/engine/run-environment.d.ts +30 -0
  63. package/dist/engine/run-environment.js +77 -0
  64. package/dist/engine/run-finalize.d.ts +58 -0
  65. package/dist/engine/run-finalize.js +245 -0
  66. package/dist/engine/run-goal.d.ts +58 -0
  67. package/dist/engine/run-goal.js +188 -0
  68. package/dist/engine/run-image-input.d.ts +1 -1
  69. package/dist/engine/run-image-input.js +5 -3
  70. package/dist/engine/run-session-open.d.ts +41 -0
  71. package/dist/engine/run-session-open.js +186 -0
  72. package/dist/engine/run-setup.d.ts +42 -0
  73. package/dist/engine/run-setup.js +58 -0
  74. package/dist/engine/run-tooling.d.ts +125 -0
  75. package/dist/engine/run-tooling.js +283 -0
  76. package/dist/engine/run-types.d.ts +139 -0
  77. package/dist/engine/run-types.js +12 -0
  78. package/dist/engine/run-workspace.d.ts +50 -0
  79. package/dist/engine/run-workspace.js +114 -0
  80. package/dist/engine/steer-queue.d.ts +1 -1
  81. package/dist/engine/subagent-spawner.d.ts +32 -0
  82. package/dist/engine/subagent-spawner.js +287 -0
  83. package/dist/engine/tool-summary.d.ts +2 -2
  84. package/dist/engine/tool-summary.js +2 -2
  85. package/dist/engine/turn-loop.d.ts +49 -10
  86. package/dist/engine/turn-loop.js +370 -104
  87. package/dist/engine/types.d.ts +30 -3
  88. package/dist/engine/types.js +1 -1
  89. package/dist/{engine/goal.d.ts → goal/lifecycle.d.ts} +76 -4
  90. package/dist/goal/lifecycle.js +482 -0
  91. package/dist/hooks/events.d.ts +24 -10
  92. package/dist/hooks/goal-stop-hook.d.ts +17 -28
  93. package/dist/hooks/goal-stop-hook.js +110 -465
  94. package/dist/hooks/registry.js +1 -1
  95. package/dist/index.d.ts +48 -108
  96. package/dist/index.extension.d.ts +51 -0
  97. package/dist/index.extension.js +39 -0
  98. package/dist/index.internal.d.ts +86 -0
  99. package/dist/index.internal.js +92 -0
  100. package/dist/index.js +34 -123
  101. package/dist/links/cli.d.ts +48 -0
  102. package/dist/links/cli.js +617 -0
  103. package/dist/links/http.d.ts +40 -0
  104. package/dist/links/http.js +166 -0
  105. package/dist/links/index.d.ts +4 -0
  106. package/dist/links/index.js +3 -0
  107. package/dist/links/link-action-tool.d.ts +5 -0
  108. package/dist/links/link-action-tool.js +241 -0
  109. package/dist/links/providers.d.ts +8 -0
  110. package/dist/links/providers.js +665 -0
  111. package/dist/links/types.d.ts +44 -0
  112. package/dist/llm/client-base.d.ts +7 -0
  113. package/dist/llm/client-base.js +60 -0
  114. package/dist/llm/model-pool.d.ts +1 -1
  115. package/dist/llm/model-pool.js +1 -1
  116. package/dist/llm/providers/anthropic.d.ts +1 -0
  117. package/dist/llm/providers/anthropic.js +9 -0
  118. package/dist/llm/providers/openai.d.ts +1 -0
  119. package/dist/llm/providers/openai.js +17 -0
  120. package/dist/model-catalog/index.js +15 -2
  121. package/dist/model-catalog/resolve.d.ts +13 -1
  122. package/dist/model-catalog/resolve.js +37 -2
  123. package/dist/model-catalog/types.d.ts +74 -48
  124. package/dist/model-catalog/types.js +16 -5
  125. package/dist/model-catalog/upsert.d.ts +3 -1
  126. package/dist/model-catalog/upsert.js +9 -0
  127. package/dist/onboarding.d.ts +0 -1
  128. package/dist/onboarding.js +1 -22
  129. package/dist/panel-apps/bindings.d.ts +24 -0
  130. package/dist/panel-apps/bindings.js +69 -0
  131. package/dist/panel-apps/github-archive.d.ts +21 -0
  132. package/dist/panel-apps/github-archive.js +98 -0
  133. package/dist/panel-apps/index.d.ts +4 -0
  134. package/dist/panel-apps/index.js +4 -0
  135. package/dist/panel-apps/installer.d.ts +68 -0
  136. package/dist/panel-apps/installer.js +622 -0
  137. package/dist/panel-apps/manifest.d.ts +364 -0
  138. package/dist/panel-apps/manifest.js +189 -0
  139. package/dist/panel-apps/paths.d.ts +13 -0
  140. package/dist/panel-apps/paths.js +38 -0
  141. package/dist/panel-apps/registry.d.ts +51 -0
  142. package/dist/panel-apps/registry.js +99 -0
  143. package/dist/panel-apps/runtime.d.ts +80 -0
  144. package/dist/panel-apps/runtime.js +154 -0
  145. package/dist/plugins/gitOps.js +8 -1
  146. package/dist/plugins/installedPlugins.d.ts +2 -1
  147. package/dist/plugins/installedPlugins.js +146 -8
  148. package/dist/plugins/installer/codex/convertAgents.d.ts +4 -1
  149. package/dist/plugins/installer/codex/convertAgents.js +62 -8
  150. package/dist/plugins/installer/codex/convertCommands.d.ts +5 -5
  151. package/dist/plugins/installer/codex/convertCommands.js +35 -12
  152. package/dist/plugins/installer/codex/convertHooks.d.ts +10 -0
  153. package/dist/plugins/installer/codex/convertHooks.js +82 -0
  154. package/dist/plugins/installer/codex/convertSkills.js +41 -6
  155. package/dist/plugins/installer/install.d.ts +7 -1
  156. package/dist/plugins/installer/install.js +21 -87
  157. package/dist/plugins/installer/installFromArchive.d.ts +26 -4
  158. package/dist/plugins/installer/installFromArchive.js +44 -27
  159. package/dist/plugins/installer/installFromNpm.d.ts +31 -0
  160. package/dist/plugins/installer/installFromNpm.js +273 -0
  161. package/dist/plugins/installer/loadPluginAgents.js +17 -4
  162. package/dist/plugins/installer/loadPluginMcp.d.ts +14 -0
  163. package/dist/plugins/installer/loadPluginMcp.js +245 -35
  164. package/dist/plugins/installer/normalizeManifest.d.ts +13 -0
  165. package/dist/plugins/installer/normalizeManifest.js +306 -0
  166. package/dist/plugins/installer/npmTar.d.ts +13 -0
  167. package/dist/plugins/installer/npmTar.js +321 -0
  168. package/dist/plugins/installer/parseSource.d.ts +11 -0
  169. package/dist/plugins/installer/parseSource.js +48 -0
  170. package/dist/plugins/installer/preview.d.ts +101 -0
  171. package/dist/plugins/installer/preview.js +336 -0
  172. package/dist/plugins/installer/projectPluginSource.d.ts +14 -0
  173. package/dist/plugins/installer/projectPluginSource.js +140 -0
  174. package/dist/plugins/installer/types.d.ts +775 -0
  175. package/dist/plugins/installer/types.js +100 -0
  176. package/dist/plugins/installer/unzip.d.ts +11 -0
  177. package/dist/plugins/installer/unzip.js +123 -9
  178. package/dist/plugins/installer/update.d.ts +2 -2
  179. package/dist/plugins/installer/update.js +43 -4
  180. package/dist/plugins/loadPluginHooks.d.ts +19 -2
  181. package/dist/plugins/loadPluginHooks.js +97 -86
  182. package/dist/plugins/pluginAutomationTemplates.d.ts +18 -0
  183. package/dist/plugins/pluginAutomationTemplates.js +50 -0
  184. package/dist/plugins/pluginCatalog.d.ts +45 -0
  185. package/dist/plugins/pluginCatalog.js +87 -0
  186. package/dist/plugins/pluginCommandHook.d.ts +6 -0
  187. package/dist/plugins/pluginCommandHook.js +25 -8
  188. package/dist/plugins/pluginCommandsLoader.d.ts +19 -0
  189. package/dist/plugins/pluginCommandsLoader.js +181 -7
  190. package/dist/plugins/pluginContent.d.ts +10 -1
  191. package/dist/plugins/pluginContent.js +87 -30
  192. package/dist/plugins/pluginHookApproval.d.ts +30 -0
  193. package/dist/plugins/pluginHookApproval.js +160 -0
  194. package/dist/plugins/pluginHookIntegrity.d.ts +69 -0
  195. package/dist/plugins/pluginHookIntegrity.js +361 -0
  196. package/dist/plugins/pluginInstaller.js +71 -12
  197. package/dist/plugins/pluginMcpApproval.d.ts +19 -0
  198. package/dist/plugins/pluginMcpApproval.js +110 -0
  199. package/dist/plugins/pluginMcpIntegrity.d.ts +21 -0
  200. package/dist/plugins/pluginMcpIntegrity.js +74 -0
  201. package/dist/plugins/types.d.ts +30 -0
  202. package/dist/plugins/varRewrite.d.ts +9 -5
  203. package/dist/plugins/varRewrite.js +26 -17
  204. package/dist/preset/index.d.ts +11 -8
  205. package/dist/preset/index.js +62 -203
  206. package/dist/product/define.js +9 -3
  207. package/dist/product/types.d.ts +0 -2
  208. package/dist/profile/activation.d.ts +36 -0
  209. package/dist/profile/activation.js +57 -0
  210. package/dist/profile/catalog-store.d.ts +77 -0
  211. package/dist/profile/catalog-store.js +346 -0
  212. package/dist/profile/catalog.d.ts +54 -0
  213. package/dist/profile/catalog.js +152 -0
  214. package/dist/profile/index.d.ts +7 -0
  215. package/dist/profile/index.js +7 -0
  216. package/dist/profile/requirements.d.ts +76 -0
  217. package/dist/profile/requirements.js +117 -0
  218. package/dist/profile/resolve.d.ts +11 -0
  219. package/dist/profile/resolve.js +41 -0
  220. package/dist/profile/store.d.ts +17 -0
  221. package/dist/profile/store.js +167 -0
  222. package/dist/profile/types.d.ts +321 -0
  223. package/dist/profile/types.js +104 -0
  224. package/dist/prompt/composer.d.ts +46 -7
  225. package/dist/prompt/composer.js +78 -48
  226. package/dist/prompt/instruction-scanner.d.ts +6 -5
  227. package/dist/prompt/instruction-scanner.js +8 -23
  228. package/dist/prompt/section-loader.d.ts +2 -2
  229. package/dist/prompt/section-loader.js +7 -4
  230. package/dist/prompt/sections/browser.md +10 -9
  231. package/dist/prompt/sections/harness-base.md +9 -0
  232. package/dist/protocol/chat-session-manager.d.ts +64 -1
  233. package/dist/protocol/chat-session-manager.js +104 -0
  234. package/dist/protocol/chat-session.d.ts +61 -10
  235. package/dist/protocol/chat-session.js +135 -25
  236. package/dist/protocol/client.d.ts +33 -3
  237. package/dist/protocol/client.js +96 -5
  238. package/dist/protocol/index.d.ts +2 -2
  239. package/dist/protocol/index.js +2 -2
  240. package/dist/protocol/mobile-remote-types.d.ts +406 -0
  241. package/dist/protocol/mobile-remote-types.js +1 -0
  242. package/dist/protocol/server.d.ts +127 -3
  243. package/dist/protocol/server.js +1309 -182
  244. package/dist/protocol/types.d.ts +152 -34
  245. package/dist/protocol/types.js +16 -0
  246. package/dist/run/ArtifactTracker.d.ts +6 -1
  247. package/dist/run/ArtifactTracker.js +29 -21
  248. package/dist/run/EngineRunner.d.ts +2 -0
  249. package/dist/run/EngineRunner.js +1 -0
  250. package/dist/run/RunManager.d.ts +26 -0
  251. package/dist/run/RunManager.js +82 -11
  252. package/dist/run/factory.d.ts +3 -0
  253. package/dist/run/factory.js +2 -0
  254. package/dist/runtime/safe-spawn.d.ts +6 -0
  255. package/dist/runtime/safe-spawn.js +8 -13
  256. package/dist/services/auto-dream.d.ts +13 -1
  257. package/dist/services/auto-dream.js +56 -8
  258. package/dist/services/dream-consolidation.js +10 -1
  259. package/dist/services/memory-orchestrator.js +6 -2
  260. package/dist/services/oauth.js +4 -1
  261. package/dist/services/session-memory.d.ts +4 -4
  262. package/dist/services/session-memory.js +13 -10
  263. package/dist/session/memory.d.ts +26 -7
  264. package/dist/session/memory.js +79 -21
  265. package/dist/session/session-manager.d.ts +182 -28
  266. package/dist/session/session-manager.js +910 -130
  267. package/dist/session/session-message.d.ts +22 -0
  268. package/dist/session/session-message.js +1 -0
  269. package/dist/session/transcript.d.ts +46 -5
  270. package/dist/session/transcript.js +159 -3
  271. package/dist/settings/feature-flags.d.ts +40 -0
  272. package/dist/settings/feature-flags.js +40 -0
  273. package/dist/settings/manager.d.ts +39 -1
  274. package/dist/settings/manager.js +102 -41
  275. package/dist/settings/migrate-config.js +4 -2
  276. package/dist/settings/schema.d.ts +511 -177
  277. package/dist/settings/schema.js +98 -25
  278. package/dist/skills/scanner.d.ts +6 -2
  279. package/dist/skills/scanner.js +160 -9
  280. package/dist/sources/adapter.d.ts +14 -0
  281. package/dist/sources/adapter.js +7 -0
  282. package/dist/sources/adapters/local-files.d.ts +10 -0
  283. package/dist/sources/adapters/local-files.js +127 -0
  284. package/dist/sources/adapters/mcp-resource.d.ts +17 -0
  285. package/dist/sources/adapters/mcp-resource.js +41 -0
  286. package/dist/sources/adapters/mock.d.ts +3 -0
  287. package/dist/sources/adapters/mock.js +29 -0
  288. package/dist/sources/binding.d.ts +6 -0
  289. package/dist/sources/binding.js +24 -0
  290. package/dist/sources/catalog.d.ts +6 -0
  291. package/dist/sources/catalog.js +64 -0
  292. package/dist/sources/context-summary.d.ts +8 -0
  293. package/dist/sources/context-summary.js +13 -0
  294. package/dist/sources/credential-status.d.ts +2 -0
  295. package/dist/sources/credential-status.js +13 -0
  296. package/dist/sources/index.d.ts +10 -0
  297. package/dist/sources/index.js +10 -0
  298. package/dist/sources/resolve.d.ts +28 -0
  299. package/dist/sources/resolve.js +47 -0
  300. package/dist/sources/truncate-utf8.d.ts +7 -0
  301. package/dist/sources/truncate-utf8.js +18 -0
  302. package/dist/sources/types.d.ts +71 -0
  303. package/dist/sources/types.js +26 -0
  304. package/dist/testing/fetch-stub.d.ts +32 -0
  305. package/dist/testing/fetch-stub.js +24 -0
  306. package/dist/themes/image.d.ts +18 -0
  307. package/dist/themes/image.js +117 -0
  308. package/dist/themes/index.d.ts +4 -0
  309. package/dist/themes/index.js +4 -0
  310. package/dist/themes/installer.d.ts +50 -0
  311. package/dist/themes/installer.js +290 -0
  312. package/dist/themes/manifest.d.ts +102 -0
  313. package/dist/themes/manifest.js +86 -0
  314. package/dist/themes/paths.d.ts +14 -0
  315. package/dist/themes/paths.js +33 -0
  316. package/dist/tool-system/browser-bridge.d.ts +53 -11
  317. package/dist/tool-system/browser-bridge.js +8 -9
  318. package/dist/tool-system/builtin/agent-heartbeat.d.ts +2 -2
  319. package/dist/tool-system/builtin/agent-heartbeat.js +20 -6
  320. package/dist/tool-system/builtin/agent-notifications.d.ts +127 -72
  321. package/dist/tool-system/builtin/agent-notifications.js +291 -101
  322. package/dist/tool-system/builtin/agent-output-file.js +1 -3
  323. package/dist/tool-system/builtin/agent-progress.d.ts +6 -0
  324. package/dist/tool-system/builtin/agent-progress.js +83 -0
  325. package/dist/tool-system/builtin/agent-registry.d.ts +38 -2
  326. package/dist/tool-system/builtin/agent-registry.js +178 -9
  327. package/dist/tool-system/builtin/agent-transcript-translator.js +1 -1
  328. package/dist/tool-system/builtin/agent.d.ts +2 -0
  329. package/dist/tool-system/builtin/agent.js +274 -33
  330. package/dist/tool-system/builtin/background-jobs.d.ts +55 -2
  331. package/dist/tool-system/builtin/background-jobs.js +96 -4
  332. package/dist/tool-system/builtin/background-work.d.ts +6 -0
  333. package/dist/tool-system/builtin/background-work.js +8 -1
  334. package/dist/tool-system/builtin/bash.js +5 -2
  335. package/dist/tool-system/builtin/browser-tools.d.ts +6 -3
  336. package/dist/tool-system/builtin/browser-tools.js +89 -23
  337. package/dist/tool-system/builtin/edit-model-catalog.d.ts +6 -0
  338. package/dist/tool-system/builtin/edit-model-catalog.js +172 -12
  339. package/dist/tool-system/builtin/edit.js +2 -6
  340. package/dist/tool-system/builtin/file-cache.d.ts +2 -0
  341. package/dist/tool-system/builtin/file-cache.js +4 -0
  342. package/dist/tool-system/builtin/generate-image.js +17 -10
  343. package/dist/tool-system/builtin/generate-video.js +26 -7
  344. package/dist/tool-system/builtin/grep.js +2 -2
  345. package/dist/tool-system/builtin/image-uploader.js +7 -1
  346. package/dist/tool-system/builtin/index.d.ts +32 -7
  347. package/dist/tool-system/builtin/index.js +237 -167
  348. package/dist/tool-system/builtin/memory.d.ts +6 -0
  349. package/dist/tool-system/builtin/memory.js +36 -15
  350. package/dist/tool-system/builtin/panel.d.ts +9 -0
  351. package/dist/tool-system/builtin/panel.js +314 -0
  352. package/dist/tool-system/builtin/read.js +5 -1
  353. package/dist/tool-system/builtin/send-message-to-session.d.ts +6 -0
  354. package/dist/tool-system/builtin/send-message-to-session.js +67 -0
  355. package/dist/tool-system/builtin/sources.d.ts +8 -0
  356. package/dist/tool-system/builtin/sources.js +137 -0
  357. package/dist/tool-system/builtin/tool-search.js +7 -2
  358. package/dist/tool-system/builtin/update-automation-memory.js +2 -0
  359. package/dist/tool-system/builtin/web-fetch.js +17 -13
  360. package/dist/tool-system/builtin/web-search.js +1 -3
  361. package/dist/tool-system/capability-module.d.ts +93 -0
  362. package/dist/tool-system/capability-module.js +53 -0
  363. package/dist/tool-system/context.d.ts +77 -19
  364. package/dist/tool-system/executor.js +75 -50
  365. package/dist/tool-system/external-tool-exposure.d.ts +60 -0
  366. package/dist/tool-system/external-tool-exposure.js +304 -0
  367. package/dist/tool-system/mcp-manager.d.ts +11 -1
  368. package/dist/tool-system/mcp-manager.js +19 -4
  369. package/dist/tool-system/mcp-tool-policy.d.ts +9 -0
  370. package/dist/tool-system/mcp-tool-policy.js +34 -0
  371. package/dist/tool-system/panel-bridge.d.ts +53 -0
  372. package/dist/tool-system/panel-bridge.js +1 -0
  373. package/dist/tool-system/permission.d.ts +26 -0
  374. package/dist/tool-system/permission.js +46 -0
  375. package/dist/tool-system/registry.d.ts +12 -1
  376. package/dist/tool-system/registry.js +31 -7
  377. package/dist/tool-system/sandbox/index.js +3 -8
  378. package/dist/tool-system/sandbox/seatbelt.js +2 -6
  379. package/dist/tool-system/session-tool-host.d.ts +139 -0
  380. package/dist/tool-system/session-tool-host.js +167 -0
  381. package/dist/tool-system/testing/tool-registry-harness.d.ts +31 -0
  382. package/dist/tool-system/testing/tool-registry-harness.js +51 -0
  383. package/dist/tool-system/validation.d.ts +14 -7
  384. package/dist/tool-system/validation.js +701 -7
  385. package/dist/types.d.ts +186 -20
  386. package/dist/{cc-orchestrator → utils}/cwd-normalize.d.ts +1 -0
  387. package/dist/{cc-orchestrator → utils}/cwd-normalize.js +1 -0
  388. package/dist/utils/file-mutex.d.ts +65 -0
  389. package/dist/utils/file-mutex.js +145 -0
  390. package/dist/utils/json.d.ts +2 -4
  391. package/dist/utils/json.js +2 -4
  392. package/dist/utils/lockfile.d.ts +30 -1
  393. package/dist/utils/lockfile.js +2 -2
  394. package/dist/utils/secret-scrubber.d.ts +8 -0
  395. package/dist/utils/secret-scrubber.js +227 -0
  396. package/dist/utils/toolDisplay.js +1 -1
  397. package/package.json +20 -5
  398. package/THIRD_PARTY_NOTICES.md +0 -206
  399. package/dist/arena/arena.d.ts +0 -45
  400. package/dist/arena/arena.js +0 -362
  401. package/dist/arena/context/context-tools.d.ts +0 -16
  402. package/dist/arena/context/context-tools.js +0 -272
  403. package/dist/arena/context/within-root.d.ts +0 -7
  404. package/dist/arena/context/within-root.js +0 -15
  405. package/dist/arena/detect-mode.d.ts +0 -20
  406. package/dist/arena/detect-mode.js +0 -78
  407. package/dist/arena/digest-builder.d.ts +0 -25
  408. package/dist/arena/digest-builder.js +0 -120
  409. package/dist/arena/index.d.ts +0 -29
  410. package/dist/arena/index.js +0 -29
  411. package/dist/arena/iterate/convergence.d.ts +0 -25
  412. package/dist/arena/iterate/convergence.js +0 -103
  413. package/dist/arena/iterate/formats/index.d.ts +0 -22
  414. package/dist/arena/iterate/formats/index.js +0 -283
  415. package/dist/arena/iterate/index.d.ts +0 -11
  416. package/dist/arena/iterate/index.js +0 -9
  417. package/dist/arena/iterate/iterative-arena.d.ts +0 -23
  418. package/dist/arena/iterate/iterative-arena.js +0 -237
  419. package/dist/arena/iterate/parse.d.ts +0 -42
  420. package/dist/arena/iterate/parse.js +0 -123
  421. package/dist/arena/iterate/phases/argue.d.ts +0 -22
  422. package/dist/arena/iterate/phases/argue.js +0 -165
  423. package/dist/arena/iterate/phases/revise.d.ts +0 -16
  424. package/dist/arena/iterate/phases/revise.js +0 -62
  425. package/dist/arena/iterate/phases/tournament.d.ts +0 -34
  426. package/dist/arena/iterate/phases/tournament.js +0 -113
  427. package/dist/arena/iterate/tools/web-tools.d.ts +0 -13
  428. package/dist/arena/iterate/tools/web-tools.js +0 -54
  429. package/dist/arena/iterate/types.d.ts +0 -152
  430. package/dist/arena/iterate/types.js +0 -8
  431. package/dist/arena/ledger.d.ts +0 -47
  432. package/dist/arena/ledger.js +0 -159
  433. package/dist/arena/lenses/architecture.d.ts +0 -5
  434. package/dist/arena/lenses/architecture.js +0 -22
  435. package/dist/arena/lenses/engineering.d.ts +0 -5
  436. package/dist/arena/lenses/engineering.js +0 -22
  437. package/dist/arena/lenses/general.d.ts +0 -5
  438. package/dist/arena/lenses/general.js +0 -20
  439. package/dist/arena/lenses/index.d.ts +0 -16
  440. package/dist/arena/lenses/index.js +0 -47
  441. package/dist/arena/lenses/product.d.ts +0 -5
  442. package/dist/arena/lenses/product.js +0 -22
  443. package/dist/arena/model-presets.d.ts +0 -23
  444. package/dist/arena/model-presets.js +0 -44
  445. package/dist/arena/phases/adjudication.d.ts +0 -25
  446. package/dist/arena/phases/adjudication.js +0 -142
  447. package/dist/arena/phases/build-consensus.d.ts +0 -30
  448. package/dist/arena/phases/build-consensus.js +0 -85
  449. package/dist/arena/phases/claim-registry.d.ts +0 -26
  450. package/dist/arena/phases/claim-registry.js +0 -60
  451. package/dist/arena/phases/cross-review.d.ts +0 -47
  452. package/dist/arena/phases/cross-review.js +0 -224
  453. package/dist/arena/phases/debate-rounds.d.ts +0 -28
  454. package/dist/arena/phases/debate-rounds.js +0 -161
  455. package/dist/arena/phases/participant-research.d.ts +0 -39
  456. package/dist/arena/phases/participant-research.js +0 -316
  457. package/dist/arena/phases/planning-detail-expansion.d.ts +0 -39
  458. package/dist/arena/phases/planning-detail-expansion.js +0 -120
  459. package/dist/arena/planner.d.ts +0 -28
  460. package/dist/arena/planner.js +0 -312
  461. package/dist/arena/providers/docs.d.ts +0 -7
  462. package/dist/arena/providers/docs.js +0 -111
  463. package/dist/arena/providers/git.d.ts +0 -8
  464. package/dist/arena/providers/git.js +0 -174
  465. package/dist/arena/providers/index.d.ts +0 -32
  466. package/dist/arena/providers/index.js +0 -132
  467. package/dist/arena/providers/none.d.ts +0 -7
  468. package/dist/arena/providers/none.js +0 -11
  469. package/dist/arena/providers/repo.d.ts +0 -7
  470. package/dist/arena/providers/repo.js +0 -258
  471. package/dist/arena/render/session.d.ts +0 -17
  472. package/dist/arena/render/session.js +0 -190
  473. package/dist/arena/render/terminal.d.ts +0 -34
  474. package/dist/arena/render/terminal.js +0 -286
  475. package/dist/arena/strategies/discussion.d.ts +0 -25
  476. package/dist/arena/strategies/discussion.js +0 -143
  477. package/dist/arena/strategies/index.d.ts +0 -15
  478. package/dist/arena/strategies/index.js +0 -28
  479. package/dist/arena/strategies/language-wrapper.d.ts +0 -17
  480. package/dist/arena/strategies/language-wrapper.js +0 -102
  481. package/dist/arena/strategies/lens-wrapper.d.ts +0 -16
  482. package/dist/arena/strategies/lens-wrapper.js +0 -236
  483. package/dist/arena/strategies/planning.d.ts +0 -30
  484. package/dist/arena/strategies/planning.js +0 -225
  485. package/dist/arena/strategies/review.d.ts +0 -26
  486. package/dist/arena/strategies/review.js +0 -168
  487. package/dist/arena/strategies/utils.d.ts +0 -36
  488. package/dist/arena/strategies/utils.js +0 -603
  489. package/dist/arena/tools/selector.d.ts +0 -17
  490. package/dist/arena/tools/selector.js +0 -61
  491. package/dist/arena/transitions.d.ts +0 -53
  492. package/dist/arena/transitions.js +0 -97
  493. package/dist/arena/types.d.ts +0 -518
  494. package/dist/arena/types.js +0 -27
  495. package/dist/cc-orchestrator/agent-adapter.d.ts +0 -54
  496. package/dist/cc-orchestrator/agent-adapter.js +0 -143
  497. package/dist/cc-orchestrator/cc-capability.d.ts +0 -19
  498. package/dist/cc-orchestrator/cc-capability.js +0 -53
  499. package/dist/cc-orchestrator/codex-session-discovery.d.ts +0 -24
  500. package/dist/cc-orchestrator/codex-session-discovery.js +0 -191
  501. package/dist/cc-orchestrator/codex-session-history.d.ts +0 -38
  502. package/dist/cc-orchestrator/codex-session-history.js +0 -247
  503. package/dist/cc-orchestrator/external-agent-bindings.d.ts +0 -27
  504. package/dist/cc-orchestrator/external-agent-bindings.js +0 -150
  505. package/dist/cc-orchestrator/external-agent-changes.d.ts +0 -19
  506. package/dist/cc-orchestrator/external-agent-changes.js +0 -231
  507. package/dist/cc-orchestrator/external-agent-driver.d.ts +0 -19
  508. package/dist/cc-orchestrator/external-agent-driver.js +0 -284
  509. package/dist/cc-orchestrator/external-agent-session-store.d.ts +0 -23
  510. package/dist/cc-orchestrator/external-agent-session-store.js +0 -146
  511. package/dist/cc-orchestrator/index.d.ts +0 -8
  512. package/dist/cc-orchestrator/index.js +0 -8
  513. package/dist/cc-orchestrator/relevance-judge.d.ts +0 -15
  514. package/dist/cc-orchestrator/relevance-judge.js +0 -29
  515. package/dist/cc-orchestrator/session-discovery.d.ts +0 -46
  516. package/dist/cc-orchestrator/session-discovery.js +0 -125
  517. package/dist/cc-orchestrator/session-history.d.ts +0 -54
  518. package/dist/cc-orchestrator/session-history.js +0 -150
  519. package/dist/cron/cron-runtime.d.ts +0 -2
  520. package/dist/cron/cron-runtime.js +0 -2
  521. package/dist/cron/cron-store.d.ts +0 -2
  522. package/dist/cron/cron-store.js +0 -2
  523. package/dist/cron/scheduler.d.ts +0 -7
  524. package/dist/cron/scheduler.js +0 -7
  525. package/dist/engine/goal.js +0 -206
  526. package/dist/external-agents/config.d.ts +0 -2
  527. package/dist/external-agents/config.js +0 -15
  528. package/dist/external-agents/types.d.ts +0 -31
  529. package/dist/git/parse-log.d.ts +0 -13
  530. package/dist/git/parse-log.js +0 -21
  531. package/dist/git/utils.d.ts +0 -49
  532. package/dist/git/utils.js +0 -161
  533. package/dist/git/worktree/crud.d.ts +0 -72
  534. package/dist/git/worktree/crud.js +0 -235
  535. package/dist/git/worktree/diff.d.ts +0 -14
  536. package/dist/git/worktree/diff.js +0 -82
  537. package/dist/git/worktree/git-exec.d.ts +0 -7
  538. package/dist/git/worktree/git-exec.js +0 -87
  539. package/dist/git/worktree/index.d.ts +0 -5
  540. package/dist/git/worktree/index.js +0 -5
  541. package/dist/git/worktree/query.d.ts +0 -43
  542. package/dist/git/worktree/query.js +0 -128
  543. package/dist/git/worktree/slug.d.ts +0 -11
  544. package/dist/git/worktree/slug.js +0 -58
  545. package/dist/git/worktree.d.ts +0 -1
  546. package/dist/git/worktree.js +0 -5
  547. package/dist/lsp/client.d.ts +0 -41
  548. package/dist/lsp/client.js +0 -186
  549. package/dist/lsp/manager.d.ts +0 -40
  550. package/dist/lsp/manager.js +0 -155
  551. package/dist/lsp/root-path.d.ts +0 -9
  552. package/dist/lsp/root-path.js +0 -12
  553. package/dist/lsp/servers.d.ts +0 -16
  554. package/dist/lsp/servers.js +0 -60
  555. package/dist/prompt/sections/coding.md +0 -35
  556. package/dist/quota/credentials.d.ts +0 -3
  557. package/dist/quota/credentials.js +0 -80
  558. package/dist/quota/index.d.ts +0 -36
  559. package/dist/quota/index.js +0 -155
  560. package/dist/quota/types.d.ts +0 -48
  561. package/dist/quota/types.js +0 -13
  562. package/dist/review/review-prompt.d.ts +0 -28
  563. package/dist/review/review-prompt.js +0 -81
  564. package/dist/state.d.ts +0 -160
  565. package/dist/state.js +0 -267
  566. package/dist/tool-system/builtin/apply-patch/applier.d.ts +0 -26
  567. package/dist/tool-system/builtin/apply-patch/applier.js +0 -308
  568. package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +0 -10
  569. package/dist/tool-system/builtin/apply-patch/backup-targets.js +0 -30
  570. package/dist/tool-system/builtin/apply-patch/index.d.ts +0 -20
  571. package/dist/tool-system/builtin/apply-patch/index.js +0 -105
  572. package/dist/tool-system/builtin/apply-patch/parser.d.ts +0 -17
  573. package/dist/tool-system/builtin/apply-patch/parser.js +0 -212
  574. package/dist/tool-system/builtin/apply-patch/seek-sequence.d.ts +0 -18
  575. package/dist/tool-system/builtin/apply-patch/seek-sequence.js +0 -123
  576. package/dist/tool-system/builtin/apply-patch/types.d.ts +0 -49
  577. package/dist/tool-system/builtin/apply-patch/types.js +0 -13
  578. package/dist/tool-system/builtin/arena.d.ts +0 -31
  579. package/dist/tool-system/builtin/arena.js +0 -416
  580. package/dist/tool-system/builtin/brief.d.ts +0 -6
  581. package/dist/tool-system/builtin/brief.js +0 -41
  582. package/dist/tool-system/builtin/check-quota.d.ts +0 -15
  583. package/dist/tool-system/builtin/check-quota.js +0 -34
  584. package/dist/tool-system/builtin/drive-claude-code.d.ts +0 -51
  585. package/dist/tool-system/builtin/drive-claude-code.js +0 -698
  586. package/dist/tool-system/builtin/lsp.d.ts +0 -7
  587. package/dist/tool-system/builtin/lsp.js +0 -144
  588. package/dist/tool-system/builtin/notebook-edit.d.ts +0 -7
  589. package/dist/tool-system/builtin/notebook-edit.js +0 -127
  590. package/dist/tool-system/builtin/worktree.d.ts +0 -11
  591. package/dist/tool-system/builtin/worktree.js +0 -363
  592. /package/dist/{external-agents → links}/types.js +0 -0
  593. /package/dist/{engine/session-usage.d.ts → session/usage.d.ts} +0 -0
  594. /package/dist/{engine/session-usage.js → session/usage.js} +0 -0
@@ -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
+ }