@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
@@ -4,6 +4,13 @@ import { logger } from "@gajae-code/utils";
4
4
  export interface YieldDispatcher<P> {
5
5
  /** Drop entries already delivered through another path. Called per-entry at flush time. */
6
6
  isStale?(entry: P): boolean;
7
+ /**
8
+ * Optional ownership-origin key: when provided, the flush builds ONE
9
+ * message per distinct key instead of one message for the whole batch, so
10
+ * a later scope:"owned" drop of one origin never suppresses entries of
11
+ * another origin (review thread P2).
12
+ */
13
+ groupKey?(entry: P): string;
7
14
  /** Produce one batched AgentMessage from non-stale entries. Return null to skip. */
8
15
  build(survivors: P[]): AgentMessage | null;
9
16
  }
@@ -19,6 +26,7 @@ type YieldFlushMode = "streaming" | "idle";
19
26
 
20
27
  interface StoredDispatcher {
21
28
  isStale?: (entry: unknown) => boolean;
29
+ groupKey?: (entry: unknown) => string;
22
30
  build: (survivors: unknown[]) => AgentMessage | null;
23
31
  }
24
32
 
@@ -39,6 +47,7 @@ export class YieldQueue {
39
47
  register<P>(kind: string, dispatcher: YieldDispatcher<P>): () => void {
40
48
  const stored: StoredDispatcher = {
41
49
  ...(dispatcher.isStale ? { isStale: entry => dispatcher.isStale?.(entry as P) ?? false } : {}),
50
+ ...(dispatcher.groupKey ? { groupKey: entry => dispatcher.groupKey?.(entry as P) ?? "default" } : {}),
42
51
  build: survivors => dispatcher.build(survivors as P[]),
43
52
  };
44
53
  this.#dispatchers.set(kind, stored);
@@ -81,16 +90,17 @@ export class YieldQueue {
81
90
  for (const [kind, dispatcher] of this.#dispatchers) {
82
91
  const entries = this.#drain(kind);
83
92
  if (entries.length === 0) continue;
84
- const message = this.#build(kind, dispatcher, entries);
85
- if (!message) continue;
86
- if (mode === "streaming") {
87
- try {
88
- this.#options.injectStreaming(message);
89
- } catch (error) {
90
- logger.warn("Yield queue streaming dispatch failed", { kind, error: formatError(error) });
93
+ const messages = this.#build(kind, dispatcher, entries) ?? [];
94
+ for (const message of messages) {
95
+ if (mode === "streaming") {
96
+ try {
97
+ this.#options.injectStreaming(message);
98
+ } catch (error) {
99
+ logger.warn("Yield queue streaming dispatch failed", { kind, error: formatError(error) });
100
+ }
101
+ } else {
102
+ idleMessages.push(message);
91
103
  }
92
- } else {
93
- idleMessages.push(message);
94
104
  }
95
105
  }
96
106
  if (mode === "idle" && idleMessages.length > 0) {
@@ -149,7 +159,16 @@ export class YieldQueue {
149
159
  return entries;
150
160
  }
151
161
 
152
- #build(kind: string, dispatcher: StoredDispatcher, entries: unknown[]): AgentMessage | null {
162
+ #build(kind: string, dispatcher: StoredDispatcher, entries: unknown[]): AgentMessage[] | null {
163
+ // Corrected turn semantics (terminal abort): turn-scope abort blocks only
164
+ // deliveries whose origin is a continuation of the aborted turn.
165
+ // Owned-completion deliveries from work deliberately left running are
166
+ // intentionally allowed to resume the agent through the normal
167
+ // followUp/prompt path and receive a fresh turn attempt. A closed
168
+ // terminal record must never make an allowed owned-completion entry
169
+ // stale merely because it is closed; stale filtering below applies only
170
+ // to ordinary manager state (e.g. isDeliverySuppressed) or explicit
171
+ // blocked-continuation/owned-cleanup entries.
153
172
  const survivors: unknown[] = [];
154
173
  for (const entry of entries) {
155
174
  if (dispatcher.isStale) {
@@ -165,11 +184,34 @@ export class YieldQueue {
165
184
  survivors.push(entry);
166
185
  }
167
186
  if (survivors.length === 0) return null;
168
- try {
169
- return dispatcher.build(survivors);
170
- } catch (error) {
171
- logger.warn("Yield queue build failed", { kind, error: formatError(error) });
172
- return null;
187
+ // Build one message per ownership-origin group (when the dispatcher
188
+ // declares a groupKey) so a later owned-scope drop of one group never
189
+ // suppresses another group's entries. Groups are partitioned into
190
+ // CONTIGUOUS origin runs (preserving the queued FIFO chronology): with
191
+ // entries A1, B1, A2, a map grouping every A together would deliver A2
192
+ // before the earlier B1, changing the observable order of async results
193
+ // (review thread P2).
194
+ const groups: unknown[][] = [];
195
+ let currentGroupKey: string | undefined;
196
+ for (const entry of survivors) {
197
+ const key = dispatcher.groupKey ? dispatcher.groupKey(entry) : "default";
198
+ const last = groups[groups.length - 1];
199
+ if (last !== undefined && currentGroupKey === key) {
200
+ last.push(entry);
201
+ } else {
202
+ groups.push([entry]);
203
+ currentGroupKey = key;
204
+ }
205
+ }
206
+ const messages: AgentMessage[] = [];
207
+ for (const group of groups.values()) {
208
+ try {
209
+ const message = dispatcher.build(group);
210
+ if (message) messages.push(message);
211
+ } catch (error) {
212
+ logger.warn("Yield queue build failed", { kind, error: formatError(error) });
213
+ }
173
214
  }
215
+ return messages.length > 0 ? messages : null;
174
216
  }
175
217
  }
@@ -0,0 +1,334 @@
1
+ /**
2
+ * Claude adapter (issue #3709).
3
+ *
4
+ * Parses two first-party observable Claude transcript/export shapes:
5
+ *
6
+ * 1. `claude-code-jsonl` — Claude Code session transcripts
7
+ * (`~/.claude/projects/<project-slug>/<session-uuid>.jsonl`), one JSON object
8
+ * per line with `type: "user" | "assistant" | "summary" | "system" | …`.
9
+ * 2. `claude-export-json` — the claude.ai data export (`conversations.json`):
10
+ * a JSON array of conversations (or a single conversation object) whose
11
+ * `chat_messages` carry `sender: "human" | "assistant"` and `content` blocks.
12
+ *
13
+ * The same quarantine contract as the Codex adapter applies: unmappable
14
+ * records/messages are counted and digested, never silently dropped.
15
+ */
16
+
17
+ import { createHash } from "node:crypto";
18
+ import { redactImportedText } from "./redact";
19
+ import type { ImportedConversation, ImportedMessage, ImportQuarantineRecord, SessionImportCounts } from "./types";
20
+
21
+ type JsonRecord = Record<string, unknown>;
22
+
23
+ export interface ClaudeParseResult {
24
+ conversation: ImportedConversation;
25
+ quarantine: ImportQuarantineRecord[];
26
+ counts: SessionImportCounts;
27
+ redactionKinds: string[];
28
+ }
29
+
30
+ const MAX_EVIDENCE_LINE_CHARS = 400;
31
+ const MAX_EVIDENCE_LINES = 100;
32
+ const MAX_EVIDENCE_BYTES = 8 * 1024;
33
+
34
+ function isRecord(value: unknown): value is JsonRecord {
35
+ return typeof value === "object" && value !== null && !Array.isArray(value);
36
+ }
37
+
38
+ function sha256Hex(text: string): string {
39
+ return createHash("sha256").update(text, "utf8").digest("hex");
40
+ }
41
+
42
+ function boundEvidence(text: string): string {
43
+ const singleLine = text.replace(/\s+/g, " ").trim();
44
+ if (singleLine.length <= MAX_EVIDENCE_LINE_CHARS) return singleLine;
45
+ return `${singleLine.slice(0, MAX_EVIDENCE_LINE_CHARS - 1)}…`;
46
+ }
47
+
48
+ class ParseSink {
49
+ static readonly MAX_QUARANTINE_RECORDS = 512;
50
+ readonly messages: ImportedMessage[] = [];
51
+ readonly quarantine: ImportQuarantineRecord[] = [];
52
+ readonly counts: SessionImportCounts = { mapped: 0, quarantined: 0, redacted: 0, omitted: 0 };
53
+ readonly redactionKinds = new Set<string>();
54
+ #evidence: string[] = [];
55
+ #evidenceBytes = 0;
56
+ evidenceTruncated = false;
57
+ #current: ImportedMessage | undefined;
58
+
59
+ redact(input: string): string {
60
+ const result = redactImportedText(input);
61
+ this.counts.redacted += result.redacted;
62
+ for (const kind of result.kinds) this.redactionKinds.add(kind);
63
+ return result.value;
64
+ }
65
+
66
+ quarantineRecord(record: number, raw: string, reason: ImportQuarantineRecord["reason"]): void {
67
+ if (this.quarantine.length < ParseSink.MAX_QUARANTINE_RECORDS) {
68
+ this.quarantine.push({ record, byteLength: Buffer.byteLength(raw, "utf8"), sha256: sha256Hex(raw), reason });
69
+ }
70
+ this.counts.quarantined++;
71
+ }
72
+
73
+ addEvidence(line: string): void {
74
+ if (line.length === 0) return;
75
+ if (this.#evidence.length >= MAX_EVIDENCE_LINES || this.#evidenceBytes + line.length > MAX_EVIDENCE_BYTES) {
76
+ this.evidenceTruncated = true;
77
+ return;
78
+ }
79
+ this.#evidence.push(line);
80
+ this.#evidenceBytes += line.length;
81
+ }
82
+
83
+ closeEvidence(): void {
84
+ if (this.#current && this.#evidence.length > 0) {
85
+ this.#current.toolEvidence = [...(this.#current.toolEvidence ?? []), ...this.#evidence];
86
+ }
87
+ this.#evidence = [];
88
+ this.#evidenceBytes = 0;
89
+ }
90
+
91
+ /** Assemble visible text into the running conversation. `mapped` is counted by the caller. */
92
+ pushMessage(role: "user" | "assistant", rawText: string, timestamp?: string): void {
93
+ const sanitized = this.redact(rawText).trim();
94
+ if (role === "user") {
95
+ this.closeEvidence();
96
+ if (!sanitized) {
97
+ this.#current = undefined;
98
+ return;
99
+ }
100
+ this.#current = { role, text: sanitized, ...(timestamp ? { timestamp } : {}) };
101
+ this.messages.push(this.#current);
102
+ return;
103
+ }
104
+ if (!sanitized) return;
105
+ if (this.#current?.role === "assistant") {
106
+ this.#current.text = this.#current.text ? `${this.#current.text}\n\n${sanitized}` : sanitized;
107
+ } else {
108
+ this.closeEvidence();
109
+ this.#current = { role, text: sanitized, ...(timestamp ? { timestamp } : {}) };
110
+ this.messages.push(this.#current);
111
+ }
112
+ }
113
+ }
114
+
115
+ function toolUseSummary(input: unknown): string {
116
+ if (!isRecord(input)) return "";
117
+ if (typeof input.command === "string") return input.command;
118
+ if (typeof input.file_path === "string") return input.file_path;
119
+ if (typeof input.path === "string") return input.path;
120
+ if (typeof input.pattern === "string") return input.pattern;
121
+ if (typeof input.query === "string") return input.query;
122
+ if (typeof input.url === "string") return input.url;
123
+ if (typeof input.prompt === "string") return boundEvidence(input.prompt);
124
+ if (typeof input.content === "string") return boundEvidence(input.content);
125
+ return "";
126
+ }
127
+
128
+ function toolResultText(content: unknown): string {
129
+ if (typeof content === "string") return content;
130
+ if (!Array.isArray(content)) return "";
131
+ const parts: string[] = [];
132
+ for (const block of content) {
133
+ if (isRecord(block) && block.type === "text" && typeof block.text === "string") parts.push(block.text);
134
+ }
135
+ return parts.join("\n");
136
+ }
137
+
138
+ /** Parse a Claude Code session JSONL transcript. */
139
+ export function parseClaudeCodeTranscript(text: string): ClaudeParseResult {
140
+ const sink = new ParseSink();
141
+ let sourceSessionId: string | undefined;
142
+ let title: string | undefined;
143
+ let cwd: string | undefined;
144
+
145
+ const lines = text.split("\n");
146
+ for (let index = 0; index < lines.length; index++) {
147
+ const line = lines[index]!.trim();
148
+ if (line.length === 0) continue;
149
+ const recordNumber = index + 1;
150
+ let record: unknown;
151
+ try {
152
+ record = JSON.parse(line);
153
+ } catch {
154
+ sink.quarantineRecord(recordNumber, line, "invalid_json");
155
+ continue;
156
+ }
157
+ if (!isRecord(record) || typeof record.type !== "string") {
158
+ sink.quarantineRecord(recordNumber, line, "invalid_json");
159
+ continue;
160
+ }
161
+ if (typeof record.sessionId === "string" && !sourceSessionId) sourceSessionId = sink.redact(record.sessionId);
162
+ if (typeof record.cwd === "string" && !cwd) cwd = sink.redact(record.cwd);
163
+ const timestamp = typeof record.timestamp === "string" ? record.timestamp : undefined;
164
+
165
+ switch (record.type) {
166
+ case "summary": {
167
+ if (typeof record.summary === "string" && record.summary.trim().length > 0) {
168
+ title = sink.redact(record.summary).trim();
169
+ }
170
+ sink.counts.mapped++;
171
+ break;
172
+ }
173
+ case "user":
174
+ case "assistant": {
175
+ const message = record.message;
176
+ if (!isRecord(message)) {
177
+ sink.quarantineRecord(recordNumber, line, "missing_fields");
178
+ break;
179
+ }
180
+ sink.counts.mapped++;
181
+ const isMeta = record.isMeta === true || record.isSidechain === true;
182
+ if (isMeta) break; // command/system bookkeeping rows are not conversation.
183
+ const role: "user" | "assistant" = record.type === "user" ? "user" : "assistant";
184
+ const content = message.content;
185
+ if (typeof content === "string") {
186
+ sink.pushMessage(role, content, timestamp);
187
+ break;
188
+ }
189
+ if (!Array.isArray(content)) break;
190
+ for (const block of content) {
191
+ if (!isRecord(block) || typeof block.type !== "string") continue;
192
+ switch (block.type) {
193
+ case "text":
194
+ sink.pushMessage(role, typeof block.text === "string" ? block.text : "", timestamp);
195
+ break;
196
+ case "thinking":
197
+ // Model-internal reasoning is never imported (non-goal).
198
+ break;
199
+ case "tool_use": {
200
+ const name = sink.redact(typeof block.name === "string" ? block.name : "tool");
201
+ const summary = sink.redact(boundEvidence(toolUseSummary(block.input)));
202
+ sink.addEvidence(summary ? `$ ${name} ${summary}` : `$ ${name}`);
203
+ break;
204
+ }
205
+ case "tool_result": {
206
+ const summary = sink.redact(boundEvidence(toolResultText(block.content)));
207
+ if (summary) sink.addEvidence(`→ ${summary}`);
208
+ break;
209
+ }
210
+ default:
211
+ // image/document blocks and future variants: visible content we
212
+ // cannot safely represent becomes bounded placeholder evidence.
213
+ if (block.type === "image" || block.type === "document") sink.addEvidence(`[${block.type}]`);
214
+ }
215
+ }
216
+ break;
217
+ }
218
+ case "system":
219
+ case "file-history-snapshot":
220
+ case "queue-operation":
221
+ // Provider hooks/bookkeeping; not conversation content.
222
+ sink.counts.mapped++;
223
+ break;
224
+ default:
225
+ sink.quarantineRecord(recordNumber, line, "unknown_record");
226
+ }
227
+ }
228
+ sink.closeEvidence();
229
+
230
+ return {
231
+ conversation: {
232
+ provider: "claude",
233
+ format: "claude-code-jsonl",
234
+ ...(sourceSessionId ? { sourceSessionId } : {}),
235
+ ...(title ? { title } : {}),
236
+ ...(cwd ? { cwd } : {}),
237
+ messages: sink.messages,
238
+ },
239
+ quarantine: sink.quarantine,
240
+ counts: sink.counts,
241
+ redactionKinds: [...sink.redactionKinds].sort(),
242
+ };
243
+ }
244
+
245
+ function claudeExportMessageText(message: JsonRecord): string {
246
+ // Current exports carry structured content blocks; older ones carry `text`.
247
+ if (Array.isArray(message.content)) {
248
+ const parts: string[] = [];
249
+ for (const block of message.content) {
250
+ if (isRecord(block) && block.type === "text" && typeof block.text === "string") parts.push(block.text);
251
+ }
252
+ if (parts.length > 0) return parts.join("\n");
253
+ }
254
+ if (typeof message.text === "string") return message.text;
255
+ return "";
256
+ }
257
+
258
+ /** Parse a claude.ai data-export conversation (array or single object). */
259
+ export function parseClaudeExport(text: string): ClaudeParseResult {
260
+ const sink = new ParseSink();
261
+ let parsed: unknown;
262
+ try {
263
+ parsed = JSON.parse(text);
264
+ } catch {
265
+ sink.quarantineRecord(1, text, "invalid_json");
266
+ return emptyResult(sink);
267
+ }
268
+
269
+ const conversations = Array.isArray(parsed) ? parsed : [parsed];
270
+ if (conversations.length === 0 || !conversations.every(isRecord)) {
271
+ sink.quarantineRecord(1, text, "missing_fields");
272
+ return emptyResult(sink);
273
+ }
274
+ // Deterministic order: the export array order is preserved; otherwise sort by
275
+ // created_at so multi-conversation files reconstruct chronologically.
276
+ const ordered = [...conversations].sort((a, b) => {
277
+ const left = typeof a.created_at === "string" ? a.created_at : "";
278
+ const right = typeof b.created_at === "string" ? b.created_at : "";
279
+ return left.localeCompare(right);
280
+ });
281
+
282
+ let title: string | undefined;
283
+ let sourceSessionId: string | undefined;
284
+ let recordNumber = 0;
285
+ for (const conversation of ordered) {
286
+ if (typeof conversation.uuid === "string" && !sourceSessionId) sourceSessionId = sink.redact(conversation.uuid);
287
+ if (typeof conversation.name === "string" && conversation.name.trim().length > 0 && !title) {
288
+ title = sink.redact(conversation.name).trim();
289
+ }
290
+ const chatMessages = conversation.chat_messages;
291
+ if (!Array.isArray(chatMessages)) {
292
+ sink.quarantineRecord(++recordNumber, JSON.stringify(conversation), "missing_fields");
293
+ continue;
294
+ }
295
+ for (const message of chatMessages) {
296
+ recordNumber++;
297
+ if (!isRecord(message)) {
298
+ sink.quarantineRecord(recordNumber, JSON.stringify(message), "invalid_json");
299
+ continue;
300
+ }
301
+ const sender = message.sender;
302
+ if (sender !== "human" && sender !== "assistant") {
303
+ sink.quarantineRecord(recordNumber, JSON.stringify(message), "unknown_record");
304
+ continue;
305
+ }
306
+ sink.counts.mapped++;
307
+ const timestamp = typeof message.created_at === "string" ? message.created_at : undefined;
308
+ sink.pushMessage(sender === "human" ? "user" : "assistant", claudeExportMessageText(message), timestamp);
309
+ }
310
+ }
311
+ sink.closeEvidence();
312
+
313
+ return {
314
+ conversation: {
315
+ provider: "claude",
316
+ format: "claude-export-json",
317
+ ...(sourceSessionId ? { sourceSessionId } : {}),
318
+ ...(title ? { title } : {}),
319
+ messages: sink.messages,
320
+ },
321
+ quarantine: sink.quarantine,
322
+ counts: sink.counts,
323
+ redactionKinds: [...sink.redactionKinds].sort(),
324
+ };
325
+ }
326
+
327
+ function emptyResult(sink: ParseSink): ClaudeParseResult {
328
+ return {
329
+ conversation: { provider: "claude", format: "claude-export-json", messages: [] },
330
+ quarantine: sink.quarantine,
331
+ counts: sink.counts,
332
+ redactionKinds: [],
333
+ };
334
+ }