@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,313 @@
1
+ /**
2
+ * Anonymous adoption telemetry — the OSS runtime's ONLY phone-home for product metrics (DAU/WAU/MAU,
3
+ * invocations, sessions, installs, tool usage). It answers the "npm downloads don't count, show me
4
+ * platform usage" question without collecting anything personal:
5
+ *
6
+ * - identity is a random UUID minted locally at `~/.reticle/telemetry-id` (never derived from you),
7
+ * - the project is a one-way HASH of the cwd (counts DISTINCT projects, reveals none),
8
+ * - it is strictly opt-OUT: `RETICLE_TELEMETRY=0` or the `DO_NOT_TRACK` convention disables it,
9
+ * - it is best-effort and non-blocking: a send failure NEVER changes what the tool does.
10
+ *
11
+ * Events are `@reticlehq/core`'s `TelemetryEventSchema`, mapped at the wire into PostHog's capture
12
+ * format (https://posthog.com/docs/api/capture) — PostHog is the analytics backend until Reticle Cloud
13
+ * grows its own; a project API key is WRITE-ONLY by design, so embedding it in an OSS client is safe.
14
+ * Everything here is wrapped so a telemetry bug can never surface to a user — a broken metric must not
15
+ * break a verification.
16
+ */
17
+ import { spawn } from 'node:child_process';
18
+ import { randomUUID, createHash } from 'node:crypto';
19
+ import { readFileSync, writeFileSync, mkdirSync, existsSync, rmSync } from 'node:fs';
20
+ import { homedir, platform } from 'node:os';
21
+ import { join } from 'node:path';
22
+ import { TelemetryEventKind, TELEMETRY_EVENT_VERSION, ProjectIdSource, } from '@reticlehq/core';
23
+ import { SERVER_VERSION } from '../server-version.js';
24
+ const RETICLE_DIR = join(homedir(), '.reticle');
25
+ const ID_FILE = join(RETICLE_DIR, 'telemetry-id');
26
+ const NOTICE_FILE = join(RETICLE_DIR, 'telemetry-notice-shown');
27
+ /** Presence of this file = a persistent, machine-wide opt-out (`reticle telemetry disable`). */
28
+ const OPT_OUT_FILE = join(RETICLE_DIR, 'telemetry-opt-out');
29
+ /** Where the full disclosure lives — printed in the first-run notice and `reticle telemetry status`. */
30
+ const POLICY_URL = 'https://github.com/reticlehq/reticle/blob/main/docs/telemetry.md';
31
+ /** PostHog batch-capture endpoint (US cloud). `RETICLE_TELEMETRY_URL` overrides the host (EU/self-host). */
32
+ const DEFAULT_URL = 'https://us.i.posthog.com';
33
+ const TELEMETRY_PATH = '/batch/';
34
+ /**
35
+ * The write-only PostHog project key (safe to embed: it can only WRITE events, never read anything —
36
+ * PostHog's own docs ship it in client-side JS). `RETICLE_TELEMETRY_KEY` overrides it; empty disables.
37
+ */
38
+ const POSTHOG_KEY = 'phc_q4yCxKMXHfWQ43VAz4HxJXZFLqFi4nBbg5v3avemggYo';
39
+ /**
40
+ * Skip PostHog person-profile processing: our users are anonymous by construction (never $identify'd),
41
+ * so profiles buy nothing — and personless events are up to 4x cheaper while unique counts/retention
42
+ * still key on distinct_id.
43
+ */
44
+ const POSTHOG_PERSONLESS = { $process_person_profile: false };
45
+ const SEND_TIMEOUT_MS = 2000;
46
+ /**
47
+ * The sender a `detach: true` emit runs in a disowned child (argv: [url, body]) — an in-process fetch
48
+ * keeps Node's event loop alive until the POST finishes, which taxed every short-lived CLI command
49
+ * (`reticle version`/`gate`) ~800ms. Long-lived daemon events still send in-process: a spawn per tool
50
+ * call would be far heavier than a fetch inside an already-running server.
51
+ */
52
+ const DETACHED_SEND_SCRIPT = "fetch(process.argv[1],{method:'POST',headers:{'content-type':'application/json'}," +
53
+ `body:process.argv[2],signal:AbortSignal.timeout(${SEND_TIMEOUT_MS})})` +
54
+ '.catch(()=>{}).finally(()=>process.exit(0))';
55
+ /** Env var names — mirror cloud-sync's `RETICLE_*` convention. */
56
+ import { isReticleSourceCheckout } from './dev-repo.js';
57
+ import { gitFacts } from './git-facts.js';
58
+ const Env = {
59
+ DISABLE: 'RETICLE_TELEMETRY', // "0" / "false" / "off" → disabled
60
+ DO_NOT_TRACK: 'DO_NOT_TRACK', // the cross-tool opt-out convention (any truthy value)
61
+ URL: 'RETICLE_TELEMETRY_URL', // override the PostHog host (EU cloud / self-hosted)
62
+ KEY: 'RETICLE_TELEMETRY_KEY', // override the PostHog project key
63
+ CI: 'CI', // presence marks a CI environment
64
+ VITEST: 'VITEST', // set by vitest — unit tests must never phone home
65
+ };
66
+ const isDisabled = (env, cwd = process.cwd()) => {
67
+ const off = new Set(['0', 'false', 'off', 'no']);
68
+ if (off.has((env[Env.DISABLE] ?? '').toLowerCase()))
69
+ return true;
70
+ if (env[Env.VITEST] !== undefined)
71
+ return true; // a test run is not a user
72
+ // Developing Reticle is not using Reticle. The `.env` carrying RETICLE_TELEMETRY=0 is gitignored,
73
+ // so it only exists on the machine that made it — a fresh clone would phone home on a
74
+ // contributor's first `reticle serve`. The repo marker is committed, so this guarantee travels.
75
+ if (isReticleSourceCheckout(cwd))
76
+ return true;
77
+ const dnt = env[Env.DO_NOT_TRACK];
78
+ return typeof dnt === 'string' && dnt !== '' && dnt !== '0';
79
+ };
80
+ /** Read (or mint-and-persist) the anonymous machine id. `firstRun` is true the run that created it. */
81
+ const resolveIdentity = () => {
82
+ try {
83
+ if (existsSync(ID_FILE)) {
84
+ const id = readFileSync(ID_FILE, 'utf8').trim();
85
+ if (id.length > 0)
86
+ return { anonymousId: id, firstRun: false };
87
+ }
88
+ const id = randomUUID();
89
+ mkdirSync(RETICLE_DIR, { recursive: true });
90
+ writeFileSync(ID_FILE, id, 'utf8');
91
+ return { anonymousId: id, firstRun: true };
92
+ }
93
+ catch {
94
+ // Can't persist (read-only home, sandbox): still report, just as a fresh ephemeral id each time.
95
+ return { anonymousId: randomUUID(), firstRun: false };
96
+ }
97
+ };
98
+ /**
99
+ * One-way project fingerprint: distinct-count of this = "projects Reticle is used in", reveals nothing.
100
+ *
101
+ * Prefers a hash of the git ORIGIN over a hash of the cwd. The contract in `@reticlehq/core` always
102
+ * said "one-way hash of the git remote (or cwd)", but the implementation only ever hashed the path —
103
+ * which meant the same repo cloned by four teammates, or checked out twice on one machine, counted as
104
+ * four separate projects. That inflates the project count and, worse, makes team adoption look like
105
+ * unrelated individuals. Hashing the origin dedupes a real project down to one id across every clone.
106
+ *
107
+ * Still one-way, still non-reversible, and still exactly what the published policy describes: the
108
+ * remote URL itself never leaves the machine, only its SHA-256. The URL is normalized first (scheme,
109
+ * credentials, `.git` suffix and case removed) so `git@github.com:acme/web.git` and
110
+ * `https://github.com/Acme/web` are recognized as the same project rather than two.
111
+ */
112
+ const projectFingerprint = (cwd) => {
113
+ const { origin } = gitFacts(cwd);
114
+ return {
115
+ projectId: createHash('sha256')
116
+ .update(origin ?? cwd)
117
+ .digest('hex')
118
+ .slice(0, 32),
119
+ // Reported alongside so the analytics knows whether this id is comparable to another machine's.
120
+ source: origin !== undefined ? ProjectIdSource.GIT_ORIGIN : ProjectIdSource.CWD,
121
+ };
122
+ };
123
+ /** Print the opt-out notice exactly once per machine (honest disclosure, the OSS-trust bar). */
124
+ const showNoticeOnce = () => {
125
+ try {
126
+ if (existsSync(NOTICE_FILE))
127
+ return;
128
+ mkdirSync(RETICLE_DIR, { recursive: true });
129
+ writeFileSync(NOTICE_FILE, '1', 'utf8');
130
+ process.stderr.write('reticle: anonymous usage telemetry helps improve reticle — no code, no PII, ' +
131
+ `and your app's data never leaves your machine (${POLICY_URL}). ` +
132
+ 'Opt out any time: reticle telemetry disable\n');
133
+ }
134
+ catch {
135
+ /* notice is a courtesy; never fail on it */
136
+ }
137
+ };
138
+ /** The current telemetry state and which control set it — what `reticle telemetry status` prints. */
139
+ export const describeTelemetry = (env = process.env, dir = RETICLE_DIR, cwd = process.cwd()) => {
140
+ // Report the reason that ACTUALLY applies. Saying "environment variable" when the real cause is
141
+ // the source-checkout guard would send a contributor hunting for a variable that is not set.
142
+ if (isReticleSourceCheckout(cwd)) {
143
+ return {
144
+ enabled: false,
145
+ reason: 'this is a Reticle source checkout — developing it is not using it',
146
+ policyUrl: POLICY_URL,
147
+ };
148
+ }
149
+ if (isDisabled(env, cwd)) {
150
+ return { enabled: false, reason: 'disabled by environment variable', policyUrl: POLICY_URL };
151
+ }
152
+ if (existsSync(join(dir, 'telemetry-opt-out'))) {
153
+ return {
154
+ enabled: false,
155
+ reason: 'disabled via `reticle telemetry disable`',
156
+ policyUrl: POLICY_URL,
157
+ };
158
+ }
159
+ return {
160
+ enabled: true,
161
+ reason: 'anonymous usage metrics only — no code, no PII',
162
+ policyUrl: POLICY_URL,
163
+ };
164
+ };
165
+ /** Persist (or lift) the machine-wide opt-out — `reticle telemetry disable` / `enable`. */
166
+ export const setTelemetryEnabled = (enabled, dir = RETICLE_DIR) => {
167
+ const optOutFile = join(dir, 'telemetry-opt-out');
168
+ if (enabled) {
169
+ rmSync(optOutFile, { force: true });
170
+ return;
171
+ }
172
+ mkdirSync(dir, { recursive: true });
173
+ writeFileSync(optOutFile, '1', 'utf8');
174
+ };
175
+ const NOOP = { emit: async () => { }, enabled: false, firstRun: false };
176
+ /**
177
+ * Build the telemetry emitter for this process. Resolves identity + opt-out ONCE; each `emit` builds a
178
+ * fully-validated core event, maps it into PostHog capture shape, and fires a best-effort POST.
179
+ * `version` is the running reticle version (for the `version` dimension); `now`/`fetchImpl` are
180
+ * injected so this is testable without a clock or network.
181
+ */
182
+ export const createTelemetry = (opts) => {
183
+ const env = opts.env ?? process.env;
184
+ const cwd = opts.cwd ?? process.cwd();
185
+ if (isDisabled(env, cwd))
186
+ return NOOP;
187
+ try {
188
+ if (existsSync(OPT_OUT_FILE))
189
+ return NOOP; // the persistent `reticle telemetry disable` opt-out
190
+ }
191
+ catch {
192
+ /* unreadable home dir — fall through; the env-var opt-outs above still apply */
193
+ }
194
+ const apiKey = env[Env.KEY] ?? POSTHOG_KEY;
195
+ if (apiKey === '')
196
+ return NOOP; // no key baked in (dev/test build) — nowhere to send, stay silent
197
+ const now = opts.now ?? (() => Date.now());
198
+ const doFetch = opts.fetchImpl ?? fetch;
199
+ const url = `${(env[Env.URL] ?? DEFAULT_URL).replace(/\/+$/, '')}${TELEMETRY_PATH}`;
200
+ const ci = env[Env.CI] !== undefined && env[Env.CI] !== '';
201
+ const os = platform();
202
+ const { anonymousId, firstRun } = resolveIdentity();
203
+ /**
204
+ * One id per PROCESS, minted in memory and never persisted — which is exactly right: a daemon run
205
+ * IS the session, and a restarted daemon is genuinely a new one. Ephemeral by construction, so it
206
+ * adds no durable identifier to the machine.
207
+ */
208
+ const sessionId = randomUUID();
209
+ const { projectId, source: projectIdSource } = projectFingerprint(opts.cwd ?? process.cwd());
210
+ showNoticeOnce();
211
+ const spawnDetached = opts.spawnImpl ??
212
+ ((command, args) => {
213
+ spawn(command, args, { detached: true, stdio: 'ignore' }).unref();
214
+ });
215
+ const emit = async (kind, extra) => {
216
+ const event = {
217
+ v: TELEMETRY_EVENT_VERSION,
218
+ anonymousId,
219
+ sessionId,
220
+ projectId,
221
+ event: kind,
222
+ ts: now(),
223
+ version: opts.version,
224
+ ci,
225
+ os,
226
+ projectIdSource,
227
+ ...(extra?.actor !== undefined ? { actor: extra.actor } : {}),
228
+ ...(extra?.command !== undefined ? { command: extra.command } : {}),
229
+ ...(extra?.flags !== undefined ? { flags: extra.flags } : {}),
230
+ ...(extra?.session !== undefined ? { session: extra.session } : {}),
231
+ ...(extra?.project !== undefined ? { project: extra.project } : {}),
232
+ ...(extra?.verification !== undefined ? { verification: extra.verification } : {}),
233
+ ...(extra?.versionChange !== undefined ? { versionChange: extra.versionChange } : {}),
234
+ ...(extra?.crash !== undefined ? { crash: extra.crash } : {}),
235
+ ...(extra?.feedback !== undefined ? { feedback: extra.feedback } : {}),
236
+ ...(extra?.identity !== undefined ? { identity: extra.identity } : {}),
237
+ ...(extra?.connection !== undefined ? { connection: extra.connection } : {}),
238
+ ...(extra?.init !== undefined ? { init: extra.init } : {}),
239
+ ...(extra?.bug !== undefined ? { bug: extra.bug } : {}),
240
+ };
241
+ // Map the core contract onto PostHog's capture shape: id/name/time move up, the rest are properties.
242
+ // The feedback body is FLATTENED into `feedback_*` properties rather than sent as a nested object:
243
+ // PostHog filters and breakdowns operate on top-level properties, so a nested `feedback.stack`
244
+ // would be invisible to the exact "which stacks report the most bugs" question this exists to
245
+ // answer. One prefix keeps them grouped in the UI without a nested path.
246
+ const { anonymousId: distinctId, event: name, ts, sessionId: eventSessionId, feedback, session, project, verification, versionChange, crash, identity, connection, init, bug, ...rest } = event;
247
+ // `$session_id` is PostHog's OWN session property, so sending ours under that name lights up
248
+ // its built-in session views and funnels for free rather than requiring custom HogQL everywhere.
249
+ const properties = {
250
+ ...rest,
251
+ sessionId: eventSessionId,
252
+ $session_id: eventSessionId,
253
+ };
254
+ // Each block is flattened under its own prefix rather than nested. PostHog filters, breakdowns and
255
+ // insight builders all operate on TOP-LEVEL properties, so a nested `project.stack` is invisible to
256
+ // the exact "which stacks retain best" question these exist to answer — you would have to drop to
257
+ // raw HogQL for every chart. One prefix per block keeps them grouped in the property list without
258
+ // paying that cost. The two genuine maps (`toolCounts`, `errorKinds`) stay objects: their keys are
259
+ // open-ended, so flattening them would mint an unbounded number of property names, which is the one
260
+ // thing that actually degrades a PostHog project.
261
+ const blocks = {
262
+ feedback,
263
+ session,
264
+ project,
265
+ verification,
266
+ version: versionChange,
267
+ crash,
268
+ identity,
269
+ connection,
270
+ init,
271
+ bug,
272
+ };
273
+ for (const [prefix, block] of Object.entries(blocks)) {
274
+ for (const [key, value] of Object.entries(block ?? {})) {
275
+ properties[`${prefix}_${key}`] = value;
276
+ }
277
+ }
278
+ const body = JSON.stringify({
279
+ api_key: apiKey,
280
+ batch: [
281
+ {
282
+ event: name,
283
+ distinct_id: distinctId,
284
+ timestamp: new Date(ts).toISOString(),
285
+ properties: { ...properties, ...POSTHOG_PERSONLESS },
286
+ },
287
+ ],
288
+ });
289
+ try {
290
+ if (extra?.detach === true && opts.fetchImpl === undefined) {
291
+ spawnDetached(process.execPath, ['-e', DETACHED_SEND_SCRIPT, url, body]);
292
+ return;
293
+ }
294
+ await doFetch(url, {
295
+ method: 'POST',
296
+ headers: { 'content-type': 'application/json' },
297
+ body,
298
+ signal: AbortSignal.timeout(SEND_TIMEOUT_MS),
299
+ });
300
+ }
301
+ catch {
302
+ /* best-effort: a lost metric must never surface to the user */
303
+ }
304
+ };
305
+ return { emit, enabled: true, firstRun };
306
+ };
307
+ /**
308
+ * The process-wide emitter. One identity resolution + one opt-out check per process; both the CLI
309
+ * lifecycle (install/invoke/session) and the per-tool hook in `runTool` share it.
310
+ */
311
+ let singleton;
312
+ export const getTelemetry = () => (singleton ??= createTelemetry({ version: SERVER_VERSION }));
313
+ export { TelemetryEventKind };
@@ -21,4 +21,3 @@ export declare function isLoopbackHost(hostHeader: string | undefined): boolean;
21
21
  * non-loopback value fails, which is what kills a rebound `http://evil.com` page reading the plane.
22
22
  */
23
23
  export declare function isLocalWebOrigin(origin: string | undefined, referer: string | undefined): boolean;
24
- //# sourceMappingURL=token-auth.d.ts.map
@@ -68,4 +68,3 @@ export function isLocalWebOrigin(origin, referer) {
68
68
  }
69
69
  return true;
70
70
  }
71
- //# sourceMappingURL=token-auth.js.map
@@ -0,0 +1,23 @@
1
+ import type { ExpectedLink } from '../capsule/divergence.js';
2
+ import type { DivergenceCapsule } from '../capsule/capsule.js';
3
+ import type { ToolDeps } from './tool-kit.js';
4
+ interface CapsuleSaveInputs {
5
+ deps: ToolDeps;
6
+ verdict: {
7
+ pass: boolean;
8
+ failureReason?: string;
9
+ };
10
+ capsule?: DivergenceCapsule | undefined;
11
+ links: readonly ExpectedLink[];
12
+ args: Record<string, unknown>;
13
+ actResult: {
14
+ result?: unknown;
15
+ };
16
+ actedSource?: {
17
+ file: string;
18
+ line: number;
19
+ };
20
+ }
21
+ /** Returns the capsule id when one was written, or undefined when there was nothing to save. */
22
+ export declare function saveFailedAssertCapsule(inputs: CapsuleSaveInputs): Promise<string | undefined>;
23
+ export {};
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Persist a failed assertion as a replayable fail-to-pass capsule.
3
+ *
4
+ * : a red assertion is the ONE moment the evidence explaining it is in hand. Persist it as a
5
+ // replayable fail-to-pass capsule so the bug survives the turn — and becomes a regression flow
6
+ // the moment it goes green. Best-effort: capturing evidence must never fail the run that found it.
7
+ *
8
+ * Split out of act-tools.ts when it crossed the 600-line cap. The seam is real: this is the only
9
+ * part of the act path that writes to disk, and it is best-effort by design — capturing evidence
10
+ * must never fail the run that found it.
11
+ */
12
+ import { ActionType, AnchorKind } from '@reticlehq/core';
13
+ import { CapsuleStore, capsuleId } from '../capsule/capsule-store.js';
14
+ import { ReticleTool } from './tool-names.js';
15
+ import { asRecord, asString } from './tools-helpers.js';
16
+ /** Returns the capsule id when one was written, or undefined when there was nothing to save. */
17
+ export async function saveFailedAssertCapsule(inputs) {
18
+ const { deps, verdict, capsule, links, args, actResult, actedSource } = inputs;
19
+ if (verdict.pass || capsule === undefined)
20
+ return undefined;
21
+ const id = capsuleId(deps.now(), asString(args['ref']) ?? 'assert');
22
+ const expectedText = links
23
+ .map((l) => ('name' in l ? `${l.kind} ${String(l.name)}` : l.kind))
24
+ .join(' AND ');
25
+ const saved = await new CapsuleStore(deps.fs, deps.reticleRoot).save({
26
+ version: 1,
27
+ id,
28
+ createdAt: deps.now(),
29
+ origin: 'failed-assert',
30
+ expected: expectedText.length > 0 ? expectedText : 'declared consequence',
31
+ observed: capsule.firstDivergence?.observed ?? verdict.failureReason ?? 'not observed',
32
+ steps: [
33
+ {
34
+ tool: ReticleTool.ACT,
35
+ anchor: {
36
+ kind: AnchorKind.TESTID,
37
+ value: asString(asRecord(actResult.result)['testid']) ?? asString(args['ref']) ?? '',
38
+ // Carried so the saved capsule — which outlives this turn and becomes a regression flow
39
+ // when it goes green — still knows which file the failure came from.
40
+ ...(actedSource === undefined ? {} : { source: actedSource }),
41
+ },
42
+ action: (asString(args['action']) ?? ActionType.CLICK),
43
+ },
44
+ ],
45
+ });
46
+ return saved ? id : undefined;
47
+ }
@@ -0,0 +1,7 @@
1
+ import { ActionType } from '@reticlehq/core';
2
+ export declare function assertNotDestructive(action: ActionType, innerArgs: Record<string, unknown>, inspected: unknown): void;
3
+ /**
4
+ * A drag is judged on BOTH ends. Dropping a harmless row onto "Delete" is destructive, and the
5
+ * source alone never says so.
6
+ */
7
+ export declare function assertDragNotDestructive(innerArgs: Record<string, unknown>, from: unknown, to: unknown): void;
@@ -0,0 +1,44 @@
1
+ import { ActionType, DANGEROUS_ACTION_CONFIRM_ARG, isDangerousActionText } from '@reticlehq/core';
2
+ import { asRecord, asString } from './tools-helpers.js';
3
+ /**
4
+ * Refuse to drive a money-moving or destructive control by accident.
5
+ *
6
+ * A native click is indistinguishable from a user's, so an agent exploring an unfamiliar app can
7
+ * refund a payment or delete an account while "just looking". The guard reads every text surface the
8
+ * control exposes — its name, its text, its value, where it points, and the form it submits — because
9
+ * a button labelled only with an icon still says what it does through its `formAction`.
10
+ *
11
+ * Opt in per action with `args.confirmDangerous: true`. Deliberately a THROW rather than a warning:
12
+ * a caller that has not thought about it must not proceed by ignoring a field.
13
+ */
14
+ function descriptorText(value) {
15
+ const descriptor = asRecord(value);
16
+ return [
17
+ asString(descriptor['name']) ?? '',
18
+ asString(descriptor['text']) ?? '',
19
+ asString(descriptor['value']) ?? '',
20
+ asString(descriptor['href']) ?? '',
21
+ asString(descriptor['formAction']) ?? '',
22
+ asString(descriptor['formText']) ?? '',
23
+ ].join(' ');
24
+ }
25
+ export function assertNotDestructive(action, innerArgs, inspected) {
26
+ if (action !== ActionType.CLICK && action !== ActionType.DBLCLICK)
27
+ return;
28
+ if (innerArgs[DANGEROUS_ACTION_CONFIRM_ARG] === true)
29
+ return;
30
+ if (!isDangerousActionText(descriptorText(inspected)))
31
+ return;
32
+ throw new Error(`potentially destructive native action blocked; retry with args.${DANGEROUS_ACTION_CONFIRM_ARG}=true`);
33
+ }
34
+ /**
35
+ * A drag is judged on BOTH ends. Dropping a harmless row onto "Delete" is destructive, and the
36
+ * source alone never says so.
37
+ */
38
+ export function assertDragNotDestructive(innerArgs, from, to) {
39
+ if (innerArgs[DANGEROUS_ACTION_CONFIRM_ARG] === true)
40
+ return;
41
+ if (!isDangerousActionText(`${descriptorText(from)} ${descriptorText(to)}`))
42
+ return;
43
+ throw new Error(`potentially destructive native action blocked; retry with args.${DANGEROUS_ACTION_CONFIRM_ARG}=true`);
44
+ }
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Pure coercion + grading helpers behind the act tools.
3
+ *
4
+ * Split out when act-tools.ts crossed the 600-line cap. The seam is that nothing here touches a
5
+ * session, a command, or a tool definition — these are total functions over their arguments, which
6
+ * is why they can be tested without a browser and why they were the right thing to move.
7
+ */
8
+ import { ActionType } from '@reticlehq/core';
9
+ import type { ElementBox } from '../input/real-input.js';
10
+ import { HonestyGrade } from '../honesty/honesty.js';
11
+ import type { ExpectedLink } from '../capsule/divergence.js';
12
+ /** The strongest consequence grade a set of expected links proves (signal > net > state > presence). */
13
+ export declare function gradeOf(links: readonly ExpectedLink[]): HonestyGrade;
14
+ /** Narrow an INSPECT result's `box` into a positive-area ElementBox (else undefined). */
15
+ export declare function asBox(value: unknown): ElementBox | undefined;
16
+ /** Outcome of a real-input attempt — real success (result set) or synthetic with a reason. */
17
+ export declare function asActionType(value: unknown): ActionType | undefined;
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Pure coercion + grading helpers behind the act tools.
3
+ *
4
+ * Split out when act-tools.ts crossed the 600-line cap. The seam is that nothing here touches a
5
+ * session, a command, or a tool definition — these are total functions over their arguments, which
6
+ * is why they can be tested without a browser and why they were the right thing to move.
7
+ */
8
+ import { ActionType } from '@reticlehq/core';
9
+ import { HonestyGrade } from '../honesty/honesty.js';
10
+ import { asNumber, asRecord, asString } from './tools-helpers.js';
11
+ /** The strongest consequence grade a set of expected links proves (signal > net > state > presence). */
12
+ export function gradeOf(links) {
13
+ if (links.some((l) => l.kind === 'signal'))
14
+ return HonestyGrade.SIGNAL;
15
+ if (links.some((l) => l.kind === 'net'))
16
+ return HonestyGrade.NET;
17
+ if (links.some((l) => l.kind === 'state'))
18
+ return HonestyGrade.STATE;
19
+ return HonestyGrade.PRESENCE;
20
+ }
21
+ /** Narrow an INSPECT result's `box` into a positive-area ElementBox (else undefined). */
22
+ export function asBox(value) {
23
+ const b = asRecord(asRecord(value)['box']);
24
+ const x = asNumber(b['x']);
25
+ const y = asNumber(b['y']);
26
+ const w = asNumber(b['width']);
27
+ const h = asNumber(b['height']);
28
+ if (x === undefined || y === undefined || w === undefined || h === undefined)
29
+ return undefined;
30
+ if (w <= 0 || h <= 0)
31
+ return undefined; // zero-area (display:none) ⇒ native click would miss
32
+ return { x, y, width: w, height: h };
33
+ }
34
+ /** Outcome of a real-input attempt — real success (result set) or synthetic with a reason. */
35
+ export function asActionType(value) {
36
+ const raw = asString(value);
37
+ if (raw === undefined)
38
+ return undefined;
39
+ return Object.values(ActionType).includes(raw) ? raw : undefined;
40
+ }
@@ -1,3 +1,10 @@
1
1
  import { type ToolDef } from './tool-kit.js';
2
+ /**
3
+ * Narrow the wire's `action` to a real ActionType, or undefined.
4
+ *
5
+ * It used to be `asString(args['action']) ?? ''`, so an unknown or missing action became the empty
6
+ * string and travelled on — reaching the browser as a command it could not perform, and reported back
7
+ * as a generic failure rather than "that is not an action". Validate at the boundary, per the project's
8
+ * unknown-plus-narrowing rule, so a typo is rejected where it can still be explained.
9
+ */
2
10
  export declare const ACT_TOOLS: ToolDef[];
3
- //# sourceMappingURL=act-tools.d.ts.map