@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
@@ -30,4 +30,7 @@ export declare function daemonStartOptions(parsed: DaemonFlags): StartOptions;
30
30
  * idea: that headless belongs to the drive URL. It belongs to the pool, which exists either way.
31
31
  */
32
32
  export declare function daemonSpawnArgs(parsed: DaemonFlags): string[];
33
+ /** Set (to anything but '', '0' or 'false') to hide every browser Reticle opens. Batteries set it. */
34
+ export declare const HEADLESS_ENV = "RETICLE_HEADLESS";
35
+ export declare function headlessByDefault(env: Readonly<Record<string, string | undefined>>, platform: string): boolean;
33
36
  export {};
@@ -1,4 +1,4 @@
1
- import { DAEMON_INNER_COMMAND, DRIVE_FLAG, HEADED_FLAG, HTTP_FLAG, HTTP_PORT_FLAG, HTTP_TOKEN_FLAG, PORT_FLAG, } from './cli-parse.js';
1
+ import { DAEMON_INNER_COMMAND, DRIVE_FLAG, HEADED_FLAG, HEADLESS_FLAG, HTTP_FLAG, HTTP_PORT_FLAG, HTTP_TOKEN_FLAG, PORT_FLAG, } from './cli-parse.js';
2
2
  export function daemonStartOptions(parsed) {
3
3
  return {
4
4
  port: parsed.port,
@@ -25,8 +25,9 @@ export function daemonSpawnArgs(parsed) {
25
25
  const args = [DAEMON_INNER_COMMAND, PORT_FLAG, String(parsed.port)];
26
26
  if (parsed.driveUrl !== undefined)
27
27
  args.push(DRIVE_FLAG, parsed.driveUrl);
28
- if (!parsed.headless)
29
- args.push(HEADED_FLAG);
28
+ // Said either way: the child decides its own default from its environment, so a parent that
29
+ // resolved hidden must say so rather than leave it to a default that may differ.
30
+ args.push(parsed.headless ? HEADLESS_FLAG : HEADED_FLAG);
30
31
  if (parsed.http) {
31
32
  args.push(HTTP_FLAG);
32
33
  if (parsed.httpPort !== undefined)
@@ -36,3 +37,23 @@ export function daemonSpawnArgs(parsed) {
36
37
  }
37
38
  return args;
38
39
  }
40
+ /*
41
+ * Whether a browser a daemon opens is shown or hidden when no flag says. Here because both callers that
42
+ * decide it -- `cli.ts` and init's bring-up -- already start daemons through this module.
43
+ */
44
+ /** Set (to anything but '', '0' or 'false') to hide every browser Reticle opens. Batteries set it. */
45
+ export const HEADLESS_ENV = 'RETICLE_HEADLESS';
46
+ /**
47
+ * Whether a browser Reticle opens is hidden when no flag says. Shown by default, for every command:
48
+ * the pool behind `serve`/`mcp` used to be hidden on the theory that nobody watches batch work, and
49
+ * from the field that was a person watching an agent drive their app and seeing nothing happen.
50
+ * Hidden where showing is impossible or unwanted: CI, the test batteries, and a Linux machine with
51
+ * no display server, where a headed launch fails instead of showing anything.
52
+ */
53
+ const OFF = new Set(['', '0', 'false']);
54
+ export function headlessByDefault(env, platform) {
55
+ const forced = env[HEADLESS_ENV];
56
+ if (env['CI'] !== undefined || (forced !== undefined && !OFF.has(forced)))
57
+ return true;
58
+ return ('linux' === platform && env['DISPLAY'] === undefined && env['WAYLAND_DISPLAY'] === undefined);
59
+ }
@@ -0,0 +1,2 @@
1
+ /** The rows for every tab the status names; nothing when it names none. Never throws. */
2
+ export declare function coverageLines(status: unknown): string[];
@@ -0,0 +1,47 @@
1
+ /**
2
+ * `doctor`'s coverage rows: what Reticle sees in each connected app, read from the daemon's
3
+ * `/status` (`coverage`), and — once a verdict recorded a gap — the prompt to hand a coding agent.
4
+ * A terminal cannot copy, so the prompt is printed whole, ready to paste.
5
+ */
6
+ import { DoctorRow, doctorRow } from './doctor-rows.js';
7
+ const capabilitiesIn = (value) => Array.isArray(value)
8
+ ? value.flatMap((item) => {
9
+ const name = 'object' === typeof item && null !== item
10
+ ? item['capability']
11
+ : item;
12
+ return 'string' === typeof name ? [name] : [];
13
+ })
14
+ : [];
15
+ /** The rows for every tab the status names; nothing when it names none. Never throws. */
16
+ export function coverageLines(status) {
17
+ const list = 'object' === typeof status && null !== status
18
+ ? status['coverage']
19
+ : undefined;
20
+ if (!Array.isArray(list))
21
+ return [];
22
+ return list.flatMap((raw) => {
23
+ const tab = ('object' === typeof raw && null !== raw ? raw : {});
24
+ if ('number' !== typeof tab.covered || 'number' !== typeof tab.total)
25
+ return [];
26
+ const missing = capabilitiesIn(tab.missing);
27
+ const notSeen = capabilitiesIn(tab.notSeenYet);
28
+ const parts = [
29
+ `${String(tab.covered)}/${String(tab.total)}${'string' === typeof tab.url ? ` at ${tab.url}` : ''}`,
30
+ ...(0 === missing.length ? [] : [`missing: ${missing.join(', ')}`]),
31
+ ...(0 === notSeen.length ? [] : [`not seen yet: ${notSeen.join(', ')}`]),
32
+ ];
33
+ const prompt = 'string' === typeof tab.prompt
34
+ ? [
35
+ ' prompt for your coding agent (copy it):',
36
+ ...tab.prompt.split('\n').map((line) => ` ${line}`),
37
+ ]
38
+ : [];
39
+ const gate = tab.harnessGate;
40
+ const reason = 'object' === typeof gate && null !== gate
41
+ ? gate['reason']
42
+ : undefined;
43
+ // The Harness gate, in the sentence a refused drive says.
44
+ const locked = 'string' === typeof reason ? [` ${reason}`] : [];
45
+ return [doctorRow(DoctorRow.COVERAGE, parts.join(' — ')), ...locked, ...prompt];
46
+ });
47
+ }
@@ -1,15 +1,3 @@
1
- /**
2
- * Whether `init` has wired THIS directory — the check `doctor` was missing.
3
- *
4
- * `doctor` already read `.reticle.json` for the port, so it knew whether the file existed and never
5
- * said so. In a project where `init` has not run the checklist came out clean: node fine, chromium
6
- * fine, a daemon that starts on demand, a bridge port. Every line true, and the app carrying no SDK
7
- * went unremarked — which is exactly the state that produces "the tools are here and nothing ever
8
- * verifies", and the state `doctor` is run to explain.
9
- *
10
- * Registering the MCP server and instrumenting the app are two different halves of the install, and
11
- * more than one route does the first without the second.
12
- */
13
1
  interface ProjectWiringFacts {
14
2
  /** The id from `.reticle.json`, or undefined when there is no config here. */
15
3
  projectId: string | undefined;
@@ -10,6 +10,7 @@
10
10
  * Registering the MCP server and instrumenting the app are two different halves of the install, and
11
11
  * more than one route does the first without the second.
12
12
  */
13
+ import { DoctorRow, doctorRow } from './doctor-rows.js';
13
14
  /**
14
15
  * One line, in the same shape as the checks beside it.
15
16
  *
@@ -20,16 +21,16 @@
20
21
  */
21
22
  export function projectWiringLine(facts) {
22
23
  if (facts.projectId !== undefined) {
23
- return ` project ✓ wired here (${facts.projectId})`;
24
+ return doctorRow(DoctorRow.PROJECT, `✓ wired here (${facts.projectId})`);
24
25
  }
25
26
  if (facts.previouslyConnected) {
26
- return ' project ✓ an app has connected here before, so it is wired (no .reticle.json — a build plugin can wire an app without one)';
27
+ return doctorRow(DoctorRow.PROJECT, '✓ an app has connected here before, so it is wired (no .reticle.json — a build plugin can wire an app without one)');
27
28
  }
28
29
  if (true === facts.configPresent) {
29
- return (' project ✗ .reticle.json is here but carries no readable projectId — a corrupt or ' +
30
+ return doctorRow(DoctorRow.PROJECT, '✗ .reticle.json is here but carries no readable projectId — a corrupt or ' +
30
31
  'hand-edited config reads the same as no config, and points this project at the default ' +
31
32
  'daemon. Run `npx @reticlehq/server init` in the app directory to rewrite it');
32
33
  }
33
- return (' project ✗ no .reticle.json here and nothing has ever connected — the tools may be ' +
34
+ return doctorRow(DoctorRow.PROJECT, '✗ no .reticle.json here and nothing has ever connected — the tools may be ' +
34
35
  'registered, but this app is not instrumented. Run `npx @reticlehq/server init` in the app directory');
35
36
  }
@@ -40,6 +40,8 @@ export declare const DoctorRow: {
40
40
  * verification." Every row in this list checks a COMPONENT; none checked a LINK.
41
41
  */
42
42
  readonly AGENT_LINK: "agent link";
43
+ /** Is the APP in this folder wired, not just the tools. Printed by `doctor-project-line.ts`. */
44
+ readonly PROJECT: "project";
43
45
  /**
44
46
  * Which of `localhost`'s two answers reaches the bridge, printed only when they disagree.
45
47
  *
@@ -58,6 +60,10 @@ export declare const DoctorRow: {
58
60
  readonly DAEMON_LOG: "daemon log";
59
61
  readonly TRACING: "tracing";
60
62
  readonly DESKTOP: "desktop";
63
+ /** What Reticle sees in each connected app, out of eight capabilities. Only with a live tab. */
64
+ readonly COVERAGE: "coverage";
65
+ /** A project folder holding runs the platform never got. Only when there is one. */
66
+ readonly UNSYNCED: "unsynced";
61
67
  };
62
68
  type DoctorRowLabel = (typeof DoctorRow)[keyof typeof DoctorRow];
63
69
  export declare const DOCTOR_ROW_LABELS: readonly DoctorRowLabel[];
@@ -40,6 +40,8 @@ export const DoctorRow = {
40
40
  * verification." Every row in this list checks a COMPONENT; none checked a LINK.
41
41
  */
42
42
  AGENT_LINK: 'agent link',
43
+ /** Is the APP in this folder wired, not just the tools. Printed by `doctor-project-line.ts`. */
44
+ PROJECT: 'project',
43
45
  /**
44
46
  * Which of `localhost`'s two answers reaches the bridge, printed only when they disagree.
45
47
  *
@@ -58,6 +60,10 @@ export const DoctorRow = {
58
60
  DAEMON_LOG: 'daemon log',
59
61
  TRACING: 'tracing',
60
62
  DESKTOP: 'desktop',
63
+ /** What Reticle sees in each connected app, out of eight capabilities. Only with a live tab. */
64
+ COVERAGE: 'coverage',
65
+ /** A project folder holding runs the platform never got. Only when there is one. */
66
+ UNSYNCED: 'unsynced',
61
67
  };
62
68
  export const DOCTOR_ROW_LABELS = Object.values(DoctorRow);
63
69
  /** Indent every row carries, before the label. */
@@ -0,0 +1,38 @@
1
+ /** What `codesign -dv` says about one binary. */
2
+ export interface Signature {
3
+ /** Ad-hoc signed, or not signed at all: no identity the keychain can recognise. */
4
+ adhoc: boolean;
5
+ identifier?: string;
6
+ teamId?: string;
7
+ }
8
+ export declare const KEYCHAIN_NOTE: string;
9
+ /** `codesign -dv` output (it writes to stderr), or undefined when it said nothing usable. */
10
+ export declare function parseCodesign(output: string): Signature | undefined;
11
+ /** The note, when the build is unsigned, ad-hoc, or signed by another team than the installed app. */
12
+ export declare function signingNote(build: Signature | undefined, installed: Signature | undefined): string | undefined;
13
+ /**
14
+ * The dev binary `tauri dev` runs, the release builds `tauri build` leaves (the bundle first), and
15
+ * where an installed copy of the same app would be.
16
+ */
17
+ export declare function tauriDevBinary(read: (path: string) => string | undefined): {
18
+ build: string;
19
+ release: string[];
20
+ installed?: string;
21
+ } | undefined;
22
+ /** How to look at a project, injected so the decision is a unit test. */
23
+ export interface SigningProbe {
24
+ read: (relative: string) => string | undefined;
25
+ codesign?: (path: string) => Signature | undefined;
26
+ platform?: NodeJS.Platform;
27
+ /** The project folder the dev build's relative path is under. */
28
+ dir?: string;
29
+ }
30
+ /** On macOS, the keychain note for the Tauri build Reticle drives, when it applies. */
31
+ export declare function keychainNoteFor(probe: SigningProbe): string | undefined;
32
+ /** A project folder's files, read relative to it. */
33
+ export declare const projectReader: (dir: string) => (relative: string) => string | undefined;
34
+ /**
35
+ * The note for an agent session's first answer, then never again for that session: the person
36
+ * flooded with password dialogs is talking to the agent, and may never run doctor.
37
+ */
38
+ export declare function keychainNoticeOnce(attach: string, probe: SigningProbe): string | undefined;
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Whether macOS will ask for the keychain password every time the app Reticle drives reads it.
3
+ *
4
+ * Reported from the field: a signed macOS Tauri app driven by Reticle flooded its user with password
5
+ * dialogs. Reticle never touches the keychain; macOS binds each keychain item to the signature of
6
+ * the app that saved it, and the build Reticle runs (`tauri dev`, ad-hoc signed) is another app to
7
+ * the keychain. Read from `codesign -dv`, through an injected runner, so the parsing is a unit test.
8
+ */
9
+ import { existsSync, readFileSync } from 'node:fs';
10
+ import { spawnSync } from 'node:child_process';
11
+ import { isAbsolute, join, posix } from 'node:path';
12
+ export const KEYCHAIN_NOTE = "macOS ties keychain items to the app's signature; this build is signed differently, so the " +
13
+ "app's keychain reads will ask for your password. Set your release identity " +
14
+ '(APPLE_SIGNING_IDENTITY, or signingIdentity in tauri.conf.json) and `reticle setup` signs the ' +
15
+ 'dev build it starts with it; or use a separate keychain service in dev.';
16
+ const NOT_SIGNED = 'code object is not signed at all';
17
+ const NO_TEAM = 'not set';
18
+ /** `codesign -dv` output (it writes to stderr), or undefined when it said nothing usable. */
19
+ export function parseCodesign(output) {
20
+ if (output.includes(NOT_SIGNED))
21
+ return { adhoc: true };
22
+ const field = (key) => new RegExp(`^${key}=(.+)$`, 'm').exec(output)?.[1]?.trim();
23
+ const identifier = field('Identifier');
24
+ if (identifier === undefined)
25
+ return undefined;
26
+ const team = field('TeamIdentifier');
27
+ return {
28
+ adhoc: 'adhoc' === field('Signature'),
29
+ identifier,
30
+ ...(team === undefined || NO_TEAM === team ? {} : { teamId: team }),
31
+ };
32
+ }
33
+ /** The note, when the build is unsigned, ad-hoc, or signed by another team than the installed app. */
34
+ export function signingNote(build, installed) {
35
+ if (build === undefined)
36
+ return undefined;
37
+ if (build.adhoc)
38
+ return KEYCHAIN_NOTE;
39
+ if (installed !== undefined && installed.teamId !== build.teamId)
40
+ return KEYCHAIN_NOTE;
41
+ return undefined;
42
+ }
43
+ /**
44
+ * The dev binary `tauri dev` runs, the release builds `tauri build` leaves (the bundle first), and
45
+ * where an installed copy of the same app would be.
46
+ */
47
+ export function tauriDevBinary(read) {
48
+ const cargo = read('src-tauri/Cargo.toml');
49
+ const name = cargo === undefined ? undefined : /^name\s*=\s*"([^"]+)"/m.exec(cargo)?.[1];
50
+ if (name === undefined)
51
+ return undefined;
52
+ let product;
53
+ try {
54
+ product = JSON.parse(read('src-tauri/tauri.conf.json') ?? '{}')['productName'];
55
+ }
56
+ catch {
57
+ product = undefined;
58
+ }
59
+ const named = 'string' === typeof product && 0 < product.length ? product : undefined;
60
+ return {
61
+ build: `src-tauri/target/debug/${name}`,
62
+ release: [
63
+ ...(named === undefined ? [] : [`src-tauri/target/release/bundle/macos/${named}.app`]),
64
+ `src-tauri/target/release/${name}`,
65
+ ],
66
+ ...(named === undefined ? {} : { installed: `/Applications/${named}.app` }),
67
+ };
68
+ }
69
+ /** `codesign -dv` of one path, as it prints it (to stderr). Undefined when nothing ran. */
70
+ function codesignOf(path) {
71
+ if (!existsSync(path))
72
+ return undefined;
73
+ const run = spawnSync('codesign', ['-dv', '--verbose=2', path], { encoding: 'utf8' });
74
+ return parseCodesign(`${run.stdout}${run.stderr}`);
75
+ }
76
+ /** On macOS, the keychain note for the Tauri build Reticle drives, when it applies. */
77
+ export function keychainNoteFor(probe) {
78
+ if ('darwin' !== (probe.platform ?? process.platform))
79
+ return undefined;
80
+ const app = tauriDevBinary(probe.read);
81
+ if (app === undefined)
82
+ return undefined;
83
+ const codesign = probe.codesign ?? codesignOf;
84
+ const installed = app.installed === undefined ? undefined : codesign(app.installed);
85
+ // Every build on disk, debug and release: a person with only a release build heard nothing.
86
+ for (const build of [app.build, ...app.release]) {
87
+ // macOS only, so a POSIX path on every host the unit test runs on.
88
+ const note = signingNote(codesign(posix.join(probe.dir ?? process.cwd(), build)), installed);
89
+ if (note !== undefined)
90
+ return note;
91
+ }
92
+ return undefined;
93
+ }
94
+ /** A project folder's files, read relative to it. */
95
+ export const projectReader = (dir) => (relative) => {
96
+ try {
97
+ return readFileSync(isAbsolute(relative) ? relative : join(dir, relative), 'utf8');
98
+ }
99
+ catch {
100
+ return undefined;
101
+ }
102
+ };
103
+ // ponytail: grows by one id per agent connection the daemon ever served; bound it if that matters.
104
+ const noticed = new Set();
105
+ /**
106
+ * The note for an agent session's first answer, then never again for that session: the person
107
+ * flooded with password dialogs is talking to the agent, and may never run doctor.
108
+ */
109
+ export function keychainNoticeOnce(attach, probe) {
110
+ if (noticed.has(attach))
111
+ return undefined;
112
+ noticed.add(attach);
113
+ return keychainNoteFor(probe);
114
+ }
@@ -0,0 +1,13 @@
1
+ /** The `broken` list of a regression report, or undefined when the report has none. */
2
+ export declare function brokenOf(report: unknown): unknown[] | undefined;
3
+ /** What the platform said about regressions: the broken list, or that it refused the credential. */
4
+ export interface KnownRegression {
5
+ broken?: unknown[];
6
+ /** The platform refused this project's key: said, and the gate fails closed on it. */
7
+ refused?: string;
8
+ }
9
+ /**
10
+ * Nothing when `reticleRoot` is not linked or the platform did not answer (offline is not a failure);
11
+ * `refused` when it answered and refused the key — a revoked key left CI green and silent.
12
+ */
13
+ export declare function knownRegression(reticleRoot: string): Promise<KnownRegression>;
@@ -0,0 +1,34 @@
1
+ /**
2
+ * The flows the linked project's platform says passed before and are broken now — what
3
+ * `reticle runs regression` prints, read here so `reticle gate` can fail on it too.
4
+ *
5
+ * Its own module, not a call into `cloud-cli.ts`: the gate is on the library's import path, and the
6
+ * cloud CLI reaches the install-time surface the library must never load.
7
+ */
8
+ import { homedir } from 'node:os';
9
+ import { z } from 'zod';
10
+ import { resolveProjectCloud } from '../../memory/cloud/cloud-config.js';
11
+ import { createNodeFileSystem } from '../../memory/project/fs/fs-port.js';
12
+ import { CredentialRefusedError, api } from './cloud-kit.js';
13
+ const REGRESSION_PATH = '/v1/project/regression';
14
+ /** The `broken` list of a regression report, or undefined when the report has none. */
15
+ export function brokenOf(report) {
16
+ const parsed = z.object({ broken: z.array(z.unknown()) }).safeParse(report);
17
+ return parsed.success ? parsed.data.broken : undefined;
18
+ }
19
+ /**
20
+ * Nothing when `reticleRoot` is not linked or the platform did not answer (offline is not a failure);
21
+ * `refused` when it answered and refused the key — a revoked key left CI green and silent.
22
+ */
23
+ export async function knownRegression(reticleRoot) {
24
+ try {
25
+ const cloud = await resolveProjectCloud(createNodeFileSystem(), reticleRoot, homedir(), process.env);
26
+ if (null === cloud.config)
27
+ return {};
28
+ const broken = brokenOf(await api('GET', `${cloud.config.url}${REGRESSION_PATH}`, cloud.config.apiKey));
29
+ return broken === undefined ? {} : { broken };
30
+ }
31
+ catch (error) {
32
+ return error instanceof CredentialRefusedError ? { refused: error.message } : {};
33
+ }
34
+ }
@@ -36,6 +36,12 @@ export declare function installedSdkVersion(projectDir: string, readFile: (path:
36
36
  export declare function readTextFile(path: string): string | undefined;
37
37
  /** The one line a person sees on stderr when the CLI hands over — stdout belongs to the protocol. */
38
38
  export declare function versionMatchNote(sdkVersion: string, cliVersion: string): string;
39
+ /**
40
+ * The line `--help` opens with when the command it describes would run at another version (#1378).
41
+ * Help stays on this binary, so without it the flags listed are this release's, and the re-run
42
+ * rejected the ones its older release never had, as an unknown parameter.
43
+ */
44
+ export declare function helpVersionNote(sdkVersion: string, cliVersion: string): string;
39
45
  export interface VersionMatchInput {
40
46
  argv: readonly string[];
41
47
  cliVersion: string;
@@ -48,6 +54,12 @@ export interface VersionMatchInput {
48
54
  * environment are handed in.
49
55
  */
50
56
  export declare function versionToMatch(input: VersionMatchInput): string | undefined;
57
+ /**
58
+ * The version the command asked about with `--help`, or `help <command>`, would actually run at.
59
+ * Undefined when help was not asked for, or when that command runs on this binary. Pure, like
60
+ * `versionToMatch`: it asks that same question about the command with the help request removed.
61
+ */
62
+ export declare function helpRunsAt(input: VersionMatchInput): string | undefined;
51
63
  /** How to launch `npx --yes @reticlehq/server@<version> <args>` on this platform. */
52
64
  export declare function npxInvocation(version: string, args: readonly string[], on: string): {
53
65
  file: string;
@@ -58,6 +58,8 @@ const KEEP_COMMANDS = new Set([
58
58
  '_daemon',
59
59
  ]);
60
60
  const KEEP_FLAGS = new Set(['--version', '-v', '--help', '-h']);
61
+ const HELP_COMMAND = 'help';
62
+ const HELP_FLAGS = new Set(['--help', '-h']);
61
63
  const SETUP_COMMAND = 'setup';
62
64
  const SETUP_INSTALL = 'install';
63
65
  /** A published release — not `workspace:*`, a link, or a tag npx could not pin. */
@@ -105,6 +107,17 @@ export function versionMatchNote(sdkVersion, cliVersion) {
105
107
  return (`This project's Reticle SDK is ${sdkVersion}; running ${SERVER_PACKAGE}@${sdkVersion} to match ` +
106
108
  `(this CLI is ${cliVersion}, a different major). Set ${VersionMatchEnv.OPT_OUT}=1 to keep this one.`);
107
109
  }
110
+ /**
111
+ * The line `--help` opens with when the command it describes would run at another version (#1378).
112
+ * Help stays on this binary, so without it the flags listed are this release's, and the re-run
113
+ * rejected the ones its older release never had, as an unknown parameter.
114
+ */
115
+ export function helpVersionNote(sdkVersion, cliVersion) {
116
+ return (`This help describes ${SERVER_PACKAGE} ${cliVersion}, but in this project the command runs at ` +
117
+ `${SERVER_PACKAGE}@${sdkVersion} to match its SDK, which may not take every flag listed here. ` +
118
+ `Run npx ${SERVER_PACKAGE}@${sdkVersion} <command> --help for that version's help, or set ` +
119
+ `${VersionMatchEnv.OPT_OUT}=1 to run this one.`);
120
+ }
108
121
  /** Did the person name a version on the npx line (`npx @reticlehq/server@<version> …`)? */
109
122
  function pinnedOnNpxLine(spec) {
110
123
  if (spec === undefined || !spec.startsWith(`${SERVER_PACKAGE}@`))
@@ -141,6 +154,18 @@ export function versionToMatch(input) {
141
154
  return undefined;
142
155
  return sdkMajor === majorOf(input.cliVersion) ? undefined : sdk;
143
156
  }
157
+ /**
158
+ * The version the command asked about with `--help`, or `help <command>`, would actually run at.
159
+ * Undefined when help was not asked for, or when that command runs on this binary. Pure, like
160
+ * `versionToMatch`: it asks that same question about the command with the help request removed.
161
+ */
162
+ export function helpRunsAt(input) {
163
+ const viaCommand = HELP_COMMAND === input.argv[0];
164
+ if (!viaCommand && !input.argv.some((arg) => HELP_FLAGS.has(arg)))
165
+ return undefined;
166
+ const asked = (viaCommand ? input.argv.slice(1) : input.argv).filter((arg) => !HELP_FLAGS.has(arg));
167
+ return versionToMatch({ ...input, argv: asked });
168
+ }
144
169
  /** How to launch `npx --yes @reticlehq/server@<version> <args>` on this platform. */
145
170
  export function npxInvocation(version, args, on) {
146
171
  const argv = [NPX_YES, `${SERVER_PACKAGE}@${version}`, ...args];
@@ -121,8 +121,17 @@ export function handleStop(port, quiet) {
121
121
  const pid = readPid(port);
122
122
  if (null === pid || !isAlive(pid)) {
123
123
  removePid(port);
124
- if (!quiet)
125
- log('reticle_daemon_not_running', { port });
124
+ // No pid on record is not "not running": a daemon whose pid file vanished still answers its
125
+ // port, and `kill` finds the listener and confirms it is Reticle's before signalling it.
126
+ void fetchStatus(port).then(async (status) => {
127
+ if (status !== undefined) {
128
+ if (!(await runKill(port, false)))
129
+ process.exit(1);
130
+ return;
131
+ }
132
+ if (!quiet)
133
+ log('reticle_daemon_not_running', { port });
134
+ });
126
135
  return;
127
136
  }
128
137
  process.kill(pid, 'SIGTERM');
@@ -7,6 +7,12 @@
7
7
  * talks to for the rest of its life — and the port resolution at the top is the fix for agents on
8
8
  * different projects silently sharing one daemon, one identity and one blast radius.
9
9
  */
10
+ /**
11
+ * Whether the daemon this proxy starts hides its browser. A daemon on a port nobody chose — the
12
+ * requested one served another project, so this one was moved — was opening a visible browser the
13
+ * person never asked for, on a port nothing records. Only the requested port gets the default.
14
+ */
15
+ export declare function spawnsHeadless(headless: boolean, requested: number, resolved: number): boolean;
10
16
  /**
11
17
  * MCP proxy mode: ensures the daemon is running, then bridges Claude Code's
12
18
  * stdin/stdout to the daemon's SSE endpoint. This is the recommended way to
@@ -12,8 +12,8 @@ import { isAlive, spawnDaemon, reticleStateHome } from '../daemon/daemon.js';
12
12
  import { PortPresence, probePresence, presenceIsUsable, describePresence, } from '../daemon/binding/port-presence.js';
13
13
  import { waitForDaemon, startMcpProxy, probeDaemon, proxyLog, setProxyLogPort, } from '../../surface/mcp/mcp-proxy.js';
14
14
  import { installProxyResilience } from '../daemon/daemon-resilience.js';
15
- import { readProjectId } from './ports/resolve/cli-port.js';
16
- import { resolveMcpPort, daemonProjectAt } from '../daemon/daemon-resolve.js';
15
+ import { readProjectId, readProjectPort } from './ports/resolve/cli-port.js';
16
+ import { resolveMcpPort, daemonProjectAt, relocationReason, } from '../daemon/daemon-resolve.js';
17
17
  import { daemonSpawnArgs } from './daemon-start-options.js';
18
18
  import { WakeAction, decideWake } from '../daemon/wake-decision.js';
19
19
  import { pickDaemonPortToBind } from '../daemon/binding/free-port.js';
@@ -23,6 +23,14 @@ import { ReticleEnv } from '@reticlehq/core';
23
23
  import { agentIo } from '../setup/agent-io.js';
24
24
  import { SERVER_VERSION } from '../version/identity/server-version.js';
25
25
  import { homedir } from 'node:os';
26
+ /**
27
+ * Whether the daemon this proxy starts hides its browser. A daemon on a port nobody chose — the
28
+ * requested one served another project, so this one was moved — was opening a visible browser the
29
+ * person never asked for, on a port nothing records. Only the requested port gets the default.
30
+ */
31
+ export function spawnsHeadless(headless, requested, resolved) {
32
+ return headless || requested !== resolved;
33
+ }
26
34
  /**
27
35
  * MCP proxy mode: ensures the daemon is running, then bridges Claude Code's
28
36
  * stdin/stdout to the daemon's SSE endpoint. This is the recommended way to
@@ -64,12 +72,12 @@ export async function handleMcp(opts) {
64
72
  alive: isAlive,
65
73
  daemonPresent: async (p) => presenceIsUsable(await probePresence(p, { tcpOpen: probeDaemon, status: fetchStatus })),
66
74
  pickPort: (p) => pickDaemonPortToBind(p),
67
- });
75
+ }, readProjectPort(process.cwd()));
68
76
  if (port !== opts.port) {
69
77
  log('reticle_mcp_port_relocated', {
70
78
  requested: opts.port,
71
79
  port,
72
- reason: 'the requested port serves a different project',
80
+ reason: relocationReason(opts.port, port, projectId, reticleStateHome(), isAlive),
73
81
  });
74
82
  }
75
83
  // The proxy IS the MCP server the editor launched. Nothing respawns it, so an uncaught throw here
@@ -119,7 +127,7 @@ export async function handleMcp(opts) {
119
127
  }
120
128
  const daemonArgs = daemonSpawnArgs({
121
129
  port,
122
- headless,
130
+ headless: spawnsHeadless(headless, opts.port, port),
123
131
  http,
124
132
  ...(driveUrl !== undefined ? { driveUrl } : {}),
125
133
  ...(httpPort !== undefined ? { httpPort } : {}),
@@ -83,7 +83,7 @@ ourPid) {
83
83
  // Naming the command matters more than naming the process. "Stop that process" describes an
84
84
  // outcome and leaves the reader to invent a route to it, and the route they invent is the `-ti`
85
85
  // pipeline that takes their agent's proxy down with the holder.
86
- const tail = 'a daemon cannot bind it. Free it with `reticle kill --force` (it signals the listener only, ' +
86
+ const tail = 'a daemon cannot bind it. Free it with `reticle restart --force` (it signals the listener only, ' +
87
87
  "never the agent's mcp proxy), or run Reticle on a different port (`--port`), then retry.";
88
88
  if (null === holder) {
89
89
  /**
@@ -11,6 +11,7 @@
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 { z } from 'zod';
14
15
  /** The id used when a directory name yields nothing usable — the historical behaviour, unchanged. */
15
16
  export declare const DEFAULT_PROJECT_ID = "default";
16
17
  /**
@@ -27,4 +28,31 @@ export declare const slugifyProjectName: (raw: string) => string;
27
28
  * do to rotate a key or repoint an environment — must land in that same project or the history
28
29
  * silently splits in two, which is worse than the shared-bucket problem this fixes.
29
30
  */
30
- export declare const defaultProjectFor: (cwdBasename: string, existingProjectId: string | undefined) => string;
31
+ export declare const defaultProjectFor: (cwdBasename: string, existingProjectId: string | undefined,
32
+ /** The `projectId` `init` wrote into `.reticle.json`, when there is one. */
33
+ localProjectId?: string) => string;
34
+ export declare const CreatedProjectSchema: z.ZodObject<{
35
+ projectId: z.ZodString;
36
+ name: z.ZodString;
37
+ }, "strip", z.ZodTypeAny, {
38
+ name: string;
39
+ projectId: string;
40
+ }, {
41
+ name: string;
42
+ projectId: string;
43
+ }>;
44
+ /** ` in workspace "<name>"`, or nothing when no name is known. */
45
+ export declare const inWorkspace: (name: string | undefined) => string;
46
+ /**
47
+ * Which repository, and which folder in it, a project folder is: a hash of the `origin` remote and
48
+ * the folder's path inside the checkout, so every clone of one app agrees and two different apps
49
+ * both named `web` do not. Undefined outside git or with no remote. Neither leaves the machine.
50
+ */
51
+ export declare function repoIdentity(dir: string): string | undefined;
52
+ export declare function resolveProjectId(url: string, token: string, wanted: string, workspace?: string, repo?: string,
53
+ /**
54
+ * The id `init` wrote into `.reticle.json`, for a project created by default: the platform is
55
+ * asked to keep it, so the folder and the dashboard name one project by one id. A platform that
56
+ * does not know the field ignores it and answers with its own, which is what gets linked.
57
+ */
58
+ localId?: string): Promise<string>;