@reticlehq/server 2.2.0 → 2.3.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 (768) hide show
  1. package/README.md +1 -1
  2. package/dist/bridge-security.d.ts +0 -1
  3. package/dist/bridge-security.js +0 -1
  4. package/dist/bridge.d.ts +0 -1
  5. package/dist/bridge.js +60 -10
  6. package/dist/bridge.test-harness.d.ts +0 -1
  7. package/dist/bridge.test-harness.js +0 -1
  8. package/dist/capsule/capsule-store.d.ts +2 -3
  9. package/dist/capsule/capsule-store.js +0 -1
  10. package/dist/capsule/capsule.d.ts +0 -1
  11. package/dist/capsule/capsule.js +0 -1
  12. package/dist/capsule/causal-summary.d.ts +21 -1
  13. package/dist/capsule/causal-summary.js +20 -2
  14. package/dist/capsule/divergence.d.ts +0 -1
  15. package/dist/capsule/divergence.js +0 -1
  16. package/dist/capsule/minimize.d.ts +0 -1
  17. package/dist/capsule/minimize.js +0 -1
  18. package/dist/capsule/predicate-to-links.d.ts +0 -1
  19. package/dist/capsule/predicate-to-links.js +0 -1
  20. package/dist/cli-doctor.d.ts +6 -0
  21. package/dist/cli-doctor.js +60 -0
  22. package/dist/cli-flow-commands.d.ts +0 -1
  23. package/dist/cli-flow-commands.js +0 -1
  24. package/dist/cli-launch.d.ts +0 -1
  25. package/dist/cli-launch.js +7 -3
  26. package/dist/cli-parse.d.ts +52 -2
  27. package/dist/cli-parse.js +147 -3
  28. package/dist/cli-port.d.ts +0 -1
  29. package/dist/cli-port.js +0 -1
  30. package/dist/cli-verify.d.ts +2 -1
  31. package/dist/cli-verify.js +24 -3
  32. package/dist/cli.d.ts +2 -4
  33. package/dist/cli.js +109 -10
  34. package/dist/cloud/cloud-config.d.ts +36 -0
  35. package/dist/cloud/cloud-config.js +86 -0
  36. package/dist/cloud/cloud-sync.d.ts +96 -4
  37. package/dist/cloud/cloud-sync.js +131 -3
  38. package/dist/cloud-cli.d.ts +3 -0
  39. package/dist/cloud-cli.js +514 -0
  40. package/dist/crawl/crawl-tools.d.ts +0 -1
  41. package/dist/crawl/crawl-tools.js +1 -2
  42. package/dist/crawl/crawl.d.ts +17 -3
  43. package/dist/crawl/crawl.js +43 -4
  44. package/dist/daemon-resilience.d.ts +6 -1
  45. package/dist/daemon-resilience.js +63 -1
  46. package/dist/daemon.d.ts +23 -3
  47. package/dist/daemon.js +78 -21
  48. package/dist/domain/domain-model.d.ts +0 -1
  49. package/dist/domain/domain-model.js +1 -2
  50. package/dist/domain/domain-tools.d.ts +0 -7
  51. package/dist/domain/domain-tools.js +21 -4
  52. package/dist/domain/flow-risk.d.ts +0 -1
  53. package/dist/domain/flow-risk.js +0 -1
  54. package/dist/ee/audit-log.d.ts +0 -1
  55. package/dist/ee/audit-log.js +0 -1
  56. package/dist/events/body-failures.d.ts +4 -0
  57. package/dist/events/body-failures.js +113 -0
  58. package/dist/events/contradictions.d.ts +53 -0
  59. package/dist/events/contradictions.js +282 -0
  60. package/dist/events/echo-mismatch.d.ts +4 -0
  61. package/dist/events/echo-mismatch.js +138 -0
  62. package/dist/events/event-filters.d.ts +17 -3
  63. package/dist/events/event-filters.js +13 -3
  64. package/dist/events/json-salvage.d.ts +32 -0
  65. package/dist/events/json-salvage.js +96 -0
  66. package/dist/events/predicate-eval.d.ts +2 -1
  67. package/dist/events/predicate-eval.js +56 -9
  68. package/dist/events/predicate.d.ts +0 -1
  69. package/dist/events/predicate.js +56 -2
  70. package/dist/events/reaction.d.ts +0 -1
  71. package/dist/events/reaction.js +0 -1
  72. package/dist/events/reconcile.d.ts +39 -0
  73. package/dist/events/reconcile.js +211 -0
  74. package/dist/events/ring-buffer.d.ts +0 -1
  75. package/dist/events/ring-buffer.js +0 -1
  76. package/dist/events/stale-response.d.ts +4 -0
  77. package/dist/events/stale-response.js +139 -0
  78. package/dist/events/unit-mismatch.d.ts +16 -0
  79. package/dist/events/unit-mismatch.js +167 -0
  80. package/dist/flows/affected-tools.d.ts +18 -0
  81. package/dist/flows/affected-tools.js +52 -0
  82. package/dist/flows/affected.d.ts +0 -1
  83. package/dist/flows/affected.js +0 -1
  84. package/dist/flows/annotate-tools.d.ts +0 -1
  85. package/dist/flows/annotate-tools.js +21 -3
  86. package/dist/flows/annotate.d.ts +0 -1
  87. package/dist/flows/annotate.js +0 -1
  88. package/dist/flows/annotation-store.d.ts +0 -1
  89. package/dist/flows/annotation-store.js +0 -1
  90. package/dist/flows/assertion-integrity.d.ts +0 -1
  91. package/dist/flows/assertion-integrity.js +0 -1
  92. package/dist/flows/assertion-tiers-store.d.ts +0 -1
  93. package/dist/flows/assertion-tiers-store.js +0 -1
  94. package/dist/flows/buddy-status.d.ts +0 -1
  95. package/dist/flows/buddy-status.js +0 -1
  96. package/dist/flows/coverage.d.ts +0 -1
  97. package/dist/flows/coverage.js +0 -1
  98. package/dist/flows/decision.d.ts +0 -1
  99. package/dist/flows/decision.js +0 -1
  100. package/dist/flows/flake-store.d.ts +0 -1
  101. package/dist/flows/flake-store.js +0 -1
  102. package/dist/flows/flake.d.ts +0 -1
  103. package/dist/flows/flake.js +0 -1
  104. package/dist/flows/flow-classify.d.ts +0 -1
  105. package/dist/flows/flow-classify.js +0 -1
  106. package/dist/flows/flow-replay-run.d.ts +0 -1
  107. package/dist/flows/flow-replay-run.js +24 -8
  108. package/dist/flows/flow-replay.d.ts +20 -4
  109. package/dist/flows/flow-replay.js +9 -43
  110. package/dist/flows/flow-report.d.ts +0 -1
  111. package/dist/flows/flow-report.js +0 -1
  112. package/dist/flows/flow-scope.d.ts +0 -1
  113. package/dist/flows/flow-scope.js +0 -1
  114. package/dist/flows/flow-sources.d.ts +0 -1
  115. package/dist/flows/flow-sources.js +0 -1
  116. package/dist/flows/flow-step-runners.d.ts +23 -0
  117. package/dist/flows/flow-step-runners.js +102 -0
  118. package/dist/flows/flow-success.d.ts +0 -1
  119. package/dist/flows/flow-success.js +0 -1
  120. package/dist/flows/flow-tools.d.ts +0 -1
  121. package/dist/flows/flow-tools.js +54 -16
  122. package/dist/flows/flows.d.ts +6 -2
  123. package/dist/flows/flows.js +15 -2
  124. package/dist/flows/gate.d.ts +0 -1
  125. package/dist/flows/gate.js +0 -1
  126. package/dist/flows/git-changed.d.ts +0 -1
  127. package/dist/flows/git-changed.js +0 -1
  128. package/dist/flows/heal-run.d.ts +0 -1
  129. package/dist/flows/heal-run.js +0 -1
  130. package/dist/flows/heal.d.ts +0 -1
  131. package/dist/flows/heal.js +0 -1
  132. package/dist/flows/parallel-suite.d.ts +0 -1
  133. package/dist/flows/parallel-suite.js +0 -1
  134. package/dist/flows/recordings.d.ts +0 -1
  135. package/dist/flows/recordings.js +0 -1
  136. package/dist/flows/replay.d.ts +0 -1
  137. package/dist/flows/replay.js +71 -4
  138. package/dist/flows/server-verify.d.ts +15 -0
  139. package/dist/flows/server-verify.js +42 -0
  140. package/dist/flows/verify-change-tools.d.ts +2 -0
  141. package/dist/flows/verify-change-tools.js +187 -0
  142. package/dist/flows/watch-batcher.d.ts +0 -1
  143. package/dist/flows/watch-batcher.js +0 -1
  144. package/dist/honesty/accepted-write.d.ts +14 -0
  145. package/dist/honesty/accepted-write.js +17 -0
  146. package/dist/honesty/blind-spots.d.ts +18 -1
  147. package/dist/honesty/blind-spots.js +47 -5
  148. package/dist/honesty/honesty.d.ts +0 -1
  149. package/dist/honesty/honesty.js +0 -1
  150. package/dist/honesty/uncaptured-bodies.d.ts +19 -0
  151. package/dist/honesty/uncaptured-bodies.js +30 -0
  152. package/dist/honesty/unread-outcome.d.ts +2 -0
  153. package/dist/honesty/unread-outcome.js +50 -0
  154. package/dist/honesty/verified.d.ts +40 -0
  155. package/dist/honesty/verified.js +86 -0
  156. package/dist/http-server.d.ts +0 -1
  157. package/dist/http-server.js +5 -1
  158. package/dist/hunt/hunt-report.d.ts +50 -0
  159. package/dist/hunt/hunt-report.js +84 -0
  160. package/dist/idle-shutdown.d.ts +0 -1
  161. package/dist/idle-shutdown.js +0 -1
  162. package/dist/index.d.ts +0 -1
  163. package/dist/index.js +0 -1
  164. package/dist/init/agent-rules.d.ts +0 -1
  165. package/dist/init/agent-rules.js +4 -2
  166. package/dist/init/cursor.d.ts +0 -1
  167. package/dist/init/cursor.js +0 -1
  168. package/dist/init/desktop-doctor.d.ts +40 -0
  169. package/dist/init/desktop-doctor.js +198 -0
  170. package/dist/init/detect.d.ts +0 -1
  171. package/dist/init/detect.js +0 -1
  172. package/dist/init/mcp.d.ts +0 -1
  173. package/dist/init/mcp.js +0 -1
  174. package/dist/init/node-io.d.ts +0 -1
  175. package/dist/init/node-io.js +0 -1
  176. package/dist/init/plan.d.ts +4 -1
  177. package/dist/init/plan.js +23 -5
  178. package/dist/init/project-id.d.ts +0 -1
  179. package/dist/init/project-id.js +0 -1
  180. package/dist/init/run.d.ts +0 -1
  181. package/dist/init/run.js +31 -3
  182. package/dist/init/snippets.d.ts +5 -1
  183. package/dist/init/snippets.js +5 -1
  184. package/dist/init/vite-config.d.ts +0 -1
  185. package/dist/init/vite-config.js +0 -1
  186. package/dist/input/network-detail.d.ts +0 -1
  187. package/dist/input/network-detail.js +0 -1
  188. package/dist/input/network-mock-tools.d.ts +0 -1
  189. package/dist/input/network-mock-tools.js +3 -4
  190. package/dist/input/network-mock.d.ts +0 -1
  191. package/dist/input/network-mock.js +0 -1
  192. package/dist/input/real-input.d.ts +14 -1
  193. package/dist/input/real-input.js +45 -3
  194. package/dist/input/scroll-find.d.ts +0 -1
  195. package/dist/input/scroll-find.js +0 -1
  196. package/dist/input/scroll-tools.d.ts +0 -1
  197. package/dist/input/scroll-tools.js +0 -1
  198. package/dist/input/viewport-tools.d.ts +0 -1
  199. package/dist/input/viewport-tools.js +3 -4
  200. package/dist/journal/ambient-store.d.ts +0 -1
  201. package/dist/journal/ambient-store.js +0 -1
  202. package/dist/journal/ambient.d.ts +0 -1
  203. package/dist/journal/ambient.js +0 -1
  204. package/dist/journal/attach-journal.d.ts +0 -1
  205. package/dist/journal/attach-journal.js +0 -1
  206. package/dist/journal/deviation-report.d.ts +0 -1
  207. package/dist/journal/deviation-report.js +0 -1
  208. package/dist/journal/deviation-service.d.ts +0 -1
  209. package/dist/journal/deviation-service.js +0 -1
  210. package/dist/journal/envelope-store.d.ts +0 -1
  211. package/dist/journal/envelope-store.js +0 -1
  212. package/dist/journal/envelope.d.ts +8 -9
  213. package/dist/journal/envelope.js +0 -1
  214. package/dist/journal/journal-query.d.ts +0 -1
  215. package/dist/journal/journal-query.js +0 -1
  216. package/dist/journal/journal-recorder.d.ts +0 -1
  217. package/dist/journal/journal-recorder.js +0 -1
  218. package/dist/journal/retention.d.ts +0 -1
  219. package/dist/journal/retention.js +0 -1
  220. package/dist/journal/rollups.d.ts +0 -1
  221. package/dist/journal/rollups.js +0 -1
  222. package/dist/journal/session-end.d.ts +0 -1
  223. package/dist/journal/session-end.js +0 -1
  224. package/dist/journal/session-journal.d.ts +0 -1
  225. package/dist/journal/session-journal.js +0 -1
  226. package/dist/license/license.d.ts +0 -1
  227. package/dist/license/license.js +0 -1
  228. package/dist/log.d.ts +0 -1
  229. package/dist/log.js +0 -1
  230. package/dist/mcp-proxy.d.ts +0 -1
  231. package/dist/mcp-proxy.js +0 -1
  232. package/dist/mcp.d.ts +15 -1
  233. package/dist/mcp.js +145 -17
  234. package/dist/oracles/flow-instrument-gaps.d.ts +0 -1
  235. package/dist/oracles/flow-instrument-gaps.js +0 -1
  236. package/dist/oracles/propose-consequences.d.ts +0 -1
  237. package/dist/oracles/propose-consequences.js +0 -1
  238. package/dist/oracles/self-instrument.d.ts +0 -1
  239. package/dist/oracles/self-instrument.js +0 -1
  240. package/dist/pairing-token.d.ts +0 -1
  241. package/dist/pairing-token.js +0 -1
  242. package/dist/phenomena/phenomena.d.ts +0 -1
  243. package/dist/phenomena/phenomena.js +0 -1
  244. package/dist/pool/browser-pool.d.ts +0 -1
  245. package/dist/pool/browser-pool.js +0 -1
  246. package/dist/pool/lease-reaper.d.ts +0 -1
  247. package/dist/pool/lease-reaper.js +0 -1
  248. package/dist/pool/playwright-launcher.d.ts +2 -1
  249. package/dist/pool/playwright-launcher.js +22 -2
  250. package/dist/project/baselines.d.ts +0 -1
  251. package/dist/project/baselines.js +5 -4
  252. package/dist/project/file-lock.d.ts +2 -1
  253. package/dist/project/file-lock.js +12 -2
  254. package/dist/project/fs-port.d.ts +0 -1
  255. package/dist/project/fs-port.js +0 -1
  256. package/dist/project/project-store.d.ts +0 -1
  257. package/dist/project/project-store.js +20 -9
  258. package/dist/project/project-tools.d.ts +0 -1
  259. package/dist/project/project-tools.js +57 -9
  260. package/dist/project/reticle-dir.d.ts +0 -1
  261. package/dist/project/reticle-dir.js +0 -1
  262. package/dist/runs/build-verification-run.d.ts +0 -1
  263. package/dist/runs/build-verification-run.js +0 -1
  264. package/dist/runs/profile-redact.d.ts +0 -1
  265. package/dist/runs/profile-redact.js +0 -1
  266. package/dist/runs/render-report.d.ts +0 -1
  267. package/dist/runs/render-report.js +0 -1
  268. package/dist/runs/repair-prompt.d.ts +0 -1
  269. package/dist/runs/repair-prompt.js +0 -1
  270. package/dist/runs/replay-mapping.d.ts +0 -1
  271. package/dist/runs/replay-mapping.js +0 -1
  272. package/dist/runs/reticle-runner.d.ts +0 -1
  273. package/dist/runs/reticle-runner.js +4 -2
  274. package/dist/runs/risk-classify.d.ts +0 -1
  275. package/dist/runs/risk-classify.js +0 -1
  276. package/dist/runs/run-diff.d.ts +0 -1
  277. package/dist/runs/run-diff.js +0 -1
  278. package/dist/runs/run-store.d.ts +0 -1
  279. package/dist/runs/run-store.js +0 -1
  280. package/dist/runs/run-tools.d.ts +0 -1
  281. package/dist/runs/run-tools.js +0 -1
  282. package/dist/runs/runner-port.d.ts +0 -1
  283. package/dist/runs/runner-port.js +0 -1
  284. package/dist/runs/verification-sync.d.ts +23 -0
  285. package/dist/runs/verification-sync.js +66 -0
  286. package/dist/runs/verify-http.d.ts +0 -1
  287. package/dist/runs/verify-http.js +0 -1
  288. package/dist/runs/verify-server.d.ts +0 -1
  289. package/dist/runs/verify-server.js +0 -1
  290. package/dist/server-version.d.ts +0 -1
  291. package/dist/server-version.js +0 -1
  292. package/dist/session/command-timeout.d.ts +35 -0
  293. package/dist/session/command-timeout.js +41 -0
  294. package/dist/session/control-envelope.d.ts +2 -3
  295. package/dist/session/control-envelope.js +2 -3
  296. package/dist/session/last-act.d.ts +31 -0
  297. package/dist/session/last-act.js +24 -0
  298. package/dist/session/live-control-tools.d.ts +0 -1
  299. package/dist/session/live-control-tools.js +3 -4
  300. package/dist/session/live-control.d.ts +0 -1
  301. package/dist/session/live-control.js +0 -1
  302. package/dist/session/observed-state.d.ts +12 -2
  303. package/dist/session/observed-state.js +29 -2
  304. package/dist/session/output-budget.d.ts +0 -1
  305. package/dist/session/output-budget.js +0 -1
  306. package/dist/session/pending-commands.d.ts +12 -0
  307. package/dist/session/pending-commands.js +36 -0
  308. package/dist/session/presenter-args.d.ts +0 -1
  309. package/dist/session/presenter-args.js +0 -1
  310. package/dist/session/review-store.d.ts +0 -1
  311. package/dist/session/review-store.js +0 -1
  312. package/dist/session/session-health.d.ts +26 -2
  313. package/dist/session/session-health.js +13 -1
  314. package/dist/session/session-info.d.ts +29 -0
  315. package/dist/session/session-info.js +1 -0
  316. package/dist/session/session-lease.d.ts +25 -0
  317. package/dist/session/session-lease.js +14 -0
  318. package/dist/session/session-manager.d.ts +7 -19
  319. package/dist/session/session-manager.js +29 -2
  320. package/dist/session/session-readiness.d.ts +0 -1
  321. package/dist/session/session-readiness.js +3 -4
  322. package/dist/session/session-reaper.d.ts +0 -1
  323. package/dist/session/session-reaper.js +0 -1
  324. package/dist/session/session-recommendation.d.ts +0 -1
  325. package/dist/session/session-recommendation.js +0 -1
  326. package/dist/session/session-tools.d.ts +0 -1
  327. package/dist/session/session-tools.js +2 -3
  328. package/dist/session/session.d.ts +27 -53
  329. package/dist/session/session.js +95 -66
  330. package/dist/session/state-select.d.ts +0 -1
  331. package/dist/session/state-select.js +0 -1
  332. package/dist/telemetry/argument-shape.d.ts +41 -0
  333. package/dist/telemetry/argument-shape.js +87 -0
  334. package/dist/telemetry/bug-found.d.ts +33 -0
  335. package/dist/telemetry/bug-found.js +95 -0
  336. package/dist/telemetry/cli-telemetry.d.ts +13 -0
  337. package/dist/telemetry/cli-telemetry.js +43 -0
  338. package/dist/telemetry/connect-failure.d.ts +16 -0
  339. package/dist/telemetry/connect-failure.js +44 -0
  340. package/dist/telemetry/daemon-telemetry.d.ts +19 -0
  341. package/dist/telemetry/daemon-telemetry.js +76 -0
  342. package/dist/telemetry/dev-repo.d.ts +10 -0
  343. package/dist/telemetry/dev-repo.js +80 -0
  344. package/dist/telemetry/error-fingerprint.d.ts +24 -0
  345. package/dist/telemetry/error-fingerprint.js +88 -0
  346. package/dist/telemetry/feedback-cli.d.ts +31 -0
  347. package/dist/telemetry/feedback-cli.js +102 -0
  348. package/dist/telemetry/feedback-context.d.ts +32 -0
  349. package/dist/telemetry/feedback-context.js +143 -0
  350. package/dist/telemetry/feedback.d.ts +66 -0
  351. package/dist/telemetry/feedback.js +175 -0
  352. package/dist/telemetry/git-facts.d.ts +21 -0
  353. package/dist/telemetry/git-facts.js +109 -0
  354. package/dist/telemetry/identify.d.ts +22 -0
  355. package/dist/telemetry/identify.js +73 -0
  356. package/dist/telemetry/init-telemetry.d.ts +26 -0
  357. package/dist/telemetry/init-telemetry.js +33 -0
  358. package/dist/telemetry/machine-snapshot.d.ts +6 -0
  359. package/dist/telemetry/machine-snapshot.js +39 -0
  360. package/dist/telemetry/mcp-connection.d.ts +5 -0
  361. package/dist/telemetry/mcp-connection.js +44 -0
  362. package/dist/telemetry/project-profile.d.ts +44 -0
  363. package/dist/telemetry/project-profile.js +205 -0
  364. package/dist/telemetry/run-telemetry.d.ts +21 -0
  365. package/dist/telemetry/run-telemetry.js +62 -0
  366. package/dist/telemetry/session-metrics.d.ts +103 -0
  367. package/dist/telemetry/session-metrics.js +329 -0
  368. package/dist/telemetry/telemetry.d.ts +68 -0
  369. package/dist/telemetry/telemetry.js +313 -0
  370. package/dist/token-auth.d.ts +0 -1
  371. package/dist/token-auth.js +0 -1
  372. package/dist/tools/act-capsule.d.ts +23 -0
  373. package/dist/tools/act-capsule.js +47 -0
  374. package/dist/tools/act-danger.d.ts +7 -0
  375. package/dist/tools/act-danger.js +44 -0
  376. package/dist/tools/act-helpers.d.ts +17 -0
  377. package/dist/tools/act-helpers.js +40 -0
  378. package/dist/tools/act-tools.d.ts +8 -1
  379. package/dist/tools/act-tools.js +96 -98
  380. package/dist/tools/act-view.d.ts +7 -1
  381. package/dist/tools/act-view.js +13 -1
  382. package/dist/tools/assert-grade.d.ts +22 -1
  383. package/dist/tools/assert-grade.js +46 -1
  384. package/dist/tools/assert-verdict.d.ts +21 -0
  385. package/dist/tools/assert-verdict.js +62 -0
  386. package/dist/tools/browser-tools.d.ts +0 -1
  387. package/dist/tools/browser-tools.js +2 -2
  388. package/dist/tools/contract-tools.d.ts +0 -1
  389. package/dist/tools/contract-tools.js +0 -1
  390. package/dist/tools/coverage-tools.d.ts +9 -0
  391. package/dist/tools/coverage-tools.js +92 -0
  392. package/dist/tools/dynamic-tools.d.ts +0 -1
  393. package/dist/tools/dynamic-tools.js +21 -2
  394. package/dist/tools/error-recovery.d.ts +18 -2
  395. package/dist/tools/error-recovery.js +42 -7
  396. package/dist/tools/feedback-tools.d.ts +24 -0
  397. package/dist/tools/feedback-tools.js +180 -0
  398. package/dist/tools/invoke-tool.d.ts +0 -1
  399. package/dist/tools/invoke-tool.js +116 -2
  400. package/dist/tools/lease-tools.d.ts +0 -1
  401. package/dist/tools/lease-tools.js +6 -5
  402. package/dist/tools/merge-tools.d.ts +0 -1
  403. package/dist/tools/merge-tools.js +0 -1
  404. package/dist/tools/observe-tools.d.ts +0 -1
  405. package/dist/tools/observe-tools.js +91 -39
  406. package/dist/tools/profiles.d.ts +1 -2
  407. package/dist/tools/profiles.js +43 -16
  408. package/dist/tools/query-paginate.d.ts +0 -1
  409. package/dist/tools/query-paginate.js +0 -1
  410. package/dist/tools/read-tools.d.ts +0 -1
  411. package/dist/tools/read-tools.js +10 -8
  412. package/dist/tools/reconcile-tools.d.ts +2 -0
  413. package/dist/tools/reconcile-tools.js +111 -0
  414. package/dist/tools/snapshot-delta.d.ts +0 -1
  415. package/dist/tools/snapshot-delta.js +0 -0
  416. package/dist/tools/tool-invoker.d.ts +0 -1
  417. package/dist/tools/tool-invoker.js +0 -1
  418. package/dist/tools/tool-kit.d.ts +16 -1
  419. package/dist/tools/tool-kit.js +8 -2
  420. package/dist/tools/tool-names.d.ts +6 -1
  421. package/dist/tools/tool-names.js +6 -1
  422. package/dist/tools/tools-helpers.d.ts +0 -1
  423. package/dist/tools/tools-helpers.js +0 -1
  424. package/dist/tools/tools.d.ts +0 -1
  425. package/dist/tools/tools.js +24 -4
  426. package/dist/update/update-checker.d.ts +0 -1
  427. package/dist/update/update-checker.js +26 -2
  428. package/dist/update/update-nudge.d.ts +20 -0
  429. package/dist/update/update-nudge.js +72 -0
  430. package/dist/update/updater.d.ts +14 -1
  431. package/dist/update/updater.js +33 -2
  432. package/dist/visual/visual-diff.d.ts +0 -1
  433. package/dist/visual/visual-diff.js +0 -1
  434. package/dist/visual/visual-store.d.ts +0 -1
  435. package/dist/visual/visual-store.js +0 -1
  436. package/dist/visual/visual-tools.d.ts +0 -1
  437. package/dist/visual/visual-tools.js +103 -16
  438. package/package.json +2 -2
  439. package/dist/bridge-security.d.ts.map +0 -1
  440. package/dist/bridge-security.js.map +0 -1
  441. package/dist/bridge.d.ts.map +0 -1
  442. package/dist/bridge.js.map +0 -1
  443. package/dist/bridge.test-harness.d.ts.map +0 -1
  444. package/dist/bridge.test-harness.js.map +0 -1
  445. package/dist/capsule/capsule-store.d.ts.map +0 -1
  446. package/dist/capsule/capsule-store.js.map +0 -1
  447. package/dist/capsule/capsule.d.ts.map +0 -1
  448. package/dist/capsule/capsule.js.map +0 -1
  449. package/dist/capsule/causal-summary.d.ts.map +0 -1
  450. package/dist/capsule/causal-summary.js.map +0 -1
  451. package/dist/capsule/divergence.d.ts.map +0 -1
  452. package/dist/capsule/divergence.js.map +0 -1
  453. package/dist/capsule/minimize.d.ts.map +0 -1
  454. package/dist/capsule/minimize.js.map +0 -1
  455. package/dist/capsule/predicate-to-links.d.ts.map +0 -1
  456. package/dist/capsule/predicate-to-links.js.map +0 -1
  457. package/dist/cli-flow-commands.d.ts.map +0 -1
  458. package/dist/cli-flow-commands.js.map +0 -1
  459. package/dist/cli-launch.d.ts.map +0 -1
  460. package/dist/cli-launch.js.map +0 -1
  461. package/dist/cli-parse.d.ts.map +0 -1
  462. package/dist/cli-parse.js.map +0 -1
  463. package/dist/cli-port.d.ts.map +0 -1
  464. package/dist/cli-port.js.map +0 -1
  465. package/dist/cli-verify.d.ts.map +0 -1
  466. package/dist/cli-verify.js.map +0 -1
  467. package/dist/cli.d.ts.map +0 -1
  468. package/dist/cli.js.map +0 -1
  469. package/dist/cloud/cloud-sync.d.ts.map +0 -1
  470. package/dist/cloud/cloud-sync.js.map +0 -1
  471. package/dist/crawl/crawl-tools.d.ts.map +0 -1
  472. package/dist/crawl/crawl-tools.js.map +0 -1
  473. package/dist/crawl/crawl.d.ts.map +0 -1
  474. package/dist/crawl/crawl.js.map +0 -1
  475. package/dist/daemon-resilience.d.ts.map +0 -1
  476. package/dist/daemon-resilience.js.map +0 -1
  477. package/dist/daemon.d.ts.map +0 -1
  478. package/dist/daemon.js.map +0 -1
  479. package/dist/domain/domain-model.d.ts.map +0 -1
  480. package/dist/domain/domain-model.js.map +0 -1
  481. package/dist/domain/domain-tools.d.ts.map +0 -1
  482. package/dist/domain/domain-tools.js.map +0 -1
  483. package/dist/domain/flow-risk.d.ts.map +0 -1
  484. package/dist/domain/flow-risk.js.map +0 -1
  485. package/dist/ee/audit-log.d.ts.map +0 -1
  486. package/dist/ee/audit-log.js.map +0 -1
  487. package/dist/events/event-filters.d.ts.map +0 -1
  488. package/dist/events/event-filters.js.map +0 -1
  489. package/dist/events/predicate-eval.d.ts.map +0 -1
  490. package/dist/events/predicate-eval.js.map +0 -1
  491. package/dist/events/predicate.d.ts.map +0 -1
  492. package/dist/events/predicate.js.map +0 -1
  493. package/dist/events/reaction.d.ts.map +0 -1
  494. package/dist/events/reaction.js.map +0 -1
  495. package/dist/events/ring-buffer.d.ts.map +0 -1
  496. package/dist/events/ring-buffer.js.map +0 -1
  497. package/dist/flows/affected.d.ts.map +0 -1
  498. package/dist/flows/affected.js.map +0 -1
  499. package/dist/flows/annotate-tools.d.ts.map +0 -1
  500. package/dist/flows/annotate-tools.js.map +0 -1
  501. package/dist/flows/annotate.d.ts.map +0 -1
  502. package/dist/flows/annotate.js.map +0 -1
  503. package/dist/flows/annotation-store.d.ts.map +0 -1
  504. package/dist/flows/annotation-store.js.map +0 -1
  505. package/dist/flows/assertion-integrity.d.ts.map +0 -1
  506. package/dist/flows/assertion-integrity.js.map +0 -1
  507. package/dist/flows/assertion-tiers-store.d.ts.map +0 -1
  508. package/dist/flows/assertion-tiers-store.js.map +0 -1
  509. package/dist/flows/buddy-status.d.ts.map +0 -1
  510. package/dist/flows/buddy-status.js.map +0 -1
  511. package/dist/flows/coverage.d.ts.map +0 -1
  512. package/dist/flows/coverage.js.map +0 -1
  513. package/dist/flows/decision.d.ts.map +0 -1
  514. package/dist/flows/decision.js.map +0 -1
  515. package/dist/flows/flake-store.d.ts.map +0 -1
  516. package/dist/flows/flake-store.js.map +0 -1
  517. package/dist/flows/flake.d.ts.map +0 -1
  518. package/dist/flows/flake.js.map +0 -1
  519. package/dist/flows/flow-classify.d.ts.map +0 -1
  520. package/dist/flows/flow-classify.js.map +0 -1
  521. package/dist/flows/flow-replay-run.d.ts.map +0 -1
  522. package/dist/flows/flow-replay-run.js.map +0 -1
  523. package/dist/flows/flow-replay.d.ts.map +0 -1
  524. package/dist/flows/flow-replay.js.map +0 -1
  525. package/dist/flows/flow-report.d.ts.map +0 -1
  526. package/dist/flows/flow-report.js.map +0 -1
  527. package/dist/flows/flow-scope.d.ts.map +0 -1
  528. package/dist/flows/flow-scope.js.map +0 -1
  529. package/dist/flows/flow-sources.d.ts.map +0 -1
  530. package/dist/flows/flow-sources.js.map +0 -1
  531. package/dist/flows/flow-success.d.ts.map +0 -1
  532. package/dist/flows/flow-success.js.map +0 -1
  533. package/dist/flows/flow-tools.d.ts.map +0 -1
  534. package/dist/flows/flow-tools.js.map +0 -1
  535. package/dist/flows/flows.d.ts.map +0 -1
  536. package/dist/flows/flows.js.map +0 -1
  537. package/dist/flows/gate.d.ts.map +0 -1
  538. package/dist/flows/gate.js.map +0 -1
  539. package/dist/flows/git-changed.d.ts.map +0 -1
  540. package/dist/flows/git-changed.js.map +0 -1
  541. package/dist/flows/heal-run.d.ts.map +0 -1
  542. package/dist/flows/heal-run.js.map +0 -1
  543. package/dist/flows/heal.d.ts.map +0 -1
  544. package/dist/flows/heal.js.map +0 -1
  545. package/dist/flows/parallel-suite.d.ts.map +0 -1
  546. package/dist/flows/parallel-suite.js.map +0 -1
  547. package/dist/flows/recordings.d.ts.map +0 -1
  548. package/dist/flows/recordings.js.map +0 -1
  549. package/dist/flows/replay.d.ts.map +0 -1
  550. package/dist/flows/replay.js.map +0 -1
  551. package/dist/flows/watch-batcher.d.ts.map +0 -1
  552. package/dist/flows/watch-batcher.js.map +0 -1
  553. package/dist/honesty/blind-spots.d.ts.map +0 -1
  554. package/dist/honesty/blind-spots.js.map +0 -1
  555. package/dist/honesty/honesty.d.ts.map +0 -1
  556. package/dist/honesty/honesty.js.map +0 -1
  557. package/dist/http-server.d.ts.map +0 -1
  558. package/dist/http-server.js.map +0 -1
  559. package/dist/idle-shutdown.d.ts.map +0 -1
  560. package/dist/idle-shutdown.js.map +0 -1
  561. package/dist/index.d.ts.map +0 -1
  562. package/dist/index.js.map +0 -1
  563. package/dist/init/agent-rules.d.ts.map +0 -1
  564. package/dist/init/agent-rules.js.map +0 -1
  565. package/dist/init/cursor.d.ts.map +0 -1
  566. package/dist/init/cursor.js.map +0 -1
  567. package/dist/init/detect.d.ts.map +0 -1
  568. package/dist/init/detect.js.map +0 -1
  569. package/dist/init/mcp.d.ts.map +0 -1
  570. package/dist/init/mcp.js.map +0 -1
  571. package/dist/init/node-io.d.ts.map +0 -1
  572. package/dist/init/node-io.js.map +0 -1
  573. package/dist/init/plan.d.ts.map +0 -1
  574. package/dist/init/plan.js.map +0 -1
  575. package/dist/init/project-id.d.ts.map +0 -1
  576. package/dist/init/project-id.js.map +0 -1
  577. package/dist/init/run.d.ts.map +0 -1
  578. package/dist/init/run.js.map +0 -1
  579. package/dist/init/snippets.d.ts.map +0 -1
  580. package/dist/init/snippets.js.map +0 -1
  581. package/dist/init/vite-config.d.ts.map +0 -1
  582. package/dist/init/vite-config.js.map +0 -1
  583. package/dist/input/network-detail.d.ts.map +0 -1
  584. package/dist/input/network-detail.js.map +0 -1
  585. package/dist/input/network-mock-tools.d.ts.map +0 -1
  586. package/dist/input/network-mock-tools.js.map +0 -1
  587. package/dist/input/network-mock.d.ts.map +0 -1
  588. package/dist/input/network-mock.js.map +0 -1
  589. package/dist/input/real-input.d.ts.map +0 -1
  590. package/dist/input/real-input.js.map +0 -1
  591. package/dist/input/scroll-find.d.ts.map +0 -1
  592. package/dist/input/scroll-find.js.map +0 -1
  593. package/dist/input/scroll-tools.d.ts.map +0 -1
  594. package/dist/input/scroll-tools.js.map +0 -1
  595. package/dist/input/viewport-tools.d.ts.map +0 -1
  596. package/dist/input/viewport-tools.js.map +0 -1
  597. package/dist/journal/ambient-store.d.ts.map +0 -1
  598. package/dist/journal/ambient-store.js.map +0 -1
  599. package/dist/journal/ambient.d.ts.map +0 -1
  600. package/dist/journal/ambient.js.map +0 -1
  601. package/dist/journal/attach-journal.d.ts.map +0 -1
  602. package/dist/journal/attach-journal.js.map +0 -1
  603. package/dist/journal/deviation-report.d.ts.map +0 -1
  604. package/dist/journal/deviation-report.js.map +0 -1
  605. package/dist/journal/deviation-service.d.ts.map +0 -1
  606. package/dist/journal/deviation-service.js.map +0 -1
  607. package/dist/journal/envelope-store.d.ts.map +0 -1
  608. package/dist/journal/envelope-store.js.map +0 -1
  609. package/dist/journal/envelope.d.ts.map +0 -1
  610. package/dist/journal/envelope.js.map +0 -1
  611. package/dist/journal/journal-query.d.ts.map +0 -1
  612. package/dist/journal/journal-query.js.map +0 -1
  613. package/dist/journal/journal-recorder.d.ts.map +0 -1
  614. package/dist/journal/journal-recorder.js.map +0 -1
  615. package/dist/journal/retention.d.ts.map +0 -1
  616. package/dist/journal/retention.js.map +0 -1
  617. package/dist/journal/rollups.d.ts.map +0 -1
  618. package/dist/journal/rollups.js.map +0 -1
  619. package/dist/journal/session-end.d.ts.map +0 -1
  620. package/dist/journal/session-end.js.map +0 -1
  621. package/dist/journal/session-journal.d.ts.map +0 -1
  622. package/dist/journal/session-journal.js.map +0 -1
  623. package/dist/license/license.d.ts.map +0 -1
  624. package/dist/license/license.js.map +0 -1
  625. package/dist/log.d.ts.map +0 -1
  626. package/dist/log.js.map +0 -1
  627. package/dist/mcp-proxy.d.ts.map +0 -1
  628. package/dist/mcp-proxy.js.map +0 -1
  629. package/dist/mcp.d.ts.map +0 -1
  630. package/dist/mcp.js.map +0 -1
  631. package/dist/oracles/flow-instrument-gaps.d.ts.map +0 -1
  632. package/dist/oracles/flow-instrument-gaps.js.map +0 -1
  633. package/dist/oracles/propose-consequences.d.ts.map +0 -1
  634. package/dist/oracles/propose-consequences.js.map +0 -1
  635. package/dist/oracles/self-instrument.d.ts.map +0 -1
  636. package/dist/oracles/self-instrument.js.map +0 -1
  637. package/dist/pairing-token.d.ts.map +0 -1
  638. package/dist/pairing-token.js.map +0 -1
  639. package/dist/phenomena/phenomena.d.ts.map +0 -1
  640. package/dist/phenomena/phenomena.js.map +0 -1
  641. package/dist/pool/browser-pool.d.ts.map +0 -1
  642. package/dist/pool/browser-pool.js.map +0 -1
  643. package/dist/pool/lease-reaper.d.ts.map +0 -1
  644. package/dist/pool/lease-reaper.js.map +0 -1
  645. package/dist/pool/playwright-launcher.d.ts.map +0 -1
  646. package/dist/pool/playwright-launcher.js.map +0 -1
  647. package/dist/project/baselines.d.ts.map +0 -1
  648. package/dist/project/baselines.js.map +0 -1
  649. package/dist/project/file-lock.d.ts.map +0 -1
  650. package/dist/project/file-lock.js.map +0 -1
  651. package/dist/project/fs-port.d.ts.map +0 -1
  652. package/dist/project/fs-port.js.map +0 -1
  653. package/dist/project/project-store.d.ts.map +0 -1
  654. package/dist/project/project-store.js.map +0 -1
  655. package/dist/project/project-tools.d.ts.map +0 -1
  656. package/dist/project/project-tools.js.map +0 -1
  657. package/dist/project/reticle-dir.d.ts.map +0 -1
  658. package/dist/project/reticle-dir.js.map +0 -1
  659. package/dist/runs/build-verification-run.d.ts.map +0 -1
  660. package/dist/runs/build-verification-run.js.map +0 -1
  661. package/dist/runs/profile-redact.d.ts.map +0 -1
  662. package/dist/runs/profile-redact.js.map +0 -1
  663. package/dist/runs/render-report.d.ts.map +0 -1
  664. package/dist/runs/render-report.js.map +0 -1
  665. package/dist/runs/repair-prompt.d.ts.map +0 -1
  666. package/dist/runs/repair-prompt.js.map +0 -1
  667. package/dist/runs/replay-mapping.d.ts.map +0 -1
  668. package/dist/runs/replay-mapping.js.map +0 -1
  669. package/dist/runs/reticle-runner.d.ts.map +0 -1
  670. package/dist/runs/reticle-runner.js.map +0 -1
  671. package/dist/runs/risk-classify.d.ts.map +0 -1
  672. package/dist/runs/risk-classify.js.map +0 -1
  673. package/dist/runs/run-diff.d.ts.map +0 -1
  674. package/dist/runs/run-diff.js.map +0 -1
  675. package/dist/runs/run-store.d.ts.map +0 -1
  676. package/dist/runs/run-store.js.map +0 -1
  677. package/dist/runs/run-tools.d.ts.map +0 -1
  678. package/dist/runs/run-tools.js.map +0 -1
  679. package/dist/runs/runner-port.d.ts.map +0 -1
  680. package/dist/runs/runner-port.js.map +0 -1
  681. package/dist/runs/verify-http.d.ts.map +0 -1
  682. package/dist/runs/verify-http.js.map +0 -1
  683. package/dist/runs/verify-server.d.ts.map +0 -1
  684. package/dist/runs/verify-server.js.map +0 -1
  685. package/dist/server-version.d.ts.map +0 -1
  686. package/dist/server-version.js.map +0 -1
  687. package/dist/session/control-envelope.d.ts.map +0 -1
  688. package/dist/session/control-envelope.js.map +0 -1
  689. package/dist/session/live-control-tools.d.ts.map +0 -1
  690. package/dist/session/live-control-tools.js.map +0 -1
  691. package/dist/session/live-control.d.ts.map +0 -1
  692. package/dist/session/live-control.js.map +0 -1
  693. package/dist/session/observed-state.d.ts.map +0 -1
  694. package/dist/session/observed-state.js.map +0 -1
  695. package/dist/session/output-budget.d.ts.map +0 -1
  696. package/dist/session/output-budget.js.map +0 -1
  697. package/dist/session/presenter-args.d.ts.map +0 -1
  698. package/dist/session/presenter-args.js.map +0 -1
  699. package/dist/session/review-store.d.ts.map +0 -1
  700. package/dist/session/review-store.js.map +0 -1
  701. package/dist/session/session-health.d.ts.map +0 -1
  702. package/dist/session/session-health.js.map +0 -1
  703. package/dist/session/session-manager.d.ts.map +0 -1
  704. package/dist/session/session-manager.js.map +0 -1
  705. package/dist/session/session-readiness.d.ts.map +0 -1
  706. package/dist/session/session-readiness.js.map +0 -1
  707. package/dist/session/session-reaper.d.ts.map +0 -1
  708. package/dist/session/session-reaper.js.map +0 -1
  709. package/dist/session/session-recommendation.d.ts.map +0 -1
  710. package/dist/session/session-recommendation.js.map +0 -1
  711. package/dist/session/session-tools.d.ts.map +0 -1
  712. package/dist/session/session-tools.js.map +0 -1
  713. package/dist/session/session.d.ts.map +0 -1
  714. package/dist/session/session.js.map +0 -1
  715. package/dist/session/state-select.d.ts.map +0 -1
  716. package/dist/session/state-select.js.map +0 -1
  717. package/dist/token-auth.d.ts.map +0 -1
  718. package/dist/token-auth.js.map +0 -1
  719. package/dist/tools/act-tools.d.ts.map +0 -1
  720. package/dist/tools/act-tools.js.map +0 -1
  721. package/dist/tools/act-view.d.ts.map +0 -1
  722. package/dist/tools/act-view.js.map +0 -1
  723. package/dist/tools/assert-grade.d.ts.map +0 -1
  724. package/dist/tools/assert-grade.js.map +0 -1
  725. package/dist/tools/browser-tools.d.ts.map +0 -1
  726. package/dist/tools/browser-tools.js.map +0 -1
  727. package/dist/tools/contract-tools.d.ts.map +0 -1
  728. package/dist/tools/contract-tools.js.map +0 -1
  729. package/dist/tools/dynamic-tools.d.ts.map +0 -1
  730. package/dist/tools/dynamic-tools.js.map +0 -1
  731. package/dist/tools/error-recovery.d.ts.map +0 -1
  732. package/dist/tools/error-recovery.js.map +0 -1
  733. package/dist/tools/invoke-tool.d.ts.map +0 -1
  734. package/dist/tools/invoke-tool.js.map +0 -1
  735. package/dist/tools/lease-tools.d.ts.map +0 -1
  736. package/dist/tools/lease-tools.js.map +0 -1
  737. package/dist/tools/merge-tools.d.ts.map +0 -1
  738. package/dist/tools/merge-tools.js.map +0 -1
  739. package/dist/tools/observe-tools.d.ts.map +0 -1
  740. package/dist/tools/observe-tools.js.map +0 -1
  741. package/dist/tools/profiles.d.ts.map +0 -1
  742. package/dist/tools/profiles.js.map +0 -1
  743. package/dist/tools/query-paginate.d.ts.map +0 -1
  744. package/dist/tools/query-paginate.js.map +0 -1
  745. package/dist/tools/read-tools.d.ts.map +0 -1
  746. package/dist/tools/read-tools.js.map +0 -1
  747. package/dist/tools/snapshot-delta.d.ts.map +0 -1
  748. package/dist/tools/snapshot-delta.js.map +0 -1
  749. package/dist/tools/tool-invoker.d.ts.map +0 -1
  750. package/dist/tools/tool-invoker.js.map +0 -1
  751. package/dist/tools/tool-kit.d.ts.map +0 -1
  752. package/dist/tools/tool-kit.js.map +0 -1
  753. package/dist/tools/tool-names.d.ts.map +0 -1
  754. package/dist/tools/tool-names.js.map +0 -1
  755. package/dist/tools/tools-helpers.d.ts.map +0 -1
  756. package/dist/tools/tools-helpers.js.map +0 -1
  757. package/dist/tools/tools.d.ts.map +0 -1
  758. package/dist/tools/tools.js.map +0 -1
  759. package/dist/update/update-checker.d.ts.map +0 -1
  760. package/dist/update/update-checker.js.map +0 -1
  761. package/dist/update/updater.d.ts.map +0 -1
  762. package/dist/update/updater.js.map +0 -1
  763. package/dist/visual/visual-diff.d.ts.map +0 -1
  764. package/dist/visual/visual-diff.js.map +0 -1
  765. package/dist/visual/visual-store.d.ts.map +0 -1
  766. package/dist/visual/visual-store.js.map +0 -1
  767. package/dist/visual/visual-tools.d.ts.map +0 -1
  768. package/dist/visual/visual-tools.js.map +0 -1
@@ -0,0 +1,40 @@
1
+ import { Verified } from '@reticlehq/core';
2
+ import { type HonestyBlock } from './honesty.js';
3
+ /**
4
+ * The decision rule: eight trust dimensions in, one answer out.
5
+ *
6
+ * Everything needed to judge an action already travelled on the result — the assertion verdict, the
7
+ * grade it proved, whether the capture was clean, whether the page settled, whether any channel
8
+ * disagreed. What was missing was the RULE, so every agent had to invent one, and inventing it under
9
+ * uncertainty is exactly where a confident wrong answer comes from.
10
+ *
11
+ * Ordering is deliberate, because the first matching clause also writes `because`, and the reader
12
+ * should be told the most actionable fact rather than the first true one.
13
+ */
14
+ export interface VerifiedInputs {
15
+ /** Did the declared consequence hold? Undefined when the action declared none. */
16
+ pass?: boolean;
17
+ honesty: HonestyBlock;
18
+ /** Cross-channel disagreements found in the action's window. */
19
+ contradictions?: readonly {
20
+ kind: string;
21
+ }[];
22
+ /** Did a real frame flush before the wait gave up? */
23
+ settled?: boolean;
24
+ /**
25
+ * A write in this window answered `202 Accepted` — the server took the request and has NOT
26
+ * finished processing it.
27
+ */
28
+ outcomePending?: boolean;
29
+ /**
30
+ * A write in this window returned 2xx with a payload that was never recorded, so its outcome was
31
+ * never read. See `hasUnreadWriteOutcome` — the status line describes the transport, not the result.
32
+ */
33
+ outcomeUnread?: boolean;
34
+ }
35
+ export interface VerifiedVerdict {
36
+ verified: Verified;
37
+ /** One sentence naming the deciding evidence — never a restatement of the field. */
38
+ because: string;
39
+ }
40
+ export declare function decideVerified(inputs: VerifiedInputs): VerifiedVerdict;
@@ -0,0 +1,86 @@
1
+ import { Verified } from '@reticlehq/core';
2
+ import { HonestyGrade } from './honesty.js';
3
+ export function decideVerified(inputs) {
4
+ const { pass, honesty, contradictions = [], settled, outcomePending, outcomeUnread } = inputs;
5
+ // A failed assertion is the most actionable fact there is; it leads.
6
+ if (pass === false) {
7
+ return { verified: Verified.NO, because: 'the declared consequence did not hold' };
8
+ }
9
+ // A contradiction outranks a passing assertion, and that inversion is the whole point: the case
10
+ // this product exists to catch is a green assertion sitting on top of a failed write. Measured on
11
+ // the bench app — `ui-advanced-request-failed` arrived with verdict.pass true and every other
12
+ // channel agreeing. Letting `pass` win there would report exactly the false green being detected.
13
+ if (contradictions.length > 0) {
14
+ const kinds = contradictions.map((c) => c.kind).join(', ');
15
+ return {
16
+ verified: Verified.NO,
17
+ because: `channels disagree about this action (${kinds}) even though the assertion passed`,
18
+ };
19
+ }
20
+ // Dirty capture is NOT failure. The layer could not see part of the window, so any green is a
21
+ // statement about what it happened to observe — which is precisely the thing that must not be
22
+ // reported as proof.
23
+ if (!honesty.integrity.clean) {
24
+ return {
25
+ verified: Verified.UNKNOWN,
26
+ because: `capture was not clean (${honesty.integrity.issues.join('; ')}), so a green here would only describe what was observed`,
27
+ };
28
+ }
29
+ // A vacuous green: nothing was actually proved. Grade NONE means no signal, no request, no state
30
+ // change and no element was pinned — the assertion could not have failed, which makes passing it
31
+ // evidence of nothing.
32
+ if (honesty.grade === HonestyGrade.NONE) {
33
+ return {
34
+ verified: Verified.UNKNOWN,
35
+ because: 'nothing was asserted at a real grade, so passing proves nothing — assert a signal, request, or state path',
36
+ };
37
+ }
38
+ // A `202 Accepted` is the server saying, in the only word HTTP has for it, that the outcome does
39
+ // not exist yet. Treating 2xx as success makes every asynchronous workflow verifiable at exactly
40
+ // the moment nothing has been decided.
41
+ //
42
+ // Measured on a logistics console with server-side reconciliation: a dispatch answered 202, the row
43
+ // optimistically rendered "dispatched", the page settled, and the verdict came back `yes` — then
44
+ // the server REVERTED it to `held` 1.2s later. Every channel agreed, and every channel was early.
45
+ // UNKNOWN rather than NO: nothing has failed, and saying it has would be its own false report.
46
+ if (outcomePending === true) {
47
+ return {
48
+ verified: Verified.UNKNOWN,
49
+ because: 'a write returned 202 Accepted, so the server has not finished processing it — this window cannot contain the outcome; re-check once it reconciles',
50
+ };
51
+ }
52
+ // A write answered 2xx and its payload went unread, so the one channel that could contradict the
53
+ // screen was never opened. Reporting `yes` here means "no channel disagreed" — true only because a
54
+ // channel was closed. Measured on a shipments console: `POST /api/bulk-hold` → 200 with three of
55
+ // nine items failed inside the body, banner reading "9 shipments held", verdict `yes`.
56
+ //
57
+ // UNKNOWN, not NO: nothing is known to have failed. The remedy is in the sentence, because an
58
+ // agent that cannot act on a caveat will learn to skip it.
59
+ if (outcomeUnread === true) {
60
+ return {
61
+ verified: Verified.UNKNOWN,
62
+ because: 'a write returned 2xx with a response body that was never recorded, so its outcome is unread — a 200 describes the transport, not the result (a batch reports per-item failures in the body, and every GraphQL error is a 200). Enable it where your app calls connect(): `reticle.connect({ captureNetworkBodies: true })`, then re-run',
63
+ };
64
+ }
65
+ // Never settled: the page may still be moving, so the observation window may have closed early.
66
+ if (settled === false) {
67
+ return {
68
+ verified: Verified.UNKNOWN,
69
+ because: 'the page never settled, so the reaction window may have closed before the app finished',
70
+ };
71
+ }
72
+ // Partial coverage is a real caveat but not a blocker — it is reported in `honesty.coverage` and
73
+ // does not by itself make a graded, clean, uncontradicted pass untrustworthy.
74
+ //
75
+ // It must not be described as clean, though. This sentence said "over a clean capture" regardless,
76
+ // so a verdict could read `verified: yes ... over a clean capture` directly beside `coverage:
77
+ // partial` — the prose contradicting the evidence block next to it. Whichever a reader believes,
78
+ // one of them lied, and the whole point of this layer is that the sentence can be trusted on its
79
+ // own. Seen on a one-way IPC send: coverage said the outcome was unobservable, `because` said clean.
80
+ return {
81
+ verified: Verified.YES,
82
+ because: honesty.coverage?.partial === true
83
+ ? `assertion held at ${honesty.grade} grade with no channel disagreeing, but coverage was PARTIAL — see \`coverage\` for what went unobserved`
84
+ : `assertion held at ${honesty.grade} grade over a clean capture with no channel disagreeing`,
85
+ };
86
+ }
@@ -32,4 +32,3 @@ export interface SharedServer {
32
32
  export declare function createSharedServer(options?: {
33
33
  token?: string;
34
34
  }): SharedServer;
35
- //# sourceMappingURL=http-server.d.ts.map
@@ -2,6 +2,7 @@ import * as http from 'node:http';
2
2
  import { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';
3
3
  import { MCP_SSE_PATH, MCP_MESSAGE_PATH, STATUS_PATH } from '@reticlehq/core';
4
4
  import { log } from './log.js';
5
+ import { reportMcpConnected } from './telemetry/mcp-connection.js';
5
6
  import { isLoopbackHost, isLocalWebOrigin, isLoopbackPeer, requestToken, tokensMatch, } from './token-auth.js';
6
7
  /**
7
8
  * Creates a shared HTTP server that handles both the WebSocket bridge (browser SDK) and the
@@ -84,6 +85,10 @@ export function createSharedServer(options = {}) {
84
85
  .connect(transport)
85
86
  .then(() => {
86
87
  log('mcp_client_connected', { sessionId: sid });
88
+ // The one signal that separates "Reticle is running" from "somebody is USING it": a daemon
89
+ // can sit up for days with nothing attached. It also exposes reconnect churn, which is
90
+ // indistinguishable from healthy usage in every other metric.
91
+ reportMcpConnected();
87
92
  })
88
93
  .catch((err) => {
89
94
  const message = err instanceof Error ? err.message : String(err);
@@ -138,4 +143,3 @@ export function createSharedServer(options = {}) {
138
143
  }
139
144
  return { httpServer, attachMcp, attachStatus, attachAgentPresence, close };
140
145
  }
141
- //# sourceMappingURL=http-server.js.map
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Aggregate many crawl runs into the one number the core claim needs.
3
+ *
4
+ * Detection already exists: `reticle_crawl` drives every reachable control and reports contradictions
5
+ * — two channels disagreeing about the same click. It found `swallowed-500-login` and, separately,
6
+ * `ui-advanced-request-failed` on a control whose assertion was green, neither of them planted.
7
+ *
8
+ * What was missing is the arithmetic that turns those into evidence. The claim worth making is not
9
+ * "Reticle can find bugs"; it is:
10
+ *
11
+ * "Run over N already-merged, already-green changes, it found X real bugs their own tests
12
+ * certified as passing."
13
+ *
14
+ * That needs no control arm, which is why it is the cheapest credible proof available: the
15
+ * counterfactual is already established, because those changes SHIPPED. An A/B is the second study,
16
+ * and this tells you where to point it.
17
+ *
18
+ * Pure functions over already-collected reports — the driving is `reticle_crawl`'s job, and running
19
+ * it across a commit range is a shell loop. This is only the part that must not be done by eye.
20
+ */
21
+ /** The contradiction kinds — cross-channel disagreement, as opposed to a single-channel fault. */
22
+ export declare const CONTRADICTION_KINDS: readonly string[];
23
+ export interface HuntAnomaly {
24
+ kind: string;
25
+ ref?: string;
26
+ desc?: string;
27
+ detail?: string;
28
+ }
29
+ /** One crawl over one checkout. `label` is whatever identifies it — a commit sha, a PR number. */
30
+ export interface HuntRun {
31
+ label: string;
32
+ anomalies: readonly HuntAnomaly[];
33
+ /** Controls actually driven. A run that drove nothing proves nothing and is reported separately. */
34
+ stepsRun?: number;
35
+ }
36
+ export interface HuntSummary {
37
+ runs: number;
38
+ /** Runs that actually drove at least one control. The denominator that can honestly be quoted. */
39
+ runsWithCoverage: number;
40
+ /** Runs where at least one CONTRADICTION was found — the headline numerator. */
41
+ runsWithContradictions: number;
42
+ contradictions: number;
43
+ /** Single-channel faults (console errors, failed requests, dead controls). Context, not the claim. */
44
+ singleChannelFaults: number;
45
+ byKind: Record<string, number>;
46
+ /** Labels with contradictions, so each one can be confirmed by hand before it is counted. */
47
+ flagged: string[];
48
+ headline: string;
49
+ }
50
+ export declare function summarizeHunt(runs: readonly HuntRun[]): HuntSummary;
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Aggregate many crawl runs into the one number the core claim needs.
3
+ *
4
+ * Detection already exists: `reticle_crawl` drives every reachable control and reports contradictions
5
+ * — two channels disagreeing about the same click. It found `swallowed-500-login` and, separately,
6
+ * `ui-advanced-request-failed` on a control whose assertion was green, neither of them planted.
7
+ *
8
+ * What was missing is the arithmetic that turns those into evidence. The claim worth making is not
9
+ * "Reticle can find bugs"; it is:
10
+ *
11
+ * "Run over N already-merged, already-green changes, it found X real bugs their own tests
12
+ * certified as passing."
13
+ *
14
+ * That needs no control arm, which is why it is the cheapest credible proof available: the
15
+ * counterfactual is already established, because those changes SHIPPED. An A/B is the second study,
16
+ * and this tells you where to point it.
17
+ *
18
+ * Pure functions over already-collected reports — the driving is `reticle_crawl`'s job, and running
19
+ * it across a commit range is a shell loop. This is only the part that must not be done by eye.
20
+ */
21
+ /** The contradiction kinds — cross-channel disagreement, as opposed to a single-channel fault. */
22
+ export const CONTRADICTION_KINDS = [
23
+ 'ui-advanced-request-failed',
24
+ 'signal-contradicted',
25
+ 'response-ignored',
26
+ 'duplicate-request',
27
+ 'request-never-settled',
28
+ 'failure-misattributed',
29
+ ];
30
+ const isContradiction = (kind) => CONTRADICTION_KINDS.includes(kind);
31
+ export function summarizeHunt(runs) {
32
+ const byKind = {};
33
+ const flagged = [];
34
+ let contradictions = 0;
35
+ let singleChannelFaults = 0;
36
+ let runsWithCoverage = 0;
37
+ for (const run of runs) {
38
+ // A run that drove nothing is not evidence of cleanliness. Counting it in the denominator would
39
+ // dilute the rate with checkouts where the app never even came up — the arithmetic equivalent of
40
+ // reporting a green because no test ran.
41
+ if ((run.stepsRun ?? 0) > 0)
42
+ runsWithCoverage += 1;
43
+ let flaggedThisRun = false;
44
+ for (const anomaly of run.anomalies) {
45
+ byKind[anomaly.kind] = (byKind[anomaly.kind] ?? 0) + 1;
46
+ if (isContradiction(anomaly.kind)) {
47
+ contradictions += 1;
48
+ flaggedThisRun = true;
49
+ }
50
+ else {
51
+ singleChannelFaults += 1;
52
+ }
53
+ }
54
+ if (flaggedThisRun)
55
+ flagged.push(run.label);
56
+ }
57
+ return {
58
+ runs: runs.length,
59
+ runsWithCoverage,
60
+ runsWithContradictions: flagged.length,
61
+ contradictions,
62
+ singleChannelFaults,
63
+ byKind,
64
+ flagged,
65
+ headline: buildHeadline(runsWithCoverage, flagged.length, contradictions),
66
+ };
67
+ }
68
+ /**
69
+ * The sentence that goes in front of someone, phrased so it cannot overstate itself.
70
+ *
71
+ * It counts CHECKOUTS with a finding rather than raw findings, because one broken control clicked
72
+ * five times is one bug and five anomalies. It also says "candidate": every flag still has to be
73
+ * confirmed by hand before it is a bug, and a number that skips that step is the kind of evidence
74
+ * this project exists to distrust.
75
+ */
76
+ function buildHeadline(withCoverage, flaggedRuns, contradictions) {
77
+ if (withCoverage === 0) {
78
+ return 'no run drove a single control — nothing was measured, which is not the same as nothing being wrong';
79
+ }
80
+ if (flaggedRuns === 0) {
81
+ return `${String(withCoverage)} merged changes crawled, no cross-channel contradictions found — confirm coverage was real before reading this as clean`;
82
+ }
83
+ return `${String(flaggedRuns)} of ${String(withCoverage)} merged, already-green changes carried a candidate false green (${String(contradictions)} contradictions) — each needs manual confirmation before it is counted`;
84
+ }
@@ -31,4 +31,3 @@ export declare class IdleShutdown {
31
31
  * `0` to disable. Anything missing/invalid falls back to the default. Pure.
32
32
  */
33
33
  export declare function resolveIdleShutdownMs(raw: string | undefined): number;
34
- //# sourceMappingURL=idle-shutdown.d.ts.map
@@ -65,4 +65,3 @@ export function resolveIdleShutdownMs(raw) {
65
65
  return SESSION_LIFECYCLE.DAEMON_IDLE_SHUTDOWN_MS;
66
66
  return Math.floor(n);
67
67
  }
68
- //# sourceMappingURL=idle-shutdown.js.map
package/dist/index.d.ts CHANGED
@@ -132,4 +132,3 @@ export declare function start(options?: StartOptions): Promise<RunningServer>;
132
132
  * browser sessions persist in the daemon.
133
133
  */
134
134
  export declare function startDaemon(options?: StartOptions): Promise<RunningServer>;
135
- //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -426,4 +426,3 @@ export async function startDaemon(options = {}) {
426
426
  },
427
427
  };
428
428
  }
429
- //# sourceMappingURL=index.js.map
@@ -35,4 +35,3 @@ export declare function markedBlock(): string;
35
35
  export declare function mergeMarkedInstruction(existing: string | null | undefined): AgentRuleResult;
36
36
  /** The Cursor rule file (.mdc): `alwaysApply` keeps the rule in every turn's context. */
37
37
  export declare function cursorRuleFile(): string;
38
- //# sourceMappingURL=agent-rules.d.ts.map
@@ -27,7 +27,10 @@ This app is instrumented by **Reticle** — an in-app verification layer exposed
27
27
  - **How:** drive the actual flow (\`reticle_act\` / \`reticle_act_and_wait\`), then read the observable effect (\`reticle_assert\`, \`reticle_snapshot\`, \`reticle_state\`, \`reticle_network\`). Confirm the change produced the effect it was meant to, with no new console errors or failed requests.
28
28
  - **Covered flows:** run \`reticle gate\` — it reports which recorded flows the changed files affect and whether they still pass.
29
29
  - **Never weaken a check to make it green.** Downgrading, skipping, or deleting an assertion is a finding, not a fix.
30
- - **If Reticle can't run** (no daemon, or this is not a running web app), say so — do not skip verification silently.`;
30
+ - **If Reticle can't run** (no daemon, or this is not a running web app), say so — do not skip verification silently.
31
+ - **If a tool result carries \`update_available\`, say so.** Reticle checked npm and a newer version exists. Tell the human the version numbers and offer to run \`reticle update\` — between tasks, never mid-verification, because it restarts the daemon and drops the session. Finish what you are doing first.
32
+ - **Wish Reticle could do something? Ask for it with \`reticle_feedback\`.** Reticle is built for agents, so what you find awkward or missing is what decides the roadmap — and you are the only one who can report it, because that thought disappears when your context does. File \`feature_request\` for something that does not exist, \`improvement\` for something that works but costs too many calls. Say what you are actually trying to achieve (\`need\`) and how you work around it today (\`currentApproach\`), and set \`model\` to the model you are running. File it the moment you notice, then carry on — nothing is too minor.
33
+ - **If Reticle itself fails you, tell its maintainers with \`reticle_feedback\`.** A tool that returned something wrong, a thing Reticle could not observe at all, or a verdict you could not act on — file it with a root-cause analysis and the call trace, then carry on with the task. Working around a broken tool in silence is how the same defect survives. This is about defects in *Reticle*; a bug you find in *this app* is Reticle working, and belongs in your report to the user instead.`;
31
34
  export const AgentRuleStatus = {
32
35
  APPLY: 'apply',
33
36
  ALREADY: 'already',
@@ -62,4 +65,3 @@ alwaysApply: true
62
65
  ${RULE_BODY}
63
66
  `;
64
67
  }
65
- //# sourceMappingURL=agent-rules.js.map
@@ -22,4 +22,3 @@ interface CursorMergeResult {
22
22
  export declare function cursorServerEntry(): Record<string, unknown>;
23
23
  export declare function mergeCursorConfig(existing: string | null): CursorMergeResult;
24
24
  export {};
25
- //# sourceMappingURL=cursor.d.ts.map
@@ -46,4 +46,3 @@ export function mergeCursorConfig(existing) {
46
46
  };
47
47
  return { status: CursorMergeStatus.APPLY, content: `${JSON.stringify(merged, null, 2)}\n` };
48
48
  }
49
- //# sourceMappingURL=cursor.js.map
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Setup RCA for desktop apps.
3
+ *
4
+ * Every failure this catches is SILENT. A Tauri app with the default CSP runs perfectly and simply
5
+ * never appears in `reticle status` — the WebSocket is blocked before it opens, and nothing in the
6
+ * app's own console says so. An Electron app missing the preload line works fine and reports zero
7
+ * network activity forever, which reads as "the app makes no backend calls" rather than "you are
8
+ * blind to all of them".
9
+ *
10
+ * Silent misconfiguration is the same disease as a false green: the tool answers confidently and the
11
+ * answer is wrong. So the diagnosis names the file, the reason, and the exact line to add.
12
+ *
13
+ * Pure: a `read` function in, findings out. No fs, no cwd, no process.
14
+ */
15
+ export declare const DesktopFinding: {
16
+ /** Tauri's CSP will block the bridge WebSocket — the app will never connect, with no error. */
17
+ readonly TAURI_CSP_BLOCKS_BRIDGE: "tauri-csp-blocks-bridge";
18
+ /** A custom CSP dropped the `ipc:` source Tauri needs for `invoke` itself. */
19
+ readonly TAURI_CSP_BLOCKS_IPC: "tauri-csp-blocks-ipc";
20
+ /** The preload never requires the shim, so every IPC call is invisible. */
21
+ readonly ELECTRON_PRELOAD_MISSING: "electron-preload-missing";
22
+ /** The main process never installs the capture helper, so screenshots are unavailable. */
23
+ readonly ELECTRON_CAPTURE_MISSING: "electron-capture-missing";
24
+ };
25
+ export type DesktopFinding = (typeof DesktopFinding)[keyof typeof DesktopFinding];
26
+ export interface DesktopDiagnosis {
27
+ code: DesktopFinding;
28
+ /** Which file to look at. */
29
+ file: string;
30
+ /** What is wrong, in one line. */
31
+ problem: string;
32
+ /** Exactly what to add — copy-pasteable, with the port actually in use. */
33
+ fix: string;
34
+ }
35
+ /** Reads a project-relative path. Undefined means the file does not exist. */
36
+ export type ReadFile = (path: string) => string | undefined;
37
+ /** Is this project a desktop shell at all? Used to print a positive result instead of silence. */
38
+ export declare function isDesktopProject(read: ReadFile): boolean;
39
+ /** Which desktop shell (if any) this project is, and what is missing from its Reticle wiring. */
40
+ export declare function diagnoseDesktop(read: ReadFile, port: number): DesktopDiagnosis[];
@@ -0,0 +1,198 @@
1
+ import { RETICLE_IPC_GLOBAL } from '@reticlehq/core';
2
+ /**
3
+ * Setup RCA for desktop apps.
4
+ *
5
+ * Every failure this catches is SILENT. A Tauri app with the default CSP runs perfectly and simply
6
+ * never appears in `reticle status` — the WebSocket is blocked before it opens, and nothing in the
7
+ * app's own console says so. An Electron app missing the preload line works fine and reports zero
8
+ * network activity forever, which reads as "the app makes no backend calls" rather than "you are
9
+ * blind to all of them".
10
+ *
11
+ * Silent misconfiguration is the same disease as a false green: the tool answers confidently and the
12
+ * answer is wrong. So the diagnosis names the file, the reason, and the exact line to add.
13
+ *
14
+ * Pure: a `read` function in, findings out. No fs, no cwd, no process.
15
+ */
16
+ export const DesktopFinding = {
17
+ /** Tauri's CSP will block the bridge WebSocket — the app will never connect, with no error. */
18
+ TAURI_CSP_BLOCKS_BRIDGE: 'tauri-csp-blocks-bridge',
19
+ /** A custom CSP dropped the `ipc:` source Tauri needs for `invoke` itself. */
20
+ TAURI_CSP_BLOCKS_IPC: 'tauri-csp-blocks-ipc',
21
+ /** The preload never requires the shim, so every IPC call is invisible. */
22
+ ELECTRON_PRELOAD_MISSING: 'electron-preload-missing',
23
+ /** The main process never installs the capture helper, so screenshots are unavailable. */
24
+ ELECTRON_CAPTURE_MISSING: 'electron-capture-missing',
25
+ };
26
+ const TAURI_CONF = 'src-tauri/tauri.conf.json';
27
+ const PRELOAD_REQUIRE = '@reticlehq/electron/preload';
28
+ const CAPTURE_REQUIRE = '@reticlehq/electron/main';
29
+ function parseJson(text) {
30
+ if (text === undefined)
31
+ return undefined;
32
+ try {
33
+ const parsed = JSON.parse(text);
34
+ return typeof parsed === 'object' && parsed !== null
35
+ ? parsed
36
+ : undefined;
37
+ }
38
+ catch {
39
+ return undefined; // a malformed config is the app's problem, not something to crash the doctor on
40
+ }
41
+ }
42
+ function record(value) {
43
+ return typeof value === 'object' && value !== null ? value : {};
44
+ }
45
+ /**
46
+ * Does this CSP permit the bridge WebSocket on `port`?
47
+ *
48
+ * A MISSING csp key is treated as blocking, not permissive: Tauri applies a restrictive default, so
49
+ * reporting "no CSP, therefore fine" would be precisely the false green this tool exists to prevent.
50
+ */
51
+ function cspAllowsBridge(csp, port) {
52
+ if (csp === undefined)
53
+ return false;
54
+ const exact = `ws://localhost:${String(port)}`;
55
+ const loopback = `ws://127.0.0.1:${String(port)}`;
56
+ // A BARE `ws:` scheme source allows any ws origin. It must be matched as a whole source, not as a
57
+ // substring: `includes('ws:')` also matches `ws://localhost:4400`, which would make every port
58
+ // look allowed and silently defeat the port check this function exists to perform.
59
+ const bareScheme = /(^|[\s;])ws:(?!\/\/)/.test(csp);
60
+ return (csp.includes(exact) ||
61
+ csp.includes(loopback) ||
62
+ csp.includes('ws://localhost:*') ||
63
+ csp.includes('ws://127.0.0.1:*') ||
64
+ bareScheme);
65
+ }
66
+ /** Tauri v2 needs `ipc:`/`http://ipc.localhost` in connect-src for `invoke` to work at all. */
67
+ function cspAllowsIpc(csp) {
68
+ return csp.includes('ipc:') || csp.includes('ipc.localhost');
69
+ }
70
+ function diagnoseTauri(read, port) {
71
+ const conf = parseJson(read(TAURI_CONF));
72
+ if (conf === undefined)
73
+ return [];
74
+ const security = record(record(conf['app'])['security']);
75
+ const csp = typeof security['csp'] === 'string' ? security['csp'] : undefined;
76
+ const findings = [];
77
+ if (!cspAllowsBridge(csp, port)) {
78
+ findings.push({
79
+ code: DesktopFinding.TAURI_CSP_BLOCKS_BRIDGE,
80
+ file: TAURI_CONF,
81
+ problem: csp === undefined
82
+ ? "no `app.security.csp` set, so Tauri's restrictive default applies and blocks the Reticle bridge — the app will run normally and never connect"
83
+ : 'the CSP `connect-src` does not allow the Reticle bridge WebSocket — the app will run normally and never connect',
84
+ fix: `add to app.security.csp connect-src: ws://localhost:${String(port)}`,
85
+ });
86
+ }
87
+ if (csp !== undefined && !cspAllowsIpc(csp)) {
88
+ findings.push({
89
+ code: DesktopFinding.TAURI_CSP_BLOCKS_IPC,
90
+ file: TAURI_CONF,
91
+ problem: 'the CSP dropped the `ipc:` source Tauri needs — `invoke` itself will fail',
92
+ fix: 'add to app.security.csp connect-src: ipc: http://ipc.localhost',
93
+ });
94
+ }
95
+ return findings;
96
+ }
97
+ /** The directory portion of a path, without pulling in node:path (this module stays pure). */
98
+ function dirOf(path) {
99
+ const cut = path.lastIndexOf('/');
100
+ return cut < 0 ? '' : path.slice(0, cut + 1);
101
+ }
102
+ /**
103
+ * Where a preload SOURCE might live, in the order worth trying.
104
+ *
105
+ * Beside `main` first (the unbundled layout), then the usual source directories — a bundled setup
106
+ * points `main` at `out/` or `dist/` while the real preload stays in `src/` or `electron/`.
107
+ */
108
+ function preloadCandidates(mainDir) {
109
+ const names = ['preload.cjs', 'preload.js', 'preload.mjs', 'preload.ts', 'preload.mts'];
110
+ const dirs = [mainDir, 'electron/', 'src/', 'src/preload/', 'src/main/', ''];
111
+ return dirs.flatMap((dir) => names.map((name) => `${dir}${name}`));
112
+ }
113
+ /**
114
+ * Where a BUNDLED preload's output lands. electron-vite's default layout mirrors `out/main` with
115
+ * `out/preload`; Forge and hand-rolled setups favour `dist`/`build`.
116
+ */
117
+ function bundledPreloadCandidates(mainDir) {
118
+ const roots = [mainDir.replace(/main\/?$/, ''), 'out/', 'dist/', 'build/', '.vite/build/'];
119
+ const names = [
120
+ 'preload/index.js',
121
+ 'preload/index.mjs',
122
+ 'preload/index.cjs',
123
+ 'preload.js',
124
+ 'preload.mjs',
125
+ 'preload.cjs',
126
+ ];
127
+ return roots.flatMap((root) => names.map((name) => `${root}${name}`));
128
+ }
129
+ /**
130
+ * Is the preload wired, judged from whatever evidence exists?
131
+ *
132
+ * Source first (the require is right there). Failing that, the BUILD OUTPUT: bundling inlines the
133
+ * shim, and the shim carries the contract's own window global — finding that string in the artifact
134
+ * proves the preload is wired even though the require has been compiled away. Undefined means no
135
+ * evidence either way, and an unknown must never be reported as a fault.
136
+ */
137
+ function preloadWired(read, mainDir) {
138
+ for (const candidate of preloadCandidates(mainDir)) {
139
+ const source = read(candidate);
140
+ if (source !== undefined)
141
+ return { wired: source.includes(PRELOAD_REQUIRE), file: candidate };
142
+ }
143
+ for (const candidate of bundledPreloadCandidates(mainDir)) {
144
+ const built = read(candidate);
145
+ if (built !== undefined) {
146
+ return { wired: built.includes(RETICLE_IPC_GLOBAL), file: candidate };
147
+ }
148
+ }
149
+ return undefined;
150
+ }
151
+ function diagnoseElectron(read, main) {
152
+ const findings = [];
153
+ const dir = dirOf(main);
154
+ // Undefined = no source AND no build output to judge from. An unknown is not a fault.
155
+ const preload = preloadWired(read, dir);
156
+ if (preload !== undefined && !preload.wired) {
157
+ findings.push({
158
+ code: DesktopFinding.ELECTRON_PRELOAD_MISSING,
159
+ file: preload.file,
160
+ problem: 'the preload never installs the Reticle IPC shim, so every ipcRenderer.invoke is invisible — reticle_network will report nothing and read as "this app makes no backend calls"',
161
+ fix: `add as the FIRST line: require('${PRELOAD_REQUIRE}')`,
162
+ });
163
+ }
164
+ const mainSource = read(main);
165
+ if (mainSource !== undefined && !mainSource.includes(CAPTURE_REQUIRE)) {
166
+ findings.push({
167
+ code: DesktopFinding.ELECTRON_CAPTURE_MISSING,
168
+ file: main,
169
+ problem: 'the main process never installs the capture helper, so screenshots are unavailable',
170
+ fix: `add: const { installReticleCapture } = require('${CAPTURE_REQUIRE}') then installReticleCapture(win)`,
171
+ });
172
+ }
173
+ return findings;
174
+ }
175
+ /** Is this project a desktop shell at all? Used to print a positive result instead of silence. */
176
+ export function isDesktopProject(read) {
177
+ if (read(TAURI_CONF) !== undefined)
178
+ return true;
179
+ const pkg = parseJson(read('package.json'));
180
+ if (pkg === undefined)
181
+ return false;
182
+ const deps = { ...record(pkg['dependencies']), ...record(pkg['devDependencies']) };
183
+ return deps['electron'] !== undefined;
184
+ }
185
+ /** Which desktop shell (if any) this project is, and what is missing from its Reticle wiring. */
186
+ export function diagnoseDesktop(read, port) {
187
+ const tauri = diagnoseTauri(read, port);
188
+ if (tauri.length > 0 || read(TAURI_CONF) !== undefined)
189
+ return tauri;
190
+ const pkg = parseJson(read('package.json'));
191
+ if (pkg === undefined)
192
+ return [];
193
+ const deps = { ...record(pkg['dependencies']), ...record(pkg['devDependencies']) };
194
+ if (deps['electron'] === undefined)
195
+ return [];
196
+ const main = typeof pkg['main'] === 'string' ? pkg['main'] : undefined;
197
+ return main === undefined ? [] : diagnoseElectron(read, main);
198
+ }
@@ -46,4 +46,3 @@ interface InstallCommand {
46
46
  export declare function installCommandParts(pm: PackageManager, pkgs: string | readonly string[]): InstallCommand;
47
47
  export declare function installCommand(pm: PackageManager, pkgs: string | readonly string[]): string;
48
48
  export {};
49
- //# sourceMappingURL=detect.d.ts.map
@@ -81,4 +81,3 @@ export function installCommand(pm, pkgs) {
81
81
  const { command, args } = installCommandParts(pm, pkgs);
82
82
  return `${command} ${args.join(' ')}`;
83
83
  }
84
- //# sourceMappingURL=detect.js.map
@@ -37,4 +37,3 @@ export declare function claudeAvailableProbe(): {
37
37
  /** Printed when the `claude` CLI isn't available — register Reticle globally once, by hand. */
38
38
  export declare function mcpManual(): string;
39
39
  export {};
40
- //# sourceMappingURL=mcp.d.ts.map
package/dist/init/mcp.js CHANGED
@@ -53,4 +53,3 @@ Or, for another agent, add this to its global MCP config (e.g. Cursor's ~/.curso
53
53
 
54
54
  "${MCP_SERVER_NAME}": { "command": "${NPX}", "args": ${JSON.stringify(serverInvocation().slice(1))} }`;
55
55
  }
56
- //# sourceMappingURL=mcp.js.map
@@ -5,4 +5,3 @@
5
5
  */
6
6
  import type { InitIo } from './run.js';
7
7
  export declare function buildNodeIo(cwd: string): InitIo;
8
- //# sourceMappingURL=node-io.d.ts.map
@@ -54,4 +54,3 @@ export function buildNodeIo(cwd) {
54
54
  },
55
55
  };
56
56
  }
57
- //# sourceMappingURL=node-io.js.map
@@ -6,6 +6,10 @@
6
6
  import { Framework, type Detection } from './detect.js';
7
7
  /** The dev-dependencies `reticle init` installs for a given framework — kit first, build plugin next. */
8
8
  export declare function frameworkPackages(framework: Framework): readonly string[];
9
+ /** Exported so the init telemetry can tell an MCP-registration failure from a dependency install. */
10
+ export declare const MCP_TARGET = "global (claude user scope)";
11
+ /** The step that runs the package manager — the other thing that commonly fails on a user's machine. */
12
+ export declare const DEPS_TARGET = "package.json";
9
13
  export declare const StepStatus: {
10
14
  readonly APPLY: "apply";
11
15
  readonly MANUAL: "manual";
@@ -75,4 +79,3 @@ export interface PlanInput {
75
79
  }
76
80
  export declare function buildPlan(input: PlanInput): Plan;
77
81
  export {};
78
- //# sourceMappingURL=plan.d.ts.map