@reticlehq/server 2.2.1 → 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 (778) 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 +34 -2
  27. package/dist/cli-parse.js +107 -1
  28. package/dist/cli-port.d.ts +0 -1
  29. package/dist/cli-port.js +0 -1
  30. package/dist/cli-verify.d.ts +0 -1
  31. package/dist/cli-verify.js +1 -2
  32. package/dist/cli.d.ts +0 -1
  33. package/dist/cli.js +79 -67
  34. package/dist/cloud/cloud-config.d.ts +0 -1
  35. package/dist/cloud/cloud-config.js +0 -1
  36. package/dist/cloud/cloud-sync.d.ts +4 -5
  37. package/dist/cloud/cloud-sync.js +0 -1
  38. package/dist/cloud-cli.d.ts +0 -1
  39. package/dist/cloud-cli.js +9 -2
  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 +36 -24
  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 +2 -3
  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 +30 -8
  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 +0 -1
  139. package/dist/flows/server-verify.js +0 -1
  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 +0 -1
  249. package/dist/pool/playwright-launcher.js +10 -2
  250. package/dist/project/baselines.d.ts +0 -1
  251. package/dist/project/baselines.js +0 -1
  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 +0 -1
  258. package/dist/project/project-tools.d.ts +0 -1
  259. package/dist/project/project-tools.js +29 -4
  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 +0 -1
  285. package/dist/runs/verification-sync.js +0 -1
  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 +35 -8
  369. package/dist/telemetry/telemetry.js +105 -12
  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 +115 -5
  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 +0 -1
  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-config.d.ts.map +0 -1
  470. package/dist/cloud/cloud-config.js.map +0 -1
  471. package/dist/cloud/cloud-sync.d.ts.map +0 -1
  472. package/dist/cloud/cloud-sync.js.map +0 -1
  473. package/dist/cloud-cli.d.ts.map +0 -1
  474. package/dist/cloud-cli.js.map +0 -1
  475. package/dist/crawl/crawl-tools.d.ts.map +0 -1
  476. package/dist/crawl/crawl-tools.js.map +0 -1
  477. package/dist/crawl/crawl.d.ts.map +0 -1
  478. package/dist/crawl/crawl.js.map +0 -1
  479. package/dist/daemon-resilience.d.ts.map +0 -1
  480. package/dist/daemon-resilience.js.map +0 -1
  481. package/dist/daemon.d.ts.map +0 -1
  482. package/dist/daemon.js.map +0 -1
  483. package/dist/domain/domain-model.d.ts.map +0 -1
  484. package/dist/domain/domain-model.js.map +0 -1
  485. package/dist/domain/domain-tools.d.ts.map +0 -1
  486. package/dist/domain/domain-tools.js.map +0 -1
  487. package/dist/domain/flow-risk.d.ts.map +0 -1
  488. package/dist/domain/flow-risk.js.map +0 -1
  489. package/dist/ee/audit-log.d.ts.map +0 -1
  490. package/dist/ee/audit-log.js.map +0 -1
  491. package/dist/events/event-filters.d.ts.map +0 -1
  492. package/dist/events/event-filters.js.map +0 -1
  493. package/dist/events/predicate-eval.d.ts.map +0 -1
  494. package/dist/events/predicate-eval.js.map +0 -1
  495. package/dist/events/predicate.d.ts.map +0 -1
  496. package/dist/events/predicate.js.map +0 -1
  497. package/dist/events/reaction.d.ts.map +0 -1
  498. package/dist/events/reaction.js.map +0 -1
  499. package/dist/events/ring-buffer.d.ts.map +0 -1
  500. package/dist/events/ring-buffer.js.map +0 -1
  501. package/dist/flows/affected.d.ts.map +0 -1
  502. package/dist/flows/affected.js.map +0 -1
  503. package/dist/flows/annotate-tools.d.ts.map +0 -1
  504. package/dist/flows/annotate-tools.js.map +0 -1
  505. package/dist/flows/annotate.d.ts.map +0 -1
  506. package/dist/flows/annotate.js.map +0 -1
  507. package/dist/flows/annotation-store.d.ts.map +0 -1
  508. package/dist/flows/annotation-store.js.map +0 -1
  509. package/dist/flows/assertion-integrity.d.ts.map +0 -1
  510. package/dist/flows/assertion-integrity.js.map +0 -1
  511. package/dist/flows/assertion-tiers-store.d.ts.map +0 -1
  512. package/dist/flows/assertion-tiers-store.js.map +0 -1
  513. package/dist/flows/buddy-status.d.ts.map +0 -1
  514. package/dist/flows/buddy-status.js.map +0 -1
  515. package/dist/flows/coverage.d.ts.map +0 -1
  516. package/dist/flows/coverage.js.map +0 -1
  517. package/dist/flows/decision.d.ts.map +0 -1
  518. package/dist/flows/decision.js.map +0 -1
  519. package/dist/flows/flake-store.d.ts.map +0 -1
  520. package/dist/flows/flake-store.js.map +0 -1
  521. package/dist/flows/flake.d.ts.map +0 -1
  522. package/dist/flows/flake.js.map +0 -1
  523. package/dist/flows/flow-classify.d.ts.map +0 -1
  524. package/dist/flows/flow-classify.js.map +0 -1
  525. package/dist/flows/flow-replay-run.d.ts.map +0 -1
  526. package/dist/flows/flow-replay-run.js.map +0 -1
  527. package/dist/flows/flow-replay.d.ts.map +0 -1
  528. package/dist/flows/flow-replay.js.map +0 -1
  529. package/dist/flows/flow-report.d.ts.map +0 -1
  530. package/dist/flows/flow-report.js.map +0 -1
  531. package/dist/flows/flow-scope.d.ts.map +0 -1
  532. package/dist/flows/flow-scope.js.map +0 -1
  533. package/dist/flows/flow-sources.d.ts.map +0 -1
  534. package/dist/flows/flow-sources.js.map +0 -1
  535. package/dist/flows/flow-success.d.ts.map +0 -1
  536. package/dist/flows/flow-success.js.map +0 -1
  537. package/dist/flows/flow-tools.d.ts.map +0 -1
  538. package/dist/flows/flow-tools.js.map +0 -1
  539. package/dist/flows/flows.d.ts.map +0 -1
  540. package/dist/flows/flows.js.map +0 -1
  541. package/dist/flows/gate.d.ts.map +0 -1
  542. package/dist/flows/gate.js.map +0 -1
  543. package/dist/flows/git-changed.d.ts.map +0 -1
  544. package/dist/flows/git-changed.js.map +0 -1
  545. package/dist/flows/heal-run.d.ts.map +0 -1
  546. package/dist/flows/heal-run.js.map +0 -1
  547. package/dist/flows/heal.d.ts.map +0 -1
  548. package/dist/flows/heal.js.map +0 -1
  549. package/dist/flows/parallel-suite.d.ts.map +0 -1
  550. package/dist/flows/parallel-suite.js.map +0 -1
  551. package/dist/flows/recordings.d.ts.map +0 -1
  552. package/dist/flows/recordings.js.map +0 -1
  553. package/dist/flows/replay.d.ts.map +0 -1
  554. package/dist/flows/replay.js.map +0 -1
  555. package/dist/flows/server-verify.d.ts.map +0 -1
  556. package/dist/flows/server-verify.js.map +0 -1
  557. package/dist/flows/watch-batcher.d.ts.map +0 -1
  558. package/dist/flows/watch-batcher.js.map +0 -1
  559. package/dist/honesty/blind-spots.d.ts.map +0 -1
  560. package/dist/honesty/blind-spots.js.map +0 -1
  561. package/dist/honesty/honesty.d.ts.map +0 -1
  562. package/dist/honesty/honesty.js.map +0 -1
  563. package/dist/http-server.d.ts.map +0 -1
  564. package/dist/http-server.js.map +0 -1
  565. package/dist/idle-shutdown.d.ts.map +0 -1
  566. package/dist/idle-shutdown.js.map +0 -1
  567. package/dist/index.d.ts.map +0 -1
  568. package/dist/index.js.map +0 -1
  569. package/dist/init/agent-rules.d.ts.map +0 -1
  570. package/dist/init/agent-rules.js.map +0 -1
  571. package/dist/init/cursor.d.ts.map +0 -1
  572. package/dist/init/cursor.js.map +0 -1
  573. package/dist/init/detect.d.ts.map +0 -1
  574. package/dist/init/detect.js.map +0 -1
  575. package/dist/init/mcp.d.ts.map +0 -1
  576. package/dist/init/mcp.js.map +0 -1
  577. package/dist/init/node-io.d.ts.map +0 -1
  578. package/dist/init/node-io.js.map +0 -1
  579. package/dist/init/plan.d.ts.map +0 -1
  580. package/dist/init/plan.js.map +0 -1
  581. package/dist/init/project-id.d.ts.map +0 -1
  582. package/dist/init/project-id.js.map +0 -1
  583. package/dist/init/run.d.ts.map +0 -1
  584. package/dist/init/run.js.map +0 -1
  585. package/dist/init/snippets.d.ts.map +0 -1
  586. package/dist/init/snippets.js.map +0 -1
  587. package/dist/init/vite-config.d.ts.map +0 -1
  588. package/dist/init/vite-config.js.map +0 -1
  589. package/dist/input/network-detail.d.ts.map +0 -1
  590. package/dist/input/network-detail.js.map +0 -1
  591. package/dist/input/network-mock-tools.d.ts.map +0 -1
  592. package/dist/input/network-mock-tools.js.map +0 -1
  593. package/dist/input/network-mock.d.ts.map +0 -1
  594. package/dist/input/network-mock.js.map +0 -1
  595. package/dist/input/real-input.d.ts.map +0 -1
  596. package/dist/input/real-input.js.map +0 -1
  597. package/dist/input/scroll-find.d.ts.map +0 -1
  598. package/dist/input/scroll-find.js.map +0 -1
  599. package/dist/input/scroll-tools.d.ts.map +0 -1
  600. package/dist/input/scroll-tools.js.map +0 -1
  601. package/dist/input/viewport-tools.d.ts.map +0 -1
  602. package/dist/input/viewport-tools.js.map +0 -1
  603. package/dist/journal/ambient-store.d.ts.map +0 -1
  604. package/dist/journal/ambient-store.js.map +0 -1
  605. package/dist/journal/ambient.d.ts.map +0 -1
  606. package/dist/journal/ambient.js.map +0 -1
  607. package/dist/journal/attach-journal.d.ts.map +0 -1
  608. package/dist/journal/attach-journal.js.map +0 -1
  609. package/dist/journal/deviation-report.d.ts.map +0 -1
  610. package/dist/journal/deviation-report.js.map +0 -1
  611. package/dist/journal/deviation-service.d.ts.map +0 -1
  612. package/dist/journal/deviation-service.js.map +0 -1
  613. package/dist/journal/envelope-store.d.ts.map +0 -1
  614. package/dist/journal/envelope-store.js.map +0 -1
  615. package/dist/journal/envelope.d.ts.map +0 -1
  616. package/dist/journal/envelope.js.map +0 -1
  617. package/dist/journal/journal-query.d.ts.map +0 -1
  618. package/dist/journal/journal-query.js.map +0 -1
  619. package/dist/journal/journal-recorder.d.ts.map +0 -1
  620. package/dist/journal/journal-recorder.js.map +0 -1
  621. package/dist/journal/retention.d.ts.map +0 -1
  622. package/dist/journal/retention.js.map +0 -1
  623. package/dist/journal/rollups.d.ts.map +0 -1
  624. package/dist/journal/rollups.js.map +0 -1
  625. package/dist/journal/session-end.d.ts.map +0 -1
  626. package/dist/journal/session-end.js.map +0 -1
  627. package/dist/journal/session-journal.d.ts.map +0 -1
  628. package/dist/journal/session-journal.js.map +0 -1
  629. package/dist/license/license.d.ts.map +0 -1
  630. package/dist/license/license.js.map +0 -1
  631. package/dist/log.d.ts.map +0 -1
  632. package/dist/log.js.map +0 -1
  633. package/dist/mcp-proxy.d.ts.map +0 -1
  634. package/dist/mcp-proxy.js.map +0 -1
  635. package/dist/mcp.d.ts.map +0 -1
  636. package/dist/mcp.js.map +0 -1
  637. package/dist/oracles/flow-instrument-gaps.d.ts.map +0 -1
  638. package/dist/oracles/flow-instrument-gaps.js.map +0 -1
  639. package/dist/oracles/propose-consequences.d.ts.map +0 -1
  640. package/dist/oracles/propose-consequences.js.map +0 -1
  641. package/dist/oracles/self-instrument.d.ts.map +0 -1
  642. package/dist/oracles/self-instrument.js.map +0 -1
  643. package/dist/pairing-token.d.ts.map +0 -1
  644. package/dist/pairing-token.js.map +0 -1
  645. package/dist/phenomena/phenomena.d.ts.map +0 -1
  646. package/dist/phenomena/phenomena.js.map +0 -1
  647. package/dist/pool/browser-pool.d.ts.map +0 -1
  648. package/dist/pool/browser-pool.js.map +0 -1
  649. package/dist/pool/lease-reaper.d.ts.map +0 -1
  650. package/dist/pool/lease-reaper.js.map +0 -1
  651. package/dist/pool/playwright-launcher.d.ts.map +0 -1
  652. package/dist/pool/playwright-launcher.js.map +0 -1
  653. package/dist/project/baselines.d.ts.map +0 -1
  654. package/dist/project/baselines.js.map +0 -1
  655. package/dist/project/file-lock.d.ts.map +0 -1
  656. package/dist/project/file-lock.js.map +0 -1
  657. package/dist/project/fs-port.d.ts.map +0 -1
  658. package/dist/project/fs-port.js.map +0 -1
  659. package/dist/project/project-store.d.ts.map +0 -1
  660. package/dist/project/project-store.js.map +0 -1
  661. package/dist/project/project-tools.d.ts.map +0 -1
  662. package/dist/project/project-tools.js.map +0 -1
  663. package/dist/project/reticle-dir.d.ts.map +0 -1
  664. package/dist/project/reticle-dir.js.map +0 -1
  665. package/dist/runs/build-verification-run.d.ts.map +0 -1
  666. package/dist/runs/build-verification-run.js.map +0 -1
  667. package/dist/runs/profile-redact.d.ts.map +0 -1
  668. package/dist/runs/profile-redact.js.map +0 -1
  669. package/dist/runs/render-report.d.ts.map +0 -1
  670. package/dist/runs/render-report.js.map +0 -1
  671. package/dist/runs/repair-prompt.d.ts.map +0 -1
  672. package/dist/runs/repair-prompt.js.map +0 -1
  673. package/dist/runs/replay-mapping.d.ts.map +0 -1
  674. package/dist/runs/replay-mapping.js.map +0 -1
  675. package/dist/runs/reticle-runner.d.ts.map +0 -1
  676. package/dist/runs/reticle-runner.js.map +0 -1
  677. package/dist/runs/risk-classify.d.ts.map +0 -1
  678. package/dist/runs/risk-classify.js.map +0 -1
  679. package/dist/runs/run-diff.d.ts.map +0 -1
  680. package/dist/runs/run-diff.js.map +0 -1
  681. package/dist/runs/run-store.d.ts.map +0 -1
  682. package/dist/runs/run-store.js.map +0 -1
  683. package/dist/runs/run-tools.d.ts.map +0 -1
  684. package/dist/runs/run-tools.js.map +0 -1
  685. package/dist/runs/runner-port.d.ts.map +0 -1
  686. package/dist/runs/runner-port.js.map +0 -1
  687. package/dist/runs/verification-sync.d.ts.map +0 -1
  688. package/dist/runs/verification-sync.js.map +0 -1
  689. package/dist/runs/verify-http.d.ts.map +0 -1
  690. package/dist/runs/verify-http.js.map +0 -1
  691. package/dist/runs/verify-server.d.ts.map +0 -1
  692. package/dist/runs/verify-server.js.map +0 -1
  693. package/dist/server-version.d.ts.map +0 -1
  694. package/dist/server-version.js.map +0 -1
  695. package/dist/session/control-envelope.d.ts.map +0 -1
  696. package/dist/session/control-envelope.js.map +0 -1
  697. package/dist/session/live-control-tools.d.ts.map +0 -1
  698. package/dist/session/live-control-tools.js.map +0 -1
  699. package/dist/session/live-control.d.ts.map +0 -1
  700. package/dist/session/live-control.js.map +0 -1
  701. package/dist/session/observed-state.d.ts.map +0 -1
  702. package/dist/session/observed-state.js.map +0 -1
  703. package/dist/session/output-budget.d.ts.map +0 -1
  704. package/dist/session/output-budget.js.map +0 -1
  705. package/dist/session/presenter-args.d.ts.map +0 -1
  706. package/dist/session/presenter-args.js.map +0 -1
  707. package/dist/session/review-store.d.ts.map +0 -1
  708. package/dist/session/review-store.js.map +0 -1
  709. package/dist/session/session-health.d.ts.map +0 -1
  710. package/dist/session/session-health.js.map +0 -1
  711. package/dist/session/session-manager.d.ts.map +0 -1
  712. package/dist/session/session-manager.js.map +0 -1
  713. package/dist/session/session-readiness.d.ts.map +0 -1
  714. package/dist/session/session-readiness.js.map +0 -1
  715. package/dist/session/session-reaper.d.ts.map +0 -1
  716. package/dist/session/session-reaper.js.map +0 -1
  717. package/dist/session/session-recommendation.d.ts.map +0 -1
  718. package/dist/session/session-recommendation.js.map +0 -1
  719. package/dist/session/session-tools.d.ts.map +0 -1
  720. package/dist/session/session-tools.js.map +0 -1
  721. package/dist/session/session.d.ts.map +0 -1
  722. package/dist/session/session.js.map +0 -1
  723. package/dist/session/state-select.d.ts.map +0 -1
  724. package/dist/session/state-select.js.map +0 -1
  725. package/dist/telemetry/telemetry.d.ts.map +0 -1
  726. package/dist/telemetry/telemetry.js.map +0 -1
  727. package/dist/token-auth.d.ts.map +0 -1
  728. package/dist/token-auth.js.map +0 -1
  729. package/dist/tools/act-tools.d.ts.map +0 -1
  730. package/dist/tools/act-tools.js.map +0 -1
  731. package/dist/tools/act-view.d.ts.map +0 -1
  732. package/dist/tools/act-view.js.map +0 -1
  733. package/dist/tools/assert-grade.d.ts.map +0 -1
  734. package/dist/tools/assert-grade.js.map +0 -1
  735. package/dist/tools/browser-tools.d.ts.map +0 -1
  736. package/dist/tools/browser-tools.js.map +0 -1
  737. package/dist/tools/contract-tools.d.ts.map +0 -1
  738. package/dist/tools/contract-tools.js.map +0 -1
  739. package/dist/tools/dynamic-tools.d.ts.map +0 -1
  740. package/dist/tools/dynamic-tools.js.map +0 -1
  741. package/dist/tools/error-recovery.d.ts.map +0 -1
  742. package/dist/tools/error-recovery.js.map +0 -1
  743. package/dist/tools/invoke-tool.d.ts.map +0 -1
  744. package/dist/tools/invoke-tool.js.map +0 -1
  745. package/dist/tools/lease-tools.d.ts.map +0 -1
  746. package/dist/tools/lease-tools.js.map +0 -1
  747. package/dist/tools/merge-tools.d.ts.map +0 -1
  748. package/dist/tools/merge-tools.js.map +0 -1
  749. package/dist/tools/observe-tools.d.ts.map +0 -1
  750. package/dist/tools/observe-tools.js.map +0 -1
  751. package/dist/tools/profiles.d.ts.map +0 -1
  752. package/dist/tools/profiles.js.map +0 -1
  753. package/dist/tools/query-paginate.d.ts.map +0 -1
  754. package/dist/tools/query-paginate.js.map +0 -1
  755. package/dist/tools/read-tools.d.ts.map +0 -1
  756. package/dist/tools/read-tools.js.map +0 -1
  757. package/dist/tools/snapshot-delta.d.ts.map +0 -1
  758. package/dist/tools/snapshot-delta.js.map +0 -1
  759. package/dist/tools/tool-invoker.d.ts.map +0 -1
  760. package/dist/tools/tool-invoker.js.map +0 -1
  761. package/dist/tools/tool-kit.d.ts.map +0 -1
  762. package/dist/tools/tool-kit.js.map +0 -1
  763. package/dist/tools/tool-names.d.ts.map +0 -1
  764. package/dist/tools/tool-names.js.map +0 -1
  765. package/dist/tools/tools-helpers.d.ts.map +0 -1
  766. package/dist/tools/tools-helpers.js.map +0 -1
  767. package/dist/tools/tools.d.ts.map +0 -1
  768. package/dist/tools/tools.js.map +0 -1
  769. package/dist/update/update-checker.d.ts.map +0 -1
  770. package/dist/update/update-checker.js.map +0 -1
  771. package/dist/update/updater.d.ts.map +0 -1
  772. package/dist/update/updater.js.map +0 -1
  773. package/dist/visual/visual-diff.d.ts.map +0 -1
  774. package/dist/visual/visual-diff.js.map +0 -1
  775. package/dist/visual/visual-store.d.ts.map +0 -1
  776. package/dist/visual/visual-store.js.map +0 -1
  777. package/dist/visual/visual-tools.d.ts.map +0 -1
  778. package/dist/visual/visual-tools.js.map +0 -1
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Telemetry for the verification RUNNER — the path `reticle verify` and the HTTP verify surface take.
3
+ *
4
+ * This path does not go through `runTool`, so for a while it produced nothing at all: no timing, no
5
+ * `verification_completed`, and — worst — no `bug_found`. Which meant every defect Reticle caught in
6
+ * CI was invisible to the one number we intend to publish, on precisely the surface most likely to
7
+ * run at scale and unattended. A metric that is blind to CI is not measuring the product.
8
+ *
9
+ * Reported from the assembled run rather than from inside the replay loop: the run artifact is the
10
+ * finished, already-classified verdict, so this cannot double-count and does not need to understand
11
+ * how a replay works.
12
+ */
13
+ import { BugSource, RunFlowStatus, TelemetryActor, TelemetryEventKind, VerdictStatus, } from '@reticlehq/core';
14
+ import { getSessionMetrics } from './session-metrics.js';
15
+ import { getTelemetry } from './telemetry.js';
16
+ /** The tool name reported for this path, so CI runs are distinguishable from agent-driven ones. */
17
+ export const VERIFY_SURFACE = 'reticle_verify';
18
+ /**
19
+ * Report one completed verification run: the verdict, and one bug per failing flow.
20
+ *
21
+ * Best-effort and wrapped — a verification's exit code must never depend on whether a metric sent.
22
+ */
23
+ export function reportRunTelemetry(run) {
24
+ try {
25
+ const failed = run.flows.filter((flow) => flow.status === RunFlowStatus.FAIL);
26
+ const metrics = getSessionMetrics();
27
+ metrics.recordVerification();
28
+ void getTelemetry().emit(TelemetryEventKind.VERIFICATION_COMPLETED, {
29
+ // A `reticle verify` was typed by a person or scheduled by their CI — either way it is not the
30
+ // agent's own loop, which is the distinction `actor` exists to draw.
31
+ actor: TelemetryActor.HUMAN,
32
+ verification: {
33
+ via: VERIFY_SURFACE,
34
+ verified: run.verdict.status === VerdictStatus.PASS ? 'yes' : 'no',
35
+ passed: run.verdict.status === VerdictStatus.PASS,
36
+ // The runner replays saved flows; it does not evaluate a fresh assertion that could pass over
37
+ // a contradiction, so this path cannot produce a false green and must not claim one.
38
+ falseGreenCaught: false,
39
+ durationMs: run.durationMs,
40
+ },
41
+ });
42
+ for (const _flow of failed) {
43
+ // Every failing flow in one run is a separate regression instance, but they share a kind — so
44
+ // only the first is a distinct defect. A 40-flow suite failing wholesale is one regression to
45
+ // fix far more often than it is forty.
46
+ const first = metrics.recordBug('flow-regression');
47
+ void getTelemetry().emit(TelemetryEventKind.BUG_FOUND, {
48
+ actor: TelemetryActor.HUMAN,
49
+ bug: {
50
+ source: BugSource.REPLAY,
51
+ kind: 'flow-regression',
52
+ falseGreen: false,
53
+ tool: VERIFY_SURFACE,
54
+ repeat: !first,
55
+ },
56
+ });
57
+ }
58
+ }
59
+ catch {
60
+ /* a verdict must never depend on a metric */
61
+ }
62
+ }
@@ -0,0 +1,103 @@
1
+ /**
2
+ * The in-process session accumulator — the reason Reticle's telemetry bill does not scale with how
3
+ * hard people use it.
4
+ *
5
+ * The old design emitted one event per MCP tool call. That reads as harmless until you multiply it
6
+ * out: a single agent verification loop is 50–200 tool calls, so a thousand daily users would push
7
+ * millions of events a day, and PostHog bills per ingested event. Worse, it was millions of events
8
+ * answering a question that ONE property answers better — `{reticle_act: 40, reticle_assert: 12}`
9
+ * tells you the session was a real verification loop, where 52 separate rows tell you only that 52
10
+ * things happened, with the shape scattered across them.
11
+ *
12
+ * So counts live here, in memory, and leave as a single `daemon_stopped` event.
13
+ *
14
+ * Everything recorded is a COUNT or a fingerprint. No tool arguments, no results, no selectors, no
15
+ * URLs, no error messages — the accumulator has no way to hold them, which is a stronger guarantee
16
+ * than a rule saying it shouldn't.
17
+ */
18
+ import { BrowserLaunchKind, type ConnectFailure, type SessionSummary } from '@reticlehq/core';
19
+ /**
20
+ * Mutable counters for one daemon lifetime. A plain class, not a store: it is process-local, it never
21
+ * persists, and it dies with the daemon.
22
+ */
23
+ export declare class SessionMetrics {
24
+ #private;
25
+ /** Clock injected — this file must stay testable without a real one, per the repo's clock rule. */
26
+ constructor(now: () => number);
27
+ /**
28
+ * Record a call starting. Returns a function to call when it finishes — that closure is what makes
29
+ * timing correct under CONCURRENCY: several agents can be inside `runTool` at once, so a single
30
+ * "last start time" field would attribute one tool's duration to another. Each call carries its own.
31
+ */
32
+ startToolCall(tool: string, args?: Record<string, unknown>): (durationMs: number) => void;
33
+ /**
34
+ * Time spent waiting on the BROWSER, across all commands.
35
+ *
36
+ * Compared against `busyMs` this answers the question a single total cannot: of the time an agent
37
+ * spends inside Reticle, how much is us and how much is the app under test? Without the split a
38
+ * 4-second `reticle_act` is unattributable — it could be our overhead or the app taking 4 seconds
39
+ * to settle, and those have opposite fixes. A high ratio here is a finding about their app; a low
40
+ * one alongside a high `busyMs` is a performance bug of ours.
41
+ */
42
+ recordBrowserLatency(ms: number): void;
43
+ /** A call for a tool that does not exist. Non-zero means our surface is confusing the agent. */
44
+ recordUnknownTool(): void;
45
+ recordToolCall(tool: string, args?: Record<string, unknown>): void;
46
+ /**
47
+ * One failed tool call. Grouped by fingerprint, but stored WITH its skeleton message and the tool
48
+ * that produced it — a bare fingerprint could be ranked and never diagnosed, which made the top
49
+ * error in the dashboard a number nobody could act on.
50
+ */
51
+ recordToolError(message: string, tool?: string): void;
52
+ /**
53
+ * A failure reported by the IN-PAGE half of Reticle, over the bridge.
54
+ *
55
+ * Kept in its own bucket rather than mixed into tool errors: a broken observer and a failing tool
56
+ * call are different defects with different owners, and merging them would hide the browser-side
57
+ * one inside a much larger pile. Same treatment otherwise — fingerprinted, variables stripped.
58
+ */
59
+ recordSdkFailure(site: string, message: string): void;
60
+ /** The agent's recent approach run + the call in flight — context for a crash report. */
61
+ get trail(): {
62
+ breadcrumb: string[];
63
+ inFlight: string | undefined;
64
+ };
65
+ recordVerification(): void;
66
+ /**
67
+ * One defect found in the app under test — the outcome number, kept broken down by kind.
68
+ *
69
+ * Returns TRUE when this kind is new to the session. Every occurrence is still counted; the flag
70
+ * only lets a reader separate "how many distinct defects" from "how often they were hit", which
71
+ * are different claims and were previously indistinguishable in the data.
72
+ */
73
+ recordBug(kind: string): boolean;
74
+ /**
75
+ * One connection ATTEMPT. Call before the attempt; settle it with the outcome.
76
+ *
77
+ * The previous version counted only successes, and counted them inconsistently — incrementing
78
+ * before the await on the CDP path and after it on the launch path — so one number meant attempts,
79
+ * the others meant successes, and nothing in the data said which. A connection metric that cannot
80
+ * express failure misses the only question worth asking: how often can people not get a browser?
81
+ */
82
+ recordConnectAttempt(kind: BrowserLaunchKind): (failure?: ConnectFailure) => void;
83
+ recordClient(name: string): void;
84
+ /**
85
+ * Roll the counters into the event payload. `final` marks a clean shutdown; a periodic flush passes
86
+ * false so a session killed before it can exit is not lost entirely (see the flush note in cli.ts).
87
+ */
88
+ summarize(final: boolean): SessionSummary;
89
+ /** True when nothing at all happened — a flush of an idle daemon is not worth an event. */
90
+ get empty(): boolean;
91
+ /** Zero the counters after a non-final flush so the next flush reports the NEXT window, not a total. */
92
+ reset(): void;
93
+ }
94
+ export declare const getSessionMetrics: (now?: () => number) => SessionMetrics;
95
+ /** Record one browser round-trip. Free-function form so the session hot path is a single call. */
96
+ export declare const recordBrowserLatency: (ms: number) => void;
97
+ /** Narrow-and-record one in-page failure. Keeps the session hot path to a single call. */
98
+ export declare const recordSdkFailure: (failure: {
99
+ site: string;
100
+ message: string;
101
+ }) => void;
102
+ /** Tests only — drop the singleton so each case starts from zero. */
103
+ export declare const resetSessionMetrics: () => void;
@@ -0,0 +1,329 @@
1
+ /**
2
+ * The in-process session accumulator — the reason Reticle's telemetry bill does not scale with how
3
+ * hard people use it.
4
+ *
5
+ * The old design emitted one event per MCP tool call. That reads as harmless until you multiply it
6
+ * out: a single agent verification loop is 50–200 tool calls, so a thousand daily users would push
7
+ * millions of events a day, and PostHog bills per ingested event. Worse, it was millions of events
8
+ * answering a question that ONE property answers better — `{reticle_act: 40, reticle_assert: 12}`
9
+ * tells you the session was a real verification loop, where 52 separate rows tell you only that 52
10
+ * things happened, with the shape scattered across them.
11
+ *
12
+ * So counts live here, in memory, and leave as a single `daemon_stopped` event.
13
+ *
14
+ * Everything recorded is a COUNT or a fingerprint. No tool arguments, no results, no selectors, no
15
+ * URLs, no error messages — the accumulator has no way to hold them, which is a stronger guarantee
16
+ * than a rule saying it shouldn't.
17
+ */
18
+ import { BrowserLaunchKind, } from '@reticlehq/core';
19
+ import { errorSkeleton, fingerprintError } from './error-fingerprint.js';
20
+ import { describeToolParams } from './argument-shape.js';
21
+ import { machineSnapshot } from './machine-snapshot.js';
22
+ /** Cap the distinct error shapes held in memory — a pathological loop must not grow unbounded. */
23
+ const MAX_ERROR_KINDS = 40;
24
+ /** Cap distinct MCP clients recorded; more than a handful on one daemon is already the story. */
25
+ const MAX_CLIENTS = 8;
26
+ /** Bounds on the parameter map. Our own schemas are already finite; these are a belt-and-braces cap. */
27
+ const MAX_PARAM_TOOLS = 60;
28
+ const MAX_PARAMS_PER_TOOL = 24;
29
+ /**
30
+ * How many recent tool calls to remember for the crash breadcrumb.
31
+ *
32
+ * Twelve is roughly one verification loop — enough to see the APPROACH (`snapshot → act → act →
33
+ * assert`) rather than just the last step, which is what turns "it crashed in act-tools" into "it
34
+ * crashed acting on a page it had just navigated away from". Names only, so this is a dozen short
35
+ * strings and costs nothing to hold.
36
+ */
37
+ const BREADCRUMB_LENGTH = 12;
38
+ /**
39
+ * Mutable counters for one daemon lifetime. A plain class, not a store: it is process-local, it never
40
+ * persists, and it dies with the daemon.
41
+ */
42
+ export class SessionMetrics {
43
+ #toolCalls = 0;
44
+ #toolErrors = 0;
45
+ #verifications = 0;
46
+ #toolCounts = new Map();
47
+ #toolParams = new Map();
48
+ /** Ring of the most recent tool NAMES — the agent's approach run, for a crash report. */
49
+ #breadcrumb = [];
50
+ /** The tool currently in flight, so a crash can name its trigger point. */
51
+ #inFlight;
52
+ #sdkFailures = 0;
53
+ #sdkFailureKinds = new Map();
54
+ #errorKinds = new Map();
55
+ #connections = new Map();
56
+ #toolTiming = new Map();
57
+ #busyMs = 0;
58
+ #concurrent = 0;
59
+ #peakConcurrent = 0;
60
+ #unknownToolCalls = 0;
61
+ #bugsFound = 0;
62
+ #browserMs = 0;
63
+ #browserCommands = 0;
64
+ #bugKinds = new Map();
65
+ /**
66
+ * Kinds already reported this session — the dedup key, deliberately SEPARATE from `#bugKinds`.
67
+ *
68
+ * `#bugKinds` is capped at MAX_ERROR_KINDS, and once full a genuinely new kind is never inserted,
69
+ * so asking it "have I seen this?" answers no forever and marks every later occurrence as first —
70
+ * inflating the distinct-defect count precisely where a session got interesting. This set is not
71
+ * capped: the kind vocabulary is a bounded enum plus oracle names, not user data.
72
+ */
73
+ #seenBugKinds = new Set();
74
+ #clients = new Set();
75
+ #startedAt;
76
+ #now;
77
+ /** Clock injected — this file must stay testable without a real one, per the repo's clock rule. */
78
+ constructor(now) {
79
+ this.#now = now;
80
+ this.#startedAt = now();
81
+ }
82
+ /**
83
+ * Record a call starting. Returns a function to call when it finishes — that closure is what makes
84
+ * timing correct under CONCURRENCY: several agents can be inside `runTool` at once, so a single
85
+ * "last start time" field would attribute one tool's duration to another. Each call carries its own.
86
+ */
87
+ startToolCall(tool, args) {
88
+ this.recordToolCall(tool, args);
89
+ this.#concurrent += 1;
90
+ if (this.#concurrent > this.#peakConcurrent)
91
+ this.#peakConcurrent = this.#concurrent;
92
+ let settled = false;
93
+ return (durationMs) => {
94
+ if (settled)
95
+ return; // a double-settle would corrupt the concurrency count
96
+ settled = true;
97
+ this.#concurrent = Math.max(0, this.#concurrent - 1);
98
+ this.#busyMs += durationMs;
99
+ const timing = this.#toolTiming.get(tool) ?? { totalMs: 0, maxMs: 0 };
100
+ timing.totalMs += durationMs;
101
+ timing.maxMs = Math.max(timing.maxMs, durationMs);
102
+ this.#toolTiming.set(tool, timing);
103
+ };
104
+ }
105
+ /**
106
+ * Time spent waiting on the BROWSER, across all commands.
107
+ *
108
+ * Compared against `busyMs` this answers the question a single total cannot: of the time an agent
109
+ * spends inside Reticle, how much is us and how much is the app under test? Without the split a
110
+ * 4-second `reticle_act` is unattributable — it could be our overhead or the app taking 4 seconds
111
+ * to settle, and those have opposite fixes. A high ratio here is a finding about their app; a low
112
+ * one alongside a high `busyMs` is a performance bug of ours.
113
+ */
114
+ recordBrowserLatency(ms) {
115
+ this.#browserMs += ms;
116
+ this.#browserCommands += 1;
117
+ }
118
+ /** A call for a tool that does not exist. Non-zero means our surface is confusing the agent. */
119
+ recordUnknownTool() {
120
+ this.#unknownToolCalls += 1;
121
+ }
122
+ recordToolCall(tool, args) {
123
+ this.#toolCalls += 1;
124
+ bump(this.#toolCounts, tool);
125
+ this.#inFlight = tool;
126
+ this.#breadcrumb.push(tool);
127
+ if (this.#breadcrumb.length > BREADCRUMB_LENGTH)
128
+ this.#breadcrumb.shift();
129
+ if (args === undefined)
130
+ return;
131
+ // Which PARAMETERS get used, per tool — names only (plus a short allowlist of our own enums).
132
+ // Bounded by our own schemas: a tool has a fixed handful of declared parameters, so this map
133
+ // cannot grow with traffic the way a value-carrying one would.
134
+ let perTool = this.#toolParams.get(tool);
135
+ if (perTool === undefined) {
136
+ if (this.#toolParams.size >= MAX_PARAM_TOOLS)
137
+ return;
138
+ perTool = new Map();
139
+ this.#toolParams.set(tool, perTool);
140
+ }
141
+ for (const param of describeToolParams(args)) {
142
+ if (perTool.size < MAX_PARAMS_PER_TOOL || perTool.has(param))
143
+ bump(perTool, param);
144
+ }
145
+ }
146
+ /**
147
+ * One failed tool call. Grouped by fingerprint, but stored WITH its skeleton message and the tool
148
+ * that produced it — a bare fingerprint could be ranked and never diagnosed, which made the top
149
+ * error in the dashboard a number nobody could act on.
150
+ */
151
+ recordToolError(message, tool) {
152
+ this.#toolErrors += 1;
153
+ const fingerprint = fingerprintError(message);
154
+ const existing = this.#errorKinds.get(fingerprint);
155
+ if (existing !== undefined) {
156
+ existing.count += 1;
157
+ return;
158
+ }
159
+ // Stop growing once the cap is hit; the tail is noise and the head is what gets fixed.
160
+ if (this.#errorKinds.size >= MAX_ERROR_KINDS)
161
+ return;
162
+ this.#errorKinds.set(fingerprint, {
163
+ fingerprint,
164
+ count: 1,
165
+ message: errorSkeleton(message),
166
+ ...(tool !== undefined ? { tool } : {}),
167
+ });
168
+ }
169
+ /**
170
+ * A failure reported by the IN-PAGE half of Reticle, over the bridge.
171
+ *
172
+ * Kept in its own bucket rather than mixed into tool errors: a broken observer and a failing tool
173
+ * call are different defects with different owners, and merging them would hide the browser-side
174
+ * one inside a much larger pile. Same treatment otherwise — fingerprinted, variables stripped.
175
+ */
176
+ recordSdkFailure(site, message) {
177
+ this.#sdkFailures += 1;
178
+ const fingerprint = fingerprintError(`${site}|${message}`);
179
+ const existing = this.#sdkFailureKinds.get(fingerprint);
180
+ if (existing !== undefined) {
181
+ existing.count += 1;
182
+ return;
183
+ }
184
+ if (this.#sdkFailureKinds.size >= MAX_ERROR_KINDS)
185
+ return;
186
+ this.#sdkFailureKinds.set(fingerprint, {
187
+ fingerprint,
188
+ count: 1,
189
+ message: errorSkeleton(message),
190
+ tool: site,
191
+ });
192
+ }
193
+ /** The agent's recent approach run + the call in flight — context for a crash report. */
194
+ get trail() {
195
+ return { breadcrumb: [...this.#breadcrumb], inFlight: this.#inFlight };
196
+ }
197
+ recordVerification() {
198
+ this.#verifications += 1;
199
+ }
200
+ /**
201
+ * One defect found in the app under test — the outcome number, kept broken down by kind.
202
+ *
203
+ * Returns TRUE when this kind is new to the session. Every occurrence is still counted; the flag
204
+ * only lets a reader separate "how many distinct defects" from "how often they were hit", which
205
+ * are different claims and were previously indistinguishable in the data.
206
+ */
207
+ recordBug(kind) {
208
+ this.#bugsFound += 1;
209
+ if (this.#bugKinds.size < MAX_ERROR_KINDS || this.#bugKinds.has(kind))
210
+ bump(this.#bugKinds, kind);
211
+ const first = !this.#seenBugKinds.has(kind);
212
+ this.#seenBugKinds.add(kind);
213
+ return first;
214
+ }
215
+ /**
216
+ * One connection ATTEMPT. Call before the attempt; settle it with the outcome.
217
+ *
218
+ * The previous version counted only successes, and counted them inconsistently — incrementing
219
+ * before the await on the CDP path and after it on the launch path — so one number meant attempts,
220
+ * the others meant successes, and nothing in the data said which. A connection metric that cannot
221
+ * express failure misses the only question worth asking: how often can people not get a browser?
222
+ */
223
+ recordConnectAttempt(kind) {
224
+ const stats = this.#connections.get(kind) ?? { attempts: 0, successes: 0 };
225
+ stats.attempts += 1;
226
+ this.#connections.set(kind, stats);
227
+ let settled = false;
228
+ return (failure) => {
229
+ if (settled)
230
+ return;
231
+ settled = true;
232
+ if (failure === undefined) {
233
+ stats.successes += 1;
234
+ return;
235
+ }
236
+ stats.failures ??= {};
237
+ stats.failures[failure] = (stats.failures[failure] ?? 0) + 1;
238
+ };
239
+ }
240
+ recordClient(name) {
241
+ if (this.#clients.size < MAX_CLIENTS)
242
+ this.#clients.add(name.slice(0, 64));
243
+ }
244
+ /**
245
+ * Roll the counters into the event payload. `final` marks a clean shutdown; a periodic flush passes
246
+ * false so a session killed before it can exit is not lost entirely (see the flush note in cli.ts).
247
+ */
248
+ summarize(final) {
249
+ const machine = machineSnapshot();
250
+ return {
251
+ durationMs: Math.max(0, this.#now() - this.#startedAt),
252
+ toolCalls: this.#toolCalls,
253
+ toolCounts: Object.fromEntries(this.#toolCounts),
254
+ toolErrors: this.#toolErrors,
255
+ ...(this.#errorKinds.size > 0 ? { errors: [...this.#errorKinds.values()] } : {}),
256
+ sdkFailures: this.#sdkFailures,
257
+ ...(this.#sdkFailureKinds.size > 0 ? { sdkErrors: [...this.#sdkFailureKinds.values()] } : {}),
258
+ verifications: this.#verifications,
259
+ bugsFound: this.#bugsFound,
260
+ ...(this.#bugKinds.size > 0 ? { bugKinds: Object.fromEntries(this.#bugKinds) } : {}),
261
+ ...(this.#toolParams.size > 0
262
+ ? {
263
+ toolParams: Object.fromEntries([...this.#toolParams].map(([tool, params]) => [tool, Object.fromEntries(params)])),
264
+ }
265
+ : {}),
266
+ ...(this.#connections.size > 0 ? { connections: Object.fromEntries(this.#connections) } : {}),
267
+ ...(this.#toolTiming.size > 0 ? { toolTiming: Object.fromEntries(this.#toolTiming) } : {}),
268
+ busyMs: this.#busyMs,
269
+ browserMs: this.#browserMs,
270
+ browserCommands: this.#browserCommands,
271
+ peakConcurrentTools: this.#peakConcurrent,
272
+ unknownToolCalls: this.#unknownToolCalls,
273
+ ...(machine !== undefined ? { machine } : {}),
274
+ ...(this.#clients.size > 0 ? { clients: [...this.#clients] } : {}),
275
+ final,
276
+ };
277
+ }
278
+ /** True when nothing at all happened — a flush of an idle daemon is not worth an event. */
279
+ get empty() {
280
+ return (this.#toolCalls === 0 &&
281
+ this.#verifications === 0 &&
282
+ this.#toolErrors === 0 &&
283
+ this.#bugsFound === 0 &&
284
+ this.#sdkFailures === 0);
285
+ }
286
+ /** Zero the counters after a non-final flush so the next flush reports the NEXT window, not a total. */
287
+ reset() {
288
+ this.#toolCalls = 0;
289
+ this.#toolErrors = 0;
290
+ this.#verifications = 0;
291
+ this.#toolCounts.clear();
292
+ this.#toolParams.clear();
293
+ this.#errorKinds.clear();
294
+ this.#sdkFailures = 0;
295
+ this.#sdkFailureKinds.clear();
296
+ this.#connections.clear();
297
+ this.#toolTiming.clear();
298
+ this.#busyMs = 0;
299
+ this.#browserMs = 0;
300
+ this.#browserCommands = 0;
301
+ this.#peakConcurrent = 0;
302
+ this.#unknownToolCalls = 0;
303
+ this.#bugsFound = 0;
304
+ this.#bugKinds.clear();
305
+ this.#seenBugKinds.clear();
306
+ }
307
+ }
308
+ function bump(map, key) {
309
+ map.set(key, (map.get(key) ?? 0) + 1);
310
+ }
311
+ /**
312
+ * The process-wide accumulator. A module singleton because the two call sites that feed it — the tool
313
+ * chokepoint and the MCP error boundary — are far apart in the graph and threading a metrics object
314
+ * through every ToolDeps would be a large, purely mechanical change for no added safety.
315
+ */
316
+ let current;
317
+ export const getSessionMetrics = (now = () => Date.now()) => (current ??= new SessionMetrics(now));
318
+ /** Record one browser round-trip. Free-function form so the session hot path is a single call. */
319
+ export const recordBrowserLatency = (ms) => {
320
+ getSessionMetrics().recordBrowserLatency(ms);
321
+ };
322
+ /** Narrow-and-record one in-page failure. Keeps the session hot path to a single call. */
323
+ export const recordSdkFailure = (failure) => {
324
+ getSessionMetrics().recordSdkFailure(failure.site, failure.message);
325
+ };
326
+ /** Tests only — drop the singleton so each case starts from zero. */
327
+ export const resetSessionMetrics = () => {
328
+ current = undefined;
329
+ };
@@ -1,23 +1,51 @@
1
- import { TelemetryEventKind } from '@reticlehq/core';
1
+ import { TelemetryEventKind, type Crash, type Feedback, type Identity, type BugFound, type InitOutcome, type McpConnection, type ProjectProfile, type SessionSummary, type TelemetryActor, type Verification, type VersionChange } from '@reticlehq/core';
2
2
  /** The current telemetry state and which control set it — what `reticle telemetry status` prints. */
3
- export declare const describeTelemetry: (env?: NodeJS.ProcessEnv, dir?: string) => {
3
+ export declare const describeTelemetry: (env?: NodeJS.ProcessEnv, dir?: string, cwd?: string) => {
4
4
  enabled: boolean;
5
5
  reason: string;
6
6
  policyUrl: string;
7
7
  };
8
8
  /** Persist (or lift) the machine-wide opt-out — `reticle telemetry disable` / `enable`. */
9
9
  export declare const setTelemetryEnabled: (enabled: boolean, dir?: string) => void;
10
+ /**
11
+ * The per-event extras — one optional block per event kind, so a payload can only ever be attached
12
+ * to the event it belongs to. `feedback` is the only one carrying author-written text, and it only
13
+ * ever arrives from `submitFeedback`, which redacts and validates it first. Nothing else may set it.
14
+ */
15
+ export interface TelemetryExtra {
16
+ detach?: boolean;
17
+ actor?: TelemetryActor;
18
+ /** `cli_command_run`: which subcommand a human ran. */
19
+ command?: string;
20
+ /** `cli_command_run`: flag NAMES present on the invocation. Never values. */
21
+ flags?: string[];
22
+ /** `daemon_stopped`: the whole session rolled up. Replaces the old per-tool-call event. */
23
+ session?: SessionSummary;
24
+ /** `project_profiled`: the project's shape and depth-of-use. */
25
+ project?: ProjectProfile;
26
+ /** `verification_completed`: one verdict. */
27
+ verification?: Verification;
28
+ /** `version_changed`: update or rollback. */
29
+ versionChange?: VersionChange;
30
+ /** `runtime_crashed`: a fingerprinted crash. */
31
+ crash?: Crash;
32
+ feedback?: Feedback;
33
+ /** `identified`: a self-declared identity. Opt-in, typed by a human, never inferred. */
34
+ identity?: Identity;
35
+ /** `mcp_client_connected`: a client attached, and whether it had attached before. */
36
+ connection?: McpConnection;
37
+ /** `init_completed`: how `reticle init` went. */
38
+ init?: InitOutcome;
39
+ /** `bug_found`: one defect Reticle found in the app under test. */
40
+ bug?: BugFound;
41
+ }
10
42
  export interface Telemetry {
11
43
  /**
12
44
  * Fire one event, non-blocking. `detach: true` hands the send to a disowned child so a short-lived
13
45
  * CLI process can exit immediately instead of waiting out the POST (use it from command entry
14
46
  * points; daemon-side events send in-process).
15
47
  */
16
- emit(kind: TelemetryEventKind, extra?: {
17
- sessionMs?: number;
18
- tool?: string;
19
- detach?: boolean;
20
- }): Promise<void>;
48
+ emit(kind: TelemetryEventKind, extra?: TelemetryExtra): Promise<void>;
21
49
  readonly enabled: boolean;
22
50
  /** True the very first run on this machine — the CLI emits INSTALL alongside the first INVOKE. */
23
51
  readonly firstRun: boolean;
@@ -38,4 +66,3 @@ export declare const createTelemetry: (opts: {
38
66
  }) => Telemetry;
39
67
  export declare const getTelemetry: () => Telemetry;
40
68
  export { TelemetryEventKind };
41
- //# sourceMappingURL=telemetry.d.ts.map