@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
@@ -5,7 +5,7 @@
5
5
  * Tier 2: LLM summary (async) — generate summary of older messages via model call
6
6
  * Tier 3: window compact (sync, emergency) — aggressive truncation fallback
7
7
  */
8
- import { estimateTokens, microcompact, dedupeFileReads, maskOldObservations, snipCompact, windowCompact, truncateToolResult, buildSummarizationPrompt, applySummaryCompaction, applyToolResultBudget, extractAnchoredSummary, } from "./compaction.js";
8
+ import { estimateTokens, microcompact, dedupeFileReads, maskOldObservations, snipCompact, windowCompact, truncateToolResult, buildSummarizationPrompt, applySummaryCompaction, applyToolResultBudget, extractAnchoredSummary, buildAnchoredSummaryMessage, extractReferencedFilePaths, } from "./compaction.js";
9
9
  import { applyToolResultPersistence, createContentReplacementState, reconstructContentReplacementState, resolveToolResultsDir, } from "./tool-result-storage.js";
10
10
  import { logger } from "../logging/logger.js";
11
11
  const DEFAULT_CONFIG = {
@@ -162,7 +162,7 @@ export class ContextManager {
162
162
  setSummarizeFn(fn) {
163
163
  this.summarizeFn = fn;
164
164
  }
165
- async trySummaryCompact(messages, before, logEvent) {
165
+ async trySummaryCompact(messages, before, logEvent, signal) {
166
166
  if (!this.summarizeFn || this.consecutiveSummaryFailures >= 3) {
167
167
  return { messages, tokens: before, compacted: false, noProgress: false };
168
168
  }
@@ -178,7 +178,7 @@ export class ContextManager {
178
178
  // re-summarizes from scratch.
179
179
  const priorSummary = extractAnchoredSummary(messages) ?? this.lastSummary;
180
180
  const prompt = buildSummarizationPrompt(messagesToSummarize, priorSummary);
181
- const summary = await this.summarizeFn(prompt);
181
+ const summary = await this.summarizeFn(prompt, signal);
182
182
  if (!summary || summary.length <= 50) {
183
183
  this.consecutiveSummaryFailures++;
184
184
  logger.warn("context.summary_failed", {
@@ -358,7 +358,7 @@ export class ContextManager {
358
358
  * Async context management — attempts LLM summarization before falling back.
359
359
  * Call this when you have access to the LLM (between turns).
360
360
  */
361
- async manageAsync(messages) {
361
+ async manageAsync(messages, signal) {
362
362
  let result = messages;
363
363
  // Tier 0a: Persist large tool_results to disk + replace with preview.
364
364
  result = this.persistLargeToolResults(result);
@@ -428,7 +428,7 @@ export class ContextManager {
428
428
  // Tier 2: LLM summary if approaching limit, or if micro was the only tier
429
429
  // available in the 0.70-0.85 band and it freed nothing.
430
430
  if (ratio >= this.config.compactAtRatio || shouldEscalateNoOpMicro) {
431
- const summarized = await this.trySummaryCompact(result, tokens, "context.summary_compact");
431
+ const summarized = await this.trySummaryCompact(result, tokens, "context.summary_compact", signal);
432
432
  result = summarized.messages;
433
433
  tokens = summarized.tokens;
434
434
  if (summarized.compacted) {
@@ -488,7 +488,7 @@ export class ContextManager {
488
488
  * a long-but-under-threshold text-only conversation (the /compact bug) still
489
489
  * gets summarized here.
490
490
  */
491
- async forceSummarize(messages) {
491
+ async forceSummarize(messages, signal) {
492
492
  let result = messages;
493
493
  // Tier 0: same waste-removal + micro as the automatic path.
494
494
  result = this.persistLargeToolResults(result);
@@ -505,7 +505,7 @@ export class ContextManager {
505
505
  let tokens = this.estimateTokensHybrid(result);
506
506
  // Unconditional LLM summary (no ratio gate).
507
507
  {
508
- const summarized = await this.trySummaryCompact(result, tokens, "context.force_summary_compact");
508
+ const summarized = await this.trySummaryCompact(result, tokens, "context.force_summary_compact", signal);
509
509
  result = summarized.messages;
510
510
  tokens = summarized.tokens;
511
511
  if (summarized.compacted)
@@ -529,6 +529,41 @@ export class ContextManager {
529
529
  }
530
530
  return result;
531
531
  }
532
+ /**
533
+ * Generic range archival: summarize a caller-chosen contiguous index window
534
+ * `[range.start, range.end)` into a single anchored summary message, leaving
535
+ * everything outside the window untouched. Unlike manage()/forceSummarize,
536
+ * the window is caller-specified, not derived from a pressure heuristic — the
537
+ * caller decides which span to collapse. Returns the input unchanged when no
538
+ * summarizeFn is set, when the (clamped) window is empty, or when the summary
539
+ * is empty/too short. The emitted summary uses the same anchored marker the
540
+ * rolling-summary path reads, so a later compaction can merge-update it.
541
+ */
542
+ async summarizeRange(messages, range, opts = {}) {
543
+ const start = Math.max(0, Math.min(range.start, messages.length));
544
+ const end = Math.max(start, Math.min(range.end, messages.length));
545
+ if (!this.summarizeFn || end - start < 1)
546
+ return messages;
547
+ const window = messages.slice(start, end);
548
+ // Feed a prior anchored summary back so the LLM merge-updates rather than
549
+ // re-summarizes from scratch, matching the rolling-summary behavior of
550
+ // trySummaryCompact().
551
+ const priorSummary = extractAnchoredSummary(messages) ?? this.lastSummary;
552
+ const prompt = buildSummarizationPrompt(window, priorSummary);
553
+ const summary = await this.summarizeFn(prompt, opts.signal);
554
+ if (!summary || summary.length <= 50)
555
+ return messages;
556
+ this.lastSummary = summary;
557
+ const summaryMessage = buildAnchoredSummaryMessage(summary, {
558
+ ...(this.transcriptPath ? { transcriptPath: this.transcriptPath } : {}),
559
+ referencedFiles: extractReferencedFilePaths(window),
560
+ });
561
+ const before = this.estimateTokensHybrid(messages);
562
+ const out = [...messages.slice(0, start), summaryMessage, ...messages.slice(end)];
563
+ const after = this.estimateTokensHybrid(out);
564
+ this.onCompact?.({ strategy: "range", before, after });
565
+ return out;
566
+ }
532
567
  /**
533
568
  * Persist large tool_result blocks to disk and replace them with a
534
569
  * preview + filepath. No-op when transcript path hasn't been set
@@ -15,6 +15,9 @@ const RATIOS = {
15
15
  mixed: 3.6, // Mixed content (typical for tool results)
16
16
  cjk: 1.5, // CJK characters: ~1.5 chars per token
17
17
  };
18
+ // Base64 is transport data, not text. A fixed vision estimate prevents large
19
+ // images from spuriously exhausting the text context window.
20
+ const IMAGE_TOKEN_ESTIMATE = 170;
18
21
  /**
19
22
  * Estimate token count for a string, detecting content type.
20
23
  */
@@ -80,12 +83,11 @@ function estimateBlockTokens(block) {
80
83
  if (block.name)
81
84
  tokens += estimateStringTokens(block.name);
82
85
  if (block.source?.data) {
83
- tokens += estimateStringTokens(block.source.media_type);
84
- tokens += estimateStringTokens(block.source.data);
86
+ tokens += IMAGE_TOKEN_ESTIMATE;
85
87
  }
86
88
  const maybeOpenAI = block;
87
89
  if (typeof maybeOpenAI.image_url?.url === "string") {
88
- tokens += estimateStringTokens(maybeOpenAI.image_url.url);
90
+ tokens += IMAGE_TOKEN_ESTIMATE;
89
91
  }
90
92
  return tokens;
91
93
  }
@@ -55,6 +55,12 @@ export declare function reconstructContentReplacementState(messages: Message[]):
55
55
  * transcript path. Layout: <transcriptDir>/tool-results/
56
56
  */
57
57
  export declare function resolveToolResultsDir(transcriptPath: string): string;
58
+ /**
59
+ * Convert an externally supplied tool_use_id to a bounded internal filename.
60
+ * The original id remains the key in ContentReplacementState/onPersist; it is
61
+ * never used as a path component.
62
+ */
63
+ export declare function safeToolResultFilename(toolUseId: string): string;
58
64
  interface PersistOptions {
59
65
  /** Per-result threshold; default DEFAULT_PERSIST_THRESHOLD. */
60
66
  perResultThreshold?: number;
@@ -22,7 +22,8 @@
22
22
  * parallel Read results), persist the largest ones first until under.
23
23
  */
24
24
  import { mkdirSync, writeFileSync } from "node:fs";
25
- import { dirname, join } from "node:path";
25
+ import { createHash } from "node:crypto";
26
+ import { dirname, isAbsolute, join, relative, resolve, sep, win32 } from "node:path";
26
27
  import { logger } from "../logging/logger.js";
27
28
  // ─── Tunables ───────────────────────────────────────────────────────
28
29
  /** Per-result threshold. Larger than this → persist + replace. */
@@ -77,12 +78,32 @@ function ensureDir(dir) {
77
78
  }
78
79
  }
79
80
  /**
80
- * Write content to <dir>/<toolUseId>.txt. Idempotent: skips if the file
81
- * already exists (tool_use_id is a UUID, content is deterministic per id).
81
+ * Convert an externally supplied tool_use_id to a bounded internal filename.
82
+ * The original id remains the key in ContentReplacementState/onPersist; it is
83
+ * never used as a path component.
82
84
  */
85
+ export function safeToolResultFilename(toolUseId) {
86
+ if (toolUseId.length > 256) {
87
+ throw new RangeError("tool_use_id exceeds the 256 character limit");
88
+ }
89
+ if (isAbsolute(toolUseId) ||
90
+ win32.isAbsolute(toolUseId) ||
91
+ toolUseId.includes("/") ||
92
+ toolUseId.includes("\\")) {
93
+ throw new Error("tool_use_id must not contain a path");
94
+ }
95
+ return `${createHash("sha256").update(toolUseId, "utf8").digest("hex")}.txt`;
96
+ }
97
+ /** Write content to the contained hashed path. Idempotent by original id. */
83
98
  function persistToFile(dir, toolUseId, content) {
99
+ const root = resolve(dir);
100
+ const filename = safeToolResultFilename(toolUseId);
101
+ const filepath = resolve(root, filename);
102
+ const rel = relative(root, filepath);
103
+ if (rel === ".." || rel.startsWith(`..${sep}`) || isAbsolute(rel)) {
104
+ throw new Error("tool_result path escaped its storage root");
105
+ }
84
106
  ensureDir(dir);
85
- const filepath = join(dir, `${toolUseId}.txt`);
86
107
  try {
87
108
  // 'wx' = fail if exists. Skipping on collision is correct: same id =
88
109
  // same content. Avoids re-writing the same bytes every turn.
@@ -1,4 +1,4 @@
1
- import type { Credential, CredentialType } from "./types.js";
1
+ import { type Credential, type CredentialType } from "./types.js";
2
2
  import type { SettingsScope } from "../settings/manager.js";
3
3
  import type { Transport } from "../protocol/transport.js";
4
4
  export type CredentialAccessScope = "full" | "project";
@@ -18,12 +18,23 @@ export interface CredentialAccess {
18
18
  listMasked(cwd: string | undefined, scope: CredentialAccessScope): CredentialMetadata[];
19
19
  resolveMeta(cwd: string | undefined, id: string, scope: CredentialAccessScope): CredentialMetadata | undefined;
20
20
  envExposures(cwd: string | undefined, scope: CredentialAccessScope): Record<string, string>;
21
+ /** Subscribe to host credential snapshot changes (desktop worker uses this to cancel in-flight Links). */
22
+ subscribe?(listener: () => void): () => void;
21
23
  resolveValue?(req: {
22
24
  cwd?: string;
23
25
  id: string;
24
26
  scope: CredentialAccessScope;
25
- purpose: "use" | "mcp";
27
+ purpose: "use" | "mcp" | "link";
26
28
  }): Promise<string>;
29
+ /** Resolve only the bearer material needed by an MCP request. */
30
+ resolveOAuthAccess?(req: {
31
+ id: string;
32
+ scope: "full";
33
+ forceRefresh?: boolean;
34
+ }): Promise<{
35
+ accessToken: string;
36
+ expiresAt?: string;
37
+ }>;
27
38
  materializeCookie?(req: {
28
39
  cwd?: string;
29
40
  id: string;
@@ -2,9 +2,11 @@ import { existsSync, readdirSync, rmSync, statSync, writeFileSync } from "node:f
2
2
  import { randomUUID } from "node:crypto";
3
3
  import { tmpdir } from "node:os";
4
4
  import { join } from "node:path";
5
+ import { credentialAllowsEnvExposure, credentialSecretHint, } from "./types.js";
5
6
  import { CredentialStore } from "./store.js";
6
7
  import { formatNetscapeCookies, parseCookieJar } from "./cookie-jar.js";
7
- import { summarizeOAuthCredentialSecret } from "./oauth.js";
8
+ import { parseOAuthCredentialSecret, isBrowserOAuthLinkCredential, resolveLinkCredentialAccessToken, shouldRefreshOAuthCredential, summarizeOAuthCredentialSecret, } from "./oauth.js";
9
+ import { refreshToken } from "../services/oauth.js";
8
10
  const COOKIE_FILE_PREFIX = "codeshell-cred-cookie-";
9
11
  const COOKIE_FILE_MAX_AGE_MS = 30 * 60 * 1000;
10
12
  let defaultCredentialAccess = null;
@@ -17,6 +19,7 @@ export function getCredentialAccess() {
17
19
  export function createIpcCredentialAccess(transport) {
18
20
  let snapshot = { revision: 0, entries: [] };
19
21
  let nextId = 1;
22
+ const subscribers = new Set();
20
23
  const pending = new Map();
21
24
  transport.onMessage((msg) => {
22
25
  if ("method" in msg && msg.method === "desktop/credentialSnapshot") {
@@ -26,6 +29,14 @@ export function createIpcCredentialAccess(transport) {
26
29
  revision: params.revision,
27
30
  entries: params.entries,
28
31
  };
32
+ for (const listener of subscribers) {
33
+ try {
34
+ listener();
35
+ }
36
+ catch {
37
+ // One consumer must not break the credential snapshot transport.
38
+ }
39
+ }
29
40
  }
30
41
  return;
31
42
  }
@@ -79,12 +90,26 @@ export function createIpcCredentialAccess(transport) {
79
90
  return {};
80
91
  return { ...(scope === "project" ? entry.envProject : entry.envFull) };
81
92
  },
93
+ subscribe(listener) {
94
+ subscribers.add(listener);
95
+ return () => subscribers.delete(listener);
96
+ },
82
97
  async resolveValue(req) {
83
98
  const result = (await request("desktop/credentialResolve", req));
84
99
  if (typeof result?.value !== "string")
85
100
  throw new Error(`credential "${req.id}" is unavailable`);
86
101
  return result.value;
87
102
  },
103
+ async resolveOAuthAccess(req) {
104
+ const result = (await request("desktop/oauthAccessResolve", req));
105
+ if (typeof result?.accessToken !== "string") {
106
+ throw new Error(`oauth credential "${req.id}" requires login`);
107
+ }
108
+ return {
109
+ accessToken: result.accessToken,
110
+ expiresAt: typeof result.expiresAt === "string" ? result.expiresAt : undefined,
111
+ };
112
+ },
88
113
  async materializeCookie(req) {
89
114
  const result = (await request("desktop/credentialMaterializeCookie", req));
90
115
  if (typeof result?.cookiesFile !== "string" || typeof result.count !== "number") {
@@ -106,9 +131,12 @@ function toMetadata(cred) {
106
131
  const { secret: _secret, ...rest } = cred;
107
132
  return {
108
133
  ...rest,
134
+ ...(credentialAllowsEnvExposure(cred.type) ? {} : { exposeAsEnv: undefined }),
109
135
  hasSecret: available,
110
- secretHint: available ? (secret.length > 4 ? `****${secret.slice(-4)}` : "****") : undefined,
111
- ...(cred.type === "oauth" ? { oauthStatus: summarizeOAuthCredentialSecret(secret) } : {}),
136
+ secretHint: available ? credentialSecretHint(cred.type, secret) : undefined,
137
+ ...(cred.type === "oauth" || isBrowserOAuthLinkCredential(cred)
138
+ ? { oauthStatus: summarizeOAuthCredentialSecret(secret) }
139
+ : {}),
112
140
  };
113
141
  }
114
142
  function cloneMetadata(list) {
@@ -129,6 +157,8 @@ export const localCredentialAccess = {
129
157
  const out = {};
130
158
  const creds = storeFor(cwd).list(scope);
131
159
  for (const cred of creds) {
160
+ if (!credentialAllowsEnvExposure(cred.type))
161
+ continue;
132
162
  const name = cred.exposeAsEnv?.trim();
133
163
  if (name && isCredentialSecretAvailable(cred.secret))
134
164
  out[name] = cred.secret;
@@ -140,7 +170,16 @@ export const localCredentialAccess = {
140
170
  if (!cred || !isCredentialSecretAvailable(cred.secret)) {
141
171
  throw new Error(`credential "${req.id}" is unavailable`);
142
172
  }
143
- return cred.secret;
173
+ if (req.purpose === "link" &&
174
+ (cred.type !== "link" ||
175
+ cred.meta?.linkExecutionRuntime !== "local" ||
176
+ !cred.meta.linkProvider)) {
177
+ throw new Error(`credential "${req.id}" is not a local Link credential`);
178
+ }
179
+ return req.purpose === "link" ? resolveLinkCredentialAccessToken(cred) : cred.secret;
180
+ },
181
+ async resolveOAuthAccess(req) {
182
+ return resolveLocalOAuthAccess(req.id, Boolean(req.forceRefresh));
144
183
  },
145
184
  async materializeCookie(req) {
146
185
  const cred = storeFor(req.cwd).resolve(req.id, req.scope);
@@ -150,6 +189,62 @@ export const localCredentialAccess = {
150
189
  return materializeCookieSecret(cred.id, cred.secret);
151
190
  },
152
191
  };
192
+ const localOAuthRefreshes = new Map();
193
+ async function resolveLocalOAuthAccess(id, forceRefresh) {
194
+ const store = new CredentialStore(undefined);
195
+ const cred = store.resolve(id, "full");
196
+ if (!cred || cred.type !== "oauth" || !isCredentialSecretAvailable(cred.secret)) {
197
+ throw new Error(`oauth credential "${id}" requires login`);
198
+ }
199
+ const parsed = parseOAuthCredentialSecret(cred.secret);
200
+ const decision = shouldRefreshOAuthCredential(parsed);
201
+ if (!forceRefresh && decision === "no") {
202
+ return { accessToken: parsed.accessToken, expiresAt: parsed.expiresAt };
203
+ }
204
+ if (!parsed.refreshToken || !parsed.tokenEndpoint || !parsed.clientId) {
205
+ throw new Error(`oauth credential "${id}" requires login`);
206
+ }
207
+ const inflight = localOAuthRefreshes.get(id);
208
+ if (inflight)
209
+ return inflight;
210
+ const pending = (async () => {
211
+ const latestCred = store.resolve(id, "full");
212
+ if (!latestCred || latestCred.type !== "oauth" || !latestCred.secret) {
213
+ throw new Error(`oauth credential "${id}" requires login`);
214
+ }
215
+ const latest = parseOAuthCredentialSecret(latestCred.secret);
216
+ if (!forceRefresh && shouldRefreshOAuthCredential(latest) === "no") {
217
+ return { accessToken: latest.accessToken, expiresAt: latest.expiresAt };
218
+ }
219
+ if (!latest.refreshToken || !latest.tokenEndpoint || !latest.clientId) {
220
+ throw new Error(`oauth credential "${id}" requires login`);
221
+ }
222
+ const tokens = await refreshToken({
223
+ clientId: latest.clientId,
224
+ clientSecret: latest.clientSecret,
225
+ tokenEndpoint: latest.tokenEndpoint,
226
+ authorizationEndpoint: "",
227
+ scopes: latest.scopes,
228
+ resource: latest.resource,
229
+ }, latest.refreshToken);
230
+ const next = {
231
+ ...latest,
232
+ accessToken: tokens.accessToken,
233
+ refreshToken: tokens.refreshToken ?? latest.refreshToken,
234
+ expiresAt: tokens.expiresAt ? new Date(tokens.expiresAt).toISOString() : undefined,
235
+ tokenType: tokens.tokenType,
236
+ scope: tokens.scope ?? latest.scope,
237
+ };
238
+ store.save("user", {
239
+ ...latestCred,
240
+ secret: JSON.stringify(next),
241
+ meta: { ...latestCred.meta, lastRefreshAt: new Date().toISOString() },
242
+ });
243
+ return { accessToken: next.accessToken, expiresAt: next.expiresAt };
244
+ })().finally(() => localOAuthRefreshes.delete(id));
245
+ localOAuthRefreshes.set(id, pending);
246
+ return pending;
247
+ }
153
248
  export function materializeCookieSecret(credentialId, secret) {
154
249
  const jar = parseCookieJar(secret);
155
250
  if (jar.length === 0)
@@ -2,8 +2,9 @@ export { CredentialStore } from "./store.js";
2
2
  export type { CredentialScope, MaskedCredential } from "./store.js";
3
3
  export { type EncryptionCipher, PlaintextCipher, setDefaultCredentialCipher, getDefaultCredentialCipher, } from "./cipher.js";
4
4
  export { getCredentialAccess, setDefaultCredentialAccess, createIpcCredentialAccess, localCredentialAccess, credentialAccessScope, isCredentialSecretAvailable, materializeCookieSecret, type CredentialAccess, type CredentialAccessScope, type CredentialMetadata, type CredentialSnapshot, type CredentialSnapshotEntry, } from "./access.js";
5
- export type { Credential, CredentialType, CredentialStoreFile, OAuthCredentialPublicStatus, OAuthCredentialSecret, } from "./types.js";
6
- export { buildOAuthRefreshRequest, isOAuthAccessTokenExpired, oauthCredentialStatus, parseOAuthCredentialSecret, summarizeOAuthCredentialSecret, type OAuthClockOptions, type OAuthRefreshHandler, type OAuthRefreshRequest, } from "./oauth.js";
5
+ export type { Credential, CredentialType, CredentialStoreFile, OAuthCredentialPublicStatus, OAuthCredentialSecret, OAuthTokenResponse, } from "./types.js";
6
+ export { credentialAllowsEnvExposure, credentialSecretHint } from "./types.js";
7
+ export { buildOAuthRefreshRequest, isBrowserOAuthLinkCredential, isOAuthAccessTokenExpired, oauthCredentialStatus, parseOAuthCredentialSecret, resolveLinkCredentialAccessToken, mergeOAuthTokenResponse, shouldRefreshOAuthCredential, summarizeOAuthCredentialSecret, type OAuthClockOptions, type OAuthRefreshHandler, type OAuthRefreshRequest, } from "./oauth.js";
7
8
  export { formatNetscapeCookies, parseCookieJar, type CookieLike } from "./cookie-jar.js";
8
9
  export { useCredentialToolDef, useCredentialToolDefFor, useCredentialTool, sweepStaleCredentialCookies, } from "./use-credential-tool.js";
9
10
  export { credentialUseGate } from "./use-gate.js";
@@ -1,7 +1,8 @@
1
1
  export { CredentialStore } from "./store.js";
2
2
  export { PlaintextCipher, setDefaultCredentialCipher, getDefaultCredentialCipher, } from "./cipher.js";
3
3
  export { getCredentialAccess, setDefaultCredentialAccess, createIpcCredentialAccess, localCredentialAccess, credentialAccessScope, isCredentialSecretAvailable, materializeCookieSecret, } from "./access.js";
4
- export { buildOAuthRefreshRequest, isOAuthAccessTokenExpired, oauthCredentialStatus, parseOAuthCredentialSecret, summarizeOAuthCredentialSecret, } from "./oauth.js";
4
+ export { credentialAllowsEnvExposure, credentialSecretHint } from "./types.js";
5
+ export { buildOAuthRefreshRequest, isBrowserOAuthLinkCredential, isOAuthAccessTokenExpired, oauthCredentialStatus, parseOAuthCredentialSecret, resolveLinkCredentialAccessToken, mergeOAuthTokenResponse, shouldRefreshOAuthCredential, summarizeOAuthCredentialSecret, } from "./oauth.js";
5
6
  export { formatNetscapeCookies, parseCookieJar } from "./cookie-jar.js";
6
7
  export { useCredentialToolDef, useCredentialToolDefFor, useCredentialTool, sweepStaleCredentialCookies, } from "./use-credential-tool.js";
7
8
  export { credentialUseGate } from "./use-gate.js";
@@ -1,4 +1,4 @@
1
- import type { OAuthCredentialPublicStatus, OAuthCredentialSecret } from "./types.js";
1
+ import type { Credential, OAuthCredentialPublicStatus, OAuthCredentialSecret, OAuthTokenResponse } from "./types.js";
2
2
  export interface OAuthClockOptions {
3
3
  now?: number | (() => number);
4
4
  skewMs?: number;
@@ -14,6 +14,14 @@ export interface OAuthRefreshRequest {
14
14
  }
15
15
  export type OAuthRefreshHandler = (req: OAuthRefreshRequest) => Promise<OAuthCredentialSecret>;
16
16
  export declare function parseOAuthCredentialSecret(secret: string): OAuthCredentialSecret;
17
+ export declare function isBrowserOAuthLinkCredential(credential: Pick<Credential, "type" | "meta">): boolean;
18
+ /** Return only the bearer token from a Link secret, never its refresh material. */
19
+ export declare function resolveLinkCredentialAccessToken(credential: Pick<Credential, "type" | "secret" | "meta">): string | undefined;
20
+ /** Merge and validate an OAuth token endpoint response without losing rotation state. */
21
+ export declare function mergeOAuthTokenResponse(previous: OAuthCredentialSecret | undefined, response: OAuthTokenResponse, opts?: {
22
+ now?: number;
23
+ }): OAuthCredentialSecret;
24
+ export declare function shouldRefreshOAuthCredential(secret: OAuthCredentialSecret, opts?: OAuthClockOptions): "no" | "refresh" | "login_required";
17
25
  export declare function isOAuthAccessTokenExpired(secret: Pick<OAuthCredentialSecret, "accessToken" | "expiresAt">, opts?: OAuthClockOptions): boolean;
18
26
  export declare function oauthCredentialStatus(secret: Pick<OAuthCredentialSecret, "accessToken" | "expiresAt">, opts?: OAuthClockOptions): Pick<OAuthCredentialPublicStatus, "state" | "expiresAt" | "expiresInMs">;
19
27
  export declare function buildOAuthRefreshRequest(credentialId: string, secret: OAuthCredentialSecret): OAuthRefreshRequest | undefined;
@@ -15,6 +15,17 @@ function optionalStringArray(value) {
15
15
  const out = value.filter((x) => typeof x === "string" && x.length > 0);
16
16
  return out.length > 0 ? out : undefined;
17
17
  }
18
+ function optionalFiniteNumber(value) {
19
+ if (value === undefined)
20
+ return undefined;
21
+ if (typeof value !== "number" || !Number.isFinite(value)) {
22
+ throw new Error("OAuth token response expires_in must be a finite non-negative number");
23
+ }
24
+ if (value < 0) {
25
+ throw new Error("OAuth token response expires_in must be a finite non-negative number");
26
+ }
27
+ return value;
28
+ }
18
29
  function parseExpiresAt(value) {
19
30
  if (!value)
20
31
  return undefined;
@@ -45,19 +56,87 @@ export function parseOAuthCredentialSecret(secret) {
45
56
  }
46
57
  const expiresAt = optionalString(raw.expiresAt);
47
58
  parseExpiresAt(expiresAt);
59
+ const refreshTokenExpiresAt = optionalString(raw.refreshTokenExpiresAt);
60
+ parseExpiresAt(refreshTokenExpiresAt);
61
+ const tokenType = optionalString(raw.tokenType);
62
+ if (tokenType && tokenType.toLowerCase() !== "bearer") {
63
+ throw new Error("OAuth credential tokenType must be Bearer");
64
+ }
48
65
  return {
49
66
  version: raw.version === 1 ? 1 : undefined,
50
67
  accessToken,
51
68
  refreshToken: optionalString(raw.refreshToken),
52
69
  expiresAt,
53
- tokenType: optionalString(raw.tokenType),
70
+ refreshTokenExpiresAt,
71
+ tokenType,
54
72
  scope: optionalString(raw.scope),
55
73
  scopes: optionalStringArray(raw.scopes),
56
74
  tokenEndpoint: optionalString(raw.tokenEndpoint),
57
75
  clientId: optionalString(raw.clientId),
58
76
  clientSecret: optionalString(raw.clientSecret),
77
+ issuer: optionalString(raw.issuer),
78
+ resource: optionalString(raw.resource),
79
+ revocationEndpoint: optionalString(raw.revocationEndpoint),
80
+ clientRegistration: raw.clientRegistration &&
81
+ typeof raw.clientRegistration === "object" &&
82
+ !Array.isArray(raw.clientRegistration) &&
83
+ optionalString(raw.clientRegistration.clientId)
84
+ ? {
85
+ clientId: optionalString(raw.clientRegistration.clientId),
86
+ clientSecret: optionalString(raw.clientRegistration.clientSecret),
87
+ clientIdIssuedAt: typeof raw.clientRegistration.clientIdIssuedAt ===
88
+ "number"
89
+ ? raw.clientRegistration.clientIdIssuedAt
90
+ : undefined,
91
+ clientSecretExpiresAt: typeof raw.clientRegistration.clientSecretExpiresAt ===
92
+ "number"
93
+ ? raw.clientRegistration
94
+ .clientSecretExpiresAt
95
+ : undefined,
96
+ }
97
+ : undefined,
98
+ };
99
+ }
100
+ export function isBrowserOAuthLinkCredential(credential) {
101
+ return credential.type === "link" && credential.meta?.linkAuthSource === "browser-oauth";
102
+ }
103
+ /** Return only the bearer token from a Link secret, never its refresh material. */
104
+ export function resolveLinkCredentialAccessToken(credential) {
105
+ if (!credential.secret)
106
+ return undefined;
107
+ return isBrowserOAuthLinkCredential(credential)
108
+ ? parseOAuthCredentialSecret(credential.secret).accessToken
109
+ : credential.secret;
110
+ }
111
+ /** Merge and validate an OAuth token endpoint response without losing rotation state. */
112
+ export function mergeOAuthTokenResponse(previous, response, opts = {}) {
113
+ const accessToken = optionalString(response.access_token);
114
+ if (!accessToken)
115
+ throw new Error("OAuth token response must include access_token");
116
+ const tokenType = optionalString(response.token_type) ?? "Bearer";
117
+ if (tokenType.toLowerCase() !== "bearer") {
118
+ throw new Error(`OAuth token response token_type must be Bearer`);
119
+ }
120
+ const expiresIn = optionalFiniteNumber(response.expires_in);
121
+ const now = opts.now ?? Date.now();
122
+ const responseScope = optionalString(response.scope);
123
+ const refreshToken = optionalString(response.refresh_token) ?? previous?.refreshToken;
124
+ return {
125
+ ...previous,
126
+ version: 1,
127
+ accessToken,
128
+ refreshToken,
129
+ expiresAt: expiresIn === undefined ? undefined : new Date(now + expiresIn * 1000).toISOString(),
130
+ tokenType: "Bearer",
131
+ scope: responseScope ?? previous?.scope,
132
+ scopes: responseScope ? responseScope.split(/\s+/).filter(Boolean) : previous?.scopes,
59
133
  };
60
134
  }
135
+ export function shouldRefreshOAuthCredential(secret, opts = {}) {
136
+ if (!isOAuthAccessTokenExpired(secret, opts))
137
+ return "no";
138
+ return secret.refreshToken && secret.tokenEndpoint ? "refresh" : "login_required";
139
+ }
61
140
  export function isOAuthAccessTokenExpired(secret, opts = {}) {
62
141
  const expiresAtMs = parseExpiresAt(secret.expiresAt);
63
142
  if (expiresAtMs === undefined)
@@ -1,4 +1,4 @@
1
- import type { Credential } from "./types.js";
1
+ import { type Credential } from "./types.js";
2
2
  import { type EncryptionCipher } from "./cipher.js";
3
3
  export type CredentialScope = "user" | "project";
4
4
  export interface MaskedCredential extends Omit<Credential, "secret"> {
@@ -13,6 +13,13 @@ export interface MaskedCredential extends Omit<Credential, "secret"> {
13
13
  */
14
14
  export declare class CredentialStore {
15
15
  private readonly cwd?;
16
+ /**
17
+ * Override the user-scope store directory (the `~/.code-shell` layer;
18
+ * `credentials.json` lives directly inside it). Absent → today's
19
+ * behavior: `join(userHome(), ".code-shell")` resolved per call.
20
+ * Injection point for identity-scoped server deployments.
21
+ */
22
+ private readonly userDirOverride?;
16
23
  private readonly cipher;
17
24
  /**
18
25
  * @param cwd project root for the project-scope store (undefined → user only).
@@ -22,7 +29,14 @@ export declare class CredentialStore {
22
29
  * returns PLAINTEXT secrets; encryption is applied only at the
23
30
  * disk boundary (read decrypts, write encrypts).
24
31
  */
25
- constructor(cwd?: string | undefined, cipher?: EncryptionCipher);
32
+ constructor(cwd?: string | undefined, cipher?: EncryptionCipher,
33
+ /**
34
+ * Override the user-scope store directory (the `~/.code-shell` layer;
35
+ * `credentials.json` lives directly inside it). Absent → today's
36
+ * behavior: `join(userHome(), ".code-shell")` resolved per call.
37
+ * Injection point for identity-scoped server deployments.
38
+ */
39
+ userDirOverride?: string | undefined);
26
40
  private pathFor;
27
41
  /**
28
42
  * Decrypt a stored secret to plaintext. A value this cipher can't decrypt