@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
@@ -1,6 +1,6 @@
1
1
  import { TESTID_FOUND_UNDER_SCHEMA } from './query-hint-schema.js';
2
2
  import { z } from 'zod';
3
- import { EMPTY_SESSION_LIST_OUTPUT, emptySessionList } from './empty-session-list.js';
3
+ import { EMPTY_SESSION_LIST_OUTPUT, emptySessionList, wireCallerBesideLiveSessions, } from './empty-session-list.js';
4
4
  import { AttrNamesSchema, EventType, QueryBy, ReticleCommand, SnapshotMode } from '@reticlehq/core';
5
5
  import { ReticleTool } from '@reticlehq/core';
6
6
  import { withSizeCost } from '../../portal/session/output-budget.js';
@@ -43,23 +43,25 @@ import { VIEWPORT_TOOLS } from '../../portal/input/viewport-tools.js';
43
43
  import { SESSION_TOOLS } from '../../portal/session/session-tools.js';
44
44
  import { ANNOTATE_TOOLS } from '../../language/flows/annotate-tools.js';
45
45
  import { LIVE_CONTROL_TOOLS } from '../../portal/session/live-control-tools.js';
46
- import { sessionIdShape, commandOrThrow } from './tool-kit.js';
46
+ import { SCREENSHOT_DOC, sessionIdShape, commandOrThrow, withScreenshotDoc, } from './tool-kit.js';
47
47
  import { TOOL_SURFACE } from './tool-surface.js';
48
48
  import { mergeActWithSequence } from './act-merged.js';
49
49
  import { INSPECT_TOOL } from './inspect-tool.js';
50
50
  import { applyMerges } from './merge-tools.js';
51
51
  import { ACT_TOOLS } from './act-tools.js';
52
52
  import { ACT_SEQUENCE_TOOL } from './act-sequence-tool.js';
53
+ import { withCompactEnvelope } from './agent/compact-envelope.js';
53
54
  import { OBSERVE_TOOLS } from './observe-tools.js';
54
55
  import { LINEAGE_TOOLS } from './lineage-tools.js';
55
56
  import { RECONCILE_TOOLS } from './reconcile-tools.js';
56
57
  import { READ_TOOLS } from './read-tools.js';
57
58
  import { LEASE_TOOLS } from './lease-tools.js';
58
59
  import { FEEDBACK_TOOLS } from './feedback-tools.js';
60
+ import { ACCOUNT_TOOLS } from './account-tool.js';
59
61
  /** FALLBACK for `diff: true`; the real one is per MCP client on `deps.snapshots`, which says why. */
60
62
  const SNAPSHOT_CACHE = new SnapshotCache();
61
63
  /** Every handler, including tools retired from the advertised MCP surface. */
62
- export const RAW_TOOLS = [
64
+ export const RAW_TOOLS = withCompactEnvelope([
63
65
  {
64
66
  name: ReticleTool.SESSIONS,
65
67
  description: 'List connected browser sessions (tab url/title, sessionId, last-seen, health: hidden/focused/throttled, and `realInputAvailable` — true when native CDP/launched real input is driving this tab), plus a `recommendation` naming the in-protocol escape hatch (`reticle_run { tool: "reticle_lease" }`, with `reticle drive` as the human-side equivalent) when a tab is hidden/throttled and may be un-scriptable from here.',
@@ -124,15 +126,20 @@ export const RAW_TOOLS = [
124
126
  handler: async (deps) => {
125
127
  const provider = deps.realInput;
126
128
  const leasedIds = new Set(deps.pool?.leasedSessionIds() ?? []);
127
- const sessions = await Promise.all(deps.sessions.list().map(async (s) => ({
129
+ const list = () => Promise.all(deps.sessions.list().map(async (s) => ({
128
130
  ...s,
129
131
  realInputAvailable: provider !== undefined ? await provider.isAvailableFor(s.url) : false,
130
132
  leased: leasedIds.has(s.sessionId),
131
133
  })));
134
+ const sessions = await list();
132
135
  // An empty list is a dead end on its own; see empty-session-list.ts for what it carries.
133
136
  if (0 === sessions.length)
134
137
  return emptySessionList(deps, sessions);
135
- return { sessions };
138
+ // Another project's tab is up. This caller's project may still never have been wired.
139
+ const wired = await wireCallerBesideLiveSessions(deps, sessions);
140
+ if (wired === undefined)
141
+ return { sessions };
142
+ return { sessions: await list(), wired };
136
143
  },
137
144
  },
138
145
  {
@@ -360,6 +367,10 @@ export const RAW_TOOLS = [
360
367
  .passthrough()
361
368
  .optional()
362
369
  .describe("Present when a TEXT search missed but the string IS on the page, split across this container's children. Retry as { scope: <ref>, self: true } — no text query can match a string no single element owns."),
370
+ caseMiss: z
371
+ .string()
372
+ .optional()
373
+ .describe('Present when a case-exact TEXT check missed and the page shows the text in another case: what it shows. Retry with ignoreCase: true if the case does not matter.'),
363
374
  // Declared here for the same reason presentRegions had to be: the browser emits it, and an
364
375
  // undeclared field is stripped from structuredContent without a word.
365
376
  nameNearMiss: z
@@ -432,16 +443,14 @@ export const RAW_TOOLS = [
432
443
  // reachable through reticle_run. See affected-tools.ts.
433
444
  ...AFFECTED_TOOLS,
434
445
  // reticle_coverage — which controls were driven vs never touched. Unadvertised; via reticle_run.
435
- // The table is passed as a thunk so the coverage tool can report which of it was called without
436
- // importing it back — see buildCoverageTools. Called from the handler, long after TOOLS exists.
437
- ...buildCoverageTools(() => TOOLS.map((t) => t.name)),
446
+ ...buildCoverageTools(),
438
447
  // reticle_verify_change — "did my change break anything" in one call. See verify-change-tools.ts.
439
448
  ...VERIFY_CHANGE_TOOLS,
440
449
  // Live-control: reticle_end_session / reticle_resume / reticle_messages. See live-control-tools.ts.
441
450
  ...LIVE_CONTROL_TOOLS,
442
451
  // reticle_navigate / reticle_refresh — browser navigation tools. See browser-tools.ts.
443
- ...BROWSER_TOOLS,
444
- ...ACT_TOOLS,
452
+ ...BROWSER_TOOLS.map(withScreenshotDoc),
453
+ ...ACT_TOOLS.map(withScreenshotDoc),
445
454
  ACT_SEQUENCE_TOOL,
446
455
  ...OBSERVE_TOOLS,
447
456
  ...LINEAGE_TOOLS,
@@ -449,7 +458,8 @@ export const RAW_TOOLS = [
449
458
  ...LEASE_TOOLS,
450
459
  // reticle_feedback — the agent reports that RETICLE failed (not that the app did). See feedback-tools.ts.
451
460
  ...FEEDBACK_TOOLS,
452
- ];
461
+ ...ACCOUNT_TOOLS,
462
+ ]);
453
463
  /**
454
464
  * surface consolidation. Tool defs are re-sent EVERY turn, so the advertised count is a per-turn
455
465
  * tax multiplied by loop length. Sibling families collapse into one action-dispatched tool; the member
@@ -491,7 +501,7 @@ export const MERGE_PLANS = [
491
501
  // existed. The rule is: if a tool has an obligation, the obligation goes first.
492
502
  // The first sentence is all a lean surface shows (160 characters), so it carries the
493
503
  // obligation and the HUD control; the rest is the detail for a full one.
494
- 'By action: "yield" is MANDATORY before you stop driving; "tune" hides or moves the HUD, or sets the idle window. ' +
504
+ 'By action: "yield" is MANDATORY before you stop driving; "tune" hides or moves the HUD, or sets the idle window; "account" says the plan, credits and Harness state. ' +
495
505
  'In full: "yield" hands control back to the human (mode: waiting|ask, between turns); "tune" takes `hud` (hidden, shown, removed until reload, or a corner) for when the HUD covers a control you must test, and `idleEndMs`; "end" terminates the session for good; "resume" clears a human pause; "messages" drains the human→agent inbox; "review" lists/resolves the mistakes a human pinned to elements; "narrate" states your intent on the presenter HUD.',
496
506
  members: {
497
507
  tune: ReticleTool.SESSION_TUNE,
@@ -501,6 +511,7 @@ export const MERGE_PLANS = [
501
511
  messages: ReticleTool.MESSAGES,
502
512
  review: ReticleTool.REVIEW,
503
513
  narrate: ReticleTool.NARRATE,
514
+ account: ReticleTool.ACCOUNT,
504
515
  },
505
516
  // The handback the lease block orders on every session — the one call an agent MUST make, so it
506
517
  // is the one that must not need a schema lookup first.
@@ -738,7 +749,8 @@ export const SURFACE_MERGE_PLANS = [
738
749
  },
739
750
  {
740
751
  name: ReticleTool.ASSERT,
741
- description: 'Prove a consequence, by action: "now" evaluates a predicate against the window that already exists, "wait" waits for one to become true within a budget. Both return a verdict; only `verified:"yes"` is a pass.',
752
+ description: 'Prove a consequence, by action: "now" evaluates a predicate against the window that already exists, "wait" waits for one to become true within a budget. Both return a verdict; only `verified:"yes"` is a pass.' +
753
+ SCREENSHOT_DOC,
742
754
  members: { now: ReticleTool.ASSERT, wait: ReticleTool.WAIT_FOR },
743
755
  example: { action: 'now' },
744
756
  // Evaluate against the window that already exists. `wait` spends a budget, so it is asked for.
@@ -0,0 +1,7 @@
1
+ import { TelemetryAccountState } from '@reticlehq/core/telemetry';
2
+ export interface AccountEnvelope {
3
+ accountState: TelemetryAccountState;
4
+ linked: boolean;
5
+ workspaceId?: string;
6
+ }
7
+ export declare function accountEnvelope(cwd: string, env: NodeJS.ProcessEnv, home: string): AccountEnvelope;
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Where this machine stands with the platform, for every telemetry event: signed out, signed in, or
3
+ * this project linked to a workspace, and that workspace's id.
4
+ *
5
+ * Read from what the CLI already wrote, never asked of the network: the session file (through
6
+ * `readAccountState`, which cannot carry the token) and the project's `.reticle/cloud.json`. Read per
7
+ * event, because a sign-in from the HUD changes the answer mid-session.
8
+ *
9
+ * The workspace id is the platform's `orgId`: pseudonymous here, and the key the platform joins its
10
+ * own records on. The workspace NAME and the signed-in email are never read into this.
11
+ */
12
+ import { readFileSync } from 'node:fs';
13
+ import { join } from 'node:path';
14
+ import { ReticleDir } from '@reticlehq/core';
15
+ import { TelemetryAccountState } from '@reticlehq/core/telemetry';
16
+ import { readAccountState } from '../memory/cloud/account-state.js';
17
+ import { linkDirectoryFrom } from '../memory/project/link-directory.js';
18
+ const MAX_WORKSPACE_ID = 128;
19
+ /** The link this project carries, if it is a real one (a project id and a host). */
20
+ function readLink(dir) {
21
+ try {
22
+ const raw = JSON.parse(readFileSync(join(dir, ReticleDir.ROOT, ReticleDir.CLOUD_LINK_FILE), 'utf8'));
23
+ if ('object' !== typeof raw || null === raw)
24
+ return undefined;
25
+ const o = raw;
26
+ const projectId = o['projectId'];
27
+ const url = o['url'];
28
+ if ('string' !== typeof projectId || 0 === projectId.length)
29
+ return undefined;
30
+ if ('string' !== typeof url || 0 === url.length)
31
+ return undefined;
32
+ const orgId = o['orgId'];
33
+ return 'string' === typeof orgId && 0 < orgId.length && orgId.length <= MAX_WORKSPACE_ID
34
+ ? { orgId }
35
+ : {};
36
+ }
37
+ catch {
38
+ return undefined;
39
+ }
40
+ }
41
+ export function accountEnvelope(cwd, env, home) {
42
+ let link;
43
+ try {
44
+ link = readLink(linkDirectoryFrom(cwd)) ?? readLink(cwd);
45
+ }
46
+ catch {
47
+ link = undefined;
48
+ }
49
+ if (link !== undefined) {
50
+ return {
51
+ accountState: TelemetryAccountState.LINKED,
52
+ linked: true,
53
+ ...(link.orgId === undefined ? {} : { workspaceId: link.orgId }),
54
+ };
55
+ }
56
+ const signedIn = readAccountState(home, env).signedIn;
57
+ return {
58
+ accountState: signedIn ? TelemetryAccountState.SIGNED_IN : TelemetryAccountState.SIGNED_OUT,
59
+ linked: false,
60
+ };
61
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Which coding agent an event came from, as a closed value — and how the running `reticle` was
3
+ * launched. Both are envelope fields, read per event (the client) or once per process (the launch).
4
+ *
5
+ * The client is the MCP handshake's `clientInfo.name` for the call in flight (or the only agent
6
+ * attached), normalised by `agentClientOf`. When no handshake has said anything — a one-shot CLI
7
+ * command, a proxy, a client that skipped `initialize` — the agent's own marker in the environment
8
+ * of what it spawned is the fallback. Only markers an agent sets on purpose are read.
9
+ */
10
+ import { AgentClient, LaunchMethod } from '@reticlehq/core/telemetry';
11
+ export declare function envAgentClient(env: NodeJS.ProcessEnv): AgentClient | undefined;
12
+ /** The client for an event being built now. */
13
+ export declare function currentAgentClient(env: NodeJS.ProcessEnv): AgentClient | undefined;
14
+ /** How the process was launched, from the path of its entry script. Only the bucket leaves. */
15
+ export declare function launchMethodOf(entry: string | undefined): LaunchMethod;
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Which coding agent an event came from, as a closed value — and how the running `reticle` was
3
+ * launched. Both are envelope fields, read per event (the client) or once per process (the launch).
4
+ *
5
+ * The client is the MCP handshake's `clientInfo.name` for the call in flight (or the only agent
6
+ * attached), normalised by `agentClientOf`. When no handshake has said anything — a one-shot CLI
7
+ * command, a proxy, a client that skipped `initialize` — the agent's own marker in the environment
8
+ * of what it spawned is the fallback. Only markers an agent sets on purpose are read.
9
+ */
10
+ import { AgentClient, LaunchMethod } from '@reticlehq/core/telemetry';
11
+ import { agentClientOf, callingClientName } from '../hooks/coding-agents.js';
12
+ /**
13
+ * Environment markers a coding agent sets on the processes it spawns. A shared daemon inherits the
14
+ * environment of whichever agent started it, so this is a fallback after the handshake, never ahead
15
+ * of it.
16
+ */
17
+ const ENV_MARKERS = [
18
+ ['CLAUDECODE', AgentClient.CLAUDE_CODE],
19
+ ['CODEX_SANDBOX', AgentClient.CODEX],
20
+ ['CODEX_MANAGED_BY_NPM', AgentClient.CODEX],
21
+ ['CURSOR_TRACE_ID', AgentClient.CURSOR],
22
+ ['GEMINI_CLI', AgentClient.GEMINI_CLI],
23
+ ];
24
+ export function envAgentClient(env) {
25
+ return ENV_MARKERS.find(([key]) => (env[key] ?? '') !== '')?.[1];
26
+ }
27
+ /** The client for an event being built now. */
28
+ export function currentAgentClient(env) {
29
+ return agentClientOf(callingClientName()) ?? envAgentClient(env);
30
+ }
31
+ /**
32
+ * Where a global install puts packages, by package manager. A path that matches none of these but
33
+ * still sits in a `node_modules` is a project's own dependency.
34
+ */
35
+ const GLOBAL_DIRS = [
36
+ '/lib/node_modules/',
37
+ '/npm/node_modules/',
38
+ '/pnpm/global/',
39
+ '/.volta/',
40
+ '/.bun/install/global/',
41
+ '/yarn/global/',
42
+ '/.nvm/',
43
+ '/.npm-global/',
44
+ ];
45
+ /** How the process was launched, from the path of its entry script. Only the bucket leaves. */
46
+ export function launchMethodOf(entry) {
47
+ if (entry === undefined)
48
+ return LaunchMethod.OTHER;
49
+ const path = entry.replace(/\\/g, '/').toLowerCase();
50
+ if (path.includes('/_npx/') || path.includes('/dlx-'))
51
+ return LaunchMethod.NPX;
52
+ if (GLOBAL_DIRS.some((dir) => path.includes(dir)))
53
+ return LaunchMethod.GLOBAL;
54
+ if (path.includes('/node_modules/'))
55
+ return LaunchMethod.PROJECT;
56
+ return LaunchMethod.OTHER;
57
+ }
@@ -15,8 +15,10 @@
15
15
  */
16
16
  import { OnboardingPhase, OnboardingStepStatus, TelemetryEventKind, } from '@reticlehq/core/telemetry';
17
17
  import { getTelemetry } from './telemetry.js';
18
- import { reportOnboardingStep } from './onboarding-funnel.js';
18
+ import { FirstEver, claimFirstEver, reportFirstStep } from './onboarding-firsts.js';
19
19
  let reported = false;
20
+ /** The on-disk claim for the EVENT, kept apart from the `app_connected` step's own claim. */
21
+ const APP_INSTRUMENTED_CLAIM = 'app_instrumented';
20
22
  /** Set at daemon start so the first connect can report how long the install sat un-instrumented. */
21
23
  let daemonStartedAt;
22
24
  export function markInstrumentationClock(now) {
@@ -32,8 +34,13 @@ export function reportAppInstrumented(facts, now = () => Date.now()) {
32
34
  return;
33
35
  reported = true;
34
36
  try {
37
+ // Still once per RUN: `daemon_started` minus `app_instrumented`, joined on sessionId, is the
38
+ // documented failure side and needs a row per run. Only the true first on this machine +
39
+ // project says `firstEver`, so a per-machine count no longer counts daemon restarts.
40
+ const firstEver = FirstEver.FIRST === claimFirstEver(APP_INSTRUMENTED_CLAIM);
35
41
  void getTelemetry().emit(TelemetryEventKind.APP_INSTRUMENTED, {
36
42
  instrumentation: {
43
+ ...(firstEver ? { firstEver: true } : {}),
37
44
  initialized: facts.initialized,
38
45
  agentAttached: facts.agentAttached,
39
46
  // How long the daemon ran before an app showed up. Large values are the interesting ones:
@@ -47,7 +54,7 @@ export function reportAppInstrumented(facts, now = () => Date.now()) {
47
54
  //
48
55
  // `instrumented` means files were written; THIS means a page actually dialled the bridge. Every
49
56
  // silent install bug so far has lived in the gap between those two.
50
- void reportOnboardingStep({
57
+ reportFirstStep({
51
58
  phase: OnboardingPhase.FIRST_RUN,
52
59
  step: 'app_connected',
53
60
  status: OnboardingStepStatus.COMPLETED,
@@ -19,6 +19,13 @@
19
19
  * never quietly start forwarding free text.
20
20
  */
21
21
  export declare const OTHER_VALUE = "other";
22
+ /**
23
+ * Add values WE define to a parameter's allow-list. The merged tools call this for their `action`
24
+ * values (`reticle_look`'s `page` / `find` / ...): those are keys of a plan in this repository, not
25
+ * input, and without them every grouped call reported `action:other`. Only for a parameter already
26
+ * listed above, so this can widen an enum and never start forwarding a free-text parameter.
27
+ */
28
+ export declare function allowParamValues(name: string, values: Iterable<string>): void;
22
29
  /**
23
30
  * The reportable form of one parameter: `name` on its own, or `name:value` when the parameter is a
24
31
  * known enum. Never the raw value of anything else.
@@ -41,6 +41,19 @@ const SAFE_ENUM_PARAMS = new Map([
41
41
  ['level', new Set(['error', 'warn', 'info', 'log', 'debug'])],
42
42
  ]);
43
43
  export const OTHER_VALUE = 'other';
44
+ /**
45
+ * Add values WE define to a parameter's allow-list. The merged tools call this for their `action`
46
+ * values (`reticle_look`'s `page` / `find` / ...): those are keys of a plan in this repository, not
47
+ * input, and without them every grouped call reported `action:other`. Only for a parameter already
48
+ * listed above, so this can widen an enum and never start forwarding a free-text parameter.
49
+ */
50
+ export function allowParamValues(name, values) {
51
+ const allowed = SAFE_ENUM_PARAMS.get(name);
52
+ if (allowed === undefined)
53
+ return;
54
+ for (const value of values)
55
+ allowed.add(value);
56
+ }
44
57
  /**
45
58
  * The reportable form of one parameter: `name` on its own, or `name:value` when the parameter is a
46
59
  * known enum. Never the raw value of anything else.
@@ -82,11 +95,83 @@ export function describeToolParams(args) {
82
95
  export function describeCliFlags(argv) {
83
96
  const flags = new Set();
84
97
  for (const arg of argv) {
98
+ // A bare `--` ends the options: everything after it is passed through to something else.
99
+ if (END_OF_OPTIONS === arg)
100
+ break;
85
101
  if (!arg.startsWith('--'))
86
102
  continue;
87
103
  // `--port=9000` — split so the NAME is reported and the value is discarded with everything else.
88
104
  const name = arg.split('=')[0] ?? arg;
89
- flags.add(name);
105
+ flags.add(KNOWN_CLI_FLAGS.has(name) ? name : OTHER_VALUE);
90
106
  }
91
107
  return [...flags].sort();
92
108
  }
109
+ const END_OF_OPTIONS = '--';
110
+ /**
111
+ * The flags the CLI defines. Anything else is reported as `other`: a flag NAME the user typed can
112
+ * carry their own word as easily as a value can. Hand-listed because the CLI parses its flags in
113
+ * many places with no shared table; a flag missing here reports `other`, which loses a count and
114
+ * leaks nothing.
115
+ */
116
+ const KNOWN_CLI_FLAGS = new Set([
117
+ '--accept-coverage',
118
+ '--agent',
119
+ '--app',
120
+ '--bug',
121
+ '--capture-bodies',
122
+ '--confirm-dangerous',
123
+ '--dir',
124
+ '--drive',
125
+ '--drive-model',
126
+ '--dry-run',
127
+ '--email',
128
+ '--env',
129
+ '--expect',
130
+ '--expect-file',
131
+ '--explore',
132
+ '--files-only',
133
+ '--fix',
134
+ '--flow',
135
+ '--force',
136
+ '--headed',
137
+ '--headless',
138
+ '--help',
139
+ '--hook',
140
+ '--hooks',
141
+ '--http',
142
+ '--http-port',
143
+ '--http-token',
144
+ '--install-secs',
145
+ '--json',
146
+ '--kind',
147
+ '--license',
148
+ '--move-history',
149
+ '--no-agents',
150
+ '--no-drive',
151
+ '--no-first-run',
152
+ '--no-install',
153
+ '--no-mcp',
154
+ '--no-open',
155
+ '--persona',
156
+ '--porcelain',
157
+ '--port',
158
+ '--project',
159
+ '--quiet',
160
+ '--rating',
161
+ '--relaunch',
162
+ '--results-json',
163
+ '--runtime-secs',
164
+ '--select',
165
+ '--session',
166
+ '--session-id',
167
+ '--since',
168
+ '--start',
169
+ '--storage-state',
170
+ '--subject',
171
+ '--timeout',
172
+ '--url',
173
+ '--version',
174
+ '--watch',
175
+ '--workspace',
176
+ '--yes',
177
+ ]);
@@ -2,13 +2,12 @@ import { AutomationHint } from '@reticlehq/core/telemetry';
2
2
  interface AutomationInput {
3
3
  env: NodeJS.ProcessEnv;
4
4
  fileExists: (path: string) => boolean;
5
- hasTty: boolean;
6
5
  }
7
6
  /**
8
7
  * The most specific signal that fires, or undefined.
9
8
  *
10
- * Ordered most specific first: a container inside a Codespace with no terminal is one fact about the
11
- * run, and sending the weakest of the three would waste the field. Omitted rather than sent as a
9
+ * Ordered most specific first: an agent sandbox runs in a container, and a container inside a
10
+ * Codespace is one fact about the run; sending the weaker signal would waste the field. Omitted rather than sent as a
12
11
  * "none" value, so its presence is itself the signal — the convention every other advisory field
13
12
  * here follows.
14
13
  */
@@ -23,6 +23,8 @@
23
23
  * - `npm_config_user_agent`. Says which package manager ran us, which every route shares.
24
24
  * - An absent `$DISPLAY`. Every Linux server, every ssh session, and a large share of genuine
25
25
  * developer machines trip it; it separates nothing.
26
+ * - No terminal on stdin/stdout. It was the third signal here, and every MCP stdio server has no
27
+ * terminal, so it fired on nearly every daemon a person's agent started and separated nothing.
26
28
  */
27
29
  import { existsSync } from 'node:fs';
28
30
  import { AutomationHint } from '@reticlehq/core/telemetry';
@@ -35,21 +37,47 @@ const HOSTED_WORKSPACE_ENV = [
35
37
  'CLOUD_SHELL',
36
38
  'REMOTE_CONTAINERS',
37
39
  ];
40
+ /**
41
+ * CI vendors' own variables, for the runners and self-hosted agents that do not set `CI`. Each is
42
+ * set by the runner itself; a person's shell does not carry them.
43
+ */
44
+ const CI_VENDOR_ENV = [
45
+ 'GITHUB_ACTIONS',
46
+ 'GITLAB_CI',
47
+ 'BUILDKITE',
48
+ 'CIRCLECI',
49
+ 'JENKINS_URL',
50
+ 'TF_BUILD',
51
+ 'TEAMCITY_VERSION',
52
+ 'BITBUCKET_BUILD_NUMBER',
53
+ 'CODEBUILD_BUILD_ID',
54
+ 'DRONE',
55
+ 'TRAVIS',
56
+ ];
57
+ /**
58
+ * Hosted coding-agent sandboxes that declare themselves to what they spawn. Only markers the agent
59
+ * sets on purpose for a REMOTE session: a local agent's own marker (`CLAUDECODE`) is a person at a
60
+ * laptop and belongs to `client`, not here.
61
+ */
62
+ const AGENT_SANDBOX_ENV = ['CLAUDE_CODE_REMOTE'];
63
+ const declared = (env, keys) => keys.some((k) => (env[k] ?? '') !== '' && 'false' !== env[k]);
38
64
  /**
39
65
  * The most specific signal that fires, or undefined.
40
66
  *
41
- * Ordered most specific first: a container inside a Codespace with no terminal is one fact about the
42
- * run, and sending the weakest of the three would waste the field. Omitted rather than sent as a
67
+ * Ordered most specific first: an agent sandbox runs in a container, and a container inside a
68
+ * Codespace is one fact about the run; sending the weaker signal would waste the field. Omitted rather than sent as a
43
69
  * "none" value, so its presence is itself the signal — the convention every other advisory field
44
70
  * here follows.
45
71
  */
46
72
  export function resolveAutomationHint(input) {
73
+ if (declared(input.env, AGENT_SANDBOX_ENV))
74
+ return AutomationHint.AGENT_SANDBOX;
75
+ if (declared(input.env, CI_VENDOR_ENV))
76
+ return AutomationHint.CI_RUNNER;
47
77
  if (CONTAINER_MARKERS.some((m) => input.fileExists(m)))
48
78
  return AutomationHint.CONTAINER;
49
- if (HOSTED_WORKSPACE_ENV.some((k) => (input.env[k] ?? '') !== ''))
79
+ if (declared(input.env, HOSTED_WORKSPACE_ENV))
50
80
  return AutomationHint.HOSTED_WORKSPACE;
51
- if (!input.hasTty)
52
- return AutomationHint.NO_TTY;
53
81
  return undefined;
54
82
  }
55
83
  /** The real reading, taken once per process. */
@@ -64,8 +92,5 @@ export function currentAutomationHint(env) {
64
92
  return false; // an unreadable root is not evidence of anything
65
93
  }
66
94
  },
67
- // Both ends, because a piped stdout alone is how `reticle status | jq` looks, and that is a
68
- // person typing.
69
- hasTty: true === process.stdout.isTTY || true === process.stdin.isTTY,
70
95
  });
71
96
  }
@@ -13,7 +13,8 @@ import { join } from 'node:path';
13
13
  /** Where the installer left its breadcrumbs. Same directory the telemetry id and opt-out live in. */
14
14
  const RETICLE_STATE_DIR = process.env['RETICLE_STATE_DIR'] ?? join(homedir(), '.reticle');
15
15
  import { describeCliFlags } from './argument-shape.js';
16
- import { resolveInstallSource } from './install-source.js';
16
+ import { rememberInstallSource, resolveInstallSource } from './install-source.js';
17
+ import { installPlatformLinkTelemetry } from './platform-linked.js';
17
18
  /**
18
19
  * Report that a person ran a `reticle` subcommand.
19
20
  *
@@ -53,7 +54,11 @@ export function reportCliRun(argv) {
53
54
  * second invocation finds nothing. A flag would have to live somewhere, and somewhere is another
54
55
  * file that can disagree with this one.
55
56
  */
57
+ // Every process that may link a project, the daemon included, reports it.
58
+ installPlatformLinkTelemetry();
56
59
  drainInstallTrace(RETICLE_STATE_DIR);
60
+ // Before anything reads it: a channel declared on THIS command outlives it.
61
+ rememberInstallSource(process.env, RETICLE_STATE_DIR);
57
62
  if (firstArg === DAEMON_INNER_COMMAND)
58
63
  return;
59
64
  const command = knownCommand(firstArg);
@@ -67,7 +72,7 @@ export function reportCliRun(argv) {
67
72
  detach: true,
68
73
  // WHICH published route brought this machine in. Self-declared by the channel, never inferred
69
74
  // — see install-source.ts for which of the four routes can actually carry the marker.
70
- installSource: resolveInstallSource(),
75
+ installSource: resolveInstallSource(process.env, RETICLE_STATE_DIR),
71
76
  });
72
77
  if (!isHumanCliCommand(command))
73
78
  return;
@@ -15,6 +15,7 @@ import { reticleStateHome } from '../command/daemon/daemon.js';
15
15
  import { startUpdateCheck, updateNudgeState } from '../command/update/update-nudge.js';
16
16
  import { markDaemonStart } from './mcp-connection.js';
17
17
  import { markInstrumentationClock } from './app-instrumented.js';
18
+ import { drainFeedbackOutbox } from './feedback.js';
18
19
  import { markStallClock, STALL_AFTER_MS, stallUptime } from '../portal/session/stall-clock.js';
19
20
  /**
20
21
  * Whether an app for this project has ever reached Reticle, read from the same durable memory the
@@ -91,6 +92,8 @@ export function installDaemonTelemetry(cwd, now = () => Date.now(),
91
92
  port) {
92
93
  const metrics = getSessionMetrics(now);
93
94
  void getTelemetry().emit(TelemetryEventKind.DAEMON_STARTED);
95
+ // Reports a past send could not deliver. Off the boot path, and never able to throw into it.
96
+ void drainFeedbackOutbox().catch(() => undefined);
94
97
  // Ask npm whether a newer Reticle exists, so the agent can tell the human. Nothing checked before
95
98
  // this, so a published fix was invisible until someone manually ran `reticle update`.
96
99
  startUpdateCheck(now);
@@ -1,4 +1,13 @@
1
- /** The skeleton of a message: variable parts blanked, whitespace collapsed, length bounded. */
1
+ /**
2
+ * What an error message may say on the wire, and it is ALLOW-listed: a sentence Reticle authors
3
+ * (sent as our own fixed label), else the bare Node error code or built-in class plus the
4
+ * fingerprint, else the fingerprint alone.
5
+ *
6
+ * It used to be the message with known-variable parts blanked, which is a deny-list, and a
7
+ * deny-list loses: a hostname after `getaddrinfo ENOTFOUND`, a Windows home directory with a space
8
+ * in it, a `~` path and a person's name in free text all reached the wire. Nothing written by
9
+ * anybody else survives this function, because it never echoes its input.
10
+ */
2
11
  export declare function errorSkeleton(message: string): string;
3
12
  /** A stable, opaque group key for an error message. Same defect ⇒ same key, on every machine. */
4
13
  export declare function fingerprintError(message: string): string;