@gajae-code/coding-agent 0.13.2 → 0.14.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 (610) hide show
  1. package/CHANGELOG.md +215 -8
  2. package/README.md +2 -0
  3. package/bin/gajaessi.js +4 -0
  4. package/dist/types/async/job-manager.d.ts +55 -2
  5. package/dist/types/async/support.d.ts +14 -0
  6. package/dist/types/capability/mcp.d.ts +6 -0
  7. package/dist/types/capability/types.d.ts +6 -0
  8. package/dist/types/cli/accounts-cli.d.ts +19 -0
  9. package/dist/types/cli/args.d.ts +3 -0
  10. package/dist/types/cli/config-cli.d.ts +6 -0
  11. package/dist/types/cli/crash-cli.d.ts +10 -0
  12. package/dist/types/cli/customize-doctor.d.ts +145 -0
  13. package/dist/types/cli/daemon-cli.d.ts +3 -1
  14. package/dist/types/cli/mcp-cli.d.ts +11 -0
  15. package/dist/types/cli/notify-cli.d.ts +1 -1
  16. package/dist/types/cli/root-flags.d.ts +12 -0
  17. package/dist/types/cli/setup-cli.d.ts +3 -1
  18. package/dist/types/cli/skills-cli.d.ts +2 -1
  19. package/dist/types/cli/update-cli.d.ts +19 -1
  20. package/dist/types/cli.d.ts +6 -0
  21. package/dist/types/commands/accounts.d.ts +40 -0
  22. package/dist/types/commands/crash.d.ts +24 -0
  23. package/dist/types/commands/customize.d.ts +22 -0
  24. package/dist/types/commands/daemon.d.ts +1 -1
  25. package/dist/types/commands/launch.d.ts +6 -0
  26. package/dist/types/commands/setup.d.ts +6 -0
  27. package/dist/types/commands/skills.d.ts +6 -1
  28. package/dist/types/commands/update.d.ts +7 -0
  29. package/dist/types/config/atomic-yaml-patch-worker.d.ts +25 -0
  30. package/dist/types/config/atomic-yaml-patch.d.ts +62 -2
  31. package/dist/types/config/config-schema-version.d.ts +10 -0
  32. package/dist/types/config/file-lock.d.ts +18 -0
  33. package/dist/types/config/model-profile-activation.d.ts +3 -1
  34. package/dist/types/config/model-registry.d.ts +10 -1
  35. package/dist/types/config/models-config-schema.d.ts +2 -0
  36. package/dist/types/config/settings-schema.d.ts +73 -9
  37. package/dist/types/config/settings.d.ts +63 -0
  38. package/dist/types/config/skill-settings-defaults.d.ts +26 -0
  39. package/dist/types/config/task-delegation.d.ts +39 -0
  40. package/dist/types/config/update-channel.d.ts +10 -0
  41. package/dist/types/coordinator-mcp/server.d.ts +5 -1
  42. package/dist/types/crash/index-store.d.ts +87 -0
  43. package/dist/types/crash/nudge.d.ts +50 -0
  44. package/dist/types/crash/record-loader.d.ts +17 -0
  45. package/dist/types/crash/report.d.ts +134 -0
  46. package/dist/types/crash/sanitize.d.ts +25 -0
  47. package/dist/types/cursor.d.ts +13 -2
  48. package/dist/types/customization/import.d.ts +37 -0
  49. package/dist/types/customization/index.d.ts +4 -0
  50. package/dist/types/customization/inventory.d.ts +25 -0
  51. package/dist/types/customization/mutations.d.ts +32 -0
  52. package/dist/types/customization/types.d.ts +115 -0
  53. package/dist/types/daemon/control-types.d.ts +8 -1
  54. package/dist/types/daemon/operator-contract.d.ts +4 -4
  55. package/dist/types/discovery/claude.d.ts +39 -1
  56. package/dist/types/discovery/codex.d.ts +39 -1
  57. package/dist/types/discovery/index.d.ts +2 -0
  58. package/dist/types/discovery/mcp-compat.d.ts +30 -0
  59. package/dist/types/edit/renderer.d.ts +23 -0
  60. package/dist/types/extensibility/extensions/runner.d.ts +3 -0
  61. package/dist/types/extensibility/extensions/types.d.ts +21 -4
  62. package/dist/types/extensibility/gjc-plugins/observability.d.ts +6 -1
  63. package/dist/types/extensibility/gjc-plugins/registry.d.ts +8 -1
  64. package/dist/types/extensibility/hooks/loader.d.ts +19 -5
  65. package/dist/types/extensibility/runtime-skill-discovery.d.ts +22 -1
  66. package/dist/types/extensibility/skill-management.d.ts +107 -0
  67. package/dist/types/gjc-runtime/deep-interview-runtime.d.ts +3 -1
  68. package/dist/types/gjc-runtime/launch-worktree.d.ts +8 -0
  69. package/dist/types/gjc-runtime/linux-proc.d.ts +3 -0
  70. package/dist/types/gjc-runtime/ralplan-runtime.d.ts +10 -6
  71. package/dist/types/gjc-runtime/session-state-lock.d.ts +104 -0
  72. package/dist/types/gjc-runtime/session-state-sidecar.d.ts +120 -2
  73. package/dist/types/gjc-runtime/state-writer.d.ts +10 -1
  74. package/dist/types/gjc-runtime/ultragoal-guard.d.ts +4 -2
  75. package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +8 -6
  76. package/dist/types/gjc-runtime/workflow-settings.d.ts +109 -0
  77. package/dist/types/hooks/events.d.ts +60 -0
  78. package/dist/types/hooks/normalize.d.ts +83 -0
  79. package/dist/types/hooks/skill-state.d.ts +9 -2
  80. package/dist/types/main.d.ts +2 -1
  81. package/dist/types/modes/acp/abort-scope.d.ts +13 -0
  82. package/dist/types/modes/acp/acp-agent.d.ts +7 -4
  83. package/dist/types/modes/components/customization/customization-dashboard.d.ts +44 -0
  84. package/dist/types/modes/components/customization/import-wizard.d.ts +21 -0
  85. package/dist/types/modes/components/customization/index.d.ts +1 -0
  86. package/dist/types/modes/components/dynamic-theme-text.d.ts +9 -0
  87. package/dist/types/modes/components/gajae-pet-widget.d.ts +6 -28
  88. package/dist/types/modes/components/irc-sidebar.d.ts +1 -0
  89. package/dist/types/modes/components/iterm-pet-transport.d.ts +122 -0
  90. package/dist/types/modes/components/oauth-selector.d.ts +10 -4
  91. package/dist/types/modes/components/pet-capability.d.ts +7 -21
  92. package/dist/types/modes/components/settings-selector.d.ts +5 -0
  93. package/dist/types/modes/components/status-line/gh.d.ts +6 -2
  94. package/dist/types/modes/controllers/extension-ui-controller.d.ts +1 -1
  95. package/dist/types/modes/controllers/selector-controller.d.ts +7 -8
  96. package/dist/types/modes/controllers/stt-controller.d.ts +1 -1
  97. package/dist/types/modes/interactive-mode.d.ts +1 -0
  98. package/dist/types/modes/theme/defaults/index.d.ts +118 -0
  99. package/dist/types/modes/types.d.ts +1 -0
  100. package/dist/types/modes/utils/injected-user-submission.d.ts +10 -0
  101. package/dist/types/runtime-mcp/config.d.ts +9 -0
  102. package/dist/types/runtime-mcp/manager.d.ts +26 -1
  103. package/dist/types/runtime-mcp/oauth-discovery.d.ts +4 -0
  104. package/dist/types/runtime-mcp/oauth-flow.d.ts +24 -1
  105. package/dist/types/runtime-mcp/pool-key.d.ts +2 -0
  106. package/dist/types/runtime-mcp/protocol.d.ts +278 -0
  107. package/dist/types/runtime-mcp/scope-config.d.ts +29 -0
  108. package/dist/types/runtime-mcp/tool-bridge.d.ts +15 -13
  109. package/dist/types/runtime-mcp/transports/http.d.ts +9 -0
  110. package/dist/types/runtime-mcp/types.d.ts +102 -10
  111. package/dist/types/sdk/acp/adapter.d.ts +26 -5
  112. package/dist/types/sdk/broker/broker.d.ts +3 -55
  113. package/dist/types/sdk/broker/lifecycle.d.ts +18 -12
  114. package/dist/types/sdk/broker/session-index.d.ts +14 -5
  115. package/dist/types/sdk/broker/startup-failure.d.ts +16 -1
  116. package/dist/types/sdk/bus/chat-daemon-control.d.ts +51 -1
  117. package/dist/types/sdk/bus/chat-daemon-runtime.d.ts +4 -41
  118. package/dist/types/sdk/bus/config.d.ts +11 -0
  119. package/dist/types/sdk/bus/conversation-store.d.ts +0 -1
  120. package/dist/types/sdk/bus/daemon-paths.d.ts +6 -0
  121. package/dist/types/sdk/bus/discord-conversation.d.ts +2 -0
  122. package/dist/types/sdk/bus/discord-daemon.d.ts +17 -12
  123. package/dist/types/sdk/bus/existing-thread-readiness.d.ts +4 -34
  124. package/dist/types/sdk/bus/inbound-reaction-ordering.d.ts +61 -0
  125. package/dist/types/sdk/bus/index.d.ts +85 -99
  126. package/dist/types/sdk/bus/kind-aware-reconciliation.d.ts +29 -7
  127. package/dist/types/sdk/bus/managed-daemon.d.ts +2 -32
  128. package/dist/types/sdk/bus/notification-service.d.ts +52 -0
  129. package/dist/types/sdk/bus/operator-runtime.d.ts +1 -1
  130. package/dist/types/sdk/bus/prompt-reconciliation.d.ts +16 -5
  131. package/dist/types/sdk/bus/reconciliation-store.d.ts +113 -5
  132. package/dist/types/sdk/bus/session-control.d.ts +25 -1
  133. package/dist/types/sdk/bus/slack-conversation.d.ts +4 -0
  134. package/dist/types/sdk/bus/slack-daemon.d.ts +9 -17
  135. package/dist/types/sdk/bus/slack-live-provider.d.ts +3 -1
  136. package/dist/types/sdk/bus/slack-provider.d.ts +4 -0
  137. package/dist/types/sdk/bus/slack-thread-binding.d.ts +6 -40
  138. package/dist/types/sdk/bus/telegram-adoption-intent.d.ts +30 -104
  139. package/dist/types/sdk/bus/telegram-daemon-cli.d.ts +10 -0
  140. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +262 -19
  141. package/dist/types/sdk/bus/telegram-daemon-orphan-reap.d.ts +125 -0
  142. package/dist/types/sdk/bus/telegram-daemon-owner-registry.d.ts +22 -0
  143. package/dist/types/sdk/bus/telegram-daemon.d.ts +119 -310
  144. package/dist/types/sdk/bus/telegram-reference.d.ts +1 -47
  145. package/dist/types/sdk/bus/threaded-render.d.ts +1 -0
  146. package/dist/types/sdk/bus/topic-registry.d.ts +33 -17
  147. package/dist/types/sdk/cli/rows.d.ts +2 -11
  148. package/dist/types/sdk/cli/session-cli.d.ts +15 -25
  149. package/dist/types/sdk/client/client.d.ts +97 -1
  150. package/dist/types/sdk/host/control/dispatch.d.ts +0 -7
  151. package/dist/types/sdk/host/control/index.d.ts +1 -1
  152. package/dist/types/sdk/host/control/operations.d.ts +18 -5
  153. package/dist/types/sdk/host/control/runtime-gate.d.ts +19 -0
  154. package/dist/types/sdk/host/host.d.ts +15 -1
  155. package/dist/types/sdk/host/query/handlers.d.ts +5 -0
  156. package/dist/types/sdk/host/reverse-leases.d.ts +1 -1
  157. package/dist/types/sdk/host/session-runtime.d.ts +127 -7
  158. package/dist/types/sdk/host/types.d.ts +1 -1
  159. package/dist/types/sdk/host/websocket-transport.d.ts +1 -1
  160. package/dist/types/sdk/index.d.ts +2 -1
  161. package/dist/types/sdk/lifecycle/broker-client.d.ts +8 -0
  162. package/dist/types/sdk/lifecycle/client.d.ts +59 -0
  163. package/dist/types/sdk/lifecycle/index.d.ts +3 -0
  164. package/dist/types/sdk/lifecycle/service.d.ts +232 -0
  165. package/dist/types/sdk/mcp/server.d.ts +9 -6
  166. package/dist/types/sdk/prompt-deadline-lease.d.ts +43 -0
  167. package/dist/types/sdk/prompt-deadline-manager.d.ts +28 -0
  168. package/dist/types/sdk/prompt-status.d.ts +10 -3
  169. package/dist/types/sdk/protocol/operation-registry.d.ts +5 -0
  170. package/dist/types/sdk/receipt-state.d.ts +17 -0
  171. package/dist/types/sdk/reconciliation-extensions.d.ts +2 -0
  172. package/dist/types/sdk/router/index.d.ts +1 -0
  173. package/dist/types/sdk/router/session-router.d.ts +152 -0
  174. package/dist/types/sdk/session-list.d.ts +22 -0
  175. package/dist/types/sdk/session-reconnect.d.ts +43 -1
  176. package/dist/types/sdk/session.d.ts +34 -1
  177. package/dist/types/sdk/transport/serve-cli.d.ts +1 -4
  178. package/dist/types/session/account-inventory.d.ts +86 -0
  179. package/dist/types/session/agent-session.d.ts +145 -6
  180. package/dist/types/session/agent-storage.d.ts +10 -0
  181. package/dist/types/session/coordinator-tool-label.d.ts +28 -0
  182. package/dist/types/session/internal/managed-session-storage.d.ts +23 -4
  183. package/dist/types/session/messages.d.ts +1 -1
  184. package/dist/types/session/secure-token-file.d.ts +3 -0
  185. package/dist/types/session/session-manager.d.ts +47 -1
  186. package/dist/types/session/startup-auth-config.d.ts +44 -0
  187. package/dist/types/session/terminal-abort.d.ts +378 -0
  188. package/dist/types/session/yield-queue.d.ts +7 -0
  189. package/dist/types/session-import/claude.d.ts +26 -0
  190. package/dist/types/session-import/codex.d.ts +88 -0
  191. package/dist/types/session-import/command.d.ts +35 -0
  192. package/dist/types/session-import/detect.d.ts +22 -0
  193. package/dist/types/session-import/index.d.ts +7 -0
  194. package/dist/types/session-import/provider-codex.d.ts +22 -0
  195. package/dist/types/session-import/provider-service.d.ts +38 -0
  196. package/dist/types/session-import/redact.d.ts +23 -0
  197. package/dist/types/session-import/service.d.ts +47 -0
  198. package/dist/types/session-import/types.d.ts +120 -0
  199. package/dist/types/setup/paseo/check.d.ts +16 -0
  200. package/dist/types/setup/paseo/install-saga.d.ts +115 -0
  201. package/dist/types/setup/paseo/json-publisher.d.ts +76 -0
  202. package/dist/types/setup/paseo/orchestration-preferences.d.ts +24 -0
  203. package/dist/types/setup/paseo/paseo-ownership.d.ts +87 -0
  204. package/dist/types/setup/paseo/paseo-setup.d.ts +29 -0
  205. package/dist/types/setup/paseo/provider-config.d.ts +35 -0
  206. package/dist/types/setup/paseo/remove.d.ts +14 -0
  207. package/dist/types/setup/paseo/result-types.d.ts +59 -0
  208. package/dist/types/setup/paseo/setup-deps.d.ts +73 -0
  209. package/dist/types/setup/paseo/skills-bridge.d.ts +44 -0
  210. package/dist/types/skill-state/active-state.d.ts +5 -1
  211. package/dist/types/slash-commands/acp-builtins.d.ts +5 -1
  212. package/dist/types/slash-commands/builtin-registry.d.ts +2 -0
  213. package/dist/types/slash-commands/helpers/credential-switch.d.ts +12 -0
  214. package/dist/types/slash-commands/helpers/usage-report.d.ts +5 -6
  215. package/dist/types/slash-commands/types.d.ts +7 -1
  216. package/dist/types/task/executor.d.ts +10 -0
  217. package/dist/types/task/index.d.ts +3 -1
  218. package/dist/types/tools/ask-answer-registry.d.ts +6 -3
  219. package/dist/types/tools/bash-sleep-advisory.d.ts +14 -0
  220. package/dist/types/tools/bash.d.ts +2 -6
  221. package/dist/types/tools/browser/attach.d.ts +11 -0
  222. package/dist/types/tools/browser/launch.d.ts +20 -0
  223. package/dist/types/tools/browser/profile-discovery.d.ts +6 -0
  224. package/dist/types/tools/browser/render.d.ts +1 -0
  225. package/dist/types/tools/browser.d.ts +3 -1
  226. package/dist/types/tools/image-gen.d.ts +10 -2
  227. package/dist/types/tools/index.d.ts +8 -0
  228. package/dist/types/tools/monitor.d.ts +1 -1
  229. package/dist/types/tools/skill-discovery.d.ts +8 -1
  230. package/dist/types/tools/subagent.d.ts +2 -0
  231. package/dist/types/tools/ultragoal-ask-guard.d.ts +2 -2
  232. package/dist/types/utils/herdr-pane.d.ts +76 -0
  233. package/package.json +19 -9
  234. package/scripts/build-binary.ts +2 -1
  235. package/scripts/build-sdk-package-smoke.ts +2 -13
  236. package/scripts/capture-sticky-viewport-showcase.ts +0 -1
  237. package/scripts/compile-args.ts +2 -0
  238. package/scripts/generate-sdk-adapter-parity-manifest.ts +31 -16
  239. package/scripts/generate-sdk-operation-inventory.ts +28 -0
  240. package/scripts/generate-telegram-baseline-manifest.ts +1 -0
  241. package/scripts/generate-tool-catalog.ts +6 -4
  242. package/scripts/verify-gjc-sdk-canonicalization.ts +5 -39
  243. package/src/async/job-manager.ts +352 -17
  244. package/src/async/support.ts +25 -0
  245. package/src/autoresearch/dashboard.ts +28 -13
  246. package/src/capability/index.ts +3 -1
  247. package/src/capability/mcp.ts +6 -0
  248. package/src/capability/types.ts +6 -0
  249. package/src/cli/accounts-cli.ts +395 -0
  250. package/src/cli/args.ts +23 -0
  251. package/src/cli/auth-broker-cli.ts +136 -66
  252. package/src/cli/auth-gateway-cli.ts +94 -70
  253. package/src/cli/config-cli.ts +27 -2
  254. package/src/cli/crash-cli.ts +78 -0
  255. package/src/cli/customize-doctor.ts +1605 -0
  256. package/src/cli/daemon-cli.ts +12 -3
  257. package/src/cli/fast-help.ts +1 -0
  258. package/src/cli/mcp-cli.ts +128 -60
  259. package/src/cli/notify-cli.ts +8 -14
  260. package/src/cli/root-flags.ts +8 -0
  261. package/src/cli/setup-cli.ts +145 -0
  262. package/src/cli/skills-cli.ts +38 -2
  263. package/src/cli/update-cli.ts +167 -12
  264. package/src/cli.ts +4 -0
  265. package/src/commands/accounts.ts +71 -0
  266. package/src/commands/crash.ts +35 -0
  267. package/src/commands/customize.ts +84 -0
  268. package/src/commands/daemon.ts +2 -2
  269. package/src/commands/deep-interview.ts +2 -0
  270. package/src/commands/launch.ts +1 -0
  271. package/src/commands/mcp.ts +12 -7
  272. package/src/commands/ralplan.ts +2 -0
  273. package/src/commands/sdk.ts +65 -32
  274. package/src/commands/setup.ts +5 -0
  275. package/src/commands/skills.ts +14 -4
  276. package/src/commands/ultragoal.ts +10 -1
  277. package/src/commands/update.ts +26 -15
  278. package/src/config/atomic-yaml-patch-worker.ts +57 -0
  279. package/src/config/atomic-yaml-patch.ts +769 -29
  280. package/src/config/config-schema-version.ts +10 -0
  281. package/src/config/file-lock.ts +70 -1
  282. package/src/config/mcp-schema.json +52 -14
  283. package/src/config/model-profile-activation.ts +23 -2
  284. package/src/config/model-profiles.ts +88 -21
  285. package/src/config/model-registry.ts +147 -21
  286. package/src/config/models-config-schema.ts +1 -1
  287. package/src/config/settings-schema.ts +77 -7
  288. package/src/config/settings.ts +4038 -199
  289. package/src/config/skill-settings-defaults.ts +41 -3
  290. package/src/config/task-delegation.ts +87 -0
  291. package/src/config/update-channel.ts +23 -0
  292. package/src/coordinator-mcp/server.ts +377 -308
  293. package/src/crash/index-store.ts +723 -0
  294. package/src/crash/nudge.ts +89 -0
  295. package/src/crash/record-loader.ts +149 -0
  296. package/src/crash/report.ts +551 -0
  297. package/src/crash/sanitize.ts +129 -0
  298. package/src/cursor.ts +36 -10
  299. package/src/customization/import.ts +946 -0
  300. package/src/customization/index.ts +4 -0
  301. package/src/customization/inventory.ts +335 -0
  302. package/src/customization/mutations.ts +141 -0
  303. package/src/customization/types.ts +223 -0
  304. package/src/daemon/control-types.ts +8 -1
  305. package/src/daemon/operator-contract.ts +6 -6
  306. package/src/defaults/gjc/extensions/grok-cli-vendor/src/models/catalog.ts +31 -6
  307. package/src/defaults/gjc/skills/deep-interview/SKILL.md +11 -22
  308. package/src/defaults/gjc/skills/ralplan/SKILL.md +36 -23
  309. package/src/defaults/gjc/skills/ultragoal/SKILL.md +16 -0
  310. package/src/discovery/claude-hooks.ts +38 -0
  311. package/src/discovery/claude.ts +142 -209
  312. package/src/discovery/codex-hooks.ts +38 -0
  313. package/src/discovery/codex.ts +132 -198
  314. package/src/discovery/helpers.ts +8 -1
  315. package/src/discovery/index.ts +2 -0
  316. package/src/discovery/mcp-compat.ts +234 -0
  317. package/src/discovery/mcp-json.ts +6 -0
  318. package/src/edit/renderer.ts +40 -0
  319. package/src/edit/streaming.ts +4 -2
  320. package/src/exec/bash-executor.ts +24 -20
  321. package/src/export/html/index.ts +51 -2
  322. package/src/extensibility/extensions/loader.ts +9 -1
  323. package/src/extensibility/extensions/runner.ts +17 -4
  324. package/src/extensibility/extensions/types.ts +31 -6
  325. package/src/extensibility/gjc-plugins/constrained-hooks.ts +33 -0
  326. package/src/extensibility/gjc-plugins/installer.ts +9 -5
  327. package/src/extensibility/gjc-plugins/observability.ts +8 -2
  328. package/src/extensibility/gjc-plugins/registry.ts +13 -2
  329. package/src/extensibility/gjc-plugins/runtime-adapters.ts +3 -1
  330. package/src/extensibility/gjc-plugins/schema.ts +222 -39
  331. package/src/extensibility/hooks/loader.ts +154 -10
  332. package/src/extensibility/runtime-skill-discovery.ts +257 -60
  333. package/src/extensibility/skill-management.ts +368 -0
  334. package/src/extensibility/skills.ts +52 -16
  335. package/src/gjc-runtime/deep-interview-runtime.ts +45 -61
  336. package/src/gjc-runtime/launch-worktree.ts +56 -2
  337. package/src/gjc-runtime/linux-proc.ts +7 -1
  338. package/src/gjc-runtime/ralplan-runtime.ts +100 -164
  339. package/src/gjc-runtime/session-state-lock.ts +992 -0
  340. package/src/gjc-runtime/session-state-sidecar.ts +644 -142
  341. package/src/gjc-runtime/state-writer.ts +39 -14
  342. package/src/gjc-runtime/tmux-owner-isolation.ts +5 -4
  343. package/src/gjc-runtime/ultragoal-guard.ts +11 -4
  344. package/src/gjc-runtime/ultragoal-runtime.ts +44 -41
  345. package/src/gjc-runtime/workflow-settings.ts +596 -0
  346. package/src/goals/tools/goal-tool.ts +6 -1
  347. package/src/hooks/events.ts +291 -0
  348. package/src/hooks/native-skill-hook.ts +4 -0
  349. package/src/hooks/normalize.ts +369 -0
  350. package/src/hooks/skill-state.ts +165 -46
  351. package/src/internal-urls/docs-index.generated.ts +41 -32
  352. package/src/main.ts +36 -5
  353. package/src/migrate/mcp-mapper.ts +25 -2
  354. package/src/modes/acp/abort-scope.ts +29 -0
  355. package/src/modes/acp/acp-agent.ts +423 -98
  356. package/src/modes/components/assistant-message.ts +6 -1
  357. package/src/modes/components/chrome.ts +4 -3
  358. package/src/modes/components/customization/customization-dashboard.ts +443 -0
  359. package/src/modes/components/customization/import-wizard.ts +372 -0
  360. package/src/modes/components/customization/index.ts +1 -0
  361. package/src/modes/components/dynamic-theme-text.ts +22 -0
  362. package/src/modes/components/gajae-pet-widget.ts +607 -193
  363. package/src/modes/components/irc-sidebar.ts +11 -0
  364. package/src/modes/components/iterm-pet-transport.ts +585 -0
  365. package/src/modes/components/model-selector.ts +1 -6
  366. package/src/modes/components/oauth-selector.ts +277 -86
  367. package/src/modes/components/pet-capability.ts +35 -31
  368. package/src/modes/components/settings-selector.ts +29 -5
  369. package/src/modes/components/status-line/gh.ts +45 -1
  370. package/src/modes/components/status-line/segments.ts +19 -4
  371. package/src/modes/components/tool-status-header.ts +13 -3
  372. package/src/modes/controllers/command-controller.ts +20 -8
  373. package/src/modes/controllers/extension-ui-controller.ts +56 -257
  374. package/src/modes/controllers/input-controller.ts +10 -0
  375. package/src/modes/controllers/runtime-mcp-command-controller.ts +16 -3
  376. package/src/modes/controllers/selector-controller.ts +238 -77
  377. package/src/modes/controllers/stt-controller.ts +3 -3
  378. package/src/modes/interactive-mode.ts +88 -16
  379. package/src/modes/print-mode.ts +35 -6
  380. package/src/modes/runtime-init.ts +21 -68
  381. package/src/modes/theme/defaults/index.ts +2 -0
  382. package/src/modes/theme/defaults/ouroboros.json +118 -0
  383. package/src/modes/types.ts +1 -0
  384. package/src/modes/utils/injected-user-submission.ts +25 -0
  385. package/src/modes/utils/terminal-bell.ts +15 -1
  386. package/src/prompts/agent-fragments/ralplan-persistence.md +1 -1
  387. package/src/prompts/agent-fragments/restricted-bash.md +1 -1
  388. package/src/prompts/agents/critic.md +1 -1
  389. package/src/prompts/system/rlm-research.md +1 -1
  390. package/src/prompts/system/system-prompt.md +0 -2
  391. package/src/prompts/tools/bash.md +7 -1
  392. package/src/prompts/tools/browser.md +1 -1
  393. package/src/prompts/tools/cron.md +6 -6
  394. package/src/prompts/tools/read.md +0 -2
  395. package/src/prompts/tools/skill-discovery.md +4 -2
  396. package/src/runtime-mcp/client.ts +427 -23
  397. package/src/runtime-mcp/config.ts +37 -5
  398. package/src/runtime-mcp/manager-pool.test.ts +56 -0
  399. package/src/runtime-mcp/manager.ts +52 -2
  400. package/src/runtime-mcp/oauth-discovery.ts +13 -0
  401. package/src/runtime-mcp/oauth-flow.ts +46 -1
  402. package/src/runtime-mcp/pool-key.ts +5 -1
  403. package/src/runtime-mcp/pool.test.ts +9 -0
  404. package/src/runtime-mcp/protocol.test.ts +353 -0
  405. package/src/runtime-mcp/protocol.ts +624 -0
  406. package/src/runtime-mcp/scope-config.ts +78 -0
  407. package/src/runtime-mcp/tool-bridge.ts +44 -10
  408. package/src/runtime-mcp/transports/http.ts +84 -13
  409. package/src/runtime-mcp/types.ts +123 -12
  410. package/src/sdk/acp/adapter.ts +328 -97
  411. package/src/sdk/broker/broker.ts +160 -741
  412. package/src/sdk/broker/ensure.ts +9 -1
  413. package/src/sdk/broker/lifecycle.ts +510 -116
  414. package/src/sdk/broker/operation-receipt-ledger.ts +11 -2
  415. package/src/sdk/broker/process-incarnation.ts +19 -0
  416. package/src/sdk/broker/session-index.ts +516 -117
  417. package/src/sdk/broker/startup-failure.ts +28 -5
  418. package/src/sdk/broker/transport.ts +1 -13
  419. package/src/sdk/bus/chat-daemon-cli.ts +4 -2
  420. package/src/sdk/bus/chat-daemon-control.ts +67 -6
  421. package/src/sdk/bus/chat-daemon-runtime.ts +183 -859
  422. package/src/sdk/bus/config.ts +13 -0
  423. package/src/sdk/bus/conversation-store.ts +59 -171
  424. package/src/sdk/bus/daemon-paths.ts +20 -0
  425. package/src/sdk/bus/discord-conversation.ts +2 -0
  426. package/src/sdk/bus/discord-daemon.ts +524 -126
  427. package/src/sdk/bus/discord-live-provider.ts +206 -79
  428. package/src/sdk/bus/existing-thread-readiness.ts +4 -97
  429. package/src/sdk/bus/inbound-reaction-ordering.ts +122 -0
  430. package/src/sdk/bus/index.ts +2480 -456
  431. package/src/sdk/bus/kind-aware-reconciliation.ts +204 -34
  432. package/src/sdk/bus/lifecycle-commands.ts +2 -2
  433. package/src/sdk/bus/managed-daemon.ts +2 -145
  434. package/src/sdk/bus/notification-service.ts +196 -0
  435. package/src/sdk/bus/operator-runtime.ts +1 -1
  436. package/src/sdk/bus/prompt-reconciliation.ts +24 -15
  437. package/src/sdk/bus/reconciliation-store.ts +553 -24
  438. package/src/sdk/bus/session-control.ts +49 -3
  439. package/src/sdk/bus/slack-conversation.ts +4 -0
  440. package/src/sdk/bus/slack-daemon.ts +733 -134
  441. package/src/sdk/bus/slack-live-provider.ts +65 -15
  442. package/src/sdk/bus/slack-provider.ts +4 -0
  443. package/src/sdk/bus/slack-thread-binding.ts +9 -104
  444. package/src/sdk/bus/telegram-adoption-intent.ts +299 -209
  445. package/src/sdk/bus/telegram-daemon-cli.ts +194 -7
  446. package/src/sdk/bus/telegram-daemon-contract.ts +265 -19
  447. package/src/sdk/bus/telegram-daemon-control.ts +3 -13
  448. package/src/sdk/bus/telegram-daemon-orphan-reap.ts +498 -0
  449. package/src/sdk/bus/telegram-daemon-owner-registry.ts +176 -0
  450. package/src/sdk/bus/telegram-daemon.ts +2552 -2280
  451. package/src/sdk/bus/telegram-reference.ts +1 -226
  452. package/src/sdk/bus/telegram-setup.ts +2 -2
  453. package/src/sdk/bus/threaded-render.ts +1 -0
  454. package/src/sdk/bus/topic-registry.ts +279 -146
  455. package/src/sdk/cli/rows.ts +2 -35
  456. package/src/sdk/cli/session-cli.ts +776 -700
  457. package/src/sdk/client/client.ts +892 -1
  458. package/src/sdk/host/control/dispatch.ts +93 -58
  459. package/src/sdk/host/control/index.ts +1 -1
  460. package/src/sdk/host/control/operations.ts +18 -10
  461. package/src/sdk/host/control/runtime-gate.ts +40 -0
  462. package/src/sdk/host/host.ts +63 -12
  463. package/src/sdk/host/query/handlers.ts +66 -7
  464. package/src/sdk/host/reverse-leases.ts +2 -2
  465. package/src/sdk/host/sdk-surface-parity.test.ts +1 -1
  466. package/src/sdk/host/session-runtime.test.ts +2787 -34
  467. package/src/sdk/host/session-runtime.ts +1489 -101
  468. package/src/sdk/host/surface-policy.ts +12 -8
  469. package/src/sdk/host/types.ts +1 -1
  470. package/src/sdk/host/websocket-transport.lifecycle.test.ts +31 -59
  471. package/src/sdk/host/websocket-transport.ts +85 -50
  472. package/src/sdk/index.ts +2 -1
  473. package/src/sdk/lifecycle/broker-client.ts +53 -0
  474. package/src/sdk/lifecycle/client.ts +234 -0
  475. package/src/sdk/lifecycle/index.ts +3 -0
  476. package/src/sdk/{bus/recent-activity.ts → lifecycle/recent-sessions.ts} +5 -2
  477. package/src/sdk/lifecycle/service.ts +720 -0
  478. package/src/sdk/mcp/server.ts +226 -188
  479. package/src/sdk/prompt-deadline-lease.ts +55 -0
  480. package/src/sdk/prompt-deadline-manager.ts +148 -0
  481. package/src/sdk/prompt-status.ts +11 -3
  482. package/src/sdk/protocol/operation-inventory.generated.json +272 -129
  483. package/src/sdk/protocol/operation-registry.ts +71 -8
  484. package/src/sdk/receipt-state.ts +43 -0
  485. package/src/sdk/reconciliation-extensions.ts +14 -0
  486. package/src/sdk/router/index.ts +1 -0
  487. package/src/sdk/router/session-router.ts +1658 -0
  488. package/src/sdk/session-list.ts +93 -0
  489. package/src/sdk/session-reconnect.ts +45 -1
  490. package/src/sdk/session.ts +716 -120
  491. package/src/sdk/transport/serve-cli.ts +18 -34
  492. package/src/session/account-inventory.ts +603 -0
  493. package/src/session/agent-session.ts +2873 -559
  494. package/src/session/agent-storage.ts +35 -0
  495. package/src/session/blob-store.ts +32 -1
  496. package/src/session/coordinator-tool-label.ts +40 -0
  497. package/src/session/internal/managed-session-scope.ts +4 -0
  498. package/src/session/internal/managed-session-storage.ts +199 -31
  499. package/src/session/messages.ts +1 -1
  500. package/src/session/secure-token-file.ts +80 -0
  501. package/src/session/session-manager.ts +757 -57
  502. package/src/session/session-storage.ts +25 -16
  503. package/src/session/startup-auth-config.ts +297 -0
  504. package/src/session/terminal-abort.ts +1253 -0
  505. package/src/session/yield-queue.ts +57 -15
  506. package/src/session-import/claude.ts +334 -0
  507. package/src/session-import/codex.ts +1033 -0
  508. package/src/session-import/command.ts +77 -0
  509. package/src/session-import/detect.ts +133 -0
  510. package/src/session-import/index.ts +7 -0
  511. package/src/session-import/provider-codex.ts +327 -0
  512. package/src/session-import/provider-service.ts +457 -0
  513. package/src/session-import/redact.ts +128 -0
  514. package/src/session-import/service.ts +1264 -0
  515. package/src/session-import/types.ts +148 -0
  516. package/src/setup/paseo/check.ts +213 -0
  517. package/src/setup/paseo/install-saga.ts +293 -0
  518. package/src/setup/paseo/json-publisher.ts +263 -0
  519. package/src/setup/paseo/orchestration-preferences.ts +86 -0
  520. package/src/setup/paseo/paseo-ownership.ts +224 -0
  521. package/src/setup/paseo/paseo-setup.ts +253 -0
  522. package/src/setup/paseo/provider-config.ts +139 -0
  523. package/src/setup/paseo/remove.ts +183 -0
  524. package/src/setup/paseo/result-types.ts +79 -0
  525. package/src/setup/paseo/setup-deps.ts +175 -0
  526. package/src/setup/paseo/skills-bridge.ts +260 -0
  527. package/src/skill-state/active-state.ts +21 -11
  528. package/src/slash-commands/acp-builtins.ts +9 -1
  529. package/src/slash-commands/builtin-registry.ts +117 -19
  530. package/src/slash-commands/helpers/credential-switch.ts +143 -0
  531. package/src/slash-commands/helpers/mcp.ts +9 -3
  532. package/src/slash-commands/helpers/usage-report.ts +61 -56
  533. package/src/slash-commands/types.ts +7 -2
  534. package/src/task/executor.ts +30 -11
  535. package/src/task/index.ts +66 -7
  536. package/src/task/render.ts +23 -9
  537. package/src/tools/ask-answer-registry.ts +23 -7
  538. package/src/tools/ask.ts +8 -4
  539. package/src/tools/bash-sleep-advisory.ts +115 -0
  540. package/src/tools/bash.ts +98 -18
  541. package/src/tools/browser/attach.ts +71 -3
  542. package/src/tools/browser/launch.ts +86 -13
  543. package/src/tools/browser/profile-discovery.ts +57 -7
  544. package/src/tools/browser/render.ts +8 -1
  545. package/src/tools/browser.ts +130 -21
  546. package/src/tools/computer.enforcement.test.ts +1 -1
  547. package/src/tools/computer.ts +3 -2
  548. package/src/tools/cron.ts +12 -1
  549. package/src/tools/image-gen.ts +349 -142
  550. package/src/tools/index.ts +8 -0
  551. package/src/tools/job.ts +33 -6
  552. package/src/tools/monitor.ts +41 -2
  553. package/src/tools/skill-discovery.ts +21 -29
  554. package/src/tools/subagent.ts +142 -24
  555. package/src/tools/todo-contract.ts +55 -3
  556. package/src/tools/todo-write.ts +4 -3
  557. package/src/tools/tool-catalog.generated.ts +6 -6
  558. package/src/tools/ultragoal-ask-guard.ts +10 -3
  559. package/src/utils/herdr-pane.ts +345 -0
  560. package/src/utils/title-generator.ts +2 -0
  561. package/src/web/scrapers/index.ts +6 -4
  562. package/dist/types/cli/malloc-env-guard.test.d.ts +0 -1
  563. package/dist/types/defaults/gjc-defaults.test.d.ts +0 -1
  564. package/dist/types/memory-backend/lazy-loading.test.d.ts +0 -1
  565. package/dist/types/runtime/boot-ordering.test.d.ts +0 -1
  566. package/dist/types/runtime/lazy-service.test.d.ts +0 -1
  567. package/dist/types/runtime/network-prewarm-service.test.d.ts +0 -1
  568. package/dist/types/runtime/workspace-tree-service.test.d.ts +0 -1
  569. package/dist/types/runtime-mcp/config.test.d.ts +0 -1
  570. package/dist/types/runtime-mcp/http.test.d.ts +0 -1
  571. package/dist/types/runtime-mcp/manager-pool.test.d.ts +0 -1
  572. package/dist/types/runtime-mcp/pool-key.test.d.ts +0 -1
  573. package/dist/types/runtime-mcp/pool.test.d.ts +0 -1
  574. package/dist/types/sdk/bus/lifecycle-control-runtime.d.ts +0 -117
  575. package/dist/types/sdk/bus/lifecycle-orchestrator.d.ts +0 -141
  576. package/dist/types/sdk/bus/telegram-cli.d.ts +0 -31
  577. package/dist/types/sdk/elevation/allowlist.d.ts +0 -20
  578. package/dist/types/sdk/elevation/audit.d.ts +0 -93
  579. package/dist/types/sdk/elevation/capability.d.ts +0 -3
  580. package/dist/types/sdk/elevation/digest.d.ts +0 -72
  581. package/dist/types/sdk/elevation/dispatch-receipt.d.ts +0 -85
  582. package/dist/types/sdk/elevation/grant-ledger.d.ts +0 -163
  583. package/dist/types/sdk/elevation/owner.d.ts +0 -48
  584. package/dist/types/sdk/host/import-graph.test.d.ts +0 -1
  585. package/dist/types/sdk/host/sdk-surface-parity.test.d.ts +0 -1
  586. package/dist/types/sdk/host/session-runtime.test.d.ts +0 -1
  587. package/dist/types/sdk/host/websocket-transport.lifecycle.test.d.ts +0 -1
  588. package/dist/types/session/auth-broker-config.d.ts +0 -13
  589. package/dist/types/session/heap-eviction-artifacts.test.d.ts +0 -1
  590. package/dist/types/skills/skills.test.d.ts +0 -1
  591. package/dist/types/slash-commands/notify-command.test.d.ts +0 -1
  592. package/dist/types/task/token-log.test.d.ts +0 -1
  593. package/dist/types/tools/computer.enforcement.test.d.ts +0 -1
  594. package/dist/types/tools/descriptors.test.d.ts +0 -1
  595. package/scripts/g005-daemon-smoke.ts +0 -180
  596. package/scripts/g011-daemon-path-smoke.ts +0 -153
  597. package/src/sdk/bus/lifecycle-control-runtime.ts +0 -1733
  598. package/src/sdk/bus/lifecycle-orchestrator.ts +0 -489
  599. package/src/sdk/bus/telegram-cli.ts +0 -212
  600. package/src/sdk/elevation/allowlist.ts +0 -54
  601. package/src/sdk/elevation/audit.ts +0 -208
  602. package/src/sdk/elevation/capability.ts +0 -41
  603. package/src/sdk/elevation/digest.ts +0 -129
  604. package/src/sdk/elevation/dispatch-receipt.ts +0 -184
  605. package/src/sdk/elevation/grant-ledger.ts +0 -1142
  606. package/src/sdk/elevation/owner.ts +0 -109
  607. package/src/session/auth-broker-config.ts +0 -109
  608. /package/dist/types/{ai-core-import-gate.test.d.ts → discovery/claude-hooks.d.ts} +0 -0
  609. /package/dist/types/{cli/fixture-report.test.d.ts → discovery/codex-hooks.d.ts} +0 -0
  610. /package/dist/types/sdk/{bus/recent-activity.d.ts → lifecycle/recent-sessions.d.ts} +0 -0
@@ -0,0 +1,77 @@
1
+ /**
2
+ * `/import-session` slash-command surface (issue #3709).
3
+ *
4
+ * The documented CLI contract:
5
+ *
6
+ * /import-session <transcript-file> [--provider codex|claude]
7
+ *
8
+ * The file argument is an explicit user-selected Codex rollout transcript,
9
+ * Claude Code transcript, or claude.ai export. Provider detection is automatic;
10
+ * `--provider` narrows it and fails closed on a mismatch.
11
+ */
12
+
13
+ import { parseCommandArgs } from "../utils/command-args";
14
+ import { formatProviderSessionImportError, importProviderSessionFile } from "./provider-service";
15
+ import type { SessionImportCompleted, SessionImportProviderId } from "./types";
16
+
17
+ export const IMPORT_SESSION_USAGE = "Usage: /import-session <transcript-file> [--provider codex|claude]";
18
+
19
+ export type ParsedImportSessionArgs =
20
+ | { kind: "ok"; sourcePath: string; provider?: SessionImportProviderId }
21
+ | { kind: "error"; message: string };
22
+
23
+ export function parseImportSessionArgs(args: string): ParsedImportSessionArgs {
24
+ const tokens = parseCommandArgs(args);
25
+ let provider: SessionImportProviderId | undefined;
26
+ const positional: string[] = [];
27
+ for (let index = 0; index < tokens.length; index++) {
28
+ const token = tokens[index]!;
29
+ if (token === "--provider" || token.startsWith("--provider=")) {
30
+ const value = token === "--provider" ? tokens[++index] : token.slice("--provider=".length);
31
+ if (value !== "codex" && value !== "claude") {
32
+ return { kind: "error", message: `--provider must be codex or claude.\n${IMPORT_SESSION_USAGE}` };
33
+ }
34
+ if (provider && provider !== value) {
35
+ return { kind: "error", message: `Conflicting --provider values.\n${IMPORT_SESSION_USAGE}` };
36
+ }
37
+ provider = value;
38
+ continue;
39
+ }
40
+ if (token.startsWith("--")) {
41
+ return { kind: "error", message: `Unknown option: ${token}\n${IMPORT_SESSION_USAGE}` };
42
+ }
43
+ positional.push(token);
44
+ }
45
+ if (positional.length === 0) return { kind: "error", message: IMPORT_SESSION_USAGE };
46
+ if (positional.length > 1) {
47
+ return {
48
+ kind: "error",
49
+ message: `Expected exactly one transcript file; got ${positional.length} arguments.\n${IMPORT_SESSION_USAGE}`,
50
+ };
51
+ }
52
+ return { kind: "ok", sourcePath: positional[0]!, ...(provider ? { provider } : {}) };
53
+ }
54
+
55
+ export type SessionImportCommandOutcome =
56
+ | { kind: "imported"; result: SessionImportCompleted }
57
+ | { kind: "error"; message: string };
58
+
59
+ /**
60
+ * Shared non-UI flow for both the text/ACP handler and the TUI handler:
61
+ * import into a NEW session file; the caller decides how to present/switch.
62
+ * Never mutates the current session.
63
+ */
64
+ export async function runSessionImportCommand(args: string, cwd: string): Promise<SessionImportCommandOutcome> {
65
+ const parsed = parseImportSessionArgs(args);
66
+ if (parsed.kind === "error") return { kind: "error", message: parsed.message };
67
+ try {
68
+ const result = await importProviderSessionFile({
69
+ sourcePath: parsed.sourcePath,
70
+ ...(parsed.provider ? { provider: parsed.provider } : {}),
71
+ cwd,
72
+ });
73
+ return { kind: "imported", result };
74
+ } catch (error) {
75
+ return { kind: "error", message: formatProviderSessionImportError(error) };
76
+ }
77
+ }
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Deterministic source-format detection (issue #3709).
3
+ *
4
+ * Detection inspects only the already-read source bytes: a bounded leading
5
+ * sample decides JSONL-vs-JSON and provider by envelope markers. An explicit
6
+ * `--provider` selection narrows candidates; a sample that matches a different
7
+ * provider than requested fails closed with `format_mismatch`. Detection never
8
+ * guesses: a sample matching no supported envelope fails with
9
+ * `unsupported_format` rather than falling back to a speculative parse.
10
+ */
11
+
12
+ import { SessionImportError, type SessionImportFormatId, type SessionImportProviderId } from "./types";
13
+
14
+ /** Leading bytes consulted for envelope sniffing. */
15
+ const DETECTION_SAMPLE_BYTES = 256 * 1024;
16
+
17
+ type JsonRecord = Record<string, unknown>;
18
+
19
+ function isRecord(value: unknown): value is JsonRecord {
20
+ return typeof value === "object" && value !== null && !Array.isArray(value);
21
+ }
22
+
23
+ export interface SessionImportDetection {
24
+ provider: SessionImportProviderId;
25
+ format: SessionImportFormatId;
26
+ }
27
+
28
+ function detectJsonlFormat(text: string): SessionImportDetection | undefined {
29
+ const lines = text.split("\n");
30
+ let sawCodex = false;
31
+ let sawClaude = false;
32
+ let examined = 0;
33
+ for (const line of lines) {
34
+ const trimmed = line.trim();
35
+ if (trimmed.length === 0) continue;
36
+ let value: unknown;
37
+ try {
38
+ value = JSON.parse(trimmed);
39
+ } catch {
40
+ // A malformed early line does not decide detection; the adapter reports it.
41
+ if (examined >= 8) break;
42
+ continue;
43
+ }
44
+ if (!isRecord(value)) continue;
45
+ examined++;
46
+ if (value.type === "session_meta" && isRecord(value.payload))
47
+ return { provider: "codex", format: "codex-rollout-jsonl" };
48
+ if (value.type === "response_item" || value.type === "turn_context" || value.type === "world_state")
49
+ sawCodex = true;
50
+ if (value.type === "event_msg") sawCodex = true;
51
+ if (
52
+ (value.type === "user" || value.type === "assistant" || value.type === "summary" || value.type === "system") &&
53
+ (value.sessionId !== undefined ||
54
+ value.parentUuid !== undefined ||
55
+ value.leafUuid !== undefined ||
56
+ isRecord(value.message))
57
+ ) {
58
+ sawClaude = true;
59
+ }
60
+ if (sawCodex && sawClaude) break;
61
+ if (examined >= 32) break;
62
+ }
63
+ if (sawCodex && !sawClaude) return { provider: "codex", format: "codex-rollout-jsonl" };
64
+ if (sawClaude && !sawCodex) return { provider: "claude", format: "claude-code-jsonl" };
65
+ return undefined;
66
+ }
67
+
68
+ function looksLikeClaudeExport(value: unknown): boolean {
69
+ const conversations = Array.isArray(value) ? value : [value];
70
+ if (conversations.length === 0 || !conversations.every(isRecord)) return false;
71
+ return conversations.every(conversation => {
72
+ if (!Array.isArray(conversation.chat_messages)) return false;
73
+ // `uuid`+`chat_messages` is the claude.ai export envelope; a bare
74
+ // chat_messages array without any sender markers is not enough.
75
+ const senders = conversation.chat_messages.slice(0, 8);
76
+ return (
77
+ typeof conversation.uuid === "string" ||
78
+ senders.some(message => isRecord(message) && (message.sender === "human" || message.sender === "assistant"))
79
+ );
80
+ });
81
+ }
82
+
83
+ /**
84
+ * Detect the provider/format of an explicit transcript file.
85
+ *
86
+ * @param text Full source text (already size-bounded by the caller).
87
+ * @param requestedProvider Explicit provider selection; undefined = auto.
88
+ */
89
+ export function detectSessionImportFormat(
90
+ text: string,
91
+ requestedProvider: SessionImportProviderId | undefined,
92
+ ): SessionImportDetection {
93
+ const sample = text.slice(0, DETECTION_SAMPLE_BYTES);
94
+ let detected: SessionImportDetection | undefined;
95
+
96
+ const trimmed = sample.trimStart();
97
+ if (trimmed.startsWith("{") || trimmed.startsWith("[")) {
98
+ // Ambiguous between "JSON document" and "JSONL": try whole-document parse
99
+ // only against the sample when the whole text is the sample; otherwise a
100
+ // leading `{`/`[` with newline-delimited records falls through to JSONL.
101
+ let documentValue: unknown;
102
+ let isJsonDocument = false;
103
+ try {
104
+ documentValue = JSON.parse(text);
105
+ isJsonDocument = true;
106
+ } catch {
107
+ isJsonDocument = false;
108
+ }
109
+ if (isJsonDocument && looksLikeClaudeExport(documentValue)) {
110
+ detected = { provider: "claude", format: "claude-export-json" };
111
+ }
112
+ // A whole-document JSON parse also succeeds for a single-line JSONL
113
+ // transcript, so a non-export document falls through to JSONL detection
114
+ // before anything is declared unsupported.
115
+ }
116
+ if (!detected) detected = detectJsonlFormat(sample);
117
+
118
+ if (!detected) {
119
+ throw new SessionImportError(
120
+ "unsupported_format",
121
+ "detect",
122
+ "Could not detect a supported Codex or Claude transcript format. Pass --provider codex|claude to force a provider, or export the session again.",
123
+ );
124
+ }
125
+ if (requestedProvider && detected.provider !== requestedProvider) {
126
+ throw new SessionImportError(
127
+ "format_mismatch",
128
+ "detect",
129
+ `The source looks like a ${detected.provider} transcript (${detected.format}) but --provider ${requestedProvider} was requested.`,
130
+ );
131
+ }
132
+ return detected;
133
+ }
@@ -0,0 +1,7 @@
1
+ export * from "./claude";
2
+ export * from "./codex";
3
+ export * from "./command";
4
+ export * from "./detect";
5
+ export * from "./provider-codex";
6
+ export * from "./provider-service";
7
+ export * from "./service";
@@ -0,0 +1,327 @@
1
+ /**
2
+ * Codex adapter (issue #3709).
3
+ *
4
+ * Parses the Codex CLI rollout transcript: one JSON object per line
5
+ * (`rollout-*.jsonl`, e.g. `~/.codex/sessions/2026/08/01/rollout-….jsonl`).
6
+ * This is Codex's own observable transcript format; the file the user passes is
7
+ * treated as an explicit export and is only read.
8
+ *
9
+ * Strictness contract: records that fail to parse or lack required fields are
10
+ * quarantined with deterministic digests — never silently dropped. Unknown
11
+ * record/event types are mapped when their payload shape is recognized and
12
+ * quarantined otherwise.
13
+ */
14
+
15
+ import { createHash } from "node:crypto";
16
+ import { redactImportedText } from "./redact";
17
+ import type { ImportedConversation, ImportedMessage, ImportQuarantineRecord, SessionImportCounts } from "./types";
18
+
19
+ type JsonRecord = Record<string, unknown>;
20
+
21
+ export interface CodexParseResult {
22
+ conversation: ImportedConversation;
23
+ quarantine: ImportQuarantineRecord[];
24
+ counts: SessionImportCounts;
25
+ redactionKinds: string[];
26
+ }
27
+
28
+ const MAX_EVIDENCE_LINE_CHARS = 400;
29
+
30
+ function isRecord(value: unknown): value is JsonRecord {
31
+ return typeof value === "object" && value !== null && !Array.isArray(value);
32
+ }
33
+
34
+ function textFromContentBlocks(content: unknown): string {
35
+ if (typeof content === "string") return content;
36
+ if (!Array.isArray(content)) return "";
37
+ const parts: string[] = [];
38
+ for (const block of content) {
39
+ if (!isRecord(block)) continue;
40
+ // Codex rollout uses output_text/input_text; accept plain text blocks too.
41
+ if (
42
+ typeof block.text === "string" &&
43
+ (block.type === "output_text" || block.type === "input_text" || block.type === "text")
44
+ ) {
45
+ parts.push(block.text);
46
+ }
47
+ }
48
+ return parts.join("\n");
49
+ }
50
+
51
+ function summarizeArguments(args: unknown): string {
52
+ if (typeof args !== "string" || args.length === 0) return "";
53
+ const trimmed = args.trim();
54
+ try {
55
+ const parsed: unknown = JSON.parse(trimmed);
56
+ if (isRecord(parsed)) {
57
+ const command = parsed.command;
58
+ if (Array.isArray(command) && command.every(part => typeof part === "string")) {
59
+ return command.join(" ");
60
+ }
61
+ if (typeof command === "string") return command;
62
+ if (typeof parsed.cmd === "string") return parsed.cmd;
63
+ if (typeof parsed.path === "string") return parsed.path;
64
+ if (typeof parsed.file_path === "string") return parsed.file_path;
65
+ if (typeof parsed.input === "string") return parsed.input;
66
+ if (typeof parsed.query === "string") return parsed.query;
67
+ }
68
+ } catch {
69
+ // Fall through to the bounded raw form.
70
+ }
71
+ return trimmed;
72
+ }
73
+
74
+ function boundEvidence(text: string): string {
75
+ const singleLine = text.replace(/\s+/g, " ").trim();
76
+ if (singleLine.length <= MAX_EVIDENCE_LINE_CHARS) return singleLine;
77
+ return `${singleLine.slice(0, MAX_EVIDENCE_LINE_CHARS - 1)}…`;
78
+ }
79
+
80
+ class EvidenceCollector {
81
+ readonly #lines: string[] = [];
82
+ #bytes = 0;
83
+ truncated = false;
84
+
85
+ static readonly MAX_LINES = 100;
86
+ static readonly MAX_BYTES = 8 * 1024;
87
+
88
+ add(line: string): void {
89
+ if (line.length === 0) return;
90
+ if (
91
+ this.#lines.length >= EvidenceCollector.MAX_LINES ||
92
+ this.#bytes + line.length > EvidenceCollector.MAX_BYTES
93
+ ) {
94
+ this.truncated = true;
95
+ return;
96
+ }
97
+ this.#lines.push(line);
98
+ this.#bytes += line.length;
99
+ }
100
+
101
+ get lines(): string[] {
102
+ return this.#lines;
103
+ }
104
+ }
105
+
106
+ /** Parse a Codex rollout JSONL transcript into the provider-neutral IR. */
107
+ export function parseCodexRollout(text: string): CodexParseResult {
108
+ const maxQuarantineRecords = 512;
109
+ const messages: ImportedMessage[] = [];
110
+ const quarantine: ImportQuarantineRecord[] = [];
111
+ const counts: SessionImportCounts = { mapped: 0, quarantined: 0, redacted: 0, omitted: 0 };
112
+ const redactionKinds = new Set<string>();
113
+ const redact = (input: string): string => {
114
+ const result = redactImportedText(input);
115
+ counts.redacted += result.redacted;
116
+ for (const kind of result.kinds) redactionKinds.add(kind);
117
+ return result.value;
118
+ };
119
+
120
+ let sourceSessionId: string | undefined;
121
+ let title: string | undefined;
122
+ let cwd: string | undefined;
123
+ let current: ImportedMessage | undefined;
124
+ let evidence = new EvidenceCollector();
125
+
126
+ const closeEvidence = (): void => {
127
+ if (!current) {
128
+ evidence = new EvidenceCollector();
129
+ return;
130
+ }
131
+ if (evidence.lines.length > 0) {
132
+ current.toolEvidence = [...(current.toolEvidence ?? []), ...evidence.lines];
133
+ }
134
+ evidence = new EvidenceCollector();
135
+ };
136
+
137
+ /** Assemble visible text into the running conversation. `mapped` is counted by the caller per recognized record. */
138
+ const pushMessage = (role: "user" | "assistant", rawText: string, timestamp?: string): void => {
139
+ const sanitized = redact(rawText).trim();
140
+ if (role === "user") {
141
+ closeEvidence();
142
+ if (!sanitized) {
143
+ current = undefined;
144
+ return;
145
+ }
146
+ current = { role, text: sanitized, ...(timestamp ? { timestamp } : {}) };
147
+ messages.push(current);
148
+ return;
149
+ }
150
+ if (!sanitized) return;
151
+ if (current?.role === "assistant") {
152
+ current.text = current.text ? `${current.text}\n\n${sanitized}` : sanitized;
153
+ } else {
154
+ closeEvidence();
155
+ current = { role, text: sanitized, ...(timestamp ? { timestamp } : {}) };
156
+ messages.push(current);
157
+ }
158
+ };
159
+
160
+ const quarantineRecord = (record: number, line: string, reason: ImportQuarantineRecord["reason"]): void => {
161
+ if (quarantine.length < maxQuarantineRecords) {
162
+ quarantine.push({ record, byteLength: Buffer.byteLength(line, "utf8"), sha256: sha256Hex(line), reason });
163
+ }
164
+ counts.quarantined++;
165
+ };
166
+
167
+ const lines = text.split("\n");
168
+ for (let index = 0; index < lines.length; index++) {
169
+ const line = lines[index]!.trim();
170
+ if (line.length === 0) continue;
171
+ const recordNumber = index + 1;
172
+ let record: unknown;
173
+ try {
174
+ record = JSON.parse(line);
175
+ } catch {
176
+ quarantineRecord(recordNumber, line, "invalid_json");
177
+ continue;
178
+ }
179
+ if (!isRecord(record) || typeof record.type !== "string") {
180
+ quarantineRecord(recordNumber, line, "invalid_json");
181
+ continue;
182
+ }
183
+ const timestamp = typeof record.timestamp === "string" ? record.timestamp : undefined;
184
+
185
+ switch (record.type) {
186
+ case "session_meta": {
187
+ const payload = record.payload;
188
+ if (!isRecord(payload)) {
189
+ quarantineRecord(recordNumber, line, "missing_fields");
190
+ break;
191
+ }
192
+ if (typeof payload.id === "string") sourceSessionId = redact(payload.id);
193
+ if (typeof payload.cwd === "string") cwd = redact(payload.cwd);
194
+ if (typeof payload.title === "string" && payload.title.trim().length > 0) {
195
+ title = redact(payload.title).trim();
196
+ }
197
+ counts.mapped++;
198
+ break;
199
+ }
200
+ case "response_item": {
201
+ const payload = record.payload;
202
+ if (!isRecord(payload) || typeof payload.type !== "string") {
203
+ quarantineRecord(recordNumber, line, "missing_fields");
204
+ break;
205
+ }
206
+ switch (payload.type) {
207
+ case "message": {
208
+ const role = payload.role;
209
+ if (role !== "user" && role !== "assistant") {
210
+ // developer/system prompts are provider framing, not conversation.
211
+ counts.mapped++;
212
+ break;
213
+ }
214
+ counts.mapped++;
215
+ pushMessage(role, textFromContentBlocks(payload.content), timestamp);
216
+ break;
217
+ }
218
+ case "reasoning": {
219
+ // Model-internal reasoning is never imported (non-goal).
220
+ counts.mapped++;
221
+ break;
222
+ }
223
+ case "function_call": {
224
+ const name = redact(typeof payload.name === "string" ? payload.name : "tool");
225
+ const summary = redact(boundEvidence(summarizeArguments(payload.arguments)));
226
+ evidence.add(summary ? `$ ${name} ${summary}` : `$ ${name}`);
227
+ counts.mapped++;
228
+ break;
229
+ }
230
+ case "function_call_output":
231
+ case "custom_tool_call_output": {
232
+ const output = isRecord(payload.output)
233
+ ? JSON.stringify(payload.output)
234
+ : typeof payload.output === "string"
235
+ ? payload.output
236
+ : "";
237
+ const summary = redact(boundEvidence(output));
238
+ if (summary) evidence.add(`→ ${summary}`);
239
+ counts.mapped++;
240
+ break;
241
+ }
242
+ case "custom_tool_call": {
243
+ const name = redact(typeof payload.name === "string" ? payload.name : "tool");
244
+ const input = typeof payload.input === "string" ? payload.input : "";
245
+ const summary = redact(boundEvidence(input));
246
+ evidence.add(summary ? `$ ${name} ${summary}` : `$ ${name}`);
247
+ counts.mapped++;
248
+ break;
249
+ }
250
+ case "local_shell_call": {
251
+ const action = isRecord(payload.action) ? payload.action : undefined;
252
+ const command = action && Array.isArray(action.command) ? action.command.join(" ") : "";
253
+ const summary = redact(boundEvidence(command));
254
+ evidence.add(summary ? `$ ${summary}` : "$ shell");
255
+ counts.mapped++;
256
+ break;
257
+ }
258
+ case "web_search_call": {
259
+ evidence.add("[web search]");
260
+ counts.mapped++;
261
+ break;
262
+ }
263
+ default:
264
+ quarantineRecord(recordNumber, line, "unknown_record");
265
+ }
266
+ break;
267
+ }
268
+ case "event_msg": {
269
+ const payload = record.payload;
270
+ if (!isRecord(payload) || typeof payload.type !== "string") {
271
+ quarantineRecord(recordNumber, line, "missing_fields");
272
+ break;
273
+ }
274
+ switch (payload.type) {
275
+ case "user_message":
276
+ counts.mapped++;
277
+ pushMessage("user", typeof payload.message === "string" ? payload.message : "", timestamp);
278
+ break;
279
+ case "agent_message":
280
+ counts.mapped++;
281
+ pushMessage("assistant", typeof payload.message === "string" ? payload.message : "", timestamp);
282
+ break;
283
+ case "agent_reasoning":
284
+ case "agent_reasoning_delta":
285
+ case "agent_reasoning_raw_content":
286
+ case "agent_reasoning_raw_content_delta":
287
+ case "agent_reasoning_section_break":
288
+ case "token_count":
289
+ // Reasoning/token telemetry is model-internal or display-only.
290
+ counts.mapped++;
291
+ break;
292
+ default:
293
+ // Recognized event envelope, unmapped payload variant.
294
+ quarantineRecord(recordNumber, line, "unknown_record");
295
+ }
296
+ break;
297
+ }
298
+ case "turn_context":
299
+ case "world_state":
300
+ // Provider environment framing; not conversation content.
301
+ counts.mapped++;
302
+ break;
303
+ default:
304
+ quarantineRecord(recordNumber, line, "unknown_record");
305
+ }
306
+ }
307
+ closeEvidence();
308
+
309
+ return {
310
+ conversation: {
311
+ provider: "codex",
312
+ format: "codex-rollout-jsonl",
313
+ ...(sourceSessionId ? { sourceSessionId } : {}),
314
+ ...(title ? { title } : {}),
315
+ ...(cwd ? { cwd } : {}),
316
+ messages,
317
+ },
318
+ quarantine,
319
+ counts,
320
+ redactionKinds: [...redactionKinds].sort(),
321
+ };
322
+ }
323
+
324
+ function sha256Hex(text: string): string {
325
+ // Deterministic per-record digest for quarantine evidence (content never stored).
326
+ return createHash("sha256").update(text, "utf8").digest("hex");
327
+ }