@cjhyy/code-shell-core 0.5.0-rc.2 → 0.6.0-rc.10

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 (396) hide show
  1. package/README.md +13 -10
  2. package/dist/agent/agent-definition-registry.d.ts +3 -0
  3. package/dist/agent/agent-definition-registry.js +3 -1
  4. package/dist/agent/agent-definition.d.ts +15 -0
  5. package/dist/agent/agent-definition.js +27 -3
  6. package/dist/arena/context/context-tools.js +47 -4
  7. package/dist/arena/ledger.js +9 -1
  8. package/dist/arena/strategies/utils.d.ts +1 -4
  9. package/dist/arena/strategies/utils.js +7 -84
  10. package/dist/automation/cron-expr.d.ts +10 -0
  11. package/dist/automation/cron-expr.js +23 -5
  12. package/dist/automation/runner.d.ts +21 -4
  13. package/dist/automation/runner.js +48 -12
  14. package/dist/automation/scheduler.d.ts +38 -0
  15. package/dist/automation/scheduler.js +89 -12
  16. package/dist/automation/store.js +5 -2
  17. package/dist/capability-control/disabled-lists.d.ts +25 -0
  18. package/dist/capability-control/disabled-lists.js +57 -0
  19. package/dist/capability-control/overlay.d.ts +15 -0
  20. package/dist/capability-control/overlay.js +27 -0
  21. package/dist/cc-orchestrator/agent-adapter.d.ts +50 -0
  22. package/dist/cc-orchestrator/agent-adapter.js +133 -0
  23. package/dist/cc-orchestrator/cc-capability.d.ts +19 -0
  24. package/dist/cc-orchestrator/cc-capability.js +53 -0
  25. package/dist/cc-orchestrator/codex-session-discovery.d.ts +24 -0
  26. package/dist/cc-orchestrator/codex-session-discovery.js +191 -0
  27. package/dist/cc-orchestrator/codex-session-history.d.ts +25 -0
  28. package/dist/cc-orchestrator/codex-session-history.js +187 -0
  29. package/dist/cc-orchestrator/external-agent-changes.d.ts +19 -0
  30. package/dist/cc-orchestrator/external-agent-changes.js +214 -0
  31. package/dist/cc-orchestrator/external-agent-driver.d.ts +18 -0
  32. package/dist/cc-orchestrator/external-agent-driver.js +69 -0
  33. package/dist/cc-orchestrator/index.d.ts +8 -0
  34. package/dist/cc-orchestrator/index.js +8 -0
  35. package/dist/cc-orchestrator/relevance-judge.d.ts +15 -0
  36. package/dist/cc-orchestrator/relevance-judge.js +29 -0
  37. package/dist/cc-orchestrator/session-discovery.d.ts +46 -0
  38. package/dist/cc-orchestrator/session-discovery.js +125 -0
  39. package/dist/cc-orchestrator/session-history.d.ts +19 -0
  40. package/dist/cc-orchestrator/session-history.js +67 -0
  41. package/dist/cli/agent-server-stdio.d.ts +15 -1
  42. package/dist/cli/agent-server-stdio.js +115 -17
  43. package/dist/cli/agent-server-tcp.js +40 -26
  44. package/dist/context/compaction.d.ts +86 -0
  45. package/dist/context/compaction.js +279 -0
  46. package/dist/context/manager.d.ts +18 -0
  47. package/dist/context/manager.js +181 -48
  48. package/dist/context/token-counter.js +13 -0
  49. package/dist/cost-tracker.js +5 -61
  50. package/dist/credentials/cipher.d.ts +49 -0
  51. package/dist/credentials/cipher.js +45 -0
  52. package/dist/credentials/cookie-jar.d.ts +24 -0
  53. package/dist/credentials/cookie-jar.js +40 -0
  54. package/dist/credentials/index.d.ts +7 -0
  55. package/dist/credentials/index.js +5 -0
  56. package/dist/credentials/inject-credential-tool.d.ts +20 -0
  57. package/dist/credentials/inject-credential-tool.js +130 -0
  58. package/dist/credentials/store.d.ts +72 -0
  59. package/dist/credentials/store.js +184 -0
  60. package/dist/credentials/types.d.ts +56 -0
  61. package/dist/credentials/use-credential-tool.d.ts +29 -0
  62. package/dist/credentials/use-credential-tool.js +205 -0
  63. package/dist/credentials/use-gate.d.ts +56 -0
  64. package/dist/credentials/use-gate.js +52 -0
  65. package/dist/data/model-metadata.d.ts +77 -0
  66. package/dist/data/model-metadata.js +56 -0
  67. package/dist/data/model-metadata.json +216 -0
  68. package/dist/data/openrouter-models.d.ts +18 -7
  69. package/dist/data/openrouter-models.js +35 -8
  70. package/dist/engine/aux-key.d.ts +10 -0
  71. package/dist/engine/aux-key.js +11 -0
  72. package/dist/engine/dynamic-tool-defs.d.ts +19 -0
  73. package/dist/engine/dynamic-tool-defs.js +36 -0
  74. package/dist/engine/engine.d.ts +280 -141
  75. package/dist/engine/engine.js +1193 -245
  76. package/dist/engine/friendly-error.d.ts +18 -0
  77. package/dist/engine/friendly-error.js +63 -0
  78. package/dist/engine/goal.d.ts +145 -0
  79. package/dist/engine/goal.js +144 -0
  80. package/dist/engine/image-policy.d.ts +13 -0
  81. package/dist/engine/image-policy.js +24 -0
  82. package/dist/engine/model-connections-pool.d.ts +17 -0
  83. package/dist/engine/model-connections-pool.js +67 -0
  84. package/dist/engine/model-facade.d.ts +10 -0
  85. package/dist/engine/model-facade.js +15 -0
  86. package/dist/engine/patch-orphaned-tools.js +3 -0
  87. package/dist/engine/query.js +2 -0
  88. package/dist/engine/resolve-llm-config.d.ts +16 -0
  89. package/dist/engine/resolve-llm-config.js +44 -0
  90. package/dist/engine/runtime.d.ts +2 -0
  91. package/dist/engine/runtime.js +27 -1
  92. package/dist/engine/sandbox-cache-key.d.ts +10 -0
  93. package/dist/engine/sandbox-cache-key.js +9 -0
  94. package/dist/engine/sandbox-config.d.ts +31 -0
  95. package/dist/engine/sandbox-config.js +38 -0
  96. package/dist/engine/session-usage.d.ts +31 -0
  97. package/dist/engine/session-usage.js +81 -0
  98. package/dist/engine/steer-queue.d.ts +33 -0
  99. package/dist/engine/steer-queue.js +26 -0
  100. package/dist/engine/streaming-tool-queue.d.ts +12 -0
  101. package/dist/engine/streaming-tool-queue.js +50 -10
  102. package/dist/engine/turn-loop.d.ts +94 -4
  103. package/dist/engine/turn-loop.js +432 -54
  104. package/dist/engine/types.d.ts +175 -0
  105. package/dist/engine/types.js +13 -0
  106. package/dist/external-agents/config.d.ts +2 -0
  107. package/dist/external-agents/config.js +15 -0
  108. package/dist/external-agents/types.d.ts +31 -0
  109. package/dist/external-agents/types.js +1 -0
  110. package/dist/git/utils.d.ts +12 -0
  111. package/dist/git/utils.js +38 -6
  112. package/dist/git/worktree.d.ts +48 -0
  113. package/dist/git/worktree.js +86 -10
  114. package/dist/hooks/goal-stop-hook.d.ts +28 -0
  115. package/dist/hooks/goal-stop-hook.js +186 -9
  116. package/dist/hooks/registry.d.ts +8 -0
  117. package/dist/hooks/registry.js +19 -0
  118. package/dist/hooks/shell-runner.js +10 -21
  119. package/dist/index.d.ts +51 -7
  120. package/dist/index.js +62 -5
  121. package/dist/llm/capabilities/param-specs.d.ts +14 -0
  122. package/dist/llm/capabilities/param-specs.js +62 -0
  123. package/dist/llm/capabilities/rules.js +5 -1
  124. package/dist/llm/capabilities/types.d.ts +10 -0
  125. package/dist/llm/client-base.d.ts +28 -1
  126. package/dist/llm/client-base.js +119 -13
  127. package/dist/llm/model-cache.js +4 -2
  128. package/dist/llm/model-pool.d.ts +21 -0
  129. package/dist/llm/model-pool.js +21 -1
  130. package/dist/llm/provider-auth.d.ts +41 -0
  131. package/dist/llm/provider-auth.js +76 -0
  132. package/dist/llm/provider-catalog.d.ts +4 -0
  133. package/dist/llm/providers/anthropic.js +64 -14
  134. package/dist/llm/providers/openai.d.ts +36 -0
  135. package/dist/llm/providers/openai.js +257 -51
  136. package/dist/llm/reasoning-setting.d.ts +3 -3
  137. package/dist/llm/reasoning-setting.js +9 -1
  138. package/dist/llm/stream-watchdog.js +5 -1
  139. package/dist/llm/token-counter.js +9 -2
  140. package/dist/llm/types.d.ts +4 -0
  141. package/dist/logging/sanitize-messages.js +22 -0
  142. package/dist/lsp/manager.d.ts +1 -1
  143. package/dist/lsp/manager.js +40 -10
  144. package/dist/model-catalog/builtin.d.ts +12 -0
  145. package/dist/model-catalog/builtin.js +412 -0
  146. package/dist/model-catalog/gen-connections.d.ts +20 -0
  147. package/dist/model-catalog/gen-connections.js +28 -0
  148. package/dist/model-catalog/index.d.ts +41 -0
  149. package/dist/model-catalog/index.js +90 -0
  150. package/dist/model-catalog/params.d.ts +20 -0
  151. package/dist/model-catalog/params.js +45 -0
  152. package/dist/model-catalog/resolve.d.ts +48 -0
  153. package/dist/model-catalog/resolve.js +33 -0
  154. package/dist/model-catalog/save-entry.d.ts +32 -0
  155. package/dist/model-catalog/save-entry.js +104 -0
  156. package/dist/model-catalog/types.d.ts +561 -0
  157. package/dist/model-catalog/types.js +93 -0
  158. package/dist/model-catalog/upsert.d.ts +9 -0
  159. package/dist/model-catalog/upsert.js +8 -0
  160. package/dist/onboarding.d.ts +12 -82
  161. package/dist/onboarding.js +61 -326
  162. package/dist/plugins/gitOps.d.ts +19 -0
  163. package/dist/plugins/gitOps.js +73 -4
  164. package/dist/plugins/installer/checkUpdate.d.ts +16 -0
  165. package/dist/plugins/installer/checkUpdate.js +32 -0
  166. package/dist/plugins/installer/codex/convertCommands.d.ts +19 -0
  167. package/dist/plugins/installer/codex/convertCommands.js +46 -0
  168. package/dist/plugins/installer/codex/convertMcp.d.ts +5 -2
  169. package/dist/plugins/installer/codex/convertMcp.js +45 -5
  170. package/dist/plugins/installer/install.js +25 -1
  171. package/dist/plugins/installer/installFromArchive.d.ts +43 -0
  172. package/dist/plugins/installer/installFromArchive.js +134 -0
  173. package/dist/plugins/installer/installFromSource.js +8 -2
  174. package/dist/plugins/installer/loadPluginAgents.js +6 -2
  175. package/dist/plugins/installer/loadPluginMcp.d.ts +9 -2
  176. package/dist/plugins/installer/loadPluginMcp.js +35 -2
  177. package/dist/plugins/installer/pruneDisabled.d.ts +24 -0
  178. package/dist/plugins/installer/pruneDisabled.js +73 -0
  179. package/dist/plugins/installer/types.d.ts +5 -2
  180. package/dist/plugins/installer/types.js +1 -0
  181. package/dist/plugins/installer/uninstall.js +4 -0
  182. package/dist/plugins/installer/unzip.d.ts +14 -0
  183. package/dist/plugins/installer/unzip.js +82 -0
  184. package/dist/plugins/installer/update.d.ts +14 -0
  185. package/dist/plugins/installer/update.js +53 -21
  186. package/dist/plugins/loadPluginHooks.d.ts +47 -1
  187. package/dist/plugins/loadPluginHooks.js +73 -1
  188. package/dist/plugins/marketplaceManager.d.ts +7 -0
  189. package/dist/plugins/marketplaceManager.js +20 -0
  190. package/dist/plugins/pluginCommandHook.js +4 -18
  191. package/dist/plugins/pluginContent.d.ts +30 -0
  192. package/dist/plugins/pluginContent.js +83 -0
  193. package/dist/plugins/pluginInstaller.d.ts +13 -0
  194. package/dist/plugins/pluginInstaller.js +42 -8
  195. package/dist/plugins/schemas.js +1 -0
  196. package/dist/plugins/types.d.ts +6 -0
  197. package/dist/preset/index.d.ts +11 -1
  198. package/dist/preset/index.js +115 -6
  199. package/dist/product/types.d.ts +1 -1
  200. package/dist/prompt/composer.d.ts +32 -0
  201. package/dist/prompt/composer.js +75 -21
  202. package/dist/prompt/instruction-scanner.js +5 -3
  203. package/dist/prompt/section-loader.js +1 -0
  204. package/dist/prompt/sections/base.md +2 -0
  205. package/dist/prompt/sections/browser.md +10 -0
  206. package/dist/prompt/sections/coding.md +4 -0
  207. package/dist/protocol/chat-session-manager.d.ts +9 -2
  208. package/dist/protocol/chat-session-manager.js +38 -0
  209. package/dist/protocol/chat-session.d.ts +69 -1
  210. package/dist/protocol/chat-session.js +102 -4
  211. package/dist/protocol/client.d.ts +31 -0
  212. package/dist/protocol/client.js +44 -0
  213. package/dist/protocol/server.d.ts +120 -7
  214. package/dist/protocol/server.js +753 -51
  215. package/dist/protocol/transport.js +3 -2
  216. package/dist/protocol/types.d.ts +60 -0
  217. package/dist/protocol/types.js +16 -0
  218. package/dist/quota/credentials.d.ts +3 -0
  219. package/dist/quota/credentials.js +80 -0
  220. package/dist/quota/index.d.ts +36 -0
  221. package/dist/quota/index.js +155 -0
  222. package/dist/quota/types.d.ts +48 -0
  223. package/dist/quota/types.js +13 -0
  224. package/dist/review/review-prompt.d.ts +28 -0
  225. package/dist/review/review-prompt.js +81 -0
  226. package/dist/run/FileRunStore.js +8 -3
  227. package/dist/run/RunApprovalBackend.js +25 -5
  228. package/dist/run/RunManager.d.ts +12 -0
  229. package/dist/run/RunManager.js +35 -0
  230. package/dist/run/factory.d.ts +1 -1
  231. package/dist/runtime/background-shell.d.ts +139 -0
  232. package/dist/runtime/background-shell.js +509 -0
  233. package/dist/runtime/output-clean.d.ts +24 -0
  234. package/dist/runtime/output-clean.js +41 -0
  235. package/dist/runtime/ring-file.d.ts +64 -0
  236. package/dist/runtime/ring-file.js +174 -0
  237. package/dist/runtime/safe-spawn.js +98 -39
  238. package/dist/runtime/spawn-common.d.ts +159 -0
  239. package/dist/runtime/spawn-common.js +404 -0
  240. package/dist/runtime/truncate-output.d.ts +22 -0
  241. package/dist/runtime/truncate-output.js +49 -0
  242. package/dist/runtime/utf8-cut.d.ts +11 -0
  243. package/dist/runtime/utf8-cut.js +23 -0
  244. package/dist/services/auto-dream.d.ts +4 -0
  245. package/dist/services/auto-dream.js +26 -26
  246. package/dist/services/diagnostics.d.ts +1 -2
  247. package/dist/services/diagnostics.js +12 -7
  248. package/dist/services/extract-memories.d.ts +14 -1
  249. package/dist/services/extract-memories.js +45 -6
  250. package/dist/services/memory-orchestrator.d.ts +21 -0
  251. package/dist/services/memory-orchestrator.js +125 -50
  252. package/dist/services/session-memory.js +24 -12
  253. package/dist/session/file-history.d.ts +124 -1
  254. package/dist/session/file-history.js +222 -6
  255. package/dist/session/memory.d.ts +116 -2
  256. package/dist/session/memory.js +250 -28
  257. package/dist/session/session-manager.d.ts +40 -0
  258. package/dist/session/session-manager.js +119 -3
  259. package/dist/session/simple-diff.d.ts +23 -0
  260. package/dist/session/simple-diff.js +84 -0
  261. package/dist/session/transcript.d.ts +29 -1
  262. package/dist/session/transcript.js +56 -2
  263. package/dist/session/undo-target.d.ts +67 -0
  264. package/dist/session/undo-target.js +144 -0
  265. package/dist/settings/disk-defaults.d.ts +9 -2
  266. package/dist/settings/disk-defaults.js +11 -2
  267. package/dist/settings/feature-flags.d.ts +64 -0
  268. package/dist/settings/feature-flags.js +61 -0
  269. package/dist/settings/manager.d.ts +68 -1
  270. package/dist/settings/manager.js +266 -29
  271. package/dist/settings/migrate-config.d.ts +45 -0
  272. package/dist/settings/migrate-config.js +125 -0
  273. package/dist/settings/schema-export.d.ts +25 -0
  274. package/dist/settings/schema-export.js +38 -0
  275. package/dist/settings/schema.d.ts +1186 -771
  276. package/dist/settings/schema.js +268 -97
  277. package/dist/skills/scanner.d.ts +9 -0
  278. package/dist/skills/scanner.js +30 -2
  279. package/dist/stt/resolve-transcribe.d.ts +31 -0
  280. package/dist/stt/resolve-transcribe.js +108 -0
  281. package/dist/stt/transcribe.d.ts +51 -0
  282. package/dist/stt/transcribe.js +65 -0
  283. package/dist/tool-system/browser-bridge.d.ts +226 -0
  284. package/dist/tool-system/browser-bridge.js +163 -0
  285. package/dist/tool-system/builtin/agent-heartbeat.d.ts +49 -0
  286. package/dist/tool-system/builtin/agent-heartbeat.js +89 -0
  287. package/dist/tool-system/builtin/agent-notifications.d.ts +12 -3
  288. package/dist/tool-system/builtin/agent-notifications.js +9 -3
  289. package/dist/tool-system/builtin/agent-output-file.d.ts +38 -0
  290. package/dist/tool-system/builtin/agent-output-file.js +72 -0
  291. package/dist/tool-system/builtin/agent-registry.d.ts +12 -0
  292. package/dist/tool-system/builtin/agent-registry.js +8 -0
  293. package/dist/tool-system/builtin/agent.d.ts +21 -1
  294. package/dist/tool-system/builtin/agent.js +489 -42
  295. package/dist/tool-system/builtin/apply-patch/applier.js +66 -8
  296. package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +10 -0
  297. package/dist/tool-system/builtin/apply-patch/backup-targets.js +30 -0
  298. package/dist/tool-system/builtin/apply-patch/index.js +0 -15
  299. package/dist/tool-system/builtin/background-jobs.d.ts +76 -0
  300. package/dist/tool-system/builtin/background-jobs.js +124 -0
  301. package/dist/tool-system/builtin/background-shell-tools.d.ts +20 -0
  302. package/dist/tool-system/builtin/background-shell-tools.js +108 -0
  303. package/dist/tool-system/builtin/background-work.d.ts +67 -0
  304. package/dist/tool-system/builtin/background-work.js +86 -0
  305. package/dist/tool-system/builtin/bash-output-style.d.ts +32 -0
  306. package/dist/tool-system/builtin/bash-output-style.js +40 -0
  307. package/dist/tool-system/builtin/bash.d.ts +5 -2
  308. package/dist/tool-system/builtin/bash.js +101 -64
  309. package/dist/tool-system/builtin/browser-tools.d.ts +33 -0
  310. package/dist/tool-system/builtin/browser-tools.js +312 -0
  311. package/dist/tool-system/builtin/cancel-goal.d.ts +31 -0
  312. package/dist/tool-system/builtin/cancel-goal.js +64 -0
  313. package/dist/tool-system/builtin/check-quota.d.ts +15 -0
  314. package/dist/tool-system/builtin/check-quota.js +34 -0
  315. package/dist/tool-system/builtin/config.js +7 -0
  316. package/dist/tool-system/builtin/cron.d.ts +7 -0
  317. package/dist/tool-system/builtin/cron.js +64 -4
  318. package/dist/tool-system/builtin/drive-claude-code.d.ts +30 -0
  319. package/dist/tool-system/builtin/drive-claude-code.js +157 -0
  320. package/dist/tool-system/builtin/edit-model-catalog.d.ts +3 -0
  321. package/dist/tool-system/builtin/edit-model-catalog.js +104 -0
  322. package/dist/tool-system/builtin/edit.js +20 -16
  323. package/dist/tool-system/builtin/eol.d.ts +29 -0
  324. package/dist/tool-system/builtin/eol.js +37 -0
  325. package/dist/tool-system/builtin/file-cache.d.ts +6 -0
  326. package/dist/tool-system/builtin/file-cache.js +8 -0
  327. package/dist/tool-system/builtin/generate-image.d.ts +35 -0
  328. package/dist/tool-system/builtin/generate-image.js +278 -50
  329. package/dist/tool-system/builtin/generate-video.d.ts +55 -0
  330. package/dist/tool-system/builtin/generate-video.js +364 -0
  331. package/dist/tool-system/builtin/glob.js +0 -7
  332. package/dist/tool-system/builtin/grep.d.ts +9 -0
  333. package/dist/tool-system/builtin/grep.js +106 -11
  334. package/dist/tool-system/builtin/image-providers.d.ts +86 -0
  335. package/dist/tool-system/builtin/image-providers.js +190 -0
  336. package/dist/tool-system/builtin/image-uploader.d.ts +33 -0
  337. package/dist/tool-system/builtin/image-uploader.js +74 -0
  338. package/dist/tool-system/builtin/index.d.ts +10 -2
  339. package/dist/tool-system/builtin/index.js +251 -27
  340. package/dist/tool-system/builtin/mcp-tools.js +23 -3
  341. package/dist/tool-system/builtin/memory.js +45 -7
  342. package/dist/tool-system/builtin/notebook-edit.js +0 -7
  343. package/dist/tool-system/builtin/powershell.js +8 -2
  344. package/dist/tool-system/builtin/read.js +10 -10
  345. package/dist/tool-system/builtin/repl.js +4 -1
  346. package/dist/tool-system/builtin/skill.js +9 -0
  347. package/dist/tool-system/builtin/sleep.js +8 -2
  348. package/dist/tool-system/builtin/tool-search.js +25 -7
  349. package/dist/tool-system/builtin/video-providers.d.ts +154 -0
  350. package/dist/tool-system/builtin/video-providers.js +235 -0
  351. package/dist/tool-system/builtin/web-fetch.js +12 -2
  352. package/dist/tool-system/builtin/web-search.js +21 -7
  353. package/dist/tool-system/builtin/worktree.d.ts +2 -1
  354. package/dist/tool-system/builtin/worktree.js +31 -4
  355. package/dist/tool-system/builtin/write.js +0 -6
  356. package/dist/tool-system/context.d.ts +164 -6
  357. package/dist/tool-system/executor.d.ts +3 -1
  358. package/dist/tool-system/executor.js +197 -90
  359. package/dist/tool-system/investigation-guard.js +1 -1
  360. package/dist/tool-system/mcp-manager.d.ts +42 -4
  361. package/dist/tool-system/mcp-manager.js +203 -20
  362. package/dist/tool-system/mcp-stdio-diagnostics.d.ts +9 -0
  363. package/dist/tool-system/mcp-stdio-diagnostics.js +93 -0
  364. package/dist/tool-system/path-policy.d.ts +5 -0
  365. package/dist/tool-system/path-policy.js +307 -8
  366. package/dist/tool-system/permission.d.ts +39 -2
  367. package/dist/tool-system/permission.js +283 -70
  368. package/dist/tool-system/plan-mode-allowlist.d.ts +13 -2
  369. package/dist/tool-system/plan-mode-allowlist.js +24 -2
  370. package/dist/tool-system/registry.d.ts +1 -0
  371. package/dist/tool-system/registry.js +16 -2
  372. package/dist/tool-system/sandbox/index.d.ts +8 -0
  373. package/dist/tool-system/sandbox/index.js +7 -2
  374. package/dist/tool-system/sandbox/off.js +7 -1
  375. package/dist/tool-system/validate-tool-metadata.d.ts +36 -0
  376. package/dist/tool-system/validate-tool-metadata.js +63 -0
  377. package/dist/types.d.ts +252 -7
  378. package/dist/updater.js +20 -9
  379. package/dist/utils/envUtils.d.ts +0 -9
  380. package/dist/utils/envUtils.js +3 -28
  381. package/dist/utils/exec.d.ts +48 -0
  382. package/dist/utils/exec.js +154 -0
  383. package/dist/utils/json.d.ts +12 -0
  384. package/dist/utils/json.js +92 -0
  385. package/dist/utils/theme.d.ts +1 -1
  386. package/dist/utils/theme.js +1 -1
  387. package/dist/utils/toolDisplay.js +0 -1
  388. package/package.json +13 -7
  389. package/dist/agent/coordinator.d.ts +0 -49
  390. package/dist/agent/coordinator.js +0 -77
  391. package/dist/settings/manager.test.js +0 -73
  392. package/dist/tool-system/builtin/remote-trigger.d.ts +0 -6
  393. package/dist/tool-system/builtin/remote-trigger.js +0 -54
  394. package/dist/tool-system/builtin/send-message.d.ts +0 -6
  395. package/dist/tool-system/builtin/send-message.js +0 -47
  396. /package/dist/{settings/manager.test.d.ts → credentials/types.js} +0 -0
@@ -0,0 +1,191 @@
1
+ import { readdirSync, statSync, existsSync, openSync, readSync, closeSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { homedir } from "node:os";
4
+ import { selectRecentStats } from "./session-discovery.js";
5
+ /**
6
+ * Discover codex CLI sessions for a given `cwd`, mirroring the claude-side
7
+ * `discoverSessions` but for codex's storage layout, which is fundamentally
8
+ * different:
9
+ *
10
+ * ~/.codex/sessions/YYYY/MM/DD/rollout-<ts>-<uuid>.jsonl
11
+ *
12
+ * Unlike claude (one dir per project), codex stores rollouts by DATE, not by
13
+ * cwd. The cwd lives INSIDE the file: the first line is a `session_meta` event
14
+ * whose `payload` carries `{ id, cwd, timestamp }` (`id` is the thread id we
15
+ * resume by). So discovery means: walk every rollout file, read just its first
16
+ * line to learn its cwd, and keep the ones matching the requested project.
17
+ *
18
+ * Codex rollout files can be large, so we deliberately AVOID `readFileSync` on
19
+ * the whole file (the claude version reads the whole file because claude
20
+ * sessions are small). We read the first line for the meta, and — only for a
21
+ * matching file — read a bounded prefix to find the first real user message for
22
+ * the title. Returns the same `DiscoveredSession` shape so the UI is CLI-blind.
23
+ */
24
+ export function discoverCodexSessions(cwd, codexHome = join(homedir(), ".codex"), opts = {}) {
25
+ const root = join(codexHome, "sessions");
26
+ if (!existsSync(root))
27
+ return [];
28
+ // Cheap pass: stat every rollout (no read). Apply the recency window here so
29
+ // the meta read (first line) only runs on in-window files. The limit can't be
30
+ // applied yet — we don't know which files match `cwd` until we read the meta,
31
+ // so we'd otherwise drop matching-but-not-yet-seen sessions.
32
+ const stats = [];
33
+ for (const file of walkRollouts(root)) {
34
+ let st;
35
+ try {
36
+ st = statSync(file);
37
+ }
38
+ catch {
39
+ continue;
40
+ }
41
+ stats.push({ file, mtimeMs: st.mtimeMs });
42
+ }
43
+ const windowed = selectRecentStats(stats, { sinceMs: opts.sinceMs, now: opts.now });
44
+ const limit = opts.limit && opts.limit > 0 ? opts.limit : Infinity;
45
+ const out = [];
46
+ for (const s of windowed) {
47
+ if (out.length >= limit)
48
+ break;
49
+ let meta;
50
+ try {
51
+ meta = readSessionMeta(s.file);
52
+ }
53
+ catch {
54
+ continue;
55
+ }
56
+ if (!meta || !meta.id || meta.cwd !== cwd)
57
+ continue;
58
+ out.push({
59
+ sessionId: meta.id,
60
+ firstMessage: readFirstUserMessage(s.file),
61
+ lastModified: s.mtimeMs,
62
+ messageCount: 0, // not tracked for codex (would need a full scan); UI shows time + title.
63
+ });
64
+ }
65
+ return out;
66
+ }
67
+ /** Count codex sessions for `cwd` (reads first-line meta of every rollout; no
68
+ * window). Used so the UI knows whether a bounded list left older ones hidden. */
69
+ export function countCodexSessions(cwd, codexHome = join(homedir(), ".codex")) {
70
+ const root = join(codexHome, "sessions");
71
+ if (!existsSync(root))
72
+ return 0;
73
+ let n = 0;
74
+ for (const file of walkRollouts(root)) {
75
+ let meta;
76
+ try {
77
+ meta = readSessionMeta(file);
78
+ }
79
+ catch {
80
+ continue;
81
+ }
82
+ if (meta && meta.id && meta.cwd === cwd)
83
+ n++;
84
+ }
85
+ return n;
86
+ }
87
+ /** Recursively yield every `rollout-*.jsonl` file under `root`. */
88
+ function* walkRollouts(root) {
89
+ let entries;
90
+ try {
91
+ entries = readdirSync(root);
92
+ }
93
+ catch {
94
+ return;
95
+ }
96
+ for (const name of entries) {
97
+ const full = join(root, name);
98
+ let st;
99
+ try {
100
+ st = statSync(full);
101
+ }
102
+ catch {
103
+ continue;
104
+ }
105
+ if (st.isDirectory()) {
106
+ yield* walkRollouts(full);
107
+ }
108
+ else if (name.startsWith("rollout-") && name.endsWith(".jsonl")) {
109
+ yield full;
110
+ }
111
+ }
112
+ }
113
+ /** Read just the first line of a file (bounded), without loading the whole file. */
114
+ function readFirstLine(file, maxBytes = 1 << 16) {
115
+ const fd = openSync(file, "r");
116
+ try {
117
+ const buf = Buffer.alloc(maxBytes);
118
+ const n = readSync(fd, buf, 0, maxBytes, 0);
119
+ const text = buf.toString("utf-8", 0, n);
120
+ const nl = text.indexOf("\n");
121
+ return nl === -1 ? text : text.slice(0, nl);
122
+ }
123
+ finally {
124
+ closeSync(fd);
125
+ }
126
+ }
127
+ /** Parse the first-line `session_meta` event → `{ id, cwd }`. */
128
+ function readSessionMeta(file) {
129
+ const first = readFirstLine(file).trim();
130
+ if (!first)
131
+ return undefined;
132
+ const d = JSON.parse(first);
133
+ if (d.type !== "session_meta" || !d.payload)
134
+ return undefined;
135
+ return { id: d.payload.id, cwd: d.payload.cwd };
136
+ }
137
+ /**
138
+ * Find the first *real* user message text for the session title. Codex user
139
+ * messages look like:
140
+ * {type:"response_item", payload:{type:"message", role:"user",
141
+ * content:[{type:"input_text", text}]}}
142
+ * The very first user message is usually an `<environment_context>` injection
143
+ * (analogous to claude's `<local-command-caveat>`); skip those wrappers.
144
+ *
145
+ * Reads a bounded prefix of the file rather than the whole thing.
146
+ */
147
+ function readFirstUserMessage(file, maxBytes = 1 << 20) {
148
+ let chunk;
149
+ try {
150
+ const fd = openSync(file, "r");
151
+ try {
152
+ const buf = Buffer.alloc(maxBytes);
153
+ const n = readSync(fd, buf, 0, maxBytes, 0);
154
+ chunk = buf.toString("utf-8", 0, n);
155
+ }
156
+ finally {
157
+ closeSync(fd);
158
+ }
159
+ }
160
+ catch {
161
+ return "";
162
+ }
163
+ for (const line of chunk.split("\n")) {
164
+ if (!line.trim())
165
+ continue;
166
+ let d;
167
+ try {
168
+ d = JSON.parse(line);
169
+ }
170
+ catch {
171
+ // Truncated last line of the bounded read — stop scanning.
172
+ break;
173
+ }
174
+ const p = d?.payload;
175
+ if (d?.type !== "response_item" || p?.type !== "message" || p?.role !== "user")
176
+ continue;
177
+ const content = p.content;
178
+ const text = Array.isArray(content)
179
+ ? content.map((c) => (typeof c?.text === "string" ? c.text : "")).join("")
180
+ : typeof content === "string"
181
+ ? content
182
+ : "";
183
+ const t = text.trim();
184
+ if (!t)
185
+ continue;
186
+ if (t.startsWith("<environment_context>"))
187
+ continue;
188
+ return t.slice(0, 200);
189
+ }
190
+ return "";
191
+ }
@@ -0,0 +1,25 @@
1
+ import type { HistoryMessage } from "./session-history.js";
2
+ /**
3
+ * Read the last `limit` user/assistant messages from a codex CLI session,
4
+ * returning the SAME shape as the claude-side `readRecentHistory` so the room
5
+ * UI stays CLI-blind.
6
+ *
7
+ * Codex storage differs from claude fundamentally (see `codex-session-discovery`):
8
+ * rollouts live under `~/.codex/sessions/YYYY/MM/DD/rollout-*.jsonl`, keyed by
9
+ * DATE not cwd, with the thread id inside the file's `session_meta` first line.
10
+ * So we first locate the rollout file whose `session_meta` matches both
11
+ * `threadId` and `cwd`, then parse its event stream:
12
+ *
13
+ * - {type:"response_item", payload:{type:"message", role:"user"|"assistant",
14
+ * content:[{type:"input_text"|"output_text", text}]}} → message text
15
+ * - {type:"response_item", payload:{type:"function_call", name, arguments}} → tool
16
+ * - {type:"response_item", payload:{type:"custom_tool_call", name, input}} → tool
17
+ *
18
+ * `developer`-role messages (environment/system injections) and the leading
19
+ * `<environment_context>` user wrapper are skipped, mirroring discovery.
20
+ */
21
+ export declare function readCodexRecentHistory(cwd: string, threadId: string, limit: number, codexHome?: string): {
22
+ messages: HistoryMessage[];
23
+ hasMore: boolean;
24
+ totalCount: number;
25
+ };
@@ -0,0 +1,187 @@
1
+ import { readdirSync, readFileSync, statSync, existsSync, openSync, readSync, closeSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { homedir } from "node:os";
4
+ /**
5
+ * Read the last `limit` user/assistant messages from a codex CLI session,
6
+ * returning the SAME shape as the claude-side `readRecentHistory` so the room
7
+ * UI stays CLI-blind.
8
+ *
9
+ * Codex storage differs from claude fundamentally (see `codex-session-discovery`):
10
+ * rollouts live under `~/.codex/sessions/YYYY/MM/DD/rollout-*.jsonl`, keyed by
11
+ * DATE not cwd, with the thread id inside the file's `session_meta` first line.
12
+ * So we first locate the rollout file whose `session_meta` matches both
13
+ * `threadId` and `cwd`, then parse its event stream:
14
+ *
15
+ * - {type:"response_item", payload:{type:"message", role:"user"|"assistant",
16
+ * content:[{type:"input_text"|"output_text", text}]}} → message text
17
+ * - {type:"response_item", payload:{type:"function_call", name, arguments}} → tool
18
+ * - {type:"response_item", payload:{type:"custom_tool_call", name, input}} → tool
19
+ *
20
+ * `developer`-role messages (environment/system injections) and the leading
21
+ * `<environment_context>` user wrapper are skipped, mirroring discovery.
22
+ */
23
+ export function readCodexRecentHistory(cwd, threadId, limit, codexHome = join(homedir(), ".codex")) {
24
+ const empty = { messages: [], hasMore: false, totalCount: 0 };
25
+ const file = findRolloutFile(codexHome, cwd, threadId);
26
+ if (!file)
27
+ return empty;
28
+ let raw;
29
+ try {
30
+ raw = readFileSync(file, "utf-8");
31
+ }
32
+ catch {
33
+ return empty;
34
+ }
35
+ const all = [];
36
+ for (const line of raw.split("\n")) {
37
+ if (!line.trim())
38
+ continue;
39
+ let d;
40
+ try {
41
+ d = JSON.parse(line);
42
+ }
43
+ catch {
44
+ continue;
45
+ }
46
+ if (d?.type !== "response_item")
47
+ continue;
48
+ const p = d.payload;
49
+ if (!p)
50
+ continue;
51
+ if (p.type === "message" && (p.role === "user" || p.role === "assistant")) {
52
+ const t = textOf(p.content).trim();
53
+ if (!t || t.startsWith("<environment_context>"))
54
+ continue;
55
+ all.push({ role: p.role, text: t.slice(0, 4000) });
56
+ }
57
+ else if (p.type === "function_call" || p.type === "custom_tool_call") {
58
+ const tool = { name: typeof p.name === "string" ? p.name : "tool", summary: summaryOf(p), args: argsOf(p) };
59
+ const last = all[all.length - 1];
60
+ // Attach the tool to the preceding assistant turn; otherwise start one.
61
+ if (last && last.role === "assistant") {
62
+ (last.tools ??= []).push(tool);
63
+ }
64
+ else {
65
+ all.push({ role: "assistant", text: "", tools: [tool] });
66
+ }
67
+ }
68
+ }
69
+ const lim = limit > 0 ? limit : 20;
70
+ const start = Math.max(0, all.length - lim);
71
+ return { messages: all.slice(start), hasMore: start > 0, totalCount: all.length };
72
+ }
73
+ /** Join the text of codex content parts (`input_text`/`output_text`). */
74
+ function textOf(content) {
75
+ if (typeof content === "string")
76
+ return content;
77
+ if (Array.isArray(content))
78
+ return content.map((c) => (typeof c?.text === "string" ? c.text : "")).join("");
79
+ return "";
80
+ }
81
+ /** Build a short summary for a codex tool event from its arguments/input. */
82
+ function summaryOf(payload) {
83
+ // function_call carries `arguments` as a JSON string; custom_tool_call carries `input` as a string.
84
+ if (typeof payload.arguments === "string") {
85
+ try {
86
+ const a = JSON.parse(payload.arguments);
87
+ const s = a?.cmd ?? a?.command ?? a?.file_path ?? a?.path ?? a?.workdir ?? "";
88
+ if (s)
89
+ return String(s).slice(0, 120);
90
+ }
91
+ catch {
92
+ /* fall through to raw */
93
+ }
94
+ return payload.arguments.slice(0, 120);
95
+ }
96
+ if (typeof payload.input === "string")
97
+ return payload.input.slice(0, 120);
98
+ return "";
99
+ }
100
+ /**
101
+ * Build the FULL structured tool args for a codex tool event so a replayed tool
102
+ * card can show the real parameters (not just the lossy one-field summary).
103
+ * `function_call.arguments` is a JSON string → parse it; `custom_tool_call.input`
104
+ * is a raw string → keep it under `{input}`. Returns undefined when neither is
105
+ * present or the JSON is malformed.
106
+ */
107
+ function argsOf(payload) {
108
+ if (typeof payload.arguments === "string") {
109
+ try {
110
+ const a = JSON.parse(payload.arguments);
111
+ if (a && typeof a === "object")
112
+ return a;
113
+ }
114
+ catch {
115
+ /* malformed JSON → fall through */
116
+ }
117
+ return { arguments: payload.arguments };
118
+ }
119
+ if (typeof payload.input === "string")
120
+ return { input: payload.input };
121
+ return undefined;
122
+ }
123
+ /** Find the rollout file whose `session_meta` matches both `threadId` and `cwd`. */
124
+ function findRolloutFile(codexHome, cwd, threadId) {
125
+ const root = join(codexHome, "sessions");
126
+ if (!existsSync(root))
127
+ return undefined;
128
+ for (const file of walkRollouts(root)) {
129
+ let meta;
130
+ try {
131
+ meta = readSessionMeta(file);
132
+ }
133
+ catch {
134
+ continue;
135
+ }
136
+ if (meta && meta.id === threadId && meta.cwd === cwd)
137
+ return file;
138
+ }
139
+ return undefined;
140
+ }
141
+ /** Recursively yield every `rollout-*.jsonl` file under `root`. */
142
+ function* walkRollouts(root) {
143
+ let entries;
144
+ try {
145
+ entries = readdirSync(root);
146
+ }
147
+ catch {
148
+ return;
149
+ }
150
+ for (const name of entries) {
151
+ const full = join(root, name);
152
+ let st;
153
+ try {
154
+ st = statSync(full);
155
+ }
156
+ catch {
157
+ continue;
158
+ }
159
+ if (st.isDirectory()) {
160
+ yield* walkRollouts(full);
161
+ }
162
+ else if (name.startsWith("rollout-") && name.endsWith(".jsonl")) {
163
+ yield full;
164
+ }
165
+ }
166
+ }
167
+ /** Parse the first-line `session_meta` event → `{ id, cwd }`, reading a bounded prefix. */
168
+ function readSessionMeta(file, maxBytes = 1 << 16) {
169
+ const fd = openSync(file, "r");
170
+ let text;
171
+ try {
172
+ const buf = Buffer.alloc(maxBytes);
173
+ const n = readSync(fd, buf, 0, maxBytes, 0);
174
+ text = buf.toString("utf-8", 0, n);
175
+ }
176
+ finally {
177
+ closeSync(fd);
178
+ }
179
+ const nl = text.indexOf("\n");
180
+ const first = (nl === -1 ? text : text.slice(0, nl)).trim();
181
+ if (!first)
182
+ return undefined;
183
+ const d = JSON.parse(first);
184
+ if (d.type !== "session_meta" || !d.payload)
185
+ return undefined;
186
+ return { id: d.payload.id, cwd: d.payload.cwd };
187
+ }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Parse claude transcript JSONL text → deduped list of changed file paths.
3
+ * Each line is `{ message: { content: [{ type:"tool_use", name, input }] } }`.
4
+ * Exported for direct unit testing without a transcript file on disk.
5
+ */
6
+ export declare function extractChangedFilesFromClaudeLines(text: string): string[];
7
+ /** Locate `<claudeHome>/projects/<encodeCwd(cwd)>/<sid>.jsonl` and extract changes. */
8
+ export declare function readClaudeChangedFiles(cwd: string, sessionId: string, claudeHome?: string): string[];
9
+ /**
10
+ * Parse codex rollout JSONL text → changed file paths. Codex tool calls are
11
+ * `{type:"response_item", payload:{type:"function_call", name, arguments}}` or
12
+ * `{...custom_tool_call, input}`. apply_patch carries the patch text; write/edit
13
+ * carry a file path in arguments. Exported for unit testing.
14
+ */
15
+ export declare function extractChangedFilesFromCodexLines(text: string): string[];
16
+ /** Locate a codex rollout by threadId+cwd under `<codexHome>/sessions` and extract changes. */
17
+ export declare function readCodexChangedFiles(cwd: string, threadId: string, codexHome?: string): string[];
18
+ /** Dispatch by CLI. Unknown cli → []. Never throws. */
19
+ export declare function readExternalChangedFiles(cli: string, cwd: string, sessionId: string): string[];
@@ -0,0 +1,214 @@
1
+ import { readFileSync, existsSync, readdirSync, statSync, openSync, readSync, closeSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { homedir } from "node:os";
4
+ import { encodeCwd } from "./session-discovery.js";
5
+ /**
6
+ * #6 — attribute file changes made by a background external agent (DriveAgent
7
+ * running `claude` / `codex`). Those Edit/Write calls land in the external CLI's
8
+ * own transcript, invisible to the host's in-session file-change aggregator.
9
+ * Given the external session id + cwd, locate that transcript and extract the
10
+ * set of changed files, so the UI can show "N files edited" for the run.
11
+ *
12
+ * Read-only; tolerant — a malformed line is skipped, a missing transcript
13
+ * returns []. Never throws for the caller.
14
+ */
15
+ const CLAUDE_WRITE_TOOLS = new Set(["Write", "Edit", "MultiEdit", "NotebookEdit"]);
16
+ const CODEX_WRITE_TOOLS = new Set(["apply_patch", "ApplyPatch", "write_file", "edit_file"]);
17
+ /** Pull the changed-file path out of a claude tool_use input block. */
18
+ function claudeInputPath(input) {
19
+ if (!input || typeof input !== "object")
20
+ return undefined;
21
+ const o = input;
22
+ const p = o.file_path ?? o.notebook_path;
23
+ return typeof p === "string" && p.length > 0 ? p : undefined;
24
+ }
25
+ /**
26
+ * Parse claude transcript JSONL text → deduped list of changed file paths.
27
+ * Each line is `{ message: { content: [{ type:"tool_use", name, input }] } }`.
28
+ * Exported for direct unit testing without a transcript file on disk.
29
+ */
30
+ export function extractChangedFilesFromClaudeLines(text) {
31
+ const seen = new Set();
32
+ for (const line of text.split("\n")) {
33
+ if (!line.trim())
34
+ continue;
35
+ let d;
36
+ try {
37
+ d = JSON.parse(line);
38
+ }
39
+ catch {
40
+ continue;
41
+ }
42
+ const content = d?.message?.content;
43
+ if (!Array.isArray(content))
44
+ continue;
45
+ for (const block of content) {
46
+ if (block &&
47
+ typeof block === "object" &&
48
+ block.type === "tool_use" &&
49
+ CLAUDE_WRITE_TOOLS.has(block.name ?? "")) {
50
+ const p = claudeInputPath(block.input);
51
+ if (p)
52
+ seen.add(p);
53
+ }
54
+ }
55
+ }
56
+ return [...seen];
57
+ }
58
+ /** Locate `<claudeHome>/projects/<encodeCwd(cwd)>/<sid>.jsonl` and extract changes. */
59
+ export function readClaudeChangedFiles(cwd, sessionId, claudeHome = join(homedir(), ".claude")) {
60
+ const file = join(claudeHome, "projects", encodeCwd(cwd), `${sessionId}.jsonl`);
61
+ if (!existsSync(file))
62
+ return [];
63
+ let text;
64
+ try {
65
+ text = readFileSync(file, "utf-8");
66
+ }
67
+ catch {
68
+ return [];
69
+ }
70
+ return extractChangedFilesFromClaudeLines(text);
71
+ }
72
+ /**
73
+ * Parse codex rollout JSONL text → changed file paths. Codex tool calls are
74
+ * `{type:"response_item", payload:{type:"function_call", name, arguments}}` or
75
+ * `{...custom_tool_call, input}`. apply_patch carries the patch text; write/edit
76
+ * carry a file path in arguments. Exported for unit testing.
77
+ */
78
+ export function extractChangedFilesFromCodexLines(text) {
79
+ const seen = new Set();
80
+ for (const line of text.split("\n")) {
81
+ if (!line.trim())
82
+ continue;
83
+ let d;
84
+ try {
85
+ d = JSON.parse(line);
86
+ }
87
+ catch {
88
+ continue;
89
+ }
90
+ if (d?.type !== "response_item" || !d.payload)
91
+ continue;
92
+ const p = d.payload;
93
+ const name = typeof p.name === "string" ? p.name : "";
94
+ if (!CODEX_WRITE_TOOLS.has(name))
95
+ continue;
96
+ // function_call.arguments is a JSON string; custom_tool_call.input a string.
97
+ const rawArgs = typeof p.arguments === "string" ? p.arguments : typeof p.input === "string" ? p.input : "";
98
+ for (const f of filesFromCodexArgs(name, rawArgs))
99
+ seen.add(f);
100
+ }
101
+ return [...seen];
102
+ }
103
+ /** Pull file paths out of a codex tool's arguments string. */
104
+ function filesFromCodexArgs(name, raw) {
105
+ if (!raw)
106
+ return [];
107
+ if (name === "apply_patch" || name === "ApplyPatch") {
108
+ // apply_patch payload wraps a patch; headers look like `*** Update File: <p>`
109
+ // or `*** Add File: <p>`. Match those directly off the raw text.
110
+ const out = [];
111
+ const re = /\*\*\*\s+(?:Update|Add|Delete) File:\s+(.+)/g;
112
+ let m;
113
+ while ((m = re.exec(raw)) !== null) {
114
+ const f = m[1]?.trim();
115
+ if (f)
116
+ out.push(f);
117
+ }
118
+ return out;
119
+ }
120
+ try {
121
+ const a = JSON.parse(raw);
122
+ const p = a.file_path ?? a.path;
123
+ return typeof p === "string" && p ? [p] : [];
124
+ }
125
+ catch {
126
+ return [];
127
+ }
128
+ }
129
+ /** Locate a codex rollout by threadId+cwd under `<codexHome>/sessions` and extract changes. */
130
+ export function readCodexChangedFiles(cwd, threadId, codexHome = join(homedir(), ".codex")) {
131
+ const file = findRolloutFile(codexHome, cwd, threadId);
132
+ if (!file)
133
+ return [];
134
+ let text;
135
+ try {
136
+ text = readFileSync(file, "utf-8");
137
+ }
138
+ catch {
139
+ return [];
140
+ }
141
+ return extractChangedFilesFromCodexLines(text);
142
+ }
143
+ /** Dispatch by CLI. Unknown cli → []. Never throws. */
144
+ export function readExternalChangedFiles(cli, cwd, sessionId) {
145
+ try {
146
+ if (cli === "codex")
147
+ return readCodexChangedFiles(cwd, sessionId);
148
+ return readClaudeChangedFiles(cwd, sessionId);
149
+ }
150
+ catch {
151
+ return [];
152
+ }
153
+ }
154
+ // ── codex rollout location (mirrors codex-session-history.ts) ──────────────
155
+ function findRolloutFile(codexHome, cwd, threadId) {
156
+ const root = join(codexHome, "sessions");
157
+ if (!existsSync(root))
158
+ return undefined;
159
+ for (const file of walkRollouts(root)) {
160
+ let meta;
161
+ try {
162
+ meta = readSessionMeta(file);
163
+ }
164
+ catch {
165
+ continue;
166
+ }
167
+ if (meta && meta.id === threadId && meta.cwd === cwd)
168
+ return file;
169
+ }
170
+ return undefined;
171
+ }
172
+ function* walkRollouts(root) {
173
+ let entries;
174
+ try {
175
+ entries = readdirSync(root);
176
+ }
177
+ catch {
178
+ return;
179
+ }
180
+ for (const name of entries) {
181
+ const full = join(root, name);
182
+ let st;
183
+ try {
184
+ st = statSync(full);
185
+ }
186
+ catch {
187
+ continue;
188
+ }
189
+ if (st.isDirectory())
190
+ yield* walkRollouts(full);
191
+ else if (name.startsWith("rollout-") && name.endsWith(".jsonl"))
192
+ yield full;
193
+ }
194
+ }
195
+ function readSessionMeta(file, maxBytes = 1 << 16) {
196
+ const fd = openSync(file, "r");
197
+ let text;
198
+ try {
199
+ const buf = Buffer.alloc(maxBytes);
200
+ const n = readSync(fd, buf, 0, maxBytes, 0);
201
+ text = buf.toString("utf-8", 0, n);
202
+ }
203
+ finally {
204
+ closeSync(fd);
205
+ }
206
+ const nl = text.indexOf("\n");
207
+ const first = (nl === -1 ? text : text.slice(0, nl)).trim();
208
+ if (!first)
209
+ return undefined;
210
+ const d = JSON.parse(first);
211
+ if (d.type !== "session_meta" || !d.payload)
212
+ return undefined;
213
+ return { id: d.payload.id, cwd: d.payload.cwd };
214
+ }
@@ -0,0 +1,18 @@
1
+ import type { AgentAdapter, BuildArgsOpts, PermissionMode } from "./agent-adapter.js";
2
+ export interface AgentRunResult {
3
+ sessionId: string;
4
+ finalText: string;
5
+ isError: boolean;
6
+ exitCode: number | null;
7
+ lines: string[];
8
+ }
9
+ /** Pure: reduce collected output lines + exit code to a result. Unit-testable. */
10
+ export declare function runWithLines(adapter: AgentAdapter, lines: string[], exitCode: number | null): AgentRunResult;
11
+ export interface DriverRunOpts extends Omit<BuildArgsOpts, "permissionMode"> {
12
+ permissionMode?: PermissionMode;
13
+ }
14
+ /** Spawn ONE headless agent run, collect stream-json to exit, return result.
15
+ * No time concept — a single turn. Honors AbortSignal (kills the child). */
16
+ export declare function runAgentOnce(adapter: AgentAdapter, opts: DriverRunOpts & {
17
+ command: string;
18
+ }, signal?: AbortSignal): Promise<AgentRunResult>;