@gajae-code/coding-agent 0.10.2 → 0.11.1

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 (476) hide show
  1. package/CHANGELOG.md +58 -2
  2. package/dist/types/append-only-mode.d.ts +1 -1
  3. package/dist/types/async/job-manager.d.ts +46 -7
  4. package/dist/types/cli/args.d.ts +4 -5
  5. package/dist/types/cli/daemon-cli.d.ts +12 -1
  6. package/dist/types/cli/notify-cli.d.ts +21 -1
  7. package/dist/types/cli.d.ts +3 -0
  8. package/dist/types/commands/daemon.d.ts +39 -0
  9. package/dist/types/commands/launch.d.ts +3 -0
  10. package/dist/types/commands/notify.d.ts +28 -1
  11. package/dist/types/commands/sdk.d.ts +33 -0
  12. package/dist/types/config/atomic-yaml-patch.d.ts +85 -0
  13. package/dist/types/config/model-profile-activation.d.ts +35 -15
  14. package/dist/types/config/model-profiles.d.ts +11 -5
  15. package/dist/types/config/model-registry.d.ts +3 -3
  16. package/dist/types/config/model-resolver.d.ts +39 -6
  17. package/dist/types/config/model-selector-value.d.ts +17 -0
  18. package/dist/types/config/models-config-schema.d.ts +10 -6
  19. package/dist/types/config/settings-schema.d.ts +133 -6
  20. package/dist/types/config/settings.d.ts +63 -35
  21. package/dist/types/coordinator-mcp/model-preset.d.ts +7 -6
  22. package/dist/types/coordinator-mcp/server.d.ts +6 -49
  23. package/dist/types/daemon/builtin.d.ts +6 -5
  24. package/dist/types/daemon/control-types.d.ts +1 -1
  25. package/dist/types/discovery/mcp-json.d.ts +12 -1
  26. package/dist/types/extensibility/custom-tools/types.d.ts +1 -1
  27. package/dist/types/extensibility/extensions/compact-handler.d.ts +4 -2
  28. package/dist/types/extensibility/extensions/get-commands-handler.d.ts +2 -2
  29. package/dist/types/extensibility/extensions/loader.d.ts +10 -1
  30. package/dist/types/extensibility/extensions/runner.d.ts +3 -3
  31. package/dist/types/extensibility/extensions/types.d.ts +141 -16
  32. package/dist/types/extensibility/hooks/types.d.ts +1 -1
  33. package/dist/types/gjc-runtime/launch-tmux.d.ts +3 -2
  34. package/dist/types/gjc-runtime/psmux-detect.d.ts +3 -0
  35. package/dist/types/gjc-runtime/session-state-sidecar.d.ts +3 -0
  36. package/dist/types/gjc-runtime/team-runtime.d.ts +3 -4
  37. package/dist/types/gjc-runtime/tmux-owner-isolation-cli.d.ts +13 -0
  38. package/dist/types/gjc-runtime/tmux-sessions.d.ts +4 -1
  39. package/dist/types/gjc-runtime/ultragoal-receipt-freshness.d.ts +11 -0
  40. package/dist/types/gjc-runtime/windows-powershell-command.d.ts +9 -0
  41. package/dist/types/harness-control-plane/operate.d.ts +5 -5
  42. package/dist/types/harness-control-plane/owner.d.ts +18 -4
  43. package/dist/types/harness-control-plane/receipts.d.ts +0 -1
  44. package/dist/types/harness-control-plane/sdk-transport.d.ts +43 -0
  45. package/dist/types/harness-control-plane/session-transport.d.ts +48 -0
  46. package/dist/types/harness-control-plane/types.d.ts +3 -4
  47. package/dist/types/lsp/index.d.ts +1 -1
  48. package/dist/types/main.d.ts +32 -38
  49. package/dist/types/modes/acp/acp-agent.d.ts +224 -53
  50. package/dist/types/modes/acp/acp-client-bridge.d.ts +1 -0
  51. package/dist/types/modes/acp/acp-mode.d.ts +6 -15
  52. package/dist/types/modes/acp/permission-mode.d.ts +4 -0
  53. package/dist/types/modes/acp/startup-options.d.ts +6 -0
  54. package/dist/types/modes/components/agent-dashboard.d.ts +3 -0
  55. package/dist/types/modes/components/model-selector.d.ts +1 -0
  56. package/dist/types/modes/components/notifications-settings-editor.d.ts +135 -0
  57. package/dist/types/modes/components/settings-selector.d.ts +6 -4
  58. package/dist/types/modes/components/welcome.d.ts +1 -1
  59. package/dist/types/modes/controllers/command-controller.d.ts +2 -2
  60. package/dist/types/modes/controllers/extension-ui-controller.d.ts +1 -0
  61. package/dist/types/modes/controllers/selector-controller.d.ts +35 -1
  62. package/dist/types/modes/index.d.ts +0 -4
  63. package/dist/types/modes/interactive-mode.d.ts +5 -2
  64. package/dist/types/modes/runtime-init.d.ts +2 -2
  65. package/dist/types/modes/shared/agent-wire/approval-gate.d.ts +6 -9
  66. package/dist/types/modes/shared/agent-wire/deep-interview-gate.d.ts +4 -6
  67. package/dist/types/modes/shared/agent-wire/event-contract.d.ts +6 -6
  68. package/dist/types/modes/shared/agent-wire/event-envelope.d.ts +4 -9
  69. package/dist/types/modes/shared/agent-wire/event-observation.d.ts +1 -1
  70. package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +170 -30
  71. package/dist/types/modes/shared/agent-wire/workflow-gate-schema.d.ts +7 -7
  72. package/dist/types/modes/shared/agent-wire/workflow-gate-types.d.ts +105 -0
  73. package/dist/types/modes/types.d.ts +7 -2
  74. package/dist/types/runtime-mcp/client.d.ts +2 -0
  75. package/dist/types/runtime-mcp/config.d.ts +5 -1
  76. package/dist/types/runtime-mcp/manager.d.ts +8 -1
  77. package/dist/types/runtime-mcp/types.d.ts +4 -0
  78. package/dist/types/sdk/acp/adapter.d.ts +67 -0
  79. package/dist/types/sdk/acp/index.d.ts +2 -0
  80. package/dist/types/sdk/broker/broker.d.ts +53 -0
  81. package/dist/types/sdk/broker/discovery.d.ts +30 -0
  82. package/dist/types/sdk/broker/ensure.d.ts +42 -0
  83. package/dist/types/sdk/broker/identity.d.ts +3 -0
  84. package/dist/types/sdk/broker/index.d.ts +8 -0
  85. package/dist/types/sdk/broker/lifecycle-ledger.d.ts +95 -0
  86. package/dist/types/sdk/broker/lifecycle.d.ts +85 -0
  87. package/dist/types/sdk/broker/process-incarnation.d.ts +14 -0
  88. package/dist/types/sdk/broker/runtime.d.ts +33 -0
  89. package/dist/types/sdk/broker/session-index.d.ts +57 -0
  90. package/dist/types/sdk/broker/state-version.d.ts +8 -0
  91. package/dist/types/sdk/broker/transport.d.ts +9 -0
  92. package/dist/types/sdk/bus/chat-command-policy.d.ts +49 -0
  93. package/dist/types/sdk/bus/chat-daemon-cli.d.ts +21 -0
  94. package/dist/types/sdk/bus/chat-daemon-control.d.ts +111 -0
  95. package/dist/types/sdk/bus/chat-daemon-runtime.d.ts +77 -0
  96. package/dist/types/sdk/bus/chat-effect-journal.d.ts +84 -0
  97. package/dist/types/{notifications → sdk/bus}/config-commands.d.ts +7 -2
  98. package/dist/types/sdk/bus/config.d.ts +274 -0
  99. package/dist/types/sdk/bus/conversation-store.d.ts +72 -0
  100. package/dist/types/sdk/bus/discord-conversation.d.ts +58 -0
  101. package/dist/types/sdk/bus/discord-daemon.d.ts +50 -0
  102. package/dist/types/sdk/bus/discord-live-provider.d.ts +70 -0
  103. package/dist/types/sdk/bus/discord-provider.d.ts +85 -0
  104. package/dist/types/{notifications → sdk/bus}/html-format.d.ts +2 -2
  105. package/dist/types/{notifications → sdk/bus}/index.d.ts +113 -13
  106. package/dist/types/{notifications → sdk/bus}/lifecycle-control-runtime.d.ts +4 -2
  107. package/dist/types/{notifications → sdk/bus}/lifecycle-orchestrator.d.ts +18 -21
  108. package/dist/types/{notifications → sdk/bus}/managed-daemon.d.ts +1 -1
  109. package/dist/types/sdk/bus/native-runtime-compatibility.d.ts +13 -0
  110. package/dist/types/sdk/bus/notification-orchestration.d.ts +170 -0
  111. package/dist/types/{notifications → sdk/bus}/notification-service.d.ts +7 -1
  112. package/dist/types/sdk/bus/session-control.d.ts +83 -0
  113. package/dist/types/sdk/bus/slack-conversation.d.ts +56 -0
  114. package/dist/types/sdk/bus/slack-daemon.d.ts +60 -0
  115. package/dist/types/sdk/bus/slack-live-provider.d.ts +59 -0
  116. package/dist/types/sdk/bus/slack-provider.d.ts +55 -0
  117. package/dist/types/{notifications → sdk/bus}/telegram-cli.d.ts +4 -4
  118. package/dist/types/{notifications → sdk/bus}/telegram-daemon-cli.d.ts +14 -5
  119. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +12 -0
  120. package/dist/types/{notifications → sdk/bus}/telegram-daemon-control.d.ts +2 -2
  121. package/dist/types/{notifications → sdk/bus}/telegram-daemon.d.ts +78 -17
  122. package/dist/types/{notifications → sdk/bus}/telegram-reference.d.ts +2 -2
  123. package/dist/types/sdk/bus/telegram-setup.d.ts +128 -0
  124. package/dist/types/{notifications → sdk/bus}/topic-registry.d.ts +11 -0
  125. package/dist/types/sdk/cli/index.d.ts +1 -0
  126. package/dist/types/sdk/cli/session-cli.d.ts +19 -0
  127. package/dist/types/sdk/client/client.d.ts +1 -0
  128. package/dist/types/sdk/client/discovery.d.ts +27 -0
  129. package/dist/types/sdk/client/index.d.ts +2 -0
  130. package/dist/types/sdk/host/control/dispatch.d.ts +34 -0
  131. package/dist/types/sdk/host/control/index.d.ts +2 -0
  132. package/dist/types/sdk/host/control/operations.d.ts +65 -0
  133. package/dist/types/sdk/host/events.d.ts +35 -0
  134. package/dist/types/sdk/host/host.d.ts +35 -0
  135. package/dist/types/sdk/host/index.d.ts +4 -0
  136. package/dist/types/sdk/host/query/cursor.d.ts +62 -0
  137. package/dist/types/sdk/host/query/handlers.d.ts +70 -0
  138. package/dist/types/sdk/host/query/index.d.ts +3 -0
  139. package/dist/types/sdk/host/query/revision-store.d.ts +60 -0
  140. package/dist/types/sdk/host/reverse-leases.d.ts +45 -0
  141. package/dist/types/sdk/host/types.d.ts +32 -0
  142. package/dist/types/sdk/index.d.ts +6 -0
  143. package/dist/types/sdk/lifecycle-session.d.ts +14 -0
  144. package/dist/types/sdk/mcp/index.d.ts +1 -0
  145. package/dist/types/sdk/mcp/server.d.ts +37 -0
  146. package/dist/types/sdk/models.d.ts +44 -0
  147. package/dist/types/sdk/protocol/adapter-validation.d.ts +14 -0
  148. package/dist/types/sdk/protocol/operation-registry.d.ts +24 -0
  149. package/dist/types/{sdk.d.ts → sdk/session.d.ts} +44 -38
  150. package/dist/types/sdk/startup-capability.d.ts +50 -0
  151. package/dist/types/session/agent-session.d.ts +114 -21
  152. package/dist/types/session/default-model-selection.d.ts +25 -0
  153. package/dist/types/session/fallback-chain-controller.d.ts +52 -0
  154. package/dist/types/session/session-manager.d.ts +58 -1
  155. package/dist/types/setup/credential-auto-import.d.ts +36 -6
  156. package/dist/types/tools/ask-answer-registry.d.ts +1 -1
  157. package/dist/types/tools/browser/benchmark/detector-report.d.ts +63 -0
  158. package/dist/types/tools/browser/benchmark/run-suite.d.ts +18 -0
  159. package/dist/types/tools/browser/launch.d.ts +22 -0
  160. package/dist/types/tools/browser/profile-discovery.d.ts +31 -0
  161. package/dist/types/tools/browser/profile-posture.d.ts +37 -0
  162. package/dist/types/tools/browser/profile-reuse.d.ts +39 -0
  163. package/dist/types/tools/browser/profile-warmup.d.ts +39 -0
  164. package/dist/types/tools/browser/registry.d.ts +19 -0
  165. package/dist/types/tools/browser/tab-protocol.d.ts +4 -0
  166. package/dist/types/tools/index.d.ts +8 -8
  167. package/dist/types/tools/subagent-render.d.ts +1 -0
  168. package/dist/types/tools/subagent.d.ts +6 -1
  169. package/package.json +34 -13
  170. package/scripts/build-sdk-package-smoke.ts +99 -0
  171. package/scripts/capture-notifications-settings-showcase.ts +435 -0
  172. package/scripts/compile-args.ts +4 -2
  173. package/scripts/g005-daemon-smoke.ts +4 -5
  174. package/scripts/g011-daemon-path-smoke.ts +5 -5
  175. package/scripts/generate-sdk-adapter-parity-manifest.ts +163 -0
  176. package/scripts/generate-sdk-operation-inventory.ts +867 -0
  177. package/scripts/generate-telegram-baseline-manifest.ts +128 -0
  178. package/scripts/manifest-schema.ts +124 -0
  179. package/scripts/run-test-manifest.ts +153 -0
  180. package/scripts/run-threat-model-check.ts +157 -0
  181. package/scripts/verify-gjc-sdk-canonicalization.ts +3467 -0
  182. package/scripts/verify-gjc-sdk-rename.ts +90 -0
  183. package/src/append-only-mode.ts +1 -1
  184. package/src/async/job-manager.ts +406 -63
  185. package/src/cli/args.ts +43 -12
  186. package/src/cli/auth-gateway-cli.ts +2 -2
  187. package/src/cli/config-cli.ts +2 -1
  188. package/src/cli/daemon-cli.ts +63 -14
  189. package/src/cli/list-models.ts +1 -1
  190. package/src/cli/notify-cli.ts +288 -286
  191. package/src/cli.ts +21 -2
  192. package/src/commands/daemon.ts +50 -6
  193. package/src/commands/harness.ts +93 -36
  194. package/src/commands/launch.ts +5 -2
  195. package/src/commands/mcp-serve.ts +19 -12
  196. package/src/commands/notify.ts +36 -3
  197. package/src/commands/sdk.ts +426 -0
  198. package/src/commit/agentic/agent.ts +1 -0
  199. package/src/config/atomic-yaml-patch.ts +423 -0
  200. package/src/config/model-profile-activation.ts +240 -89
  201. package/src/config/model-profiles.ts +18 -15
  202. package/src/config/model-registry.ts +51 -26
  203. package/src/config/model-resolver.ts +138 -51
  204. package/src/config/model-selector-value.ts +50 -0
  205. package/src/config/models-config-schema.ts +14 -21
  206. package/src/config/settings-schema.ts +128 -10
  207. package/src/config/settings.ts +1120 -158
  208. package/src/coordinator-mcp/model-preset.ts +74 -20
  209. package/src/coordinator-mcp/server.ts +1597 -3052
  210. package/src/daemon/builtin.ts +8 -5
  211. package/src/daemon/control-types.ts +1 -1
  212. package/src/defaults/gjc/skills/team/SKILL.md +4 -4
  213. package/src/discovery/mcp-json.ts +327 -20
  214. package/src/extensibility/custom-tools/types.ts +1 -1
  215. package/src/extensibility/extensions/compact-handler.ts +3 -3
  216. package/src/extensibility/extensions/get-commands-handler.ts +2 -2
  217. package/src/extensibility/extensions/loader.ts +69 -5
  218. package/src/extensibility/extensions/runner.ts +112 -4
  219. package/src/extensibility/extensions/types.ts +176 -17
  220. package/src/extensibility/hooks/types.ts +1 -1
  221. package/src/gjc-runtime/launch-tmux.ts +170 -86
  222. package/src/gjc-runtime/psmux-detect.ts +82 -4
  223. package/src/gjc-runtime/session-state-sidecar.ts +41 -31
  224. package/src/gjc-runtime/team-runtime.ts +54 -35
  225. package/src/gjc-runtime/tmux-owner-isolation-cli.ts +53 -17
  226. package/src/gjc-runtime/tmux-owner-isolation.ts +1 -1
  227. package/src/gjc-runtime/tmux-sessions.ts +19 -13
  228. package/src/gjc-runtime/ultragoal-guard.ts +108 -14
  229. package/src/gjc-runtime/ultragoal-receipt-freshness.ts +102 -1
  230. package/src/gjc-runtime/ultragoal-runtime.ts +227 -11
  231. package/src/gjc-runtime/windows-powershell-command.ts +58 -0
  232. package/src/harness-control-plane/operate.ts +9 -9
  233. package/src/harness-control-plane/owner.ts +283 -39
  234. package/src/harness-control-plane/receipts.ts +0 -1
  235. package/src/harness-control-plane/sdk-transport.ts +395 -0
  236. package/src/harness-control-plane/session-transport.ts +94 -0
  237. package/src/harness-control-plane/types.ts +1 -1
  238. package/src/internal-urls/docs-index.generated.ts +34 -35
  239. package/src/lsp/client.ts +42 -6
  240. package/src/lsp/index.ts +2 -2
  241. package/src/main.ts +299 -204
  242. package/src/modes/DESIGN.md +258 -0
  243. package/src/modes/acp/acp-agent.ts +1228 -2612
  244. package/src/modes/acp/acp-client-bridge.ts +2 -20
  245. package/src/modes/acp/acp-event-mapper.ts +18 -2
  246. package/src/modes/acp/acp-mode.ts +8 -36
  247. package/src/modes/acp/permission-mode.ts +25 -0
  248. package/src/modes/acp/startup-options.ts +6 -0
  249. package/src/modes/components/agent-dashboard.ts +37 -17
  250. package/src/modes/components/model-selector.ts +93 -35
  251. package/src/modes/components/notifications-settings-editor.ts +1379 -0
  252. package/src/modes/components/settings-selector.ts +60 -11
  253. package/src/modes/components/welcome.ts +4 -4
  254. package/src/modes/controllers/command-controller.ts +10 -17
  255. package/src/modes/controllers/event-controller.ts +11 -16
  256. package/src/modes/controllers/extension-ui-controller.ts +396 -28
  257. package/src/modes/controllers/selector-controller.ts +674 -36
  258. package/src/modes/index.ts +0 -22
  259. package/src/modes/interactive-mode.ts +87 -36
  260. package/src/modes/runtime-init.ts +298 -6
  261. package/src/modes/shared/agent-wire/approval-gate.ts +9 -11
  262. package/src/modes/shared/agent-wire/deep-interview-gate.ts +10 -11
  263. package/src/modes/shared/agent-wire/event-contract.ts +7 -8
  264. package/src/modes/shared/agent-wire/event-envelope.ts +9 -17
  265. package/src/modes/shared/agent-wire/event-observation.ts +16 -7
  266. package/src/modes/shared/agent-wire/workflow-gate-broker.ts +1258 -87
  267. package/src/modes/shared/agent-wire/workflow-gate-schema.ts +15 -15
  268. package/src/modes/shared/agent-wire/workflow-gate-types.ts +113 -0
  269. package/src/modes/types.ts +7 -2
  270. package/src/runtime-mcp/client.ts +94 -19
  271. package/src/runtime-mcp/config.ts +27 -15
  272. package/src/runtime-mcp/manager.ts +343 -105
  273. package/src/runtime-mcp/oauth-flow.ts +42 -12
  274. package/src/runtime-mcp/transports/http.ts +49 -19
  275. package/src/runtime-mcp/transports/stdio.ts +47 -28
  276. package/src/runtime-mcp/types.ts +10 -0
  277. package/src/sdk/acp/adapter.ts +418 -0
  278. package/src/sdk/acp/index.ts +2 -0
  279. package/src/sdk/broker/broker.ts +642 -0
  280. package/src/sdk/broker/discovery.ts +113 -0
  281. package/src/sdk/broker/ensure.ts +307 -0
  282. package/src/sdk/broker/identity.ts +42 -0
  283. package/src/sdk/broker/index.ts +8 -0
  284. package/src/sdk/broker/internal-source-marker-2178.txt +1 -0
  285. package/src/sdk/broker/internal-source.bunfig.toml +1 -0
  286. package/src/sdk/broker/lifecycle-ledger.ts +286 -0
  287. package/src/sdk/broker/lifecycle.ts +2157 -0
  288. package/src/sdk/broker/process-incarnation.ts +159 -0
  289. package/src/sdk/broker/runtime.ts +164 -0
  290. package/src/sdk/broker/session-index.ts +318 -0
  291. package/src/sdk/broker/state-version.ts +23 -0
  292. package/src/sdk/broker/transport.ts +125 -0
  293. package/src/sdk/bus/chat-command-policy.ts +107 -0
  294. package/src/sdk/bus/chat-daemon-cli.ts +214 -0
  295. package/src/sdk/bus/chat-daemon-control.ts +713 -0
  296. package/src/sdk/bus/chat-daemon-runtime.ts +526 -0
  297. package/src/sdk/bus/chat-effect-journal.ts +355 -0
  298. package/src/{notifications → sdk/bus}/config-commands.ts +39 -10
  299. package/src/sdk/bus/config.ts +433 -0
  300. package/src/sdk/bus/conversation-store.ts +391 -0
  301. package/src/sdk/bus/discord-conversation.ts +85 -0
  302. package/src/sdk/bus/discord-daemon.ts +2292 -0
  303. package/src/sdk/bus/discord-live-provider.ts +521 -0
  304. package/src/sdk/bus/discord-provider.ts +56 -0
  305. package/src/{notifications → sdk/bus}/html-format.ts +2 -2
  306. package/src/sdk/bus/index.ts +3979 -0
  307. package/src/{notifications → sdk/bus}/lifecycle-commands.ts +2 -0
  308. package/src/{notifications → sdk/bus}/lifecycle-control-runtime.ts +225 -196
  309. package/src/{notifications → sdk/bus}/lifecycle-orchestrator.ts +161 -74
  310. package/src/{notifications → sdk/bus}/managed-daemon.ts +2 -2
  311. package/src/sdk/bus/native-runtime-compatibility.ts +42 -0
  312. package/src/sdk/bus/natives-augment.d.ts +38 -0
  313. package/src/sdk/bus/notification-orchestration.ts +535 -0
  314. package/src/{notifications → sdk/bus}/notification-service.ts +106 -12
  315. package/src/sdk/bus/session-control.ts +333 -0
  316. package/src/sdk/bus/slack-conversation.ts +74 -0
  317. package/src/sdk/bus/slack-daemon.ts +2144 -0
  318. package/src/sdk/bus/slack-live-provider.ts +380 -0
  319. package/src/sdk/bus/slack-provider.ts +76 -0
  320. package/src/{notifications → sdk/bus}/telegram-cli.ts +8 -8
  321. package/src/sdk/bus/telegram-daemon-cli.ts +330 -0
  322. package/src/sdk/bus/telegram-daemon-contract.ts +14 -0
  323. package/src/{notifications → sdk/bus}/telegram-daemon-control.ts +4 -4
  324. package/src/{notifications → sdk/bus}/telegram-daemon.ts +603 -63
  325. package/src/{notifications → sdk/bus}/telegram-reference.ts +2 -2
  326. package/src/sdk/bus/telegram-setup.ts +663 -0
  327. package/src/{notifications → sdk/bus}/topic-registry.ts +32 -0
  328. package/src/sdk/cli/index.ts +1 -0
  329. package/src/sdk/cli/session-cli.ts +275 -0
  330. package/src/sdk/client/client.ts +1 -0
  331. package/src/sdk/client/discovery.ts +108 -0
  332. package/src/sdk/client/index.ts +2 -0
  333. package/src/sdk/host/control/dispatch.ts +367 -0
  334. package/src/sdk/host/control/index.ts +10 -0
  335. package/src/sdk/host/control/operations.ts +63 -0
  336. package/src/sdk/host/events.ts +91 -0
  337. package/src/sdk/host/host.ts +296 -0
  338. package/src/sdk/host/index.ts +4 -0
  339. package/src/sdk/host/query/cursor.ts +189 -0
  340. package/src/sdk/host/query/handlers.ts +533 -0
  341. package/src/sdk/host/query/index.ts +3 -0
  342. package/src/sdk/host/query/revision-store.ts +1126 -0
  343. package/src/sdk/host/reverse-leases.ts +325 -0
  344. package/src/sdk/host/types.ts +29 -0
  345. package/src/sdk/index.ts +13 -0
  346. package/src/sdk/lifecycle-session.ts +39 -0
  347. package/src/sdk/mcp/index.ts +1 -0
  348. package/src/sdk/mcp/server.ts +332 -0
  349. package/src/sdk/models.ts +168 -0
  350. package/src/sdk/protocol/adapter-validation.ts +48 -0
  351. package/src/sdk/protocol/operation-inventory.generated.json +5654 -0
  352. package/src/sdk/protocol/operation-registry.ts +312 -0
  353. package/src/{sdk.ts → sdk/session.ts} +339 -212
  354. package/src/sdk/startup-capability.ts +189 -0
  355. package/src/session/agent-session.ts +2650 -944
  356. package/src/session/default-model-selection.ts +93 -0
  357. package/src/session/fallback-chain-controller.ts +136 -0
  358. package/src/session/session-manager.ts +438 -11
  359. package/src/session/session-storage.ts +8 -1
  360. package/src/setup/credential-auto-import.ts +290 -35
  361. package/src/setup/hermes/templates/operator-instructions.v1.md +3 -5
  362. package/src/slash-commands/builtin-registry.ts +2 -1
  363. package/src/task/executor.ts +62 -13
  364. package/src/task/index.ts +26 -16
  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/subagent-render.ts +19 -8
  384. package/src/tools/subagent.ts +84 -32
  385. package/src/tools/telegram-send.ts +2 -2
  386. package/vendor/insane-search/MANIFEST.json +2 -1
  387. package/vendor/insane-search/engine/bias_check.py +4 -1
  388. package/vendor/insane-search/engine/phase0.py +26 -1
  389. package/dist/types/harness-control-plane/rpc-adapter.d.ts +0 -69
  390. package/dist/types/modes/bridge/auth.d.ts +0 -12
  391. package/dist/types/modes/bridge/bridge-client-bridge.d.ts +0 -9
  392. package/dist/types/modes/bridge/bridge-mode.d.ts +0 -47
  393. package/dist/types/modes/bridge/bridge-ui-context.d.ts +0 -88
  394. package/dist/types/modes/bridge/event-stream.d.ts +0 -8
  395. package/dist/types/modes/rpc/host-tools.d.ts +0 -1
  396. package/dist/types/modes/rpc/host-uris.d.ts +0 -1
  397. package/dist/types/modes/rpc/rpc-client.d.ts +0 -299
  398. package/dist/types/modes/rpc/rpc-mode.d.ts +0 -86
  399. package/dist/types/modes/rpc/rpc-socket-security.d.ts +0 -10
  400. package/dist/types/modes/rpc/rpc-types.d.ts +0 -810
  401. package/dist/types/modes/shared/agent-wire/command-contract.d.ts +0 -18
  402. package/dist/types/modes/shared/agent-wire/command-dispatch.d.ts +0 -37
  403. package/dist/types/modes/shared/agent-wire/command-validation.d.ts +0 -2
  404. package/dist/types/modes/shared/agent-wire/handshake.d.ts +0 -56
  405. package/dist/types/modes/shared/agent-wire/host-tool-bridge.d.ts +0 -16
  406. package/dist/types/modes/shared/agent-wire/host-uri-bridge.d.ts +0 -17
  407. package/dist/types/modes/shared/agent-wire/protocol.d.ts +0 -25
  408. package/dist/types/modes/shared/agent-wire/responses.d.ts +0 -4
  409. package/dist/types/modes/shared/agent-wire/scopes.d.ts +0 -18
  410. package/dist/types/modes/shared/agent-wire/session-registry.d.ts +0 -25
  411. package/dist/types/modes/shared/agent-wire/ui-request-broker.d.ts +0 -42
  412. package/dist/types/modes/shared/agent-wire/ui-result.d.ts +0 -27
  413. package/dist/types/modes/shared/agent-wire/unattended-action-policy.d.ts +0 -29
  414. package/dist/types/modes/shared/agent-wire/unattended-audit.d.ts +0 -68
  415. package/dist/types/modes/shared/agent-wire/unattended-run-controller.d.ts +0 -166
  416. package/dist/types/modes/shared/agent-wire/unattended-session.d.ts +0 -127
  417. package/dist/types/notifications/config.d.ts +0 -132
  418. package/src/harness-control-plane/rpc-adapter.ts +0 -290
  419. package/src/modes/bridge/auth.ts +0 -41
  420. package/src/modes/bridge/bridge-client-bridge.ts +0 -47
  421. package/src/modes/bridge/bridge-mode.ts +0 -675
  422. package/src/modes/bridge/bridge-ui-context.ts +0 -200
  423. package/src/modes/bridge/event-stream.ts +0 -70
  424. package/src/modes/rpc/host-tools.ts +0 -1
  425. package/src/modes/rpc/host-uris.ts +0 -1
  426. package/src/modes/rpc/rpc-client.ts +0 -1166
  427. package/src/modes/rpc/rpc-mode.ts +0 -1029
  428. package/src/modes/rpc/rpc-socket-security.ts +0 -115
  429. package/src/modes/rpc/rpc-types.ts +0 -637
  430. package/src/modes/shared/agent-wire/command-contract.ts +0 -18
  431. package/src/modes/shared/agent-wire/command-dispatch.ts +0 -498
  432. package/src/modes/shared/agent-wire/command-validation.ts +0 -181
  433. package/src/modes/shared/agent-wire/handshake.ts +0 -157
  434. package/src/modes/shared/agent-wire/host-tool-bridge.ts +0 -197
  435. package/src/modes/shared/agent-wire/host-uri-bridge.ts +0 -236
  436. package/src/modes/shared/agent-wire/protocol.ts +0 -46
  437. package/src/modes/shared/agent-wire/responses.ts +0 -17
  438. package/src/modes/shared/agent-wire/scopes.ts +0 -94
  439. package/src/modes/shared/agent-wire/session-registry.ts +0 -109
  440. package/src/modes/shared/agent-wire/ui-request-broker.ts +0 -150
  441. package/src/modes/shared/agent-wire/ui-result.ts +0 -48
  442. package/src/modes/shared/agent-wire/unattended-action-policy.ts +0 -365
  443. package/src/modes/shared/agent-wire/unattended-audit.ts +0 -176
  444. package/src/modes/shared/agent-wire/unattended-run-controller.ts +0 -426
  445. package/src/modes/shared/agent-wire/unattended-session.ts +0 -528
  446. package/src/notifications/config.ts +0 -219
  447. package/src/notifications/index.ts +0 -1835
  448. package/src/notifications/telegram-daemon-cli.ts +0 -243
  449. package/src/tools/puppeteer/09_stealth_locale.txt +0 -46
  450. /package/dist/types/{notifications → sdk/bus}/attachment-registry.d.ts +0 -0
  451. /package/dist/types/{notifications → sdk/bus}/chat-adapters.d.ts +0 -0
  452. /package/dist/types/{notifications → sdk/bus}/daemon-paths.d.ts +0 -0
  453. /package/dist/types/{notifications → sdk/bus}/engine.d.ts +0 -0
  454. /package/dist/types/{notifications → sdk/bus}/helpers.d.ts +0 -0
  455. /package/dist/types/{notifications → sdk/bus}/lifecycle-commands.d.ts +0 -0
  456. /package/dist/types/{notifications → sdk/bus}/operator-runtime.d.ts +0 -0
  457. /package/dist/types/{notifications → sdk/bus}/rate-limit-pool.d.ts +0 -0
  458. /package/dist/types/{notifications → sdk/bus}/recent-activity.d.ts +0 -0
  459. /package/dist/types/{notifications → sdk/bus}/reply-sent-store.d.ts +0 -0
  460. /package/dist/types/{notifications → sdk/bus}/rich-draft.d.ts +0 -0
  461. /package/dist/types/{notifications → sdk/bus}/rich-render.d.ts +0 -0
  462. /package/dist/types/{notifications → sdk/bus}/threaded-inbound.d.ts +0 -0
  463. /package/dist/types/{notifications → sdk/bus}/threaded-render.d.ts +0 -0
  464. /package/src/{notifications → sdk/bus}/attachment-registry.ts +0 -0
  465. /package/src/{notifications → sdk/bus}/chat-adapters.ts +0 -0
  466. /package/src/{notifications → sdk/bus}/daemon-paths.ts +0 -0
  467. /package/src/{notifications → sdk/bus}/engine.ts +0 -0
  468. /package/src/{notifications → sdk/bus}/helpers.ts +0 -0
  469. /package/src/{notifications → sdk/bus}/operator-runtime.ts +0 -0
  470. /package/src/{notifications → sdk/bus}/rate-limit-pool.ts +0 -0
  471. /package/src/{notifications → sdk/bus}/recent-activity.ts +0 -0
  472. /package/src/{notifications → sdk/bus}/reply-sent-store.ts +0 -0
  473. /package/src/{notifications → sdk/bus}/rich-draft.ts +0 -0
  474. /package/src/{notifications → sdk/bus}/rich-render.ts +0 -0
  475. /package/src/{notifications → sdk/bus}/threaded-inbound.ts +0 -0
  476. /package/src/{notifications → sdk/bus}/threaded-render.ts +0 -0
@@ -31,6 +31,10 @@ export interface TopicRecord {
31
31
  userNameUpdateId?: number;
32
32
  /** Stable repo/branch identity used when topic names are user-owned or customized. */
33
33
  identityKey?: string;
34
+ /** Last SDK event generation durably consumed by the notification daemon. */
35
+ replayGeneration?: number;
36
+ /** Last SDK event sequence durably consumed within replayGeneration. */
37
+ replaySeq?: number;
34
38
  }
35
39
 
36
40
  /** Serialisable shape persisted to disk. */
@@ -71,6 +75,13 @@ export class TopicRegistry {
71
75
  typeof raw.userNameUpdateId === "number" &&
72
76
  Number.isSafeInteger(raw.userNameUpdateId) &&
73
77
  raw.userNameUpdateId >= 0;
78
+ const hasValidReplayCursor =
79
+ typeof raw.replayGeneration === "number" &&
80
+ Number.isSafeInteger(raw.replayGeneration) &&
81
+ raw.replayGeneration >= 1 &&
82
+ typeof raw.replaySeq === "number" &&
83
+ Number.isSafeInteger(raw.replaySeq) &&
84
+ raw.replaySeq >= 0;
74
85
  const record: TopicRecord = {
75
86
  topicId: raw.topicId,
76
87
  identitySent: raw.identitySent === true,
@@ -80,6 +91,7 @@ export class TopicRegistry {
80
91
  ...(hasValidUserAuthority && raw.nameReconcilePending === true ? { nameReconcilePending: true } : {}),
81
92
  ...(hasValidUserAuthority ? { userNameUpdateId: raw.userNameUpdateId } : {}),
82
93
  ...(typeof raw.identityKey === "string" ? { identityKey: raw.identityKey } : {}),
94
+ ...(hasValidReplayCursor ? { replayGeneration: raw.replayGeneration, replaySeq: raw.replaySeq } : {}),
83
95
  };
84
96
  this.topics.set(sessionId, record);
85
97
  this.byTopic.set(record.topicId, sessionId);
@@ -154,6 +166,26 @@ export class TopicRegistry {
154
166
  return true;
155
167
  }
156
168
 
169
+ /** Last durably consumed SDK event cursor for reconnect replay. */
170
+ replayCursor(sessionId: string): { generation: number; seq: number } | undefined {
171
+ const record = this.topics.get(sessionId);
172
+ return record?.replayGeneration !== undefined && record.replaySeq !== undefined
173
+ ? { generation: record.replayGeneration, seq: record.replaySeq }
174
+ : undefined;
175
+ }
176
+
177
+ /** Advance the durable reconnect cursor without allowing stale responses to move it backwards. */
178
+ markReplayCursor(sessionId: string, generation: number, seq: number): boolean {
179
+ const record = this.topics.get(sessionId);
180
+ if (!record) return false;
181
+ const currentGeneration = record.replayGeneration ?? 0;
182
+ const currentSeq = record.replaySeq ?? 0;
183
+ if (generation < currentGeneration || (generation === currentGeneration && seq <= currentSeq)) return false;
184
+ record.replayGeneration = generation;
185
+ record.replaySeq = seq;
186
+ return true;
187
+ }
188
+
157
189
  /** Whether daemon identity reconciliation should apply `name`. */
158
190
  needsRename(sessionId: string, name: string): boolean {
159
191
  const record = this.topics.get(sessionId);
@@ -0,0 +1 @@
1
+ export * from "./session-cli";
@@ -0,0 +1,275 @@
1
+ import * as fs from "node:fs/promises";
2
+ import { createInterface } from "node:readline/promises";
3
+ import { getAgentDir } from "@gajae-code/utils";
4
+ import { ensureBroker } from "../broker/ensure";
5
+ import {
6
+ listSdkSessionEndpoints,
7
+ readSdkBrokerDiscovery,
8
+ readSdkSessionEndpoint,
9
+ SdkClient,
10
+ SdkClientError,
11
+ SdkDiscoveryError,
12
+ } from "../client";
13
+ import { validateAdapterControl } from "../protocol/adapter-validation";
14
+ import { adapterDispositionError, findOperation, type OperationKind } from "../protocol/operation-registry";
15
+
16
+ export type SdkSessionCliAction = "list" | "control" | "query" | "global";
17
+
18
+ export interface SdkSessionCliArgs {
19
+ action?: string;
20
+ sessionId?: string;
21
+ operation?: string;
22
+ query?: string;
23
+ jsonInput?: string;
24
+ jsonInputFile?: string;
25
+ idempotencyKey?: string;
26
+ jsonInputStdin?: boolean;
27
+ confirm?: boolean;
28
+ cursor?: string;
29
+ showEndpointCredential?: boolean;
30
+ yes?: boolean;
31
+ repo?: string;
32
+ agentDir?: string;
33
+ }
34
+
35
+ type JsonRecord = Record<string, unknown>;
36
+ const SECRET_FIELD = /(?:secret|token|password|credential|authorization|api[_-]?key)/i;
37
+
38
+ class SdkSessionCliError extends Error {
39
+ constructor(
40
+ readonly code: string,
41
+ message: string,
42
+ readonly exitCode: 1 | 2,
43
+ ) {
44
+ super(message);
45
+ }
46
+ }
47
+
48
+ function writeJson(value: unknown): void {
49
+ process.stdout.write(`${JSON.stringify(value)}\n`);
50
+ }
51
+
52
+ function parseInput(raw: string | undefined, source: string): JsonRecord {
53
+ if (raw === undefined) return {};
54
+ try {
55
+ const value: unknown = JSON.parse(raw);
56
+ if (!value || typeof value !== "object" || Array.isArray(value))
57
+ throw new SdkSessionCliError("invalid_input", `${source} must be a JSON object.`, 2);
58
+ return value as JsonRecord;
59
+ } catch (error) {
60
+ if (error instanceof SdkSessionCliError) throw error;
61
+ throw new SdkSessionCliError("invalid_json", `${source} must contain valid JSON.`, 2);
62
+ }
63
+ }
64
+
65
+ function containsSecretField(value: unknown): boolean {
66
+ if (Array.isArray(value)) return value.some(containsSecretField);
67
+ if (!value || typeof value !== "object") return false;
68
+ return Object.entries(value).some(([key, nested]) => SECRET_FIELD.test(key) || containsSecretField(nested));
69
+ }
70
+
71
+ async function inputFromArgs(args: SdkSessionCliArgs): Promise<JsonRecord> {
72
+ const sources = [
73
+ args.jsonInput !== undefined,
74
+ args.jsonInputFile !== undefined,
75
+ args.jsonInputStdin === true,
76
+ ].filter(Boolean).length;
77
+ if (sources > 1) throw new SdkSessionCliError("usage", "Use only one JSON input source.", 2);
78
+ if (args.jsonInput !== undefined) {
79
+ const input = parseInput(args.jsonInput, "--json-input");
80
+ if (containsSecretField(input))
81
+ throw new SdkSessionCliError(
82
+ "secret_field_forbidden",
83
+ "Secret values must use --json-input-file or --json-input-stdin.",
84
+ 2,
85
+ );
86
+ return input;
87
+ }
88
+ if (args.jsonInputFile !== undefined) {
89
+ let stat: Awaited<ReturnType<typeof fs.stat>>;
90
+ try {
91
+ stat = await fs.stat(args.jsonInputFile);
92
+ } catch {
93
+ throw new SdkSessionCliError("input_file_unavailable", "Unable to read --json-input-file.", 2);
94
+ }
95
+ if (!stat.isFile() || (stat.mode & 0o077) !== 0)
96
+ throw new SdkSessionCliError(
97
+ "input_file_permissions",
98
+ "--json-input-file must be a regular file with 0600 permissions.",
99
+ 2,
100
+ );
101
+ try {
102
+ return parseInput(await fs.readFile(args.jsonInputFile, "utf8"), "--json-input-file");
103
+ } catch (error) {
104
+ if (error instanceof SdkSessionCliError) throw error;
105
+ throw new SdkSessionCliError("input_file_unavailable", "Unable to read --json-input-file.", 2);
106
+ }
107
+ }
108
+ return args.jsonInputStdin ? parseInput(await Bun.stdin.text(), "--json-input-stdin") : {};
109
+ }
110
+
111
+ function requireValue(value: string | undefined, flag: string): string {
112
+ if (!value) throw new SdkSessionCliError("usage", `${flag} is required.`, 2);
113
+ return value;
114
+ }
115
+
116
+ function isEndpointOperation(operation: string): boolean {
117
+ return operation === "session.get_endpoint";
118
+ }
119
+
120
+ function cliOperationError(kind: OperationKind, operation: string): { code: string; message: string } | undefined {
121
+ const row = findOperation(kind, operation);
122
+ const error = adapterDispositionError("daemonCli", kind, operation);
123
+ if (!error) return undefined;
124
+ if (row?.adapterDispositions.daemonCli === "prohibited")
125
+ return {
126
+ code: error.code,
127
+ message: `${operation} is unavailable through the ordinary CLI; provider mode is out of scope this phase.`,
128
+ };
129
+ return error;
130
+ }
131
+
132
+ function isLifecycleOperation(operation: string): boolean {
133
+ return (
134
+ operation === "session.create" ||
135
+ operation === "session.fork" ||
136
+ operation === "session.resume" ||
137
+ operation === "session.close" ||
138
+ operation === "session.delete"
139
+ );
140
+ }
141
+
142
+ async function confirmEndpointCredentialOutput(): Promise<boolean> {
143
+ const prompt = createInterface({ input: process.stdin, output: process.stderr });
144
+ try {
145
+ return (await prompt.question("Print the endpoint credential to stdout? [y/N] ")).trim().toLowerCase() === "y";
146
+ } finally {
147
+ prompt.close();
148
+ }
149
+ }
150
+
151
+ async function connectBroker(agentDir: string): Promise<SdkClient> {
152
+ await ensureBroker({ agentDir });
153
+ const discovery = await readSdkBrokerDiscovery(agentDir);
154
+ if (!discovery) throw new SdkSessionCliError("broker_unavailable", "SDK broker discovery is unavailable.", 1);
155
+ return await SdkClient.connect(discovery.url, discovery.token);
156
+ }
157
+
158
+ async function connectSession(repo: string, sessionId: string): Promise<SdkClient> {
159
+ const endpoint = await readSdkSessionEndpoint(repo, sessionId);
160
+ if (!endpoint)
161
+ throw new SdkSessionCliError("session_unavailable", `SDK endpoint for session ${sessionId} is unavailable.`, 1);
162
+ return await SdkClient.connect(endpoint.url, endpoint.token);
163
+ }
164
+
165
+ function brokerAbsent(error: unknown): boolean {
166
+ if (error instanceof SdkSessionCliError) return error.code === "broker_unavailable";
167
+ const details = error instanceof SdkClientError ? error.details : error;
168
+ const code = (details as { code?: unknown } | undefined)?.code;
169
+ return (
170
+ code === "ENOENT" ||
171
+ code === "ECONNREFUSED" ||
172
+ /(?:ENOENT|ECONNREFUSED|connection refused)/i.test(error instanceof Error ? error.message : "")
173
+ );
174
+ }
175
+
176
+ async function runList(repo: string, agentDir: string): Promise<unknown> {
177
+ try {
178
+ const client = await connectBroker(agentDir);
179
+ try {
180
+ return await client.global("session.list", {});
181
+ } finally {
182
+ await client.close();
183
+ }
184
+ } catch (error) {
185
+ if (!brokerAbsent(error)) throw error;
186
+ const { endpoints, warnings } = await listSdkSessionEndpoints(repo);
187
+ return {
188
+ sessions: endpoints.map(({ sessionId, path }) => ({ sessionId, path })),
189
+ warnings: [
190
+ { code: "broker_unavailable", message: "Listed endpoint files because the broker is unavailable." },
191
+ ...warnings,
192
+ ],
193
+ };
194
+ }
195
+ }
196
+
197
+ /** Runs the pure-SDK `gjc daemon session` command family. */
198
+ export async function runSdkSessionCli(
199
+ args: SdkSessionCliArgs,
200
+ writeOutput: (value: unknown) => void = writeJson,
201
+ setExitCode: (exitCode: 1 | 2) => void = exitCode => {
202
+ process.exitCode = exitCode;
203
+ },
204
+ ): Promise<void> {
205
+ try {
206
+ const action = args.action;
207
+ if (action !== "list" && action !== "control" && action !== "query" && action !== "global")
208
+ throw new SdkSessionCliError("usage", "Expected one of: list, control, query, global.", 2);
209
+ const repo = args.repo ?? process.cwd();
210
+ const agentDir = args.agentDir ?? getAgentDir();
211
+ if (action === "list") {
212
+ writeOutput(await runList(repo, agentDir));
213
+ return;
214
+ }
215
+ const operation = action === "query" ? requireValue(args.query, "--query") : requireValue(args.operation, "--op");
216
+ const kind: OperationKind = action === "query" ? "query" : action === "global" ? "global" : "control";
217
+ const dispositionError = cliOperationError(kind, operation);
218
+ if (dispositionError) throw new SdkSessionCliError(dispositionError.code, dispositionError.message, 1);
219
+ if (isEndpointOperation(operation)) {
220
+ if (!args.showEndpointCredential)
221
+ throw new SdkSessionCliError(
222
+ "endpoint_credential_forbidden",
223
+ "session.get_endpoint requires --show-endpoint-credential.",
224
+ 1,
225
+ );
226
+ if (process.stdout.isTTY && !args.yes && !(await confirmEndpointCredentialOutput()))
227
+ throw new SdkSessionCliError(
228
+ "endpoint_credential_confirmation_required",
229
+ "Endpoint credential output was not confirmed.",
230
+ 1,
231
+ );
232
+ }
233
+ const input = await inputFromArgs(args);
234
+ if (kind === "control") {
235
+ const invalid = validateAdapterControl(operation, input);
236
+ if (invalid) throw new SdkSessionCliError(invalid.code, invalid.message, 2);
237
+ }
238
+ if (action === "global") {
239
+ const idempotencyKey = args.idempotencyKey;
240
+ if (isLifecycleOperation(operation) && !idempotencyKey)
241
+ throw new SdkSessionCliError("invalid_input", "--idempotency-key is required for lifecycle operations.", 2);
242
+ const client = await connectBroker(agentDir);
243
+ try {
244
+ writeOutput(await client.global(operation, input, { idempotencyKey }));
245
+ } finally {
246
+ await client.close();
247
+ }
248
+ return;
249
+ }
250
+ const sessionId = requireValue(args.sessionId, "<sessionId>");
251
+ const client = await connectSession(repo, sessionId);
252
+ try {
253
+ if (action === "control")
254
+ writeOutput(await client.control(operation, input, { confirm: args.confirm === true }));
255
+ else writeOutput(await client.query(operation, input, args.cursor));
256
+ } finally {
257
+ await client.close();
258
+ }
259
+ } catch (error) {
260
+ const cliError =
261
+ error instanceof SdkSessionCliError
262
+ ? error
263
+ : error instanceof SdkClientError
264
+ ? new SdkSessionCliError(error.code, error.message, 1)
265
+ : error instanceof SdkDiscoveryError
266
+ ? new SdkSessionCliError(error.code, error.message, 1)
267
+ : new SdkSessionCliError(
268
+ "operation_failed",
269
+ error instanceof Error ? error.message : "SDK operation failed.",
270
+ 1,
271
+ );
272
+ writeOutput({ ok: false, error: { code: cliError.code, message: cliError.message } });
273
+ setExitCode(cliError.exitCode);
274
+ }
275
+ }
@@ -0,0 +1 @@
1
+ export * from "@gajae-code/bridge-client";
@@ -0,0 +1,108 @@
1
+ import * as fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { type BrokerDiscovery, readBrokerDiscovery as readBrokerFile } from "../broker/discovery";
4
+
5
+ export interface SdkSessionEndpoint {
6
+ sessionId: string;
7
+ url: string;
8
+ token: string;
9
+ path: string;
10
+ }
11
+
12
+ export interface SdkDiscoveryWarning {
13
+ code: "discovery_error";
14
+ path: string;
15
+ message: string;
16
+ }
17
+
18
+ export interface SdkSessionEndpointList {
19
+ endpoints: SdkSessionEndpoint[];
20
+ warnings: SdkDiscoveryWarning[];
21
+ }
22
+
23
+ export class SdkDiscoveryError extends Error {
24
+ readonly code = "discovery_error";
25
+ constructor(
26
+ readonly path: string,
27
+ message: string,
28
+ ) {
29
+ super(message);
30
+ this.name = "SdkDiscoveryError";
31
+ }
32
+ }
33
+
34
+ function endpointDirectory(repo: string): string {
35
+ return path.join(repo, ".gjc", "state", "sdk");
36
+ }
37
+
38
+ function parseEndpoint(sessionId: string, file: string, value: unknown): SdkSessionEndpoint {
39
+ if (!value || typeof value !== "object")
40
+ throw new SdkDiscoveryError(file, "SDK endpoint discovery record must be an object.");
41
+ const endpoint = value as { version?: unknown; url?: unknown; token?: unknown };
42
+ if (typeof endpoint.version === "number" && endpoint.version > 1)
43
+ throw new SdkDiscoveryError(file, "Unsupported SDK endpoint discovery state version.");
44
+ if (typeof endpoint.url !== "string" || typeof endpoint.token !== "string" || !endpoint.url || !endpoint.token)
45
+ throw new SdkDiscoveryError(file, "SDK endpoint discovery record is invalid.");
46
+ return { sessionId, url: endpoint.url, token: endpoint.token, path: file };
47
+ }
48
+
49
+ function discoveryError(file: string, error: unknown): SdkDiscoveryError {
50
+ if (error instanceof SdkDiscoveryError) return error;
51
+ return new SdkDiscoveryError(file, "Unable to read SDK discovery record.");
52
+ }
53
+
54
+ /** Lists endpoint files and returns individual malformed or unreadable records as warnings. */
55
+ export async function listSdkSessionEndpoints(repo: string): Promise<SdkSessionEndpointList> {
56
+ const directory = endpointDirectory(repo);
57
+ let entries: Array<{ name: string; isFile(): boolean }>;
58
+ try {
59
+ entries = (await fs.readdir(directory, { withFileTypes: true })) as Array<{ name: string; isFile(): boolean }>;
60
+ } catch (error) {
61
+ if ((error as NodeJS.ErrnoException).code === "ENOENT") return { endpoints: [], warnings: [] };
62
+ throw discoveryError(directory, error);
63
+ }
64
+ const results = await Promise.all(
65
+ entries
66
+ .filter(entry => entry.isFile() && entry.name.endsWith(".json"))
67
+ .map(async entry => {
68
+ const sessionId = entry.name.slice(0, -".json".length);
69
+ const file = path.join(directory, entry.name);
70
+ try {
71
+ return { endpoint: parseEndpoint(sessionId, file, JSON.parse(await fs.readFile(file, "utf8"))) };
72
+ } catch (error) {
73
+ return { warning: discoveryError(file, error) };
74
+ }
75
+ }),
76
+ );
77
+ return {
78
+ endpoints: results.flatMap(result => (result.endpoint ? [result.endpoint] : [])),
79
+ warnings: results.flatMap(result =>
80
+ result.warning
81
+ ? [{ code: result.warning.code, path: result.warning.path, message: result.warning.message }]
82
+ : [],
83
+ ),
84
+ };
85
+ }
86
+
87
+ /** Resolves one per-session SDK endpoint discovery file. */
88
+ export async function readSdkSessionEndpoint(repo: string, sessionId: string): Promise<SdkSessionEndpoint | null> {
89
+ if (!sessionId || sessionId.includes(path.sep) || sessionId.includes("/")) return null;
90
+ const file = path.join(endpointDirectory(repo), `${sessionId}.json`);
91
+ try {
92
+ return parseEndpoint(sessionId, file, JSON.parse(await fs.readFile(file, "utf8")));
93
+ } catch (error) {
94
+ if ((error as NodeJS.ErrnoException).code === "ENOENT") return null;
95
+ throw discoveryError(file, error);
96
+ }
97
+ }
98
+
99
+ /** Reads the agent-global broker discovery record. */
100
+ export async function readSdkBrokerDiscovery(agentDir: string): Promise<BrokerDiscovery | null> {
101
+ try {
102
+ return await readBrokerFile(agentDir);
103
+ } catch (error) {
104
+ const file = path.join(agentDir, "sdk", "broker.json");
105
+ if ((error as NodeJS.ErrnoException).code === "ENOENT") return null;
106
+ throw discoveryError(file, error);
107
+ }
108
+ }
@@ -0,0 +1,2 @@
1
+ export * from "./client";
2
+ export * from "./discovery";