@reticlehq/server 3.5.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 (721) hide show
  1. package/README.md +1 -1
  2. package/SKILL.md +123 -116
  3. package/dist/chromium-launch-options.d.ts +3 -1
  4. package/dist/chromium-launch-options.js +2 -1
  5. package/dist/command/cli/adhoc-suite.d.ts +14 -0
  6. package/dist/command/cli/adhoc-suite.js +42 -7
  7. package/dist/command/cli/adhoc-verdict.d.ts +19 -2
  8. package/dist/command/cli/adhoc-verdict.js +76 -9
  9. package/dist/command/cli/answers/gate-exit.d.ts +23 -0
  10. package/dist/command/cli/answers/gate-exit.js +45 -0
  11. package/dist/command/cli/answers/gate-hook-message.d.ts +2 -0
  12. package/dist/command/cli/answers/gate-hook-message.js +3 -1
  13. package/dist/command/cli/answers/open-note.d.ts +2 -0
  14. package/dist/command/cli/answers/open-note.js +22 -0
  15. package/dist/command/cli/auth/device-flow.d.ts +13 -2
  16. package/dist/command/cli/auth/device-flow.js +17 -0
  17. package/dist/command/cli/cli-doctor.js +14 -0
  18. package/dist/command/cli/cli-flow-commands.d.ts +0 -11
  19. package/dist/command/cli/cli-flow-commands.js +31 -112
  20. package/dist/command/cli/cli-kill.js +3 -2
  21. package/dist/command/cli/cli-parse-grammar.d.ts +24 -0
  22. package/dist/command/cli/cli-parse-grammar.js +75 -0
  23. package/dist/command/cli/cli-parse-verify.d.ts +2 -0
  24. package/dist/command/cli/cli-parse-verify.js +18 -0
  25. package/dist/command/cli/cli-parse.d.ts +19 -28
  26. package/dist/command/cli/cli-parse.js +82 -182
  27. package/dist/command/cli/cli-update-commands.d.ts +1 -1
  28. package/dist/command/cli/cli-update-commands.js +61 -9
  29. package/dist/command/cli/cli-usage.d.ts +33 -0
  30. package/dist/command/cli/cli-usage.js +287 -0
  31. package/dist/command/cli/cli-verify.d.ts +35 -5
  32. package/dist/command/cli/cli-verify.js +114 -35
  33. package/dist/command/cli/cloud-cli.d.ts +13 -0
  34. package/dist/command/cli/cloud-cli.js +192 -341
  35. package/dist/command/cli/cloud-kit.d.ts +12 -0
  36. package/dist/command/cli/cloud-kit.js +41 -2
  37. package/dist/command/cli/cloud-link.d.ts +57 -0
  38. package/dist/command/cli/cloud-link.js +308 -0
  39. package/dist/command/cli/cloud-login.d.ts +22 -0
  40. package/dist/command/cli/cloud-login.js +96 -8
  41. package/dist/command/cli/context-command.d.ts +1 -0
  42. package/dist/command/cli/context-command.js +33 -0
  43. package/dist/command/cli/daemon-start-options.d.ts +3 -0
  44. package/dist/command/cli/daemon-start-options.js +24 -3
  45. package/dist/command/cli/doctor/browser/chromium-hint.d.ts +46 -0
  46. package/dist/command/cli/doctor/browser/chromium-hint.js +99 -1
  47. package/dist/command/cli/doctor/doctor-coverage-line.d.ts +2 -0
  48. package/dist/command/cli/doctor/doctor-coverage-line.js +47 -0
  49. package/dist/command/cli/doctor/doctor-project-line.d.ts +0 -12
  50. package/dist/command/cli/doctor/doctor-project-line.js +5 -4
  51. package/dist/command/cli/doctor/doctor-rows.d.ts +6 -0
  52. package/dist/command/cli/doctor/doctor-rows.js +6 -0
  53. package/dist/command/cli/doctor/doctor-signing-line.d.ts +38 -0
  54. package/dist/command/cli/doctor/doctor-signing-line.js +114 -0
  55. package/dist/command/cli/drive/drive-attach.d.ts +27 -2
  56. package/dist/command/cli/drive/drive-attach.js +71 -4
  57. package/dist/command/cli/drive/drive-command.d.ts +2 -1
  58. package/dist/command/cli/drive/drive-command.js +13 -7
  59. package/dist/command/cli/known-regression.d.ts +13 -0
  60. package/dist/command/cli/known-regression.js +34 -0
  61. package/dist/command/cli/launch/sdk-version-match.d.ts +12 -0
  62. package/dist/command/cli/launch/sdk-version-match.js +25 -0
  63. package/dist/command/cli/lifecycle/daemon-lifecycle.js +15 -3
  64. package/dist/command/cli/mcp-command.d.ts +6 -0
  65. package/dist/command/cli/mcp-command.js +13 -5
  66. package/dist/command/cli/ports/port-holder.d.ts +10 -0
  67. package/dist/command/cli/ports/port-holder.js +25 -1
  68. package/dist/command/cli/project-name.d.ts +29 -1
  69. package/dist/command/cli/project-name.js +107 -2
  70. package/dist/command/cli/setup-mcp-cli.d.ts +17 -1
  71. package/dist/command/cli/setup-mcp-cli.js +35 -12
  72. package/dist/command/cli/status/status-lines.d.ts +1 -0
  73. package/dist/command/cli/status/status-lines.js +47 -2
  74. package/dist/command/cli/status/workspace-links.d.ts +10 -0
  75. package/dist/command/cli/status/workspace-links.js +29 -0
  76. package/dist/command/cli/try-command.d.ts +96 -0
  77. package/dist/command/cli/try-command.js +362 -0
  78. package/dist/command/cli/tutorial.d.ts +0 -100
  79. package/dist/command/cli/tutorial.js +0 -181
  80. package/dist/command/cli/verify-results.d.ts +19 -0
  81. package/dist/command/cli/verify-results.js +29 -0
  82. package/dist/command/cli-onboarding.d.ts +0 -11
  83. package/dist/command/cli-onboarding.js +0 -15
  84. package/dist/command/cli.d.ts +20 -0
  85. package/dist/command/cli.js +130 -104
  86. package/dist/command/daemon/binding/daemon-status-probe.d.ts +2 -0
  87. package/dist/command/daemon/binding/daemon-status-probe.js +1 -0
  88. package/dist/command/daemon/daemon-resilience.js +4 -4
  89. package/dist/command/daemon/daemon-resolve.d.ts +23 -1
  90. package/dist/command/daemon/daemon-resolve.js +79 -9
  91. package/dist/command/setup/agent-writer.d.ts +1 -1
  92. package/dist/command/setup/agent-writer.js +3 -2
  93. package/dist/command/setup/bringup/bridge-port.d.ts +3 -1
  94. package/dist/command/setup/bringup/bridge-port.js +13 -3
  95. package/dist/command/setup/bringup/connect-lease.d.ts +1 -0
  96. package/dist/command/setup/bringup/connect-lease.js +1 -0
  97. package/dist/command/setup/bringup/dev-server-log-cap.js +2 -0
  98. package/dist/command/setup/bringup/dev-server-wait.d.ts +8 -0
  99. package/dist/command/setup/bringup/dev-server-wait.js +19 -0
  100. package/dist/command/setup/bringup/ensure-daemon.js +9 -2
  101. package/dist/command/setup/init/agent-restart.d.ts +23 -0
  102. package/dist/command/setup/init/agent-restart.js +28 -0
  103. package/dist/command/setup/init/init-port.d.ts +14 -1
  104. package/dist/command/setup/init/init-port.js +32 -2
  105. package/dist/command/setup/init/init-runtime.d.ts +22 -2
  106. package/dist/command/setup/init/init-runtime.js +114 -38
  107. package/dist/command/setup/node-effects.d.ts +2 -0
  108. package/dist/command/setup/node-effects.js +38 -9
  109. package/dist/command/setup/probe/existing-app.d.ts +12 -0
  110. package/dist/command/setup/probe/existing-app.js +14 -0
  111. package/dist/command/setup/remaining-steps.js +2 -1
  112. package/dist/command/setup/run-setup.d.ts +34 -9
  113. package/dist/command/setup/run-setup.js +65 -51
  114. package/dist/command/setup/setup-command.d.ts +25 -1
  115. package/dist/command/setup/setup-command.js +59 -4
  116. package/dist/command/setup/setup-mcp.js +25 -2
  117. package/dist/command/setup/tauri-signing.d.ts +19 -0
  118. package/dist/command/setup/tauri-signing.js +79 -0
  119. package/dist/command/setup/terminal/listeners.d.ts +10 -1
  120. package/dist/command/setup/terminal/listeners.js +37 -6
  121. package/dist/command/update/update-nudge.d.ts +9 -0
  122. package/dist/command/update/update-nudge.js +1 -1
  123. package/dist/command/update/updater.js +11 -15
  124. package/dist/command/version/version-nudge.js +3 -0
  125. package/dist/command/version/version-skew.d.ts +20 -1
  126. package/dist/command/version/version-skew.js +49 -4
  127. package/dist/features/crawl/crawl-tools.js +4 -0
  128. package/dist/features/crawl/crawl.d.ts +6 -0
  129. package/dist/features/crawl/crawl.js +23 -2
  130. package/dist/features/exhaust/ledger.d.ts +21 -14
  131. package/dist/features/exhaust/ledger.js +35 -9
  132. package/dist/features/harness/app-findings.d.ts +2 -0
  133. package/dist/features/harness/app-findings.js +52 -0
  134. package/dist/features/harness/drive-report.d.ts +61 -1
  135. package/dist/features/harness/drive-report.js +394 -26
  136. package/dist/features/harness/drive-runs.d.ts +120 -0
  137. package/dist/features/harness/drive-runs.js +289 -0
  138. package/dist/features/harness/drivers.d.ts +10 -14
  139. package/dist/features/harness/drivers.js +10 -14
  140. package/dist/features/harness/explore/console-pages.d.ts +15 -0
  141. package/dist/features/harness/explore/console-pages.js +146 -0
  142. package/dist/features/harness/explore/disparity.d.ts +19 -0
  143. package/dist/features/harness/explore/disparity.js +71 -0
  144. package/dist/features/harness/explore/fake-app.d.ts +16 -0
  145. package/dist/features/harness/explore/fake-app.js +49 -0
  146. package/dist/features/harness/explore/goal-search.d.ts +26 -0
  147. package/dist/features/harness/explore/goal-search.js +144 -0
  148. package/dist/features/harness/explore/page-tree.d.ts +49 -0
  149. package/dist/features/harness/explore/page-tree.js +148 -0
  150. package/dist/features/harness/explore/site-map.d.ts +34 -0
  151. package/dist/features/harness/explore/site-map.js +150 -0
  152. package/dist/features/harness/fill-values.d.ts +3 -73
  153. package/dist/features/harness/fill-values.js +3 -169
  154. package/dist/features/harness/goals.d.ts +82 -0
  155. package/dist/features/harness/goals.js +330 -0
  156. package/dist/features/harness/harness.d.ts +51 -1
  157. package/dist/features/harness/harness.js +207 -6
  158. package/dist/features/harness/platform/drive-target.d.ts +30 -0
  159. package/dist/features/harness/platform/drive-target.js +81 -0
  160. package/dist/features/harness/platform/local-apps.d.ts +127 -0
  161. package/dist/features/harness/platform/local-apps.js +280 -0
  162. package/dist/features/harness/platform/persona-credentials.d.ts +20 -0
  163. package/dist/features/harness/platform/persona-credentials.js +69 -0
  164. package/dist/features/harness/platform/platform-drives.d.ts +61 -0
  165. package/dist/features/harness/platform/platform-drives.js +114 -0
  166. package/dist/features/harness/platform/refusal.d.ts +52 -0
  167. package/dist/features/harness/platform/refusal.js +71 -0
  168. package/dist/features/harness/platform/remote-drive.d.ts +186 -0
  169. package/dist/features/harness/platform/remote-drive.js +378 -0
  170. package/dist/features/harness/platform/script.d.ts +94 -0
  171. package/dist/features/harness/platform/script.js +260 -0
  172. package/dist/features/harness/platform/server-driver.d.ts +54 -0
  173. package/dist/features/harness/platform/server-driver.js +182 -0
  174. package/dist/features/harness/platform-config.d.ts +41 -1
  175. package/dist/features/harness/platform-config.js +106 -9
  176. package/dist/features/harness/route-guess.d.ts +13 -0
  177. package/dist/features/harness/route-guess.js +49 -0
  178. package/dist/features/harness/script/app-controls.d.ts +5 -0
  179. package/dist/features/harness/script/app-controls.js +40 -0
  180. package/dist/features/harness/script/lane-ids.d.ts +14 -0
  181. package/dist/features/harness/script/lane-ids.js +16 -0
  182. package/dist/features/harness/script/script-run.d.ts +70 -0
  183. package/dist/features/harness/script/script-run.js +606 -0
  184. package/dist/features/license/license.d.ts +2 -2
  185. package/dist/features/visual/step-shots.d.ts +31 -0
  186. package/dist/features/visual/step-shots.js +231 -0
  187. package/dist/features/visual/visual-tools.d.ts +10 -1
  188. package/dist/features/visual/visual-tools.js +62 -17
  189. package/dist/hooks/client-directory.d.ts +18 -0
  190. package/dist/hooks/client-directory.js +57 -0
  191. package/dist/hooks/coding-agents.d.ts +34 -0
  192. package/dist/hooks/coding-agents.js +117 -0
  193. package/dist/hooks/driven-by.d.ts +23 -0
  194. package/dist/hooks/driven-by.js +56 -0
  195. package/dist/hooks/hook-bus.d.ts +4 -0
  196. package/dist/hooks/hook-bus.js +18 -0
  197. package/dist/hooks/hook-commands.js +15 -4
  198. package/dist/hooks/tool-log.d.ts +9 -0
  199. package/dist/hooks/tool-log.js +29 -0
  200. package/dist/index.d.ts +2 -0
  201. package/dist/index.js +80 -243
  202. package/dist/judgement/capsule/capsule-store.d.ts +2 -2
  203. package/dist/judgement/capsule/causal-summary.d.ts +15 -1
  204. package/dist/judgement/capsule/causal-summary.js +33 -0
  205. package/dist/judgement/runs/artifact/build-verification-run.d.ts +1 -1
  206. package/dist/judgement/runs/artifact/build-verification-run.js +25 -3
  207. package/dist/judgement/runs/artifact/gap-summary.d.ts +0 -18
  208. package/dist/judgement/runs/artifact/gap-summary.js +12 -3
  209. package/dist/judgement/runs/artifact/replay-mapping.d.ts +1 -1
  210. package/dist/judgement/runs/artifact/replay-mapping.js +37 -11
  211. package/dist/judgement/runs/artifact/run-store.d.ts +14 -2
  212. package/dist/judgement/runs/artifact/run-store.js +195 -3
  213. package/dist/judgement/runs/context-tools.js +59 -1
  214. package/dist/judgement/runs/default-run-id.d.ts +3 -0
  215. package/dist/judgement/runs/default-run-id.js +16 -0
  216. package/dist/judgement/runs/drive-run.d.ts +71 -1
  217. package/dist/judgement/runs/drive-run.js +317 -5
  218. package/dist/judgement/runs/repair-prompt.js +1 -1
  219. package/dist/judgement/runs/resume.d.ts +44 -0
  220. package/dist/judgement/runs/resume.js +137 -0
  221. package/dist/judgement/runs/reticle-runner.js +13 -3
  222. package/dist/judgement/runs/runner-port.d.ts +5 -1
  223. package/dist/judgement/runs/runner-port.js +8 -2
  224. package/dist/judgement/runs/verification-sync.d.ts +5 -2
  225. package/dist/judgement/runs/verification-sync.js +40 -18
  226. package/dist/language/flows/change/gate.d.ts +10 -0
  227. package/dist/language/flows/change/gate.js +22 -0
  228. package/dist/language/flows/decision.js +36 -1
  229. package/dist/language/flows/fields/flow-secret-field.d.ts +12 -0
  230. package/dist/language/flows/fields/flow-secret-field.js +25 -2
  231. package/dist/language/flows/flow-anchor.d.ts +61 -10
  232. package/dist/language/flows/flow-anchor.js +98 -6
  233. package/dist/language/flows/flow-cross-step.d.ts +15 -0
  234. package/dist/language/flows/flow-cross-step.js +21 -0
  235. package/dist/language/flows/flow-intent.d.ts +1 -0
  236. package/dist/language/flows/flow-journey.d.ts +6 -0
  237. package/dist/language/flows/flow-journey.js +20 -0
  238. package/dist/language/flows/flow-learning.d.ts +4 -0
  239. package/dist/language/flows/flow-learning.js +45 -14
  240. package/dist/language/flows/flow-mutate-tools.js +5 -3
  241. package/dist/language/flows/flow-replay-run.d.ts +23 -9
  242. package/dist/language/flows/flow-replay-run.js +115 -110
  243. package/dist/language/flows/flow-replay-types.d.ts +1 -1
  244. package/dist/language/flows/flow-replay.d.ts +40 -1
  245. package/dist/language/flows/flow-replay.js +110 -22
  246. package/dist/language/flows/flow-result.d.ts +22 -1
  247. package/dist/language/flows/flow-result.js +47 -2
  248. package/dist/language/flows/flow-scope.js +5 -1
  249. package/dist/language/flows/flow-step-runners.d.ts +22 -2
  250. package/dist/language/flows/flow-step-runners.js +247 -47
  251. package/dist/language/flows/flow-store-for-session.d.ts +2 -2
  252. package/dist/language/flows/flow-store-for-session.js +7 -3
  253. package/dist/language/flows/flow-tools.d.ts +10 -0
  254. package/dist/language/flows/flow-tools.js +112 -89
  255. package/dist/language/flows/flows.d.ts +16 -1
  256. package/dist/language/flows/flows.js +74 -12
  257. package/dist/language/flows/heal-run.js +6 -4
  258. package/dist/language/flows/narrow-write.d.ts +7 -0
  259. package/dist/language/flows/narrow-write.js +36 -1
  260. package/dist/language/flows/recording/flake.d.ts +2 -2
  261. package/dist/language/flows/recording/recording-backtrack.js +14 -1
  262. package/dist/language/flows/recording/tape/recordings.d.ts +58 -4
  263. package/dist/language/flows/recording/tape/recordings.js +95 -13
  264. package/dist/language/flows/replay-from-hud.d.ts +20 -0
  265. package/dist/language/flows/replay-from-hud.js +51 -0
  266. package/dist/language/flows/replay.d.ts +9 -5
  267. package/dist/language/flows/replay.js +56 -15
  268. package/dist/language/flows/single-replay.d.ts +7 -0
  269. package/dist/language/flows/single-replay.js +26 -0
  270. package/dist/language/flows/suite/suite-flakes.js +2 -0
  271. package/dist/language/flows/suite-selection.d.ts +2 -15
  272. package/dist/language/flows/suite-selection.js +4 -3
  273. package/dist/language/flows/verify-change-tools.d.ts +1 -0
  274. package/dist/language/flows/verify-change-tools.js +202 -191
  275. package/dist/launch-chromium.d.ts +27 -5
  276. package/dist/launch-chromium.js +38 -8
  277. package/dist/memory/cloud/cloud-config.d.ts +22 -1
  278. package/dist/memory/cloud/cloud-config.js +34 -5
  279. package/dist/memory/cloud/cloud-sync.d.ts +17 -14
  280. package/dist/memory/cloud/cloud-sync.js +15 -4
  281. package/dist/memory/cloud/harness-config.d.ts +75 -1
  282. package/dist/memory/cloud/harness-config.js +115 -24
  283. package/dist/memory/cloud/hud-notices-source.d.ts +21 -0
  284. package/dist/memory/cloud/hud-notices-source.js +128 -0
  285. package/dist/memory/cloud/memory-scope.d.ts +161 -0
  286. package/dist/memory/cloud/memory-scope.js +227 -0
  287. package/dist/memory/cloud/sync-cycle.d.ts +44 -7
  288. package/dist/memory/cloud/sync-cycle.js +129 -15
  289. package/dist/memory/cloud/sync-daemon.d.ts +11 -0
  290. package/dist/memory/cloud/sync-daemon.js +121 -9
  291. package/dist/memory/cloud/sync-disk.d.ts +1 -1
  292. package/dist/memory/cloud/sync-disk.js +31 -10
  293. package/dist/memory/cloud/sync-screenshots.d.ts +32 -0
  294. package/dist/memory/cloud/sync-screenshots.js +105 -0
  295. package/dist/memory/cloud/unsynced-roots.d.ts +47 -0
  296. package/dist/memory/cloud/unsynced-roots.js +166 -0
  297. package/dist/memory/impact/account-watch.d.ts +34 -0
  298. package/dist/memory/impact/account-watch.js +59 -0
  299. package/dist/memory/impact/impact-recorder.d.ts +8 -0
  300. package/dist/memory/impact/impact-recorder.js +12 -2
  301. package/dist/memory/impact/impact-store.d.ts +17 -4
  302. package/dist/memory/impact/impact-store.js +169 -63
  303. package/dist/memory/intent/inline-intent.d.ts +1 -0
  304. package/dist/memory/intent/intent-shard-store.js +16 -4
  305. package/dist/memory/intent/intent-shard.d.ts +14 -2
  306. package/dist/memory/intent/intent-store.d.ts +1 -0
  307. package/dist/memory/intent/intent-tools.js +122 -4
  308. package/dist/memory/intent/open-intents.d.ts +6 -0
  309. package/dist/memory/intent/open-intents.js +10 -1
  310. package/dist/memory/intent/settled-words.d.ts +24 -0
  311. package/dist/memory/intent/settled-words.js +130 -0
  312. package/dist/memory/journal/drive-flow.d.ts +16 -0
  313. package/dist/memory/journal/drive-flow.js +34 -2
  314. package/dist/memory/journal/drive-run-flush.d.ts +2 -0
  315. package/dist/memory/journal/drive-run-flush.js +20 -5
  316. package/dist/memory/journal/envelope.d.ts +8 -8
  317. package/dist/memory/journal/journal-recorder.js +52 -3
  318. package/dist/memory/journal/on-disk/retention.d.ts +8 -0
  319. package/dist/memory/journal/on-disk/retention.js +32 -2
  320. package/dist/memory/journal/on-disk/startup-maintenance.js +3 -1
  321. package/dist/memory/journal/on-disk/workspace-tiers.js +9 -4
  322. package/dist/memory/journal/session-end.d.ts +15 -1
  323. package/dist/memory/journal/session-end.js +42 -9
  324. package/dist/memory/project/artifact-root-resolver.d.ts +26 -1
  325. package/dist/memory/project/artifact-root-resolver.js +125 -16
  326. package/dist/memory/project/artifact-root.d.ts +46 -8
  327. package/dist/memory/project/artifact-root.js +89 -10
  328. package/dist/memory/project/dir/reticle-dir.d.ts +18 -2
  329. package/dist/memory/project/dir/reticle-dir.js +26 -3
  330. package/dist/memory/project/link-directory.d.ts +15 -0
  331. package/dist/memory/project/link-directory.js +44 -0
  332. package/dist/memory/project/project-tools.js +22 -3
  333. package/dist/memory/project/root-claims.d.ts +6 -0
  334. package/dist/memory/project/root-claims.js +39 -0
  335. package/dist/memory/project/session-root.d.ts +26 -1
  336. package/dist/memory/project/session-root.js +49 -5
  337. package/dist/memory/project/sync-status.d.ts +85 -0
  338. package/dist/memory/project/sync-status.js +224 -0
  339. package/dist/memory/recall/memory-tools.js +47 -2
  340. package/dist/memory/recall/platform-memory.d.ts +34 -0
  341. package/dist/memory/recall/platform-memory.js +139 -0
  342. package/dist/memory/recall/project-memory.d.ts +19 -0
  343. package/dist/memory/recall/project-memory.js +80 -13
  344. package/dist/portal/bridge/bridge.d.ts +9 -3
  345. package/dist/portal/bridge/bridge.js +82 -22
  346. package/dist/portal/bridge/harness-request.d.ts +23 -0
  347. package/dist/portal/bridge/harness-request.js +27 -0
  348. package/dist/portal/bridge/pairing-token.d.ts +9 -0
  349. package/dist/portal/bridge/pairing-token.js +17 -0
  350. package/dist/portal/bridge/wrong-path.d.ts +17 -0
  351. package/dist/portal/bridge/wrong-path.js +35 -0
  352. package/dist/portal/input/network-mock-tools.js +11 -2
  353. package/dist/portal/input/real-input.d.ts +83 -10
  354. package/dist/portal/input/real-input.js +218 -30
  355. package/dist/portal/input/viewport-tools.js +3 -3
  356. package/dist/portal/pool/browser-pool.d.ts +70 -9
  357. package/dist/portal/pool/browser-pool.js +190 -37
  358. package/dist/portal/pool/context-permissions.d.ts +33 -0
  359. package/dist/portal/pool/context-permissions.js +33 -0
  360. package/dist/portal/pool/lease-marker-stamp.d.ts +23 -0
  361. package/dist/portal/pool/lease-marker-stamp.js +49 -0
  362. package/dist/portal/pool/playwright-launcher.d.ts +35 -0
  363. package/dist/portal/pool/playwright-launcher.js +64 -3
  364. package/dist/portal/pool/pool-contract.d.ts +28 -5
  365. package/dist/portal/session/agent-link.d.ts +8 -0
  366. package/dist/portal/session/agent-link.js +17 -0
  367. package/dist/portal/session/command-payload.d.ts +8 -0
  368. package/dist/portal/session/command-payload.js +24 -0
  369. package/dist/portal/session/daemon-answers.d.ts +3 -3
  370. package/dist/portal/session/daemon-answers.js +4 -2
  371. package/dist/portal/session/dev-server/dev-command.d.ts +21 -0
  372. package/dist/portal/session/dev-server/dev-command.js +87 -12
  373. package/dist/portal/session/facts/departure-note.d.ts +22 -0
  374. package/dist/portal/session/facts/departure-note.js +47 -0
  375. package/dist/portal/session/facts/observed-state.d.ts +16 -18
  376. package/dist/portal/session/facts/observed-state.js +46 -3
  377. package/dist/portal/session/facts/session-replaced.d.ts +5 -0
  378. package/dist/portal/session/facts/session-replaced.js +5 -0
  379. package/dist/portal/session/first-run-wiring.d.ts +42 -0
  380. package/dist/portal/session/first-run-wiring.js +132 -0
  381. package/dist/portal/session/human/live-control.d.ts +9 -2
  382. package/dist/portal/session/human/live-control.js +12 -3
  383. package/dist/portal/session/human/notes-ledger.d.ts +20 -0
  384. package/dist/portal/session/human/notes-ledger.js +55 -0
  385. package/dist/portal/session/human/review-store.d.ts +12 -0
  386. package/dist/portal/session/human/review-store.js +18 -10
  387. package/dist/portal/session/live-control-tools.d.ts +0 -13
  388. package/dist/portal/session/live-control-tools.js +107 -13
  389. package/dist/portal/session/narration-args.d.ts +5 -0
  390. package/dist/portal/session/narration-args.js +17 -0
  391. package/dist/portal/session/no-session-diagnosis.d.ts +8 -1
  392. package/dist/portal/session/no-session-diagnosis.js +46 -9
  393. package/dist/portal/session/no-session-next-action.d.ts +31 -0
  394. package/dist/portal/session/no-session-next-action.js +159 -60
  395. package/dist/portal/session/no-session-watch.d.ts +14 -1
  396. package/dist/portal/session/no-session-watch.js +227 -17
  397. package/dist/portal/session/presence/session-lease.js +1 -1
  398. package/dist/portal/session/presence/session-mirror.js +3 -0
  399. package/dist/portal/session/recorded-gaps.d.ts +97 -0
  400. package/dist/portal/session/recorded-gaps.js +251 -0
  401. package/dist/portal/session/serving-directory.d.ts +27 -0
  402. package/dist/portal/session/serving-directory.js +45 -0
  403. package/dist/portal/session/session-health.d.ts +18 -0
  404. package/dist/portal/session/session-health.js +9 -1
  405. package/dist/portal/session/session-info.d.ts +8 -1
  406. package/dist/portal/session/session-info.js +8 -1
  407. package/dist/portal/session/session-manager.d.ts +39 -0
  408. package/dist/portal/session/session-manager.js +98 -11
  409. package/dist/portal/session/session-reaper.js +4 -1
  410. package/dist/portal/session/session-successor.d.ts +13 -0
  411. package/dist/portal/session/session-successor.js +1 -1
  412. package/dist/portal/session/session-tools.js +26 -3
  413. package/dist/portal/session/session.d.ts +22 -30
  414. package/dist/portal/session/session.js +81 -79
  415. package/dist/portal/session/timing/command-timeout.js +25 -1
  416. package/dist/portal/session/timing/wall-clock.d.ts +1 -1
  417. package/dist/portal/session/timing/wall-clock.js +1 -1
  418. package/dist/portal/session/zero-install-first-call.d.ts +31 -0
  419. package/dist/portal/session/zero-install-first-call.js +88 -0
  420. package/dist/start-options.d.ts +12 -0
  421. package/dist/start-wiring.d.ts +63 -0
  422. package/dist/start-wiring.js +169 -0
  423. package/dist/status-payload.d.ts +23 -1
  424. package/dist/status-payload.js +36 -1
  425. package/dist/surface/http-server.js +18 -2
  426. package/dist/surface/mcp/attach-memory.d.ts +1 -0
  427. package/dist/surface/mcp/attach-memory.js +12 -1
  428. package/dist/surface/mcp/mcp-proxy.d.ts +9 -0
  429. package/dist/surface/mcp/mcp-proxy.js +65 -13
  430. package/dist/surface/mcp/mcp.d.ts +34 -6
  431. package/dist/surface/mcp/mcp.js +61 -17
  432. package/dist/surface/mcp/proxy/drive-calls.d.ts +10 -0
  433. package/dist/surface/mcp/proxy/drive-calls.js +27 -0
  434. package/dist/surface/mcp/proxy/mcp-post-transport.js +5 -0
  435. package/dist/surface/mcp/server-instructions.d.ts +4 -2
  436. package/dist/surface/mcp/server-instructions.js +32 -14
  437. package/dist/surface/mcp/shared-params.js +2 -2
  438. package/dist/surface/mcp/surface-vocabulary.d.ts +2 -0
  439. package/dist/surface/mcp/surface-vocabulary.js +1 -0
  440. package/dist/surface/tools/account-tool.d.ts +22 -0
  441. package/dist/surface/tools/account-tool.js +157 -0
  442. package/dist/surface/tools/act/act-danger.d.ts +11 -0
  443. package/dist/surface/tools/act/act-danger.js +38 -1
  444. package/dist/surface/tools/act/act-observation.d.ts +33 -0
  445. package/dist/surface/tools/act/act-observation.js +57 -0
  446. package/dist/surface/tools/act/act-preflight.js +25 -2
  447. package/dist/surface/tools/act/act-target.js +8 -3
  448. package/dist/surface/tools/act/navigation/navigate-arrival.d.ts +8 -0
  449. package/dist/surface/tools/act/navigation/navigate-arrival.js +56 -2
  450. package/dist/surface/tools/act/resolve-target.d.ts +1 -1
  451. package/dist/surface/tools/act/resolve-target.js +18 -3
  452. package/dist/surface/tools/act/screen-request.d.ts +34 -0
  453. package/dist/surface/tools/act/screen-request.js +113 -0
  454. package/dist/surface/tools/act/sequence-grade.d.ts +8 -0
  455. package/dist/surface/tools/act/sequence-grade.js +13 -2
  456. package/dist/surface/tools/act/settle-in-flight.js +25 -3
  457. package/dist/surface/tools/act-sequence-tool.js +138 -29
  458. package/dist/surface/tools/act-tools.d.ts +0 -9
  459. package/dist/surface/tools/act-tools.js +71 -41
  460. package/dist/surface/tools/agent/app-notes-learning.d.ts +7 -0
  461. package/dist/surface/tools/agent/app-notes-learning.js +80 -0
  462. package/dist/surface/tools/agent/app-notes.d.ts +4 -0
  463. package/dist/surface/tools/agent/app-notes.js +48 -0
  464. package/dist/surface/tools/agent/build-staleness.d.ts +7 -0
  465. package/dist/surface/tools/agent/build-staleness.js +62 -0
  466. package/dist/surface/tools/agent/compact-envelope.d.ts +80 -0
  467. package/dist/surface/tools/agent/compact-envelope.js +374 -0
  468. package/dist/surface/tools/agent/for-the-agent.d.ts +12 -0
  469. package/dist/surface/tools/agent/for-the-agent.js +44 -0
  470. package/dist/surface/tools/agent/notices.d.ts +50 -0
  471. package/dist/surface/tools/agent/notices.js +152 -0
  472. package/dist/surface/tools/agent/reteach.d.ts +11 -0
  473. package/dist/surface/tools/agent/reteach.js +50 -0
  474. package/dist/surface/tools/args/alias-args.d.ts +5 -0
  475. package/dist/surface/tools/args/alias-args.js +10 -0
  476. package/dist/surface/tools/args/confirm-dangerous-arg.d.ts +6 -0
  477. package/dist/surface/tools/args/confirm-dangerous-arg.js +6 -0
  478. package/dist/surface/tools/assert/assert-source.d.ts +15 -0
  479. package/dist/surface/tools/assert/assert-source.js +40 -0
  480. package/dist/surface/tools/assert/assert-verdict.d.ts +1 -1
  481. package/dist/surface/tools/assert/assert-verdict.js +42 -17
  482. package/dist/surface/tools/browser-tools.js +51 -2
  483. package/dist/surface/tools/chat-drives.d.ts +101 -0
  484. package/dist/surface/tools/chat-drives.js +409 -0
  485. package/dist/surface/tools/coverage-tools.d.ts +2 -10
  486. package/dist/surface/tools/coverage-tools.js +2 -53
  487. package/dist/surface/tools/dynamic-tools.js +29 -1
  488. package/dist/surface/tools/empty-session-list.d.ts +51 -0
  489. package/dist/surface/tools/empty-session-list.js +120 -0
  490. package/dist/surface/tools/error-recovery.d.ts +14 -0
  491. package/dist/surface/tools/error-recovery.js +105 -8
  492. package/dist/surface/tools/explore-tools.d.ts +31 -1
  493. package/dist/surface/tools/explore-tools.js +438 -66
  494. package/dist/surface/tools/feedback-tools.d.ts +2 -3
  495. package/dist/surface/tools/feedback-tools.js +18 -3
  496. package/dist/surface/tools/gap-novelty.d.ts +3 -1
  497. package/dist/surface/tools/gap-novelty.js +8 -1
  498. package/dist/surface/tools/harness-explore.d.ts +118 -57
  499. package/dist/surface/tools/harness-explore.js +344 -292
  500. package/dist/surface/tools/harness-gate.d.ts +88 -0
  501. package/dist/surface/tools/harness-gate.js +235 -0
  502. package/dist/surface/tools/harness-hunt.d.ts +43 -0
  503. package/dist/surface/tools/harness-hunt.js +215 -0
  504. package/dist/surface/tools/harness-plan.d.ts +17 -0
  505. package/dist/surface/tools/harness-plan.js +38 -0
  506. package/dist/surface/tools/harness-script.d.ts +30 -0
  507. package/dist/surface/tools/harness-script.js +560 -0
  508. package/dist/surface/tools/harness-tab-guard.d.ts +5 -0
  509. package/dist/surface/tools/harness-tab-guard.js +27 -0
  510. package/dist/surface/tools/harness-toolset.d.ts +22 -1
  511. package/dist/surface/tools/harness-toolset.js +101 -7
  512. package/dist/surface/tools/human-notes.d.ts +16 -0
  513. package/dist/surface/tools/human-notes.js +27 -0
  514. package/dist/surface/tools/invoke-tool.d.ts +5 -2
  515. package/dist/surface/tools/invoke-tool.js +263 -85
  516. package/dist/surface/tools/lease-hint.js +26 -5
  517. package/dist/surface/tools/lease-permissions.d.ts +33 -0
  518. package/dist/surface/tools/lease-permissions.js +73 -0
  519. package/dist/surface/tools/lease-readiness.d.ts +38 -0
  520. package/dist/surface/tools/lease-readiness.js +57 -0
  521. package/dist/surface/tools/lease-seed.d.ts +49 -0
  522. package/dist/surface/tools/lease-seed.js +167 -0
  523. package/dist/surface/tools/lease-tools.d.ts +13 -24
  524. package/dist/surface/tools/lease-tools.js +146 -197
  525. package/dist/surface/tools/live-call-text.js +4 -4
  526. package/dist/surface/tools/merge-tools.js +42 -2
  527. package/dist/surface/tools/merged-name-redirect.js +4 -0
  528. package/dist/surface/tools/next-step.d.ts +29 -0
  529. package/dist/surface/tools/next-step.js +214 -0
  530. package/dist/surface/tools/observe-tools.js +45 -9
  531. package/dist/surface/tools/platform-moment.d.ts +72 -0
  532. package/dist/surface/tools/platform-moment.js +296 -0
  533. package/dist/surface/tools/query-hint-schema.d.ts +7 -0
  534. package/dist/surface/tools/query-hint-schema.js +10 -0
  535. package/dist/surface/tools/read-tools.js +71 -14
  536. package/dist/surface/tools/real-input-attempt.js +96 -13
  537. package/dist/surface/tools/reticle-result.d.ts +120 -0
  538. package/dist/surface/tools/reticle-result.js +364 -0
  539. package/dist/surface/tools/tool-kit.d.ts +83 -3
  540. package/dist/surface/tools/tool-kit.js +77 -7
  541. package/dist/surface/tools/tools.js +43 -59
  542. package/dist/telemetry/account-envelope.d.ts +7 -0
  543. package/dist/telemetry/account-envelope.js +61 -0
  544. package/dist/telemetry/agent-client.d.ts +15 -0
  545. package/dist/telemetry/agent-client.js +57 -0
  546. package/dist/telemetry/app-instrumented.js +9 -2
  547. package/dist/telemetry/argument-shape.d.ts +7 -0
  548. package/dist/telemetry/argument-shape.js +86 -1
  549. package/dist/telemetry/automation-hint.d.ts +2 -3
  550. package/dist/telemetry/automation-hint.js +33 -8
  551. package/dist/telemetry/cli-telemetry.js +7 -2
  552. package/dist/telemetry/daemon-telemetry.js +3 -0
  553. package/dist/telemetry/error-fingerprint.d.ts +10 -1
  554. package/dist/telemetry/error-fingerprint.js +61 -5
  555. package/dist/telemetry/feedback-cli.d.ts +0 -13
  556. package/dist/telemetry/feedback-cli.js +0 -77
  557. package/dist/telemetry/feedback.d.ts +13 -0
  558. package/dist/telemetry/feedback.js +183 -17
  559. package/dist/telemetry/harness-run.d.ts +18 -0
  560. package/dist/telemetry/harness-run.js +80 -0
  561. package/dist/telemetry/hud-events.d.ts +16 -0
  562. package/dist/telemetry/hud-events.js +27 -0
  563. package/dist/telemetry/hud-metrics.d.ts +29 -6
  564. package/dist/telemetry/hud-metrics.js +116 -25
  565. package/dist/telemetry/init-telemetry.js +2 -2
  566. package/dist/telemetry/install-source.d.ts +13 -25
  567. package/dist/telemetry/install-source.js +44 -3
  568. package/dist/telemetry/mcp-connection.d.ts +0 -14
  569. package/dist/telemetry/mcp-connection.js +5 -1
  570. package/dist/telemetry/onboarding-firsts.d.ts +32 -0
  571. package/dist/telemetry/onboarding-firsts.js +81 -6
  572. package/dist/telemetry/platform-linked.d.ts +5 -0
  573. package/dist/telemetry/platform-linked.js +32 -0
  574. package/dist/telemetry/project-profile.js +5 -3
  575. package/dist/telemetry/proxy-telemetry.js +4 -1
  576. package/dist/telemetry/session-metrics.d.ts +15 -4
  577. package/dist/telemetry/session-metrics.js +88 -52
  578. package/dist/telemetry/telemetry.d.ts +38 -2
  579. package/dist/telemetry/telemetry.js +144 -34
  580. package/dist/telemetry/verification-of.d.ts +3 -1
  581. package/dist/telemetry/verification-of.js +13 -4
  582. package/dist/wire-journal.d.ts +2 -2
  583. package/dist/wire-journal.js +20 -6
  584. package/docs/README.md +3 -3
  585. package/docs/actions.mdx +6 -3
  586. package/docs/adapters.md +1 -1
  587. package/docs/agent-cheatsheet.md +25 -28
  588. package/docs/architecture.md +5 -5
  589. package/docs/autodrive.md +33 -28
  590. package/docs/benchmarks.md +5 -5
  591. package/docs/best-practices.mdx +27 -9
  592. package/docs/capabilities.mdx +14 -16
  593. package/docs/cli/affected.mdx +1 -1
  594. package/docs/cli/cloud.mdx +54 -75
  595. package/docs/cli/doctor.mdx +14 -3
  596. package/docs/cli/drive.mdx +20 -14
  597. package/docs/cli/feedback.mdx +3 -3
  598. package/docs/cli/gate.mdx +7 -2
  599. package/docs/cli/help.mdx +50 -55
  600. package/docs/cli/init.mdx +43 -28
  601. package/docs/cli/license.mdx +12 -8
  602. package/docs/cli/mcp.mdx +4 -4
  603. package/docs/cli/open.mdx +3 -3
  604. package/docs/cli/report.mdx +4 -2
  605. package/docs/cli/restart.mdx +2 -2
  606. package/docs/cli/rollback.mdx +14 -8
  607. package/docs/cli/serve.mdx +4 -4
  608. package/docs/cli/setup.mdx +23 -0
  609. package/docs/cli/status.mdx +18 -5
  610. package/docs/cli/stop.mdx +67 -8
  611. package/docs/cli/try.mdx +62 -0
  612. package/docs/cli/update.mdx +4 -3
  613. package/docs/cli/verify.mdx +17 -6
  614. package/docs/cli/version.mdx +5 -4
  615. package/docs/cli.mdx +111 -42
  616. package/docs/debugging.md +3 -3
  617. package/docs/deploy-checks.md +1 -1
  618. package/docs/desktop.mdx +9 -3
  619. package/docs/enterprise.md +11 -10
  620. package/docs/environment.mdx +7 -8
  621. package/docs/faq.mdx +3 -3
  622. package/docs/first-drive.md +5 -4
  623. package/docs/flows.md +35 -27
  624. package/docs/for-agents.md +4 -5
  625. package/docs/frameworks.mdx +32 -21
  626. package/docs/getting-started.md +65 -61
  627. package/docs/human-control.md +16 -16
  628. package/docs/index.mdx +15 -42
  629. package/docs/install-agentic.mdx +22 -37
  630. package/docs/install-manual.mdx +23 -13
  631. package/docs/instrumentation.mdx +5 -3
  632. package/docs/integration-patterns.md +7 -7
  633. package/docs/license-activation.mdx +1 -1
  634. package/docs/multi-agent-testing.md +24 -6
  635. package/docs/packages/babel-plugin.mdx +4 -2
  636. package/docs/packages/browser.mdx +16 -10
  637. package/docs/packages/core.mdx +12 -5
  638. package/docs/packages/electron.mdx +3 -2
  639. package/docs/packages/engine.mdx +1 -1
  640. package/docs/packages/eslint-plugin.mdx +18 -12
  641. package/docs/packages/next.mdx +8 -7
  642. package/docs/packages/open-verification.mdx +1 -1
  643. package/docs/packages/server.mdx +5 -5
  644. package/docs/packages/tauri.mdx +9 -9
  645. package/docs/packages/test.mdx +4 -10
  646. package/docs/packages/vite-plugin.mdx +32 -4
  647. package/docs/packages.mdx +11 -15
  648. package/docs/platform-integration.md +6 -5
  649. package/docs/predicates.mdx +40 -24
  650. package/docs/quickstart.mdx +69 -30
  651. package/docs/required-checks.md +8 -7
  652. package/docs/reticle-manual.md +15 -5
  653. package/docs/skill-file.mdx +17 -79
  654. package/docs/skill-setup.md +9 -9
  655. package/docs/skill.md +200 -0
  656. package/docs/system-map.md +7 -7
  657. package/docs/telemetry.md +23 -25
  658. package/docs/testing.md +4 -4
  659. package/docs/token-efficiency.md +12 -12
  660. package/docs/tools/act-and-wait.mdx +9 -2
  661. package/docs/tools/act-sequence.mdx +6 -7
  662. package/docs/tools/act.mdx +2 -2
  663. package/docs/tools/assert.mdx +18 -17
  664. package/docs/tools/console.mdx +9 -9
  665. package/docs/tools/inspect.mdx +16 -7
  666. package/docs/tools/look.mdx +24 -0
  667. package/docs/tools/navigate.mdx +5 -3
  668. package/docs/tools/network.mdx +2 -2
  669. package/docs/tools/observe.mdx +6 -6
  670. package/docs/tools/overview.mdx +34 -33
  671. package/docs/tools/query.mdx +5 -5
  672. package/docs/tools/session-and-feedback.mdx +22 -13
  673. package/docs/tools/sessions.mdx +8 -8
  674. package/docs/tools/snapshot.mdx +6 -5
  675. package/docs/tools/state.mdx +9 -9
  676. package/docs/tools/tools-and-run.mdx +26 -24
  677. package/docs/tools/verify.mdx +28 -0
  678. package/docs/tools/wait-for.mdx +8 -4
  679. package/docs/troubleshooting.mdx +21 -6
  680. package/docs/usage.md +55 -46
  681. package/docs/use-cases.mdx +3 -3
  682. package/docs/vs-chrome-devtools-mcp.mdx +9 -6
  683. package/docs/vs-playwright-mcp.mdx +3 -1
  684. package/docs/what-is-recorded.md +17 -5
  685. package/docs/what-is-reticle.mdx +5 -3
  686. package/docs/why-reticle.mdx +1 -1
  687. package/package.json +9 -12
  688. package/dist/command/cli/demo/demo-page.d.ts +0 -78
  689. package/dist/command/cli/demo/demo-page.js +0 -241
  690. package/dist/command/cli/demo/demo-run.d.ts +0 -38
  691. package/dist/command/cli/demo/demo-run.js +0 -138
  692. package/dist/features/harness/driver.d.ts +0 -50
  693. package/dist/features/harness/driver.js +0 -236
  694. package/dist/features/harness/jev-driver.d.ts +0 -188
  695. package/dist/features/harness/jev-driver.js +0 -678
  696. package/dist/features/harness/openai-driver.d.ts +0 -58
  697. package/dist/features/harness/openai-driver.js +0 -206
  698. package/dist/judgement/hunt/hunt-report.d.ts +0 -49
  699. package/dist/judgement/hunt/hunt-report.js +0 -84
  700. package/dist/language/flows/buddy-status.d.ts +0 -25
  701. package/dist/language/flows/buddy-status.js +0 -32
  702. package/dist/language/flows/change/watch-batcher.d.ts +0 -18
  703. package/dist/language/flows/change/watch-batcher.js +0 -19
  704. package/dist/memory/cloud/harness-offer.d.ts +0 -44
  705. package/dist/memory/cloud/harness-offer.js +0 -145
  706. package/dist/memory/project/dir/fill-value-store.d.ts +0 -32
  707. package/dist/memory/project/dir/fill-value-store.js +0 -88
  708. package/dist/surface/tools/feature-capture.d.ts +0 -151
  709. package/dist/surface/tools/feature-capture.js +0 -235
  710. package/dist/surface/tools/tool-hit-rate.d.ts +0 -87
  711. package/dist/surface/tools/tool-hit-rate.js +0 -90
  712. package/dist/telemetry/harness-drive.d.ts +0 -4
  713. package/dist/telemetry/harness-drive.js +0 -35
  714. package/dist/telemetry/identify.d.ts +0 -22
  715. package/dist/telemetry/identify.js +0 -73
  716. package/docs/cli/capsules.mdx +0 -70
  717. package/docs/cli/hunt.mdx +0 -73
  718. package/docs/cli/identify.mdx +0 -76
  719. package/docs/cli/kill.mdx +0 -91
  720. package/docs/cli/watch.mdx +0 -62
  721. package/docs/local-registry.md +0 -143
@@ -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
@@ -106,7 +112,8 @@ export class OwnedDevServer {
106
112
  catch {
107
113
  /* not written yet */
108
114
  }
109
- return Date.now() - lastOutputAt;
115
+ // Filesystem timestamps can include a fractional millisecond beyond Date.now()'s integer.
116
+ return Math.max(0, Date.now() - lastOutputAt);
110
117
  }
111
118
  /** Ports anything in this server's process tree is listening on. */
112
119
  listeningPorts() {
@@ -168,8 +175,21 @@ export class OwnedDevServer {
168
175
  this.child = undefined;
169
176
  }
170
177
  }
171
- function run(file, args) {
172
- 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 '';
173
193
  return r.stdout ?? '';
174
194
  }
175
195
  /**
@@ -182,13 +202,22 @@ function run(file, args) {
182
202
  * `init` then waits out the full quiet window and reports "the dev server stopped producing output
183
203
  * without ever serving a page" about a Vite server that was serving perfectly the whole time.
184
204
  *
185
- * The fallback prints the same two-integers-per-line shape, so `parseWmicProcesses` reads either
186
- * without knowing which produced it. Tried in this order because `wmic` is an order of magnitude
187
- * 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.
188
213
  */
189
- 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() }';
190
219
  function windowsProcessPairs() {
191
- const fromWmic = parseWmicProcesses(run('wmic', ['process', 'get', 'ParentProcessId,ProcessId']));
220
+ const fromWmic = parseWmicProcesses(run('wmic', ['process', 'get', 'CreationDate,ParentProcessId,ProcessId']));
192
221
  if (0 < fromWmic.length)
193
222
  return fromWmic;
194
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
+ }
@@ -34,7 +34,8 @@ export function remainingSteps(p) {
34
34
  '`reticle_*` tools, ending in `reticle_act_and_wait` or `reticle_assert` — those two are ' +
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
- 'with no model in the loop; that route needs ANTHROPIC_API_KEY.');
37
+ 'with no model in the loop; that route runs on the Reticle platform and needs a linked ' +
38
+ 'project (`reticle connect`); a new account gets 10 free credits to try it.');
38
39
  }
39
40
  // Whether anything is actually outstanding, read BEFORE the docs pointer is added -- that line is
40
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[];
@@ -55,6 +68,11 @@ export interface DaemonReason {
55
68
  export interface OwnedBrowser {
56
69
  readonly sessionId: string;
57
70
  readonly release: () => Promise<void>;
71
+ /**
72
+ * The page never dialled in, so the lease injected Reticle's own reader. That session proves the
73
+ * reader, not this install, and must never end onboarding as "connected".
74
+ */
75
+ readonly zeroInstall?: boolean;
58
76
  }
59
77
  export interface SetupEffects {
60
78
  /** Start the dev server. Resolves once started; the caller owns stopping it. */
@@ -120,6 +138,13 @@ export interface SetupInput {
120
138
  /** This project's id, so a live tab of it can be told from another app's on the same url. */
121
139
  readonly projectId?: string | undefined;
122
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;
123
148
  /** The app is already served here, so nothing is started. */
124
149
  readonly suppliedUrl?: string | undefined;
125
150
  /**
@@ -2,18 +2,14 @@
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
14
10
  * and a real browser to find out what happens when neither works.
15
11
  */
16
- import { judgeWait, portBusyMessage, QUIET_MEANS_HUNG_MS, urlToWatch, WaitVerdict, } from './bringup/dev-server-wait.js';
12
+ import { judgeWait, devServerDiedMessage, portBusyMessage, QUIET_MEANS_HUNG_MS, urlToWatch, WaitVerdict, } from './bringup/dev-server-wait.js';
17
13
  import { connectProgressLine, waitProgressLine } from './terminal/wait-progress.js';
18
14
  /**
19
15
  * Windows gets longer to say something before silence counts as a wedge.
@@ -47,6 +43,21 @@ const NO_BROWSER_GRACE_MS = 3_000;
47
43
  * as opened, and init then waited out its whole connect budget over a correct install.
48
44
  */
49
45
  const SYSTEM_BROWSER_GRACE_MS = 15_000;
46
+ /**
47
+ * Said before Reticle starts its own static server for a plain page, while it can still be acted
48
+ * on: the page may already be served by something with an API behind it, and only the person
49
+ * running init knows that (#1426).
50
+ */
51
+ export const STATIC_PAGE_URL_HINT = 'This page has no dev server of its own, so Reticle is starting a static one. ' +
52
+ 'If the page is already served (python -m http.server, php -S, a Node server with an API), ' +
53
+ 're-run with `reticle init --url <app>` to attach to that server instead.';
54
+ /** Whose server the success line names, so a session on Reticle's own is never mistaken for the app. */
55
+ export const ServerStartedBy = {
56
+ CALLER: 'you passed its url',
57
+ ALREADY_RUNNING: 'it was already running',
58
+ RETICLE_STATIC: 'Reticle started this static server',
59
+ SETUP: 'setup started the dev server',
60
+ };
50
61
  export const SetupPhase = {
51
62
  DEV_SERVER: 'dev-server',
52
63
  CONNECT: 'connect',
@@ -129,12 +140,14 @@ export async function runSetupPhases(input, fx) {
129
140
  note(
130
141
  // "stop here rather than invent one" is the SKILL.md rule, and the words are the contract —
131
142
  // inventing a dev command is how a setup script runs the wrong thing and reports success.
132
- 'No dev command: the project names no dev, start or serve script, and there is no --url. ' +
143
+ 'No dev command: the project names no dev, start or serve script, and no app url was given (`reticle init --url <app>`). ' +
133
144
  'Stopping here rather than invent one — start the app yourself and pass --url to say ' +
134
145
  'where it is serving, or add a dev/start/serve script to package.json and re-run.');
135
146
  return stop(input, SetupPhase.DEV_SERVER, {}, notes);
136
147
  }
137
148
  else {
149
+ if (true === input.devCommandIsStaticPage)
150
+ note(STATIC_PAGE_URL_HINT);
138
151
  await fx.startDevServer(input.devCommand, input.appDir);
139
152
  const startedAt = fx.now();
140
153
  // This loop used to poll in complete silence. Reported as thirty minutes of nothing ending in a
@@ -177,18 +190,20 @@ export async function runSetupPhases(input, fx) {
177
190
  break;
178
191
  }
179
192
  if (WaitVerdict.DEAD === verdict) {
180
- note(portBusyMessage(fx.devServerOutput()) ??
181
- 'The dev server exited without serving anything.');
193
+ note(portBusyMessage(fx.devServerOutput()) ?? devServerDiedMessage(fx.devServerOutput()));
182
194
  return stop(input, SetupPhase.DEV_SERVER, {}, notes);
183
195
  }
184
196
  if (WaitVerdict.HUNG === verdict) {
185
197
  // Says BOTH were checked. A server that prints nothing but IS listening is the CRA case and
186
198
  // must not be failed, so a reader has to be able to tell "we looked at the log" from "we
187
199
  // looked at the log AND the ports".
188
- note((input.startupBudgetMs !== undefined && fx.now() - startedAt >= input.startupBudgetMs
189
- ? `The dev server did not become ready within ${String(input.startupBudgetMs)}ms. `
190
- : undefined === watching
191
- ? 'The dev server neither printed a URL nor bound a port, so setup has nothing to open. '
200
+ const within = input.startupBudgetMs !== undefined && fx.now() - startedAt >= input.startupBudgetMs
201
+ ? ` within ${String(input.startupBudgetMs)}ms`
202
+ : undefined;
203
+ note((undefined === watching
204
+ ? `The dev server neither printed a URL nor bound a port${within ?? ''}, so setup has nothing to open. `
205
+ : undefined !== within
206
+ ? `The dev server did not become ready${within}. `
192
207
  : `The dev server stopped making progress before ${watching} became ready. `) +
193
208
  'Check its log, increase --timeout for a slow build, or pass --url with the address it serves.');
194
209
  return stop(input, SetupPhase.DEV_SERVER, {}, notes);
@@ -232,6 +247,23 @@ export async function runSetupPhases(input, fx) {
232
247
  // dialled the bridge" over a correct install. With a lease to fall back on it is entered too, and
233
248
  // only the system browser is skipped.
234
249
  const canLease = undefined !== fx.openLease;
250
+ const injected = new Set();
251
+ /**
252
+ * The lease to keep, or undefined. A lease whose page only connected through Reticle's injected
253
+ * reader is handed straight back and its session excluded: it would otherwise be picked below and
254
+ * report a plain server with no SDK as an instrumented app.
255
+ */
256
+ const keepLease = async (owned) => {
257
+ if ('failed' in owned) {
258
+ note(`Could not open ${url} in a Reticle-owned browser either: ${owned.failed}`);
259
+ return undefined;
260
+ }
261
+ if (true !== owned.zeroInstall)
262
+ return owned;
263
+ injected.add(owned.sessionId);
264
+ await releaseLease(owned);
265
+ return undefined;
266
+ };
235
267
  if (null === alreadyConnected && policy.openBrowser && (input.openBrowser || canLease)) {
236
268
  // SERVED is the precondition, not SDK_PRESENT: a url that answers nothing is the only state
237
269
  // where a window is certainly useless. Whether the SDK is in the served HTML is a DIFFERENT
@@ -260,14 +292,9 @@ export async function runSetupPhases(input, fx) {
260
292
  const launcherFailed = input.openBrowser ? await fx.openBrowser(url) : undefined;
261
293
  openedBrowser = input.openBrowser;
262
294
  if (undefined !== fx.openLease && (!input.openBrowser || undefined !== launcherFailed)) {
263
- const owned = await fx.openLease(url);
264
- if ('failed' in owned) {
265
- note(`Could not open ${url} in a Reticle-owned browser either: ${owned.failed}`);
266
- }
267
- else {
268
- lease = owned;
295
+ lease = await keepLease(await fx.openLease(url));
296
+ if (undefined !== lease)
269
297
  openedBrowser = true;
270
- }
271
298
  }
272
299
  }
273
300
  }
@@ -288,7 +315,8 @@ export async function runSetupPhases(input, fx) {
288
315
  while (null === session) {
289
316
  // On a desktop app, only the desktop window counts. AppShape and the runtime a page reports use
290
317
  // the same three names, so the shape IS the requirement — see session-pick.
291
- session = pickSession(await fx.listSessions(), url, before, requiredRuntime);
318
+ const listedNow = (await fx.listSessions()).filter((s) => !injected.has(s.sessionId));
319
+ session = pickSession(listedNow, url, before, requiredRuntime);
292
320
  if (null !== session)
293
321
  break;
294
322
  if (deadline <= fx.now())
@@ -301,13 +329,7 @@ export async function runSetupPhases(input, fx) {
301
329
  !isDesktop(input.shape) &&
302
330
  fx.now() - waitStartedAt >= SYSTEM_BROWSER_GRACE_MS) {
303
331
  leaseFallbackTried = true;
304
- const owned = await fx.openLease(url);
305
- if ('failed' in owned) {
306
- note(`Could not open ${url} in a Reticle-owned browser either: ${owned.failed}`);
307
- }
308
- else {
309
- lease = owned;
310
- }
332
+ lease = await keepLease(await fx.openLease(url));
311
333
  continue;
312
334
  }
313
335
  // Not in silence: a desktop run used to print one line and then nothing for ten minutes.
@@ -363,41 +385,33 @@ export async function runSetupPhases(input, fx) {
363
385
  // Getting started is three stages — installation puts the CLI on the machine, onboarding wires
364
386
  // the project, the first run proves a flow — and this command owns the middle one. A connected
365
387
  // session is the whole proof that onboarding worked: the SDK is in the page, the bridge paired,
366
- // and the tools now have something to talk to.
367
- //
368
- // `<url>` stays a placeholder in this string on purpose: `guidance-commands-run` feeds every
369
- // command we print to the real parser, and an interpolated value reads there as a missing operand.
370
- // The live url is named in the sentence instead, where a reader needs it anyway.
371
- // Both routes, because `explore` needs a model: without ANTHROPIC_API_KEY it answers "No model
372
- // configured to drive the app". Naming only that one hands the reader a dead end on any machine
373
- // without a key, which is the same defect this release spent its time removing everywhere else.
374
- // A heading and a numbered list rather than one paragraph: a reader scans for what to do next.
388
+ // and the tools now have something to talk to. What to do next is the first flow's to say.
375
389
  //
376
- // This was a single 524-character note, measured on a real first run: eighty-three words, no
377
- // break, naming `reticle_*` tools at a reader who had just typed `reticle init` in a terminal and
378
- // has no such tools to call. The facts were right and the shape made them unreadable, which on
379
- // the last line of onboarding is the same as not saying them.
380
- note(`✓ Connected. ${url} is instrumented. Onboarding is done; nothing is verified yet.`);
390
+ // It names whose server that is, because a session on Reticle's static server is not the app a
391
+ // real server was serving, and "connected" alone let an agent verify the wrong one (#1426).
392
+ const startedBy = undefined !== input.suppliedUrl
393
+ ? ServerStartedBy.CALLER
394
+ : attachedToExisting
395
+ ? ServerStartedBy.ALREADY_RUNNING
396
+ : true === input.devCommandIsStaticPage
397
+ ? ServerStartedBy.RETICLE_STATIC
398
+ : ServerStartedBy.SETUP;
399
+ note(`✓ Connected to ${new URL(url).origin} (${startedBy}). Onboarding is done; nothing is verified yet.`);
381
400
  // Said, because "connected" otherwise reads as "your browser connected": the page that dialled
382
401
  // was a headless one Reticle launched and has now closed, and nothing is open on this screen.
383
- if (undefined !== lease && session.sessionId === lease.sessionId) {
402
+ const leased = undefined !== lease && session.sessionId === lease.sessionId;
403
+ if (leased) {
384
404
  note('The proof came from a Reticle-owned headless browser (now closed), not a window of yours — ' +
385
405
  `open ${url} in your own browser to use the app.`);
386
406
  }
387
407
  await releaseLease(lease);
388
- note('');
389
- note('Next, prove one flow. Your agent does this:');
390
- note(' 1. Drive one flow and end it with `reticle_act_and_wait` or `reticle_assert`. Those two ' +
391
- 'produce a verdict; nothing else does.');
392
- note(' 2. Or hand over the whole drive: `reticle_verify { action: "explore", persona: "<who does ' +
393
- 'what>" }` records what it drove, so later runs replay with no model in the loop. Needs ' +
394
- 'ANTHROPIC_API_KEY.');
395
408
  return {
396
409
  ok: true,
397
410
  reachedPhase: SetupPhase.CONNECT,
398
411
  url,
399
412
  sessionId: session.sessionId,
400
413
  flowSaved: false,
414
+ leased,
401
415
  notes,
402
416
  fallback: [],
403
417
  };
@@ -29,8 +29,32 @@ interface SetupCommandInput extends Omit<SetupInput, 'shape'> {
29
29
  readonly registerAgents: boolean;
30
30
  /** The bridge's pairing token, for the MCP transport a connect-proof lease is opened over. */
31
31
  readonly pairingToken?: string | undefined;
32
+ /** False for `--no-first-run`: connect, and say nothing more. */
33
+ readonly firstRun: boolean;
34
+ /** `--json`: an agent is reading, so nothing is driven on its behalf. */
35
+ readonly json: boolean;
36
+ /**
37
+ * What happens once the connection is proved: the coverage summary and the agent prompt. A port,
38
+ * because it reads the daemon's status and the link, which this directory does not reach for.
39
+ */
40
+ readonly firstFlow?: FirstFlowPort | undefined;
32
41
  }
33
- export declare function registerOtherAgents(print: (line: string) => void): void;
42
+ /** init's ending, as `command/cli/try-command.ts` says it. Structural, so setup imports nothing. */
43
+ export type FirstFlowPort = (ctx: {
44
+ appDir: string;
45
+ bridgePort: number;
46
+ pairingToken?: string | undefined;
47
+ url: string;
48
+ sessionId: string;
49
+ leased: boolean;
50
+ openBrowser: boolean;
51
+ firstRun: boolean;
52
+ json: boolean;
53
+ }, say: (line: string) => void) => Promise<{
54
+ flowSaved: boolean;
55
+ }>;
56
+ /** Returns how many agents it wrote a config for, so a caller does not then say "none found". */
57
+ export declare function registerOtherAgents(print: (line: string) => void): number;
34
58
  type SetupCommandResult = SetupOutcome;
35
59
  export declare function runSetupCommand(input: SetupCommandInput, print: (line: string) => void): Promise<SetupCommandResult>;
36
60
  export {};
@@ -5,11 +5,12 @@
5
5
  * three lines it was. The only decision here is which effects to hand over; the sequencing lives in
6
6
  * run-setup.ts and the pieces it calls.
7
7
  */
8
- import { existsSync, readFileSync, writeFileSync } from 'node:fs';
8
+ import { chmodSync, existsSync, readFileSync, writeFileSync } from 'node:fs';
9
9
  import { homedir } from 'node:os';
10
10
  import { join } from 'node:path';
11
11
  import { planAgentConfigs } from './agent-configs.js';
12
12
  import { AppShape, describeShape, readShape } from './desktop-shape.js';
13
+ import { SigningEnv, tauriSigningEnv } from './tauri-signing.js';
13
14
  import { stopOnInterrupt } from './terminal/interrupt.js';
14
15
  import { stopOnCrash, crashSentence } from './terminal/crash.js';
15
16
  import { applyAgentPlan, applyAgentSkills } from './agent-writer.js';
@@ -22,7 +23,7 @@ import { readProjectId } from '../cli/ports/resolve/cli-port.js';
22
23
  import { spawnSync } from 'node:child_process';
23
24
  import { isAlive, reticleStateHome } from '../daemon/daemon.js';
24
25
  import { readDevServers } from '../daemon/dev-servers.js';
25
- import { urlOfExistingApp } from './probe/existing-app.js';
26
+ import { connectedAppUrl, urlOfExistingApp } from './probe/existing-app.js';
26
27
  import { handedOverUrl, stopHandedOver } from './bringup/dev-server-files.js';
27
28
  import { listSessions, OwnedDevServer, probePage } from './node-effects.js';
28
29
  import { fetchStatus } from '../daemon/binding/daemon-status-probe.js';
@@ -89,6 +90,7 @@ function hasElectronDependency(dir) {
89
90
  */
90
91
  /** `agent`, `agents`. */
91
92
  const agentWord = (n) => (1 === n ? 'agent' : 'agents');
93
+ /** Returns how many agents it wrote a config for, so a caller does not then say "none found". */
92
94
  export function registerOtherAgents(print) {
93
95
  const platform = process.platform;
94
96
  const home = homedir();
@@ -124,6 +126,7 @@ export function registerOtherAgents(print) {
124
126
  for (const noted of approvals.filter((a) => undefined !== a.warn)) {
125
127
  print(` ⚠ ${noted.name}: ${String(noted.warn)}`);
126
128
  }
129
+ return wrote.length;
127
130
  }
128
131
  /**
129
132
  * Run the phases against the real world.
@@ -162,6 +165,31 @@ async function restartHandedOverServer(appDir) {
162
165
  }
163
166
  return stopped;
164
167
  }
168
+ /**
169
+ * init's ending, inside the dev server's lifetime: coverage is read off the open tab, and the `finally`
170
+ * in `runSetupCommand` only stops a server that was not handed over. Its lines join the notes, so
171
+ * `--json` carries the next step too.
172
+ */
173
+ async function afterConnect(input, url, sessionId, outcome, print) {
174
+ const notes = [...outcome.notes];
175
+ if (input.firstFlow === undefined)
176
+ return { flowSaved: false, notes };
177
+ const { flowSaved } = await input.firstFlow({
178
+ appDir: input.appDir,
179
+ bridgePort: input.bridgePort,
180
+ pairingToken: input.pairingToken,
181
+ url,
182
+ sessionId,
183
+ leased: true === outcome.leased,
184
+ openBrowser: input.openBrowser,
185
+ firstRun: input.firstRun,
186
+ json: input.json,
187
+ }, (line) => {
188
+ notes.push(line);
189
+ print(line);
190
+ });
191
+ return { flowSaved, notes };
192
+ }
165
193
  export async function runSetupCommand(input, print) {
166
194
  if (input.registerAgents)
167
195
  registerOtherAgents(print);
@@ -212,7 +240,29 @@ export async function runSetupCommand(input, print) {
212
240
  const effects = {
213
241
  startDevServer: (command, cwd) => {
214
242
  print(`starting: ${command}`);
215
- server.start(command, cwd, input.env);
243
+ const signing = AppShape.TAURI === shape
244
+ ? tauriSigningEnv({
245
+ platform: process.platform,
246
+ env: { ...process.env, ...input.env },
247
+ read: (path) => {
248
+ try {
249
+ return readFileSync(join(cwd, path), 'utf8');
250
+ }
251
+ catch {
252
+ return undefined;
253
+ }
254
+ },
255
+ writeRunner: (name, script) => {
256
+ const path = join(reticleStateHome(), name);
257
+ writeFileSync(path, script);
258
+ chmodSync(path, 0o755);
259
+ return path;
260
+ },
261
+ })
262
+ : {};
263
+ if (SigningEnv.IDENTITY in signing)
264
+ print(`signing the dev build as ${String(signing[SigningEnv.IDENTITY])}, so macOS does not ask for the keychain password`);
265
+ server.start(command, cwd, { ...input.env, ...signing });
216
266
  return Promise.resolve();
217
267
  },
218
268
  // The server the plugin announced (Vite), or failing that the one a previous init handed over
@@ -224,7 +274,9 @@ export async function runSetupCommand(input, print) {
224
274
  (await handedOverUrl(reticleStateHome(), input.appDir, {
225
275
  alive: isAlive,
226
276
  answers: async (url) => (await probePage(url)).served,
227
- })),
277
+ })) ??
278
+ // A desktop window of this project already connected: its renderer announces no server.
279
+ connectedAppUrl(await listSessions(input.bridgePort), readProjectId(input.appDir)),
228
280
  devServerOutput: () => server.output(),
229
281
  devServerExited: () => server.exited(),
230
282
  devServerQuietForMs: () => server.quietForMs(),
@@ -285,8 +337,11 @@ export async function runSetupCommand(input, print) {
285
337
  if (undefined !== log)
286
338
  print(`The dev server keeps running; its output goes to ${log}`);
287
339
  }
340
+ if (!outcome.ok || undefined === outcome.url || undefined === outcome.sessionId)
341
+ return outcome;
288
342
  return {
289
343
  ...outcome,
344
+ ...(await afterConnect(input, outcome.url, outcome.sessionId, outcome, print)),
290
345
  };
291
346
  }
292
347
  finally {
@@ -1,5 +1,22 @@
1
- import { McpClient, MCP_CLIENTS, claudeAddCommand, claudeAvailableProbe, claudeHasReticle, detectMcpClients, mergeClientConfig, clientSpec, ClientMergeStatus, } from '@reticlehq/init';
1
+ import { McpClient, MCP_CLIENTS, claudeAddCommand, claudeAvailableProbe, claudeHasReticle, codexAddCommand, codexAvailableProbe, codexNamesOurServer, detectMcpClients, mergeClientConfig, clientSpec, ClientMergeStatus, } from '@reticlehq/init';
2
2
  import { OnboardingPhase, OnboardingStepStatus, } from '@reticlehq/core/telemetry';
3
+ /**
4
+ * Codex registers through `codex mcp add`, which does the TOML editing we refuse to do (#1238).
5
+ * `undefined` when that does not apply, and the caller reports a hand edit exactly as before: not
6
+ * Codex, the `codex` binary is not here, or the config already names a `reticle` server. That last
7
+ * one matters: `codex mcp add` REPLACES an entry of the same name and still exits 0, so an entry
8
+ * somebody wrote themselves, in any shape, must never reach it. Otherwise: did the command take.
9
+ */
10
+ function registerWithCodexCli(io, client, serversKey) {
11
+ if (McpClient.CODEX !== client.id || codexNamesOurServer(client.existing, serversKey)) {
12
+ return undefined;
13
+ }
14
+ const probe = codexAvailableProbe();
15
+ if (!io.runCli(probe.command, probe.args))
16
+ return undefined;
17
+ const cmd = codexAddCommand();
18
+ return io.runCli(cmd.command, cmd.args);
19
+ }
3
20
  export function setupMcp(io) {
4
21
  const detected = [];
5
22
  const registered = [];
@@ -47,7 +64,13 @@ export function setupMcp(io) {
47
64
  // on an existing file and would CREATE an empty one otherwise, and either way claiming success
48
65
  // sends somebody to an agent that has no Reticle tools in it.
49
66
  if (ClientMergeStatus.MANUAL === merged.status) {
50
- manual.push({ id: client.id, configPath: client.configPath, docs: spec.docs });
67
+ const viaCli = registerWithCodexCli(io, client, spec.serversKey);
68
+ if (true === viaCli)
69
+ registered.push(client.id);
70
+ else if (false === viaCli)
71
+ failed.push(client.id);
72
+ else
73
+ manual.push({ id: client.id, configPath: client.configPath, docs: spec.docs });
51
74
  continue;
52
75
  }
53
76
  try {
@@ -0,0 +1,19 @@
1
+ /** The env the runner reads its arguments from: the script stays a fixed file. */
2
+ export declare const SigningEnv: {
3
+ readonly IDENTITY: "RETICLE_SIGNING_IDENTITY";
4
+ readonly IDENTIFIER: "RETICLE_SIGNING_IDENTIFIER";
5
+ readonly APPLE: "APPLE_SIGNING_IDENTITY";
6
+ };
7
+ export declare const RUNNER_FILE = "tauri-sign-runner.sh";
8
+ /** The runner: sign the binary Cargo built, then run it exactly as Cargo would have. */
9
+ export declare const RUNNER_SCRIPT: string;
10
+ export interface SigningDeps {
11
+ readonly platform: string;
12
+ readonly env: Readonly<Record<string, string | undefined>>;
13
+ /** A file's text relative to the app directory, or undefined when it is absent. */
14
+ readonly read: (path: string) => string | undefined;
15
+ /** Writes the runner and makes it executable; returns its absolute path. */
16
+ readonly writeRunner: (name: string, script: string) => string;
17
+ }
18
+ /** The extra env for starting a Tauri dev build signed, or `{}` when there is nothing to sign with. */
19
+ export declare function tauriSigningEnv(deps: SigningDeps): Record<string, string>;