@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
@@ -24,7 +24,7 @@ import { readDaemonRegistry } from '../../daemon/daemon-resolve.js';
24
24
  import { LOOPBACK_HOST, STATUS_HOLD_MS } from '@reticlehq/core';
25
25
  import { probePresence, presenceIsUsable } from '../../daemon/binding/port-presence.js';
26
26
  import { probeDaemon, waitForDaemonBind } from '../../../surface/mcp/mcp-proxy.js';
27
- import { daemonSpawnArgs } from '../../cli/daemon-start-options.js';
27
+ import { daemonSpawnArgs, headlessByDefault } from '../../cli/daemon-start-options.js';
28
28
  import { fetchStatus, summarizeStatus } from '../../daemon/binding/daemon-status-probe.js';
29
29
  import { runKill } from '../../cli/cli-kill.js';
30
30
  export const EnsureDaemon = {
@@ -154,7 +154,14 @@ export function nodeEnsureDaemonDeps(skewed) {
154
154
  const scriptPath = process.argv[1];
155
155
  if (undefined === scriptPath)
156
156
  return false;
157
- const started = spawnDaemon(process.execPath, scriptPath, daemonSpawnArgs({ port, headless: true, http: false }), port);
157
+ const started = spawnDaemon(process.execPath, scriptPath,
158
+ // The daemon init starts is the one the agent attaches to and drives through, so it follows
159
+ // the same rule as every other: shown on a desktop, hidden in CI or with no display.
160
+ daemonSpawnArgs({
161
+ port,
162
+ headless: headlessByDefault(process.env, process.platform),
163
+ http: false,
164
+ }), port);
158
165
  // For a log or a pipe. On a terminal it was a JSON line in the middle of `init`'s output, read
159
166
  // by a person, about a step the next lines already report in words.
160
167
  if (true !== process.stderr.isTTY)
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Whether the agent that ran `init` has to restart before it can use what `init` set up.
3
+ *
4
+ * An agent client reads its MCP server list when it STARTS and never re-reads it. So the session
5
+ * that ran `init` has the `reticle_*` tools only if Reticle was registered before it started, and
6
+ * nothing a running session does can add them: there is no server entry in it to reconnect. The
7
+ * honest answer is a restart, said plainly, once `init` can tell it is needed.
8
+ *
9
+ * Two ways to tell. This run registered the server (it cannot be in any open session), or `init`
10
+ * runs inside an agent and the daemon has no agent attached, which is what an agent with the tools
11
+ * always has. Pure: the facts come in, the sentence comes out.
12
+ */
13
+ export interface RestartFacts {
14
+ /** `init` was spawned by a coding agent (Claude Code, Codex), not typed by a person. */
15
+ readonly insideAgent: boolean;
16
+ /** This run registered the MCP server, so no open session has it. */
17
+ readonly newlyRegistered: boolean;
18
+ /** MCP clients attached to the daemon on this port; undefined when the daemon could not be asked. */
19
+ readonly attached: number | undefined;
20
+ }
21
+ export declare function restartNotice(facts: RestartFacts): string | undefined;
22
+ /** How many agents' MCP clients the daemon's `/status` lists, or undefined for no answer. */
23
+ export declare function attachedAgents(status: unknown): number | undefined;
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Whether the agent that ran `init` has to restart before it can use what `init` set up.
3
+ *
4
+ * An agent client reads its MCP server list when it STARTS and never re-reads it. So the session
5
+ * that ran `init` has the `reticle_*` tools only if Reticle was registered before it started, and
6
+ * nothing a running session does can add them: there is no server entry in it to reconnect. The
7
+ * honest answer is a restart, said plainly, once `init` can tell it is needed.
8
+ *
9
+ * Two ways to tell. This run registered the server (it cannot be in any open session), or `init`
10
+ * runs inside an agent and the daemon has no agent attached, which is what an agent with the tools
11
+ * always has. Pure: the facts come in, the sentence comes out.
12
+ */
13
+ const RESTART_NOW = 'Restart your coding agent now: this session started before Reticle was registered with it, so ' +
14
+ 'the `reticle_*` tools are not in it, and an agent loads its tools only when it starts. ' +
15
+ '`npx @reticlehq/server init --relaunch` prints the exact resume command for Claude Code and ' +
16
+ 'Codex. Once per machine.';
17
+ export function restartNotice(facts) {
18
+ if (facts.newlyRegistered)
19
+ return RESTART_NOW;
20
+ return facts.insideAgent && 0 === facts.attached ? RESTART_NOW : undefined;
21
+ }
22
+ /** How many agents' MCP clients the daemon's `/status` lists, or undefined for no answer. */
23
+ export function attachedAgents(status) {
24
+ if ('object' !== typeof status || null === status)
25
+ return undefined;
26
+ const peers = status.mcpPeers;
27
+ return Array.isArray(peers) ? peers.length : 0;
28
+ }
@@ -1,3 +1,10 @@
1
+ /**
2
+ * The port a project asks for when the default is somebody else's: its own, from its id (or its
3
+ * directory, before it has one), the same on every run. Every project used to ask for the default
4
+ * plus one, so with the first one's daemon not yet running every later project was written the same
5
+ * port and shared it. Taken ports are still skipped by the caller's `pickPort`.
6
+ */
7
+ export declare function projectPortFor(seed: string): number;
1
8
  /**
2
9
  * `RETICLE_PORT`, when it names a port. The one reader of it for the CLI, `init` included.
3
10
  *
@@ -14,6 +21,8 @@ export declare function portForInit(explicit: number | undefined, configured: nu
14
21
  pickPort: (preferred: number) => Promise<number>;
15
22
  /** The daemon on `port` was started from this project's directory or one above it. */
16
23
  daemonStartedHere?: (port: number) => boolean;
17
- }): Promise<number | undefined>;
24
+ },
25
+ /** The project's directory: the port's seed when the project has no id yet. */
26
+ dir?: string): Promise<number | undefined>;
18
27
  /** Is `dir` the same directory as `cwd`, or an ancestor of it? */
19
28
  export declare function isSameOrAbove(dir: string, cwd: string): boolean;
@@ -11,6 +11,23 @@
11
11
  import { relative, isAbsolute } from 'node:path';
12
12
  import { RETICLE_DEFAULT_PORT, ReticleEnv } from '@reticlehq/core';
13
13
  const MAX_PORT = 65_535;
14
+ /** Ports a project moved off the default may get: above it, and below the 5000s dev servers use. */
15
+ const PROJECT_PORT_FIRST = RETICLE_DEFAULT_PORT + 1;
16
+ const PROJECT_PORT_SPAN = 599;
17
+ const FNV_OFFSET = 0x811c9dc5;
18
+ const FNV_PRIME = 0x01000193;
19
+ /**
20
+ * The port a project asks for when the default is somebody else's: its own, from its id (or its
21
+ * directory, before it has one), the same on every run. Every project used to ask for the default
22
+ * plus one, so with the first one's daemon not yet running every later project was written the same
23
+ * port and shared it. Taken ports are still skipped by the caller's `pickPort`.
24
+ */
25
+ export function projectPortFor(seed) {
26
+ let hash = FNV_OFFSET;
27
+ for (let i = 0; i < seed.length; i++)
28
+ hash = Math.imul(hash ^ seed.charCodeAt(i), FNV_PRIME);
29
+ return PROJECT_PORT_FIRST + ((hash >>> 0) % PROJECT_PORT_SPAN);
30
+ }
14
31
  /**
15
32
  * `RETICLE_PORT`, when it names a port. The one reader of it for the CLI, `init` included.
16
33
  *
@@ -26,7 +43,9 @@ export function portFromEnv(env) {
26
43
  const port = Number(raw);
27
44
  return 0 < port && port <= MAX_PORT ? port : undefined;
28
45
  }
29
- export async function portForInit(explicit, configured, projectId, deps) {
46
+ export async function portForInit(explicit, configured, projectId, deps,
47
+ /** The project's directory: the port's seed when the project has no id yet. */
48
+ dir) {
30
49
  if (explicit !== undefined)
31
50
  return explicit;
32
51
  if (configured !== undefined)
@@ -45,7 +64,8 @@ export async function portForInit(explicit, configured, projectId, deps) {
45
64
  const holders = await deps.daemonProjects(RETICLE_DEFAULT_PORT);
46
65
  if (1 !== holders.length || holders[0] === projectId)
47
66
  return undefined;
48
- return deps.pickPort(RETICLE_DEFAULT_PORT + 1);
67
+ const seed = projectId ?? dir;
68
+ return deps.pickPort(seed === undefined ? PROJECT_PORT_FIRST : projectPortFor(seed));
49
69
  }
50
70
  /** Is `dir` the same directory as `cwd`, or an ancestor of it? */
51
71
  export function isSameOrAbove(dir, cwd) {
@@ -6,6 +6,7 @@
6
6
  * every command harder to read.
7
7
  */
8
8
  import { type InitResult } from '@reticlehq/init';
9
+ import { type FirstFlowPort } from '../setup-command.js';
9
10
  /**
10
11
  * Does the served document name the SDK, so its absence means a stale dev server?
11
12
  *
@@ -22,7 +23,8 @@ interface InitRuntimeArgs {
22
23
  readonly dryRun: boolean;
23
24
  readonly filesOnly?: boolean | undefined;
24
25
  readonly json?: boolean | undefined;
25
- readonly drive?: boolean | undefined;
26
+ /** `--no-first-run` sets it false: connect, and stop without the coverage summary. */
27
+ readonly firstRun?: boolean | undefined;
26
28
  readonly open?: boolean | undefined;
27
29
  readonly agents?: boolean | undefined;
28
30
  /**
@@ -41,9 +43,17 @@ interface InitRuntimeArgs {
41
43
  /** Restart the calling client so IT gets the tools — see relaunch.ts. */
42
44
  readonly relaunch?: boolean | undefined;
43
45
  readonly licenseKey?: string | undefined;
46
+ /**
47
+ * Init is the first half of a longer command (`reticle connect`): a setup that did not finish
48
+ * sets a failing exit code and returns, so the command can still sign in and link. Exiting here
49
+ * ended connect before it signed in, and nothing said to run it again.
50
+ */
51
+ readonly keepGoing?: boolean | undefined;
44
52
  }
45
53
  interface RuntimePrintIo {
46
54
  readonly print: (line: string) => void;
47
55
  }
48
- export declare function continueAfterInit(parsed: InitRuntimeArgs, result: InitResult, io: RuntimePrintIo, cwd: string): Promise<void>;
56
+ export declare function continueAfterInit(parsed: InitRuntimeArgs, result: InitResult, io: RuntimePrintIo, cwd: string,
57
+ /** init's ending once the connection is proved: coverage and the agent prompt. See `FirstFlowPort`. */
58
+ firstFlow?: FirstFlowPort): Promise<void>;
49
59
  export {};
@@ -11,18 +11,22 @@ import { InitConfirmation, RETICLE_DEFAULT_PORT } from '@reticlehq/core';
11
11
  import { FEEDBACK_HINT, Framework, InitFailure } from '@reticlehq/init';
12
12
  import { confirmInstall, nodeConfirmDeps } from '../terminal/confirm.js';
13
13
  import { writeLicenseKey } from '../license-key.js';
14
- import { registerOtherAgents, runSetupCommand } from '../setup-command.js';
15
- import { bridgeOccupied } from '../bringup/bridge-port.js';
14
+ import { registerOtherAgents, runSetupCommand, } from '../setup-command.js';
15
+ import { bridgeOccupied, freePortAfter } from '../bringup/bridge-port.js';
16
16
  import { defaultPairingTokenDir, readOrCreatePairingTokenSync, } from '../../../portal/bridge/pairing-token.js';
17
17
  import { relaunchDecision } from '../bringup/relaunch.js';
18
+ import { attachedAgents, restartNotice } from './agent-restart.js';
18
19
  import { claudeTranscriptExists, codexSessionFor } from '../terminal/transcripts.js';
19
- import { probePresence } from '../../daemon/binding/port-presence.js';
20
+ import { PortPresence, probePresence } from '../../daemon/binding/port-presence.js';
20
21
  import { probeDaemon } from '../../../surface/mcp/proxy/proxy-daemon-probe.js';
21
22
  import { fetchStatus } from '../../daemon/binding/daemon-status-probe.js';
22
23
  import { collectEnv, DEFAULT_PHASE_TIMEOUT_MS } from '../setup-options.js';
23
24
  import { staticPageDevCommand } from '../bringup/static-page-server.js';
24
25
  import { SetupPhase } from '../run-setup.js';
25
26
  import { reportInitOutcome } from '../../../telemetry/init-telemetry.js';
27
+ /** Claude Code marks every process it spawns with this variable set to this value. */
28
+ const CLAUDE_CODE_ENV = 'CLAUDECODE';
29
+ const CLAUDE_CODE_MARKER = '1';
26
30
  /** How often the runtime phases look again: fast enough not to be the wait, slow enough to be free. */
27
31
  const POLL_MS = 250;
28
32
  /**
@@ -76,8 +80,16 @@ function printRelaunch(parsed, io, cwd) {
76
80
  }).message);
77
81
  io.print('');
78
82
  }
79
- export async function continueAfterInit(parsed, result, io, cwd) {
83
+ export async function continueAfterInit(parsed, result, io, cwd,
84
+ /** init's ending once the connection is proved: coverage and the agent prompt. See `FirstFlowPort`. */
85
+ firstFlow) {
80
86
  const port = parsed.port ?? RETICLE_DEFAULT_PORT;
87
+ const stop = () => {
88
+ if (true === parsed.keepGoing)
89
+ process.exitCode = 1;
90
+ else
91
+ process.exit(1);
92
+ };
81
93
  // Real installs persist the key whichever way setup ends. A preview must leave .env and
82
94
  // .gitignore untouched, just as it leaves project wiring and agent configuration untouched.
83
95
  if (!parsed.dryRun && undefined !== parsed.licenseKey) {
@@ -105,7 +117,7 @@ export async function continueAfterInit(parsed, result, io, cwd) {
105
117
  if (true === parsed.json)
106
118
  process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
107
119
  if (!result.ok)
108
- process.exit(1);
120
+ stop();
109
121
  });
110
122
  }
111
123
  // From here on init left the ask to us, so it is the last thing on every exit below.
@@ -114,17 +126,31 @@ export async function continueAfterInit(parsed, result, io, cwd) {
114
126
  io.print('');
115
127
  io.print(FEEDBACK_HINT);
116
128
  };
129
+ // `init` deferred its outcome to this phase, so every exit below reports it, and only once: the
130
+ // success path, a failure, a throw and an interrupt can each reach here, and two rows for one run
131
+ // would double the funnel this event exists to measure.
132
+ let outcomeReported = false;
133
+ const reportOnce = (init) => {
134
+ if (outcomeReported)
135
+ return;
136
+ outcomeReported = true;
137
+ reportInitOutcome(init);
138
+ };
117
139
  const context = result.context;
118
140
  if (context === undefined) {
119
- // Nothing was established, so there is nothing to run against. init has already said why.
141
+ // Nothing was established, so there is nothing to run against. init has already said why, and
142
+ // the outcome it deferred (a failed dependency install, usually) is reported here or nowhere.
143
+ if (result.outcome !== undefined)
144
+ reportOnce(result.outcome);
120
145
  ask();
121
146
  if (true === parsed.json)
122
147
  process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
123
- process.exit(1);
148
+ stop();
149
+ return;
124
150
  }
125
151
  const reportFailure = (reason) => {
126
152
  if (result.outcome !== undefined) {
127
- reportInitOutcome({ ...result.outcome, ok: false, reason });
153
+ reportOnce({ ...result.outcome, ok: false, reason });
128
154
  }
129
155
  };
130
156
  // A PENDING connect step is not a reason to skip the runtime phase, and treating it as one made
@@ -142,10 +168,13 @@ export async function continueAfterInit(parsed, result, io, cwd) {
142
168
  // Before the connect wait, never after: a bridge held by a stranger makes a session impossible,
143
169
  // so going ahead spends the entire budget and then reports what reads as an instrumentation
144
170
  // problem — the one place that is fine. See bridge-port.ts.
145
- const refusal = bridgeOccupied(await probePresence(port, { tcpOpen: probeDaemon, status: fetchStatus }).catch((error) => {
171
+ const presence = await probePresence(port, { tcpOpen: probeDaemon, status: fetchStatus }).catch((error) => {
146
172
  reportFailure(InitFailure.RUNTIME_ERROR);
147
173
  throw error;
148
- }), port);
174
+ });
175
+ const refusal = bridgeOccupied(presence, port, PortPresence.FOREIGN === presence
176
+ ? await freePortAfter(port, (p) => probeDaemon(p))
177
+ : undefined);
149
178
  if (refusal !== undefined) {
150
179
  reportFailure(InitFailure.BRIDGE_OCCUPIED);
151
180
  io.print(refusal);
@@ -153,8 +182,12 @@ export async function continueAfterInit(parsed, result, io, cwd) {
153
182
  if (true === parsed.json) {
154
183
  process.stdout.write(`${JSON.stringify({ ok: false, reason: InitFailure.BRIDGE_OCCUPIED }, null, 2)}\n`);
155
184
  }
156
- process.exit(1);
185
+ stop();
186
+ return;
157
187
  }
188
+ // A Ctrl-C during the wait ends the process with no `finally`, so the outcome is reported from the
189
+ // signal itself. The send is detached, so it survives the exit that follows.
190
+ const releaseInterrupt = reportOnInterrupt(() => reportFailure(InitFailure.INTERRUPTED));
158
191
  return runSetupCommand({
159
192
  appDir: context.appDir,
160
193
  invokedAt: cwd,
@@ -164,6 +197,9 @@ export async function continueAfterInit(parsed, result, io, cwd) {
164
197
  pairingToken: readOrCreatePairingTokenSync(defaultPairingTokenDir()),
165
198
  env: collectEnv(parsed.env ?? []),
166
199
  openBrowser: false !== parsed.open,
200
+ firstRun: false !== parsed.firstRun,
201
+ json: true === parsed.json,
202
+ firstFlow,
167
203
  registerAgents: wantsAgents(parsed),
168
204
  phaseTimeoutMs: undefined === parsed.timeoutSeconds
169
205
  ? DEFAULT_PHASE_TIMEOUT_MS
@@ -181,17 +217,19 @@ export async function continueAfterInit(parsed, result, io, cwd) {
181
217
  // A plain page with no dev script gets Reticle's own static server, so the page is actually
182
218
  // served and the connect can be proved, instead of stopping at "start the app yourself".
183
219
  ...(() => {
184
- const devCommand = context.devCommand ??
185
- (undefined === parsed.url
186
- ? staticPageDevCommand({
187
- appDir: context.appDir,
188
- isStaticPage: Framework.HTML === context.framework,
189
- })
190
- : undefined);
191
- return undefined === devCommand ? {} : { devCommand };
220
+ if (undefined !== context.devCommand)
221
+ return { devCommand: context.devCommand };
222
+ if (undefined !== parsed.url)
223
+ return {};
224
+ const devCommand = staticPageDevCommand({
225
+ appDir: context.appDir,
226
+ isStaticPage: Framework.HTML === context.framework,
227
+ });
228
+ return undefined === devCommand ? {} : { devCommand, devCommandIsStaticPage: true };
192
229
  })(),
193
230
  ...(undefined === parsed.url ? {} : { suppliedUrl: parsed.url }),
194
- }, (line) => io.print(line)).then((outcome) => {
231
+ }, (line) => io.print(line))
232
+ .then(async (outcome) => {
195
233
  if (result.outcome !== undefined) {
196
234
  const init = {
197
235
  ...result.outcome,
@@ -210,26 +248,28 @@ export async function continueAfterInit(parsed, result, io, cwd) {
210
248
  ? InitFailure.DEV_SERVER
211
249
  : InitFailure.APP_CONNECTION;
212
250
  }
213
- reportInitOutcome(init);
251
+ reportOnce(init);
214
252
  }
215
253
  // One object, so an agent reads a result instead of interpreting a report.
216
254
  if (true === parsed.json) {
217
255
  process.stdout.write(`${JSON.stringify(outcome, null, 2)}\n`);
218
256
  if (!outcome.ok)
219
- process.exit(1);
257
+ stop();
220
258
  return;
221
259
  }
222
260
  io.print('');
223
261
  // The precondition for everything the closing asks for, printed on the path that could not say
224
- // it. An agent client reads its MCP server list when it STARTS and never re-reads it, so on the
225
- // run that first registers Reticle the `reticle_*` tools are not in the session that just asked
226
- // for them -- and this path closes by telling that session to call `reticle_act_and_wait`.
227
- // `restartHint` has said this for a long time and is printed only when init stops at the files.
228
- if (true === result.mcpNewlyRegistered) {
229
- io.print('Reticle was registered with your agent by this run, and an agent reads its tool list only ' +
230
- 'when it starts: the `reticle_*` tools are NOT in this session yet. Restart it first — ' +
231
- '`npx @reticlehq/server init --relaunch` prints the exact resume command for Claude Code ' +
232
- 'and Codex. Once per machine.');
262
+ // it. An agent client reads its MCP server list when it STARTS and never re-reads it, so an
263
+ // agent that ran this without the `reticle_*` tools cannot do what the closing tells it to.
264
+ // See agent-restart.ts for the two ways that is known.
265
+ const restart = restartNotice({
266
+ insideAgent: CLAUDE_CODE_MARKER === process.env[CLAUDE_CODE_ENV] ||
267
+ undefined !== codexSessionFor(cwd),
268
+ newlyRegistered: true === result.mcpNewlyRegistered,
269
+ attached: attachedAgents(await fetchStatus(port)),
270
+ });
271
+ if (undefined !== restart) {
272
+ io.print(restart);
233
273
  io.print('');
234
274
  }
235
275
  if (outcome.ok && !outcome.flowSaved) {
@@ -245,11 +285,8 @@ export async function continueAfterInit(parsed, result, io, cwd) {
245
285
  return;
246
286
  }
247
287
  if (outcome.ok) {
248
- io.print(`✓ setup complete — ${outcome.url ?? 'the app'} is instrumented and a flow was driven.`);
249
- // A passing flow shows the mechanism working. What the run SAW is the part nobody can get for
250
- // themselves, and it deserves a line of its own rather than a paragraph that gets skimmed.
251
- io.print(' Read the FINDINGS above before moving on: a flow can pass with a failed request or a ' +
252
- 'console error behind it, and that is the app, not the check.');
288
+ io.print(`✓ setup complete — ${outcome.url ?? 'the app'} is instrumented and its first flow is ` +
289
+ 'saved. The tab stays open; a linked project sends the flow and its run to your dashboard.');
253
290
  ask();
254
291
  return;
255
292
  }
@@ -259,9 +296,31 @@ export async function continueAfterInit(parsed, result, io, cwd) {
259
296
  for (const [i, step] of outcome.fallback.entries())
260
297
  io.print(` ${i + 1}. ${step}`);
261
298
  ask();
262
- process.exit(1);
299
+ stop();
263
300
  }, (error) => {
264
301
  reportFailure(InitFailure.RUNTIME_ERROR);
265
302
  throw error;
303
+ })
304
+ .finally(releaseInterrupt);
305
+ }
306
+ const INTERRUPT_SIGNALS = ['SIGINT', 'SIGTERM'];
307
+ /** 128 + the signal number, which is what a shell reports. */
308
+ const INTERRUPT_EXIT_CODE = { SIGINT: 130, SIGTERM: 143 };
309
+ /** Run `report` if the process is interrupted. Returns the disposer. */
310
+ function reportOnInterrupt(report) {
311
+ const handlers = INTERRUPT_SIGNALS.map((signal) => {
312
+ const handler = () => {
313
+ report();
314
+ // Before setup installs its own handler ours may be the only one, and a listener present
315
+ // means Node no longer exits on the signal by itself: without this, Ctrl-C would be ignored.
316
+ if (1 === process.listenerCount(signal))
317
+ process.exit(INTERRUPT_EXIT_CODE[signal]);
318
+ };
319
+ process.on(signal, handler);
320
+ return { signal, handler };
266
321
  });
322
+ return () => {
323
+ for (const { signal, handler } of handlers)
324
+ process.off(signal, handler);
325
+ };
267
326
  }
@@ -53,6 +53,8 @@ export declare class OwnedDevServer {
53
53
  handOver(url?: string): void;
54
54
  stop(): void;
55
55
  }
56
+ /** Run a command and return what it printed, or '' if it failed to finish within `timeoutMs`. */
57
+ export declare function run(file: string, args: string[], timeoutMs?: number): string;
56
58
  /**
57
59
  * Fetch the page and say what came back.
58
60
  *
@@ -63,7 +63,13 @@ export class OwnedDevServer {
63
63
  this.child = spawn(process.execPath, [LOG_CAP_SCRIPT, log, String(DEV_SERVER_LOG_CAP_BYTES), command], {
64
64
  cwd,
65
65
  // Its own process group, so stopping it stops what it started rather than only the wrapper.
66
- detached: !WINDOWS,
66
+ // Detached on Windows too: there libuv puts every non-detached child in a job object that
67
+ // kills it when this process exits. The supervisor died with `init`, the server it fed lost
68
+ // its pipe reader, and its next log line was an EPIPE: every Windows install cell whose
69
+ // server logs per request (Next, Astro) or on an edit (CRA, Angular) failed that way.
70
+ detached: true,
71
+ // Detached on Windows means no console; this keeps one from opening as a visible window.
72
+ windowsHide: true,
67
73
  // Nothing of ours: the supervisor holds the server's pipes, and init holds none of its.
68
74
  stdio: 'ignore',
69
75
  // Reticle already provides the detached supervisor. Astro's agent auto-backgrounding
@@ -169,8 +175,21 @@ export class OwnedDevServer {
169
175
  this.child = undefined;
170
176
  }
171
177
  }
172
- function run(file, args) {
173
- const r = spawnSync(file, args, { encoding: 'utf8', maxBuffer: 8 * 1024 * 1024 });
178
+ /**
179
+ * How long one process-listing command may take. `init` calls these on every dev-server poll, and
180
+ * spawnSync blocks the event loop: with no bound, one stalled WMI query on a Windows install cell
181
+ * froze `init` silently for nine and a half minutes, until the gate killed it.
182
+ */
183
+ const RUN_TIMEOUT_MS = 15_000;
184
+ /** Run a command and return what it printed, or '' if it failed to finish within `timeoutMs`. */
185
+ export function run(file, args, timeoutMs = RUN_TIMEOUT_MS) {
186
+ const r = spawnSync(file, args, {
187
+ encoding: 'utf8',
188
+ maxBuffer: 8 * 1024 * 1024,
189
+ timeout: timeoutMs,
190
+ });
191
+ if (undefined !== r.error)
192
+ return '';
174
193
  return r.stdout ?? '';
175
194
  }
176
195
  /**
@@ -183,13 +202,22 @@ function run(file, args) {
183
202
  * `init` then waits out the full quiet window and reports "the dev server stopped producing output
184
203
  * without ever serving a page" about a Vite server that was serving perfectly the whole time.
185
204
  *
186
- * The fallback prints the same two-integers-per-line shape, so `parseWmicProcesses` reads either
187
- * without knowing which produced it. Tried in this order because `wmic` is an order of magnitude
188
- * faster to start than PowerShell, and on a machine that still has it nothing needs to change.
205
+ * The fallback prints the same `CreationDate ParentProcessId ProcessId` shape (UTC, in WMI's
206
+ * datetime format), so `parseWmicProcesses` reads either without knowing which produced it. The
207
+ * creation time is not decoration: Windows keeps a dead parent's pid as ParentProcessId and reuses
208
+ * pids, and without it the tree walk adopted the runner's sshd and reported port 22 as the dev
209
+ * server. A process with no creation time (System) prints the old two-column row.
210
+ *
211
+ * Tried in this order because `wmic` is an order of magnitude faster to start than PowerShell, and
212
+ * on a machine that still has it nothing needs to change.
189
213
  */
190
- const POWERSHELL_PAIRS = 'Get-CimInstance Win32_Process | ForEach-Object { "$($_.ParentProcessId) $($_.ProcessId)" }';
214
+ const POWERSHELL_PAIRS = 'Get-CimInstance Win32_Process | ForEach-Object { ' +
215
+ '$c = $_.CreationDate; ' +
216
+ "$t = if ($c) { $c.ToUniversalTime().ToString('yyyyMMddHHmmss.ffffff', " +
217
+ "[Globalization.CultureInfo]::InvariantCulture) + '+000' } else { '' }; " +
218
+ '"$t $($_.ParentProcessId) $($_.ProcessId)".Trim() }';
191
219
  function windowsProcessPairs() {
192
- const fromWmic = parseWmicProcesses(run('wmic', ['process', 'get', 'ParentProcessId,ProcessId']));
220
+ const fromWmic = parseWmicProcesses(run('wmic', ['process', 'get', 'CreationDate,ParentProcessId,ProcessId']));
193
221
  if (0 < fromWmic.length)
194
222
  return fromWmic;
195
223
  return parseWmicProcesses(run('powershell', ['-NoProfile', '-NonInteractive', '-Command', POWERSHELL_PAIRS]));
@@ -10,3 +10,15 @@ export declare function urlOfExistingApp(entries: readonly DevServerEntry[], sco
10
10
  projectId?: string | undefined;
11
11
  root?: string | undefined;
12
12
  }): string | undefined;
13
+ /**
14
+ * The url of a window of THIS project already connected to the daemon, if one is.
15
+ *
16
+ * A desktop app with a packaged renderer announces no dev server, so the registry above cannot see
17
+ * it, and setup started the app again beside the running one. On macOS a build signed differently
18
+ * from the installed app is a different app to the keychain, so every start asked for the password
19
+ * again. Scoped to the project the page reported, like the registry: never a sibling's window.
20
+ */
21
+ export declare function connectedAppUrl(sessions: readonly {
22
+ readonly url?: string;
23
+ readonly projectId?: string;
24
+ }[], projectId: string | undefined): string | undefined;
@@ -11,3 +11,17 @@ export function urlOfExistingApp(entries, scope) {
11
11
  const first = mine[0];
12
12
  return first === undefined ? undefined : first.url;
13
13
  }
14
+ /**
15
+ * The url of a window of THIS project already connected to the daemon, if one is.
16
+ *
17
+ * A desktop app with a packaged renderer announces no dev server, so the registry above cannot see
18
+ * it, and setup started the app again beside the running one. On macOS a build signed differently
19
+ * from the installed app is a different app to the keychain, so every start asked for the password
20
+ * again. Scoped to the project the page reported, like the registry: never a sibling's window.
21
+ */
22
+ export function connectedAppUrl(sessions, projectId) {
23
+ if (projectId === undefined)
24
+ return undefined;
25
+ const mine = sessions.find((s) => s.projectId === projectId && 0 < (s.url ?? '').length);
26
+ return mine?.url;
27
+ }
@@ -35,7 +35,7 @@ export function remainingSteps(p) {
35
35
  'what produce a verdict. Or hand the whole drive to Reticle with `reticle_verify { action: ' +
36
36
  '"explore", persona: "<who does what>" }`, which records what it drove so later runs replay ' +
37
37
  'with no model in the loop; that route runs on the Reticle platform and needs a linked ' +
38
- 'project (`reticle connect`); every plan, Free included, has monthly Harness credits.');
38
+ 'project (`reticle connect`); a new account gets 10 free credits to try it.');
39
39
  }
40
40
  // Whether anything is actually outstanding, read BEFORE the docs pointer is added -- that line is
41
41
  // an offer, not a task, and a run with nothing left still gets it.
@@ -2,12 +2,8 @@
2
2
  * The half of setup that happens after the files are written.
3
3
  *
4
4
  * `init` wires a project; this gets the app running with the SDK inside it and proves a session
5
- * connected. That is where ONBOARDING ends — the first run, which proves a flow, is a separate
6
- * stage and a separate command.
7
- *
8
- * It does NOT drive a flow. `reticle_verify { action: "explore" }` does that, with a model inside
9
- * the daemon that already holds the tools — so no client restart is needed and no second CLI has to
10
- * exist on the machine.
5
+ * connected. That is where ONBOARDING ends. Then init says what Reticle sees and hands the first
6
+ * flow to the coding agent (`try-command.ts`'s `initFirstFlow`); nothing in init drives.
11
7
  *
12
8
  * Every effect is injected. That is not ceremony: the sequence has five phases, each with its own
13
9
  * way of going wrong, and the alternative to injecting them is a test that boots a real dev server
@@ -16,6 +12,20 @@
16
12
  import { type CandidateSession } from './session-pick.js';
17
13
  import { type PageProbe } from './probe/page-probe.js';
18
14
  import { AppShape } from './desktop-shape.js';
15
+ /**
16
+ * Said before Reticle starts its own static server for a plain page, while it can still be acted
17
+ * on: the page may already be served by something with an API behind it, and only the person
18
+ * running init knows that (#1426).
19
+ */
20
+ export declare const STATIC_PAGE_URL_HINT: string;
21
+ /** Whose server the success line names, so a session on Reticle's own is never mistaken for the app. */
22
+ export declare const ServerStartedBy: {
23
+ readonly CALLER: "you passed its url";
24
+ readonly ALREADY_RUNNING: "it was already running";
25
+ readonly RETICLE_STATIC: "Reticle started this static server";
26
+ readonly SETUP: "setup started the dev server";
27
+ };
28
+ export type ServerStartedBy = (typeof ServerStartedBy)[keyof typeof ServerStartedBy];
19
29
  export declare const SetupPhase: {
20
30
  readonly DEV_SERVER: "dev-server";
21
31
  readonly CONNECT: "connect";
@@ -29,11 +39,14 @@ export interface SetupOutcome {
29
39
  readonly url?: string | undefined;
30
40
  readonly sessionId?: string | undefined;
31
41
  /**
32
- * Always false here now, and kept because the callers that report progress still read it.
33
- *
34
- * Onboarding does not drive, so it cannot save a flow. The first run is what saves one.
42
+ * Always false: init never drives, and the coding agent proves the first flow after it.
35
43
  */
36
44
  readonly flowSaved: boolean;
45
+ /**
46
+ * The session was a Reticle-owned headless browser, now closed: there is no tab of the person's
47
+ * own to drive a first flow in.
48
+ */
49
+ readonly leased?: boolean;
37
50
  /** What the caller should do next, when this did not finish. */
38
51
  readonly fallback: string[];
39
52
  readonly notes: string[];
@@ -125,6 +138,13 @@ export interface SetupInput {
125
138
  /** This project's id, so a live tab of it can be told from another app's on the same url. */
126
139
  readonly projectId?: string | undefined;
127
140
  readonly devCommand?: string | undefined;
141
+ /**
142
+ * `devCommand` is Reticle's own static server, not the project's. The page may already be served
143
+ * by something else (python, php, a Node server with an API), and only the person running init
144
+ * can say so — with --url — so they are told before :5500 starts, and the success line says
145
+ * whose server it is (#1426).
146
+ */
147
+ readonly devCommandIsStaticPage?: boolean | undefined;
128
148
  /** The app is already served here, so nothing is started. */
129
149
  readonly suppliedUrl?: string | undefined;
130
150
  /**