@reticlehq/server 2.4.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 (416) 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} +63 -13
  8. package/dist/{bridge.test-harness.d.ts → bridge/bridge.test-harness.d.ts} +1 -11
  9. package/dist/{bridge.test-harness.js → bridge/bridge.test-harness.js} +9 -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-parse.d.ts → cli/cli-parse.d.ts} +2 -11
  25. package/dist/{cli-parse.js → cli/cli-parse.js} +113 -60
  26. package/dist/{cli-port.d.ts → cli/cli-port.d.ts} +12 -0
  27. package/dist/{cli-port.js → cli/cli-port.js} +9 -9
  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 +174 -92
  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.js +24 -9
  88. package/dist/flows/empty-flow.d.ts +6 -0
  89. package/dist/flows/empty-flow.js +24 -0
  90. package/dist/flows/flake-store.d.ts +0 -1
  91. package/dist/flows/flake-store.js +1 -1
  92. package/dist/flows/flake.d.ts +2 -1
  93. package/dist/flows/flake.js +2 -2
  94. package/dist/flows/flow-classify.js +12 -0
  95. package/dist/flows/flow-replay-run.js +4 -4
  96. package/dist/flows/flow-replay.d.ts +5 -7
  97. package/dist/flows/flow-replay.js +114 -47
  98. package/dist/flows/flow-report.js +1 -1
  99. package/dist/flows/flow-scope.d.ts +1 -6
  100. package/dist/flows/flow-step-runners.d.ts +26 -6
  101. package/dist/flows/flow-step-runners.js +157 -6
  102. package/dist/flows/flow-success.js +20 -15
  103. package/dist/flows/flow-tools.js +53 -7
  104. package/dist/flows/flows.js +15 -11
  105. package/dist/flows/gate.d.ts +4 -3
  106. package/dist/flows/gate.js +1 -1
  107. package/dist/flows/heal-run.d.ts +0 -8
  108. package/dist/flows/heal-run.js +5 -5
  109. package/dist/flows/heal.js +3 -3
  110. package/dist/flows/predicate-to-expect.d.ts +38 -0
  111. package/dist/flows/predicate-to-expect.js +95 -0
  112. package/dist/flows/replay.d.ts +16 -1
  113. package/dist/flows/replay.js +58 -22
  114. package/dist/flows/role-anchor-nearest.d.ts +6 -0
  115. package/dist/flows/role-anchor-nearest.js +45 -0
  116. package/dist/flows/server-verify.d.ts +1 -1
  117. package/dist/flows/server-verify.js +5 -5
  118. package/dist/flows/verify-change-tools.js +32 -10
  119. package/dist/flows/verify-change-verdict.d.ts +15 -0
  120. package/dist/flows/verify-change-verdict.js +25 -0
  121. package/dist/flows/watch-batcher.d.ts +3 -2
  122. package/dist/honesty/already-true.d.ts +2 -0
  123. package/dist/honesty/already-true.js +31 -0
  124. package/dist/honesty/blind-spots.d.ts +16 -3
  125. package/dist/honesty/blind-spots.js +24 -12
  126. package/dist/honesty/honesty.d.ts +3 -2
  127. package/dist/honesty/honesty.js +4 -4
  128. package/dist/honesty/uncaptured-bodies.js +1 -1
  129. package/dist/honesty/unread-outcome.js +2 -2
  130. package/dist/honesty/verified.d.ts +22 -3
  131. package/dist/honesty/verified.js +48 -8
  132. package/dist/http-server.js +14 -7
  133. package/dist/hunt/hunt-report.d.ts +2 -1
  134. package/dist/hunt/hunt-report.js +2 -2
  135. package/dist/index.d.ts +8 -6
  136. package/dist/index.js +32 -25
  137. package/dist/init/agent-rules.d.ts +2 -1
  138. package/dist/init/agent-rules.js +45 -7
  139. package/dist/init/app-choice.d.ts +20 -0
  140. package/dist/init/app-choice.js +25 -0
  141. package/dist/init/astro-host.d.ts +21 -0
  142. package/dist/init/astro-host.js +27 -0
  143. package/dist/init/astro-patch.d.ts +16 -0
  144. package/dist/init/astro-patch.js +240 -0
  145. package/dist/init/capabilities.js +4 -1
  146. package/dist/init/cra.d.ts +37 -0
  147. package/dist/init/cra.js +90 -0
  148. package/dist/init/cursor.js +39 -4
  149. package/dist/init/desktop-doctor.d.ts +3 -2
  150. package/dist/init/desktop-doctor.js +4 -4
  151. package/dist/init/detect.d.ts +3 -2
  152. package/dist/init/detect.js +16 -5
  153. package/dist/init/mcp-registered.d.ts +12 -0
  154. package/dist/init/mcp-registered.js +14 -0
  155. package/dist/init/mcp.d.ts +27 -2
  156. package/dist/init/mcp.js +40 -4
  157. package/dist/init/next-patch.d.ts +2 -4
  158. package/dist/init/next-patch.js +109 -19
  159. package/dist/init/node-io.js +23 -6
  160. package/dist/init/plan-framework.d.ts +16 -1
  161. package/dist/init/plan-framework.js +132 -8
  162. package/dist/init/plan.d.ts +73 -8
  163. package/dist/init/plan.js +133 -34
  164. package/dist/init/project-id.d.ts +5 -9
  165. package/dist/init/project-id.js +10 -22
  166. package/dist/init/run.d.ts +5 -0
  167. package/dist/init/run.js +210 -36
  168. package/dist/init/slash-command.d.ts +9 -0
  169. package/dist/init/slash-command.js +10 -1
  170. package/dist/init/snippets.d.ts +7 -10
  171. package/dist/init/snippets.js +44 -15
  172. package/dist/init/vite-config.js +1 -1
  173. package/dist/init/workspace-apps.d.ts +23 -0
  174. package/dist/init/workspace-apps.js +68 -0
  175. package/dist/input/driven-redaction.js +1 -1
  176. package/dist/input/network-detail.js +8 -8
  177. package/dist/input/network-mock-tools.js +2 -2
  178. package/dist/input/network-mock.js +4 -4
  179. package/dist/input/real-input.js +8 -3
  180. package/dist/input/scroll-find.js +2 -2
  181. package/dist/input/scroll-tools.d.ts +0 -5
  182. package/dist/input/scroll-tools.js +11 -4
  183. package/dist/input/viewport-tools.js +2 -2
  184. package/dist/journal/ambient-store.d.ts +0 -2
  185. package/dist/journal/ambient-store.js +1 -1
  186. package/dist/journal/ambient.js +1 -1
  187. package/dist/journal/attach-journal.d.ts +2 -1
  188. package/dist/journal/deviation-report.js +6 -6
  189. package/dist/journal/deviation-service.js +1 -1
  190. package/dist/journal/envelope-store.d.ts +0 -2
  191. package/dist/journal/envelope-store.js +1 -1
  192. package/dist/journal/envelope.d.ts +2 -3
  193. package/dist/journal/envelope.js +3 -3
  194. package/dist/journal/journal-query.js +1 -1
  195. package/dist/journal/journal-recorder.d.ts +2 -1
  196. package/dist/journal/journal-recorder.js +2 -2
  197. package/dist/journal/rollups.js +9 -9
  198. package/dist/journal/session-end.d.ts +2 -1
  199. package/dist/journal/session-journal.js +4 -4
  200. package/dist/license/license.d.ts +0 -14
  201. package/dist/license/license.js +8 -8
  202. package/dist/log.d.ts +10 -0
  203. package/dist/log.js +11 -1
  204. package/dist/mcp/mcp-is-error.d.ts +13 -0
  205. package/dist/mcp/mcp-is-error.js +18 -0
  206. package/dist/mcp/mcp-outage.d.ts +31 -0
  207. package/dist/mcp/mcp-outage.js +48 -0
  208. package/dist/mcp/mcp-proxy.d.ts +124 -0
  209. package/dist/mcp/mcp-proxy.js +697 -0
  210. package/dist/{mcp.d.ts → mcp/mcp.d.ts} +13 -10
  211. package/dist/{mcp.js → mcp/mcp.js} +110 -35
  212. package/dist/mcp/proxy-handshake.d.ts +3 -0
  213. package/dist/mcp/proxy-handshake.js +54 -0
  214. package/dist/mcp/proxy-lifecycle.d.ts +64 -0
  215. package/dist/mcp/proxy-lifecycle.js +70 -0
  216. package/dist/mcp/tool-catalog-cache.d.ts +29 -0
  217. package/dist/mcp/tool-catalog-cache.js +55 -0
  218. package/dist/oracles/propose-consequences.d.ts +2 -1
  219. package/dist/oracles/propose-consequences.js +16 -11
  220. package/dist/oracles/self-instrument.d.ts +2 -1
  221. package/dist/oracles/self-instrument.js +1 -1
  222. package/dist/phenomena/phenomena.js +3 -3
  223. package/dist/platform.d.ts +16 -0
  224. package/dist/platform.js +16 -0
  225. package/dist/pool/playwright-launcher.d.ts +15 -2
  226. package/dist/pool/playwright-launcher.js +21 -2
  227. package/dist/project/fs-port.js +1 -1
  228. package/dist/project/project-tools.js +2 -2
  229. package/dist/runs/build-verification-run.js +1 -1
  230. package/dist/runs/repair-prompt.d.ts +0 -6
  231. package/dist/runs/repair-prompt.js +3 -3
  232. package/dist/runs/risk-classify.js +1 -1
  233. package/dist/runs/run-diff.d.ts +0 -2
  234. package/dist/runs/run-diff.js +3 -3
  235. package/dist/runs/run-tools.js +2 -2
  236. package/dist/runs/verification-sync.js +2 -2
  237. package/dist/runs/verify-http.js +1 -1
  238. package/dist/runs/verify-server.js +1 -1
  239. package/dist/session/command-timeout.d.ts +11 -3
  240. package/dist/session/command-timeout.js +2 -2
  241. package/dist/session/control-envelope.d.ts +6 -0
  242. package/dist/session/control-envelope.js +7 -1
  243. package/dist/session/dev-server-probe.d.ts +13 -0
  244. package/dist/session/dev-server-probe.js +52 -0
  245. package/dist/session/last-act.d.ts +17 -3
  246. package/dist/session/last-act.js +16 -4
  247. package/dist/session/live-control-tools.js +7 -2
  248. package/dist/session/live-control.js +1 -1
  249. package/dist/session/looks-like-dev-server.d.ts +14 -0
  250. package/dist/session/looks-like-dev-server.js +25 -0
  251. package/dist/session/no-session-diagnosis.d.ts +38 -0
  252. package/dist/session/no-session-diagnosis.js +70 -0
  253. package/dist/session/no-session-watch.d.ts +19 -0
  254. package/dist/session/no-session-watch.js +61 -0
  255. package/dist/session/observed-state.d.ts +4 -0
  256. package/dist/session/observed-state.js +19 -1
  257. package/dist/session/output-budget.js +1 -1
  258. package/dist/session/session-health.d.ts +8 -1
  259. package/dist/session/session-health.js +8 -7
  260. package/dist/session/session-info.d.ts +26 -7
  261. package/dist/session/session-info.js +42 -1
  262. package/dist/session/session-lease.d.ts +0 -11
  263. package/dist/session/session-lease.js +1 -1
  264. package/dist/session/session-manager.d.ts +3 -0
  265. package/dist/session/session-manager.js +52 -9
  266. package/dist/session/session-readiness.d.ts +1 -1
  267. package/dist/session/session-readiness.js +6 -1
  268. package/dist/session/session-reaper.js +1 -1
  269. package/dist/session/session-reconnect.d.ts +32 -0
  270. package/dist/session/session-reconnect.js +42 -0
  271. package/dist/session/session.d.ts +14 -2
  272. package/dist/session/session.js +69 -26
  273. package/dist/session/state-select.d.ts +1 -1
  274. package/dist/session/state-select.js +1 -1
  275. package/dist/status-payload.d.ts +19 -0
  276. package/dist/status-payload.js +11 -0
  277. package/dist/telemetry/argument-shape.js +10 -1
  278. package/dist/telemetry/browser-mode.d.ts +27 -0
  279. package/dist/telemetry/browser-mode.js +33 -0
  280. package/dist/telemetry/bug-found.d.ts +17 -21
  281. package/dist/telemetry/bug-found.js +120 -8
  282. package/dist/telemetry/cli-telemetry.d.ts +2 -12
  283. package/dist/telemetry/cli-telemetry.js +27 -4
  284. package/dist/telemetry/daemon-telemetry.d.ts +19 -0
  285. package/dist/telemetry/daemon-telemetry.js +12 -2
  286. package/dist/telemetry/dev-repo.js +4 -4
  287. package/dist/telemetry/error-fingerprint.js +21 -2
  288. package/dist/telemetry/feedback-cli.d.ts +1 -1
  289. package/dist/telemetry/feedback-cli.js +4 -4
  290. package/dist/telemetry/feedback-context.d.ts +22 -0
  291. package/dist/telemetry/feedback-context.js +41 -1
  292. package/dist/telemetry/feedback-delivery.d.ts +20 -0
  293. package/dist/telemetry/feedback-delivery.js +30 -0
  294. package/dist/telemetry/feedback-outbox.d.ts +22 -0
  295. package/dist/telemetry/feedback-outbox.js +87 -0
  296. package/dist/telemetry/feedback.d.ts +22 -1
  297. package/dist/telemetry/feedback.js +67 -8
  298. package/dist/telemetry/git-facts.js +1 -1
  299. package/dist/telemetry/session-metrics.d.ts +2 -0
  300. package/dist/telemetry/session-metrics.js +68 -6
  301. package/dist/telemetry/telemetry.d.ts +27 -2
  302. package/dist/telemetry/telemetry.js +119 -29
  303. package/dist/telemetry/verification-of.d.ts +22 -0
  304. package/dist/telemetry/verification-of.js +84 -0
  305. package/dist/tools/act-capsule.js +2 -2
  306. package/dist/tools/act-danger.d.ts +12 -0
  307. package/dist/tools/act-danger.js +20 -3
  308. package/dist/tools/act-helpers.js +4 -4
  309. package/dist/tools/act-tools.d.ts +0 -8
  310. package/dist/tools/act-tools.js +84 -115
  311. package/dist/tools/act-view.js +7 -7
  312. package/dist/tools/alias-args.d.ts +17 -0
  313. package/dist/tools/alias-args.js +25 -0
  314. package/dist/tools/assert-grade.js +9 -9
  315. package/dist/tools/assert-verdict.d.ts +3 -1
  316. package/dist/tools/assert-verdict.js +8 -5
  317. package/dist/tools/browser-tools.js +30 -11
  318. package/dist/tools/contract-tools.js +1 -1
  319. package/dist/tools/coverage-identity.d.ts +34 -0
  320. package/dist/tools/coverage-identity.js +46 -0
  321. package/dist/tools/coverage-tools.js +10 -14
  322. package/dist/tools/dynamic-tools.d.ts +2 -1
  323. package/dist/tools/dynamic-tools.js +90 -18
  324. package/dist/tools/error-recovery.d.ts +20 -2
  325. package/dist/tools/error-recovery.js +179 -4
  326. package/dist/tools/feedback-tools.d.ts +12 -1
  327. package/dist/tools/feedback-tools.js +28 -5
  328. package/dist/tools/invoke-tool.d.ts +0 -6
  329. package/dist/tools/invoke-tool.js +57 -32
  330. package/dist/tools/lease-hint.d.ts +17 -0
  331. package/dist/tools/lease-hint.js +24 -0
  332. package/dist/tools/lease-tools.js +6 -5
  333. package/dist/tools/merge-tools.d.ts +10 -1
  334. package/dist/tools/merge-tools.js +9 -3
  335. package/dist/tools/merged-name-redirect.d.ts +13 -0
  336. package/dist/tools/merged-name-redirect.js +55 -0
  337. package/dist/tools/navigate-result.d.ts +17 -0
  338. package/dist/tools/navigate-result.js +31 -0
  339. package/dist/tools/observe-tools.js +54 -20
  340. package/dist/tools/observed-nothing.d.ts +25 -0
  341. package/dist/tools/observed-nothing.js +33 -0
  342. package/dist/tools/query-paginate.js +2 -2
  343. package/dist/tools/query-shape.d.ts +18 -0
  344. package/dist/tools/query-shape.js +39 -0
  345. package/dist/tools/read-tools.js +81 -20
  346. package/dist/tools/real-input-attempt.d.ts +28 -0
  347. package/dist/tools/real-input-attempt.js +88 -0
  348. package/dist/tools/reconcile-tools.js +7 -7
  349. package/dist/tools/reload-result.d.ts +14 -0
  350. package/dist/tools/reload-result.js +29 -0
  351. package/dist/tools/snapshot-delta.d.ts +4 -5
  352. package/dist/tools/snapshot-delta.js +0 -0
  353. package/dist/tools/tool-kit.d.ts +8 -0
  354. package/dist/tools/tool-surface.d.ts +83 -0
  355. package/dist/tools/tool-surface.js +204 -0
  356. package/dist/tools/tools-helpers.js +6 -6
  357. package/dist/tools/tools.d.ts +15 -0
  358. package/dist/tools/tools.js +53 -17
  359. package/dist/tools/unadvertised-help.d.ts +5 -0
  360. package/dist/tools/unadvertised-help.js +39 -0
  361. package/dist/trace.d.ts +69 -0
  362. package/dist/trace.js +150 -0
  363. package/dist/update/nudge-credit.d.ts +4 -0
  364. package/dist/update/nudge-credit.js +53 -0
  365. package/dist/update/sdk-sync.d.ts +21 -0
  366. package/dist/update/sdk-sync.js +42 -0
  367. package/dist/update/update-checker.js +3 -3
  368. package/dist/update/update-nudge.d.ts +63 -6
  369. package/dist/update/update-nudge.js +128 -15
  370. package/dist/update/updater.d.ts +1 -9
  371. package/dist/update/updater.js +13 -8
  372. package/dist/version/peer-announce.d.ts +4 -0
  373. package/dist/version/peer-announce.js +30 -0
  374. package/dist/{server-version.js → version/server-version.js} +5 -1
  375. package/dist/version/version-nudge.d.ts +28 -0
  376. package/dist/version/version-nudge.js +40 -0
  377. package/dist/version/version-skew.d.ts +66 -0
  378. package/dist/version/version-skew.js +71 -0
  379. package/dist/visual/visual-diff.js +2 -2
  380. package/dist/visual/visual-tools.js +4 -4
  381. package/docs/agent-cheatsheet.md +85 -0
  382. package/docs/architecture.md +113 -0
  383. package/docs/benchmarks.md +255 -0
  384. package/docs/debugging.md +102 -0
  385. package/docs/deploy-checks.md +69 -0
  386. package/docs/desktop-apps.md +256 -0
  387. package/docs/enterprise.md +62 -0
  388. package/docs/fixtures.md +28 -0
  389. package/docs/flows.md +166 -0
  390. package/docs/getting-started.md +469 -0
  391. package/docs/human-control.md +63 -0
  392. package/docs/integration-patterns.md +171 -0
  393. package/docs/local-registry.md +126 -0
  394. package/docs/mint.json +61 -0
  395. package/docs/multi-agent-testing.md +55 -0
  396. package/docs/platform-integration.md +122 -0
  397. package/docs/telemetry-contract.md +214 -0
  398. package/docs/telemetry.md +184 -0
  399. package/docs/testing.md +82 -0
  400. package/docs/token-efficiency.md +80 -0
  401. package/docs/usage.md +1046 -0
  402. package/package.json +8 -5
  403. package/dist/cli-launch.js +0 -112
  404. package/dist/daemon-resilience.d.ts +0 -22
  405. package/dist/daemon-resilience.js +0 -85
  406. package/dist/mcp-proxy.d.ts +0 -67
  407. package/dist/mcp-proxy.js +0 -337
  408. package/dist/tools/profiles.d.ts +0 -37
  409. package/dist/tools/profiles.js +0 -139
  410. /package/dist/{pairing-token.d.ts → bridge/pairing-token.d.ts} +0 -0
  411. /package/dist/{token-auth.d.ts → bridge/token-auth.d.ts} +0 -0
  412. /package/dist/{token-auth.js → bridge/token-auth.js} +0 -0
  413. /package/dist/{cli-doctor.d.ts → cli/cli-doctor.d.ts} +0 -0
  414. /package/dist/{cli-verify.d.ts → cli/cli-verify.d.ts} +0 -0
  415. /package/dist/{cloud-cli.d.ts → cli/cloud-cli.d.ts} +0 -0
  416. /package/dist/{server-version.d.ts → version/server-version.d.ts} +0 -0
@@ -31,7 +31,7 @@ import { ContradictionKind, EventType } from '@reticlehq/core';
31
31
  /** Bodies larger than this are skipped — a diff over a huge payload is neither cheap nor legible. */
32
32
  const MAX_ECHO_KEYS = 200;
33
33
  function isRecord(value) {
34
- return typeof value === 'object' && value !== null && !Array.isArray(value);
34
+ return 'object' === typeof value && value !== null && !Array.isArray(value);
35
35
  }
36
36
  /**
37
37
  * Any JSON value, not just an object. An HTTP write sends an object; an IPC call sends its ARGUMENT
@@ -39,7 +39,7 @@ function isRecord(value) {
39
39
  * silently excluded every desktop write from this check — the exact platform the finding came from.
40
40
  */
41
41
  function parse(raw) {
42
- if (typeof raw !== 'string' || raw.length === 0)
42
+ if (typeof raw !== 'string' || 0 === raw.length)
43
43
  return undefined;
44
44
  try {
45
45
  return JSON.parse(raw);
@@ -50,11 +50,11 @@ function parse(raw) {
50
50
  }
51
51
  /** Comparable form of a scalar. Non-scalars return undefined and are never compared. */
52
52
  function normalize(value) {
53
- if (typeof value === 'string')
53
+ if ('string' === typeof value)
54
54
  return value.trim().toLowerCase();
55
- if (typeof value === 'number')
55
+ if ('number' === typeof value)
56
56
  return Number.isFinite(value) ? String(value) : undefined;
57
- if (typeof value === 'boolean')
57
+ if ('boolean' === typeof value)
58
58
  return String(value);
59
59
  return undefined;
60
60
  }
@@ -98,7 +98,7 @@ export function findEchoMismatches(events) {
98
98
  // IPC reports `ok` rather than a status; HTTP reports a status. Either must say success — a write
99
99
  // that already failed is a different (and louder) finding than one that half-applied.
100
100
  const status = event.data['status'];
101
- const httpOk = typeof status === 'number' && status >= OK_MIN && status < OK_MAX;
101
+ const httpOk = 'number' === typeof status && status >= OK_MIN && status < OK_MAX;
102
102
  if (!httpOk && event.data['ok'] !== true)
103
103
  continue;
104
104
  const request = parse(event.data['requestBody']);
@@ -117,16 +117,16 @@ export function findEchoMismatches(events) {
117
117
  const values = echoed.get(key);
118
118
  // Not echoed at all = no evidence either way. Only a key the server chose to report back can
119
119
  // contradict the request, and silence is not a contradiction.
120
- if (values === undefined || values.size === 0)
120
+ if (values === undefined || 0 === values.size)
121
121
  continue;
122
122
  const [want] = [...wanted];
123
123
  if (want !== undefined && !values.has(want))
124
124
  dropped.push(`${key}: asked ${want}, got ${[...values].join('/')}`);
125
125
  }
126
- if (dropped.length === 0)
126
+ if (0 === dropped.length)
127
127
  continue;
128
- const url = typeof event.data['url'] === 'string' ? event.data['url'] : '';
129
- const method = typeof event.data['method'] === 'string' ? event.data['method'] : '';
128
+ const url = 'string' === typeof event.data['url'] ? event.data['url'] : '';
129
+ const method = 'string' === typeof event.data['method'] ? event.data['method'] : '';
130
130
  found.push({
131
131
  kind: ContradictionKind.WRITE_FIELD_IGNORED,
132
132
  claim: 'the write returned success and the page treated it as saved',
@@ -98,7 +98,7 @@ export function projectNetCall(e) {
98
98
  method: asString(e.data['method']) ?? '',
99
99
  url: asString(e.data['url']) ?? '',
100
100
  };
101
- if (typeof status === 'number' || typeof status === 'string')
101
+ if ('number' === typeof status || 'string' === typeof status)
102
102
  view.status = status;
103
103
  if (statusText !== undefined)
104
104
  view.statusText = statusText;
@@ -110,15 +110,15 @@ export function projectNetCall(e) {
110
110
  view.requestBody = requestBody;
111
111
  if (responseBody !== undefined)
112
112
  view.responseBody = responseBody;
113
- if (e.data['requestBodyTruncated'] === true || e.data['responseBodyTruncated'] === true) {
113
+ if (true === e.data['requestBodyTruncated'] || true === e.data['responseBodyTruncated']) {
114
114
  view.bodyTruncated = true;
115
115
  }
116
116
  if (ms !== undefined)
117
117
  view.ms = ms;
118
- if (e.data['oneWay'] === true)
118
+ if (true === e.data['oneWay'])
119
119
  view.oneWay = true;
120
120
  const headers = e.data['headers'];
121
- if (headers !== null && typeof headers === 'object') {
121
+ if (headers !== null && 'object' === typeof headers) {
122
122
  view.headers = headers;
123
123
  }
124
124
  return view;
@@ -146,7 +146,7 @@ export function projectConsoleLog(e) {
146
146
  const source = asString(e.data['source']);
147
147
  const line = e.data['line'];
148
148
  if (source !== undefined && source.length > 0) {
149
- view.source = typeof line === 'number' ? `${source}:${String(line)}` : source;
149
+ view.source = 'number' === typeof line ? `${source}:${String(line)}` : source;
150
150
  }
151
151
  return view;
152
152
  }
@@ -165,7 +165,7 @@ export function matchConsole(e, level) {
165
165
  return false;
166
166
  if (level === undefined)
167
167
  return true;
168
- return (e.type === `console.${level}` || (level === 'error' && e.type === EventType.ERROR_UNCAUGHT));
168
+ return (e.type === `console.${level}` || ('error' === level && e.type === EventType.ERROR_UNCAUGHT));
169
169
  }
170
170
  /** How many present calls/levels a zero-match hint samples before truncating. */
171
171
  const HINT_SAMPLE_MAX = 5;
@@ -15,7 +15,7 @@
15
15
  * before the cut and reports how many it had to drop, so a partial answer is delivered AS partial
16
16
  * rather than as a clean one.
17
17
  */
18
- export interface Salvaged {
18
+ interface Salvaged {
19
19
  /** Parsed values — one whole body, or the records recovered from a truncated one. */
20
20
  values: unknown[];
21
21
  /** True when the payload was incomplete and only part of it could be read. */
@@ -30,3 +30,4 @@ export interface Salvaged {
30
30
  * costs nothing, because each record still carries its own id and its own fields.
31
31
  */
32
32
  export declare function salvageJson(raw: string): Salvaged;
33
+ export {};
@@ -38,22 +38,22 @@ function completeObjects(text) {
38
38
  if (inString) {
39
39
  if (escaped)
40
40
  escaped = false;
41
- else if (ch === '\\')
41
+ else if ('\\' === ch)
42
42
  escaped = true;
43
- else if (ch === '"')
43
+ else if ('"' === ch)
44
44
  inString = false;
45
45
  continue;
46
46
  }
47
- if (ch === '"') {
47
+ if ('"' === ch) {
48
48
  inString = true;
49
49
  continue;
50
50
  }
51
- if (ch === '{') {
51
+ if ('{' === ch) {
52
52
  starts.push(i);
53
53
  depth += 1;
54
54
  continue;
55
55
  }
56
- if (ch === '}') {
56
+ if ('}' === ch) {
57
57
  depth -= 1;
58
58
  // A negative depth means the cut removed an opening brace; nothing further is trustworthy.
59
59
  if (depth < 0)
@@ -63,7 +63,7 @@ function completeObjects(text) {
63
63
  found.push({ depth: depth + 1, text: text.slice(start, i + 1) });
64
64
  }
65
65
  }
66
- if (found.length === 0)
66
+ if (0 === found.length)
67
67
  return [];
68
68
  const shallowest = Math.min(...found.map((f) => f.depth));
69
69
  return found.filter((f) => f.depth === shallowest).map((f) => f.text);
@@ -0,0 +1,12 @@
1
+ /**
2
+ * What DID happen, when the thing you asserted did not.
3
+ *
4
+ * "signal 'x' never fired" and "no matching network call" are true and useless: a typo'd name and a
5
+ * genuinely broken app produce the same sentence, and the agent cannot tell them apart without a
6
+ * round trip it does not know to make. `{ kind:'state' }` already answers a bad path by naming the
7
+ * stores that exist; this gives `signal` and `net` the same courtesy.
8
+ *
9
+ * It also distinguishes the two failures that matter: NOTHING happened in the window (the action did
10
+ * not do what you thought) versus things happened but not that one (you named it wrong).
11
+ */
12
+ export declare function describeObserved(noun: string, seen: readonly string[]): string;
@@ -0,0 +1,21 @@
1
+ /**
2
+ * What DID happen, when the thing you asserted did not.
3
+ *
4
+ * "signal 'x' never fired" and "no matching network call" are true and useless: a typo'd name and a
5
+ * genuinely broken app produce the same sentence, and the agent cannot tell them apart without a
6
+ * round trip it does not know to make. `{ kind:'state' }` already answers a bad path by naming the
7
+ * stores that exist; this gives `signal` and `net` the same courtesy.
8
+ *
9
+ * It also distinguishes the two failures that matter: NOTHING happened in the window (the action did
10
+ * not do what you thought) versus things happened but not that one (you named it wrong).
11
+ */
12
+ /** Enough to recognise the one you meant; not so many that a chatty window floods the message. */
13
+ const MAX_LISTED = 8;
14
+ export function describeObserved(noun, seen) {
15
+ const unique = [...new Set(seen.filter((s) => s.length > 0))];
16
+ if (0 === unique.length)
17
+ return `no ${noun} at all in this window`;
18
+ const shown = unique.slice(0, MAX_LISTED);
19
+ const rest = unique.length - shown.length;
20
+ return `${noun} seen in this window: ${shown.join(', ')}${rest > 0 ? `, and ${String(rest)} more` : ''}`;
21
+ }
@@ -1,17 +1,17 @@
1
- import { ElementState, type ElementQuery, type ReticleEvent } from '@reticlehq/core';
1
+ import { ElementState, PredicateKind, type ElementQuery, type ReticleEvent } from '@reticlehq/core';
2
2
  import { z } from 'zod';
3
3
  export type Predicate = {
4
- kind: 'element';
4
+ kind: typeof PredicateKind.ELEMENT;
5
5
  query: ElementQuery;
6
6
  state?: ElementState;
7
7
  absent?: boolean;
8
8
  } | {
9
- kind: 'text';
9
+ kind: typeof PredicateKind.TEXT;
10
10
  contains: string;
11
11
  visible?: boolean;
12
12
  absent?: boolean;
13
13
  } | {
14
- kind: 'net';
14
+ kind: typeof PredicateKind.NET;
15
15
  method?: string;
16
16
  urlContains?: string;
17
17
  status?: number;
@@ -20,44 +20,67 @@ export type Predicate = {
20
20
  since?: number;
21
21
  count?: number;
22
22
  } | {
23
- kind: 'route';
23
+ kind: typeof PredicateKind.ROUTE;
24
24
  pathname?: string;
25
25
  contains?: string;
26
+ since?: number;
26
27
  } | {
27
- kind: 'console';
28
+ kind: typeof PredicateKind.CONSOLE;
28
29
  level?: string;
29
30
  absent?: boolean;
30
31
  since?: number;
31
32
  } | {
32
- kind: 'animation';
33
+ kind: typeof PredicateKind.ANIMATION;
33
34
  name?: string;
34
35
  target?: string;
35
36
  completed?: boolean;
37
+ since?: number;
36
38
  } | {
37
- kind: 'signal';
39
+ kind: typeof PredicateKind.SIGNAL;
38
40
  name?: string;
39
41
  dataMatches?: Record<string, unknown>;
42
+ since?: number;
40
43
  } | {
41
- kind: 'state';
44
+ kind: typeof PredicateKind.STATE;
42
45
  store?: string;
43
46
  path: string;
44
47
  equals?: unknown;
45
48
  } | {
46
- kind: 'settled';
49
+ kind: typeof PredicateKind.SETTLED;
47
50
  quietMs?: number;
48
51
  } | {
49
- kind: 'allOf';
52
+ kind: typeof PredicateKind.ALL_OF;
50
53
  predicates: Predicate[];
51
54
  } | {
52
- kind: 'anyOf';
55
+ kind: typeof PredicateKind.ANY_OF;
53
56
  predicates: Predicate[];
54
57
  } | {
55
- kind: 'not';
58
+ kind: typeof PredicateKind.NOT;
56
59
  predicate: Predicate;
57
60
  };
61
+ /**
62
+ * Strict on every branch. A key that is nobody's spelling is now a schema error naming it, instead of
63
+ * a stripped field and a green — see predicate-strict.test.ts for the MCP session that found this.
64
+ */
58
65
  export declare const PredicateSchema: z.ZodType<Predicate>;
59
66
  export interface EvalResult {
60
67
  pass: boolean;
68
+ /**
69
+ * For a TIME-based failure: how long until this predicate could first become true, if nothing else
70
+ * changes. Purely a scheduling hint for `waitForPredicate` — it replaces a blind poll tick with one
71
+ * timed to the moment that matters, and never decides anything. Absent when the wait is on an
72
+ * external event (a request in flight settles when the server answers, not on a clock).
73
+ */
74
+ retryAfterMs?: number;
75
+ /**
76
+ * Set when the assertion could not be EVALUATED — the call was under-specified or there was
77
+ * nothing instrumented to read — rather than evaluated and found false. Carries the sentence that
78
+ * names what is missing.
79
+ *
80
+ * `pass` stays false because nothing was proven, but a false that nobody could have made true is
81
+ * not a defect in the user's app, and reporting it as one puts agent mistakes into the bug count.
82
+ */
83
+ inconclusive?: string;
61
84
  evidence?: unknown;
62
85
  failureReason?: string;
63
86
  /**
@@ -82,19 +105,19 @@ export interface EvalResult {
82
105
  */
83
106
  export declare function matchValue(got: unknown, want: unknown): boolean;
84
107
  export declare function evalNet(events: ReticleEvent[], p: Extract<Predicate, {
85
- kind: 'net';
108
+ kind: typeof PredicateKind.NET;
86
109
  }>): EvalResult;
87
110
  export declare function evalRoute(events: ReticleEvent[], p: Extract<Predicate, {
88
- kind: 'route';
111
+ kind: typeof PredicateKind.ROUTE;
89
112
  }>): EvalResult;
90
113
  export declare function evalConsole(events: ReticleEvent[], p: Extract<Predicate, {
91
- kind: 'console';
114
+ kind: typeof PredicateKind.CONSOLE;
92
115
  }>): EvalResult;
93
116
  export declare function evalAnimation(events: ReticleEvent[], p: Extract<Predicate, {
94
- kind: 'animation';
117
+ kind: typeof PredicateKind.ANIMATION;
95
118
  }>): EvalResult;
96
119
  export declare function evalSignal(events: ReticleEvent[], p: Extract<Predicate, {
97
- kind: 'signal';
120
+ kind: typeof PredicateKind.SIGNAL;
98
121
  }>): EvalResult;
99
122
  /**
100
123
  * "The page has gone quiet": no network/DOM/animation activity for at least `quietMs`. Needs the
@@ -102,6 +125,6 @@ export declare function evalSignal(events: ReticleEvent[], p: Extract<Predicate,
102
125
  * now, not to any buffered event — so `now` is injected (CLAUDE.md rule 7), and the wait loop's
103
126
  * poll interval is what eventually flips this to pass once activity stops.
104
127
  */
105
- export declare function evalSettled(events: ReticleEvent[], p: Extract<Predicate, {
106
- kind: 'settled';
128
+ export declare function evalSettled(allEvents: ReticleEvent[], p: Extract<Predicate, {
129
+ kind: typeof PredicateKind.SETTLED;
107
130
  }>, now: number): EvalResult;