@gajae-code/coding-agent 0.10.2 → 0.11.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 (465) hide show
  1. package/CHANGELOG.md +50 -2
  2. package/dist/types/append-only-mode.d.ts +1 -1
  3. package/dist/types/cli/args.d.ts +4 -5
  4. package/dist/types/cli/daemon-cli.d.ts +12 -1
  5. package/dist/types/cli/notify-cli.d.ts +21 -1
  6. package/dist/types/cli.d.ts +3 -0
  7. package/dist/types/commands/daemon.d.ts +39 -0
  8. package/dist/types/commands/launch.d.ts +3 -0
  9. package/dist/types/commands/notify.d.ts +28 -1
  10. package/dist/types/commands/sdk.d.ts +33 -0
  11. package/dist/types/config/atomic-yaml-patch.d.ts +85 -0
  12. package/dist/types/config/model-profile-activation.d.ts +35 -15
  13. package/dist/types/config/model-profiles.d.ts +11 -5
  14. package/dist/types/config/model-registry.d.ts +3 -3
  15. package/dist/types/config/model-resolver.d.ts +39 -6
  16. package/dist/types/config/model-selector-value.d.ts +17 -0
  17. package/dist/types/config/models-config-schema.d.ts +10 -6
  18. package/dist/types/config/settings-schema.d.ts +133 -6
  19. package/dist/types/config/settings.d.ts +63 -35
  20. package/dist/types/coordinator-mcp/model-preset.d.ts +7 -6
  21. package/dist/types/coordinator-mcp/server.d.ts +6 -49
  22. package/dist/types/daemon/builtin.d.ts +6 -5
  23. package/dist/types/daemon/control-types.d.ts +1 -1
  24. package/dist/types/discovery/mcp-json.d.ts +12 -1
  25. package/dist/types/extensibility/custom-tools/types.d.ts +1 -1
  26. package/dist/types/extensibility/extensions/compact-handler.d.ts +4 -2
  27. package/dist/types/extensibility/extensions/get-commands-handler.d.ts +2 -2
  28. package/dist/types/extensibility/extensions/loader.d.ts +10 -1
  29. package/dist/types/extensibility/extensions/runner.d.ts +3 -3
  30. package/dist/types/extensibility/extensions/types.d.ts +141 -16
  31. package/dist/types/extensibility/hooks/types.d.ts +1 -1
  32. package/dist/types/gjc-runtime/launch-tmux.d.ts +3 -2
  33. package/dist/types/gjc-runtime/psmux-detect.d.ts +3 -0
  34. package/dist/types/gjc-runtime/session-state-sidecar.d.ts +3 -0
  35. package/dist/types/gjc-runtime/team-runtime.d.ts +3 -4
  36. package/dist/types/gjc-runtime/tmux-owner-isolation-cli.d.ts +13 -0
  37. package/dist/types/gjc-runtime/tmux-sessions.d.ts +4 -1
  38. package/dist/types/gjc-runtime/windows-powershell-command.d.ts +9 -0
  39. package/dist/types/harness-control-plane/operate.d.ts +5 -5
  40. package/dist/types/harness-control-plane/owner.d.ts +18 -4
  41. package/dist/types/harness-control-plane/receipts.d.ts +0 -1
  42. package/dist/types/harness-control-plane/sdk-transport.d.ts +43 -0
  43. package/dist/types/harness-control-plane/session-transport.d.ts +48 -0
  44. package/dist/types/harness-control-plane/types.d.ts +3 -4
  45. package/dist/types/lsp/index.d.ts +1 -1
  46. package/dist/types/main.d.ts +32 -38
  47. package/dist/types/modes/acp/acp-agent.d.ts +224 -53
  48. package/dist/types/modes/acp/acp-client-bridge.d.ts +1 -0
  49. package/dist/types/modes/acp/acp-mode.d.ts +6 -15
  50. package/dist/types/modes/acp/permission-mode.d.ts +4 -0
  51. package/dist/types/modes/acp/startup-options.d.ts +6 -0
  52. package/dist/types/modes/components/agent-dashboard.d.ts +3 -0
  53. package/dist/types/modes/components/model-selector.d.ts +1 -0
  54. package/dist/types/modes/components/notifications-settings-editor.d.ts +135 -0
  55. package/dist/types/modes/components/settings-selector.d.ts +6 -4
  56. package/dist/types/modes/components/welcome.d.ts +1 -1
  57. package/dist/types/modes/controllers/selector-controller.d.ts +35 -1
  58. package/dist/types/modes/index.d.ts +0 -4
  59. package/dist/types/modes/interactive-mode.d.ts +3 -0
  60. package/dist/types/modes/runtime-init.d.ts +2 -2
  61. package/dist/types/modes/shared/agent-wire/approval-gate.d.ts +6 -9
  62. package/dist/types/modes/shared/agent-wire/deep-interview-gate.d.ts +4 -6
  63. package/dist/types/modes/shared/agent-wire/event-contract.d.ts +6 -6
  64. package/dist/types/modes/shared/agent-wire/event-envelope.d.ts +4 -9
  65. package/dist/types/modes/shared/agent-wire/event-observation.d.ts +1 -1
  66. package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +169 -30
  67. package/dist/types/modes/shared/agent-wire/workflow-gate-schema.d.ts +7 -7
  68. package/dist/types/modes/shared/agent-wire/workflow-gate-types.d.ts +105 -0
  69. package/dist/types/modes/types.d.ts +5 -0
  70. package/dist/types/runtime-mcp/client.d.ts +2 -0
  71. package/dist/types/runtime-mcp/config.d.ts +5 -1
  72. package/dist/types/runtime-mcp/manager.d.ts +8 -1
  73. package/dist/types/runtime-mcp/types.d.ts +4 -0
  74. package/dist/types/sdk/acp/adapter.d.ts +67 -0
  75. package/dist/types/sdk/acp/index.d.ts +2 -0
  76. package/dist/types/sdk/broker/broker.d.ts +53 -0
  77. package/dist/types/sdk/broker/discovery.d.ts +30 -0
  78. package/dist/types/sdk/broker/ensure.d.ts +33 -0
  79. package/dist/types/sdk/broker/identity.d.ts +3 -0
  80. package/dist/types/sdk/broker/index.d.ts +8 -0
  81. package/dist/types/sdk/broker/lifecycle-ledger.d.ts +95 -0
  82. package/dist/types/sdk/broker/lifecycle.d.ts +85 -0
  83. package/dist/types/sdk/broker/process-incarnation.d.ts +14 -0
  84. package/dist/types/sdk/broker/runtime.d.ts +33 -0
  85. package/dist/types/sdk/broker/session-index.d.ts +57 -0
  86. package/dist/types/sdk/broker/state-version.d.ts +8 -0
  87. package/dist/types/sdk/broker/transport.d.ts +9 -0
  88. package/dist/types/sdk/bus/chat-command-policy.d.ts +49 -0
  89. package/dist/types/sdk/bus/chat-daemon-cli.d.ts +21 -0
  90. package/dist/types/sdk/bus/chat-daemon-control.d.ts +111 -0
  91. package/dist/types/sdk/bus/chat-daemon-runtime.d.ts +77 -0
  92. package/dist/types/sdk/bus/chat-effect-journal.d.ts +84 -0
  93. package/dist/types/{notifications → sdk/bus}/config-commands.d.ts +7 -2
  94. package/dist/types/sdk/bus/config.d.ts +274 -0
  95. package/dist/types/sdk/bus/conversation-store.d.ts +72 -0
  96. package/dist/types/sdk/bus/discord-conversation.d.ts +58 -0
  97. package/dist/types/sdk/bus/discord-daemon.d.ts +45 -0
  98. package/dist/types/sdk/bus/discord-live-provider.d.ts +70 -0
  99. package/dist/types/sdk/bus/discord-provider.d.ts +85 -0
  100. package/dist/types/{notifications → sdk/bus}/html-format.d.ts +2 -2
  101. package/dist/types/{notifications → sdk/bus}/index.d.ts +113 -13
  102. package/dist/types/{notifications → sdk/bus}/lifecycle-control-runtime.d.ts +4 -2
  103. package/dist/types/{notifications → sdk/bus}/lifecycle-orchestrator.d.ts +18 -21
  104. package/dist/types/{notifications → sdk/bus}/managed-daemon.d.ts +1 -1
  105. package/dist/types/sdk/bus/native-runtime-compatibility.d.ts +13 -0
  106. package/dist/types/sdk/bus/notification-orchestration.d.ts +170 -0
  107. package/dist/types/{notifications → sdk/bus}/notification-service.d.ts +7 -1
  108. package/dist/types/sdk/bus/session-control.d.ts +83 -0
  109. package/dist/types/sdk/bus/slack-conversation.d.ts +56 -0
  110. package/dist/types/sdk/bus/slack-daemon.d.ts +60 -0
  111. package/dist/types/sdk/bus/slack-live-provider.d.ts +59 -0
  112. package/dist/types/sdk/bus/slack-provider.d.ts +55 -0
  113. package/dist/types/{notifications → sdk/bus}/telegram-cli.d.ts +4 -4
  114. package/dist/types/{notifications → sdk/bus}/telegram-daemon-cli.d.ts +14 -5
  115. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +12 -0
  116. package/dist/types/{notifications → sdk/bus}/telegram-daemon-control.d.ts +2 -2
  117. package/dist/types/{notifications → sdk/bus}/telegram-daemon.d.ts +55 -17
  118. package/dist/types/{notifications → sdk/bus}/telegram-reference.d.ts +2 -2
  119. package/dist/types/sdk/bus/telegram-setup.d.ts +128 -0
  120. package/dist/types/{notifications → sdk/bus}/topic-registry.d.ts +11 -0
  121. package/dist/types/sdk/cli/index.d.ts +1 -0
  122. package/dist/types/sdk/cli/session-cli.d.ts +19 -0
  123. package/dist/types/sdk/client/client.d.ts +1 -0
  124. package/dist/types/sdk/client/discovery.d.ts +27 -0
  125. package/dist/types/sdk/client/index.d.ts +2 -0
  126. package/dist/types/sdk/host/control/dispatch.d.ts +34 -0
  127. package/dist/types/sdk/host/control/index.d.ts +2 -0
  128. package/dist/types/sdk/host/control/operations.d.ts +65 -0
  129. package/dist/types/sdk/host/events.d.ts +35 -0
  130. package/dist/types/sdk/host/host.d.ts +35 -0
  131. package/dist/types/sdk/host/index.d.ts +4 -0
  132. package/dist/types/sdk/host/query/cursor.d.ts +62 -0
  133. package/dist/types/sdk/host/query/handlers.d.ts +70 -0
  134. package/dist/types/sdk/host/query/index.d.ts +3 -0
  135. package/dist/types/sdk/host/query/revision-store.d.ts +60 -0
  136. package/dist/types/sdk/host/reverse-leases.d.ts +45 -0
  137. package/dist/types/sdk/host/types.d.ts +32 -0
  138. package/dist/types/sdk/index.d.ts +6 -0
  139. package/dist/types/sdk/lifecycle-session.d.ts +14 -0
  140. package/dist/types/sdk/mcp/index.d.ts +1 -0
  141. package/dist/types/sdk/mcp/server.d.ts +37 -0
  142. package/dist/types/sdk/models.d.ts +44 -0
  143. package/dist/types/sdk/protocol/adapter-validation.d.ts +14 -0
  144. package/dist/types/sdk/protocol/operation-registry.d.ts +24 -0
  145. package/dist/types/{sdk.d.ts → sdk/session.d.ts} +44 -38
  146. package/dist/types/sdk/startup-capability.d.ts +50 -0
  147. package/dist/types/session/agent-session.d.ts +114 -21
  148. package/dist/types/session/default-model-selection.d.ts +25 -0
  149. package/dist/types/session/fallback-chain-controller.d.ts +52 -0
  150. package/dist/types/session/session-manager.d.ts +58 -1
  151. package/dist/types/setup/credential-auto-import.d.ts +36 -6
  152. package/dist/types/tools/ask-answer-registry.d.ts +1 -1
  153. package/dist/types/tools/browser/benchmark/detector-report.d.ts +63 -0
  154. package/dist/types/tools/browser/benchmark/run-suite.d.ts +18 -0
  155. package/dist/types/tools/browser/launch.d.ts +22 -0
  156. package/dist/types/tools/browser/profile-discovery.d.ts +31 -0
  157. package/dist/types/tools/browser/profile-posture.d.ts +37 -0
  158. package/dist/types/tools/browser/profile-reuse.d.ts +39 -0
  159. package/dist/types/tools/browser/profile-warmup.d.ts +39 -0
  160. package/dist/types/tools/browser/registry.d.ts +19 -0
  161. package/dist/types/tools/browser/tab-protocol.d.ts +4 -0
  162. package/dist/types/tools/index.d.ts +8 -8
  163. package/package.json +34 -13
  164. package/scripts/build-sdk-package-smoke.ts +94 -0
  165. package/scripts/capture-notifications-settings-showcase.ts +435 -0
  166. package/scripts/compile-args.ts +4 -2
  167. package/scripts/g005-daemon-smoke.ts +4 -5
  168. package/scripts/g011-daemon-path-smoke.ts +5 -5
  169. package/scripts/generate-sdk-adapter-parity-manifest.ts +163 -0
  170. package/scripts/generate-sdk-operation-inventory.ts +867 -0
  171. package/scripts/generate-telegram-baseline-manifest.ts +128 -0
  172. package/scripts/manifest-schema.ts +124 -0
  173. package/scripts/run-test-manifest.ts +153 -0
  174. package/scripts/run-threat-model-check.ts +157 -0
  175. package/scripts/verify-gjc-sdk-canonicalization.ts +3467 -0
  176. package/scripts/verify-gjc-sdk-rename.ts +90 -0
  177. package/src/append-only-mode.ts +1 -1
  178. package/src/cli/args.ts +43 -12
  179. package/src/cli/auth-gateway-cli.ts +2 -2
  180. package/src/cli/config-cli.ts +2 -1
  181. package/src/cli/daemon-cli.ts +63 -14
  182. package/src/cli/list-models.ts +1 -1
  183. package/src/cli/notify-cli.ts +288 -286
  184. package/src/cli.ts +21 -2
  185. package/src/commands/daemon.ts +50 -6
  186. package/src/commands/harness.ts +93 -36
  187. package/src/commands/launch.ts +5 -2
  188. package/src/commands/mcp-serve.ts +19 -12
  189. package/src/commands/notify.ts +36 -3
  190. package/src/commands/sdk.ts +426 -0
  191. package/src/commit/agentic/agent.ts +1 -0
  192. package/src/config/atomic-yaml-patch.ts +423 -0
  193. package/src/config/model-profile-activation.ts +240 -89
  194. package/src/config/model-profiles.ts +18 -15
  195. package/src/config/model-registry.ts +51 -26
  196. package/src/config/model-resolver.ts +138 -51
  197. package/src/config/model-selector-value.ts +50 -0
  198. package/src/config/models-config-schema.ts +14 -21
  199. package/src/config/settings-schema.ts +128 -10
  200. package/src/config/settings.ts +1120 -158
  201. package/src/coordinator-mcp/model-preset.ts +74 -20
  202. package/src/coordinator-mcp/server.ts +1597 -3052
  203. package/src/daemon/builtin.ts +8 -5
  204. package/src/daemon/control-types.ts +1 -1
  205. package/src/defaults/gjc/skills/team/SKILL.md +4 -4
  206. package/src/discovery/mcp-json.ts +327 -20
  207. package/src/extensibility/custom-tools/types.ts +1 -1
  208. package/src/extensibility/extensions/compact-handler.ts +3 -3
  209. package/src/extensibility/extensions/get-commands-handler.ts +2 -2
  210. package/src/extensibility/extensions/loader.ts +69 -5
  211. package/src/extensibility/extensions/runner.ts +112 -4
  212. package/src/extensibility/extensions/types.ts +176 -17
  213. package/src/extensibility/hooks/types.ts +1 -1
  214. package/src/gjc-runtime/launch-tmux.ts +170 -86
  215. package/src/gjc-runtime/psmux-detect.ts +82 -4
  216. package/src/gjc-runtime/session-state-sidecar.ts +41 -31
  217. package/src/gjc-runtime/team-runtime.ts +54 -35
  218. package/src/gjc-runtime/tmux-owner-isolation-cli.ts +53 -17
  219. package/src/gjc-runtime/tmux-owner-isolation.ts +1 -1
  220. package/src/gjc-runtime/tmux-sessions.ts +19 -13
  221. package/src/gjc-runtime/ultragoal-guard.ts +53 -6
  222. package/src/gjc-runtime/ultragoal-runtime.ts +155 -3
  223. package/src/gjc-runtime/windows-powershell-command.ts +58 -0
  224. package/src/harness-control-plane/operate.ts +9 -9
  225. package/src/harness-control-plane/owner.ts +283 -39
  226. package/src/harness-control-plane/receipts.ts +0 -1
  227. package/src/harness-control-plane/sdk-transport.ts +395 -0
  228. package/src/harness-control-plane/session-transport.ts +94 -0
  229. package/src/harness-control-plane/types.ts +1 -1
  230. package/src/internal-urls/docs-index.generated.ts +34 -35
  231. package/src/lsp/client.ts +42 -6
  232. package/src/lsp/index.ts +2 -2
  233. package/src/main.ts +299 -204
  234. package/src/modes/DESIGN.md +258 -0
  235. package/src/modes/acp/acp-agent.ts +1228 -2612
  236. package/src/modes/acp/acp-client-bridge.ts +2 -20
  237. package/src/modes/acp/acp-event-mapper.ts +18 -2
  238. package/src/modes/acp/acp-mode.ts +8 -36
  239. package/src/modes/acp/permission-mode.ts +25 -0
  240. package/src/modes/acp/startup-options.ts +6 -0
  241. package/src/modes/components/agent-dashboard.ts +37 -17
  242. package/src/modes/components/model-selector.ts +93 -35
  243. package/src/modes/components/notifications-settings-editor.ts +1379 -0
  244. package/src/modes/components/settings-selector.ts +60 -11
  245. package/src/modes/components/welcome.ts +4 -4
  246. package/src/modes/controllers/command-controller.ts +1 -2
  247. package/src/modes/controllers/event-controller.ts +11 -16
  248. package/src/modes/controllers/extension-ui-controller.ts +348 -4
  249. package/src/modes/controllers/selector-controller.ts +674 -36
  250. package/src/modes/index.ts +0 -22
  251. package/src/modes/interactive-mode.ts +59 -20
  252. package/src/modes/runtime-init.ts +298 -6
  253. package/src/modes/shared/agent-wire/approval-gate.ts +9 -11
  254. package/src/modes/shared/agent-wire/deep-interview-gate.ts +10 -11
  255. package/src/modes/shared/agent-wire/event-contract.ts +7 -8
  256. package/src/modes/shared/agent-wire/event-envelope.ts +9 -17
  257. package/src/modes/shared/agent-wire/event-observation.ts +16 -7
  258. package/src/modes/shared/agent-wire/workflow-gate-broker.ts +1254 -87
  259. package/src/modes/shared/agent-wire/workflow-gate-schema.ts +15 -15
  260. package/src/modes/shared/agent-wire/workflow-gate-types.ts +113 -0
  261. package/src/modes/types.ts +5 -0
  262. package/src/runtime-mcp/client.ts +94 -19
  263. package/src/runtime-mcp/config.ts +27 -15
  264. package/src/runtime-mcp/manager.ts +343 -105
  265. package/src/runtime-mcp/oauth-flow.ts +42 -12
  266. package/src/runtime-mcp/transports/http.ts +49 -19
  267. package/src/runtime-mcp/transports/stdio.ts +47 -28
  268. package/src/runtime-mcp/types.ts +10 -0
  269. package/src/sdk/acp/adapter.ts +418 -0
  270. package/src/sdk/acp/index.ts +2 -0
  271. package/src/sdk/broker/broker.ts +642 -0
  272. package/src/sdk/broker/discovery.ts +94 -0
  273. package/src/sdk/broker/ensure.ts +249 -0
  274. package/src/sdk/broker/identity.ts +42 -0
  275. package/src/sdk/broker/index.ts +8 -0
  276. package/src/sdk/broker/internal-source-marker-2178.txt +1 -0
  277. package/src/sdk/broker/internal-source.bunfig.toml +1 -0
  278. package/src/sdk/broker/lifecycle-ledger.ts +286 -0
  279. package/src/sdk/broker/lifecycle.ts +2157 -0
  280. package/src/sdk/broker/process-incarnation.ts +159 -0
  281. package/src/sdk/broker/runtime.ts +164 -0
  282. package/src/sdk/broker/session-index.ts +318 -0
  283. package/src/sdk/broker/state-version.ts +23 -0
  284. package/src/sdk/broker/transport.ts +125 -0
  285. package/src/sdk/bus/chat-command-policy.ts +107 -0
  286. package/src/sdk/bus/chat-daemon-cli.ts +214 -0
  287. package/src/sdk/bus/chat-daemon-control.ts +713 -0
  288. package/src/sdk/bus/chat-daemon-runtime.ts +526 -0
  289. package/src/sdk/bus/chat-effect-journal.ts +353 -0
  290. package/src/{notifications → sdk/bus}/config-commands.ts +39 -10
  291. package/src/sdk/bus/config.ts +433 -0
  292. package/src/sdk/bus/conversation-store.ts +391 -0
  293. package/src/sdk/bus/discord-conversation.ts +85 -0
  294. package/src/sdk/bus/discord-daemon.ts +2275 -0
  295. package/src/sdk/bus/discord-live-provider.ts +521 -0
  296. package/src/sdk/bus/discord-provider.ts +56 -0
  297. package/src/{notifications → sdk/bus}/html-format.ts +2 -2
  298. package/src/sdk/bus/index.ts +3943 -0
  299. package/src/{notifications → sdk/bus}/lifecycle-commands.ts +2 -0
  300. package/src/{notifications → sdk/bus}/lifecycle-control-runtime.ts +225 -196
  301. package/src/{notifications → sdk/bus}/lifecycle-orchestrator.ts +161 -74
  302. package/src/{notifications → sdk/bus}/managed-daemon.ts +2 -2
  303. package/src/sdk/bus/native-runtime-compatibility.ts +42 -0
  304. package/src/sdk/bus/natives-augment.d.ts +38 -0
  305. package/src/sdk/bus/notification-orchestration.ts +535 -0
  306. package/src/{notifications → sdk/bus}/notification-service.ts +106 -12
  307. package/src/sdk/bus/session-control.ts +333 -0
  308. package/src/sdk/bus/slack-conversation.ts +74 -0
  309. package/src/sdk/bus/slack-daemon.ts +2144 -0
  310. package/src/sdk/bus/slack-live-provider.ts +380 -0
  311. package/src/sdk/bus/slack-provider.ts +76 -0
  312. package/src/{notifications → sdk/bus}/telegram-cli.ts +8 -8
  313. package/src/sdk/bus/telegram-daemon-cli.ts +330 -0
  314. package/src/sdk/bus/telegram-daemon-contract.ts +14 -0
  315. package/src/{notifications → sdk/bus}/telegram-daemon-control.ts +4 -4
  316. package/src/{notifications → sdk/bus}/telegram-daemon.ts +502 -54
  317. package/src/{notifications → sdk/bus}/telegram-reference.ts +2 -2
  318. package/src/sdk/bus/telegram-setup.ts +663 -0
  319. package/src/{notifications → sdk/bus}/topic-registry.ts +32 -0
  320. package/src/sdk/cli/index.ts +1 -0
  321. package/src/sdk/cli/session-cli.ts +275 -0
  322. package/src/sdk/client/client.ts +1 -0
  323. package/src/sdk/client/discovery.ts +108 -0
  324. package/src/sdk/client/index.ts +2 -0
  325. package/src/sdk/host/control/dispatch.ts +367 -0
  326. package/src/sdk/host/control/index.ts +10 -0
  327. package/src/sdk/host/control/operations.ts +63 -0
  328. package/src/sdk/host/events.ts +91 -0
  329. package/src/sdk/host/host.ts +296 -0
  330. package/src/sdk/host/index.ts +4 -0
  331. package/src/sdk/host/query/cursor.ts +189 -0
  332. package/src/sdk/host/query/handlers.ts +533 -0
  333. package/src/sdk/host/query/index.ts +3 -0
  334. package/src/sdk/host/query/revision-store.ts +1126 -0
  335. package/src/sdk/host/reverse-leases.ts +325 -0
  336. package/src/sdk/host/types.ts +29 -0
  337. package/src/sdk/index.ts +13 -0
  338. package/src/sdk/lifecycle-session.ts +39 -0
  339. package/src/sdk/mcp/index.ts +1 -0
  340. package/src/sdk/mcp/server.ts +332 -0
  341. package/src/sdk/models.ts +168 -0
  342. package/src/sdk/protocol/adapter-validation.ts +48 -0
  343. package/src/sdk/protocol/operation-inventory.generated.json +5654 -0
  344. package/src/sdk/protocol/operation-registry.ts +312 -0
  345. package/src/{sdk.ts → sdk/session.ts} +339 -212
  346. package/src/sdk/startup-capability.ts +189 -0
  347. package/src/session/agent-session.ts +2453 -894
  348. package/src/session/default-model-selection.ts +93 -0
  349. package/src/session/fallback-chain-controller.ts +136 -0
  350. package/src/session/session-manager.ts +438 -11
  351. package/src/session/session-storage.ts +8 -1
  352. package/src/setup/credential-auto-import.ts +290 -35
  353. package/src/setup/hermes/templates/operator-instructions.v1.md +3 -5
  354. package/src/slash-commands/builtin-registry.ts +2 -1
  355. package/src/task/executor.ts +62 -13
  356. package/src/tools/ask-answer-registry.ts +1 -1
  357. package/src/tools/ask.ts +13 -8
  358. package/src/tools/browser/STEALTH-THIRD-PARTY-NOTICES.md +26 -0
  359. package/src/tools/browser/benchmark/detector-report.ts +157 -0
  360. package/src/tools/browser/benchmark/run-suite.ts +39 -0
  361. package/src/tools/browser/launch.ts +124 -19
  362. package/src/tools/browser/profile-discovery.ts +63 -0
  363. package/src/tools/browser/profile-posture.ts +59 -0
  364. package/src/tools/browser/profile-reuse.ts +102 -0
  365. package/src/tools/browser/profile-warmup.ts +109 -0
  366. package/src/tools/browser/registry.ts +87 -11
  367. package/src/tools/browser/tab-protocol.ts +1 -0
  368. package/src/tools/browser/tab-supervisor.ts +1 -0
  369. package/src/tools/browser/tab-worker.ts +1 -1
  370. package/src/tools/browser.ts +6 -0
  371. package/src/tools/index.ts +8 -8
  372. package/src/tools/puppeteer/14_stealth_permissions.txt +57 -0
  373. package/src/tools/puppeteer/15_stealth_webrtc.txt +60 -0
  374. package/src/tools/telegram-send.ts +2 -2
  375. package/vendor/insane-search/MANIFEST.json +2 -1
  376. package/vendor/insane-search/engine/bias_check.py +4 -1
  377. package/vendor/insane-search/engine/phase0.py +26 -1
  378. package/dist/types/harness-control-plane/rpc-adapter.d.ts +0 -69
  379. package/dist/types/modes/bridge/auth.d.ts +0 -12
  380. package/dist/types/modes/bridge/bridge-client-bridge.d.ts +0 -9
  381. package/dist/types/modes/bridge/bridge-mode.d.ts +0 -47
  382. package/dist/types/modes/bridge/bridge-ui-context.d.ts +0 -88
  383. package/dist/types/modes/bridge/event-stream.d.ts +0 -8
  384. package/dist/types/modes/rpc/host-tools.d.ts +0 -1
  385. package/dist/types/modes/rpc/host-uris.d.ts +0 -1
  386. package/dist/types/modes/rpc/rpc-client.d.ts +0 -299
  387. package/dist/types/modes/rpc/rpc-mode.d.ts +0 -86
  388. package/dist/types/modes/rpc/rpc-socket-security.d.ts +0 -10
  389. package/dist/types/modes/rpc/rpc-types.d.ts +0 -810
  390. package/dist/types/modes/shared/agent-wire/command-contract.d.ts +0 -18
  391. package/dist/types/modes/shared/agent-wire/command-dispatch.d.ts +0 -37
  392. package/dist/types/modes/shared/agent-wire/command-validation.d.ts +0 -2
  393. package/dist/types/modes/shared/agent-wire/handshake.d.ts +0 -56
  394. package/dist/types/modes/shared/agent-wire/host-tool-bridge.d.ts +0 -16
  395. package/dist/types/modes/shared/agent-wire/host-uri-bridge.d.ts +0 -17
  396. package/dist/types/modes/shared/agent-wire/protocol.d.ts +0 -25
  397. package/dist/types/modes/shared/agent-wire/responses.d.ts +0 -4
  398. package/dist/types/modes/shared/agent-wire/scopes.d.ts +0 -18
  399. package/dist/types/modes/shared/agent-wire/session-registry.d.ts +0 -25
  400. package/dist/types/modes/shared/agent-wire/ui-request-broker.d.ts +0 -42
  401. package/dist/types/modes/shared/agent-wire/ui-result.d.ts +0 -27
  402. package/dist/types/modes/shared/agent-wire/unattended-action-policy.d.ts +0 -29
  403. package/dist/types/modes/shared/agent-wire/unattended-audit.d.ts +0 -68
  404. package/dist/types/modes/shared/agent-wire/unattended-run-controller.d.ts +0 -166
  405. package/dist/types/modes/shared/agent-wire/unattended-session.d.ts +0 -127
  406. package/dist/types/notifications/config.d.ts +0 -132
  407. package/src/harness-control-plane/rpc-adapter.ts +0 -290
  408. package/src/modes/bridge/auth.ts +0 -41
  409. package/src/modes/bridge/bridge-client-bridge.ts +0 -47
  410. package/src/modes/bridge/bridge-mode.ts +0 -675
  411. package/src/modes/bridge/bridge-ui-context.ts +0 -200
  412. package/src/modes/bridge/event-stream.ts +0 -70
  413. package/src/modes/rpc/host-tools.ts +0 -1
  414. package/src/modes/rpc/host-uris.ts +0 -1
  415. package/src/modes/rpc/rpc-client.ts +0 -1166
  416. package/src/modes/rpc/rpc-mode.ts +0 -1029
  417. package/src/modes/rpc/rpc-socket-security.ts +0 -115
  418. package/src/modes/rpc/rpc-types.ts +0 -637
  419. package/src/modes/shared/agent-wire/command-contract.ts +0 -18
  420. package/src/modes/shared/agent-wire/command-dispatch.ts +0 -498
  421. package/src/modes/shared/agent-wire/command-validation.ts +0 -181
  422. package/src/modes/shared/agent-wire/handshake.ts +0 -157
  423. package/src/modes/shared/agent-wire/host-tool-bridge.ts +0 -197
  424. package/src/modes/shared/agent-wire/host-uri-bridge.ts +0 -236
  425. package/src/modes/shared/agent-wire/protocol.ts +0 -46
  426. package/src/modes/shared/agent-wire/responses.ts +0 -17
  427. package/src/modes/shared/agent-wire/scopes.ts +0 -94
  428. package/src/modes/shared/agent-wire/session-registry.ts +0 -109
  429. package/src/modes/shared/agent-wire/ui-request-broker.ts +0 -150
  430. package/src/modes/shared/agent-wire/ui-result.ts +0 -48
  431. package/src/modes/shared/agent-wire/unattended-action-policy.ts +0 -365
  432. package/src/modes/shared/agent-wire/unattended-audit.ts +0 -176
  433. package/src/modes/shared/agent-wire/unattended-run-controller.ts +0 -426
  434. package/src/modes/shared/agent-wire/unattended-session.ts +0 -528
  435. package/src/notifications/config.ts +0 -219
  436. package/src/notifications/index.ts +0 -1835
  437. package/src/notifications/telegram-daemon-cli.ts +0 -243
  438. package/src/tools/puppeteer/09_stealth_locale.txt +0 -46
  439. /package/dist/types/{notifications → sdk/bus}/attachment-registry.d.ts +0 -0
  440. /package/dist/types/{notifications → sdk/bus}/chat-adapters.d.ts +0 -0
  441. /package/dist/types/{notifications → sdk/bus}/daemon-paths.d.ts +0 -0
  442. /package/dist/types/{notifications → sdk/bus}/engine.d.ts +0 -0
  443. /package/dist/types/{notifications → sdk/bus}/helpers.d.ts +0 -0
  444. /package/dist/types/{notifications → sdk/bus}/lifecycle-commands.d.ts +0 -0
  445. /package/dist/types/{notifications → sdk/bus}/operator-runtime.d.ts +0 -0
  446. /package/dist/types/{notifications → sdk/bus}/rate-limit-pool.d.ts +0 -0
  447. /package/dist/types/{notifications → sdk/bus}/recent-activity.d.ts +0 -0
  448. /package/dist/types/{notifications → sdk/bus}/reply-sent-store.d.ts +0 -0
  449. /package/dist/types/{notifications → sdk/bus}/rich-draft.d.ts +0 -0
  450. /package/dist/types/{notifications → sdk/bus}/rich-render.d.ts +0 -0
  451. /package/dist/types/{notifications → sdk/bus}/threaded-inbound.d.ts +0 -0
  452. /package/dist/types/{notifications → sdk/bus}/threaded-render.d.ts +0 -0
  453. /package/src/{notifications → sdk/bus}/attachment-registry.ts +0 -0
  454. /package/src/{notifications → sdk/bus}/chat-adapters.ts +0 -0
  455. /package/src/{notifications → sdk/bus}/daemon-paths.ts +0 -0
  456. /package/src/{notifications → sdk/bus}/engine.ts +0 -0
  457. /package/src/{notifications → sdk/bus}/helpers.ts +0 -0
  458. /package/src/{notifications → sdk/bus}/operator-runtime.ts +0 -0
  459. /package/src/{notifications → sdk/bus}/rate-limit-pool.ts +0 -0
  460. /package/src/{notifications → sdk/bus}/recent-activity.ts +0 -0
  461. /package/src/{notifications → sdk/bus}/reply-sent-store.ts +0 -0
  462. /package/src/{notifications → sdk/bus}/rich-draft.ts +0 -0
  463. /package/src/{notifications → sdk/bus}/rich-render.ts +0 -0
  464. /package/src/{notifications → sdk/bus}/threaded-inbound.ts +0 -0
  465. /package/src/{notifications → sdk/bus}/threaded-render.ts +0 -0
@@ -0,0 +1,426 @@
1
+ import { createHash } from "node:crypto";
2
+ import * as fs from "node:fs/promises";
3
+ import * as path from "node:path";
4
+ import { Args, Command, Flags } from "@gajae-code/utils/cli";
5
+ import type { Args as ParsedArgs } from "../cli/args";
6
+ import { applyStartupModelProfiles, createSessionManager } from "../main";
7
+ import { initializeExtensions } from "../modes/runtime-init";
8
+ import { Broker } from "../sdk/broker/broker";
9
+ import {
10
+ type LifecycleTranscriptEvidence,
11
+ readSessionLifecycleLaunchRequest,
12
+ type SessionLifecycleLaunchRequest,
13
+ type SessionLifecycleTranscriptIdentity,
14
+ writeSessionLifecycleFailure,
15
+ writeSessionLifecycleReady,
16
+ } from "../sdk/broker/lifecycle";
17
+ import { processIncarnation } from "../sdk/broker/process-incarnation";
18
+ import { type CreateLifecycleAgentSessionResult, createLifecycleAgentSession } from "../sdk/lifecycle-session";
19
+ import {
20
+ normalizeSdkStartupFailure,
21
+ type SdkStartupFailure,
22
+ type SdkStartupRollbackResult,
23
+ SdkStartupRollbackTracker,
24
+ } from "../sdk/startup-capability";
25
+
26
+ import {
27
+ type CapturedSessionTranscriptSnapshot,
28
+ type ResumeSessionIdentity,
29
+ SessionManager,
30
+ } from "../session/session-manager";
31
+
32
+ export function lifecycleArgs(request: SessionLifecycleLaunchRequest, cwd: string, agentDir: string): ParsedArgs {
33
+ return {
34
+ messages: [],
35
+ fileArgs: [],
36
+ unknownFlags: new Map(),
37
+ ...(request.operation === "session.resume" ? { resume: request.sessionPath } : {}),
38
+ ...(request.modelPreset ? { mpreset: request.modelPreset } : {}),
39
+ ...(request.operation === "session.fork"
40
+ ? {
41
+ fork: request.sourceSessionPath ?? request.sourceSessionId,
42
+ sessionDir: SessionManager.getDefaultSessionDirReadOnly(cwd, agentDir),
43
+ }
44
+ : {}),
45
+ };
46
+ }
47
+
48
+ type LifecycleTranscriptSource = {
49
+ cwd: string;
50
+ path: string;
51
+ id: string;
52
+ identity: SessionLifecycleTranscriptIdentity;
53
+ };
54
+
55
+ function sameTranscriptIdentity(
56
+ actual: { dev: bigint; ino: bigint; size: number; mtimeMs: number; mtimeNs: bigint },
57
+ expected: SessionLifecycleTranscriptIdentity,
58
+ ): boolean {
59
+ return (
60
+ actual.dev.toString() === expected.dev &&
61
+ actual.ino.toString() === expected.ino &&
62
+ actual.size === expected.size &&
63
+ actual.mtimeMs === expected.mtimeMs &&
64
+ actual.mtimeNs.toString() === expected.mtimeNs
65
+ );
66
+ }
67
+
68
+ function lifecycleTranscriptSource(request: SessionLifecycleLaunchRequest, cwd: string): LifecycleTranscriptSource {
69
+ if (request.operation === "session.resume") {
70
+ return {
71
+ cwd,
72
+ path: request.sessionPath!,
73
+ id: request.sessionId,
74
+ identity: request.sessionIdentity!,
75
+ };
76
+ }
77
+ if (request.operation === "session.fork") {
78
+ return {
79
+ cwd: path.resolve(request.sourceCwd ?? cwd),
80
+ path: request.sourceSessionPath!,
81
+ id: request.sourceSessionId!,
82
+ identity: request.sourceSessionIdentity!,
83
+ };
84
+ }
85
+ throw new Error("A new lifecycle session has no persisted transcript authority.");
86
+ }
87
+
88
+ function verifyLifecycleTranscript(
89
+ request: SessionLifecycleLaunchRequest,
90
+ cwd: string,
91
+ agentDir: string,
92
+ ): LifecycleTranscriptSource {
93
+ const source = lifecycleTranscriptSource(request, cwd);
94
+ const inventory = SessionManager.inventorySessionsStrict(source.cwd, {
95
+ sessionDir: SessionManager.getDefaultSessionDir(source.cwd, agentDir),
96
+ });
97
+ if (inventory.kind !== "complete")
98
+ throw new Error("Lifecycle saved session storage could not be verified for the requested workspace.");
99
+ const matches = inventory.candidates.filter(
100
+ candidate =>
101
+ candidate.path === path.resolve(source.path) &&
102
+ candidate.id === source.id &&
103
+ sameTranscriptIdentity(candidate.identity, source.identity),
104
+ );
105
+ if (matches.length !== 1)
106
+ throw new Error("Lifecycle saved session authority changed before the session host started.");
107
+ return source;
108
+ }
109
+
110
+ function sameLifecycleTranscriptSnapshot(left: ResumeSessionIdentity, right: ResumeSessionIdentity): boolean {
111
+ return (
112
+ left.canonicalPath === right.canonicalPath &&
113
+ left.sessionId === right.sessionId &&
114
+ left.dev === right.dev &&
115
+ left.ino === right.ino &&
116
+ left.size === right.size &&
117
+ left.mtimeMs === right.mtimeMs &&
118
+ left.mtimeNs === right.mtimeNs &&
119
+ left.sha256 === right.sha256
120
+ );
121
+ }
122
+
123
+ function captureLifecycleTranscript(
124
+ request: SessionLifecycleLaunchRequest,
125
+ cwd: string,
126
+ agentDir: string,
127
+ ): CapturedSessionTranscriptSnapshot {
128
+ const source = verifyLifecycleTranscript(request, cwd, agentDir);
129
+ const captured = SessionManager.captureTranscriptStrict(source.path);
130
+ if (
131
+ captured.kind !== "captured" ||
132
+ captured.snapshot.sourcePath !== path.resolve(source.path) ||
133
+ captured.snapshot.identity.sessionId !== source.id ||
134
+ !sameTranscriptIdentity(captured.snapshot.identity, source.identity)
135
+ )
136
+ throw new Error("Lifecycle saved session authority changed before the session host consumed it.");
137
+ return captured.snapshot;
138
+ }
139
+
140
+ async function revalidateLifecycleTranscript(snapshot: ResumeSessionIdentity): Promise<void> {
141
+ const inspected = await SessionManager.inspectSessionTailReadOnly(snapshot.canonicalPath);
142
+ if (inspected.kind === "error" || !sameLifecycleTranscriptSnapshot(snapshot, inspected.identity))
143
+ throw new Error("Lifecycle saved session authority changed while the session host opened it.");
144
+ }
145
+
146
+ /** Opens lifecycle-authorized history without letting replacement content reach readiness. */
147
+ export async function openLifecycleSessionManager(
148
+ request: SessionLifecycleLaunchRequest,
149
+ cwd: string,
150
+ agentDir: string,
151
+ ): Promise<{ parsed: ParsedArgs; sessionManager: SessionManager | undefined }> {
152
+ const parsed = lifecycleArgs(request, cwd, agentDir);
153
+ if (request.operation === "session.create") {
154
+ return { parsed, sessionManager: await createSessionManager(parsed, cwd) };
155
+ }
156
+ const snapshot = captureLifecycleTranscript(request, cwd, agentDir);
157
+ let sessionManager: SessionManager | undefined;
158
+ if (request.operation === "session.resume") {
159
+ const opened = await SessionManager.openExistingStrict(snapshot.identity, parsed.sessionDir);
160
+ if (opened.kind === "error")
161
+ throw new Error("Lifecycle saved session authority changed while the session host opened it.");
162
+ sessionManager = opened.manager;
163
+ try {
164
+ await revalidateLifecycleTranscript(snapshot.identity);
165
+ } catch (error) {
166
+ await sessionManager.close();
167
+ throw error;
168
+ }
169
+ } else {
170
+ const forked = await SessionManager.forkFromCaptured(snapshot, cwd, parsed.sessionDir);
171
+ if (forked.kind === "error")
172
+ throw new Error("Lifecycle saved session authority changed while the session host forked it.");
173
+ sessionManager = forked.manager;
174
+ }
175
+ return { parsed, sessionManager };
176
+ }
177
+
178
+ /** Runs the same persisted AgentSession bootstrap used by the production CLI. */
179
+ export async function runSessionHost(
180
+ timing: {
181
+ now?: () => number;
182
+ sleep?: (ms: number) => Promise<void>;
183
+ cwd?: string;
184
+ processIncarnation?: (pid: number) => string | undefined;
185
+ } = {},
186
+ ): Promise<void> {
187
+ const now = timing.now ?? Date.now;
188
+ const sleep = timing.sleep ?? (async ms => await Bun.sleep(ms));
189
+ const readIncarnation = timing.processIncarnation ?? processIncarnation;
190
+ const request = readSessionLifecycleLaunchRequest(process.env.GJC_SDK_LIFECYCLE_REQUEST, now());
191
+ const agentDir = process.env.GJC_AGENT_DIR;
192
+ if (!agentDir) throw new Error("GJC_AGENT_DIR is required for sdk session-host-internal.");
193
+ const cwd = timing.cwd ?? process.cwd();
194
+ if ((await fs.realpath(request.cwd)) !== (await fs.realpath(cwd)))
195
+ throw new Error(`Lifecycle worktree mismatch: expected ${request.cwd}, got ${cwd}.`);
196
+ if (
197
+ process.env.GJC_STATE_ROOT !== undefined &&
198
+ path.resolve(process.env.GJC_STATE_ROOT) !== path.resolve(request.stateRoot)
199
+ )
200
+ throw new Error("Lifecycle state root does not match the broker-issued request.");
201
+ if (request.effectMarker && process.env.GJC_LIFECYCLE_REQUEST_ID !== request.effectMarker)
202
+ throw new Error("Lifecycle effect marker does not match the broker-issued request.");
203
+ if (!request.effectMarker) throw new Error("Lifecycle effect marker is required.");
204
+ const effectMarker = request.effectMarker;
205
+ const markerPath = path.join(request.stateRoot, "sdk", `${request.sessionId}.lifecycle.json`);
206
+ let marker: { pid?: unknown; effectMarker?: unknown; incarnation?: unknown } | undefined;
207
+ do {
208
+ try {
209
+ const candidate = JSON.parse(await fs.readFile(markerPath, "utf8")) as {
210
+ pid?: unknown;
211
+ effectMarker?: unknown;
212
+ incarnation?: unknown;
213
+ };
214
+ const incarnation = readIncarnation(process.pid);
215
+ if (
216
+ request.effectMarker &&
217
+ Number.isSafeInteger(candidate.pid) &&
218
+ candidate.pid === process.pid &&
219
+ typeof candidate.effectMarker === "string" &&
220
+ candidate.effectMarker === request.effectMarker &&
221
+ typeof candidate.incarnation === "string" &&
222
+ incarnation &&
223
+ candidate.incarnation === incarnation
224
+ )
225
+ marker = candidate;
226
+ } catch {
227
+ // Marker publication may be observed between write and rename; retry until cutoff.
228
+ }
229
+ if (!marker && now() < request.semanticReadyDeadlineAt)
230
+ await sleep(Math.min(10, Math.max(0, request.semanticReadyDeadlineAt - now())));
231
+ } while (!marker && now() < request.semanticReadyDeadlineAt);
232
+ if (!marker) throw new Error("Lifecycle owner-bound marker authority was not published before readiness cutoff.");
233
+ const incarnation = readIncarnation(process.pid);
234
+ if (!incarnation) throw new Error("Lifecycle owner-bound marker authority is invalid.");
235
+
236
+ const writeFailure = async (
237
+ failure: SdkStartupFailure,
238
+ rollback: SdkStartupRollbackResult,
239
+ transcript?: LifecycleTranscriptEvidence,
240
+ ): Promise<void> => {
241
+ if (!request.effectMarker) return;
242
+ await writeSessionLifecycleFailure(
243
+ request.stateRoot,
244
+ request.sessionId,
245
+ effectMarker,
246
+ failure,
247
+ rollback,
248
+ transcript,
249
+ incarnation,
250
+ );
251
+ };
252
+
253
+ if (now() >= request.semanticReadyDeadlineAt) {
254
+ const absent = new SdkStartupRollbackTracker();
255
+ absent.recordAbsent();
256
+ await writeFailure(
257
+ {
258
+ phase: "startup",
259
+ reason: "pending",
260
+ message: "SDK startup did not complete before readiness cutoff.",
261
+ },
262
+ absent.result,
263
+ );
264
+
265
+ throw new Error("SDK startup did not complete before readiness cutoff.");
266
+ }
267
+
268
+ let opened: { parsed: ParsedArgs; sessionManager: SessionManager | undefined };
269
+ let created: CreateLifecycleAgentSessionResult;
270
+ try {
271
+ opened = await openLifecycleSessionManager(request, cwd, agentDir);
272
+ created = await createLifecycleAgentSession({ cwd, agentDir, sessionManager: opened.sessionManager });
273
+ } catch (error) {
274
+ const rollback = new SdkStartupRollbackTracker();
275
+ rollback.recordAbsent();
276
+ const failure = normalizeSdkStartupFailure("registration", "failed", error);
277
+ await writeFailure(failure, rollback.result);
278
+ throw new Error(failure.message);
279
+ }
280
+ const { parsed } = opened;
281
+ if ("failure" in created) {
282
+ created.rollback.recordAbsent();
283
+ await writeFailure(created.failure, created.rollback.result);
284
+
285
+ throw new Error(created.failure.message);
286
+ }
287
+ const { session, capability, rollback } = created;
288
+ let sessionDisposal: Promise<void> | undefined;
289
+ const disposeSession = (): Promise<void> => {
290
+ sessionDisposal ??= session.dispose().catch(() => {});
291
+ return sessionDisposal;
292
+ };
293
+ let disposal: Promise<LifecycleTranscriptEvidence | undefined> | undefined;
294
+ const disposeAndCapture = (): Promise<LifecycleTranscriptEvidence | undefined> => {
295
+ disposal ??= (async () => {
296
+ await disposeSession();
297
+ try {
298
+ await session.sessionManager.ensureOnDisk();
299
+ const transcriptPath = session.sessionManager.getSessionFile();
300
+ if (!transcriptPath) return undefined;
301
+ const [bytes, stat] = await Promise.all([
302
+ fs.readFile(transcriptPath),
303
+ fs.stat(transcriptPath, { bigint: true }),
304
+ ]);
305
+ return {
306
+ digest: createHash("sha256").update(bytes).digest("hex"),
307
+ identity: {
308
+ dev: stat.dev.toString(),
309
+ ino: stat.ino.toString(),
310
+ size: Number(stat.size),
311
+ mtimeMs: Number(stat.mtimeMs),
312
+ mtimeNs: stat.mtimeNs.toString(),
313
+ },
314
+ };
315
+ } catch {
316
+ return undefined;
317
+ }
318
+ })();
319
+ return disposal;
320
+ };
321
+ let failureRollback: Promise<void> | undefined;
322
+ const failAfterRollback = (failure: SdkStartupFailure): Promise<void> => {
323
+ failureRollback ??= (async () => {
324
+ const transcript = await disposeAndCapture();
325
+ if (rollback.generation === undefined) rollback.recordAbsent();
326
+ await writeFailure(failure, rollback.result, transcript);
327
+ })();
328
+ return failureRollback;
329
+ };
330
+ const stop = () => {
331
+ if (capability.result?.status === "started") {
332
+ void disposeSession().finally(() => process.exit(0));
333
+ return;
334
+ }
335
+ const failure = capability.normalizeFailure("startup", "failed", "SDK lifecycle host terminated.");
336
+ capability.cancel();
337
+ void failAfterRollback(failure).finally(() => process.exit(0));
338
+ };
339
+ const cutoffFailure = (): SdkStartupFailure => capability.normalizeFailure("startup", "pending");
340
+ const throwIfCutoff = (): void => {
341
+ if (now() >= request.semanticReadyDeadlineAt) {
342
+ capability.cancel();
343
+ throw cutoffFailure();
344
+ }
345
+ };
346
+ const cutoff = sleep(Math.max(0, request.semanticReadyDeadlineAt - now())).then(() => ({ cutoff: true }) as const);
347
+ const beforeCutoff = async <T>(stage: Promise<T>): Promise<T> => {
348
+ const result = await Promise.race([stage.then(value => ({ cutoff: false, value }) as const), cutoff]);
349
+ if (result.cutoff) {
350
+ capability.cancel();
351
+ throw cutoffFailure();
352
+ }
353
+ return result.value;
354
+ };
355
+
356
+ try {
357
+ const modelProfileStartup =
358
+ process.env.GJC_SDK_TEST_HANG_MODEL_PROFILE === cwd
359
+ ? new Promise<void>(() => {})
360
+ : applyStartupModelProfiles({
361
+ session,
362
+ settings: session.settings,
363
+ modelRegistry: session.modelRegistry,
364
+ parsedArgs: parsed,
365
+ });
366
+ await beforeCutoff(modelProfileStartup);
367
+ throwIfCutoff();
368
+ await beforeCutoff(
369
+ initializeExtensions(session, {
370
+ reportSendError: () => {},
371
+ reportRuntimeError: () => {},
372
+ onShutdown: stop,
373
+ }),
374
+ );
375
+ throwIfCutoff();
376
+ if (session.sessionManager.getSessionId() !== request.sessionId)
377
+ throw new Error(
378
+ `Lifecycle session id mismatch: expected ${request.sessionId}, got ${session.sessionManager.getSessionId()}.`,
379
+ );
380
+ const startup = await beforeCutoff(capability.promise);
381
+ if (startup.status !== "started") throw startup.failure;
382
+ throwIfCutoff();
383
+ if (process.env.GJC_SDK_TEST_FAIL_AFTER_REGISTRATION === cwd)
384
+ throw new Error("Lifecycle test failure after SDK host registration.");
385
+
386
+ await session.sessionManager.ensureOnDisk();
387
+ throwIfCutoff();
388
+
389
+ await writeSessionLifecycleReady(request.stateRoot, request.sessionId, effectMarker);
390
+ } catch (error) {
391
+ const failure =
392
+ error && typeof error === "object" && "phase" in error && "reason" in error && "message" in error
393
+ ? (error as SdkStartupFailure)
394
+ : capability.normalizeFailure("startup", "failed", error);
395
+ const settled = capability.settleFailure(failure);
396
+ const durableFailure = settled.status === "failed" ? settled.failure : failure;
397
+ await failAfterRollback(durableFailure);
398
+ throw error;
399
+ }
400
+ process.once("SIGTERM", stop);
401
+ process.once("SIGINT", stop);
402
+ await new Promise<void>(() => {});
403
+ }
404
+
405
+ export default class Sdk extends Command {
406
+ static description = "SDK internal services";
407
+ static hidden = true;
408
+ static args = { action: Args.string({ required: true, options: ["broker-internal", "session-host-internal"] }) };
409
+ static flags = { "agent-dir": Flags.string({ description: "Internal broker agent directory" }) };
410
+ async run(): Promise<void> {
411
+ const { args, flags } = await this.parse(Sdk);
412
+ if (args.action === "session-host-internal") {
413
+ await runSessionHost();
414
+ return;
415
+ }
416
+ const agentDir = flags["agent-dir"] as string | undefined;
417
+ if (!agentDir) throw new Error("--agent-dir is required for sdk broker-internal.");
418
+ const broker = new Broker({ agentDir });
419
+ await broker.start();
420
+ if (!broker.ownsDiscovery) return;
421
+ const stop = () => void broker.stop().finally(() => process.exit(0));
422
+ process.once("SIGTERM", stop);
423
+ process.once("SIGINT", stop);
424
+ await new Promise<void>(() => {});
425
+ }
426
+ }
@@ -65,6 +65,7 @@ export async function runCommitAgentSession(input: CommitAgentInput): Promise<Co
65
65
  enableLsp: false,
66
66
  enableMCP: false,
67
67
  hasUI: false,
68
+ notificationHostModeSupported: false,
68
69
  spawns,
69
70
  toolNames: ["__none__"],
70
71
  contextFiles: input.contextFiles,