@gajae-code/coding-agent 0.10.1 → 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 (474) hide show
  1. package/CHANGELOG.md +70 -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/gajae-pet-widget.d.ts +1 -0
  54. package/dist/types/modes/components/model-selector.d.ts +1 -0
  55. package/dist/types/modes/components/notifications-settings-editor.d.ts +135 -0
  56. package/dist/types/modes/components/pet-capability.d.ts +37 -0
  57. package/dist/types/modes/components/pet-selector.d.ts +1 -1
  58. package/dist/types/modes/components/settings-selector.d.ts +15 -4
  59. package/dist/types/modes/components/welcome.d.ts +1 -1
  60. package/dist/types/modes/controllers/selector-controller.d.ts +35 -1
  61. package/dist/types/modes/index.d.ts +0 -4
  62. package/dist/types/modes/interactive-mode.d.ts +5 -1
  63. package/dist/types/modes/runtime-init.d.ts +2 -2
  64. package/dist/types/modes/shared/agent-wire/approval-gate.d.ts +6 -9
  65. package/dist/types/modes/shared/agent-wire/deep-interview-gate.d.ts +4 -6
  66. package/dist/types/modes/shared/agent-wire/event-contract.d.ts +6 -6
  67. package/dist/types/modes/shared/agent-wire/event-envelope.d.ts +4 -9
  68. package/dist/types/modes/shared/agent-wire/event-observation.d.ts +1 -1
  69. package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +169 -30
  70. package/dist/types/modes/shared/agent-wire/workflow-gate-schema.d.ts +7 -7
  71. package/dist/types/modes/shared/agent-wire/workflow-gate-types.d.ts +105 -0
  72. package/dist/types/modes/types.d.ts +16 -1
  73. package/dist/types/runtime-mcp/client.d.ts +2 -0
  74. package/dist/types/runtime-mcp/config.d.ts +5 -1
  75. package/dist/types/runtime-mcp/manager.d.ts +8 -1
  76. package/dist/types/runtime-mcp/types.d.ts +4 -0
  77. package/dist/types/sdk/acp/adapter.d.ts +67 -0
  78. package/dist/types/sdk/acp/index.d.ts +2 -0
  79. package/dist/types/sdk/broker/broker.d.ts +53 -0
  80. package/dist/types/sdk/broker/discovery.d.ts +30 -0
  81. package/dist/types/sdk/broker/ensure.d.ts +33 -0
  82. package/dist/types/sdk/broker/identity.d.ts +3 -0
  83. package/dist/types/sdk/broker/index.d.ts +8 -0
  84. package/dist/types/sdk/broker/lifecycle-ledger.d.ts +95 -0
  85. package/dist/types/sdk/broker/lifecycle.d.ts +85 -0
  86. package/dist/types/sdk/broker/process-incarnation.d.ts +14 -0
  87. package/dist/types/sdk/broker/runtime.d.ts +33 -0
  88. package/dist/types/sdk/broker/session-index.d.ts +57 -0
  89. package/dist/types/sdk/broker/state-version.d.ts +8 -0
  90. package/dist/types/sdk/broker/transport.d.ts +9 -0
  91. package/dist/types/sdk/bus/chat-command-policy.d.ts +49 -0
  92. package/dist/types/sdk/bus/chat-daemon-cli.d.ts +21 -0
  93. package/dist/types/sdk/bus/chat-daemon-control.d.ts +111 -0
  94. package/dist/types/sdk/bus/chat-daemon-runtime.d.ts +77 -0
  95. package/dist/types/sdk/bus/chat-effect-journal.d.ts +84 -0
  96. package/dist/types/{notifications → sdk/bus}/config-commands.d.ts +7 -2
  97. package/dist/types/sdk/bus/config.d.ts +274 -0
  98. package/dist/types/sdk/bus/conversation-store.d.ts +72 -0
  99. package/dist/types/sdk/bus/discord-conversation.d.ts +58 -0
  100. package/dist/types/sdk/bus/discord-daemon.d.ts +45 -0
  101. package/dist/types/sdk/bus/discord-live-provider.d.ts +70 -0
  102. package/dist/types/sdk/bus/discord-provider.d.ts +85 -0
  103. package/dist/types/{notifications → sdk/bus}/html-format.d.ts +2 -2
  104. package/dist/types/{notifications → sdk/bus}/index.d.ts +113 -13
  105. package/dist/types/{notifications → sdk/bus}/lifecycle-control-runtime.d.ts +4 -2
  106. package/dist/types/{notifications → sdk/bus}/lifecycle-orchestrator.d.ts +18 -21
  107. package/dist/types/{notifications → sdk/bus}/managed-daemon.d.ts +1 -1
  108. package/dist/types/sdk/bus/native-runtime-compatibility.d.ts +13 -0
  109. package/dist/types/sdk/bus/notification-orchestration.d.ts +170 -0
  110. package/dist/types/{notifications → sdk/bus}/notification-service.d.ts +7 -1
  111. package/dist/types/sdk/bus/session-control.d.ts +83 -0
  112. package/dist/types/sdk/bus/slack-conversation.d.ts +56 -0
  113. package/dist/types/sdk/bus/slack-daemon.d.ts +60 -0
  114. package/dist/types/sdk/bus/slack-live-provider.d.ts +59 -0
  115. package/dist/types/sdk/bus/slack-provider.d.ts +55 -0
  116. package/dist/types/{notifications → sdk/bus}/telegram-cli.d.ts +4 -4
  117. package/dist/types/{notifications → sdk/bus}/telegram-daemon-cli.d.ts +14 -5
  118. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +12 -0
  119. package/dist/types/{notifications → sdk/bus}/telegram-daemon-control.d.ts +2 -2
  120. package/dist/types/{notifications → sdk/bus}/telegram-daemon.d.ts +55 -17
  121. package/dist/types/{notifications → sdk/bus}/telegram-reference.d.ts +2 -2
  122. package/dist/types/sdk/bus/telegram-setup.d.ts +128 -0
  123. package/dist/types/{notifications → sdk/bus}/topic-registry.d.ts +11 -0
  124. package/dist/types/sdk/cli/index.d.ts +1 -0
  125. package/dist/types/sdk/cli/session-cli.d.ts +19 -0
  126. package/dist/types/sdk/client/client.d.ts +1 -0
  127. package/dist/types/sdk/client/discovery.d.ts +27 -0
  128. package/dist/types/sdk/client/index.d.ts +2 -0
  129. package/dist/types/sdk/host/control/dispatch.d.ts +34 -0
  130. package/dist/types/sdk/host/control/index.d.ts +2 -0
  131. package/dist/types/sdk/host/control/operations.d.ts +65 -0
  132. package/dist/types/sdk/host/events.d.ts +35 -0
  133. package/dist/types/sdk/host/host.d.ts +35 -0
  134. package/dist/types/sdk/host/index.d.ts +4 -0
  135. package/dist/types/sdk/host/query/cursor.d.ts +62 -0
  136. package/dist/types/sdk/host/query/handlers.d.ts +70 -0
  137. package/dist/types/sdk/host/query/index.d.ts +3 -0
  138. package/dist/types/sdk/host/query/revision-store.d.ts +60 -0
  139. package/dist/types/sdk/host/reverse-leases.d.ts +45 -0
  140. package/dist/types/sdk/host/types.d.ts +32 -0
  141. package/dist/types/sdk/index.d.ts +6 -0
  142. package/dist/types/sdk/lifecycle-session.d.ts +14 -0
  143. package/dist/types/sdk/mcp/index.d.ts +1 -0
  144. package/dist/types/sdk/mcp/server.d.ts +37 -0
  145. package/dist/types/sdk/models.d.ts +44 -0
  146. package/dist/types/sdk/protocol/adapter-validation.d.ts +14 -0
  147. package/dist/types/sdk/protocol/operation-registry.d.ts +24 -0
  148. package/dist/types/{sdk.d.ts → sdk/session.d.ts} +44 -38
  149. package/dist/types/sdk/startup-capability.d.ts +50 -0
  150. package/dist/types/session/agent-session.d.ts +114 -21
  151. package/dist/types/session/default-model-selection.d.ts +25 -0
  152. package/dist/types/session/fallback-chain-controller.d.ts +52 -0
  153. package/dist/types/session/session-manager.d.ts +58 -1
  154. package/dist/types/setup/credential-auto-import.d.ts +36 -6
  155. package/dist/types/tools/ask-answer-registry.d.ts +1 -1
  156. package/dist/types/tools/browser/benchmark/detector-report.d.ts +63 -0
  157. package/dist/types/tools/browser/benchmark/run-suite.d.ts +18 -0
  158. package/dist/types/tools/browser/launch.d.ts +22 -0
  159. package/dist/types/tools/browser/profile-discovery.d.ts +31 -0
  160. package/dist/types/tools/browser/profile-posture.d.ts +37 -0
  161. package/dist/types/tools/browser/profile-reuse.d.ts +39 -0
  162. package/dist/types/tools/browser/profile-warmup.d.ts +39 -0
  163. package/dist/types/tools/browser/registry.d.ts +19 -0
  164. package/dist/types/tools/browser/tab-protocol.d.ts +4 -0
  165. package/dist/types/tools/index.d.ts +8 -8
  166. package/package.json +34 -13
  167. package/scripts/build-sdk-package-smoke.ts +94 -0
  168. package/scripts/capture-notifications-settings-showcase.ts +435 -0
  169. package/scripts/compile-args.ts +4 -2
  170. package/scripts/g005-daemon-smoke.ts +4 -5
  171. package/scripts/g011-daemon-path-smoke.ts +5 -5
  172. package/scripts/generate-sdk-adapter-parity-manifest.ts +163 -0
  173. package/scripts/generate-sdk-operation-inventory.ts +867 -0
  174. package/scripts/generate-telegram-baseline-manifest.ts +128 -0
  175. package/scripts/manifest-schema.ts +124 -0
  176. package/scripts/run-test-manifest.ts +153 -0
  177. package/scripts/run-threat-model-check.ts +157 -0
  178. package/scripts/verify-gjc-sdk-canonicalization.ts +3467 -0
  179. package/scripts/verify-gjc-sdk-rename.ts +90 -0
  180. package/src/append-only-mode.ts +1 -1
  181. package/src/cli/args.ts +43 -12
  182. package/src/cli/auth-gateway-cli.ts +2 -2
  183. package/src/cli/config-cli.ts +2 -1
  184. package/src/cli/daemon-cli.ts +63 -14
  185. package/src/cli/list-models.ts +1 -1
  186. package/src/cli/notify-cli.ts +288 -286
  187. package/src/cli.ts +21 -2
  188. package/src/commands/daemon.ts +50 -6
  189. package/src/commands/harness.ts +93 -36
  190. package/src/commands/launch.ts +5 -2
  191. package/src/commands/mcp-serve.ts +19 -12
  192. package/src/commands/notify.ts +36 -3
  193. package/src/commands/sdk.ts +426 -0
  194. package/src/commit/agentic/agent.ts +1 -0
  195. package/src/config/atomic-yaml-patch.ts +423 -0
  196. package/src/config/model-profile-activation.ts +240 -89
  197. package/src/config/model-profiles.ts +37 -34
  198. package/src/config/model-registry.ts +51 -26
  199. package/src/config/model-resolver.ts +138 -51
  200. package/src/config/model-selector-value.ts +50 -0
  201. package/src/config/models-config-schema.ts +14 -21
  202. package/src/config/settings-schema.ts +128 -10
  203. package/src/config/settings.ts +1120 -158
  204. package/src/coordinator-mcp/model-preset.ts +74 -20
  205. package/src/coordinator-mcp/server.ts +1597 -3052
  206. package/src/daemon/builtin.ts +8 -5
  207. package/src/daemon/control-types.ts +1 -1
  208. package/src/defaults/gjc/skills/team/SKILL.md +4 -4
  209. package/src/discovery/mcp-json.ts +327 -20
  210. package/src/extensibility/custom-tools/types.ts +1 -1
  211. package/src/extensibility/extensions/compact-handler.ts +3 -3
  212. package/src/extensibility/extensions/get-commands-handler.ts +2 -2
  213. package/src/extensibility/extensions/loader.ts +69 -5
  214. package/src/extensibility/extensions/runner.ts +112 -4
  215. package/src/extensibility/extensions/types.ts +176 -17
  216. package/src/extensibility/hooks/types.ts +1 -1
  217. package/src/extensibility/slash-commands.ts +3 -3
  218. package/src/gjc-runtime/launch-tmux.ts +170 -86
  219. package/src/gjc-runtime/psmux-detect.ts +82 -4
  220. package/src/gjc-runtime/session-state-sidecar.ts +41 -31
  221. package/src/gjc-runtime/team-runtime.ts +54 -35
  222. package/src/gjc-runtime/tmux-owner-isolation-cli.ts +53 -17
  223. package/src/gjc-runtime/tmux-owner-isolation.ts +5 -2
  224. package/src/gjc-runtime/tmux-sessions.ts +19 -13
  225. package/src/gjc-runtime/ultragoal-guard.ts +53 -6
  226. package/src/gjc-runtime/ultragoal-runtime.ts +155 -3
  227. package/src/gjc-runtime/windows-powershell-command.ts +58 -0
  228. package/src/harness-control-plane/operate.ts +9 -9
  229. package/src/harness-control-plane/owner.ts +283 -39
  230. package/src/harness-control-plane/receipts.ts +0 -1
  231. package/src/harness-control-plane/sdk-transport.ts +395 -0
  232. package/src/harness-control-plane/session-transport.ts +94 -0
  233. package/src/harness-control-plane/types.ts +1 -1
  234. package/src/internal-urls/docs-index.generated.ts +36 -37
  235. package/src/lsp/client.ts +42 -6
  236. package/src/lsp/index.ts +2 -2
  237. package/src/main.ts +299 -204
  238. package/src/modes/DESIGN.md +258 -0
  239. package/src/modes/acp/acp-agent.ts +1228 -2612
  240. package/src/modes/acp/acp-client-bridge.ts +2 -20
  241. package/src/modes/acp/acp-event-mapper.ts +18 -2
  242. package/src/modes/acp/acp-mode.ts +8 -36
  243. package/src/modes/acp/permission-mode.ts +25 -0
  244. package/src/modes/acp/startup-options.ts +6 -0
  245. package/src/modes/components/agent-dashboard.ts +37 -17
  246. package/src/modes/components/custom-editor.ts +1 -0
  247. package/src/modes/components/gajae-pet-widget.ts +169 -20
  248. package/src/modes/components/model-selector.ts +93 -35
  249. package/src/modes/components/notifications-settings-editor.ts +1379 -0
  250. package/src/modes/components/pet-capability.ts +115 -0
  251. package/src/modes/components/pet-selector.ts +4 -6
  252. package/src/modes/components/settings-selector.ts +86 -11
  253. package/src/modes/components/welcome.ts +4 -4
  254. package/src/modes/controllers/command-controller.ts +1 -2
  255. package/src/modes/controllers/event-controller.ts +11 -16
  256. package/src/modes/controllers/extension-ui-controller.ts +357 -12
  257. package/src/modes/controllers/input-controller.ts +43 -13
  258. package/src/modes/controllers/selector-controller.ts +671 -44
  259. package/src/modes/index.ts +0 -22
  260. package/src/modes/interactive-mode.ts +108 -24
  261. package/src/modes/runtime-init.ts +298 -6
  262. package/src/modes/shared/agent-wire/approval-gate.ts +9 -11
  263. package/src/modes/shared/agent-wire/deep-interview-gate.ts +10 -11
  264. package/src/modes/shared/agent-wire/event-contract.ts +7 -8
  265. package/src/modes/shared/agent-wire/event-envelope.ts +9 -17
  266. package/src/modes/shared/agent-wire/event-observation.ts +16 -7
  267. package/src/modes/shared/agent-wire/workflow-gate-broker.ts +1254 -87
  268. package/src/modes/shared/agent-wire/workflow-gate-schema.ts +15 -15
  269. package/src/modes/shared/agent-wire/workflow-gate-types.ts +113 -0
  270. package/src/modes/types.ts +16 -1
  271. package/src/runtime-mcp/client.ts +94 -19
  272. package/src/runtime-mcp/config.ts +27 -15
  273. package/src/runtime-mcp/manager.ts +343 -105
  274. package/src/runtime-mcp/oauth-flow.ts +42 -12
  275. package/src/runtime-mcp/transports/http.ts +49 -19
  276. package/src/runtime-mcp/transports/stdio.ts +47 -28
  277. package/src/runtime-mcp/types.ts +10 -0
  278. package/src/sdk/acp/adapter.ts +418 -0
  279. package/src/sdk/acp/index.ts +2 -0
  280. package/src/sdk/broker/broker.ts +642 -0
  281. package/src/sdk/broker/discovery.ts +94 -0
  282. package/src/sdk/broker/ensure.ts +249 -0
  283. package/src/sdk/broker/identity.ts +42 -0
  284. package/src/sdk/broker/index.ts +8 -0
  285. package/src/sdk/broker/internal-source-marker-2178.txt +1 -0
  286. package/src/sdk/broker/internal-source.bunfig.toml +1 -0
  287. package/src/sdk/broker/lifecycle-ledger.ts +286 -0
  288. package/src/sdk/broker/lifecycle.ts +2157 -0
  289. package/src/sdk/broker/process-incarnation.ts +159 -0
  290. package/src/sdk/broker/runtime.ts +164 -0
  291. package/src/sdk/broker/session-index.ts +318 -0
  292. package/src/sdk/broker/state-version.ts +23 -0
  293. package/src/sdk/broker/transport.ts +125 -0
  294. package/src/sdk/bus/chat-command-policy.ts +107 -0
  295. package/src/sdk/bus/chat-daemon-cli.ts +214 -0
  296. package/src/sdk/bus/chat-daemon-control.ts +713 -0
  297. package/src/sdk/bus/chat-daemon-runtime.ts +526 -0
  298. package/src/sdk/bus/chat-effect-journal.ts +353 -0
  299. package/src/{notifications → sdk/bus}/config-commands.ts +39 -10
  300. package/src/sdk/bus/config.ts +433 -0
  301. package/src/sdk/bus/conversation-store.ts +391 -0
  302. package/src/sdk/bus/discord-conversation.ts +85 -0
  303. package/src/sdk/bus/discord-daemon.ts +2275 -0
  304. package/src/sdk/bus/discord-live-provider.ts +521 -0
  305. package/src/sdk/bus/discord-provider.ts +56 -0
  306. package/src/{notifications → sdk/bus}/html-format.ts +2 -2
  307. package/src/sdk/bus/index.ts +3943 -0
  308. package/src/{notifications → sdk/bus}/lifecycle-commands.ts +2 -0
  309. package/src/{notifications → sdk/bus}/lifecycle-control-runtime.ts +225 -196
  310. package/src/{notifications → sdk/bus}/lifecycle-orchestrator.ts +161 -74
  311. package/src/{notifications → sdk/bus}/managed-daemon.ts +2 -2
  312. package/src/sdk/bus/native-runtime-compatibility.ts +42 -0
  313. package/src/sdk/bus/natives-augment.d.ts +38 -0
  314. package/src/sdk/bus/notification-orchestration.ts +535 -0
  315. package/src/{notifications → sdk/bus}/notification-service.ts +106 -12
  316. package/src/sdk/bus/session-control.ts +333 -0
  317. package/src/sdk/bus/slack-conversation.ts +74 -0
  318. package/src/sdk/bus/slack-daemon.ts +2144 -0
  319. package/src/sdk/bus/slack-live-provider.ts +380 -0
  320. package/src/sdk/bus/slack-provider.ts +76 -0
  321. package/src/{notifications → sdk/bus}/telegram-cli.ts +8 -8
  322. package/src/sdk/bus/telegram-daemon-cli.ts +330 -0
  323. package/src/sdk/bus/telegram-daemon-contract.ts +14 -0
  324. package/src/{notifications → sdk/bus}/telegram-daemon-control.ts +4 -4
  325. package/src/{notifications → sdk/bus}/telegram-daemon.ts +502 -54
  326. package/src/{notifications → sdk/bus}/telegram-reference.ts +2 -2
  327. package/src/sdk/bus/telegram-setup.ts +663 -0
  328. package/src/{notifications → sdk/bus}/topic-registry.ts +32 -0
  329. package/src/sdk/cli/index.ts +1 -0
  330. package/src/sdk/cli/session-cli.ts +275 -0
  331. package/src/sdk/client/client.ts +1 -0
  332. package/src/sdk/client/discovery.ts +108 -0
  333. package/src/sdk/client/index.ts +2 -0
  334. package/src/sdk/host/control/dispatch.ts +367 -0
  335. package/src/sdk/host/control/index.ts +10 -0
  336. package/src/sdk/host/control/operations.ts +63 -0
  337. package/src/sdk/host/events.ts +91 -0
  338. package/src/sdk/host/host.ts +296 -0
  339. package/src/sdk/host/index.ts +4 -0
  340. package/src/sdk/host/query/cursor.ts +189 -0
  341. package/src/sdk/host/query/handlers.ts +533 -0
  342. package/src/sdk/host/query/index.ts +3 -0
  343. package/src/sdk/host/query/revision-store.ts +1126 -0
  344. package/src/sdk/host/reverse-leases.ts +325 -0
  345. package/src/sdk/host/types.ts +29 -0
  346. package/src/sdk/index.ts +13 -0
  347. package/src/sdk/lifecycle-session.ts +39 -0
  348. package/src/sdk/mcp/index.ts +1 -0
  349. package/src/sdk/mcp/server.ts +332 -0
  350. package/src/sdk/models.ts +168 -0
  351. package/src/sdk/protocol/adapter-validation.ts +48 -0
  352. package/src/sdk/protocol/operation-inventory.generated.json +5654 -0
  353. package/src/sdk/protocol/operation-registry.ts +312 -0
  354. package/src/{sdk.ts → sdk/session.ts} +339 -212
  355. package/src/sdk/startup-capability.ts +189 -0
  356. package/src/session/agent-session.ts +2470 -866
  357. package/src/session/default-model-selection.ts +93 -0
  358. package/src/session/fallback-chain-controller.ts +136 -0
  359. package/src/session/session-manager.ts +447 -13
  360. package/src/session/session-storage.ts +8 -1
  361. package/src/setup/credential-auto-import.ts +290 -35
  362. package/src/setup/hermes/templates/operator-instructions.v1.md +3 -5
  363. package/src/slash-commands/builtin-registry.ts +33 -30
  364. package/src/task/executor.ts +62 -13
  365. package/src/tools/ask-answer-registry.ts +1 -1
  366. package/src/tools/ask.ts +13 -8
  367. package/src/tools/browser/STEALTH-THIRD-PARTY-NOTICES.md +26 -0
  368. package/src/tools/browser/benchmark/detector-report.ts +157 -0
  369. package/src/tools/browser/benchmark/run-suite.ts +39 -0
  370. package/src/tools/browser/launch.ts +124 -19
  371. package/src/tools/browser/profile-discovery.ts +63 -0
  372. package/src/tools/browser/profile-posture.ts +59 -0
  373. package/src/tools/browser/profile-reuse.ts +102 -0
  374. package/src/tools/browser/profile-warmup.ts +109 -0
  375. package/src/tools/browser/registry.ts +87 -11
  376. package/src/tools/browser/tab-protocol.ts +1 -0
  377. package/src/tools/browser/tab-supervisor.ts +1 -0
  378. package/src/tools/browser/tab-worker.ts +1 -1
  379. package/src/tools/browser.ts +6 -0
  380. package/src/tools/index.ts +8 -8
  381. package/src/tools/puppeteer/14_stealth_permissions.txt +57 -0
  382. package/src/tools/puppeteer/15_stealth_webrtc.txt +60 -0
  383. package/src/tools/telegram-send.ts +2 -2
  384. package/vendor/insane-search/MANIFEST.json +2 -1
  385. package/vendor/insane-search/engine/bias_check.py +4 -1
  386. package/vendor/insane-search/engine/phase0.py +26 -1
  387. package/dist/types/harness-control-plane/rpc-adapter.d.ts +0 -69
  388. package/dist/types/modes/bridge/auth.d.ts +0 -12
  389. package/dist/types/modes/bridge/bridge-client-bridge.d.ts +0 -9
  390. package/dist/types/modes/bridge/bridge-mode.d.ts +0 -47
  391. package/dist/types/modes/bridge/bridge-ui-context.d.ts +0 -88
  392. package/dist/types/modes/bridge/event-stream.d.ts +0 -8
  393. package/dist/types/modes/rpc/host-tools.d.ts +0 -1
  394. package/dist/types/modes/rpc/host-uris.d.ts +0 -1
  395. package/dist/types/modes/rpc/rpc-client.d.ts +0 -299
  396. package/dist/types/modes/rpc/rpc-mode.d.ts +0 -86
  397. package/dist/types/modes/rpc/rpc-socket-security.d.ts +0 -10
  398. package/dist/types/modes/rpc/rpc-types.d.ts +0 -810
  399. package/dist/types/modes/shared/agent-wire/command-contract.d.ts +0 -18
  400. package/dist/types/modes/shared/agent-wire/command-dispatch.d.ts +0 -37
  401. package/dist/types/modes/shared/agent-wire/command-validation.d.ts +0 -2
  402. package/dist/types/modes/shared/agent-wire/handshake.d.ts +0 -56
  403. package/dist/types/modes/shared/agent-wire/host-tool-bridge.d.ts +0 -16
  404. package/dist/types/modes/shared/agent-wire/host-uri-bridge.d.ts +0 -17
  405. package/dist/types/modes/shared/agent-wire/protocol.d.ts +0 -25
  406. package/dist/types/modes/shared/agent-wire/responses.d.ts +0 -4
  407. package/dist/types/modes/shared/agent-wire/scopes.d.ts +0 -18
  408. package/dist/types/modes/shared/agent-wire/session-registry.d.ts +0 -25
  409. package/dist/types/modes/shared/agent-wire/ui-request-broker.d.ts +0 -42
  410. package/dist/types/modes/shared/agent-wire/ui-result.d.ts +0 -27
  411. package/dist/types/modes/shared/agent-wire/unattended-action-policy.d.ts +0 -29
  412. package/dist/types/modes/shared/agent-wire/unattended-audit.d.ts +0 -68
  413. package/dist/types/modes/shared/agent-wire/unattended-run-controller.d.ts +0 -166
  414. package/dist/types/modes/shared/agent-wire/unattended-session.d.ts +0 -127
  415. package/dist/types/notifications/config.d.ts +0 -132
  416. package/src/harness-control-plane/rpc-adapter.ts +0 -290
  417. package/src/modes/bridge/auth.ts +0 -41
  418. package/src/modes/bridge/bridge-client-bridge.ts +0 -47
  419. package/src/modes/bridge/bridge-mode.ts +0 -675
  420. package/src/modes/bridge/bridge-ui-context.ts +0 -200
  421. package/src/modes/bridge/event-stream.ts +0 -70
  422. package/src/modes/rpc/host-tools.ts +0 -1
  423. package/src/modes/rpc/host-uris.ts +0 -1
  424. package/src/modes/rpc/rpc-client.ts +0 -1166
  425. package/src/modes/rpc/rpc-mode.ts +0 -1029
  426. package/src/modes/rpc/rpc-socket-security.ts +0 -115
  427. package/src/modes/rpc/rpc-types.ts +0 -637
  428. package/src/modes/shared/agent-wire/command-contract.ts +0 -18
  429. package/src/modes/shared/agent-wire/command-dispatch.ts +0 -498
  430. package/src/modes/shared/agent-wire/command-validation.ts +0 -181
  431. package/src/modes/shared/agent-wire/handshake.ts +0 -157
  432. package/src/modes/shared/agent-wire/host-tool-bridge.ts +0 -197
  433. package/src/modes/shared/agent-wire/host-uri-bridge.ts +0 -236
  434. package/src/modes/shared/agent-wire/protocol.ts +0 -46
  435. package/src/modes/shared/agent-wire/responses.ts +0 -17
  436. package/src/modes/shared/agent-wire/scopes.ts +0 -94
  437. package/src/modes/shared/agent-wire/session-registry.ts +0 -109
  438. package/src/modes/shared/agent-wire/ui-request-broker.ts +0 -150
  439. package/src/modes/shared/agent-wire/ui-result.ts +0 -48
  440. package/src/modes/shared/agent-wire/unattended-action-policy.ts +0 -365
  441. package/src/modes/shared/agent-wire/unattended-audit.ts +0 -176
  442. package/src/modes/shared/agent-wire/unattended-run-controller.ts +0 -426
  443. package/src/modes/shared/agent-wire/unattended-session.ts +0 -528
  444. package/src/notifications/config.ts +0 -219
  445. package/src/notifications/index.ts +0 -1835
  446. package/src/notifications/telegram-daemon-cli.ts +0 -243
  447. package/src/tools/puppeteer/09_stealth_locale.txt +0 -46
  448. /package/dist/types/{notifications → sdk/bus}/attachment-registry.d.ts +0 -0
  449. /package/dist/types/{notifications → sdk/bus}/chat-adapters.d.ts +0 -0
  450. /package/dist/types/{notifications → sdk/bus}/daemon-paths.d.ts +0 -0
  451. /package/dist/types/{notifications → sdk/bus}/engine.d.ts +0 -0
  452. /package/dist/types/{notifications → sdk/bus}/helpers.d.ts +0 -0
  453. /package/dist/types/{notifications → sdk/bus}/lifecycle-commands.d.ts +0 -0
  454. /package/dist/types/{notifications → sdk/bus}/operator-runtime.d.ts +0 -0
  455. /package/dist/types/{notifications → sdk/bus}/rate-limit-pool.d.ts +0 -0
  456. /package/dist/types/{notifications → sdk/bus}/recent-activity.d.ts +0 -0
  457. /package/dist/types/{notifications → sdk/bus}/reply-sent-store.d.ts +0 -0
  458. /package/dist/types/{notifications → sdk/bus}/rich-draft.d.ts +0 -0
  459. /package/dist/types/{notifications → sdk/bus}/rich-render.d.ts +0 -0
  460. /package/dist/types/{notifications → sdk/bus}/threaded-inbound.d.ts +0 -0
  461. /package/dist/types/{notifications → sdk/bus}/threaded-render.d.ts +0 -0
  462. /package/src/{notifications → sdk/bus}/attachment-registry.ts +0 -0
  463. /package/src/{notifications → sdk/bus}/chat-adapters.ts +0 -0
  464. /package/src/{notifications → sdk/bus}/daemon-paths.ts +0 -0
  465. /package/src/{notifications → sdk/bus}/engine.ts +0 -0
  466. /package/src/{notifications → sdk/bus}/helpers.ts +0 -0
  467. /package/src/{notifications → sdk/bus}/operator-runtime.ts +0 -0
  468. /package/src/{notifications → sdk/bus}/rate-limit-pool.ts +0 -0
  469. /package/src/{notifications → sdk/bus}/recent-activity.ts +0 -0
  470. /package/src/{notifications → sdk/bus}/reply-sent-store.ts +0 -0
  471. /package/src/{notifications → sdk/bus}/rich-draft.ts +0 -0
  472. /package/src/{notifications → sdk/bus}/rich-render.ts +0 -0
  473. /package/src/{notifications → sdk/bus}/threaded-inbound.ts +0 -0
  474. /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,