@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
@@ -1,11 +1,17 @@
1
- import path from "node:path";
2
1
  import { getAgentDir } from "@gajae-code/utils";
3
2
  import { ensureBroker } from "../broker/ensure";
4
3
  import { lifecycleRequestTimeoutMs } from "../broker/startup-budget";
5
- import { SdkClient, SdkClientError, type SdkSentRecord } from "../client/client";
6
- import { readSdkBrokerDiscovery, SdkDiscoveryError } from "../client/discovery";
4
+ import { SdkClientError } from "../client/client";
5
+ import { createBrokerSessionLifecycleService } from "../lifecycle/broker-client";
6
+ import type {
7
+ SessionLifecycleMutationRequest,
8
+ SessionLifecycleOperation,
9
+ SessionLifecycleService,
10
+ } from "../lifecycle/service";
7
11
  import { validateAdapterControl, validateAdapterSecretFields } from "../protocol/adapter-validation";
8
12
  import { adapterDispositionError, findOperation } from "../protocol/operation-registry";
13
+ import { type SessionAttachment, SessionRouter, SessionRouterError } from "../router";
14
+ import { SessionListTraversalError, sessionListPageFromResponse, traverseSessionList } from "../session-list";
9
15
 
10
16
  const PROTOCOL_VERSION = "2024-11-05";
11
17
  const SERVER_NAME = "gjc-sdk-mcp";
@@ -21,11 +27,10 @@ type JsonRpcResponse = {
21
27
  };
22
28
 
23
29
  export interface SdkMcpServerOptions {
24
- repo?: string;
25
30
  agentDir?: string;
26
- connect?: (url: string, token: string) => Promise<SdkClient>;
31
+ router?: SessionRouter;
32
+ lifecycleService?: SessionLifecycleService;
27
33
  }
28
- const MAX_SESSION_LIST_PAGES = 10_000;
29
34
 
30
35
  export const SDK_MCP_TOOL_NAMES = [
31
36
  "gjc_session_control",
@@ -49,6 +54,10 @@ function schema(name: (typeof SDK_MCP_TOOL_NAMES)[number]): Record<string, unkno
49
54
  operation: { type: "string" },
50
55
  input: { type: "object" },
51
56
  confirm: { type: "boolean", description: "Required for destructive controls." },
57
+ idempotencyKey: {
58
+ type: "string",
59
+ description: "Bounded idempotency key; required for turn.abort mode:terminal.",
60
+ },
52
61
  },
53
62
  },
54
63
  };
@@ -103,8 +112,7 @@ function asString(args: Arguments, name: string): string | null {
103
112
  }
104
113
 
105
114
  function resultError(error: unknown): { ok: false; error: { code: string; message: string; path?: string } } {
106
- if (error instanceof SdkDiscoveryError)
107
- return { ok: false, error: { code: error.code, path: path.basename(error.path), message: error.message } };
115
+ if (error instanceof SessionRouterError) return { ok: false, error: { code: error.phase, message: error.message } };
108
116
  if (error instanceof SdkClientError) return { ok: false, error: { code: error.code, message: error.message } };
109
117
  return {
110
118
  ok: false,
@@ -139,7 +147,12 @@ function mcpOperationError(
139
147
  return adapterDispositionError("mcp", kind, operation, true);
140
148
  }
141
149
 
142
- function isLifecycleOperation(operation: string): boolean {
150
+ const MCP_LIFECYCLE_ACTOR = { id: "gjc-sdk-mcp", namespace: "sdk:mcp" } as const;
151
+ const ROUTER_START_TIMEOUT_MS = 3_000;
152
+ const ROUTER_STOP_TIMEOUT_MS = 5_000;
153
+ type LifecycleMutationOperation = Exclude<SessionLifecycleOperation, "session.list">;
154
+
155
+ function isLifecycleOperation(operation: string): operation is LifecycleMutationOperation {
143
156
  return (
144
157
  operation === "session.create" ||
145
158
  operation === "session.fork" ||
@@ -148,14 +161,64 @@ function isLifecycleOperation(operation: string): boolean {
148
161
  operation === "session.delete"
149
162
  );
150
163
  }
151
- function redactLifecycleCredentials(value: unknown): unknown {
152
- if (Array.isArray(value)) return value.map(redactLifecycleCredentials);
153
- if (!isObject(value)) return value;
154
- return Object.fromEntries(
155
- Object.entries(value)
156
- .filter(([key]) => key !== "endpoint" && key !== "token")
157
- .map(([key, nested]) => [key, redactLifecycleCredentials(nested)]),
158
- );
164
+
165
+ async function bounded<T>(promise: Promise<T>, timeoutMs: number, message: string): Promise<T> {
166
+ let timer: NodeJS.Timeout | undefined;
167
+ const timeout = Promise.withResolvers<never>();
168
+ try {
169
+ timer = setTimeout(() => timeout.reject(new SdkClientError("timeout", message)), timeoutMs);
170
+ return await Promise.race([promise, timeout.promise]);
171
+ } finally {
172
+ if (timer) clearTimeout(timer);
173
+ }
174
+ }
175
+
176
+ class McpSessionListBrokerResponseError extends Error {
177
+ readonly #response: Arguments;
178
+
179
+ constructor(response: Arguments) {
180
+ super("session.list failed");
181
+ this.name = "McpSessionListBrokerResponseError";
182
+ this.#response = response;
183
+ }
184
+
185
+ get response(): Arguments {
186
+ return this.#response;
187
+ }
188
+ }
189
+
190
+ async function paginatedSessionList(
191
+ router: SessionRouter,
192
+ input: Arguments = {},
193
+ requestKey = `${MCP_LIFECYCLE_ACTOR.namespace}:session.list`,
194
+ ): Promise<unknown> {
195
+ try {
196
+ const pages = await traverseSessionList(
197
+ input,
198
+ async pageInput => {
199
+ const rawResponse = await router.listBrokerSessions(pageInput, requestKey);
200
+ const response = isObject(rawResponse) ? rawResponse : undefined;
201
+ if (response?.ok === false) throw new McpSessionListBrokerResponseError(response);
202
+ return response;
203
+ },
204
+ response => sessionListPageFromResponse(response),
205
+ );
206
+ const aggregate: Arguments = {};
207
+ const sessions: unknown[] = [];
208
+ for (const { page } of pages) {
209
+ for (const [key, value] of Object.entries(page))
210
+ if (key !== "sessions" && key !== "continuationCursor") aggregate[key] = value;
211
+ sessions.push(...page.sessions);
212
+ }
213
+ const result = { ...aggregate, sessions };
214
+ const firstResponse = pages[0]?.response;
215
+ return firstResponse && Object.hasOwn(firstResponse, "result") ? { ...firstResponse, result } : result;
216
+ } catch (error) {
217
+ if (error instanceof McpSessionListBrokerResponseError) return error.response;
218
+ if (error instanceof SessionListTraversalError)
219
+ return { ok: false, error: { code: "protocol_error", message: error.message } };
220
+ throw error;
221
+ }
159
222
  }
160
223
 
161
224
  function textResult(
@@ -165,111 +228,70 @@ function textResult(
165
228
  return { content: [{ type: "text", text: JSON.stringify(payload) }], isError };
166
229
  }
167
230
 
168
- /** Creates the model-facing MCP adapter; session targeting is broker-bound (C10). */
231
+ /** Creates the model-facing MCP adapter with Router-owned live session authority. */
169
232
  export function createSdkMcpServer(options: SdkMcpServerOptions = {}) {
170
233
  const agentDir = options.agentDir ?? getAgentDir();
171
- const connect = options.connect ?? ((url, token) => SdkClient.connect(url, token));
172
-
173
- /**
174
- * Connects to the agent broker, starting one when absent (mirrors the
175
- * lifecycle bootstrap path). The broker is the sole session authority; the
176
- * MCP server never reads endpoint discovery files itself.
177
- */
178
- async function brokerClient(): Promise<SdkClient> {
179
- await ensureBroker({ agentDir });
180
- const broker = await readSdkBrokerDiscovery(agentDir);
181
- if (!broker) throw new SdkClientError("not_found", "SDK broker not found");
182
- return await connect(broker.url, broker.token);
183
- }
184
-
185
- /** Extracts a broker `result` envelope, converting an explicit error frame into a typed throw. */
186
- function brokerResult(value: unknown): Record<string, unknown> {
187
- if (isObject(value) && value.ok === false) {
188
- const error = isObject(value.error) ? value.error : {};
189
- const code = typeof error.code === "string" ? error.code : "unavailable";
190
- const message = typeof error.message === "string" ? error.message : "SDK broker request failed";
191
- throw new SdkClientError(code, message, value.error);
234
+ const router = options.router ?? new SessionRouter({ agentDir });
235
+ const lifecycleService = options.lifecycleService ?? createBrokerSessionLifecycleService(agentDir);
236
+ let startPromise: Promise<void> | undefined;
237
+ let closePromise: Promise<void> | undefined;
238
+ async function start(): Promise<void> {
239
+ if (closePromise) throw new SdkClientError("connection_closed", "SDK MCP server is closed.");
240
+ if (!startPromise) {
241
+ const authoritative = router.start();
242
+ let tracked!: Promise<void>;
243
+ tracked = authoritative.catch(error => {
244
+ if (startPromise === tracked) startPromise = undefined;
245
+ throw error;
246
+ });
247
+ startPromise = tracked;
192
248
  }
193
- return isObject(value) && isObject(value.result) ? value.result : {};
249
+ await bounded(startPromise, ROUTER_START_TIMEOUT_MS, "SDK session Router startup timed out.");
194
250
  }
195
251
 
196
- function arrayOf(value: unknown): unknown[] {
197
- return Array.isArray(value) ? value : [];
198
- }
199
- /**
200
- * Exhausts broker `session.list` cursor pagination (default page limit 100)
201
- * to one full snapshot. The broker remains the sole session authority; this
202
- * only aggregates its indexed truth across pages.
203
- */
204
- async function paginatedBrokerSessionList(
205
- client: SdkClient,
206
- ): Promise<{ sessions: Record<string, unknown>[]; warnings: unknown[] }> {
207
- const sessions: Record<string, unknown>[] = [];
208
- let warnings: unknown[] = [];
209
- let cursor: string | undefined;
210
- for (let pageCount = 0; pageCount < MAX_SESSION_LIST_PAGES; pageCount++) {
211
- const listed = brokerResult(await client.global("session.list", cursor === undefined ? {} : { cursor }));
212
- sessions.push(...arrayOf(listed.sessions).filter(isObject));
213
- if (Array.isArray(listed.warnings)) warnings = listed.warnings;
214
- const nextCursor =
215
- typeof listed.continuationCursor === "string" && listed.continuationCursor.length > 0
216
- ? listed.continuationCursor
217
- : undefined;
218
- if (!nextCursor) return { sessions, warnings };
219
- cursor = nextCursor;
220
- }
221
- throw new SdkClientError("protocol_error", "session.list exceeded the page budget.");
252
+ async function close(): Promise<void> {
253
+ closePromise ??= (async () => {
254
+ await bounded(router.stop(), ROUTER_STOP_TIMEOUT_MS, "SDK session Router shutdown timed out.");
255
+ })();
256
+ await closePromise;
222
257
  }
223
258
 
224
- /**
225
- * Resolves one session through broker `session.list` + `session.get_endpoint`
226
- * (C10): the broker's liveness and ambiguity truth decides reachability, and
227
- * only the broker mints the endpoint credential.
228
- */
229
- async function withSession(sessionId: string, action: (client: SdkClient) => Promise<unknown>): Promise<unknown> {
230
- let broker: SdkClient | undefined;
231
- let client: SdkClient | undefined;
259
+ async function withSession(sessionId: string, frame: Record<string, unknown>): Promise<unknown> {
232
260
  try {
233
- broker = await brokerClient();
234
- const { sessions } = await paginatedBrokerSessionList(broker);
235
- const row = sessions.find(item => item.sessionId === sessionId) as Record<string, unknown> | undefined;
236
- if (!row) return { ok: false, error: { code: "not_found", message: `SDK session not found: ${sessionId}` } };
237
- if (row.ambiguous === true)
238
- return {
239
- ok: false,
240
- error: { code: "ambiguous_session", message: "session id maps to more than one state root" },
241
- };
242
- if (row.live !== true)
243
- return { ok: false, error: { code: "endpoint_stale", message: "session endpoint is not live" } };
244
- const endpoint = brokerResult(await broker.global("session.get_endpoint", { sessionId }));
245
- const url = typeof endpoint.url === "string" && endpoint.url ? endpoint.url : undefined;
246
- const token = typeof endpoint.token === "string" ? endpoint.token : "";
247
- if (!url)
248
- return { ok: false, error: { code: "unavailable", message: "SDK broker returned an invalid endpoint" } };
249
- client = await connect(url, token);
250
- return await action(client);
261
+ await start();
262
+ const attachment: SessionAttachment | null = router.attachment(sessionId);
263
+ if (!attachment)
264
+ return { ok: false, error: { code: "not_found", message: `SDK session not found: ${sessionId}` } };
265
+ return await router.request(sessionId, frame, attachment.generation, attachment);
251
266
  } catch (error) {
252
267
  return resultError(error);
253
- } finally {
254
- await client?.close();
255
- await broker?.close();
256
268
  }
257
269
  }
258
270
 
271
+ async function runLifecycle(
272
+ operation: LifecycleMutationOperation,
273
+ input: Arguments,
274
+ requestKey: string,
275
+ ): Promise<unknown> {
276
+ const timeoutMs = lifecycleRequestTimeoutMs(operation, input);
277
+ return await lifecycleService.execute({
278
+ operation,
279
+ actor: MCP_LIFECYCLE_ACTOR,
280
+ capability: operation,
281
+ requestKey,
282
+ target: input,
283
+ ...(timeoutMs === undefined ? {} : { timeoutMs }),
284
+ } as unknown as SessionLifecycleMutationRequest);
285
+ }
286
+
259
287
  async function callTool(name: string, args: Arguments = {}): Promise<unknown> {
260
288
  if (name === "gjc_session_list") {
261
- let broker: SdkClient | undefined;
262
289
  try {
263
- broker = await brokerClient();
264
- const { sessions, warnings } = await paginatedBrokerSessionList(broker);
265
- const listed = sessions.flatMap(item =>
266
- typeof item.sessionId === "string" && item.sessionId ? [{ sessionId: item.sessionId }] : [],
267
- );
268
- return { ok: true, sessions: listed, warnings };
290
+ await ensureBroker({ agentDir });
291
+ await start();
292
+ return await paginatedSessionList(router);
269
293
  } catch (error) {
270
294
  return resultError(error);
271
- } finally {
272
- await broker?.close();
273
295
  }
274
296
  }
275
297
  if (name === "gjc_session_control") {
@@ -284,9 +306,23 @@ export function createSdkMcpServer(options: SdkMcpServerOptions = {}) {
284
306
  if (secretError) return invalidControl(secretError);
285
307
  const invalid = validateAdapterControl(operation, input);
286
308
  if (invalid) return invalidControl(invalid);
287
- return await withSession(sessionId, client =>
288
- client.control(operation, input, { confirm: args.confirm === true }),
289
- );
309
+ const idempotencyKey =
310
+ args.idempotencyKey === undefined ? undefined : (asString(args, "idempotencyKey") ?? undefined);
311
+ if (args.idempotencyKey !== undefined && !idempotencyKey)
312
+ return {
313
+ ok: false,
314
+ error: { code: "invalid_input", message: "idempotencyKey must be a non-empty string" },
315
+ };
316
+ // Forward the key on the control frame: terminal abort requires it,
317
+ // and without it every {mode:"terminal"} control is rejected (review
318
+ // thread P1).
319
+ return await withSession(sessionId, {
320
+ type: "control_request",
321
+ operation,
322
+ input,
323
+ confirm: args.confirm === true,
324
+ ...(idempotencyKey === undefined ? {} : { idempotencyKey }),
325
+ });
290
326
  }
291
327
  if (name === "gjc_session_query") {
292
328
  const sessionId = asString(args, "sessionId");
@@ -299,7 +335,12 @@ export function createSdkMcpServer(options: SdkMcpServerOptions = {}) {
299
335
  const input = isObject(args.input) ? args.input : {};
300
336
  const dispositionError = mcpOperationError("query", query);
301
337
  if (dispositionError) return invalidControl(dispositionError);
302
- return await withSession(sessionId, client => client.query(query, input, cursor ?? undefined));
338
+ return await withSession(sessionId, {
339
+ type: "query_request",
340
+ query,
341
+ input,
342
+ ...(cursor === undefined ? {} : { cursor }),
343
+ });
303
344
  }
304
345
  if (name === "gjc_session_global") {
305
346
  const operation = asString(args, "operation");
@@ -321,35 +362,20 @@ export function createSdkMcpServer(options: SdkMcpServerOptions = {}) {
321
362
  ok: false,
322
363
  error: { code: "invalid_input", message: "idempotencyKey is required for lifecycle operations" },
323
364
  };
324
- let client: SdkClient | undefined;
325
365
  try {
326
- await ensureBroker({ agentDir });
327
- const broker = await readSdkBrokerDiscovery(agentDir);
328
- if (!broker) return { ok: false, error: { code: "not_found", message: "SDK broker not found" } };
329
- client = await connect(broker.url, broker.token);
330
- let response: unknown;
331
- try {
332
- const timeoutMs = lifecycleRequestTimeoutMs(operation, input);
333
- response = await client.global(operation, input, {
334
- idempotencyKey,
335
- ...(timeoutMs === undefined ? {} : { timeoutMs }),
336
- });
337
- } catch (error) {
338
- if (
339
- isLifecycleOperation(operation) &&
340
- error instanceof SdkClientError &&
341
- error.code === "uncertain_after_send" &&
342
- error.details &&
343
- typeof error.details === "object"
344
- )
345
- response = await client.lookupLifecycle(error.details as SdkSentRecord);
346
- else throw error;
366
+ if (operation === "session.list") {
367
+ await ensureBroker({ agentDir });
368
+ await start();
369
+ return await paginatedSessionList(router, input);
347
370
  }
348
- return isLifecycleOperation(operation) ? redactLifecycleCredentials(response) : response;
371
+ if (!isLifecycleOperation(operation))
372
+ return {
373
+ ok: false,
374
+ error: { code: "unknown_operation", message: `Unknown global operation: ${operation}` },
375
+ };
376
+ return await runLifecycle(operation, input, idempotencyKey!);
349
377
  } catch (error) {
350
378
  return resultError(error);
351
- } finally {
352
- await client?.close();
353
379
  }
354
380
  }
355
381
  return { ok: false, error: { code: "unknown_tool", message: `Unknown SDK MCP tool: ${name}` } };
@@ -381,71 +407,83 @@ export function createSdkMcpServer(options: SdkMcpServerOptions = {}) {
381
407
  return { jsonrpc: "2.0", id, error: { code: -32601, message: `unknown_method:${request.method}` } };
382
408
  }
383
409
 
384
- return { callTool, handleJsonRpc, handle: handleJsonRpc, tools: SDK_MCP_TOOL_NAMES.map(schema) };
410
+ return {
411
+ callTool,
412
+ handleJsonRpc,
413
+ handle: handleJsonRpc,
414
+ start,
415
+ close,
416
+ tools: SDK_MCP_TOOL_NAMES.map(schema),
417
+ };
385
418
  }
386
419
 
387
420
  /**
388
421
  * Runs the SDK MCP server over stdio (newline-delimited JSON-RPC), the shipped
389
- * `gjc mcp-serve sdk` entrypoint. Pure SDK client: session control/query flows
390
- * through the broker and v3 WebSockets only.
422
+ * `gjc mcp-serve sdk` entrypoint. SessionRouter owns live endpoint authority and starts lazily
423
+ * on the first live-session tool, then stops after stdin and in-flight requests drain.
391
424
  */
392
425
  export async function runSdkMcpStdio(options: SdkMcpServerOptions = {}): Promise<void> {
393
426
  const server = createSdkMcpServer(options);
394
427
  let buffer = "";
395
428
  const inflight = new Set<Promise<void>>();
396
- process.stdin.setEncoding("utf8");
429
+ try {
430
+ process.stdin.setEncoding("utf8");
397
431
 
398
- const track = (work: Promise<void>): void => {
399
- inflight.add(work);
400
- void work.finally(() => inflight.delete(work));
401
- };
402
-
403
- await new Promise<void>((resolve, reject) => {
404
- const onData = (chunk: string) => {
405
- buffer += chunk;
406
- let index = buffer.indexOf("\n");
407
- while (index >= 0) {
408
- const line = buffer.slice(0, index).trim();
409
- buffer = buffer.slice(index + 1);
410
- index = buffer.indexOf("\n");
411
- if (!line) continue;
412
- track(
413
- (async () => {
414
- let request: JsonRpcRequest;
415
- try {
416
- request = JSON.parse(line) as JsonRpcRequest;
417
- } catch {
418
- process.stdout.write(
419
- `${JSON.stringify({ jsonrpc: "2.0", id: null, error: { code: -32700, message: "parse_error" } })}\n`,
420
- );
421
- return;
422
- }
423
- const response = await server.handleJsonRpc(request);
424
- // JSON-RPC notifications (no id) receive no response.
425
- if (request.id !== undefined) process.stdout.write(`${JSON.stringify(response)}\n`);
426
- })(),
427
- );
428
- }
432
+ const track = (work: Promise<void>): void => {
433
+ inflight.add(work);
434
+ void work.finally(() => inflight.delete(work));
429
435
  };
430
- const onEnd = () => {
431
- process.stdin.off("data", onData);
432
- process.stdin.off("end", onEnd);
433
- process.stdin.off("error", onError);
434
- resolve();
435
- };
436
- const onError = (error: Error) => {
437
- process.stdin.off("data", onData);
438
- process.stdin.off("end", onEnd);
439
- process.stdin.off("error", onError);
440
- reject(error);
441
- };
442
- process.stdin.on("data", onData);
443
- process.stdin.on("end", onEnd);
444
- process.stdin.on("error", onError);
445
- });
446
436
 
447
- // Stdin EOF must not drop in-flight tools/call handlers (WS connect/query).
448
- // Awaiting them also prevents the process from exiting before responses flush,
449
- // and lets clients close so the event loop can drain deterministically.
450
- await Promise.allSettled([...inflight]);
437
+ const stdinDone = Promise.withResolvers<void>();
438
+ {
439
+ const onData = (chunk: string) => {
440
+ buffer += chunk;
441
+ let index = buffer.indexOf("\n");
442
+ while (index >= 0) {
443
+ const line = buffer.slice(0, index).trim();
444
+ buffer = buffer.slice(index + 1);
445
+ index = buffer.indexOf("\n");
446
+ if (!line) continue;
447
+ track(
448
+ (async () => {
449
+ let request: JsonRpcRequest;
450
+ try {
451
+ request = JSON.parse(line) as JsonRpcRequest;
452
+ } catch {
453
+ process.stdout.write(
454
+ `${JSON.stringify({ jsonrpc: "2.0", id: null, error: { code: -32700, message: "parse_error" } })}\n`,
455
+ );
456
+ return;
457
+ }
458
+ const response = await server.handleJsonRpc(request);
459
+ // JSON-RPC notifications (no id) receive no response.
460
+ if (request.id !== undefined) process.stdout.write(`${JSON.stringify(response)}\n`);
461
+ })(),
462
+ );
463
+ }
464
+ };
465
+ const onEnd = () => {
466
+ process.stdin.off("data", onData);
467
+ process.stdin.off("end", onEnd);
468
+ process.stdin.off("error", onError);
469
+ stdinDone.resolve();
470
+ };
471
+ const onError = (error: Error) => {
472
+ process.stdin.off("data", onData);
473
+ process.stdin.off("end", onEnd);
474
+ process.stdin.off("error", onError);
475
+ stdinDone.reject(error);
476
+ };
477
+ process.stdin.on("data", onData);
478
+ process.stdin.on("end", onEnd);
479
+ process.stdin.on("error", onError);
480
+ }
481
+ await stdinDone.promise;
482
+
483
+ // Stdin EOF must not drop in-flight tools/call handlers (WS connect/query).
484
+ // Awaiting them also prevents the process from exiting before responses flush.
485
+ await Promise.allSettled([...inflight]);
486
+ } finally {
487
+ await server.close();
488
+ }
451
489
  }
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Bounded progress-aware lease for the SDK prompt terminal deadline (#4334).
3
+ *
4
+ * The accepted prompt deadline is no longer a fixed wall-clock window from
5
+ * acceptance: fresh *attributable* progress — tool/skill execution events
6
+ * correlated to the exact accepted `commandId`/`turnId` at the prompt/agent
7
+ * runtime boundary — renews the terminal deadline up to a deterministic hard
8
+ * maximum runtime. Unrelated session noise, heartbeats, other turns, streaming
9
+ * chatter, and retry bookkeeping never renew the lease, and there is no
10
+ * unbounded disable value: `maxMs` is always a finite bound.
11
+ */
12
+
13
+ /** Agent session event types that constitute attributable agent/skill/tool progress. */
14
+ const ATTRIBUTABLE_PROGRESS_EVENT_TYPES = new Set(["tool_execution_start", "tool_execution_end"]);
15
+
16
+ export interface PromptDeadlineLease {
17
+ /** When the prompt was accepted; anchors the hard maximum runtime. */
18
+ readonly acceptedAt: number;
19
+ /** Last verified attributable progress (starts at acceptance). */
20
+ lastProgressAt: number;
21
+ /** Inactivity window: the deadline is this far past the last verified progress. */
22
+ readonly leaseMs: number;
23
+ /** Deterministic hard maximum runtime from acceptance; never unbounded. */
24
+ readonly maxMs: number;
25
+ }
26
+
27
+ export function createPromptDeadlineLease(input: { now: number; leaseMs: number; maxMs: number }): PromptDeadlineLease {
28
+ return { acceptedAt: input.now, lastProgressAt: input.now, leaseMs: input.leaseMs, maxMs: input.maxMs };
29
+ }
30
+
31
+ /**
32
+ * Current terminal deadline: the inactivity lease from last verified progress,
33
+ * bounded by the hard maximum runtime from acceptance.
34
+ */
35
+ export function promptDeadlineAt(lease: PromptDeadlineLease): number {
36
+ return Math.min(lease.lastProgressAt + lease.leaseMs, lease.acceptedAt + lease.maxMs);
37
+ }
38
+
39
+ /**
40
+ * Record fresh attributable progress. Monotonic: a stale or equal timestamp
41
+ * never moves the lease backwards, so out-of-order delivery cannot shorten it.
42
+ */
43
+ export function recordAttributableProgress(lease: PromptDeadlineLease, now: number): void {
44
+ if (now > lease.lastProgressAt) lease.lastProgressAt = now;
45
+ }
46
+
47
+ /**
48
+ * Whether an agent session event at the prompt/agent runtime boundary is
49
+ * attributable progress for the accepted prompt. Only tool execution
50
+ * boundaries qualify: skills do their work through tools, so skill progress is
51
+ * covered; streaming text/thinking deltas, retries, and bookkeeping are not.
52
+ */
53
+ export function isAttributableProgressEventType(type: string): boolean {
54
+ return ATTRIBUTABLE_PROGRESS_EVENT_TYPES.has(type);
55
+ }