@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
@@ -0,0 +1,161 @@
1
+ /**
2
+ * Which project a shared-memory read is about, on the wire and in the response.
3
+ *
4
+ * `GET /v1/memory` used to be asked with the API key and `?subject`, and nothing else. The key covers
5
+ * a whole workspace, and a workspace can hold more than one repo: a `cloud.json` naming project B was
6
+ * read with a key that also reaches project A, so B's agent could be handed A's "established
7
+ * knowledge" and never know it. Two repos, one key, and the wrong one's facts arrive looking exactly
8
+ * like the right one's.
9
+ *
10
+ * The link file has always known the answer — `resolveProjectCloud` returns it as `projectId`, and
11
+ * every reader simply did not pass it on.
12
+ *
13
+ * ## Why the envelope, and not the entries
14
+ *
15
+ * Sending `projectId` is the fix, and it only works once the platform filters on it. Against a server
16
+ * that does not know the parameter yet, the client would go on being handed the whole workspace and
17
+ * would report it as this project's knowledge — the same lie, now with a parameter in the URL that
18
+ * makes it look handled. So the response is checked here too, and WHERE it is checked is the lesson:
19
+ * the platform puts the project id on the response ENVELOPE — `{ projectId, entries }` — and not on
20
+ * each entry. An entry-level filter therefore matched nothing, kept everything, and read as a fix
21
+ * while being none. `scopeOfMemoryResponse` reads the envelope and refuses the whole response when
22
+ * it names another project, or names none.
23
+ *
24
+ * The entry-level filter stays as a second pass. It is redundant against the platform's real shape,
25
+ * and it is the right answer against a server that labels entries instead — cheap to keep, and
26
+ * nothing here rests on it.
27
+ *
28
+ * ## Every reader, and that word is load-bearing
29
+ *
30
+ * Three callers read this endpoint: the `reticle_memory` tool, flow replay's automatic consultation,
31
+ * and `reticle memory` at a terminal. The first cut gave the first two an entry-level filter and the
32
+ * third the parameter alone, while a comment claimed all three were covered — and none of the three
33
+ * was, because the project id arrives on the envelope. They now share `scopedMemoryEntries`, so a
34
+ * fourth reader cannot get a different answer than the other three.
35
+ *
36
+ * Lives beside `cloud-sync.ts` rather than in `recall/` because that is where the other platform path
37
+ * constants live, and because both readers already reach this directory: a home under `recall/` would
38
+ * make `flows` reach a directory it never needed.
39
+ */
40
+ /**
41
+ * The wire names, spelled once.
42
+ *
43
+ * `PROJECT_ID` is a request parameter AND a response field. They are the same word on purpose — the
44
+ * server echoes back what it was asked about — and one constant keeps a rename from moving only one
45
+ * of the two, which would silently restore the unfiltered read. `SUBJECT` is a request parameter only
46
+ * and is named for the same reason: it is a spelling the platform owns, not ours.
47
+ */
48
+ export declare const MemoryScopeField: {
49
+ readonly PROJECT_ID: "projectId";
50
+ readonly SUBJECT: "subject";
51
+ };
52
+ /**
53
+ * What a read is asked about: the linked project, and optionally one subject within it.
54
+ *
55
+ * `projectId` takes `null` as well as `undefined`, because that is the shape `resolveProjectCloud`
56
+ * already answers with — "the link declared none" is one fact, and making every caller spell the
57
+ * conversion is how a reader starts wondering whether the two spellings mean different things.
58
+ */
59
+ export interface MemoryReadScope {
60
+ /** The cloud project the link file names. Absent, `null` and empty all mean "no project to name". */
61
+ projectId: string | null | undefined;
62
+ subject?: string | undefined;
63
+ }
64
+ /**
65
+ * Who a memory read is for. An agent's read names the agent and the platform counts it as a
66
+ * consultation; the daemon's sync names its purpose and is never counted as one.
67
+ */
68
+ export declare const MemoryReadHeader: {
69
+ readonly AGENT: "x-reticle-agent";
70
+ readonly PURPOSE: "x-reticle-read-purpose";
71
+ };
72
+ export declare const MemoryReadPurpose: {
73
+ readonly SYNC: "sync";
74
+ };
75
+ /**
76
+ * The headers of an agent's memory read: the key, and the agent whose call made the read. A replay's
77
+ * read went without the agent, and the platform credited it to "an agent that did not name itself".
78
+ * No agent is named when no single agent made the call: a guess would credit the wrong one.
79
+ */
80
+ export declare function memoryReadHeaders(apiKey: string): Record<string, string>;
81
+ /**
82
+ * The URL for one memory read.
83
+ *
84
+ * Encoded with `encodeURIComponent` rather than `URLSearchParams`, which spells a space `+`. Both are
85
+ * valid in a query string and the server may accept either — but this is a URL a test asserts against
86
+ * and a person reads in a log, and one spelling is easier to reason about than two.
87
+ */
88
+ export declare function memoryReadUrl(baseUrl: string, scope: MemoryReadScope): string;
89
+ /**
90
+ * Drop the entries that state they belong to another project.
91
+ *
92
+ * The field is read defensively because the wire is somebody else's server: a number, an object or an
93
+ * absent key all mean "this entry does not say", and only a non-empty string that disagrees is enough
94
+ * to refuse one. See the note above for why silence is kept rather than dropped.
95
+ */
96
+ export declare function keepOwnProject(entries: readonly unknown[], projectId: string | null | undefined): unknown[];
97
+ /**
98
+ * Whether a memory response can be read as THIS project's knowledge.
99
+ *
100
+ * The platform puts the project id on the response ENVELOPE, not on each entry (see the module note).
101
+ * Reading it there is the only check that works against the real shape: an entry-level filter sees no
102
+ * project field at all and keeps everything, so a server that ignores the request parameter — or
103
+ * resolves the key to a different project — hands back a whole workspace under this project's
104
+ * heading with nothing to distinguish it.
105
+ */
106
+ export declare const MemoryResponseScope: {
107
+ /** The envelope names the project this read asked about. Its entries may be read. */
108
+ readonly OWN: "own";
109
+ /** The envelope names a DIFFERENT project. Nothing in it belongs to this one. */
110
+ readonly OTHER: "other";
111
+ /**
112
+ * The envelope does not say which project it is about — an older server, or a shape we do not
113
+ * know. Unverifiable, which is NOT the same as empty and must not be shown as though it were.
114
+ */
115
+ readonly UNSCOPED: "unscoped";
116
+ /**
117
+ * This read named no project to begin with, so there is nothing for the envelope to contradict.
118
+ * The env-credential path with no `cloud.json`: CI, and a single-project setup that never linked.
119
+ */
120
+ readonly NOT_ASKED: "not-asked";
121
+ };
122
+ export type MemoryResponseScope = (typeof MemoryResponseScope)[keyof typeof MemoryResponseScope];
123
+ /** The two verdicts that permit reading the entries. Named so no caller re-derives the pair. */
124
+ export declare const isReadableMemoryScope: (scope: MemoryResponseScope) => boolean;
125
+ /**
126
+ * What the envelope says about which project this response is about.
127
+ *
128
+ * A missing or non-string field is `UNSCOPED` rather than a mismatch: the wire is somebody else's
129
+ * server, and "this response never said" is a different fact from "this response named a rival".
130
+ * Both refuse; only the message a reader shows differs.
131
+ */
132
+ export declare function scopeOfMemoryResponse(body: unknown, projectId: string | null | undefined): MemoryResponseScope;
133
+ /**
134
+ * The entries a reader may treat as this project's, or `undefined` when the response cannot be read
135
+ * that way at all.
136
+ *
137
+ * `undefined` is the point of the return type. Three callers need three different sentences and none
138
+ * of them is a list: the tool reports `UNVERIFIED`, the CLI refuses out loud, and replay attaches
139
+ * nothing. "This project knows nothing" and "the server answered about something else" are different
140
+ * facts, and only the first is safe to act on.
141
+ */
142
+ export declare function scopedMemoryEntries(body: unknown, projectId: string | null | undefined): unknown[] | undefined;
143
+ /**
144
+ * The same filter, for a caller that prints the server's envelope rather than reading a list.
145
+ *
146
+ * `reticle memory` writes the response to stdout as JSON, so filtering has to preserve every other
147
+ * field the server sent and replace only `entries`. A body whose `entries` is not an array is handed
148
+ * back as it arrived: at that point the envelope has already been accepted, and guessing further is
149
+ * how a diagnostic command starts dropping the thing it was asked to print.
150
+ *
151
+ * It REFUSES on its own, answering `undefined` for a body it cannot show to be this project's. It
152
+ * used to hand the body back and leave the check to a JSDoc line telling callers to run
153
+ * `scopeOfMemoryResponse` first — which is the exact failure this module documents, written one
154
+ * function below the lesson. A reader that hands a body back cannot refuse it: the day somebody
155
+ * calls this first, a sibling project's knowledge goes to stdout with nothing to stop it. The
156
+ * `undefined` is what makes the unsafe call unexpressible rather than merely discouraged — a caller
157
+ * cannot print what it was not handed.
158
+ *
159
+ * The caller therefore checks for `undefined` and refuses out loud, instead of asking twice.
160
+ */
161
+ export declare function scopeMemoryResponse(body: unknown, projectId: string | null | undefined): unknown;
@@ -0,0 +1,227 @@
1
+ /**
2
+ * Which project a shared-memory read is about, on the wire and in the response.
3
+ *
4
+ * `GET /v1/memory` used to be asked with the API key and `?subject`, and nothing else. The key covers
5
+ * a whole workspace, and a workspace can hold more than one repo: a `cloud.json` naming project B was
6
+ * read with a key that also reaches project A, so B's agent could be handed A's "established
7
+ * knowledge" and never know it. Two repos, one key, and the wrong one's facts arrive looking exactly
8
+ * like the right one's.
9
+ *
10
+ * The link file has always known the answer — `resolveProjectCloud` returns it as `projectId`, and
11
+ * every reader simply did not pass it on.
12
+ *
13
+ * ## Why the envelope, and not the entries
14
+ *
15
+ * Sending `projectId` is the fix, and it only works once the platform filters on it. Against a server
16
+ * that does not know the parameter yet, the client would go on being handed the whole workspace and
17
+ * would report it as this project's knowledge — the same lie, now with a parameter in the URL that
18
+ * makes it look handled. So the response is checked here too, and WHERE it is checked is the lesson:
19
+ * the platform puts the project id on the response ENVELOPE — `{ projectId, entries }` — and not on
20
+ * each entry. An entry-level filter therefore matched nothing, kept everything, and read as a fix
21
+ * while being none. `scopeOfMemoryResponse` reads the envelope and refuses the whole response when
22
+ * it names another project, or names none.
23
+ *
24
+ * The entry-level filter stays as a second pass. It is redundant against the platform's real shape,
25
+ * and it is the right answer against a server that labels entries instead — cheap to keep, and
26
+ * nothing here rests on it.
27
+ *
28
+ * ## Every reader, and that word is load-bearing
29
+ *
30
+ * Three callers read this endpoint: the `reticle_memory` tool, flow replay's automatic consultation,
31
+ * and `reticle memory` at a terminal. The first cut gave the first two an entry-level filter and the
32
+ * third the parameter alone, while a comment claimed all three were covered — and none of the three
33
+ * was, because the project id arrives on the envelope. They now share `scopedMemoryEntries`, so a
34
+ * fourth reader cannot get a different answer than the other three.
35
+ *
36
+ * Lives beside `cloud-sync.ts` rather than in `recall/` because that is where the other platform path
37
+ * constants live, and because both readers already reach this directory: a home under `recall/` would
38
+ * make `flows` reach a directory it never needed.
39
+ */
40
+ import { callingClientName } from '../../hooks/coding-agents.js';
41
+ /**
42
+ * The path this module builds, spelled once, for the same reason as the names below.
43
+ *
44
+ * Here rather than in `cloud-sync.ts`'s group of `CLOUD_*_PATH` constants: that group describes the
45
+ * calls THAT file makes, and cloud-sync has no memory reader at all. Adding this one there would make
46
+ * the group a registry of every endpoint in the package rather than a description of one file's calls.
47
+ */
48
+ const CLOUD_MEMORY_PATH = '/v1/memory';
49
+ /**
50
+ * The wire names, spelled once.
51
+ *
52
+ * `PROJECT_ID` is a request parameter AND a response field. They are the same word on purpose — the
53
+ * server echoes back what it was asked about — and one constant keeps a rename from moving only one
54
+ * of the two, which would silently restore the unfiltered read. `SUBJECT` is a request parameter only
55
+ * and is named for the same reason: it is a spelling the platform owns, not ours.
56
+ */
57
+ export const MemoryScopeField = {
58
+ PROJECT_ID: 'projectId',
59
+ SUBJECT: 'subject',
60
+ };
61
+ /**
62
+ * The project id to name, or `undefined` when there is none.
63
+ *
64
+ * `null`, `undefined` and `''` all say the same thing and all arrive in practice: `resolveProjectCloud`
65
+ * answers `null` when the link declares nothing, an absent argument is `undefined`, and a truncated
66
+ * config gives `''`. One helper, so the URL builder and the response filter cannot disagree about
67
+ * which of them counts as unscoped — a disagreement that would send `?projectId=` and come back
68
+ * empty, which reads as "this project knows nothing" rather than as a bug.
69
+ *
70
+ * Returns the id rather than a boolean so callers get the narrowing with it. A `boolean` predicate
71
+ * would leave `string | null | undefined` as-is and force a `String(...)` at the call site, which is
72
+ * a cast dressed up as a conversion.
73
+ */
74
+ const projectToName = (projectId) => 'string' === typeof projectId && projectId.length > 0 ? projectId : undefined;
75
+ /**
76
+ * Who a memory read is for. An agent's read names the agent and the platform counts it as a
77
+ * consultation; the daemon's sync names its purpose and is never counted as one.
78
+ */
79
+ export const MemoryReadHeader = {
80
+ AGENT: 'x-reticle-agent',
81
+ PURPOSE: 'x-reticle-read-purpose',
82
+ };
83
+ export const MemoryReadPurpose = { SYNC: 'sync' };
84
+ /**
85
+ * The headers of an agent's memory read: the key, and the agent whose call made the read. A replay's
86
+ * read went without the agent, and the platform credited it to "an agent that did not name itself".
87
+ * No agent is named when no single agent made the call: a guess would credit the wrong one.
88
+ */
89
+ export function memoryReadHeaders(apiKey) {
90
+ const agent = callingClientName();
91
+ return {
92
+ authorization: `Bearer ${apiKey}`,
93
+ ...(agent === undefined ? {} : { [MemoryReadHeader.AGENT]: agent }),
94
+ };
95
+ }
96
+ /**
97
+ * The URL for one memory read.
98
+ *
99
+ * Encoded with `encodeURIComponent` rather than `URLSearchParams`, which spells a space `+`. Both are
100
+ * valid in a query string and the server may accept either — but this is a URL a test asserts against
101
+ * and a person reads in a log, and one spelling is easier to reason about than two.
102
+ */
103
+ export function memoryReadUrl(baseUrl, scope) {
104
+ const parts = [];
105
+ if (scope.subject !== undefined) {
106
+ parts.push(`${MemoryScopeField.SUBJECT}=${encodeURIComponent(scope.subject)}`);
107
+ }
108
+ const projectId = projectToName(scope.projectId);
109
+ if (projectId !== undefined) {
110
+ parts.push(`${MemoryScopeField.PROJECT_ID}=${encodeURIComponent(projectId)}`);
111
+ }
112
+ const url = `${baseUrl}${CLOUD_MEMORY_PATH}`;
113
+ return 0 === parts.length ? url : `${url}?${parts.join('&')}`;
114
+ }
115
+ /**
116
+ * Drop the entries that state they belong to another project.
117
+ *
118
+ * The field is read defensively because the wire is somebody else's server: a number, an object or an
119
+ * absent key all mean "this entry does not say", and only a non-empty string that disagrees is enough
120
+ * to refuse one. See the note above for why silence is kept rather than dropped.
121
+ */
122
+ export function keepOwnProject(entries, projectId) {
123
+ const mine = projectToName(projectId);
124
+ if (mine === undefined)
125
+ return [...entries];
126
+ return entries.filter((entry) => {
127
+ if (null === entry || 'object' !== typeof entry)
128
+ return true;
129
+ const stated = entry[MemoryScopeField.PROJECT_ID];
130
+ if ('string' !== typeof stated || 0 === stated.length)
131
+ return true;
132
+ return stated === mine;
133
+ });
134
+ }
135
+ /**
136
+ * Whether a memory response can be read as THIS project's knowledge.
137
+ *
138
+ * The platform puts the project id on the response ENVELOPE, not on each entry (see the module note).
139
+ * Reading it there is the only check that works against the real shape: an entry-level filter sees no
140
+ * project field at all and keeps everything, so a server that ignores the request parameter — or
141
+ * resolves the key to a different project — hands back a whole workspace under this project's
142
+ * heading with nothing to distinguish it.
143
+ */
144
+ export const MemoryResponseScope = {
145
+ /** The envelope names the project this read asked about. Its entries may be read. */
146
+ OWN: 'own',
147
+ /** The envelope names a DIFFERENT project. Nothing in it belongs to this one. */
148
+ OTHER: 'other',
149
+ /**
150
+ * The envelope does not say which project it is about — an older server, or a shape we do not
151
+ * know. Unverifiable, which is NOT the same as empty and must not be shown as though it were.
152
+ */
153
+ UNSCOPED: 'unscoped',
154
+ /**
155
+ * This read named no project to begin with, so there is nothing for the envelope to contradict.
156
+ * The env-credential path with no `cloud.json`: CI, and a single-project setup that never linked.
157
+ */
158
+ NOT_ASKED: 'not-asked',
159
+ };
160
+ /** The two verdicts that permit reading the entries. Named so no caller re-derives the pair. */
161
+ export const isReadableMemoryScope = (scope) => MemoryResponseScope.OWN === scope || MemoryResponseScope.NOT_ASKED === scope;
162
+ /**
163
+ * What the envelope says about which project this response is about.
164
+ *
165
+ * A missing or non-string field is `UNSCOPED` rather than a mismatch: the wire is somebody else's
166
+ * server, and "this response never said" is a different fact from "this response named a rival".
167
+ * Both refuse; only the message a reader shows differs.
168
+ */
169
+ export function scopeOfMemoryResponse(body, projectId) {
170
+ const mine = projectToName(projectId);
171
+ if (mine === undefined)
172
+ return MemoryResponseScope.NOT_ASKED;
173
+ if (null === body || 'object' !== typeof body)
174
+ return MemoryResponseScope.UNSCOPED;
175
+ const stated = body[MemoryScopeField.PROJECT_ID];
176
+ if ('string' !== typeof stated || 0 === stated.length)
177
+ return MemoryResponseScope.UNSCOPED;
178
+ return stated === mine ? MemoryResponseScope.OWN : MemoryResponseScope.OTHER;
179
+ }
180
+ /**
181
+ * The entries a reader may treat as this project's, or `undefined` when the response cannot be read
182
+ * that way at all.
183
+ *
184
+ * `undefined` is the point of the return type. Three callers need three different sentences and none
185
+ * of them is a list: the tool reports `UNVERIFIED`, the CLI refuses out loud, and replay attaches
186
+ * nothing. "This project knows nothing" and "the server answered about something else" are different
187
+ * facts, and only the first is safe to act on.
188
+ */
189
+ export function scopedMemoryEntries(body, projectId) {
190
+ if (!isReadableMemoryScope(scopeOfMemoryResponse(body, projectId)))
191
+ return undefined;
192
+ if (null === body || 'object' !== typeof body)
193
+ return undefined;
194
+ const entries = body['entries'];
195
+ if (!Array.isArray(entries))
196
+ return undefined;
197
+ return keepOwnProject(entries, projectId);
198
+ }
199
+ /**
200
+ * The same filter, for a caller that prints the server's envelope rather than reading a list.
201
+ *
202
+ * `reticle memory` writes the response to stdout as JSON, so filtering has to preserve every other
203
+ * field the server sent and replace only `entries`. A body whose `entries` is not an array is handed
204
+ * back as it arrived: at that point the envelope has already been accepted, and guessing further is
205
+ * how a diagnostic command starts dropping the thing it was asked to print.
206
+ *
207
+ * It REFUSES on its own, answering `undefined` for a body it cannot show to be this project's. It
208
+ * used to hand the body back and leave the check to a JSDoc line telling callers to run
209
+ * `scopeOfMemoryResponse` first — which is the exact failure this module documents, written one
210
+ * function below the lesson. A reader that hands a body back cannot refuse it: the day somebody
211
+ * calls this first, a sibling project's knowledge goes to stdout with nothing to stop it. The
212
+ * `undefined` is what makes the unsafe call unexpressible rather than merely discouraged — a caller
213
+ * cannot print what it was not handed.
214
+ *
215
+ * The caller therefore checks for `undefined` and refuses out loud, instead of asking twice.
216
+ */
217
+ export function scopeMemoryResponse(body, projectId) {
218
+ if (!isReadableMemoryScope(scopeOfMemoryResponse(body, projectId)))
219
+ return undefined;
220
+ if (null === body || 'object' !== typeof body)
221
+ return undefined;
222
+ const envelope = body;
223
+ const entries = envelope['entries'];
224
+ if (!Array.isArray(entries))
225
+ return body;
226
+ return { ...envelope, entries: keepOwnProject(entries, projectId) };
227
+ }
@@ -1,10 +1,11 @@
1
+ import { type ScreenshotSyncState } from './sync-screenshots.js';
1
2
  /**
2
3
  * The derived records that ride along with runs, and the file each one lives in.
3
4
  *
4
- * A list rather than three hand-written blocks so adding a fourth is one line and cannot be
5
- * half-done — the bundle, the hashing and the reporting all walk this.
5
+ * One list, so adding a record is one line and cannot be half-done: the bundle, the hashing, the
6
+ * reporting and the disk source (`sync-disk.ts`) all read it.
6
7
  */
7
- declare const DERIVED_RECORDS: readonly [{
8
+ export declare const DERIVED_RECORDS: readonly [{
8
9
  readonly kind: "impact";
9
10
  readonly file: "impact.json";
10
11
  }, {
@@ -19,6 +20,12 @@ declare const DERIVED_RECORDS: readonly [{
19
20
  }, {
20
21
  readonly kind: "assertion-tiers";
21
22
  readonly file: "assertion-tiers.json";
23
+ }, {
24
+ readonly kind: "coverage";
25
+ readonly file: "coverage.json";
26
+ }, {
27
+ readonly kind: "notes";
28
+ readonly file: "notes.json";
22
29
  }];
23
30
  type DerivedKind = (typeof DERIVED_RECORDS)[number]['kind'];
24
31
  /** What the machine reads from disk. Injected so a cycle is testable with no filesystem at all. */
@@ -28,18 +35,20 @@ export interface SyncSource {
28
35
  runId: string;
29
36
  payload: unknown;
30
37
  }>;
31
- /** Every saved flow. Small, upserted by name, so they ride along whenever anything else does. */
38
+ /** Every saved flow. Upserted by name, so the set is sent only when it changed. */
32
39
  flows: () => readonly unknown[];
33
40
  /**
34
41
  * Every bug capsule on disk — the minimal failing flow that reproduces a defect, plus its evidence.
35
42
  *
36
- * Rides along with flows, and for the same reason: small, upserted by id, and worth nothing on the
43
+ * Sent like flows, only when the set changed: upserted by id, and worth nothing on the
37
44
  * machine that found the bug. A verdict count tells a dashboard THAT something broke; the capsule
38
45
  * is the only artifact that lets somebody else make it break again.
39
46
  */
40
47
  capsules: () => readonly unknown[];
41
48
  /** One derived record, or undefined when the file is absent. */
42
49
  derived: (kind: DerivedKind) => unknown;
50
+ /** One step screenshot of a run. Absent when this project keeps its screenshots local. */
51
+ screenshot?: (runId: string, file: string) => Uint8Array | undefined;
43
52
  }
44
53
  /** What the machine writes back. Separated from reads so a dry run is a source with no sink. */
45
54
  export interface SyncSink {
@@ -60,7 +69,7 @@ export interface PulledIssues {
60
69
  triage: Record<string, PulledIssue>;
61
70
  }
62
71
  /** `.reticle/cloud-state.json`. This machine's side of the conversation, never git-checked. */
63
- export interface CloudSyncState {
72
+ export interface CloudSyncState extends ScreenshotSyncState {
64
73
  /** Opaque. Handed back to the server verbatim; the machine must never parse or invent one. */
65
74
  cursor?: string;
66
75
  lastPushAt?: number;
@@ -98,6 +107,21 @@ export interface CloudSyncState {
98
107
  */
99
108
  sentFlowsHash?: string;
100
109
  sentCapsulesHash?: string;
110
+ /**
111
+ * The hash of each derived record the platform last ACCEPTED from here. A platform that reports
112
+ * a hash of its own form of a record never matches ours, so the same record went every cycle.
113
+ */
114
+ sentDerivedHashes?: Record<string, string>;
115
+ /** The names of the flows the platform last took from here: one gone from disk is deleted there. */
116
+ sentFlowNames?: string[];
117
+ /**
118
+ * The link everything above was kept for: cloud, workspace and project (`credentialSlot`). A
119
+ * folder re-linked elsewhere starts a fresh record, so the new link gets the flows the old one
120
+ * already had, and none of the old link's runs.
121
+ */
122
+ link?: string;
123
+ /** When this folder was re-linked: runs made before it stay here unless the person moves them. */
124
+ linkedAt?: number;
101
125
  /**
102
126
  * A flow or capsule set the platform refused, kept so the refusal stays visible on the cycles that
103
127
  * do not resend it, and so the set is offered again once it changes or the platform reads more.
@@ -125,6 +149,8 @@ export interface SyncReport {
125
149
  ok: boolean;
126
150
  /** Runs the server accepted this cycle. */
127
151
  runsSent: number;
152
+ /** Step screenshots the server took this cycle, for runs it holds. */
153
+ screenshotsSent?: number;
128
154
  /** Runs it refused, with the reason, so a bad artifact is visible rather than silently stuck. */
129
155
  runsRejected: Array<{
130
156
  index: number;
@@ -183,6 +209,12 @@ interface SyncDeps {
183
209
  url: string;
184
210
  apiKey: string;
185
211
  };
212
+ /** The link this cycle sends for (`credentialSlot`); absent for an env-only key (CI). */
213
+ link?: string;
214
+ /** Send runs made under a previous link too: only ever because the person asked. */
215
+ moveHistory?: boolean;
216
+ /** The project flows are synced for. Absent when this cycle does not send flows: none is deleted. */
217
+ projectId?: string;
186
218
  source: SyncSource;
187
219
  sink: SyncSink;
188
220
  state: CloudSyncState;
@@ -197,11 +229,16 @@ interface SyncDeps {
197
229
  text: string;
198
230
  }>;
199
231
  }
232
+ /** The server's per-part answer: accepted count and rejection list, each read defensively. */
233
+ /** A 200 that never confirmed the runs it was sent. Kept queued, and said, rather than dropped. */
234
+ export declare const MSG_RUNS_UNCONFIRMED = "sync 200 without a runs result: the server did not confirm the runs it was sent, so they stay queued";
200
235
  /**
201
236
  * Run one cycle. Never throws: the local record is already safe on disk, and a sync that can take
202
237
  * down the thing it is backing up is worse than no sync.
203
238
  */
204
- export declare function runSyncCycle(deps: SyncDeps): Promise<SyncReport>;
239
+ /** The command that moves a folder's earlier runs to the link it has now. */
240
+ export declare const MOVE_HISTORY_COMMAND = "reticle sync --move-history";
241
+ export declare function runSyncCycle(given: SyncDeps): Promise<SyncReport>;
205
242
  /** One line a human can read, for the CLI and the daemon log. */
206
243
  export declare function describeSync(report: SyncReport): string;
207
244
  export {};