@gajae-code/coding-agent 0.10.1 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (474) hide show
  1. package/CHANGELOG.md +70 -2
  2. package/dist/types/append-only-mode.d.ts +1 -1
  3. package/dist/types/cli/args.d.ts +4 -5
  4. package/dist/types/cli/daemon-cli.d.ts +12 -1
  5. package/dist/types/cli/notify-cli.d.ts +21 -1
  6. package/dist/types/cli.d.ts +3 -0
  7. package/dist/types/commands/daemon.d.ts +39 -0
  8. package/dist/types/commands/launch.d.ts +3 -0
  9. package/dist/types/commands/notify.d.ts +28 -1
  10. package/dist/types/commands/sdk.d.ts +33 -0
  11. package/dist/types/config/atomic-yaml-patch.d.ts +85 -0
  12. package/dist/types/config/model-profile-activation.d.ts +35 -15
  13. package/dist/types/config/model-profiles.d.ts +11 -5
  14. package/dist/types/config/model-registry.d.ts +3 -3
  15. package/dist/types/config/model-resolver.d.ts +39 -6
  16. package/dist/types/config/model-selector-value.d.ts +17 -0
  17. package/dist/types/config/models-config-schema.d.ts +10 -6
  18. package/dist/types/config/settings-schema.d.ts +133 -6
  19. package/dist/types/config/settings.d.ts +63 -35
  20. package/dist/types/coordinator-mcp/model-preset.d.ts +7 -6
  21. package/dist/types/coordinator-mcp/server.d.ts +6 -49
  22. package/dist/types/daemon/builtin.d.ts +6 -5
  23. package/dist/types/daemon/control-types.d.ts +1 -1
  24. package/dist/types/discovery/mcp-json.d.ts +12 -1
  25. package/dist/types/extensibility/custom-tools/types.d.ts +1 -1
  26. package/dist/types/extensibility/extensions/compact-handler.d.ts +4 -2
  27. package/dist/types/extensibility/extensions/get-commands-handler.d.ts +2 -2
  28. package/dist/types/extensibility/extensions/loader.d.ts +10 -1
  29. package/dist/types/extensibility/extensions/runner.d.ts +3 -3
  30. package/dist/types/extensibility/extensions/types.d.ts +141 -16
  31. package/dist/types/extensibility/hooks/types.d.ts +1 -1
  32. package/dist/types/gjc-runtime/launch-tmux.d.ts +3 -2
  33. package/dist/types/gjc-runtime/psmux-detect.d.ts +3 -0
  34. package/dist/types/gjc-runtime/session-state-sidecar.d.ts +3 -0
  35. package/dist/types/gjc-runtime/team-runtime.d.ts +3 -4
  36. package/dist/types/gjc-runtime/tmux-owner-isolation-cli.d.ts +13 -0
  37. package/dist/types/gjc-runtime/tmux-sessions.d.ts +4 -1
  38. package/dist/types/gjc-runtime/windows-powershell-command.d.ts +9 -0
  39. package/dist/types/harness-control-plane/operate.d.ts +5 -5
  40. package/dist/types/harness-control-plane/owner.d.ts +18 -4
  41. package/dist/types/harness-control-plane/receipts.d.ts +0 -1
  42. package/dist/types/harness-control-plane/sdk-transport.d.ts +43 -0
  43. package/dist/types/harness-control-plane/session-transport.d.ts +48 -0
  44. package/dist/types/harness-control-plane/types.d.ts +3 -4
  45. package/dist/types/lsp/index.d.ts +1 -1
  46. package/dist/types/main.d.ts +32 -38
  47. package/dist/types/modes/acp/acp-agent.d.ts +224 -53
  48. package/dist/types/modes/acp/acp-client-bridge.d.ts +1 -0
  49. package/dist/types/modes/acp/acp-mode.d.ts +6 -15
  50. package/dist/types/modes/acp/permission-mode.d.ts +4 -0
  51. package/dist/types/modes/acp/startup-options.d.ts +6 -0
  52. package/dist/types/modes/components/agent-dashboard.d.ts +3 -0
  53. package/dist/types/modes/components/gajae-pet-widget.d.ts +1 -0
  54. package/dist/types/modes/components/model-selector.d.ts +1 -0
  55. package/dist/types/modes/components/notifications-settings-editor.d.ts +135 -0
  56. package/dist/types/modes/components/pet-capability.d.ts +37 -0
  57. package/dist/types/modes/components/pet-selector.d.ts +1 -1
  58. package/dist/types/modes/components/settings-selector.d.ts +15 -4
  59. package/dist/types/modes/components/welcome.d.ts +1 -1
  60. package/dist/types/modes/controllers/selector-controller.d.ts +35 -1
  61. package/dist/types/modes/index.d.ts +0 -4
  62. package/dist/types/modes/interactive-mode.d.ts +5 -1
  63. package/dist/types/modes/runtime-init.d.ts +2 -2
  64. package/dist/types/modes/shared/agent-wire/approval-gate.d.ts +6 -9
  65. package/dist/types/modes/shared/agent-wire/deep-interview-gate.d.ts +4 -6
  66. package/dist/types/modes/shared/agent-wire/event-contract.d.ts +6 -6
  67. package/dist/types/modes/shared/agent-wire/event-envelope.d.ts +4 -9
  68. package/dist/types/modes/shared/agent-wire/event-observation.d.ts +1 -1
  69. package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +169 -30
  70. package/dist/types/modes/shared/agent-wire/workflow-gate-schema.d.ts +7 -7
  71. package/dist/types/modes/shared/agent-wire/workflow-gate-types.d.ts +105 -0
  72. package/dist/types/modes/types.d.ts +16 -1
  73. package/dist/types/runtime-mcp/client.d.ts +2 -0
  74. package/dist/types/runtime-mcp/config.d.ts +5 -1
  75. package/dist/types/runtime-mcp/manager.d.ts +8 -1
  76. package/dist/types/runtime-mcp/types.d.ts +4 -0
  77. package/dist/types/sdk/acp/adapter.d.ts +67 -0
  78. package/dist/types/sdk/acp/index.d.ts +2 -0
  79. package/dist/types/sdk/broker/broker.d.ts +53 -0
  80. package/dist/types/sdk/broker/discovery.d.ts +30 -0
  81. package/dist/types/sdk/broker/ensure.d.ts +33 -0
  82. package/dist/types/sdk/broker/identity.d.ts +3 -0
  83. package/dist/types/sdk/broker/index.d.ts +8 -0
  84. package/dist/types/sdk/broker/lifecycle-ledger.d.ts +95 -0
  85. package/dist/types/sdk/broker/lifecycle.d.ts +85 -0
  86. package/dist/types/sdk/broker/process-incarnation.d.ts +14 -0
  87. package/dist/types/sdk/broker/runtime.d.ts +33 -0
  88. package/dist/types/sdk/broker/session-index.d.ts +57 -0
  89. package/dist/types/sdk/broker/state-version.d.ts +8 -0
  90. package/dist/types/sdk/broker/transport.d.ts +9 -0
  91. package/dist/types/sdk/bus/chat-command-policy.d.ts +49 -0
  92. package/dist/types/sdk/bus/chat-daemon-cli.d.ts +21 -0
  93. package/dist/types/sdk/bus/chat-daemon-control.d.ts +111 -0
  94. package/dist/types/sdk/bus/chat-daemon-runtime.d.ts +77 -0
  95. package/dist/types/sdk/bus/chat-effect-journal.d.ts +84 -0
  96. package/dist/types/{notifications → sdk/bus}/config-commands.d.ts +7 -2
  97. package/dist/types/sdk/bus/config.d.ts +274 -0
  98. package/dist/types/sdk/bus/conversation-store.d.ts +72 -0
  99. package/dist/types/sdk/bus/discord-conversation.d.ts +58 -0
  100. package/dist/types/sdk/bus/discord-daemon.d.ts +45 -0
  101. package/dist/types/sdk/bus/discord-live-provider.d.ts +70 -0
  102. package/dist/types/sdk/bus/discord-provider.d.ts +85 -0
  103. package/dist/types/{notifications → sdk/bus}/html-format.d.ts +2 -2
  104. package/dist/types/{notifications → sdk/bus}/index.d.ts +113 -13
  105. package/dist/types/{notifications → sdk/bus}/lifecycle-control-runtime.d.ts +4 -2
  106. package/dist/types/{notifications → sdk/bus}/lifecycle-orchestrator.d.ts +18 -21
  107. package/dist/types/{notifications → sdk/bus}/managed-daemon.d.ts +1 -1
  108. package/dist/types/sdk/bus/native-runtime-compatibility.d.ts +13 -0
  109. package/dist/types/sdk/bus/notification-orchestration.d.ts +170 -0
  110. package/dist/types/{notifications → sdk/bus}/notification-service.d.ts +7 -1
  111. package/dist/types/sdk/bus/session-control.d.ts +83 -0
  112. package/dist/types/sdk/bus/slack-conversation.d.ts +56 -0
  113. package/dist/types/sdk/bus/slack-daemon.d.ts +60 -0
  114. package/dist/types/sdk/bus/slack-live-provider.d.ts +59 -0
  115. package/dist/types/sdk/bus/slack-provider.d.ts +55 -0
  116. package/dist/types/{notifications → sdk/bus}/telegram-cli.d.ts +4 -4
  117. package/dist/types/{notifications → sdk/bus}/telegram-daemon-cli.d.ts +14 -5
  118. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +12 -0
  119. package/dist/types/{notifications → sdk/bus}/telegram-daemon-control.d.ts +2 -2
  120. package/dist/types/{notifications → sdk/bus}/telegram-daemon.d.ts +55 -17
  121. package/dist/types/{notifications → sdk/bus}/telegram-reference.d.ts +2 -2
  122. package/dist/types/sdk/bus/telegram-setup.d.ts +128 -0
  123. package/dist/types/{notifications → sdk/bus}/topic-registry.d.ts +11 -0
  124. package/dist/types/sdk/cli/index.d.ts +1 -0
  125. package/dist/types/sdk/cli/session-cli.d.ts +19 -0
  126. package/dist/types/sdk/client/client.d.ts +1 -0
  127. package/dist/types/sdk/client/discovery.d.ts +27 -0
  128. package/dist/types/sdk/client/index.d.ts +2 -0
  129. package/dist/types/sdk/host/control/dispatch.d.ts +34 -0
  130. package/dist/types/sdk/host/control/index.d.ts +2 -0
  131. package/dist/types/sdk/host/control/operations.d.ts +65 -0
  132. package/dist/types/sdk/host/events.d.ts +35 -0
  133. package/dist/types/sdk/host/host.d.ts +35 -0
  134. package/dist/types/sdk/host/index.d.ts +4 -0
  135. package/dist/types/sdk/host/query/cursor.d.ts +62 -0
  136. package/dist/types/sdk/host/query/handlers.d.ts +70 -0
  137. package/dist/types/sdk/host/query/index.d.ts +3 -0
  138. package/dist/types/sdk/host/query/revision-store.d.ts +60 -0
  139. package/dist/types/sdk/host/reverse-leases.d.ts +45 -0
  140. package/dist/types/sdk/host/types.d.ts +32 -0
  141. package/dist/types/sdk/index.d.ts +6 -0
  142. package/dist/types/sdk/lifecycle-session.d.ts +14 -0
  143. package/dist/types/sdk/mcp/index.d.ts +1 -0
  144. package/dist/types/sdk/mcp/server.d.ts +37 -0
  145. package/dist/types/sdk/models.d.ts +44 -0
  146. package/dist/types/sdk/protocol/adapter-validation.d.ts +14 -0
  147. package/dist/types/sdk/protocol/operation-registry.d.ts +24 -0
  148. package/dist/types/{sdk.d.ts → sdk/session.d.ts} +44 -38
  149. package/dist/types/sdk/startup-capability.d.ts +50 -0
  150. package/dist/types/session/agent-session.d.ts +114 -21
  151. package/dist/types/session/default-model-selection.d.ts +25 -0
  152. package/dist/types/session/fallback-chain-controller.d.ts +52 -0
  153. package/dist/types/session/session-manager.d.ts +58 -1
  154. package/dist/types/setup/credential-auto-import.d.ts +36 -6
  155. package/dist/types/tools/ask-answer-registry.d.ts +1 -1
  156. package/dist/types/tools/browser/benchmark/detector-report.d.ts +63 -0
  157. package/dist/types/tools/browser/benchmark/run-suite.d.ts +18 -0
  158. package/dist/types/tools/browser/launch.d.ts +22 -0
  159. package/dist/types/tools/browser/profile-discovery.d.ts +31 -0
  160. package/dist/types/tools/browser/profile-posture.d.ts +37 -0
  161. package/dist/types/tools/browser/profile-reuse.d.ts +39 -0
  162. package/dist/types/tools/browser/profile-warmup.d.ts +39 -0
  163. package/dist/types/tools/browser/registry.d.ts +19 -0
  164. package/dist/types/tools/browser/tab-protocol.d.ts +4 -0
  165. package/dist/types/tools/index.d.ts +8 -8
  166. package/package.json +34 -13
  167. package/scripts/build-sdk-package-smoke.ts +94 -0
  168. package/scripts/capture-notifications-settings-showcase.ts +435 -0
  169. package/scripts/compile-args.ts +4 -2
  170. package/scripts/g005-daemon-smoke.ts +4 -5
  171. package/scripts/g011-daemon-path-smoke.ts +5 -5
  172. package/scripts/generate-sdk-adapter-parity-manifest.ts +163 -0
  173. package/scripts/generate-sdk-operation-inventory.ts +867 -0
  174. package/scripts/generate-telegram-baseline-manifest.ts +128 -0
  175. package/scripts/manifest-schema.ts +124 -0
  176. package/scripts/run-test-manifest.ts +153 -0
  177. package/scripts/run-threat-model-check.ts +157 -0
  178. package/scripts/verify-gjc-sdk-canonicalization.ts +3467 -0
  179. package/scripts/verify-gjc-sdk-rename.ts +90 -0
  180. package/src/append-only-mode.ts +1 -1
  181. package/src/cli/args.ts +43 -12
  182. package/src/cli/auth-gateway-cli.ts +2 -2
  183. package/src/cli/config-cli.ts +2 -1
  184. package/src/cli/daemon-cli.ts +63 -14
  185. package/src/cli/list-models.ts +1 -1
  186. package/src/cli/notify-cli.ts +288 -286
  187. package/src/cli.ts +21 -2
  188. package/src/commands/daemon.ts +50 -6
  189. package/src/commands/harness.ts +93 -36
  190. package/src/commands/launch.ts +5 -2
  191. package/src/commands/mcp-serve.ts +19 -12
  192. package/src/commands/notify.ts +36 -3
  193. package/src/commands/sdk.ts +426 -0
  194. package/src/commit/agentic/agent.ts +1 -0
  195. package/src/config/atomic-yaml-patch.ts +423 -0
  196. package/src/config/model-profile-activation.ts +240 -89
  197. package/src/config/model-profiles.ts +37 -34
  198. package/src/config/model-registry.ts +51 -26
  199. package/src/config/model-resolver.ts +138 -51
  200. package/src/config/model-selector-value.ts +50 -0
  201. package/src/config/models-config-schema.ts +14 -21
  202. package/src/config/settings-schema.ts +128 -10
  203. package/src/config/settings.ts +1120 -158
  204. package/src/coordinator-mcp/model-preset.ts +74 -20
  205. package/src/coordinator-mcp/server.ts +1597 -3052
  206. package/src/daemon/builtin.ts +8 -5
  207. package/src/daemon/control-types.ts +1 -1
  208. package/src/defaults/gjc/skills/team/SKILL.md +4 -4
  209. package/src/discovery/mcp-json.ts +327 -20
  210. package/src/extensibility/custom-tools/types.ts +1 -1
  211. package/src/extensibility/extensions/compact-handler.ts +3 -3
  212. package/src/extensibility/extensions/get-commands-handler.ts +2 -2
  213. package/src/extensibility/extensions/loader.ts +69 -5
  214. package/src/extensibility/extensions/runner.ts +112 -4
  215. package/src/extensibility/extensions/types.ts +176 -17
  216. package/src/extensibility/hooks/types.ts +1 -1
  217. package/src/extensibility/slash-commands.ts +3 -3
  218. package/src/gjc-runtime/launch-tmux.ts +170 -86
  219. package/src/gjc-runtime/psmux-detect.ts +82 -4
  220. package/src/gjc-runtime/session-state-sidecar.ts +41 -31
  221. package/src/gjc-runtime/team-runtime.ts +54 -35
  222. package/src/gjc-runtime/tmux-owner-isolation-cli.ts +53 -17
  223. package/src/gjc-runtime/tmux-owner-isolation.ts +5 -2
  224. package/src/gjc-runtime/tmux-sessions.ts +19 -13
  225. package/src/gjc-runtime/ultragoal-guard.ts +53 -6
  226. package/src/gjc-runtime/ultragoal-runtime.ts +155 -3
  227. package/src/gjc-runtime/windows-powershell-command.ts +58 -0
  228. package/src/harness-control-plane/operate.ts +9 -9
  229. package/src/harness-control-plane/owner.ts +283 -39
  230. package/src/harness-control-plane/receipts.ts +0 -1
  231. package/src/harness-control-plane/sdk-transport.ts +395 -0
  232. package/src/harness-control-plane/session-transport.ts +94 -0
  233. package/src/harness-control-plane/types.ts +1 -1
  234. package/src/internal-urls/docs-index.generated.ts +36 -37
  235. package/src/lsp/client.ts +42 -6
  236. package/src/lsp/index.ts +2 -2
  237. package/src/main.ts +299 -204
  238. package/src/modes/DESIGN.md +258 -0
  239. package/src/modes/acp/acp-agent.ts +1228 -2612
  240. package/src/modes/acp/acp-client-bridge.ts +2 -20
  241. package/src/modes/acp/acp-event-mapper.ts +18 -2
  242. package/src/modes/acp/acp-mode.ts +8 -36
  243. package/src/modes/acp/permission-mode.ts +25 -0
  244. package/src/modes/acp/startup-options.ts +6 -0
  245. package/src/modes/components/agent-dashboard.ts +37 -17
  246. package/src/modes/components/custom-editor.ts +1 -0
  247. package/src/modes/components/gajae-pet-widget.ts +169 -20
  248. package/src/modes/components/model-selector.ts +93 -35
  249. package/src/modes/components/notifications-settings-editor.ts +1379 -0
  250. package/src/modes/components/pet-capability.ts +115 -0
  251. package/src/modes/components/pet-selector.ts +4 -6
  252. package/src/modes/components/settings-selector.ts +86 -11
  253. package/src/modes/components/welcome.ts +4 -4
  254. package/src/modes/controllers/command-controller.ts +1 -2
  255. package/src/modes/controllers/event-controller.ts +11 -16
  256. package/src/modes/controllers/extension-ui-controller.ts +357 -12
  257. package/src/modes/controllers/input-controller.ts +43 -13
  258. package/src/modes/controllers/selector-controller.ts +671 -44
  259. package/src/modes/index.ts +0 -22
  260. package/src/modes/interactive-mode.ts +108 -24
  261. package/src/modes/runtime-init.ts +298 -6
  262. package/src/modes/shared/agent-wire/approval-gate.ts +9 -11
  263. package/src/modes/shared/agent-wire/deep-interview-gate.ts +10 -11
  264. package/src/modes/shared/agent-wire/event-contract.ts +7 -8
  265. package/src/modes/shared/agent-wire/event-envelope.ts +9 -17
  266. package/src/modes/shared/agent-wire/event-observation.ts +16 -7
  267. package/src/modes/shared/agent-wire/workflow-gate-broker.ts +1254 -87
  268. package/src/modes/shared/agent-wire/workflow-gate-schema.ts +15 -15
  269. package/src/modes/shared/agent-wire/workflow-gate-types.ts +113 -0
  270. package/src/modes/types.ts +16 -1
  271. package/src/runtime-mcp/client.ts +94 -19
  272. package/src/runtime-mcp/config.ts +27 -15
  273. package/src/runtime-mcp/manager.ts +343 -105
  274. package/src/runtime-mcp/oauth-flow.ts +42 -12
  275. package/src/runtime-mcp/transports/http.ts +49 -19
  276. package/src/runtime-mcp/transports/stdio.ts +47 -28
  277. package/src/runtime-mcp/types.ts +10 -0
  278. package/src/sdk/acp/adapter.ts +418 -0
  279. package/src/sdk/acp/index.ts +2 -0
  280. package/src/sdk/broker/broker.ts +642 -0
  281. package/src/sdk/broker/discovery.ts +94 -0
  282. package/src/sdk/broker/ensure.ts +249 -0
  283. package/src/sdk/broker/identity.ts +42 -0
  284. package/src/sdk/broker/index.ts +8 -0
  285. package/src/sdk/broker/internal-source-marker-2178.txt +1 -0
  286. package/src/sdk/broker/internal-source.bunfig.toml +1 -0
  287. package/src/sdk/broker/lifecycle-ledger.ts +286 -0
  288. package/src/sdk/broker/lifecycle.ts +2157 -0
  289. package/src/sdk/broker/process-incarnation.ts +159 -0
  290. package/src/sdk/broker/runtime.ts +164 -0
  291. package/src/sdk/broker/session-index.ts +318 -0
  292. package/src/sdk/broker/state-version.ts +23 -0
  293. package/src/sdk/broker/transport.ts +125 -0
  294. package/src/sdk/bus/chat-command-policy.ts +107 -0
  295. package/src/sdk/bus/chat-daemon-cli.ts +214 -0
  296. package/src/sdk/bus/chat-daemon-control.ts +713 -0
  297. package/src/sdk/bus/chat-daemon-runtime.ts +526 -0
  298. package/src/sdk/bus/chat-effect-journal.ts +353 -0
  299. package/src/{notifications → sdk/bus}/config-commands.ts +39 -10
  300. package/src/sdk/bus/config.ts +433 -0
  301. package/src/sdk/bus/conversation-store.ts +391 -0
  302. package/src/sdk/bus/discord-conversation.ts +85 -0
  303. package/src/sdk/bus/discord-daemon.ts +2275 -0
  304. package/src/sdk/bus/discord-live-provider.ts +521 -0
  305. package/src/sdk/bus/discord-provider.ts +56 -0
  306. package/src/{notifications → sdk/bus}/html-format.ts +2 -2
  307. package/src/sdk/bus/index.ts +3943 -0
  308. package/src/{notifications → sdk/bus}/lifecycle-commands.ts +2 -0
  309. package/src/{notifications → sdk/bus}/lifecycle-control-runtime.ts +225 -196
  310. package/src/{notifications → sdk/bus}/lifecycle-orchestrator.ts +161 -74
  311. package/src/{notifications → sdk/bus}/managed-daemon.ts +2 -2
  312. package/src/sdk/bus/native-runtime-compatibility.ts +42 -0
  313. package/src/sdk/bus/natives-augment.d.ts +38 -0
  314. package/src/sdk/bus/notification-orchestration.ts +535 -0
  315. package/src/{notifications → sdk/bus}/notification-service.ts +106 -12
  316. package/src/sdk/bus/session-control.ts +333 -0
  317. package/src/sdk/bus/slack-conversation.ts +74 -0
  318. package/src/sdk/bus/slack-daemon.ts +2144 -0
  319. package/src/sdk/bus/slack-live-provider.ts +380 -0
  320. package/src/sdk/bus/slack-provider.ts +76 -0
  321. package/src/{notifications → sdk/bus}/telegram-cli.ts +8 -8
  322. package/src/sdk/bus/telegram-daemon-cli.ts +330 -0
  323. package/src/sdk/bus/telegram-daemon-contract.ts +14 -0
  324. package/src/{notifications → sdk/bus}/telegram-daemon-control.ts +4 -4
  325. package/src/{notifications → sdk/bus}/telegram-daemon.ts +502 -54
  326. package/src/{notifications → sdk/bus}/telegram-reference.ts +2 -2
  327. package/src/sdk/bus/telegram-setup.ts +663 -0
  328. package/src/{notifications → sdk/bus}/topic-registry.ts +32 -0
  329. package/src/sdk/cli/index.ts +1 -0
  330. package/src/sdk/cli/session-cli.ts +275 -0
  331. package/src/sdk/client/client.ts +1 -0
  332. package/src/sdk/client/discovery.ts +108 -0
  333. package/src/sdk/client/index.ts +2 -0
  334. package/src/sdk/host/control/dispatch.ts +367 -0
  335. package/src/sdk/host/control/index.ts +10 -0
  336. package/src/sdk/host/control/operations.ts +63 -0
  337. package/src/sdk/host/events.ts +91 -0
  338. package/src/sdk/host/host.ts +296 -0
  339. package/src/sdk/host/index.ts +4 -0
  340. package/src/sdk/host/query/cursor.ts +189 -0
  341. package/src/sdk/host/query/handlers.ts +533 -0
  342. package/src/sdk/host/query/index.ts +3 -0
  343. package/src/sdk/host/query/revision-store.ts +1126 -0
  344. package/src/sdk/host/reverse-leases.ts +325 -0
  345. package/src/sdk/host/types.ts +29 -0
  346. package/src/sdk/index.ts +13 -0
  347. package/src/sdk/lifecycle-session.ts +39 -0
  348. package/src/sdk/mcp/index.ts +1 -0
  349. package/src/sdk/mcp/server.ts +332 -0
  350. package/src/sdk/models.ts +168 -0
  351. package/src/sdk/protocol/adapter-validation.ts +48 -0
  352. package/src/sdk/protocol/operation-inventory.generated.json +5654 -0
  353. package/src/sdk/protocol/operation-registry.ts +312 -0
  354. package/src/{sdk.ts → sdk/session.ts} +339 -212
  355. package/src/sdk/startup-capability.ts +189 -0
  356. package/src/session/agent-session.ts +2470 -866
  357. package/src/session/default-model-selection.ts +93 -0
  358. package/src/session/fallback-chain-controller.ts +136 -0
  359. package/src/session/session-manager.ts +447 -13
  360. package/src/session/session-storage.ts +8 -1
  361. package/src/setup/credential-auto-import.ts +290 -35
  362. package/src/setup/hermes/templates/operator-instructions.v1.md +3 -5
  363. package/src/slash-commands/builtin-registry.ts +33 -30
  364. package/src/task/executor.ts +62 -13
  365. package/src/tools/ask-answer-registry.ts +1 -1
  366. package/src/tools/ask.ts +13 -8
  367. package/src/tools/browser/STEALTH-THIRD-PARTY-NOTICES.md +26 -0
  368. package/src/tools/browser/benchmark/detector-report.ts +157 -0
  369. package/src/tools/browser/benchmark/run-suite.ts +39 -0
  370. package/src/tools/browser/launch.ts +124 -19
  371. package/src/tools/browser/profile-discovery.ts +63 -0
  372. package/src/tools/browser/profile-posture.ts +59 -0
  373. package/src/tools/browser/profile-reuse.ts +102 -0
  374. package/src/tools/browser/profile-warmup.ts +109 -0
  375. package/src/tools/browser/registry.ts +87 -11
  376. package/src/tools/browser/tab-protocol.ts +1 -0
  377. package/src/tools/browser/tab-supervisor.ts +1 -0
  378. package/src/tools/browser/tab-worker.ts +1 -1
  379. package/src/tools/browser.ts +6 -0
  380. package/src/tools/index.ts +8 -8
  381. package/src/tools/puppeteer/14_stealth_permissions.txt +57 -0
  382. package/src/tools/puppeteer/15_stealth_webrtc.txt +60 -0
  383. package/src/tools/telegram-send.ts +2 -2
  384. package/vendor/insane-search/MANIFEST.json +2 -1
  385. package/vendor/insane-search/engine/bias_check.py +4 -1
  386. package/vendor/insane-search/engine/phase0.py +26 -1
  387. package/dist/types/harness-control-plane/rpc-adapter.d.ts +0 -69
  388. package/dist/types/modes/bridge/auth.d.ts +0 -12
  389. package/dist/types/modes/bridge/bridge-client-bridge.d.ts +0 -9
  390. package/dist/types/modes/bridge/bridge-mode.d.ts +0 -47
  391. package/dist/types/modes/bridge/bridge-ui-context.d.ts +0 -88
  392. package/dist/types/modes/bridge/event-stream.d.ts +0 -8
  393. package/dist/types/modes/rpc/host-tools.d.ts +0 -1
  394. package/dist/types/modes/rpc/host-uris.d.ts +0 -1
  395. package/dist/types/modes/rpc/rpc-client.d.ts +0 -299
  396. package/dist/types/modes/rpc/rpc-mode.d.ts +0 -86
  397. package/dist/types/modes/rpc/rpc-socket-security.d.ts +0 -10
  398. package/dist/types/modes/rpc/rpc-types.d.ts +0 -810
  399. package/dist/types/modes/shared/agent-wire/command-contract.d.ts +0 -18
  400. package/dist/types/modes/shared/agent-wire/command-dispatch.d.ts +0 -37
  401. package/dist/types/modes/shared/agent-wire/command-validation.d.ts +0 -2
  402. package/dist/types/modes/shared/agent-wire/handshake.d.ts +0 -56
  403. package/dist/types/modes/shared/agent-wire/host-tool-bridge.d.ts +0 -16
  404. package/dist/types/modes/shared/agent-wire/host-uri-bridge.d.ts +0 -17
  405. package/dist/types/modes/shared/agent-wire/protocol.d.ts +0 -25
  406. package/dist/types/modes/shared/agent-wire/responses.d.ts +0 -4
  407. package/dist/types/modes/shared/agent-wire/scopes.d.ts +0 -18
  408. package/dist/types/modes/shared/agent-wire/session-registry.d.ts +0 -25
  409. package/dist/types/modes/shared/agent-wire/ui-request-broker.d.ts +0 -42
  410. package/dist/types/modes/shared/agent-wire/ui-result.d.ts +0 -27
  411. package/dist/types/modes/shared/agent-wire/unattended-action-policy.d.ts +0 -29
  412. package/dist/types/modes/shared/agent-wire/unattended-audit.d.ts +0 -68
  413. package/dist/types/modes/shared/agent-wire/unattended-run-controller.d.ts +0 -166
  414. package/dist/types/modes/shared/agent-wire/unattended-session.d.ts +0 -127
  415. package/dist/types/notifications/config.d.ts +0 -132
  416. package/src/harness-control-plane/rpc-adapter.ts +0 -290
  417. package/src/modes/bridge/auth.ts +0 -41
  418. package/src/modes/bridge/bridge-client-bridge.ts +0 -47
  419. package/src/modes/bridge/bridge-mode.ts +0 -675
  420. package/src/modes/bridge/bridge-ui-context.ts +0 -200
  421. package/src/modes/bridge/event-stream.ts +0 -70
  422. package/src/modes/rpc/host-tools.ts +0 -1
  423. package/src/modes/rpc/host-uris.ts +0 -1
  424. package/src/modes/rpc/rpc-client.ts +0 -1166
  425. package/src/modes/rpc/rpc-mode.ts +0 -1029
  426. package/src/modes/rpc/rpc-socket-security.ts +0 -115
  427. package/src/modes/rpc/rpc-types.ts +0 -637
  428. package/src/modes/shared/agent-wire/command-contract.ts +0 -18
  429. package/src/modes/shared/agent-wire/command-dispatch.ts +0 -498
  430. package/src/modes/shared/agent-wire/command-validation.ts +0 -181
  431. package/src/modes/shared/agent-wire/handshake.ts +0 -157
  432. package/src/modes/shared/agent-wire/host-tool-bridge.ts +0 -197
  433. package/src/modes/shared/agent-wire/host-uri-bridge.ts +0 -236
  434. package/src/modes/shared/agent-wire/protocol.ts +0 -46
  435. package/src/modes/shared/agent-wire/responses.ts +0 -17
  436. package/src/modes/shared/agent-wire/scopes.ts +0 -94
  437. package/src/modes/shared/agent-wire/session-registry.ts +0 -109
  438. package/src/modes/shared/agent-wire/ui-request-broker.ts +0 -150
  439. package/src/modes/shared/agent-wire/ui-result.ts +0 -48
  440. package/src/modes/shared/agent-wire/unattended-action-policy.ts +0 -365
  441. package/src/modes/shared/agent-wire/unattended-audit.ts +0 -176
  442. package/src/modes/shared/agent-wire/unattended-run-controller.ts +0 -426
  443. package/src/modes/shared/agent-wire/unattended-session.ts +0 -528
  444. package/src/notifications/config.ts +0 -219
  445. package/src/notifications/index.ts +0 -1835
  446. package/src/notifications/telegram-daemon-cli.ts +0 -243
  447. package/src/tools/puppeteer/09_stealth_locale.txt +0 -46
  448. /package/dist/types/{notifications → sdk/bus}/attachment-registry.d.ts +0 -0
  449. /package/dist/types/{notifications → sdk/bus}/chat-adapters.d.ts +0 -0
  450. /package/dist/types/{notifications → sdk/bus}/daemon-paths.d.ts +0 -0
  451. /package/dist/types/{notifications → sdk/bus}/engine.d.ts +0 -0
  452. /package/dist/types/{notifications → sdk/bus}/helpers.d.ts +0 -0
  453. /package/dist/types/{notifications → sdk/bus}/lifecycle-commands.d.ts +0 -0
  454. /package/dist/types/{notifications → sdk/bus}/operator-runtime.d.ts +0 -0
  455. /package/dist/types/{notifications → sdk/bus}/rate-limit-pool.d.ts +0 -0
  456. /package/dist/types/{notifications → sdk/bus}/recent-activity.d.ts +0 -0
  457. /package/dist/types/{notifications → sdk/bus}/reply-sent-store.d.ts +0 -0
  458. /package/dist/types/{notifications → sdk/bus}/rich-draft.d.ts +0 -0
  459. /package/dist/types/{notifications → sdk/bus}/rich-render.d.ts +0 -0
  460. /package/dist/types/{notifications → sdk/bus}/threaded-inbound.d.ts +0 -0
  461. /package/dist/types/{notifications → sdk/bus}/threaded-render.d.ts +0 -0
  462. /package/src/{notifications → sdk/bus}/attachment-registry.ts +0 -0
  463. /package/src/{notifications → sdk/bus}/chat-adapters.ts +0 -0
  464. /package/src/{notifications → sdk/bus}/daemon-paths.ts +0 -0
  465. /package/src/{notifications → sdk/bus}/engine.ts +0 -0
  466. /package/src/{notifications → sdk/bus}/helpers.ts +0 -0
  467. /package/src/{notifications → sdk/bus}/operator-runtime.ts +0 -0
  468. /package/src/{notifications → sdk/bus}/rate-limit-pool.ts +0 -0
  469. /package/src/{notifications → sdk/bus}/recent-activity.ts +0 -0
  470. /package/src/{notifications → sdk/bus}/reply-sent-store.ts +0 -0
  471. /package/src/{notifications → sdk/bus}/rich-draft.ts +0 -0
  472. /package/src/{notifications → sdk/bus}/rich-render.ts +0 -0
  473. /package/src/{notifications → sdk/bus}/threaded-inbound.ts +0 -0
  474. /package/src/{notifications → sdk/bus}/threaded-render.ts +0 -0
@@ -0,0 +1,418 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { SdkClient, SdkClientError, type SdkFrame } from "../client";
3
+ import { validateAdapterControl, validateAdapterSecretFields } from "../protocol/adapter-validation";
4
+
5
+ import { OPERATIONS } from "../protocol/operation-registry";
6
+
7
+ type JsonObject = Record<string, unknown>;
8
+
9
+ /** The small agent-side ACP surface used for reverse requests. */
10
+ export interface AcpReverseConnection {
11
+ request?(method: string, params: JsonObject): Promise<unknown>;
12
+ [key: string]: unknown;
13
+ }
14
+
15
+ export interface AcpProviderRegistration {
16
+ capability: string;
17
+ definitions: unknown;
18
+ }
19
+
20
+ export interface AcpSdkAdapterOptions {
21
+ url: string;
22
+ token: string;
23
+ client?: SdkClient;
24
+ connection?: AcpReverseConnection;
25
+ providers?: AcpProviderRegistration[];
26
+ /** Lease IDs persisted by the ACP host across a WebSocket reconnect. */
27
+ expectedLeaseIds?: Record<string, string>;
28
+ heartbeatMs?: number;
29
+ reverseCancelTtlMs?: number;
30
+ }
31
+
32
+ export class AcpSdkAdapterError extends Error {
33
+ readonly code: string;
34
+ constructor(code: string, message = code) {
35
+ super(message);
36
+ this.name = "AcpSdkAdapterError";
37
+ this.code = code;
38
+ }
39
+ }
40
+
41
+ export type AcpReconnectFailedHandler = (error: SdkClientError) => void;
42
+ export type AcpFrameHandler = (frame: SdkFrame) => void;
43
+ type ReverseRequest = {
44
+ state: "pending" | "cancelled";
45
+ cancelTimer?: NodeJS.Timeout;
46
+ };
47
+
48
+ const SESSION_GLOBALS: Record<string, string> = {
49
+ newSession: "session.create",
50
+ loadSession: "session.resume",
51
+ resumeSession: "session.resume",
52
+ listSessions: "session.list",
53
+ forkSession: "session.fork",
54
+ closeSession: "session.close",
55
+ };
56
+
57
+ function isLifecycleOperation(operation: string): boolean {
58
+ return (
59
+ operation === "session.create" ||
60
+ operation === "session.fork" ||
61
+ operation === "session.resume" ||
62
+ operation === "session.close" ||
63
+ operation === "session.delete"
64
+ );
65
+ }
66
+
67
+ /**
68
+ * Pure ACP-to-SDK adapter. It deliberately owns neither an AgentSession nor an
69
+ * ACP bridge: all session work is performed through authenticated v3 frames.
70
+ */
71
+ export class AcpSdkAdapter {
72
+ readonly #client: SdkClient;
73
+ readonly #connection?: AcpReverseConnection;
74
+ readonly #providers: AcpProviderRegistration[];
75
+ readonly #heartbeatMs: number;
76
+ #unsubscribe?: () => void;
77
+ #unsubscribeReconnect?: () => void;
78
+ #unsubscribeReconnectFailed?: () => void;
79
+ #heartbeat?: NodeJS.Timeout;
80
+ #connectionId?: string;
81
+ #leases = new Map<string, string>();
82
+ #reclaiming?: Promise<void>;
83
+ #reverseRequests = new Map<string, ReverseRequest>();
84
+ #reconnectFailedHandlers = new Set<AcpReconnectFailedHandler>();
85
+ #frameHandlers = new Set<AcpFrameHandler>();
86
+
87
+ #reverseCancelTtlMs: number;
88
+ #closed = false;
89
+
90
+ constructor(options: AcpSdkAdapterOptions) {
91
+ this.#client = options.client ?? new SdkClient(options.url, options.token);
92
+ this.#connection = options.connection;
93
+ this.#providers = options.providers ?? [];
94
+ for (const [capability, leaseId] of Object.entries(options.expectedLeaseIds ?? {}))
95
+ this.#leases.set(capability, leaseId);
96
+ this.#heartbeatMs = options.heartbeatMs ?? 5_000;
97
+ this.#reverseCancelTtlMs = options.reverseCancelTtlMs ?? 30_000;
98
+ }
99
+
100
+ static async connect(options: AcpSdkAdapterOptions): Promise<AcpSdkAdapter> {
101
+ const client = options.client ?? (await SdkClient.connect(options.url, options.token));
102
+ const adapter = new AcpSdkAdapter({ ...options, client });
103
+ await adapter.start();
104
+ return adapter;
105
+ }
106
+
107
+ get leaseIds(): ReadonlyMap<string, string> {
108
+ return this.#leases;
109
+ }
110
+ get connectionId(): string | undefined {
111
+ return this.#connectionId;
112
+ }
113
+
114
+ onReconnectFailed(handler: AcpReconnectFailedHandler): () => void {
115
+ this.#reconnectFailedHandlers.add(handler);
116
+ return () => this.#reconnectFailedHandlers.delete(handler);
117
+ }
118
+
119
+ onFrame(handler: AcpFrameHandler): () => void {
120
+ this.#frameHandlers.add(handler);
121
+ return () => this.#frameHandlers.delete(handler);
122
+ }
123
+
124
+ async start(): Promise<void> {
125
+ if (this.#closed) throw new AcpSdkAdapterError("connection_closed");
126
+ this.#unsubscribe ??= this.#client.onFrame(frame => void this.#onFrame(frame));
127
+ this.#unsubscribeReconnect ??= this.#client.onReconnect(
128
+ () => void this.#reclaimProviders().catch(error => this.#reportReconnectFailure(error)),
129
+ );
130
+ this.#unsubscribeReconnectFailed ??= this.#client.onReconnectFailed(error => this.#reportReconnectFailure(error));
131
+ await this.#client.connect();
132
+ this.#connectionId = this.#client.connectionId;
133
+ if (this.#providers.length > 0 && !this.#connectionId) this.#connectionId = await this.#waitForConnectionId();
134
+ for (const provider of this.#providers) await this.registerProvider(provider);
135
+ this.#heartbeat ??= setInterval(
136
+ () => void this.#heartbeatLeases().catch(error => this.#reportReconnectFailure(error)),
137
+ this.#heartbeatMs,
138
+ );
139
+ }
140
+
141
+ async close(): Promise<void> {
142
+ if (this.#closed) return;
143
+ this.#closed = true;
144
+ if (this.#heartbeat) clearInterval(this.#heartbeat);
145
+ for (const request of this.#reverseRequests.values()) if (request.cancelTimer) clearTimeout(request.cancelTimer);
146
+ this.#reverseRequests.clear();
147
+ this.#unsubscribe?.();
148
+ this.#unsubscribeReconnect?.();
149
+ this.#unsubscribeReconnectFailed?.();
150
+ await this.#client.close();
151
+ }
152
+
153
+ async prompt(params: JsonObject | string): Promise<unknown> {
154
+ const text = typeof params === "string" ? params : String(params.prompt ?? params.text ?? "");
155
+ return await this.#client.control("turn.prompt", { ...(typeof params === "object" ? params : {}), text });
156
+ }
157
+ async cancel(): Promise<unknown> {
158
+ return await this.#client.control("turn.abort", {});
159
+ }
160
+ async setModel(params: JsonObject | string): Promise<unknown> {
161
+ const id = typeof params === "string" ? params : String(params.modelId ?? params.id ?? "");
162
+ return await this.#client.control("model.set", { id });
163
+ }
164
+
165
+ async control(operation: string, input: JsonObject = {}): Promise<unknown> {
166
+ this.#assertGenericDisposition("control", operation);
167
+ const { confirm, ...payload } = input;
168
+ const secretError = validateAdapterSecretFields(operation, payload);
169
+ if (secretError) throw new AcpSdkAdapterError(secretError.code, secretError.message);
170
+
171
+ const invalid = validateAdapterControl(operation, payload);
172
+ if (invalid) throw new AcpSdkAdapterError(invalid.code, invalid.message);
173
+ return await this.#client.control(operation, payload, { confirm: confirm === true });
174
+ }
175
+ async query(query: string, input: JsonObject = {}, cursor?: string): Promise<unknown> {
176
+ return await this.#client.query(query, input, cursor);
177
+ }
178
+ async global(operation: string, input: JsonObject = {}, idempotencyKey?: string): Promise<unknown> {
179
+ this.#assertGenericDisposition("global", operation);
180
+ if (isLifecycleOperation(operation) && !idempotencyKey)
181
+ throw new AcpSdkAdapterError("invalid_input", "idempotencyKey is required for lifecycle operations.");
182
+ return await this.#client.global(operation, input, { idempotencyKey });
183
+ }
184
+
185
+ async sdkControl(params: { operation: string; input?: JsonObject }): Promise<unknown> {
186
+ return await this.control(params.operation, params.input ?? {});
187
+ }
188
+ async sdkQuery(params: { query: string; input?: JsonObject; cursor?: string }): Promise<unknown> {
189
+ return await this.query(params.query, params.input ?? {}, params.cursor);
190
+ }
191
+ async sdkGlobal(params: { operation: string; input?: JsonObject; idempotencyKey?: string }): Promise<unknown> {
192
+ return await this.global(params.operation, params.input ?? {}, params.idempotencyKey);
193
+ }
194
+
195
+ /** Dispatches the ACP extension method names without exposing endpoint credentials. */
196
+ async handle(method: string, params: JsonObject = {}): Promise<unknown> {
197
+ if (method === "_gjc/sdk/control")
198
+ return await this.sdkControl(params as { operation: string; input?: JsonObject });
199
+ if (method === "_gjc/sdk/query")
200
+ return await this.sdkQuery(params as { query: string; input?: JsonObject; cursor?: string });
201
+ if (method === "_gjc/sdk/global") {
202
+ if (typeof params.operation === "string" && isLifecycleOperation(params.operation))
203
+ throw new AcpSdkAdapterError(
204
+ "operation_prohibited",
205
+ "ACP lifecycle operations are available only through typed session methods.",
206
+ );
207
+ return await this.sdkGlobal(params as { operation: string; input?: JsonObject; idempotencyKey?: string });
208
+ }
209
+ if (method === "prompt") return await this.prompt(params);
210
+ if (method === "cancel") return await this.cancel();
211
+ if (method === "setModel") return await this.setModel(params);
212
+ const global = SESSION_GLOBALS[method];
213
+ if (global) {
214
+ if (!isLifecycleOperation(global)) return await this.global(global, params);
215
+ const { idempotencyKey, ...input } = params;
216
+ return await this.global(global, input, typeof idempotencyKey === "string" ? idempotencyKey : undefined);
217
+ }
218
+ throw new AcpSdkAdapterError("method_not_found", `Unsupported ACP SDK method: ${method}`);
219
+ }
220
+
221
+ async registerProvider(provider: AcpProviderRegistration): Promise<void> {
222
+ const connectionId = this.#connectionId ?? (await this.#waitForConnectionId());
223
+ const previousLeaseId = this.#leases.get(provider.capability);
224
+ const result = await this.#client.request({
225
+ type: "register_provider",
226
+ connectionId,
227
+ capability: provider.capability,
228
+ definitions: provider.definitions,
229
+ idempotencyKey: randomUUID(),
230
+ ...(previousLeaseId ? { expectedLeaseId: previousLeaseId } : {}),
231
+ });
232
+ if (typeof result.leaseId !== "string")
233
+ throw new AcpSdkAdapterError("invalid_reverse_frame", "Provider registration omitted leaseId.");
234
+ this.#leases.set(provider.capability, result.leaseId);
235
+ }
236
+
237
+ #assertGenericDisposition(kind: "control" | "global", sdkId: string): void {
238
+ const operation = OPERATIONS.find(candidate => candidate.kind === kind && candidate.sdkId === sdkId);
239
+ if (!operation) throw new AcpSdkAdapterError("unknown_operation", `Unknown SDK ${kind}: ${sdkId}`);
240
+ const disposition = operation.adapterDispositions.acp;
241
+ if (disposition === "prohibited")
242
+ throw new AcpSdkAdapterError("operation_prohibited", `${sdkId} is prohibited for ACP.`);
243
+ if (disposition === "provider_only")
244
+ throw new AcpSdkAdapterError(
245
+ "provider_required",
246
+ `${sdkId} must be invoked through ACP provider registration, not _gjc/sdk/${kind}.`,
247
+ );
248
+ if (disposition === "machine_only")
249
+ throw new AcpSdkAdapterError(
250
+ operation.errorCodes[0] ?? "machine_only",
251
+ `${sdkId} is available only to machine-local SDK clients.`,
252
+ );
253
+ }
254
+
255
+ async #reclaimProviders(): Promise<void> {
256
+ if (this.#closed || !this.#providers.length) return;
257
+ if (this.#reclaiming) return await this.#reclaiming;
258
+ this.#reclaiming = (async () => {
259
+ this.#connectionId = this.#client.connectionId;
260
+ if (!this.#connectionId) this.#connectionId = await this.#waitForConnectionId();
261
+ for (const provider of this.#providers) await this.registerProvider(provider);
262
+ })();
263
+ try {
264
+ await this.#reclaiming;
265
+ } finally {
266
+ this.#reclaiming = undefined;
267
+ }
268
+ }
269
+
270
+ #reportReconnectFailure(error: unknown): void {
271
+ const typed =
272
+ error instanceof SdkClientError
273
+ ? error
274
+ : new SdkClientError(
275
+ "reconnect_exhausted",
276
+ error instanceof Error ? error.message : "SDK reconnect failed.",
277
+ error,
278
+ );
279
+ for (const handler of this.#reconnectFailedHandlers) handler(typed);
280
+ }
281
+
282
+ async #waitForConnectionId(): Promise<string> {
283
+ if (this.#connectionId) return this.#connectionId;
284
+ return await new Promise<string>((resolve, reject) => {
285
+ const timeout = setTimeout(
286
+ () => reject(new AcpSdkAdapterError("unavailable", "SDK server did not provide a connection id.")),
287
+ 10_000,
288
+ );
289
+ const unsubscribe = this.#client.onFrame(frame => {
290
+ if ((frame.type === "hello" || frame.type === "server_hello") && typeof frame.connectionId === "string") {
291
+ clearTimeout(timeout);
292
+ unsubscribe();
293
+ this.#connectionId = frame.connectionId;
294
+ resolve(frame.connectionId);
295
+ }
296
+ });
297
+ });
298
+ }
299
+
300
+ async #heartbeatLeases(): Promise<void> {
301
+ if (this.#closed) return;
302
+ try {
303
+ await this.#client.awaitHello();
304
+ this.#connectionId ??= this.#client.connectionId;
305
+ if (!this.#connectionId) return;
306
+ for (const leaseId of this.#leases.values())
307
+ this.#client.send({ type: "provider_heartbeat", connectionId: this.#connectionId, leaseId });
308
+ } catch (error) {
309
+ this.#reportReconnectFailure(error);
310
+ }
311
+ }
312
+
313
+ async #onFrame(frame: SdkFrame): Promise<void> {
314
+ for (const handler of this.#frameHandlers) handler(frame);
315
+ if ((frame.type === "hello" || frame.type === "server_hello") && typeof frame.connectionId === "string") {
316
+ const changed = this.#connectionId !== undefined && this.#connectionId !== frame.connectionId;
317
+ this.#connectionId = frame.connectionId;
318
+ if (changed) void this.#reclaimProviders().catch(error => this.#reportReconnectFailure(error));
319
+ return;
320
+ }
321
+ if (
322
+ (frame.type === "reverse_cancel" ||
323
+ frame.type === "reverse_request_cancel" ||
324
+ frame.type === "reverse_request_cancelled") &&
325
+ typeof frame.id === "string"
326
+ ) {
327
+ this.#cancelReverse(frame.id);
328
+ return;
329
+ }
330
+
331
+ if (frame.type !== "reverse_request") return;
332
+ const id = typeof frame.id === "string" ? frame.id : "";
333
+ const connectionId = typeof frame.connectionId === "string" ? frame.connectionId : "";
334
+ const capability = typeof frame.capability === "string" ? frame.capability : "";
335
+ const leaseId = typeof frame.leaseId === "string" ? frame.leaseId : "";
336
+ if (
337
+ !id ||
338
+ !connectionId ||
339
+ !capability ||
340
+ !leaseId ||
341
+ this.#reverseRequests.has(id) ||
342
+ !this.#ownsReverseLease(connectionId, capability, leaseId)
343
+ )
344
+ return;
345
+ const active: ReverseRequest = { state: "pending" };
346
+ this.#reverseRequests.set(id, active);
347
+ try {
348
+ const request = frame.payload as JsonObject | undefined;
349
+ const method = typeof request?.method === "string" ? request.method : "";
350
+ const payload = request?.payload && typeof request.payload === "object" ? (request.payload as JsonObject) : {};
351
+ const result = await this.#forwardReverse(method, payload);
352
+ if (!this.#canRespondToReverse(id, active, connectionId, capability, leaseId)) return;
353
+
354
+ this.#client.send({ type: "reverse_response", id, connectionId, leaseId, ok: true, result });
355
+ } catch (error) {
356
+ if (!this.#canRespondToReverse(id, active, connectionId, capability, leaseId)) return;
357
+
358
+ const typed =
359
+ error instanceof AcpSdkAdapterError || error instanceof SdkClientError
360
+ ? error
361
+ : new AcpSdkAdapterError(
362
+ "acp_reverse_failed",
363
+ error instanceof Error ? error.message : "ACP reverse request failed.",
364
+ );
365
+ this.#client.send({
366
+ type: "reverse_response",
367
+ id,
368
+ connectionId,
369
+ leaseId,
370
+ ok: false,
371
+ error: { code: typed.code, message: typed.message },
372
+ });
373
+ } finally {
374
+ this.#finishReverse(id, active);
375
+ }
376
+ }
377
+
378
+ #ownsReverseLease(connectionId: string, capability: string, leaseId: string): boolean {
379
+ return this.#connectionId === connectionId && this.#leases.get(capability) === leaseId;
380
+ }
381
+
382
+ #canRespondToReverse(
383
+ id: string,
384
+ request: ReverseRequest,
385
+ connectionId: string,
386
+ capability: string,
387
+ leaseId: string,
388
+ ): boolean {
389
+ return (
390
+ this.#reverseRequests.get(id) === request &&
391
+ request.state === "pending" &&
392
+ this.#ownsReverseLease(connectionId, capability, leaseId)
393
+ );
394
+ }
395
+
396
+ #cancelReverse(id: string): void {
397
+ const request: ReverseRequest = this.#reverseRequests.get(id) ?? { state: "pending" };
398
+ if (request.state === "cancelled") return;
399
+ request.state = "cancelled";
400
+ request.cancelTimer = setTimeout(() => this.#finishReverse(id, request), this.#reverseCancelTtlMs);
401
+ this.#reverseRequests.set(id, request);
402
+ }
403
+
404
+ #finishReverse(id: string, request: ReverseRequest): void {
405
+ if (this.#reverseRequests.get(id) !== request) return;
406
+ if (request.cancelTimer) clearTimeout(request.cancelTimer);
407
+ this.#reverseRequests.delete(id);
408
+ }
409
+
410
+ async #forwardReverse(method: string, payload: JsonObject): Promise<unknown> {
411
+ if (!method || !this.#connection) throw new AcpSdkAdapterError("acp_reverse_unavailable");
412
+ if (this.#connection.request) return await this.#connection.request(method, payload);
413
+ const target = this.#connection[method];
414
+ if (typeof target !== "function")
415
+ throw new AcpSdkAdapterError("acp_reverse_unsupported", `ACP client does not support ${method}.`);
416
+ return await (target as (params: JsonObject) => Promise<unknown>)(payload);
417
+ }
418
+ }
@@ -0,0 +1,2 @@
1
+ export type { AcpProviderRegistration, AcpReverseConnection, AcpSdkAdapterOptions } from "./adapter";
2
+ export { AcpSdkAdapter, AcpSdkAdapterError } from "./adapter";