@gajae-code/coding-agent 0.10.2 → 0.11.0

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