@gajae-code/coding-agent 0.10.2 → 0.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (476) hide show
  1. package/CHANGELOG.md +58 -2
  2. package/dist/types/append-only-mode.d.ts +1 -1
  3. package/dist/types/async/job-manager.d.ts +46 -7
  4. package/dist/types/cli/args.d.ts +4 -5
  5. package/dist/types/cli/daemon-cli.d.ts +12 -1
  6. package/dist/types/cli/notify-cli.d.ts +21 -1
  7. package/dist/types/cli.d.ts +3 -0
  8. package/dist/types/commands/daemon.d.ts +39 -0
  9. package/dist/types/commands/launch.d.ts +3 -0
  10. package/dist/types/commands/notify.d.ts +28 -1
  11. package/dist/types/commands/sdk.d.ts +33 -0
  12. package/dist/types/config/atomic-yaml-patch.d.ts +85 -0
  13. package/dist/types/config/model-profile-activation.d.ts +35 -15
  14. package/dist/types/config/model-profiles.d.ts +11 -5
  15. package/dist/types/config/model-registry.d.ts +3 -3
  16. package/dist/types/config/model-resolver.d.ts +39 -6
  17. package/dist/types/config/model-selector-value.d.ts +17 -0
  18. package/dist/types/config/models-config-schema.d.ts +10 -6
  19. package/dist/types/config/settings-schema.d.ts +133 -6
  20. package/dist/types/config/settings.d.ts +63 -35
  21. package/dist/types/coordinator-mcp/model-preset.d.ts +7 -6
  22. package/dist/types/coordinator-mcp/server.d.ts +6 -49
  23. package/dist/types/daemon/builtin.d.ts +6 -5
  24. package/dist/types/daemon/control-types.d.ts +1 -1
  25. package/dist/types/discovery/mcp-json.d.ts +12 -1
  26. package/dist/types/extensibility/custom-tools/types.d.ts +1 -1
  27. package/dist/types/extensibility/extensions/compact-handler.d.ts +4 -2
  28. package/dist/types/extensibility/extensions/get-commands-handler.d.ts +2 -2
  29. package/dist/types/extensibility/extensions/loader.d.ts +10 -1
  30. package/dist/types/extensibility/extensions/runner.d.ts +3 -3
  31. package/dist/types/extensibility/extensions/types.d.ts +141 -16
  32. package/dist/types/extensibility/hooks/types.d.ts +1 -1
  33. package/dist/types/gjc-runtime/launch-tmux.d.ts +3 -2
  34. package/dist/types/gjc-runtime/psmux-detect.d.ts +3 -0
  35. package/dist/types/gjc-runtime/session-state-sidecar.d.ts +3 -0
  36. package/dist/types/gjc-runtime/team-runtime.d.ts +3 -4
  37. package/dist/types/gjc-runtime/tmux-owner-isolation-cli.d.ts +13 -0
  38. package/dist/types/gjc-runtime/tmux-sessions.d.ts +4 -1
  39. package/dist/types/gjc-runtime/ultragoal-receipt-freshness.d.ts +11 -0
  40. package/dist/types/gjc-runtime/windows-powershell-command.d.ts +9 -0
  41. package/dist/types/harness-control-plane/operate.d.ts +5 -5
  42. package/dist/types/harness-control-plane/owner.d.ts +18 -4
  43. package/dist/types/harness-control-plane/receipts.d.ts +0 -1
  44. package/dist/types/harness-control-plane/sdk-transport.d.ts +43 -0
  45. package/dist/types/harness-control-plane/session-transport.d.ts +48 -0
  46. package/dist/types/harness-control-plane/types.d.ts +3 -4
  47. package/dist/types/lsp/index.d.ts +1 -1
  48. package/dist/types/main.d.ts +32 -38
  49. package/dist/types/modes/acp/acp-agent.d.ts +224 -53
  50. package/dist/types/modes/acp/acp-client-bridge.d.ts +1 -0
  51. package/dist/types/modes/acp/acp-mode.d.ts +6 -15
  52. package/dist/types/modes/acp/permission-mode.d.ts +4 -0
  53. package/dist/types/modes/acp/startup-options.d.ts +6 -0
  54. package/dist/types/modes/components/agent-dashboard.d.ts +3 -0
  55. package/dist/types/modes/components/model-selector.d.ts +1 -0
  56. package/dist/types/modes/components/notifications-settings-editor.d.ts +135 -0
  57. package/dist/types/modes/components/settings-selector.d.ts +6 -4
  58. package/dist/types/modes/components/welcome.d.ts +1 -1
  59. package/dist/types/modes/controllers/command-controller.d.ts +2 -2
  60. package/dist/types/modes/controllers/extension-ui-controller.d.ts +1 -0
  61. package/dist/types/modes/controllers/selector-controller.d.ts +35 -1
  62. package/dist/types/modes/index.d.ts +0 -4
  63. package/dist/types/modes/interactive-mode.d.ts +5 -2
  64. package/dist/types/modes/runtime-init.d.ts +2 -2
  65. package/dist/types/modes/shared/agent-wire/approval-gate.d.ts +6 -9
  66. package/dist/types/modes/shared/agent-wire/deep-interview-gate.d.ts +4 -6
  67. package/dist/types/modes/shared/agent-wire/event-contract.d.ts +6 -6
  68. package/dist/types/modes/shared/agent-wire/event-envelope.d.ts +4 -9
  69. package/dist/types/modes/shared/agent-wire/event-observation.d.ts +1 -1
  70. package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +170 -30
  71. package/dist/types/modes/shared/agent-wire/workflow-gate-schema.d.ts +7 -7
  72. package/dist/types/modes/shared/agent-wire/workflow-gate-types.d.ts +105 -0
  73. package/dist/types/modes/types.d.ts +7 -2
  74. package/dist/types/runtime-mcp/client.d.ts +2 -0
  75. package/dist/types/runtime-mcp/config.d.ts +5 -1
  76. package/dist/types/runtime-mcp/manager.d.ts +8 -1
  77. package/dist/types/runtime-mcp/types.d.ts +4 -0
  78. package/dist/types/sdk/acp/adapter.d.ts +67 -0
  79. package/dist/types/sdk/acp/index.d.ts +2 -0
  80. package/dist/types/sdk/broker/broker.d.ts +53 -0
  81. package/dist/types/sdk/broker/discovery.d.ts +30 -0
  82. package/dist/types/sdk/broker/ensure.d.ts +42 -0
  83. package/dist/types/sdk/broker/identity.d.ts +3 -0
  84. package/dist/types/sdk/broker/index.d.ts +8 -0
  85. package/dist/types/sdk/broker/lifecycle-ledger.d.ts +95 -0
  86. package/dist/types/sdk/broker/lifecycle.d.ts +85 -0
  87. package/dist/types/sdk/broker/process-incarnation.d.ts +14 -0
  88. package/dist/types/sdk/broker/runtime.d.ts +33 -0
  89. package/dist/types/sdk/broker/session-index.d.ts +57 -0
  90. package/dist/types/sdk/broker/state-version.d.ts +8 -0
  91. package/dist/types/sdk/broker/transport.d.ts +9 -0
  92. package/dist/types/sdk/bus/chat-command-policy.d.ts +49 -0
  93. package/dist/types/sdk/bus/chat-daemon-cli.d.ts +21 -0
  94. package/dist/types/sdk/bus/chat-daemon-control.d.ts +111 -0
  95. package/dist/types/sdk/bus/chat-daemon-runtime.d.ts +77 -0
  96. package/dist/types/sdk/bus/chat-effect-journal.d.ts +84 -0
  97. package/dist/types/{notifications → sdk/bus}/config-commands.d.ts +7 -2
  98. package/dist/types/sdk/bus/config.d.ts +274 -0
  99. package/dist/types/sdk/bus/conversation-store.d.ts +72 -0
  100. package/dist/types/sdk/bus/discord-conversation.d.ts +58 -0
  101. package/dist/types/sdk/bus/discord-daemon.d.ts +50 -0
  102. package/dist/types/sdk/bus/discord-live-provider.d.ts +70 -0
  103. package/dist/types/sdk/bus/discord-provider.d.ts +85 -0
  104. package/dist/types/{notifications → sdk/bus}/html-format.d.ts +2 -2
  105. package/dist/types/{notifications → sdk/bus}/index.d.ts +113 -13
  106. package/dist/types/{notifications → sdk/bus}/lifecycle-control-runtime.d.ts +4 -2
  107. package/dist/types/{notifications → sdk/bus}/lifecycle-orchestrator.d.ts +18 -21
  108. package/dist/types/{notifications → sdk/bus}/managed-daemon.d.ts +1 -1
  109. package/dist/types/sdk/bus/native-runtime-compatibility.d.ts +13 -0
  110. package/dist/types/sdk/bus/notification-orchestration.d.ts +170 -0
  111. package/dist/types/{notifications → sdk/bus}/notification-service.d.ts +7 -1
  112. package/dist/types/sdk/bus/session-control.d.ts +83 -0
  113. package/dist/types/sdk/bus/slack-conversation.d.ts +56 -0
  114. package/dist/types/sdk/bus/slack-daemon.d.ts +60 -0
  115. package/dist/types/sdk/bus/slack-live-provider.d.ts +59 -0
  116. package/dist/types/sdk/bus/slack-provider.d.ts +55 -0
  117. package/dist/types/{notifications → sdk/bus}/telegram-cli.d.ts +4 -4
  118. package/dist/types/{notifications → sdk/bus}/telegram-daemon-cli.d.ts +14 -5
  119. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +12 -0
  120. package/dist/types/{notifications → sdk/bus}/telegram-daemon-control.d.ts +2 -2
  121. package/dist/types/{notifications → sdk/bus}/telegram-daemon.d.ts +78 -17
  122. package/dist/types/{notifications → sdk/bus}/telegram-reference.d.ts +2 -2
  123. package/dist/types/sdk/bus/telegram-setup.d.ts +128 -0
  124. package/dist/types/{notifications → sdk/bus}/topic-registry.d.ts +11 -0
  125. package/dist/types/sdk/cli/index.d.ts +1 -0
  126. package/dist/types/sdk/cli/session-cli.d.ts +19 -0
  127. package/dist/types/sdk/client/client.d.ts +1 -0
  128. package/dist/types/sdk/client/discovery.d.ts +27 -0
  129. package/dist/types/sdk/client/index.d.ts +2 -0
  130. package/dist/types/sdk/host/control/dispatch.d.ts +34 -0
  131. package/dist/types/sdk/host/control/index.d.ts +2 -0
  132. package/dist/types/sdk/host/control/operations.d.ts +65 -0
  133. package/dist/types/sdk/host/events.d.ts +35 -0
  134. package/dist/types/sdk/host/host.d.ts +35 -0
  135. package/dist/types/sdk/host/index.d.ts +4 -0
  136. package/dist/types/sdk/host/query/cursor.d.ts +62 -0
  137. package/dist/types/sdk/host/query/handlers.d.ts +70 -0
  138. package/dist/types/sdk/host/query/index.d.ts +3 -0
  139. package/dist/types/sdk/host/query/revision-store.d.ts +60 -0
  140. package/dist/types/sdk/host/reverse-leases.d.ts +45 -0
  141. package/dist/types/sdk/host/types.d.ts +32 -0
  142. package/dist/types/sdk/index.d.ts +6 -0
  143. package/dist/types/sdk/lifecycle-session.d.ts +14 -0
  144. package/dist/types/sdk/mcp/index.d.ts +1 -0
  145. package/dist/types/sdk/mcp/server.d.ts +37 -0
  146. package/dist/types/sdk/models.d.ts +44 -0
  147. package/dist/types/sdk/protocol/adapter-validation.d.ts +14 -0
  148. package/dist/types/sdk/protocol/operation-registry.d.ts +24 -0
  149. package/dist/types/{sdk.d.ts → sdk/session.d.ts} +44 -38
  150. package/dist/types/sdk/startup-capability.d.ts +50 -0
  151. package/dist/types/session/agent-session.d.ts +114 -21
  152. package/dist/types/session/default-model-selection.d.ts +25 -0
  153. package/dist/types/session/fallback-chain-controller.d.ts +52 -0
  154. package/dist/types/session/session-manager.d.ts +58 -1
  155. package/dist/types/setup/credential-auto-import.d.ts +36 -6
  156. package/dist/types/tools/ask-answer-registry.d.ts +1 -1
  157. package/dist/types/tools/browser/benchmark/detector-report.d.ts +63 -0
  158. package/dist/types/tools/browser/benchmark/run-suite.d.ts +18 -0
  159. package/dist/types/tools/browser/launch.d.ts +22 -0
  160. package/dist/types/tools/browser/profile-discovery.d.ts +31 -0
  161. package/dist/types/tools/browser/profile-posture.d.ts +37 -0
  162. package/dist/types/tools/browser/profile-reuse.d.ts +39 -0
  163. package/dist/types/tools/browser/profile-warmup.d.ts +39 -0
  164. package/dist/types/tools/browser/registry.d.ts +19 -0
  165. package/dist/types/tools/browser/tab-protocol.d.ts +4 -0
  166. package/dist/types/tools/index.d.ts +8 -8
  167. package/dist/types/tools/subagent-render.d.ts +1 -0
  168. package/dist/types/tools/subagent.d.ts +6 -1
  169. package/package.json +34 -13
  170. package/scripts/build-sdk-package-smoke.ts +99 -0
  171. package/scripts/capture-notifications-settings-showcase.ts +435 -0
  172. package/scripts/compile-args.ts +4 -2
  173. package/scripts/g005-daemon-smoke.ts +4 -5
  174. package/scripts/g011-daemon-path-smoke.ts +5 -5
  175. package/scripts/generate-sdk-adapter-parity-manifest.ts +163 -0
  176. package/scripts/generate-sdk-operation-inventory.ts +867 -0
  177. package/scripts/generate-telegram-baseline-manifest.ts +128 -0
  178. package/scripts/manifest-schema.ts +124 -0
  179. package/scripts/run-test-manifest.ts +153 -0
  180. package/scripts/run-threat-model-check.ts +157 -0
  181. package/scripts/verify-gjc-sdk-canonicalization.ts +3467 -0
  182. package/scripts/verify-gjc-sdk-rename.ts +90 -0
  183. package/src/append-only-mode.ts +1 -1
  184. package/src/async/job-manager.ts +406 -63
  185. package/src/cli/args.ts +43 -12
  186. package/src/cli/auth-gateway-cli.ts +2 -2
  187. package/src/cli/config-cli.ts +2 -1
  188. package/src/cli/daemon-cli.ts +63 -14
  189. package/src/cli/list-models.ts +1 -1
  190. package/src/cli/notify-cli.ts +288 -286
  191. package/src/cli.ts +21 -2
  192. package/src/commands/daemon.ts +50 -6
  193. package/src/commands/harness.ts +93 -36
  194. package/src/commands/launch.ts +5 -2
  195. package/src/commands/mcp-serve.ts +19 -12
  196. package/src/commands/notify.ts +36 -3
  197. package/src/commands/sdk.ts +426 -0
  198. package/src/commit/agentic/agent.ts +1 -0
  199. package/src/config/atomic-yaml-patch.ts +423 -0
  200. package/src/config/model-profile-activation.ts +240 -89
  201. package/src/config/model-profiles.ts +18 -15
  202. package/src/config/model-registry.ts +51 -26
  203. package/src/config/model-resolver.ts +138 -51
  204. package/src/config/model-selector-value.ts +50 -0
  205. package/src/config/models-config-schema.ts +14 -21
  206. package/src/config/settings-schema.ts +128 -10
  207. package/src/config/settings.ts +1120 -158
  208. package/src/coordinator-mcp/model-preset.ts +74 -20
  209. package/src/coordinator-mcp/server.ts +1597 -3052
  210. package/src/daemon/builtin.ts +8 -5
  211. package/src/daemon/control-types.ts +1 -1
  212. package/src/defaults/gjc/skills/team/SKILL.md +4 -4
  213. package/src/discovery/mcp-json.ts +327 -20
  214. package/src/extensibility/custom-tools/types.ts +1 -1
  215. package/src/extensibility/extensions/compact-handler.ts +3 -3
  216. package/src/extensibility/extensions/get-commands-handler.ts +2 -2
  217. package/src/extensibility/extensions/loader.ts +69 -5
  218. package/src/extensibility/extensions/runner.ts +112 -4
  219. package/src/extensibility/extensions/types.ts +176 -17
  220. package/src/extensibility/hooks/types.ts +1 -1
  221. package/src/gjc-runtime/launch-tmux.ts +170 -86
  222. package/src/gjc-runtime/psmux-detect.ts +82 -4
  223. package/src/gjc-runtime/session-state-sidecar.ts +41 -31
  224. package/src/gjc-runtime/team-runtime.ts +54 -35
  225. package/src/gjc-runtime/tmux-owner-isolation-cli.ts +53 -17
  226. package/src/gjc-runtime/tmux-owner-isolation.ts +1 -1
  227. package/src/gjc-runtime/tmux-sessions.ts +19 -13
  228. package/src/gjc-runtime/ultragoal-guard.ts +108 -14
  229. package/src/gjc-runtime/ultragoal-receipt-freshness.ts +102 -1
  230. package/src/gjc-runtime/ultragoal-runtime.ts +227 -11
  231. package/src/gjc-runtime/windows-powershell-command.ts +58 -0
  232. package/src/harness-control-plane/operate.ts +9 -9
  233. package/src/harness-control-plane/owner.ts +283 -39
  234. package/src/harness-control-plane/receipts.ts +0 -1
  235. package/src/harness-control-plane/sdk-transport.ts +395 -0
  236. package/src/harness-control-plane/session-transport.ts +94 -0
  237. package/src/harness-control-plane/types.ts +1 -1
  238. package/src/internal-urls/docs-index.generated.ts +34 -35
  239. package/src/lsp/client.ts +42 -6
  240. package/src/lsp/index.ts +2 -2
  241. package/src/main.ts +299 -204
  242. package/src/modes/DESIGN.md +258 -0
  243. package/src/modes/acp/acp-agent.ts +1228 -2612
  244. package/src/modes/acp/acp-client-bridge.ts +2 -20
  245. package/src/modes/acp/acp-event-mapper.ts +18 -2
  246. package/src/modes/acp/acp-mode.ts +8 -36
  247. package/src/modes/acp/permission-mode.ts +25 -0
  248. package/src/modes/acp/startup-options.ts +6 -0
  249. package/src/modes/components/agent-dashboard.ts +37 -17
  250. package/src/modes/components/model-selector.ts +93 -35
  251. package/src/modes/components/notifications-settings-editor.ts +1379 -0
  252. package/src/modes/components/settings-selector.ts +60 -11
  253. package/src/modes/components/welcome.ts +4 -4
  254. package/src/modes/controllers/command-controller.ts +10 -17
  255. package/src/modes/controllers/event-controller.ts +11 -16
  256. package/src/modes/controllers/extension-ui-controller.ts +396 -28
  257. package/src/modes/controllers/selector-controller.ts +674 -36
  258. package/src/modes/index.ts +0 -22
  259. package/src/modes/interactive-mode.ts +87 -36
  260. package/src/modes/runtime-init.ts +298 -6
  261. package/src/modes/shared/agent-wire/approval-gate.ts +9 -11
  262. package/src/modes/shared/agent-wire/deep-interview-gate.ts +10 -11
  263. package/src/modes/shared/agent-wire/event-contract.ts +7 -8
  264. package/src/modes/shared/agent-wire/event-envelope.ts +9 -17
  265. package/src/modes/shared/agent-wire/event-observation.ts +16 -7
  266. package/src/modes/shared/agent-wire/workflow-gate-broker.ts +1258 -87
  267. package/src/modes/shared/agent-wire/workflow-gate-schema.ts +15 -15
  268. package/src/modes/shared/agent-wire/workflow-gate-types.ts +113 -0
  269. package/src/modes/types.ts +7 -2
  270. package/src/runtime-mcp/client.ts +94 -19
  271. package/src/runtime-mcp/config.ts +27 -15
  272. package/src/runtime-mcp/manager.ts +343 -105
  273. package/src/runtime-mcp/oauth-flow.ts +42 -12
  274. package/src/runtime-mcp/transports/http.ts +49 -19
  275. package/src/runtime-mcp/transports/stdio.ts +47 -28
  276. package/src/runtime-mcp/types.ts +10 -0
  277. package/src/sdk/acp/adapter.ts +418 -0
  278. package/src/sdk/acp/index.ts +2 -0
  279. package/src/sdk/broker/broker.ts +642 -0
  280. package/src/sdk/broker/discovery.ts +113 -0
  281. package/src/sdk/broker/ensure.ts +307 -0
  282. package/src/sdk/broker/identity.ts +42 -0
  283. package/src/sdk/broker/index.ts +8 -0
  284. package/src/sdk/broker/internal-source-marker-2178.txt +1 -0
  285. package/src/sdk/broker/internal-source.bunfig.toml +1 -0
  286. package/src/sdk/broker/lifecycle-ledger.ts +286 -0
  287. package/src/sdk/broker/lifecycle.ts +2157 -0
  288. package/src/sdk/broker/process-incarnation.ts +159 -0
  289. package/src/sdk/broker/runtime.ts +164 -0
  290. package/src/sdk/broker/session-index.ts +318 -0
  291. package/src/sdk/broker/state-version.ts +23 -0
  292. package/src/sdk/broker/transport.ts +125 -0
  293. package/src/sdk/bus/chat-command-policy.ts +107 -0
  294. package/src/sdk/bus/chat-daemon-cli.ts +214 -0
  295. package/src/sdk/bus/chat-daemon-control.ts +713 -0
  296. package/src/sdk/bus/chat-daemon-runtime.ts +526 -0
  297. package/src/sdk/bus/chat-effect-journal.ts +355 -0
  298. package/src/{notifications → sdk/bus}/config-commands.ts +39 -10
  299. package/src/sdk/bus/config.ts +433 -0
  300. package/src/sdk/bus/conversation-store.ts +391 -0
  301. package/src/sdk/bus/discord-conversation.ts +85 -0
  302. package/src/sdk/bus/discord-daemon.ts +2292 -0
  303. package/src/sdk/bus/discord-live-provider.ts +521 -0
  304. package/src/sdk/bus/discord-provider.ts +56 -0
  305. package/src/{notifications → sdk/bus}/html-format.ts +2 -2
  306. package/src/sdk/bus/index.ts +3979 -0
  307. package/src/{notifications → sdk/bus}/lifecycle-commands.ts +2 -0
  308. package/src/{notifications → sdk/bus}/lifecycle-control-runtime.ts +225 -196
  309. package/src/{notifications → sdk/bus}/lifecycle-orchestrator.ts +161 -74
  310. package/src/{notifications → sdk/bus}/managed-daemon.ts +2 -2
  311. package/src/sdk/bus/native-runtime-compatibility.ts +42 -0
  312. package/src/sdk/bus/natives-augment.d.ts +38 -0
  313. package/src/sdk/bus/notification-orchestration.ts +535 -0
  314. package/src/{notifications → sdk/bus}/notification-service.ts +106 -12
  315. package/src/sdk/bus/session-control.ts +333 -0
  316. package/src/sdk/bus/slack-conversation.ts +74 -0
  317. package/src/sdk/bus/slack-daemon.ts +2144 -0
  318. package/src/sdk/bus/slack-live-provider.ts +380 -0
  319. package/src/sdk/bus/slack-provider.ts +76 -0
  320. package/src/{notifications → sdk/bus}/telegram-cli.ts +8 -8
  321. package/src/sdk/bus/telegram-daemon-cli.ts +330 -0
  322. package/src/sdk/bus/telegram-daemon-contract.ts +14 -0
  323. package/src/{notifications → sdk/bus}/telegram-daemon-control.ts +4 -4
  324. package/src/{notifications → sdk/bus}/telegram-daemon.ts +603 -63
  325. package/src/{notifications → sdk/bus}/telegram-reference.ts +2 -2
  326. package/src/sdk/bus/telegram-setup.ts +663 -0
  327. package/src/{notifications → sdk/bus}/topic-registry.ts +32 -0
  328. package/src/sdk/cli/index.ts +1 -0
  329. package/src/sdk/cli/session-cli.ts +275 -0
  330. package/src/sdk/client/client.ts +1 -0
  331. package/src/sdk/client/discovery.ts +108 -0
  332. package/src/sdk/client/index.ts +2 -0
  333. package/src/sdk/host/control/dispatch.ts +367 -0
  334. package/src/sdk/host/control/index.ts +10 -0
  335. package/src/sdk/host/control/operations.ts +63 -0
  336. package/src/sdk/host/events.ts +91 -0
  337. package/src/sdk/host/host.ts +296 -0
  338. package/src/sdk/host/index.ts +4 -0
  339. package/src/sdk/host/query/cursor.ts +189 -0
  340. package/src/sdk/host/query/handlers.ts +533 -0
  341. package/src/sdk/host/query/index.ts +3 -0
  342. package/src/sdk/host/query/revision-store.ts +1126 -0
  343. package/src/sdk/host/reverse-leases.ts +325 -0
  344. package/src/sdk/host/types.ts +29 -0
  345. package/src/sdk/index.ts +13 -0
  346. package/src/sdk/lifecycle-session.ts +39 -0
  347. package/src/sdk/mcp/index.ts +1 -0
  348. package/src/sdk/mcp/server.ts +332 -0
  349. package/src/sdk/models.ts +168 -0
  350. package/src/sdk/protocol/adapter-validation.ts +48 -0
  351. package/src/sdk/protocol/operation-inventory.generated.json +5654 -0
  352. package/src/sdk/protocol/operation-registry.ts +312 -0
  353. package/src/{sdk.ts → sdk/session.ts} +339 -212
  354. package/src/sdk/startup-capability.ts +189 -0
  355. package/src/session/agent-session.ts +2650 -944
  356. package/src/session/default-model-selection.ts +93 -0
  357. package/src/session/fallback-chain-controller.ts +136 -0
  358. package/src/session/session-manager.ts +438 -11
  359. package/src/session/session-storage.ts +8 -1
  360. package/src/setup/credential-auto-import.ts +290 -35
  361. package/src/setup/hermes/templates/operator-instructions.v1.md +3 -5
  362. package/src/slash-commands/builtin-registry.ts +2 -1
  363. package/src/task/executor.ts +62 -13
  364. package/src/task/index.ts +26 -16
  365. package/src/tools/ask-answer-registry.ts +1 -1
  366. package/src/tools/ask.ts +13 -8
  367. package/src/tools/browser/STEALTH-THIRD-PARTY-NOTICES.md +26 -0
  368. package/src/tools/browser/benchmark/detector-report.ts +157 -0
  369. package/src/tools/browser/benchmark/run-suite.ts +39 -0
  370. package/src/tools/browser/launch.ts +124 -19
  371. package/src/tools/browser/profile-discovery.ts +63 -0
  372. package/src/tools/browser/profile-posture.ts +59 -0
  373. package/src/tools/browser/profile-reuse.ts +102 -0
  374. package/src/tools/browser/profile-warmup.ts +109 -0
  375. package/src/tools/browser/registry.ts +87 -11
  376. package/src/tools/browser/tab-protocol.ts +1 -0
  377. package/src/tools/browser/tab-supervisor.ts +1 -0
  378. package/src/tools/browser/tab-worker.ts +1 -1
  379. package/src/tools/browser.ts +6 -0
  380. package/src/tools/index.ts +8 -8
  381. package/src/tools/puppeteer/14_stealth_permissions.txt +57 -0
  382. package/src/tools/puppeteer/15_stealth_webrtc.txt +60 -0
  383. package/src/tools/subagent-render.ts +19 -8
  384. package/src/tools/subagent.ts +84 -32
  385. package/src/tools/telegram-send.ts +2 -2
  386. package/vendor/insane-search/MANIFEST.json +2 -1
  387. package/vendor/insane-search/engine/bias_check.py +4 -1
  388. package/vendor/insane-search/engine/phase0.py +26 -1
  389. package/dist/types/harness-control-plane/rpc-adapter.d.ts +0 -69
  390. package/dist/types/modes/bridge/auth.d.ts +0 -12
  391. package/dist/types/modes/bridge/bridge-client-bridge.d.ts +0 -9
  392. package/dist/types/modes/bridge/bridge-mode.d.ts +0 -47
  393. package/dist/types/modes/bridge/bridge-ui-context.d.ts +0 -88
  394. package/dist/types/modes/bridge/event-stream.d.ts +0 -8
  395. package/dist/types/modes/rpc/host-tools.d.ts +0 -1
  396. package/dist/types/modes/rpc/host-uris.d.ts +0 -1
  397. package/dist/types/modes/rpc/rpc-client.d.ts +0 -299
  398. package/dist/types/modes/rpc/rpc-mode.d.ts +0 -86
  399. package/dist/types/modes/rpc/rpc-socket-security.d.ts +0 -10
  400. package/dist/types/modes/rpc/rpc-types.d.ts +0 -810
  401. package/dist/types/modes/shared/agent-wire/command-contract.d.ts +0 -18
  402. package/dist/types/modes/shared/agent-wire/command-dispatch.d.ts +0 -37
  403. package/dist/types/modes/shared/agent-wire/command-validation.d.ts +0 -2
  404. package/dist/types/modes/shared/agent-wire/handshake.d.ts +0 -56
  405. package/dist/types/modes/shared/agent-wire/host-tool-bridge.d.ts +0 -16
  406. package/dist/types/modes/shared/agent-wire/host-uri-bridge.d.ts +0 -17
  407. package/dist/types/modes/shared/agent-wire/protocol.d.ts +0 -25
  408. package/dist/types/modes/shared/agent-wire/responses.d.ts +0 -4
  409. package/dist/types/modes/shared/agent-wire/scopes.d.ts +0 -18
  410. package/dist/types/modes/shared/agent-wire/session-registry.d.ts +0 -25
  411. package/dist/types/modes/shared/agent-wire/ui-request-broker.d.ts +0 -42
  412. package/dist/types/modes/shared/agent-wire/ui-result.d.ts +0 -27
  413. package/dist/types/modes/shared/agent-wire/unattended-action-policy.d.ts +0 -29
  414. package/dist/types/modes/shared/agent-wire/unattended-audit.d.ts +0 -68
  415. package/dist/types/modes/shared/agent-wire/unattended-run-controller.d.ts +0 -166
  416. package/dist/types/modes/shared/agent-wire/unattended-session.d.ts +0 -127
  417. package/dist/types/notifications/config.d.ts +0 -132
  418. package/src/harness-control-plane/rpc-adapter.ts +0 -290
  419. package/src/modes/bridge/auth.ts +0 -41
  420. package/src/modes/bridge/bridge-client-bridge.ts +0 -47
  421. package/src/modes/bridge/bridge-mode.ts +0 -675
  422. package/src/modes/bridge/bridge-ui-context.ts +0 -200
  423. package/src/modes/bridge/event-stream.ts +0 -70
  424. package/src/modes/rpc/host-tools.ts +0 -1
  425. package/src/modes/rpc/host-uris.ts +0 -1
  426. package/src/modes/rpc/rpc-client.ts +0 -1166
  427. package/src/modes/rpc/rpc-mode.ts +0 -1029
  428. package/src/modes/rpc/rpc-socket-security.ts +0 -115
  429. package/src/modes/rpc/rpc-types.ts +0 -637
  430. package/src/modes/shared/agent-wire/command-contract.ts +0 -18
  431. package/src/modes/shared/agent-wire/command-dispatch.ts +0 -498
  432. package/src/modes/shared/agent-wire/command-validation.ts +0 -181
  433. package/src/modes/shared/agent-wire/handshake.ts +0 -157
  434. package/src/modes/shared/agent-wire/host-tool-bridge.ts +0 -197
  435. package/src/modes/shared/agent-wire/host-uri-bridge.ts +0 -236
  436. package/src/modes/shared/agent-wire/protocol.ts +0 -46
  437. package/src/modes/shared/agent-wire/responses.ts +0 -17
  438. package/src/modes/shared/agent-wire/scopes.ts +0 -94
  439. package/src/modes/shared/agent-wire/session-registry.ts +0 -109
  440. package/src/modes/shared/agent-wire/ui-request-broker.ts +0 -150
  441. package/src/modes/shared/agent-wire/ui-result.ts +0 -48
  442. package/src/modes/shared/agent-wire/unattended-action-policy.ts +0 -365
  443. package/src/modes/shared/agent-wire/unattended-audit.ts +0 -176
  444. package/src/modes/shared/agent-wire/unattended-run-controller.ts +0 -426
  445. package/src/modes/shared/agent-wire/unattended-session.ts +0 -528
  446. package/src/notifications/config.ts +0 -219
  447. package/src/notifications/index.ts +0 -1835
  448. package/src/notifications/telegram-daemon-cli.ts +0 -243
  449. package/src/tools/puppeteer/09_stealth_locale.txt +0 -46
  450. /package/dist/types/{notifications → sdk/bus}/attachment-registry.d.ts +0 -0
  451. /package/dist/types/{notifications → sdk/bus}/chat-adapters.d.ts +0 -0
  452. /package/dist/types/{notifications → sdk/bus}/daemon-paths.d.ts +0 -0
  453. /package/dist/types/{notifications → sdk/bus}/engine.d.ts +0 -0
  454. /package/dist/types/{notifications → sdk/bus}/helpers.d.ts +0 -0
  455. /package/dist/types/{notifications → sdk/bus}/lifecycle-commands.d.ts +0 -0
  456. /package/dist/types/{notifications → sdk/bus}/operator-runtime.d.ts +0 -0
  457. /package/dist/types/{notifications → sdk/bus}/rate-limit-pool.d.ts +0 -0
  458. /package/dist/types/{notifications → sdk/bus}/recent-activity.d.ts +0 -0
  459. /package/dist/types/{notifications → sdk/bus}/reply-sent-store.d.ts +0 -0
  460. /package/dist/types/{notifications → sdk/bus}/rich-draft.d.ts +0 -0
  461. /package/dist/types/{notifications → sdk/bus}/rich-render.d.ts +0 -0
  462. /package/dist/types/{notifications → sdk/bus}/threaded-inbound.d.ts +0 -0
  463. /package/dist/types/{notifications → sdk/bus}/threaded-render.d.ts +0 -0
  464. /package/src/{notifications → sdk/bus}/attachment-registry.ts +0 -0
  465. /package/src/{notifications → sdk/bus}/chat-adapters.ts +0 -0
  466. /package/src/{notifications → sdk/bus}/daemon-paths.ts +0 -0
  467. /package/src/{notifications → sdk/bus}/engine.ts +0 -0
  468. /package/src/{notifications → sdk/bus}/helpers.ts +0 -0
  469. /package/src/{notifications → sdk/bus}/operator-runtime.ts +0 -0
  470. /package/src/{notifications → sdk/bus}/rate-limit-pool.ts +0 -0
  471. /package/src/{notifications → sdk/bus}/recent-activity.ts +0 -0
  472. /package/src/{notifications → sdk/bus}/reply-sent-store.ts +0 -0
  473. /package/src/{notifications → sdk/bus}/rich-draft.ts +0 -0
  474. /package/src/{notifications → sdk/bus}/rich-render.ts +0 -0
  475. /package/src/{notifications → sdk/bus}/threaded-inbound.ts +0 -0
  476. /package/src/{notifications → sdk/bus}/threaded-render.ts +0 -0
@@ -0,0 +1,367 @@
1
+ import { createHash } from "node:crypto";
2
+ import {
3
+ DEFAULT_MODEL_SELECTION_RECOVERY_MESSAGE,
4
+ parseDefaultModelSelectionRecovery,
5
+ } from "../../../session/default-model-selection";
6
+ import { OPERATIONS, type Operation } from "../../protocol/operation-registry";
7
+ import type { ControlInput, ControlSurface, ControlValue } from "./operations";
8
+
9
+ export interface ControlRequest {
10
+ id: string;
11
+ operation: string;
12
+ input: unknown;
13
+ expectedRevision?: string;
14
+ idempotencyKey?: string;
15
+ confirm?: boolean;
16
+ }
17
+
18
+ export type ControlErrorCode = string;
19
+
20
+ export interface ControlError {
21
+ code: ControlErrorCode;
22
+ message: string;
23
+ currentRevision?: string;
24
+ details?: ControlValue;
25
+ }
26
+
27
+ export interface ControlResponse {
28
+ id: string;
29
+ ok: boolean;
30
+ result?: ControlValue;
31
+ error?: ControlError;
32
+ }
33
+
34
+ /** An error whose code is intentionally safe to expose on the control protocol. */
35
+ export class TypedControlError extends Error {
36
+ constructor(
37
+ readonly code: ControlErrorCode,
38
+ message: string,
39
+ ) {
40
+ super(message);
41
+ this.name = "TypedControlError";
42
+ }
43
+ }
44
+
45
+ /** Busy is reserved for explicitly typed transient unavailability. */
46
+ export class BusyError extends TypedControlError {
47
+ constructor(message = "Control operation is temporarily unavailable.") {
48
+ super("busy", message);
49
+ this.name = "BusyError";
50
+ }
51
+ }
52
+
53
+ const SHARED_ERROR_CODES = new Set([
54
+ "revision_conflict",
55
+ "unknown_operation",
56
+ "invalid_input",
57
+ "busy",
58
+ "resource_gone",
59
+ "unsupported_protocol",
60
+ "provider_lease_conflict",
61
+ "lease_expired",
62
+ "not_lease_owner",
63
+ "endpoint_stale",
64
+ "idempotency_conflict",
65
+ "snapshot_capacity_exceeded",
66
+ "cursor_expired",
67
+ "event_gap",
68
+ "unavailable",
69
+ "internal",
70
+ ]);
71
+ const IDEMPOTENCY_TTL_MS = 15 * 60 * 1_000;
72
+ const MAX_IDEMPOTENCY_ENTRIES = 256;
73
+
74
+ const sessionChains = new WeakMap<ControlSurface, Promise<void>>();
75
+ interface IdempotencyEntry {
76
+ hash: string;
77
+ expiresAt: number;
78
+ response: Promise<ControlResponse>;
79
+ }
80
+ const idempotentRequests = new WeakMap<ControlSurface, Map<string, IdempotencyEntry>>();
81
+
82
+ type PreflightCancellableSurface = ControlSurface & {
83
+ cancelPendingPreflights?(): void;
84
+ };
85
+
86
+ function failure(
87
+ id: string,
88
+ code: ControlErrorCode,
89
+ message: string,
90
+ currentRevision?: string,
91
+ details?: ControlValue,
92
+ ): ControlResponse {
93
+ return {
94
+ id,
95
+ ok: false,
96
+ error: {
97
+ code,
98
+ message,
99
+ ...(currentRevision === undefined ? {} : { currentRevision }),
100
+ ...(details === undefined ? {} : { details }),
101
+ },
102
+ };
103
+ }
104
+
105
+ function isInput(value: unknown): value is ControlInput {
106
+ return typeof value === "object" && value !== null && !Array.isArray(value);
107
+ }
108
+
109
+ function canonicalize(value: unknown): unknown {
110
+ if (Array.isArray(value)) return value.map(canonicalize);
111
+ if (value && typeof value === "object") {
112
+ return Object.fromEntries(
113
+ Object.keys(value as Record<string, unknown>)
114
+ .sort()
115
+ .map(key => [key, canonicalize((value as Record<string, unknown>)[key])]),
116
+ );
117
+ }
118
+ return value;
119
+ }
120
+
121
+ function inputHash(input: unknown): string {
122
+ return createHash("sha256")
123
+ .update(JSON.stringify(canonicalize(input)))
124
+ .digest("hex");
125
+ }
126
+
127
+ function text(input: ControlInput, key = "text"): string {
128
+ return input[key] as string;
129
+ }
130
+
131
+ function invoke(
132
+ surface: ControlSurface,
133
+ operation: string,
134
+ input: ControlInput,
135
+ confirm: boolean | undefined,
136
+ ): Promise<ControlValue> | ControlValue {
137
+ switch (operation) {
138
+ case "turn.prompt":
139
+ return surface.prompt(text(input), input.images);
140
+ case "turn.steer":
141
+ return surface.steer(text(input));
142
+ case "turn.follow_up":
143
+ return surface.followUp(text(input));
144
+ case "turn.abort":
145
+ return surface.abort();
146
+ case "turn.abort_and_prompt":
147
+ return surface.abortAndPrompt(text(input));
148
+ case "ask.answer":
149
+ return surface.answerAsk(text(input, "id"), input.answer);
150
+ case "workflow.gate_answer":
151
+ return surface.answerGate(text(input, "id"), input.response, input.expectedSessionId as string | undefined);
152
+ case "workflow.plan_approve":
153
+ return surface.approvePlan(text(input, "id"), input.choice, input.expectedSessionId as string | undefined);
154
+ case "skill.invoke":
155
+ return surface.invokeSkill(text(input, "name"), input.args);
156
+ case "mode.plan.set":
157
+ return surface.setPlanMode(input.on as boolean);
158
+ case "mode.goal.operate":
159
+ return surface.operateGoal(text(input, "op"), input.objective as string | undefined);
160
+ case "todo.replace":
161
+ return surface.replaceTodo(input.items);
162
+ case "model.set":
163
+ return surface.setModel(text(input, "id"), input.thinkingLevel);
164
+ case "model.cycle":
165
+ return surface.cycleModel();
166
+ case "thinking.set":
167
+ return surface.setThinking(input.level);
168
+ case "thinking.cycle":
169
+ return surface.cycleThinking();
170
+ case "permission_mode.set":
171
+ return surface.setPermissionMode(input.mode);
172
+ case "queue.steering_mode.set":
173
+ return surface.setQueueMode("steering", input.mode);
174
+ case "queue.follow_up_mode.set":
175
+ return surface.setQueueMode("follow_up", input.mode);
176
+ case "queue.interrupt_mode.set":
177
+ return surface.setQueueMode("interrupt", input.mode);
178
+ case "compaction.run":
179
+ return surface.runCompaction();
180
+ case "compaction.auto.set":
181
+ return surface.setAutoCompaction(input.on as boolean);
182
+ case "retry.auto.set":
183
+ return surface.setAutoRetry(input.on as boolean);
184
+ case "retry.abort":
185
+ return surface.abortRetry();
186
+ case "bash.execute":
187
+ return surface.executeBash(text(input, "cmd"));
188
+ case "bash.abort":
189
+ return surface.abortBash();
190
+ case "session.new":
191
+ return surface.newSession();
192
+ case "session.fork":
193
+ return surface.forkSession();
194
+ case "session.resume":
195
+ return surface.resumeSession(text(input, "id"));
196
+ case "session.close":
197
+ return surface.closeSession();
198
+ case "session.switch":
199
+ return surface.switchSession(text(input, "id"));
200
+ case "session.branch":
201
+ return surface.branchSession(text(input, "entryId"));
202
+ case "session.rename":
203
+ return surface.renameSession(text(input, "name"));
204
+ case "session.handoff":
205
+ return surface.handoffSession(input.target);
206
+ case "session.export_html":
207
+ return surface.exportHtml();
208
+ case "config.patch":
209
+ return surface.patchConfig(input.patch);
210
+ case "runtime.reload":
211
+ return surface.reloadRuntime(input.components);
212
+ case "auth.login":
213
+ return surface.login(text(input, "provider"));
214
+ case "host_tools.register":
215
+ return surface.registerHostTools(input.defs);
216
+ case "host_uri.register":
217
+ return surface.registerHostUri(input.defs);
218
+ case "service_tier.set":
219
+ return surface.setServiceTier(input.tier);
220
+ case "tools.active.set":
221
+ return surface.setActiveTools(input.names);
222
+ case "queue.message.remove":
223
+ return surface.removeQueueMessage(text(input, "id"));
224
+ case "queue.message.move":
225
+ return surface.moveQueueMessage(text(input, "id"), {
226
+ before: input.before as string | undefined,
227
+ after: input.after as string | undefined,
228
+ });
229
+ case "queue.message.update":
230
+ return surface.updateQueueMessage(text(input, "id"), input.patch);
231
+ case "extension.set_enabled":
232
+ return surface.setExtensionEnabled(text(input, "id"), input.on as boolean);
233
+ case "context.clear":
234
+ return surface.clearContext(confirm === true);
235
+ case "session.delete":
236
+ return surface.deleteSession(text(input, "id"), confirm === true);
237
+ case "session.cwd.move":
238
+ return surface.moveCwd(text(input, "path"));
239
+ case "retry.last":
240
+ return surface.retryLast();
241
+ case "retry.now":
242
+ return surface.retryNow();
243
+ case "bash.background":
244
+ return surface.backgroundBash();
245
+ default:
246
+ throw new Error("unknown operation");
247
+ }
248
+ }
249
+
250
+ function errorResponse(id: string, row: Operation, error: unknown): ControlResponse {
251
+ const candidate = error as { code?: unknown; message?: unknown; recovery?: unknown };
252
+ const code = typeof candidate?.code === "string" ? candidate.code : undefined;
253
+ const message = typeof candidate?.message === "string" ? candidate.message : "Control operation failed.";
254
+ if (error instanceof BusyError) return failure(id, "busy", message);
255
+ if (code === "default_model_selection_recovery" && row.errorCodes.includes(code)) {
256
+ const recovery = parseDefaultModelSelectionRecovery(candidate.recovery) ?? {
257
+ message: DEFAULT_MODEL_SELECTION_RECOVERY_MESSAGE,
258
+ rollback: { disposition: "unknown" as const, failures: [] },
259
+ };
260
+ return failure(id, code, DEFAULT_MODEL_SELECTION_RECOVERY_MESSAGE, undefined, recovery);
261
+ }
262
+ if (code && (row.errorCodes.includes(code) || SHARED_ERROR_CODES.has(code))) return failure(id, code, message);
263
+ if (code === "resource_gone" || /not found|gone/i.test(message)) return failure(id, "resource_gone", message);
264
+ if (code === "unknown_gate") return failure(id, "resource_gone", message);
265
+ if (code === "invalid_input" || /invalid input/i.test(message)) return failure(id, "invalid_input", message);
266
+ return failure(id, "internal", "Control operation failed.");
267
+ }
268
+
269
+ async function execute(surface: ControlSurface, row: Operation, request: ControlRequest): Promise<ControlResponse> {
270
+ if (row.revisionResource && request.expectedRevision !== undefined && surface.revisionProvider) {
271
+ const currentRevision = await surface.revisionProvider(row.revisionResource);
272
+ if (currentRevision !== request.expectedRevision)
273
+ return failure(request.id, "revision_conflict", "The resource revision has changed.", currentRevision);
274
+ }
275
+ try {
276
+ return {
277
+ id: request.id,
278
+ ok: true,
279
+ result: await invoke(surface, row.sdkId, request.input as ControlInput, request.confirm),
280
+ };
281
+ } catch (error) {
282
+ return errorResponse(request.id, row, error);
283
+ }
284
+ }
285
+
286
+ function serialize(surface: ControlSurface, work: () => Promise<ControlResponse>): Promise<ControlResponse> {
287
+ const previous = sessionChains.get(surface) ?? Promise.resolve();
288
+ const result = previous.then(work, work);
289
+ sessionChains.set(
290
+ surface,
291
+ result.then(
292
+ () => undefined,
293
+ () => undefined,
294
+ ),
295
+ );
296
+ return result;
297
+ }
298
+
299
+ function idempotent(
300
+ surface: ControlSurface,
301
+ row: Operation,
302
+ request: ControlRequest,
303
+ work: () => Promise<ControlResponse>,
304
+ ): Promise<ControlResponse> {
305
+ let requests = idempotentRequests.get(surface);
306
+ if (!requests) {
307
+ requests = new Map();
308
+ idempotentRequests.set(surface, requests);
309
+ }
310
+ const now = Date.now();
311
+ for (const [key, entry] of requests) if (entry.expiresAt <= now) requests.delete(key);
312
+ const key = `${row.sdkId}\u0000${request.idempotencyKey}`;
313
+ const hash = inputHash(request.input);
314
+ const existing = requests.get(key);
315
+ if (existing) {
316
+ requests.delete(key);
317
+ requests.set(key, existing);
318
+ if (existing.hash !== hash)
319
+ return Promise.resolve(
320
+ failure(request.id, "idempotency_conflict", "Idempotency key was reused with different input."),
321
+ );
322
+ return existing.response.then(response => ({ ...response, id: request.id }));
323
+ }
324
+ const response = work();
325
+ requests.set(key, { hash, expiresAt: now + IDEMPOTENCY_TTL_MS, response });
326
+ while (requests.size > MAX_IDEMPOTENCY_ENTRIES) requests.delete(requests.keys().next().value!);
327
+ return response;
328
+ }
329
+
330
+ /** Dispatches a registry-defined per-session control operation. */
331
+ export function dispatchControl(
332
+ surface: ControlSurface,
333
+ registryRow: Operation | undefined,
334
+ request: ControlRequest,
335
+ ): Promise<ControlResponse> {
336
+ const row =
337
+ registryRow?.kind === "control" && registryRow.sdkId === request.operation
338
+ ? OPERATIONS.find(
339
+ operation =>
340
+ operation.kind === "control" &&
341
+ operation.id === registryRow.id &&
342
+ operation.sdkId === request.operation,
343
+ )
344
+ : undefined;
345
+ if (!row)
346
+ return Promise.resolve(
347
+ failure(request.id, "unknown_operation", `Unknown control operation: ${request.operation}.`),
348
+ );
349
+ if (surface.installedOperations instanceof Set && !surface.installedOperations.has(row.sdkId))
350
+ return Promise.resolve(
351
+ failure(request.id, "operation_not_session_owned", `${request.operation} is not installed for this session.`),
352
+ );
353
+ if (!isInput(request.input))
354
+ return Promise.resolve(failure(request.id, "invalid_input", "Control input must be an object."));
355
+ if ((row.sdkId === "context.clear" || row.sdkId === "session.delete") && request.confirm !== true)
356
+ return Promise.resolve(
357
+ failure(request.id, "invalid_input", "confirm: true is required for this destructive operation."),
358
+ );
359
+ const work = () => execute(surface, row, request);
360
+ if (row.sdkId === "turn.abort_and_prompt") {
361
+ const cancellable = surface as PreflightCancellableSurface;
362
+ if (Object.hasOwn(cancellable, "cancelPendingPreflights")) cancellable.cancelPendingPreflights?.();
363
+ return serialize(surface, work);
364
+ }
365
+ if (row.idempotency === "idempotent" && request.idempotencyKey) return idempotent(surface, row, request, work);
366
+ return row.idempotency === "ordered" && row.sdkId !== "retry.now" ? serialize(surface, work) : work();
367
+ }
@@ -0,0 +1,10 @@
1
+ export {
2
+ BusyError,
3
+ type ControlError,
4
+ type ControlErrorCode,
5
+ type ControlRequest,
6
+ type ControlResponse,
7
+ dispatchControl,
8
+ TypedControlError,
9
+ } from "./dispatch";
10
+ export type { ControlInput, ControlSurface, ControlValue } from "./operations";
@@ -0,0 +1,63 @@
1
+ export type ControlValue = unknown;
2
+ export type ControlInput = Record<string, unknown>;
3
+
4
+ /**
5
+ * Narrow host contract used by control dispatch. Implementations adapt an
6
+ * AgentSession and its controllers without exposing those concrete types here.
7
+ */
8
+ export interface ControlSurface {
9
+ prompt(text: string, images?: ControlValue): Promise<ControlValue> | ControlValue;
10
+ steer(text: string): Promise<ControlValue> | ControlValue;
11
+ followUp(text: string): Promise<ControlValue> | ControlValue;
12
+ abort(): Promise<ControlValue> | ControlValue;
13
+ abortAndPrompt(text: string): Promise<ControlValue> | ControlValue;
14
+ answerAsk(id: string, answer: ControlValue): Promise<ControlValue> | ControlValue;
15
+ answerGate(id: string, response: ControlValue, expectedSessionId?: string): Promise<ControlValue> | ControlValue;
16
+ approvePlan(id: string, choice: ControlValue, expectedSessionId?: string): Promise<ControlValue> | ControlValue;
17
+ invokeSkill(name: string, args: ControlValue): Promise<ControlValue> | ControlValue;
18
+ setPlanMode(on: boolean): Promise<ControlValue> | ControlValue;
19
+ operateGoal(op: string, objective?: string): Promise<ControlValue> | ControlValue;
20
+ replaceTodo(items: ControlValue): Promise<ControlValue> | ControlValue;
21
+ setModel(id: string, thinkingLevel?: ControlValue): Promise<ControlValue> | ControlValue;
22
+ cycleModel(): Promise<ControlValue> | ControlValue;
23
+ setThinking(level: ControlValue): Promise<ControlValue> | ControlValue;
24
+ cycleThinking(): Promise<ControlValue> | ControlValue;
25
+ setPermissionMode(mode: ControlValue): Promise<ControlValue> | ControlValue;
26
+ setQueueMode(kind: string, mode: ControlValue): Promise<ControlValue> | ControlValue;
27
+ runCompaction(): Promise<ControlValue> | ControlValue;
28
+ setAutoCompaction(on: boolean): Promise<ControlValue> | ControlValue;
29
+ setAutoRetry(on: boolean): Promise<ControlValue> | ControlValue;
30
+ abortRetry(): Promise<ControlValue> | ControlValue;
31
+ executeBash(cmd: string): Promise<ControlValue> | ControlValue;
32
+ abortBash(): Promise<ControlValue> | ControlValue;
33
+ newSession(): Promise<ControlValue> | ControlValue;
34
+ forkSession(): Promise<ControlValue> | ControlValue;
35
+ resumeSession(id: string): Promise<ControlValue> | ControlValue;
36
+ closeSession(): Promise<ControlValue> | ControlValue;
37
+ switchSession(id: string): Promise<ControlValue> | ControlValue;
38
+ branchSession(entryId: string): Promise<ControlValue> | ControlValue;
39
+ renameSession(name: string): Promise<ControlValue> | ControlValue;
40
+ handoffSession(target: ControlValue): Promise<ControlValue> | ControlValue;
41
+ exportHtml(): Promise<ControlValue> | ControlValue;
42
+ patchConfig(patch: ControlValue): Promise<ControlValue> | ControlValue;
43
+ reloadRuntime(components: ControlValue): Promise<ControlValue> | ControlValue;
44
+ login(provider: string): Promise<ControlValue> | ControlValue;
45
+ registerHostTools(defs: ControlValue): Promise<ControlValue> | ControlValue;
46
+ registerHostUri(defs: ControlValue): Promise<ControlValue> | ControlValue;
47
+ setServiceTier(tier: ControlValue): Promise<ControlValue> | ControlValue;
48
+ setActiveTools(names: ControlValue): Promise<ControlValue> | ControlValue;
49
+ removeQueueMessage(id: string): Promise<ControlValue> | ControlValue;
50
+ moveQueueMessage(id: string, position: { before?: string; after?: string }): Promise<ControlValue> | ControlValue;
51
+ updateQueueMessage(id: string, patch: ControlValue): Promise<ControlValue> | ControlValue;
52
+ setExtensionEnabled(id: string, on: boolean): Promise<ControlValue> | ControlValue;
53
+ clearContext(confirm: boolean): Promise<ControlValue> | ControlValue;
54
+ deleteSession(id: string, confirm: boolean): Promise<ControlValue> | ControlValue;
55
+ moveCwd(path: string): Promise<ControlValue> | ControlValue;
56
+ retryLast(): Promise<ControlValue> | ControlValue;
57
+ retryNow(): Promise<ControlValue> | ControlValue;
58
+ backgroundBash(): Promise<ControlValue> | ControlValue;
59
+ /** Returns the current revision for a registry revision resource. */
60
+ /** Installed per-session registry rows. Dispatch rejects other rows before invoking a surface method. */
61
+ installedOperations?: ReadonlySet<string>;
62
+ revisionProvider?(resource: string): Promise<string | undefined> | string | undefined;
63
+ }
@@ -0,0 +1,91 @@
1
+ import type { SdkFrame } from "./types";
2
+
3
+ export interface EventFrame extends SdkFrame {
4
+ type: "event";
5
+ generation: number;
6
+ seq: number;
7
+ }
8
+
9
+ export type EventReplayGap =
10
+ | {
11
+ kind: "generation_reset";
12
+ fromGeneration: number;
13
+ toGeneration: number;
14
+ resyncQueries: string[];
15
+ }
16
+ | {
17
+ kind: "sequence_gap";
18
+ fromSeq: number;
19
+ toSeq: number;
20
+ resyncQueries: string[];
21
+ };
22
+
23
+ export interface EventReplay {
24
+ events: EventFrame[];
25
+ gap?: EventReplayGap;
26
+ }
27
+
28
+ export class SessionEventStream {
29
+ #generation = 0;
30
+ #seq = 0;
31
+ #frames: EventFrame[] = [];
32
+ readonly #ringSize: number;
33
+ readonly #resyncQueries: string[];
34
+
35
+ constructor(options: { generation?: number; ringSize?: number; resyncQueryIds?: string[] } = {}) {
36
+ this.#generation = options.generation ?? 0;
37
+ this.#ringSize = options.ringSize ?? 256;
38
+ this.#resyncQueries = options.resyncQueryIds ?? ["Q01", "Q02", "Q03"];
39
+ }
40
+
41
+ get generation(): number {
42
+ return this.#generation;
43
+ }
44
+ get sequence(): number {
45
+ return this.#seq;
46
+ }
47
+
48
+ restart(): number {
49
+ this.#generation += 1;
50
+ this.#seq = 0;
51
+ this.#frames = [];
52
+ return this.#generation;
53
+ }
54
+
55
+ emit(frame: SdkFrame): EventFrame {
56
+ const event: EventFrame = { ...frame, type: "event", generation: this.#generation, seq: ++this.#seq };
57
+ this.#frames.push(event);
58
+ if (this.#frames.length > this.#ringSize) this.#frames.shift();
59
+ return event;
60
+ }
61
+
62
+ /** Replays retained current-generation events and reports any required resynchronization. */
63
+ replay(lastSeq: number, generation = this.#generation): EventReplay {
64
+ const events = this.#frames.filter(frame => frame.seq > lastSeq);
65
+ if (generation !== this.#generation) {
66
+ return {
67
+ events: [...this.#frames],
68
+ gap: {
69
+ kind: "generation_reset",
70
+ fromGeneration: generation,
71
+ toGeneration: this.#generation,
72
+ resyncQueries: [...this.#resyncQueries],
73
+ },
74
+ };
75
+ }
76
+ const oldest = this.#frames[0]?.seq ?? this.#seq + 1;
77
+ const replayFrom = lastSeq + 1;
78
+ if (replayFrom < oldest) {
79
+ return {
80
+ events: this.#frames.filter(frame => frame.seq >= oldest),
81
+ gap: {
82
+ kind: "sequence_gap",
83
+ fromSeq: replayFrom,
84
+ toSeq: oldest - 1,
85
+ resyncQueries: [...this.#resyncQueries],
86
+ },
87
+ };
88
+ }
89
+ return { events };
90
+ }
91
+ }