@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
@@ -16,6 +16,17 @@ export function hasSdkWorkflowGateCapability(workflowGate: unknown): boolean {
16
16
  const UNINSTALLED_CONTROL_OPERATIONS = new Set(["auth.login", "host_tools.register", "host_uri.register"]);
17
17
  /** Advertised only when the context carries a real durable workflow-gate bridge. */
18
18
  const WORKFLOW_GATE_CONTROL_OPERATIONS = new Set(["workflow.gate_answer", "workflow.plan_approve"]);
19
+ /** Lifecycle mutations are Broker-owned and never advertised on generic session controls. */
20
+ const BROKER_LIFECYCLE_CONTROL_OPERATIONS = new Set([
21
+ "session.new",
22
+ "session.fork",
23
+ "session.resume",
24
+ "session.switch",
25
+ "session.branch",
26
+ "session.handoff",
27
+ "session.close",
28
+ "session.delete",
29
+ ]);
19
30
 
20
31
  const CONTROL_BINDINGS: Readonly<Record<string, string | undefined>> = {
21
32
  "model.cycle": "cycleModel",
@@ -34,14 +45,7 @@ const CONTROL_BINDINGS: Readonly<Record<string, string | undefined>> = {
34
45
  "retry.abort": "sdkControl",
35
46
  "bash.execute": "sdkControl",
36
47
  "bash.abort": "sdkControl",
37
- "session.new": "sdkControl",
38
- "session.fork": "sdkControl",
39
- "session.resume": "sdkControl",
40
- "session.close": "sdkControl",
41
- "session.switch": "sdkControl",
42
- "session.branch": "sdkControl",
43
48
  "session.rename": "sdkControl",
44
- "session.handoff": "sdkControl",
45
49
  "session.export_html": "sdkControl",
46
50
  "runtime.reload": "sdkControl",
47
51
  "service_tier.set": "sdkControl",
@@ -49,7 +53,6 @@ const CONTROL_BINDINGS: Readonly<Record<string, string | undefined>> = {
49
53
  "queue.message.move": "sdkControl",
50
54
  "queue.message.update": "sdkControl",
51
55
  "extension.set_enabled": "sdkControl",
52
- "session.delete": "sdkControl",
53
56
  "session.cwd.move": "sdkControl",
54
57
  "retry.last": "sdkControl",
55
58
  "retry.now": "sdkControl",
@@ -90,6 +93,7 @@ export function createSdkSurfacePolicy(options: SdkSurfacePolicyOptions): SdkSur
90
93
  OPERATIONS.filter(
91
94
  operation =>
92
95
  operation.kind === kind &&
96
+ !BROKER_LIFECYCLE_CONTROL_OPERATIONS.has(operation.sdkId) &&
93
97
  !UNINSTALLED_CONTROL_OPERATIONS.has(operation.sdkId) &&
94
98
  (!WORKFLOW_GATE_CONTROL_OPERATIONS.has(operation.sdkId) || options.workflowGateAvailable) &&
95
99
  (!required[operation.sdkId] || hasBinding(required[operation.sdkId]!)),
@@ -19,7 +19,7 @@ export interface HostEndpointAdapters {
19
19
  sessionId: string;
20
20
  stateRoot: string;
21
21
  token: string;
22
- sendFrame: (connectionId: string, frame: SdkFrame) => void | Promise<void>;
22
+ sendFrame: (connectionId: string, frame: SdkFrame) => "written" | "dropped" | Promise<"written" | "dropped">;
23
23
  onFrame: (handler: (connectionId: string, frame: SdkFrame) => void) => undefined | (() => void);
24
24
  }
25
25
 
@@ -61,6 +61,7 @@ describe("SDK WebSocket transport lifecycle", () => {
61
61
  mkdir: fs.mkdir,
62
62
  writeFile: fs.writeFile,
63
63
  chmod: fs.chmod,
64
+ stat: fs.stat,
64
65
  rename: async (from, to) => {
65
66
  expect(to).toBe(endpointPath);
66
67
  expect((await fs.stat(from)).mode & 0o777).toBe(0o600);
@@ -72,7 +73,6 @@ describe("SDK WebSocket transport lifecycle", () => {
72
73
  await releaseRename.promise;
73
74
  await fs.rename(from, to);
74
75
  },
75
- readFile: fs.readFile,
76
76
  rm: fs.rm,
77
77
  },
78
78
  });
@@ -227,8 +227,8 @@ describe("SDK WebSocket transport lifecycle", () => {
227
227
  chmod: async () => {
228
228
  throw Object.assign(new Error("chmod injected failure"), { code: "EACCES" });
229
229
  },
230
+ stat: real.stat,
230
231
  rename: real.rename,
231
- readFile: real.readFile,
232
232
  rm: real.rm,
233
233
  },
234
234
  };
@@ -268,8 +268,8 @@ describe("SDK WebSocket transport lifecycle", () => {
268
268
  throw Object.assign(new Error("duplicate startup failed"), { code: "EIO" });
269
269
  },
270
270
  chmod: fs.chmod,
271
+ stat: fs.stat,
271
272
  rename: fs.rename,
272
- readFile: fs.readFile,
273
273
  rm: fs.rm,
274
274
  },
275
275
  });
@@ -282,76 +282,48 @@ describe("SDK WebSocket transport lifecycle", () => {
282
282
  }
283
283
  });
284
284
 
285
- test("serializes a successor publication behind an owner endpoint cleanup", async () => {
285
+ test("retains a replacement endpoint while concurrent readers finish", async () => {
286
286
  const stateRoot = await tempStateRoot();
287
- const sessionId = "serialized-cleanup";
288
- const endpointPath = path.join(stateRoot, "sdk", `${sessionId}.json`);
289
- const readEntered = Promise.withResolvers<void>();
290
- const releaseRead = Promise.withResolvers<void>();
291
- const owner = await createSdkWebSocketTransport({
292
- sessionId,
287
+ const endpointPath = path.join(stateRoot, "sdk", "replacement.json");
288
+ const transport = await createSdkWebSocketTransport({
289
+ sessionId: "replacement",
293
290
  stateRoot,
294
- token: "owner-token",
295
- filesystem: {
296
- mkdir: fs.mkdir,
297
- writeFile: fs.writeFile,
298
- chmod: fs.chmod,
299
- rename: fs.rename,
300
- readFile: (async (...args: Parameters<typeof fs.readFile>) => {
301
- readEntered.resolve();
302
- await releaseRead.promise;
303
- return await fs.readFile(...args);
304
- }) as typeof fs.readFile,
305
- rm: fs.rm,
306
- },
291
+ token: "token",
307
292
  });
308
- const successor = await createSdkWebSocketTransport({ sessionId, stateRoot, token: "successor-token" });
309
293
  try {
310
- await owner.start();
311
- const stop = owner.stop();
312
- await readEntered.promise;
313
- const start = successor.start();
314
- await Bun.sleep(20);
315
- expect(JSON.parse(await fs.readFile(endpointPath, "utf8"))).toMatchObject({ token: "owner-token" });
316
- releaseRead.resolve();
317
- await stop;
318
- await start;
319
- expect(JSON.parse(await fs.readFile(endpointPath, "utf8"))).toMatchObject({ token: "successor-token" });
294
+ await transport.start();
295
+ const replacement = JSON.stringify({ sessionId: "replacement", url: "ws://127.0.0.1:1", token: "successor" });
296
+ const displaced = `${endpointPath}.displaced`;
297
+ await fs.rename(endpointPath, displaced);
298
+ await fs.writeFile(endpointPath, replacement, { mode: 0o600 });
299
+ const readers = Promise.all(Array.from({ length: 16 }, async () => await fs.readFile(endpointPath, "utf8")));
300
+ await transport.stop();
301
+ expect(await readers).toEqual(Array(16).fill(replacement));
302
+ expect(await fs.readFile(endpointPath, "utf8")).toBe(replacement);
303
+ await fs.rm(displaced, { force: true });
320
304
  } finally {
321
- releaseRead.resolve();
322
- await owner.stop().catch(() => undefined);
323
- await successor.stop().catch(() => undefined);
305
+ await transport.stop().catch(() => undefined);
324
306
  await fs.rm(stateRoot, { recursive: true, force: true });
325
307
  }
326
308
  });
327
309
 
328
- test("endpoint removal failures are typed and do not prevent server release", async () => {
310
+ test("endpoint identity uncertainty is typed and retains the endpoint", async () => {
329
311
  const stateRoot = await tempStateRoot();
330
- let rmCalls = 0;
331
- const real = fs;
332
- const dependencies: SdkWebSocketTransportDependencies = {
333
- filesystem: {
334
- mkdir: real.mkdir,
335
- writeFile: real.writeFile,
336
- chmod: real.chmod,
337
- rename: real.rename,
338
- readFile: real.readFile,
339
- rm: async (...args: Parameters<typeof real.rm>) => {
340
- rmCalls += 1;
341
- if (rmCalls === 1) throw Object.assign(new Error("rm injected failure"), { code: "EIO" });
342
- return await real.rm(...args);
343
- },
344
- },
345
- };
312
+ const endpointPath = path.join(stateRoot, "sdk", "identity-uncertain.json");
346
313
  const transport = await createSdkWebSocketTransport({
347
- sessionId: "rm-failure",
314
+ sessionId: "identity-uncertain",
348
315
  stateRoot,
349
316
  token: "token",
350
- ...dependencies,
351
317
  });
352
- await transport.start();
353
- await expect(transport.stop()).rejects.toMatchObject({ code: "endpoint_remove_failed" });
354
- await fs.rm(stateRoot, { recursive: true, force: true });
318
+ try {
319
+ await transport.start();
320
+ await fs.rm(endpointPath);
321
+ await fs.mkdir(endpointPath);
322
+ await expect(transport.stop()).rejects.toMatchObject({ code: "endpoint_remove_failed" });
323
+ await expect(fs.stat(endpointPath)).resolves.toBeDefined();
324
+ } finally {
325
+ await fs.rm(stateRoot, { recursive: true, force: true });
326
+ }
355
327
  });
356
328
 
357
329
  test("runtime stop releases the transport even when host stop fails", async () => {
@@ -1,7 +1,7 @@
1
- import { randomUUID } from "node:crypto";
1
+ import { createHash, randomUUID } from "node:crypto";
2
2
  import * as fs from "node:fs/promises";
3
3
  import * as path from "node:path";
4
- import { withFileLock } from "../../config/file-lock";
4
+ import { exactUnlink, type NativeExactFileIdentity } from "@gajae-code/natives";
5
5
  import type { SessionSdkTransport } from "./session-runtime";
6
6
  import type { SdkFrame } from "./types";
7
7
 
@@ -9,7 +9,7 @@ type SocketData = { connectionId: string };
9
9
  type Socket = { readonly data: SocketData; send(message: string): void; close(): void; terminate?(): void };
10
10
 
11
11
  export interface SdkWebSocketTransportDependencies {
12
- readonly filesystem?: Pick<typeof fs, "mkdir" | "writeFile" | "chmod" | "rename" | "readFile" | "rm">;
12
+ readonly filesystem?: Pick<typeof fs, "mkdir" | "writeFile" | "chmod" | "rename" | "rm" | "stat">;
13
13
  readonly serve?: typeof Bun.serve;
14
14
  }
15
15
  type SdkServer = ReturnType<typeof Bun.serve<SocketData>>;
@@ -68,10 +68,10 @@ export async function createSdkWebSocketTransport(
68
68
  let server: SdkServer | undefined;
69
69
  const sockets = new Map<string, Socket>();
70
70
  const endpointFile = path.join(input.stateRoot, "sdk", `${input.sessionId}.json`);
71
+ let endpointIdentity: NativeExactFileIdentity | undefined;
71
72
  let started = false;
72
73
  let startPromise: Promise<{ url: string }> | undefined;
73
74
  let stopPromise: Promise<void> | undefined;
74
- let publishedEndpoint: string | undefined;
75
75
 
76
76
  const stopServer = async (current: SdkServer): Promise<void> => {
77
77
  try {
@@ -98,18 +98,34 @@ export async function createSdkWebSocketTransport(
98
98
  if (current) await stopServer(current);
99
99
  };
100
100
 
101
- const removePublishedEndpoint = async (): Promise<void> => {
102
- if (publishedEndpoint === undefined) return;
101
+ const removeEndpoint = async (): Promise<void> => {
102
+ if (!endpointIdentity) return;
103
103
  try {
104
- const endpoint = await filesystem.readFile(endpointFile, "utf8");
105
- if (endpoint !== publishedEndpoint) return;
106
- await filesystem.rm(endpointFile, { force: true });
107
- publishedEndpoint = undefined;
108
- } catch (error) {
109
- if ((error as NodeJS.ErrnoException).code === "ENOENT") {
110
- publishedEndpoint = undefined;
104
+ const removal = exactUnlink(endpointFile, endpointIdentity);
105
+ if (removal.ok) {
106
+ endpointIdentity = undefined;
107
+ return;
108
+ }
109
+ if (
110
+ removal.code === "cleanup_pending" &&
111
+ removal.payloadDurable === true &&
112
+ !removal.retainedSuccessorPath &&
113
+ !removal.retainedUnknownPath
114
+ ) {
115
+ endpointIdentity = undefined;
111
116
  return;
112
117
  }
118
+ if (removal.retainedSuccessorPath) return;
119
+ if (removal.code === "identity_mismatch") {
120
+ try {
121
+ if ((await filesystem.stat(endpointFile, { bigint: true })).isFile()) return;
122
+ } catch (error) {
123
+ if ((error as NodeJS.ErrnoException).code === "ENOENT") return;
124
+ throw error;
125
+ }
126
+ }
127
+ throw new Error(`SDK endpoint identity-bound removal failed: ${removal.code ?? "unknown"}`);
128
+ } catch (error) {
113
129
  throw asLifecycleError("endpoint_remove_failed", "SDK endpoint file removal failed.", error);
114
130
  }
115
131
  };
@@ -151,6 +167,8 @@ export async function createSdkWebSocketTransport(
151
167
 
152
168
  const pending = (async (): Promise<{ url: string }> => {
153
169
  const tempEndpointFile = `${endpointFile}.${randomUUID()}.tmp`;
170
+ const endpointQuarantineName = `.gjc-delete-endpoint-${randomUUID()}-${path.basename(endpointFile)}`;
171
+ let endpointSource: string | undefined;
154
172
  let localServer: SdkServer | undefined;
155
173
  const failures: unknown[] = [];
156
174
  try {
@@ -206,39 +224,49 @@ export async function createSdkWebSocketTransport(
206
224
  });
207
225
  server = localServer;
208
226
  const url = endpointUrl(localServer);
209
- const endpoint = JSON.stringify({
210
- version: 1,
211
- sessionId: input.sessionId,
212
- url,
213
- token: input.token,
214
- pid: process.pid,
215
- });
216
- await withFileLock(endpointFile, async () => {
217
- try {
218
- await filesystem.writeFile(tempEndpointFile, endpoint, {
219
- encoding: "utf8",
220
- mode: 0o600,
221
- flag: "wx",
222
- });
223
- } catch (error) {
224
- throw asLifecycleError("endpoint_write_failed", "SDK endpoint file publication failed.", error);
225
- }
226
- try {
227
- await filesystem.chmod(tempEndpointFile, 0o600);
228
- } catch (error) {
229
- throw asLifecycleError(
230
- "endpoint_chmod_failed",
231
- "SDK endpoint file permission update failed.",
232
- error,
233
- );
234
- }
235
- try {
236
- await filesystem.rename(tempEndpointFile, endpointFile);
237
- } catch (error) {
238
- throw asLifecycleError("endpoint_write_failed", "SDK endpoint file publication failed.", error);
239
- }
240
- publishedEndpoint = endpoint;
241
- });
227
+ try {
228
+ endpointSource = JSON.stringify({
229
+ version: 1,
230
+ sessionId: input.sessionId,
231
+ url,
232
+ token: input.token,
233
+ pid: process.pid,
234
+ });
235
+ await filesystem.writeFile(tempEndpointFile, endpointSource, {
236
+ encoding: "utf8",
237
+ mode: 0o600,
238
+ flag: "wx",
239
+ });
240
+ } catch (error) {
241
+ throw asLifecycleError("endpoint_write_failed", "SDK endpoint file publication failed.", error);
242
+ }
243
+ try {
244
+ await filesystem.chmod(tempEndpointFile, 0o600);
245
+ } catch (error) {
246
+ throw asLifecycleError("endpoint_chmod_failed", "SDK endpoint file permission update failed.", error);
247
+ }
248
+ let publishedEndpointIdentity: NativeExactFileIdentity;
249
+ try {
250
+ const metadata = await filesystem.stat(tempEndpointFile, { bigint: true });
251
+ if (endpointSource === undefined) throw new Error("SDK endpoint source was not prepared.");
252
+ publishedEndpointIdentity = {
253
+ dev: metadata.dev,
254
+ ino: metadata.ino,
255
+ nlink: metadata.nlink,
256
+ size: metadata.size,
257
+ mtimeNs: metadata.mtimeNs,
258
+ sha256: createHash("sha256").update(endpointSource).digest("hex"),
259
+ quarantineName: endpointQuarantineName,
260
+ };
261
+ } catch (error) {
262
+ throw asLifecycleError("endpoint_write_failed", "SDK endpoint file identity capture failed.", error);
263
+ }
264
+ try {
265
+ await filesystem.rename(tempEndpointFile, endpointFile);
266
+ } catch (error) {
267
+ throw asLifecycleError("endpoint_write_failed", "SDK endpoint file publication failed.", error);
268
+ }
269
+ endpointIdentity = publishedEndpointIdentity;
242
270
  started = true;
243
271
  return { url };
244
272
  } catch (error) {
@@ -257,6 +285,11 @@ export async function createSdkWebSocketTransport(
257
285
  asLifecycleError("endpoint_remove_failed", "SDK endpoint temp file removal failed.", cleanupError),
258
286
  );
259
287
  }
288
+ try {
289
+ await removeEndpoint();
290
+ } catch (cleanupError) {
291
+ failures.push(cleanupError);
292
+ }
260
293
  started = false;
261
294
  server = undefined;
262
295
  const combined = combineLifecycleErrors(
@@ -281,10 +314,12 @@ export async function createSdkWebSocketTransport(
281
314
  if (startPromise) await startPromise.catch(() => undefined);
282
315
  const failures: unknown[] = [];
283
316
  try {
284
- await withFileLock(endpointFile, async () => {
285
- await closeServer();
286
- await removePublishedEndpoint();
287
- });
317
+ await closeServer();
318
+ } catch (error) {
319
+ failures.push(error);
320
+ }
321
+ try {
322
+ await removeEndpoint();
288
323
  } catch (error) {
289
324
  failures.push(error);
290
325
  }
package/src/sdk/index.ts CHANGED
@@ -10,8 +10,8 @@ export {
10
10
  UnknownModelProfileError,
11
11
  } from "../config/model-profile-contract";
12
12
  export * as bus from "./bus";
13
- export * from "./client";
14
13
  export * as host from "./host";
14
+ export * as lifecycle from "./lifecycle";
15
15
  export * as mcp from "./mcp";
16
16
  export type {
17
17
  Q10CurrentThinkingLevel,
@@ -23,6 +23,7 @@ export type {
23
23
  } from "./models";
24
24
  export * from "./prompt-status";
25
25
  export type { ActiveProviderConnectionKind, ActiveProviderDescriptor } from "./providers";
26
+ export * as router from "./router";
26
27
  export * from "./session";
27
28
  export * from "./session-directory";
28
29
  export * from "./turn-result";
@@ -0,0 +1,53 @@
1
+ import { logger } from "@gajae-code/utils";
2
+ import { ensureBroker } from "../broker/ensure";
3
+ import { SdkClient } from "../client/client";
4
+ import { readSdkBrokerDiscovery } from "../client/discovery";
5
+ import {
6
+ type SessionLifecycleClient,
7
+ type SessionLifecycleClientRequestOptions,
8
+ type SessionLifecycleOperation,
9
+ SessionLifecycleService,
10
+ } from "./service";
11
+
12
+ /** SDK-core Broker client that keeps Broker credentials inside the lifecycle boundary. */
13
+ export class AgentDirSessionLifecycleClient implements SessionLifecycleClient {
14
+ readonly #agentDir: string;
15
+
16
+ constructor(agentDir: string) {
17
+ this.#agentDir = agentDir;
18
+ }
19
+
20
+ async global(
21
+ operation: SessionLifecycleOperation,
22
+ input: Record<string, unknown>,
23
+ options: SessionLifecycleClientRequestOptions,
24
+ ): Promise<unknown> {
25
+ await ensureBroker({ agentDir: this.#agentDir });
26
+ const discovery = await readSdkBrokerDiscovery(this.#agentDir);
27
+ if (!discovery) throw new Error("SDK broker discovery is unavailable.");
28
+ const client = await SdkClient.connect(discovery.url, discovery.token, {
29
+ ...(options.timeoutMs === undefined ? {} : { timeoutMs: options.timeoutMs }),
30
+ });
31
+ let result: unknown;
32
+ try {
33
+ result = await client.global(operation, input, {
34
+ ...(options.idempotencyKey === undefined ? {} : { idempotencyKey: options.idempotencyKey }),
35
+ ...(options.timeoutMs === undefined ? {} : { timeoutMs: options.timeoutMs }),
36
+ });
37
+ } finally {
38
+ try {
39
+ await client.close();
40
+ } catch (error) {
41
+ logger.warn("SDK lifecycle client cleanup failed", {
42
+ operation,
43
+ error: error instanceof Error ? error.message : String(error),
44
+ });
45
+ }
46
+ }
47
+ return result;
48
+ }
49
+ }
50
+
51
+ export function createBrokerSessionLifecycleService(agentDir: string): SessionLifecycleService {
52
+ return new SessionLifecycleService(new AgentDirSessionLifecycleClient(agentDir));
53
+ }