@reticlehq/server 3.6.0 → 3.7.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 (614) hide show
  1. package/SKILL.md +122 -123
  2. package/dist/command/cli/adhoc-suite.d.ts +14 -0
  3. package/dist/command/cli/adhoc-suite.js +42 -7
  4. package/dist/command/cli/adhoc-verdict.d.ts +18 -2
  5. package/dist/command/cli/adhoc-verdict.js +70 -6
  6. package/dist/command/cli/answers/gate-exit.d.ts +23 -0
  7. package/dist/command/cli/answers/gate-exit.js +45 -0
  8. package/dist/command/cli/answers/gate-hook-message.d.ts +2 -0
  9. package/dist/command/cli/answers/gate-hook-message.js +3 -1
  10. package/dist/command/cli/auth/device-flow.d.ts +13 -2
  11. package/dist/command/cli/auth/device-flow.js +17 -0
  12. package/dist/command/cli/cli-doctor.js +14 -0
  13. package/dist/command/cli/cli-flow-commands.d.ts +0 -11
  14. package/dist/command/cli/cli-flow-commands.js +28 -105
  15. package/dist/command/cli/cli-kill.js +3 -2
  16. package/dist/command/cli/cli-parse-grammar.d.ts +24 -0
  17. package/dist/command/cli/cli-parse-grammar.js +75 -0
  18. package/dist/command/cli/cli-parse-verify.d.ts +2 -0
  19. package/dist/command/cli/cli-parse-verify.js +18 -0
  20. package/dist/command/cli/cli-parse.d.ts +19 -28
  21. package/dist/command/cli/cli-parse.js +82 -182
  22. package/dist/command/cli/cli-update-commands.d.ts +1 -1
  23. package/dist/command/cli/cli-update-commands.js +61 -9
  24. package/dist/command/cli/cli-usage.d.ts +33 -0
  25. package/dist/command/cli/cli-usage.js +287 -0
  26. package/dist/command/cli/cli-verify.d.ts +34 -4
  27. package/dist/command/cli/cli-verify.js +81 -12
  28. package/dist/command/cli/cloud-cli.d.ts +13 -0
  29. package/dist/command/cli/cloud-cli.js +145 -333
  30. package/dist/command/cli/cloud-kit.d.ts +12 -0
  31. package/dist/command/cli/cloud-kit.js +41 -2
  32. package/dist/command/cli/cloud-link.d.ts +57 -0
  33. package/dist/command/cli/cloud-link.js +308 -0
  34. package/dist/command/cli/cloud-login.d.ts +15 -1
  35. package/dist/command/cli/cloud-login.js +67 -13
  36. package/dist/command/cli/context-command.d.ts +1 -0
  37. package/dist/command/cli/context-command.js +33 -0
  38. package/dist/command/cli/daemon-start-options.d.ts +3 -0
  39. package/dist/command/cli/daemon-start-options.js +24 -3
  40. package/dist/command/cli/doctor/doctor-coverage-line.d.ts +2 -0
  41. package/dist/command/cli/doctor/doctor-coverage-line.js +47 -0
  42. package/dist/command/cli/doctor/doctor-project-line.d.ts +0 -12
  43. package/dist/command/cli/doctor/doctor-project-line.js +5 -4
  44. package/dist/command/cli/doctor/doctor-rows.d.ts +6 -0
  45. package/dist/command/cli/doctor/doctor-rows.js +6 -0
  46. package/dist/command/cli/doctor/doctor-signing-line.d.ts +38 -0
  47. package/dist/command/cli/doctor/doctor-signing-line.js +114 -0
  48. package/dist/command/cli/known-regression.d.ts +13 -0
  49. package/dist/command/cli/known-regression.js +34 -0
  50. package/dist/command/cli/launch/sdk-version-match.d.ts +12 -0
  51. package/dist/command/cli/launch/sdk-version-match.js +25 -0
  52. package/dist/command/cli/lifecycle/daemon-lifecycle.js +11 -2
  53. package/dist/command/cli/mcp-command.d.ts +6 -0
  54. package/dist/command/cli/mcp-command.js +13 -5
  55. package/dist/command/cli/ports/port-holder.js +1 -1
  56. package/dist/command/cli/project-name.d.ts +29 -1
  57. package/dist/command/cli/project-name.js +107 -2
  58. package/dist/command/cli/setup-mcp-cli.d.ts +17 -1
  59. package/dist/command/cli/setup-mcp-cli.js +29 -8
  60. package/dist/command/cli/status/status-lines.d.ts +1 -0
  61. package/dist/command/cli/status/status-lines.js +47 -2
  62. package/dist/command/cli/status/workspace-links.d.ts +10 -0
  63. package/dist/command/cli/status/workspace-links.js +29 -0
  64. package/dist/command/cli/try-command.d.ts +96 -0
  65. package/dist/command/cli/try-command.js +362 -0
  66. package/dist/command/cli/tutorial.d.ts +0 -100
  67. package/dist/command/cli/tutorial.js +0 -178
  68. package/dist/command/cli/verify-results.d.ts +19 -0
  69. package/dist/command/cli/verify-results.js +29 -0
  70. package/dist/command/cli-onboarding.d.ts +0 -11
  71. package/dist/command/cli-onboarding.js +0 -15
  72. package/dist/command/cli.d.ts +14 -0
  73. package/dist/command/cli.js +103 -83
  74. package/dist/command/daemon/daemon-resilience.js +4 -4
  75. package/dist/command/daemon/daemon-resolve.d.ts +9 -1
  76. package/dist/command/daemon/daemon-resolve.js +49 -10
  77. package/dist/command/setup/bringup/bridge-port.d.ts +3 -1
  78. package/dist/command/setup/bringup/bridge-port.js +13 -3
  79. package/dist/command/setup/bringup/dev-server-log-cap.js +2 -0
  80. package/dist/command/setup/bringup/ensure-daemon.js +9 -2
  81. package/dist/command/setup/init/agent-restart.d.ts +23 -0
  82. package/dist/command/setup/init/agent-restart.js +28 -0
  83. package/dist/command/setup/init/init-port.d.ts +10 -1
  84. package/dist/command/setup/init/init-port.js +22 -2
  85. package/dist/command/setup/init/init-runtime.d.ts +12 -2
  86. package/dist/command/setup/init/init-runtime.js +96 -37
  87. package/dist/command/setup/node-effects.d.ts +2 -0
  88. package/dist/command/setup/node-effects.js +36 -8
  89. package/dist/command/setup/probe/existing-app.d.ts +12 -0
  90. package/dist/command/setup/probe/existing-app.js +14 -0
  91. package/dist/command/setup/remaining-steps.js +1 -1
  92. package/dist/command/setup/run-setup.d.ts +29 -9
  93. package/dist/command/setup/run-setup.js +34 -28
  94. package/dist/command/setup/setup-command.d.ts +23 -0
  95. package/dist/command/setup/setup-command.js +57 -4
  96. package/dist/command/setup/setup-mcp.js +25 -2
  97. package/dist/command/setup/tauri-signing.d.ts +19 -0
  98. package/dist/command/setup/tauri-signing.js +79 -0
  99. package/dist/command/setup/terminal/listeners.d.ts +10 -1
  100. package/dist/command/setup/terminal/listeners.js +37 -6
  101. package/dist/command/update/update-nudge.d.ts +9 -0
  102. package/dist/command/update/update-nudge.js +1 -1
  103. package/dist/command/update/updater.js +11 -15
  104. package/dist/command/version/version-nudge.js +3 -0
  105. package/dist/command/version/version-skew.d.ts +20 -1
  106. package/dist/command/version/version-skew.js +38 -2
  107. package/dist/features/crawl/crawl.js +14 -1
  108. package/dist/features/exhaust/ledger.d.ts +14 -14
  109. package/dist/features/harness/drive-report.d.ts +39 -5
  110. package/dist/features/harness/drive-report.js +271 -54
  111. package/dist/features/harness/drive-runs.d.ts +120 -0
  112. package/dist/features/harness/drive-runs.js +289 -0
  113. package/dist/features/harness/drivers.d.ts +1 -1
  114. package/dist/features/harness/drivers.js +1 -1
  115. package/dist/features/harness/explore/console-pages.d.ts +15 -0
  116. package/dist/features/harness/explore/console-pages.js +146 -0
  117. package/dist/features/harness/explore/disparity.d.ts +19 -0
  118. package/dist/features/harness/explore/disparity.js +71 -0
  119. package/dist/features/harness/explore/fake-app.d.ts +16 -0
  120. package/dist/features/harness/explore/fake-app.js +49 -0
  121. package/dist/features/harness/explore/goal-search.d.ts +26 -0
  122. package/dist/features/harness/explore/goal-search.js +144 -0
  123. package/dist/features/harness/explore/page-tree.d.ts +49 -0
  124. package/dist/features/harness/explore/page-tree.js +148 -0
  125. package/dist/features/harness/explore/site-map.d.ts +34 -0
  126. package/dist/features/harness/explore/site-map.js +150 -0
  127. package/dist/features/harness/goals.d.ts +68 -7
  128. package/dist/features/harness/goals.js +289 -36
  129. package/dist/features/harness/harness.d.ts +30 -1
  130. package/dist/features/harness/harness.js +141 -7
  131. package/dist/features/harness/platform/local-apps.d.ts +36 -3
  132. package/dist/features/harness/platform/local-apps.js +81 -5
  133. package/dist/features/harness/platform/persona-credentials.d.ts +20 -0
  134. package/dist/features/harness/platform/persona-credentials.js +69 -0
  135. package/dist/features/harness/platform/platform-drives.d.ts +61 -0
  136. package/dist/features/harness/platform/platform-drives.js +114 -0
  137. package/dist/features/harness/platform/refusal.d.ts +52 -0
  138. package/dist/features/harness/platform/refusal.js +71 -0
  139. package/dist/features/harness/platform/remote-drive.d.ts +8 -2
  140. package/dist/features/harness/platform/remote-drive.js +22 -9
  141. package/dist/features/harness/platform/script.d.ts +57 -11
  142. package/dist/features/harness/platform/script.js +144 -12
  143. package/dist/features/harness/platform/server-driver.d.ts +17 -4
  144. package/dist/features/harness/platform/server-driver.js +29 -26
  145. package/dist/features/harness/platform-config.d.ts +38 -5
  146. package/dist/features/harness/platform-config.js +93 -8
  147. package/dist/features/harness/route-guess.d.ts +13 -0
  148. package/dist/features/harness/route-guess.js +49 -0
  149. package/dist/features/harness/script/script-run.d.ts +30 -1
  150. package/dist/features/harness/script/script-run.js +355 -48
  151. package/dist/features/license/license.d.ts +2 -2
  152. package/dist/features/visual/step-shots.d.ts +31 -0
  153. package/dist/features/visual/step-shots.js +231 -0
  154. package/dist/features/visual/visual-tools.js +22 -14
  155. package/dist/hooks/client-directory.d.ts +18 -0
  156. package/dist/hooks/client-directory.js +57 -0
  157. package/dist/hooks/coding-agents.d.ts +34 -0
  158. package/dist/hooks/coding-agents.js +117 -0
  159. package/dist/hooks/driven-by.d.ts +21 -2
  160. package/dist/hooks/driven-by.js +42 -2
  161. package/dist/hooks/hook-bus.d.ts +4 -0
  162. package/dist/hooks/hook-bus.js +18 -0
  163. package/dist/index.d.ts +1 -0
  164. package/dist/index.js +26 -183
  165. package/dist/judgement/capsule/capsule-store.d.ts +2 -2
  166. package/dist/judgement/capsule/causal-summary.d.ts +15 -1
  167. package/dist/judgement/capsule/causal-summary.js +33 -0
  168. package/dist/judgement/runs/artifact/build-verification-run.d.ts +1 -1
  169. package/dist/judgement/runs/artifact/build-verification-run.js +20 -4
  170. package/dist/judgement/runs/artifact/gap-summary.d.ts +0 -18
  171. package/dist/judgement/runs/artifact/gap-summary.js +12 -3
  172. package/dist/judgement/runs/artifact/replay-mapping.js +25 -9
  173. package/dist/judgement/runs/artifact/run-store.d.ts +13 -1
  174. package/dist/judgement/runs/artifact/run-store.js +175 -8
  175. package/dist/judgement/runs/context-tools.js +59 -1
  176. package/dist/judgement/runs/default-run-id.d.ts +3 -0
  177. package/dist/judgement/runs/default-run-id.js +16 -0
  178. package/dist/judgement/runs/drive-run.d.ts +53 -5
  179. package/dist/judgement/runs/drive-run.js +234 -20
  180. package/dist/judgement/runs/resume.d.ts +44 -0
  181. package/dist/judgement/runs/resume.js +137 -0
  182. package/dist/judgement/runs/reticle-runner.js +5 -2
  183. package/dist/judgement/runs/runner-port.d.ts +5 -1
  184. package/dist/judgement/runs/runner-port.js +8 -2
  185. package/dist/judgement/runs/verification-sync.d.ts +2 -0
  186. package/dist/judgement/runs/verification-sync.js +36 -15
  187. package/dist/language/flows/decision.js +2 -1
  188. package/dist/language/flows/fields/flow-secret-field.d.ts +12 -0
  189. package/dist/language/flows/fields/flow-secret-field.js +25 -2
  190. package/dist/language/flows/flow-anchor.d.ts +7 -2
  191. package/dist/language/flows/flow-anchor.js +10 -3
  192. package/dist/language/flows/flow-intent.d.ts +1 -0
  193. package/dist/language/flows/flow-journey.d.ts +6 -0
  194. package/dist/language/flows/flow-journey.js +20 -0
  195. package/dist/language/flows/flow-learning.d.ts +4 -0
  196. package/dist/language/flows/flow-learning.js +37 -3
  197. package/dist/language/flows/flow-replay-run.js +16 -18
  198. package/dist/language/flows/flow-replay-types.d.ts +1 -1
  199. package/dist/language/flows/flow-replay.d.ts +18 -1
  200. package/dist/language/flows/flow-replay.js +22 -7
  201. package/dist/language/flows/flow-result.d.ts +22 -1
  202. package/dist/language/flows/flow-result.js +47 -2
  203. package/dist/language/flows/flow-step-runners.d.ts +2 -0
  204. package/dist/language/flows/flow-step-runners.js +12 -6
  205. package/dist/language/flows/flow-store-for-session.js +5 -1
  206. package/dist/language/flows/flow-tools.d.ts +10 -0
  207. package/dist/language/flows/flow-tools.js +61 -62
  208. package/dist/language/flows/flows.d.ts +16 -1
  209. package/dist/language/flows/flows.js +69 -10
  210. package/dist/language/flows/narrow-write.d.ts +7 -0
  211. package/dist/language/flows/narrow-write.js +36 -1
  212. package/dist/language/flows/recording/recording-backtrack.js +14 -1
  213. package/dist/language/flows/recording/tape/recordings.d.ts +29 -1
  214. package/dist/language/flows/recording/tape/recordings.js +60 -10
  215. package/dist/language/flows/replay.js +29 -6
  216. package/dist/language/flows/single-replay.d.ts +7 -0
  217. package/dist/language/flows/single-replay.js +26 -0
  218. package/dist/language/flows/verify-change-tools.d.ts +1 -0
  219. package/dist/language/flows/verify-change-tools.js +200 -193
  220. package/dist/memory/cloud/cloud-config.d.ts +10 -1
  221. package/dist/memory/cloud/cloud-config.js +19 -5
  222. package/dist/memory/cloud/cloud-sync.js +3 -3
  223. package/dist/memory/cloud/harness-config.d.ts +49 -0
  224. package/dist/memory/cloud/harness-config.js +16 -20
  225. package/dist/memory/cloud/memory-scope.d.ts +17 -0
  226. package/dist/memory/cloud/memory-scope.js +22 -0
  227. package/dist/memory/cloud/sync-cycle.d.ts +32 -4
  228. package/dist/memory/cloud/sync-cycle.js +113 -12
  229. package/dist/memory/cloud/sync-daemon.d.ts +11 -0
  230. package/dist/memory/cloud/sync-daemon.js +114 -4
  231. package/dist/memory/cloud/sync-disk.js +26 -2
  232. package/dist/memory/cloud/sync-screenshots.d.ts +32 -0
  233. package/dist/memory/cloud/sync-screenshots.js +105 -0
  234. package/dist/memory/cloud/unsynced-roots.d.ts +47 -0
  235. package/dist/memory/cloud/unsynced-roots.js +166 -0
  236. package/dist/memory/impact/account-watch.d.ts +16 -1
  237. package/dist/memory/impact/account-watch.js +26 -1
  238. package/dist/memory/impact/impact-store.d.ts +1 -4
  239. package/dist/memory/impact/impact-store.js +32 -42
  240. package/dist/memory/intent/inline-intent.d.ts +1 -0
  241. package/dist/memory/intent/intent-shard-store.js +16 -4
  242. package/dist/memory/intent/intent-shard.d.ts +12 -0
  243. package/dist/memory/intent/intent-store.d.ts +1 -0
  244. package/dist/memory/intent/intent-tools.js +42 -2
  245. package/dist/memory/intent/open-intents.d.ts +6 -0
  246. package/dist/memory/intent/open-intents.js +10 -1
  247. package/dist/memory/intent/settled-words.d.ts +24 -0
  248. package/dist/memory/intent/settled-words.js +130 -0
  249. package/dist/memory/journal/drive-flow.d.ts +16 -0
  250. package/dist/memory/journal/drive-flow.js +34 -2
  251. package/dist/memory/journal/drive-run-flush.d.ts +2 -0
  252. package/dist/memory/journal/drive-run-flush.js +20 -5
  253. package/dist/memory/journal/journal-recorder.js +46 -3
  254. package/dist/memory/journal/on-disk/retention.d.ts +5 -0
  255. package/dist/memory/journal/on-disk/retention.js +27 -2
  256. package/dist/memory/journal/on-disk/workspace-tiers.js +2 -0
  257. package/dist/memory/journal/session-end.d.ts +15 -1
  258. package/dist/memory/journal/session-end.js +38 -7
  259. package/dist/memory/project/artifact-root-resolver.js +33 -5
  260. package/dist/memory/project/artifact-root.d.ts +4 -3
  261. package/dist/memory/project/artifact-root.js +2 -2
  262. package/dist/memory/project/dir/reticle-dir.d.ts +14 -0
  263. package/dist/memory/project/dir/reticle-dir.js +23 -2
  264. package/dist/memory/project/link-directory.d.ts +15 -0
  265. package/dist/memory/project/link-directory.js +44 -0
  266. package/dist/memory/project/root-claims.d.ts +6 -0
  267. package/dist/memory/project/root-claims.js +39 -0
  268. package/dist/memory/project/session-root.d.ts +2 -0
  269. package/dist/memory/project/session-root.js +9 -1
  270. package/dist/memory/project/sync-status.d.ts +46 -0
  271. package/dist/memory/project/sync-status.js +135 -1
  272. package/dist/memory/recall/memory-tools.js +46 -3
  273. package/dist/memory/recall/platform-memory.d.ts +34 -0
  274. package/dist/memory/recall/platform-memory.js +139 -0
  275. package/dist/memory/recall/project-memory.js +36 -8
  276. package/dist/portal/bridge/bridge.d.ts +9 -5
  277. package/dist/portal/bridge/bridge.js +66 -23
  278. package/dist/portal/bridge/harness-request.d.ts +23 -0
  279. package/dist/portal/bridge/harness-request.js +27 -0
  280. package/dist/portal/bridge/wrong-path.d.ts +17 -0
  281. package/dist/portal/bridge/wrong-path.js +35 -0
  282. package/dist/portal/input/network-mock-tools.js +11 -2
  283. package/dist/portal/input/real-input.d.ts +2 -0
  284. package/dist/portal/input/real-input.js +13 -10
  285. package/dist/portal/pool/browser-pool.d.ts +48 -0
  286. package/dist/portal/pool/browser-pool.js +120 -2
  287. package/dist/portal/pool/context-permissions.d.ts +33 -0
  288. package/dist/portal/pool/context-permissions.js +33 -0
  289. package/dist/portal/pool/lease-marker-stamp.d.ts +23 -0
  290. package/dist/portal/pool/lease-marker-stamp.js +49 -0
  291. package/dist/portal/pool/playwright-launcher.d.ts +27 -5
  292. package/dist/portal/pool/playwright-launcher.js +59 -14
  293. package/dist/portal/pool/pool-contract.d.ts +21 -1
  294. package/dist/portal/session/agent-link.d.ts +8 -0
  295. package/dist/portal/session/agent-link.js +17 -0
  296. package/dist/portal/session/command-payload.js +6 -1
  297. package/dist/portal/session/daemon-answers.d.ts +3 -3
  298. package/dist/portal/session/daemon-answers.js +4 -2
  299. package/dist/portal/session/dev-server/dev-command.d.ts +9 -0
  300. package/dist/portal/session/dev-server/dev-command.js +27 -1
  301. package/dist/portal/session/facts/observed-state.d.ts +16 -18
  302. package/dist/portal/session/facts/observed-state.js +46 -3
  303. package/dist/portal/session/human/live-control.d.ts +9 -2
  304. package/dist/portal/session/human/live-control.js +12 -3
  305. package/dist/portal/session/live-control-tools.js +82 -13
  306. package/dist/portal/session/narration-args.d.ts +5 -0
  307. package/dist/portal/session/narration-args.js +17 -0
  308. package/dist/portal/session/no-session-diagnosis.d.ts +1 -1
  309. package/dist/portal/session/no-session-diagnosis.js +31 -9
  310. package/dist/portal/session/no-session-next-action.d.ts +20 -0
  311. package/dist/portal/session/no-session-next-action.js +134 -61
  312. package/dist/portal/session/no-session-watch.js +179 -22
  313. package/dist/portal/session/presence/session-lease.js +1 -1
  314. package/dist/portal/session/recorded-gaps.d.ts +97 -0
  315. package/dist/portal/session/recorded-gaps.js +251 -0
  316. package/dist/portal/session/session-health.d.ts +11 -0
  317. package/dist/portal/session/session-health.js +3 -1
  318. package/dist/portal/session/session-info.js +2 -1
  319. package/dist/portal/session/session-manager.d.ts +18 -0
  320. package/dist/portal/session/session-manager.js +54 -3
  321. package/dist/portal/session/session-successor.d.ts +8 -0
  322. package/dist/portal/session/session-successor.js +1 -1
  323. package/dist/portal/session/session.d.ts +15 -28
  324. package/dist/portal/session/session.js +60 -61
  325. package/dist/portal/session/timing/command-timeout.js +25 -1
  326. package/dist/portal/session/timing/wall-clock.d.ts +1 -1
  327. package/dist/portal/session/timing/wall-clock.js +1 -1
  328. package/dist/portal/session/zero-install-first-call.d.ts +31 -0
  329. package/dist/portal/session/zero-install-first-call.js +88 -0
  330. package/dist/start-options.d.ts +7 -1
  331. package/dist/start-wiring.d.ts +63 -0
  332. package/dist/start-wiring.js +169 -0
  333. package/dist/status-payload.d.ts +13 -1
  334. package/dist/status-payload.js +13 -1
  335. package/dist/surface/http-server.js +7 -1
  336. package/dist/surface/mcp/attach-memory.d.ts +1 -0
  337. package/dist/surface/mcp/attach-memory.js +12 -1
  338. package/dist/surface/mcp/mcp-proxy.d.ts +4 -0
  339. package/dist/surface/mcp/mcp-proxy.js +29 -8
  340. package/dist/surface/mcp/mcp.d.ts +23 -0
  341. package/dist/surface/mcp/mcp.js +34 -4
  342. package/dist/surface/mcp/proxy/drive-calls.d.ts +10 -0
  343. package/dist/surface/mcp/proxy/drive-calls.js +27 -0
  344. package/dist/surface/mcp/proxy/mcp-post-transport.js +5 -0
  345. package/dist/surface/mcp/server-instructions.js +22 -14
  346. package/dist/surface/mcp/shared-params.js +1 -1
  347. package/dist/surface/mcp/surface-vocabulary.d.ts +2 -0
  348. package/dist/surface/mcp/surface-vocabulary.js +1 -0
  349. package/dist/surface/tools/account-tool.d.ts +22 -0
  350. package/dist/surface/tools/account-tool.js +157 -0
  351. package/dist/surface/tools/act/act-danger.d.ts +11 -0
  352. package/dist/surface/tools/act/act-danger.js +38 -1
  353. package/dist/surface/tools/act/act-observation.d.ts +33 -0
  354. package/dist/surface/tools/act/act-observation.js +57 -0
  355. package/dist/surface/tools/act/act-preflight.js +25 -2
  356. package/dist/surface/tools/act/act-target.js +8 -3
  357. package/dist/surface/tools/act/resolve-target.d.ts +1 -1
  358. package/dist/surface/tools/act/resolve-target.js +18 -3
  359. package/dist/surface/tools/act/screen-request.d.ts +34 -0
  360. package/dist/surface/tools/act/screen-request.js +113 -0
  361. package/dist/surface/tools/act/sequence-grade.d.ts +8 -0
  362. package/dist/surface/tools/act/sequence-grade.js +13 -2
  363. package/dist/surface/tools/act-sequence-tool.js +136 -27
  364. package/dist/surface/tools/act-tools.d.ts +0 -9
  365. package/dist/surface/tools/act-tools.js +48 -34
  366. package/dist/surface/tools/agent/app-notes-learning.d.ts +7 -0
  367. package/dist/surface/tools/agent/app-notes-learning.js +80 -0
  368. package/dist/surface/tools/agent/app-notes.d.ts +4 -0
  369. package/dist/surface/tools/agent/app-notes.js +48 -0
  370. package/dist/surface/tools/agent/build-staleness.d.ts +7 -0
  371. package/dist/surface/tools/agent/build-staleness.js +62 -0
  372. package/dist/surface/tools/agent/compact-envelope.d.ts +80 -0
  373. package/dist/surface/tools/agent/compact-envelope.js +374 -0
  374. package/dist/surface/tools/agent/for-the-agent.d.ts +12 -0
  375. package/dist/surface/tools/agent/for-the-agent.js +44 -0
  376. package/dist/surface/tools/agent/notices.d.ts +50 -0
  377. package/dist/surface/tools/agent/notices.js +152 -0
  378. package/dist/surface/tools/agent/reteach.d.ts +11 -0
  379. package/dist/surface/tools/agent/reteach.js +50 -0
  380. package/dist/surface/tools/args/alias-args.d.ts +5 -0
  381. package/dist/surface/tools/args/alias-args.js +10 -0
  382. package/dist/surface/tools/args/confirm-dangerous-arg.d.ts +6 -0
  383. package/dist/surface/tools/args/confirm-dangerous-arg.js +6 -0
  384. package/dist/surface/tools/assert/assert-source.d.ts +15 -0
  385. package/dist/surface/tools/assert/assert-source.js +40 -0
  386. package/dist/surface/tools/assert/assert-verdict.js +25 -15
  387. package/dist/surface/tools/browser-tools.js +43 -1
  388. package/dist/surface/tools/chat-drives.d.ts +75 -0
  389. package/dist/surface/tools/chat-drives.js +265 -21
  390. package/dist/surface/tools/coverage-tools.d.ts +2 -10
  391. package/dist/surface/tools/coverage-tools.js +2 -53
  392. package/dist/surface/tools/dynamic-tools.js +29 -1
  393. package/dist/surface/tools/empty-session-list.d.ts +10 -0
  394. package/dist/surface/tools/empty-session-list.js +45 -5
  395. package/dist/surface/tools/error-recovery.d.ts +8 -0
  396. package/dist/surface/tools/error-recovery.js +69 -5
  397. package/dist/surface/tools/explore-tools.d.ts +23 -2
  398. package/dist/surface/tools/explore-tools.js +377 -74
  399. package/dist/surface/tools/feedback-tools.d.ts +2 -3
  400. package/dist/surface/tools/feedback-tools.js +4 -3
  401. package/dist/surface/tools/gap-novelty.d.ts +3 -1
  402. package/dist/surface/tools/gap-novelty.js +8 -1
  403. package/dist/surface/tools/harness-explore.d.ts +52 -73
  404. package/dist/surface/tools/harness-explore.js +177 -146
  405. package/dist/surface/tools/harness-gate.d.ts +88 -0
  406. package/dist/surface/tools/harness-gate.js +235 -0
  407. package/dist/surface/tools/harness-hunt.d.ts +43 -0
  408. package/dist/surface/tools/harness-hunt.js +215 -0
  409. package/dist/surface/tools/harness-plan.d.ts +5 -0
  410. package/dist/surface/tools/harness-plan.js +7 -0
  411. package/dist/surface/tools/harness-script.d.ts +22 -0
  412. package/dist/surface/tools/harness-script.js +256 -38
  413. package/dist/surface/tools/harness-tab-guard.d.ts +5 -0
  414. package/dist/surface/tools/harness-tab-guard.js +27 -0
  415. package/dist/surface/tools/harness-toolset.d.ts +8 -0
  416. package/dist/surface/tools/harness-toolset.js +27 -4
  417. package/dist/surface/tools/human-notes.d.ts +16 -0
  418. package/dist/surface/tools/human-notes.js +27 -0
  419. package/dist/surface/tools/invoke-tool.d.ts +5 -2
  420. package/dist/surface/tools/invoke-tool.js +220 -93
  421. package/dist/surface/tools/lease-hint.js +26 -5
  422. package/dist/surface/tools/lease-permissions.d.ts +33 -0
  423. package/dist/surface/tools/lease-permissions.js +73 -0
  424. package/dist/surface/tools/lease-readiness.d.ts +38 -0
  425. package/dist/surface/tools/lease-readiness.js +57 -0
  426. package/dist/surface/tools/lease-seed.d.ts +20 -0
  427. package/dist/surface/tools/lease-seed.js +45 -1
  428. package/dist/surface/tools/lease-tools.d.ts +10 -1
  429. package/dist/surface/tools/lease-tools.js +119 -69
  430. package/dist/surface/tools/live-call-text.js +2 -2
  431. package/dist/surface/tools/merge-tools.js +42 -2
  432. package/dist/surface/tools/merged-name-redirect.js +4 -0
  433. package/dist/surface/tools/next-step.d.ts +11 -1
  434. package/dist/surface/tools/next-step.js +73 -18
  435. package/dist/surface/tools/observe-tools.js +43 -5
  436. package/dist/surface/tools/platform-moment.d.ts +60 -0
  437. package/dist/surface/tools/platform-moment.js +132 -4
  438. package/dist/surface/tools/read-tools.js +65 -14
  439. package/dist/surface/tools/reticle-result.d.ts +120 -0
  440. package/dist/surface/tools/reticle-result.js +364 -0
  441. package/dist/surface/tools/tool-kit.d.ts +68 -2
  442. package/dist/surface/tools/tool-kit.js +73 -1
  443. package/dist/surface/tools/tools.js +25 -13
  444. package/dist/telemetry/account-envelope.d.ts +7 -0
  445. package/dist/telemetry/account-envelope.js +61 -0
  446. package/dist/telemetry/agent-client.d.ts +15 -0
  447. package/dist/telemetry/agent-client.js +57 -0
  448. package/dist/telemetry/app-instrumented.js +9 -2
  449. package/dist/telemetry/argument-shape.d.ts +7 -0
  450. package/dist/telemetry/argument-shape.js +86 -1
  451. package/dist/telemetry/automation-hint.d.ts +2 -3
  452. package/dist/telemetry/automation-hint.js +33 -8
  453. package/dist/telemetry/cli-telemetry.js +7 -2
  454. package/dist/telemetry/daemon-telemetry.js +3 -0
  455. package/dist/telemetry/error-fingerprint.d.ts +10 -1
  456. package/dist/telemetry/error-fingerprint.js +61 -5
  457. package/dist/telemetry/feedback-cli.d.ts +0 -13
  458. package/dist/telemetry/feedback-cli.js +0 -77
  459. package/dist/telemetry/feedback.d.ts +13 -0
  460. package/dist/telemetry/feedback.js +183 -17
  461. package/dist/telemetry/harness-run.d.ts +18 -0
  462. package/dist/telemetry/harness-run.js +80 -0
  463. package/dist/telemetry/hud-events.d.ts +16 -0
  464. package/dist/telemetry/hud-events.js +27 -0
  465. package/dist/telemetry/hud-metrics.d.ts +27 -6
  466. package/dist/telemetry/hud-metrics.js +99 -25
  467. package/dist/telemetry/init-telemetry.js +2 -2
  468. package/dist/telemetry/install-source.d.ts +13 -25
  469. package/dist/telemetry/install-source.js +44 -3
  470. package/dist/telemetry/mcp-connection.d.ts +0 -14
  471. package/dist/telemetry/mcp-connection.js +5 -1
  472. package/dist/telemetry/onboarding-firsts.d.ts +32 -0
  473. package/dist/telemetry/onboarding-firsts.js +81 -6
  474. package/dist/telemetry/platform-linked.d.ts +5 -0
  475. package/dist/telemetry/platform-linked.js +32 -0
  476. package/dist/telemetry/project-profile.js +5 -3
  477. package/dist/telemetry/proxy-telemetry.js +4 -1
  478. package/dist/telemetry/session-metrics.d.ts +15 -4
  479. package/dist/telemetry/session-metrics.js +88 -52
  480. package/dist/telemetry/telemetry.d.ts +26 -2
  481. package/dist/telemetry/telemetry.js +102 -21
  482. package/dist/telemetry/verification-of.d.ts +3 -1
  483. package/dist/telemetry/verification-of.js +12 -4
  484. package/dist/wire-journal.d.ts +2 -2
  485. package/dist/wire-journal.js +16 -5
  486. package/docs/README.md +2 -2
  487. package/docs/actions.mdx +6 -3
  488. package/docs/adapters.md +1 -1
  489. package/docs/agent-cheatsheet.md +24 -27
  490. package/docs/architecture.md +5 -5
  491. package/docs/autodrive.md +13 -12
  492. package/docs/benchmarks.md +5 -5
  493. package/docs/best-practices.mdx +27 -9
  494. package/docs/capabilities.mdx +14 -16
  495. package/docs/cli/affected.mdx +1 -1
  496. package/docs/cli/cloud.mdx +54 -75
  497. package/docs/cli/doctor.mdx +8 -3
  498. package/docs/cli/drive.mdx +12 -12
  499. package/docs/cli/feedback.mdx +3 -3
  500. package/docs/cli/gate.mdx +7 -2
  501. package/docs/cli/help.mdx +50 -55
  502. package/docs/cli/init.mdx +32 -15
  503. package/docs/cli/license.mdx +12 -8
  504. package/docs/cli/mcp.mdx +4 -4
  505. package/docs/cli/open.mdx +3 -3
  506. package/docs/cli/report.mdx +4 -2
  507. package/docs/cli/restart.mdx +2 -2
  508. package/docs/cli/rollback.mdx +14 -8
  509. package/docs/cli/serve.mdx +4 -4
  510. package/docs/cli/setup.mdx +23 -0
  511. package/docs/cli/status.mdx +13 -4
  512. package/docs/cli/stop.mdx +67 -8
  513. package/docs/cli/try.mdx +62 -0
  514. package/docs/cli/update.mdx +4 -3
  515. package/docs/cli/verify.mdx +17 -6
  516. package/docs/cli/version.mdx +3 -2
  517. package/docs/cli.mdx +110 -41
  518. package/docs/debugging.md +3 -3
  519. package/docs/deploy-checks.md +1 -1
  520. package/docs/desktop.mdx +5 -3
  521. package/docs/enterprise.md +11 -10
  522. package/docs/environment.mdx +5 -2
  523. package/docs/faq.mdx +3 -3
  524. package/docs/first-drive.md +5 -4
  525. package/docs/flows.md +35 -27
  526. package/docs/for-agents.md +4 -5
  527. package/docs/frameworks.mdx +32 -21
  528. package/docs/getting-started.md +66 -64
  529. package/docs/human-control.md +15 -14
  530. package/docs/index.mdx +15 -43
  531. package/docs/install-agentic.mdx +22 -37
  532. package/docs/install-manual.mdx +22 -12
  533. package/docs/instrumentation.mdx +5 -3
  534. package/docs/integration-patterns.md +7 -7
  535. package/docs/license-activation.mdx +1 -1
  536. package/docs/multi-agent-testing.md +24 -6
  537. package/docs/packages/babel-plugin.mdx +4 -2
  538. package/docs/packages/browser.mdx +16 -10
  539. package/docs/packages/core.mdx +12 -5
  540. package/docs/packages/electron.mdx +3 -2
  541. package/docs/packages/engine.mdx +1 -1
  542. package/docs/packages/eslint-plugin.mdx +18 -12
  543. package/docs/packages/next.mdx +8 -7
  544. package/docs/packages/open-verification.mdx +1 -1
  545. package/docs/packages/server.mdx +5 -5
  546. package/docs/packages/tauri.mdx +8 -8
  547. package/docs/packages/test.mdx +4 -10
  548. package/docs/packages/vite-plugin.mdx +11 -4
  549. package/docs/packages.mdx +11 -15
  550. package/docs/platform-integration.md +6 -5
  551. package/docs/predicates.mdx +40 -24
  552. package/docs/quickstart.mdx +58 -29
  553. package/docs/required-checks.md +8 -7
  554. package/docs/reticle-manual.md +15 -5
  555. package/docs/skill-file.mdx +17 -79
  556. package/docs/skill-setup.md +9 -9
  557. package/docs/skill.md +200 -0
  558. package/docs/system-map.md +7 -7
  559. package/docs/telemetry.md +22 -24
  560. package/docs/testing.md +4 -4
  561. package/docs/token-efficiency.md +12 -12
  562. package/docs/tools/act-and-wait.mdx +9 -2
  563. package/docs/tools/act-sequence.mdx +6 -7
  564. package/docs/tools/act.mdx +2 -2
  565. package/docs/tools/assert.mdx +18 -17
  566. package/docs/tools/console.mdx +9 -9
  567. package/docs/tools/inspect.mdx +16 -7
  568. package/docs/tools/look.mdx +24 -0
  569. package/docs/tools/navigate.mdx +5 -3
  570. package/docs/tools/network.mdx +2 -2
  571. package/docs/tools/observe.mdx +6 -6
  572. package/docs/tools/overview.mdx +34 -33
  573. package/docs/tools/query.mdx +5 -5
  574. package/docs/tools/session-and-feedback.mdx +13 -4
  575. package/docs/tools/sessions.mdx +8 -8
  576. package/docs/tools/snapshot.mdx +6 -5
  577. package/docs/tools/state.mdx +9 -9
  578. package/docs/tools/tools-and-run.mdx +26 -24
  579. package/docs/tools/verify.mdx +28 -0
  580. package/docs/tools/wait-for.mdx +8 -4
  581. package/docs/troubleshooting.mdx +21 -6
  582. package/docs/usage.md +51 -45
  583. package/docs/use-cases.mdx +3 -3
  584. package/docs/vs-chrome-devtools-mcp.mdx +9 -6
  585. package/docs/vs-playwright-mcp.mdx +3 -1
  586. package/docs/what-is-recorded.md +7 -5
  587. package/docs/what-is-reticle.mdx +2 -2
  588. package/docs/why-reticle.mdx +1 -1
  589. package/package.json +6 -5
  590. package/dist/command/cli/demo/demo-page.d.ts +0 -78
  591. package/dist/command/cli/demo/demo-page.js +0 -249
  592. package/dist/command/cli/demo/demo-run.d.ts +0 -38
  593. package/dist/command/cli/demo/demo-run.js +0 -138
  594. package/dist/judgement/hunt/hunt-report.d.ts +0 -49
  595. package/dist/judgement/hunt/hunt-report.js +0 -84
  596. package/dist/language/flows/buddy-status.d.ts +0 -25
  597. package/dist/language/flows/buddy-status.js +0 -32
  598. package/dist/language/flows/change/watch-batcher.d.ts +0 -18
  599. package/dist/language/flows/change/watch-batcher.js +0 -19
  600. package/dist/memory/cloud/harness-offer.d.ts +0 -44
  601. package/dist/memory/cloud/harness-offer.js +0 -145
  602. package/dist/surface/tools/feature-capture.d.ts +0 -151
  603. package/dist/surface/tools/feature-capture.js +0 -235
  604. package/dist/surface/tools/tool-hit-rate.d.ts +0 -87
  605. package/dist/surface/tools/tool-hit-rate.js +0 -90
  606. package/dist/telemetry/harness-drive.d.ts +0 -4
  607. package/dist/telemetry/harness-drive.js +0 -35
  608. package/dist/telemetry/identify.d.ts +0 -22
  609. package/dist/telemetry/identify.js +0 -73
  610. package/docs/cli/capsules.mdx +0 -70
  611. package/docs/cli/hunt.mdx +0 -73
  612. package/docs/cli/identify.mdx +0 -76
  613. package/docs/cli/kill.mdx +0 -91
  614. package/docs/cli/watch.mdx +0 -62
@@ -16,6 +16,7 @@ import { ProjectSize, ReticleDir } from '@reticlehq/core';
16
16
  import { gitFacts } from './git-facts.js';
17
17
  import { detectStack } from './feedback-context.js';
18
18
  import { readProjectId } from '../command/cli/ports/resolve/cli-port.js';
19
+ import { DRIVE_RECORD_SUFFIX } from '../memory/project/dir/reticle-dir.js';
19
20
  /**
20
21
  * The feature FAMILIES, and the on-disk evidence that a project has adopted each. Named rather than
21
22
  * counted so the vocabulary stays stable as tools are added, renamed, or merged into action-dispatched
@@ -134,9 +135,9 @@ const defaultReadDir = (dir) => {
134
135
  };
135
136
  const defaultRead = (path) => readFileSync(path, 'utf8');
136
137
  /** How many entries a `.reticle` subdirectory holds, matching an optional extension. 0 when absent. */
137
- function countIn(reticleRoot, subdir, extension) {
138
+ function countIn(reticleRoot, subdir, extension, except) {
138
139
  try {
139
- const names = readdirSync(join(reticleRoot, subdir));
140
+ const names = readdirSync(join(reticleRoot, subdir)).filter((n) => except === undefined || !n.endsWith(except));
140
141
  return extension === undefined ? names.length : names.filter((n) => extension.test(n)).length;
141
142
  }
142
143
  catch {
@@ -158,7 +159,8 @@ export function profileProject(cwd, now, install) {
158
159
  const baselineCount = countIn(reticleRoot, ReticleDir.BASELINES_SUBDIR);
159
160
  // `.diff.png` files are diff OUTPUT, not baselines — counting them would double every visual user.
160
161
  const visualBaselineCount = countIn(reticleRoot, ReticleDir.VISUAL_SUBDIR, /(?<!\.diff)\.png$/);
161
- const runCount = countIn(reticleRoot, ReticleDir.RUNS_SUBDIR, /\.json$/);
162
+ // A drive's own record sits beside its run and is not one.
163
+ const runCount = countIn(reticleRoot, ReticleDir.RUNS_SUBDIR, /\.json$/, DRIVE_RECORD_SUFFIX);
162
164
  const capsuleCount = countIn(reticleRoot, ReticleDir.CAPSULES_SUBDIR, /\.json$/);
163
165
  const hasContract = exists(join(reticleRoot, ReticleDir.CONTRACT_FILE));
164
166
  const hasHistory = exists(join(reticleRoot, ReticleDir.PROJECT_FILE));
@@ -16,6 +16,9 @@ export async function flushProxySessionMetrics(telemetry = getTelemetry(), metri
16
16
  if (metrics.empty)
17
17
  return;
18
18
  await telemetry.emit(TelemetryEventKind.SESSION_PROGRESS, {
19
- session: metrics.summarize(true),
19
+ // A window, not the final roll-up: this rides `session_progress`, which every query sums, and a
20
+ // final summary would also resolve calls and stamp an end reason for a process that is not the
21
+ // daemon whose session this is.
22
+ session: metrics.summarize(false),
20
23
  });
21
24
  }
@@ -15,8 +15,9 @@
15
15
  * URLs, no error messages — the accumulator has no way to hold them, which is a stronger guarantee
16
16
  * than a rule saying it shouldn't.
17
17
  */
18
- import { BrowserLaunchKind, type ConnectFailure, type SessionSummary } from '@reticlehq/core/telemetry';
18
+ import { BrowserLaunchKind, type AgentNudgeKind, type ConnectFailure, type SessionSummary } from '@reticlehq/core/telemetry';
19
19
  import type { HudUseData } from '@reticlehq/core';
20
+ import { type HudSignals } from './hud-metrics.js';
20
21
  /**
21
22
  * Mutable counters for one daemon lifetime. A plain class, not a store: it is process-local, it never
22
23
  * persists, and it dies with the daemon.
@@ -25,8 +26,12 @@ export declare class SessionMetrics {
25
26
  #private;
26
27
  /** Clock injected — this file must stay testable without a real one, per the repo's clock rule. */
27
28
  constructor(now: () => number);
28
- /** A person used the HUD. Names only; the wire schema has already narrowed it. */
29
- recordHudUse(use: HudUseData): void;
29
+ /** A person used the HUD on one tab. Names only; the wire schema has already narrowed it. */
30
+ recordHudUse(use: HudUseData, tab?: string): HudSignals;
31
+ /** A tab went into the background (true) or came back (false): its HUD time pauses meanwhile. */
32
+ setHudTabHidden(tab: string, hidden: boolean): void;
33
+ /** A tab went away: its HUD stops accruing time. */
34
+ closeHudTab(tab: string): void;
30
35
  /**
31
36
  * Record a call starting. Returns a function to call when it finishes — that closure is what makes
32
37
  * timing correct under CONCURRENCY: several agents can be inside `runTool` at once, so a single
@@ -114,6 +119,8 @@ export declare class SessionMetrics {
114
119
  * only lets a reader separate "how many distinct defects" from "how often they were hit", which
115
120
  * are different claims and were previously indistinguishable in the data.
116
121
  */
122
+ /** The 1-based occurrence of this finding in the session, or undefined past the cap. */
123
+ recordBugOccurrence(fingerprint: string): number | undefined;
117
124
  recordBug(kind: string): boolean;
118
125
  /**
119
126
  * One connection ATTEMPT. Call before the attempt; settle it with the outcome.
@@ -137,6 +144,10 @@ export declare class SessionMetrics {
137
144
  get currentRun(): number;
138
145
  /** Reticle invited the agent to send feedback. The denominator for feedback_submitted. */
139
146
  recordFeedbackPrompt(): void;
147
+ /** An agent was shown a platform or Harness advisory. */
148
+ recordNudge(kind: AgentNudgeKind): void;
149
+ /** A Harness drive was refused because the app's coverage is below the gate. */
150
+ recordHarnessRefused(percent: number): void;
140
151
  /** Which tool surface was advertised to agents this session. */
141
152
  recordSurface(surface: string): void;
142
153
  /**
@@ -166,6 +177,6 @@ export declare const recordSdkFailure: (failure: {
166
177
  message: string;
167
178
  }) => void;
168
179
  /** Narrow-and-record one HUD use. Keeps the session hot path to a single call. */
169
- export declare const recordHudUse: (use: HudUseData) => void;
180
+ export declare const recordHudUse: (use: HudUseData, tab?: string) => HudSignals;
170
181
  /** Tests only — drop the singleton so each case starts from zero. */
171
182
  export declare const resetSessionMetrics: () => void;
@@ -15,7 +15,7 @@
15
15
  * URLs, no error messages — the accumulator has no way to hold them, which is a stronger guarantee
16
16
  * than a rule saying it shouldn't.
17
17
  */
18
- import { BrowserLaunchKind, } from '@reticlehq/core/telemetry';
18
+ import { BrowserLaunchKind, coverageBucketOf, } from '@reticlehq/core/telemetry';
19
19
  import { errorSkeleton, fingerprintError } from './error-fingerprint.js';
20
20
  import { describeToolParams } from './argument-shape.js';
21
21
  import { machineSnapshot } from './machine-snapshot.js';
@@ -34,6 +34,8 @@ const MAX_REPEAT_TOOLS = 64;
34
34
  * not tell which one, and the outcome is identical.
35
35
  */
36
36
  const NO_SESSION_ERROR = /no browser session connected|no connected session with id|multiple sessions connected/i;
37
+ /** Distinct findings a session numbers occurrences for. A real session finds far fewer. */
38
+ const MAX_BUG_FINGERPRINTS = 500;
37
39
  /** Cap distinct MCP clients recorded; more than a handful on one daemon is already the story. */
38
40
  const MAX_CLIENTS = 8;
39
41
  /** Bounds on the parameter map. Our own schemas are already finite; these are a belt-and-braces cap. */
@@ -64,19 +66,12 @@ export class SessionMetrics {
64
66
  #toolErrors = 0;
65
67
  #verifications = 0;
66
68
  /**
67
- * Session-LIFETIME totals for the four numbers the funnel is computed from.
68
- *
69
- * `reset()` zeroes every window counter on each periodic flush, but `durationMs` is measured from
70
- * `#startedAt` and is never reset. Without these, the FINAL summary — the one whose docstring
71
- * promises "the whole session in a single event" — reports a long session containing zero tool
72
- * calls, because it carries only the residue since the last flush, and anyone computing "did this
73
- * session use Reticle" off the event named for the end of the session reads `no`.
74
- *
75
- * Window semantics are unchanged: `session_progress` still reports its own window, so nothing that
76
- * already sums those events double-counts. Only `final: true` swaps in the lifetime numbers.
69
+ * Session-LIFETIME totals, never reset by a flush. The final summary carries them as
70
+ * `lifetime*` fields BESIDE its windowed counters, never in place of them: a final event whose
71
+ * `toolCalls` was the lifetime made every query summing a session's events count each flushed
72
+ * window twice.
77
73
  */
78
74
  #lifetimeToolCalls = 0;
79
- #lifetimeToolErrors = 0;
80
75
  #lifetimeVerifications = 0;
81
76
  #lifetimeBugsFound = 0;
82
77
  #toolCounts = new Map();
@@ -95,11 +90,10 @@ export class SessionMetrics {
95
90
  #peakConcurrent = 0;
96
91
  #unknownToolCalls = 0;
97
92
  /**
98
- * Names the agent guessed at, session-LIFETIME — a guess made early must still be reported at
99
- * the end, so this is deliberately not cleared by a flush.
93
+ * Names the agent guessed at, this window. Reported in the window the guess was made; a lifetime
94
+ * map here restated every early guess on each later flush, which a sum over windows counts again.
100
95
  */
101
96
  #unknownTools = new Map();
102
- #lifetimeUnknownToolCalls = 0;
103
97
  #bugsFound = 0;
104
98
  #browserMs = 0;
105
99
  #browserCommands = 0;
@@ -113,6 +107,11 @@ export class SessionMetrics {
113
107
  * capped: the kind vocabulary is a bounded enum plus oracle names, not user data.
114
108
  */
115
109
  #seenBugKinds = new Set();
110
+ /**
111
+ * Occurrences per finding fingerprint, session-lifetime like `#seenBugKinds`, so two hits of one
112
+ * defect are never byte-identical rows. Capped; past the cap a new fingerprint gets no index.
113
+ */
114
+ #bugOccurrences = new Map();
116
115
  /**
117
116
  * Tool errors meaning "the agent could not reach an app at all" — counted as a field of its own
118
117
  * because the alternative is unpacking `errors[]` in HogQL.
@@ -120,10 +119,8 @@ export class SessionMetrics {
120
119
  #noSessionErrors = 0;
121
120
  /** Connection-level MCP POST failures the SSE stream cannot see. See SessionSummary. */
122
121
  #postSocketFailures = 0;
123
- #lifetimePostSocketFailures = 0;
124
122
  /** Retries of those POSTs that then delivered. */
125
123
  #postRetriesSaved = 0;
126
- #lifetimePostRetriesSaved = 0;
127
124
  /** Longest back-to-back run per tool — a retry loop, which `toolCounts` cannot distinguish. */
128
125
  #repeatRuns = new Map();
129
126
  #lastTool;
@@ -143,7 +140,11 @@ export class SessionMetrics {
143
140
  #clientLeft = false;
144
141
  /** Feedback invitations shown, session-lifetime — the denominator for feedback_submitted. */
145
142
  #feedbackPrompted = 0;
146
- /** Error buckets by whose defect. Session-lifetime: the mix is a fact about the session. */
143
+ /** Platform and Harness advisories shown to an agent this window, by kind. */
144
+ #nudges = new Map();
145
+ /** Harness drives refused for coverage this window, by coverage bucket. */
146
+ #harnessRefused = new Map();
147
+ /** Error buckets by whose defect, this window. */
147
148
  #errorClasses = new Map();
148
149
  /**
149
150
  * The recovery hinge. A call's outcome is only known once the NEXT one starts, so the verdict for
@@ -173,9 +174,20 @@ export class SessionMetrics {
173
174
  this.#startedAt = now();
174
175
  this.#hud = new HudMetrics(now);
175
176
  }
176
- /** A person used the HUD. Names only; the wire schema has already narrowed it. */
177
- recordHudUse(use) {
178
- this.#hud.record(use);
177
+ /** A person used the HUD on one tab. Names only; the wire schema has already narrowed it. */
178
+ recordHudUse(use, tab) {
179
+ return this.#hud.record(use, tab);
180
+ }
181
+ /** A tab went into the background (true) or came back (false): its HUD time pauses meanwhile. */
182
+ setHudTabHidden(tab, hidden) {
183
+ if (hidden)
184
+ this.#hud.hide(tab);
185
+ else
186
+ this.#hud.show(tab);
187
+ }
188
+ /** A tab went away: its HUD stops accruing time. */
189
+ closeHudTab(tab) {
190
+ this.#hud.close(tab);
179
191
  }
180
192
  /**
181
193
  * Record a call starting. Returns a function to call when it finishes — that closure is what makes
@@ -224,7 +236,6 @@ export class SessionMetrics {
224
236
  */
225
237
  recordUnknownTool(name) {
226
238
  this.#unknownToolCalls += 1;
227
- this.#lifetimeUnknownToolCalls += 1;
228
239
  if (name === undefined || 0 === name.length)
229
240
  return;
230
241
  const key = name.slice(0, 64);
@@ -285,7 +296,6 @@ export class SessionMetrics {
285
296
  */
286
297
  recordToolError(message, tool) {
287
298
  this.#toolErrors += 1;
288
- this.#lifetimeToolErrors += 1;
289
299
  // Whose defect. Only the `schema` bucket is fixable by writing better descriptions, and it was
290
300
  // indistinguishable from the rest inside one `toolErrors` count.
291
301
  bump(this.#errorClasses, classifyError(message));
@@ -340,7 +350,6 @@ export class SessionMetrics {
340
350
  */
341
351
  recordPostSocketFailure() {
342
352
  this.#postSocketFailures += 1;
343
- this.#lifetimePostSocketFailures += 1;
344
353
  }
345
354
  /**
346
355
  * A bounded retry of an unsent POST then delivered. The pair against `recordPostSocketFailure`:
@@ -348,7 +357,6 @@ export class SessionMetrics {
348
357
  */
349
358
  recordPostRetrySaved() {
350
359
  this.#postRetriesSaved += 1;
351
- this.#lifetimePostRetriesSaved += 1;
352
360
  }
353
361
  /** The agent's recent approach run + the call in flight — context for a crash report. */
354
362
  get trail() {
@@ -406,6 +414,15 @@ export class SessionMetrics {
406
414
  * only lets a reader separate "how many distinct defects" from "how often they were hit", which
407
415
  * are different claims and were previously indistinguishable in the data.
408
416
  */
417
+ /** The 1-based occurrence of this finding in the session, or undefined past the cap. */
418
+ recordBugOccurrence(fingerprint) {
419
+ const seen = this.#bugOccurrences.get(fingerprint);
420
+ if (seen === undefined && this.#bugOccurrences.size >= MAX_BUG_FINGERPRINTS)
421
+ return undefined;
422
+ const occurrence = (seen ?? 0) + 1;
423
+ this.#bugOccurrences.set(fingerprint, occurrence);
424
+ return occurrence;
425
+ }
409
426
  recordBug(kind) {
410
427
  this.#bugsFound += 1;
411
428
  this.#lifetimeBugsFound += 1;
@@ -468,6 +485,14 @@ export class SessionMetrics {
468
485
  recordFeedbackPrompt() {
469
486
  this.#feedbackPrompted += 1;
470
487
  }
488
+ /** An agent was shown a platform or Harness advisory. */
489
+ recordNudge(kind) {
490
+ bump(this.#nudges, kind);
491
+ }
492
+ /** A Harness drive was refused because the app's coverage is below the gate. */
493
+ recordHarnessRefused(percent) {
494
+ bump(this.#harnessRefused, coverageBucketOf(percent));
495
+ }
471
496
  /** Which tool surface was advertised to agents this session. */
472
497
  recordSurface(surface) {
473
498
  this.#surface = surface.slice(0, 32);
@@ -482,28 +507,18 @@ export class SessionMetrics {
482
507
  if (final)
483
508
  this.#resolveRecovery();
484
509
  const machine = machineSnapshot();
485
- // A FINAL summary reports the session; a periodic flush reports its window. `durationMs` was
486
- // always session-lifetime, so a windowed count next to it described a 30-minute session that
487
- // made no calls. The histograms below stay windowed by design — summing them across a session's
488
- // events is correct, and duplicating every map to make them lifetime would double the memory
489
- // this class exists to keep small.
490
- const scalars = final
491
- ? {
492
- toolCalls: this.#lifetimeToolCalls,
493
- toolErrors: this.#lifetimeToolErrors,
494
- verifications: this.#lifetimeVerifications,
495
- bugsFound: this.#lifetimeBugsFound,
496
- postSocketFailures: this.#lifetimePostSocketFailures,
497
- postRetriesSaved: this.#lifetimePostRetriesSaved,
498
- }
499
- : {
500
- toolCalls: this.#toolCalls,
501
- toolErrors: this.#toolErrors,
502
- verifications: this.#verifications,
503
- bugsFound: this.#bugsFound,
504
- postSocketFailures: this.#postSocketFailures,
505
- postRetriesSaved: this.#postRetriesSaved,
506
- };
510
+ // EVERY event reports its own window, the final one included: summing a session's
511
+ // `session_progress` + `daemon_stopped` rows is then its total. The final event used to swap in
512
+ // the lifetime numbers, so every flushed window was counted twice by exactly that sum. The
513
+ // session totals ride beside them under their own names, on the final event only.
514
+ const scalars = {
515
+ toolCalls: this.#toolCalls,
516
+ toolErrors: this.#toolErrors,
517
+ verifications: this.#verifications,
518
+ bugsFound: this.#bugsFound,
519
+ postSocketFailures: this.#postSocketFailures,
520
+ postRetriesSaved: this.#postRetriesSaved,
521
+ };
507
522
  return {
508
523
  durationMs: Math.max(0, this.#now() - this.#startedAt),
509
524
  toolCalls: scalars.toolCalls,
@@ -534,7 +549,7 @@ export class SessionMetrics {
534
549
  browserMs: this.#browserMs,
535
550
  browserCommands: this.#browserCommands,
536
551
  peakConcurrentTools: this.#peakConcurrent,
537
- unknownToolCalls: final ? this.#lifetimeUnknownToolCalls : this.#unknownToolCalls,
552
+ unknownToolCalls: this.#unknownToolCalls,
538
553
  ...(this.#unknownTools.size > 0
539
554
  ? { unknownTools: Object.fromEntries(this.#unknownTools) }
540
555
  : {}),
@@ -549,8 +564,19 @@ export class SessionMetrics {
549
564
  // verification number in this payload is windowed and a reader who summed the wrong one got a
550
565
  // different question's answer. `false` is sent, not omitted: a session that drove an app and
551
566
  // never asked whether it worked is the whole finding.
552
- ...(final ? { endedWithVerdict: this.#lifetimeVerifications > 0 } : {}),
567
+ ...(final
568
+ ? {
569
+ endedWithVerdict: this.#lifetimeVerifications > 0,
570
+ lifetimeToolCalls: this.#lifetimeToolCalls,
571
+ lifetimeVerifications: this.#lifetimeVerifications,
572
+ lifetimeBugsFound: this.#lifetimeBugsFound,
573
+ }
574
+ : {}),
553
575
  ...(this.#feedbackPrompted > 0 ? { feedbackPrompted: this.#feedbackPrompted } : {}),
576
+ ...(this.#nudges.size > 0 ? { nudgesShown: Object.fromEntries(this.#nudges) } : {}),
577
+ ...(this.#harnessRefused.size > 0
578
+ ? { harnessRefusedCoverage: Object.fromEntries(this.#harnessRefused) }
579
+ : {}),
554
580
  ...(this.#errorClasses.size > 0
555
581
  ? { errorClasses: Object.fromEntries(this.#errorClasses) }
556
582
  : {}),
@@ -622,6 +648,8 @@ export class SessionMetrics {
622
648
  0 === this.#sdkFailures &&
623
649
  0 === this.#postSocketFailures &&
624
650
  0 === this.#postRetriesSaved &&
651
+ 0 === this.#nudges.size &&
652
+ 0 === this.#harnessRefused.size &&
625
653
  this.#hud.empty);
626
654
  }
627
655
  /** Zero the counters after a non-final flush so the next flush reports the NEXT window, not a total. */
@@ -651,6 +679,16 @@ export class SessionMetrics {
651
679
  this.#bugsFound = 0;
652
680
  this.#bugKinds.clear();
653
681
  this.#hud.reset();
682
+ this.#nudges.clear();
683
+ this.#harnessRefused.clear();
684
+ // These five were never cleared, so every flush restated them and a sum over a session's
685
+ // windows came out larger than its tool calls. Counts are windowed, all of them; only the
686
+ // facts below (an app ever connected, which clients, which bug kinds seen) outlive a window.
687
+ this.#errorClasses.clear();
688
+ this.#errorsRecovered = 0;
689
+ this.#errorsRepeated = 0;
690
+ this.#feedbackPrompted = 0;
691
+ this.#unknownTools.clear();
654
692
  // #seenBugKinds is deliberately NOT cleared. It is not a window counter — it is the
655
693
  // session-lifetime memory behind `repeat` on bug_found, and zeroing it made the same defect,
656
694
  // found again after a flush, report as a newly distinct one. Sessions run to 11.5 hours in the
@@ -676,9 +714,7 @@ export const recordSdkFailure = (failure) => {
676
714
  getSessionMetrics().recordSdkFailure(failure.site, failure.message);
677
715
  };
678
716
  /** Narrow-and-record one HUD use. Keeps the session hot path to a single call. */
679
- export const recordHudUse = (use) => {
680
- getSessionMetrics().recordHudUse(use);
681
- };
717
+ export const recordHudUse = (use, tab) => getSessionMetrics().recordHudUse(use, tab);
682
718
  /** Tests only — drop the singleton so each case starts from zero. */
683
719
  export const resetSessionMetrics = () => {
684
720
  current = undefined;
@@ -1,4 +1,10 @@
1
- import { TelemetryEventKind, ProjectIdSource, type Crash, type Feedback, type Identity, type BugFound, type InitOutcome, type OnboardingStep, type InstallSource, type McpConnection, type McpOutage, type ToolRefusal, type AppInstrumentation, type ProjectProfile, type SessionSummary, type TelemetryActor, type Verification, type VersionChange } from '@reticlehq/core/telemetry';
1
+ import { TelemetryEventKind, ProjectIdSource, type Crash, type Feedback, type Identity, type BugFound, type InitOutcome, type OnboardingStep, type InstallSource, type McpConnection, type McpOutage, type ToolRefusal, type AppInstrumentation, type HarnessRun, type HudEvent, type PlatformLink, type ProjectProfile, type SessionSummary, type TelemetryActor, type Verification, type VersionChange } from '@reticlehq/core/telemetry';
2
+ /**
3
+ * Presence of this file marks the MACHINE as the Reticle team's own: every event carries
4
+ * `internal: true`. The persistent twin of `RETICLE_INTERNAL=1`, for a dev machine where setting a
5
+ * variable in every shell would be forgotten once and pollute the numbers for good.
6
+ */
7
+ export declare const INTERNAL_MARKER_FILE = "telemetry-internal";
2
8
  /**
3
9
  * PostHog's group type for a licensed customer. Sent as `$groups` so PostHog can aggregate a whole
4
10
  * organisation natively: per-company retention, "which orgs went quiet", one row per customer rather
@@ -21,6 +27,7 @@ export declare const POSTHOG_GROUP_ORGANIZATION = "organization";
21
27
  export declare const resolveIdentity: (file?: string) => {
22
28
  anonymousId: string;
23
29
  firstRun: boolean;
30
+ ephemeral?: true;
24
31
  };
25
32
  /**
26
33
  * One-way project fingerprint: distinct-count of this = "projects Reticle is used in", reveals nothing.
@@ -94,6 +101,17 @@ export interface TelemetryExtra {
94
101
  instrumentation?: AppInstrumentation;
95
102
  /** `reticle_installed` / `init_completed`: which published route brought this install in. */
96
103
  installSource?: InstallSource;
104
+ /** `hud_viewed` / `hud_signin_prompted`: which HUD page or prompt. */
105
+ hud?: HudEvent;
106
+ /** `platform_linked`: how this project got linked. */
107
+ link?: PlatformLink;
108
+ /** `harness_run`: one phase of one Harness run. */
109
+ harness?: HarnessRun;
110
+ /**
111
+ * `platform_linked`: the workspace just linked. Overrides the envelope's own reading, which looks
112
+ * at the daemon's working directory and not at the project the HUD linked.
113
+ */
114
+ workspaceId?: string;
97
115
  }
98
116
  export interface Telemetry {
99
117
  /**
@@ -125,7 +143,13 @@ export declare const createTelemetry: (opts: {
125
143
  cwd?: string;
126
144
  now?: () => number;
127
145
  fetchImpl?: typeof fetch;
128
- spawnImpl?: (command: string, args: string[]) => void;
146
+ /** The send a `detach: true` emit hands off; `input` is written to the child's stdin. */
147
+ spawnImpl?: (command: string, args: string[], input: string) => void;
148
+ /** The state home (`~/.reticle`). Injected so a test never touches the real one. */
149
+ reticleDir?: string;
150
+ /** Where `~/.reticle/session.json` is looked for. Injected by tests only. */
151
+ home?: string;
129
152
  }) => Telemetry;
153
+ export declare const droppedInvalidEvents: () => number;
130
154
  export declare const getTelemetry: () => Telemetry;
131
155
  export { TelemetryEventKind };