@reticlehq/server 2.3.0 → 2.5.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 (424) hide show
  1. package/SKILL.md +702 -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} +1 -1
  7. package/dist/{bridge.js → bridge/bridge.js} +105 -15
  8. package/dist/{bridge.test-harness.d.ts → bridge/bridge.test-harness.d.ts} +6 -11
  9. package/dist/{bridge.test-harness.js → bridge/bridge.test-harness.js} +21 -9
  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-doctor.js → cli/cli-doctor.js} +9 -2
  20. package/dist/{cli-flow-commands.d.ts → cli/cli-flow-commands.d.ts} +2 -2
  21. package/dist/{cli-flow-commands.js → cli/cli-flow-commands.js} +15 -15
  22. package/dist/{cli-launch.d.ts → cli/cli-launch.d.ts} +32 -3
  23. package/dist/cli/cli-launch.js +171 -0
  24. package/dist/cli/cli-parse.d.ts +143 -0
  25. package/dist/{cli-parse.js → cli/cli-parse.js} +146 -65
  26. package/dist/{cli-port.d.ts → cli/cli-port.d.ts} +15 -0
  27. package/dist/{cli-port.js → cli/cli-port.js} +29 -8
  28. package/dist/cli/cli-update-commands.d.ts +4 -0
  29. package/dist/cli/cli-update-commands.js +93 -0
  30. package/dist/{cli-verify.js → cli/cli-verify.js} +14 -14
  31. package/dist/{cloud-cli.js → cli/cloud-cli.js} +29 -24
  32. package/dist/cli.d.ts +2 -2
  33. package/dist/cli.js +182 -93
  34. package/dist/cloud/cloud-config.d.ts +0 -1
  35. package/dist/cloud/cloud-config.js +9 -9
  36. package/dist/cloud/cloud-sync.d.ts +1 -7
  37. package/dist/cloud/cloud-sync.js +12 -12
  38. package/dist/crawl/crawl-empty.d.ts +16 -0
  39. package/dist/crawl/crawl-empty.js +24 -0
  40. package/dist/crawl/crawl-tools.js +4 -1
  41. package/dist/crawl/crawl.js +26 -7
  42. package/dist/daemon/daemon-resilience.d.ts +49 -0
  43. package/dist/daemon/daemon-resilience.js +191 -0
  44. package/dist/daemon/daemon-usefulness.d.ts +61 -0
  45. package/dist/daemon/daemon-usefulness.js +62 -0
  46. package/dist/{daemon.d.ts → daemon/daemon.d.ts} +33 -8
  47. package/dist/{daemon.js → daemon/daemon.js} +80 -48
  48. package/dist/daemon/idle-grace.d.ts +32 -0
  49. package/dist/daemon/idle-grace.js +41 -0
  50. package/dist/{idle-shutdown.d.ts → daemon/idle-shutdown.d.ts} +13 -0
  51. package/dist/{idle-shutdown.js → daemon/idle-shutdown.js} +27 -4
  52. package/dist/domain/domain-model.js +2 -2
  53. package/dist/events/body-failures.js +8 -8
  54. package/dist/events/contradictions.d.ts +1 -1
  55. package/dist/events/contradictions.js +60 -10
  56. package/dist/events/echo-mismatch.js +10 -10
  57. package/dist/events/event-filters.js +6 -6
  58. package/dist/events/json-salvage.d.ts +2 -1
  59. package/dist/events/json-salvage.js +6 -6
  60. package/dist/events/observed-in-window.d.ts +12 -0
  61. package/dist/events/observed-in-window.js +21 -0
  62. package/dist/events/predicate-eval.d.ts +43 -20
  63. package/dist/events/predicate-eval.js +159 -55
  64. package/dist/events/predicate.d.ts +2 -2
  65. package/dist/events/predicate.js +112 -35
  66. package/dist/events/reconcile.js +5 -5
  67. package/dist/events/ring-buffer.js +1 -1
  68. package/dist/events/stale-response.js +6 -6
  69. package/dist/events/testid-near-miss.d.ts +22 -0
  70. package/dist/events/testid-near-miss.js +33 -0
  71. package/dist/events/unit-mismatch.js +8 -8
  72. package/dist/flows/affected-tools.js +19 -4
  73. package/dist/flows/affected.js +1 -1
  74. package/dist/flows/annotate-target.d.ts +1 -0
  75. package/dist/flows/annotate-target.js +20 -0
  76. package/dist/flows/annotate-tools.js +25 -3
  77. package/dist/flows/annotate.js +17 -4
  78. package/dist/flows/assertion-integrity.d.ts +2 -1
  79. package/dist/flows/assertion-tiers-store.d.ts +3 -66
  80. package/dist/flows/assertion-tiers-store.js +2 -2
  81. package/dist/flows/attributed-failure.d.ts +17 -0
  82. package/dist/flows/attributed-failure.js +20 -0
  83. package/dist/flows/buddy-status.d.ts +2 -1
  84. package/dist/flows/buddy-status.js +2 -2
  85. package/dist/flows/coverage.d.ts +3 -2
  86. package/dist/flows/coverage.js +2 -2
  87. package/dist/flows/decision.d.ts +0 -6
  88. package/dist/flows/decision.js +64 -8
  89. package/dist/flows/empty-flow.d.ts +6 -0
  90. package/dist/flows/empty-flow.js +24 -0
  91. package/dist/flows/flake-store.d.ts +0 -1
  92. package/dist/flows/flake-store.js +1 -1
  93. package/dist/flows/flake.d.ts +2 -1
  94. package/dist/flows/flake.js +2 -2
  95. package/dist/flows/flow-classify.js +12 -0
  96. package/dist/flows/flow-replay-run.js +4 -4
  97. package/dist/flows/flow-replay.d.ts +5 -7
  98. package/dist/flows/flow-replay.js +114 -47
  99. package/dist/flows/flow-report.js +1 -1
  100. package/dist/flows/flow-scope.d.ts +1 -6
  101. package/dist/flows/flow-step-runners.d.ts +26 -6
  102. package/dist/flows/flow-step-runners.js +157 -6
  103. package/dist/flows/flow-success.js +20 -15
  104. package/dist/flows/flow-tools.js +67 -13
  105. package/dist/flows/flows.js +15 -11
  106. package/dist/flows/gate.d.ts +4 -3
  107. package/dist/flows/gate.js +1 -1
  108. package/dist/flows/heal-run.d.ts +0 -8
  109. package/dist/flows/heal-run.js +5 -5
  110. package/dist/flows/heal.js +3 -3
  111. package/dist/flows/predicate-to-expect.d.ts +38 -0
  112. package/dist/flows/predicate-to-expect.js +95 -0
  113. package/dist/flows/replay.d.ts +16 -1
  114. package/dist/flows/replay.js +58 -22
  115. package/dist/flows/role-anchor-nearest.d.ts +6 -0
  116. package/dist/flows/role-anchor-nearest.js +45 -0
  117. package/dist/flows/server-verify.d.ts +1 -1
  118. package/dist/flows/server-verify.js +5 -5
  119. package/dist/flows/verify-change-tools.js +32 -10
  120. package/dist/flows/verify-change-verdict.d.ts +15 -0
  121. package/dist/flows/verify-change-verdict.js +25 -0
  122. package/dist/flows/watch-batcher.d.ts +3 -2
  123. package/dist/honesty/already-true.d.ts +2 -0
  124. package/dist/honesty/already-true.js +31 -0
  125. package/dist/honesty/blind-spots.d.ts +16 -3
  126. package/dist/honesty/blind-spots.js +24 -12
  127. package/dist/honesty/honesty.d.ts +3 -2
  128. package/dist/honesty/honesty.js +4 -4
  129. package/dist/honesty/uncaptured-bodies.js +1 -1
  130. package/dist/honesty/unread-outcome.js +2 -2
  131. package/dist/honesty/verified.d.ts +22 -3
  132. package/dist/honesty/verified.js +48 -8
  133. package/dist/http-server.js +14 -7
  134. package/dist/hunt/hunt-report.d.ts +2 -1
  135. package/dist/hunt/hunt-report.js +2 -2
  136. package/dist/index.d.ts +8 -6
  137. package/dist/index.js +32 -25
  138. package/dist/init/agent-rules.d.ts +2 -1
  139. package/dist/init/agent-rules.js +45 -7
  140. package/dist/init/app-choice.d.ts +20 -0
  141. package/dist/init/app-choice.js +25 -0
  142. package/dist/init/astro-host.d.ts +21 -0
  143. package/dist/init/astro-host.js +27 -0
  144. package/dist/init/astro-patch.d.ts +16 -0
  145. package/dist/init/astro-patch.js +240 -0
  146. package/dist/init/capabilities.d.ts +17 -0
  147. package/dist/init/capabilities.js +54 -0
  148. package/dist/init/cra.d.ts +37 -0
  149. package/dist/init/cra.js +90 -0
  150. package/dist/init/cursor.js +39 -4
  151. package/dist/init/desktop-doctor.d.ts +3 -2
  152. package/dist/init/desktop-doctor.js +4 -4
  153. package/dist/init/detect.d.ts +26 -0
  154. package/dist/init/detect.js +78 -5
  155. package/dist/init/mcp-registered.d.ts +12 -0
  156. package/dist/init/mcp-registered.js +14 -0
  157. package/dist/init/mcp.d.ts +27 -2
  158. package/dist/init/mcp.js +40 -4
  159. package/dist/init/next-patch.d.ts +39 -0
  160. package/dist/init/next-patch.js +196 -0
  161. package/dist/init/node-io.js +48 -6
  162. package/dist/init/patch-kind.d.ts +20 -0
  163. package/dist/init/patch-kind.js +10 -0
  164. package/dist/init/plan-framework.d.ts +50 -0
  165. package/dist/init/plan-framework.js +341 -0
  166. package/dist/init/plan.d.ts +119 -6
  167. package/dist/init/plan.js +230 -131
  168. package/dist/init/project-id.d.ts +5 -9
  169. package/dist/init/project-id.js +10 -22
  170. package/dist/init/run.d.ts +22 -0
  171. package/dist/init/run.js +393 -28
  172. package/dist/init/slash-command.d.ts +27 -0
  173. package/dist/init/slash-command.js +61 -0
  174. package/dist/init/snippets.d.ts +41 -3
  175. package/dist/init/snippets.js +185 -10
  176. package/dist/init/vite-config.d.ts +4 -10
  177. package/dist/init/vite-config.js +15 -7
  178. package/dist/init/workspace-apps.d.ts +23 -0
  179. package/dist/init/workspace-apps.js +68 -0
  180. package/dist/input/driven-redaction.d.ts +15 -0
  181. package/dist/input/driven-redaction.js +76 -0
  182. package/dist/input/network-detail.d.ts +9 -3
  183. package/dist/input/network-detail.js +43 -23
  184. package/dist/input/network-mock-tools.js +2 -2
  185. package/dist/input/network-mock.js +4 -4
  186. package/dist/input/real-input.js +8 -3
  187. package/dist/input/scroll-find.js +2 -2
  188. package/dist/input/scroll-tools.d.ts +0 -5
  189. package/dist/input/scroll-tools.js +11 -4
  190. package/dist/input/viewport-tools.js +2 -2
  191. package/dist/journal/ambient-store.d.ts +0 -2
  192. package/dist/journal/ambient-store.js +1 -1
  193. package/dist/journal/ambient.js +1 -1
  194. package/dist/journal/attach-journal.d.ts +2 -1
  195. package/dist/journal/deviation-report.js +6 -6
  196. package/dist/journal/deviation-service.js +1 -1
  197. package/dist/journal/envelope-store.d.ts +0 -2
  198. package/dist/journal/envelope-store.js +1 -1
  199. package/dist/journal/envelope.d.ts +2 -3
  200. package/dist/journal/envelope.js +3 -3
  201. package/dist/journal/journal-query.js +1 -1
  202. package/dist/journal/journal-recorder.d.ts +2 -1
  203. package/dist/journal/journal-recorder.js +2 -2
  204. package/dist/journal/rollups.js +9 -9
  205. package/dist/journal/session-end.d.ts +2 -1
  206. package/dist/journal/session-journal.js +4 -4
  207. package/dist/license/license.d.ts +0 -14
  208. package/dist/license/license.js +8 -8
  209. package/dist/log.d.ts +10 -0
  210. package/dist/log.js +11 -1
  211. package/dist/mcp/mcp-is-error.d.ts +13 -0
  212. package/dist/mcp/mcp-is-error.js +18 -0
  213. package/dist/mcp/mcp-outage.d.ts +31 -0
  214. package/dist/mcp/mcp-outage.js +48 -0
  215. package/dist/mcp/mcp-proxy.d.ts +124 -0
  216. package/dist/mcp/mcp-proxy.js +697 -0
  217. package/dist/{mcp.d.ts → mcp/mcp.d.ts} +13 -10
  218. package/dist/{mcp.js → mcp/mcp.js} +110 -35
  219. package/dist/mcp/proxy-handshake.d.ts +3 -0
  220. package/dist/mcp/proxy-handshake.js +54 -0
  221. package/dist/mcp/proxy-lifecycle.d.ts +64 -0
  222. package/dist/mcp/proxy-lifecycle.js +70 -0
  223. package/dist/mcp/tool-catalog-cache.d.ts +29 -0
  224. package/dist/mcp/tool-catalog-cache.js +55 -0
  225. package/dist/oracles/propose-consequences.d.ts +2 -1
  226. package/dist/oracles/propose-consequences.js +16 -11
  227. package/dist/oracles/self-instrument.d.ts +2 -1
  228. package/dist/oracles/self-instrument.js +1 -1
  229. package/dist/phenomena/phenomena.js +3 -3
  230. package/dist/platform.d.ts +16 -0
  231. package/dist/platform.js +16 -0
  232. package/dist/pool/playwright-launcher.d.ts +15 -2
  233. package/dist/pool/playwright-launcher.js +21 -2
  234. package/dist/project/fs-port.js +1 -1
  235. package/dist/project/project-tools.js +2 -2
  236. package/dist/runs/build-verification-run.js +1 -1
  237. package/dist/runs/repair-prompt.d.ts +0 -6
  238. package/dist/runs/repair-prompt.js +3 -3
  239. package/dist/runs/risk-classify.js +1 -1
  240. package/dist/runs/run-diff.d.ts +0 -2
  241. package/dist/runs/run-diff.js +3 -3
  242. package/dist/runs/run-tools.js +2 -2
  243. package/dist/runs/verification-sync.js +2 -2
  244. package/dist/runs/verify-http.js +1 -1
  245. package/dist/runs/verify-server.js +1 -1
  246. package/dist/session/command-timeout.d.ts +11 -3
  247. package/dist/session/command-timeout.js +2 -2
  248. package/dist/session/control-envelope.d.ts +6 -0
  249. package/dist/session/control-envelope.js +7 -1
  250. package/dist/session/dev-server-probe.d.ts +13 -0
  251. package/dist/session/dev-server-probe.js +52 -0
  252. package/dist/session/last-act.d.ts +17 -3
  253. package/dist/session/last-act.js +16 -4
  254. package/dist/session/live-control-tools.js +7 -2
  255. package/dist/session/live-control.js +1 -1
  256. package/dist/session/looks-like-dev-server.d.ts +14 -0
  257. package/dist/session/looks-like-dev-server.js +25 -0
  258. package/dist/session/no-session-diagnosis.d.ts +38 -0
  259. package/dist/session/no-session-diagnosis.js +70 -0
  260. package/dist/session/no-session-watch.d.ts +19 -0
  261. package/dist/session/no-session-watch.js +61 -0
  262. package/dist/session/observed-state.d.ts +4 -0
  263. package/dist/session/observed-state.js +19 -1
  264. package/dist/session/output-budget.js +1 -1
  265. package/dist/session/session-health.d.ts +8 -1
  266. package/dist/session/session-health.js +8 -7
  267. package/dist/session/session-info.d.ts +26 -7
  268. package/dist/session/session-info.js +42 -1
  269. package/dist/session/session-lease.d.ts +0 -11
  270. package/dist/session/session-lease.js +1 -1
  271. package/dist/session/session-manager.d.ts +3 -0
  272. package/dist/session/session-manager.js +58 -9
  273. package/dist/session/session-readiness.d.ts +1 -1
  274. package/dist/session/session-readiness.js +6 -1
  275. package/dist/session/session-reaper.js +1 -1
  276. package/dist/session/session-reconnect.d.ts +32 -0
  277. package/dist/session/session-reconnect.js +42 -0
  278. package/dist/session/session.d.ts +20 -2
  279. package/dist/session/session.js +76 -26
  280. package/dist/session/state-select.d.ts +1 -1
  281. package/dist/session/state-select.js +1 -1
  282. package/dist/status-payload.d.ts +19 -0
  283. package/dist/status-payload.js +11 -0
  284. package/dist/telemetry/argument-shape.js +10 -1
  285. package/dist/telemetry/browser-mode.d.ts +27 -0
  286. package/dist/telemetry/browser-mode.js +33 -0
  287. package/dist/telemetry/bug-found.d.ts +17 -21
  288. package/dist/telemetry/bug-found.js +120 -8
  289. package/dist/telemetry/cli-telemetry.d.ts +2 -12
  290. package/dist/telemetry/cli-telemetry.js +27 -4
  291. package/dist/telemetry/daemon-telemetry.d.ts +19 -0
  292. package/dist/telemetry/daemon-telemetry.js +12 -2
  293. package/dist/telemetry/dev-repo.js +4 -4
  294. package/dist/telemetry/error-fingerprint.js +21 -2
  295. package/dist/telemetry/feedback-cli.d.ts +1 -1
  296. package/dist/telemetry/feedback-cli.js +4 -4
  297. package/dist/telemetry/feedback-context.d.ts +22 -0
  298. package/dist/telemetry/feedback-context.js +41 -1
  299. package/dist/telemetry/feedback-delivery.d.ts +20 -0
  300. package/dist/telemetry/feedback-delivery.js +30 -0
  301. package/dist/telemetry/feedback-outbox.d.ts +22 -0
  302. package/dist/telemetry/feedback-outbox.js +87 -0
  303. package/dist/telemetry/feedback.d.ts +22 -1
  304. package/dist/telemetry/feedback.js +67 -8
  305. package/dist/telemetry/git-facts.js +1 -1
  306. package/dist/telemetry/session-metrics.d.ts +2 -0
  307. package/dist/telemetry/session-metrics.js +68 -6
  308. package/dist/telemetry/telemetry.d.ts +27 -2
  309. package/dist/telemetry/telemetry.js +119 -29
  310. package/dist/telemetry/verification-of.d.ts +22 -0
  311. package/dist/telemetry/verification-of.js +84 -0
  312. package/dist/tools/act-capsule.js +2 -2
  313. package/dist/tools/act-danger.d.ts +12 -0
  314. package/dist/tools/act-danger.js +20 -3
  315. package/dist/tools/act-helpers.js +4 -4
  316. package/dist/tools/act-tools.d.ts +0 -8
  317. package/dist/tools/act-tools.js +84 -115
  318. package/dist/tools/act-view.js +7 -7
  319. package/dist/tools/alias-args.d.ts +17 -0
  320. package/dist/tools/alias-args.js +25 -0
  321. package/dist/tools/assert-grade.js +9 -9
  322. package/dist/tools/assert-verdict.d.ts +3 -1
  323. package/dist/tools/assert-verdict.js +8 -5
  324. package/dist/tools/browser-tools.js +30 -11
  325. package/dist/tools/contract-tools.js +1 -1
  326. package/dist/tools/coverage-identity.d.ts +34 -0
  327. package/dist/tools/coverage-identity.js +46 -0
  328. package/dist/tools/coverage-tools.js +10 -14
  329. package/dist/tools/dynamic-tools.d.ts +2 -1
  330. package/dist/tools/dynamic-tools.js +90 -18
  331. package/dist/tools/error-recovery.d.ts +20 -2
  332. package/dist/tools/error-recovery.js +179 -4
  333. package/dist/tools/feedback-tools.d.ts +12 -1
  334. package/dist/tools/feedback-tools.js +28 -5
  335. package/dist/tools/invoke-tool.d.ts +0 -6
  336. package/dist/tools/invoke-tool.js +57 -32
  337. package/dist/tools/lease-hint.d.ts +17 -0
  338. package/dist/tools/lease-hint.js +24 -0
  339. package/dist/tools/lease-tools.js +6 -5
  340. package/dist/tools/merge-tools.d.ts +10 -1
  341. package/dist/tools/merge-tools.js +9 -3
  342. package/dist/tools/merged-name-redirect.d.ts +13 -0
  343. package/dist/tools/merged-name-redirect.js +55 -0
  344. package/dist/tools/navigate-result.d.ts +17 -0
  345. package/dist/tools/navigate-result.js +31 -0
  346. package/dist/tools/observe-tools.js +54 -20
  347. package/dist/tools/observed-nothing.d.ts +25 -0
  348. package/dist/tools/observed-nothing.js +33 -0
  349. package/dist/tools/query-paginate.js +2 -2
  350. package/dist/tools/query-shape.d.ts +18 -0
  351. package/dist/tools/query-shape.js +39 -0
  352. package/dist/tools/read-tools.js +85 -20
  353. package/dist/tools/real-input-attempt.d.ts +28 -0
  354. package/dist/tools/real-input-attempt.js +88 -0
  355. package/dist/tools/reconcile-tools.js +7 -7
  356. package/dist/tools/reload-result.d.ts +14 -0
  357. package/dist/tools/reload-result.js +29 -0
  358. package/dist/tools/snapshot-delta.d.ts +4 -5
  359. package/dist/tools/snapshot-delta.js +0 -0
  360. package/dist/tools/tool-kit.d.ts +8 -0
  361. package/dist/tools/tool-surface.d.ts +83 -0
  362. package/dist/tools/tool-surface.js +204 -0
  363. package/dist/tools/tools-helpers.js +6 -6
  364. package/dist/tools/tools.d.ts +15 -0
  365. package/dist/tools/tools.js +53 -17
  366. package/dist/tools/unadvertised-help.d.ts +5 -0
  367. package/dist/tools/unadvertised-help.js +39 -0
  368. package/dist/trace.d.ts +69 -0
  369. package/dist/trace.js +150 -0
  370. package/dist/update/nudge-credit.d.ts +4 -0
  371. package/dist/update/nudge-credit.js +53 -0
  372. package/dist/update/sdk-sync.d.ts +21 -0
  373. package/dist/update/sdk-sync.js +42 -0
  374. package/dist/update/update-checker.js +3 -3
  375. package/dist/update/update-nudge.d.ts +63 -6
  376. package/dist/update/update-nudge.js +128 -15
  377. package/dist/update/updater.d.ts +1 -9
  378. package/dist/update/updater.js +13 -8
  379. package/dist/version/peer-announce.d.ts +4 -0
  380. package/dist/version/peer-announce.js +30 -0
  381. package/dist/{server-version.js → version/server-version.js} +5 -1
  382. package/dist/version/version-nudge.d.ts +28 -0
  383. package/dist/version/version-nudge.js +40 -0
  384. package/dist/version/version-skew.d.ts +66 -0
  385. package/dist/version/version-skew.js +71 -0
  386. package/dist/visual/visual-diff.js +2 -2
  387. package/dist/visual/visual-tools.js +4 -4
  388. package/docs/agent-cheatsheet.md +85 -0
  389. package/docs/architecture.md +113 -0
  390. package/docs/benchmarks.md +255 -0
  391. package/docs/debugging.md +102 -0
  392. package/docs/deploy-checks.md +69 -0
  393. package/docs/desktop-apps.md +256 -0
  394. package/docs/enterprise.md +62 -0
  395. package/docs/fixtures.md +28 -0
  396. package/docs/flows.md +166 -0
  397. package/docs/getting-started.md +469 -0
  398. package/docs/human-control.md +63 -0
  399. package/docs/integration-patterns.md +171 -0
  400. package/docs/local-registry.md +126 -0
  401. package/docs/mint.json +61 -0
  402. package/docs/multi-agent-testing.md +55 -0
  403. package/docs/platform-integration.md +122 -0
  404. package/docs/telemetry-contract.md +214 -0
  405. package/docs/telemetry.md +184 -0
  406. package/docs/testing.md +82 -0
  407. package/docs/token-efficiency.md +80 -0
  408. package/docs/usage.md +1046 -0
  409. package/package.json +8 -5
  410. package/dist/cli-launch.js +0 -112
  411. package/dist/cli-parse.d.ts +0 -140
  412. package/dist/daemon-resilience.d.ts +0 -22
  413. package/dist/daemon-resilience.js +0 -85
  414. package/dist/mcp-proxy.d.ts +0 -35
  415. package/dist/mcp-proxy.js +0 -190
  416. package/dist/tools/profiles.d.ts +0 -37
  417. package/dist/tools/profiles.js +0 -139
  418. /package/dist/{pairing-token.d.ts → bridge/pairing-token.d.ts} +0 -0
  419. /package/dist/{token-auth.d.ts → bridge/token-auth.d.ts} +0 -0
  420. /package/dist/{token-auth.js → bridge/token-auth.js} +0 -0
  421. /package/dist/{cli-doctor.d.ts → cli/cli-doctor.d.ts} +0 -0
  422. /package/dist/{cli-verify.d.ts → cli/cli-verify.d.ts} +0 -0
  423. /package/dist/{cloud-cli.d.ts → cli/cloud-cli.d.ts} +0 -0
  424. /package/dist/{server-version.d.ts → version/server-version.d.ts} +0 -0
@@ -37,13 +37,13 @@ export function signLicenseKey(payload, privateKey) {
37
37
  }
38
38
  /** Verify a key against the issuer public key. Never throws — returns a structured status. */
39
39
  export function verifyLicenseKey(key, publicKey, now) {
40
- if (key === undefined || key.length === 0)
40
+ if (key === undefined || 0 === key.length)
41
41
  return { status: LicenseStatus.MISSING };
42
42
  const parts = key.split(KEY_SEP);
43
43
  if (parts.length !== 2 ||
44
44
  parts[0] === undefined ||
45
45
  parts[1] === undefined ||
46
- parts[0].length === 0) {
46
+ 0 === parts[0].length) {
47
47
  return { status: LicenseStatus.MALFORMED };
48
48
  }
49
49
  let json;
@@ -85,7 +85,7 @@ export class EnterpriseLicenseError extends Error {
85
85
  /** The issuer public key from the environment (set at release / by the operator); undefined if unset. */
86
86
  function issuerPublicKey() {
87
87
  const pem = process.env[LICENSE_PUBLIC_KEY_ENV];
88
- if (pem === undefined || pem.length === 0)
88
+ if (pem === undefined || 0 === pem.length)
89
89
  return undefined;
90
90
  try {
91
91
  return createPublicKey(pem);
@@ -122,20 +122,20 @@ export const LICENSE_PUBLIC_KEY_ENV = 'RETICLE_LICENSE_PUBLIC_KEY';
122
122
  * never setting RETICLE_LICENSE_PUBLIC_KEY, because the baked key takes precedence. The public key is
123
123
  * safe to ship openly — it can only verify licenses, never mint them (that needs the private key).
124
124
  */
125
- export const BAKED_ISSUER_PUBLIC_KEY_PEM = '';
125
+ const BAKED_ISSUER_PUBLIC_KEY_PEM = '';
126
126
  /**
127
127
  * Resolve the issuer public-key PEM enforcement uses: the baked-in release key wins, so it can't be
128
128
  * turned off from the environment. Only when nothing is baked (dev/repo) does the env var apply — that
129
129
  * env path is the test/self-eval escape hatch, not the production switch.
130
130
  */
131
- export function resolveIssuerPublicKeyPem(env, baked = BAKED_ISSUER_PUBLIC_KEY_PEM) {
131
+ function resolveIssuerPublicKeyPem(env, baked = BAKED_ISSUER_PUBLIC_KEY_PEM) {
132
132
  if (baked.length > 0)
133
133
  return baked;
134
134
  const envPem = env[LICENSE_PUBLIC_KEY_ENV];
135
135
  return envPem !== undefined && envPem.length > 0 ? envPem : undefined;
136
136
  }
137
137
  function loadPublicKey(pem) {
138
- if (pem === undefined || pem.length === 0)
138
+ if (pem === undefined || 0 === pem.length)
139
139
  return undefined;
140
140
  try {
141
141
  return createPublicKey(pem);
@@ -151,7 +151,7 @@ function loadPublicKey(pem) {
151
151
  */
152
152
  export function describeLicense(now, env = process.env, baked = BAKED_ISSUER_PUBLIC_KEY_PEM) {
153
153
  const pem = resolveIssuerPublicKeyPem(env, baked);
154
- if (pem === undefined || pem.length === 0) {
154
+ if (pem === undefined || 0 === pem.length) {
155
155
  // In a production runtime this is NOT a benign eval session — it is a mis-built release whose gate
156
156
  // is off, and assertEnterpriseFromEnv now denies rather than unlocking. Say so loudly here too.
157
157
  return isProductionEnv(env)
@@ -196,7 +196,7 @@ export function describeLicense(now, env = process.env, baked = BAKED_ISSUER_PUB
196
196
  /** True in a production runtime (NODE_ENV=production) — where a missing issuer key is a mis-built
197
197
  * release, not an eval session, so the gate must fail CLOSED rather than run features free. */
198
198
  function isProductionEnv(env) {
199
- return env['NODE_ENV'] === 'production';
199
+ return 'production' === env['NODE_ENV'];
200
200
  }
201
201
  /**
202
202
  * Gate an enterprise feature using env-resolved activation. Enforcement is ON when the issuer public key
package/dist/log.d.ts CHANGED
@@ -1,5 +1,15 @@
1
1
  /**
2
2
  * Structured logging to stderr. stdout is reserved for the MCP stdio transport — never
3
3
  * write logs there.
4
+ *
5
+ * Every line carries `t`, an ISO-8601 wall clock, FIRST.
6
+ *
7
+ * It did not, and that cost a real investigation its conclusion: `~/.reticle/daemon-4400.log` had
8
+ * grown to 24MB of events and not one of them could be placed in time, so "the daemon vanished right
9
+ * behind the proxy" could only ever be "points at" and never "is". Ordering the key first also means
10
+ * a huge log can be bisected by eye, and by `sort`, without parsing it.
11
+ *
12
+ * The clock is read here rather than injected: this is the I/O boundary, not pure logic, and a
13
+ * logger that needs its caller to supply the time is a logger callers will route around.
4
14
  */
5
15
  export declare function log(event: string, fields?: Record<string, unknown>): void;
package/dist/log.js CHANGED
@@ -1,8 +1,18 @@
1
1
  /**
2
2
  * Structured logging to stderr. stdout is reserved for the MCP stdio transport — never
3
3
  * write logs there.
4
+ *
5
+ * Every line carries `t`, an ISO-8601 wall clock, FIRST.
6
+ *
7
+ * It did not, and that cost a real investigation its conclusion: `~/.reticle/daemon-4400.log` had
8
+ * grown to 24MB of events and not one of them could be placed in time, so "the daemon vanished right
9
+ * behind the proxy" could only ever be "points at" and never "is". Ordering the key first also means
10
+ * a huge log can be bisected by eye, and by `sort`, without parsing it.
11
+ *
12
+ * The clock is read here rather than injected: this is the I/O boundary, not pure logic, and a
13
+ * logger that needs its caller to supply the time is a logger callers will route around.
4
14
  */
5
15
  export function log(event, fields = {}) {
6
- const line = JSON.stringify({ event, ...fields });
16
+ const line = JSON.stringify({ t: new Date().toISOString(), event, ...fields });
7
17
  process.stderr.write(`${line}\n`);
8
18
  }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Does a SUCCESSFUL tool result actually describe a refusal?
3
+ *
4
+ * `isError` used to be set only when a handler threw. Every tool that returns a well-formed
5
+ * `{ error, recovery }` object instead — and that is half the surface — came back as protocol
6
+ * success with the flag unset, so anything branching on `isError` read a refusal as a result.
7
+ * Reported from a field sweep that had to special-case each tool's shape to score a run at all.
8
+ *
9
+ * A top-level `error` STRING is this codebase's refusal convention (see buildErrorPayload), so that
10
+ * is the whole test. Deliberately top-level only: `error` appears inside console entries and network
11
+ * rows as ordinary data, and flipping the flag for those would make it useless in the other direction.
12
+ */
13
+ export declare function resultIsError(result: unknown): boolean;
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Does a SUCCESSFUL tool result actually describe a refusal?
3
+ *
4
+ * `isError` used to be set only when a handler threw. Every tool that returns a well-formed
5
+ * `{ error, recovery }` object instead — and that is half the surface — came back as protocol
6
+ * success with the flag unset, so anything branching on `isError` read a refusal as a result.
7
+ * Reported from a field sweep that had to special-case each tool's shape to score a run at all.
8
+ *
9
+ * A top-level `error` STRING is this codebase's refusal convention (see buildErrorPayload), so that
10
+ * is the whole test. Deliberately top-level only: `error` appears inside console entries and network
11
+ * rows as ordinary data, and flipping the flag for those would make it useless in the other direction.
12
+ */
13
+ export function resultIsError(result) {
14
+ if (typeof result !== 'object' || null === result || Array.isArray(result))
15
+ return false;
16
+ const error = result.error;
17
+ return 'string' === typeof error && error.length > 0;
18
+ }
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Reporting that the agent lost its Reticle tools.
3
+ *
4
+ * The proxy already writes a full account of an outage to ~/.reticle/mcp-proxy.log, which is exactly
5
+ * where nobody looks and nothing aggregates. So the one question the transport must answer — how
6
+ * often does a real user's MCP server go down, and does it come back — had no answer outside the
7
+ * machine it happened on.
8
+ *
9
+ * Capped at two events per proxy process, and the cap is the design rather than a limitation. One
10
+ * measured afternoon produced 547 proxy reconnects; an event per reconnect would bill for the
11
+ * pathology instead of measuring it, which is the same mistake the per-call `tool` event made before
12
+ * it was removed. What a dashboard needs is the SHARE OF SESSIONS that lose MCP at all (the first
13
+ * outage) and the share where it never came back on its own (the budget being spent).
14
+ */
15
+ import { OutageReason, OutageStage } from '@reticlehq/core';
16
+ /**
17
+ * `OutageStage` and `OutageReason` are core's — this re-export only saves the proxy an import. They
18
+ * cross the wire, so the vocabulary lives in the contract package and is never re-listed here.
19
+ */
20
+ export { OutageReason, OutageStage };
21
+ /** Reset between tests; a real process reports each stage at most once. */
22
+ export declare function resetOutageReporting(): void;
23
+ /**
24
+ * Report one stage of an outage, at most once per process. Fire-and-forget on purpose: this runs on
25
+ * the transport's recovery path, and a telemetry POST must never be the thing that delays — or
26
+ * fails — the reconnect it is describing.
27
+ */
28
+ export declare function reportMcpOutage(stage: OutageStage, facts: {
29
+ reason: string;
30
+ attempts: number;
31
+ }): void;
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Reporting that the agent lost its Reticle tools.
3
+ *
4
+ * The proxy already writes a full account of an outage to ~/.reticle/mcp-proxy.log, which is exactly
5
+ * where nobody looks and nothing aggregates. So the one question the transport must answer — how
6
+ * often does a real user's MCP server go down, and does it come back — had no answer outside the
7
+ * machine it happened on.
8
+ *
9
+ * Capped at two events per proxy process, and the cap is the design rather than a limitation. One
10
+ * measured afternoon produced 547 proxy reconnects; an event per reconnect would bill for the
11
+ * pathology instead of measuring it, which is the same mistake the per-call `tool` event made before
12
+ * it was removed. What a dashboard needs is the SHARE OF SESSIONS that lose MCP at all (the first
13
+ * outage) and the share where it never came back on its own (the budget being spent).
14
+ */
15
+ import { OutageReason, OutageStage, TelemetryEventKind } from '@reticlehq/core';
16
+ import { getTelemetry } from '../telemetry/telemetry.js';
17
+ /**
18
+ * `OutageStage` and `OutageReason` are core's — this re-export only saves the proxy an import. They
19
+ * cross the wire, so the vocabulary lives in the contract package and is never re-listed here.
20
+ */
21
+ export { OutageReason, OutageStage };
22
+ /**
23
+ * The proxy's reason strings are free text: they also feed `proxyLog`, where prose is fine, and the
24
+ * wire refuses anything unbounded. Unrecognised reports as `other` rather than being forwarded, so a
25
+ * new drop path can appear in the proxy without an unclassified string leaving the machine.
26
+ */
27
+ const KNOWN_REASONS = new Set(Object.values(OutageReason));
28
+ function outageReason(raw) {
29
+ return KNOWN_REASONS.has(raw) ? raw : OutageReason.OTHER;
30
+ }
31
+ const reported = new Set();
32
+ /** Reset between tests; a real process reports each stage at most once. */
33
+ export function resetOutageReporting() {
34
+ reported.clear();
35
+ }
36
+ /**
37
+ * Report one stage of an outage, at most once per process. Fire-and-forget on purpose: this runs on
38
+ * the transport's recovery path, and a telemetry POST must never be the thing that delays — or
39
+ * fails — the reconnect it is describing.
40
+ */
41
+ export function reportMcpOutage(stage, facts) {
42
+ if (reported.has(stage))
43
+ return;
44
+ reported.add(stage);
45
+ void getTelemetry().emit(TelemetryEventKind.MCP_CONNECTION_LOST, {
46
+ outage: { stage, reason: outageReason(facts.reason), attempts: facts.attempts },
47
+ });
48
+ }
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Overridable so the survival spec can reach exhaustion in seconds instead of minutes — the same
3
+ * reason the idle windows take an env override. A positive integer only; anything else falls back,
4
+ * so a typo cannot silently disable the retry loop.
5
+ */
6
+ export declare const MAX_RECONNECT_ATTEMPTS: number;
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
+ /** Name the proxy log after the port it serves. Called before anything can log. */
11
+ export declare function setProxyLogPort(port: number): void;
12
+ /** The proxy's own log file, so a silent drop leaves a readable trace the agent can go read. */
13
+ export declare function proxyLogPath(port?: number | undefined): string;
14
+ /**
15
+ * Log to stderr (which the agent host usually swallows) AND to ~/.reticle/proxy-<port>.log, which it
16
+ * does not. A dropped MCP connection is invisible from the agent's side — no message, no exit code —
17
+ * so the one thing that makes it diagnosable at all is a file somebody can read afterwards.
18
+ *
19
+ * EXPORTED because the crash handlers need it. `installProxyResilience` was wired to the bare stderr
20
+ * logger, so the proxy's own uncaught exceptions and unhandled rejections — the exact events that
21
+ * present to a human as "the MCP server disconnected" — were written to a stream the editor throws
22
+ * away. The handler ran, the process kept serving, and the reason went nowhere. Reported as "the
23
+ * proxy has no log file… when it dies the diagnostic dies with it", which was half right: the file
24
+ * existed, and the one path that most needed it was not using it.
25
+ */
26
+ export declare function proxyLog(event: string, fields?: Record<string, unknown>): void;
27
+ /**
28
+ * JSON-RPC requests forwarded on behalf of the client that have not been answered yet.
29
+ *
30
+ * Only used at shutdown, where it is the difference between "the client closed stdin" and "the client
31
+ * closed stdin and we dropped its `tools/list` on the floor while reporting exit 0". A request has an
32
+ * id AND a method; a notification has no id and is owed nothing; a response has an id and no method.
33
+ */
34
+ export declare class PendingRequests {
35
+ #private;
36
+ observeOutbound(line: string): void;
37
+ observeInbound(line: string): void;
38
+ get unanswered(): string[];
39
+ /**
40
+ * Claim ONE unanswered id, so exactly one path may answer it. False means somebody already did —
41
+ * a duplicate response to one id is a protocol violation, not a belt-and-braces retry.
42
+ */
43
+ take(id: unknown): boolean;
44
+ /** Take every unanswered id and forget them, so the same request is failed at most once. */
45
+ drain(): string[];
46
+ }
47
+ /**
48
+ * JSON-RPC errors for every request that was in flight when the stream died.
49
+ *
50
+ * These are unrecoverable BY CONSTRUCTION: the daemon builds a fresh MCP session per SSE
51
+ * connection, so the reconnected session has never seen them. Re-sending them is not an option
52
+ * either — a `reticle_act` that already clicked would click twice, and inventing a second action in
53
+ * somebody's app is worse than reporting a failure.
54
+ *
55
+ * So the proxy answers them itself, under each request's own id. Found by brute force: killing the
56
+ * daemon under a live client left 20 of 20 concurrent calls hanging until the client's own timeout,
57
+ * with the MCP server still perfectly alive. An agent cannot tell that apart from "still working".
58
+ */
59
+ export declare function streamLossReplies(pending: PendingRequests, reason: string): string[];
60
+ /** The one shape every "the transport ate your call" answer takes, whichever leg died. */
61
+ export declare function transportLossReply(id: unknown, reason: string): string;
62
+ /**
63
+ * Makes a reconnect invisible to the client.
64
+ *
65
+ * The daemon builds a FRESH `McpServer` per SSE connection, so a reconnected session has never seen
66
+ * the client's `initialize` — every subsequent `tools/call` would hit an uninitialized server. The
67
+ * proxy therefore remembers the handshake the client sent once and replays it into each new session.
68
+ * The replay is re-issued under a reserved id so the daemon's response to it can be dropped rather
69
+ * than reaching the client's stdout, where a duplicate JSON-RPC id would be a protocol violation.
70
+ */
71
+ export declare class HandshakeReplay {
72
+ #private;
73
+ /** Record one outbound client line. Cheap enough to call for every stdin message. */
74
+ observeOutbound(line: string): void;
75
+ /** Lines to POST into a freshly-established session, before any queued client traffic. */
76
+ replayLines(): string[];
77
+ /** True when this inbound daemon line is the echo of our replayed handshake and must not be forwarded. */
78
+ shouldSuppressInbound(line: string): boolean;
79
+ }
80
+ /** One parsed Server-Sent-Events frame: the event name (defaulted to "message") and its data. */
81
+ interface SseFrame {
82
+ event: string;
83
+ data: string;
84
+ }
85
+ /**
86
+ * Incremental SSE frame parser for the MCP front door.
87
+ *
88
+ * A single SSE field can split across TCP reads (`da` in one chunk, `ta: {...}` in the next), and a
89
+ * server may send CRLF or bare CR line endings — so the framing is stateful and edge-case-prone, yet it
90
+ * carried every MCP message the agent sends and was only ever exercised end-to-end. Pulled out of the
91
+ * socket handler as a pure, chunk-fed parser so those boundaries are unit-testable: feed raw chunks,
92
+ * get back each complete frame (a blank line terminates a frame; `event:` names it, `data:` lines
93
+ * accumulate newline-joined; `id:`/`retry:`/comments are ignored — not needed for the bridge).
94
+ */
95
+ export declare class SseFrameParser {
96
+ #private;
97
+ push(chunk: string): SseFrame[];
98
+ }
99
+ /**
100
+ * Returns true if something is already listening on the reticle port.
101
+ * Uses a plain TCP probe so we don't create a side-effectful SSE session
102
+ * inside the daemon just to check reachability.
103
+ */
104
+ export declare function probeDaemon(port: number): Promise<boolean>;
105
+ /** Poll until the daemon's HTTP port accepts connections or the deadline is reached. */
106
+ export declare function waitForDaemon(port: number): Promise<void>;
107
+ export declare function buildSessionUrl(rawData: string, port: number): string;
108
+ /**
109
+ * Bridge stdio ↔ SSE: connects to the running daemon's MCP endpoint and forwards
110
+ * Claude Code's stdin/stdout JSON-RPC through it. Never resolves — runs until stdin closes.
111
+ *
112
+ * A dropped SSE stream used to exit the process, which is what made the agent's `reticle_*` tools
113
+ * vanish mid-session with no message and no way for the agent to get them back — only a human running
114
+ * `/mcp` could. The daemon demonstrably stays up across these drops, so the stream ending is a
115
+ * transport event, not a shutdown: reconnect to it and replay the handshake instead of dying.
116
+ */
117
+ export declare function startMcpProxy(port: number,
118
+ /**
119
+ * Bring a daemon back before reconnecting. Without it the proxy retried a DEAD port until the
120
+ * budget ran out and then killed itself, taking the agent's whole Reticle surface with it — the
121
+ * failure mode for a daemon that crashed, was stopped, or shut itself down as idle.
122
+ */
123
+ ensureDaemon?: () => Promise<void>): Promise<never>;
124
+ export {};