@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
@@ -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";