@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,283 @@
1
+ import { ToolExecutor } from "../tool-system/executor.js";
2
+ import { InvestigationGuard } from "../tool-system/investigation-guard.js";
3
+ import { TaskGuard } from "../tool-system/task-guard.js";
4
+ import { PermissionClassifier, InteractiveApprovalBackend } from "../tool-system/permission.js";
5
+ import { MCPManager } from "../tool-system/mcp-manager.js";
6
+ import { buildMcpToolPolicies, isRegisteredMcpToolAllowed, } from "../tool-system/mcp-tool-policy.js";
7
+ import { PLAN_MODE_ALLOWED_TOOLS } from "../tool-system/plan-mode-allowlist.js";
8
+ import { isFeatureEnabled } from "../settings/feature-flags.js";
9
+ import { applyDynamicToolDef } from "./dynamic-tool-defs.js";
10
+ /** engine.ts L1485-1522 —— ToolContext 组装(spawner、agentDefinitions、base 由调用方传入)。 */
11
+ export function buildRunToolContext(args) {
12
+ const { options, profile, profileParams } = args;
13
+ let pendingRunYield;
14
+ // sessionId is filled in after the session bundle is resolved below
15
+ // (the session may be cold-started or resumed). Until then this is
16
+ // intentionally shaped as a mutable local; we treat it as immutable
17
+ // after the assignment.
18
+ const toolCtx = {
19
+ ...args.base,
20
+ approvalRouter: options?.approvalRouter ?? args.configApprovalRouter,
21
+ permissionMode: args.runPermissionMode,
22
+ planMode: args.runPlanMode,
23
+ subAgentSpawner: args.subAgentSpawner,
24
+ agentDefinitions: args.agentDefinitions,
25
+ // Stamp the resolved network policy onto the backend the tools see so
26
+ // Bash can surface "网络 deny" on its result. Shallow-copy (don't mutate
27
+ // the cached backend) — `wrap`/`hintForBlockedOutput` are plain function
28
+ // properties and survive the spread. Off keeps network undefined.
29
+ sandbox: args.sandbox,
30
+ cwd: args.cwd,
31
+ shellEnv: args.shellEnv,
32
+ // TodoWrite reads this to push task_update events independently
33
+ // of its return value, so the UI's pinned task panel refreshes
34
+ // immediately rather than after the LLM next surfaces the
35
+ // snapshot. wrappedOnStream snoops the same channel to keep
36
+ // latestTodos current for TaskGuard.
37
+ streamCallback: options?.onStream,
38
+ setCwd(nextCwd) {
39
+ toolCtx.cwd = nextCwd;
40
+ },
41
+ runYield: {
42
+ request(reason) {
43
+ pendingRunYield ??= reason;
44
+ },
45
+ peek() {
46
+ return pendingRunYield;
47
+ },
48
+ consume() {
49
+ const reason = pendingRunYield;
50
+ pendingRunYield = undefined;
51
+ return reason;
52
+ },
53
+ },
54
+ };
55
+ if (profile?.allowedToolNames) {
56
+ toolCtx.allowedToolNames = profile.allowedToolNames;
57
+ }
58
+ if (profile?.createRunServices) {
59
+ toolCtx.runScopedServices = profile.createRunServices({
60
+ profileParams,
61
+ reportResult: (key, value) => {
62
+ args.reportResult(key, value);
63
+ },
64
+ });
65
+ }
66
+ return toolCtx;
67
+ }
68
+ /** engine.ts L1876-1933 —— 权限分类器 + 审批监听 + ToolExecutor + guards。 */
69
+ export function buildRunPermissionPipeline(args) {
70
+ const mode = args.mode;
71
+ const { rules: defaultRules, backend: approvalBackend } = args.permissionController.build(mode, args.cwd, args.approvalRouter);
72
+ const permission = new PermissionClassifier(defaultRules, mode, approvalBackend);
73
+ permission.setApprovalStateListener((waiting, toolName) => {
74
+ args.onApprovalPhase(waiting, toolName);
75
+ });
76
+ // Surface approval waits on the notification hook (fire-and-forget, like
77
+ // background-agent terminal states) so plugins / settings hooks can ping
78
+ // the user while a decision is pending.
79
+ permission.setApprovalEventListener((event) => {
80
+ args.emitNotificationHook({
81
+ kind: event.phase === "requested" ? "approval_requested" : "approval_resolved",
82
+ toolName: event.toolName,
83
+ riskLevel: event.riskLevel,
84
+ ...(event.approved !== undefined ? { approved: event.approved } : {}),
85
+ ...(event.sessionId ? { sessionId: event.sessionId } : {}),
86
+ });
87
+ });
88
+ args.permissionController.attach(permission, args.approvalRouter);
89
+ // If the backend is the interactive one, wire it for project-scope
90
+ // persistence: it needs cwd to find settings.local.json, and a callback
91
+ // to apply newly-saved rules to the live classifier so subsequent calls
92
+ // in this same session don't re-prompt. Headless/auto backends skip
93
+ // this — they don't prompt, so there are no project rules to persist.
94
+ if (approvalBackend instanceof InteractiveApprovalBackend) {
95
+ approvalBackend.setSessionContext(args.sessionId, {
96
+ cwd: args.cwd,
97
+ onProjectRules: (rules) => {
98
+ // Prepend the *full* accumulated list of session-saved project rules
99
+ // so user approvals win over defaults and earlier approvals aren't
100
+ // dropped when later ones come in.
101
+ permission.reconfigure(mode, approvalBackend, [...rules, ...defaultRules]);
102
+ },
103
+ });
104
+ }
105
+ const toolExecutor = new ToolExecutor(args.toolRegistry, permission, args.hooks);
106
+ const investigationGuard = new InvestigationGuard();
107
+ if (args.readOnlySession) {
108
+ investigationGuard.setPolicy("read-only-review");
109
+ }
110
+ else if (args.headless) {
111
+ investigationGuard.setSoftMode(true);
112
+ }
113
+ toolExecutor.setInvestigationGuard(investigationGuard);
114
+ toolExecutor.setTaskGuard(new TaskGuard(() => args.getLatestTodos()));
115
+ // Wire abort signal for cascading cancellation + per-Engine ToolContext
116
+ toolExecutor.setSignal(args.signal);
117
+ toolExecutor.setContext(args.toolCtx);
118
+ return { permission, toolExecutor };
119
+ }
120
+ /** engine.ts L1986-2003 —— MCP 连接(Runtime 池优先,回退 per-Engine)。 */
121
+ export async function connectRunMcp(args) {
122
+ // Connect MCP servers (if configured and not already connected).
123
+ // B1: prefer the Runtime-owned MCPManager so all sessions in a
124
+ // worker share one set of connections. Falling back to a
125
+ // per-Engine instance keeps the null-runtime path (tests, ad-hoc
126
+ // scripts) working.
127
+ const mcpServers = args.mcpServers;
128
+ const mcpDisabled = args.mcpDisabled;
129
+ if (!mcpDisabled && Object.keys(mcpServers).length > 0 && !args.getManager()) {
130
+ if (args.runtimePool) {
131
+ args.setManager(args.runtimePool);
132
+ }
133
+ else {
134
+ args.setManager(new MCPManager(args.toolRegistry));
135
+ }
136
+ await args.getManager().connectAll(mcpServers, args.engineForConnect, (event) => {
137
+ // Fire-and-forget onto the notification hook: hosts/plugins learn
138
+ // about MCP availability changes without polling the pool.
139
+ args.emitNotificationHook({
140
+ kind: event.type,
141
+ server: event.server,
142
+ ...(event.error ? { error: event.error } : {}),
143
+ });
144
+ });
145
+ }
146
+ }
147
+ /**
148
+ * Build the availability-guard context for a tool surface.
149
+ *
150
+ * Extracted from {@link assembleRunToolDefs} so it is callable on its own. It
151
+ * matters that this has exactly one implementation: the executor SKIPS its
152
+ * visibility gate when `toolCtx.toolVisibility` is absent, so a caller that
153
+ * forgets to populate it doesn't just under-expose tools — it makes host-gated
154
+ * tools callable in contexts their guards were written to exclude.
155
+ *
156
+ * Optional keys are omitted rather than set to `undefined`: guards use
157
+ * `!== true` / `?? 0` style checks, and an empty `sessionMessageTargets` must not
158
+ * read as "the host authorized targets".
159
+ */
160
+ export function buildToolVisibility(inputs) {
161
+ return {
162
+ cwd: inputs.cwd,
163
+ hasGoal: inputs.hasGoal,
164
+ ...(inputs.sessionId ? { sessionId: inputs.sessionId } : {}),
165
+ ...(inputs.settingsScope ? { settingsScope: inputs.settingsScope } : {}),
166
+ ...(inputs.host !== undefined ? { host: inputs.host } : {}),
167
+ ...(inputs.isSubAgent !== undefined ? { isSubAgent: inputs.isSubAgent } : {}),
168
+ ...(inputs.behaviorProfile !== undefined ? { behaviorProfile: inputs.behaviorProfile } : {}),
169
+ ...(inputs.sessionMessageTargets?.length
170
+ ? { sessionMessageTargets: inputs.sessionMessageTargets }
171
+ : {}),
172
+ ...(inputs.profileMeta ? { profileMeta: inputs.profileMeta } : {}),
173
+ };
174
+ }
175
+ /** engine.ts L2023-2145 —— builtin override / MCP 可见性 / feature flags / 动态 defs / plan-mode 过滤。
176
+ * 注意:本函数按原逻辑就地 mutate toolCtx(toolVisibility/disabledBuiltins/
177
+ * allowedMcpServers/mcpToolPolicies)。 */
178
+ export function assembleRunToolDefs(args) {
179
+ const { toolCtx } = args;
180
+ const guardCwd = args.guardCwd;
181
+ const toolVisibility = buildToolVisibility({
182
+ cwd: guardCwd,
183
+ hasGoal: args.hasRunnableGoal,
184
+ sessionId: toolCtx.sessionId,
185
+ settingsScope: args.settingsScope,
186
+ host: args.builtinToolHost,
187
+ isSubAgent: args.isSubAgent,
188
+ behaviorProfile: args.behaviorProfileId,
189
+ sessionMessageTargets: toolCtx.sessionMessages?.targets,
190
+ profileMeta: args.profileMeta,
191
+ });
192
+ toolCtx.toolVisibility = toolVisibility;
193
+ // #7: per-turn project builtin override. The toolRegistry's builtin tool
194
+ // SET is ctor-frozen (and may be shared via runtime), so a mid-session
195
+ // project override of a builtin can't rebuild the registry. But the tool
196
+ // LIST handed to the LLM is assembled fresh every turn, so we apply the
197
+ // override here: a builtin marked `off` for this cwd is HIDDEN from the
198
+ // turn's tool list (matching how skills/plugins/agents `off` apply
199
+ // mid-session via readDisabledLists). `on`/`inherit` keep whatever the
200
+ // registry already has — we can't re-add a tool the frozen registry omits,
201
+ // but `on` for a tool already present is a no-op (it stays). This makes a
202
+ // builtin toggle take effect on the NEXT message, like other capability
203
+ // kinds, without touching the registry.
204
+ const builtinOverride = args.builtinOverride;
205
+ // Turn `off` from a prompt-visibility filter into a real execution gate:
206
+ // collect the builtin tool names the override marks `off` and hand them to
207
+ // the executor (via the shared toolCtx the executor already holds a
208
+ // reference to, set at setContext above) so it rejects a call to a hidden
209
+ // builtin instead of running it from the still-populated registry.
210
+ if (builtinOverride) {
211
+ const registryNames = new Set(args.toolRegistry.getToolDefinitions().map((t) => t.name));
212
+ const disabledBuiltins = new Set(Object.keys(builtinOverride).filter((name) => builtinOverride[name] === "off" && registryNames.has(name)));
213
+ toolCtx.disabledBuiltins = disabledBuiltins;
214
+ }
215
+ // MCP tool exposure is per-SESSION even though the pool/registry are
216
+ // worker-shared (B1): a server connected by another project's session
217
+ // registers its tools into the SHARED registry, and without this filter
218
+ // they leaked into every session (e.g. chrome-devtools tools showing up
219
+ // in a project that never enabled the plugin). Keep an MCP tool only when
220
+ // its server is in THIS session's merged config.mcpServers — which
221
+ // already folds the project's capabilityOverrides. Gated on the config
222
+ // being present: engines without one (sub-agents, bare tests) have no
223
+ // MCP tools in their private registries anyway.
224
+ const allowedMcpServers = new Set(args.mcpDisabled
225
+ ? []
226
+ : Object.entries(args.mcpServers)
227
+ .filter(([, c]) => c.enabled !== false)
228
+ .map(([n]) => n));
229
+ toolCtx.allowedMcpServers = allowedMcpServers;
230
+ const mcpToolPolicies = buildMcpToolPolicies(args.mcpServers);
231
+ toolCtx.mcpToolPolicies = mcpToolPolicies;
232
+ const mcpVisible = (toolName) => {
233
+ const reg = args.toolRegistry.getTool(toolName);
234
+ return (reg?.source !== "mcp" ||
235
+ (allowedMcpServers.has(reg?.serverName ?? "") &&
236
+ isRegisteredMcpToolAllowed({
237
+ source: "mcp",
238
+ serverName: reg?.serverName,
239
+ mcpToolName: reg?.mcpToolName,
240
+ }, mcpToolPolicies)));
241
+ };
242
+ // Feature-flag visibility: a builtin mapped in TOOL_FEATURE_FLAGS is
243
+ // hidden when its flag resolves to false (default-on flags only hide when
244
+ // explicitly disabled, so zero regression out of the box). Read once per
245
+ // turn so flipping a flag in settings takes effect on the NEXT message,
246
+ // like the other capability kinds.
247
+ const featureFlags = args.featureFlags;
248
+ const allToolDefs = args
249
+ .applyBuiltinOverrideVisibility(args.toolRegistry.getToolDefinitions(), builtinOverride)
250
+ .filter((t) => mcpVisible(t.name))
251
+ .filter((t) => {
252
+ const guard = args.toolGuards.get(t.name);
253
+ return guard ? guard(toolVisibility) : true;
254
+ })
255
+ .filter((t) => {
256
+ const flag = args.toolFeatureFlags.get(t.name);
257
+ return flag ? isFeatureEnabled(featureFlags, flag) : true;
258
+ })
259
+ // Dynamic per-engine bits the static defs can't carry: the Agent tool's
260
+ // agent_type enum + listing, and the image/video provider names. See
261
+ // applyDynamicToolDef — forwarding only the Agent description (dropping
262
+ // its rebuilt inputSchema) used to strip the agent_type enum, so the
263
+ // model omitted agent_type and configured roles never applied.
264
+ // A builtin's own exposure.rewriteDefinition (run-scoped rewrites like
265
+ // DelegateWork's closed workspace enum) applies first.
266
+ .map((t) => {
267
+ const rewrite = args.toolRewriters.get(t.name);
268
+ return applyDynamicToolDef(rewrite ? rewrite(t, toolVisibility) : t, toolCtx.agentDefinitions, guardCwd);
269
+ });
270
+ // In plan mode, only expose read-only/planning tools so the model won't
271
+ // attempt writes. Shared with executor.ts's execution gate via
272
+ // PLAN_MODE_ALLOWED_TOOLS so what the model SEES and what the executor
273
+ // RUNS can't drift apart. (Bash is in the set; the executor additionally
274
+ // gates Bash to read-only commands at call time.)
275
+ const profileAllowedToolNames = args.profileAllowedToolNames;
276
+ const profileToolDefs = profileAllowedToolNames
277
+ ? allToolDefs.filter((tool) => profileAllowedToolNames.has(tool.name))
278
+ : allToolDefs;
279
+ const toolDefs = args.runPlanMode
280
+ ? profileToolDefs.filter((t) => PLAN_MODE_ALLOWED_TOOLS.has(t.name))
281
+ : profileToolDefs;
282
+ return toolDefs;
283
+ }
@@ -0,0 +1,139 @@
1
+ import type { SessionKind, StreamCallback, TokenUsage } from "../types.js";
2
+ import type { InputAttachmentMeta } from "../types.js";
3
+ import type { ApprovalRouter } from "../tool-system/permission.js";
4
+ import type { GoalConfig } from "../goal/lifecycle.js";
5
+ import type { EngineConfig, EngineResult } from "./types.js";
6
+ import type { LiveChildState } from "../tool-system/builtin/agent-registry.js";
7
+ import type { LegacyPetWorkspaceOption } from "../types.js";
8
+ import type { SessionMessageTarget } from "../session/session-message.js";
9
+ /**
10
+ * Open string id naming a registered {@link RunBehaviorProfile}. The literal
11
+ * "quickChatRestricted" (and, transitionally, "pet") remain valid values —
12
+ * the type is a string so hosts can register their own profiles.
13
+ */
14
+ export type RunBehaviorMode = string;
15
+ /**
16
+ * A named, domain-agnostic per-run behavior profile. Engine resolves at most
17
+ * one active profile per run (by behaviorMode or session kind) and applies
18
+ * its constraints generically — core carries no knowledge of what the
19
+ * profile is for. Product domains (e.g. the desktop Pet manager) define
20
+ * profile instances and register them via EngineConfig.behaviorProfiles or
21
+ * ExtensionModule.behaviorProfiles.
22
+ */
23
+ export interface RunBehaviorProfile {
24
+ id: string;
25
+ /** Appended to the system prompt after config.appendSystemPrompt. */
26
+ systemPromptAppend?: string;
27
+ /** Hard tool allowlist for the run (model visibility + execution gate). */
28
+ allowedToolNames?: ReadonlySet<string>;
29
+ /** When set, the run's permission mode is locked to this value. */
30
+ forcePermissionMode?: NonNullable<EngineConfig["permissionMode"]>;
31
+ /** When true, per-run planMode requests are ignored. */
32
+ disablePlanMode?: boolean;
33
+ /** When true, MCP servers are neither connected nor exposed for the run. */
34
+ disableMcp?: boolean;
35
+ /**
36
+ * Wrapper tag for host-provided runtime context injected at the system
37
+ * prompt tail (e.g. "pet-world"). Injection happens only when both this tag
38
+ * and profileParams.runtimeContext (a string) are present.
39
+ */
40
+ runtimeContextTag?: string;
41
+ /** Heading line above the runtime-context block. */
42
+ runtimeContextHeading?: string;
43
+ /**
44
+ * Per-run services injected into ToolContext.runScopedServices for tools
45
+ * that share the profile's domain conventions. reportResult(key, value)
46
+ * surfaces structured run output under EngineResult.extensions[profile.id].
47
+ */
48
+ createRunServices?: (opts: {
49
+ profileParams: Readonly<Record<string, unknown>>;
50
+ reportResult: (key: string, value: unknown) => void;
51
+ }) => Record<string, unknown>;
52
+ /**
53
+ * Per-run metadata exposed to builtin availability guards / definition
54
+ * rewriters via ToolVisibilityContext.profileMeta.
55
+ */
56
+ buildVisibilityMeta?: (profileParams: Readonly<Record<string, unknown>>) => Record<string, unknown> | undefined;
57
+ /** Auto-activate this profile for these persisted session kinds. */
58
+ activateForSessionKinds?: readonly string[];
59
+ }
60
+ export declare const QUICK_CHAT_RESTRICTED_SYSTEM_PROMPT = "# Side Conversation Boundary\n\nThis is a side conversation, not the main-thread task execution environment.\n- Treat all content before this boundary as reference history only. Do not proactively continue any earlier plan, task, or modification.\n- Default to answering the user's question directly. Use lightweight read-only exploration only when needed.\n- Do not modify files, git state, configuration, or permissions unless the user explicitly asks after this boundary (for example, \"Allow you to modify files, please help me...\" or \"Please directly edit...\"). When explicitly requested, use the normally available tools subject to the current permission and approval mode.\n- Sub-agents are disabled for this side conversation. Do not create or invoke sub-agents.";
61
+ /** The side-conversation restriction expressed as a generic behavior profile. */
62
+ export declare const QUICK_CHAT_RESTRICTED_PROFILE: RunBehaviorProfile;
63
+ export interface EngineRunOptions {
64
+ cwd?: string;
65
+ onStream?: StreamCallback;
66
+ signal?: AbortSignal;
67
+ sessionId?: string;
68
+ /** User-facing text persisted beside the full model-facing task. */
69
+ displayText?: string;
70
+ permissionMode?: NonNullable<EngineConfig["permissionMode"]>;
71
+ planMode?: boolean;
72
+ approvalRouter?: ApprovalRouter;
73
+ goal?: string | GoalConfig;
74
+ injected?: boolean;
75
+ clientMessageId?: string;
76
+ attachments?: InputAttachmentMeta[];
77
+ /** Named per-run behavior profile supplied by interactive product surfaces. */
78
+ behaviorMode?: RunBehaviorMode;
79
+ /**
80
+ * Generic per-run parameters consumed by the active behavior profile
81
+ * (createRunServices / buildVisibilityMeta / runtime-context injection).
82
+ * Never persisted; never part of `task`.
83
+ */
84
+ profileParams?: Record<string, unknown>;
85
+ /** Digital human bound to this Work Session; persisted on first use. */
86
+ workspaceProfile?: string;
87
+ /**
88
+ * Standing brief for this Session, injected as a system section every turn and
89
+ * persisted on first use (see SessionState.sessionBrief).
90
+ */
91
+ sessionBrief?: string;
92
+ /**
93
+ * Host-authorized Sessions in the same project that this run may message.
94
+ * The Engine validates the closed set against the source workspace
95
+ * before exposing it to the model.
96
+ */
97
+ sessionMessageTargets?: readonly SessionMessageTarget[];
98
+ /**
99
+ * @deprecated Compat alias for `profileParams.runtimeContext` — bounded host
100
+ * Pet world JSON; model-visible for this run, never persisted.
101
+ */
102
+ petRuntimeContext?: string;
103
+ /**
104
+ * @deprecated Compat alias for `profileParams.workspaces` — closed Workspace
105
+ * choices available to DelegateWork for this Pet turn.
106
+ */
107
+ petWorkspaces?: readonly LegacyPetWorkspaceOption[];
108
+ /** Durable classification requested only when creating a new session. */
109
+ kind?: SessionKind;
110
+ /** Trusted metadata for an interrupt redrive initiated by agent direction. */
111
+ agentDirection?: {
112
+ envelopeIds: string[];
113
+ correlationIds: string[];
114
+ };
115
+ /** Trusted child writer generation used to fence mailbox drains. */
116
+ runtimeGeneration?: number;
117
+ /** Trusted runtime-only progress events; never model/tool input. */
118
+ onAgentProgress?: (event: AgentRuntimeProgressEvent) => void;
119
+ }
120
+ export type AgentRuntimeProgressEvent = {
121
+ type: "phase";
122
+ phase: "starting" | "model" | "tool" | "waiting-permission" | "compacting" | "finalizing";
123
+ toolName?: string;
124
+ } | {
125
+ type: "usage";
126
+ usage: TokenUsage;
127
+ };
128
+ export interface ChildEngineRuntime {
129
+ run(task: string, options?: EngineRunOptions): Promise<EngineResult>;
130
+ setAgentControlStateListener(listener: ((state: LiveChildState) => void) | undefined): void;
131
+ setAgentDirectionsDeliveredListener?(listener: ((envelopeIds: string[]) => void) | undefined): void;
132
+ }
133
+ export interface ChildEngineRunner {
134
+ createChild?(config: EngineConfig): ChildEngineRuntime;
135
+ runChild(config: EngineConfig, task: string, options: Pick<EngineRunOptions, "signal" | "onStream" | "sessionId">): Promise<Pick<EngineResult, "text" | "sessionId" | "usage">>;
136
+ }
137
+ export interface RunScopedDisposer {
138
+ dispose(): void | Promise<void>;
139
+ }
@@ -0,0 +1,12 @@
1
+ export const QUICK_CHAT_RESTRICTED_SYSTEM_PROMPT = `# Side Conversation Boundary
2
+
3
+ This is a side conversation, not the main-thread task execution environment.
4
+ - Treat all content before this boundary as reference history only. Do not proactively continue any earlier plan, task, or modification.
5
+ - Default to answering the user's question directly. Use lightweight read-only exploration only when needed.
6
+ - Do not modify files, git state, configuration, or permissions unless the user explicitly asks after this boundary (for example, "Allow you to modify files, please help me..." or "Please directly edit..."). When explicitly requested, use the normally available tools subject to the current permission and approval mode.
7
+ - Sub-agents are disabled for this side conversation. Do not create or invoke sub-agents.`;
8
+ /** The side-conversation restriction expressed as a generic behavior profile. */
9
+ export const QUICK_CHAT_RESTRICTED_PROFILE = {
10
+ id: "quickChatRestricted",
11
+ systemPromptAppend: QUICK_CHAT_RESTRICTED_SYSTEM_PROMPT,
12
+ };
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Run-workspace resolution — the pre-session phase of Engine.runExclusive:
3
+ * pins session kind, resolves the switchable work-Session profile binding,
4
+ * behavior profile / permission mode / plan mode, workspace resume (with its
5
+ * two early-return shapes), and the effective cwd. Pure of Engine — everything
6
+ * arrives via the args object (run-setup.ts / run-image-input.ts style).
7
+ */
8
+ import type { SessionKind } from "../types.js";
9
+ import type { SessionManager } from "../session/session-manager.js";
10
+ import type { SettingsManager } from "../settings/manager.js";
11
+ import type { EngineConfig, EngineResult } from "./types.js";
12
+ import type { EngineRunOptions, RunBehaviorProfile } from "./run-types.js";
13
+ import { type RunProfileState } from "./run-setup.js";
14
+ /**
15
+ * Resolve the working directory for a run. Precedence for legacy sessions:
16
+ * options.cwd > resumed session's state.cwd > config.cwd > process.cwd()
17
+ * (Moved verbatim from engine.ts; engine.ts re-exports it for compatibility.)
18
+ */
19
+ export declare function resolveRunCwd(args: {
20
+ optionCwd?: string;
21
+ sessionCwd?: string;
22
+ configCwd?: string;
23
+ processCwd: string;
24
+ }): string;
25
+ export interface RunWorkspaceResolution {
26
+ sessionKind: SessionKind;
27
+ sessionWorkspaceProfile: string | undefined;
28
+ profile: RunBehaviorProfile | undefined;
29
+ profileParams: Readonly<Record<string, unknown>>;
30
+ runPermissionMode: NonNullable<EngineConfig["permissionMode"]>;
31
+ runPlanMode: boolean;
32
+ cwd: string;
33
+ profileState: RunProfileState;
34
+ }
35
+ export type ResolveRunWorkspaceResult = {
36
+ ok: true;
37
+ resolution: RunWorkspaceResolution;
38
+ } | {
39
+ ok: false;
40
+ result: EngineResult;
41
+ };
42
+ export declare function resolveRunWorkspace(args: {
43
+ options: EngineRunOptions | undefined;
44
+ sessionManager: Pick<SessionManager, "exists" | "readSessionKind" | "readSessionWorkspaceProfile" | "resolveSessionWorkspaceForResume" | "readSessionMainRoot">;
45
+ resolveBehaviorProfile: (sessionKind: string, behaviorMode: string | undefined) => RunBehaviorProfile | undefined;
46
+ configPermissionMode: EngineConfig["permissionMode"];
47
+ configCwd: string | undefined;
48
+ settings: SettingsManager;
49
+ processCwd: string;
50
+ }): Promise<ResolveRunWorkspaceResult>;
@@ -0,0 +1,114 @@
1
+ import { resolveRunProfileState } from "./run-setup.js";
2
+ /**
3
+ * Resolve the working directory for a run. Precedence for legacy sessions:
4
+ * options.cwd > resumed session's state.cwd > config.cwd > process.cwd()
5
+ * (Moved verbatim from engine.ts; engine.ts re-exports it for compatibility.)
6
+ */
7
+ export function resolveRunCwd(args) {
8
+ return args.optionCwd ?? args.sessionCwd ?? args.configCwd ?? args.processCwd;
9
+ }
10
+ export async function resolveRunWorkspace(args) {
11
+ const { options } = args;
12
+ const persistedSessionKind = options?.sessionId && args.sessionManager.exists(options.sessionId)
13
+ ? args.sessionManager.readSessionKind(options.sessionId)
14
+ : undefined;
15
+ if (persistedSessionKind !== undefined &&
16
+ options?.kind !== undefined &&
17
+ persistedSessionKind !== options.kind) {
18
+ throw new Error(`session kind mismatch: persisted ${persistedSessionKind}, requested ${options.kind}`);
19
+ }
20
+ const sessionKind = persistedSessionKind ?? options?.kind ?? "work";
21
+ const persistedWorkspaceProfile = options?.sessionId && args.sessionManager.exists(options.sessionId)
22
+ ? args.sessionManager.readSessionWorkspaceProfile(options.sessionId)
23
+ : undefined;
24
+ const sessionWorkspaceProfile = options?.workspaceProfile ?? persistedWorkspaceProfile;
25
+ if (sessionKind !== "work" && sessionWorkspaceProfile) {
26
+ throw new Error(`session kind ${sessionKind} cannot bind a workspace profile`);
27
+ }
28
+ const profile = args.resolveBehaviorProfile(sessionKind, options?.behaviorMode);
29
+ // Normalize per-run profile parameters. The legacy pet-named run options
30
+ // fold into the generic bag (runtimeContext / workspaces) so existing
31
+ // hosts keep working; an explicit profileParams entry wins on key clash.
32
+ const profileParams = {
33
+ ...(options?.petRuntimeContext !== undefined
34
+ ? { runtimeContext: options.petRuntimeContext }
35
+ : {}),
36
+ ...(options?.petWorkspaces !== undefined ? { workspaces: options.petWorkspaces } : {}),
37
+ ...(options?.profileParams ?? {}),
38
+ };
39
+ const planModeDisabled = profile?.disablePlanMode === true;
40
+ let runPermissionMode = profile?.forcePermissionMode ??
41
+ options?.permissionMode ??
42
+ args.configPermissionMode ??
43
+ "acceptEdits";
44
+ if (!planModeDisabled && options?.planMode === true) {
45
+ runPermissionMode = "plan";
46
+ }
47
+ else if (!planModeDisabled && options?.planMode === false && runPermissionMode === "plan") {
48
+ runPermissionMode = "acceptEdits";
49
+ }
50
+ const runPlanMode = runPermissionMode === "plan";
51
+ const workspaceResume = options?.sessionId && args.sessionManager.exists(options.sessionId)
52
+ ? await args.sessionManager.resolveSessionWorkspaceForResume(options.sessionId)
53
+ : undefined;
54
+ if (workspaceResume && !workspaceResume.ok) {
55
+ return {
56
+ ok: false,
57
+ result: {
58
+ text: `ERROR: ${workspaceResume.message}`,
59
+ reason: "completed",
60
+ sessionId: options.sessionId,
61
+ turnCount: 0,
62
+ usage: { promptTokens: 0, completionTokens: 0, totalTokens: 0 },
63
+ },
64
+ };
65
+ }
66
+ if (workspaceResume?.ok &&
67
+ workspaceResume.reason === "worktree_missing_branch_gone" &&
68
+ workspaceResume.message) {
69
+ return {
70
+ ok: false,
71
+ result: {
72
+ text: workspaceResume.message,
73
+ reason: "completed",
74
+ sessionId: options.sessionId,
75
+ turnCount: 0,
76
+ usage: { promptTokens: 0, completionTokens: 0, totalTokens: 0 },
77
+ },
78
+ };
79
+ }
80
+ // Existing P1 sessions resolve cwd from SessionWorkspace, even if the host
81
+ // passes a stale cwd. Legacy sessions without workspace keep the historical
82
+ // explicit-cwd precedence for backward compatibility.
83
+ const workspaceCwd = workspaceResume?.ok && workspaceResume.reason !== "legacy" ? workspaceResume.cwd : undefined;
84
+ const sessionCwd = workspaceCwd === undefined && options?.cwd === undefined && options?.sessionId
85
+ ? workspaceResume?.ok
86
+ ? workspaceResume.cwd
87
+ : args.sessionManager.readSessionMainRoot(options.sessionId)
88
+ : undefined;
89
+ const cwd = workspaceCwd ??
90
+ resolveRunCwd({
91
+ optionCwd: options?.cwd,
92
+ sessionCwd,
93
+ configCwd: args.configCwd,
94
+ processCwd: args.processCwd,
95
+ });
96
+ const profileState = resolveRunProfileState({
97
+ sessionWorkspaceProfile,
98
+ cwd,
99
+ settings: args.settings,
100
+ });
101
+ return {
102
+ ok: true,
103
+ resolution: {
104
+ sessionKind,
105
+ sessionWorkspaceProfile,
106
+ profile,
107
+ profileParams,
108
+ runPermissionMode,
109
+ runPlanMode,
110
+ cwd,
111
+ profileState,
112
+ },
113
+ };
114
+ }
@@ -5,9 +5,10 @@
5
5
  * resolves the aux client and wiring; this only does the LLM call + cleanup.
6
6
  */
7
7
  import type { LLMClientBase } from "../llm/client-base.js";
8
+ import type { TokenUsage } from "../types.js";
8
9
  /**
9
10
  * Ask the aux client for a one-line title from the first user message + first
10
11
  * assistant reply. Returns the cleaned title, or null on any failure / empty
11
12
  * output (caller treats null as "keep existing title").
12
13
  */
13
- export declare function buildSessionTitle(client: LLMClientBase, firstUserText: string, firstAssistantText: string): Promise<string | null>;
14
+ export declare function buildSessionTitle(client: LLMClientBase, firstUserText: string, firstAssistantText: string, recordBilledUsage?: (usage: TokenUsage) => void): Promise<string | null>;
@@ -13,7 +13,7 @@ function clean(raw) {
13
13
  * assistant reply. Returns the cleaned title, or null on any failure / empty
14
14
  * output (caller treats null as "keep existing title").
15
15
  */
16
- export async function buildSessionTitle(client, firstUserText, firstAssistantText) {
16
+ export async function buildSessionTitle(client, firstUserText, firstAssistantText, recordBilledUsage) {
17
17
  try {
18
18
  const prompt = `User: ${firstUserText.slice(0, 2000)}\n\n` +
19
19
  `Assistant: ${firstAssistantText.slice(0, 2000)}\n\n` +
@@ -23,8 +23,11 @@ export async function buildSessionTitle(client, firstUserText, firstAssistantTex
23
23
  messages: [{ role: "user", content: prompt }],
24
24
  tools: [],
25
25
  maxTokens: 64,
26
+ requestVisible: false,
26
27
  reasoning: { mode: "off" },
27
28
  });
29
+ if (resp.usage)
30
+ recordBilledUsage?.(resp.usage);
28
31
  const title = clean(resp.text ?? "");
29
32
  return title.length > 0 ? title : null;
30
33
  }
@@ -6,7 +6,7 @@
6
6
  * it. Pure + side-effect-free so it unit-tests without the Engine/TurnLoop
7
7
  * harness (same rationale as the renderer's queuedInput.ts).
8
8
  */
9
- import type { InputAttachmentMeta } from "../protocol/types.js";
9
+ import type { InputAttachmentMeta } from "../types.js";
10
10
  export interface SteerItem {
11
11
  id: string;
12
12
  text: string;