@reticlehq/server 3.7.0 → 3.8.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 (578) hide show
  1. package/SKILL.md +59 -68
  2. package/bin/reticle.js +9 -2
  3. package/dist/command/cli/adhoc-suite.js +1 -1
  4. package/dist/command/cli/adhoc-verdict.d.ts +12 -0
  5. package/dist/command/cli/adhoc-verdict.js +62 -4
  6. package/dist/command/cli/answers/gate-hook-message.d.ts +2 -0
  7. package/dist/command/cli/answers/gate-hook-message.js +5 -1
  8. package/dist/command/cli/auth/cloud-session.d.ts +11 -19
  9. package/dist/command/cli/auth/cloud-session.js +23 -0
  10. package/dist/command/cli/auth/device-flow.d.ts +3 -37
  11. package/dist/command/cli/cli-doctor.js +66 -21
  12. package/dist/command/cli/cli-flow-commands.js +53 -11
  13. package/dist/command/cli/cli-kill.d.ts +8 -0
  14. package/dist/command/cli/cli-kill.js +43 -3
  15. package/dist/command/cli/cli-parse-feedback.d.ts +4 -0
  16. package/dist/command/cli/cli-parse-feedback.js +13 -1
  17. package/dist/command/cli/cli-parse-grammar.d.ts +1 -2
  18. package/dist/command/cli/cli-parse-grammar.js +1 -6
  19. package/dist/command/cli/cli-parse-serve.d.ts +24 -0
  20. package/dist/command/cli/cli-parse-serve.js +124 -0
  21. package/dist/command/cli/cli-parse.d.ts +12 -11
  22. package/dist/command/cli/cli-parse.js +100 -123
  23. package/dist/command/cli/cli-usage.d.ts +0 -11
  24. package/dist/command/cli/cli-usage.js +43 -16
  25. package/dist/command/cli/cli-verify.d.ts +1 -1
  26. package/dist/command/cli/cli-verify.js +29 -14
  27. package/dist/command/cli/cloud-cli.js +27 -9
  28. package/dist/command/cli/cloud-kit.js +3 -3
  29. package/dist/command/cli/cloud-link.d.ts +1 -20
  30. package/dist/command/cli/cloud-link.js +2 -0
  31. package/dist/command/cli/cloud-login.d.ts +6 -2
  32. package/dist/command/cli/cloud-login.js +13 -41
  33. package/dist/command/cli/config/checkout.d.ts +10 -0
  34. package/dist/command/cli/config/checkout.js +78 -0
  35. package/dist/command/cli/doctor/doctor-agent-link.d.ts +23 -0
  36. package/dist/command/cli/doctor/doctor-agent-link.js +28 -0
  37. package/dist/command/cli/doctor/doctor-coverage-line.js +1 -7
  38. package/dist/command/cli/doctor/doctor-rows.d.ts +4 -0
  39. package/dist/command/cli/doctor/doctor-rows.js +4 -0
  40. package/dist/command/cli/drive/drive-attach.d.ts +5 -0
  41. package/dist/command/cli/drive/drive-attach.js +21 -1
  42. package/dist/command/cli/hook/codex-transcript.d.ts +20 -0
  43. package/dist/command/cli/hook/codex-transcript.js +224 -0
  44. package/dist/command/cli/hook/episode-structure.d.ts +24 -0
  45. package/dist/command/cli/hook/episode-structure.js +138 -0
  46. package/dist/command/cli/hook/hook-command.d.ts +9 -0
  47. package/dist/command/cli/hook/hook-command.js +211 -0
  48. package/dist/command/cli/hook/hook-fast.d.ts +31 -0
  49. package/dist/command/cli/hook/hook-fast.js +136 -0
  50. package/dist/command/cli/hook/prompt-hook.d.ts +30 -0
  51. package/dist/command/cli/hook/prompt-hook.js +199 -0
  52. package/dist/command/cli/hook/tool-hook.d.ts +21 -0
  53. package/dist/command/cli/hook/tool-hook.js +259 -0
  54. package/dist/command/cli/launch/cli-launch.d.ts +2 -0
  55. package/dist/command/cli/launch/cli-launch.js +22 -2
  56. package/dist/command/cli/lifecycle/daemon-lifecycle.js +28 -2
  57. package/dist/command/cli/mcp-command.d.ts +9 -0
  58. package/dist/command/cli/mcp-command.js +127 -41
  59. package/dist/command/cli/open-navigate.d.ts +43 -0
  60. package/dist/command/cli/open-navigate.js +85 -0
  61. package/dist/command/cli/ports/port-holder.d.ts +16 -4
  62. package/dist/command/cli/ports/port-holder.js +58 -12
  63. package/dist/command/cli/ports/resolve/cli-port.js +18 -2
  64. package/dist/command/cli/project-name.d.ts +1 -7
  65. package/dist/command/cli/project-name.js +1 -0
  66. package/dist/command/cli/report-command.d.ts +8 -2
  67. package/dist/command/cli/report-command.js +95 -18
  68. package/dist/command/cli/status-fields.d.ts +9 -2
  69. package/dist/command/cli/status-fields.js +148 -4
  70. package/dist/command/cli/try-command.d.ts +3 -4
  71. package/dist/command/cli/try-command.js +6 -11
  72. package/dist/command/cli/verify-results.d.ts +4 -1
  73. package/dist/command/cli/verify-results.js +3 -1
  74. package/dist/command/cli.d.ts +1 -7
  75. package/dist/command/cli.js +79 -160
  76. package/dist/command/daemon/daemon-resilience.d.ts +6 -1
  77. package/dist/command/daemon/daemon-resilience.js +31 -18
  78. package/dist/command/daemon/daemon.d.ts +11 -0
  79. package/dist/command/daemon/daemon.js +70 -2
  80. package/dist/command/daemon/lifetime/daemon-usefulness.d.ts +2 -0
  81. package/dist/command/daemon/lifetime/daemon-usefulness.js +13 -2
  82. package/dist/command/daemon/wake-decision.js +4 -2
  83. package/dist/command/daemon/win32-escape.d.ts +32 -0
  84. package/dist/command/daemon/win32-escape.js +119 -0
  85. package/dist/command/setup/agent-configs.d.ts +9 -0
  86. package/dist/command/setup/agent-configs.js +9 -0
  87. package/dist/command/setup/auto-approve.d.ts +10 -3
  88. package/dist/command/setup/auto-approve.js +51 -3
  89. package/dist/command/setup/bringup/dev-server-files.d.ts +1 -9
  90. package/dist/command/setup/bringup/dev-server-wait.js +5 -1
  91. package/dist/command/setup/bringup/ensure-daemon.js +4 -7
  92. package/dist/command/setup/init/init-host.js +6 -0
  93. package/dist/command/setup/init/init-port.js +5 -4
  94. package/dist/command/setup/init/init-runtime.js +7 -1
  95. package/dist/command/setup/node-effects.d.ts +8 -0
  96. package/dist/command/setup/node-effects.js +36 -4
  97. package/dist/command/setup/probe/dev-port.d.ts +26 -0
  98. package/dist/command/setup/probe/dev-port.js +117 -0
  99. package/dist/command/setup/probe/page-probe.d.ts +1 -1
  100. package/dist/command/setup/probe/page-probe.js +11 -3
  101. package/dist/command/setup/remaining-steps.d.ts +0 -7
  102. package/dist/command/setup/remaining-steps.js +3 -2
  103. package/dist/command/setup/run-setup.d.ts +11 -0
  104. package/dist/command/setup/run-setup.js +33 -5
  105. package/dist/command/setup/setup-command.d.ts +2 -0
  106. package/dist/command/setup/setup-command.js +22 -4
  107. package/dist/command/update/updater.d.ts +1 -6
  108. package/dist/command/update/updater.js +4 -5
  109. package/dist/command/update/version-seen.d.ts +24 -0
  110. package/dist/command/update/version-seen.js +65 -0
  111. package/dist/command/version/peer-announce.d.ts +9 -1
  112. package/dist/command/version/peer-announce.js +25 -2
  113. package/dist/command/version/sdk-fix.d.ts +5 -6
  114. package/dist/command/version/sdk-fix.js +17 -32
  115. package/dist/command/version/version-skew.d.ts +16 -1
  116. package/dist/command/version/version-skew.js +84 -10
  117. package/dist/features/crawl/crawl-tools.js +2 -2
  118. package/dist/features/crawl/crawl.js +2 -0
  119. package/dist/features/exhaust/ledger.d.ts +15 -96
  120. package/dist/features/exhaust/ledger.js +3 -3
  121. package/dist/features/harness/drive-runs.d.ts +28 -4
  122. package/dist/features/harness/drive-runs.js +99 -7
  123. package/dist/features/harness/drivers.d.ts +1 -1
  124. package/dist/features/harness/drivers.js +1 -1
  125. package/dist/features/harness/harness.d.ts +5 -0
  126. package/dist/features/harness/harness.js +24 -12
  127. package/dist/features/harness/platform/platform-drives.d.ts +7 -1
  128. package/dist/features/harness/platform/platform-drives.js +12 -7
  129. package/dist/features/harness/platform/refusal.d.ts +1 -1
  130. package/dist/features/harness/platform/refusal.js +4 -4
  131. package/dist/features/harness/platform/remote-drive.js +70 -28
  132. package/dist/features/harness/platform/server-driver.js +22 -1
  133. package/dist/features/harness/platform-config.d.ts +1 -10
  134. package/dist/features/harness/platform-config.js +0 -20
  135. package/dist/features/license/license.d.ts +2 -14
  136. package/dist/features/visual/step-shots.d.ts +33 -1
  137. package/dist/features/visual/step-shots.js +155 -1
  138. package/dist/features/visual/visual-tools.js +12 -4
  139. package/dist/hooks/coding-agents.d.ts +6 -0
  140. package/dist/hooks/coding-agents.js +24 -3
  141. package/dist/hooks/episode-stamp.d.ts +32 -0
  142. package/dist/hooks/episode-stamp.js +61 -0
  143. package/dist/hooks/hook-commands.js +19 -9
  144. package/dist/index.d.ts +5 -1
  145. package/dist/index.js +66 -24
  146. package/dist/judgement/app-graph/journal-steps.d.ts +8 -0
  147. package/dist/judgement/app-graph/journal-steps.js +92 -0
  148. package/dist/judgement/capsule/capsule-store.d.ts +2 -39
  149. package/dist/judgement/domain/domain-model.js +1 -10
  150. package/dist/judgement/domain/domain-tools.js +4 -2
  151. package/dist/judgement/runs/artifact/run-store.d.ts +28 -8
  152. package/dist/judgement/runs/artifact/run-store.js +153 -28
  153. package/dist/judgement/runs/default-run-id.d.ts +3 -1
  154. package/dist/judgement/runs/default-run-id.js +15 -3
  155. package/dist/judgement/runs/drive-run.d.ts +3 -3
  156. package/dist/judgement/runs/drive-run.js +11 -7
  157. package/dist/judgement/runs/run-ledger.d.ts +21 -0
  158. package/dist/judgement/runs/run-ledger.js +143 -0
  159. package/dist/judgement/runs/runner-port.d.ts +1 -1
  160. package/dist/judgement/runs/runner-port.js +8 -2
  161. package/dist/judgement/runs/verification-sync.d.ts +4 -3
  162. package/dist/judgement/runs/verification-sync.js +27 -5
  163. package/dist/language/flows/affected-tools.js +2 -1
  164. package/dist/language/flows/annotate-notes/annotate.js +8 -3
  165. package/dist/language/flows/annotate-tools.js +1 -1
  166. package/dist/language/flows/change/affected.d.ts +8 -0
  167. package/dist/language/flows/change/affected.js +20 -7
  168. package/dist/language/flows/decision.js +19 -4
  169. package/dist/language/flows/fields/flow-secret-field.d.ts +9 -0
  170. package/dist/language/flows/fields/flow-secret-field.js +67 -5
  171. package/dist/language/flows/flow-anchor.d.ts +5 -0
  172. package/dist/language/flows/flow-anchor.js +4 -0
  173. package/dist/language/flows/flow-cross-step.d.ts +7 -1
  174. package/dist/language/flows/flow-cross-step.js +9 -0
  175. package/dist/language/flows/flow-expect-grammar.js +15 -10
  176. package/dist/language/flows/flow-intent.js +6 -1
  177. package/dist/language/flows/flow-journey.d.ts +8 -0
  178. package/dist/language/flows/flow-journey.js +13 -0
  179. package/dist/language/flows/flow-lease.d.ts +27 -0
  180. package/dist/language/flows/flow-lease.js +59 -0
  181. package/dist/language/flows/flow-replay-run.d.ts +1 -87
  182. package/dist/language/flows/flow-replay-run.js +111 -310
  183. package/dist/language/flows/flow-replay.js +21 -19
  184. package/dist/language/flows/flow-replayable.d.ts +38 -0
  185. package/dist/language/flows/flow-replayable.js +179 -0
  186. package/dist/language/flows/flow-start-path.d.ts +108 -0
  187. package/dist/language/flows/flow-start-path.js +313 -0
  188. package/dist/language/flows/flow-step-runners.d.ts +23 -2
  189. package/dist/language/flows/flow-step-runners.js +191 -32
  190. package/dist/language/flows/flow-store-for-session.d.ts +8 -1
  191. package/dist/language/flows/flow-store-for-session.js +6 -0
  192. package/dist/language/flows/flow-tools.d.ts +2 -23
  193. package/dist/language/flows/flow-tools.js +63 -113
  194. package/dist/language/flows/flows.d.ts +4 -6
  195. package/dist/language/flows/flows.js +90 -15
  196. package/dist/language/flows/heal-run.d.ts +10 -4
  197. package/dist/language/flows/heal-run.js +26 -9
  198. package/dist/language/flows/recording/flake.d.ts +3 -27
  199. package/dist/language/flows/recording/flake.js +1 -1
  200. package/dist/language/flows/recording/recording-backtrack.js +1 -4
  201. package/dist/language/flows/recording/tape/recordings.d.ts +11 -1
  202. package/dist/language/flows/recording/tape/recordings.js +9 -3
  203. package/dist/language/flows/replay.d.ts +25 -5
  204. package/dist/language/flows/replay.js +83 -16
  205. package/dist/language/flows/stores/assertion-tiers-store.js +1 -1
  206. package/dist/language/flows/suite/coverage.d.ts +9 -0
  207. package/dist/language/flows/suite/coverage.js +12 -1
  208. package/dist/language/flows/suite-selection.d.ts +25 -0
  209. package/dist/language/flows/suite-selection.js +41 -9
  210. package/dist/machine/git-tracks.d.ts +6 -0
  211. package/dist/machine/git-tracks.js +36 -0
  212. package/dist/memory/cloud/background-sync.d.ts +25 -0
  213. package/dist/memory/cloud/background-sync.js +79 -0
  214. package/dist/memory/cloud/cloud-config.d.ts +12 -1
  215. package/dist/memory/cloud/cloud-config.js +39 -13
  216. package/dist/memory/cloud/cloud-sync.d.ts +3 -24
  217. package/dist/memory/cloud/cloud-sync.js +5 -2
  218. package/dist/memory/cloud/harness-config.d.ts +0 -7
  219. package/dist/memory/cloud/memory-scope.d.ts +19 -0
  220. package/dist/memory/cloud/memory-scope.js +48 -0
  221. package/dist/memory/cloud/sync-answer.d.ts +43 -0
  222. package/dist/memory/cloud/sync-answer.js +42 -0
  223. package/dist/memory/cloud/sync-cycle.d.ts +40 -10
  224. package/dist/memory/cloud/sync-cycle.js +97 -144
  225. package/dist/memory/cloud/sync-daemon.d.ts +50 -3
  226. package/dist/memory/cloud/sync-daemon.js +473 -83
  227. package/dist/memory/cloud/sync-describe.d.ts +28 -0
  228. package/dist/memory/cloud/sync-describe.js +92 -0
  229. package/dist/memory/cloud/sync-disk.d.ts +9 -1
  230. package/dist/memory/cloud/sync-disk.js +137 -33
  231. package/dist/memory/cloud/sync-flow-versions.d.ts +26 -0
  232. package/dist/memory/cloud/sync-flow-versions.js +42 -0
  233. package/dist/memory/impact/impact-store.js +32 -15
  234. package/dist/memory/intent/intent-shard.d.ts +41 -266
  235. package/dist/memory/intent/intent-tools.js +20 -61
  236. package/dist/memory/intent/record-request.d.ts +27 -0
  237. package/dist/memory/intent/record-request.js +88 -0
  238. package/dist/memory/intent/settled-words.js +9 -1
  239. package/dist/memory/journal/drive-flow.d.ts +3 -0
  240. package/dist/memory/journal/drive-flow.js +11 -41
  241. package/dist/memory/journal/envelope-store.js +1 -1
  242. package/dist/memory/journal/envelope.d.ts +6 -154
  243. package/dist/memory/journal/episode-log.d.ts +107 -0
  244. package/dist/memory/journal/episode-log.js +302 -0
  245. package/dist/memory/journal/journal-recorder.d.ts +7 -0
  246. package/dist/memory/journal/journal-recorder.js +22 -9
  247. package/dist/memory/journal/on-disk/ambient-file.d.ts +1 -7
  248. package/dist/memory/journal/on-disk/ambient-file.js +1 -1
  249. package/dist/memory/journal/on-disk/workspace-gitignore.d.ts +24 -3
  250. package/dist/memory/journal/on-disk/workspace-gitignore.js +38 -7
  251. package/dist/memory/journal/on-disk/workspace-tiers.js +7 -0
  252. package/dist/memory/journal/self-observation.js +3 -1
  253. package/dist/memory/journal/session-end.js +23 -9
  254. package/dist/memory/journal/session-journal.js +39 -20
  255. package/dist/memory/project/artifact-root-resolver.d.ts +14 -1
  256. package/dist/memory/project/artifact-root-resolver.js +68 -23
  257. package/dist/memory/project/artifact-root.d.ts +17 -3
  258. package/dist/memory/project/artifact-root.js +47 -9
  259. package/dist/memory/project/fs/fs-port.d.ts +5 -0
  260. package/dist/memory/project/fs/fs-port.js +13 -0
  261. package/dist/memory/project/learned-routes.d.ts +3 -4
  262. package/dist/memory/project/learned-routes.js +3 -11
  263. package/dist/memory/project/link-directory.js +5 -2
  264. package/dist/memory/project/root-claims.d.ts +3 -1
  265. package/dist/memory/project/root-claims.js +41 -7
  266. package/dist/memory/project/session-root.d.ts +1 -1
  267. package/dist/memory/project/session-root.js +1 -15
  268. package/dist/memory/project/sync-status.js +5 -6
  269. package/dist/memory/recall/memory-tools.js +2 -2
  270. package/dist/memory/recall/platform-memory.d.ts +3 -1
  271. package/dist/memory/recall/platform-memory.js +9 -1
  272. package/dist/memory/recall/project-memory.js +15 -19
  273. package/dist/portal/bridge/auth-failure-reason.d.ts +13 -0
  274. package/dist/portal/bridge/auth-failure-reason.js +19 -0
  275. package/dist/portal/bridge/bridge.d.ts +19 -4
  276. package/dist/portal/bridge/bridge.js +150 -177
  277. package/dist/portal/bridge/harness-request.d.ts +15 -0
  278. package/dist/portal/bridge/harness-request.js +19 -0
  279. package/dist/portal/bridge/origin/origin-follow.d.ts +46 -0
  280. package/dist/portal/bridge/origin/origin-follow.js +110 -0
  281. package/dist/portal/bridge/pairing-token.d.ts +6 -0
  282. package/dist/portal/bridge/pairing-token.js +47 -16
  283. package/dist/portal/bridge/protocol-skew.d.ts +27 -2
  284. package/dist/portal/bridge/protocol-skew.js +66 -2
  285. package/dist/portal/bridge/session-nonces.d.ts +46 -0
  286. package/dist/portal/bridge/session-nonces.js +72 -0
  287. package/dist/portal/input/viewport-tools.d.ts +31 -0
  288. package/dist/portal/input/viewport-tools.js +106 -15
  289. package/dist/portal/pool/bounded-close.d.ts +23 -0
  290. package/dist/portal/pool/bounded-close.js +38 -0
  291. package/dist/portal/pool/browser-pool.d.ts +44 -39
  292. package/dist/portal/pool/browser-pool.js +247 -95
  293. package/dist/portal/pool/context-permissions.d.ts +9 -1
  294. package/dist/portal/pool/context-permissions.js +26 -0
  295. package/dist/portal/pool/lease-emulation.d.ts +37 -0
  296. package/dist/portal/pool/lease-emulation.js +29 -0
  297. package/dist/portal/pool/playwright-launcher.d.ts +6 -0
  298. package/dist/portal/pool/playwright-launcher.js +74 -7
  299. package/dist/portal/pool/pool-contract.d.ts +23 -1
  300. package/dist/portal/pool/pool-lease.d.ts +128 -0
  301. package/dist/portal/pool/pool-lease.js +49 -0
  302. package/dist/portal/pool/zero-install.d.ts +8 -1
  303. package/dist/portal/pool/zero-install.js +24 -2
  304. package/dist/portal/production/production-activation.d.ts +136 -0
  305. package/dist/portal/production/production-activation.js +173 -0
  306. package/dist/portal/production/production-drive.d.ts +52 -0
  307. package/dist/portal/production/production-drive.js +301 -0
  308. package/dist/portal/production/production-hello.d.ts +23 -0
  309. package/dist/portal/production/production-hello.js +23 -0
  310. package/dist/portal/realm/web-realm.js +42 -15
  311. package/dist/portal/session/control-envelope.d.ts +1 -1
  312. package/dist/portal/session/dev-server/served-document.d.ts +0 -5
  313. package/dist/portal/session/dev-server/served-document.js +6 -8
  314. package/dist/portal/session/facts/handshake-facts.d.ts +8 -1
  315. package/dist/portal/session/first-run-wiring.d.ts +3 -36
  316. package/dist/portal/session/first-run-wiring.js +10 -103
  317. package/dist/portal/session/live-control-tools.js +61 -19
  318. package/dist/portal/session/no-session-next-action.d.ts +11 -0
  319. package/dist/portal/session/no-session-next-action.js +40 -15
  320. package/dist/portal/session/no-session-watch.d.ts +7 -0
  321. package/dist/portal/session/no-session-watch.js +67 -23
  322. package/dist/portal/session/output-budget.d.ts +10 -0
  323. package/dist/portal/session/output-budget.js +16 -0
  324. package/dist/portal/session/presence/session-lease.d.ts +2 -0
  325. package/dist/portal/session/presence/session-lease.js +8 -0
  326. package/dist/portal/session/recorded-gaps.d.ts +15 -11
  327. package/dist/portal/session/recorded-gaps.js +39 -18
  328. package/dist/portal/session/serving-directory.d.ts +24 -2
  329. package/dist/portal/session/serving-directory.js +93 -5
  330. package/dist/portal/session/session-info.d.ts +26 -0
  331. package/dist/portal/session/session-info.js +20 -0
  332. package/dist/portal/session/session-manager.d.ts +35 -3
  333. package/dist/portal/session/session-manager.js +69 -14
  334. package/dist/portal/session/session-successor.js +1 -9
  335. package/dist/portal/session/session-tools.js +22 -4
  336. package/dist/portal/session/session.d.ts +10 -10
  337. package/dist/portal/session/session.js +37 -29
  338. package/dist/portal/session/zero-install-first-call.d.ts +7 -2
  339. package/dist/portal/session/zero-install-first-call.js +43 -20
  340. package/dist/start-wiring.d.ts +2 -2
  341. package/dist/start-wiring.js +17 -3
  342. package/dist/status-payload.d.ts +11 -1
  343. package/dist/status-payload.js +7 -1
  344. package/dist/surface/agent-presence-grace.d.ts +11 -0
  345. package/dist/surface/agent-presence-grace.js +34 -0
  346. package/dist/surface/http-server.d.ts +12 -1
  347. package/dist/surface/http-server.js +64 -15
  348. package/dist/surface/mcp/faults/mcp-outage.d.ts +12 -2
  349. package/dist/surface/mcp/faults/mcp-outage.js +19 -1
  350. package/dist/surface/mcp/mcp-proxy.d.ts +17 -74
  351. package/dist/surface/mcp/mcp-proxy.js +194 -267
  352. package/dist/surface/mcp/mcp.d.ts +20 -3
  353. package/dist/surface/mcp/mcp.js +88 -25
  354. package/dist/surface/mcp/proxy/drive-calls.d.ts +44 -0
  355. package/dist/surface/mcp/proxy/drive-calls.js +114 -5
  356. package/dist/surface/mcp/proxy/proxy-boot.d.ts +11 -0
  357. package/dist/surface/mcp/proxy/proxy-boot.js +1 -0
  358. package/dist/surface/mcp/proxy/proxy-daemon-probe.d.ts +6 -0
  359. package/dist/surface/mcp/proxy/proxy-daemon-probe.js +14 -1
  360. package/dist/surface/mcp/proxy/proxy-handshake.d.ts +34 -2
  361. package/dist/surface/mcp/proxy/proxy-handshake.js +76 -8
  362. package/dist/surface/mcp/server-instructions.js +35 -16
  363. package/dist/surface/mcp/shared-params.d.ts +8 -0
  364. package/dist/surface/mcp/shared-params.js +15 -1
  365. package/dist/surface/mcp/sse-frame-parser.d.ts +11 -0
  366. package/dist/surface/mcp/sse-frame-parser.js +18 -0
  367. package/dist/surface/mcp/surface-vocabulary.d.ts +2 -0
  368. package/dist/surface/mcp/surface-vocabulary.js +13 -0
  369. package/dist/surface/mcp/tool-catalog-cache.d.ts +2 -0
  370. package/dist/surface/mcp/tool-catalog-cache.js +14 -4
  371. package/dist/surface/tools/account-tool.d.ts +4 -3
  372. package/dist/surface/tools/account-tool.js +20 -31
  373. package/dist/surface/tools/act/act-danger.d.ts +2 -0
  374. package/dist/surface/tools/act/act-danger.js +41 -14
  375. package/dist/surface/tools/act/act-observation.d.ts +11 -0
  376. package/dist/surface/tools/act/act-observation.js +33 -0
  377. package/dist/surface/tools/act/act-preflight.js +10 -3
  378. package/dist/surface/tools/act/act-sequence-retry.js +2 -1
  379. package/dist/surface/tools/act/act-target.js +19 -5
  380. package/dist/surface/tools/act/durable.js +1 -1
  381. package/dist/surface/tools/act/navigation/navigate-arrival.d.ts +9 -7
  382. package/dist/surface/tools/act/navigation/navigate-arrival.js +11 -14
  383. package/dist/surface/tools/act/unsettled-find.d.ts +36 -0
  384. package/dist/surface/tools/act/unsettled-find.js +71 -0
  385. package/dist/surface/tools/act-sequence-tool.js +53 -24
  386. package/dist/surface/tools/act-tools.d.ts +2 -3
  387. package/dist/surface/tools/act-tools.js +49 -47
  388. package/dist/surface/tools/agent/compact-envelope.d.ts +2 -2
  389. package/dist/surface/tools/agent/for-the-agent.js +41 -3
  390. package/dist/surface/tools/assert/assert-grade.js +8 -3
  391. package/dist/surface/tools/assert/assert-verdict.js +4 -2
  392. package/dist/surface/tools/browser-tools.js +7 -4
  393. package/dist/surface/tools/chat-drives.js +50 -25
  394. package/dist/surface/tools/coverage-tools.js +1 -1
  395. package/dist/surface/tools/dynamic-tools.d.ts +8 -0
  396. package/dist/surface/tools/dynamic-tools.js +89 -34
  397. package/dist/surface/tools/empty-session-list.d.ts +18 -25
  398. package/dist/surface/tools/empty-session-list.js +67 -38
  399. package/dist/surface/tools/error-recovery.d.ts +17 -7
  400. package/dist/surface/tools/error-recovery.js +53 -20
  401. package/dist/surface/tools/explore-tools.d.ts +10 -0
  402. package/dist/surface/tools/explore-tools.js +72 -19
  403. package/dist/surface/tools/feedback-tools.js +23 -2
  404. package/dist/surface/tools/gap-novelty.d.ts +6 -0
  405. package/dist/surface/tools/gap-novelty.js +9 -0
  406. package/dist/surface/tools/gaps/capability-absences.js +4 -3
  407. package/dist/surface/tools/harness-explore.d.ts +1 -1
  408. package/dist/surface/tools/harness-explore.js +6 -4
  409. package/dist/surface/tools/harness-gate.d.ts +43 -21
  410. package/dist/surface/tools/harness-gate.js +55 -81
  411. package/dist/surface/tools/harness-script.d.ts +2 -0
  412. package/dist/surface/tools/harness-script.js +11 -6
  413. package/dist/surface/tools/harness-toolset.js +3 -4
  414. package/dist/surface/tools/invoke-tool.d.ts +0 -8
  415. package/dist/surface/tools/invoke-tool.js +164 -178
  416. package/dist/surface/tools/lease-hint.d.ts +9 -0
  417. package/dist/surface/tools/lease-hint.js +22 -3
  418. package/dist/surface/tools/lease-permissions.d.ts +1 -1
  419. package/dist/surface/tools/lease-readiness.d.ts +55 -0
  420. package/dist/surface/tools/lease-readiness.js +150 -2
  421. package/dist/surface/tools/lease-tools.d.ts +3 -75
  422. package/dist/surface/tools/lease-tools.js +124 -188
  423. package/dist/surface/tools/map-tools.d.ts +20 -0
  424. package/dist/surface/tools/map-tools.js +145 -0
  425. package/dist/surface/tools/merge-tools.js +11 -7
  426. package/dist/surface/tools/next-step.js +6 -3
  427. package/dist/surface/tools/observe-tools.js +46 -35
  428. package/dist/surface/tools/platform-moment.d.ts +3 -12
  429. package/dist/surface/tools/platform-moment.js +12 -24
  430. package/dist/surface/tools/read/complete-snapshot.d.ts +7 -1
  431. package/dist/surface/tools/read/complete-snapshot.js +13 -2
  432. package/dist/surface/tools/read/query-paginate.js +6 -0
  433. package/dist/surface/tools/read/query-shape.d.ts +9 -0
  434. package/dist/surface/tools/read/query-shape.js +15 -0
  435. package/dist/surface/tools/read/snapshot-unmounted-note.d.ts +1 -0
  436. package/dist/surface/tools/read/snapshot-unmounted-note.js +73 -0
  437. package/dist/surface/tools/read-tools.js +5 -5
  438. package/dist/surface/tools/real-input-attempt.d.ts +11 -0
  439. package/dist/surface/tools/real-input-attempt.js +206 -38
  440. package/dist/surface/tools/reconcile-tools.js +21 -8
  441. package/dist/surface/tools/reticle-result.d.ts +3 -0
  442. package/dist/surface/tools/reticle-result.js +8 -1
  443. package/dist/surface/tools/run-report.d.ts +22 -0
  444. package/dist/surface/tools/run-report.js +141 -0
  445. package/dist/surface/tools/session-ports.d.ts +57 -0
  446. package/dist/surface/tools/session-ports.js +102 -0
  447. package/dist/surface/tools/tool-kit.d.ts +58 -4
  448. package/dist/surface/tools/tool-kit.js +140 -6
  449. package/dist/surface/tools/tool-surface.d.ts +2 -0
  450. package/dist/surface/tools/tool-surface.js +45 -0
  451. package/dist/surface/tools/tools.js +49 -87
  452. package/dist/telemetry/automation-hint.d.ts +5 -0
  453. package/dist/telemetry/automation-hint.js +7 -0
  454. package/dist/telemetry/cli-telemetry.d.ts +22 -0
  455. package/dist/telemetry/cli-telemetry.js +80 -11
  456. package/dist/telemetry/daemon-telemetry.d.ts +3 -1
  457. package/dist/telemetry/daemon-telemetry.js +9 -2
  458. package/dist/telemetry/feedback-cli.d.ts +1 -1
  459. package/dist/telemetry/feedback-cli.js +8 -3
  460. package/dist/telemetry/feedback.d.ts +1 -1
  461. package/dist/telemetry/feedback.js +51 -4
  462. package/dist/telemetry/harness-run.d.ts +3 -3
  463. package/dist/telemetry/harness-run.js +18 -7
  464. package/dist/telemetry/hud-events.d.ts +1 -1
  465. package/dist/telemetry/hud-metrics.d.ts +6 -3
  466. package/dist/telemetry/hud-metrics.js +20 -8
  467. package/dist/telemetry/install-source.js +1 -1
  468. package/dist/telemetry/mcp-connection.d.ts +1 -1
  469. package/dist/telemetry/mcp-connection.js +21 -2
  470. package/dist/telemetry/onboarding-firsts.d.ts +6 -1
  471. package/dist/telemetry/onboarding-firsts.js +41 -1
  472. package/dist/telemetry/proxy-telemetry.d.ts +42 -0
  473. package/dist/telemetry/proxy-telemetry.js +70 -1
  474. package/dist/telemetry/session-metrics.d.ts +1 -3
  475. package/dist/telemetry/session-metrics.js +16 -12
  476. package/dist/telemetry/telemetry.d.ts +9 -1
  477. package/dist/telemetry/telemetry.js +16 -1
  478. package/dist/telemetry/verification-of.d.ts +3 -1
  479. package/dist/telemetry/verification-of.js +7 -1
  480. package/dist/wire-journal.js +12 -2
  481. package/docs/README.md +4 -2
  482. package/docs/actions.mdx +7 -6
  483. package/docs/adapters.md +2 -1
  484. package/docs/agent-cheatsheet.md +19 -5
  485. package/docs/architecture.md +13 -10
  486. package/docs/autodrive.md +6 -5
  487. package/docs/benchmarks.md +2 -2
  488. package/docs/capabilities.mdx +1 -1
  489. package/docs/cli/affected.mdx +1 -1
  490. package/docs/cli/cloud.mdx +6 -6
  491. package/docs/cli/doctor.mdx +3 -1
  492. package/docs/cli/feedback.mdx +11 -7
  493. package/docs/cli/gate.mdx +1 -1
  494. package/docs/cli/help.mdx +1 -1
  495. package/docs/cli/init.mdx +20 -16
  496. package/docs/cli/mcp.mdx +5 -2
  497. package/docs/cli/open.mdx +5 -2
  498. package/docs/cli/report.mdx +1 -1
  499. package/docs/cli/restart.mdx +1 -1
  500. package/docs/cli/rollback.mdx +4 -4
  501. package/docs/cli/serve.mdx +7 -5
  502. package/docs/cli/setup.mdx +1 -1
  503. package/docs/cli/status.mdx +6 -2
  504. package/docs/cli/stop.mdx +3 -3
  505. package/docs/cli/telemetry.mdx +5 -1
  506. package/docs/cli/try.mdx +8 -8
  507. package/docs/cli/update.mdx +8 -5
  508. package/docs/cli/verify.mdx +12 -5
  509. package/docs/cli/version.mdx +1 -1
  510. package/docs/cli.mdx +10 -6
  511. package/docs/debugging.md +1 -1
  512. package/docs/deploy-checks.md +8 -6
  513. package/docs/desktop.mdx +14 -18
  514. package/docs/enterprise.md +6 -6
  515. package/docs/environment.mdx +5 -3
  516. package/docs/faq.mdx +9 -6
  517. package/docs/first-drive.md +19 -9
  518. package/docs/flows.md +3 -4
  519. package/docs/for-agents.md +1 -1
  520. package/docs/frameworks.mdx +34 -11
  521. package/docs/getting-started.md +46 -29
  522. package/docs/http-transport.md +2 -2
  523. package/docs/human-control.md +8 -8
  524. package/docs/index.mdx +2 -2
  525. package/docs/install-agentic.mdx +18 -19
  526. package/docs/install-manual.mdx +8 -4
  527. package/docs/integration-patterns.md +5 -5
  528. package/docs/multi-agent-testing.md +7 -5
  529. package/docs/packages/browser.mdx +34 -2
  530. package/docs/packages/core.mdx +2 -1
  531. package/docs/packages/electron.mdx +15 -3
  532. package/docs/packages/eslint-plugin.mdx +1 -1
  533. package/docs/packages/next.mdx +17 -5
  534. package/docs/packages/react.mdx +8 -1
  535. package/docs/packages/server.mdx +3 -3
  536. package/docs/packages/tauri.mdx +3 -3
  537. package/docs/packages/vite-plugin.mdx +1 -1
  538. package/docs/packages.mdx +19 -6
  539. package/docs/platform-integration.md +12 -4
  540. package/docs/predicates.mdx +18 -7
  541. package/docs/production-mode.md +108 -0
  542. package/docs/prompt-capture.md +99 -0
  543. package/docs/quickstart.mdx +14 -12
  544. package/docs/recipes.mdx +9 -8
  545. package/docs/required-checks.md +3 -2
  546. package/docs/skill-file.mdx +4 -3
  547. package/docs/skill-setup.md +2 -2
  548. package/docs/skill.md +62 -70
  549. package/docs/state-files.md +1 -0
  550. package/docs/state-management.mdx +11 -9
  551. package/docs/system-map.md +14 -13
  552. package/docs/telemetry.md +32 -24
  553. package/docs/testing.md +9 -5
  554. package/docs/tools/act-and-wait.mdx +17 -13
  555. package/docs/tools/act-sequence.mdx +40 -66
  556. package/docs/tools/act.mdx +7 -5
  557. package/docs/tools/assert.mdx +1 -1
  558. package/docs/tools/look.mdx +1 -1
  559. package/docs/tools/navigate.mdx +1 -1
  560. package/docs/tools/network.mdx +13 -11
  561. package/docs/tools/overview.mdx +3 -3
  562. package/docs/tools/query.mdx +3 -3
  563. package/docs/tools/session-and-feedback.mdx +9 -6
  564. package/docs/tools/sessions.mdx +7 -0
  565. package/docs/tools/snapshot.mdx +9 -7
  566. package/docs/tools/tools-and-run.mdx +11 -10
  567. package/docs/tools/verify.mdx +1 -1
  568. package/docs/troubleshooting.mdx +21 -9
  569. package/docs/usage.md +58 -43
  570. package/docs/use-cases.mdx +2 -2
  571. package/docs/vs-chrome-devtools-mcp.mdx +5 -5
  572. package/docs/vs-playwright-mcp.mdx +5 -4
  573. package/docs/what-is-recorded.md +12 -7
  574. package/docs/what-is-reticle.mdx +2 -2
  575. package/docs/why-reticle.mdx +1 -1
  576. package/package.json +9 -12
  577. package/dist/command/dev/stale-issue-guard.d.ts +0 -34
  578. package/dist/command/dev/stale-issue-guard.js +0 -69
@@ -1,8 +1,8 @@
1
1
  import * as http from 'node:http';
2
2
  import { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';
3
- import { MCP_SSE_PATH, MCP_MESSAGE_PATH, MCP_SHUTDOWN_EVENT, STATUS_PATH, STATUS_HOLD_QUERY, DRIVE_PATH, } from '@reticlehq/core';
3
+ import { MCP_SSE_PATH, MCP_MESSAGE_PATH, MCP_SHUTDOWN_EVENT, STATUS_PATH, STATUS_HOLD_QUERY, DRIVE_PATH, SHUTDOWN_PATH, PROXY_ID_PARAM, } from '@reticlehq/core';
4
4
  import { getSessionMetrics } from '../telemetry/session-metrics.js';
5
- import { agentPeerSkew, PEER_VERSION_PARAM, PEER_CONTRACT_PARAM, } from '../command/version/peer-announce.js';
5
+ import { agentPeerSkew, agentSessionOf, AGENT_SESSION_PARAM, PEER_VERSION_PARAM, PEER_CONTRACT_PARAM, } from '../command/version/peer-announce.js';
6
6
  import { log } from '../log.js';
7
7
  import { isLoopbackHost, isLocalWebOrigin, isLoopbackPeer, requestToken, tokensMatch, } from '../portal/bridge/token-auth.js';
8
8
  import { clientDirectoryFromPeer, runWithClientDirectory } from '../hooks/client-directory.js';
@@ -18,8 +18,10 @@ import { LOOPBACK_IDLE_MS } from './loopback-agent.js';
18
18
  */
19
19
  export function createSharedServer(options = {}) {
20
20
  let mcpFactory;
21
+ let pageSdkVersions = () => [];
21
22
  let statusProvider;
22
23
  let driveProvider;
24
+ let shutdownHandler;
23
25
  let agentPresence;
24
26
  const transports = new Map();
25
27
  /**
@@ -47,10 +49,12 @@ export function createSharedServer(options = {}) {
47
49
  const localClient = isLoopbackPeer(req.socket.remoteAddress) &&
48
50
  isLoopbackHost(req.headers.host) &&
49
51
  isLocalWebOrigin(req.headers.origin, req.headers.referer);
50
- if (localClient)
52
+ if (localClient) {
51
53
  return true;
52
- if (token === undefined)
54
+ }
55
+ if (token === undefined) {
53
56
  return false;
57
+ }
54
58
  return tokensMatch(token, requestToken(req, url));
55
59
  };
56
60
  const httpServer = http.createServer((req, res) => {
@@ -90,6 +94,30 @@ export function createSharedServer(options = {}) {
90
94
  res.end(body);
91
95
  return;
92
96
  }
97
+ if ('POST' === req.method && path === SHUTDOWN_PATH) {
98
+ // Stricter than the routes above: loopback alone is not enough to stop a daemon that serves
99
+ // every agent on this machine. The caller must also show the pairing token.
100
+ if (!isLoopbackPeer(req.socket.remoteAddress) || token === undefined) {
101
+ res.writeHead(403, { 'Content-Type': 'text/plain' });
102
+ res.end('forbidden');
103
+ return;
104
+ }
105
+ if (!tokensMatch(token, requestToken(req, url))) {
106
+ res.writeHead(401, { 'Content-Type': 'text/plain' });
107
+ res.end('unauthorized');
108
+ return;
109
+ }
110
+ const handler = shutdownHandler;
111
+ if (handler === undefined) {
112
+ res.writeHead(404, { 'Content-Type': 'text/plain' });
113
+ res.end('not found');
114
+ return;
115
+ }
116
+ // Answer first: the shutdown closes this server.
117
+ res.writeHead(202, { 'Content-Type': 'text/plain' });
118
+ res.end('stopping', () => handler());
119
+ return;
120
+ }
93
121
  if ('POST' === req.method && path === DRIVE_PATH) {
94
122
  if (driveProvider === undefined) {
95
123
  res.writeHead(404, { 'Content-Type': 'text/plain' });
@@ -148,7 +176,7 @@ export function createSharedServer(options = {}) {
148
176
  // own check (a stderr line no agent reads), a nudge queued here rides out on the agent's next
149
177
  // tool result. That is the pair the user hits after `npm update`: a cached npx MCP package
150
178
  // talking to a daemon from a different build.
151
- const peerSkew = agentPeerSkew(url.searchParams.get(PEER_VERSION_PARAM), url.searchParams.get(PEER_CONTRACT_PARAM));
179
+ const peerSkew = agentPeerSkew(url.searchParams.get(PEER_VERSION_PARAM), url.searchParams.get(PEER_CONTRACT_PARAM), pageSdkVersions());
152
180
  if (mcpFactory === undefined) {
153
181
  res.writeHead(503, { 'Content-Type': 'text/plain' });
154
182
  res.end('MCP server not ready');
@@ -158,16 +186,19 @@ export function createSharedServer(options = {}) {
158
186
  // one active transport per Server instance, so concurrent clients each need
159
187
  // their own instance backed by the same shared ToolDeps.
160
188
  // Handed to THIS connection's server only: the skew is about this agent, not the daemon (#1136).
161
- const mcpServer = mcpFactory(peerSkew);
189
+ // The agent's own session id, so this connection's episode joins the agent hooks' records.
190
+ const mcpServer = mcpFactory(peerSkew, proxyIdOf(url.searchParams.get(PROXY_ID_PARAM)), agentSessionOf(url.searchParams.get(AGENT_SESSION_PARAM)));
162
191
  const transport = new SSEServerTransport(MCP_MESSAGE_PATH, res);
163
192
  const sid = transport.sessionId;
164
193
  transports.set(sid, transport);
165
194
  sseStreams.set(sid, res);
166
195
  const peerVersion = url.searchParams.get(PEER_VERSION_PARAM);
167
- if (null !== peerVersion && 0 < peerVersion.length)
196
+ if (null !== peerVersion && 0 < peerVersion.length) {
168
197
  peerVersions.set(sid, peerVersion);
169
- if (1 === transports.size)
170
- agentPresence?.(true); // first agent attached
198
+ }
199
+ if (1 === transports.size) {
200
+ agentPresence?.(true);
201
+ } // first agent attached
171
202
  res.on('close', () => {
172
203
  transports.delete(sid);
173
204
  sseStreams.delete(sid);
@@ -183,8 +214,9 @@ export function createSharedServer(options = {}) {
183
214
  catch {
184
215
  /* a counter must never affect a disconnect path */
185
216
  }
186
- if (0 === transports.size)
187
- agentPresence?.(false); // last agent detached → it's the human's turn
217
+ if (0 === transports.size) {
218
+ agentPresence?.(false);
219
+ } // last agent detached → it's the human's turn
188
220
  });
189
221
  mcpServer
190
222
  .connect(transport)
@@ -233,12 +265,18 @@ export function createSharedServer(options = {}) {
233
265
  function attachDrive(provider) {
234
266
  driveProvider = provider;
235
267
  }
268
+ function attachShutdown(handler) {
269
+ shutdownHandler = handler;
270
+ }
236
271
  function attachAgentPresence(cb) {
237
272
  agentPresence = cb;
238
273
  }
239
274
  function attachMcp(factory) {
240
275
  mcpFactory = factory;
241
276
  }
277
+ function attachPageSdkVersions(provider) {
278
+ pageSdkVersions = provider;
279
+ }
242
280
  function announceShutdown() {
243
281
  for (const [sid, stream] of sseStreams) {
244
282
  try {
@@ -271,8 +309,9 @@ export function createSharedServer(options = {}) {
271
309
  'ERR_SERVER_NOT_RUNNING' !== err.code) {
272
310
  reject(err);
273
311
  }
274
- else
312
+ else {
275
313
  resolve();
314
+ }
276
315
  });
277
316
  });
278
317
  }
@@ -290,8 +329,10 @@ export function createSharedServer(options = {}) {
290
329
  return {
291
330
  httpServer,
292
331
  attachMcp,
332
+ attachPageSdkVersions,
293
333
  attachStatus,
294
334
  attachDrive,
335
+ attachShutdown,
295
336
  attachAgentPresence,
296
337
  announceShutdown,
297
338
  close,
@@ -308,12 +349,18 @@ const MAX_DRIVE_BODY_BYTES = 8 * 1024;
308
349
  * because real clients send them.
309
350
  */
310
351
  const JSON_MEDIA_TYPE = 'application/json';
352
+ /** A proxy id is a UUID. Anything else is not an id this daemon keys an agent by. */
353
+ const PROXY_ID_SHAPE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
354
+ function proxyIdOf(raw) {
355
+ return null !== raw && PROXY_ID_SHAPE.test(raw) ? raw : undefined;
356
+ }
311
357
  function isJsonRequest(req) {
312
358
  // Read through the typed accessor rather than indexing the header bag: the index signature is
313
359
  // `any`-shaped, and narrowing after an unsafe read is narrowing a lie.
314
360
  const value = req.headersDistinct['content-type']?.[0];
315
- if (undefined === value)
361
+ if (undefined === value) {
316
362
  return false;
363
+ }
317
364
  return JSON_MEDIA_TYPE === value.split(';')[0]?.trim().toLowerCase();
318
365
  }
319
366
  function readBody(req) {
@@ -361,8 +408,9 @@ function schemeOf(url) {
361
408
  }
362
409
  function driveSchemeRefusal(url) {
363
410
  const scheme = schemeOf(url);
364
- if (scheme !== undefined && DRIVEABLE_SCHEMES.includes(scheme))
411
+ if (scheme !== undefined && DRIVEABLE_SCHEMES.includes(scheme)) {
365
412
  return undefined;
413
+ }
366
414
  // Names what it got, because the caller is a CLI printing this to somebody who typed the url and
367
415
  // needs to see which part of it was the problem.
368
416
  return (`unsupported scheme ${scheme ?? '(unparseable url)'} — reticle drive opens a running web app, ` +
@@ -376,8 +424,9 @@ function urlFromDriveRequest(body) {
376
424
  catch {
377
425
  return undefined;
378
426
  }
379
- if (typeof parsed !== 'object' || null === parsed)
427
+ if (typeof parsed !== 'object' || null === parsed) {
380
428
  return undefined;
429
+ }
381
430
  const url = parsed['url'];
382
431
  return 'string' === typeof url && url.length > 0 ? url : undefined;
383
432
  }
@@ -13,12 +13,22 @@
13
13
  * it was removed. What a dashboard needs is the SHARE OF SESSIONS that lose MCP at all (the first
14
14
  * outage) and the share where it never came back on its own (the budget being spent).
15
15
  */
16
- import { OutageReason, OutageStage } from '@reticlehq/core/telemetry';
16
+ import { OutageErrCode, OutageReason, OutageStage } from '@reticlehq/core/telemetry';
17
17
  /**
18
18
  * `OutageStage` and `OutageReason` are core's — this re-export only saves the proxy an import. They
19
19
  * cross the wire, so the vocabulary lives in the contract package and is never re-listed here.
20
20
  */
21
21
  export { OutageReason, OutageStage };
22
+ /**
23
+ * What the proxy knew about a drop besides its reason: the socket error, if one came with it, and
24
+ * whether the stream had got a response first.
25
+ */
26
+ export interface DropCause {
27
+ readonly error?: unknown;
28
+ readonly responded: boolean;
29
+ }
30
+ /** The error's `code`, narrowed to the closed set. Never the message. */
31
+ export declare function outageErrCode(error: unknown): OutageErrCode;
22
32
  /** Reset between tests; a real process reports each stage at most once. */
23
33
  export declare function resetOutageReporting(): void;
24
34
  /**
@@ -30,4 +40,4 @@ export declare function reportMcpOutage(stage: OutageStage, facts: {
30
40
  reason: string;
31
41
  attempts: number;
32
42
  pendingLost?: number;
33
- }): void;
43
+ } & Partial<DropCause>): void;
@@ -13,8 +13,9 @@
13
13
  * it was removed. What a dashboard needs is the SHARE OF SESSIONS that lose MCP at all (the first
14
14
  * outage) and the share where it never came back on its own (the budget being spent).
15
15
  */
16
- import { OutageReason, OutageStage, TelemetryEventKind } from '@reticlehq/core/telemetry';
16
+ import { OutageErrCode, OutageReason, OutageStage, TelemetryEventKind, } from '@reticlehq/core/telemetry';
17
17
  import { getTelemetry } from '../../../telemetry/telemetry.js';
18
+ import { PROXY_ID } from '../../../telemetry/proxy-telemetry.js';
18
19
  /**
19
20
  * `OutageStage` and `OutageReason` are core's — this re-export only saves the proxy an import. They
20
21
  * cross the wire, so the vocabulary lives in the contract package and is never re-listed here.
@@ -29,6 +30,14 @@ const KNOWN_REASONS = new Set(Object.values(OutageReason));
29
30
  function outageReason(raw) {
30
31
  return KNOWN_REASONS.has(raw) ? raw : OutageReason.OTHER;
31
32
  }
33
+ const KNOWN_ERR_CODES = new Set(Object.values(OutageErrCode));
34
+ /** The error's `code`, narrowed to the closed set. Never the message. */
35
+ export function outageErrCode(error) {
36
+ const raw = error?.code;
37
+ return 'string' === typeof raw && KNOWN_ERR_CODES.has(raw)
38
+ ? raw
39
+ : OutageErrCode.OTHER;
40
+ }
32
41
  /**
33
42
  * The daemon retiring on schedule is not a fault, and it is by far the commonest drop.
34
43
  *
@@ -54,6 +63,11 @@ export function resetOutageReporting() {
54
63
  */
55
64
  export function reportMcpOutage(stage, facts) {
56
65
  const reason = outageReason(facts.reason);
66
+ // The idle exit is not an outage. The daemon retires on schedule, `daemon_stopped` says so, and
67
+ // a `first` row for it was most of this event's volume. A real fault keeps its own slot below.
68
+ if (OutageStage.FIRST === stage && isBenign(reason)) {
69
+ return;
70
+ }
57
71
  const slot = `${stage}:${isBenign(reason) ? 'benign' : 'fault'}`;
58
72
  if (reported.has(slot))
59
73
  return;
@@ -66,6 +80,10 @@ export function reportMcpOutage(stage, facts) {
66
80
  // Always sent, including zero: zero is the finding — a drop no agent could feel. See
67
81
  // McpOutageSchema.pendingLost.
68
82
  pendingLost: facts.pendingLost ?? 0,
83
+ ...(facts.error !== undefined ? { errCode: outageErrCode(facts.error) } : {}),
84
+ ...(facts.responded !== undefined ? { responded: facts.responded } : {}),
85
+ // The join key: this event has no `sessionId`, and `mcp_client_connected` carries this id.
86
+ proxyId: PROXY_ID,
69
87
  },
70
88
  });
71
89
  }
@@ -1,10 +1,15 @@
1
- export { SseFrameParser, type SseFrame } from './sse-frame-parser.js';
2
- export { probeDaemon, waitForDaemon, waitForDaemonBind } from './proxy/proxy-daemon-probe.js';
1
+ export { HandshakeReplay, RECONNECT_INITIALIZE_ID } from './proxy/proxy-handshake.js';
2
+ export { SseFrameParser, buildSessionUrl, type SseFrame } from './sse-frame-parser.js';
3
+ export { daemonProcessAlive, probeDaemon, waitForDaemon, waitForDaemonBind, } from './proxy/proxy-daemon-probe.js';
4
+ export { flushProxyExit, reportWakeRefused } from '../../telemetry/proxy-telemetry.js';
5
+ import type { ProxyBoot } from './proxy/proxy-boot.js';
6
+ export type { ProxyBoot } from './proxy/proxy-boot.js';
3
7
  /**
4
8
  * Re-exported so every existing caller (and every spec) keeps importing the proxy's log from the
5
9
  * proxy. Where the code lives is a file-size decision; where it is imported from is an API.
6
10
  */
7
11
  export { accountProxyLogWrite, proxyLog, proxyLogPath, PROXY_LOG_CHECK_BYTES, recoverOversizedProxyLog, setProxyLogPort, } from './proxy/proxy-log.js';
12
+ export { PendingRequests, streamLossReplies } from './proxy/drive-calls.js';
8
13
  export { reconnectDelayMs } from './proxy/proxy-backoff.js';
9
14
  export { MCP_PROXY_HTTP_AGENT_OPTIONS, postToSession, shouldRetryUnsentPost, type PostFailure, } from './proxy/mcp-post-transport.js';
10
15
  /**
@@ -13,45 +18,6 @@ export { MCP_PROXY_HTTP_AGENT_OPTIONS, postToSession, shouldRetryUnsentPost, typ
13
18
  * so a typo cannot silently disable the retry loop.
14
19
  */
15
20
  export declare const MAX_RECONNECT_ATTEMPTS: number;
16
- /** JSON-RPC id the proxy uses for its own replayed `initialize` — never one the client could send. */
17
- export declare const RECONNECT_INITIALIZE_ID = "__reticle_proxy_reinit";
18
- /**
19
- * JSON-RPC requests forwarded on behalf of the client that have not been answered yet.
20
- *
21
- * Only used at shutdown, where it is the difference between "the client closed stdin" and "the client
22
- * closed stdin and we dropped its `tools/list` on the floor while reporting exit 0". A request has an
23
- * id AND a method; a notification has no id and is owed nothing; a response has an id and no method.
24
- */
25
- export declare class PendingRequests {
26
- #private;
27
- observeOutbound(line: string): void;
28
- /** Whether this unanswered request asked for a Harness drive. */
29
- isDrive(id: unknown): boolean;
30
- observeInbound(line: string): void;
31
- get unanswered(): string[];
32
- /**
33
- * Claim ONE unanswered id, so exactly one path may answer it. False means somebody already did —
34
- * a duplicate response to one id is a protocol violation, not a belt-and-braces retry.
35
- */
36
- take(id: unknown): boolean;
37
- /** Take every unanswered id and forget them, so the same request is failed at most once. */
38
- drain(): string[];
39
- /** Forget which requests were drives, once their replies are written. */
40
- clearDrives(): void;
41
- }
42
- /**
43
- * JSON-RPC errors for every request that was in flight when the stream died.
44
- *
45
- * These are unrecoverable BY CONSTRUCTION: the daemon builds a fresh MCP session per SSE
46
- * connection, so the reconnected session has never seen them. Re-sending them is not an option
47
- * either — a `reticle_act` that already clicked would click twice, and inventing a second action in
48
- * somebody's app is worse than reporting a failure.
49
- *
50
- * So the proxy answers them itself, under each request's own id. Found by brute force: killing the
51
- * daemon under a live client left 20 of 20 concurrent calls hanging until the client's own timeout,
52
- * with the MCP server still perfectly alive. An agent cannot tell that apart from "still working".
53
- */
54
- export declare function streamLossReplies(pending: PendingRequests, reason: string, nextStep?: string): string[];
55
21
  /**
56
22
  * How long a request may sit in the queue, unsent, before the proxy answers it itself.
57
23
  *
@@ -74,47 +40,19 @@ export declare function shouldRetryFirstConnect(error: unknown, elapsedMs: numbe
74
40
  * wait, not whether to retry, not whether the install itself is broken.
75
41
  */
76
42
  export declare function queueExpiryNextStep(port: number): string;
77
- /**
78
- * Makes a reconnect invisible to the client.
79
- *
80
- * The daemon builds a FRESH `McpServer` per SSE connection, so a reconnected session has never seen
81
- * the client's `initialize` — every subsequent `tools/call` would hit an uninitialized server. The
82
- * proxy therefore remembers the handshake the client sent once and replays it into each new session.
83
- * The replay is re-issued under a reserved id so the daemon's response to it can be dropped rather
84
- * than reaching the client's stdout, where a duplicate JSON-RPC id would be a protocol violation.
85
- */
86
- export declare class HandshakeReplay {
87
- #private;
88
- /** Record one outbound client line. Cheap enough to call for every stdin message. */
89
- observeOutbound(line: string): void;
90
- /** Lines to POST into a freshly-established session, before any queued client traffic. */
91
- replayLines(): string[];
92
- /** True when this inbound daemon line is the echo of our replayed handshake and must not be forwarded. */
93
- shouldSuppressInbound(line: string): boolean;
94
- }
95
- /**
96
- * Turn an `endpoint` frame's data into a POST target, or null when there is nothing usable in it.
97
- *
98
- * An empty (or whitespace) data field is the shape a malformed daemon response takes, and it used to
99
- * be accepted: `postUrl` became `''`, which is not `null`, so the proxy considered itself CONNECTED
100
- * and posted every subsequent message to the empty string. Each one failed, the queue never armed
101
- * its deadline because nothing was ever queued, and the agent held a session that could not carry a
102
- * single call. Refusing the frame keeps the proxy in its disconnected path, which already knows how
103
- * to reconnect and how to answer what it cannot send.
104
- */
105
- export declare function buildSessionUrl(rawData: string, port: number): string | null;
106
43
  /** The briefing's facts about this directory; a live session outweighs stale memory (#1138). */
107
44
  export declare function instructionStateAt(port: number, liveSessions?: number): {
108
45
  previouslyConnected: boolean;
109
46
  appHere: boolean;
110
47
  };
111
- export declare function startMcpProxy(port: number,
48
+ export declare function startMcpProxy(bootPort: number,
112
49
  /**
113
50
  * Bring a daemon back before reconnecting. Without it the proxy retried a DEAD port until the
114
51
  * budget ran out and then killed itself, taking the agent's whole Reticle surface with it — the
115
- * failure mode for a daemon that crashed, was stopped, or shut itself down as idle.
52
+ * failure mode for a daemon that crashed, was stopped, or shut itself down as idle. A returned
53
+ * port is where the daemon now is; the proxy dials it from then on.
116
54
  */
117
- ensureDaemon?: () => Promise<void>,
55
+ ensureDaemon?: () => Promise<number | void>,
118
56
  /** Observe the real shutdown boundary in transport tests without terminating their worker. */
119
57
  exitProcess?: (code: number) => void,
120
58
  /**
@@ -125,4 +63,9 @@ exitProcess?: (code: number) => void,
125
63
  * drops it, and an `endpoint` frame is not. Optional, because a transport test drives this
126
64
  * function with no resilience installed.
127
65
  */
128
- onUsableSession?: () => void): Promise<never>;
66
+ onUsableSession?: () => void,
67
+ /**
68
+ * The daemon start that runs while the proxy already reads stdin. A client that does not wait
69
+ * for MCP servers gets the handshake and the tool list before the daemon is up.
70
+ */
71
+ boot?: ProxyBoot): Promise<never>;