@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
@@ -1,81 +1,212 @@
1
- /**
2
- * OAuth service OAuth 2.0 authorization code flow with PKCE.
3
- *
4
- * Supports browser-based login flow for API authentication.
5
- */
1
+ /** OAuth 2.0 authorization-code + PKCE primitives for host applications. */
2
+ import { createHash, randomBytes } from "node:crypto";
6
3
  import { createServer } from "node:http";
7
- import { randomBytes, createHash } from "node:crypto";
8
- import { execFile } from "node:child_process";
9
- import { browserOpenCommand } from "./browser-open.js";
4
+ import { mergeOAuthTokenResponse } from "../credentials/oauth.js";
5
+ const OAUTH_REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308]);
6
+ function normalizedHostname(hostname) {
7
+ return hostname
8
+ .replace(/^\[|\]$/g, "")
9
+ .replace(/\.$/, "")
10
+ .toLowerCase();
11
+ }
12
+ function ipv4Octets(hostname) {
13
+ const parts = normalizedHostname(hostname).split(".");
14
+ if (parts.length !== 4 || parts.some((part) => !/^\d{1,3}$/.test(part)))
15
+ return undefined;
16
+ const octets = parts.map(Number);
17
+ return octets.every((part) => part >= 0 && part <= 255) ? octets : undefined;
18
+ }
19
+ function isLoopbackHostname(hostname) {
20
+ const host = normalizedHostname(hostname);
21
+ const octets = ipv4Octets(host);
22
+ return host === "localhost" || host === "::1" || Boolean(octets && octets[0] === 127);
23
+ }
24
+ function isPrivateNetworkHostname(hostname) {
25
+ const host = normalizedHostname(hostname);
26
+ const octets = ipv4Octets(host);
27
+ if (octets) {
28
+ const [a, b] = octets;
29
+ return (a === 0 ||
30
+ a === 10 ||
31
+ (a === 100 && b >= 64 && b <= 127) ||
32
+ (a === 169 && b === 254) ||
33
+ (a === 172 && b >= 16 && b <= 31) ||
34
+ (a === 192 && b === 168) ||
35
+ (a === 198 && (b === 18 || b === 19)));
36
+ }
37
+ if (!host.includes(":"))
38
+ return false;
39
+ return host === "::" || host.startsWith("fc") || host.startsWith("fd") || /^fe[89ab]/.test(host);
40
+ }
41
+ function validateOAuthRequestUrl(url) {
42
+ if (url.username || url.password)
43
+ throw new Error("OAuth endpoint must not include credentials");
44
+ const loopback = isLoopbackHostname(url.hostname);
45
+ if (url.protocol !== "https:" && !(url.protocol === "http:" && loopback)) {
46
+ throw new Error("OAuth endpoint must use HTTPS (HTTP is allowed only for localhost)");
47
+ }
48
+ if (!loopback && isPrivateNetworkHostname(url.hostname)) {
49
+ throw new Error("OAuth endpoint must not target a private network address");
50
+ }
51
+ }
10
52
  /**
11
- * Generate PKCE code verifier and challenge.
53
+ * Wrap fetch with OAuth-specific redirect handling. Every hop is validated;
54
+ * POST/Authorization requests never cross origins, so authorization codes,
55
+ * verifiers, refresh tokens, client secrets, and revocation tokens cannot be
56
+ * forwarded by an upstream 30x response.
12
57
  */
13
- function generatePKCE() {
58
+ export function createHardenedOAuthFetch(baseFetch = fetch, options = {}) {
59
+ const maxRedirects = Math.max(0, Math.min(10, options.maxRedirects ?? 5));
60
+ return (async (input, init) => {
61
+ // Bun and Node's undici declarations currently expose incompatible global
62
+ // Request overloads even though both accept the standard fetch input at
63
+ // runtime. Keep that ambient type conflict contained at this boundary.
64
+ const initial = new Request(input, init);
65
+ let currentUrl = new URL(initial.url);
66
+ const initialLoopback = isLoopbackHostname(currentUrl.hostname);
67
+ let method = initial.method.toUpperCase();
68
+ let headers = new Headers(initial.headers);
69
+ let body = method === "GET" || method === "HEAD"
70
+ ? undefined
71
+ : new Uint8Array(await initial.clone().arrayBuffer());
72
+ const secretBearing = (method !== "GET" && method !== "HEAD") || headers.has("authorization");
73
+ for (let redirectCount = 0;; redirectCount++) {
74
+ validateOAuthRequestUrl(currentUrl);
75
+ const request = new Request(currentUrl.toString(), {
76
+ method,
77
+ headers,
78
+ body: body ? body.slice() : undefined,
79
+ redirect: "manual",
80
+ signal: initial.signal,
81
+ });
82
+ const response = await baseFetch(request);
83
+ if (!OAUTH_REDIRECT_STATUSES.has(response.status))
84
+ return response;
85
+ const location = response.headers.get("location");
86
+ if (!location)
87
+ return response;
88
+ if (redirectCount >= maxRedirects)
89
+ throw new Error("OAuth redirect limit exceeded");
90
+ const nextUrl = new URL(location, currentUrl);
91
+ validateOAuthRequestUrl(nextUrl);
92
+ if (!initialLoopback && isLoopbackHostname(nextUrl.hostname)) {
93
+ throw new Error("OAuth redirect to a local network target is not allowed");
94
+ }
95
+ if (secretBearing && nextUrl.origin !== currentUrl.origin) {
96
+ throw new Error("OAuth secret-bearing request refused a cross-origin redirect");
97
+ }
98
+ if (response.status === 303 ||
99
+ ((response.status === 301 || response.status === 302) && method === "POST")) {
100
+ method = "GET";
101
+ body = undefined;
102
+ headers = new Headers(headers);
103
+ headers.delete("content-type");
104
+ headers.delete("content-length");
105
+ }
106
+ currentUrl = nextUrl;
107
+ }
108
+ });
109
+ }
110
+ export function generatePKCE() {
14
111
  const verifier = randomBytes(32).toString("base64url");
15
112
  const challenge = createHash("sha256").update(verifier).digest("base64url");
16
113
  return { verifier, challenge };
17
114
  }
18
- /**
19
- * Open a URL in the system browser.
20
- */
21
- function openBrowser(url) {
22
- // execFile with an argv array — no shell, so the URL can't be interpreted.
23
- const { cmd, args } = browserOpenCommand(process.platform, url);
24
- execFile(cmd, args, () => { });
115
+ function tokensFromSecret(secret) {
116
+ return {
117
+ accessToken: secret.accessToken,
118
+ refreshToken: secret.refreshToken,
119
+ expiresAt: secret.expiresAt ? Date.parse(secret.expiresAt) : undefined,
120
+ tokenType: secret.tokenType ?? "Bearer",
121
+ scope: secret.scope,
122
+ };
123
+ }
124
+ function callbackSettings(config, options) {
125
+ const host = options.callbackHost ?? "127.0.0.1";
126
+ if (!config.redirectUri) {
127
+ return { host, port: options.callbackPort ?? 0, path: "/callback" };
128
+ }
129
+ const redirect = new URL(config.redirectUri);
130
+ if (redirect.protocol !== "http:" ||
131
+ (redirect.hostname !== "127.0.0.1" && redirect.hostname !== "localhost")) {
132
+ throw new Error("OAuth redirectUri must be an HTTP loopback URL");
133
+ }
134
+ const port = options.callbackPort ?? Number(redirect.port || "80");
135
+ return {
136
+ host,
137
+ port,
138
+ path: redirect.pathname || "/callback",
139
+ fixedRedirect: options.callbackPort === undefined ? redirect.toString() : undefined,
140
+ };
25
141
  }
26
142
  /**
27
- * Run the OAuth authorization code flow.
28
- * Opens a browser for user login and waits for the callback.
143
+ * Run an OAuth authorization-code flow. The host owns browser launching and
144
+ * injects `openExternal`; core only listens on an ephemeral loopback port.
29
145
  */
30
- export async function authorize(config) {
146
+ export async function authorize(config, options = {}) {
147
+ if (options.signal?.aborted)
148
+ throw new Error("OAuth authorization aborted");
149
+ const callback = callbackSettings(config, options);
31
150
  const { verifier, challenge } = generatePKCE();
32
151
  const state = randomBytes(16).toString("hex");
33
- const port = 18910 + Math.floor(Math.random() * 100);
34
- const redirectUri = config.redirectUri ?? `http://localhost:${port}/callback`;
35
- // Build authorization URL
36
- const params = new URLSearchParams({
37
- response_type: "code",
38
- client_id: config.clientId,
39
- redirect_uri: redirectUri,
40
- state,
41
- code_challenge: challenge,
42
- code_challenge_method: "S256",
43
- });
44
- if (config.scopes?.length) {
45
- params.set("scope", config.scopes.join(" "));
46
- }
47
- const authUrl = `${config.authorizationEndpoint}?${params.toString()}`;
152
+ const fetchFn = createHardenedOAuthFetch(options.fetch ?? fetch);
153
+ const openExternal = options.openExternal;
154
+ if (!openExternal)
155
+ throw new Error("OAuth authorize requires an openExternal host callback");
48
156
  return new Promise((resolve, reject) => {
49
- const timeout = setTimeout(() => {
50
- server.close();
51
- reject(new Error("OAuth authorization timed out (120s)"));
52
- }, 120_000);
157
+ let settled = false;
158
+ let timer;
159
+ let redirectUri = "";
160
+ const cleanup = () => {
161
+ if (timer)
162
+ clearTimeout(timer);
163
+ options.signal?.removeEventListener("abort", onAbort);
164
+ if (server.listening)
165
+ server.close();
166
+ };
167
+ const fail = (err) => {
168
+ if (settled)
169
+ return;
170
+ settled = true;
171
+ cleanup();
172
+ reject(err instanceof Error ? err : new Error(String(err)));
173
+ };
174
+ const succeed = (tokens) => {
175
+ if (settled)
176
+ return;
177
+ settled = true;
178
+ cleanup();
179
+ resolve(tokens);
180
+ };
181
+ const onAbort = () => fail(new Error("OAuth authorization aborted"));
53
182
  const server = createServer(async (req, res) => {
54
- if (!req.url?.startsWith("/callback")) {
183
+ const requestUrl = new URL(req.url ?? "/", redirectUri || "http://127.0.0.1");
184
+ if (requestUrl.pathname !== callback.path) {
55
185
  res.writeHead(404);
56
186
  res.end("Not found");
57
187
  return;
58
188
  }
59
- const url = new URL(req.url, `http://localhost:${port}`);
60
- const code = url.searchParams.get("code");
61
- const returnedState = url.searchParams.get("state");
62
- const error = url.searchParams.get("error");
63
- clearTimeout(timeout);
64
- if (error) {
65
- res.writeHead(200, { "Content-Type": "text/html" });
66
- res.end("<html><body><h1>Authorization failed</h1><p>You can close this window.</p></body></html>");
67
- server.close();
68
- reject(new Error(`OAuth error: ${error}`));
189
+ const returnedState = requestUrl.searchParams.get("state");
190
+ const code = requestUrl.searchParams.get("code");
191
+ const oauthError = requestUrl.searchParams.get("error");
192
+ if (returnedState !== state) {
193
+ res.writeHead(400, { "Content-Type": "text/html; charset=utf-8" });
194
+ res.end("<h1>Invalid OAuth callback</h1><p>You can close this window.</p>");
195
+ fail(new Error("Invalid OAuth callback: state mismatch"));
69
196
  return;
70
197
  }
71
- if (!code || returnedState !== state) {
72
- res.writeHead(400, { "Content-Type": "text/html" });
73
- res.end("<html><body><h1>Invalid callback</h1></body></html>");
74
- server.close();
75
- reject(new Error("Invalid OAuth callback: missing code or state mismatch"));
198
+ if (oauthError) {
199
+ res.writeHead(200, { "Content-Type": "text/html; charset=utf-8" });
200
+ res.end("<h1>Authorization was not completed</h1><p>You can close this window.</p>");
201
+ fail(new Error(oauthError === "access_denied" ? "OAuth access denied" : "OAuth failed"));
202
+ return;
203
+ }
204
+ if (!code) {
205
+ res.writeHead(400, { "Content-Type": "text/html; charset=utf-8" });
206
+ res.end("<h1>Invalid OAuth callback</h1><p>You can close this window.</p>");
207
+ fail(new Error("Invalid OAuth callback: missing code"));
76
208
  return;
77
209
  }
78
- // Exchange code for tokens
79
210
  try {
80
211
  const tokenParams = new URLSearchParams({
81
212
  grant_type: "authorization_code",
@@ -84,68 +215,75 @@ export async function authorize(config) {
84
215
  client_id: config.clientId,
85
216
  code_verifier: verifier,
86
217
  });
87
- const tokenRes = await fetch(config.tokenEndpoint, {
218
+ if (config.clientSecret)
219
+ tokenParams.set("client_secret", config.clientSecret);
220
+ if (config.resource)
221
+ tokenParams.set("resource", config.resource);
222
+ const tokenRes = await fetchFn(config.tokenEndpoint, {
88
223
  method: "POST",
89
224
  headers: { "Content-Type": "application/x-www-form-urlencoded" },
90
225
  body: tokenParams.toString(),
226
+ signal: options.signal,
91
227
  });
92
228
  if (!tokenRes.ok) {
93
- throw new Error(`Token exchange failed: ${tokenRes.status} ${await tokenRes.text()}`);
229
+ throw new Error(`OAuth token exchange failed (${tokenRes.status})`);
94
230
  }
95
- const data = (await tokenRes.json());
96
- const tokens = {
97
- accessToken: data.access_token,
98
- refreshToken: data.refresh_token,
99
- expiresAt: data.expires_in
100
- ? Date.now() + data.expires_in * 1000
101
- : undefined,
102
- tokenType: data.token_type ?? "Bearer",
103
- };
104
- res.writeHead(200, { "Content-Type": "text/html" });
105
- res.end("<html><body><h1>Authorization successful!</h1><p>You can close this window.</p></body></html>");
106
- server.close();
107
- resolve(tokens);
231
+ const secret = mergeOAuthTokenResponse(undefined, (await tokenRes.json()));
232
+ res.writeHead(200, { "Content-Type": "text/html; charset=utf-8" });
233
+ res.end("<h1>Authorization successful</h1><p>You can close this window.</p>");
234
+ succeed(tokensFromSecret(secret));
108
235
  }
109
236
  catch (err) {
110
- res.writeHead(500, { "Content-Type": "text/html" });
111
- res.end("<html><body><h1>Token exchange failed</h1></body></html>");
112
- server.close();
113
- reject(err);
237
+ res.writeHead(500, { "Content-Type": "text/html; charset=utf-8" });
238
+ res.end("<h1>Token exchange failed</h1><p>You can close this window.</p>");
239
+ fail(err);
114
240
  }
115
241
  });
116
- server.listen(port, () => {
117
- openBrowser(authUrl);
118
- });
119
- server.on("error", (err) => {
120
- clearTimeout(timeout);
121
- reject(new Error(`OAuth server error: ${err.message}`));
242
+ options.signal?.addEventListener("abort", onAbort, { once: true });
243
+ server.once("error", (err) => fail(new Error(`OAuth callback server failed: ${err.message}`)));
244
+ server.listen(callback.port, callback.host, () => {
245
+ const address = server.address();
246
+ if (!address || typeof address === "string") {
247
+ fail(new Error("OAuth callback server did not expose a loopback port"));
248
+ return;
249
+ }
250
+ redirectUri =
251
+ callback.fixedRedirect ?? `http://${callback.host}:${address.port}${callback.path}`;
252
+ const authUrl = new URL(config.authorizationEndpoint);
253
+ authUrl.searchParams.set("response_type", "code");
254
+ authUrl.searchParams.set("client_id", config.clientId);
255
+ authUrl.searchParams.set("redirect_uri", redirectUri);
256
+ authUrl.searchParams.set("state", state);
257
+ authUrl.searchParams.set("code_challenge", challenge);
258
+ authUrl.searchParams.set("code_challenge_method", "S256");
259
+ if (config.scopes?.length)
260
+ authUrl.searchParams.set("scope", config.scopes.join(" "));
261
+ if (config.resource)
262
+ authUrl.searchParams.set("resource", config.resource);
263
+ timer = setTimeout(() => fail(new Error("OAuth authorization timed out")), options.timeoutMs ?? 120_000);
264
+ Promise.resolve(openExternal(authUrl.toString())).catch(fail);
122
265
  });
123
266
  });
124
267
  }
125
- /**
126
- * Refresh an access token using a refresh token.
127
- */
128
- export async function refreshToken(config, refreshTokenValue) {
268
+ export async function refreshToken(config, refreshTokenValue, options = {}) {
129
269
  const params = new URLSearchParams({
130
270
  grant_type: "refresh_token",
131
271
  client_id: config.clientId,
132
272
  refresh_token: refreshTokenValue,
133
273
  });
134
- const res = await fetch(config.tokenEndpoint, {
274
+ if (config.clientSecret)
275
+ params.set("client_secret", config.clientSecret);
276
+ if (config.scopes?.length)
277
+ params.set("scope", config.scopes.join(" "));
278
+ if (config.resource)
279
+ params.set("resource", config.resource);
280
+ const res = await createHardenedOAuthFetch(options.fetch ?? fetch)(config.tokenEndpoint, {
135
281
  method: "POST",
136
282
  headers: { "Content-Type": "application/x-www-form-urlencoded" },
137
283
  body: params.toString(),
138
284
  });
139
- if (!res.ok) {
140
- throw new Error(`Token refresh failed: ${res.status}`);
141
- }
142
- const data = (await res.json());
143
- return {
144
- accessToken: data.access_token,
145
- refreshToken: data.refresh_token ?? refreshTokenValue,
146
- expiresAt: data.expires_in
147
- ? Date.now() + data.expires_in * 1000
148
- : undefined,
149
- tokenType: data.token_type ?? "Bearer",
150
- };
285
+ if (!res.ok)
286
+ throw new Error(`OAuth token refresh failed (${res.status})`);
287
+ const secret = mergeOAuthTokenResponse({ accessToken: "replaced", refreshToken: refreshTokenValue }, (await res.json()), { now: options.now });
288
+ return tokensFromSecret(secret);
151
289
  }
@@ -15,19 +15,19 @@ export interface SessionMemoryEntry {
15
15
  /**
16
16
  * Save a session memory entry.
17
17
  */
18
- export declare function saveSessionMemory(entry: SessionMemoryEntry): void;
18
+ export declare function saveSessionMemory(entry: SessionMemoryEntry, baseDir?: string): void;
19
19
  /**
20
20
  * Load a session memory by session ID.
21
21
  */
22
- export declare function loadSessionMemory(sessionId: string): SessionMemoryEntry | null;
22
+ export declare function loadSessionMemory(sessionId: string, baseDir?: string): SessionMemoryEntry | null;
23
23
  /**
24
24
  * List all session memories, most recent first.
25
25
  */
26
- export declare function listSessionMemories(limit?: number): SessionMemoryEntry[];
26
+ export declare function listSessionMemories(limit?: number, baseDir?: string): SessionMemoryEntry[];
27
27
  /**
28
28
  * Search session memories by keyword.
29
29
  */
30
- export declare function searchSessionMemories(query: string): SessionMemoryEntry[];
30
+ export declare function searchSessionMemories(query: string, baseDir?: string): SessionMemoryEntry[];
31
31
  /**
32
32
  * Build a prompt for extracting session memory from a conversation.
33
33
  */
@@ -11,14 +11,17 @@ import { sortSessionMemoriesByRecency } from "./session-memory-sort.js";
11
11
  // Resolve per-call (NOT a module const): userHome() reads $HOME live, so a
12
12
  // relocated/test HOME redirects writes instead of pinning the real ~/.code-shell
13
13
  // at import time (bun freezes a module-level homedir() and never re-reads it).
14
- function memoryDir() {
15
- return join(userHome(), ".code-shell", "session-memories");
14
+ // `baseDir` is the explicit injection point (the `~/.code-shell`-equivalent
15
+ // root): when provided it wins over $HOME resolution — identity-scoped server
16
+ // deployments pass their per-user data root here.
17
+ function memoryDir(baseDir) {
18
+ return join(baseDir ?? join(userHome(), ".code-shell"), "session-memories");
16
19
  }
17
20
  /**
18
21
  * Save a session memory entry.
19
22
  */
20
- export function saveSessionMemory(entry) {
21
- const dir = memoryDir();
23
+ export function saveSessionMemory(entry, baseDir) {
24
+ const dir = memoryDir(baseDir);
22
25
  mkdirSync(dir, { recursive: true });
23
26
  const file = join(dir, `${entry.sessionId}.json`);
24
27
  writeFileSync(file, JSON.stringify(entry, null, 2), "utf-8");
@@ -26,8 +29,8 @@ export function saveSessionMemory(entry) {
26
29
  /**
27
30
  * Load a session memory by session ID.
28
31
  */
29
- export function loadSessionMemory(sessionId) {
30
- const file = join(memoryDir(), `${sessionId}.json`);
32
+ export function loadSessionMemory(sessionId, baseDir) {
33
+ const file = join(memoryDir(baseDir), `${sessionId}.json`);
31
34
  if (!existsSync(file))
32
35
  return null;
33
36
  try {
@@ -40,8 +43,8 @@ export function loadSessionMemory(sessionId) {
40
43
  /**
41
44
  * List all session memories, most recent first.
42
45
  */
43
- export function listSessionMemories(limit = 50) {
44
- const dir = memoryDir();
46
+ export function listSessionMemories(limit = 50, baseDir) {
47
+ const dir = memoryDir(baseDir);
45
48
  if (!existsSync(dir))
46
49
  return [];
47
50
  // Read all entries, then order by createdAt (not by filename — the filename
@@ -63,8 +66,8 @@ export function listSessionMemories(limit = 50) {
63
66
  /**
64
67
  * Search session memories by keyword.
65
68
  */
66
- export function searchSessionMemories(query) {
67
- const all = listSessionMemories(200);
69
+ export function searchSessionMemories(query, baseDir) {
70
+ const all = listSessionMemories(200, baseDir);
68
71
  const q = query.toLowerCase();
69
72
  return all.filter((m) => m.summary.toLowerCase().includes(q) ||
70
73
  m.keyTopics.some((t) => t.toLowerCase().includes(q)) ||
@@ -215,20 +215,21 @@ export declare class MemoryManager {
215
215
  now?: number;
216
216
  }): string;
217
217
  /**
218
- * Two-layer injection index (用户拍板). Merges GLOBAL (cross-project
219
- * experience) + PROJECT (this repo's facts) memories into a compact index —
220
- * one line per entry, name + description only, NO body. The model reads a
221
- * specific entry's full content on demand via MemoryRead (which records a
222
- * recall → drives TTL + UI visibility).
218
+ * Three-layer injection index (用户拍板). Merges GLOBAL (cross-project
219
+ * experience) + DIGITAL-HUMAN (portable profile experience) + PROJECT
220
+ * (this repo's facts) memories into a compact index one line per entry,
221
+ * name + description only, NO body.
223
222
  *
224
223
  * This is what fixes "global memory never shows up": global memories are now
225
224
  * injected alongside project ones, every session, regardless of cwd.
226
225
  *
227
- * Static because it must construct two managers (global = no projectDir,
228
- * project = with projectDir). `projectDir` undefined → only global is shown.
226
+ * Static because it must construct the managers for each configured layer.
227
+ * `projectDir` undefined no project layer; `profileDir` undefined → no
228
+ * digital-human layer.
229
229
  */
230
230
  static buildInjectionIndex(opts: {
231
231
  projectDir?: string;
232
+ profileDir?: string;
232
233
  baseDir?: string;
233
234
  maxAgeDays?: number;
234
235
  now?: number;
@@ -253,6 +254,24 @@ export declare class MemoryManager {
253
254
  * O(N²) re-read of every memory file on every save.
254
255
  */
255
256
  private ensureIndexCache;
257
+ /**
258
+ * Rewrite MEMORY.md from the CURRENT set of memory files on disk, under a
259
+ * cross-process lock.
260
+ *
261
+ * The in-memory `indexCache` is a per-instance optimisation, and several
262
+ * managers exist for the same directory (desktop main, agent worker, TUI, a
263
+ * second desktop instance). Writing the cache out verbatim meant a stale
264
+ * snapshot clobbered whatever another writer had added:
265
+ *
266
+ * A saves a → B loads {a}, saves b → A still holds {a}, saves c
267
+ * → files a, b, c all exist, but MEMORY.md lists only a and c.
268
+ *
269
+ * The individual `<name>.md` files are the source of truth; MEMORY.md is a
270
+ * derived index. So rather than trusting any cache, re-derive it from disk
271
+ * inside the lock. `pending` carries this writer's own change, which may not
272
+ * be visible on disk yet (a delete moves the file to trash first, a save
273
+ * writes it first) — it is applied on top of the freshly scanned set.
274
+ */
256
275
  private writeIndex;
257
276
  private generateId;
258
277
  private availableFileNameForId;