@cjhyy/code-shell-core 0.7.0 → 0.8.0

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