@sayknow-cli/coding-agent 0.3.15 → 0.4.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 (1474) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/package.json +133 -116
  3. package/scripts/build-sdk-package-smoke.ts +132 -0
  4. package/scripts/capture-notifications-settings-showcase.ts +435 -0
  5. package/scripts/compile-args.ts +5 -2
  6. package/scripts/g005-daemon-smoke.ts +4 -5
  7. package/scripts/g011-daemon-path-smoke.ts +5 -5
  8. package/scripts/generate-hotkeys-docs.ts +74 -0
  9. package/scripts/generate-sdk-adapter-parity-manifest.ts +163 -0
  10. package/scripts/generate-sdk-operation-inventory.ts +914 -0
  11. package/scripts/generate-telegram-baseline-manifest.ts +128 -0
  12. package/scripts/manifest-schema.ts +124 -0
  13. package/scripts/run-test-manifest.ts +153 -0
  14. package/scripts/run-threat-model-check.ts +217 -0
  15. package/scripts/verify-skc-sdk-canonicalization.ts +3647 -0
  16. package/scripts/verify-skc-sdk-rename.ts +90 -0
  17. package/src/append-only-mode.ts +1 -1
  18. package/src/async/job-manager.ts +455 -69
  19. package/src/cli/args.ts +43 -12
  20. package/src/cli/auth-gateway-cli.ts +2 -2
  21. package/src/cli/config-cli.ts +77 -3
  22. package/src/cli/daemon-cli.ts +63 -14
  23. package/src/cli/launch-disposition.ts +42 -0
  24. package/src/cli/list-models.ts +1 -1
  25. package/src/cli/notify-cli.ts +373 -283
  26. package/src/cli/session-picker.ts +20 -3
  27. package/src/cli/setup-cli.ts +1 -1
  28. package/src/cli/worktree-cli.ts +9 -287
  29. package/src/cli.ts +31 -11
  30. package/src/commands/config.ts +1 -1
  31. package/src/commands/daemon.ts +50 -6
  32. package/src/commands/gc.ts +11 -1
  33. package/src/commands/harness.ts +127 -142
  34. package/src/commands/launch.ts +11 -6
  35. package/src/commands/mcp-serve.ts +97 -13
  36. package/src/commands/mcp.ts +2 -2
  37. package/src/commands/notify.ts +44 -7
  38. package/src/commands/sdk.ts +453 -0
  39. package/src/commands/ultragoal.ts +4 -1
  40. package/src/commands/worktree.ts +10 -53
  41. package/src/commit/agentic/agent.ts +1 -0
  42. package/src/config/atomic-yaml-patch.ts +490 -0
  43. package/src/config/file-lock.ts +105 -43
  44. package/src/config/keybindings.ts +64 -20
  45. package/src/config/model-auth.ts +9 -0
  46. package/src/config/model-bindings-applier.ts +139 -0
  47. package/src/config/model-discovery-manager.ts +224 -0
  48. package/src/config/model-equivalence.ts +66 -0
  49. package/src/config/model-profile-activation.ts +233 -86
  50. package/src/config/model-profiles.ts +52 -49
  51. package/src/config/model-registry.ts +5 -4
  52. package/src/config/model-resolver.ts +487 -410
  53. package/src/config/model-selector-value.ts +50 -0
  54. package/src/config/models-config-schema.ts +17 -23
  55. package/src/config/settings-schema.ts +372 -21
  56. package/src/config/settings.ts +1120 -182
  57. package/src/coordinator-mcp/model-preset.ts +74 -20
  58. package/src/coordinator-mcp/policy.ts +76 -11
  59. package/src/coordinator-mcp/question-gate-codec.ts +274 -0
  60. package/src/coordinator-mcp/question-state.ts +778 -0
  61. package/src/coordinator-mcp/server.ts +3120 -3111
  62. package/src/daemon/builtin.ts +8 -5
  63. package/src/daemon/control-types.ts +1 -1
  64. package/src/daemon/runtime.ts +2 -2
  65. package/src/debug/index.ts +1 -1
  66. package/src/defaults/skc/skills/team/SKILL.md +27 -13
  67. package/src/defaults/skc/skills/ultragoal/SKILL.md +0 -2
  68. package/src/discovery/helpers.ts +1 -50
  69. package/src/discovery/mcp-json.ts +327 -20
  70. package/src/edit/index.ts +64 -0
  71. package/src/eval/js/shared/runtime.ts +1 -1
  72. package/src/eval/py/env.ts +26 -0
  73. package/src/eval/py/index.ts +2 -2
  74. package/src/eval/py/kernel.ts +5 -3
  75. package/src/export/html/template.generated.ts +1 -1
  76. package/src/export/html/template.js +52 -18
  77. package/src/extensibility/custom-tools/types.ts +1 -1
  78. package/src/extensibility/extensions/compact-handler.ts +3 -3
  79. package/src/extensibility/extensions/get-commands-handler.ts +2 -2
  80. package/src/extensibility/extensions/loader.ts +77 -5
  81. package/src/extensibility/extensions/runner.ts +124 -7
  82. package/src/extensibility/extensions/types.ts +215 -18
  83. package/src/extensibility/hooks/runner.ts +2 -2
  84. package/src/extensibility/hooks/types.ts +1 -1
  85. package/src/extensibility/plugins/marketplace/manager.ts +94 -10
  86. package/src/extensibility/runtime-skill-discovery.ts +33 -13
  87. package/src/extensibility/shared-events.ts +2 -0
  88. package/src/extensibility/skc-plugins/installer.ts +16 -16
  89. package/src/extensibility/slash-commands.ts +3 -3
  90. package/src/goals/continuation-timeout-guard.ts +79 -0
  91. package/src/goals/runtime.ts +7 -5
  92. package/src/goals/state.ts +18 -0
  93. package/src/harness-control-plane/lifecycle-reconciliation.ts +64 -0
  94. package/src/harness-control-plane/operate.ts +9 -9
  95. package/src/harness-control-plane/owner.ts +341 -41
  96. package/src/harness-control-plane/phase-rollup.ts +4 -7
  97. package/src/harness-control-plane/receipt-ingest.ts +5 -0
  98. package/src/harness-control-plane/receipt-spool.ts +51 -7
  99. package/src/harness-control-plane/receipts.ts +0 -1
  100. package/src/harness-control-plane/sdk-transport.ts +395 -0
  101. package/src/harness-control-plane/session-lease.ts +12 -130
  102. package/src/harness-control-plane/session-transport.ts +94 -0
  103. package/src/harness-control-plane/types.ts +1 -1
  104. package/src/hindsight/backend.ts +26 -27
  105. package/src/hindsight/client.ts +65 -2
  106. package/src/hindsight/state.ts +101 -32
  107. package/src/hooks/skill-state.ts +17 -11
  108. package/src/i18n/messages/en.ts +1 -0
  109. package/src/internal-urls/agent-protocol.ts +76 -5
  110. package/src/internal-urls/docs-index.generated.ts +44 -37
  111. package/src/internal-urls/local-protocol.ts +420 -18
  112. package/src/lsp/client.ts +43 -7
  113. package/src/lsp/config.ts +145 -26
  114. package/src/lsp/index.ts +7 -91
  115. package/src/lsp/lspmux.ts +39 -10
  116. package/src/lsp/path-trust.ts +81 -0
  117. package/src/main.ts +451 -236
  118. package/src/memories/index.ts +1 -0
  119. package/src/memories/storage.ts +6 -2
  120. package/src/modes/DESIGN.md +258 -0
  121. package/src/modes/acp/acp-agent.ts +1236 -2612
  122. package/src/modes/acp/acp-client-bridge.ts +2 -20
  123. package/src/modes/acp/acp-event-mapper.ts +18 -2
  124. package/src/modes/acp/acp-mode.ts +8 -36
  125. package/src/modes/acp/permission-mode.ts +25 -0
  126. package/src/modes/acp/startup-options.ts +6 -0
  127. package/src/modes/action-registry.ts +165 -0
  128. package/src/modes/bridge/bridge-mode.ts +6 -4
  129. package/src/modes/components/agent-dashboard.ts +37 -17
  130. package/src/modes/components/ansi-display-validator.ts +54 -0
  131. package/src/modes/components/chrome.ts +40 -0
  132. package/src/modes/components/command-palette.ts +168 -0
  133. package/src/modes/components/custom-editor.ts +105 -33
  134. package/src/modes/components/custom-provider-wizard.ts +77 -15
  135. package/src/modes/components/index.ts +2 -1
  136. package/src/modes/components/model-selector.ts +93 -35
  137. package/src/modes/components/notifications-settings-editor.ts +1403 -0
  138. package/src/modes/components/pet-capability.ts +115 -0
  139. package/src/modes/components/pet-selector.ts +15 -23
  140. package/src/modes/components/plan-preview-overlay.ts +295 -0
  141. package/src/modes/components/queue-mode-selector.ts +10 -27
  142. package/src/modes/components/queue-pane.ts +79 -0
  143. package/src/modes/components/read-tool-group.ts +13 -0
  144. package/src/modes/components/sayknow-pet-widget.ts +169 -20
  145. package/src/modes/components/session-observer-overlay.ts +213 -775
  146. package/src/modes/components/sessions-dashboard.ts +181 -0
  147. package/src/modes/components/settings-selector.ts +89 -12
  148. package/src/modes/components/show-images-selector.ts +10 -24
  149. package/src/modes/components/status-line/types.ts +1 -1
  150. package/src/modes/components/status-line.ts +1 -969
  151. package/src/modes/components/tasks-pane.ts +73 -0
  152. package/src/modes/components/theme-selector.ts +11 -31
  153. package/src/modes/components/tool-execution.ts +22 -0
  154. package/src/modes/components/tool-status-header.ts +1056 -0
  155. package/src/modes/components/tool-transcript-format.ts +393 -0
  156. package/src/modes/components/transcript-viewer-overlay.ts +446 -0
  157. package/src/modes/components/welcome.ts +4 -4
  158. package/src/modes/controllers/btw-controller.ts +1 -0
  159. package/src/modes/controllers/command-controller.ts +25 -17
  160. package/src/modes/controllers/event-controller.ts +14 -18
  161. package/src/modes/controllers/extension-ui-controller.ts +441 -37
  162. package/src/modes/controllers/goal-mode-controller.ts +493 -0
  163. package/src/modes/controllers/input-controller.ts +889 -263
  164. package/src/modes/controllers/mode-gate.ts +24 -0
  165. package/src/modes/controllers/plan-mode-controller.ts +519 -0
  166. package/src/modes/controllers/runtime-mcp-command-controller.ts +3 -0
  167. package/src/modes/controllers/selector-controller.ts +957 -54
  168. package/src/modes/controllers/stt-controller.ts +125 -0
  169. package/src/modes/index.ts +0 -22
  170. package/src/modes/interactive-mode.ts +376 -1130
  171. package/src/modes/jobs-observer.ts +3 -0
  172. package/src/modes/prompt-action-autocomplete.ts +7 -0
  173. package/src/modes/rpc/rpc-mode.ts +3 -1
  174. package/src/modes/runtime-init.ts +320 -6
  175. package/src/modes/shared/agent-wire/approval-gate.ts +9 -11
  176. package/src/modes/shared/agent-wire/command-dispatch.ts +3 -1
  177. package/src/modes/shared/agent-wire/deep-interview-gate.ts +65 -111
  178. package/src/modes/shared/agent-wire/event-contract.ts +7 -8
  179. package/src/modes/shared/agent-wire/event-envelope.ts +9 -17
  180. package/src/modes/shared/agent-wire/event-observation.ts +16 -7
  181. package/src/modes/shared/agent-wire/workflow-gate-broker.ts +1331 -89
  182. package/src/modes/shared/agent-wire/workflow-gate-schema.ts +19 -17
  183. package/src/modes/shared/agent-wire/workflow-gate-types.ts +407 -0
  184. package/src/modes/tasks-aggregator.ts +199 -0
  185. package/src/modes/transcript-item-registry.ts +229 -0
  186. package/src/modes/types.ts +63 -21
  187. package/src/modes/utils/ui-helpers.ts +17 -9
  188. package/src/notifications/index.ts +8 -2
  189. package/src/plan-mode/approved-plan.ts +3 -1
  190. package/src/prompts/agent-fragments/ralplan-persistence.md +6 -0
  191. package/src/prompts/agent-fragments/restricted-bash.md +1 -0
  192. package/src/prompts/agents/architect.md +3 -8
  193. package/src/prompts/agents/critic.md +3 -8
  194. package/src/prompts/agents/executor.md +3 -0
  195. package/src/prompts/agents/planner.md +4 -12
  196. package/src/prompts/system/custom-system-prompt.md +2 -24
  197. package/src/prompts/system/plan-mode-approved.md +8 -0
  198. package/src/prompts/system/system-prompt.md +18 -94
  199. package/src/prompts/tools/bash.md +4 -4
  200. package/src/prompts/tools/browser.md +15 -52
  201. package/src/prompts/tools/find.md +2 -2
  202. package/src/prompts/tools/hashline.md +13 -55
  203. package/src/prompts/tools/lsp.md +3 -3
  204. package/src/prompts/tools/read.md +3 -6
  205. package/src/prompts/tools/search-tool-bm25.md +0 -2
  206. package/src/prompts/tools/search.md +2 -4
  207. package/src/prompts/tools/skill-discovery.md +1 -2
  208. package/src/prompts/tools/task.md +1 -1
  209. package/src/runtime-mcp/client.ts +94 -19
  210. package/src/runtime-mcp/config.ts +27 -15
  211. package/src/runtime-mcp/discoverable-tool-metadata.ts +16 -13
  212. package/src/runtime-mcp/manager.ts +359 -106
  213. package/src/runtime-mcp/oauth-discovery.ts +116 -26
  214. package/src/runtime-mcp/oauth-flow.ts +42 -12
  215. package/src/runtime-mcp/transports/http.ts +49 -19
  216. package/src/runtime-mcp/transports/stdio.ts +47 -28
  217. package/src/runtime-mcp/types.ts +10 -0
  218. package/src/sdk/acp/adapter.ts +418 -0
  219. package/src/sdk/acp/index.ts +2 -0
  220. package/src/sdk/broker/broker.ts +877 -0
  221. package/src/sdk/broker/discovery.ts +238 -0
  222. package/src/sdk/broker/ensure.ts +393 -0
  223. package/src/sdk/broker/identity.ts +42 -0
  224. package/src/sdk/broker/index.ts +8 -0
  225. package/src/sdk/broker/internal-source-marker-2178.txt +1 -0
  226. package/src/sdk/broker/internal-source.bunfig.toml +1 -0
  227. package/src/sdk/broker/internal.ts +10 -0
  228. package/src/sdk/broker/lifecycle-codec.ts +11 -0
  229. package/src/sdk/broker/lifecycle-ledger.ts +583 -0
  230. package/src/sdk/broker/lifecycle.ts +3413 -0
  231. package/src/sdk/broker/process-incarnation.ts +151 -0
  232. package/src/sdk/broker/runtime.ts +164 -0
  233. package/src/sdk/broker/session-index.ts +678 -0
  234. package/src/sdk/broker/state-version.ts +47 -0
  235. package/src/sdk/broker/transport.ts +125 -0
  236. package/src/sdk/bus/attachment-registry.ts +23 -0
  237. package/src/sdk/bus/chat-adapters.ts +147 -0
  238. package/src/sdk/bus/chat-command-policy.ts +107 -0
  239. package/src/sdk/bus/chat-daemon-cli.ts +278 -0
  240. package/src/sdk/bus/chat-daemon-control.ts +1101 -0
  241. package/src/sdk/bus/chat-daemon-runtime.ts +527 -0
  242. package/src/sdk/bus/chat-effect-journal.ts +363 -0
  243. package/src/sdk/bus/config-commands.ts +192 -0
  244. package/src/sdk/bus/config.ts +568 -0
  245. package/src/sdk/bus/conversation-store.ts +367 -0
  246. package/src/sdk/bus/daemon-paths.ts +34 -0
  247. package/src/sdk/bus/discord-conversation.ts +85 -0
  248. package/src/sdk/bus/discord-daemon.ts +2292 -0
  249. package/src/sdk/bus/discord-live-provider.ts +521 -0
  250. package/src/sdk/bus/discord-provider.ts +56 -0
  251. package/src/sdk/bus/engine.ts +100 -0
  252. package/src/sdk/bus/helpers.ts +135 -0
  253. package/src/sdk/bus/html-format.ts +518 -0
  254. package/src/sdk/bus/index.ts +4961 -0
  255. package/src/sdk/bus/lifecycle-commands.ts +291 -0
  256. package/src/sdk/bus/lifecycle-control-runtime.ts +1409 -0
  257. package/src/sdk/bus/lifecycle-orchestrator.ts +458 -0
  258. package/src/sdk/bus/managed-daemon.ts +163 -0
  259. package/src/sdk/bus/native-runtime-compatibility.ts +42 -0
  260. package/src/sdk/bus/natives-augment.d.ts +63 -0
  261. package/src/sdk/bus/notification-orchestration.ts +535 -0
  262. package/src/sdk/bus/notification-service.ts +1174 -0
  263. package/src/sdk/bus/operator-runtime.ts +171 -0
  264. package/src/sdk/bus/rate-limit-pool.ts +276 -0
  265. package/src/sdk/bus/recent-activity.ts +279 -0
  266. package/src/sdk/bus/reply-sent-store.ts +134 -0
  267. package/src/sdk/bus/rich-document.ts +258 -0
  268. package/src/sdk/bus/rich-draft.ts +107 -0
  269. package/src/sdk/bus/rich-render.ts +135 -0
  270. package/src/sdk/bus/session-control.ts +439 -0
  271. package/src/sdk/bus/slack-conversation.ts +74 -0
  272. package/src/sdk/bus/slack-daemon.ts +2144 -0
  273. package/src/sdk/bus/slack-live-provider.ts +380 -0
  274. package/src/sdk/bus/slack-provider.ts +76 -0
  275. package/src/sdk/bus/telegram-cli.ts +194 -0
  276. package/src/sdk/bus/telegram-daemon-cli.ts +292 -0
  277. package/src/sdk/bus/telegram-daemon-contract.ts +27 -0
  278. package/src/sdk/bus/telegram-daemon-control.ts +642 -0
  279. package/src/sdk/bus/telegram-daemon.ts +6675 -0
  280. package/src/sdk/bus/telegram-reference.ts +436 -0
  281. package/src/sdk/bus/telegram-setup.ts +663 -0
  282. package/src/sdk/bus/threaded-inbound.ts +141 -0
  283. package/src/sdk/bus/threaded-render.ts +294 -0
  284. package/src/sdk/bus/topic-registry.ts +364 -0
  285. package/src/sdk/cli/index.ts +1 -0
  286. package/src/sdk/cli/session-cli.ts +275 -0
  287. package/src/sdk/client/client.ts +1 -0
  288. package/src/sdk/client/discovery.ts +108 -0
  289. package/src/sdk/client/index.ts +2 -0
  290. package/src/sdk/host/control/dispatch.ts +388 -0
  291. package/src/sdk/host/control/index.ts +10 -0
  292. package/src/sdk/host/control/operations.ts +68 -0
  293. package/src/sdk/host/events.ts +91 -0
  294. package/src/sdk/host/host.ts +338 -0
  295. package/src/sdk/host/index.ts +4 -0
  296. package/src/sdk/host/query/cursor.ts +189 -0
  297. package/src/sdk/host/query/handlers.ts +531 -0
  298. package/src/sdk/host/query/index.ts +3 -0
  299. package/src/sdk/host/query/revision-store.ts +1149 -0
  300. package/src/sdk/host/reverse-leases.ts +325 -0
  301. package/src/sdk/host/types.ts +29 -0
  302. package/src/sdk/index.ts +14 -0
  303. package/src/sdk/lifecycle-session.ts +39 -0
  304. package/src/sdk/mcp/index.ts +1 -0
  305. package/src/sdk/mcp/server.ts +332 -0
  306. package/src/sdk/models.ts +168 -0
  307. package/src/sdk/protocol/adapter-validation.ts +48 -0
  308. package/src/sdk/protocol/operation-inventory.generated.json +4719 -0
  309. package/src/sdk/protocol/operation-registry.ts +312 -0
  310. package/src/sdk/session-directory.ts +141 -0
  311. package/src/sdk/session.ts +2869 -0
  312. package/src/sdk/startup-capability.ts +189 -0
  313. package/src/secrets/index.ts +53 -10
  314. package/src/secrets/obfuscator.ts +21 -18
  315. package/src/secrets/regex.ts +2 -0
  316. package/src/session/agent-session.ts +5602 -2138
  317. package/src/session/agent-storage.ts +18 -0
  318. package/src/session/artifacts.ts +188 -23
  319. package/src/session/cache-economics.ts +25 -8
  320. package/src/session/context-estimation.ts +7 -2
  321. package/src/session/default-model-selection.ts +93 -0
  322. package/src/session/fallback-chain-controller.ts +186 -0
  323. package/src/session/internal/managed-session-scope.ts +2402 -0
  324. package/src/session/internal/managed-session-storage.ts +1559 -0
  325. package/src/session/messages.ts +91 -2
  326. package/src/session/session-manager-internal.ts +33 -0
  327. package/src/session/session-manager.ts +2578 -392
  328. package/src/session/session-storage.ts +550 -40
  329. package/src/session/streaming-output.ts +6 -0
  330. package/src/session/volatile-context-pruning.ts +78 -0
  331. package/src/session/yield-queue.ts +20 -0
  332. package/src/setup/credential-auto-import.ts +291 -35
  333. package/src/setup/hermes/templates/operator-instructions.v1.md +4 -6
  334. package/src/setup/provider-onboarding.ts +36 -61
  335. package/src/setup/provider-presets.json +5 -0
  336. package/src/skc-runtime/deep-interview-recorder.ts +70 -3
  337. package/src/skc-runtime/deep-interview-state.ts +441 -5
  338. package/src/skc-runtime/gc-render.ts +19 -1
  339. package/src/skc-runtime/gc-runtime.ts +68 -3
  340. package/src/skc-runtime/goal-mode-request.ts +55 -8
  341. package/src/skc-runtime/launch-worktree.ts +5 -5
  342. package/src/skc-runtime/linux-proc.ts +71 -0
  343. package/src/skc-runtime/managed-owner-admission.ts +352 -0
  344. package/src/skc-runtime/managed-owner-supervisor.ts +162 -0
  345. package/src/skc-runtime/psmux-detect.ts +82 -4
  346. package/src/skc-runtime/ralplan-runtime.ts +74 -90
  347. package/src/skc-runtime/session-resolution.ts +18 -3
  348. package/src/skc-runtime/session-state-sidecar.ts +47 -138
  349. package/src/skc-runtime/state-argv.ts +292 -0
  350. package/src/skc-runtime/state-migrations.ts +1 -1
  351. package/src/skc-runtime/state-runtime.ts +387 -451
  352. package/src/skc-runtime/state-writer.ts +36 -40
  353. package/src/skc-runtime/team-launch.ts +319 -0
  354. package/src/skc-runtime/team-notify.ts +326 -0
  355. package/src/skc-runtime/team-runtime.ts +8 -2
  356. package/src/skc-runtime/team-store.ts +828 -0
  357. package/src/skc-runtime/team-workers.ts +962 -0
  358. package/src/skc-runtime/tmux-owner-isolation-cli.ts +55 -28
  359. package/src/skc-runtime/tmux-owner-isolation.ts +136 -11
  360. package/src/skc-runtime/tmux-sessions.ts +23 -34
  361. package/src/skc-runtime/ultragoal-change-set.ts +172 -0
  362. package/src/skc-runtime/ultragoal-evidence.ts +874 -0
  363. package/src/skc-runtime/ultragoal-guard.ts +136 -18
  364. package/src/skc-runtime/ultragoal-owner-loss-recovery.ts +328 -0
  365. package/src/skc-runtime/ultragoal-pipeline.ts +306 -0
  366. package/src/skc-runtime/ultragoal-receipt-freshness.ts +102 -1
  367. package/src/skc-runtime/ultragoal-runtime.ts +325 -1322
  368. package/src/skc-runtime/windows-powershell-command.ts +58 -0
  369. package/src/skc-runtime/workflow-cli-common.ts +30 -0
  370. package/src/skc-runtime/workflow-manifest.generated.json +58 -0
  371. package/src/skc-runtime/workflow-manifest.ts +18 -0
  372. package/src/skill-state/active-state.ts +3 -13
  373. package/src/skill-state/workflow-mutation-guard.ts +661 -0
  374. package/src/skill-state/workflow-state-contract.ts +6 -41
  375. package/src/slash-commands/builtin-registry.ts +115 -41
  376. package/src/system-prompt.ts +37 -44
  377. package/src/task/agents.ts +19 -1
  378. package/src/task/executor.ts +223 -45
  379. package/src/task/index.ts +124 -56
  380. package/src/thinking.ts +21 -6
  381. package/src/tool-discovery/tool-index.ts +20 -134
  382. package/src/tools/ask-answer-registry.ts +16 -2
  383. package/src/tools/ast-edit.ts +1 -1
  384. package/src/tools/bash-allowed-prefixes.ts +79 -29
  385. package/src/tools/bash-skill-urls.ts +14 -3
  386. package/src/tools/bash.ts +40 -2
  387. package/src/tools/browser/STEALTH-THIRD-PARTY-NOTICES.md +26 -0
  388. package/src/tools/browser/benchmark/detector-report.ts +157 -0
  389. package/src/tools/browser/benchmark/run-suite.ts +39 -0
  390. package/src/tools/browser/dead-tab-recovery.ts +78 -0
  391. package/src/tools/browser/launch.ts +127 -20
  392. package/src/tools/browser/profile-discovery.ts +63 -0
  393. package/src/tools/browser/profile-posture.ts +59 -0
  394. package/src/tools/browser/profile-reuse.ts +102 -0
  395. package/src/tools/browser/profile-warmup.ts +109 -0
  396. package/src/tools/browser/readable.ts +1 -1
  397. package/src/tools/browser/registry.ts +87 -11
  398. package/src/tools/browser/screenshot-format.ts +34 -0
  399. package/src/tools/browser/tab-protocol.ts +4 -0
  400. package/src/tools/browser/tab-supervisor.ts +392 -142
  401. package/src/tools/browser/tab-worker-entry.ts +33 -14
  402. package/src/tools/browser/tab-worker-path-resolver.ts +67 -0
  403. package/src/tools/browser/tab-worker-smoke.ts +87 -0
  404. package/src/tools/browser/tab-worker.ts +8 -6
  405. package/src/tools/browser.ts +6 -0
  406. package/src/tools/computer.ts +10 -3
  407. package/src/tools/cron.ts +30 -16
  408. package/src/tools/fetch.ts +11 -4
  409. package/src/tools/index.ts +88 -32
  410. package/src/tools/output-meta.ts +19 -7
  411. package/src/tools/path-utils.ts +42 -35
  412. package/src/tools/plan-mode-guard.ts +1 -0
  413. package/src/tools/puppeteer/14_stealth_permissions.txt +57 -0
  414. package/src/tools/puppeteer/15_stealth_webrtc.txt +60 -0
  415. package/src/tools/read.ts +226 -65
  416. package/src/tools/resource-gc.ts +125 -36
  417. package/src/tools/search-tool-bm25.ts +11 -74
  418. package/src/tools/sqlite-reader.ts +3 -2
  419. package/src/tools/subagent-render.ts +19 -8
  420. package/src/tools/subagent.ts +129 -34
  421. package/src/tools/telegram-send.ts +2 -2
  422. package/src/utils/event-bus.ts +9 -4
  423. package/src/utils/file-mentions.ts +4 -4
  424. package/src/utils/image-loading.ts +85 -34
  425. package/src/utils/image-resize.ts +16 -9
  426. package/src/utils/pasted-image-loading.ts +514 -0
  427. package/src/utils/pasted-image-path.ts +223 -98
  428. package/src/web/scrapers/html-to-markdown.ts +68 -0
  429. package/src/web/scrapers/readthedocs.ts +1 -1
  430. package/src/web/scrapers/types.ts +1 -68
  431. package/src/web/search/index.ts +3 -3
  432. package/src/web/search/providers/openai-compatible.ts +76 -23
  433. package/dist/types/append-only-mode.d.ts +0 -31
  434. package/dist/types/async/index.d.ts +0 -2
  435. package/dist/types/async/job-manager.d.ts +0 -328
  436. package/dist/types/async/support.d.ts +0 -2
  437. package/dist/types/autoresearch/dashboard.d.ts +0 -4
  438. package/dist/types/autoresearch/git.d.ts +0 -36
  439. package/dist/types/autoresearch/helpers.d.ts +0 -24
  440. package/dist/types/autoresearch/index.d.ts +0 -2
  441. package/dist/types/autoresearch/state.d.ts +0 -17
  442. package/dist/types/autoresearch/storage.d.ts +0 -142
  443. package/dist/types/autoresearch/tools/init-experiment.d.ts +0 -31
  444. package/dist/types/autoresearch/tools/log-experiment.d.ts +0 -23
  445. package/dist/types/autoresearch/tools/run-experiment.d.ts +0 -8
  446. package/dist/types/autoresearch/tools/update-notes.d.ts +0 -12
  447. package/dist/types/autoresearch/types.d.ts +0 -154
  448. package/dist/types/build-metadata.d.ts +0 -7
  449. package/dist/types/capability/context-file.d.ts +0 -17
  450. package/dist/types/capability/extension-module.d.ts +0 -15
  451. package/dist/types/capability/extension.d.ts +0 -28
  452. package/dist/types/capability/fs.d.ts +0 -20
  453. package/dist/types/capability/hook.d.ts +0 -19
  454. package/dist/types/capability/index.d.ts +0 -80
  455. package/dist/types/capability/instruction.d.ts +0 -17
  456. package/dist/types/capability/mcp.d.ts +0 -49
  457. package/dist/types/capability/prompt.d.ts +0 -15
  458. package/dist/types/capability/rule.d.ts +0 -69
  459. package/dist/types/capability/settings.d.ts +0 -15
  460. package/dist/types/capability/skill.d.ts +0 -36
  461. package/dist/types/capability/slash-command.d.ts +0 -17
  462. package/dist/types/capability/ssh.d.ts +0 -23
  463. package/dist/types/capability/system-prompt.d.ts +0 -15
  464. package/dist/types/capability/tool.d.ts +0 -19
  465. package/dist/types/capability/types.d.ts +0 -154
  466. package/dist/types/cli/agents-cli.d.ts +0 -12
  467. package/dist/types/cli/args.d.ts +0 -57
  468. package/dist/types/cli/auth-broker-cli.d.ts +0 -25
  469. package/dist/types/cli/auth-gateway-cli.d.ts +0 -18
  470. package/dist/types/cli/classify-install-target.d.ts +0 -8
  471. package/dist/types/cli/commands/init-xdg.d.ts +0 -1
  472. package/dist/types/cli/completion-cli.d.ts +0 -41
  473. package/dist/types/cli/config-cli.d.ts +0 -23
  474. package/dist/types/cli/daemon-cli.d.ts +0 -27
  475. package/dist/types/cli/fast-help.d.ts +0 -1
  476. package/dist/types/cli/file-processor.d.ts +0 -11
  477. package/dist/types/cli/fixture-report.d.ts +0 -20
  478. package/dist/types/cli/fixture-report.test.d.ts +0 -1
  479. package/dist/types/cli/grep-cli.d.ts +0 -17
  480. package/dist/types/cli/initial-message.d.ts +0 -17
  481. package/dist/types/cli/list-models.d.ts +0 -36
  482. package/dist/types/cli/local-provider-smoke.d.ts +0 -59
  483. package/dist/types/cli/malloc-env-guard.d.ts +0 -65
  484. package/dist/types/cli/malloc-env-guard.test.d.ts +0 -1
  485. package/dist/types/cli/mcp-cli.d.ts +0 -25
  486. package/dist/types/cli/migrate-cli.d.ts +0 -20
  487. package/dist/types/cli/nofile-limit.d.ts +0 -11
  488. package/dist/types/cli/notify-cli.d.ts +0 -39
  489. package/dist/types/cli/plugin-cli.d.ts +0 -34
  490. package/dist/types/cli/read-cli.d.ts +0 -4
  491. package/dist/types/cli/session-picker.d.ts +0 -4
  492. package/dist/types/cli/setup-cli.d.ts +0 -73
  493. package/dist/types/cli/shell-cli.d.ts +0 -8
  494. package/dist/types/cli/skills-cli.d.ts +0 -9
  495. package/dist/types/cli/ssh-cli.d.ts +0 -21
  496. package/dist/types/cli/stats-cli.d.ts +0 -17
  497. package/dist/types/cli/telegram-cli.d.ts +0 -13
  498. package/dist/types/cli/update-cli.d.ts +0 -108
  499. package/dist/types/cli/web-search-cli.d.ts +0 -32
  500. package/dist/types/cli/worktree-cli.d.ts +0 -26
  501. package/dist/types/cli.d.ts +0 -140
  502. package/dist/types/commands/acp.d.ts +0 -12
  503. package/dist/types/commands/agents.d.ts +0 -34
  504. package/dist/types/commands/auth-broker.d.ts +0 -54
  505. package/dist/types/commands/auth-gateway.d.ts +0 -32
  506. package/dist/types/commands/codex-native-hook.d.ts +0 -6
  507. package/dist/types/commands/commit.d.ts +0 -27
  508. package/dist/types/commands/completion.d.ts +0 -29
  509. package/dist/types/commands/config.d.ts +0 -33
  510. package/dist/types/commands/contribution-prep.d.ts +0 -18
  511. package/dist/types/commands/coordinator.d.ts +0 -19
  512. package/dist/types/commands/daemon.d.ts +0 -45
  513. package/dist/types/commands/deep-interview.d.ts +0 -54
  514. package/dist/types/commands/gc.d.ts +0 -26
  515. package/dist/types/commands/grep.d.ts +0 -42
  516. package/dist/types/commands/harness.d.ts +0 -43
  517. package/dist/types/commands/launch.d.ts +0 -131
  518. package/dist/types/commands/local-provider.d.ts +0 -34
  519. package/dist/types/commands/mcp-serve.d.ts +0 -24
  520. package/dist/types/commands/mcp.d.ts +0 -70
  521. package/dist/types/commands/migrate.d.ts +0 -33
  522. package/dist/types/commands/notify.d.ts +0 -47
  523. package/dist/types/commands/plugin.d.ts +0 -58
  524. package/dist/types/commands/ralplan.d.ts +0 -7
  525. package/dist/types/commands/read.d.ts +0 -15
  526. package/dist/types/commands/rlm.d.ts +0 -10
  527. package/dist/types/commands/session.d.ts +0 -30
  528. package/dist/types/commands/setup.d.ts +0 -105
  529. package/dist/types/commands/shell.d.ts +0 -21
  530. package/dist/types/commands/skills.d.ts +0 -26
  531. package/dist/types/commands/ssh.d.ts +0 -48
  532. package/dist/types/commands/state.d.ts +0 -7
  533. package/dist/types/commands/stats.d.ts +0 -25
  534. package/dist/types/commands/team.d.ts +0 -24
  535. package/dist/types/commands/telegram.d.ts +0 -22
  536. package/dist/types/commands/ultragoal.d.ts +0 -8
  537. package/dist/types/commands/update.d.ts +0 -20
  538. package/dist/types/commands/web-search.d.ts +0 -87
  539. package/dist/types/commands/worktree.d.ts +0 -34
  540. package/dist/types/commit/agentic/agent.d.ts +0 -31
  541. package/dist/types/commit/agentic/fallback.d.ts +0 -5
  542. package/dist/types/commit/agentic/index.d.ts +0 -2
  543. package/dist/types/commit/agentic/state.d.ts +0 -58
  544. package/dist/types/commit/agentic/tools/analyze-file.d.ts +0 -19
  545. package/dist/types/commit/agentic/tools/git-file-diff.d.ts +0 -10
  546. package/dist/types/commit/agentic/tools/git-hunk.d.ts +0 -9
  547. package/dist/types/commit/agentic/tools/git-overview.d.ts +0 -9
  548. package/dist/types/commit/agentic/tools/index.d.ts +0 -16
  549. package/dist/types/commit/agentic/tools/propose-changelog.d.ts +0 -28
  550. package/dist/types/commit/agentic/tools/propose-commit.d.ts +0 -36
  551. package/dist/types/commit/agentic/tools/recent-commits.d.ts +0 -7
  552. package/dist/types/commit/agentic/tools/schemas.d.ts +0 -27
  553. package/dist/types/commit/agentic/tools/split-commit.d.ts +0 -53
  554. package/dist/types/commit/agentic/topo-sort.d.ts +0 -4
  555. package/dist/types/commit/agentic/trivial.d.ts +0 -7
  556. package/dist/types/commit/agentic/validation.d.ts +0 -20
  557. package/dist/types/commit/analysis/conventional.d.ts +0 -22
  558. package/dist/types/commit/analysis/index.d.ts +0 -4
  559. package/dist/types/commit/analysis/scope.d.ts +0 -6
  560. package/dist/types/commit/analysis/summary.d.ts +0 -19
  561. package/dist/types/commit/analysis/validation.d.ts +0 -8
  562. package/dist/types/commit/changelog/detect.d.ts +0 -2
  563. package/dist/types/commit/changelog/generate.d.ts +0 -30
  564. package/dist/types/commit/changelog/index.d.ts +0 -30
  565. package/dist/types/commit/changelog/parse.d.ts +0 -2
  566. package/dist/types/commit/cli.d.ts +0 -3
  567. package/dist/types/commit/git/diff.d.ts +0 -5
  568. package/dist/types/commit/index.d.ts +0 -4
  569. package/dist/types/commit/map-reduce/index.d.ts +0 -28
  570. package/dist/types/commit/map-reduce/map-phase.d.ts +0 -17
  571. package/dist/types/commit/map-reduce/reduce-phase.d.ts +0 -13
  572. package/dist/types/commit/map-reduce/utils.d.ts +0 -2
  573. package/dist/types/commit/message.d.ts +0 -2
  574. package/dist/types/commit/model-selection.d.ts +0 -15
  575. package/dist/types/commit/pipeline.d.ts +0 -5
  576. package/dist/types/commit/shared-llm.d.ts +0 -54
  577. package/dist/types/commit/types.d.ts +0 -78
  578. package/dist/types/commit/utils/exclusions.d.ts +0 -4
  579. package/dist/types/commit/utils.d.ts +0 -20
  580. package/dist/types/config/config-file.d.ts +0 -58
  581. package/dist/types/config/file-lock-gc.d.ts +0 -5
  582. package/dist/types/config/file-lock.d.ts +0 -36
  583. package/dist/types/config/keybindings.d.ts +0 -364
  584. package/dist/types/config/model-equivalence.d.ts +0 -24
  585. package/dist/types/config/model-profile-activation.d.ts +0 -65
  586. package/dist/types/config/model-profiles.d.ts +0 -39
  587. package/dist/types/config/model-registry.d.ts +0 -473
  588. package/dist/types/config/model-resolver.d.ts +0 -217
  589. package/dist/types/config/models-config-schema.d.ts +0 -700
  590. package/dist/types/config/prompt-templates.d.ts +0 -32
  591. package/dist/types/config/resolve-config-value.d.ts +0 -17
  592. package/dist/types/config/settings-schema.d.ts +0 -4223
  593. package/dist/types/config/settings.d.ts +0 -158
  594. package/dist/types/config/skill-settings-defaults.d.ts +0 -14
  595. package/dist/types/config/telegram-autostart.d.ts +0 -14
  596. package/dist/types/config/telegram-env-bridge.d.ts +0 -18
  597. package/dist/types/config.d.ts +0 -66
  598. package/dist/types/coordinator/contract.d.ts +0 -4
  599. package/dist/types/coordinator-mcp/model-preset.d.ts +0 -45
  600. package/dist/types/coordinator-mcp/policy.d.ts +0 -27
  601. package/dist/types/coordinator-mcp/safety.d.ts +0 -26
  602. package/dist/types/coordinator-mcp/server.d.ts +0 -139
  603. package/dist/types/coordinator-mcp/session-reaper.d.ts +0 -53
  604. package/dist/types/cursor.d.ts +0 -24
  605. package/dist/types/daemon/builtin.d.ts +0 -20
  606. package/dist/types/daemon/control-types.d.ts +0 -67
  607. package/dist/types/daemon/operator-contract.d.ts +0 -47
  608. package/dist/types/daemon/runtime.d.ts +0 -25
  609. package/dist/types/dap/client.d.ts +0 -39
  610. package/dist/types/dap/config.d.ts +0 -6
  611. package/dist/types/dap/index.d.ts +0 -4
  612. package/dist/types/dap/session.d.ts +0 -108
  613. package/dist/types/dap/types.d.ts +0 -524
  614. package/dist/types/debug/crash-diagnostics.d.ts +0 -45
  615. package/dist/types/debug/index.d.ts +0 -15
  616. package/dist/types/debug/log-formatting.d.ts +0 -4
  617. package/dist/types/debug/log-viewer.d.ts +0 -68
  618. package/dist/types/debug/profiler.d.ts +0 -24
  619. package/dist/types/debug/raw-sse-buffer.d.ts +0 -44
  620. package/dist/types/debug/raw-sse.d.ts +0 -16
  621. package/dist/types/debug/report-bundle.d.ts +0 -55
  622. package/dist/types/debug/runtime-gauges.d.ts +0 -6
  623. package/dist/types/debug/system-info.d.ts +0 -26
  624. package/dist/types/deep-interview/plaintext-gate-guard.d.ts +0 -11
  625. package/dist/types/deep-interview/render-middleware.d.ts +0 -6
  626. package/dist/types/defaults/skc/extensions/grok-build/index.d.ts +0 -1
  627. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/index.d.ts +0 -1
  628. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/models/catalog.d.ts +0 -29
  629. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/payload/sanitize.d.ts +0 -27
  630. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/provider/billing.d.ts +0 -8
  631. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/provider/register.d.ts +0 -5
  632. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/provider/stream.d.ts +0 -10
  633. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/provider/usage.d.ts +0 -2
  634. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/shared/base-url.d.ts +0 -2
  635. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/shared/errors.d.ts +0 -38
  636. package/dist/types/defaults/skc-defaults.d.ts +0 -64
  637. package/dist/types/defaults/skc-grok-cli.d.ts +0 -5
  638. package/dist/types/discovery/agents-md.d.ts +0 -1
  639. package/dist/types/discovery/agents.d.ts +0 -12
  640. package/dist/types/discovery/builtin.d.ts +0 -1
  641. package/dist/types/discovery/claude-plugins.d.ts +0 -1
  642. package/dist/types/discovery/claude.d.ts +0 -1
  643. package/dist/types/discovery/cline.d.ts +0 -1
  644. package/dist/types/discovery/codex.d.ts +0 -1
  645. package/dist/types/discovery/cursor.d.ts +0 -19
  646. package/dist/types/discovery/gemini.d.ts +0 -1
  647. package/dist/types/discovery/github.d.ts +0 -1
  648. package/dist/types/discovery/helpers.d.ts +0 -271
  649. package/dist/types/discovery/index.d.ts +0 -48
  650. package/dist/types/discovery/mcp-json.d.ts +0 -1
  651. package/dist/types/discovery/opencode.d.ts +0 -1
  652. package/dist/types/discovery/plugin-dir-roots.d.ts +0 -15
  653. package/dist/types/discovery/ssh.d.ts +0 -1
  654. package/dist/types/discovery/substitute-plugin-root.d.ts +0 -1
  655. package/dist/types/discovery/vscode.d.ts +0 -1
  656. package/dist/types/discovery/windsurf.d.ts +0 -15
  657. package/dist/types/edit/apply-patch/index.d.ts +0 -35
  658. package/dist/types/edit/apply-patch/parser.d.ts +0 -34
  659. package/dist/types/edit/diff.d.ts +0 -75
  660. package/dist/types/edit/file-read-cache.d.ts +0 -25
  661. package/dist/types/edit/index.d.ts +0 -58
  662. package/dist/types/edit/modes/apply-patch.d.ts +0 -24
  663. package/dist/types/edit/modes/patch.d.ts +0 -99
  664. package/dist/types/edit/modes/replace.d.ts +0 -149
  665. package/dist/types/edit/normalize.d.ts +0 -43
  666. package/dist/types/edit/notebook.d.ts +0 -26
  667. package/dist/types/edit/read-file.d.ts +0 -8
  668. package/dist/types/edit/renderer.d.ts +0 -110
  669. package/dist/types/edit/streaming.d.ts +0 -66
  670. package/dist/types/eval/backend.d.ts +0 -40
  671. package/dist/types/eval/index.d.ts +0 -4
  672. package/dist/types/eval/js/context-manager.d.ts +0 -27
  673. package/dist/types/eval/js/executor.d.ts +0 -29
  674. package/dist/types/eval/js/index.d.ts +0 -10
  675. package/dist/types/eval/js/shared/helpers.d.ts +0 -38
  676. package/dist/types/eval/js/shared/indirect-eval.d.ts +0 -14
  677. package/dist/types/eval/js/shared/prelude.d.ts +0 -1
  678. package/dist/types/eval/js/shared/rewrite-imports.d.ts +0 -6
  679. package/dist/types/eval/js/shared/runtime.d.ts +0 -47
  680. package/dist/types/eval/js/shared/types.d.ts +0 -24
  681. package/dist/types/eval/js/tool-bridge.d.ts +0 -18
  682. package/dist/types/eval/js/worker-core.d.ts +0 -5
  683. package/dist/types/eval/js/worker-entry.d.ts +0 -1
  684. package/dist/types/eval/js/worker-protocol.d.ts +0 -77
  685. package/dist/types/eval/py/display.d.ts +0 -25
  686. package/dist/types/eval/py/executor.d.ts +0 -88
  687. package/dist/types/eval/py/index.d.ts +0 -10
  688. package/dist/types/eval/py/kernel.d.ts +0 -65
  689. package/dist/types/eval/py/prelude.d.ts +0 -1
  690. package/dist/types/eval/py/runtime.d.ts +0 -29
  691. package/dist/types/eval/py/tool-bridge.d.ts +0 -20
  692. package/dist/types/eval/types.d.ts +0 -52
  693. package/dist/types/exa/factory.d.ts +0 -13
  694. package/dist/types/exa/index.d.ts +0 -20
  695. package/dist/types/exa/mcp-client.d.ts +0 -45
  696. package/dist/types/exa/render.d.ts +0 -19
  697. package/dist/types/exa/researcher.d.ts +0 -9
  698. package/dist/types/exa/search.d.ts +0 -9
  699. package/dist/types/exa/types.d.ts +0 -155
  700. package/dist/types/exa/websets.d.ts +0 -9
  701. package/dist/types/exec/bash-executor.d.ts +0 -64
  702. package/dist/types/exec/exec.d.ts +0 -25
  703. package/dist/types/exec/idle-timeout-watchdog.d.ts +0 -18
  704. package/dist/types/exec/non-interactive-env.d.ts +0 -1
  705. package/dist/types/export/custom-share.d.ts +0 -20
  706. package/dist/types/export/html/index.d.ts +0 -10
  707. package/dist/types/export/html/template.generated.d.ts +0 -1
  708. package/dist/types/export/html/template.macro.d.ts +0 -5
  709. package/dist/types/export/ttsr.d.ts +0 -55
  710. package/dist/types/extensibility/custom-commands/bundled/ci-green/index.d.ts +0 -9
  711. package/dist/types/extensibility/custom-commands/index.d.ts +0 -2
  712. package/dist/types/extensibility/custom-commands/loader.d.ts +0 -29
  713. package/dist/types/extensibility/custom-commands/types.d.ts +0 -106
  714. package/dist/types/extensibility/custom-tools/index.d.ts +0 -6
  715. package/dist/types/extensibility/custom-tools/loader.d.ts +0 -69
  716. package/dist/types/extensibility/custom-tools/types.d.ts +0 -229
  717. package/dist/types/extensibility/custom-tools/wrapper.d.ts +0 -24
  718. package/dist/types/extensibility/extensions/compact-handler.d.ts +0 -26
  719. package/dist/types/extensibility/extensions/get-commands-handler.d.ts +0 -29
  720. package/dist/types/extensibility/extensions/index.d.ts +0 -9
  721. package/dist/types/extensibility/extensions/loader.d.ts +0 -43
  722. package/dist/types/extensibility/extensions/prefix-command-bridge.d.ts +0 -35
  723. package/dist/types/extensibility/extensions/runner.d.ts +0 -135
  724. package/dist/types/extensibility/extensions/types.d.ts +0 -920
  725. package/dist/types/extensibility/extensions/wrapper.d.ts +0 -55
  726. package/dist/types/extensibility/hooks/index.d.ts +0 -5
  727. package/dist/types/extensibility/hooks/loader.d.ts +0 -89
  728. package/dist/types/extensibility/hooks/runner.d.ts +0 -126
  729. package/dist/types/extensibility/hooks/tool-wrapper.d.ts +0 -25
  730. package/dist/types/extensibility/hooks/types.d.ts +0 -431
  731. package/dist/types/extensibility/plugins/doctor.d.ts +0 -3
  732. package/dist/types/extensibility/plugins/git-url.d.ts +0 -34
  733. package/dist/types/extensibility/plugins/index.d.ts +0 -8
  734. package/dist/types/extensibility/plugins/installer.d.ts +0 -5
  735. package/dist/types/extensibility/plugins/legacy-pi-compat.d.ts +0 -2
  736. package/dist/types/extensibility/plugins/loader.d.ts +0 -31
  737. package/dist/types/extensibility/plugins/manager.d.ts +0 -65
  738. package/dist/types/extensibility/plugins/marketplace/cache.d.ts +0 -41
  739. package/dist/types/extensibility/plugins/marketplace/fetcher.d.ts +0 -48
  740. package/dist/types/extensibility/plugins/marketplace/index.d.ts +0 -6
  741. package/dist/types/extensibility/plugins/marketplace/manager.d.ts +0 -57
  742. package/dist/types/extensibility/plugins/marketplace/registry.d.ts +0 -34
  743. package/dist/types/extensibility/plugins/marketplace/source-resolver.d.ts +0 -28
  744. package/dist/types/extensibility/plugins/marketplace/types.d.ts +0 -130
  745. package/dist/types/extensibility/plugins/parser.d.ts +0 -52
  746. package/dist/types/extensibility/plugins/security-scanner.d.ts +0 -31
  747. package/dist/types/extensibility/plugins/types.d.ts +0 -149
  748. package/dist/types/extensibility/runtime-skill-discovery.d.ts +0 -20
  749. package/dist/types/extensibility/shared-events.d.ts +0 -281
  750. package/dist/types/extensibility/skc-plugins/activation.d.ts +0 -14
  751. package/dist/types/extensibility/skc-plugins/compiler.d.ts +0 -19
  752. package/dist/types/extensibility/skc-plugins/constrained-hooks.d.ts +0 -29
  753. package/dist/types/extensibility/skc-plugins/index.d.ts +0 -18
  754. package/dist/types/extensibility/skc-plugins/injection.d.ts +0 -40
  755. package/dist/types/extensibility/skc-plugins/installer.d.ts +0 -13
  756. package/dist/types/extensibility/skc-plugins/loader.d.ts +0 -3
  757. package/dist/types/extensibility/skc-plugins/mcp-policy.d.ts +0 -26
  758. package/dist/types/extensibility/skc-plugins/observability.d.ts +0 -27
  759. package/dist/types/extensibility/skc-plugins/paths.d.ts +0 -8
  760. package/dist/types/extensibility/skc-plugins/prompt-appendix.d.ts +0 -16
  761. package/dist/types/extensibility/skc-plugins/registry.d.ts +0 -32
  762. package/dist/types/extensibility/skc-plugins/runtime-adapters.d.ts +0 -64
  763. package/dist/types/extensibility/skc-plugins/schema.d.ts +0 -3
  764. package/dist/types/extensibility/skc-plugins/session-validation.d.ts +0 -42
  765. package/dist/types/extensibility/skc-plugins/state.d.ts +0 -9
  766. package/dist/types/extensibility/skc-plugins/tools.d.ts +0 -8
  767. package/dist/types/extensibility/skc-plugins/types.d.ts +0 -220
  768. package/dist/types/extensibility/skc-plugins/validation.d.ts +0 -11
  769. package/dist/types/extensibility/skills.d.ts +0 -82
  770. package/dist/types/extensibility/slash-commands.d.ts +0 -48
  771. package/dist/types/extensibility/tool-proxy.d.ts +0 -4
  772. package/dist/types/extensibility/typebox.d.ts +0 -155
  773. package/dist/types/extensibility/utils.d.ts +0 -12
  774. package/dist/types/goals/index.d.ts +0 -3
  775. package/dist/types/goals/runtime.d.ts +0 -63
  776. package/dist/types/goals/state.d.ts +0 -32
  777. package/dist/types/goals/tools/goal-tool.d.ts +0 -62
  778. package/dist/types/harness-control-plane/classifier.d.ts +0 -13
  779. package/dist/types/harness-control-plane/control-endpoint.d.ts +0 -31
  780. package/dist/types/harness-control-plane/finalize.d.ts +0 -60
  781. package/dist/types/harness-control-plane/gc-adapter.d.ts +0 -3
  782. package/dist/types/harness-control-plane/operate.d.ts +0 -35
  783. package/dist/types/harness-control-plane/owner.d.ts +0 -53
  784. package/dist/types/harness-control-plane/phase-rollup.d.ts +0 -23
  785. package/dist/types/harness-control-plane/preserve.d.ts +0 -19
  786. package/dist/types/harness-control-plane/receipt-ingest.d.ts +0 -19
  787. package/dist/types/harness-control-plane/receipt-spool.d.ts +0 -19
  788. package/dist/types/harness-control-plane/receipts.d.ts +0 -149
  789. package/dist/types/harness-control-plane/rpc-adapter.d.ts +0 -69
  790. package/dist/types/harness-control-plane/seams.d.ts +0 -21
  791. package/dist/types/harness-control-plane/session-lease.d.ts +0 -65
  792. package/dist/types/harness-control-plane/state-machine.d.ts +0 -24
  793. package/dist/types/harness-control-plane/storage.d.ts +0 -81
  794. package/dist/types/harness-control-plane/types.d.ts +0 -187
  795. package/dist/types/hashline/anchors.d.ts +0 -20
  796. package/dist/types/hashline/apply.d.ts +0 -14
  797. package/dist/types/hashline/constants.d.ts +0 -19
  798. package/dist/types/hashline/diff-preview.d.ts +0 -2
  799. package/dist/types/hashline/diff.d.ts +0 -17
  800. package/dist/types/hashline/execute.d.ts +0 -4
  801. package/dist/types/hashline/hash.d.ts +0 -123
  802. package/dist/types/hashline/index.d.ts +0 -13
  803. package/dist/types/hashline/input.d.ts +0 -11
  804. package/dist/types/hashline/parser.d.ts +0 -7
  805. package/dist/types/hashline/prefixes.d.ts +0 -7
  806. package/dist/types/hashline/recovery.d.ts +0 -27
  807. package/dist/types/hashline/stream.d.ts +0 -2
  808. package/dist/types/hashline/types.d.ts +0 -77
  809. package/dist/types/hindsight/backend.d.ts +0 -13
  810. package/dist/types/hindsight/bank.d.ts +0 -54
  811. package/dist/types/hindsight/client.d.ts +0 -224
  812. package/dist/types/hindsight/config.d.ts +0 -51
  813. package/dist/types/hindsight/content.d.ts +0 -70
  814. package/dist/types/hindsight/index.d.ts +0 -8
  815. package/dist/types/hindsight/mental-models.d.ts +0 -125
  816. package/dist/types/hindsight/state.d.ts +0 -99
  817. package/dist/types/hindsight/transcript.d.ts +0 -28
  818. package/dist/types/hooks/codex-native-hooks-config.d.ts +0 -29
  819. package/dist/types/hooks/native-skill-hook.d.ts +0 -28
  820. package/dist/types/hooks/skill-keywords.d.ts +0 -18
  821. package/dist/types/hooks/skill-state.d.ts +0 -93
  822. package/dist/types/i18n/index.d.ts +0 -38
  823. package/dist/types/i18n/messages/de.d.ts +0 -2
  824. package/dist/types/i18n/messages/de.messages.d.ts +0 -1
  825. package/dist/types/i18n/messages/de.settings.d.ts +0 -1
  826. package/dist/types/i18n/messages/en.d.ts +0 -81
  827. package/dist/types/i18n/messages/es.d.ts +0 -2
  828. package/dist/types/i18n/messages/es.messages.d.ts +0 -1
  829. package/dist/types/i18n/messages/es.settings.d.ts +0 -1
  830. package/dist/types/i18n/messages/fr.d.ts +0 -2
  831. package/dist/types/i18n/messages/fr.messages.d.ts +0 -1
  832. package/dist/types/i18n/messages/fr.settings.d.ts +0 -1
  833. package/dist/types/i18n/messages/ja.d.ts +0 -2
  834. package/dist/types/i18n/messages/ja.messages.d.ts +0 -1
  835. package/dist/types/i18n/messages/ja.settings.d.ts +0 -1
  836. package/dist/types/i18n/messages/ko.d.ts +0 -2
  837. package/dist/types/i18n/messages/ko.messages.d.ts +0 -1
  838. package/dist/types/i18n/messages/ko.settings.d.ts +0 -1
  839. package/dist/types/i18n/messages/zh.d.ts +0 -2
  840. package/dist/types/i18n/messages/zh.messages.d.ts +0 -1
  841. package/dist/types/i18n/messages/zh.settings.d.ts +0 -1
  842. package/dist/types/index.d.ts +0 -33
  843. package/dist/types/internal-urls/agent-protocol.d.ts +0 -12
  844. package/dist/types/internal-urls/artifact-protocol.d.ts +0 -6
  845. package/dist/types/internal-urls/docs-index.generated.d.ts +0 -2
  846. package/dist/types/internal-urls/index.d.ts +0 -20
  847. package/dist/types/internal-urls/issue-pr-protocol.d.ts +0 -17
  848. package/dist/types/internal-urls/json-query.d.ts +0 -30
  849. package/dist/types/internal-urls/local-protocol.d.ts +0 -43
  850. package/dist/types/internal-urls/mcp-protocol.d.ts +0 -12
  851. package/dist/types/internal-urls/memory-protocol.d.ts +0 -23
  852. package/dist/types/internal-urls/parse.d.ts +0 -19
  853. package/dist/types/internal-urls/registry-helpers.d.ts +0 -11
  854. package/dist/types/internal-urls/router.d.ts +0 -14
  855. package/dist/types/internal-urls/rule-protocol.d.ts +0 -6
  856. package/dist/types/internal-urls/skc-protocol.d.ts +0 -12
  857. package/dist/types/internal-urls/skill-protocol.d.ts +0 -13
  858. package/dist/types/internal-urls/types.d.ts +0 -109
  859. package/dist/types/lsp/client.d.ts +0 -66
  860. package/dist/types/lsp/clients/biome-client.d.ts +0 -16
  861. package/dist/types/lsp/clients/index.d.ts +0 -19
  862. package/dist/types/lsp/clients/lsp-linter-client.d.ts +0 -16
  863. package/dist/types/lsp/clients/swiftlint-client.d.ts +0 -20
  864. package/dist/types/lsp/config.d.ts +0 -65
  865. package/dist/types/lsp/edits.d.ts +0 -23
  866. package/dist/types/lsp/index.d.ts +0 -130
  867. package/dist/types/lsp/lspmux.d.ts +0 -58
  868. package/dist/types/lsp/render.d.ts +0 -32
  869. package/dist/types/lsp/startup-events.d.ts +0 -12
  870. package/dist/types/lsp/types.d.ts +0 -306
  871. package/dist/types/lsp/utils.d.ts +0 -108
  872. package/dist/types/main.d.ts +0 -139
  873. package/dist/types/memories/index.d.ts +0 -28
  874. package/dist/types/memories/storage.d.ts +0 -110
  875. package/dist/types/memory-backend/index.d.ts +0 -4
  876. package/dist/types/memory-backend/local-backend.d.ts +0 -9
  877. package/dist/types/memory-backend/off-backend.d.ts +0 -7
  878. package/dist/types/memory-backend/resolve.d.ts +0 -15
  879. package/dist/types/memory-backend/types.d.ts +0 -61
  880. package/dist/types/migrate/action-planner.d.ts +0 -11
  881. package/dist/types/migrate/adapters/claude-code.d.ts +0 -2
  882. package/dist/types/migrate/adapters/codex.d.ts +0 -5
  883. package/dist/types/migrate/adapters/index.d.ts +0 -45
  884. package/dist/types/migrate/adapters/opencode.d.ts +0 -2
  885. package/dist/types/migrate/executor.d.ts +0 -2
  886. package/dist/types/migrate/mcp-mapper.d.ts +0 -20
  887. package/dist/types/migrate/report.d.ts +0 -18
  888. package/dist/types/migrate/skill-normalizer.d.ts +0 -27
  889. package/dist/types/migrate/types.d.ts +0 -126
  890. package/dist/types/modes/acp/acp-agent.d.ts +0 -78
  891. package/dist/types/modes/acp/acp-client-bridge.d.ts +0 -9
  892. package/dist/types/modes/acp/acp-event-mapper.d.ts +0 -36
  893. package/dist/types/modes/acp/acp-mode.d.ts +0 -17
  894. package/dist/types/modes/acp/index.d.ts +0 -2
  895. package/dist/types/modes/acp/terminal-auth.d.ts +0 -6
  896. package/dist/types/modes/bridge/auth.d.ts +0 -12
  897. package/dist/types/modes/bridge/bridge-client-bridge.d.ts +0 -9
  898. package/dist/types/modes/bridge/bridge-mode.d.ts +0 -47
  899. package/dist/types/modes/bridge/bridge-ui-context.d.ts +0 -88
  900. package/dist/types/modes/bridge/event-stream.d.ts +0 -8
  901. package/dist/types/modes/components/agent-dashboard.d.ts +0 -21
  902. package/dist/types/modes/components/assistant-message.d.ts +0 -20
  903. package/dist/types/modes/components/bash-execution.d.ts +0 -29
  904. package/dist/types/modes/components/bordered-loader.d.ts +0 -11
  905. package/dist/types/modes/components/branch-summary-message.d.ts +0 -13
  906. package/dist/types/modes/components/btw-panel.d.ts +0 -16
  907. package/dist/types/modes/components/compaction-summary-message.d.ts +0 -13
  908. package/dist/types/modes/components/countdown-timer.d.ts +0 -14
  909. package/dist/types/modes/components/custom-editor.d.ts +0 -69
  910. package/dist/types/modes/components/custom-message.d.ts +0 -15
  911. package/dist/types/modes/components/custom-model-preset-wizard.d.ts +0 -12
  912. package/dist/types/modes/components/custom-provider-wizard.d.ts +0 -10
  913. package/dist/types/modes/components/diff.d.ts +0 -11
  914. package/dist/types/modes/components/dynamic-border.d.ts +0 -14
  915. package/dist/types/modes/components/eval-execution.d.ts +0 -23
  916. package/dist/types/modes/components/execution-shared.d.ts +0 -46
  917. package/dist/types/modes/components/extensions/extension-dashboard.d.ts +0 -26
  918. package/dist/types/modes/components/extensions/extension-list.d.ts +0 -39
  919. package/dist/types/modes/components/extensions/index.d.ts +0 -8
  920. package/dist/types/modes/components/extensions/inspector-panel.d.ts +0 -8
  921. package/dist/types/modes/components/extensions/state-manager.d.ts +0 -50
  922. package/dist/types/modes/components/extensions/types.d.ts +0 -151
  923. package/dist/types/modes/components/footer.d.ts +0 -30
  924. package/dist/types/modes/components/history-search.d.ts +0 -7
  925. package/dist/types/modes/components/hook-editor.d.ts +0 -18
  926. package/dist/types/modes/components/hook-input.d.ts +0 -15
  927. package/dist/types/modes/components/hook-message.d.ts +0 -15
  928. package/dist/types/modes/components/hook-selector.d.ts +0 -59
  929. package/dist/types/modes/components/index.d.ts +0 -35
  930. package/dist/types/modes/components/irc-sidebar.d.ts +0 -32
  931. package/dist/types/modes/components/jobs-overlay-model.d.ts +0 -31
  932. package/dist/types/modes/components/jobs-overlay.d.ts +0 -30
  933. package/dist/types/modes/components/keybinding-hints.d.ts +0 -40
  934. package/dist/types/modes/components/login-dialog.d.ts +0 -32
  935. package/dist/types/modes/components/message-frame.d.ts +0 -42
  936. package/dist/types/modes/components/model-selector.d.ts +0 -60
  937. package/dist/types/modes/components/oauth-selector.d.ts +0 -17
  938. package/dist/types/modes/components/pet-selector.d.ts +0 -11
  939. package/dist/types/modes/components/plugin-selector.d.ts +0 -26
  940. package/dist/types/modes/components/plugin-settings.d.ts +0 -66
  941. package/dist/types/modes/components/provider-onboarding-selector.d.ts +0 -7
  942. package/dist/types/modes/components/queue-mode-selector.d.ts +0 -9
  943. package/dist/types/modes/components/queued-message-selector.d.ts +0 -12
  944. package/dist/types/modes/components/read-tool-group.d.ts +0 -30
  945. package/dist/types/modes/components/runtime-mcp-add-wizard.d.ts +0 -26
  946. package/dist/types/modes/components/sayknow-pet-widget.d.ts +0 -59
  947. package/dist/types/modes/components/session-observer-overlay.d.ts +0 -11
  948. package/dist/types/modes/components/session-selector.d.ts +0 -43
  949. package/dist/types/modes/components/settings-defs.d.ts +0 -50
  950. package/dist/types/modes/components/settings-selector.d.ts +0 -64
  951. package/dist/types/modes/components/show-images-selector.d.ts +0 -9
  952. package/dist/types/modes/components/skill-hud/render.d.ts +0 -2
  953. package/dist/types/modes/components/skill-message.d.ts +0 -10
  954. package/dist/types/modes/components/status-line/context-thresholds.d.ts +0 -4
  955. package/dist/types/modes/components/status-line/git-utils.d.ts +0 -28
  956. package/dist/types/modes/components/status-line/index.d.ts +0 -4
  957. package/dist/types/modes/components/status-line/presets.d.ts +0 -3
  958. package/dist/types/modes/components/status-line/segments.d.ts +0 -5
  959. package/dist/types/modes/components/status-line/separators.d.ts +0 -3
  960. package/dist/types/modes/components/status-line/token-rate.d.ts +0 -10
  961. package/dist/types/modes/components/status-line/types.d.ts +0 -83
  962. package/dist/types/modes/components/status-line.d.ts +0 -94
  963. package/dist/types/modes/components/theme-selector.d.ts +0 -10
  964. package/dist/types/modes/components/thinking-selector.d.ts +0 -15
  965. package/dist/types/modes/components/todo-reminder.d.ts +0 -13
  966. package/dist/types/modes/components/tool-execution.d.ts +0 -55
  967. package/dist/types/modes/components/tree-selector.d.ts +0 -31
  968. package/dist/types/modes/components/ttsr-notification.d.ts +0 -13
  969. package/dist/types/modes/components/two-column-body.d.ts +0 -9
  970. package/dist/types/modes/components/user-message-selector.d.ts +0 -28
  971. package/dist/types/modes/components/user-message.d.ts +0 -8
  972. package/dist/types/modes/components/visual-truncate.d.ts +0 -19
  973. package/dist/types/modes/components/welcome.d.ts +0 -46
  974. package/dist/types/modes/controllers/btw-controller.d.ts +0 -10
  975. package/dist/types/modes/controllers/command-controller-shared.d.ts +0 -47
  976. package/dist/types/modes/controllers/command-controller.d.ts +0 -40
  977. package/dist/types/modes/controllers/event-controller.d.ts +0 -21
  978. package/dist/types/modes/controllers/extension-ui-controller.d.ts +0 -80
  979. package/dist/types/modes/controllers/input-controller.d.ts +0 -42
  980. package/dist/types/modes/controllers/runtime-mcp-command-controller.d.ts +0 -10
  981. package/dist/types/modes/controllers/selector-controller.d.ts +0 -68
  982. package/dist/types/modes/controllers/ssh-command-controller.d.ts +0 -10
  983. package/dist/types/modes/controllers/todo-command-controller.d.ts +0 -7
  984. package/dist/types/modes/emoji-autocomplete.d.ts +0 -16
  985. package/dist/types/modes/index.d.ts +0 -10
  986. package/dist/types/modes/interactive-mode.d.ts +0 -297
  987. package/dist/types/modes/irc-observation-ledger.d.ts +0 -22
  988. package/dist/types/modes/jobs-observer.d.ts +0 -57
  989. package/dist/types/modes/oauth-manual-input.d.ts +0 -8
  990. package/dist/types/modes/print-mode.d.ts +0 -44
  991. package/dist/types/modes/prompt-action-autocomplete.d.ts +0 -50
  992. package/dist/types/modes/rpc/host-tools.d.ts +0 -1
  993. package/dist/types/modes/rpc/host-uris.d.ts +0 -1
  994. package/dist/types/modes/rpc/rpc-client.d.ts +0 -299
  995. package/dist/types/modes/rpc/rpc-mode.d.ts +0 -86
  996. package/dist/types/modes/rpc/rpc-socket-security.d.ts +0 -10
  997. package/dist/types/modes/rpc/rpc-types.d.ts +0 -810
  998. package/dist/types/modes/runtime-init.d.ts +0 -21
  999. package/dist/types/modes/session-observer-registry.d.ts +0 -26
  1000. package/dist/types/modes/shared/agent-wire/approval-gate.d.ts +0 -57
  1001. package/dist/types/modes/shared/agent-wire/command-contract.d.ts +0 -18
  1002. package/dist/types/modes/shared/agent-wire/command-dispatch.d.ts +0 -37
  1003. package/dist/types/modes/shared/agent-wire/command-validation.d.ts +0 -2
  1004. package/dist/types/modes/shared/agent-wire/deep-interview-gate.d.ts +0 -102
  1005. package/dist/types/modes/shared/agent-wire/event-contract.d.ts +0 -103
  1006. package/dist/types/modes/shared/agent-wire/event-envelope.d.ts +0 -60
  1007. package/dist/types/modes/shared/agent-wire/event-observation.d.ts +0 -37
  1008. package/dist/types/modes/shared/agent-wire/handshake.d.ts +0 -56
  1009. package/dist/types/modes/shared/agent-wire/host-tool-bridge.d.ts +0 -16
  1010. package/dist/types/modes/shared/agent-wire/host-uri-bridge.d.ts +0 -17
  1011. package/dist/types/modes/shared/agent-wire/protocol.d.ts +0 -25
  1012. package/dist/types/modes/shared/agent-wire/responses.d.ts +0 -4
  1013. package/dist/types/modes/shared/agent-wire/scopes.d.ts +0 -18
  1014. package/dist/types/modes/shared/agent-wire/session-registry.d.ts +0 -25
  1015. package/dist/types/modes/shared/agent-wire/ui-request-broker.d.ts +0 -42
  1016. package/dist/types/modes/shared/agent-wire/ui-result.d.ts +0 -27
  1017. package/dist/types/modes/shared/agent-wire/unattended-action-policy.d.ts +0 -29
  1018. package/dist/types/modes/shared/agent-wire/unattended-audit.d.ts +0 -68
  1019. package/dist/types/modes/shared/agent-wire/unattended-run-controller.d.ts +0 -166
  1020. package/dist/types/modes/shared/agent-wire/unattended-session.d.ts +0 -127
  1021. package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +0 -154
  1022. package/dist/types/modes/shared/agent-wire/workflow-gate-schema.d.ts +0 -39
  1023. package/dist/types/modes/shared.d.ts +0 -15
  1024. package/dist/types/modes/slash-command-visibility.d.ts +0 -1
  1025. package/dist/types/modes/theme/defaults/index.d.ts +0 -652
  1026. package/dist/types/modes/theme/mermaid-cache.d.ts +0 -9
  1027. package/dist/types/modes/theme/shimmer.d.ts +0 -38
  1028. package/dist/types/modes/theme/theme.d.ts +0 -275
  1029. package/dist/types/modes/tmux-scroll.d.ts +0 -18
  1030. package/dist/types/modes/types.d.ts +0 -318
  1031. package/dist/types/modes/utils/abort-message.d.ts +0 -4
  1032. package/dist/types/modes/utils/context-usage.d.ts +0 -36
  1033. package/dist/types/modes/utils/hotkeys-markdown.d.ts +0 -5
  1034. package/dist/types/modes/utils/injected-user-submission.d.ts +0 -52
  1035. package/dist/types/modes/utils/irc-message.d.ts +0 -38
  1036. package/dist/types/modes/utils/keybinding-matchers.d.ts +0 -10
  1037. package/dist/types/modes/utils/terminal-bell.d.ts +0 -3
  1038. package/dist/types/modes/utils/tools-markdown.d.ts +0 -5
  1039. package/dist/types/modes/utils/ui-helpers.d.ts +0 -75
  1040. package/dist/types/notifications/attachment-registry.d.ts +0 -17
  1041. package/dist/types/notifications/chat-adapters.d.ts +0 -9
  1042. package/dist/types/notifications/config-commands.d.ts +0 -64
  1043. package/dist/types/notifications/config.d.ts +0 -132
  1044. package/dist/types/notifications/daemon-paths.d.ts +0 -17
  1045. package/dist/types/notifications/engine.d.ts +0 -59
  1046. package/dist/types/notifications/helpers.d.ts +0 -55
  1047. package/dist/types/notifications/html-format.d.ts +0 -75
  1048. package/dist/types/notifications/index.d.ts +0 -219
  1049. package/dist/types/notifications/lifecycle-commands.d.ts +0 -69
  1050. package/dist/types/notifications/lifecycle-control-runtime.d.ts +0 -107
  1051. package/dist/types/notifications/lifecycle-orchestrator.d.ts +0 -144
  1052. package/dist/types/notifications/managed-daemon.d.ts +0 -48
  1053. package/dist/types/notifications/notification-service.d.ts +0 -144
  1054. package/dist/types/notifications/operator-runtime.d.ts +0 -52
  1055. package/dist/types/notifications/rate-limit-pool.d.ts +0 -113
  1056. package/dist/types/notifications/recent-activity.d.ts +0 -39
  1057. package/dist/types/notifications/reply-sent-store.d.ts +0 -53
  1058. package/dist/types/notifications/rich-draft.d.ts +0 -68
  1059. package/dist/types/notifications/rich-render.d.ts +0 -90
  1060. package/dist/types/notifications/telegram-cli.d.ts +0 -19
  1061. package/dist/types/notifications/telegram-daemon-cli.d.ts +0 -28
  1062. package/dist/types/notifications/telegram-daemon-control.d.ts +0 -70
  1063. package/dist/types/notifications/telegram-daemon.d.ts +0 -558
  1064. package/dist/types/notifications/telegram-reference.d.ts +0 -136
  1065. package/dist/types/notifications/threaded-inbound.d.ts +0 -77
  1066. package/dist/types/notifications/threaded-render.d.ts +0 -88
  1067. package/dist/types/notifications/topic-registry.d.ts +0 -89
  1068. package/dist/types/plan-mode/approved-plan.d.ts +0 -49
  1069. package/dist/types/plan-mode/state.d.ts +0 -6
  1070. package/dist/types/registry/agent-registry.d.ts +0 -64
  1071. package/dist/types/reminders/star-reminder.d.ts +0 -115
  1072. package/dist/types/research-plan/index.d.ts +0 -1
  1073. package/dist/types/research-plan/ledger.d.ts +0 -33
  1074. package/dist/types/rlm/artifacts.d.ts +0 -9
  1075. package/dist/types/rlm/complete-research-tool.d.ts +0 -35
  1076. package/dist/types/rlm/data-context.d.ts +0 -6
  1077. package/dist/types/rlm/index.d.ts +0 -47
  1078. package/dist/types/rlm/notebook.d.ts +0 -12
  1079. package/dist/types/rlm/preset.d.ts +0 -23
  1080. package/dist/types/rlm/python-tool.d.ts +0 -16
  1081. package/dist/types/rlm/report.d.ts +0 -14
  1082. package/dist/types/rlm/types.d.ts +0 -37
  1083. package/dist/types/runtime/process-lifecycle.d.ts +0 -108
  1084. package/dist/types/runtime-api-key.d.ts +0 -7
  1085. package/dist/types/runtime-credential-selector.d.ts +0 -7
  1086. package/dist/types/runtime-mcp/client.d.ts +0 -74
  1087. package/dist/types/runtime-mcp/config-writer.d.ts +0 -89
  1088. package/dist/types/runtime-mcp/config.d.ts +0 -77
  1089. package/dist/types/runtime-mcp/discoverable-tool-metadata.d.ts +0 -7
  1090. package/dist/types/runtime-mcp/index.d.ts +0 -18
  1091. package/dist/types/runtime-mcp/json-rpc.d.ts +0 -22
  1092. package/dist/types/runtime-mcp/loader.d.ts +0 -45
  1093. package/dist/types/runtime-mcp/manager.d.ts +0 -195
  1094. package/dist/types/runtime-mcp/oauth-discovery.d.ts +0 -40
  1095. package/dist/types/runtime-mcp/oauth-flow.d.ts +0 -59
  1096. package/dist/types/runtime-mcp/render.d.ts +0 -25
  1097. package/dist/types/runtime-mcp/smithery-auth.d.ts +0 -16
  1098. package/dist/types/runtime-mcp/smithery-connect.d.ts +0 -38
  1099. package/dist/types/runtime-mcp/smithery-registry.d.ts +0 -51
  1100. package/dist/types/runtime-mcp/tool-bridge.d.ts +0 -86
  1101. package/dist/types/runtime-mcp/tool-cache.d.ts +0 -8
  1102. package/dist/types/runtime-mcp/transports/http.d.ts +0 -36
  1103. package/dist/types/runtime-mcp/transports/index.d.ts +0 -5
  1104. package/dist/types/runtime-mcp/transports/stdio.d.ts +0 -29
  1105. package/dist/types/runtime-mcp/types.d.ts +0 -349
  1106. package/dist/types/sdk.d.ts +0 -256
  1107. package/dist/types/secrets/index.d.ts +0 -9
  1108. package/dist/types/secrets/obfuscator.d.ts +0 -23
  1109. package/dist/types/secrets/regex.d.ts +0 -2
  1110. package/dist/types/session/agent-session.d.ts +0 -1238
  1111. package/dist/types/session/agent-storage.d.ts +0 -101
  1112. package/dist/types/session/artifacts.d.ts +0 -64
  1113. package/dist/types/session/auth-broker-config.d.ts +0 -13
  1114. package/dist/types/session/auth-storage.d.ts +0 -6
  1115. package/dist/types/session/blob-store.d.ts +0 -160
  1116. package/dist/types/session/cache-economics.d.ts +0 -79
  1117. package/dist/types/session/client-bridge.d.ts +0 -88
  1118. package/dist/types/session/context-estimation.d.ts +0 -31
  1119. package/dist/types/session/contribution-prep.d.ts +0 -47
  1120. package/dist/types/session/file-mention-pruning.d.ts +0 -8
  1121. package/dist/types/session/history-storage.d.ts +0 -16
  1122. package/dist/types/session/messages.d.ts +0 -169
  1123. package/dist/types/session/provider-safety-stop.d.ts +0 -5
  1124. package/dist/types/session/session-dump-format.d.ts +0 -22
  1125. package/dist/types/session/session-manager.d.ts +0 -781
  1126. package/dist/types/session/session-storage.d.ts +0 -230
  1127. package/dist/types/session/streaming-output.d.ts +0 -209
  1128. package/dist/types/session/tool-choice-queue.d.ts +0 -84
  1129. package/dist/types/session/yield-queue.d.ts +0 -24
  1130. package/dist/types/setup/credential-auto-import.d.ts +0 -63
  1131. package/dist/types/setup/credential-import.d.ts +0 -82
  1132. package/dist/types/setup/hermes-setup.d.ts +0 -78
  1133. package/dist/types/setup/host-plugin-setup.d.ts +0 -39
  1134. package/dist/types/setup/model-onboarding-guidance.d.ts +0 -9
  1135. package/dist/types/setup/provider-onboarding.d.ts +0 -52
  1136. package/dist/types/skc-runtime/cli-write-receipt.d.ts +0 -24
  1137. package/dist/types/skc-runtime/deep-interview-ambiguity.d.ts +0 -39
  1138. package/dist/types/skc-runtime/deep-interview-recorder.d.ts +0 -114
  1139. package/dist/types/skc-runtime/deep-interview-runtime.d.ts +0 -36
  1140. package/dist/types/skc-runtime/deep-interview-state.d.ts +0 -127
  1141. package/dist/types/skc-runtime/gc-render.d.ts +0 -6
  1142. package/dist/types/skc-runtime/gc-runtime.d.ts +0 -134
  1143. package/dist/types/skc-runtime/goal-mode-request.d.ts +0 -53
  1144. package/dist/types/skc-runtime/launch-tmux.d.ts +0 -78
  1145. package/dist/types/skc-runtime/launch-worktree.d.ts +0 -46
  1146. package/dist/types/skc-runtime/ledger-event-renderer.d.ts +0 -68
  1147. package/dist/types/skc-runtime/psmux-detect.d.ts +0 -78
  1148. package/dist/types/skc-runtime/ralplan-runtime.d.ts +0 -26
  1149. package/dist/types/skc-runtime/restricted-role-agent-bash.d.ts +0 -3
  1150. package/dist/types/skc-runtime/session-layout.d.ts +0 -59
  1151. package/dist/types/skc-runtime/session-resolution.d.ts +0 -47
  1152. package/dist/types/skc-runtime/session-state-sidecar.d.ts +0 -70
  1153. package/dist/types/skc-runtime/state-graph.d.ts +0 -4
  1154. package/dist/types/skc-runtime/state-migrations.d.ts +0 -33
  1155. package/dist/types/skc-runtime/state-renderer.d.ts +0 -70
  1156. package/dist/types/skc-runtime/state-runtime.d.ts +0 -38
  1157. package/dist/types/skc-runtime/state-schema.d.ts +0 -319
  1158. package/dist/types/skc-runtime/state-validation.d.ts +0 -6
  1159. package/dist/types/skc-runtime/state-writer.d.ts +0 -244
  1160. package/dist/types/skc-runtime/team-gc.d.ts +0 -7
  1161. package/dist/types/skc-runtime/team-runtime.d.ts +0 -355
  1162. package/dist/types/skc-runtime/tmux-common.d.ts +0 -111
  1163. package/dist/types/skc-runtime/tmux-gc.d.ts +0 -7
  1164. package/dist/types/skc-runtime/tmux-owner-isolation-cli.d.ts +0 -5
  1165. package/dist/types/skc-runtime/tmux-owner-isolation.d.ts +0 -309
  1166. package/dist/types/skc-runtime/tmux-sessions.d.ts +0 -94
  1167. package/dist/types/skc-runtime/ultragoal-guard.d.ts +0 -93
  1168. package/dist/types/skc-runtime/ultragoal-receipt-freshness.d.ts +0 -42
  1169. package/dist/types/skc-runtime/ultragoal-runtime.d.ts +0 -410
  1170. package/dist/types/skc-runtime/workflow-command-ref.d.ts +0 -43
  1171. package/dist/types/skc-runtime/workflow-manifest.d.ts +0 -54
  1172. package/dist/types/skill-state/active-state.d.ts +0 -126
  1173. package/dist/types/skill-state/canonical-skills.d.ts +0 -3
  1174. package/dist/types/skill-state/deep-interview-mutation-guard.d.ts +0 -38
  1175. package/dist/types/skill-state/initial-phase.d.ts +0 -12
  1176. package/dist/types/skill-state/workflow-hud.d.ts +0 -83
  1177. package/dist/types/skill-state/workflow-state-contract.d.ts +0 -57
  1178. package/dist/types/skill-state/workflow-state-version.d.ts +0 -3
  1179. package/dist/types/slash-commands/acp-builtins.d.ts +0 -18
  1180. package/dist/types/slash-commands/builtin-registry.d.ts +0 -24
  1181. package/dist/types/slash-commands/helpers/context-report.d.ts +0 -7
  1182. package/dist/types/slash-commands/helpers/fast-status-report.d.ts +0 -82
  1183. package/dist/types/slash-commands/helpers/format.d.ts +0 -10
  1184. package/dist/types/slash-commands/helpers/mcp.d.ts +0 -3
  1185. package/dist/types/slash-commands/helpers/parse.d.ts +0 -33
  1186. package/dist/types/slash-commands/helpers/ssh.d.ts +0 -3
  1187. package/dist/types/slash-commands/helpers/todo.d.ts +0 -3
  1188. package/dist/types/slash-commands/helpers/usage-report.d.ts +0 -7
  1189. package/dist/types/slash-commands/types.d.ts +0 -120
  1190. package/dist/types/ssh/config-writer.d.ts +0 -49
  1191. package/dist/types/ssh/connection-manager.d.ts +0 -33
  1192. package/dist/types/ssh/ssh-executor.d.ts +0 -37
  1193. package/dist/types/ssh/sshfs-mount.d.ts +0 -6
  1194. package/dist/types/ssh/utils.d.ts +0 -2
  1195. package/dist/types/stt/downloader.d.ts +0 -9
  1196. package/dist/types/stt/index.d.ts +0 -3
  1197. package/dist/types/stt/recorder.d.ts +0 -13
  1198. package/dist/types/stt/setup.d.ts +0 -18
  1199. package/dist/types/stt/stt-controller.d.ts +0 -16
  1200. package/dist/types/stt/transcriber.d.ts +0 -16
  1201. package/dist/types/system-prompt.d.ts +0 -118
  1202. package/dist/types/task/agents.d.ts +0 -28
  1203. package/dist/types/task/commands.d.ts +0 -35
  1204. package/dist/types/task/discovery.d.ts +0 -19
  1205. package/dist/types/task/executor.d.ts +0 -127
  1206. package/dist/types/task/fork-context-advisory.d.ts +0 -13
  1207. package/dist/types/task/fork-context-budget.d.ts +0 -7
  1208. package/dist/types/task/id.d.ts +0 -7
  1209. package/dist/types/task/index.d.ts +0 -43
  1210. package/dist/types/task/name-generator.d.ts +0 -16
  1211. package/dist/types/task/output-manager.d.ts +0 -36
  1212. package/dist/types/task/parallel.d.ts +0 -34
  1213. package/dist/types/task/receipt.d.ts +0 -89
  1214. package/dist/types/task/render.d.ts +0 -28
  1215. package/dist/types/task/roi-reconciliation.d.ts +0 -27
  1216. package/dist/types/task/simple-mode.d.ts +0 -8
  1217. package/dist/types/task/skc-command.d.ts +0 -7
  1218. package/dist/types/task/spawn-gate.d.ts +0 -29
  1219. package/dist/types/task/subprocess-tool-registry.d.ts +0 -72
  1220. package/dist/types/task/token-log.d.ts +0 -30
  1221. package/dist/types/task/token-log.test.d.ts +0 -1
  1222. package/dist/types/task/types.d.ts +0 -516
  1223. package/dist/types/task/worktree.d.ts +0 -94
  1224. package/dist/types/thinking-metadata.d.ts +0 -16
  1225. package/dist/types/thinking.d.ts +0 -22
  1226. package/dist/types/tool-discovery/tool-index.d.ts +0 -112
  1227. package/dist/types/tools/archive-reader.d.ts +0 -40
  1228. package/dist/types/tools/ask-answer-registry.d.ts +0 -18
  1229. package/dist/types/tools/ask.d.ts +0 -123
  1230. package/dist/types/tools/ast-edit.d.ts +0 -77
  1231. package/dist/types/tools/ast-grep.d.ts +0 -69
  1232. package/dist/types/tools/auto-generated-guard.d.ts +0 -17
  1233. package/dist/types/tools/bash-allowed-prefixes.d.ts +0 -10
  1234. package/dist/types/tools/bash-command-fixup.d.ts +0 -11
  1235. package/dist/types/tools/bash-interactive.d.ts +0 -16
  1236. package/dist/types/tools/bash-interceptor.d.ts +0 -24
  1237. package/dist/types/tools/bash-pty-selection.d.ts +0 -7
  1238. package/dist/types/tools/bash-skill-urls.d.ts +0 -31
  1239. package/dist/types/tools/bash.d.ts +0 -157
  1240. package/dist/types/tools/bisect.d.ts +0 -81
  1241. package/dist/types/tools/browser/actions.d.ts +0 -54
  1242. package/dist/types/tools/browser/attach.d.ts +0 -50
  1243. package/dist/types/tools/browser/launch.d.ts +0 -62
  1244. package/dist/types/tools/browser/readable.d.ts +0 -17
  1245. package/dist/types/tools/browser/registry.d.ts +0 -57
  1246. package/dist/types/tools/browser/render.d.ts +0 -53
  1247. package/dist/types/tools/browser/tab-protocol.d.ts +0 -144
  1248. package/dist/types/tools/browser/tab-supervisor.d.ts +0 -109
  1249. package/dist/types/tools/browser/tab-worker-entry.d.ts +0 -1
  1250. package/dist/types/tools/browser/tab-worker.d.ts +0 -19
  1251. package/dist/types/tools/browser.d.ts +0 -211
  1252. package/dist/types/tools/calculator.d.ts +0 -76
  1253. package/dist/types/tools/checkpoint.d.ts +0 -63
  1254. package/dist/types/tools/composer-bash-policy.d.ts +0 -14
  1255. package/dist/types/tools/computer/render.d.ts +0 -17
  1256. package/dist/types/tools/computer-gc.d.ts +0 -23
  1257. package/dist/types/tools/computer.d.ts +0 -465
  1258. package/dist/types/tools/conflict-detect.d.ts +0 -205
  1259. package/dist/types/tools/context.d.ts +0 -19
  1260. package/dist/types/tools/cron.d.ts +0 -91
  1261. package/dist/types/tools/debug.d.ts +0 -209
  1262. package/dist/types/tools/eval.d.ts +0 -108
  1263. package/dist/types/tools/fetch.d.ts +0 -84
  1264. package/dist/types/tools/file-recorder.d.ts +0 -13
  1265. package/dist/types/tools/find.d.ts +0 -95
  1266. package/dist/types/tools/fs-cache-invalidation.d.ts +0 -15
  1267. package/dist/types/tools/gh-format.d.ts +0 -6
  1268. package/dist/types/tools/gh-renderer.d.ts +0 -25
  1269. package/dist/types/tools/gh.d.ts +0 -356
  1270. package/dist/types/tools/github-cache.d.ts +0 -103
  1271. package/dist/types/tools/grouped-file-output.d.ts +0 -36
  1272. package/dist/types/tools/hindsight-recall.d.ts +0 -21
  1273. package/dist/types/tools/hindsight-reflect.d.ts +0 -23
  1274. package/dist/types/tools/hindsight-retain.d.ts +0 -27
  1275. package/dist/types/tools/image-gen.d.ts +0 -79
  1276. package/dist/types/tools/index.d.ts +0 -371
  1277. package/dist/types/tools/irc.d.ts +0 -79
  1278. package/dist/types/tools/job.d.ts +0 -78
  1279. package/dist/types/tools/json-tree.d.ts +0 -23
  1280. package/dist/types/tools/jtd-to-json-schema.d.ts +0 -29
  1281. package/dist/types/tools/jtd-to-typescript.d.ts +0 -26
  1282. package/dist/types/tools/jtd-utils.d.ts +0 -42
  1283. package/dist/types/tools/list-limit.d.ts +0 -12
  1284. package/dist/types/tools/match-line-format.d.ts +0 -11
  1285. package/dist/types/tools/monitor.d.ts +0 -54
  1286. package/dist/types/tools/output-meta.d.ts +0 -204
  1287. package/dist/types/tools/path-utils.d.ts +0 -147
  1288. package/dist/types/tools/plan-mode-guard.d.ts +0 -18
  1289. package/dist/types/tools/read.d.ts +0 -85
  1290. package/dist/types/tools/recipe/index.d.ts +0 -45
  1291. package/dist/types/tools/recipe/render.d.ts +0 -36
  1292. package/dist/types/tools/recipe/runner.d.ts +0 -60
  1293. package/dist/types/tools/recipe/runners/cargo.d.ts +0 -16
  1294. package/dist/types/tools/recipe/runners/index.d.ts +0 -2
  1295. package/dist/types/tools/recipe/runners/just.d.ts +0 -2
  1296. package/dist/types/tools/recipe/runners/make.d.ts +0 -2
  1297. package/dist/types/tools/recipe/runners/pkg.d.ts +0 -2
  1298. package/dist/types/tools/recipe/runners/task.d.ts +0 -2
  1299. package/dist/types/tools/render-mermaid.d.ts +0 -37
  1300. package/dist/types/tools/render-utils.d.ts +0 -158
  1301. package/dist/types/tools/renderers.d.ts +0 -26
  1302. package/dist/types/tools/resolve.d.ts +0 -80
  1303. package/dist/types/tools/resource-gc.d.ts +0 -54
  1304. package/dist/types/tools/review.d.ts +0 -63
  1305. package/dist/types/tools/search-tool-bm25.d.ts +0 -65
  1306. package/dist/types/tools/search.d.ts +0 -93
  1307. package/dist/types/tools/skill-discovery.d.ts +0 -40
  1308. package/dist/types/tools/skill.d.ts +0 -48
  1309. package/dist/types/tools/sqlite-reader.d.ts +0 -94
  1310. package/dist/types/tools/ssh.d.ts +0 -67
  1311. package/dist/types/tools/subagent-render.d.ts +0 -31
  1312. package/dist/types/tools/subagent.d.ts +0 -117
  1313. package/dist/types/tools/telegram-send.d.ts +0 -39
  1314. package/dist/types/tools/todo-write.d.ts +0 -120
  1315. package/dist/types/tools/tool-errors.d.ts +0 -33
  1316. package/dist/types/tools/tool-result.d.ts +0 -30
  1317. package/dist/types/tools/tool-timeouts.d.ts +0 -56
  1318. package/dist/types/tools/ultragoal-ask-guard.d.ts +0 -12
  1319. package/dist/types/tools/vim.d.ts +0 -58
  1320. package/dist/types/tools/write.d.ts +0 -59
  1321. package/dist/types/tools/yield.d.ts +0 -25
  1322. package/dist/types/tui/code-cell.d.ts +0 -32
  1323. package/dist/types/tui/file-list.d.ts +0 -22
  1324. package/dist/types/tui/hyperlink.d.ts +0 -42
  1325. package/dist/types/tui/index.d.ts +0 -11
  1326. package/dist/types/tui/output-block.d.ts +0 -28
  1327. package/dist/types/tui/status-line.d.ts +0 -18
  1328. package/dist/types/tui/tree-list.d.ts +0 -19
  1329. package/dist/types/tui/types.d.ts +0 -13
  1330. package/dist/types/tui/utils.d.ts +0 -36
  1331. package/dist/types/utils/changelog.d.ts +0 -37
  1332. package/dist/types/utils/clipboard.d.ts +0 -22
  1333. package/dist/types/utils/cmux-workspace.d.ts +0 -52
  1334. package/dist/types/utils/command-args.d.ts +0 -9
  1335. package/dist/types/utils/commit-message-generator.d.ts +0 -7
  1336. package/dist/types/utils/edit-mode.d.ts +0 -13
  1337. package/dist/types/utils/event-bus.d.ts +0 -6
  1338. package/dist/types/utils/external-editor.d.ts +0 -19
  1339. package/dist/types/utils/file-display-mode.d.ts +0 -27
  1340. package/dist/types/utils/file-mentions.d.ts +0 -25
  1341. package/dist/types/utils/git.d.ts +0 -393
  1342. package/dist/types/utils/image-loading.d.ts +0 -26
  1343. package/dist/types/utils/image-resize.d.ts +0 -39
  1344. package/dist/types/utils/lang-from-path.d.ts +0 -8
  1345. package/dist/types/utils/linkedom.d.ts +0 -4
  1346. package/dist/types/utils/markit.d.ts +0 -7
  1347. package/dist/types/utils/open.d.ts +0 -2
  1348. package/dist/types/utils/pasted-image-path.d.ts +0 -32
  1349. package/dist/types/utils/session-color.d.ts +0 -10
  1350. package/dist/types/utils/shell-snapshot.d.ts +0 -5
  1351. package/dist/types/utils/sixel.d.ts +0 -21
  1352. package/dist/types/utils/title-generator.d.ts +0 -31
  1353. package/dist/types/utils/tool-choice.d.ts +0 -20
  1354. package/dist/types/utils/tools-manager.d.ts +0 -9
  1355. package/dist/types/vim/buffer.d.ts +0 -41
  1356. package/dist/types/vim/commands.d.ts +0 -6
  1357. package/dist/types/vim/engine.d.ts +0 -47
  1358. package/dist/types/vim/parser.d.ts +0 -3
  1359. package/dist/types/vim/render.d.ts +0 -25
  1360. package/dist/types/vim/types.d.ts +0 -182
  1361. package/dist/types/web/insane/bridge.d.ts +0 -103
  1362. package/dist/types/web/insane/url-guard.d.ts +0 -25
  1363. package/dist/types/web/kagi.d.ts +0 -23
  1364. package/dist/types/web/parallel.d.ts +0 -58
  1365. package/dist/types/web/scrapers/artifacthub.d.ts +0 -6
  1366. package/dist/types/web/scrapers/arxiv.d.ts +0 -5
  1367. package/dist/types/web/scrapers/aur.d.ts +0 -5
  1368. package/dist/types/web/scrapers/biorxiv.d.ts +0 -5
  1369. package/dist/types/web/scrapers/bluesky.d.ts +0 -5
  1370. package/dist/types/web/scrapers/brew.d.ts +0 -5
  1371. package/dist/types/web/scrapers/cheatsh.d.ts +0 -8
  1372. package/dist/types/web/scrapers/chocolatey.d.ts +0 -5
  1373. package/dist/types/web/scrapers/choosealicense.d.ts +0 -2
  1374. package/dist/types/web/scrapers/cisa-kev.d.ts +0 -5
  1375. package/dist/types/web/scrapers/clojars.d.ts +0 -5
  1376. package/dist/types/web/scrapers/coingecko.d.ts +0 -5
  1377. package/dist/types/web/scrapers/crates-io.d.ts +0 -5
  1378. package/dist/types/web/scrapers/crossref.d.ts +0 -2
  1379. package/dist/types/web/scrapers/devto.d.ts +0 -5
  1380. package/dist/types/web/scrapers/discogs.d.ts +0 -8
  1381. package/dist/types/web/scrapers/discourse.d.ts +0 -5
  1382. package/dist/types/web/scrapers/dockerhub.d.ts +0 -5
  1383. package/dist/types/web/scrapers/docs-rs.d.ts +0 -2
  1384. package/dist/types/web/scrapers/fdroid.d.ts +0 -5
  1385. package/dist/types/web/scrapers/firefox-addons.d.ts +0 -2
  1386. package/dist/types/web/scrapers/flathub.d.ts +0 -2
  1387. package/dist/types/web/scrapers/github-gist.d.ts +0 -5
  1388. package/dist/types/web/scrapers/github.d.ts +0 -12
  1389. package/dist/types/web/scrapers/gitlab.d.ts +0 -5
  1390. package/dist/types/web/scrapers/go-pkg.d.ts +0 -5
  1391. package/dist/types/web/scrapers/hackage.d.ts +0 -5
  1392. package/dist/types/web/scrapers/hackernews.d.ts +0 -2
  1393. package/dist/types/web/scrapers/hex.d.ts +0 -5
  1394. package/dist/types/web/scrapers/huggingface.d.ts +0 -2
  1395. package/dist/types/web/scrapers/iacr.d.ts +0 -5
  1396. package/dist/types/web/scrapers/index.d.ts +0 -84
  1397. package/dist/types/web/scrapers/jetbrains-marketplace.d.ts +0 -2
  1398. package/dist/types/web/scrapers/lemmy.d.ts +0 -2
  1399. package/dist/types/web/scrapers/lobsters.d.ts +0 -5
  1400. package/dist/types/web/scrapers/mastodon.d.ts +0 -5
  1401. package/dist/types/web/scrapers/maven.d.ts +0 -6
  1402. package/dist/types/web/scrapers/mdn.d.ts +0 -2
  1403. package/dist/types/web/scrapers/metacpan.d.ts +0 -5
  1404. package/dist/types/web/scrapers/musicbrainz.d.ts +0 -5
  1405. package/dist/types/web/scrapers/npm.d.ts +0 -5
  1406. package/dist/types/web/scrapers/nuget.d.ts +0 -5
  1407. package/dist/types/web/scrapers/nvd.d.ts +0 -5
  1408. package/dist/types/web/scrapers/ollama.d.ts +0 -2
  1409. package/dist/types/web/scrapers/open-vsx.d.ts +0 -5
  1410. package/dist/types/web/scrapers/opencorporates.d.ts +0 -5
  1411. package/dist/types/web/scrapers/openlibrary.d.ts +0 -5
  1412. package/dist/types/web/scrapers/orcid.d.ts +0 -5
  1413. package/dist/types/web/scrapers/osv.d.ts +0 -5
  1414. package/dist/types/web/scrapers/packagist.d.ts +0 -5
  1415. package/dist/types/web/scrapers/pub-dev.d.ts +0 -5
  1416. package/dist/types/web/scrapers/pubmed.d.ts +0 -5
  1417. package/dist/types/web/scrapers/pypi.d.ts +0 -5
  1418. package/dist/types/web/scrapers/rawg.d.ts +0 -2
  1419. package/dist/types/web/scrapers/readthedocs.d.ts +0 -2
  1420. package/dist/types/web/scrapers/reddit.d.ts +0 -5
  1421. package/dist/types/web/scrapers/repology.d.ts +0 -5
  1422. package/dist/types/web/scrapers/rfc.d.ts +0 -5
  1423. package/dist/types/web/scrapers/rubygems.d.ts +0 -5
  1424. package/dist/types/web/scrapers/searchcode.d.ts +0 -2
  1425. package/dist/types/web/scrapers/sec-edgar.d.ts +0 -5
  1426. package/dist/types/web/scrapers/semantic-scholar.d.ts +0 -2
  1427. package/dist/types/web/scrapers/snapcraft.d.ts +0 -2
  1428. package/dist/types/web/scrapers/sourcegraph.d.ts +0 -2
  1429. package/dist/types/web/scrapers/spdx.d.ts +0 -5
  1430. package/dist/types/web/scrapers/spotify.d.ts +0 -8
  1431. package/dist/types/web/scrapers/stackoverflow.d.ts +0 -6
  1432. package/dist/types/web/scrapers/terraform.d.ts +0 -5
  1433. package/dist/types/web/scrapers/tldr.d.ts +0 -7
  1434. package/dist/types/web/scrapers/twitter.d.ts +0 -5
  1435. package/dist/types/web/scrapers/types.d.ts +0 -83
  1436. package/dist/types/web/scrapers/utils.d.ts +0 -32
  1437. package/dist/types/web/scrapers/vimeo.d.ts +0 -5
  1438. package/dist/types/web/scrapers/vscode-marketplace.d.ts +0 -5
  1439. package/dist/types/web/scrapers/w3c.d.ts +0 -2
  1440. package/dist/types/web/scrapers/wikidata.d.ts +0 -5
  1441. package/dist/types/web/scrapers/wikipedia.d.ts +0 -5
  1442. package/dist/types/web/scrapers/youtube.d.ts +0 -13
  1443. package/dist/types/web/search/index.d.ts +0 -118
  1444. package/dist/types/web/search/provider.d.ts +0 -55
  1445. package/dist/types/web/search/providers/anthropic.d.ts +0 -32
  1446. package/dist/types/web/search/providers/base.d.ts +0 -90
  1447. package/dist/types/web/search/providers/brave.d.ts +0 -27
  1448. package/dist/types/web/search/providers/codex.d.ts +0 -35
  1449. package/dist/types/web/search/providers/duckduckgo.d.ts +0 -57
  1450. package/dist/types/web/search/providers/exa.d.ts +0 -52
  1451. package/dist/types/web/search/providers/gemini.d.ts +0 -57
  1452. package/dist/types/web/search/providers/insane.d.ts +0 -53
  1453. package/dist/types/web/search/providers/jina.d.ts +0 -26
  1454. package/dist/types/web/search/providers/kagi.d.ts +0 -24
  1455. package/dist/types/web/search/providers/kimi.d.ts +0 -27
  1456. package/dist/types/web/search/providers/openai-compatible.d.ts +0 -9
  1457. package/dist/types/web/search/providers/parallel.d.ts +0 -15
  1458. package/dist/types/web/search/providers/perplexity.d.ts +0 -38
  1459. package/dist/types/web/search/providers/searxng.d.ts +0 -44
  1460. package/dist/types/web/search/providers/synthetic.d.ts +0 -21
  1461. package/dist/types/web/search/providers/tavily.d.ts +0 -29
  1462. package/dist/types/web/search/providers/text-citations.d.ts +0 -23
  1463. package/dist/types/web/search/providers/utils.d.ts +0 -88
  1464. package/dist/types/web/search/providers/xai.d.ts +0 -64
  1465. package/dist/types/web/search/providers/zai.d.ts +0 -28
  1466. package/dist/types/web/search/render.d.ts +0 -36
  1467. package/dist/types/web/search/types.d.ts +0 -372
  1468. package/dist/types/web/search/utils.d.ts +0 -4
  1469. package/dist/types/workflow/workflow-intent-diff.d.ts +0 -25
  1470. package/dist/types/workflow/workflow-intent-report-consumer.d.ts +0 -50
  1471. package/dist/types/workflow/workflow-intent-report-schema.d.ts +0 -2
  1472. package/dist/types/workflow/workflow-intent-report.d.ts +0 -48
  1473. package/dist/types/workspace-tree.d.ts +0 -42
  1474. package/src/sdk.ts +0 -2623
@@ -14,25 +14,27 @@
14
14
  import { closeSync, fsyncSync, mkdirSync, openSync, readFileSync, renameSync, writeFileSync } from "node:fs";
15
15
  import * as path from "node:path";
16
16
  import type { AskSelectedAckOutcome } from "../../../tools";
17
- import type {
18
- RpcWorkflowGate,
19
- RpcWorkflowGateContext,
20
- RpcWorkflowGateKind,
21
- RpcWorkflowGateOption,
22
- RpcWorkflowGateResolution,
23
- RpcWorkflowGateResponse,
24
- RpcWorkflowGateValidationError,
25
- RpcWorkflowStage,
26
- } from "../../rpc/rpc-types";
27
- import { RESERVED_WORKFLOW_STAGES } from "../../rpc/rpc-types";
28
17
  import { classifyAskGateDisposition } from "./deep-interview-gate";
29
18
  import { answerHashOf, canonicalJson, compileGateSchema, schemaHash, validateGateAnswer } from "./workflow-gate-schema";
19
+ import type {
20
+ WorkflowGate,
21
+ WorkflowGateContext,
22
+ WorkflowGateDiagnostic,
23
+ WorkflowGateKind,
24
+ WorkflowGateOption,
25
+ WorkflowGateQueryRecord,
26
+ WorkflowGateResolution,
27
+ WorkflowGateResponse,
28
+ WorkflowGateValidationError,
29
+ WorkflowStage,
30
+ } from "./workflow-gate-types";
31
+ import { RESERVED_WORKFLOW_STAGES, WORKFLOW_GATE_V1_STAGES } from "./workflow-gate-types";
30
32
 
31
33
  export type PersistedSemanticDisposition = "commit" | "resolve_without_commit";
32
34
  export type PersistedResolutionOrigin =
33
- | { kind: "generic"; channel: "rpc" | "bridge" | "other" }
34
- | { kind: "telegram_notification"; interactionActionId: string }
35
- | { kind: "legacy_unknown" };
35
+ | { kind: "generic"; channel: "sdk" | "other" }
36
+ | { kind: "telegram_notification"; interactionActionId: string };
37
+
36
38
  export type PersistedAckPolicy =
37
39
  | { kind: "none"; reason: "non_telegram" | "semantic_noncommit" | "legacy_unproven" }
38
40
  | {
@@ -51,35 +53,490 @@ export interface GateResolutionOptions {
51
53
  beforeAdvance?: () => Promise<void>;
52
54
  }
53
55
 
54
- const V1_STAGES: readonly RpcWorkflowStage[] = ["deep-interview", "ralplan", "ultragoal"];
56
+ export type WorkflowGateTerminalProof = "retired" | "already_terminal" | "not_published";
57
+
58
+ export interface WorkflowGateTerminalController {
59
+ completeGateInteractions(gateId: string): WorkflowGateTerminalProof | Promise<WorkflowGateTerminalProof>;
60
+ cancelGateInteractions(gateId: string, reason: string): void | Promise<void>;
61
+ }
62
+
63
+ export interface NotificationGateResolutionOptions {
64
+ interactionActionId: string;
65
+ replyReceiptId: string;
66
+ answerJson: string;
67
+ idempotencyKey?: string;
68
+ requestSelectedAck(input: {
69
+ replyReceiptId: string;
70
+ actionId: string;
71
+ commitKey: string;
72
+ daemonDeadlineAt: number;
73
+ hostTimeoutMs: number;
74
+ }): Promise<AskSelectedAckOutcome>;
75
+ resolveClaim(): void;
76
+ closeClaimInvalid(reason: string): void;
77
+ }
78
+
79
+ export class NotificationGatePolicyChangedError extends Error {
80
+ constructor() {
81
+ super("Notification policy changed while resolving the workflow gate");
82
+ this.name = "NotificationGatePolicyChangedError";
83
+ }
84
+ }
85
+
86
+ export interface AskSelectedAckRecoveryParticipant {
87
+ requestRecoveredAskSelectedAck(input: {
88
+ sessionId: string;
89
+ actionId: string;
90
+ commitKey: string;
91
+ deadlineAt: number;
92
+ hostTimeoutMs: number;
93
+ }): Promise<AskSelectedAckOutcome>;
94
+ }
95
+
96
+ /** SDK-native surface for emitting a workflow gate and awaiting its answer. */
97
+ export interface WorkflowGateEmitter {
98
+ isUnattended(): boolean;
99
+ emitGate(input: OpenGateInput): Promise<unknown>;
100
+ onGateEmitted?(listener: (gate: WorkflowGate) => void): () => void;
101
+ resolveGate?(response: WorkflowGateResponse): Promise<WorkflowGateResolution>;
102
+ resolveGateFromNotification?(
103
+ response: WorkflowGateResponse,
104
+ options: NotificationGateResolutionOptions,
105
+ ): Promise<WorkflowGateResolution>;
106
+ registerGateTerminalController?(controller: WorkflowGateTerminalController): () => void;
107
+ /** Records the exact terminalization proof established by direct control preparation. */
108
+ prepareTerminalization?(gateId: string, proof: WorkflowGateTerminalProof): boolean;
109
+ /** Discards a prepared proof when the gate remains pending after a rejected direct response. */
110
+ clearPreparedTerminalization?(gateId: string): void;
111
+ listPendingGates?(): WorkflowGate[];
112
+ listGateDiagnostics?(): WorkflowGateDiagnostic[];
113
+ listWorkflowGateQueryRecords?(): WorkflowGateQueryRecord[];
114
+ quarantineGate?(gateId: string): void;
115
+ setAckRecoveryParticipant?(participant: AskSelectedAckRecoveryParticipant | null): void;
116
+ /** Explicit host hook for same-process accepted-but-unadvanced recovery. */
117
+ recoverAcceptedGates?(): Promise<string[]>;
118
+ /** Reads a durable completed resolution before any presentation claim. */
119
+ lookupCompletedResolution?(response: WorkflowGateResponse): WorkflowGateCompletedResolutionLookup;
120
+ /** Supplies the active runtime turn captured immediately before a gate is opened. */
121
+ setRuntimeTurnProvider?(provider: (() => string | undefined) | null): void;
122
+ /** Permanently revoke all in-process continuation authority and reject their waiters. */
123
+ fence?(): void;
124
+ /** Temporarily make this emitter unavailable while a session transition is reversible. */
125
+ suspend?(): void;
126
+ resume?(): void;
127
+ }
128
+
129
+ /**
130
+ * SDK-native workflow-gate emitter backed by a durable broker/store pair.
131
+ *
132
+ * Answers are resolved by the broker, so validation and idempotency have one
133
+ * authority. Listeners replay durable pending gates when attached, allowing an
134
+ * SDK host that starts after a gate was opened to discover it.
135
+ */
136
+ export class BrokerWorkflowGateEmitter implements WorkflowGateEmitter {
137
+ readonly #listeners = new Set<(gate: WorkflowGate) => void>();
138
+ readonly #waiters = new Map<string, { resolve(answer: unknown): void; reject(error: Error): void }>();
139
+ readonly #broker: WorkflowGateBroker;
140
+ #terminalController: WorkflowGateTerminalController | undefined;
141
+ #recoveryParticipant: AskSelectedAckRecoveryParticipant | undefined;
142
+ #recoveryPromise: Promise<void> | undefined;
143
+ readonly #participantReady = Promise.withResolvers<void>();
144
+ #recoveryGraceTimer: NodeJS.Timeout | undefined;
145
+ #recoveryGraceWake: (() => void) | undefined;
146
+ #recoveryTimer: NodeJS.Timeout | undefined;
147
+ #recoveryAttempts = 0;
148
+ #fenced = false;
149
+ #suspended = false;
150
+ readonly #runId: string;
151
+ readonly #store: GateStore;
152
+ readonly #emitterHooks: Pick<BrokerHooks, "advance">;
153
+ #runtimeTurnProvider: (() => string | undefined) | undefined;
154
+
155
+ constructor(runId: string, store: GateStore, emitterHooks: Pick<BrokerHooks, "advance"> = {}) {
156
+ this.#runId = runId;
157
+ this.#store = store;
158
+ this.#emitterHooks = emitterHooks;
159
+ this.#broker = new WorkflowGateBroker(runId, store, {
160
+ emit: gate => {
161
+ for (const listener of this.#listeners) listener(gate);
162
+ },
163
+ advance: (gate, answer) => this.#emitterHooks.advance?.(gate, answer),
164
+ completeAccepted: record => this.#completeAccepted(record),
165
+ finalizeAccepted: record => this.#finalizeAccepted(record),
166
+ terminalizeAccepted: record => this.#terminalizeAccepted(record),
167
+ });
168
+ }
169
+
170
+ isUnattended(): boolean {
171
+ return true;
172
+ }
173
+ setRuntimeTurnProvider(provider: (() => string | undefined) | null): void {
174
+ this.#runtimeTurnProvider = provider ?? undefined;
175
+ }
176
+
177
+ emitGate(input: OpenGateInput): Promise<unknown> {
178
+ if (this.#fenced || this.#suspended) return Promise.reject(new Error("workflow gate emitter is unavailable"));
179
+ const waiter = Promise.withResolvers<unknown>();
180
+ const gate = this.#broker.openGate(
181
+ {
182
+ ...input,
183
+ ...(input.runtimeTurnId === undefined ? { runtimeTurnId: this.#runtimeTurnProvider?.() } : {}),
184
+ },
185
+ {
186
+ activate: opened => this.#waiters.set(opened.gate_id, waiter),
187
+ isLive: gateId => this.#waiters.has(gateId),
188
+ release: gateId => {
189
+ const activeWaiter = this.#waiters.get(gateId);
190
+ if (!activeWaiter) return;
191
+ this.#waiters.delete(gateId);
192
+ activeWaiter.reject(new Error(`workflow gate ${gateId} continuation was fenced`));
193
+ },
194
+ },
195
+ );
196
+ // A listener may answer synchronously while the broker emits. The durable
197
+ // record is the source of truth in that race; never strand its promise.
198
+ const persisted = this.#store.get(gate.gate_id);
199
+ return persisted?.status === "accepted" ? Promise.resolve(persisted.answer) : waiter.promise;
200
+ }
201
+
202
+ onGateEmitted(listener: (gate: WorkflowGate) => void): () => void {
203
+ this.#listeners.add(listener);
204
+ for (const gate of this.listPendingGates()) listener(gate);
205
+ return () => this.#listeners.delete(listener);
206
+ }
207
+
208
+ resolveGate(response: WorkflowGateResponse): Promise<WorkflowGateResolution> {
209
+ if (this.#fenced || this.#suspended)
210
+ return Promise.reject(new WorkflowGateBrokerError("unknown_gate", `workflow gate emitter is unavailable`));
211
+ return this.#broker.resolve(response).catch(error => {
212
+ if (!this.#fenced && !this.#suspended) this.#scheduleRecovery();
213
+ throw error;
214
+ });
215
+ }
216
+ lookupCompletedResolution(response: WorkflowGateResponse): WorkflowGateCompletedResolutionLookup {
217
+ return this.#broker.lookupCompletedResolution(response);
218
+ }
219
+
220
+ prepareTerminalization(gateId: string, proof: WorkflowGateTerminalProof): boolean {
221
+ return this.#broker.prepareTerminalization(gateId, proof);
222
+ }
223
+ clearPreparedTerminalization(gateId: string): void {
224
+ this.#broker.clearPreparedTerminalization(gateId);
225
+ }
226
+
227
+ listPendingGates(): WorkflowGate[] {
228
+ return this.#suspended ? [] : this.#broker.listPendingGates();
229
+ }
230
+
231
+ listGateDiagnostics(): WorkflowGateDiagnostic[] {
232
+ return this.#broker.listGateDiagnostics();
233
+ }
234
+
235
+ listWorkflowGateQueryRecords(): WorkflowGateQueryRecord[] {
236
+ return this.#broker.listWorkflowGateQueryRecords();
237
+ }
238
+
239
+ suspend(): void {
240
+ if (!this.#fenced) this.#suspended = true;
241
+ }
242
+
243
+ resume(): void {
244
+ if (!this.#fenced) this.#suspended = false;
245
+ }
246
+
247
+ fence(): void {
248
+ if (this.#fenced) return;
249
+ this.#fenced = true;
250
+ this.#suspended = false;
251
+ this.#runtimeTurnProvider = undefined;
252
+ if (this.#recoveryTimer) clearTimeout(this.#recoveryTimer);
253
+ this.#recoveryTimer = undefined;
254
+ if (this.#recoveryGraceTimer) clearTimeout(this.#recoveryGraceTimer);
255
+ this.#recoveryGraceTimer = undefined;
256
+ this.#recoveryGraceWake?.();
257
+ this.#recoveryGraceWake = undefined;
258
+ for (const [gateId, waiter] of this.#waiters) {
259
+ this.#waiters.delete(gateId);
260
+ waiter.reject(new Error(`workflow gate ${gateId} continuation was fenced`));
261
+ }
262
+ this.#broker.fenceContinuations();
263
+ }
264
+
265
+ quarantineGate(gateId: string): void {
266
+ const waiter = this.#waiters.get(gateId);
267
+ if (waiter) {
268
+ this.#waiters.delete(gateId);
269
+ waiter.reject(new Error(`workflow gate ${gateId} continuation was fenced`));
270
+ }
271
+ this.#broker.quarantineGate(gateId);
272
+ }
273
+
274
+ registerGateTerminalController(controller: WorkflowGateTerminalController): () => void {
275
+ if (this.#terminalController && this.#terminalController !== controller)
276
+ throw new Error("a workflow gate terminal controller is already registered");
277
+ this.#terminalController = controller;
278
+ return () => {
279
+ if (this.#terminalController === controller) this.#terminalController = undefined;
280
+ };
281
+ }
282
+
283
+ setAckRecoveryParticipant(participant: AskSelectedAckRecoveryParticipant | null): void {
284
+ this.#recoveryParticipant = participant ?? undefined;
285
+ if (participant) this.#participantReady.resolve();
286
+ void this.#startRecoveryOnce();
287
+ }
288
+ async recoverAcceptedGates(): Promise<string[]> {
289
+ const recovered = await this.#broker.recover();
290
+ if (recovered.length > 0 || this.#broker.hasRecoverableAcceptedGate()) {
291
+ this.#scheduleRecovery();
292
+ } else {
293
+ this.#recoveryAttempts = 0;
294
+ }
295
+ return recovered;
296
+ }
297
+
298
+ async resolveGateFromNotification(
299
+ response: WorkflowGateResponse,
300
+ options: NotificationGateResolutionOptions,
301
+ ): Promise<WorkflowGateResolution> {
302
+ let claimSettled = false;
303
+ const resolveClaim = () => {
304
+ if (claimSettled) return;
305
+ claimSettled = true;
306
+ options.resolveClaim();
307
+ };
308
+ const closeClaimInvalid = (reason: string) => {
309
+ if (claimSettled) return;
310
+ claimSettled = true;
311
+ options.closeClaimInvalid(reason);
312
+ };
313
+ try {
314
+ JSON.parse(options.answerJson);
315
+ } catch {
316
+ closeClaimInvalid("invalid_structured_answer");
317
+ return {
318
+ gate_id: response.gate_id,
319
+ status: "rejected",
320
+ answer_hash: "",
321
+ resolved_at: new Date().toISOString(),
322
+ error: this.#broker.validationError(response.gate_id, "json_parse", "invalid structured answer"),
323
+ };
324
+ }
325
+ let semanticDisposition: PersistedSemanticDisposition;
326
+ try {
327
+ semanticDisposition = this.#broker.classifyDisposition(response.gate_id, response.answer);
328
+ } catch (error) {
329
+ const message = error instanceof Error ? error.message : "invalid answer";
330
+ closeClaimInvalid(message);
331
+ return {
332
+ gate_id: response.gate_id,
333
+ status: "rejected",
334
+ answer_hash: "",
335
+ resolved_at: new Date().toISOString(),
336
+ error: this.#broker.validationError(response.gate_id, "semantic_disposition", message),
337
+ };
338
+ }
339
+ const commitKey = `${response.gate_id}:${options.idempotencyKey ?? options.replyReceiptId}`;
340
+ const ackPolicy: PersistedAckPolicy =
341
+ semanticDisposition === "commit"
342
+ ? {
343
+ kind: "telegram_selected_v1",
344
+ commitKey,
345
+ actionId: options.interactionActionId,
346
+ state: "pending",
347
+ updatedAt: new Date().toISOString(),
348
+ }
349
+ : { kind: "none", reason: "semantic_noncommit" };
350
+ try {
351
+ const resolution = await this.#broker.resolve(response, {
352
+ resolutionOrigin: { kind: "telegram_notification", interactionActionId: options.interactionActionId },
353
+ ackPolicy,
354
+ semanticDisposition,
355
+ beforeAdvance: async () => {
356
+ if (ackPolicy.kind === "telegram_selected_v1") {
357
+ this.#broker.updateAckPolicy(response.gate_id, {
358
+ ...ackPolicy,
359
+ state: "attempt_started",
360
+ updatedAt: new Date().toISOString(),
361
+ });
362
+ let outcome: AskSelectedAckOutcome;
363
+ try {
364
+ outcome = await options.requestSelectedAck({
365
+ replyReceiptId: options.replyReceiptId,
366
+ actionId: options.interactionActionId,
367
+ commitKey,
368
+ daemonDeadlineAt: Date.now() + 8_000,
369
+ hostTimeoutMs: 10_000,
370
+ });
371
+ } catch (error) {
372
+ if (error instanceof NotificationGatePolicyChangedError) throw error;
373
+ outcome = { status: "unknown", reason: "host_timeout" };
374
+ }
375
+ this.#broker.updateAckPolicy(response.gate_id, {
376
+ ...ackPolicy,
377
+ state: outcome.status,
378
+ outcome,
379
+ updatedAt: new Date().toISOString(),
380
+ });
381
+ }
382
+ resolveClaim();
383
+ },
384
+ });
385
+ if (resolution.status === "accepted") resolveClaim();
386
+ else closeClaimInvalid(resolution.error?.code ?? "invalid_answer");
387
+ return resolution;
388
+ } catch (error) {
389
+ if (error instanceof NotificationGatePolicyChangedError) {
390
+ try {
391
+ closeClaimInvalid(error.message);
392
+ } finally {
393
+ this.quarantineGate(response.gate_id);
394
+ }
395
+ throw error;
396
+ }
397
+ closeClaimInvalid(error instanceof Error ? error.message : "invalid_answer");
398
+ this.#scheduleRecovery();
399
+ throw error;
400
+ }
401
+ }
402
+
403
+ async #completeAccepted(record: PersistedGate): Promise<void> {
404
+ const waiter = this.#waiters.get(record.gate.gate_id);
405
+ if (!waiter) throw new Error(`workflow gate ${record.gate.gate_id} lost its continuation owner`);
406
+ waiter.resolve(record.answer);
407
+ }
408
+
409
+ async #terminalizeAccepted(record: PersistedGate): Promise<WorkflowGateTerminalProof> {
410
+ const controller = this.#terminalController;
411
+ if (!controller) {
412
+ this.quarantineGate(record.gate.gate_id);
413
+ throw new Error(`workflow gate ${record.gate.gate_id} has no terminal controller`);
414
+ }
415
+ try {
416
+ const proof = await controller.completeGateInteractions(record.gate.gate_id);
417
+ if (proof !== "retired" && proof !== "already_terminal" && proof !== "not_published")
418
+ throw new Error(`workflow gate ${record.gate.gate_id} terminalization returned no exact proof`);
419
+ return proof;
420
+ } catch (error) {
421
+ try {
422
+ await controller.cancelGateInteractions(
423
+ record.gate.gate_id,
424
+ "workflow gate presentation terminalization failed",
425
+ );
426
+ } finally {
427
+ this.quarantineGate(record.gate.gate_id);
428
+ }
429
+ throw error;
430
+ }
431
+ }
432
+
433
+ async #finalizeAccepted(record: PersistedGate): Promise<void> {
434
+ const policy = record.ackPolicy;
435
+ if (policy?.kind === "telegram_selected_v1" && policy.state === "pending") {
436
+ let outcome: AskSelectedAckOutcome;
437
+ const participant = this.#recoveryParticipant;
438
+ if (!participant) outcome = { status: "failed", reason: "no_participant" };
439
+ else {
440
+ this.#broker.updateAckPolicy(record.gate.gate_id, {
441
+ ...policy,
442
+ state: "attempt_started",
443
+ updatedAt: new Date().toISOString(),
444
+ });
445
+ try {
446
+ outcome = await participant.requestRecoveredAskSelectedAck({
447
+ sessionId: this.#runId,
448
+ actionId: policy.actionId,
449
+ commitKey: policy.commitKey,
450
+ deadlineAt: Date.now() + 8_000,
451
+ hostTimeoutMs: 10_000,
452
+ });
453
+ } catch {
454
+ outcome = { status: "unknown", reason: "host_timeout" };
455
+ }
456
+ }
457
+ this.#broker.updateAckPolicy(record.gate.gate_id, {
458
+ ...policy,
459
+ state: outcome.status,
460
+ outcome,
461
+ updatedAt: new Date().toISOString(),
462
+ });
463
+ }
464
+ if (policy?.kind === "telegram_selected_v1" && policy.state === "attempt_started") {
465
+ this.#broker.updateAckPolicy(record.gate.gate_id, {
466
+ ...policy,
467
+ state: "unknown",
468
+ outcome: { status: "unknown", reason: "shutdown" },
469
+ updatedAt: new Date().toISOString(),
470
+ });
471
+ }
472
+ }
473
+
474
+ #scheduleRecovery(): void {
475
+ if (this.#recoveryTimer || this.#recoveryAttempts >= 3) return;
476
+ const delay = 50 * 2 ** this.#recoveryAttempts++;
477
+ this.#recoveryTimer = setTimeout(() => {
478
+ this.#recoveryTimer = undefined;
479
+ void this.recoverAcceptedGates().catch(() => {
480
+ this.#scheduleRecovery();
481
+ });
482
+ }, delay);
483
+ }
484
+
485
+ async #startRecoveryOnce(options: { participantGraceMs?: number } = {}): Promise<void> {
486
+ if (this.#fenced) return;
487
+ if (this.#recoveryPromise) return this.#recoveryPromise;
488
+ this.#recoveryPromise = (async () => {
489
+ if (!this.#recoveryParticipant) {
490
+ const grace = Promise.withResolvers<void>();
491
+ this.#recoveryGraceWake = grace.resolve;
492
+ const graceMs = options.participantGraceMs ?? 2_000;
493
+ this.#recoveryGraceTimer = setTimeout(grace.resolve, graceMs);
494
+ await Promise.race([this.#participantReady.promise, grace.promise]);
495
+ if (this.#recoveryGraceTimer) clearTimeout(this.#recoveryGraceTimer);
496
+ this.#recoveryGraceTimer = undefined;
497
+ this.#recoveryGraceWake = undefined;
498
+ }
499
+ if (!this.#fenced) await this.recoverAcceptedGates();
500
+ })();
501
+ return this.#recoveryPromise;
502
+ }
503
+ }
55
504
 
56
505
  export interface PersistedGate {
57
- gate: RpcWorkflowGate;
58
- status: "pending" | "accepted";
506
+ gate: WorkflowGate;
507
+ status: "pending" | "accepted" | "quarantined";
508
+ ownerInstanceId?: string;
59
509
  idempotencyKey?: string;
60
510
  responseHash?: string;
61
- /** Raw accepted answer, retained so a crashed advance can be replayed. */
511
+ /** Raw accepted answer, retained so a same-process advance can be replayed. */
62
512
  answer?: unknown;
63
- resolution?: RpcWorkflowGateResolution;
513
+ resolution?: WorkflowGateResolution;
64
514
  advanced: boolean;
515
+ /** Exact presentation terminalization completed before workflow advancement. */
516
+ terminalized?: boolean;
517
+ /** Exact presentation terminalization proof recorded before workflow advancement. */
518
+ terminalProof?: WorkflowGateTerminalProof;
65
519
  semanticDisposition?: PersistedSemanticDisposition;
66
520
  resolutionOrigin?: PersistedResolutionOrigin;
67
521
  ackPolicy?: PersistedAckPolicy;
522
+ lifecycle?: WorkflowGateDiagnostic["lifecycle"];
68
523
  }
69
524
 
70
525
  export interface GateStore {
71
- nextSeq(stage: RpcWorkflowStage): number;
526
+ nextSeq(stage: WorkflowStage): number;
72
527
  put(record: PersistedGate): void;
73
528
  get(gateId: string): PersistedGate | undefined;
74
- /** All persisted gate records (used for crash recovery). */
529
+ /** Atomically quarantines records owned by a prior runtime before exposure. */
530
+ beginRuntimeInstance(instanceId: string): void;
531
+ /** All persisted gate records (used for same-process recovery and Q12). */
75
532
  list(): PersistedGate[];
76
533
  }
77
534
 
78
535
  export class MemoryGateStore implements GateStore {
79
- private counters = new Map<RpcWorkflowStage, number>();
536
+ private counters = new Map<WorkflowStage, number>();
80
537
  private gates = new Map<string, PersistedGate>();
81
-
82
- nextSeq(stage: RpcWorkflowStage): number {
538
+ private runtimeInstanceId: string | undefined;
539
+ nextSeq(stage: WorkflowStage): number {
83
540
  const next = (this.counters.get(stage) ?? 0) + 1;
84
541
  this.counters.set(stage, next);
85
542
  return next;
@@ -91,21 +548,460 @@ export class MemoryGateStore implements GateStore {
91
548
  const r = this.gates.get(gateId);
92
549
  return r ? structuredClone(r) : undefined;
93
550
  }
551
+ beginRuntimeInstance(instanceId: string): void {
552
+ if (this.runtimeInstanceId === instanceId) return;
553
+ const priorInstanceId = this.runtimeInstanceId;
554
+ const now = new Date().toISOString();
555
+ for (const [gateId, record] of this.gates) {
556
+ if (record.ownerInstanceId !== priorInstanceId) continue;
557
+ if (record.status === "pending") {
558
+ this.gates.set(gateId, {
559
+ ...record,
560
+ status: "quarantined",
561
+ lifecycle: { state: "quarantined", reason: "orphaned_after_process_restart", quarantinedAt: now },
562
+ });
563
+ } else if (record.status === "accepted" && !record.advanced) {
564
+ this.gates.set(gateId, {
565
+ ...record,
566
+ status: "quarantined",
567
+ lifecycle: {
568
+ state: "quarantined",
569
+ reason: "accepted_unadvanced_after_process_restart",
570
+ quarantinedAt: now,
571
+ },
572
+ });
573
+ }
574
+ }
575
+ this.runtimeInstanceId = instanceId;
576
+ }
94
577
  list(): PersistedGate[] {
95
578
  return [...this.gates.values()].map(r => structuredClone(r));
96
579
  }
97
580
  }
98
581
 
99
582
  interface FileState {
100
- counters: Record<string, number>;
583
+ version: 1;
584
+ counters: Partial<Record<WorkflowStage, number>>;
101
585
  gates: Record<string, PersistedGate>;
586
+ runtimeInstanceId?: string;
587
+ }
588
+
589
+ const FILE_GATE_STORE_VERSION = 1;
590
+
591
+ function isObject(value: unknown): value is Record<string, unknown> {
592
+ return typeof value === "object" && value !== null && !Array.isArray(value);
593
+ }
594
+
595
+ function isNonEmptyString(value: unknown): value is string {
596
+ return typeof value === "string" && value.length > 0;
597
+ }
598
+
599
+ function isIsoDate(value: unknown): value is string {
600
+ return typeof value === "string" && Number.isFinite(Date.parse(value));
601
+ }
602
+
603
+ function invalidFileState(message: string): never {
604
+ throw new Error(`invalid gate store at ${message}`);
605
+ }
606
+
607
+ function migrateVersionlessV0SemanticDisposition(
608
+ value: unknown,
609
+ filePath: string,
610
+ ): PersistedSemanticDisposition | undefined {
611
+ if (value === undefined) return undefined;
612
+ if (value === "commit" || value === "resolve_without_commit") return value;
613
+ invalidFileState(filePath);
614
+ }
615
+
616
+ function migrateVersionlessV0ResolutionOrigin(value: unknown, filePath: string): PersistedResolutionOrigin | undefined {
617
+ if (value === undefined) return undefined;
618
+ if (!isObject(value)) invalidFileState(filePath);
619
+ if (value.kind === "telegram_notification" && isNonEmptyString(value.interactionActionId))
620
+ return { kind: "telegram_notification", interactionActionId: value.interactionActionId };
621
+ if (value.kind === "legacy_unknown") return { kind: "generic", channel: "other" };
622
+ if (value.kind !== "generic" || typeof value.channel !== "string") invalidFileState(filePath);
623
+ if (value.channel === "sdk" || value.channel === "other") return { kind: "generic", channel: value.channel };
624
+ if (value.channel === "rpc") return { kind: "generic", channel: "sdk" };
625
+ if (value.channel === "bridge") return { kind: "generic", channel: "other" };
626
+ invalidFileState(filePath);
627
+ }
628
+
629
+ function migrateVersionlessV0AckPolicy(value: unknown, filePath: string): PersistedAckPolicy | undefined {
630
+ if (value === undefined) return undefined;
631
+ if (!isObject(value)) invalidFileState(filePath);
632
+ if (
633
+ value.kind === "none" &&
634
+ (value.reason === "non_telegram" || value.reason === "semantic_noncommit" || value.reason === "legacy_unproven")
635
+ )
636
+ return { kind: "none", reason: value.reason };
637
+ if (
638
+ value.kind !== "telegram_selected_v1" ||
639
+ !isNonEmptyString(value.commitKey) ||
640
+ !isNonEmptyString(value.actionId) ||
641
+ !isIsoDate(value.updatedAt) ||
642
+ !(["pending", "attempt_started", "delivered", "failed", "unknown"] as const).includes(value.state as never)
643
+ )
644
+ invalidFileState(filePath);
645
+ if (value.outcome === undefined)
646
+ return {
647
+ kind: "telegram_selected_v1",
648
+ commitKey: value.commitKey,
649
+ actionId: value.actionId,
650
+ state: value.state as "pending" | "attempt_started" | "delivered" | "failed" | "unknown",
651
+ updatedAt: value.updatedAt,
652
+ };
653
+ if (!isObject(value.outcome)) invalidFileState(filePath);
654
+ if (
655
+ value.outcome.status === "delivered" &&
656
+ typeof value.outcome.messageId === "number" &&
657
+ Number.isSafeInteger(value.outcome.messageId)
658
+ )
659
+ return {
660
+ kind: "telegram_selected_v1",
661
+ commitKey: value.commitKey,
662
+ actionId: value.actionId,
663
+ state: value.state as "pending" | "attempt_started" | "delivered" | "failed" | "unknown",
664
+ outcome: { status: "delivered", messageId: value.outcome.messageId },
665
+ updatedAt: value.updatedAt,
666
+ };
667
+ if (
668
+ value.outcome.status === "failed" &&
669
+ (
670
+ [
671
+ "unsupported",
672
+ "no_participant",
673
+ "ambiguous_participant",
674
+ "route_missing",
675
+ "expired",
676
+ "cancelled",
677
+ "telegram_rejected",
678
+ "session_closed",
679
+ ] as const
680
+ ).includes(value.outcome.reason as never)
681
+ )
682
+ return {
683
+ kind: "telegram_selected_v1",
684
+ commitKey: value.commitKey,
685
+ actionId: value.actionId,
686
+ state: value.state as "pending" | "attempt_started" | "delivered" | "failed" | "unknown",
687
+ outcome: {
688
+ status: "failed",
689
+ reason: value.outcome.reason as
690
+ | "unsupported"
691
+ | "no_participant"
692
+ | "ambiguous_participant"
693
+ | "route_missing"
694
+ | "expired"
695
+ | "cancelled"
696
+ | "telegram_rejected"
697
+ | "session_closed",
698
+ },
699
+ updatedAt: value.updatedAt,
700
+ };
701
+ if (
702
+ value.outcome.status === "unknown" &&
703
+ (["transport_ambiguous", "origin_disconnected", "host_timeout", "shutdown"] as const).includes(
704
+ value.outcome.reason as never,
705
+ )
706
+ )
707
+ return {
708
+ kind: "telegram_selected_v1",
709
+ commitKey: value.commitKey,
710
+ actionId: value.actionId,
711
+ state: value.state as "pending" | "attempt_started" | "delivered" | "failed" | "unknown",
712
+ outcome: {
713
+ status: "unknown",
714
+ reason: value.outcome.reason as "transport_ambiguous" | "origin_disconnected" | "host_timeout" | "shutdown",
715
+ },
716
+ updatedAt: value.updatedAt,
717
+ };
718
+ invalidFileState(filePath);
719
+ }
720
+
721
+ function migrateVersionlessV0AcceptedRecord(legacy: Record<string, unknown>, filePath: string): PersistedGate {
722
+ if (typeof legacy.advanced !== "boolean") invalidFileState(filePath);
723
+ const semanticDisposition = migrateVersionlessV0SemanticDisposition(legacy.semanticDisposition, filePath);
724
+ const resolutionOrigin = migrateVersionlessV0ResolutionOrigin(legacy.resolutionOrigin, filePath);
725
+ const ackPolicy = migrateVersionlessV0AckPolicy(legacy.ackPolicy, filePath);
726
+ return {
727
+ ...(legacy as unknown as PersistedGate),
728
+ ...(semanticDisposition === undefined ? {} : { semanticDisposition }),
729
+ ...(resolutionOrigin === undefined ? {} : { resolutionOrigin }),
730
+ ...(ackPolicy === undefined ? {} : { ackPolicy }),
731
+ };
732
+ }
733
+
734
+ function migrateVersionlessV0(value: unknown, filePath: string): FileState {
735
+ if (!isObject(value) || Object.hasOwn(value, "version")) invalidFileState(filePath);
736
+ if (Object.keys(value).some(key => key !== "counters" && key !== "gates" && key !== "runtimeInstanceId"))
737
+ invalidFileState(filePath);
738
+ if (!isObject(value.counters) || !isObject(value.gates)) invalidFileState(filePath);
739
+ const gates: Record<string, PersistedGate> = {};
740
+ for (const [gateId, legacy] of Object.entries(value.gates)) {
741
+ if (!isObject(legacy) || !isObject(legacy.gate) || legacy.ownerInstanceId !== undefined)
742
+ invalidFileState(filePath);
743
+ const status = legacy.status ?? "pending";
744
+ if (status !== "pending" && status !== "accepted") invalidFileState(filePath);
745
+ if (status === "pending") {
746
+ gates[gateId] = {
747
+ gate: legacy.gate as unknown as WorkflowGate,
748
+ status: "quarantined",
749
+ ownerInstanceId: "legacy-v0",
750
+ advanced: false,
751
+ lifecycle: {
752
+ state: "quarantined",
753
+ reason: "orphaned_after_process_restart",
754
+ quarantinedAt: new Date().toISOString(),
755
+ },
756
+ };
757
+ continue;
758
+ }
759
+ const accepted = migrateVersionlessV0AcceptedRecord(legacy, filePath);
760
+ if (accepted.advanced) {
761
+ gates[gateId] = { ...accepted, ownerInstanceId: "legacy-v0" };
762
+ continue;
763
+ }
764
+ gates[gateId] = {
765
+ ...accepted,
766
+ status: "quarantined",
767
+ ownerInstanceId: "legacy-v0",
768
+ advanced: false,
769
+ lifecycle: {
770
+ state: "quarantined",
771
+ reason: "accepted_unadvanced_after_process_restart",
772
+ quarantinedAt: new Date().toISOString(),
773
+ },
774
+ };
775
+ }
776
+ const migrated: FileState = {
777
+ version: FILE_GATE_STORE_VERSION,
778
+ counters: value.counters as Partial<Record<WorkflowStage, number>>,
779
+ gates,
780
+ ...(value.runtimeInstanceId === undefined ? {} : { runtimeInstanceId: value.runtimeInstanceId as string }),
781
+ };
782
+ assertFileState(migrated, filePath);
783
+ return migrated;
784
+ }
785
+
786
+ function assertFileState(value: unknown, filePath: string): asserts value is FileState {
787
+ if (
788
+ !isObject(value) ||
789
+ value.version !== FILE_GATE_STORE_VERSION ||
790
+ !isObject(value.counters) ||
791
+ !isObject(value.gates)
792
+ )
793
+ invalidFileState(filePath);
794
+ for (const [stage, counter] of Object.entries(value.counters)) {
795
+ if (
796
+ !WORKFLOW_GATE_V1_STAGES.includes(stage as WorkflowStage) ||
797
+ typeof counter !== "number" ||
798
+ !Number.isSafeInteger(counter) ||
799
+ counter < 0
800
+ )
801
+ invalidFileState(filePath);
802
+ }
803
+ if (value.runtimeInstanceId !== undefined && !isNonEmptyString(value.runtimeInstanceId)) invalidFileState(filePath);
804
+ for (const [gateId, record] of Object.entries(value.gates))
805
+ assertPersistedGate(record, gateId, value.counters, filePath);
806
+ for (const [gateId, record] of Object.entries(value.gates)) {
807
+ if (
808
+ !isObject(record) ||
809
+ record.status !== "quarantined" ||
810
+ !isObject(record.lifecycle) ||
811
+ !isNonEmptyString(record.lifecycle.supersededByGateId)
812
+ )
813
+ continue;
814
+ if (
815
+ record.lifecycle.supersededByGateId === gateId ||
816
+ !Object.hasOwn(value.gates, record.lifecycle.supersededByGateId)
817
+ )
818
+ invalidFileState(filePath);
819
+ }
820
+ }
821
+
822
+ function assertPersistedGate(
823
+ value: unknown,
824
+ gateId: string,
825
+ counters: Record<string, unknown>,
826
+ filePath: string,
827
+ ): asserts value is PersistedGate {
828
+ if (
829
+ !isObject(value) ||
830
+ !isObject(value.gate) ||
831
+ value.gate.gate_id !== gateId ||
832
+ !isNonEmptyString(value.ownerInstanceId)
833
+ )
834
+ invalidFileState(filePath);
835
+ const gate = value.gate;
836
+ const stage = gate.stage as WorkflowStage;
837
+ const schema = gate.schema as WorkflowGate["schema"];
838
+ if (
839
+ gate.type !== "workflow_gate" ||
840
+ !isNonEmptyString(gate.gate_id) ||
841
+ !WORKFLOW_GATE_V1_STAGES.includes(stage) ||
842
+ !["question", "approval", "execution"].includes(gate.kind as string) ||
843
+ !isObject(gate.schema) ||
844
+ !isNonEmptyString(gate.schema_hash) ||
845
+ !isObject(gate.context) ||
846
+ !isIsoDate(gate.created_at) ||
847
+ gate.required !== true
848
+ )
849
+ invalidFileState(filePath);
850
+ if (gate.runtime_turn_id !== undefined && !isNonEmptyString(gate.runtime_turn_id)) invalidFileState(filePath);
851
+ const id = new RegExp(`^wg_[A-Za-z0-9]+_${gate.stage}_(\\d{6,})$`).exec(gate.gate_id);
852
+ if (
853
+ !id ||
854
+ typeof counters[stage] !== "number" ||
855
+ Number(id[1]) > counters[stage] ||
856
+ gate.schema_hash !== schemaHash(schema)
857
+ )
858
+ invalidFileState(filePath);
859
+ try {
860
+ compileGateSchema(schema);
861
+ } catch {
862
+ invalidFileState(filePath);
863
+ }
864
+ if (
865
+ gate.options !== undefined &&
866
+ (!Array.isArray(gate.options) ||
867
+ gate.options.some(option => !isObject(option) || !isNonEmptyString(option.label)))
868
+ )
869
+ invalidFileState(filePath);
870
+ if (value.status === "pending") {
871
+ if (
872
+ value.advanced !== false ||
873
+ value.terminalized !== undefined ||
874
+ value.terminalProof !== undefined ||
875
+ value.lifecycle !== undefined ||
876
+ value.resolution !== undefined ||
877
+ value.answer !== undefined ||
878
+ value.idempotencyKey !== undefined ||
879
+ value.responseHash !== undefined ||
880
+ value.semanticDisposition !== undefined ||
881
+ value.resolutionOrigin !== undefined ||
882
+ value.ackPolicy !== undefined
883
+ )
884
+ invalidFileState(filePath);
885
+ return;
886
+ }
887
+ if (value.status === "accepted") {
888
+ if (
889
+ typeof value.advanced !== "boolean" ||
890
+ (value.terminalized !== undefined && typeof value.terminalized !== "boolean") ||
891
+ (value.terminalProof !== undefined &&
892
+ value.terminalProof !== "retired" &&
893
+ value.terminalProof !== "already_terminal" &&
894
+ value.terminalProof !== "not_published") ||
895
+ (value.terminalized === true && value.terminalProof === undefined) ||
896
+ (value.terminalized !== true && value.terminalProof !== undefined) ||
897
+ !Object.hasOwn(value, "answer") ||
898
+ (value.idempotencyKey !== undefined && !isNonEmptyString(value.idempotencyKey)) ||
899
+ !isNonEmptyString(value.responseHash) ||
900
+ value.responseHash !== answerHashOf({ gate_id: gateId, answer: value.answer }) ||
901
+ !isObject(value.resolution) ||
902
+ value.resolution.gate_id !== gateId ||
903
+ value.resolution.status !== "accepted" ||
904
+ value.resolution.answer_hash !== answerHashOf(value.answer) ||
905
+ !isIsoDate(value.resolution.resolved_at) ||
906
+ value.resolution.error !== undefined ||
907
+ value.lifecycle !== undefined
908
+ )
909
+ invalidFileState(filePath);
910
+ return;
911
+ }
912
+ if (
913
+ value.status !== "quarantined" ||
914
+ value.advanced !== false ||
915
+ !isObject(value.lifecycle) ||
916
+ Object.keys(value.lifecycle).some(
917
+ key => key !== "state" && key !== "reason" && key !== "quarantinedAt" && key !== "supersededByGateId",
918
+ ) ||
919
+ value.lifecycle.state !== "quarantined" ||
920
+ ![
921
+ "orphaned_after_process_restart",
922
+ "accepted_unadvanced_after_process_restart",
923
+ "continuation_owner_lost",
924
+ "opened_without_continuation",
925
+ "finalization_failed",
926
+ "advance_failed",
927
+ ].includes(value.lifecycle.reason as string) ||
928
+ !isIsoDate(value.lifecycle.quarantinedAt) ||
929
+ (value.lifecycle.supersededByGateId !== undefined && !isNonEmptyString(value.lifecycle.supersededByGateId))
930
+ )
931
+ invalidFileState(filePath);
932
+ const hasAcceptedState =
933
+ Object.hasOwn(value, "answer") ||
934
+ value.terminalized !== undefined ||
935
+ value.terminalProof !== undefined ||
936
+ value.idempotencyKey !== undefined ||
937
+ value.responseHash !== undefined ||
938
+ value.resolution !== undefined ||
939
+ value.semanticDisposition !== undefined ||
940
+ value.resolutionOrigin !== undefined ||
941
+ value.ackPolicy !== undefined;
942
+ if (value.lifecycle.reason === "accepted_unadvanced_after_process_restart" || hasAcceptedState) {
943
+ if (
944
+ !Object.hasOwn(value, "answer") ||
945
+ (value.terminalized !== undefined && typeof value.terminalized !== "boolean") ||
946
+ (value.terminalProof !== undefined &&
947
+ value.terminalProof !== "retired" &&
948
+ value.terminalProof !== "already_terminal" &&
949
+ value.terminalProof !== "not_published") ||
950
+ (value.terminalized === true && value.terminalProof === undefined) ||
951
+ (value.terminalized !== true && value.terminalProof !== undefined) ||
952
+ (value.idempotencyKey !== undefined && !isNonEmptyString(value.idempotencyKey)) ||
953
+ !isNonEmptyString(value.responseHash) ||
954
+ value.responseHash !== answerHashOf({ gate_id: gateId, answer: value.answer }) ||
955
+ !isObject(value.resolution) ||
956
+ value.resolution.gate_id !== gateId ||
957
+ value.resolution.status !== "accepted" ||
958
+ value.resolution.answer_hash !== answerHashOf(value.answer) ||
959
+ !isIsoDate(value.resolution.resolved_at) ||
960
+ value.resolution.error !== undefined
961
+ )
962
+ invalidFileState(filePath);
963
+ return;
964
+ }
965
+ if (
966
+ value.lifecycle.reason === "accepted_unadvanced_after_process_restart" ||
967
+ value.lifecycle.reason === "finalization_failed" ||
968
+ value.lifecycle.reason === "advance_failed"
969
+ )
970
+ invalidFileState(filePath);
971
+ }
972
+
973
+ export function isUnsupportedWindowsDirectorySyncError(
974
+ error: unknown,
975
+ platform: NodeJS.Platform = process.platform,
976
+ ): boolean {
977
+ if (platform !== "win32") return false;
978
+ const code = (error as NodeJS.ErrnoException | undefined)?.code;
979
+ // Bun reports EPERM when fsyncSync is applied to a Windows directory handle.
980
+ return code === "EINVAL" || code === "ENOTSUP" || code === "EOPNOTSUPP" || code === "EPERM";
981
+ }
982
+
983
+ /** A write may have reached `rename` but not the directory fsync durability barrier. */
984
+ export class GateStoreWriteError extends Error {
985
+ constructor(
986
+ readonly certainty: "not_committed" | "uncertain",
987
+ cause: unknown,
988
+ ) {
989
+ super(`gate store write ${certainty}: ${cause instanceof Error ? cause.message : String(cause)}`);
990
+ this.name = "GateStoreWriteError";
991
+ }
102
992
  }
103
993
 
104
994
  /** Crash-durable JSON-file backed store. Writes the full state on every mutation. */
105
995
  export class FileGateStore implements GateStore {
106
996
  private state: FileState;
107
- constructor(private readonly filePath: string) {
108
- mkdirSync(path.dirname(filePath), { recursive: true });
997
+ private certaintyUnknown = false;
998
+ constructor(
999
+ private readonly filePath: string,
1000
+ private readonly sync: (fd: number) => void = fsyncSync,
1001
+ ) {
1002
+ // Load eagerly so a corrupt store fails closed at construction, but defer
1003
+ // directory creation to the first write so constructing a store under a
1004
+ // non-writable cwd (e.g. a session that never emits a gate) never throws.
109
1005
  this.state = this.load();
110
1006
  }
111
1007
  private load(): FileState {
@@ -113,14 +1009,26 @@ export class FileGateStore implements GateStore {
113
1009
  try {
114
1010
  raw = readFileSync(this.filePath, "utf8");
115
1011
  } catch (err) {
116
- if ((err as NodeJS.ErrnoException).code === "ENOENT") return { counters: {}, gates: {} };
1012
+ if ((err as NodeJS.ErrnoException).code === "ENOENT")
1013
+ return { version: FILE_GATE_STORE_VERSION, counters: {}, gates: {} };
117
1014
  throw err;
118
1015
  }
1016
+ let parsed: unknown;
119
1017
  try {
120
- return JSON.parse(raw) as FileState;
1018
+ parsed = JSON.parse(raw);
1019
+ if (isObject(parsed) && !Object.hasOwn(parsed, "version")) {
1020
+ const migrated = migrateVersionlessV0(parsed, this.filePath);
1021
+ // Persist the v1 envelope before beginRuntimeInstance can quarantine or
1022
+ // expose any record. This preserves all v0 records atomically.
1023
+ this.flushState(migrated);
1024
+ return migrated;
1025
+ }
1026
+ assertFileState(parsed, this.filePath);
1027
+ return parsed;
121
1028
  } catch (err) {
122
- // Fail closed: a corrupt state file must not be silently reset (that would
123
- // drop counters/gates and risk gate-id reuse). Quarantine + throw.
1029
+ if (err instanceof GateStoreWriteError) throw err;
1030
+ // Fail closed: invalid state must not be exposed or mutated because it can
1031
+ // drop counters/gates and risk gate-id reuse.
124
1032
  const quarantine = `${this.filePath}.corrupt-${Date.now()}`;
125
1033
  try {
126
1034
  renameSync(this.filePath, quarantine);
@@ -128,43 +1036,105 @@ export class FileGateStore implements GateStore {
128
1036
  /* best-effort quarantine */
129
1037
  }
130
1038
  throw new Error(
131
- `corrupt gate store at ${this.filePath} (quarantined to ${quarantine}): ${(err as Error).message}`,
1039
+ `corrupt gate store at ${this.filePath} (quarantined to ${quarantine}): ${err instanceof Error ? err.message : String(err)}`,
132
1040
  );
133
1041
  }
134
1042
  }
135
- private flush(): void {
136
- // Atomic write: serialize to a temp file, fsync, then rename over the target.
1043
+ private flushState(next: FileState): void {
1044
+ mkdirSync(path.dirname(this.filePath), { recursive: true });
137
1045
  const tmp = `${this.filePath}.tmp-${process.pid}-${Date.now()}`;
138
- const fd = openSync(tmp, "w");
1046
+ let renamed = false;
139
1047
  try {
140
- writeFileSync(fd, JSON.stringify(this.state, null, 2));
141
- fsyncSync(fd);
142
- } finally {
143
- closeSync(fd);
1048
+ const fd = openSync(tmp, "w");
1049
+ try {
1050
+ writeFileSync(fd, JSON.stringify(next, null, 2));
1051
+ this.sync(fd);
1052
+ } finally {
1053
+ closeSync(fd);
1054
+ }
1055
+ renameSync(tmp, this.filePath);
1056
+ renamed = true;
1057
+ const parentFd = openSync(path.dirname(this.filePath), "r");
1058
+ try {
1059
+ try {
1060
+ this.sync(parentFd);
1061
+ } catch (error) {
1062
+ if (!isUnsupportedWindowsDirectorySyncError(error)) throw error;
1063
+ }
1064
+ } finally {
1065
+ closeSync(parentFd);
1066
+ }
1067
+ } catch (error) {
1068
+ if (renamed) {
1069
+ this.certaintyUnknown = true;
1070
+ try {
1071
+ this.state = this.load();
1072
+ } catch {
1073
+ // The original uncertain error is the authority; later operations fail closed.
1074
+ }
1075
+ }
1076
+ throw new GateStoreWriteError(renamed ? "uncertain" : "not_committed", error);
144
1077
  }
145
- renameSync(tmp, this.filePath);
146
1078
  }
147
- nextSeq(stage: RpcWorkflowStage): number {
1079
+ private commit(next: FileState): void {
1080
+ this.flushState(next);
1081
+ this.state = next;
1082
+ }
1083
+ private reconcileCertainty(): void {
1084
+ if (!this.certaintyUnknown) return;
1085
+ this.state = this.load();
1086
+ this.certaintyUnknown = false;
1087
+ }
1088
+ nextSeq(stage: WorkflowStage): number {
1089
+ this.reconcileCertainty();
148
1090
  const next = (this.state.counters[stage] ?? 0) + 1;
149
- this.state.counters[stage] = next;
150
- this.flush();
1091
+ const candidate = structuredClone(this.state);
1092
+ candidate.counters[stage] = next;
1093
+ this.commit(candidate);
151
1094
  return next;
152
1095
  }
153
1096
  put(record: PersistedGate): void {
154
- this.state.gates[record.gate.gate_id] = record;
155
- this.flush();
1097
+ this.reconcileCertainty();
1098
+ const candidate = structuredClone(this.state);
1099
+ candidate.gates[record.gate.gate_id] = structuredClone(record);
1100
+ this.commit(candidate);
156
1101
  }
157
1102
  get(gateId: string): PersistedGate | undefined {
1103
+ this.reconcileCertainty();
158
1104
  const r = this.state.gates[gateId];
159
- return r ? (JSON.parse(JSON.stringify(r)) as PersistedGate) : undefined;
1105
+ return r ? structuredClone(r) : undefined;
1106
+ }
1107
+ beginRuntimeInstance(instanceId: string): void {
1108
+ this.reconcileCertainty();
1109
+ if (this.state.runtimeInstanceId === instanceId) return;
1110
+ const priorInstanceId = this.state.runtimeInstanceId;
1111
+ const next = structuredClone(this.state);
1112
+ const now = new Date().toISOString();
1113
+ for (const record of Object.values(next.gates)) {
1114
+ if (record.ownerInstanceId !== priorInstanceId) continue;
1115
+ if (record.status === "pending") {
1116
+ record.status = "quarantined";
1117
+ record.lifecycle = { state: "quarantined", reason: "orphaned_after_process_restart", quarantinedAt: now };
1118
+ } else if (record.status === "accepted" && !record.advanced) {
1119
+ record.status = "quarantined";
1120
+ record.lifecycle = {
1121
+ state: "quarantined",
1122
+ reason: "accepted_unadvanced_after_process_restart",
1123
+ quarantinedAt: now,
1124
+ };
1125
+ }
1126
+ }
1127
+ next.runtimeInstanceId = instanceId;
1128
+ this.commit(next);
160
1129
  }
161
1130
  list(): PersistedGate[] {
162
- return Object.values(this.state.gates).map(r => JSON.parse(JSON.stringify(r)) as PersistedGate);
1131
+ this.reconcileCertainty();
1132
+ return Object.values(this.state.gates).map(r => structuredClone(r));
163
1133
  }
164
1134
  }
165
1135
 
166
1136
  export type GateAuditEvent =
167
- | { event: "gate_emitted"; gate_id: string; stage: RpcWorkflowStage; kind: RpcWorkflowGateKind }
1137
+ | { event: "gate_emitted"; gate_id: string; stage: WorkflowStage; kind: WorkflowGateKind }
168
1138
  | { event: "gate_response_accepted"; gate_id: string; answer_hash: string }
169
1139
  | { event: "gate_response_rejected"; gate_id: string; answer_hash: string }
170
1140
  | { event: "gate_response_idempotent_replay"; gate_id: string }
@@ -175,31 +1145,62 @@ export type GateAuditEvent =
175
1145
 
176
1146
  export interface BrokerHooks {
177
1147
  /** Called once when a pending gate has been persisted and should be emitted. */
178
- emit?(gate: RpcWorkflowGate): void;
1148
+ emit?(gate: WorkflowGate): void;
179
1149
  /**
180
1150
  * Invoked to advance the workflow after an accepted resolution is durably
181
1151
  * committed. MUST be idempotent keyed by `gate.gate_id`: `recover()` replays
182
1152
  * it for any gate left `accepted` but not `advanced` by a crash.
183
1153
  */
184
- advance?(gate: RpcWorkflowGate, answer: unknown): void | Promise<void>;
185
- /** Runs after durable acceptance and before advance, including crash recovery. */
1154
+ advance?(gate: WorkflowGate, answer: unknown): void | Promise<void>;
1155
+ /** Runs after durable acceptance and before presentation terminalization, including crash recovery. */
186
1156
  finalizeAccepted?(record: PersistedGate): Promise<void>;
187
-
1157
+ /**
1158
+ * Terminalizes the exact presentation before `advance` can run and returns
1159
+ * proof for the durable record. `not_published` explicitly proves that no
1160
+ * presentation existed. On failure it MUST revoke authority or throw.
1161
+ */
1162
+ terminalizeAccepted?(record: PersistedGate): WorkflowGateTerminalProof | Promise<WorkflowGateTerminalProof>;
1163
+ /** Runs only after a successful advance has been durably marked advanced. */
1164
+ completeAccepted?(record: PersistedGate): void | Promise<void>;
188
1165
  /** Append-only audit sink. */
189
1166
  audit?(event: GateAuditEvent): void;
190
1167
  }
191
1168
 
1169
+ /** Live in-process continuation authority for one emitted gate. */
1170
+ export interface GateContinuation {
1171
+ activate(gate: WorkflowGate): void;
1172
+ isLive(gateId: string): boolean;
1173
+ release?(gateId: string): void;
1174
+ /** Explicitly declares that this direct continuation owns no presentation. */
1175
+ terminalProof?: "not_published";
1176
+ }
1177
+
192
1178
  export interface OpenGateInput {
193
- stage: RpcWorkflowStage;
194
- kind: RpcWorkflowGateKind;
195
- schema: RpcWorkflowGate["schema"];
196
- options?: RpcWorkflowGateOption[];
197
- context?: RpcWorkflowGateContext;
1179
+ stage: WorkflowStage;
1180
+ kind: WorkflowGateKind;
1181
+ schema: WorkflowGate["schema"];
1182
+ options?: WorkflowGateOption[];
1183
+ context?: WorkflowGateContext;
1184
+ /** Optional diagnostic gate replaced by this newly persisted gate. */
1185
+ supersedesGateId?: string;
1186
+ /** Optional immutable runtime turn captured by the emitter before broker persistence. */
1187
+ runtimeTurnId?: string;
198
1188
  }
199
1189
 
1190
+ /** Durable resolution state used to safely replay direct control after presentation retirement. */
1191
+ export type WorkflowGateCompletedResolutionLookup =
1192
+ | { kind: "none" }
1193
+ | { kind: "completed"; resolution: WorkflowGateResolution }
1194
+ | { kind: "accepted_incomplete" };
1195
+
200
1196
  export class WorkflowGateBrokerError extends Error {
201
1197
  constructor(
202
- readonly code: "unknown_gate" | "already_resolved" | "idempotency_conflict" | "invalid_workflow_stage",
1198
+ readonly code:
1199
+ | "unknown_gate"
1200
+ | "already_resolved"
1201
+ | "idempotency_conflict"
1202
+ | "invalid_workflow_stage"
1203
+ | "invalid_runtime_turn",
203
1204
  message: string,
204
1205
  ) {
205
1206
  super(message);
@@ -210,6 +1211,8 @@ export class WorkflowGateBrokerError extends Error {
210
1211
  export class WorkflowGateBroker {
211
1212
  private readonly recovering = new Set<string>();
212
1213
  private readonly gateLocks = new Map<string, Promise<void>>();
1214
+ private readonly continuations = new Map<string, GateContinuation>();
1215
+ readonly #terminalProofs = new Map<string, WorkflowGateTerminalProof>();
213
1216
 
214
1217
  private async withGateLock<T>(gateId: string, operation: () => Promise<T>): Promise<T> {
215
1218
  const previous = this.gateLocks.get(gateId) ?? Promise.resolve();
@@ -229,14 +1232,17 @@ export class WorkflowGateBroker {
229
1232
  private readonly runId: string,
230
1233
  private readonly store: GateStore,
231
1234
  private readonly hooks: BrokerHooks = {},
232
- ) {}
1235
+ private readonly instanceId = crypto.randomUUID(),
1236
+ ) {
1237
+ this.store.beginRuntimeInstance(this.instanceId);
1238
+ }
233
1239
 
234
1240
  classifyDisposition(gateId: string, answer: unknown): PersistedSemanticDisposition {
235
1241
  const record = this.store.get(gateId);
236
1242
  if (!record) throw new WorkflowGateBrokerError("unknown_gate", `no pending gate ${gateId}`);
237
1243
  return classifyAskGateDisposition(record.gate, answer);
238
1244
  }
239
- validationError(gateId: string, keyword: string, message: string): RpcWorkflowGateValidationError {
1245
+ validationError(gateId: string, keyword: string, message: string): WorkflowGateValidationError {
240
1246
  const record = this.store.get(gateId);
241
1247
  return {
242
1248
  code: "invalid_workflow_gate_answer",
@@ -253,23 +1259,178 @@ export class WorkflowGateBroker {
253
1259
  this.store.put({ ...record, ackPolicy });
254
1260
  }
255
1261
 
1262
+ lookupCompletedResolution(response: WorkflowGateResponse): WorkflowGateCompletedResolutionLookup {
1263
+ const record = this.store.get(response.gate_id);
1264
+ if (!record) return { kind: "none" };
1265
+ const responseHash = answerHashOf({ gate_id: response.gate_id, answer: response.answer });
1266
+ if (record.status !== "accepted" && record.status !== "quarantined") return { kind: "none" };
1267
+ if (record.responseHash === undefined) return { kind: "none" };
1268
+ const sameBody = record.responseHash === responseHash;
1269
+ const sameKey = record.idempotencyKey === response.idempotency_key;
1270
+ if (response.idempotency_key !== undefined && sameKey && !sameBody)
1271
+ throw new WorkflowGateBrokerError(
1272
+ "idempotency_conflict",
1273
+ `idempotency_conflict: gate ${response.gate_id} resolved with a different body`,
1274
+ );
1275
+ if (response.idempotency_key !== undefined && sameKey && sameBody) {
1276
+ if (record.terminalized === true && record.advanced === true && record.resolution)
1277
+ return { kind: "completed", resolution: record.resolution };
1278
+ return { kind: "accepted_incomplete" };
1279
+ }
1280
+ throw new WorkflowGateBrokerError("already_resolved", `already_resolved: gate ${response.gate_id}`);
1281
+ }
1282
+
1283
+ async #terminalize(record: PersistedGate): Promise<void> {
1284
+ const proof = this.#terminalProofs.get(record.gate.gate_id) ?? (await this.hooks.terminalizeAccepted?.(record));
1285
+ this.#terminalProofs.delete(record.gate.gate_id);
1286
+ if (proof !== "retired" && proof !== "already_terminal" && proof !== "not_published")
1287
+ throw new Error(`workflow gate ${record.gate.gate_id} has no terminalization proof`);
1288
+ const terminalized = this.store.get(record.gate.gate_id);
1289
+ if (terminalized?.status !== "accepted" || terminalized.advanced)
1290
+ throw new WorkflowGateBrokerError(
1291
+ "unknown_gate",
1292
+ `accepted gate ${record.gate.gate_id} disappeared before advance`,
1293
+ );
1294
+ this.store.put({ ...terminalized, terminalized: true, terminalProof: proof });
1295
+ }
1296
+
256
1297
  private runShort(): string {
257
1298
  return this.runId.replace(/[^a-zA-Z0-9]/g, "").slice(-8) || "run";
258
1299
  }
259
1300
 
1301
+ private hasLiveContinuation(gateId: string): boolean {
1302
+ return this.continuations.get(gateId)?.isLive(gateId) === true;
1303
+ }
1304
+
1305
+ hasRecoverableAcceptedGate(): boolean {
1306
+ return this.store
1307
+ .list()
1308
+ .some(
1309
+ record =>
1310
+ record.status === "accepted" &&
1311
+ !record.advanced &&
1312
+ record.ownerInstanceId === this.instanceId &&
1313
+ this.hasLiveContinuation(record.gate.gate_id),
1314
+ );
1315
+ }
1316
+ prepareTerminalization(gateId: string, proof: WorkflowGateTerminalProof): boolean {
1317
+ const record = this.store.get(gateId);
1318
+ if (
1319
+ record?.status !== "pending" ||
1320
+ record.ownerInstanceId !== this.instanceId ||
1321
+ !this.hasLiveContinuation(gateId)
1322
+ )
1323
+ return false;
1324
+ this.#terminalProofs.set(gateId, proof);
1325
+ return true;
1326
+ }
1327
+ clearPreparedTerminalization(gateId: string): void {
1328
+ this.#terminalProofs.delete(gateId);
1329
+ }
1330
+
1331
+ /**
1332
+ * Fences a gate after an uncertain control outcome by deliberately releasing
1333
+ * this runtime's continuation authority. The durable diagnostic is retained
1334
+ * for recovery; it is never republished as a pending gate.
1335
+ */
1336
+ quarantineGate(gateId: string): void {
1337
+ this.loseContinuation(gateId);
1338
+ }
1339
+
1340
+ /** Revoke every live continuation, including accepted-but-unadvanced recovery authority. */
1341
+ fenceContinuations(): void {
1342
+ for (const gateId of [...this.continuations.keys()]) this.loseContinuation(gateId);
1343
+ }
1344
+
1345
+ /** Fence a cancelled/lost continuation before it can be exposed or advanced. */
1346
+ loseContinuation(gateId: string): void {
1347
+ const continuation = this.continuations.get(gateId);
1348
+ continuation?.release?.(gateId);
1349
+ this.continuations.delete(gateId);
1350
+ this.#terminalProofs.delete(gateId);
1351
+ const record = this.store.get(gateId);
1352
+ if (
1353
+ record?.ownerInstanceId !== this.instanceId ||
1354
+ record.status === "quarantined" ||
1355
+ (record.status === "accepted" && record.advanced)
1356
+ )
1357
+ return;
1358
+ this.store.put({
1359
+ ...record,
1360
+ status: "quarantined",
1361
+ advanced: false,
1362
+ lifecycle: {
1363
+ state: "quarantined",
1364
+ reason: "continuation_owner_lost",
1365
+ quarantinedAt: new Date().toISOString(),
1366
+ },
1367
+ });
1368
+ }
1369
+
1370
+ listPendingGates(): WorkflowGate[] {
1371
+ return this.store
1372
+ .list()
1373
+ .filter(
1374
+ record =>
1375
+ record.status === "pending" &&
1376
+ record.ownerInstanceId === this.instanceId &&
1377
+ this.hasLiveContinuation(record.gate.gate_id),
1378
+ )
1379
+ .sort(compareGates)
1380
+ .map(record => record.gate);
1381
+ }
1382
+
1383
+ listGateDiagnostics(): WorkflowGateDiagnostic[] {
1384
+ return this.store
1385
+ .list()
1386
+ .filter(
1387
+ (
1388
+ record,
1389
+ ): record is PersistedGate & { status: "quarantined"; lifecycle: WorkflowGateDiagnostic["lifecycle"] } =>
1390
+ record.status === "quarantined" && record.lifecycle !== undefined,
1391
+ )
1392
+ .sort(
1393
+ (left, right) =>
1394
+ left.lifecycle.quarantinedAt.localeCompare(right.lifecycle.quarantinedAt) ||
1395
+ left.gate.gate_id.localeCompare(right.gate.gate_id),
1396
+ )
1397
+ .map(record => ({
1398
+ ...record.gate,
1399
+ id: `diagnostic:${record.gate.gate_id}`,
1400
+ tag: "quarantined",
1401
+ lifecycle: record.lifecycle,
1402
+ }));
1403
+ }
1404
+
1405
+ listWorkflowGateQueryRecords(): WorkflowGateQueryRecord[] {
1406
+ const pending: WorkflowGateQueryRecord[] = this.store
1407
+ .list()
1408
+ .filter(
1409
+ record =>
1410
+ record.status === "pending" &&
1411
+ record.ownerInstanceId === this.instanceId &&
1412
+ this.hasLiveContinuation(record.gate.gate_id),
1413
+ )
1414
+ .sort(compareGates)
1415
+ .map(record => ({ ...record.gate, id: `pending:${record.gate.gate_id}`, tag: "pending" }));
1416
+ return [...pending, ...this.listGateDiagnostics()];
1417
+ }
1418
+
260
1419
  /** Open and emit a gate. The pending record is persisted BEFORE emission. */
261
- openGate(input: OpenGateInput): RpcWorkflowGate {
262
- if (RESERVED_WORKFLOW_STAGES.includes(input.stage) || !V1_STAGES.includes(input.stage)) {
1420
+ openGate(input: OpenGateInput, continuation?: GateContinuation): WorkflowGate {
1421
+ if (RESERVED_WORKFLOW_STAGES.includes(input.stage) || !WORKFLOW_GATE_V1_STAGES.includes(input.stage)) {
263
1422
  throw new WorkflowGateBrokerError(
264
1423
  "invalid_workflow_stage",
265
1424
  `stage "${input.stage}" is not a v1 workflow stage`,
266
1425
  );
267
1426
  }
1427
+ if (input.runtimeTurnId !== undefined && !isNonEmptyString(input.runtimeTurnId))
1428
+ throw new WorkflowGateBrokerError("invalid_runtime_turn", "runtime turn id must be a nonempty string");
268
1429
  // Asserts schema shape (throws WorkflowGateSchemaError on unsupported keywords).
269
1430
  compileGateSchema(input.schema);
270
1431
  const seq = this.store.nextSeq(input.stage).toString().padStart(6, "0");
271
1432
  const gateId = `wg_${this.runShort()}_${input.stage}_${seq}`;
272
- const gate: RpcWorkflowGate = {
1433
+ const gate: WorkflowGate = {
273
1434
  type: "workflow_gate",
274
1435
  gate_id: gateId,
275
1436
  stage: input.stage,
@@ -280,9 +1441,32 @@ export class WorkflowGateBroker {
280
1441
  context: input.context ?? {},
281
1442
  created_at: new Date().toISOString(),
282
1443
  required: true,
1444
+ ...(input.runtimeTurnId === undefined ? {} : { runtime_turn_id: input.runtimeTurnId }),
283
1445
  };
284
- // Persist pending BEFORE emit so a crash never loses an emitted gate.
285
- this.store.put({ gate, status: "pending", advanced: false });
1446
+ if (!continuation) {
1447
+ this.store.put({
1448
+ gate,
1449
+ status: "quarantined",
1450
+ ownerInstanceId: this.instanceId,
1451
+ advanced: false,
1452
+ lifecycle: {
1453
+ state: "quarantined",
1454
+ reason: "opened_without_continuation",
1455
+ quarantinedAt: new Date().toISOString(),
1456
+ },
1457
+ });
1458
+ return gate;
1459
+ }
1460
+ this.store.put({ gate, status: "pending", ownerInstanceId: this.instanceId, advanced: false });
1461
+ continuation.activate(gate);
1462
+ if (continuation.terminalProof === "not_published") this.#terminalProofs.set(gateId, "not_published");
1463
+ this.continuations.set(gateId, continuation);
1464
+ if (input.supersedesGateId) {
1465
+ const superseded = this.store.get(input.supersedesGateId);
1466
+ if (superseded?.status === "quarantined" && superseded.lifecycle) {
1467
+ this.store.put({ ...superseded, lifecycle: { ...superseded.lifecycle, supersededByGateId: gateId } });
1468
+ }
1469
+ }
286
1470
  this.hooks.emit?.(gate);
287
1471
  this.hooks.audit?.({ event: "gate_emitted", gate_id: gateId, stage: gate.stage, kind: gate.kind });
288
1472
  return gate;
@@ -290,33 +1474,41 @@ export class WorkflowGateBroker {
290
1474
 
291
1475
  /**
292
1476
  * Resolve a gate with an answer. Validates against the advertised schema.
293
- * On success the resolution is persisted BEFORE `advance` is invoked exactly
294
- * once. Invalid answers leave the gate pending (per #315 acceptance).
1477
+ * Accepted answers are persisted first, then their presentation is terminalized,
1478
+ * then the workflow advances and commits `advanced:true` exactly once. Invalid
1479
+ * answers leave the gate pending (per #315 acceptance).
295
1480
  */
296
- async resolve(
297
- response: RpcWorkflowGateResponse,
298
- options: GateResolutionOptions = {},
299
- ): Promise<RpcWorkflowGateResolution> {
300
- return this.withGateLock(response.gate_id, () => this.resolveUnlocked(response, options));
1481
+ async resolve(response: WorkflowGateResponse, options: GateResolutionOptions = {}): Promise<WorkflowGateResolution> {
1482
+ try {
1483
+ return await this.withGateLock(response.gate_id, () => this.resolveUnlocked(response, options));
1484
+ } catch (error) {
1485
+ if (error instanceof GateStoreWriteError && error.certainty === "uncertain") {
1486
+ try {
1487
+ this.quarantineGate(response.gate_id);
1488
+ } catch {
1489
+ // Continuation authority was still released; preserve the uncertain write error.
1490
+ }
1491
+ }
1492
+ throw error;
1493
+ }
301
1494
  }
302
1495
 
303
1496
  private async resolveUnlocked(
304
- response: RpcWorkflowGateResponse,
1497
+ response: WorkflowGateResponse,
305
1498
  options: GateResolutionOptions = {},
306
- ): Promise<RpcWorkflowGateResolution> {
1499
+ ): Promise<WorkflowGateResolution> {
307
1500
  const record = this.store.get(response.gate_id);
308
- if (!record) {
1501
+ if (!record || record.status === "quarantined") {
309
1502
  this.hooks.audit?.({ event: "gate_response_unknown_gate", gate_id: response.gate_id });
310
- throw new WorkflowGateBrokerError("unknown_gate", `no pending gate ${response.gate_id}`);
1503
+ throw new WorkflowGateBrokerError("unknown_gate", `no live pending gate ${response.gate_id}`);
311
1504
  }
312
1505
  const responseHash = answerHashOf({ gate_id: response.gate_id, answer: response.answer });
313
-
314
1506
  if (record.status === "accepted") {
315
1507
  const sameBody = record.responseHash === responseHash;
316
1508
  const sameKey = record.idempotencyKey === response.idempotency_key;
317
1509
  if (response.idempotency_key !== undefined && sameKey && sameBody) {
318
1510
  this.hooks.audit?.({ event: "gate_response_idempotent_replay", gate_id: response.gate_id });
319
- return record.resolution as RpcWorkflowGateResolution;
1511
+ return record.resolution as WorkflowGateResolution;
320
1512
  }
321
1513
  if (response.idempotency_key !== undefined && sameKey && !sameBody) {
322
1514
  this.hooks.audit?.({ event: "gate_response_idempotency_conflict", gate_id: response.gate_id });
@@ -328,6 +1520,10 @@ export class WorkflowGateBroker {
328
1520
  this.hooks.audit?.({ event: "gate_response_already_resolved", gate_id: response.gate_id });
329
1521
  throw new WorkflowGateBrokerError("already_resolved", `already_resolved: gate ${response.gate_id}`);
330
1522
  }
1523
+ if (record.ownerInstanceId !== this.instanceId || !this.hasLiveContinuation(response.gate_id)) {
1524
+ this.hooks.audit?.({ event: "gate_response_unknown_gate", gate_id: response.gate_id });
1525
+ throw new WorkflowGateBrokerError("unknown_gate", `no live pending gate ${response.gate_id}`);
1526
+ }
331
1527
 
332
1528
  const compiled = compileGateSchema(record.gate.schema);
333
1529
  const validationError = validateGateAnswer(compiled, response.gate_id, response.answer);
@@ -346,12 +1542,12 @@ export class WorkflowGateBroker {
346
1542
 
347
1543
  const semanticDisposition =
348
1544
  options.semanticDisposition ?? classifyAskGateDisposition(record.gate, response.answer);
349
- const resolutionOrigin = options.resolutionOrigin ?? { kind: "generic", channel: "rpc" as const };
1545
+ const resolutionOrigin = options.resolutionOrigin ?? { kind: "generic", channel: "sdk" as const };
350
1546
  const ackPolicy =
351
1547
  options.ackPolicy ??
352
1548
  ({ kind: "none", reason: semanticDisposition === "commit" ? "non_telegram" : "semantic_noncommit" } as const);
353
1549
 
354
- const resolution: RpcWorkflowGateResolution = {
1550
+ const resolution: WorkflowGateResolution = {
355
1551
  gate_id: response.gate_id,
356
1552
  status: "accepted",
357
1553
  answer_hash: answerHash,
@@ -363,11 +1559,13 @@ export class WorkflowGateBroker {
363
1559
  this.store.put({
364
1560
  gate: record.gate,
365
1561
  status: "accepted",
1562
+ ownerInstanceId: record.ownerInstanceId,
366
1563
  idempotencyKey: response.idempotency_key,
367
1564
  responseHash,
368
1565
  answer: response.answer,
369
1566
  resolution,
370
1567
  advanced: false,
1568
+ terminalized: false,
371
1569
  semanticDisposition,
372
1570
  resolutionOrigin,
373
1571
  ackPolicy,
@@ -379,19 +1577,32 @@ export class WorkflowGateBroker {
379
1577
  if (finalized?.status !== "accepted") {
380
1578
  throw new WorkflowGateBrokerError(
381
1579
  "unknown_gate",
382
- `accepted gate ${response.gate_id} disappeared before advance`,
1580
+ `accepted gate ${response.gate_id} disappeared before terminalization`,
383
1581
  );
384
1582
  }
385
1583
  if (finalized.advanced) return finalized.resolution ?? resolution;
386
- await this.hooks.advance?.(finalized.gate, finalized.answer);
387
- const latest = this.store.get(response.gate_id);
388
- if (latest?.status !== "accepted") {
1584
+ if (!finalized.terminalized) await this.#terminalize(finalized);
1585
+ const terminalized = this.store.get(response.gate_id);
1586
+ if (terminalized?.status !== "accepted" || terminalized.advanced) {
389
1587
  throw new WorkflowGateBrokerError(
390
1588
  "unknown_gate",
391
- `accepted gate ${response.gate_id} disappeared after advance`,
1589
+ `accepted gate ${response.gate_id} disappeared before advance`,
392
1590
  );
393
1591
  }
1592
+ if (!this.hooks.advance || !this.hasLiveContinuation(response.gate_id)) {
1593
+ throw new WorkflowGateBrokerError("unknown_gate", `no live continuation for gate ${response.gate_id}`);
1594
+ }
1595
+ await this.hooks.advance(terminalized.gate, terminalized.answer);
1596
+ const latest = this.store.get(response.gate_id);
1597
+ if (latest?.status !== "accepted" || !this.hasLiveContinuation(response.gate_id))
1598
+ throw new WorkflowGateBrokerError(
1599
+ "unknown_gate",
1600
+ `accepted gate ${response.gate_id} lost its continuation before advance completed`,
1601
+ );
394
1602
  this.store.put({ ...latest, advanced: true });
1603
+ await this.hooks.completeAccepted?.(this.store.get(response.gate_id) as PersistedGate);
1604
+ this.continuations.get(response.gate_id)?.release?.(response.gate_id);
1605
+ this.continuations.delete(response.gate_id);
395
1606
  return resolution;
396
1607
  }
397
1608
 
@@ -404,7 +1615,14 @@ export class WorkflowGateBroker {
404
1615
  async recover(): Promise<string[]> {
405
1616
  const recovered: string[] = [];
406
1617
  for (const listed of this.store.list()) {
407
- if (listed.status !== "accepted" || listed.advanced || this.recovering.has(listed.gate.gate_id)) continue;
1618
+ if (
1619
+ listed.status !== "accepted" ||
1620
+ listed.advanced ||
1621
+ listed.ownerInstanceId !== this.instanceId ||
1622
+ !this.hasLiveContinuation(listed.gate.gate_id) ||
1623
+ this.recovering.has(listed.gate.gate_id)
1624
+ )
1625
+ continue;
408
1626
  this.recovering.add(listed.gate.gate_id);
409
1627
  try {
410
1628
  await this.withGateLock(listed.gate.gate_id, async () => {
@@ -412,11 +1630,29 @@ export class WorkflowGateBroker {
412
1630
  if (rec?.status !== "accepted" || rec.advanced) return;
413
1631
  await this.hooks.finalizeAccepted?.(rec);
414
1632
  const finalized = this.store.get(listed.gate.gate_id);
415
- if (finalized?.status !== "accepted" || finalized.advanced) return;
416
- await this.hooks.advance?.(finalized.gate, finalized.answer);
1633
+ if (
1634
+ finalized?.status !== "accepted" ||
1635
+ finalized.advanced ||
1636
+ !this.hasLiveContinuation(listed.gate.gate_id)
1637
+ )
1638
+ return;
1639
+ if (!finalized.terminalized) await this.#terminalize(finalized);
1640
+ const terminalized = this.store.get(listed.gate.gate_id);
1641
+ if (
1642
+ terminalized?.status !== "accepted" ||
1643
+ terminalized.advanced ||
1644
+ !this.hooks.advance ||
1645
+ !this.hasLiveContinuation(listed.gate.gate_id)
1646
+ )
1647
+ return;
1648
+ await this.hooks.advance(terminalized.gate, terminalized.answer);
417
1649
  const latest = this.store.get(listed.gate.gate_id);
418
- if (latest?.status !== "accepted" || latest.advanced) return;
1650
+ if (latest?.status !== "accepted" || latest.advanced || !this.hasLiveContinuation(listed.gate.gate_id))
1651
+ return;
419
1652
  this.store.put({ ...latest, advanced: true });
1653
+ await this.hooks.completeAccepted?.(this.store.get(latest.gate.gate_id) as PersistedGate);
1654
+ this.continuations.get(latest.gate.gate_id)?.release?.(latest.gate.gate_id);
1655
+ this.continuations.delete(latest.gate.gate_id);
420
1656
  this.hooks.audit?.({ event: "gate_advance_recovered", gate_id: latest.gate.gate_id });
421
1657
  recovered.push(latest.gate.gate_id);
422
1658
  });
@@ -432,3 +1668,9 @@ export class WorkflowGateBroker {
432
1668
  return canonicalJson(value);
433
1669
  }
434
1670
  }
1671
+
1672
+ function compareGates(left: PersistedGate, right: PersistedGate): number {
1673
+ return (
1674
+ left.gate.created_at.localeCompare(right.gate.created_at) || left.gate.gate_id.localeCompare(right.gate.gate_id)
1675
+ );
1676
+ }