@gajae-code/coding-agent 0.13.2 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (610) hide show
  1. package/CHANGELOG.md +215 -8
  2. package/README.md +2 -0
  3. package/bin/gajaessi.js +4 -0
  4. package/dist/types/async/job-manager.d.ts +55 -2
  5. package/dist/types/async/support.d.ts +14 -0
  6. package/dist/types/capability/mcp.d.ts +6 -0
  7. package/dist/types/capability/types.d.ts +6 -0
  8. package/dist/types/cli/accounts-cli.d.ts +19 -0
  9. package/dist/types/cli/args.d.ts +3 -0
  10. package/dist/types/cli/config-cli.d.ts +6 -0
  11. package/dist/types/cli/crash-cli.d.ts +10 -0
  12. package/dist/types/cli/customize-doctor.d.ts +145 -0
  13. package/dist/types/cli/daemon-cli.d.ts +3 -1
  14. package/dist/types/cli/mcp-cli.d.ts +11 -0
  15. package/dist/types/cli/notify-cli.d.ts +1 -1
  16. package/dist/types/cli/root-flags.d.ts +12 -0
  17. package/dist/types/cli/setup-cli.d.ts +3 -1
  18. package/dist/types/cli/skills-cli.d.ts +2 -1
  19. package/dist/types/cli/update-cli.d.ts +19 -1
  20. package/dist/types/cli.d.ts +6 -0
  21. package/dist/types/commands/accounts.d.ts +40 -0
  22. package/dist/types/commands/crash.d.ts +24 -0
  23. package/dist/types/commands/customize.d.ts +22 -0
  24. package/dist/types/commands/daemon.d.ts +1 -1
  25. package/dist/types/commands/launch.d.ts +6 -0
  26. package/dist/types/commands/setup.d.ts +6 -0
  27. package/dist/types/commands/skills.d.ts +6 -1
  28. package/dist/types/commands/update.d.ts +7 -0
  29. package/dist/types/config/atomic-yaml-patch-worker.d.ts +25 -0
  30. package/dist/types/config/atomic-yaml-patch.d.ts +62 -2
  31. package/dist/types/config/config-schema-version.d.ts +10 -0
  32. package/dist/types/config/file-lock.d.ts +18 -0
  33. package/dist/types/config/model-profile-activation.d.ts +3 -1
  34. package/dist/types/config/model-registry.d.ts +10 -1
  35. package/dist/types/config/models-config-schema.d.ts +2 -0
  36. package/dist/types/config/settings-schema.d.ts +73 -9
  37. package/dist/types/config/settings.d.ts +63 -0
  38. package/dist/types/config/skill-settings-defaults.d.ts +26 -0
  39. package/dist/types/config/task-delegation.d.ts +39 -0
  40. package/dist/types/config/update-channel.d.ts +10 -0
  41. package/dist/types/coordinator-mcp/server.d.ts +5 -1
  42. package/dist/types/crash/index-store.d.ts +87 -0
  43. package/dist/types/crash/nudge.d.ts +50 -0
  44. package/dist/types/crash/record-loader.d.ts +17 -0
  45. package/dist/types/crash/report.d.ts +134 -0
  46. package/dist/types/crash/sanitize.d.ts +25 -0
  47. package/dist/types/cursor.d.ts +13 -2
  48. package/dist/types/customization/import.d.ts +37 -0
  49. package/dist/types/customization/index.d.ts +4 -0
  50. package/dist/types/customization/inventory.d.ts +25 -0
  51. package/dist/types/customization/mutations.d.ts +32 -0
  52. package/dist/types/customization/types.d.ts +115 -0
  53. package/dist/types/daemon/control-types.d.ts +8 -1
  54. package/dist/types/daemon/operator-contract.d.ts +4 -4
  55. package/dist/types/discovery/claude.d.ts +39 -1
  56. package/dist/types/discovery/codex.d.ts +39 -1
  57. package/dist/types/discovery/index.d.ts +2 -0
  58. package/dist/types/discovery/mcp-compat.d.ts +30 -0
  59. package/dist/types/edit/renderer.d.ts +23 -0
  60. package/dist/types/extensibility/extensions/runner.d.ts +3 -0
  61. package/dist/types/extensibility/extensions/types.d.ts +21 -4
  62. package/dist/types/extensibility/gjc-plugins/observability.d.ts +6 -1
  63. package/dist/types/extensibility/gjc-plugins/registry.d.ts +8 -1
  64. package/dist/types/extensibility/hooks/loader.d.ts +19 -5
  65. package/dist/types/extensibility/runtime-skill-discovery.d.ts +22 -1
  66. package/dist/types/extensibility/skill-management.d.ts +107 -0
  67. package/dist/types/gjc-runtime/deep-interview-runtime.d.ts +3 -1
  68. package/dist/types/gjc-runtime/launch-worktree.d.ts +8 -0
  69. package/dist/types/gjc-runtime/linux-proc.d.ts +3 -0
  70. package/dist/types/gjc-runtime/ralplan-runtime.d.ts +10 -6
  71. package/dist/types/gjc-runtime/session-state-lock.d.ts +104 -0
  72. package/dist/types/gjc-runtime/session-state-sidecar.d.ts +120 -2
  73. package/dist/types/gjc-runtime/state-writer.d.ts +10 -1
  74. package/dist/types/gjc-runtime/ultragoal-guard.d.ts +4 -2
  75. package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +8 -6
  76. package/dist/types/gjc-runtime/workflow-settings.d.ts +109 -0
  77. package/dist/types/hooks/events.d.ts +60 -0
  78. package/dist/types/hooks/normalize.d.ts +83 -0
  79. package/dist/types/hooks/skill-state.d.ts +9 -2
  80. package/dist/types/main.d.ts +2 -1
  81. package/dist/types/modes/acp/abort-scope.d.ts +13 -0
  82. package/dist/types/modes/acp/acp-agent.d.ts +7 -4
  83. package/dist/types/modes/components/customization/customization-dashboard.d.ts +44 -0
  84. package/dist/types/modes/components/customization/import-wizard.d.ts +21 -0
  85. package/dist/types/modes/components/customization/index.d.ts +1 -0
  86. package/dist/types/modes/components/dynamic-theme-text.d.ts +9 -0
  87. package/dist/types/modes/components/gajae-pet-widget.d.ts +6 -28
  88. package/dist/types/modes/components/irc-sidebar.d.ts +1 -0
  89. package/dist/types/modes/components/iterm-pet-transport.d.ts +122 -0
  90. package/dist/types/modes/components/oauth-selector.d.ts +10 -4
  91. package/dist/types/modes/components/pet-capability.d.ts +7 -21
  92. package/dist/types/modes/components/settings-selector.d.ts +5 -0
  93. package/dist/types/modes/components/status-line/gh.d.ts +6 -2
  94. package/dist/types/modes/controllers/extension-ui-controller.d.ts +1 -1
  95. package/dist/types/modes/controllers/selector-controller.d.ts +7 -8
  96. package/dist/types/modes/controllers/stt-controller.d.ts +1 -1
  97. package/dist/types/modes/interactive-mode.d.ts +1 -0
  98. package/dist/types/modes/theme/defaults/index.d.ts +118 -0
  99. package/dist/types/modes/types.d.ts +1 -0
  100. package/dist/types/modes/utils/injected-user-submission.d.ts +10 -0
  101. package/dist/types/runtime-mcp/config.d.ts +9 -0
  102. package/dist/types/runtime-mcp/manager.d.ts +26 -1
  103. package/dist/types/runtime-mcp/oauth-discovery.d.ts +4 -0
  104. package/dist/types/runtime-mcp/oauth-flow.d.ts +24 -1
  105. package/dist/types/runtime-mcp/pool-key.d.ts +2 -0
  106. package/dist/types/runtime-mcp/protocol.d.ts +278 -0
  107. package/dist/types/runtime-mcp/scope-config.d.ts +29 -0
  108. package/dist/types/runtime-mcp/tool-bridge.d.ts +15 -13
  109. package/dist/types/runtime-mcp/transports/http.d.ts +9 -0
  110. package/dist/types/runtime-mcp/types.d.ts +102 -10
  111. package/dist/types/sdk/acp/adapter.d.ts +26 -5
  112. package/dist/types/sdk/broker/broker.d.ts +3 -55
  113. package/dist/types/sdk/broker/lifecycle.d.ts +18 -12
  114. package/dist/types/sdk/broker/session-index.d.ts +14 -5
  115. package/dist/types/sdk/broker/startup-failure.d.ts +16 -1
  116. package/dist/types/sdk/bus/chat-daemon-control.d.ts +51 -1
  117. package/dist/types/sdk/bus/chat-daemon-runtime.d.ts +4 -41
  118. package/dist/types/sdk/bus/config.d.ts +11 -0
  119. package/dist/types/sdk/bus/conversation-store.d.ts +0 -1
  120. package/dist/types/sdk/bus/daemon-paths.d.ts +6 -0
  121. package/dist/types/sdk/bus/discord-conversation.d.ts +2 -0
  122. package/dist/types/sdk/bus/discord-daemon.d.ts +17 -12
  123. package/dist/types/sdk/bus/existing-thread-readiness.d.ts +4 -34
  124. package/dist/types/sdk/bus/inbound-reaction-ordering.d.ts +61 -0
  125. package/dist/types/sdk/bus/index.d.ts +85 -99
  126. package/dist/types/sdk/bus/kind-aware-reconciliation.d.ts +29 -7
  127. package/dist/types/sdk/bus/managed-daemon.d.ts +2 -32
  128. package/dist/types/sdk/bus/notification-service.d.ts +52 -0
  129. package/dist/types/sdk/bus/operator-runtime.d.ts +1 -1
  130. package/dist/types/sdk/bus/prompt-reconciliation.d.ts +16 -5
  131. package/dist/types/sdk/bus/reconciliation-store.d.ts +113 -5
  132. package/dist/types/sdk/bus/session-control.d.ts +25 -1
  133. package/dist/types/sdk/bus/slack-conversation.d.ts +4 -0
  134. package/dist/types/sdk/bus/slack-daemon.d.ts +9 -17
  135. package/dist/types/sdk/bus/slack-live-provider.d.ts +3 -1
  136. package/dist/types/sdk/bus/slack-provider.d.ts +4 -0
  137. package/dist/types/sdk/bus/slack-thread-binding.d.ts +6 -40
  138. package/dist/types/sdk/bus/telegram-adoption-intent.d.ts +30 -104
  139. package/dist/types/sdk/bus/telegram-daemon-cli.d.ts +10 -0
  140. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +262 -19
  141. package/dist/types/sdk/bus/telegram-daemon-orphan-reap.d.ts +125 -0
  142. package/dist/types/sdk/bus/telegram-daemon-owner-registry.d.ts +22 -0
  143. package/dist/types/sdk/bus/telegram-daemon.d.ts +119 -310
  144. package/dist/types/sdk/bus/telegram-reference.d.ts +1 -47
  145. package/dist/types/sdk/bus/threaded-render.d.ts +1 -0
  146. package/dist/types/sdk/bus/topic-registry.d.ts +33 -17
  147. package/dist/types/sdk/cli/rows.d.ts +2 -11
  148. package/dist/types/sdk/cli/session-cli.d.ts +15 -25
  149. package/dist/types/sdk/client/client.d.ts +97 -1
  150. package/dist/types/sdk/host/control/dispatch.d.ts +0 -7
  151. package/dist/types/sdk/host/control/index.d.ts +1 -1
  152. package/dist/types/sdk/host/control/operations.d.ts +18 -5
  153. package/dist/types/sdk/host/control/runtime-gate.d.ts +19 -0
  154. package/dist/types/sdk/host/host.d.ts +15 -1
  155. package/dist/types/sdk/host/query/handlers.d.ts +5 -0
  156. package/dist/types/sdk/host/reverse-leases.d.ts +1 -1
  157. package/dist/types/sdk/host/session-runtime.d.ts +127 -7
  158. package/dist/types/sdk/host/types.d.ts +1 -1
  159. package/dist/types/sdk/host/websocket-transport.d.ts +1 -1
  160. package/dist/types/sdk/index.d.ts +2 -1
  161. package/dist/types/sdk/lifecycle/broker-client.d.ts +8 -0
  162. package/dist/types/sdk/lifecycle/client.d.ts +59 -0
  163. package/dist/types/sdk/lifecycle/index.d.ts +3 -0
  164. package/dist/types/sdk/lifecycle/service.d.ts +232 -0
  165. package/dist/types/sdk/mcp/server.d.ts +9 -6
  166. package/dist/types/sdk/prompt-deadline-lease.d.ts +43 -0
  167. package/dist/types/sdk/prompt-deadline-manager.d.ts +28 -0
  168. package/dist/types/sdk/prompt-status.d.ts +10 -3
  169. package/dist/types/sdk/protocol/operation-registry.d.ts +5 -0
  170. package/dist/types/sdk/receipt-state.d.ts +17 -0
  171. package/dist/types/sdk/reconciliation-extensions.d.ts +2 -0
  172. package/dist/types/sdk/router/index.d.ts +1 -0
  173. package/dist/types/sdk/router/session-router.d.ts +152 -0
  174. package/dist/types/sdk/session-list.d.ts +22 -0
  175. package/dist/types/sdk/session-reconnect.d.ts +43 -1
  176. package/dist/types/sdk/session.d.ts +34 -1
  177. package/dist/types/sdk/transport/serve-cli.d.ts +1 -4
  178. package/dist/types/session/account-inventory.d.ts +86 -0
  179. package/dist/types/session/agent-session.d.ts +145 -6
  180. package/dist/types/session/agent-storage.d.ts +10 -0
  181. package/dist/types/session/coordinator-tool-label.d.ts +28 -0
  182. package/dist/types/session/internal/managed-session-storage.d.ts +23 -4
  183. package/dist/types/session/messages.d.ts +1 -1
  184. package/dist/types/session/secure-token-file.d.ts +3 -0
  185. package/dist/types/session/session-manager.d.ts +47 -1
  186. package/dist/types/session/startup-auth-config.d.ts +44 -0
  187. package/dist/types/session/terminal-abort.d.ts +378 -0
  188. package/dist/types/session/yield-queue.d.ts +7 -0
  189. package/dist/types/session-import/claude.d.ts +26 -0
  190. package/dist/types/session-import/codex.d.ts +88 -0
  191. package/dist/types/session-import/command.d.ts +35 -0
  192. package/dist/types/session-import/detect.d.ts +22 -0
  193. package/dist/types/session-import/index.d.ts +7 -0
  194. package/dist/types/session-import/provider-codex.d.ts +22 -0
  195. package/dist/types/session-import/provider-service.d.ts +38 -0
  196. package/dist/types/session-import/redact.d.ts +23 -0
  197. package/dist/types/session-import/service.d.ts +47 -0
  198. package/dist/types/session-import/types.d.ts +120 -0
  199. package/dist/types/setup/paseo/check.d.ts +16 -0
  200. package/dist/types/setup/paseo/install-saga.d.ts +115 -0
  201. package/dist/types/setup/paseo/json-publisher.d.ts +76 -0
  202. package/dist/types/setup/paseo/orchestration-preferences.d.ts +24 -0
  203. package/dist/types/setup/paseo/paseo-ownership.d.ts +87 -0
  204. package/dist/types/setup/paseo/paseo-setup.d.ts +29 -0
  205. package/dist/types/setup/paseo/provider-config.d.ts +35 -0
  206. package/dist/types/setup/paseo/remove.d.ts +14 -0
  207. package/dist/types/setup/paseo/result-types.d.ts +59 -0
  208. package/dist/types/setup/paseo/setup-deps.d.ts +73 -0
  209. package/dist/types/setup/paseo/skills-bridge.d.ts +44 -0
  210. package/dist/types/skill-state/active-state.d.ts +5 -1
  211. package/dist/types/slash-commands/acp-builtins.d.ts +5 -1
  212. package/dist/types/slash-commands/builtin-registry.d.ts +2 -0
  213. package/dist/types/slash-commands/helpers/credential-switch.d.ts +12 -0
  214. package/dist/types/slash-commands/helpers/usage-report.d.ts +5 -6
  215. package/dist/types/slash-commands/types.d.ts +7 -1
  216. package/dist/types/task/executor.d.ts +10 -0
  217. package/dist/types/task/index.d.ts +3 -1
  218. package/dist/types/tools/ask-answer-registry.d.ts +6 -3
  219. package/dist/types/tools/bash-sleep-advisory.d.ts +14 -0
  220. package/dist/types/tools/bash.d.ts +2 -6
  221. package/dist/types/tools/browser/attach.d.ts +11 -0
  222. package/dist/types/tools/browser/launch.d.ts +20 -0
  223. package/dist/types/tools/browser/profile-discovery.d.ts +6 -0
  224. package/dist/types/tools/browser/render.d.ts +1 -0
  225. package/dist/types/tools/browser.d.ts +3 -1
  226. package/dist/types/tools/image-gen.d.ts +10 -2
  227. package/dist/types/tools/index.d.ts +8 -0
  228. package/dist/types/tools/monitor.d.ts +1 -1
  229. package/dist/types/tools/skill-discovery.d.ts +8 -1
  230. package/dist/types/tools/subagent.d.ts +2 -0
  231. package/dist/types/tools/ultragoal-ask-guard.d.ts +2 -2
  232. package/dist/types/utils/herdr-pane.d.ts +76 -0
  233. package/package.json +19 -9
  234. package/scripts/build-binary.ts +2 -1
  235. package/scripts/build-sdk-package-smoke.ts +2 -13
  236. package/scripts/capture-sticky-viewport-showcase.ts +0 -1
  237. package/scripts/compile-args.ts +2 -0
  238. package/scripts/generate-sdk-adapter-parity-manifest.ts +31 -16
  239. package/scripts/generate-sdk-operation-inventory.ts +28 -0
  240. package/scripts/generate-telegram-baseline-manifest.ts +1 -0
  241. package/scripts/generate-tool-catalog.ts +6 -4
  242. package/scripts/verify-gjc-sdk-canonicalization.ts +5 -39
  243. package/src/async/job-manager.ts +352 -17
  244. package/src/async/support.ts +25 -0
  245. package/src/autoresearch/dashboard.ts +28 -13
  246. package/src/capability/index.ts +3 -1
  247. package/src/capability/mcp.ts +6 -0
  248. package/src/capability/types.ts +6 -0
  249. package/src/cli/accounts-cli.ts +395 -0
  250. package/src/cli/args.ts +23 -0
  251. package/src/cli/auth-broker-cli.ts +136 -66
  252. package/src/cli/auth-gateway-cli.ts +94 -70
  253. package/src/cli/config-cli.ts +27 -2
  254. package/src/cli/crash-cli.ts +78 -0
  255. package/src/cli/customize-doctor.ts +1605 -0
  256. package/src/cli/daemon-cli.ts +12 -3
  257. package/src/cli/fast-help.ts +1 -0
  258. package/src/cli/mcp-cli.ts +128 -60
  259. package/src/cli/notify-cli.ts +8 -14
  260. package/src/cli/root-flags.ts +8 -0
  261. package/src/cli/setup-cli.ts +145 -0
  262. package/src/cli/skills-cli.ts +38 -2
  263. package/src/cli/update-cli.ts +167 -12
  264. package/src/cli.ts +4 -0
  265. package/src/commands/accounts.ts +71 -0
  266. package/src/commands/crash.ts +35 -0
  267. package/src/commands/customize.ts +84 -0
  268. package/src/commands/daemon.ts +2 -2
  269. package/src/commands/deep-interview.ts +2 -0
  270. package/src/commands/launch.ts +1 -0
  271. package/src/commands/mcp.ts +12 -7
  272. package/src/commands/ralplan.ts +2 -0
  273. package/src/commands/sdk.ts +65 -32
  274. package/src/commands/setup.ts +5 -0
  275. package/src/commands/skills.ts +14 -4
  276. package/src/commands/ultragoal.ts +10 -1
  277. package/src/commands/update.ts +26 -15
  278. package/src/config/atomic-yaml-patch-worker.ts +57 -0
  279. package/src/config/atomic-yaml-patch.ts +769 -29
  280. package/src/config/config-schema-version.ts +10 -0
  281. package/src/config/file-lock.ts +70 -1
  282. package/src/config/mcp-schema.json +52 -14
  283. package/src/config/model-profile-activation.ts +23 -2
  284. package/src/config/model-profiles.ts +88 -21
  285. package/src/config/model-registry.ts +147 -21
  286. package/src/config/models-config-schema.ts +1 -1
  287. package/src/config/settings-schema.ts +77 -7
  288. package/src/config/settings.ts +4038 -199
  289. package/src/config/skill-settings-defaults.ts +41 -3
  290. package/src/config/task-delegation.ts +87 -0
  291. package/src/config/update-channel.ts +23 -0
  292. package/src/coordinator-mcp/server.ts +377 -308
  293. package/src/crash/index-store.ts +723 -0
  294. package/src/crash/nudge.ts +89 -0
  295. package/src/crash/record-loader.ts +149 -0
  296. package/src/crash/report.ts +551 -0
  297. package/src/crash/sanitize.ts +129 -0
  298. package/src/cursor.ts +36 -10
  299. package/src/customization/import.ts +946 -0
  300. package/src/customization/index.ts +4 -0
  301. package/src/customization/inventory.ts +335 -0
  302. package/src/customization/mutations.ts +141 -0
  303. package/src/customization/types.ts +223 -0
  304. package/src/daemon/control-types.ts +8 -1
  305. package/src/daemon/operator-contract.ts +6 -6
  306. package/src/defaults/gjc/extensions/grok-cli-vendor/src/models/catalog.ts +31 -6
  307. package/src/defaults/gjc/skills/deep-interview/SKILL.md +11 -22
  308. package/src/defaults/gjc/skills/ralplan/SKILL.md +36 -23
  309. package/src/defaults/gjc/skills/ultragoal/SKILL.md +16 -0
  310. package/src/discovery/claude-hooks.ts +38 -0
  311. package/src/discovery/claude.ts +142 -209
  312. package/src/discovery/codex-hooks.ts +38 -0
  313. package/src/discovery/codex.ts +132 -198
  314. package/src/discovery/helpers.ts +8 -1
  315. package/src/discovery/index.ts +2 -0
  316. package/src/discovery/mcp-compat.ts +234 -0
  317. package/src/discovery/mcp-json.ts +6 -0
  318. package/src/edit/renderer.ts +40 -0
  319. package/src/edit/streaming.ts +4 -2
  320. package/src/exec/bash-executor.ts +24 -20
  321. package/src/export/html/index.ts +51 -2
  322. package/src/extensibility/extensions/loader.ts +9 -1
  323. package/src/extensibility/extensions/runner.ts +17 -4
  324. package/src/extensibility/extensions/types.ts +31 -6
  325. package/src/extensibility/gjc-plugins/constrained-hooks.ts +33 -0
  326. package/src/extensibility/gjc-plugins/installer.ts +9 -5
  327. package/src/extensibility/gjc-plugins/observability.ts +8 -2
  328. package/src/extensibility/gjc-plugins/registry.ts +13 -2
  329. package/src/extensibility/gjc-plugins/runtime-adapters.ts +3 -1
  330. package/src/extensibility/gjc-plugins/schema.ts +222 -39
  331. package/src/extensibility/hooks/loader.ts +154 -10
  332. package/src/extensibility/runtime-skill-discovery.ts +257 -60
  333. package/src/extensibility/skill-management.ts +368 -0
  334. package/src/extensibility/skills.ts +52 -16
  335. package/src/gjc-runtime/deep-interview-runtime.ts +45 -61
  336. package/src/gjc-runtime/launch-worktree.ts +56 -2
  337. package/src/gjc-runtime/linux-proc.ts +7 -1
  338. package/src/gjc-runtime/ralplan-runtime.ts +100 -164
  339. package/src/gjc-runtime/session-state-lock.ts +992 -0
  340. package/src/gjc-runtime/session-state-sidecar.ts +644 -142
  341. package/src/gjc-runtime/state-writer.ts +39 -14
  342. package/src/gjc-runtime/tmux-owner-isolation.ts +5 -4
  343. package/src/gjc-runtime/ultragoal-guard.ts +11 -4
  344. package/src/gjc-runtime/ultragoal-runtime.ts +44 -41
  345. package/src/gjc-runtime/workflow-settings.ts +596 -0
  346. package/src/goals/tools/goal-tool.ts +6 -1
  347. package/src/hooks/events.ts +291 -0
  348. package/src/hooks/native-skill-hook.ts +4 -0
  349. package/src/hooks/normalize.ts +369 -0
  350. package/src/hooks/skill-state.ts +165 -46
  351. package/src/internal-urls/docs-index.generated.ts +41 -32
  352. package/src/main.ts +36 -5
  353. package/src/migrate/mcp-mapper.ts +25 -2
  354. package/src/modes/acp/abort-scope.ts +29 -0
  355. package/src/modes/acp/acp-agent.ts +423 -98
  356. package/src/modes/components/assistant-message.ts +6 -1
  357. package/src/modes/components/chrome.ts +4 -3
  358. package/src/modes/components/customization/customization-dashboard.ts +443 -0
  359. package/src/modes/components/customization/import-wizard.ts +372 -0
  360. package/src/modes/components/customization/index.ts +1 -0
  361. package/src/modes/components/dynamic-theme-text.ts +22 -0
  362. package/src/modes/components/gajae-pet-widget.ts +607 -193
  363. package/src/modes/components/irc-sidebar.ts +11 -0
  364. package/src/modes/components/iterm-pet-transport.ts +585 -0
  365. package/src/modes/components/model-selector.ts +1 -6
  366. package/src/modes/components/oauth-selector.ts +277 -86
  367. package/src/modes/components/pet-capability.ts +35 -31
  368. package/src/modes/components/settings-selector.ts +29 -5
  369. package/src/modes/components/status-line/gh.ts +45 -1
  370. package/src/modes/components/status-line/segments.ts +19 -4
  371. package/src/modes/components/tool-status-header.ts +13 -3
  372. package/src/modes/controllers/command-controller.ts +20 -8
  373. package/src/modes/controllers/extension-ui-controller.ts +56 -257
  374. package/src/modes/controllers/input-controller.ts +10 -0
  375. package/src/modes/controllers/runtime-mcp-command-controller.ts +16 -3
  376. package/src/modes/controllers/selector-controller.ts +238 -77
  377. package/src/modes/controllers/stt-controller.ts +3 -3
  378. package/src/modes/interactive-mode.ts +88 -16
  379. package/src/modes/print-mode.ts +35 -6
  380. package/src/modes/runtime-init.ts +21 -68
  381. package/src/modes/theme/defaults/index.ts +2 -0
  382. package/src/modes/theme/defaults/ouroboros.json +118 -0
  383. package/src/modes/types.ts +1 -0
  384. package/src/modes/utils/injected-user-submission.ts +25 -0
  385. package/src/modes/utils/terminal-bell.ts +15 -1
  386. package/src/prompts/agent-fragments/ralplan-persistence.md +1 -1
  387. package/src/prompts/agent-fragments/restricted-bash.md +1 -1
  388. package/src/prompts/agents/critic.md +1 -1
  389. package/src/prompts/system/rlm-research.md +1 -1
  390. package/src/prompts/system/system-prompt.md +0 -2
  391. package/src/prompts/tools/bash.md +7 -1
  392. package/src/prompts/tools/browser.md +1 -1
  393. package/src/prompts/tools/cron.md +6 -6
  394. package/src/prompts/tools/read.md +0 -2
  395. package/src/prompts/tools/skill-discovery.md +4 -2
  396. package/src/runtime-mcp/client.ts +427 -23
  397. package/src/runtime-mcp/config.ts +37 -5
  398. package/src/runtime-mcp/manager-pool.test.ts +56 -0
  399. package/src/runtime-mcp/manager.ts +52 -2
  400. package/src/runtime-mcp/oauth-discovery.ts +13 -0
  401. package/src/runtime-mcp/oauth-flow.ts +46 -1
  402. package/src/runtime-mcp/pool-key.ts +5 -1
  403. package/src/runtime-mcp/pool.test.ts +9 -0
  404. package/src/runtime-mcp/protocol.test.ts +353 -0
  405. package/src/runtime-mcp/protocol.ts +624 -0
  406. package/src/runtime-mcp/scope-config.ts +78 -0
  407. package/src/runtime-mcp/tool-bridge.ts +44 -10
  408. package/src/runtime-mcp/transports/http.ts +84 -13
  409. package/src/runtime-mcp/types.ts +123 -12
  410. package/src/sdk/acp/adapter.ts +328 -97
  411. package/src/sdk/broker/broker.ts +160 -741
  412. package/src/sdk/broker/ensure.ts +9 -1
  413. package/src/sdk/broker/lifecycle.ts +510 -116
  414. package/src/sdk/broker/operation-receipt-ledger.ts +11 -2
  415. package/src/sdk/broker/process-incarnation.ts +19 -0
  416. package/src/sdk/broker/session-index.ts +516 -117
  417. package/src/sdk/broker/startup-failure.ts +28 -5
  418. package/src/sdk/broker/transport.ts +1 -13
  419. package/src/sdk/bus/chat-daemon-cli.ts +4 -2
  420. package/src/sdk/bus/chat-daemon-control.ts +67 -6
  421. package/src/sdk/bus/chat-daemon-runtime.ts +183 -859
  422. package/src/sdk/bus/config.ts +13 -0
  423. package/src/sdk/bus/conversation-store.ts +59 -171
  424. package/src/sdk/bus/daemon-paths.ts +20 -0
  425. package/src/sdk/bus/discord-conversation.ts +2 -0
  426. package/src/sdk/bus/discord-daemon.ts +524 -126
  427. package/src/sdk/bus/discord-live-provider.ts +206 -79
  428. package/src/sdk/bus/existing-thread-readiness.ts +4 -97
  429. package/src/sdk/bus/inbound-reaction-ordering.ts +122 -0
  430. package/src/sdk/bus/index.ts +2480 -456
  431. package/src/sdk/bus/kind-aware-reconciliation.ts +204 -34
  432. package/src/sdk/bus/lifecycle-commands.ts +2 -2
  433. package/src/sdk/bus/managed-daemon.ts +2 -145
  434. package/src/sdk/bus/notification-service.ts +196 -0
  435. package/src/sdk/bus/operator-runtime.ts +1 -1
  436. package/src/sdk/bus/prompt-reconciliation.ts +24 -15
  437. package/src/sdk/bus/reconciliation-store.ts +553 -24
  438. package/src/sdk/bus/session-control.ts +49 -3
  439. package/src/sdk/bus/slack-conversation.ts +4 -0
  440. package/src/sdk/bus/slack-daemon.ts +733 -134
  441. package/src/sdk/bus/slack-live-provider.ts +65 -15
  442. package/src/sdk/bus/slack-provider.ts +4 -0
  443. package/src/sdk/bus/slack-thread-binding.ts +9 -104
  444. package/src/sdk/bus/telegram-adoption-intent.ts +299 -209
  445. package/src/sdk/bus/telegram-daemon-cli.ts +194 -7
  446. package/src/sdk/bus/telegram-daemon-contract.ts +265 -19
  447. package/src/sdk/bus/telegram-daemon-control.ts +3 -13
  448. package/src/sdk/bus/telegram-daemon-orphan-reap.ts +498 -0
  449. package/src/sdk/bus/telegram-daemon-owner-registry.ts +176 -0
  450. package/src/sdk/bus/telegram-daemon.ts +2552 -2280
  451. package/src/sdk/bus/telegram-reference.ts +1 -226
  452. package/src/sdk/bus/telegram-setup.ts +2 -2
  453. package/src/sdk/bus/threaded-render.ts +1 -0
  454. package/src/sdk/bus/topic-registry.ts +279 -146
  455. package/src/sdk/cli/rows.ts +2 -35
  456. package/src/sdk/cli/session-cli.ts +776 -700
  457. package/src/sdk/client/client.ts +892 -1
  458. package/src/sdk/host/control/dispatch.ts +93 -58
  459. package/src/sdk/host/control/index.ts +1 -1
  460. package/src/sdk/host/control/operations.ts +18 -10
  461. package/src/sdk/host/control/runtime-gate.ts +40 -0
  462. package/src/sdk/host/host.ts +63 -12
  463. package/src/sdk/host/query/handlers.ts +66 -7
  464. package/src/sdk/host/reverse-leases.ts +2 -2
  465. package/src/sdk/host/sdk-surface-parity.test.ts +1 -1
  466. package/src/sdk/host/session-runtime.test.ts +2787 -34
  467. package/src/sdk/host/session-runtime.ts +1489 -101
  468. package/src/sdk/host/surface-policy.ts +12 -8
  469. package/src/sdk/host/types.ts +1 -1
  470. package/src/sdk/host/websocket-transport.lifecycle.test.ts +31 -59
  471. package/src/sdk/host/websocket-transport.ts +85 -50
  472. package/src/sdk/index.ts +2 -1
  473. package/src/sdk/lifecycle/broker-client.ts +53 -0
  474. package/src/sdk/lifecycle/client.ts +234 -0
  475. package/src/sdk/lifecycle/index.ts +3 -0
  476. package/src/sdk/{bus/recent-activity.ts → lifecycle/recent-sessions.ts} +5 -2
  477. package/src/sdk/lifecycle/service.ts +720 -0
  478. package/src/sdk/mcp/server.ts +226 -188
  479. package/src/sdk/prompt-deadline-lease.ts +55 -0
  480. package/src/sdk/prompt-deadline-manager.ts +148 -0
  481. package/src/sdk/prompt-status.ts +11 -3
  482. package/src/sdk/protocol/operation-inventory.generated.json +272 -129
  483. package/src/sdk/protocol/operation-registry.ts +71 -8
  484. package/src/sdk/receipt-state.ts +43 -0
  485. package/src/sdk/reconciliation-extensions.ts +14 -0
  486. package/src/sdk/router/index.ts +1 -0
  487. package/src/sdk/router/session-router.ts +1658 -0
  488. package/src/sdk/session-list.ts +93 -0
  489. package/src/sdk/session-reconnect.ts +45 -1
  490. package/src/sdk/session.ts +716 -120
  491. package/src/sdk/transport/serve-cli.ts +18 -34
  492. package/src/session/account-inventory.ts +603 -0
  493. package/src/session/agent-session.ts +2873 -559
  494. package/src/session/agent-storage.ts +35 -0
  495. package/src/session/blob-store.ts +32 -1
  496. package/src/session/coordinator-tool-label.ts +40 -0
  497. package/src/session/internal/managed-session-scope.ts +4 -0
  498. package/src/session/internal/managed-session-storage.ts +199 -31
  499. package/src/session/messages.ts +1 -1
  500. package/src/session/secure-token-file.ts +80 -0
  501. package/src/session/session-manager.ts +757 -57
  502. package/src/session/session-storage.ts +25 -16
  503. package/src/session/startup-auth-config.ts +297 -0
  504. package/src/session/terminal-abort.ts +1253 -0
  505. package/src/session/yield-queue.ts +57 -15
  506. package/src/session-import/claude.ts +334 -0
  507. package/src/session-import/codex.ts +1033 -0
  508. package/src/session-import/command.ts +77 -0
  509. package/src/session-import/detect.ts +133 -0
  510. package/src/session-import/index.ts +7 -0
  511. package/src/session-import/provider-codex.ts +327 -0
  512. package/src/session-import/provider-service.ts +457 -0
  513. package/src/session-import/redact.ts +128 -0
  514. package/src/session-import/service.ts +1264 -0
  515. package/src/session-import/types.ts +148 -0
  516. package/src/setup/paseo/check.ts +213 -0
  517. package/src/setup/paseo/install-saga.ts +293 -0
  518. package/src/setup/paseo/json-publisher.ts +263 -0
  519. package/src/setup/paseo/orchestration-preferences.ts +86 -0
  520. package/src/setup/paseo/paseo-ownership.ts +224 -0
  521. package/src/setup/paseo/paseo-setup.ts +253 -0
  522. package/src/setup/paseo/provider-config.ts +139 -0
  523. package/src/setup/paseo/remove.ts +183 -0
  524. package/src/setup/paseo/result-types.ts +79 -0
  525. package/src/setup/paseo/setup-deps.ts +175 -0
  526. package/src/setup/paseo/skills-bridge.ts +260 -0
  527. package/src/skill-state/active-state.ts +21 -11
  528. package/src/slash-commands/acp-builtins.ts +9 -1
  529. package/src/slash-commands/builtin-registry.ts +117 -19
  530. package/src/slash-commands/helpers/credential-switch.ts +143 -0
  531. package/src/slash-commands/helpers/mcp.ts +9 -3
  532. package/src/slash-commands/helpers/usage-report.ts +61 -56
  533. package/src/slash-commands/types.ts +7 -2
  534. package/src/task/executor.ts +30 -11
  535. package/src/task/index.ts +66 -7
  536. package/src/task/render.ts +23 -9
  537. package/src/tools/ask-answer-registry.ts +23 -7
  538. package/src/tools/ask.ts +8 -4
  539. package/src/tools/bash-sleep-advisory.ts +115 -0
  540. package/src/tools/bash.ts +98 -18
  541. package/src/tools/browser/attach.ts +71 -3
  542. package/src/tools/browser/launch.ts +86 -13
  543. package/src/tools/browser/profile-discovery.ts +57 -7
  544. package/src/tools/browser/render.ts +8 -1
  545. package/src/tools/browser.ts +130 -21
  546. package/src/tools/computer.enforcement.test.ts +1 -1
  547. package/src/tools/computer.ts +3 -2
  548. package/src/tools/cron.ts +12 -1
  549. package/src/tools/image-gen.ts +349 -142
  550. package/src/tools/index.ts +8 -0
  551. package/src/tools/job.ts +33 -6
  552. package/src/tools/monitor.ts +41 -2
  553. package/src/tools/skill-discovery.ts +21 -29
  554. package/src/tools/subagent.ts +142 -24
  555. package/src/tools/todo-contract.ts +55 -3
  556. package/src/tools/todo-write.ts +4 -3
  557. package/src/tools/tool-catalog.generated.ts +6 -6
  558. package/src/tools/ultragoal-ask-guard.ts +10 -3
  559. package/src/utils/herdr-pane.ts +345 -0
  560. package/src/utils/title-generator.ts +2 -0
  561. package/src/web/scrapers/index.ts +6 -4
  562. package/dist/types/cli/malloc-env-guard.test.d.ts +0 -1
  563. package/dist/types/defaults/gjc-defaults.test.d.ts +0 -1
  564. package/dist/types/memory-backend/lazy-loading.test.d.ts +0 -1
  565. package/dist/types/runtime/boot-ordering.test.d.ts +0 -1
  566. package/dist/types/runtime/lazy-service.test.d.ts +0 -1
  567. package/dist/types/runtime/network-prewarm-service.test.d.ts +0 -1
  568. package/dist/types/runtime/workspace-tree-service.test.d.ts +0 -1
  569. package/dist/types/runtime-mcp/config.test.d.ts +0 -1
  570. package/dist/types/runtime-mcp/http.test.d.ts +0 -1
  571. package/dist/types/runtime-mcp/manager-pool.test.d.ts +0 -1
  572. package/dist/types/runtime-mcp/pool-key.test.d.ts +0 -1
  573. package/dist/types/runtime-mcp/pool.test.d.ts +0 -1
  574. package/dist/types/sdk/bus/lifecycle-control-runtime.d.ts +0 -117
  575. package/dist/types/sdk/bus/lifecycle-orchestrator.d.ts +0 -141
  576. package/dist/types/sdk/bus/telegram-cli.d.ts +0 -31
  577. package/dist/types/sdk/elevation/allowlist.d.ts +0 -20
  578. package/dist/types/sdk/elevation/audit.d.ts +0 -93
  579. package/dist/types/sdk/elevation/capability.d.ts +0 -3
  580. package/dist/types/sdk/elevation/digest.d.ts +0 -72
  581. package/dist/types/sdk/elevation/dispatch-receipt.d.ts +0 -85
  582. package/dist/types/sdk/elevation/grant-ledger.d.ts +0 -163
  583. package/dist/types/sdk/elevation/owner.d.ts +0 -48
  584. package/dist/types/sdk/host/import-graph.test.d.ts +0 -1
  585. package/dist/types/sdk/host/sdk-surface-parity.test.d.ts +0 -1
  586. package/dist/types/sdk/host/session-runtime.test.d.ts +0 -1
  587. package/dist/types/sdk/host/websocket-transport.lifecycle.test.d.ts +0 -1
  588. package/dist/types/session/auth-broker-config.d.ts +0 -13
  589. package/dist/types/session/heap-eviction-artifacts.test.d.ts +0 -1
  590. package/dist/types/skills/skills.test.d.ts +0 -1
  591. package/dist/types/slash-commands/notify-command.test.d.ts +0 -1
  592. package/dist/types/task/token-log.test.d.ts +0 -1
  593. package/dist/types/tools/computer.enforcement.test.d.ts +0 -1
  594. package/dist/types/tools/descriptors.test.d.ts +0 -1
  595. package/scripts/g005-daemon-smoke.ts +0 -180
  596. package/scripts/g011-daemon-path-smoke.ts +0 -153
  597. package/src/sdk/bus/lifecycle-control-runtime.ts +0 -1733
  598. package/src/sdk/bus/lifecycle-orchestrator.ts +0 -489
  599. package/src/sdk/bus/telegram-cli.ts +0 -212
  600. package/src/sdk/elevation/allowlist.ts +0 -54
  601. package/src/sdk/elevation/audit.ts +0 -208
  602. package/src/sdk/elevation/capability.ts +0 -41
  603. package/src/sdk/elevation/digest.ts +0 -129
  604. package/src/sdk/elevation/dispatch-receipt.ts +0 -184
  605. package/src/sdk/elevation/grant-ledger.ts +0 -1142
  606. package/src/sdk/elevation/owner.ts +0 -109
  607. package/src/session/auth-broker-config.ts +0 -109
  608. /package/dist/types/{ai-core-import-gate.test.d.ts → discovery/claude-hooks.d.ts} +0 -0
  609. /package/dist/types/{cli/fixture-report.test.d.ts → discovery/codex-hooks.d.ts} +0 -0
  610. /package/dist/types/sdk/{bus/recent-activity.d.ts → lifecycle/recent-sessions.d.ts} +0 -0
@@ -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
+ }