@gajae-code/coding-agent 0.10.2 → 0.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (476) hide show
  1. package/CHANGELOG.md +58 -2
  2. package/dist/types/append-only-mode.d.ts +1 -1
  3. package/dist/types/async/job-manager.d.ts +46 -7
  4. package/dist/types/cli/args.d.ts +4 -5
  5. package/dist/types/cli/daemon-cli.d.ts +12 -1
  6. package/dist/types/cli/notify-cli.d.ts +21 -1
  7. package/dist/types/cli.d.ts +3 -0
  8. package/dist/types/commands/daemon.d.ts +39 -0
  9. package/dist/types/commands/launch.d.ts +3 -0
  10. package/dist/types/commands/notify.d.ts +28 -1
  11. package/dist/types/commands/sdk.d.ts +33 -0
  12. package/dist/types/config/atomic-yaml-patch.d.ts +85 -0
  13. package/dist/types/config/model-profile-activation.d.ts +35 -15
  14. package/dist/types/config/model-profiles.d.ts +11 -5
  15. package/dist/types/config/model-registry.d.ts +3 -3
  16. package/dist/types/config/model-resolver.d.ts +39 -6
  17. package/dist/types/config/model-selector-value.d.ts +17 -0
  18. package/dist/types/config/models-config-schema.d.ts +10 -6
  19. package/dist/types/config/settings-schema.d.ts +133 -6
  20. package/dist/types/config/settings.d.ts +63 -35
  21. package/dist/types/coordinator-mcp/model-preset.d.ts +7 -6
  22. package/dist/types/coordinator-mcp/server.d.ts +6 -49
  23. package/dist/types/daemon/builtin.d.ts +6 -5
  24. package/dist/types/daemon/control-types.d.ts +1 -1
  25. package/dist/types/discovery/mcp-json.d.ts +12 -1
  26. package/dist/types/extensibility/custom-tools/types.d.ts +1 -1
  27. package/dist/types/extensibility/extensions/compact-handler.d.ts +4 -2
  28. package/dist/types/extensibility/extensions/get-commands-handler.d.ts +2 -2
  29. package/dist/types/extensibility/extensions/loader.d.ts +10 -1
  30. package/dist/types/extensibility/extensions/runner.d.ts +3 -3
  31. package/dist/types/extensibility/extensions/types.d.ts +141 -16
  32. package/dist/types/extensibility/hooks/types.d.ts +1 -1
  33. package/dist/types/gjc-runtime/launch-tmux.d.ts +3 -2
  34. package/dist/types/gjc-runtime/psmux-detect.d.ts +3 -0
  35. package/dist/types/gjc-runtime/session-state-sidecar.d.ts +3 -0
  36. package/dist/types/gjc-runtime/team-runtime.d.ts +3 -4
  37. package/dist/types/gjc-runtime/tmux-owner-isolation-cli.d.ts +13 -0
  38. package/dist/types/gjc-runtime/tmux-sessions.d.ts +4 -1
  39. package/dist/types/gjc-runtime/ultragoal-receipt-freshness.d.ts +11 -0
  40. package/dist/types/gjc-runtime/windows-powershell-command.d.ts +9 -0
  41. package/dist/types/harness-control-plane/operate.d.ts +5 -5
  42. package/dist/types/harness-control-plane/owner.d.ts +18 -4
  43. package/dist/types/harness-control-plane/receipts.d.ts +0 -1
  44. package/dist/types/harness-control-plane/sdk-transport.d.ts +43 -0
  45. package/dist/types/harness-control-plane/session-transport.d.ts +48 -0
  46. package/dist/types/harness-control-plane/types.d.ts +3 -4
  47. package/dist/types/lsp/index.d.ts +1 -1
  48. package/dist/types/main.d.ts +32 -38
  49. package/dist/types/modes/acp/acp-agent.d.ts +224 -53
  50. package/dist/types/modes/acp/acp-client-bridge.d.ts +1 -0
  51. package/dist/types/modes/acp/acp-mode.d.ts +6 -15
  52. package/dist/types/modes/acp/permission-mode.d.ts +4 -0
  53. package/dist/types/modes/acp/startup-options.d.ts +6 -0
  54. package/dist/types/modes/components/agent-dashboard.d.ts +3 -0
  55. package/dist/types/modes/components/model-selector.d.ts +1 -0
  56. package/dist/types/modes/components/notifications-settings-editor.d.ts +135 -0
  57. package/dist/types/modes/components/settings-selector.d.ts +6 -4
  58. package/dist/types/modes/components/welcome.d.ts +1 -1
  59. package/dist/types/modes/controllers/command-controller.d.ts +2 -2
  60. package/dist/types/modes/controllers/extension-ui-controller.d.ts +1 -0
  61. package/dist/types/modes/controllers/selector-controller.d.ts +35 -1
  62. package/dist/types/modes/index.d.ts +0 -4
  63. package/dist/types/modes/interactive-mode.d.ts +5 -2
  64. package/dist/types/modes/runtime-init.d.ts +2 -2
  65. package/dist/types/modes/shared/agent-wire/approval-gate.d.ts +6 -9
  66. package/dist/types/modes/shared/agent-wire/deep-interview-gate.d.ts +4 -6
  67. package/dist/types/modes/shared/agent-wire/event-contract.d.ts +6 -6
  68. package/dist/types/modes/shared/agent-wire/event-envelope.d.ts +4 -9
  69. package/dist/types/modes/shared/agent-wire/event-observation.d.ts +1 -1
  70. package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +170 -30
  71. package/dist/types/modes/shared/agent-wire/workflow-gate-schema.d.ts +7 -7
  72. package/dist/types/modes/shared/agent-wire/workflow-gate-types.d.ts +105 -0
  73. package/dist/types/modes/types.d.ts +7 -2
  74. package/dist/types/runtime-mcp/client.d.ts +2 -0
  75. package/dist/types/runtime-mcp/config.d.ts +5 -1
  76. package/dist/types/runtime-mcp/manager.d.ts +8 -1
  77. package/dist/types/runtime-mcp/types.d.ts +4 -0
  78. package/dist/types/sdk/acp/adapter.d.ts +67 -0
  79. package/dist/types/sdk/acp/index.d.ts +2 -0
  80. package/dist/types/sdk/broker/broker.d.ts +53 -0
  81. package/dist/types/sdk/broker/discovery.d.ts +30 -0
  82. package/dist/types/sdk/broker/ensure.d.ts +42 -0
  83. package/dist/types/sdk/broker/identity.d.ts +3 -0
  84. package/dist/types/sdk/broker/index.d.ts +8 -0
  85. package/dist/types/sdk/broker/lifecycle-ledger.d.ts +95 -0
  86. package/dist/types/sdk/broker/lifecycle.d.ts +85 -0
  87. package/dist/types/sdk/broker/process-incarnation.d.ts +14 -0
  88. package/dist/types/sdk/broker/runtime.d.ts +33 -0
  89. package/dist/types/sdk/broker/session-index.d.ts +57 -0
  90. package/dist/types/sdk/broker/state-version.d.ts +8 -0
  91. package/dist/types/sdk/broker/transport.d.ts +9 -0
  92. package/dist/types/sdk/bus/chat-command-policy.d.ts +49 -0
  93. package/dist/types/sdk/bus/chat-daemon-cli.d.ts +21 -0
  94. package/dist/types/sdk/bus/chat-daemon-control.d.ts +111 -0
  95. package/dist/types/sdk/bus/chat-daemon-runtime.d.ts +77 -0
  96. package/dist/types/sdk/bus/chat-effect-journal.d.ts +84 -0
  97. package/dist/types/{notifications → sdk/bus}/config-commands.d.ts +7 -2
  98. package/dist/types/sdk/bus/config.d.ts +274 -0
  99. package/dist/types/sdk/bus/conversation-store.d.ts +72 -0
  100. package/dist/types/sdk/bus/discord-conversation.d.ts +58 -0
  101. package/dist/types/sdk/bus/discord-daemon.d.ts +50 -0
  102. package/dist/types/sdk/bus/discord-live-provider.d.ts +70 -0
  103. package/dist/types/sdk/bus/discord-provider.d.ts +85 -0
  104. package/dist/types/{notifications → sdk/bus}/html-format.d.ts +2 -2
  105. package/dist/types/{notifications → sdk/bus}/index.d.ts +113 -13
  106. package/dist/types/{notifications → sdk/bus}/lifecycle-control-runtime.d.ts +4 -2
  107. package/dist/types/{notifications → sdk/bus}/lifecycle-orchestrator.d.ts +18 -21
  108. package/dist/types/{notifications → sdk/bus}/managed-daemon.d.ts +1 -1
  109. package/dist/types/sdk/bus/native-runtime-compatibility.d.ts +13 -0
  110. package/dist/types/sdk/bus/notification-orchestration.d.ts +170 -0
  111. package/dist/types/{notifications → sdk/bus}/notification-service.d.ts +7 -1
  112. package/dist/types/sdk/bus/session-control.d.ts +83 -0
  113. package/dist/types/sdk/bus/slack-conversation.d.ts +56 -0
  114. package/dist/types/sdk/bus/slack-daemon.d.ts +60 -0
  115. package/dist/types/sdk/bus/slack-live-provider.d.ts +59 -0
  116. package/dist/types/sdk/bus/slack-provider.d.ts +55 -0
  117. package/dist/types/{notifications → sdk/bus}/telegram-cli.d.ts +4 -4
  118. package/dist/types/{notifications → sdk/bus}/telegram-daemon-cli.d.ts +14 -5
  119. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +12 -0
  120. package/dist/types/{notifications → sdk/bus}/telegram-daemon-control.d.ts +2 -2
  121. package/dist/types/{notifications → sdk/bus}/telegram-daemon.d.ts +78 -17
  122. package/dist/types/{notifications → sdk/bus}/telegram-reference.d.ts +2 -2
  123. package/dist/types/sdk/bus/telegram-setup.d.ts +128 -0
  124. package/dist/types/{notifications → sdk/bus}/topic-registry.d.ts +11 -0
  125. package/dist/types/sdk/cli/index.d.ts +1 -0
  126. package/dist/types/sdk/cli/session-cli.d.ts +19 -0
  127. package/dist/types/sdk/client/client.d.ts +1 -0
  128. package/dist/types/sdk/client/discovery.d.ts +27 -0
  129. package/dist/types/sdk/client/index.d.ts +2 -0
  130. package/dist/types/sdk/host/control/dispatch.d.ts +34 -0
  131. package/dist/types/sdk/host/control/index.d.ts +2 -0
  132. package/dist/types/sdk/host/control/operations.d.ts +65 -0
  133. package/dist/types/sdk/host/events.d.ts +35 -0
  134. package/dist/types/sdk/host/host.d.ts +35 -0
  135. package/dist/types/sdk/host/index.d.ts +4 -0
  136. package/dist/types/sdk/host/query/cursor.d.ts +62 -0
  137. package/dist/types/sdk/host/query/handlers.d.ts +70 -0
  138. package/dist/types/sdk/host/query/index.d.ts +3 -0
  139. package/dist/types/sdk/host/query/revision-store.d.ts +60 -0
  140. package/dist/types/sdk/host/reverse-leases.d.ts +45 -0
  141. package/dist/types/sdk/host/types.d.ts +32 -0
  142. package/dist/types/sdk/index.d.ts +6 -0
  143. package/dist/types/sdk/lifecycle-session.d.ts +14 -0
  144. package/dist/types/sdk/mcp/index.d.ts +1 -0
  145. package/dist/types/sdk/mcp/server.d.ts +37 -0
  146. package/dist/types/sdk/models.d.ts +44 -0
  147. package/dist/types/sdk/protocol/adapter-validation.d.ts +14 -0
  148. package/dist/types/sdk/protocol/operation-registry.d.ts +24 -0
  149. package/dist/types/{sdk.d.ts → sdk/session.d.ts} +44 -38
  150. package/dist/types/sdk/startup-capability.d.ts +50 -0
  151. package/dist/types/session/agent-session.d.ts +114 -21
  152. package/dist/types/session/default-model-selection.d.ts +25 -0
  153. package/dist/types/session/fallback-chain-controller.d.ts +52 -0
  154. package/dist/types/session/session-manager.d.ts +58 -1
  155. package/dist/types/setup/credential-auto-import.d.ts +36 -6
  156. package/dist/types/tools/ask-answer-registry.d.ts +1 -1
  157. package/dist/types/tools/browser/benchmark/detector-report.d.ts +63 -0
  158. package/dist/types/tools/browser/benchmark/run-suite.d.ts +18 -0
  159. package/dist/types/tools/browser/launch.d.ts +22 -0
  160. package/dist/types/tools/browser/profile-discovery.d.ts +31 -0
  161. package/dist/types/tools/browser/profile-posture.d.ts +37 -0
  162. package/dist/types/tools/browser/profile-reuse.d.ts +39 -0
  163. package/dist/types/tools/browser/profile-warmup.d.ts +39 -0
  164. package/dist/types/tools/browser/registry.d.ts +19 -0
  165. package/dist/types/tools/browser/tab-protocol.d.ts +4 -0
  166. package/dist/types/tools/index.d.ts +8 -8
  167. package/dist/types/tools/subagent-render.d.ts +1 -0
  168. package/dist/types/tools/subagent.d.ts +6 -1
  169. package/package.json +34 -13
  170. package/scripts/build-sdk-package-smoke.ts +99 -0
  171. package/scripts/capture-notifications-settings-showcase.ts +435 -0
  172. package/scripts/compile-args.ts +4 -2
  173. package/scripts/g005-daemon-smoke.ts +4 -5
  174. package/scripts/g011-daemon-path-smoke.ts +5 -5
  175. package/scripts/generate-sdk-adapter-parity-manifest.ts +163 -0
  176. package/scripts/generate-sdk-operation-inventory.ts +867 -0
  177. package/scripts/generate-telegram-baseline-manifest.ts +128 -0
  178. package/scripts/manifest-schema.ts +124 -0
  179. package/scripts/run-test-manifest.ts +153 -0
  180. package/scripts/run-threat-model-check.ts +157 -0
  181. package/scripts/verify-gjc-sdk-canonicalization.ts +3467 -0
  182. package/scripts/verify-gjc-sdk-rename.ts +90 -0
  183. package/src/append-only-mode.ts +1 -1
  184. package/src/async/job-manager.ts +406 -63
  185. package/src/cli/args.ts +43 -12
  186. package/src/cli/auth-gateway-cli.ts +2 -2
  187. package/src/cli/config-cli.ts +2 -1
  188. package/src/cli/daemon-cli.ts +63 -14
  189. package/src/cli/list-models.ts +1 -1
  190. package/src/cli/notify-cli.ts +288 -286
  191. package/src/cli.ts +21 -2
  192. package/src/commands/daemon.ts +50 -6
  193. package/src/commands/harness.ts +93 -36
  194. package/src/commands/launch.ts +5 -2
  195. package/src/commands/mcp-serve.ts +19 -12
  196. package/src/commands/notify.ts +36 -3
  197. package/src/commands/sdk.ts +426 -0
  198. package/src/commit/agentic/agent.ts +1 -0
  199. package/src/config/atomic-yaml-patch.ts +423 -0
  200. package/src/config/model-profile-activation.ts +240 -89
  201. package/src/config/model-profiles.ts +18 -15
  202. package/src/config/model-registry.ts +51 -26
  203. package/src/config/model-resolver.ts +138 -51
  204. package/src/config/model-selector-value.ts +50 -0
  205. package/src/config/models-config-schema.ts +14 -21
  206. package/src/config/settings-schema.ts +128 -10
  207. package/src/config/settings.ts +1120 -158
  208. package/src/coordinator-mcp/model-preset.ts +74 -20
  209. package/src/coordinator-mcp/server.ts +1597 -3052
  210. package/src/daemon/builtin.ts +8 -5
  211. package/src/daemon/control-types.ts +1 -1
  212. package/src/defaults/gjc/skills/team/SKILL.md +4 -4
  213. package/src/discovery/mcp-json.ts +327 -20
  214. package/src/extensibility/custom-tools/types.ts +1 -1
  215. package/src/extensibility/extensions/compact-handler.ts +3 -3
  216. package/src/extensibility/extensions/get-commands-handler.ts +2 -2
  217. package/src/extensibility/extensions/loader.ts +69 -5
  218. package/src/extensibility/extensions/runner.ts +112 -4
  219. package/src/extensibility/extensions/types.ts +176 -17
  220. package/src/extensibility/hooks/types.ts +1 -1
  221. package/src/gjc-runtime/launch-tmux.ts +170 -86
  222. package/src/gjc-runtime/psmux-detect.ts +82 -4
  223. package/src/gjc-runtime/session-state-sidecar.ts +41 -31
  224. package/src/gjc-runtime/team-runtime.ts +54 -35
  225. package/src/gjc-runtime/tmux-owner-isolation-cli.ts +53 -17
  226. package/src/gjc-runtime/tmux-owner-isolation.ts +1 -1
  227. package/src/gjc-runtime/tmux-sessions.ts +19 -13
  228. package/src/gjc-runtime/ultragoal-guard.ts +108 -14
  229. package/src/gjc-runtime/ultragoal-receipt-freshness.ts +102 -1
  230. package/src/gjc-runtime/ultragoal-runtime.ts +227 -11
  231. package/src/gjc-runtime/windows-powershell-command.ts +58 -0
  232. package/src/harness-control-plane/operate.ts +9 -9
  233. package/src/harness-control-plane/owner.ts +283 -39
  234. package/src/harness-control-plane/receipts.ts +0 -1
  235. package/src/harness-control-plane/sdk-transport.ts +395 -0
  236. package/src/harness-control-plane/session-transport.ts +94 -0
  237. package/src/harness-control-plane/types.ts +1 -1
  238. package/src/internal-urls/docs-index.generated.ts +34 -35
  239. package/src/lsp/client.ts +42 -6
  240. package/src/lsp/index.ts +2 -2
  241. package/src/main.ts +299 -204
  242. package/src/modes/DESIGN.md +258 -0
  243. package/src/modes/acp/acp-agent.ts +1228 -2612
  244. package/src/modes/acp/acp-client-bridge.ts +2 -20
  245. package/src/modes/acp/acp-event-mapper.ts +18 -2
  246. package/src/modes/acp/acp-mode.ts +8 -36
  247. package/src/modes/acp/permission-mode.ts +25 -0
  248. package/src/modes/acp/startup-options.ts +6 -0
  249. package/src/modes/components/agent-dashboard.ts +37 -17
  250. package/src/modes/components/model-selector.ts +93 -35
  251. package/src/modes/components/notifications-settings-editor.ts +1379 -0
  252. package/src/modes/components/settings-selector.ts +60 -11
  253. package/src/modes/components/welcome.ts +4 -4
  254. package/src/modes/controllers/command-controller.ts +10 -17
  255. package/src/modes/controllers/event-controller.ts +11 -16
  256. package/src/modes/controllers/extension-ui-controller.ts +396 -28
  257. package/src/modes/controllers/selector-controller.ts +674 -36
  258. package/src/modes/index.ts +0 -22
  259. package/src/modes/interactive-mode.ts +87 -36
  260. package/src/modes/runtime-init.ts +298 -6
  261. package/src/modes/shared/agent-wire/approval-gate.ts +9 -11
  262. package/src/modes/shared/agent-wire/deep-interview-gate.ts +10 -11
  263. package/src/modes/shared/agent-wire/event-contract.ts +7 -8
  264. package/src/modes/shared/agent-wire/event-envelope.ts +9 -17
  265. package/src/modes/shared/agent-wire/event-observation.ts +16 -7
  266. package/src/modes/shared/agent-wire/workflow-gate-broker.ts +1258 -87
  267. package/src/modes/shared/agent-wire/workflow-gate-schema.ts +15 -15
  268. package/src/modes/shared/agent-wire/workflow-gate-types.ts +113 -0
  269. package/src/modes/types.ts +7 -2
  270. package/src/runtime-mcp/client.ts +94 -19
  271. package/src/runtime-mcp/config.ts +27 -15
  272. package/src/runtime-mcp/manager.ts +343 -105
  273. package/src/runtime-mcp/oauth-flow.ts +42 -12
  274. package/src/runtime-mcp/transports/http.ts +49 -19
  275. package/src/runtime-mcp/transports/stdio.ts +47 -28
  276. package/src/runtime-mcp/types.ts +10 -0
  277. package/src/sdk/acp/adapter.ts +418 -0
  278. package/src/sdk/acp/index.ts +2 -0
  279. package/src/sdk/broker/broker.ts +642 -0
  280. package/src/sdk/broker/discovery.ts +113 -0
  281. package/src/sdk/broker/ensure.ts +307 -0
  282. package/src/sdk/broker/identity.ts +42 -0
  283. package/src/sdk/broker/index.ts +8 -0
  284. package/src/sdk/broker/internal-source-marker-2178.txt +1 -0
  285. package/src/sdk/broker/internal-source.bunfig.toml +1 -0
  286. package/src/sdk/broker/lifecycle-ledger.ts +286 -0
  287. package/src/sdk/broker/lifecycle.ts +2157 -0
  288. package/src/sdk/broker/process-incarnation.ts +159 -0
  289. package/src/sdk/broker/runtime.ts +164 -0
  290. package/src/sdk/broker/session-index.ts +318 -0
  291. package/src/sdk/broker/state-version.ts +23 -0
  292. package/src/sdk/broker/transport.ts +125 -0
  293. package/src/sdk/bus/chat-command-policy.ts +107 -0
  294. package/src/sdk/bus/chat-daemon-cli.ts +214 -0
  295. package/src/sdk/bus/chat-daemon-control.ts +713 -0
  296. package/src/sdk/bus/chat-daemon-runtime.ts +526 -0
  297. package/src/sdk/bus/chat-effect-journal.ts +355 -0
  298. package/src/{notifications → sdk/bus}/config-commands.ts +39 -10
  299. package/src/sdk/bus/config.ts +433 -0
  300. package/src/sdk/bus/conversation-store.ts +391 -0
  301. package/src/sdk/bus/discord-conversation.ts +85 -0
  302. package/src/sdk/bus/discord-daemon.ts +2292 -0
  303. package/src/sdk/bus/discord-live-provider.ts +521 -0
  304. package/src/sdk/bus/discord-provider.ts +56 -0
  305. package/src/{notifications → sdk/bus}/html-format.ts +2 -2
  306. package/src/sdk/bus/index.ts +3979 -0
  307. package/src/{notifications → sdk/bus}/lifecycle-commands.ts +2 -0
  308. package/src/{notifications → sdk/bus}/lifecycle-control-runtime.ts +225 -196
  309. package/src/{notifications → sdk/bus}/lifecycle-orchestrator.ts +161 -74
  310. package/src/{notifications → sdk/bus}/managed-daemon.ts +2 -2
  311. package/src/sdk/bus/native-runtime-compatibility.ts +42 -0
  312. package/src/sdk/bus/natives-augment.d.ts +38 -0
  313. package/src/sdk/bus/notification-orchestration.ts +535 -0
  314. package/src/{notifications → sdk/bus}/notification-service.ts +106 -12
  315. package/src/sdk/bus/session-control.ts +333 -0
  316. package/src/sdk/bus/slack-conversation.ts +74 -0
  317. package/src/sdk/bus/slack-daemon.ts +2144 -0
  318. package/src/sdk/bus/slack-live-provider.ts +380 -0
  319. package/src/sdk/bus/slack-provider.ts +76 -0
  320. package/src/{notifications → sdk/bus}/telegram-cli.ts +8 -8
  321. package/src/sdk/bus/telegram-daemon-cli.ts +330 -0
  322. package/src/sdk/bus/telegram-daemon-contract.ts +14 -0
  323. package/src/{notifications → sdk/bus}/telegram-daemon-control.ts +4 -4
  324. package/src/{notifications → sdk/bus}/telegram-daemon.ts +603 -63
  325. package/src/{notifications → sdk/bus}/telegram-reference.ts +2 -2
  326. package/src/sdk/bus/telegram-setup.ts +663 -0
  327. package/src/{notifications → sdk/bus}/topic-registry.ts +32 -0
  328. package/src/sdk/cli/index.ts +1 -0
  329. package/src/sdk/cli/session-cli.ts +275 -0
  330. package/src/sdk/client/client.ts +1 -0
  331. package/src/sdk/client/discovery.ts +108 -0
  332. package/src/sdk/client/index.ts +2 -0
  333. package/src/sdk/host/control/dispatch.ts +367 -0
  334. package/src/sdk/host/control/index.ts +10 -0
  335. package/src/sdk/host/control/operations.ts +63 -0
  336. package/src/sdk/host/events.ts +91 -0
  337. package/src/sdk/host/host.ts +296 -0
  338. package/src/sdk/host/index.ts +4 -0
  339. package/src/sdk/host/query/cursor.ts +189 -0
  340. package/src/sdk/host/query/handlers.ts +533 -0
  341. package/src/sdk/host/query/index.ts +3 -0
  342. package/src/sdk/host/query/revision-store.ts +1126 -0
  343. package/src/sdk/host/reverse-leases.ts +325 -0
  344. package/src/sdk/host/types.ts +29 -0
  345. package/src/sdk/index.ts +13 -0
  346. package/src/sdk/lifecycle-session.ts +39 -0
  347. package/src/sdk/mcp/index.ts +1 -0
  348. package/src/sdk/mcp/server.ts +332 -0
  349. package/src/sdk/models.ts +168 -0
  350. package/src/sdk/protocol/adapter-validation.ts +48 -0
  351. package/src/sdk/protocol/operation-inventory.generated.json +5654 -0
  352. package/src/sdk/protocol/operation-registry.ts +312 -0
  353. package/src/{sdk.ts → sdk/session.ts} +339 -212
  354. package/src/sdk/startup-capability.ts +189 -0
  355. package/src/session/agent-session.ts +2650 -944
  356. package/src/session/default-model-selection.ts +93 -0
  357. package/src/session/fallback-chain-controller.ts +136 -0
  358. package/src/session/session-manager.ts +438 -11
  359. package/src/session/session-storage.ts +8 -1
  360. package/src/setup/credential-auto-import.ts +290 -35
  361. package/src/setup/hermes/templates/operator-instructions.v1.md +3 -5
  362. package/src/slash-commands/builtin-registry.ts +2 -1
  363. package/src/task/executor.ts +62 -13
  364. package/src/task/index.ts +26 -16
  365. package/src/tools/ask-answer-registry.ts +1 -1
  366. package/src/tools/ask.ts +13 -8
  367. package/src/tools/browser/STEALTH-THIRD-PARTY-NOTICES.md +26 -0
  368. package/src/tools/browser/benchmark/detector-report.ts +157 -0
  369. package/src/tools/browser/benchmark/run-suite.ts +39 -0
  370. package/src/tools/browser/launch.ts +124 -19
  371. package/src/tools/browser/profile-discovery.ts +63 -0
  372. package/src/tools/browser/profile-posture.ts +59 -0
  373. package/src/tools/browser/profile-reuse.ts +102 -0
  374. package/src/tools/browser/profile-warmup.ts +109 -0
  375. package/src/tools/browser/registry.ts +87 -11
  376. package/src/tools/browser/tab-protocol.ts +1 -0
  377. package/src/tools/browser/tab-supervisor.ts +1 -0
  378. package/src/tools/browser/tab-worker.ts +1 -1
  379. package/src/tools/browser.ts +6 -0
  380. package/src/tools/index.ts +8 -8
  381. package/src/tools/puppeteer/14_stealth_permissions.txt +57 -0
  382. package/src/tools/puppeteer/15_stealth_webrtc.txt +60 -0
  383. package/src/tools/subagent-render.ts +19 -8
  384. package/src/tools/subagent.ts +84 -32
  385. package/src/tools/telegram-send.ts +2 -2
  386. package/vendor/insane-search/MANIFEST.json +2 -1
  387. package/vendor/insane-search/engine/bias_check.py +4 -1
  388. package/vendor/insane-search/engine/phase0.py +26 -1
  389. package/dist/types/harness-control-plane/rpc-adapter.d.ts +0 -69
  390. package/dist/types/modes/bridge/auth.d.ts +0 -12
  391. package/dist/types/modes/bridge/bridge-client-bridge.d.ts +0 -9
  392. package/dist/types/modes/bridge/bridge-mode.d.ts +0 -47
  393. package/dist/types/modes/bridge/bridge-ui-context.d.ts +0 -88
  394. package/dist/types/modes/bridge/event-stream.d.ts +0 -8
  395. package/dist/types/modes/rpc/host-tools.d.ts +0 -1
  396. package/dist/types/modes/rpc/host-uris.d.ts +0 -1
  397. package/dist/types/modes/rpc/rpc-client.d.ts +0 -299
  398. package/dist/types/modes/rpc/rpc-mode.d.ts +0 -86
  399. package/dist/types/modes/rpc/rpc-socket-security.d.ts +0 -10
  400. package/dist/types/modes/rpc/rpc-types.d.ts +0 -810
  401. package/dist/types/modes/shared/agent-wire/command-contract.d.ts +0 -18
  402. package/dist/types/modes/shared/agent-wire/command-dispatch.d.ts +0 -37
  403. package/dist/types/modes/shared/agent-wire/command-validation.d.ts +0 -2
  404. package/dist/types/modes/shared/agent-wire/handshake.d.ts +0 -56
  405. package/dist/types/modes/shared/agent-wire/host-tool-bridge.d.ts +0 -16
  406. package/dist/types/modes/shared/agent-wire/host-uri-bridge.d.ts +0 -17
  407. package/dist/types/modes/shared/agent-wire/protocol.d.ts +0 -25
  408. package/dist/types/modes/shared/agent-wire/responses.d.ts +0 -4
  409. package/dist/types/modes/shared/agent-wire/scopes.d.ts +0 -18
  410. package/dist/types/modes/shared/agent-wire/session-registry.d.ts +0 -25
  411. package/dist/types/modes/shared/agent-wire/ui-request-broker.d.ts +0 -42
  412. package/dist/types/modes/shared/agent-wire/ui-result.d.ts +0 -27
  413. package/dist/types/modes/shared/agent-wire/unattended-action-policy.d.ts +0 -29
  414. package/dist/types/modes/shared/agent-wire/unattended-audit.d.ts +0 -68
  415. package/dist/types/modes/shared/agent-wire/unattended-run-controller.d.ts +0 -166
  416. package/dist/types/modes/shared/agent-wire/unattended-session.d.ts +0 -127
  417. package/dist/types/notifications/config.d.ts +0 -132
  418. package/src/harness-control-plane/rpc-adapter.ts +0 -290
  419. package/src/modes/bridge/auth.ts +0 -41
  420. package/src/modes/bridge/bridge-client-bridge.ts +0 -47
  421. package/src/modes/bridge/bridge-mode.ts +0 -675
  422. package/src/modes/bridge/bridge-ui-context.ts +0 -200
  423. package/src/modes/bridge/event-stream.ts +0 -70
  424. package/src/modes/rpc/host-tools.ts +0 -1
  425. package/src/modes/rpc/host-uris.ts +0 -1
  426. package/src/modes/rpc/rpc-client.ts +0 -1166
  427. package/src/modes/rpc/rpc-mode.ts +0 -1029
  428. package/src/modes/rpc/rpc-socket-security.ts +0 -115
  429. package/src/modes/rpc/rpc-types.ts +0 -637
  430. package/src/modes/shared/agent-wire/command-contract.ts +0 -18
  431. package/src/modes/shared/agent-wire/command-dispatch.ts +0 -498
  432. package/src/modes/shared/agent-wire/command-validation.ts +0 -181
  433. package/src/modes/shared/agent-wire/handshake.ts +0 -157
  434. package/src/modes/shared/agent-wire/host-tool-bridge.ts +0 -197
  435. package/src/modes/shared/agent-wire/host-uri-bridge.ts +0 -236
  436. package/src/modes/shared/agent-wire/protocol.ts +0 -46
  437. package/src/modes/shared/agent-wire/responses.ts +0 -17
  438. package/src/modes/shared/agent-wire/scopes.ts +0 -94
  439. package/src/modes/shared/agent-wire/session-registry.ts +0 -109
  440. package/src/modes/shared/agent-wire/ui-request-broker.ts +0 -150
  441. package/src/modes/shared/agent-wire/ui-result.ts +0 -48
  442. package/src/modes/shared/agent-wire/unattended-action-policy.ts +0 -365
  443. package/src/modes/shared/agent-wire/unattended-audit.ts +0 -176
  444. package/src/modes/shared/agent-wire/unattended-run-controller.ts +0 -426
  445. package/src/modes/shared/agent-wire/unattended-session.ts +0 -528
  446. package/src/notifications/config.ts +0 -219
  447. package/src/notifications/index.ts +0 -1835
  448. package/src/notifications/telegram-daemon-cli.ts +0 -243
  449. package/src/tools/puppeteer/09_stealth_locale.txt +0 -46
  450. /package/dist/types/{notifications → sdk/bus}/attachment-registry.d.ts +0 -0
  451. /package/dist/types/{notifications → sdk/bus}/chat-adapters.d.ts +0 -0
  452. /package/dist/types/{notifications → sdk/bus}/daemon-paths.d.ts +0 -0
  453. /package/dist/types/{notifications → sdk/bus}/engine.d.ts +0 -0
  454. /package/dist/types/{notifications → sdk/bus}/helpers.d.ts +0 -0
  455. /package/dist/types/{notifications → sdk/bus}/lifecycle-commands.d.ts +0 -0
  456. /package/dist/types/{notifications → sdk/bus}/operator-runtime.d.ts +0 -0
  457. /package/dist/types/{notifications → sdk/bus}/rate-limit-pool.d.ts +0 -0
  458. /package/dist/types/{notifications → sdk/bus}/recent-activity.d.ts +0 -0
  459. /package/dist/types/{notifications → sdk/bus}/reply-sent-store.d.ts +0 -0
  460. /package/dist/types/{notifications → sdk/bus}/rich-draft.d.ts +0 -0
  461. /package/dist/types/{notifications → sdk/bus}/rich-render.d.ts +0 -0
  462. /package/dist/types/{notifications → sdk/bus}/threaded-inbound.d.ts +0 -0
  463. /package/dist/types/{notifications → sdk/bus}/threaded-render.d.ts +0 -0
  464. /package/src/{notifications → sdk/bus}/attachment-registry.ts +0 -0
  465. /package/src/{notifications → sdk/bus}/chat-adapters.ts +0 -0
  466. /package/src/{notifications → sdk/bus}/daemon-paths.ts +0 -0
  467. /package/src/{notifications → sdk/bus}/engine.ts +0 -0
  468. /package/src/{notifications → sdk/bus}/helpers.ts +0 -0
  469. /package/src/{notifications → sdk/bus}/operator-runtime.ts +0 -0
  470. /package/src/{notifications → sdk/bus}/rate-limit-pool.ts +0 -0
  471. /package/src/{notifications → sdk/bus}/recent-activity.ts +0 -0
  472. /package/src/{notifications → sdk/bus}/reply-sent-store.ts +0 -0
  473. /package/src/{notifications → sdk/bus}/rich-draft.ts +0 -0
  474. /package/src/{notifications → sdk/bus}/rich-render.ts +0 -0
  475. /package/src/{notifications → sdk/bus}/threaded-inbound.ts +0 -0
  476. /package/src/{notifications → sdk/bus}/threaded-render.ts +0 -0
@@ -0,0 +1,533 @@
1
+ import {
2
+ assertCursorSelector,
3
+ type CursorEnvelope,
4
+ CursorError,
5
+ type CursorPosition,
6
+ type CursorRegistry,
7
+ type CursorSelector,
8
+ cursorSelector,
9
+ } from "./cursor.js";
10
+ import type { RevisionStore } from "./revision-store.js";
11
+
12
+ export const TARGET_PAGE_BYTES = 256 * 1024;
13
+ export const RESPONSE_CEILING_BYTES = 1024 * 1024;
14
+
15
+ export interface SessionSurface {
16
+ getTranscriptEntries(): unknown[] | Promise<unknown[]>;
17
+ getContextSnapshot(): unknown | Promise<unknown>;
18
+ getGoalState(): unknown | Promise<unknown>;
19
+ getTodoState(): unknown | Promise<unknown>;
20
+ getDiff(): unknown | Promise<unknown>;
21
+ getUsage(): unknown | Promise<unknown>;
22
+ getModels(): unknown | Promise<unknown>;
23
+ getSkillState(): unknown | Promise<unknown>;
24
+ /** Q12 rows preserve workflow gate fields and include stable durable gate metadata. */
25
+ getGates(): unknown | Promise<unknown>;
26
+ getConfigItems(): unknown | Promise<unknown>;
27
+ getSessionMetadata(): unknown | Promise<unknown>;
28
+ getStats(): unknown | Promise<unknown>;
29
+ getBranchCandidates(): unknown | Promise<unknown>;
30
+ getLastAssistant(): unknown | Promise<unknown>;
31
+ getCapabilities(): unknown | Promise<unknown>;
32
+ getAuthProviders(): unknown | Promise<unknown>;
33
+ getTools(): unknown | Promise<unknown>;
34
+ getQueueMessages(): unknown | Promise<unknown>;
35
+ getExtensions(): unknown | Promise<unknown>;
36
+ getArtifactRange?(
37
+ id: string,
38
+ offset: number,
39
+ length: number,
40
+ ):
41
+ | { bytes: Uint8Array; totalBytes: number }
42
+ | undefined
43
+ | Promise<{ bytes: Uint8Array; totalBytes: number } | undefined>;
44
+
45
+ getJobs(): unknown | Promise<unknown>;
46
+ /** Query rows backed by the session's installed binding map. */
47
+ installedQueries?: ReadonlySet<string>;
48
+ }
49
+
50
+ export interface QueryRequest {
51
+ id?: string;
52
+ query: string;
53
+ input?: Record<string, unknown>;
54
+ cursor?: string;
55
+ connectionId: string;
56
+ }
57
+ export interface QueryPage {
58
+ items: unknown[];
59
+ complete: boolean;
60
+ continuationCursor?: string;
61
+ revision: string;
62
+ preview?: boolean;
63
+ }
64
+ export interface QueryResponse {
65
+ id?: string;
66
+ ok: boolean;
67
+ page?: QueryPage;
68
+ result?: unknown;
69
+ error?: { code: string; message: string; restartQuery?: boolean };
70
+ }
71
+
72
+ const sources: Record<string, { resource: string; method: keyof SessionSurface; mvcc: boolean }> = {
73
+ Q01: { resource: "transcript", method: "getTranscriptEntries", mvcc: true },
74
+ Q03: { resource: "context", method: "getContextSnapshot", mvcc: false },
75
+ Q04: { resource: "goal", method: "getGoalState", mvcc: true },
76
+ Q05: { resource: "todo", method: "getTodoState", mvcc: true },
77
+ Q06: { resource: "diff", method: "getDiff", mvcc: true },
78
+ Q07: { resource: "diff", method: "getDiff", mvcc: true },
79
+ Q08: { resource: "diff", method: "getDiff", mvcc: true },
80
+ Q09: { resource: "usage", method: "getUsage", mvcc: false },
81
+ Q10: { resource: "models", method: "getModels", mvcc: false },
82
+ Q11: { resource: "skills", method: "getSkillState", mvcc: true },
83
+ Q12: { resource: "gates", method: "getGates", mvcc: true },
84
+ Q13: { resource: "config", method: "getConfigItems", mvcc: true },
85
+ Q14: { resource: "metadata", method: "getSessionMetadata", mvcc: false },
86
+ Q15: { resource: "stats", method: "getStats", mvcc: false },
87
+ Q16: { resource: "branches", method: "getBranchCandidates", mvcc: false },
88
+ Q17: { resource: "lastAssistant", method: "getLastAssistant", mvcc: false },
89
+ Q18: { resource: "capabilities", method: "getCapabilities", mvcc: false },
90
+ Q19: { resource: "auth", method: "getAuthProviders", mvcc: false },
91
+ Q20: { resource: "tools", method: "getTools", mvcc: true },
92
+ Q21: { resource: "queue", method: "getQueueMessages", mvcc: true },
93
+ Q22: { resource: "extensions", method: "getExtensions", mvcc: true },
94
+ Q25: { resource: "jobs", method: "getJobs", mvcc: false },
95
+ };
96
+ const names = [
97
+ "transcript.list",
98
+ "transcript.body",
99
+ "context.get",
100
+ "goal.list/get",
101
+ "todo.list",
102
+ "diff.list_files",
103
+ "diff.list_hunks",
104
+ "diff.read_hunk",
105
+ "usage.get",
106
+ "models.list/current",
107
+ "skill.list/state",
108
+ "workflow.gates.list",
109
+ "config.list/get",
110
+ "session.metadata",
111
+ "session.stats",
112
+ "session.branch_candidates",
113
+ "session.last_assistant",
114
+ "runtime.capabilities",
115
+ "auth.providers",
116
+ "tools.list",
117
+ "queue.messages.list",
118
+ "extensions.list",
119
+ "resource.body",
120
+ "artifact.read",
121
+ "runtime.jobs.list",
122
+ ];
123
+
124
+ export class QueryHandlers {
125
+ constructor(
126
+ private readonly surface: SessionSurface,
127
+ private readonly sessionId: string,
128
+ private readonly revisions: RevisionStore,
129
+ private readonly cursors: CursorRegistry,
130
+ ) {}
131
+ async dispatch(request: QueryRequest): Promise<QueryResponse> {
132
+ try {
133
+ const query = request.query.startsWith("Q")
134
+ ? request.query
135
+ : request.query === "models.list" || request.query === "models.current"
136
+ ? "Q10"
137
+ : `Q${String(names.indexOf(request.query) + 1).padStart(2, "0")}`;
138
+ if (
139
+ this.surface.installedQueries instanceof Set &&
140
+ !this.surface.installedQueries.has(names[Number(query.slice(1)) - 1] ?? "")
141
+ )
142
+ return this.#error(
143
+ request,
144
+ "operation_not_session_owned",
145
+ false,
146
+ `${request.query} is not installed for this session.`,
147
+ );
148
+ if (query === "Q02") return await this.#transcriptBody(request);
149
+ if (query === "Q23") return await this.#resourceBody(request);
150
+ if (query === "Q24") return await this.#artifact(request);
151
+ const source = sources[query];
152
+ if (!source) return this.#error(request, "invalid_request");
153
+ return await this.#pageSource(request, query, source);
154
+ } catch (error) {
155
+ if (error instanceof CursorError) return this.#error(request, error.code, error.restartQuery, error.message);
156
+ if (isTypedError(error)) return this.#error(request, error.code, false, error.message);
157
+ return this.#error(request, "internal", false, error instanceof Error ? error.message : String(error));
158
+ }
159
+ }
160
+
161
+ async #pageSource(
162
+ request: QueryRequest,
163
+ queryId: string,
164
+ source: { resource: string; method: keyof SessionSurface; mvcc: boolean },
165
+ ): Promise<QueryResponse> {
166
+ let selector = selectorFor(queryId, request.input);
167
+ let resourceId = selector.resourceId ?? "default";
168
+ let revision: string;
169
+ let position = 0;
170
+ let byteOffset = 0;
171
+ let snapshot: unknown;
172
+ if (request.cursor) {
173
+ const cursor = this.cursors.consume(request.cursor, request.connectionId, {
174
+ sessionId: this.sessionId,
175
+ resource: source.resource,
176
+ direction: "forward",
177
+ pageShape: { targetBytes: TARGET_PAGE_BYTES },
178
+ });
179
+ selector = assertCursorSelector(cursorSelector(cursor.position), selector);
180
+ resourceId = selector.resourceId ?? "default";
181
+ revision = cursor.revision;
182
+ position = Number((cursor.position as CursorPosition).offset ?? 0);
183
+ byteOffset = Number((cursor.position as CursorPosition).byteOffset ?? 0);
184
+ const page = await this.revisions.readPage(source.resource, resourceId, revision, position, TARGET_PAGE_BYTES);
185
+ if (page) {
186
+ if (page.items.length === 0 && !page.complete) {
187
+ const item = await this.revisions.describeIndexedItem(source.resource, resourceId, revision, position);
188
+ const continuations = item?.itemId
189
+ ? item.fields.map(field => ({
190
+ query: "Q23",
191
+ resourceKind: source.resource,
192
+ resourceId,
193
+ revision,
194
+ itemId: item.itemId,
195
+ field,
196
+ }))
197
+ : [];
198
+ return this.#paginateIndexed(
199
+ request,
200
+ source.resource,
201
+ resourceId,
202
+ revision,
203
+ [{ id: item?.itemId, error: { code: "item_too_large" }, continuations }],
204
+ false,
205
+ position,
206
+ selector,
207
+ source.resource === "transcript" ? { highWatermark: cursor.highWatermark } : {},
208
+ );
209
+ }
210
+ return this.#paginateIndexed(
211
+ request,
212
+ source.resource,
213
+ resourceId,
214
+ revision,
215
+ page.items,
216
+ page.complete,
217
+ position,
218
+ selector,
219
+ source.resource === "transcript" ? { highWatermark: cursor.highWatermark } : {},
220
+ );
221
+ }
222
+ const range = await this.revisions.readRootRange(
223
+ source.resource,
224
+ resourceId,
225
+ revision,
226
+ byteOffset,
227
+ TARGET_PAGE_BYTES,
228
+ );
229
+ if (!range) return this.#error(request, "resource_gone");
230
+ return this.#chunkRange(
231
+ request,
232
+ source.resource,
233
+ resourceId,
234
+ revision,
235
+ range,
236
+ selector,
237
+ source.resource === "transcript" ? { highWatermark: cursor.highWatermark } : {},
238
+ );
239
+ } else {
240
+ snapshot = await (this.surface[source.method] as () => unknown)();
241
+ revision = await this.revisions.createRevision(source.resource, resourceId, snapshot);
242
+ }
243
+ if (snapshot === undefined) return this.#error(request, "resource_gone");
244
+ if (Array.isArray(snapshot)) {
245
+ const page = await this.revisions.readPage(source.resource, resourceId, revision, 0, TARGET_PAGE_BYTES);
246
+ if (page?.items.length === 0 && !page.complete) {
247
+ const item = await this.revisions.describeIndexedItem(source.resource, resourceId, revision, 0);
248
+ const continuations = item?.itemId
249
+ ? item.fields.map(field => ({
250
+ query: "Q23",
251
+ resourceKind: source.resource,
252
+ resourceId,
253
+ revision,
254
+ itemId: item.itemId,
255
+ field,
256
+ }))
257
+ : [];
258
+ return this.#paginateIndexed(
259
+ request,
260
+ source.resource,
261
+ resourceId,
262
+ revision,
263
+ [{ id: item?.itemId, error: { code: "item_too_large" }, continuations }],
264
+ false,
265
+ 0,
266
+ selector,
267
+ source.resource === "transcript" ? { highWatermark: lastId(snapshot) } : {},
268
+ );
269
+ }
270
+ if (page)
271
+ return this.#paginateIndexed(
272
+ request,
273
+ source.resource,
274
+ resourceId,
275
+ revision,
276
+ page.items,
277
+ page.complete,
278
+ 0,
279
+ selector,
280
+ source.resource === "transcript" ? { highWatermark: lastId(snapshot) } : {},
281
+ );
282
+ }
283
+ const rootBytes = await this.revisions.revisionByteLength(source.resource, resourceId, revision);
284
+ if (rootBytes === undefined) return this.#error(request, "resource_gone");
285
+ if (rootBytes <= TARGET_PAGE_BYTES)
286
+ return this.#paginate(
287
+ request,
288
+ source.resource,
289
+ resourceId,
290
+ revision,
291
+ snapshot,
292
+ 0,
293
+ selector,
294
+ source.resource === "transcript" ? { highWatermark: lastId(snapshot) } : {},
295
+ );
296
+ const range = await this.revisions.readRootRange(source.resource, resourceId, revision, 0, TARGET_PAGE_BYTES);
297
+ if (!range) return this.#error(request, "resource_gone");
298
+ return this.#chunkRange(
299
+ request,
300
+ source.resource,
301
+ resourceId,
302
+ revision,
303
+ range,
304
+ selector,
305
+ source.resource === "transcript" ? { highWatermark: lastId(snapshot) } : {},
306
+ );
307
+ }
308
+
309
+ async #transcriptBody(request: QueryRequest): Promise<QueryResponse> {
310
+ let selector = selectorFor("Q02", request.input);
311
+ let entryId = selector.entryId ?? "";
312
+ let revision: string;
313
+ let offset = 0;
314
+ let highWatermark: unknown;
315
+ if (request.cursor) {
316
+ const cursor = this.cursors.consume(request.cursor, request.connectionId, {
317
+ sessionId: this.sessionId,
318
+ resource: "transcript",
319
+ resourceId: "default",
320
+ direction: "forward",
321
+ pageShape: { targetBytes: TARGET_PAGE_BYTES },
322
+ });
323
+ selector = assertCursorSelector(cursorSelector(cursor.position), selector);
324
+ entryId = selector.entryId ?? "";
325
+ revision = cursor.revision;
326
+ offset = Number((cursor.position as CursorPosition).byteOffset ?? 0);
327
+ highWatermark = cursor.highWatermark;
328
+ } else {
329
+ const entries = await this.surface.getTranscriptEntries();
330
+ revision = await this.revisions.createRevision("transcript", "default", entries);
331
+ highWatermark = lastId(entries);
332
+ }
333
+ const range = await this.revisions.readTranscriptBodyRange(
334
+ "default",
335
+ revision,
336
+ entryId,
337
+ offset,
338
+ TARGET_PAGE_BYTES,
339
+ );
340
+ if (!range) return this.#error(request, "resource_gone");
341
+ return this.#chunkRange(request, "transcript", "default", revision, range, selector, { entryId, highWatermark });
342
+ }
343
+
344
+ async #resourceBody(request: QueryRequest): Promise<QueryResponse> {
345
+ let selector = selectorFor("Q23", request.input);
346
+ let kind = selector.resourceKind ?? "";
347
+ let id = selector.resourceId ?? "default";
348
+ let itemId = selector.itemId;
349
+ let field = selector.field ?? "body";
350
+ let revision = String(request.input?.revision ?? "");
351
+ let offset = Number(request.input?.byteOffset ?? 0);
352
+ if (request.cursor) {
353
+ const cursor = this.cursors.consume(request.cursor, request.connectionId, {
354
+ sessionId: this.sessionId,
355
+ direction: "forward",
356
+ pageShape: { targetBytes: TARGET_PAGE_BYTES },
357
+ });
358
+ selector = assertCursorSelector(cursorSelector(cursor.position), selector);
359
+ kind = selector.resourceKind ?? "";
360
+ id = selector.resourceId ?? "default";
361
+ itemId = selector.itemId;
362
+ field = selector.field ?? "body";
363
+ revision = cursor.revision;
364
+ offset = Number((cursor.position as CursorPosition).byteOffset ?? 0);
365
+ }
366
+ const range =
367
+ itemId === undefined
368
+ ? await this.revisions.readStringRange(kind, id, revision, field, offset, TARGET_PAGE_BYTES)
369
+ : await this.revisions.readIndexedStringRange(kind, id, revision, itemId, field, offset, TARGET_PAGE_BYTES);
370
+ if (!range) return this.#error(request, "resource_gone");
371
+ return this.#chunkRange(request, kind, id, revision, range, selector, {
372
+ field,
373
+ ...(itemId === undefined ? {} : { itemId }),
374
+ });
375
+ }
376
+
377
+ async #artifact(request: QueryRequest): Promise<QueryResponse> {
378
+ const input = request.input ?? {};
379
+ const artifactId = String(input.artifactId ?? "");
380
+ const start = Math.max(0, Number(input.offset ?? 0));
381
+ const maxRawBytes = Math.floor(((RESPONSE_CEILING_BYTES - 4096) * 3) / 4);
382
+ const requested = Math.max(0, Math.min(Number(input.length ?? TARGET_PAGE_BYTES), maxRawBytes));
383
+ const artifact = await this.surface.getArtifactRange?.(artifactId, start, requested);
384
+ if (!artifact) return this.#error(request, "resource_gone");
385
+ let bytes = Buffer.from(artifact.bytes);
386
+ let result = {
387
+ artifactId,
388
+ offset: start,
389
+ bytes: bytes.toString("base64"),
390
+ complete: start + bytes.length >= artifact.totalBytes,
391
+ };
392
+ while (
393
+ Buffer.byteLength(JSON.stringify({ id: request.id, ok: true, result })) >= RESPONSE_CEILING_BYTES &&
394
+ bytes.length > 0
395
+ ) {
396
+ bytes = bytes.subarray(0, bytes.length - Math.max(1, Math.ceil(bytes.length / 128)));
397
+ result = {
398
+ artifactId,
399
+ offset: start,
400
+ bytes: bytes.toString("base64"),
401
+ complete: start + bytes.length >= artifact.totalBytes,
402
+ };
403
+ }
404
+ if (bytes.length === 0 && start < artifact.totalBytes) return this.#error(request, "item_too_large");
405
+ return { id: request.id, ok: true, result };
406
+ }
407
+
408
+ async #paginate(
409
+ request: QueryRequest,
410
+ resource: string,
411
+ resourceId: string,
412
+ revision: string,
413
+ snapshot: unknown,
414
+ offset: number,
415
+ selector: CursorSelector,
416
+ extra: Partial<CursorEnvelope>,
417
+ ): Promise<QueryResponse> {
418
+ const values = Array.isArray(snapshot) ? snapshot : [snapshot];
419
+ const items: unknown[] = [];
420
+ let index = offset;
421
+ while (index < values.length) {
422
+ const candidate = [...items, values[index]];
423
+ if (Buffer.byteLength(JSON.stringify(candidate)) > TARGET_PAGE_BYTES && items.length) break;
424
+ if (Buffer.byteLength(JSON.stringify(candidate)) > RESPONSE_CEILING_BYTES) break;
425
+ items.push(values[index++]);
426
+ }
427
+ const complete = index >= values.length;
428
+ const page: QueryPage = { items, complete, revision };
429
+ if (!complete) {
430
+ const envelope: CursorEnvelope = {
431
+ cursorVersion: 1,
432
+ protocolMajor: 3,
433
+ sessionId: this.sessionId,
434
+ resource,
435
+ revision,
436
+ position: { offset: index, selector },
437
+ direction: "forward",
438
+ pageShape: { targetBytes: TARGET_PAGE_BYTES },
439
+ ...extra,
440
+ };
441
+ page.continuationCursor = await this.cursors.grant(request.connectionId, envelope, resource, resourceId);
442
+ page.preview = true;
443
+ }
444
+ return { id: request.id, ok: true, page };
445
+ }
446
+ async #paginateIndexed(
447
+ request: QueryRequest,
448
+ resource: string,
449
+ resourceId: string,
450
+ revision: string,
451
+ items: unknown[],
452
+ complete: boolean,
453
+ offset: number,
454
+ selector: CursorSelector,
455
+ extra: Partial<CursorEnvelope>,
456
+ ): Promise<QueryResponse> {
457
+ const page: QueryPage = { items, complete, revision };
458
+ if (!complete) {
459
+ const envelope: CursorEnvelope = {
460
+ cursorVersion: 1,
461
+ protocolMajor: 3,
462
+ sessionId: this.sessionId,
463
+ resource,
464
+ revision,
465
+ position: { offset: offset + items.length, selector },
466
+ direction: "forward",
467
+ pageShape: { targetBytes: TARGET_PAGE_BYTES },
468
+ ...extra,
469
+ };
470
+ page.continuationCursor = await this.cursors.grant(request.connectionId, envelope, resource, resourceId);
471
+ page.preview = true;
472
+ }
473
+ return { id: request.id, ok: true, page };
474
+ }
475
+
476
+ async #chunkRange(
477
+ request: QueryRequest,
478
+ kind: string,
479
+ resourceId: string,
480
+ revision: string,
481
+ range: { body: string; complete: boolean; offset: number },
482
+ selector: CursorSelector,
483
+ extra: Record<string, unknown>,
484
+ ): Promise<QueryResponse> {
485
+ const end = range.offset + Buffer.byteLength(range.body);
486
+ const page: QueryPage = {
487
+ items: [{ ...extra, byteOffset: range.offset, body: range.body, complete: range.complete }],
488
+ complete: range.complete,
489
+ revision,
490
+ };
491
+ if (!range.complete) {
492
+ const envelope: CursorEnvelope = {
493
+ cursorVersion: 1,
494
+ protocolMajor: 3,
495
+ sessionId: this.sessionId,
496
+ resource: kind,
497
+ revision,
498
+ position: { byteOffset: end, selector },
499
+ direction: "forward",
500
+ pageShape: { targetBytes: TARGET_PAGE_BYTES },
501
+ ...extra,
502
+ };
503
+ page.continuationCursor = await this.cursors.grant(request.connectionId, envelope, kind, resourceId);
504
+ page.preview = true;
505
+ }
506
+ return { id: request.id, ok: true, page };
507
+ }
508
+
509
+ #error(request: QueryRequest, code: string, restartQuery = false, message = code): QueryResponse {
510
+ return { id: request.id, ok: false, error: { code, message, ...(restartQuery ? { restartQuery: true } : {}) } };
511
+ }
512
+ }
513
+ function selectorFor(queryId: string, input: Record<string, unknown> | undefined): CursorSelector {
514
+ const selector: CursorSelector = { queryId };
515
+ for (const key of ["entryId", "field", "fileId", "hunkId", "resourceKind", "resourceId", "itemId"] as const)
516
+ if (input?.[key] !== undefined) selector[key] = String(input[key]);
517
+ return selector;
518
+ }
519
+
520
+ function idOf(value: unknown): string | undefined {
521
+ return value && typeof value === "object" ? String((value as Record<string, unknown>).id ?? "") : undefined;
522
+ }
523
+ function lastId(value: unknown): string | undefined {
524
+ return Array.isArray(value) ? idOf(value.at(-1)) : undefined;
525
+ }
526
+ function isTypedError(error: unknown): error is { code: string; message: string } {
527
+ return Boolean(
528
+ error &&
529
+ typeof error === "object" &&
530
+ typeof (error as { code?: unknown }).code === "string" &&
531
+ typeof (error as { message?: unknown }).message === "string",
532
+ );
533
+ }
@@ -0,0 +1,3 @@
1
+ export * from "./cursor.js";
2
+ export * from "./handlers.js";
3
+ export * from "./revision-store.js";