@gajae-code/coding-agent 0.13.3 → 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 (599) hide show
  1. package/CHANGELOG.md +184 -2
  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 +9 -1
  35. package/dist/types/config/models-config-schema.d.ts +2 -0
  36. package/dist/types/config/settings-schema.d.ts +70 -6
  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 +1 -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/gajae-pet-widget.d.ts +8 -30
  87. package/dist/types/modes/components/irc-sidebar.d.ts +1 -0
  88. package/dist/types/modes/components/iterm-pet-transport.d.ts +122 -0
  89. package/dist/types/modes/components/oauth-selector.d.ts +10 -4
  90. package/dist/types/modes/components/pet-capability.d.ts +11 -25
  91. package/dist/types/modes/components/status-line/gh.d.ts +6 -2
  92. package/dist/types/modes/controllers/extension-ui-controller.d.ts +1 -1
  93. package/dist/types/modes/controllers/selector-controller.d.ts +7 -8
  94. package/dist/types/modes/controllers/stt-controller.d.ts +1 -1
  95. package/dist/types/modes/interactive-mode.d.ts +1 -0
  96. package/dist/types/modes/types.d.ts +1 -0
  97. package/dist/types/modes/utils/injected-user-submission.d.ts +10 -0
  98. package/dist/types/runtime-mcp/config.d.ts +9 -0
  99. package/dist/types/runtime-mcp/manager.d.ts +26 -1
  100. package/dist/types/runtime-mcp/oauth-discovery.d.ts +4 -0
  101. package/dist/types/runtime-mcp/oauth-flow.d.ts +24 -1
  102. package/dist/types/runtime-mcp/pool-key.d.ts +2 -0
  103. package/dist/types/runtime-mcp/protocol.d.ts +278 -0
  104. package/dist/types/runtime-mcp/scope-config.d.ts +29 -0
  105. package/dist/types/runtime-mcp/tool-bridge.d.ts +15 -13
  106. package/dist/types/runtime-mcp/transports/http.d.ts +9 -0
  107. package/dist/types/runtime-mcp/types.d.ts +102 -10
  108. package/dist/types/sdk/acp/adapter.d.ts +26 -5
  109. package/dist/types/sdk/broker/broker.d.ts +3 -55
  110. package/dist/types/sdk/broker/lifecycle.d.ts +18 -12
  111. package/dist/types/sdk/broker/session-index.d.ts +14 -5
  112. package/dist/types/sdk/broker/startup-failure.d.ts +16 -1
  113. package/dist/types/sdk/bus/chat-daemon-control.d.ts +51 -1
  114. package/dist/types/sdk/bus/chat-daemon-runtime.d.ts +4 -41
  115. package/dist/types/sdk/bus/config.d.ts +11 -0
  116. package/dist/types/sdk/bus/conversation-store.d.ts +0 -1
  117. package/dist/types/sdk/bus/daemon-paths.d.ts +6 -0
  118. package/dist/types/sdk/bus/discord-conversation.d.ts +2 -0
  119. package/dist/types/sdk/bus/discord-daemon.d.ts +17 -12
  120. package/dist/types/sdk/bus/existing-thread-readiness.d.ts +4 -34
  121. package/dist/types/sdk/bus/inbound-reaction-ordering.d.ts +61 -0
  122. package/dist/types/sdk/bus/index.d.ts +85 -99
  123. package/dist/types/sdk/bus/kind-aware-reconciliation.d.ts +29 -7
  124. package/dist/types/sdk/bus/managed-daemon.d.ts +2 -32
  125. package/dist/types/sdk/bus/notification-service.d.ts +52 -0
  126. package/dist/types/sdk/bus/operator-runtime.d.ts +1 -1
  127. package/dist/types/sdk/bus/prompt-reconciliation.d.ts +16 -5
  128. package/dist/types/sdk/bus/reconciliation-store.d.ts +113 -5
  129. package/dist/types/sdk/bus/session-control.d.ts +25 -1
  130. package/dist/types/sdk/bus/slack-conversation.d.ts +4 -0
  131. package/dist/types/sdk/bus/slack-daemon.d.ts +9 -17
  132. package/dist/types/sdk/bus/slack-live-provider.d.ts +3 -1
  133. package/dist/types/sdk/bus/slack-provider.d.ts +4 -0
  134. package/dist/types/sdk/bus/slack-thread-binding.d.ts +6 -40
  135. package/dist/types/sdk/bus/telegram-adoption-intent.d.ts +30 -104
  136. package/dist/types/sdk/bus/telegram-daemon-cli.d.ts +10 -0
  137. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +262 -19
  138. package/dist/types/sdk/bus/telegram-daemon-orphan-reap.d.ts +125 -0
  139. package/dist/types/sdk/bus/telegram-daemon-owner-registry.d.ts +22 -0
  140. package/dist/types/sdk/bus/telegram-daemon.d.ts +119 -310
  141. package/dist/types/sdk/bus/telegram-reference.d.ts +1 -47
  142. package/dist/types/sdk/bus/threaded-render.d.ts +1 -0
  143. package/dist/types/sdk/bus/topic-registry.d.ts +33 -17
  144. package/dist/types/sdk/cli/rows.d.ts +2 -11
  145. package/dist/types/sdk/cli/session-cli.d.ts +15 -25
  146. package/dist/types/sdk/client/client.d.ts +97 -1
  147. package/dist/types/sdk/host/control/dispatch.d.ts +0 -7
  148. package/dist/types/sdk/host/control/index.d.ts +1 -1
  149. package/dist/types/sdk/host/control/operations.d.ts +18 -5
  150. package/dist/types/sdk/host/control/runtime-gate.d.ts +19 -0
  151. package/dist/types/sdk/host/host.d.ts +15 -1
  152. package/dist/types/sdk/host/query/handlers.d.ts +5 -0
  153. package/dist/types/sdk/host/reverse-leases.d.ts +1 -1
  154. package/dist/types/sdk/host/session-runtime.d.ts +127 -7
  155. package/dist/types/sdk/host/types.d.ts +1 -1
  156. package/dist/types/sdk/host/websocket-transport.d.ts +1 -1
  157. package/dist/types/sdk/index.d.ts +2 -1
  158. package/dist/types/sdk/lifecycle/broker-client.d.ts +8 -0
  159. package/dist/types/sdk/lifecycle/client.d.ts +59 -0
  160. package/dist/types/sdk/lifecycle/index.d.ts +3 -0
  161. package/dist/types/sdk/lifecycle/service.d.ts +232 -0
  162. package/dist/types/sdk/mcp/server.d.ts +9 -6
  163. package/dist/types/sdk/prompt-deadline-lease.d.ts +43 -0
  164. package/dist/types/sdk/prompt-deadline-manager.d.ts +28 -0
  165. package/dist/types/sdk/prompt-status.d.ts +10 -3
  166. package/dist/types/sdk/protocol/operation-registry.d.ts +5 -0
  167. package/dist/types/sdk/receipt-state.d.ts +17 -0
  168. package/dist/types/sdk/reconciliation-extensions.d.ts +2 -0
  169. package/dist/types/sdk/router/index.d.ts +1 -0
  170. package/dist/types/sdk/router/session-router.d.ts +152 -0
  171. package/dist/types/sdk/session-list.d.ts +22 -0
  172. package/dist/types/sdk/session-reconnect.d.ts +43 -1
  173. package/dist/types/sdk/session.d.ts +34 -1
  174. package/dist/types/sdk/transport/serve-cli.d.ts +1 -4
  175. package/dist/types/session/account-inventory.d.ts +86 -0
  176. package/dist/types/session/agent-session.d.ts +145 -6
  177. package/dist/types/session/agent-storage.d.ts +10 -0
  178. package/dist/types/session/coordinator-tool-label.d.ts +28 -0
  179. package/dist/types/session/internal/managed-session-storage.d.ts +23 -4
  180. package/dist/types/session/messages.d.ts +1 -1
  181. package/dist/types/session/secure-token-file.d.ts +3 -0
  182. package/dist/types/session/session-manager.d.ts +40 -1
  183. package/dist/types/session/startup-auth-config.d.ts +44 -0
  184. package/dist/types/session/terminal-abort.d.ts +378 -0
  185. package/dist/types/session/yield-queue.d.ts +7 -0
  186. package/dist/types/session-import/claude.d.ts +26 -0
  187. package/dist/types/session-import/codex.d.ts +88 -0
  188. package/dist/types/session-import/command.d.ts +35 -0
  189. package/dist/types/session-import/detect.d.ts +22 -0
  190. package/dist/types/session-import/index.d.ts +7 -0
  191. package/dist/types/session-import/provider-codex.d.ts +22 -0
  192. package/dist/types/session-import/provider-service.d.ts +38 -0
  193. package/dist/types/session-import/redact.d.ts +23 -0
  194. package/dist/types/session-import/service.d.ts +47 -0
  195. package/dist/types/session-import/types.d.ts +120 -0
  196. package/dist/types/setup/paseo/check.d.ts +16 -0
  197. package/dist/types/setup/paseo/install-saga.d.ts +115 -0
  198. package/dist/types/setup/paseo/json-publisher.d.ts +76 -0
  199. package/dist/types/setup/paseo/orchestration-preferences.d.ts +24 -0
  200. package/dist/types/setup/paseo/paseo-ownership.d.ts +87 -0
  201. package/dist/types/setup/paseo/paseo-setup.d.ts +29 -0
  202. package/dist/types/setup/paseo/provider-config.d.ts +35 -0
  203. package/dist/types/setup/paseo/remove.d.ts +14 -0
  204. package/dist/types/setup/paseo/result-types.d.ts +59 -0
  205. package/dist/types/setup/paseo/setup-deps.d.ts +73 -0
  206. package/dist/types/setup/paseo/skills-bridge.d.ts +44 -0
  207. package/dist/types/skill-state/active-state.d.ts +5 -1
  208. package/dist/types/slash-commands/acp-builtins.d.ts +5 -1
  209. package/dist/types/slash-commands/builtin-registry.d.ts +2 -0
  210. package/dist/types/slash-commands/helpers/credential-switch.d.ts +12 -0
  211. package/dist/types/slash-commands/helpers/usage-report.d.ts +5 -6
  212. package/dist/types/slash-commands/types.d.ts +7 -1
  213. package/dist/types/task/executor.d.ts +10 -0
  214. package/dist/types/task/index.d.ts +3 -1
  215. package/dist/types/tools/ask-answer-registry.d.ts +6 -3
  216. package/dist/types/tools/bash-sleep-advisory.d.ts +14 -0
  217. package/dist/types/tools/bash.d.ts +2 -6
  218. package/dist/types/tools/browser/attach.d.ts +11 -0
  219. package/dist/types/tools/browser/launch.d.ts +20 -0
  220. package/dist/types/tools/browser/profile-discovery.d.ts +6 -0
  221. package/dist/types/tools/browser/render.d.ts +1 -0
  222. package/dist/types/tools/browser.d.ts +3 -1
  223. package/dist/types/tools/image-gen.d.ts +9 -2
  224. package/dist/types/tools/index.d.ts +8 -0
  225. package/dist/types/tools/monitor.d.ts +1 -1
  226. package/dist/types/tools/skill-discovery.d.ts +8 -1
  227. package/dist/types/tools/subagent.d.ts +2 -0
  228. package/dist/types/tools/ultragoal-ask-guard.d.ts +2 -2
  229. package/dist/types/utils/herdr-pane.d.ts +76 -0
  230. package/package.json +19 -9
  231. package/scripts/build-binary.ts +2 -1
  232. package/scripts/build-sdk-package-smoke.ts +2 -13
  233. package/scripts/capture-sticky-viewport-showcase.ts +0 -1
  234. package/scripts/compile-args.ts +2 -0
  235. package/scripts/generate-sdk-adapter-parity-manifest.ts +31 -16
  236. package/scripts/generate-sdk-operation-inventory.ts +28 -0
  237. package/scripts/generate-telegram-baseline-manifest.ts +1 -0
  238. package/scripts/generate-tool-catalog.ts +6 -4
  239. package/scripts/verify-gjc-sdk-canonicalization.ts +5 -39
  240. package/src/async/job-manager.ts +352 -17
  241. package/src/async/support.ts +25 -0
  242. package/src/autoresearch/dashboard.ts +28 -13
  243. package/src/capability/index.ts +3 -1
  244. package/src/capability/mcp.ts +6 -0
  245. package/src/capability/types.ts +6 -0
  246. package/src/cli/accounts-cli.ts +395 -0
  247. package/src/cli/args.ts +23 -0
  248. package/src/cli/auth-broker-cli.ts +136 -66
  249. package/src/cli/auth-gateway-cli.ts +94 -70
  250. package/src/cli/config-cli.ts +27 -2
  251. package/src/cli/crash-cli.ts +78 -0
  252. package/src/cli/customize-doctor.ts +1605 -0
  253. package/src/cli/daemon-cli.ts +12 -3
  254. package/src/cli/fast-help.ts +1 -0
  255. package/src/cli/mcp-cli.ts +128 -60
  256. package/src/cli/notify-cli.ts +8 -14
  257. package/src/cli/root-flags.ts +8 -0
  258. package/src/cli/setup-cli.ts +145 -0
  259. package/src/cli/skills-cli.ts +38 -2
  260. package/src/cli/update-cli.ts +167 -12
  261. package/src/cli.ts +4 -0
  262. package/src/commands/accounts.ts +71 -0
  263. package/src/commands/crash.ts +35 -0
  264. package/src/commands/customize.ts +84 -0
  265. package/src/commands/daemon.ts +2 -2
  266. package/src/commands/deep-interview.ts +2 -0
  267. package/src/commands/launch.ts +1 -0
  268. package/src/commands/mcp.ts +12 -7
  269. package/src/commands/ralplan.ts +2 -0
  270. package/src/commands/sdk.ts +65 -32
  271. package/src/commands/setup.ts +5 -0
  272. package/src/commands/skills.ts +14 -4
  273. package/src/commands/ultragoal.ts +10 -1
  274. package/src/commands/update.ts +26 -15
  275. package/src/config/atomic-yaml-patch-worker.ts +57 -0
  276. package/src/config/atomic-yaml-patch.ts +769 -29
  277. package/src/config/config-schema-version.ts +10 -0
  278. package/src/config/file-lock.ts +70 -1
  279. package/src/config/mcp-schema.json +52 -14
  280. package/src/config/model-profile-activation.ts +20 -1
  281. package/src/config/model-profiles.ts +29 -19
  282. package/src/config/model-registry.ts +132 -21
  283. package/src/config/models-config-schema.ts +1 -1
  284. package/src/config/settings-schema.ts +76 -6
  285. package/src/config/settings.ts +4038 -199
  286. package/src/config/skill-settings-defaults.ts +41 -3
  287. package/src/config/task-delegation.ts +87 -0
  288. package/src/config/update-channel.ts +23 -0
  289. package/src/coordinator-mcp/server.ts +377 -308
  290. package/src/crash/index-store.ts +723 -0
  291. package/src/crash/nudge.ts +89 -0
  292. package/src/crash/record-loader.ts +149 -0
  293. package/src/crash/report.ts +551 -0
  294. package/src/crash/sanitize.ts +129 -0
  295. package/src/cursor.ts +36 -10
  296. package/src/customization/import.ts +946 -0
  297. package/src/customization/index.ts +4 -0
  298. package/src/customization/inventory.ts +335 -0
  299. package/src/customization/mutations.ts +141 -0
  300. package/src/customization/types.ts +223 -0
  301. package/src/daemon/control-types.ts +8 -1
  302. package/src/daemon/operator-contract.ts +6 -6
  303. package/src/defaults/gjc/skills/deep-interview/SKILL.md +11 -22
  304. package/src/defaults/gjc/skills/ralplan/SKILL.md +36 -23
  305. package/src/defaults/gjc/skills/ultragoal/SKILL.md +16 -0
  306. package/src/discovery/claude-hooks.ts +38 -0
  307. package/src/discovery/claude.ts +142 -209
  308. package/src/discovery/codex-hooks.ts +38 -0
  309. package/src/discovery/codex.ts +132 -198
  310. package/src/discovery/helpers.ts +8 -1
  311. package/src/discovery/index.ts +2 -0
  312. package/src/discovery/mcp-compat.ts +234 -0
  313. package/src/discovery/mcp-json.ts +6 -0
  314. package/src/edit/renderer.ts +40 -0
  315. package/src/edit/streaming.ts +4 -2
  316. package/src/exec/bash-executor.ts +24 -20
  317. package/src/export/html/index.ts +51 -2
  318. package/src/extensibility/extensions/loader.ts +9 -1
  319. package/src/extensibility/extensions/runner.ts +17 -4
  320. package/src/extensibility/extensions/types.ts +31 -6
  321. package/src/extensibility/gjc-plugins/constrained-hooks.ts +33 -0
  322. package/src/extensibility/gjc-plugins/installer.ts +9 -5
  323. package/src/extensibility/gjc-plugins/observability.ts +8 -2
  324. package/src/extensibility/gjc-plugins/registry.ts +13 -2
  325. package/src/extensibility/gjc-plugins/runtime-adapters.ts +3 -1
  326. package/src/extensibility/gjc-plugins/schema.ts +222 -39
  327. package/src/extensibility/hooks/loader.ts +154 -10
  328. package/src/extensibility/runtime-skill-discovery.ts +257 -60
  329. package/src/extensibility/skill-management.ts +368 -0
  330. package/src/extensibility/skills.ts +52 -16
  331. package/src/gjc-runtime/deep-interview-runtime.ts +45 -61
  332. package/src/gjc-runtime/launch-worktree.ts +56 -2
  333. package/src/gjc-runtime/linux-proc.ts +7 -1
  334. package/src/gjc-runtime/ralplan-runtime.ts +100 -164
  335. package/src/gjc-runtime/session-state-lock.ts +992 -0
  336. package/src/gjc-runtime/session-state-sidecar.ts +644 -142
  337. package/src/gjc-runtime/state-writer.ts +39 -14
  338. package/src/gjc-runtime/tmux-owner-isolation.ts +5 -4
  339. package/src/gjc-runtime/ultragoal-guard.ts +11 -4
  340. package/src/gjc-runtime/ultragoal-runtime.ts +44 -41
  341. package/src/gjc-runtime/workflow-settings.ts +596 -0
  342. package/src/goals/tools/goal-tool.ts +6 -1
  343. package/src/hooks/events.ts +291 -0
  344. package/src/hooks/native-skill-hook.ts +4 -0
  345. package/src/hooks/normalize.ts +369 -0
  346. package/src/hooks/skill-state.ts +165 -46
  347. package/src/internal-urls/docs-index.generated.ts +40 -32
  348. package/src/main.ts +32 -5
  349. package/src/migrate/mcp-mapper.ts +25 -2
  350. package/src/modes/acp/abort-scope.ts +29 -0
  351. package/src/modes/acp/acp-agent.ts +423 -98
  352. package/src/modes/components/assistant-message.ts +6 -1
  353. package/src/modes/components/customization/customization-dashboard.ts +443 -0
  354. package/src/modes/components/customization/import-wizard.ts +372 -0
  355. package/src/modes/components/customization/index.ts +1 -0
  356. package/src/modes/components/gajae-pet-widget.ts +539 -213
  357. package/src/modes/components/irc-sidebar.ts +11 -0
  358. package/src/modes/components/iterm-pet-transport.ts +585 -0
  359. package/src/modes/components/oauth-selector.ts +277 -86
  360. package/src/modes/components/pet-capability.ts +39 -40
  361. package/src/modes/components/settings-selector.ts +9 -0
  362. package/src/modes/components/status-line/gh.ts +45 -1
  363. package/src/modes/components/status-line/segments.ts +16 -1
  364. package/src/modes/components/tool-status-header.ts +13 -3
  365. package/src/modes/controllers/command-controller.ts +20 -8
  366. package/src/modes/controllers/extension-ui-controller.ts +56 -257
  367. package/src/modes/controllers/input-controller.ts +10 -0
  368. package/src/modes/controllers/runtime-mcp-command-controller.ts +16 -3
  369. package/src/modes/controllers/selector-controller.ts +177 -72
  370. package/src/modes/controllers/stt-controller.ts +3 -3
  371. package/src/modes/interactive-mode.ts +88 -16
  372. package/src/modes/print-mode.ts +35 -6
  373. package/src/modes/runtime-init.ts +21 -68
  374. package/src/modes/types.ts +1 -0
  375. package/src/modes/utils/injected-user-submission.ts +25 -0
  376. package/src/modes/utils/terminal-bell.ts +15 -1
  377. package/src/prompts/agent-fragments/ralplan-persistence.md +1 -1
  378. package/src/prompts/agent-fragments/restricted-bash.md +1 -1
  379. package/src/prompts/agents/critic.md +1 -1
  380. package/src/prompts/system/rlm-research.md +1 -1
  381. package/src/prompts/system/system-prompt.md +0 -2
  382. package/src/prompts/tools/bash.md +7 -1
  383. package/src/prompts/tools/browser.md +1 -1
  384. package/src/prompts/tools/cron.md +6 -6
  385. package/src/prompts/tools/read.md +0 -2
  386. package/src/prompts/tools/skill-discovery.md +4 -2
  387. package/src/runtime-mcp/client.ts +427 -23
  388. package/src/runtime-mcp/config.ts +37 -5
  389. package/src/runtime-mcp/manager-pool.test.ts +56 -0
  390. package/src/runtime-mcp/manager.ts +52 -2
  391. package/src/runtime-mcp/oauth-discovery.ts +13 -0
  392. package/src/runtime-mcp/oauth-flow.ts +46 -1
  393. package/src/runtime-mcp/pool-key.ts +5 -1
  394. package/src/runtime-mcp/pool.test.ts +9 -0
  395. package/src/runtime-mcp/protocol.test.ts +353 -0
  396. package/src/runtime-mcp/protocol.ts +624 -0
  397. package/src/runtime-mcp/scope-config.ts +78 -0
  398. package/src/runtime-mcp/tool-bridge.ts +44 -10
  399. package/src/runtime-mcp/transports/http.ts +84 -13
  400. package/src/runtime-mcp/types.ts +123 -12
  401. package/src/sdk/acp/adapter.ts +328 -97
  402. package/src/sdk/broker/broker.ts +160 -741
  403. package/src/sdk/broker/ensure.ts +9 -1
  404. package/src/sdk/broker/lifecycle.ts +510 -116
  405. package/src/sdk/broker/operation-receipt-ledger.ts +11 -2
  406. package/src/sdk/broker/process-incarnation.ts +19 -0
  407. package/src/sdk/broker/session-index.ts +516 -117
  408. package/src/sdk/broker/startup-failure.ts +28 -5
  409. package/src/sdk/broker/transport.ts +1 -13
  410. package/src/sdk/bus/chat-daemon-cli.ts +4 -2
  411. package/src/sdk/bus/chat-daemon-control.ts +67 -6
  412. package/src/sdk/bus/chat-daemon-runtime.ts +183 -859
  413. package/src/sdk/bus/config.ts +13 -0
  414. package/src/sdk/bus/conversation-store.ts +59 -171
  415. package/src/sdk/bus/daemon-paths.ts +20 -0
  416. package/src/sdk/bus/discord-conversation.ts +2 -0
  417. package/src/sdk/bus/discord-daemon.ts +524 -126
  418. package/src/sdk/bus/discord-live-provider.ts +206 -79
  419. package/src/sdk/bus/existing-thread-readiness.ts +4 -97
  420. package/src/sdk/bus/inbound-reaction-ordering.ts +122 -0
  421. package/src/sdk/bus/index.ts +2480 -456
  422. package/src/sdk/bus/kind-aware-reconciliation.ts +204 -34
  423. package/src/sdk/bus/lifecycle-commands.ts +2 -2
  424. package/src/sdk/bus/managed-daemon.ts +2 -145
  425. package/src/sdk/bus/notification-service.ts +196 -0
  426. package/src/sdk/bus/operator-runtime.ts +1 -1
  427. package/src/sdk/bus/prompt-reconciliation.ts +24 -15
  428. package/src/sdk/bus/reconciliation-store.ts +553 -24
  429. package/src/sdk/bus/session-control.ts +49 -3
  430. package/src/sdk/bus/slack-conversation.ts +4 -0
  431. package/src/sdk/bus/slack-daemon.ts +733 -134
  432. package/src/sdk/bus/slack-live-provider.ts +65 -15
  433. package/src/sdk/bus/slack-provider.ts +4 -0
  434. package/src/sdk/bus/slack-thread-binding.ts +9 -104
  435. package/src/sdk/bus/telegram-adoption-intent.ts +299 -209
  436. package/src/sdk/bus/telegram-daemon-cli.ts +194 -7
  437. package/src/sdk/bus/telegram-daemon-contract.ts +265 -19
  438. package/src/sdk/bus/telegram-daemon-control.ts +3 -13
  439. package/src/sdk/bus/telegram-daemon-orphan-reap.ts +498 -0
  440. package/src/sdk/bus/telegram-daemon-owner-registry.ts +176 -0
  441. package/src/sdk/bus/telegram-daemon.ts +2552 -2280
  442. package/src/sdk/bus/telegram-reference.ts +1 -226
  443. package/src/sdk/bus/telegram-setup.ts +2 -2
  444. package/src/sdk/bus/threaded-render.ts +1 -0
  445. package/src/sdk/bus/topic-registry.ts +279 -146
  446. package/src/sdk/cli/rows.ts +2 -35
  447. package/src/sdk/cli/session-cli.ts +776 -700
  448. package/src/sdk/client/client.ts +892 -1
  449. package/src/sdk/host/control/dispatch.ts +93 -58
  450. package/src/sdk/host/control/index.ts +1 -1
  451. package/src/sdk/host/control/operations.ts +18 -10
  452. package/src/sdk/host/control/runtime-gate.ts +40 -0
  453. package/src/sdk/host/host.ts +63 -12
  454. package/src/sdk/host/query/handlers.ts +66 -7
  455. package/src/sdk/host/reverse-leases.ts +2 -2
  456. package/src/sdk/host/sdk-surface-parity.test.ts +1 -1
  457. package/src/sdk/host/session-runtime.test.ts +2787 -34
  458. package/src/sdk/host/session-runtime.ts +1489 -101
  459. package/src/sdk/host/surface-policy.ts +12 -8
  460. package/src/sdk/host/types.ts +1 -1
  461. package/src/sdk/host/websocket-transport.lifecycle.test.ts +31 -59
  462. package/src/sdk/host/websocket-transport.ts +85 -50
  463. package/src/sdk/index.ts +2 -1
  464. package/src/sdk/lifecycle/broker-client.ts +53 -0
  465. package/src/sdk/lifecycle/client.ts +234 -0
  466. package/src/sdk/lifecycle/index.ts +3 -0
  467. package/src/sdk/{bus/recent-activity.ts → lifecycle/recent-sessions.ts} +5 -2
  468. package/src/sdk/lifecycle/service.ts +720 -0
  469. package/src/sdk/mcp/server.ts +226 -188
  470. package/src/sdk/prompt-deadline-lease.ts +55 -0
  471. package/src/sdk/prompt-deadline-manager.ts +148 -0
  472. package/src/sdk/prompt-status.ts +11 -3
  473. package/src/sdk/protocol/operation-inventory.generated.json +272 -129
  474. package/src/sdk/protocol/operation-registry.ts +71 -8
  475. package/src/sdk/receipt-state.ts +43 -0
  476. package/src/sdk/reconciliation-extensions.ts +14 -0
  477. package/src/sdk/router/index.ts +1 -0
  478. package/src/sdk/router/session-router.ts +1658 -0
  479. package/src/sdk/session-list.ts +93 -0
  480. package/src/sdk/session-reconnect.ts +45 -1
  481. package/src/sdk/session.ts +716 -120
  482. package/src/sdk/transport/serve-cli.ts +18 -34
  483. package/src/session/account-inventory.ts +603 -0
  484. package/src/session/agent-session.ts +2857 -582
  485. package/src/session/agent-storage.ts +35 -0
  486. package/src/session/blob-store.ts +32 -1
  487. package/src/session/coordinator-tool-label.ts +40 -0
  488. package/src/session/internal/managed-session-scope.ts +4 -0
  489. package/src/session/internal/managed-session-storage.ts +173 -12
  490. package/src/session/messages.ts +1 -1
  491. package/src/session/secure-token-file.ts +80 -0
  492. package/src/session/session-manager.ts +730 -58
  493. package/src/session/session-storage.ts +25 -16
  494. package/src/session/startup-auth-config.ts +297 -0
  495. package/src/session/terminal-abort.ts +1253 -0
  496. package/src/session/yield-queue.ts +57 -15
  497. package/src/session-import/claude.ts +334 -0
  498. package/src/session-import/codex.ts +1033 -0
  499. package/src/session-import/command.ts +77 -0
  500. package/src/session-import/detect.ts +133 -0
  501. package/src/session-import/index.ts +7 -0
  502. package/src/session-import/provider-codex.ts +327 -0
  503. package/src/session-import/provider-service.ts +457 -0
  504. package/src/session-import/redact.ts +128 -0
  505. package/src/session-import/service.ts +1264 -0
  506. package/src/session-import/types.ts +148 -0
  507. package/src/setup/paseo/check.ts +213 -0
  508. package/src/setup/paseo/install-saga.ts +293 -0
  509. package/src/setup/paseo/json-publisher.ts +263 -0
  510. package/src/setup/paseo/orchestration-preferences.ts +86 -0
  511. package/src/setup/paseo/paseo-ownership.ts +224 -0
  512. package/src/setup/paseo/paseo-setup.ts +253 -0
  513. package/src/setup/paseo/provider-config.ts +139 -0
  514. package/src/setup/paseo/remove.ts +183 -0
  515. package/src/setup/paseo/result-types.ts +79 -0
  516. package/src/setup/paseo/setup-deps.ts +175 -0
  517. package/src/setup/paseo/skills-bridge.ts +260 -0
  518. package/src/skill-state/active-state.ts +21 -11
  519. package/src/slash-commands/acp-builtins.ts +9 -1
  520. package/src/slash-commands/builtin-registry.ts +98 -16
  521. package/src/slash-commands/helpers/credential-switch.ts +143 -0
  522. package/src/slash-commands/helpers/mcp.ts +9 -3
  523. package/src/slash-commands/helpers/usage-report.ts +61 -56
  524. package/src/slash-commands/types.ts +7 -2
  525. package/src/task/executor.ts +30 -11
  526. package/src/task/index.ts +66 -7
  527. package/src/task/render.ts +23 -9
  528. package/src/tools/ask-answer-registry.ts +23 -7
  529. package/src/tools/ask.ts +8 -4
  530. package/src/tools/bash-sleep-advisory.ts +115 -0
  531. package/src/tools/bash.ts +98 -18
  532. package/src/tools/browser/attach.ts +71 -3
  533. package/src/tools/browser/launch.ts +86 -13
  534. package/src/tools/browser/profile-discovery.ts +57 -7
  535. package/src/tools/browser/render.ts +8 -1
  536. package/src/tools/browser.ts +130 -21
  537. package/src/tools/computer.enforcement.test.ts +1 -1
  538. package/src/tools/computer.ts +3 -2
  539. package/src/tools/cron.ts +12 -1
  540. package/src/tools/image-gen.ts +27 -16
  541. package/src/tools/index.ts +8 -0
  542. package/src/tools/job.ts +33 -6
  543. package/src/tools/monitor.ts +41 -2
  544. package/src/tools/skill-discovery.ts +21 -29
  545. package/src/tools/subagent.ts +142 -24
  546. package/src/tools/tool-catalog.generated.ts +6 -6
  547. package/src/tools/ultragoal-ask-guard.ts +10 -3
  548. package/src/utils/herdr-pane.ts +345 -0
  549. package/src/utils/title-generator.ts +2 -0
  550. package/src/web/scrapers/index.ts +6 -4
  551. package/dist/types/cli/malloc-env-guard.test.d.ts +0 -1
  552. package/dist/types/defaults/gjc-defaults.test.d.ts +0 -1
  553. package/dist/types/memory-backend/lazy-loading.test.d.ts +0 -1
  554. package/dist/types/runtime/boot-ordering.test.d.ts +0 -1
  555. package/dist/types/runtime/lazy-service.test.d.ts +0 -1
  556. package/dist/types/runtime/network-prewarm-service.test.d.ts +0 -1
  557. package/dist/types/runtime/workspace-tree-service.test.d.ts +0 -1
  558. package/dist/types/runtime-mcp/config.test.d.ts +0 -1
  559. package/dist/types/runtime-mcp/http.test.d.ts +0 -1
  560. package/dist/types/runtime-mcp/manager-pool.test.d.ts +0 -1
  561. package/dist/types/runtime-mcp/pool-key.test.d.ts +0 -1
  562. package/dist/types/runtime-mcp/pool.test.d.ts +0 -1
  563. package/dist/types/sdk/bus/lifecycle-control-runtime.d.ts +0 -117
  564. package/dist/types/sdk/bus/lifecycle-orchestrator.d.ts +0 -141
  565. package/dist/types/sdk/bus/telegram-cli.d.ts +0 -31
  566. package/dist/types/sdk/elevation/allowlist.d.ts +0 -20
  567. package/dist/types/sdk/elevation/audit.d.ts +0 -93
  568. package/dist/types/sdk/elevation/capability.d.ts +0 -3
  569. package/dist/types/sdk/elevation/digest.d.ts +0 -72
  570. package/dist/types/sdk/elevation/dispatch-receipt.d.ts +0 -85
  571. package/dist/types/sdk/elevation/grant-ledger.d.ts +0 -163
  572. package/dist/types/sdk/elevation/owner.d.ts +0 -48
  573. package/dist/types/sdk/host/import-graph.test.d.ts +0 -1
  574. package/dist/types/sdk/host/sdk-surface-parity.test.d.ts +0 -1
  575. package/dist/types/sdk/host/session-runtime.test.d.ts +0 -1
  576. package/dist/types/sdk/host/websocket-transport.lifecycle.test.d.ts +0 -1
  577. package/dist/types/session/auth-broker-config.d.ts +0 -13
  578. package/dist/types/session/heap-eviction-artifacts.test.d.ts +0 -1
  579. package/dist/types/skills/skills.test.d.ts +0 -1
  580. package/dist/types/slash-commands/notify-command.test.d.ts +0 -1
  581. package/dist/types/task/token-log.test.d.ts +0 -1
  582. package/dist/types/tools/computer.enforcement.test.d.ts +0 -1
  583. package/dist/types/tools/descriptors.test.d.ts +0 -1
  584. package/scripts/g005-daemon-smoke.ts +0 -180
  585. package/scripts/g011-daemon-path-smoke.ts +0 -153
  586. package/src/sdk/bus/lifecycle-control-runtime.ts +0 -1733
  587. package/src/sdk/bus/lifecycle-orchestrator.ts +0 -489
  588. package/src/sdk/bus/telegram-cli.ts +0 -212
  589. package/src/sdk/elevation/allowlist.ts +0 -54
  590. package/src/sdk/elevation/audit.ts +0 -208
  591. package/src/sdk/elevation/capability.ts +0 -41
  592. package/src/sdk/elevation/digest.ts +0 -129
  593. package/src/sdk/elevation/dispatch-receipt.ts +0 -184
  594. package/src/sdk/elevation/grant-ledger.ts +0 -1142
  595. package/src/sdk/elevation/owner.ts +0 -109
  596. package/src/session/auth-broker-config.ts +0 -109
  597. /package/dist/types/{ai-core-import-gate.test.d.ts → discovery/claude-hooks.d.ts} +0 -0
  598. /package/dist/types/{cli/fixture-report.test.d.ts → discovery/codex-hooks.d.ts} +0 -0
  599. /package/dist/types/sdk/{bus/recent-activity.d.ts → lifecycle/recent-sessions.d.ts} +0 -0
@@ -0,0 +1,720 @@
1
+ import { createHash } from "node:crypto";
2
+ import {
3
+ SessionListTraversalError,
4
+ type SessionListTraversalPage,
5
+ sessionListPageFromResponse,
6
+ traverseSessionList,
7
+ } from "../session-list";
8
+
9
+ export type SessionLifecycleOperation =
10
+ | "session.create"
11
+ | "session.fork"
12
+ | "session.resume"
13
+ | "session.close"
14
+ | "session.delete"
15
+ | "session.list";
16
+
17
+ export interface SessionLifecycleActor {
18
+ readonly id: string;
19
+ readonly namespace: string;
20
+ }
21
+
22
+ export interface SessionLifecycleClientRequestOptions {
23
+ readonly idempotencyKey?: string;
24
+ readonly timeoutMs?: number;
25
+ }
26
+
27
+ /** The deliberately small client surface needed by the lifecycle facade. */
28
+ export interface SessionLifecycleClient {
29
+ global(
30
+ operation: SessionLifecycleOperation,
31
+ input: Record<string, unknown>,
32
+ options: SessionLifecycleClientRequestOptions,
33
+ ): Promise<unknown>;
34
+ }
35
+
36
+ export interface SessionLifecycleWorktreeTarget {
37
+ readonly enabled: true;
38
+ readonly name?: string;
39
+ }
40
+
41
+ export interface SessionLifecycleTranscriptIdentity {
42
+ readonly dev: string;
43
+ readonly ino: string;
44
+ readonly size: number;
45
+ readonly mtimeMs: number;
46
+ readonly mtimeNs: string;
47
+ readonly sha256: string;
48
+ }
49
+
50
+ export interface SessionLifecycleSavedSessionIdentity extends SessionLifecycleTranscriptIdentity {
51
+ readonly nlink: string;
52
+ readonly ctimeNs: string;
53
+ }
54
+
55
+ export interface SessionLifecycleSavedSession {
56
+ readonly id: string;
57
+ readonly path: string;
58
+ readonly identity: SessionLifecycleSavedSessionIdentity;
59
+ }
60
+
61
+ export interface SessionLifecycleCoordinatorTarget {
62
+ readonly coordinatorStateDir?: string;
63
+ readonly coordinatorSessionId?: string;
64
+ readonly coordinatorSessionBranch?: string;
65
+ }
66
+
67
+ export interface SessionCreateTarget extends SessionLifecycleCoordinatorTarget {
68
+ readonly cwd: string;
69
+ readonly stateRoot?: string;
70
+ readonly body?: string;
71
+ readonly modelPreset?: string;
72
+ readonly mcpServers?: readonly Record<string, unknown>[];
73
+ readonly worktree?: SessionLifecycleWorktreeTarget;
74
+ readonly readiness?: "immediate" | "deferred";
75
+ readonly readinessTimeoutMs?: number;
76
+ }
77
+
78
+ export interface SessionForkTarget extends SessionLifecycleCoordinatorTarget {
79
+ readonly cwd: string;
80
+ readonly stateRoot?: string;
81
+ readonly sourceSessionId?: string;
82
+ readonly sourceSessionPath?: string;
83
+ readonly sourceSessionIdentity?: SessionLifecycleTranscriptIdentity;
84
+ readonly body?: string;
85
+ readonly modelPreset?: string;
86
+ readonly mcpServers?: readonly Record<string, unknown>[];
87
+ readonly worktree?: SessionLifecycleWorktreeTarget;
88
+ readonly readinessTimeoutMs?: number;
89
+ }
90
+
91
+ export interface SessionResumeTarget extends SessionLifecycleCoordinatorTarget {
92
+ readonly sessionId: string;
93
+ readonly cwd?: string;
94
+ readonly stateRoot?: string;
95
+ readonly sessionPath?: string;
96
+ readonly sessionIdentity?: SessionLifecycleTranscriptIdentity;
97
+ readonly body?: string;
98
+ readonly modelPreset?: string;
99
+ readonly mcpServers?: readonly Record<string, unknown>[];
100
+ readonly worktree?: SessionLifecycleWorktreeTarget;
101
+ readonly readinessTimeoutMs?: number;
102
+ }
103
+
104
+ export interface SessionCloseTarget {
105
+ readonly sessionId: string;
106
+ readonly endpointGeneration?: number;
107
+ readonly endpointIncarnation?: string;
108
+ }
109
+
110
+ export interface SessionDeleteTarget {
111
+ readonly sessionId: string;
112
+ readonly cwd?: string;
113
+ readonly stateRoot?: string;
114
+ readonly sessionPath?: string;
115
+ }
116
+
117
+ export interface SessionListTarget {
118
+ readonly cwd?: string;
119
+ readonly resolveSessionId?: string;
120
+ }
121
+
122
+ interface SessionLifecycleMutationRequestBase<
123
+ TOperation extends Exclude<SessionLifecycleOperation, "session.list">,
124
+ TTarget,
125
+ > {
126
+ readonly operation: TOperation;
127
+ readonly actor: SessionLifecycleActor;
128
+ readonly capability: TOperation;
129
+ readonly requestKey: string;
130
+ readonly target: TTarget;
131
+ readonly timeoutMs?: number;
132
+ }
133
+
134
+ export type SessionCreateRequest = SessionLifecycleMutationRequestBase<"session.create", SessionCreateTarget>;
135
+ export type SessionForkRequest = SessionLifecycleMutationRequestBase<"session.fork", SessionForkTarget>;
136
+ export type SessionResumeRequest = SessionLifecycleMutationRequestBase<"session.resume", SessionResumeTarget>;
137
+ export type SessionCloseRequest = SessionLifecycleMutationRequestBase<"session.close", SessionCloseTarget>;
138
+ export type SessionDeleteRequest = SessionLifecycleMutationRequestBase<"session.delete", SessionDeleteTarget>;
139
+ export interface SessionListRequest {
140
+ readonly operation: "session.list";
141
+ readonly actor: SessionLifecycleActor;
142
+ readonly capability: "session.list";
143
+ readonly target?: SessionListTarget;
144
+ readonly timeoutMs?: number;
145
+ }
146
+
147
+ export type SessionLifecycleRequest = SessionLifecycleMutationRequest | SessionListRequest;
148
+
149
+ export type SessionLifecycleMutationRequest =
150
+ | SessionCreateRequest
151
+ | SessionForkRequest
152
+ | SessionResumeRequest
153
+ | SessionCloseRequest
154
+ | SessionDeleteRequest;
155
+
156
+ export type SessionLifecycleCertainty = "terminal" | "retryable" | "cleanup_pending" | "uncertain";
157
+
158
+ export interface SessionLifecycleSessionResult {
159
+ readonly sessionId: string;
160
+ readonly cwd?: string;
161
+ readonly endpointGeneration?: number;
162
+ readonly reused?: boolean;
163
+ readonly note?: string;
164
+ }
165
+
166
+ export interface SessionLifecycleListEntry {
167
+ readonly sessionId: string;
168
+ readonly live?: boolean;
169
+ readonly endpointGeneration?: number;
170
+ readonly terminalUncertain?: boolean;
171
+ readonly repo?: string;
172
+ }
173
+
174
+ export interface SessionLifecycleListResult {
175
+ readonly indexSeq: number;
176
+ readonly sessions: readonly SessionLifecycleListEntry[];
177
+ readonly warnings: readonly string[];
178
+ readonly savedSession?: SessionLifecycleSavedSession;
179
+ }
180
+
181
+ export interface SessionCreateResult {
182
+ readonly ok: true;
183
+ readonly operation: "session.create";
184
+ readonly result: SessionLifecycleSessionResult;
185
+ }
186
+ export interface SessionForkResult {
187
+ readonly ok: true;
188
+ readonly operation: "session.fork";
189
+ readonly result: SessionLifecycleSessionResult;
190
+ }
191
+ export interface SessionResumeResult {
192
+ readonly ok: true;
193
+ readonly operation: "session.resume";
194
+ readonly result: SessionLifecycleSessionResult;
195
+ }
196
+ export interface SessionCloseResult {
197
+ readonly ok: true;
198
+ readonly operation: "session.close";
199
+ readonly result: SessionLifecycleSessionResult;
200
+ }
201
+ export interface SessionDeleteResult {
202
+ readonly ok: true;
203
+ readonly operation: "session.delete";
204
+ readonly result: SessionLifecycleSessionResult;
205
+ }
206
+ export interface SessionListSuccessResult {
207
+ readonly ok: true;
208
+ readonly operation: "session.list";
209
+ readonly result: SessionLifecycleListResult;
210
+ }
211
+
212
+ export interface SessionLifecycleError {
213
+ readonly code: string;
214
+ readonly message: string;
215
+ }
216
+
217
+ export type SessionCreateFailure = {
218
+ readonly ok: false;
219
+ readonly operation: "session.create";
220
+ readonly certainty: SessionLifecycleCertainty;
221
+ readonly error: SessionLifecycleError;
222
+ };
223
+ export type SessionForkFailure = {
224
+ readonly ok: false;
225
+ readonly operation: "session.fork";
226
+ readonly certainty: SessionLifecycleCertainty;
227
+ readonly error: SessionLifecycleError;
228
+ };
229
+ export type SessionResumeFailure = {
230
+ readonly ok: false;
231
+ readonly operation: "session.resume";
232
+ readonly certainty: SessionLifecycleCertainty;
233
+ readonly error: SessionLifecycleError;
234
+ };
235
+ export type SessionCloseFailure = {
236
+ readonly ok: false;
237
+ readonly operation: "session.close";
238
+ readonly certainty: SessionLifecycleCertainty;
239
+ readonly error: SessionLifecycleError;
240
+ };
241
+ export type SessionDeleteFailure = {
242
+ readonly ok: false;
243
+ readonly operation: "session.delete";
244
+ readonly certainty: SessionLifecycleCertainty;
245
+ readonly error: SessionLifecycleError;
246
+ };
247
+ export type SessionListFailure = {
248
+ readonly ok: false;
249
+ readonly operation: "session.list";
250
+ readonly certainty: SessionLifecycleCertainty;
251
+ readonly error: SessionLifecycleError;
252
+ };
253
+
254
+ export type SessionCreateOutcome = SessionCreateResult | SessionCreateFailure;
255
+ export type SessionForkOutcome = SessionForkResult | SessionForkFailure;
256
+ export type SessionResumeOutcome = SessionResumeResult | SessionResumeFailure;
257
+ export type SessionCloseOutcome = SessionCloseResult | SessionCloseFailure;
258
+ export type SessionDeleteOutcome = SessionDeleteResult | SessionDeleteFailure;
259
+ export type SessionListOutcome = SessionListSuccessResult | SessionListFailure;
260
+ export type SessionLifecycleResult =
261
+ | SessionCreateOutcome
262
+ | SessionForkOutcome
263
+ | SessionResumeOutcome
264
+ | SessionCloseOutcome
265
+ | SessionDeleteOutcome
266
+ | SessionListOutcome;
267
+
268
+ /** Shared, side-effect-free validation for lifecycle mutation requests. */
269
+ export type SessionLifecycleMutationValidation =
270
+ | {
271
+ readonly ok: true;
272
+ readonly operation: Exclude<SessionLifecycleOperation, "session.list">;
273
+ readonly actor: SessionLifecycleActor;
274
+ readonly requestKey: string;
275
+ readonly target: Readonly<Record<string, unknown>>;
276
+ }
277
+ | SessionCreateFailure
278
+ | SessionForkFailure
279
+ | SessionResumeFailure
280
+ | SessionCloseFailure
281
+ | SessionDeleteFailure;
282
+
283
+ const RETRYABLE_BROKER_ERRORS = new Set([
284
+ "unavailable",
285
+ "broker_restarting",
286
+ "readiness_timeout",
287
+ "startup_admission_timeout",
288
+ ]);
289
+
290
+ function isRecord(value: unknown): value is Record<string, unknown> {
291
+ return typeof value === "object" && value !== null && !Array.isArray(value);
292
+ }
293
+
294
+ function canonicalJson(value: unknown): string {
295
+ if (value === null) return "null";
296
+ if (typeof value === "string" || typeof value === "boolean" || typeof value === "number")
297
+ return JSON.stringify(value);
298
+ if (Array.isArray(value)) return `[${value.map(canonicalJson).join(",")}]`;
299
+ if (isRecord(value)) {
300
+ return `{${Object.keys(value)
301
+ .filter(key => value[key] !== undefined)
302
+ .sort()
303
+ .map(key => `${JSON.stringify(key)}:${canonicalJson(value[key])}`)
304
+ .join(",")}}`;
305
+ }
306
+ return JSON.stringify(String(value));
307
+ }
308
+
309
+ /** Derives a stable Broker idempotency key without exposing caller identity to Broker inputs. */
310
+ export function deriveSessionLifecycleIdempotencyKey(
311
+ actor: SessionLifecycleActor,
312
+ requestKey: string,
313
+ operation: SessionLifecycleOperation,
314
+ ): string {
315
+ const identity = {
316
+ actorNamespace: actor.namespace,
317
+ actorId: actor.id,
318
+ requestKey,
319
+ operation,
320
+ };
321
+ return createHash("sha256").update(canonicalJson(identity), "utf8").digest("hex");
322
+ }
323
+
324
+ function operationOf(value: unknown): SessionLifecycleOperation {
325
+ if (
326
+ value === "session.create" ||
327
+ value === "session.fork" ||
328
+ value === "session.resume" ||
329
+ value === "session.close" ||
330
+ value === "session.delete" ||
331
+ value === "session.list"
332
+ )
333
+ return value;
334
+ return "session.list";
335
+ }
336
+
337
+ function failure<TOperation extends SessionLifecycleOperation>(
338
+ operation: TOperation,
339
+ certainty: SessionLifecycleCertainty,
340
+ code: string,
341
+ message: string,
342
+ ): {
343
+ ok: false;
344
+ operation: TOperation;
345
+ certainty: SessionLifecycleCertainty;
346
+ error: SessionLifecycleError;
347
+ } {
348
+ return { ok: false, operation, certainty, error: { code, message } };
349
+ }
350
+
351
+ function validActor(actor: unknown): actor is SessionLifecycleActor {
352
+ return (
353
+ isRecord(actor) &&
354
+ typeof actor.id === "string" &&
355
+ actor.id.length > 0 &&
356
+ typeof actor.namespace === "string" &&
357
+ actor.namespace.length > 0
358
+ );
359
+ }
360
+
361
+ function validRequestKey(requestKey: unknown): requestKey is string {
362
+ return typeof requestKey === "string" && requestKey.length > 0;
363
+ }
364
+
365
+ function validTarget(target: unknown): target is Readonly<Record<string, unknown>> {
366
+ return isRecord(target);
367
+ }
368
+
369
+ /** Validates lifecycle authority and shape without contacting the Broker. */
370
+ export function validateSessionLifecycleMutationRequest(request: unknown): SessionLifecycleMutationValidation {
371
+ const record = isRecord(request) ? request : {};
372
+ const operation = operationOf(record.operation);
373
+ if (operation === "session.list")
374
+ return failure("session.create", "terminal", "invalid_request", "lifecycle mutation operation is required");
375
+ if (!validActor(record.actor))
376
+ return failure(operation, "terminal", "unauthorized", "authenticated actor is required");
377
+ if (!validRequestKey(record.requestKey))
378
+ return failure(operation, "terminal", "invalid_request", "requestKey is required");
379
+ if (record.capability !== operation)
380
+ return failure(operation, "terminal", "capability_denied", `capability does not authorize ${operation}`);
381
+ if (!validTarget(record.target))
382
+ return failure(operation, "terminal", "invalid_request", "target must be an object");
383
+ return {
384
+ ok: true,
385
+ operation,
386
+ actor: record.actor,
387
+ requestKey: record.requestKey,
388
+ target: record.target,
389
+ };
390
+ }
391
+
392
+ function certaintyForBrokerCode(code: string): SessionLifecycleCertainty {
393
+ if (code === "terminal_uncertain") return "uncertain";
394
+ if (code === "cleanup_pending") return "cleanup_pending";
395
+ if (RETRYABLE_BROKER_ERRORS.has(code)) return "retryable";
396
+ return "terminal";
397
+ }
398
+
399
+ function credentialFreeRecord(value: Record<string, unknown>): Record<string, unknown> {
400
+ const output: Record<string, unknown> = {};
401
+ for (const [key, nested] of Object.entries(value)) {
402
+ if (key === "endpoint" || key === "token" || key === "url") continue;
403
+ if (isRecord(nested)) output[key] = credentialFreeRecord(nested);
404
+ else if (Array.isArray(nested))
405
+ output[key] = nested.map(item => (isRecord(item) ? credentialFreeRecord(item) : item));
406
+ else output[key] = nested;
407
+ }
408
+ return output;
409
+ }
410
+
411
+ function sessionResult(value: unknown, expectedSessionId?: string): SessionLifecycleSessionResult | undefined {
412
+ if (!isRecord(value)) return undefined;
413
+ const record = credentialFreeRecord(value);
414
+ const sessionId = typeof record.sessionId === "string" ? record.sessionId : undefined;
415
+ if (!sessionId || (expectedSessionId !== undefined && sessionId !== expectedSessionId)) return undefined;
416
+ const result: {
417
+ sessionId: string;
418
+ cwd?: string;
419
+ endpointGeneration?: number;
420
+ reused?: boolean;
421
+ note?: string;
422
+ } = { sessionId };
423
+ if (typeof record.cwd === "string") result.cwd = record.cwd;
424
+ if (typeof record.endpointGeneration === "number") result.endpointGeneration = record.endpointGeneration;
425
+ if (typeof record.reused === "boolean") result.reused = record.reused;
426
+ if (typeof record.note === "string") result.note = record.note;
427
+ return result;
428
+ }
429
+
430
+ function savedSessionTranscriptIdentity(value: unknown): SessionLifecycleSavedSessionIdentity | undefined {
431
+ if (!isRecord(value)) return undefined;
432
+ const { dev, ino, nlink, size, mtimeMs, mtimeNs, ctimeNs, sha256 } = value;
433
+ if (
434
+ typeof dev !== "string" ||
435
+ !/^\d+$/.test(dev) ||
436
+ typeof ino !== "string" ||
437
+ !/^\d+$/.test(ino) ||
438
+ typeof nlink !== "string" ||
439
+ !/^\d+$/.test(nlink) ||
440
+ typeof size !== "number" ||
441
+ !Number.isSafeInteger(size) ||
442
+ size < 0 ||
443
+ typeof mtimeMs !== "number" ||
444
+ !Number.isFinite(mtimeMs) ||
445
+ mtimeMs < 0 ||
446
+ typeof mtimeNs !== "string" ||
447
+ !/^\d+$/.test(mtimeNs) ||
448
+ typeof ctimeNs !== "string" ||
449
+ !/^\d+$/.test(ctimeNs) ||
450
+ typeof sha256 !== "string" ||
451
+ !/^[a-f0-9]{64}$/.test(sha256)
452
+ )
453
+ return undefined;
454
+ return { dev, ino, nlink, size, mtimeMs, mtimeNs, ctimeNs, sha256 };
455
+ }
456
+
457
+ function savedSessionFromResult(value: unknown): SessionLifecycleSavedSession | undefined {
458
+ if (!isRecord(value)) return undefined;
459
+ const identity = savedSessionTranscriptIdentity(value.identity);
460
+ if (typeof value.id !== "string" || typeof value.path !== "string" || value.path.length === 0 || !identity)
461
+ return undefined;
462
+ return { id: value.id, path: value.path, identity };
463
+ }
464
+
465
+ function listResult(value: unknown): SessionLifecycleListResult | undefined {
466
+ if (!isRecord(value) || !Array.isArray(value.sessions)) return undefined;
467
+ const indexSeq = value.indexSeq;
468
+ if (
469
+ typeof indexSeq !== "number" ||
470
+ !Number.isSafeInteger(indexSeq) ||
471
+ indexSeq < 0 ||
472
+ !Array.isArray(value.warnings)
473
+ )
474
+ return undefined;
475
+ const sessions: SessionLifecycleListEntry[] = [];
476
+ for (const entry of value.sessions) {
477
+ if (!isRecord(entry) || typeof entry.sessionId !== "string") return undefined;
478
+ const item: {
479
+ sessionId: string;
480
+ live?: boolean;
481
+ endpointGeneration?: number;
482
+ terminalUncertain?: boolean;
483
+ repo?: string;
484
+ } = { sessionId: entry.sessionId };
485
+ if (typeof entry.live === "boolean") item.live = entry.live;
486
+ if (typeof entry.endpointGeneration === "number") item.endpointGeneration = entry.endpointGeneration;
487
+ if (typeof entry.terminalUncertain === "boolean") item.terminalUncertain = entry.terminalUncertain;
488
+ if (isRecord(entry.locator) && typeof entry.locator.repo === "string") item.repo = entry.locator.repo;
489
+ sessions.push(item);
490
+ }
491
+ const warnings: string[] = [];
492
+ for (const warning of value.warnings) {
493
+ if (typeof warning !== "string") return undefined;
494
+ warnings.push(warning);
495
+ }
496
+ const savedSessionPresent = Object.hasOwn(value, "savedSession");
497
+ const savedSession = savedSessionPresent ? savedSessionFromResult(value.savedSession) : undefined;
498
+ if (savedSessionPresent && !savedSession) return undefined;
499
+ return { indexSeq, sessions, warnings, ...(savedSession ? { savedSession } : {}) };
500
+ }
501
+ type LifecycleListPage = {
502
+ readonly result: SessionLifecycleListResult;
503
+ readonly sessions: readonly SessionLifecycleListEntry[];
504
+ readonly continuationCursor?: unknown;
505
+ };
506
+
507
+ function brokerError(value: unknown): { code: string; message: string } | undefined {
508
+ if (!isRecord(value) || value.ok !== false || !isRecord(value.error)) return undefined;
509
+ if (typeof value.error.code !== "string" || typeof value.error.message !== "string") return undefined;
510
+ return { code: value.error.code, message: value.error.message };
511
+ }
512
+
513
+ class BrokerSessionListResponseError extends Error {
514
+ readonly #brokerError: { readonly code: string; readonly message: string };
515
+
516
+ constructor(error: { readonly code: string; readonly message: string }) {
517
+ super(error.message);
518
+ this.name = "BrokerSessionListResponseError";
519
+ this.#brokerError = error;
520
+ }
521
+
522
+ get brokerError(): { readonly code: string; readonly message: string } {
523
+ return this.#brokerError;
524
+ }
525
+ }
526
+
527
+ function brokerErrorFromThrown(value: unknown): { code: string; message: string; requestSent?: boolean } | undefined {
528
+ if (!isRecord(value)) return undefined;
529
+ const details = isRecord(value.details) ? value.details : undefined;
530
+ const code =
531
+ typeof details?.code === "string" ? details.code : typeof value.code === "string" ? value.code : undefined;
532
+ if (!code) return undefined;
533
+ const message =
534
+ typeof details?.message === "string"
535
+ ? details.message
536
+ : typeof value.message === "string"
537
+ ? value.message
538
+ : "lifecycle broker request failed";
539
+ const requestSent =
540
+ typeof details?.requestSent === "boolean"
541
+ ? details.requestSent
542
+ : typeof value.requestSent === "boolean"
543
+ ? value.requestSent
544
+ : undefined;
545
+ return { code, message, ...(requestSent === undefined ? {} : { requestSent }) };
546
+ }
547
+
548
+ const TRANSPORT_ERROR_CODES = new Set([
549
+ "timeout",
550
+ "connection_closed",
551
+ "reconnect_exhausted",
552
+ "unavailable",
553
+ "protocol_error",
554
+ ]);
555
+
556
+ function certaintyForThrownError(error: {
557
+ readonly code: string;
558
+ readonly requestSent?: boolean;
559
+ }): SessionLifecycleCertainty {
560
+ if (error.code === "protocol_error") return error.requestSent === false ? "retryable" : "uncertain";
561
+ if (!TRANSPORT_ERROR_CODES.has(error.code)) return certaintyForBrokerCode(error.code);
562
+ if (error.requestSent === false) return "retryable";
563
+ if (error.requestSent === true || error.code === "connection_closed") return "uncertain";
564
+ return "retryable";
565
+ }
566
+
567
+ function brokerSuccess(value: unknown): unknown | undefined {
568
+ if (!isRecord(value) || value.ok !== true) return undefined;
569
+ return value.result;
570
+ }
571
+
572
+ export class SessionLifecycleService {
573
+ readonly #client: SessionLifecycleClient;
574
+
575
+ constructor(client: SessionLifecycleClient) {
576
+ this.#client = client;
577
+ }
578
+
579
+ async execute(
580
+ request: SessionLifecycleMutationRequest,
581
+ ): Promise<
582
+ SessionCreateOutcome | SessionForkOutcome | SessionResumeOutcome | SessionCloseOutcome | SessionDeleteOutcome
583
+ > {
584
+ const validation = validateSessionLifecycleMutationRequest(request);
585
+ if (!validation.ok) return validation;
586
+ const { operation, actor, requestKey, target } = validation;
587
+ const idempotencyKey = deriveSessionLifecycleIdempotencyKey(actor, requestKey, operation);
588
+ let response: unknown;
589
+ try {
590
+ response = await this.#client.global(
591
+ operation,
592
+ { ...target },
593
+ {
594
+ idempotencyKey,
595
+ ...(request.timeoutMs === undefined ? {} : { timeoutMs: request.timeoutMs }),
596
+ },
597
+ );
598
+ } catch (thrown) {
599
+ const error = brokerError(thrown) ?? brokerErrorFromThrown(thrown);
600
+ return error
601
+ ? failure(operation, certaintyForThrownError(error), error.code, error.message)
602
+ : failure(operation, "retryable", "unavailable", "lifecycle broker request was unavailable");
603
+ }
604
+
605
+ const error = brokerError(response);
606
+ if (error) return failure(operation, certaintyForBrokerCode(error.code), error.code, error.message);
607
+ if (!isRecord(response) || response.ok !== true)
608
+ return failure(operation, "uncertain", "malformed_response", "lifecycle broker returned a malformed response");
609
+ const expectedSessionId =
610
+ operation === "session.resume" || operation === "session.close" || operation === "session.delete"
611
+ ? typeof target.sessionId === "string"
612
+ ? target.sessionId
613
+ : undefined
614
+ : undefined;
615
+ const parsed = sessionResult(brokerSuccess(response), expectedSessionId);
616
+ if (!parsed)
617
+ return failure(
618
+ operation,
619
+ "uncertain",
620
+ "malformed_response",
621
+ "lifecycle broker returned a malformed session result",
622
+ );
623
+ return { ok: true, operation, result: parsed } as
624
+ | SessionCreateOutcome
625
+ | SessionForkOutcome
626
+ | SessionResumeOutcome
627
+ | SessionCloseOutcome
628
+ | SessionDeleteOutcome;
629
+ }
630
+
631
+ async create(request: Omit<SessionCreateRequest, "operation">): Promise<SessionCreateOutcome> {
632
+ return (await this.execute({ ...request, operation: "session.create" })) as SessionCreateOutcome;
633
+ }
634
+
635
+ async fork(request: Omit<SessionForkRequest, "operation">): Promise<SessionForkOutcome> {
636
+ return (await this.execute({ ...request, operation: "session.fork" })) as SessionForkOutcome;
637
+ }
638
+
639
+ async resume(request: Omit<SessionResumeRequest, "operation">): Promise<SessionResumeOutcome> {
640
+ return (await this.execute({ ...request, operation: "session.resume" })) as SessionResumeOutcome;
641
+ }
642
+
643
+ async close(request: Omit<SessionCloseRequest, "operation">): Promise<SessionCloseOutcome> {
644
+ return (await this.execute({ ...request, operation: "session.close" })) as SessionCloseOutcome;
645
+ }
646
+
647
+ async delete(request: Omit<SessionDeleteRequest, "operation">): Promise<SessionDeleteOutcome> {
648
+ return (await this.execute({ ...request, operation: "session.delete" })) as SessionDeleteOutcome;
649
+ }
650
+
651
+ async list(request: Omit<SessionListRequest, "operation">): Promise<SessionListOutcome> {
652
+ if (!validActor((request as { actor?: unknown }).actor))
653
+ return failure("session.list", "terminal", "unauthorized", "authenticated actor is required");
654
+ if ((request as { capability?: unknown }).capability !== "session.list")
655
+ return failure("session.list", "terminal", "capability_denied", "capability does not authorize session.list");
656
+ const target = request.target ?? {};
657
+ if (!validTarget(target))
658
+ return failure("session.list", "terminal", "invalid_request", "target must be an object");
659
+ let pages: readonly SessionListTraversalPage<unknown, LifecycleListPage>[];
660
+ try {
661
+ pages = await traverseSessionList<Record<string, unknown>, unknown, LifecycleListPage>(
662
+ { ...target },
663
+ async input =>
664
+ await this.#client.global("session.list", input, {
665
+ ...(request.timeoutMs === undefined ? {} : { timeoutMs: request.timeoutMs }),
666
+ }),
667
+ response => {
668
+ const error = brokerError(response);
669
+ if (error) throw new BrokerSessionListResponseError(error);
670
+ if (!isRecord(response) || response.ok !== true) return undefined;
671
+ const page = sessionListPageFromResponse(response);
672
+ if (!page) return undefined;
673
+ const result = listResult(page);
674
+ return result
675
+ ? { result, sessions: result.sessions, continuationCursor: page.continuationCursor }
676
+ : undefined;
677
+ },
678
+ );
679
+ } catch (thrown) {
680
+ if (thrown instanceof BrokerSessionListResponseError) {
681
+ const error = thrown.brokerError;
682
+ return failure("session.list", certaintyForBrokerCode(error.code), error.code, error.message);
683
+ }
684
+ if (thrown instanceof SessionListTraversalError)
685
+ return failure(
686
+ "session.list",
687
+ "uncertain",
688
+ thrown.kind === "malformed_page" ? "malformed_response" : "protocol_error",
689
+ thrown.kind === "malformed_page"
690
+ ? "lifecycle broker returned a malformed list result"
691
+ : thrown.kind === "repeated_cursor"
692
+ ? "session.list returned a repeated continuation cursor"
693
+ : "session.list exceeded the page budget",
694
+ );
695
+ const error = brokerError(thrown) ?? brokerErrorFromThrown(thrown);
696
+ return error
697
+ ? failure("session.list", certaintyForThrownError(error), error.code, error.message)
698
+ : failure("session.list", "retryable", "unavailable", "lifecycle broker request was unavailable");
699
+ }
700
+ const firstPage = pages[0];
701
+ if (!firstPage)
702
+ return failure(
703
+ "session.list",
704
+ "uncertain",
705
+ "malformed_response",
706
+ "lifecycle broker returned a malformed list result",
707
+ );
708
+ const { result } = firstPage.page;
709
+ return {
710
+ ok: true,
711
+ operation: "session.list",
712
+ result: {
713
+ indexSeq: result.indexSeq,
714
+ sessions: pages.flatMap(page => page.page.result.sessions),
715
+ warnings: result.warnings,
716
+ ...(result.savedSession === undefined ? {} : { savedSession: result.savedSession }),
717
+ },
718
+ };
719
+ }
720
+ }