@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
@@ -1,4 +1,4 @@
1
- import { ContradictionKind, EventType, MUTATING_METHODS } from '@reticlehq/core';
1
+ import { ContradictionKind, EventType, MUTATING_METHODS, isDevToolingUrl, } from '@reticlehq/core';
2
2
  import { findStaleResponses } from './stale-response.js';
3
3
  import { findBodyFailures } from './body-failures.js';
4
4
  import { findEchoMismatches } from './echo-mismatch.js';
@@ -14,7 +14,7 @@ function netCall(e) {
14
14
  // Neither present = no verdict was ever reported, which stays undefined all the way through.
15
15
  ok: e.data['ok'] === undefined && status === undefined
16
16
  ? undefined
17
- : e.data['ok'] === true || (e.data['ok'] === undefined && (status ?? 0) < 400),
17
+ : true === e.data['ok'] || (e.data['ok'] === undefined && (status ?? 0) < 400),
18
18
  };
19
19
  }
20
20
  /**
@@ -95,7 +95,7 @@ function failureAcknowledged(events) {
95
95
  return false;
96
96
  const path = asString(e.data['path']) ?? '';
97
97
  const value = e.data['value'];
98
- return ACKNOWLEDGED.test(path) || (typeof value === 'string' && ACKNOWLEDGED.test(value));
98
+ return ACKNOWLEDGED.test(path) || ('string' === typeof value && ACKNOWLEDGED.test(value));
99
99
  });
100
100
  }
101
101
  function describe(call) {
@@ -125,13 +125,44 @@ const MUST_DO_SOMETHING = new Set(['click', 'dblclick', 'submit']);
125
125
  */
126
126
  function didNothing(events, requests, mutatedWithin) {
127
127
  if (mutatedWithin === undefined)
128
- return events.length === 0;
128
+ return 0 === events.length;
129
129
  if (mutatedWithin > 0 || requests.length > 0)
130
130
  return false;
131
131
  return !events.some((e) => e.type === EventType.ROUTE_CHANGE || e.type === EventType.VISIBLE_SHOWN);
132
132
  }
133
- export function findContradictions(events, options = {}) {
133
+ /** Net-shaped events — the only ones that carry a URL a dev-tooling channel could occupy. */
134
+ const NET_TYPES = new Set([
135
+ EventType.NET_PENDING,
136
+ EventType.NET_REQUEST,
137
+ EventType.NET_STREAM,
138
+ ]);
139
+ /**
140
+ * Split the window into the app's traffic and the dev toolchain's own (see `DevToolingChannel`).
141
+ *
142
+ * NOTHING below may judge the toolchain. Reported from a real drive: a correct Next.js navigation
143
+ * graded `verified: "no"` because the dev overlay was resolving a source map for an unrelated React
144
+ * key warning, and that in-flight `POST /__nextjs_original-stack-frames` read as "the UI advanced
145
+ * over a request that never settled". Every app that logs one dev warning got a false negative on
146
+ * every action. The overlay's own 404s and duplicate fetches are the same story on other checks,
147
+ * which is why the split happens ONCE here rather than in the one check that reported it.
148
+ */
149
+ function splitDevTooling(events) {
150
+ const ignored = [];
151
+ const app = events.filter((e) => {
152
+ if (!NET_TYPES.has(e.type))
153
+ return true;
154
+ const url = asString(e.data['url']);
155
+ if (!isDevToolingUrl(url))
156
+ return true;
157
+ if (url !== undefined && !ignored.includes(url))
158
+ ignored.push(url);
159
+ return false;
160
+ });
161
+ return { app, ignored };
162
+ }
163
+ export function findContradictions(allEvents, options = {}) {
134
164
  const found = [];
165
+ const { app: events, ignored: ignoredDevTooling } = splitDevTooling(allEvents);
135
166
  const settled = events.filter((e) => e.type === EventType.NET_REQUEST).map(netCall);
136
167
  // ── Overlapping reads that settled out of order ─────────────────────────────────────────────
137
168
  // Independent of any action, so it runs on every window: the race is a property of the timeline.
@@ -160,7 +191,7 @@ export function findContradictions(events, options = {}) {
160
191
  },
161
192
  ];
162
193
  }
163
- const failed = settled.filter((c) => c.ok === false);
194
+ const failed = settled.filter((c) => false === c.ok);
164
195
  const advanced = uiAdvanced(events);
165
196
  const signals = events
166
197
  .filter((e) => e.type === EventType.SIGNAL)
@@ -170,7 +201,19 @@ export function findContradictions(events, options = {}) {
170
201
  // the control worked, the DESTINATION is empty — which is why every "did the click do something"
171
202
  // heuristic passes it, a route change being unambiguously something.
172
203
  const routed = events.some((e) => e.type === EventType.ROUTE_CHANGE);
173
- const rendered = events.some((e) => e.type === EventType.DOM_ADDED || e.type === EventType.DOM_REMOVED);
204
+ // `dom.text` counts as rendered, and it has to: React reconciles a destination IN PLACE far more
205
+ // often than it adds nodes. Measured on three ordinary sidebar navigations of the bench app — every
206
+ // one emitted { dom.attr:2, dom.text:2, render.commit, state.change } and ZERO dom.added/removed,
207
+ // so all three were flagged as blank destinations, `verified` came back "no" on a correct green,
208
+ // and a bug_found was emitted for a navigation that worked.
209
+ //
210
+ // Deliberately NOT `dom.attr`: the nav link marks itself active whether or not the destination
211
+ // rendered, which is the true positive this rule exists for. Deliberately NOT `render.commit`
212
+ // either: React commits a render for a component that returns null, which is one of the very bugs
213
+ // named in `detail` below.
214
+ const rendered = events.some((e) => e.type === EventType.DOM_ADDED ||
215
+ e.type === EventType.DOM_REMOVED ||
216
+ e.type === EventType.DOM_TEXT);
174
217
  const fetched = events.some((e) => e.type === EventType.NET_REQUEST || e.type === EventType.NET_PENDING);
175
218
  if (routed && !rendered && !fetched) {
176
219
  found.push({
@@ -187,7 +230,7 @@ export function findContradictions(events, options = {}) {
187
230
  // Checked BEFORE the success-claim rules, because it is the sharper reading of the same events:
188
231
  // the app did not claim success, it claimed the wrong failure. Telling someone their password is
189
232
  // wrong while the backend is down sends them to fix something they cannot fix.
190
- const serverFaults = settled.filter((c) => c.ok === false && c.status !== undefined && c.status >= SERVER_FAULT_MIN);
233
+ const serverFaults = settled.filter((c) => false === c.ok && c.status !== undefined && c.status >= SERVER_FAULT_MIN);
191
234
  const userBlame = [
192
235
  ...signals.filter((name) => BLAMES_USER.test(name)),
193
236
  ...events
@@ -228,7 +271,7 @@ export function findContradictions(events, options = {}) {
228
271
  // Writes only: a GET that changes nothing is a prefetch; a POST that changes nothing is a lost
229
272
  // write, a response parsed into the void, or a render that never happened.
230
273
  if (!advanced) {
231
- const ignoredWrites = settled.filter((c) => c.ok === true && isMutating(c));
274
+ const ignoredWrites = settled.filter((c) => true === c.ok && isMutating(c));
232
275
  if (ignoredWrites.length > 0) {
233
276
  found.push({
234
277
  kind: ContradictionKind.RESPONSE_IGNORED,
@@ -274,7 +317,14 @@ export function findContradictions(events, options = {}) {
274
317
  kind: ContradictionKind.REQUEST_NEVER_SETTLED,
275
318
  claim: 'the UI moved forward and the action reported done',
276
319
  counter: `${String(inFlight.length)} request(s) were still in flight`,
277
- detail: inFlight.map((p) => describe(p.call)).join('; '),
320
+ // The exclusion is never silent: if the toolchain's own traffic was dropped from this count,
321
+ // the finding says which URLs, so an agent reading it can see what Reticle chose to ignore.
322
+ detail: [
323
+ inFlight.map((p) => describe(p.call)).join('; '),
324
+ ...(0 === ignoredDevTooling.length
325
+ ? []
326
+ : [`ignored as dev tooling: ${ignoredDevTooling.join(', ')}`]),
327
+ ].join(' — '),
278
328
  });
279
329
  }
280
330
  }
@@ -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;