@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
@@ -11,6 +11,12 @@
11
11
  * A repo already knows its name: the directory it lives in. That is not a guess, it is the name its
12
12
  * owner chose and the one they will look for in a project list.
13
13
  */
14
+ import { createHash } from 'node:crypto';
15
+ import { execFileSync } from 'node:child_process';
16
+ import { relative } from 'node:path';
17
+ import { z } from 'zod';
18
+ import { PROJECT_ID_HASH_LENGTH } from '@reticlehq/core';
19
+ import { CredentialRefusedError, api, hint } from './cloud-kit.js';
14
20
  /** Cap the slug so a deep or oddly-named checkout cannot produce an unreadable project id. */
15
21
  const MAX_SLUG = 48;
16
22
  /** The id used when a directory name yields nothing usable — the historical behaviour, unchanged. */
@@ -37,8 +43,107 @@ export const slugifyProjectName = (raw) => {
37
43
  * do to rotate a key or repoint an environment — must land in that same project or the history
38
44
  * silently splits in two, which is worse than the shared-bucket problem this fixes.
39
45
  */
40
- export const defaultProjectFor = (cwdBasename, existingProjectId) => {
46
+ export const defaultProjectFor = (cwdBasename, existingProjectId,
47
+ /** The `projectId` `init` wrote into `.reticle.json`, when there is one. */
48
+ localProjectId) => {
41
49
  if (existingProjectId !== undefined && existingProjectId.length > 0)
42
50
  return existingProjectId;
43
- return slugifyProjectName(cwdBasename);
51
+ // The name part of `init`'s `<name>-<hash>`, else the id as written: a name the owner chose.
52
+ const named = localProjectId === undefined || 0 === localProjectId.length
53
+ ? undefined
54
+ : (nameOfLocalId(localProjectId) ?? localProjectId);
55
+ return slugifyProjectName(named ?? cwdBasename);
44
56
  };
57
+ /** `init`'s id is the app's name and a short hash of where it lives: `nina-todo-f96721e8`. */
58
+ const LOCAL_ID = new RegExp(`^(.+)-[0-9a-f]{${String(PROJECT_ID_HASH_LENGTH)}}$`);
59
+ /**
60
+ * The name part of the id `init` wrote. One project carried two names: `.reticle.json` said
61
+ * `nina-todo-f96721e8` (from the package) while the dashboard said `app` (the folder), so the person
62
+ * looked for one and the list showed the other. The dashboard now takes the name `init` wrote.
63
+ */
64
+ function nameOfLocalId(localProjectId) {
65
+ return LOCAL_ID.exec(localProjectId)?.[1];
66
+ }
67
+ export const CreatedProjectSchema = z.object({ projectId: z.string(), name: z.string() });
68
+ const ProjectsListSchema = z.object({
69
+ projects: z.array(z.object({ projectId: z.string(), name: z.string(), repo: z.string().optional() })),
70
+ });
71
+ /** ` in workspace "<name>"`, or nothing when no name is known. */
72
+ export const inWorkspace = (name) => name === undefined || 0 === name.length ? '' : ` in workspace "${name}"`;
73
+ /** Characters of the repository identity: enough to tell repositories apart, nothing to read. */
74
+ const REPO_ID_CHARS = 16;
75
+ /**
76
+ * Which repository, and which folder in it, a project folder is: a hash of the `origin` remote and
77
+ * the folder's path inside the checkout, so every clone of one app agrees and two different apps
78
+ * both named `web` do not. Undefined outside git or with no remote. Neither leaves the machine.
79
+ */
80
+ export function repoIdentity(dir) {
81
+ try {
82
+ const git = (...args) => execFileSync('git', args, {
83
+ cwd: dir,
84
+ encoding: 'utf8',
85
+ stdio: ['ignore', 'pipe', 'ignore'],
86
+ }).trim();
87
+ const remote = git('config', '--get', 'remote.origin.url')
88
+ .replace(/\.git$/, '')
89
+ .replace(/^[a-z+]+:\/\/|^[^@]+@/i, '')
90
+ .replace(':', '/')
91
+ .toLowerCase();
92
+ if (0 === remote.length)
93
+ return undefined;
94
+ const inside = relative(git('rev-parse', '--show-toplevel'), dir).split('\\').join('/');
95
+ return createHash('sha256')
96
+ .update(`${remote}\u0000${inside}`)
97
+ .digest('hex')
98
+ .slice(0, REPO_ID_CHARS);
99
+ }
100
+ catch {
101
+ return undefined;
102
+ }
103
+ }
104
+ /**
105
+ * The id for the project the caller named, creating it if it does not exist yet — and saying so,
106
+ * in which workspace. A project of that NAME made for another repository is not reused: two apps
107
+ * whose package is `web` shared one dashboard project. A project with no recorded repository, or an
108
+ * id named outright, is reused as before.
109
+ */
110
+ /** Projects named when creating one was refused. */
111
+ const MAX_NAMED = 5;
112
+ export async function resolveProjectId(url, token, wanted, workspace, repo,
113
+ /**
114
+ * The id `init` wrote into `.reticle.json`, for a project created by default: the platform is
115
+ * asked to keep it, so the folder and the dashboard name one project by one id. A platform that
116
+ * does not know the field ignores it and answers with its own, which is what gets linked.
117
+ */
118
+ localId) {
119
+ const { projects } = ProjectsListSchema.parse(await api('GET', `${url}/v1/projects`, token));
120
+ const lc = wanted.toLowerCase();
121
+ const holding = localId === undefined ? undefined : projects.find((p) => p.projectId === localId);
122
+ if (holding !== undefined)
123
+ return holding.projectId;
124
+ const match = projects.find((p) => p.projectId === wanted ||
125
+ (p.name.toLowerCase() === lc &&
126
+ (repo === undefined || p.repo === undefined || p.repo === repo)));
127
+ if (match !== undefined)
128
+ return match.projectId;
129
+ let answer;
130
+ try {
131
+ answer = await api('POST', `${url}/v1/projects`, token, {
132
+ name: wanted,
133
+ ...(repo === undefined ? {} : { repo }),
134
+ ...(localId === undefined ? {} : { projectId: localId }),
135
+ });
136
+ }
137
+ catch (error) {
138
+ // Refused to create one (a contributor): the platform's words, then the step that works.
139
+ if (error instanceof CredentialRefusedError ||
140
+ !(error instanceof Error) ||
141
+ 0 === projects.length)
142
+ throw error;
143
+ const names = projects.map((p) => p.name).slice(0, MAX_NAMED);
144
+ throw new Error(`${error.message}\nTo link one that exists: ${names.map((n) => `\`reticle connect --project ${n}\``).join(', ')}`);
145
+ }
146
+ const created = CreatedProjectSchema.parse(answer);
147
+ hint(`created project "${wanted}" (${created.projectId})${inWorkspace(workspace)} — it did not exist yet`);
148
+ return created.projectId;
149
+ }
@@ -14,7 +14,23 @@ import type { OnboardingStep } from '@reticlehq/core/telemetry';
14
14
  * so the entry point supplies it and every layer below stays a function of its arguments.
15
15
  */
16
16
  export type StepReporter = (step: OnboardingStep) => void;
17
- export declare function handleSetupMcp(reportStep: StepReporter, standalone?: boolean): void;
17
+ /** How many coding agents on this machine have Reticle's tools after this run. */
18
+ export declare function handleSetupMcp(reportStep: StepReporter, standalone?: boolean): number;
19
+ /**
20
+ * The one line the launchers read and strip: what they cannot know and the next steps depend on.
21
+ *
22
+ * The launchers own the closing words (served from main, so wording changes on merge) and used to
23
+ * print "restart your coding agent" to a machine with none, and "cd your-app" to somebody already
24
+ * standing in it. An older launcher shows this line as is; a launcher reading an older CLI finds no
25
+ * line and keeps its generic wording, so neither half has to ship first.
26
+ */
27
+ export declare const INSTALL_RESULT_PREFIX = "RETICLE_INSTALL";
28
+ /** Whether the folder the installer ran in is an app: `init` runs here, or after a `cd`. */
29
+ export declare const InstallAppHere: {
30
+ readonly HERE: "here";
31
+ readonly NONE: "none";
32
+ };
33
+ export declare function installResultLine(agents: number, cwd: string): string;
18
34
  /**
19
35
  * `reticle setup install` — the Node half of the one-line installer.
20
36
  *
@@ -1,11 +1,12 @@
1
1
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
2
- import { dirname } from 'node:path';
2
+ import { dirname, join } from 'node:path';
3
3
  import { homedir } from 'node:os';
4
4
  import { claudeAddCommand, McpClient, probeCli, terminalWidth, wrapForTerminal, } from '@reticlehq/init';
5
- import { installClosing, tutorialShownSteps } from './tutorial.js';
5
+ import { tutorialShownSteps } from './tutorial.js';
6
6
  import { setupMcp, knownClientLabels } from '../setup/setup-mcp.js';
7
7
  import { reportInstallSteps } from '../setup/setup-install.js';
8
8
  import { registerOtherAgents } from '../setup/setup-command.js';
9
+ /** How many coding agents on this machine have Reticle's tools after this run. */
9
10
  export function handleSetupMcp(reportStep, standalone = true) {
10
11
  const io = {
11
12
  exists: (p) => existsSync(p),
@@ -45,7 +46,7 @@ export function handleSetupMcp(reportStep, standalone = true) {
45
46
  io.print(0 < preRegistered
46
47
  ? `None of ${knownClientLabels().join(', ')} is installed here yet. The agents above are pre-registered and have Reticle's tools once installed; install one of the others, then run \`reticle setup mcp\` again.`
47
48
  : `No coding agent config found. Looked for: ${knownClientLabels().join(', ')}. Install one, then run \`reticle setup mcp\` again.`);
48
- return;
49
+ return 0;
49
50
  }
50
51
  for (const id of result.registered)
51
52
  io.print(` ✓ ${id}`);
@@ -92,6 +93,25 @@ export function handleSetupMcp(reportStep, standalone = true) {
92
93
  io.print('Restart your agent for it to pick up the new server.');
93
94
  io.print('Then: cd <your project> && reticle init');
94
95
  }
96
+ return result.registered.length + result.alreadyThere.length;
97
+ }
98
+ /**
99
+ * The one line the launchers read and strip: what they cannot know and the next steps depend on.
100
+ *
101
+ * The launchers own the closing words (served from main, so wording changes on merge) and used to
102
+ * print "restart your coding agent" to a machine with none, and "cd your-app" to somebody already
103
+ * standing in it. An older launcher shows this line as is; a launcher reading an older CLI finds no
104
+ * line and keeps its generic wording, so neither half has to ship first.
105
+ */
106
+ export const INSTALL_RESULT_PREFIX = 'RETICLE_INSTALL';
107
+ const APP_MARKERS = ['package.json', 'index.html'];
108
+ /** Whether the folder the installer ran in is an app: `init` runs here, or after a `cd`. */
109
+ export const InstallAppHere = { HERE: 'here', NONE: 'none' };
110
+ export function installResultLine(agents, cwd) {
111
+ const app = APP_MARKERS.some((file) => existsSync(join(cwd, file)))
112
+ ? InstallAppHere.HERE
113
+ : InstallAppHere.NONE;
114
+ return `${INSTALL_RESULT_PREFIX} agents=${String(agents)} app=${app}`;
95
115
  }
96
116
  /**
97
117
  * `reticle setup install` — the Node half of the one-line installer.
@@ -102,16 +122,17 @@ export function handleSetupMcp(reportStep, standalone = true) {
102
122
  */
103
123
  export function handleSetupInstall(opts, reportStep) {
104
124
  reportInstallSteps({ runtimeSecs: opts.runtimeSecs, installSecs: opts.installSecs }, reportStep);
125
+ let agents = 0;
105
126
  if (opts.mcp) {
106
- handleSetupMcp(reportStep, false);
127
+ agents = handleSetupMcp(reportStep, false);
107
128
  }
108
129
  else {
109
130
  process.stdout.write('Skipping MCP registration (--no-mcp).\n');
110
131
  }
111
- // Installation and onboarding are one script, so the tour prints here and is not gated on
112
- // anything — see installClosing for the heuristic this replaced and why it reached nobody.
113
- process.stdout.write(`${wrapForTerminal(installClosing(opts.mcp), terminalWidth())}\n`);
114
- // Shown, so the ONBOARD steps are a fact rather than a guess.
132
+ // No closing here: the installer prints the next step and the agent prompt itself, right after
133
+ // this returns, so what this prints is progress and nothing else. Those two blocks are what the
134
+ // ONBOARD steps below now stand for: what Reticle is for, shown before anything is asked of anyone.
115
135
  for (const step of tutorialShownSteps())
116
136
  reportStep(step);
137
+ process.stdout.write(`${installResultLine(agents, process.cwd())}\n`);
117
138
  }
@@ -19,6 +19,7 @@ export declare const StatusLabel: {
19
19
  readonly DAEMON: "daemon";
20
20
  readonly SESSIONS: "sessions";
21
21
  readonly AGENT_LINK: "agent link";
22
+ readonly ACCOUNT: "account";
22
23
  readonly NEXT: "next";
23
24
  readonly SPLIT_BRAIN: "split brain";
24
25
  readonly UPDATE: "update";
@@ -19,6 +19,7 @@ export const StatusLabel = {
19
19
  DAEMON: 'daemon',
20
20
  SESSIONS: 'sessions',
21
21
  AGENT_LINK: 'agent link',
22
+ ACCOUNT: 'account',
22
23
  NEXT: 'next',
23
24
  SPLIT_BRAIN: 'split brain',
24
25
  UPDATE: 'update',
@@ -101,9 +102,40 @@ export function statusLines(fields) {
101
102
  if (why !== undefined)
102
103
  lines.push(continuation(why));
103
104
  }
105
+ // Who is signed in, and whether this repo is linked: what `whoami` used to answer. Only when the
106
+ // caller looked, which is what the key being present means.
107
+ if ('signedInAs' in fields) {
108
+ const who = str(fields, 'signedInAs');
109
+ const project = str(fields, 'linkedProject');
110
+ // Signed in to one workspace, a repo can still send to another: say which it sends to.
111
+ const workspace = str(fields, 'linkedWorkspace');
112
+ // A key the platform refused at the last sync is the answer, not "not signed in": a member
113
+ // removed from the workspace was told to connect while the key was set, and refused.
114
+ const refused = str(fields, 'keyRefused');
115
+ lines.push(row(StatusLabel.ACCOUNT, refused !== undefined
116
+ ? `${NOT_OK} refused at the last sync: ${refused}`
117
+ : who === undefined
118
+ ? `${NOT_OK} not signed in`
119
+ : `${OK} signed in as ${who}`));
120
+ const apps = appLinks(fields['workspaceApps']);
121
+ if (project === undefined && 0 < apps.length)
122
+ for (const { app, project: linked } of apps)
123
+ lines.push(continuation(null === linked
124
+ ? `${app} is not linked: run \`reticle connect\` in ${app}`
125
+ : `${app} is linked to ${linked}`));
126
+ else
127
+ lines.push(continuation(project === undefined
128
+ ? 'this repo is not linked: run `reticle connect`'
129
+ : `this repo is linked to ${project}${workspace === undefined ? '' : ` in workspace "${workspace}"`}`));
130
+ }
104
131
  const client = str(fields, 'mcpClient');
105
- if (client !== undefined)
106
- lines.push(row(StatusLabel.AGENT_LINK, client));
132
+ if (client !== undefined) {
133
+ // The state in words (`mcpClientSaid`), never the record's own name for it.
134
+ lines.push(row(StatusLabel.AGENT_LINK, str(fields, 'mcpClientSaid') ?? client));
135
+ const action = str(fields, 'mcpClientAction');
136
+ if (action !== undefined)
137
+ lines.push(continuation(action));
138
+ }
107
139
  for (const [label, key] of [
108
140
  [StatusLabel.NEXT, 'nextAction'],
109
141
  [StatusLabel.SPLIT_BRAIN, 'splitBrain'],
@@ -115,3 +147,16 @@ export function statusLines(fields) {
115
147
  }
116
148
  return lines;
117
149
  }
150
+ /** A workspace root's apps and their links, read defensively off the status fields. */
151
+ function appLinks(value) {
152
+ if (!Array.isArray(value))
153
+ return [];
154
+ return value.flatMap((raw) => {
155
+ if ('object' !== typeof raw || null === raw)
156
+ return [];
157
+ const { app, project } = raw;
158
+ return 'string' === typeof app
159
+ ? [{ app, project: 'string' === typeof project ? project : null }]
160
+ : [];
161
+ });
162
+ }
@@ -0,0 +1,10 @@
1
+ export interface AppLink {
2
+ /** The app's directory, relative to the root. */
3
+ app: string;
4
+ /** The project it sends to, or null when it is not linked. */
5
+ project: string | null;
6
+ }
7
+ /** Each app under `root`, in name order, with its link. Empty when `root` is no workspace. */
8
+ export declare function workspaceAppLinks(root: string, linkOf: (appDir: string) => Promise<string | null>): Promise<AppLink[]>;
9
+ /** The project an app folder's link file names, or null with none: local only, as status is. */
10
+ export declare function localLinkOf(appDir: string): Promise<string | null>;
@@ -0,0 +1,29 @@
1
+ /**
2
+ * The apps of a workspace root and the project each is linked to, for `reticle status` run at a root
3
+ * that is no app of its own: "this repo is not linked" there named nothing that could be acted on.
4
+ */
5
+ import { readFileSync } from 'node:fs';
6
+ import { join } from 'node:path';
7
+ import { ReticleDir, asRecord, asString } from '@reticlehq/core';
8
+ import { SILENT_HOST, buildNodeIo, findWorkspaceApps } from '@reticlehq/init';
9
+ /** Each app under `root`, in name order, with its link. Empty when `root` is no workspace. */
10
+ export async function workspaceAppLinks(root, linkOf) {
11
+ let apps;
12
+ try {
13
+ apps = findWorkspaceApps(buildNodeIo(root, SILENT_HOST));
14
+ }
15
+ catch {
16
+ return [];
17
+ }
18
+ return Promise.all([...apps].sort().map(async (app) => ({ app, project: await linkOf(join(root, app)) })));
19
+ }
20
+ /** The project an app folder's link file names, or null with none: local only, as status is. */
21
+ export function localLinkOf(appDir) {
22
+ try {
23
+ const link = JSON.parse(readFileSync(join(appDir, ReticleDir.ROOT, ReticleDir.CLOUD_LINK_FILE), 'utf8'));
24
+ return Promise.resolve(asString(asRecord(link)['projectId']) ?? null);
25
+ }
26
+ catch {
27
+ return Promise.resolve(null);
28
+ }
29
+ }
@@ -0,0 +1,96 @@
1
+ import type { CloudConfig } from '../../memory/cloud/cloud-sync.js';
2
+ import { type FreeDrive } from '../../features/harness/platform/platform-drives.js';
3
+ export declare const MSG_SIGN_IN_FIRST = "Sign in first: reticle connect (it is free, no card)";
4
+ /** The whole drive, model turns and browser included, before the CLI stops waiting for it. */
5
+ export declare const TRY_BUDGET_MS = 120000;
6
+ /** Model turns in the one free drive. Bounds what it costs, not what it may find. */
7
+ export declare const TRY_MAX_STEPS = 40;
8
+ export interface TryJourney {
9
+ title: string;
10
+ status: string;
11
+ }
12
+ /** What one drive came back with, or the sentence that says why it could not run. */
13
+ export interface TryDrive {
14
+ journeys: TryJourney[];
15
+ runIds: string[];
16
+ error?: string;
17
+ }
18
+ export interface TryPorts {
19
+ /** The credential `reticle connect` filed for this folder, or null when it is not linked. */
20
+ linked: () => Promise<CloudConfig | null>;
21
+ requestDrive: (cloud: CloudConfig) => Promise<FreeDrive>;
22
+ drive: (request: {
23
+ url: string;
24
+ driveId: string;
25
+ persona?: string;
26
+ }) => Promise<TryDrive>;
27
+ /** Send the drive's run, as `reticle push` does. True when the cycle succeeded. */
28
+ sync: (runIds: readonly string[]) => Promise<boolean>;
29
+ dashboardUrl: (cloud: CloudConfig) => Promise<string | undefined>;
30
+ out: (line: string) => void;
31
+ fail: (line: string) => void;
32
+ }
33
+ export interface TryArgs {
34
+ url: string;
35
+ persona?: string;
36
+ }
37
+ /** `try <url> [--persona <who>]`, or the sentence that says what is missing. */
38
+ export declare function parseTryArgs(argv: readonly string[]): TryArgs | {
39
+ error: string;
40
+ };
41
+ /** The summary, worst news last so it is the line a reader's eye lands on. Pure. */
42
+ export declare function summarizeTry(journeys: readonly TryJourney[]): string[];
43
+ export declare function runTry(args: TryArgs, ports: TryPorts): Promise<number>;
44
+ /** The journeys out of an explore report, or one journey graded from the drive when unplanned. */
45
+ export declare function journeysOf(report: Record<string, unknown>, persona?: string): TryJourney[];
46
+ /** What `try` borrows from the cloud commands, passed in so neither module imports the other. */
47
+ export interface TryCloud {
48
+ push: () => Promise<number>;
49
+ dashboardUrl: (cloud: CloudConfig) => Promise<string | undefined>;
50
+ }
51
+ /** `reticle try`, wired to this machine. Returns the exit code. */
52
+ export declare function cmdTry(argv: readonly string[], cloudCommands: TryCloud): Promise<number>;
53
+ /**
54
+ * How `init` ends once the connection is proved: what Reticle sees of the app, what it is missing,
55
+ * and the prompt that hands the rest to the coding agent, which proves the first flow. `init` never
56
+ * drives: the Harness is opt-in and unlocks at a coverage score (core's `instrumentation-coverage.ts`), and a
57
+ * freshly wired app is rarely there yet.
58
+ *
59
+ * Read from the daemon's `/status`, the same coverage `doctor` prints, so the two never disagree.
60
+ */
61
+ /** What a project that is not linked is told, once, at the end. */
62
+ export declare const UNLINKED_PITCH: string[];
63
+ /** Prove one flow with the coding agent: the line every ending names. */
64
+ export declare const msgProveOneFlow: (url: string) => string;
65
+ /**
66
+ * The closing lines for one tab's coverage, as `/status` reports it: the score, what is missing, the
67
+ * Harness gate in its own sentence, and the prompt for the coding agent. Pure.
68
+ */
69
+ export declare function initCoverageLines(tab: Record<string, unknown> | undefined, url: string): string[];
70
+ /**
71
+ * This project's runs and flows that will never reach the dashboard as things stand, one line each:
72
+ * not linked, no key for its host, flow sync off, or refused. A linked root's pending runs are left
73
+ * out, because the daemon sends them within seconds and saying so would be noise.
74
+ */
75
+ export declare function strandedWorkLines(appDir: string): Promise<string[]>;
76
+ /** What `init` hands its ending, once the connection is proved. */
77
+ export interface FirstFlowContext {
78
+ appDir: string;
79
+ bridgePort: number;
80
+ pairingToken?: string | undefined;
81
+ url: string;
82
+ sessionId: string;
83
+ /** The proof came from a Reticle-owned browser, now closed: its own tab cannot be measured. */
84
+ leased: boolean;
85
+ openBrowser: boolean;
86
+ /** False for `--no-first-run`: connect, and say nothing more. */
87
+ firstRun: boolean;
88
+ json: boolean;
89
+ }
90
+ /**
91
+ * How `init` ends: the coverage score, the gaps and the agent prompt, the pitch when the project is
92
+ * not linked, then what will never reach the dashboard. Nothing is driven. Never throws.
93
+ */
94
+ export declare function initFirstFlow(ctx: FirstFlowContext, say: (line: string) => void): Promise<{
95
+ flowSaved: boolean;
96
+ }>;