@reticlehq/server 2.4.0 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (472) hide show
  1. package/SKILL.md +719 -0
  2. package/dist/bridge/auth-failure-reason.d.ts +19 -0
  3. package/dist/bridge/auth-failure-reason.js +29 -0
  4. package/dist/{bridge-security.d.ts → bridge/bridge-security.d.ts} +1 -1
  5. package/dist/{bridge-security.js → bridge/bridge-security.js} +1 -1
  6. package/dist/{bridge.d.ts → bridge/bridge.d.ts} +13 -1
  7. package/dist/{bridge.js → bridge/bridge.js} +95 -15
  8. package/dist/{bridge.test-harness.d.ts → bridge/bridge.test-harness.d.ts} +9 -11
  9. package/dist/{bridge.test-harness.js → bridge/bridge.test-harness.js} +18 -10
  10. package/dist/{pairing-token.js → bridge/pairing-token.js} +1 -1
  11. package/dist/capsule/capsule-store.d.ts +8 -3
  12. package/dist/capsule/capsule-store.js +7 -2
  13. package/dist/capsule/capsule.js +3 -3
  14. package/dist/capsule/causal-summary.d.ts +8 -0
  15. package/dist/capsule/causal-summary.js +22 -12
  16. package/dist/capsule/divergence.d.ts +9 -4
  17. package/dist/capsule/divergence.js +8 -8
  18. package/dist/capsule/predicate-to-links.js +11 -8
  19. package/dist/cli/cli-doctor.d.ts +1 -0
  20. package/dist/cli/cli-doctor.js +135 -0
  21. package/dist/{cli-flow-commands.d.ts → cli/cli-flow-commands.d.ts} +2 -2
  22. package/dist/{cli-flow-commands.js → cli/cli-flow-commands.js} +15 -15
  23. package/dist/{cli-launch.d.ts → cli/cli-launch.d.ts} +32 -3
  24. package/dist/cli/cli-launch.js +171 -0
  25. package/dist/cli/cli-parse-feedback.d.ts +31 -0
  26. package/dist/cli/cli-parse-feedback.js +56 -0
  27. package/dist/{cli-parse.d.ts → cli/cli-parse.d.ts} +6 -19
  28. package/dist/{cli-parse.js → cli/cli-parse.js} +118 -81
  29. package/dist/{cli-port.d.ts → cli/cli-port.d.ts} +12 -0
  30. package/dist/{cli-port.js → cli/cli-port.js} +9 -9
  31. package/dist/cli/cli-update-commands.d.ts +4 -0
  32. package/dist/cli/cli-update-commands.js +93 -0
  33. package/dist/{cli-verify.js → cli/cli-verify.js} +14 -14
  34. package/dist/{cloud-cli.js → cli/cloud-cli.js} +29 -24
  35. package/dist/cli/doctor-daemon-line.d.ts +37 -0
  36. package/dist/cli/doctor-daemon-line.js +35 -0
  37. package/dist/cli/port-holder.d.ts +43 -0
  38. package/dist/cli/port-holder.js +99 -0
  39. package/dist/cli.d.ts +2 -2
  40. package/dist/cli.js +302 -100
  41. package/dist/cloud/cloud-config.d.ts +0 -1
  42. package/dist/cloud/cloud-config.js +9 -9
  43. package/dist/cloud/cloud-sync.d.ts +1 -7
  44. package/dist/cloud/cloud-sync.js +12 -12
  45. package/dist/crawl/crawl-empty.d.ts +16 -0
  46. package/dist/crawl/crawl-empty.js +24 -0
  47. package/dist/crawl/crawl-tools.js +4 -1
  48. package/dist/crawl/crawl.js +26 -7
  49. package/dist/daemon/daemon-resilience.d.ts +73 -0
  50. package/dist/daemon/daemon-resilience.js +279 -0
  51. package/dist/daemon/daemon-usefulness.d.ts +61 -0
  52. package/dist/daemon/daemon-usefulness.js +62 -0
  53. package/dist/{daemon.d.ts → daemon/daemon.d.ts} +33 -8
  54. package/dist/{daemon.js → daemon/daemon.js} +105 -48
  55. package/dist/daemon/heartbeat.d.ts +115 -0
  56. package/dist/daemon/heartbeat.js +141 -0
  57. package/dist/daemon/idle-grace.d.ts +32 -0
  58. package/dist/daemon/idle-grace.js +41 -0
  59. package/dist/{idle-shutdown.d.ts → daemon/idle-shutdown.d.ts} +23 -2
  60. package/dist/{idle-shutdown.js → daemon/idle-shutdown.js} +37 -6
  61. package/dist/daemon/port-presence.d.ts +76 -0
  62. package/dist/daemon/port-presence.js +93 -0
  63. package/dist/daemon/state-dir.d.ts +7 -0
  64. package/dist/daemon/state-dir.js +59 -0
  65. package/dist/daemon/unclean-predecessor.d.ts +23 -0
  66. package/dist/daemon/unclean-predecessor.js +27 -0
  67. package/dist/domain/domain-model.js +2 -2
  68. package/dist/events/body-failures.js +8 -8
  69. package/dist/events/contradictions.d.ts +1 -1
  70. package/dist/events/contradictions.js +60 -10
  71. package/dist/events/echo-mismatch.js +10 -10
  72. package/dist/events/event-filters.js +6 -6
  73. package/dist/events/json-salvage.d.ts +2 -1
  74. package/dist/events/json-salvage.js +6 -6
  75. package/dist/events/observed-in-window.d.ts +12 -0
  76. package/dist/events/observed-in-window.js +21 -0
  77. package/dist/events/predicate-eval.d.ts +53 -20
  78. package/dist/events/predicate-eval.js +179 -55
  79. package/dist/events/predicate-parse.d.ts +23 -0
  80. package/dist/events/predicate-parse.js +54 -0
  81. package/dist/events/predicate.d.ts +7 -2
  82. package/dist/events/predicate.js +126 -35
  83. package/dist/events/reconcile.js +5 -5
  84. package/dist/events/ring-buffer.js +2 -17
  85. package/dist/events/stale-response.js +6 -6
  86. package/dist/events/testid-near-miss.d.ts +22 -0
  87. package/dist/events/testid-near-miss.js +33 -0
  88. package/dist/events/unit-mismatch.js +8 -8
  89. package/dist/flows/affected-tools.js +19 -4
  90. package/dist/flows/affected.js +1 -1
  91. package/dist/flows/annotate-target.d.ts +1 -0
  92. package/dist/flows/annotate-target.js +20 -0
  93. package/dist/flows/annotate-tools.js +25 -3
  94. package/dist/flows/annotate.js +17 -4
  95. package/dist/flows/assertion-integrity.d.ts +2 -1
  96. package/dist/flows/assertion-tiers-store.d.ts +3 -66
  97. package/dist/flows/assertion-tiers-store.js +2 -2
  98. package/dist/flows/attributed-failure.d.ts +17 -0
  99. package/dist/flows/attributed-failure.js +20 -0
  100. package/dist/flows/buddy-status.d.ts +2 -1
  101. package/dist/flows/buddy-status.js +2 -2
  102. package/dist/flows/coverage.d.ts +3 -2
  103. package/dist/flows/coverage.js +2 -2
  104. package/dist/flows/decision.js +24 -9
  105. package/dist/flows/empty-flow.d.ts +6 -0
  106. package/dist/flows/empty-flow.js +24 -0
  107. package/dist/flows/flake-store.d.ts +0 -1
  108. package/dist/flows/flake-store.js +1 -1
  109. package/dist/flows/flake.d.ts +2 -1
  110. package/dist/flows/flake.js +2 -2
  111. package/dist/flows/flow-classify.js +12 -0
  112. package/dist/flows/flow-replay-run.js +4 -4
  113. package/dist/flows/flow-replay.d.ts +6 -8
  114. package/dist/flows/flow-replay.js +132 -48
  115. package/dist/flows/flow-report.js +1 -1
  116. package/dist/flows/flow-scope.d.ts +1 -6
  117. package/dist/flows/flow-step-runners.d.ts +26 -6
  118. package/dist/flows/flow-step-runners.js +156 -6
  119. package/dist/flows/flow-success.js +20 -15
  120. package/dist/flows/flow-tools.js +63 -21
  121. package/dist/flows/flows.js +15 -11
  122. package/dist/flows/gate.d.ts +4 -3
  123. package/dist/flows/gate.js +1 -1
  124. package/dist/flows/heal-run.d.ts +0 -8
  125. package/dist/flows/heal-run.js +5 -5
  126. package/dist/flows/heal.js +3 -3
  127. package/dist/flows/predicate-to-expect.d.ts +38 -0
  128. package/dist/flows/predicate-to-expect.js +95 -0
  129. package/dist/flows/replay.d.ts +16 -1
  130. package/dist/flows/replay.js +58 -22
  131. package/dist/flows/role-anchor-nearest.d.ts +6 -0
  132. package/dist/flows/role-anchor-nearest.js +45 -0
  133. package/dist/flows/role-drift-reason.d.ts +20 -0
  134. package/dist/flows/role-drift-reason.js +39 -0
  135. package/dist/flows/server-verify.d.ts +1 -1
  136. package/dist/flows/server-verify.js +5 -5
  137. package/dist/flows/suite-flakes.d.ts +33 -0
  138. package/dist/flows/suite-flakes.js +32 -0
  139. package/dist/flows/verify-change-tools.js +32 -10
  140. package/dist/flows/verify-change-verdict.d.ts +15 -0
  141. package/dist/flows/verify-change-verdict.js +25 -0
  142. package/dist/flows/watch-batcher.d.ts +3 -2
  143. package/dist/honesty/already-true.d.ts +2 -0
  144. package/dist/honesty/already-true.js +31 -0
  145. package/dist/honesty/blind-spots.d.ts +35 -3
  146. package/dist/honesty/blind-spots.js +57 -12
  147. package/dist/honesty/honesty.d.ts +3 -2
  148. package/dist/honesty/honesty.js +4 -4
  149. package/dist/honesty/uncaptured-bodies.js +1 -1
  150. package/dist/honesty/unread-outcome.js +2 -2
  151. package/dist/honesty/verified.d.ts +31 -3
  152. package/dist/honesty/verified.js +64 -8
  153. package/dist/http-server.js +23 -7
  154. package/dist/hunt/hunt-report.d.ts +2 -1
  155. package/dist/hunt/hunt-report.js +2 -2
  156. package/dist/index.d.ts +9 -6
  157. package/dist/index.js +41 -25
  158. package/dist/init/agent-rules.d.ts +20 -1
  159. package/dist/init/agent-rules.js +64 -8
  160. package/dist/init/app-choice.d.ts +20 -0
  161. package/dist/init/app-choice.js +25 -0
  162. package/dist/init/astro-host.d.ts +21 -0
  163. package/dist/init/astro-host.js +27 -0
  164. package/dist/init/astro-patch.d.ts +16 -0
  165. package/dist/init/astro-patch.js +240 -0
  166. package/dist/init/capabilities.js +4 -1
  167. package/dist/init/cra.d.ts +50 -0
  168. package/dist/init/cra.js +106 -0
  169. package/dist/init/cursor.js +39 -4
  170. package/dist/init/desktop-doctor.d.ts +3 -2
  171. package/dist/init/desktop-doctor.js +4 -4
  172. package/dist/init/detect.d.ts +9 -2
  173. package/dist/init/detect.js +24 -5
  174. package/dist/init/mcp-clients.d.ts +81 -0
  175. package/dist/init/mcp-clients.js +248 -0
  176. package/dist/init/mcp-registered.d.ts +12 -0
  177. package/dist/init/mcp-registered.js +14 -0
  178. package/dist/init/mcp.d.ts +27 -2
  179. package/dist/init/mcp.js +40 -4
  180. package/dist/init/next-patch.d.ts +2 -4
  181. package/dist/init/next-patch.js +109 -19
  182. package/dist/init/node-io.js +29 -6
  183. package/dist/init/plan-framework.d.ts +16 -1
  184. package/dist/init/plan-framework.js +166 -8
  185. package/dist/init/plan.d.ts +85 -6
  186. package/dist/init/plan.js +196 -33
  187. package/dist/init/project-id.d.ts +5 -9
  188. package/dist/init/project-id.js +10 -22
  189. package/dist/init/run.d.ts +23 -1
  190. package/dist/init/run.js +338 -47
  191. package/dist/init/slash-command.d.ts +9 -0
  192. package/dist/init/slash-command.js +10 -1
  193. package/dist/init/snippets.d.ts +7 -10
  194. package/dist/init/snippets.js +44 -15
  195. package/dist/init/vite-config.js +1 -1
  196. package/dist/init/windows-quote.d.ts +38 -0
  197. package/dist/init/windows-quote.js +70 -0
  198. package/dist/init/workspace-apps.d.ts +23 -0
  199. package/dist/init/workspace-apps.js +68 -0
  200. package/dist/input/driven-redaction.js +1 -1
  201. package/dist/input/network-detail.js +8 -8
  202. package/dist/input/network-mock-tools.js +2 -2
  203. package/dist/input/network-mock.js +4 -4
  204. package/dist/input/real-input.js +8 -3
  205. package/dist/input/scroll-find.js +2 -2
  206. package/dist/input/scroll-tools.d.ts +0 -5
  207. package/dist/input/scroll-tools.js +11 -4
  208. package/dist/input/viewport-tools.js +2 -2
  209. package/dist/journal/ambient-store.d.ts +0 -2
  210. package/dist/journal/ambient-store.js +1 -1
  211. package/dist/journal/ambient.js +1 -1
  212. package/dist/journal/attach-journal.d.ts +2 -1
  213. package/dist/journal/deviation-report.js +6 -6
  214. package/dist/journal/deviation-service.js +1 -1
  215. package/dist/journal/envelope-store.d.ts +0 -2
  216. package/dist/journal/envelope-store.js +1 -1
  217. package/dist/journal/envelope.d.ts +2 -3
  218. package/dist/journal/envelope.js +3 -3
  219. package/dist/journal/journal-query.js +1 -1
  220. package/dist/journal/journal-recorder.d.ts +2 -1
  221. package/dist/journal/journal-recorder.js +2 -2
  222. package/dist/journal/rollups.js +9 -9
  223. package/dist/journal/session-end.d.ts +2 -1
  224. package/dist/journal/session-journal.js +4 -4
  225. package/dist/license/license.d.ts +0 -14
  226. package/dist/license/license.js +8 -8
  227. package/dist/log.d.ts +10 -0
  228. package/dist/log.js +11 -1
  229. package/dist/mcp/mcp-is-error.d.ts +13 -0
  230. package/dist/mcp/mcp-is-error.js +18 -0
  231. package/dist/mcp/mcp-outage.d.ts +32 -0
  232. package/dist/mcp/mcp-outage.js +55 -0
  233. package/dist/mcp/mcp-proxy.d.ts +134 -0
  234. package/dist/mcp/mcp-proxy.js +720 -0
  235. package/dist/{mcp.d.ts → mcp/mcp.d.ts} +13 -10
  236. package/dist/{mcp.js → mcp/mcp.js} +139 -37
  237. package/dist/mcp/proxy-handshake.d.ts +3 -0
  238. package/dist/mcp/proxy-handshake.js +54 -0
  239. package/dist/mcp/proxy-lifecycle.d.ts +64 -0
  240. package/dist/mcp/proxy-lifecycle.js +70 -0
  241. package/dist/mcp/tool-catalog-cache.d.ts +29 -0
  242. package/dist/mcp/tool-catalog-cache.js +55 -0
  243. package/dist/oracles/propose-consequences.d.ts +2 -1
  244. package/dist/oracles/propose-consequences.js +16 -11
  245. package/dist/oracles/self-instrument.d.ts +2 -1
  246. package/dist/oracles/self-instrument.js +1 -1
  247. package/dist/phenomena/phenomena.js +3 -3
  248. package/dist/platform.d.ts +16 -0
  249. package/dist/platform.js +16 -0
  250. package/dist/pool/browser-pool.d.ts +9 -0
  251. package/dist/pool/browser-pool.js +38 -9
  252. package/dist/pool/playwright-launcher.d.ts +15 -2
  253. package/dist/pool/playwright-launcher.js +21 -2
  254. package/dist/project/fs-port.js +1 -1
  255. package/dist/project/project-tools.js +2 -2
  256. package/dist/runs/build-verification-run.js +1 -1
  257. package/dist/runs/repair-prompt.d.ts +0 -6
  258. package/dist/runs/repair-prompt.js +3 -3
  259. package/dist/runs/risk-classify.js +1 -1
  260. package/dist/runs/run-diff.d.ts +0 -2
  261. package/dist/runs/run-diff.js +3 -3
  262. package/dist/runs/run-tools.js +2 -2
  263. package/dist/runs/verification-sync.js +2 -2
  264. package/dist/runs/verify-http.js +1 -1
  265. package/dist/runs/verify-server.js +1 -1
  266. package/dist/session/attachment-history.d.ts +46 -0
  267. package/dist/session/attachment-history.js +65 -0
  268. package/dist/session/command-timeout.d.ts +11 -3
  269. package/dist/session/command-timeout.js +2 -2
  270. package/dist/session/control-envelope.d.ts +6 -0
  271. package/dist/session/control-envelope.js +7 -1
  272. package/dist/session/dev-server-probe.d.ts +13 -0
  273. package/dist/session/dev-server-probe.js +52 -0
  274. package/dist/session/last-act.d.ts +17 -3
  275. package/dist/session/last-act.js +16 -4
  276. package/dist/session/live-control-tools.js +7 -2
  277. package/dist/session/live-control.js +1 -1
  278. package/dist/session/looks-like-dev-server.d.ts +14 -0
  279. package/dist/session/looks-like-dev-server.js +25 -0
  280. package/dist/session/no-session-diagnosis.d.ts +45 -0
  281. package/dist/session/no-session-diagnosis.js +120 -0
  282. package/dist/session/no-session-watch.d.ts +21 -0
  283. package/dist/session/no-session-watch.js +69 -0
  284. package/dist/session/observed-state.d.ts +4 -0
  285. package/dist/session/observed-state.js +19 -1
  286. package/dist/session/output-budget.js +1 -1
  287. package/dist/session/pending-commands.js +1 -0
  288. package/dist/session/session-health.d.ts +8 -1
  289. package/dist/session/session-health.js +8 -7
  290. package/dist/session/session-info.d.ts +43 -8
  291. package/dist/session/session-info.js +46 -1
  292. package/dist/session/session-lease.d.ts +0 -11
  293. package/dist/session/session-lease.js +1 -1
  294. package/dist/session/session-manager.d.ts +6 -0
  295. package/dist/session/session-manager.js +124 -12
  296. package/dist/session/session-readiness.d.ts +1 -1
  297. package/dist/session/session-readiness.js +6 -1
  298. package/dist/session/session-reaper.js +1 -1
  299. package/dist/session/session-reconnect.d.ts +32 -0
  300. package/dist/session/session-reconnect.js +42 -0
  301. package/dist/session/session.d.ts +15 -2
  302. package/dist/session/session.js +77 -26
  303. package/dist/session/state-select.d.ts +1 -1
  304. package/dist/session/state-select.js +1 -1
  305. package/dist/status-payload.d.ts +19 -0
  306. package/dist/status-payload.js +11 -0
  307. package/dist/telemetry/argument-shape.js +10 -1
  308. package/dist/telemetry/browser-mode.d.ts +27 -0
  309. package/dist/telemetry/browser-mode.js +33 -0
  310. package/dist/telemetry/bug-found.d.ts +17 -21
  311. package/dist/telemetry/bug-found.js +120 -8
  312. package/dist/telemetry/cli-telemetry.d.ts +2 -12
  313. package/dist/telemetry/cli-telemetry.js +27 -4
  314. package/dist/telemetry/crash-cause.d.ts +47 -0
  315. package/dist/telemetry/crash-cause.js +104 -0
  316. package/dist/telemetry/daemon-telemetry.d.ts +38 -1
  317. package/dist/telemetry/daemon-telemetry.js +37 -12
  318. package/dist/telemetry/dev-repo.js +4 -4
  319. package/dist/telemetry/error-class.d.ts +26 -0
  320. package/dist/telemetry/error-class.js +52 -0
  321. package/dist/telemetry/error-fingerprint.js +21 -2
  322. package/dist/telemetry/feedback-cli.d.ts +8 -3
  323. package/dist/telemetry/feedback-cli.js +52 -8
  324. package/dist/telemetry/feedback-context.d.ts +23 -6
  325. package/dist/telemetry/feedback-context.js +105 -5
  326. package/dist/telemetry/feedback-delivery.d.ts +20 -0
  327. package/dist/telemetry/feedback-delivery.js +30 -0
  328. package/dist/telemetry/feedback-outbox.d.ts +22 -0
  329. package/dist/telemetry/feedback-outbox.js +87 -0
  330. package/dist/telemetry/feedback.d.ts +22 -1
  331. package/dist/telemetry/feedback.js +67 -8
  332. package/dist/telemetry/git-facts.d.ts +7 -0
  333. package/dist/telemetry/git-facts.js +5 -5
  334. package/dist/telemetry/project-profile.js +2 -1
  335. package/dist/telemetry/session-metrics.d.ts +47 -3
  336. package/dist/telemetry/session-metrics.js +315 -15
  337. package/dist/telemetry/telemetry.d.ts +45 -2
  338. package/dist/telemetry/telemetry.js +150 -37
  339. package/dist/telemetry/verification-of.d.ts +22 -0
  340. package/dist/telemetry/verification-of.js +84 -0
  341. package/dist/tools/act-capsule.js +2 -2
  342. package/dist/tools/act-danger.d.ts +12 -0
  343. package/dist/tools/act-danger.js +20 -3
  344. package/dist/tools/act-helpers.js +4 -4
  345. package/dist/tools/act-tools.d.ts +0 -8
  346. package/dist/tools/act-tools.js +114 -118
  347. package/dist/tools/act-view.js +7 -7
  348. package/dist/tools/alias-args.d.ts +17 -0
  349. package/dist/tools/alias-args.js +25 -0
  350. package/dist/tools/assert-grade.js +9 -9
  351. package/dist/tools/assert-verdict.d.ts +9 -1
  352. package/dist/tools/assert-verdict.js +21 -6
  353. package/dist/tools/browser-tools.js +36 -11
  354. package/dist/tools/contract-tools.d.ts +0 -5
  355. package/dist/tools/contract-tools.js +27 -1
  356. package/dist/tools/coverage-identity.d.ts +34 -0
  357. package/dist/tools/coverage-identity.js +46 -0
  358. package/dist/tools/coverage-tools.js +10 -14
  359. package/dist/tools/dynamic-tools.d.ts +2 -1
  360. package/dist/tools/dynamic-tools.js +96 -19
  361. package/dist/tools/error-recovery.d.ts +34 -2
  362. package/dist/tools/error-recovery.js +255 -4
  363. package/dist/tools/feedback-invite.d.ts +48 -0
  364. package/dist/tools/feedback-invite.js +71 -0
  365. package/dist/tools/feedback-tools.d.ts +12 -1
  366. package/dist/tools/feedback-tools.js +28 -5
  367. package/dist/tools/invoke-tool.d.ts +0 -12
  368. package/dist/tools/invoke-tool.js +126 -33
  369. package/dist/tools/lease-hint.d.ts +17 -0
  370. package/dist/tools/lease-hint.js +24 -0
  371. package/dist/tools/lease-tools.js +6 -5
  372. package/dist/tools/merge-tools.d.ts +10 -1
  373. package/dist/tools/merge-tools.js +9 -3
  374. package/dist/tools/merged-name-redirect.d.ts +13 -0
  375. package/dist/tools/merged-name-redirect.js +55 -0
  376. package/dist/tools/navigate-arrival.d.ts +26 -0
  377. package/dist/tools/navigate-arrival.js +60 -0
  378. package/dist/tools/navigate-result.d.ts +31 -0
  379. package/dist/tools/navigate-result.js +38 -0
  380. package/dist/tools/observe-tools.js +72 -20
  381. package/dist/tools/observed-nothing.d.ts +25 -0
  382. package/dist/tools/observed-nothing.js +33 -0
  383. package/dist/tools/query-paginate.js +2 -2
  384. package/dist/tools/query-shape.d.ts +18 -0
  385. package/dist/tools/query-shape.js +39 -0
  386. package/dist/tools/read-tools.js +81 -20
  387. package/dist/tools/real-input-attempt.d.ts +28 -0
  388. package/dist/tools/real-input-attempt.js +93 -0
  389. package/dist/tools/reconcile-tools.js +7 -7
  390. package/dist/tools/reload-result.d.ts +14 -0
  391. package/dist/tools/reload-result.js +29 -0
  392. package/dist/tools/snapshot-delta.d.ts +4 -5
  393. package/dist/tools/snapshot-delta.js +0 -0
  394. package/dist/tools/tool-kit.d.ts +16 -0
  395. package/dist/tools/tool-surface.d.ts +83 -0
  396. package/dist/tools/tool-surface.js +217 -0
  397. package/dist/tools/tools-helpers.js +6 -6
  398. package/dist/tools/tools.d.ts +15 -0
  399. package/dist/tools/tools.js +53 -17
  400. package/dist/tools/unadvertised-help.d.ts +5 -0
  401. package/dist/tools/unadvertised-help.js +39 -0
  402. package/dist/trace.d.ts +69 -0
  403. package/dist/trace.js +150 -0
  404. package/dist/update/nudge-credit.d.ts +4 -0
  405. package/dist/update/nudge-credit.js +53 -0
  406. package/dist/update/sdk-sync.d.ts +21 -0
  407. package/dist/update/sdk-sync.js +42 -0
  408. package/dist/update/update-checker.js +3 -3
  409. package/dist/update/update-nudge.d.ts +63 -6
  410. package/dist/update/update-nudge.js +128 -15
  411. package/dist/update/updater.d.ts +1 -9
  412. package/dist/update/updater.js +13 -8
  413. package/dist/version/peer-announce.d.ts +4 -0
  414. package/dist/version/peer-announce.js +30 -0
  415. package/dist/{server-version.js → version/server-version.js} +5 -1
  416. package/dist/version/version-nudge.d.ts +28 -0
  417. package/dist/version/version-nudge.js +40 -0
  418. package/dist/version/version-skew.d.ts +66 -0
  419. package/dist/version/version-skew.js +71 -0
  420. package/dist/visual/visual-diff.js +2 -2
  421. package/dist/visual/visual-tools.js +4 -4
  422. package/docs/README.md +55 -0
  423. package/docs/agent-cheatsheet.md +85 -0
  424. package/docs/architecture.md +113 -0
  425. package/docs/benchmarks.md +255 -0
  426. package/docs/debugging.md +102 -0
  427. package/docs/deploy-checks.md +69 -0
  428. package/docs/desktop-apps.md +256 -0
  429. package/docs/enterprise.md +62 -0
  430. package/docs/fixtures-dispatch-receiver.yml +76 -0
  431. package/docs/fixtures.md +45 -0
  432. package/docs/flows.md +166 -0
  433. package/docs/gate-plan.md +98 -0
  434. package/docs/gates.md +117 -0
  435. package/docs/getting-started.md +469 -0
  436. package/docs/human-control.md +63 -0
  437. package/docs/integration-patterns.md +171 -0
  438. package/docs/local-registry.md +126 -0
  439. package/docs/matrix/2.5.0/claude-code-machine.json +19 -0
  440. package/docs/matrix/2.5.0/codex-machine.json +20 -0
  441. package/docs/matrix/2.5.0/cursor-machine.json +22 -0
  442. package/docs/matrix/2.5.0/gemini-machine.json +22 -0
  443. package/docs/matrix/2.5.0/opencode-machine.json +22 -0
  444. package/docs/matrix/2.5.0/vscode-machine.json +22 -0
  445. package/docs/matrix/2.5.0/windsurf-machine.json +22 -0
  446. package/docs/matrix/MATRIX.md +26 -0
  447. package/docs/matrix/README.md +59 -0
  448. package/docs/mint.json +61 -0
  449. package/docs/multi-agent-testing.md +55 -0
  450. package/docs/platform-integration.md +122 -0
  451. package/docs/system-map.md +152 -0
  452. package/docs/telemetry-contract.md +214 -0
  453. package/docs/telemetry.md +191 -0
  454. package/docs/testing.md +82 -0
  455. package/docs/token-efficiency.md +80 -0
  456. package/docs/usage.md +1046 -0
  457. package/package.json +8 -5
  458. package/dist/cli-doctor.d.ts +0 -6
  459. package/dist/cli-doctor.js +0 -60
  460. package/dist/cli-launch.js +0 -112
  461. package/dist/daemon-resilience.d.ts +0 -22
  462. package/dist/daemon-resilience.js +0 -85
  463. package/dist/mcp-proxy.d.ts +0 -67
  464. package/dist/mcp-proxy.js +0 -337
  465. package/dist/tools/profiles.d.ts +0 -37
  466. package/dist/tools/profiles.js +0 -139
  467. /package/dist/{pairing-token.d.ts → bridge/pairing-token.d.ts} +0 -0
  468. /package/dist/{token-auth.d.ts → bridge/token-auth.d.ts} +0 -0
  469. /package/dist/{token-auth.js → bridge/token-auth.js} +0 -0
  470. /package/dist/{cli-verify.d.ts → cli/cli-verify.d.ts} +0 -0
  471. /package/dist/{cloud-cli.d.ts → cli/cloud-cli.d.ts} +0 -0
  472. /package/dist/{server-version.d.ts → version/server-version.d.ts} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reticlehq/server",
3
- "version": "2.4.0",
3
+ "version": "2.6.0",
4
4
  "description": "Reticle bridge + MCP server. Hosts the browser WS endpoint and exposes MCP tools to the coding agent.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -22,7 +22,7 @@
22
22
  "@modelcontextprotocol/sdk": "^1.13.0",
23
23
  "ws": "^8.18.0",
24
24
  "zod": "^3.24.1",
25
- "@reticlehq/core": "2.4.0"
25
+ "@reticlehq/core": "2.6.0"
26
26
  },
27
27
  "devDependencies": {
28
28
  "@types/pngjs": "^6.0.5",
@@ -45,7 +45,9 @@
45
45
  "files": [
46
46
  "dist",
47
47
  "README.md",
48
- "LICENSE-ENTERPRISE"
48
+ "LICENSE-ENTERPRISE",
49
+ "SKILL.md",
50
+ "docs"
49
51
  ],
50
52
  "keywords": [
51
53
  "mcp",
@@ -54,7 +56,7 @@
54
56
  "cli"
55
57
  ],
56
58
  "reticle": {
57
- "changelog": "Smart MCP proxy with auto-start daemon, auto-update, and rollback support. Agents can call reticle_version_info, reticle_apply_update, and reticle_rollback.",
59
+ "changelog": "An MCP server that stays up when the daemon dies, one tool surface instead of five profiles (`RETICLE_TOOL_PROFILE` retired for `RETICLE_ADVERTISE_ALL_TOOLS`), and tools that refuse instead of answering wrongly.",
58
60
  "breakingChanges": []
59
61
  },
60
62
  "publishConfig": {
@@ -68,6 +70,7 @@
68
70
  "dev": "tsc -b --watch",
69
71
  "typecheck": "tsc -b",
70
72
  "lint": "eslint src",
71
- "test:unit": "vitest run src --passWithNoTests"
73
+ "test:unit": "vitest run src --passWithNoTests",
74
+ "test:coverage": "vitest run src --passWithNoTests --coverage.enabled --coverage.provider=v8 --coverage.reporter=text-summary --coverage.include='src/**/*.ts' --coverage.exclude='src/**/*.test.ts'"
72
75
  }
73
76
  }
@@ -1,6 +0,0 @@
1
- /**
2
- * `reticle doctor` — collapse the ~6 independent first-run failure modes into one command. Checks the
3
- * Chromium install (the #1 silent failure), whether a daemon is up on the resolved bridge port, and
4
- * reminds the user which port the app must dial. Human-readable to stdout (not the JSON log).
5
- */
6
- export declare function handleDoctor(port: number): Promise<void>;
@@ -1,60 +0,0 @@
1
- import { existsSync, readFileSync } from 'node:fs';
2
- import { join } from 'node:path';
3
- import { readPid, isAlive } from './daemon.js';
4
- import { diagnoseDesktop, isDesktopProject } from './init/desktop-doctor.js';
5
- /**
6
- * `reticle doctor` — collapse the ~6 independent first-run failure modes into one command. Checks the
7
- * Chromium install (the #1 silent failure), whether a daemon is up on the resolved bridge port, and
8
- * reminds the user which port the app must dial. Human-readable to stdout (not the JSON log).
9
- */
10
- export async function handleDoctor(port) {
11
- const line = (s) => {
12
- process.stdout.write(`${s}\n`);
13
- };
14
- line('reticle doctor');
15
- line(` node ${process.version}`);
16
- try {
17
- const { chromium } = await import('playwright');
18
- const path = chromium.executablePath();
19
- line(existsSync(path)
20
- ? ' chromium ✓ installed'
21
- : ' chromium ✗ missing — run: npx playwright install chromium');
22
- }
23
- catch {
24
- line(' chromium ✗ missing — run: npx playwright install chromium');
25
- }
26
- const pid = readPid(port);
27
- if (pid !== null && isAlive(pid)) {
28
- line(` daemon ✓ running on :${port} (pid ${pid})`);
29
- }
30
- else {
31
- line(` daemon ✗ not running on :${port} — your agent runs \`reticle mcp\` (or \`reticle serve\`)`);
32
- }
33
- line(` bridge port ${port} (your app must dial THIS port — not your dev-server port)`);
34
- // Desktop setup RCA. Every one of these fails SILENTLY — a Tauri app with the default CSP runs
35
- // perfectly and never connects; an Electron app without the preload line reports zero network
36
- // activity forever, which reads as "makes no backend calls" rather than "you are blind to them".
37
- const readProjectFile = (relative) => {
38
- try {
39
- return readFileSync(join(process.cwd(), relative), 'utf8');
40
- }
41
- catch {
42
- return undefined;
43
- }
44
- };
45
- const desktop = diagnoseDesktop(readProjectFile, port);
46
- if (desktop.length > 0) {
47
- line('');
48
- line(` desktop ✗ ${String(desktop.length)} issue(s) — the app will look fine and not work:`);
49
- for (const finding of desktop) {
50
- line(` ${finding.file}`);
51
- line(` ${finding.problem}`);
52
- line(` fix: ${finding.fix}`);
53
- }
54
- }
55
- else if (isDesktopProject(readProjectFile)) {
56
- // Say so explicitly. Silence would read as "not checked", which is the same ambiguity the
57
- // findings above exist to remove.
58
- line(' desktop ✓ desktop wiring looks right');
59
- }
60
- }
@@ -1,112 +0,0 @@
1
- import * as http from 'node:http';
2
- import { spawn } from 'node:child_process';
3
- import { isOpaqueOrigin, LOOPBACK_HOST, STATUS_PATH } from '@reticlehq/core';
4
- /**
5
- * Reduce the daemon's /status JSON to the compact view `reticle status` prints. Pure: narrows the
6
- * untrusted wire payload (never `any`) and tolerates a missing/partial body so a malformed response
7
- * degrades to "running, 0 sessions" instead of throwing.
8
- */
9
- export function summarizeStatus(payload) {
10
- if (typeof payload !== 'object' || payload === null)
11
- return { sessionCount: 0, sessions: [] };
12
- const obj = payload;
13
- const raw = Array.isArray(obj['sessions']) ? obj['sessions'] : [];
14
- const sessions = raw
15
- .map((s) => {
16
- if (typeof s !== 'object' || s === null)
17
- return null;
18
- const r = s;
19
- const sessionId = typeof r['sessionId'] === 'string' ? r['sessionId'] : '';
20
- if (sessionId === '')
21
- return null;
22
- return {
23
- sessionId,
24
- url: typeof r['url'] === 'string' ? r['url'] : '',
25
- throttled: r['throttled'] === true,
26
- stale: r['stale'] === true,
27
- pendingMarks: typeof r['pendingMarks'] === 'number' ? r['pendingMarks'] : 0,
28
- };
29
- })
30
- .filter((s) => s !== null);
31
- const sessionCount = typeof obj['sessionCount'] === 'number' ? obj['sessionCount'] : sessions.length;
32
- return { sessionCount, sessions };
33
- }
34
- /** How long the daemon /status probe waits before giving up — a local loopback call is near-instant. */
35
- const STATUS_PROBE_TIMEOUT_MS = 1000;
36
- /** GET the daemon's /status JSON. Resolves to the parsed body, or undefined on any failure. */
37
- export function fetchStatus(port) {
38
- return new Promise((resolve) => {
39
- const req = http.get({ host: LOOPBACK_HOST, port, path: STATUS_PATH, timeout: STATUS_PROBE_TIMEOUT_MS }, (res) => {
40
- let body = '';
41
- res.setEncoding('utf8');
42
- res.on('data', (chunk) => (body += chunk));
43
- res.on('end', () => {
44
- try {
45
- resolve(JSON.parse(body));
46
- }
47
- catch {
48
- resolve(undefined);
49
- }
50
- });
51
- });
52
- req.on('error', () => resolve(undefined));
53
- req.on('timeout', () => {
54
- req.destroy();
55
- resolve(undefined);
56
- });
57
- });
58
- }
59
- function sameOrigin(a, b) {
60
- try {
61
- const origin = new URL(a).origin;
62
- // Two opaque origins (desktop webviews, file:// docs) BOTH stringify to "null", so comparing them
63
- // would call every desktop app the same app and reuse the wrong session. Never match on opaque.
64
- if (isOpaqueOrigin(origin))
65
- return false;
66
- return origin === new URL(b).origin;
67
- }
68
- catch {
69
- return false;
70
- }
71
- }
72
- /**
73
- * Decide what `reticle open [url]` does, given the currently-connected tabs. Pure.
74
- * - no url + a tab connected → reuse it (the app is already open; don't spawn a duplicate).
75
- * - no url + nothing connected → ask for one.
76
- * - url + a tab already on that origin → reuse it (idempotent — re-running never piles up tabs).
77
- * - url + no matching tab → open it.
78
- */
79
- export function decideOpen(sessions, url) {
80
- if (url === undefined) {
81
- const first = sessions[0];
82
- return first !== undefined ? { action: 'reuse', url: first.url } : { action: 'need-url' };
83
- }
84
- const match = sessions.find((s) => s.url === url || sameOrigin(s.url, url));
85
- return match !== undefined ? { action: 'reuse', url: match.url } : { action: 'open', url };
86
- }
87
- /**
88
- * Percent-encode the cmd.exe metacharacters that `start` re-parses so a URL can't break out into
89
- * command execution on Windows (`?next=x&calc` → command chaining). `%` is left untouched so an
90
- * already-encoded URL isn't double-encoded; the browser decodes the escapes back to the real URL.
91
- */
92
- function encodeForWindowsStart(url) {
93
- return url.replace(/[&^|<>()"'!]/g, (ch) => `%${ch.charCodeAt(0).toString(16).toUpperCase()}`);
94
- }
95
- /** The OS command that opens a URL in the default browser, per platform. Pure — unit-tested. */
96
- export function openCommand(url, platform) {
97
- if (platform === 'darwin')
98
- return { cmd: 'open', args: [url] };
99
- if (platform === 'win32') {
100
- return { cmd: 'cmd', args: ['/c', 'start', '', encodeForWindowsStart(url)] };
101
- }
102
- return { cmd: 'xdg-open', args: [url] };
103
- }
104
- /** Launch the default browser at `url` (detached). The spawn is injected so tests stay hermetic. */
105
- export function openInBrowser(url, platform = process.platform, run = defaultRun) {
106
- const { cmd, args } = openCommand(url, platform);
107
- run(cmd, args);
108
- }
109
- function defaultRun(cmd, args) {
110
- const child = spawn(cmd, args, { detached: true, stdio: 'ignore' });
111
- child.unref();
112
- }
@@ -1,22 +0,0 @@
1
- /**
2
- * Process-level resilience for the long-running daemon. The daemon serves many agents at once, so a
3
- * single stray error must not take the whole fleet down:
4
- *
5
- * - unhandledRejection (a fire-and-forget promise nobody awaited — the common case in async WS/pool
6
- * code) → LOG and keep running. One agent's async slip-up can't crash the daemon for everyone.
7
- * - uncaughtException (a synchronous throw escaped all try/catch) → the process state is undefined
8
- * per Node's guidance, so LOG a clear reason and exit cleanly; the next `reticle mcp` respawns a fresh
9
- * daemon, which beats crashing silently or limping along corrupt.
10
- */
11
- export interface ProcessLike {
12
- on(event: string, listener: (arg: unknown) => void): unknown;
13
- }
14
- type LogFn = (event: string, data: Record<string, unknown>) => void;
15
- /** The two ways a failure reaches the top of the process. Named so the analytics can tell them apart. */
16
- export declare const CrashKind: {
17
- readonly UNHANDLED_REJECTION: "unhandled_rejection";
18
- readonly UNCAUGHT_EXCEPTION: "uncaught_exception";
19
- };
20
- export type CrashKind = (typeof CrashKind)[keyof typeof CrashKind];
21
- export declare function installDaemonResilience(proc: ProcessLike, log: LogFn, onFatal: () => void): void;
22
- export {};
@@ -1,85 +0,0 @@
1
- /**
2
- * Process-level resilience for the long-running daemon. The daemon serves many agents at once, so a
3
- * single stray error must not take the whole fleet down:
4
- *
5
- * - unhandledRejection (a fire-and-forget promise nobody awaited — the common case in async WS/pool
6
- * code) → LOG and keep running. One agent's async slip-up can't crash the daemon for everyone.
7
- * - uncaughtException (a synchronous throw escaped all try/catch) → the process state is undefined
8
- * per Node's guidance, so LOG a clear reason and exit cleanly; the next `reticle mcp` respawns a fresh
9
- * daemon, which beats crashing silently or limping along corrupt.
10
- */
11
- import { TelemetryActor, TelemetryEventKind } from '@reticlehq/core';
12
- import { errorSkeleton, errorTypeOf, fingerprintCrash, MAX_REPORTED_FRAMES, reticleFrames, } from './telemetry/error-fingerprint.js';
13
- import { getSessionMetrics } from './telemetry/session-metrics.js';
14
- import { machineSnapshot } from './telemetry/machine-snapshot.js';
15
- import { getTelemetry } from './telemetry/telemetry.js';
16
- function describe(value) {
17
- return value instanceof Error ? value.message : String(value);
18
- }
19
- /** The two ways a failure reaches the top of the process. Named so the analytics can tell them apart. */
20
- export const CrashKind = {
21
- UNHANDLED_REJECTION: 'unhandled_rejection',
22
- UNCAUGHT_EXCEPTION: 'uncaught_exception',
23
- };
24
- /**
25
- * Report a crash with enough detail to actually diagnose it.
26
- *
27
- * This is the only place in the product that learns about a crash at all. An uncaught exception in a
28
- * long-running daemon takes down every agent attached to it, and the only other record is a line in a
29
- * local log nobody sends us.
30
- *
31
- * The first version sent a hash and nothing else, which made crashes rankable and undiagnosable — you
32
- * could see that forty machines hit `a3f2c1d8e9b0` and had no way to learn what that was. So it now
33
- * carries the four things an RCA needs: WHERE (our own frames, with function names and line numbers),
34
- * WHAT (the message with every variable part stripped), WHEN (the tool in flight), and WHY-ish (the
35
- * agent's approach run before it). All of it is our code and our vocabulary; the user's stack frames,
36
- * their paths, and the contents of their message are removed before any of it is built.
37
- *
38
- * Best-effort and wrapped: reporting a crash must never be the reason a crash gets worse.
39
- */
40
- function reportCrash(kind, value) {
41
- try {
42
- const errorType = errorTypeOf(value);
43
- const stack = value instanceof Error ? (value.stack ?? '') : '';
44
- const message = describe(value);
45
- const { breadcrumb, inFlight } = getSessionMetrics().trail;
46
- const machine = machineSnapshot();
47
- void getTelemetry().emit(TelemetryEventKind.RUNTIME_CRASHED, {
48
- // A crash is ALWAYS reached through something the agent asked for — the daemon does nothing on
49
- // its own — so attributing it to the agent is accurate rather than a guess.
50
- actor: TelemetryActor.AGENT,
51
- crash: {
52
- kind,
53
- errorType,
54
- fingerprint: fingerprintCrash(errorType, stack, message),
55
- // The skeleton, not the message: every quoted string, path, URL, id and number is replaced
56
- // by `*` first. This is what makes the fingerprint mean something to a human reading a chart.
57
- message: errorSkeleton(message).slice(0, 300),
58
- // Our own frames, our own published code. The file, the line, and the function — which is the
59
- // whole of "where did it break". Frames from the user's app never survive this.
60
- frames: reticleFrames(stack).slice(0, MAX_REPORTED_FRAMES),
61
- ...(inFlight !== undefined ? { tool: inFlight } : {}),
62
- ...(breadcrumb.length > 0 ? { breadcrumb } : {}),
63
- // Crashes cluster hard by runtime version and architecture, and we were recording neither.
64
- nodeVersion: process.versions.node,
65
- arch: process.arch,
66
- // "Out of memory" and "our bug" look identical in a stack trace. This is what tells them apart.
67
- ...(machine !== undefined ? { machine } : {}),
68
- },
69
- });
70
- }
71
- catch {
72
- /* a crash report must never be the reason a crash gets worse */
73
- }
74
- }
75
- export function installDaemonResilience(proc, log, onFatal) {
76
- proc.on('unhandledRejection', (reason) => {
77
- log('reticle_daemon_unhandled_rejection', { reason: describe(reason) });
78
- reportCrash(CrashKind.UNHANDLED_REJECTION, reason);
79
- });
80
- proc.on('uncaughtException', (err) => {
81
- log('reticle_daemon_uncaught_exception', { error: describe(err) });
82
- reportCrash(CrashKind.UNCAUGHT_EXCEPTION, err);
83
- onFatal();
84
- });
85
- }
@@ -1,67 +0,0 @@
1
- /**
2
- * How many consecutive failed reconnects before the proxy gives up and exits. At the capped backoff
3
- * this is a few minutes — long enough to ride out a daemon restart, short enough that a genuinely
4
- * dead daemon lets the agent host respawn the proxy (which spawns a fresh daemon) instead of hanging.
5
- */
6
- export declare const MAX_RECONNECT_ATTEMPTS = 60;
7
- export declare function reconnectDelayMs(attempt: number): number;
8
- /** JSON-RPC id the proxy uses for its own replayed `initialize` — never one the client could send. */
9
- export declare const RECONNECT_INITIALIZE_ID = "__reticle_proxy_reinit";
10
- /** The proxy's own log file, so a silent drop leaves a readable trace the agent can go read. */
11
- export declare function proxyLogPath(): string;
12
- /**
13
- * Makes a reconnect invisible to the client.
14
- *
15
- * The daemon builds a FRESH `McpServer` per SSE connection, so a reconnected session has never seen
16
- * the client's `initialize` — every subsequent `tools/call` would hit an uninitialized server. The
17
- * proxy therefore remembers the handshake the client sent once and replays it into each new session.
18
- * The replay is re-issued under a reserved id so the daemon's response to it can be dropped rather
19
- * than reaching the client's stdout, where a duplicate JSON-RPC id would be a protocol violation.
20
- */
21
- export declare class HandshakeReplay {
22
- #private;
23
- /** Record one outbound client line. Cheap enough to call for every stdin message. */
24
- observeOutbound(line: string): void;
25
- /** Lines to POST into a freshly-established session, before any queued client traffic. */
26
- replayLines(): string[];
27
- /** True when this inbound daemon line is the echo of our replayed handshake and must not be forwarded. */
28
- shouldSuppressInbound(line: string): boolean;
29
- }
30
- /** One parsed Server-Sent-Events frame: the event name (defaulted to "message") and its data. */
31
- export interface SseFrame {
32
- event: string;
33
- data: string;
34
- }
35
- /**
36
- * Incremental SSE frame parser for the MCP front door.
37
- *
38
- * A single SSE field can split across TCP reads (`da` in one chunk, `ta: {...}` in the next), and a
39
- * server may send CRLF or bare CR line endings — so the framing is stateful and edge-case-prone, yet it
40
- * carried every MCP message the agent sends and was only ever exercised end-to-end. Pulled out of the
41
- * socket handler as a pure, chunk-fed parser so those boundaries are unit-testable: feed raw chunks,
42
- * get back each complete frame (a blank line terminates a frame; `event:` names it, `data:` lines
43
- * accumulate newline-joined; `id:`/`retry:`/comments are ignored — not needed for the bridge).
44
- */
45
- export declare class SseFrameParser {
46
- #private;
47
- push(chunk: string): SseFrame[];
48
- }
49
- /**
50
- * Returns true if something is already listening on the reticle port.
51
- * Uses a plain TCP probe so we don't create a side-effectful SSE session
52
- * inside the daemon just to check reachability.
53
- */
54
- export declare function probeDaemon(port: number): Promise<boolean>;
55
- /** Poll until the daemon's HTTP port accepts connections or the deadline is reached. */
56
- export declare function waitForDaemon(port: number): Promise<void>;
57
- export declare function buildSessionUrl(rawData: string, port: number): string;
58
- /**
59
- * Bridge stdio ↔ SSE: connects to the running daemon's MCP endpoint and forwards
60
- * Claude Code's stdin/stdout JSON-RPC through it. Never resolves — runs until stdin closes.
61
- *
62
- * A dropped SSE stream used to exit the process, which is what made the agent's `reticle_*` tools
63
- * vanish mid-session with no message and no way for the agent to get them back — only a human running
64
- * `/mcp` could. The daemon demonstrably stays up across these drops, so the stream ending is a
65
- * transport event, not a shutdown: reconnect to it and replay the handshake instead of dying.
66
- */
67
- export declare function startMcpProxy(port: number): Promise<never>;