@reticlehq/server 3.1.0 → 3.3.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 (384) hide show
  1. package/SKILL.md +30 -28
  2. package/dist/command/cli/adhoc-suite.d.ts +19 -0
  3. package/dist/command/cli/adhoc-suite.js +88 -0
  4. package/dist/command/cli/adhoc-verdict.d.ts +23 -2
  5. package/dist/command/cli/adhoc-verdict.js +18 -10
  6. package/dist/command/cli/auth/device-flow.d.ts +2 -2
  7. package/dist/command/cli/cli-doctor.js +37 -5
  8. package/dist/command/cli/cli-flow-commands.d.ts +2 -1
  9. package/dist/command/cli/cli-kill.js +1 -1
  10. package/dist/command/cli/cli-parse-grammar.d.ts +7 -0
  11. package/dist/command/cli/cli-parse-grammar.js +7 -0
  12. package/dist/command/cli/cli-parse-verify.d.ts +2 -5
  13. package/dist/command/cli/cli-parse-verify.js +86 -13
  14. package/dist/command/cli/cli-parse.d.ts +8 -1
  15. package/dist/command/cli/cli-parse.js +38 -7
  16. package/dist/command/cli/cli-verify.d.ts +59 -0
  17. package/dist/command/cli/cli-verify.js +131 -19
  18. package/dist/command/cli/cloud-cli.js +7 -6
  19. package/dist/command/cli/cloud-kit.d.ts +0 -2
  20. package/dist/command/cli/cloud-kit.js +3 -7
  21. package/dist/command/cli/config/config-discovery.d.ts +12 -0
  22. package/dist/command/cli/config/config-discovery.js +19 -0
  23. package/dist/command/cli/doctor/doctor-rows.d.ts +12 -0
  24. package/dist/command/cli/doctor/doctor-rows.js +12 -0
  25. package/dist/command/cli/doctor/doctor-sessions-line.d.ts +2 -1
  26. package/dist/command/cli/drive/drive-command.js +1 -1
  27. package/dist/command/cli/launch/cli-launch.d.ts +3 -23
  28. package/dist/command/cli/launch/cli-launch.js +29 -70
  29. package/dist/command/cli/lifecycle/daemon-lifecycle.d.ts +33 -0
  30. package/dist/command/cli/lifecycle/daemon-lifecycle.js +198 -0
  31. package/dist/command/cli/mcp-command.js +5 -3
  32. package/dist/command/cli/ports/resolve/cli-port.d.ts +15 -1
  33. package/dist/command/cli/ports/resolve/cli-port.js +50 -2
  34. package/dist/command/cli/report-command.d.ts +16 -0
  35. package/dist/command/cli/report-command.js +97 -0
  36. package/dist/command/cli/status/status-lines.d.ts +28 -0
  37. package/dist/command/cli/status/status-lines.js +117 -0
  38. package/dist/command/cli.d.ts +1 -1
  39. package/dist/command/cli.js +29 -177
  40. package/dist/command/daemon/binding/daemon-status-probe.d.ts +32 -0
  41. package/dist/command/daemon/binding/daemon-status-probe.js +93 -0
  42. package/dist/command/daemon/binding/loopback-reach.d.ts +42 -0
  43. package/dist/command/daemon/binding/loopback-reach.js +63 -0
  44. package/dist/command/daemon/binding/port-presence.d.ts +1 -1
  45. package/dist/command/daemon/daemon-resilience.d.ts +13 -1
  46. package/dist/command/daemon/daemon-resilience.js +12 -1
  47. package/dist/command/daemon/daemon.d.ts +2 -11
  48. package/dist/command/daemon/daemon.js +8 -11
  49. package/dist/command/daemon/idle-shutdown.d.ts +2 -1
  50. package/dist/command/daemon/lifetime/heartbeat.d.ts +8 -0
  51. package/dist/command/daemon/lifetime/heartbeat.js +10 -0
  52. package/dist/command/daemon/lifetime/log-cap.d.ts +68 -0
  53. package/dist/command/daemon/lifetime/log-cap.js +115 -0
  54. package/dist/command/setup/agent-notice-memory.d.ts +16 -0
  55. package/dist/command/setup/agent-notice-memory.js +65 -0
  56. package/dist/command/setup/bringup/dev-server-wait.d.ts +1 -0
  57. package/dist/command/setup/bringup/dev-server-wait.js +16 -0
  58. package/dist/command/setup/bringup/ensure-daemon.js +1 -1
  59. package/dist/command/setup/init/init-host.js +8 -0
  60. package/dist/command/setup/init/init-runtime.js +13 -1
  61. package/dist/command/setup/node-effects.js +1 -1
  62. package/dist/command/setup/probe/page-probe.js +9 -2
  63. package/dist/command/setup/run-setup.d.ts +25 -7
  64. package/dist/command/setup/run-setup.js +51 -9
  65. package/dist/command/setup/setup-command.js +31 -3
  66. package/dist/command/setup/terminal/confirm.js +2 -1
  67. package/dist/command/update/updater.d.ts +27 -0
  68. package/dist/command/update/updater.js +35 -2
  69. package/dist/features/crawl/crawl-tools.js +3 -1
  70. package/dist/features/crawl/crawl.d.ts +2 -0
  71. package/dist/features/crawl/crawl.js +3 -1
  72. package/dist/features/harness/drive-report.d.ts +73 -0
  73. package/dist/features/harness/drive-report.js +196 -0
  74. package/dist/features/harness/driver.js +29 -8
  75. package/dist/features/harness/drivers.d.ts +19 -0
  76. package/dist/features/harness/drivers.js +19 -0
  77. package/dist/features/harness/fill-values.d.ts +67 -0
  78. package/dist/features/harness/fill-values.js +153 -0
  79. package/dist/features/harness/jev-driver.d.ts +188 -0
  80. package/dist/features/harness/jev-driver.js +661 -0
  81. package/dist/features/harness/openai-driver.d.ts +46 -0
  82. package/dist/features/harness/openai-driver.js +197 -0
  83. package/dist/features/harness/platform-config.d.ts +62 -0
  84. package/dist/features/harness/platform-config.js +97 -0
  85. package/dist/features/visual/visual-tools.js +26 -2
  86. package/dist/index.d.ts +1 -1
  87. package/dist/index.js +80 -130
  88. package/dist/judgement/capsule/capsule-store.d.ts +31 -2
  89. package/dist/judgement/capsule/capsule-store.js +58 -6
  90. package/dist/judgement/capsule/capsule.js +5 -0
  91. package/dist/judgement/capsule/causal-summary.d.ts +13 -1
  92. package/dist/judgement/capsule/causal-summary.js +7 -0
  93. package/dist/judgement/domain/domain-model.js +38 -9
  94. package/dist/judgement/domain/domain-tools.js +4 -2
  95. package/dist/judgement/outcome/assertion-integrity.d.ts +3 -3
  96. package/dist/judgement/phenomena/phenomena.d.ts +2 -1
  97. package/dist/judgement/runs/artifact/gap-report.d.ts +17 -0
  98. package/dist/judgement/runs/artifact/gap-report.js +46 -0
  99. package/dist/judgement/runs/artifact/gap-summary.d.ts +58 -0
  100. package/dist/judgement/runs/artifact/gap-summary.js +85 -0
  101. package/dist/judgement/runs/artifact/render-report.js +4 -1
  102. package/dist/judgement/runs/artifact/to-artifact.d.ts +7 -2
  103. package/dist/judgement/runs/artifact/to-artifact.js +1 -1
  104. package/dist/judgement/runs/context-tools.js +21 -3
  105. package/dist/judgement/runs/drive-run.js +7 -2
  106. package/dist/judgement/runs/verification-sync.d.ts +2 -2
  107. package/dist/judgement/runs/verification-sync.js +9 -2
  108. package/dist/language/flows/affected-tools.js +6 -3
  109. package/dist/language/flows/annotate-notes/annotate.d.ts +0 -15
  110. package/dist/language/flows/annotate-notes/annotate.js +66 -18
  111. package/dist/language/flows/flow-anchor.d.ts +12 -0
  112. package/dist/language/flows/flow-anchor.js +20 -0
  113. package/dist/language/flows/flow-expect-grammar.d.ts +2 -2
  114. package/dist/language/flows/flow-expect-grammar.js +92 -11
  115. package/dist/language/flows/flow-intent.js +1 -1
  116. package/dist/language/flows/flow-learning.d.ts +3 -0
  117. package/dist/language/flows/flow-learning.js +39 -8
  118. package/dist/language/flows/flow-replay-run.d.ts +55 -10
  119. package/dist/language/flows/flow-replay-run.js +217 -58
  120. package/dist/language/flows/flow-replay-types.d.ts +9 -0
  121. package/dist/language/flows/flow-replay.d.ts +29 -11
  122. package/dist/language/flows/flow-replay.js +221 -203
  123. package/dist/language/flows/flow-result.d.ts +18 -1
  124. package/dist/language/flows/flow-result.js +18 -2
  125. package/dist/language/flows/flow-step-runners.d.ts +26 -10
  126. package/dist/language/flows/flow-step-runners.js +20 -4
  127. package/dist/language/flows/flow-store-for-session.d.ts +2 -1
  128. package/dist/language/flows/flow-success.d.ts +21 -6
  129. package/dist/language/flows/flow-success.js +50 -138
  130. package/dist/language/flows/flow-tools.js +8 -4
  131. package/dist/language/flows/flows.d.ts +15 -10
  132. package/dist/language/flows/flows.js +17 -4
  133. package/dist/language/flows/heal.d.ts +9 -1
  134. package/dist/language/flows/heal.js +24 -2
  135. package/dist/language/flows/learned-sources.d.ts +21 -0
  136. package/dist/language/flows/learned-sources.js +84 -0
  137. package/dist/language/flows/narrow-write.d.ts +4 -4
  138. package/dist/language/flows/recording/recording-backtrack.d.ts +0 -7
  139. package/dist/language/flows/recording/recording-backtrack.js +1 -1
  140. package/dist/language/flows/recording/replay-halt.d.ts +2 -1
  141. package/dist/language/flows/recording/tape/recordings.d.ts +2 -2
  142. package/dist/language/flows/replay.js +13 -9
  143. package/dist/language/flows/stores/annotation-store.d.ts +5 -5
  144. package/dist/language/flows/stores/assertion-tiers-store.js +2 -3
  145. package/dist/language/flows/stores/flake-store.js +2 -3
  146. package/dist/language/flows/suite/coverage.d.ts +1 -1
  147. package/dist/language/flows/suite/parallel-suite.d.ts +2 -1
  148. package/dist/language/flows/suite-selection.d.ts +15 -1
  149. package/dist/language/flows/suite-selection.js +1 -1
  150. package/dist/language/flows/verify-change-tools.js +21 -4
  151. package/dist/memory/cloud/account-state.d.ts +1 -1
  152. package/dist/memory/cloud/account-state.js +5 -4
  153. package/dist/memory/cloud/cloud-config.d.ts +9 -0
  154. package/dist/memory/cloud/cloud-config.js +9 -0
  155. package/dist/memory/cloud/cloud-sync.d.ts +7 -4
  156. package/dist/memory/cloud/cloud-sync.js +11 -6
  157. package/dist/memory/cloud/harness-config.d.ts +12 -0
  158. package/dist/memory/cloud/harness-config.js +58 -0
  159. package/dist/memory/cloud/harness-offer.d.ts +44 -0
  160. package/dist/memory/cloud/harness-offer.js +146 -0
  161. package/dist/memory/cloud/harness-switch.d.ts +11 -0
  162. package/dist/memory/cloud/harness-switch.js +53 -0
  163. package/dist/memory/cloud/sync-cycle.d.ts +12 -0
  164. package/dist/memory/cloud/sync-cycle.js +29 -4
  165. package/dist/memory/cloud/sync-daemon.d.ts +35 -2
  166. package/dist/memory/cloud/sync-daemon.js +45 -0
  167. package/dist/memory/cloud/sync-disk.js +11 -6
  168. package/dist/memory/impact/impact-recorder.d.ts +8 -0
  169. package/dist/memory/impact/impact-recorder.js +2 -1
  170. package/dist/memory/impact/impact-store.d.ts +5 -0
  171. package/dist/memory/impact/impact-store.js +25 -0
  172. package/dist/memory/intent/inline-intent.js +8 -3
  173. package/dist/memory/intent/intent-shard-store.d.ts +33 -47
  174. package/dist/memory/intent/intent-shard-store.js +253 -141
  175. package/dist/memory/intent/intent-shard.d.ts +22 -23
  176. package/dist/memory/intent/intent-shard.js +1 -1
  177. package/dist/memory/intent/intent-store.d.ts +13 -8
  178. package/dist/memory/intent/intent-store.js +46 -90
  179. package/dist/memory/intent/intent-tools.js +34 -23
  180. package/dist/memory/journal/ambient-store.js +2 -3
  181. package/dist/memory/journal/attach-journal.d.ts +11 -0
  182. package/dist/memory/journal/attach-journal.js +1 -1
  183. package/dist/memory/journal/deviation-report.js +4 -1
  184. package/dist/memory/journal/deviation-service.js +10 -2
  185. package/dist/memory/journal/drive-flow.d.ts +2 -2
  186. package/dist/memory/journal/drive-flow.js +21 -12
  187. package/dist/memory/journal/envelope-store.js +2 -3
  188. package/dist/memory/journal/journal-query.d.ts +35 -1
  189. package/dist/memory/journal/journal-query.js +46 -0
  190. package/dist/memory/journal/journal-recorder.d.ts +71 -2
  191. package/dist/memory/journal/journal-recorder.js +45 -7
  192. package/dist/memory/journal/on-disk/retain-policy.d.ts +34 -0
  193. package/dist/memory/journal/on-disk/retain-policy.js +44 -0
  194. package/dist/memory/journal/on-disk/retention.d.ts +91 -2
  195. package/dist/memory/journal/on-disk/retention.js +181 -11
  196. package/dist/memory/journal/on-disk/startup-maintenance.d.ts +42 -0
  197. package/dist/memory/journal/on-disk/startup-maintenance.js +14 -0
  198. package/dist/memory/journal/on-disk/workspace-gitignore.d.ts +0 -2
  199. package/dist/memory/journal/on-disk/workspace-gitignore.js +6 -38
  200. package/dist/memory/journal/on-disk/workspace-tiers.d.ts +52 -0
  201. package/dist/memory/journal/on-disk/workspace-tiers.js +88 -0
  202. package/dist/memory/journal/route-template.d.ts +22 -0
  203. package/dist/memory/journal/route-template.js +44 -0
  204. package/dist/memory/journal/self-observation.d.ts +3 -0
  205. package/dist/memory/journal/self-observation.js +67 -0
  206. package/dist/memory/journal/session-end.d.ts +17 -4
  207. package/dist/memory/journal/session-end.js +85 -7
  208. package/dist/memory/journal/session-journal.d.ts +122 -5
  209. package/dist/memory/journal/session-journal.js +489 -32
  210. package/dist/memory/project/artifact-root-resolver.d.ts +3 -0
  211. package/dist/memory/project/artifact-root-resolver.js +89 -0
  212. package/dist/memory/project/artifact-root.d.ts +39 -2
  213. package/dist/memory/project/artifact-root.js +58 -1
  214. package/dist/memory/project/baselines.d.ts +1 -1
  215. package/dist/memory/project/dir/fill-value-store.d.ts +32 -0
  216. package/dist/memory/project/dir/fill-value-store.js +88 -0
  217. package/dist/memory/project/dir/reticle-dir.d.ts +15 -5
  218. package/dist/memory/project/dir/reticle-dir.js +11 -0
  219. package/dist/memory/project/fs/fs-port.d.ts +22 -1
  220. package/dist/memory/project/fs/fs-port.js +72 -5
  221. package/dist/memory/project/fs/write-atomic.d.ts +26 -0
  222. package/dist/memory/project/fs/write-atomic.js +48 -0
  223. package/dist/memory/project/learned-routes.d.ts +16 -2
  224. package/dist/memory/project/learned-routes.js +26 -10
  225. package/dist/memory/project/project-for-root.d.ts +30 -0
  226. package/dist/memory/project/project-for-root.js +43 -0
  227. package/dist/memory/project/project-tools.js +10 -5
  228. package/dist/memory/project/session-root.d.ts +35 -6
  229. package/dist/memory/project/session-root.js +70 -8
  230. package/dist/memory/recall/prior/connection-memory.d.ts +6 -0
  231. package/dist/memory/recall/prior/connection-memory.js +8 -0
  232. package/dist/memory/recall/registered-projects.d.ts +2 -1
  233. package/dist/portal/bridge/auth-failure-reason.d.ts +9 -0
  234. package/dist/portal/bridge/auth-failure-reason.js +20 -3
  235. package/dist/portal/bridge/bridge.d.ts +6 -1
  236. package/dist/portal/bridge/bridge.js +36 -2
  237. package/dist/portal/input/real-input.js +2 -1
  238. package/dist/portal/pool/browser-pool.d.ts +10 -0
  239. package/dist/portal/pool/browser-pool.js +10 -0
  240. package/dist/portal/pool/playwright-launcher.js +1 -0
  241. package/dist/portal/pool/pool-contract.d.ts +2 -0
  242. package/dist/portal/pool/storage-seed.d.ts +2 -1
  243. package/dist/portal/pool/zero-install.d.ts +27 -0
  244. package/dist/portal/pool/zero-install.js +54 -0
  245. package/dist/portal/realm/web-realm.js +6 -0
  246. package/dist/portal/session/dev-server/dev-server-probe.d.ts +2 -1
  247. package/dist/portal/session/dev-server/served-document.d.ts +21 -0
  248. package/dist/portal/session/dev-server/served-document.js +57 -0
  249. package/dist/portal/session/facts/background-traffic.d.ts +9 -0
  250. package/dist/portal/session/facts/background-traffic.js +25 -0
  251. package/dist/portal/session/facts/session-replaced.d.ts +19 -0
  252. package/dist/portal/session/facts/session-replaced.js +22 -0
  253. package/dist/portal/session/live-control-tools.js +48 -3
  254. package/dist/portal/session/no-session-diagnosis.d.ts +1 -0
  255. package/dist/portal/session/no-session-diagnosis.js +67 -60
  256. package/dist/portal/session/no-session-next-action.js +3 -2
  257. package/dist/portal/session/no-session-watch.js +14 -10
  258. package/dist/portal/session/presence/attachment-history.d.ts +13 -2
  259. package/dist/portal/session/rebind.d.ts +18 -0
  260. package/dist/portal/session/rebind.js +38 -0
  261. package/dist/portal/session/session-health.d.ts +61 -0
  262. package/dist/portal/session/session-health.js +40 -1
  263. package/dist/portal/session/session-info.d.ts +6 -0
  264. package/dist/portal/session/session-manager.d.ts +13 -0
  265. package/dist/portal/session/session-manager.js +42 -3
  266. package/dist/portal/session/session-successor.d.ts +11 -0
  267. package/dist/portal/session/session-successor.js +14 -1
  268. package/dist/portal/session/session-verdict-facts.d.ts +28 -0
  269. package/dist/portal/session/session-verdict-facts.js +15 -0
  270. package/dist/portal/session/session.d.ts +26 -10
  271. package/dist/portal/session/session.js +48 -49
  272. package/dist/status-payload.d.ts +12 -1
  273. package/dist/status-payload.js +4 -1
  274. package/dist/surface/http-server.js +3 -5
  275. package/dist/surface/mcp/faults/mcp-outage.d.ts +2 -1
  276. package/dist/surface/mcp/faults/mcp-outage.js +20 -4
  277. package/dist/surface/mcp/mcp-proxy.d.ts +10 -1
  278. package/dist/surface/mcp/mcp-proxy.js +23 -12
  279. package/dist/surface/mcp/mcp.d.ts +10 -1
  280. package/dist/surface/mcp/mcp.js +59 -29
  281. package/dist/surface/mcp/proxy/proxy-daemon-probe.d.ts +15 -2
  282. package/dist/surface/mcp/proxy/proxy-daemon-probe.js +22 -5
  283. package/dist/surface/mcp/proxy/proxy-log.d.ts +5 -11
  284. package/dist/surface/mcp/proxy/proxy-log.js +7 -22
  285. package/dist/surface/mcp/proxy-idle-exit.d.ts +2 -1
  286. package/dist/surface/mcp/server-instructions.js +12 -1
  287. package/dist/surface/tools/act/act-preflight.js +6 -1
  288. package/dist/surface/tools/act/already-true.d.ts +40 -0
  289. package/dist/surface/tools/act/already-true.js +36 -0
  290. package/dist/surface/tools/act/navigation/navigate-arrival.d.ts +6 -0
  291. package/dist/surface/tools/act/navigation/navigate-arrival.js +13 -0
  292. package/dist/surface/tools/act/sequence-grade.js +13 -0
  293. package/dist/surface/tools/act/settle-in-flight.d.ts +6 -2
  294. package/dist/surface/tools/act/settle-in-flight.js +29 -6
  295. package/dist/surface/tools/act-capsule.js +49 -8
  296. package/dist/surface/tools/act-tools.js +25 -24
  297. package/dist/surface/tools/args/numeric-bounds.d.ts +15 -2
  298. package/dist/surface/tools/args/numeric-bounds.js +30 -3
  299. package/dist/surface/tools/assert/assert-grade.js +14 -2
  300. package/dist/surface/tools/assert/assert-verdict.js +74 -21
  301. package/dist/surface/tools/browser-tools.js +4 -3
  302. package/dist/surface/tools/coverage-tools.js +5 -2
  303. package/dist/surface/tools/dynamic-tools.js +43 -46
  304. package/dist/surface/tools/error-recovery.d.ts +6 -0
  305. package/dist/surface/tools/error-recovery.js +15 -0
  306. package/dist/surface/tools/explore-tools.js +80 -7
  307. package/dist/surface/tools/feedback-tools.d.ts +2 -1
  308. package/dist/surface/tools/feedback-tools.js +50 -3
  309. package/dist/surface/tools/first-sentence.d.ts +24 -0
  310. package/dist/surface/tools/first-sentence.js +0 -0
  311. package/dist/surface/tools/harness-explore.d.ts +125 -1
  312. package/dist/surface/tools/harness-explore.js +401 -15
  313. package/dist/surface/tools/harness-plan.d.ts +76 -0
  314. package/dist/surface/tools/harness-plan.js +156 -0
  315. package/dist/surface/tools/harness-toolset.js +12 -1
  316. package/dist/surface/tools/invoke-tool.js +82 -9
  317. package/dist/surface/tools/lease-hint.d.ts +8 -0
  318. package/dist/surface/tools/lease-hint.js +10 -0
  319. package/dist/surface/tools/lease-tools.d.ts +16 -28
  320. package/dist/surface/tools/lease-tools.js +53 -5
  321. package/dist/surface/tools/lineage-tools.js +1 -1
  322. package/dist/surface/tools/live-call-text.d.ts +6 -0
  323. package/dist/surface/tools/live-call-text.js +36 -2
  324. package/dist/surface/tools/observe-tools.js +69 -15
  325. package/dist/surface/tools/read/query-windowed.d.ts +1 -1
  326. package/dist/surface/tools/read/query-windowed.js +1 -1
  327. package/dist/surface/tools/read-tools.js +1 -2
  328. package/dist/surface/tools/real-input-attempt.d.ts +0 -5
  329. package/dist/surface/tools/real-input-attempt.js +1 -1
  330. package/dist/surface/tools/tool-kit.d.ts +23 -3
  331. package/dist/surface/tools/tool-kit.js +6 -1
  332. package/dist/surface/tools/tool-surface.js +17 -5
  333. package/dist/surface/tools/tools-helpers.d.ts +8 -7
  334. package/dist/surface/tools/tools-helpers.js +11 -13
  335. package/dist/surface/tools/tools.js +70 -30
  336. package/dist/telemetry/bug-found.js +32 -2
  337. package/dist/telemetry/feedback-context.js +3 -3
  338. package/dist/telemetry/feedback-local.d.ts +1 -0
  339. package/dist/telemetry/feedback-local.js +1 -3
  340. package/dist/telemetry/feedback.d.ts +1 -1
  341. package/dist/telemetry/harness-drive.d.ts +6 -0
  342. package/dist/telemetry/harness-drive.js +39 -0
  343. package/dist/telemetry/hud-metrics.d.ts +32 -0
  344. package/dist/telemetry/hud-metrics.js +95 -0
  345. package/dist/telemetry/mcp-connection.d.ts +14 -1
  346. package/dist/telemetry/mcp-connection.js +17 -2
  347. package/dist/telemetry/onboarding-firsts.d.ts +30 -1
  348. package/dist/telemetry/onboarding-firsts.js +54 -12
  349. package/dist/telemetry/session-metrics.d.ts +5 -0
  350. package/dist/telemetry/session-metrics.js +15 -1
  351. package/dist/telemetry/verification-of.js +31 -3
  352. package/dist/wire-journal.d.ts +31 -0
  353. package/dist/wire-journal.js +100 -0
  354. package/docs/README.md +1 -0
  355. package/docs/agent-cheatsheet.md +7 -3
  356. package/docs/autodrive.md +42 -2
  357. package/docs/benchmarks.md +1 -1
  358. package/docs/capabilities.mdx +1 -1
  359. package/docs/cli/cloud.mdx +11 -9
  360. package/docs/cli/doctor.mdx +1 -0
  361. package/docs/cli/init.mdx +1 -0
  362. package/docs/cli/report.mdx +44 -0
  363. package/docs/cli/status.mdx +35 -20
  364. package/docs/cli.mdx +8 -18
  365. package/docs/desktop.mdx +1 -1
  366. package/docs/faq.mdx +1 -1
  367. package/docs/flows.md +11 -0
  368. package/docs/frameworks.mdx +113 -1
  369. package/docs/install-agentic.mdx +36 -0
  370. package/docs/install-manual.mdx +1 -1
  371. package/docs/packages/tauri.mdx +1 -1
  372. package/docs/packages.mdx +1 -1
  373. package/docs/predicates.mdx +144 -4
  374. package/docs/system-map.md +6 -4
  375. package/docs/telemetry.md +2 -1
  376. package/docs/token-efficiency.md +2 -2
  377. package/docs/tools/overview.mdx +1 -1
  378. package/docs/tools/query.mdx +10 -10
  379. package/docs/troubleshooting.mdx +8 -2
  380. package/docs/usage.md +2 -2
  381. package/docs/what-is-recorded.md +62 -0
  382. package/package.json +5 -5
  383. package/dist/judgement/outcome/predicate-to-expect.d.ts +0 -44
  384. package/dist/judgement/outcome/predicate-to-expect.js +0 -148
@@ -0,0 +1,46 @@
1
+ /**
2
+ * The harness driver for OpenAI's Chat Completions API.
3
+ *
4
+ * Third driver, and the reason it exists is comparison rather than capability: people want to know
5
+ * whether the cheap typed-decision model is good enough for THEIR app, and "cheap versus one
6
+ * frontier model" is a weaker answer than "cheap versus the two they might otherwise reach for".
7
+ *
8
+ * A translation layer, exactly like `driver.ts` — the loop lives in `harness.ts` against
9
+ * `ModelDriver` and knows nothing about any wire. Chat Completions is a genuinely different shape
10
+ * from the Messages API, and translating OpenAI into Anthropic's wire on the platform side was
11
+ * considered and rejected there: it would put a second, undeclared model-shaped transformation
12
+ * inside the thing being measured. So this speaks the native format and the arm measures OpenAI.
13
+ *
14
+ * NOT cache-annotated, and that is a real asymmetry to hold in mind when reading a cost comparison
15
+ * against the Anthropic arm. OpenAI caches long prefixes automatically and reports it back in
16
+ * `usage.prompt_tokens_details.cached_tokens`, so the saving is not something this driver arranges;
17
+ * it is reported below so the number is visible rather than assumed.
18
+ */
19
+ import type { ModelDriver } from './harness.js';
20
+ import type { HarnessFetch } from './driver.js';
21
+ /**
22
+ * The default model.
23
+ *
24
+ * Deliberately not the largest available, for the same reason `DEFAULT_HARNESS_MODEL` is not: the
25
+ * driver is choosing what to touch next, and the engine decides the verdict from evidence. A driver
26
+ * that needed a frontier model would be evidence the engine was not doing its job.
27
+ */
28
+ export declare const DEFAULT_OPENAI_MODEL = "gpt-5.6-luna";
29
+ export declare const DEFAULT_OPENAI_BASE_URL = "https://api.openai.com";
30
+ export interface OpenAiDriverOptions {
31
+ apiKey: string;
32
+ model?: string;
33
+ baseUrl?: string;
34
+ /** Injected for tests. Defaults to the platform `fetch`. */
35
+ fetch?: HarnessFetch;
36
+ }
37
+ /**
38
+ * Read this driver's configuration out of the environment.
39
+ *
40
+ * A real OpenAI key goes to OpenAI. The platform key goes to the platform, which forwards with its
41
+ * own — so somebody who has run `reticle link` can drive with this model having never held an
42
+ * OpenAI key, which is the entire point of the proxy.
43
+ */
44
+ export declare function openAiOptionsFromEnv(env: Record<string, string | undefined>): OpenAiDriverOptions | undefined;
45
+ /** Build a driver backed by Chat Completions. */
46
+ export declare function openAiDriver(options: OpenAiDriverOptions): ModelDriver;
@@ -0,0 +1,197 @@
1
+ /**
2
+ * The harness driver for OpenAI's Chat Completions API.
3
+ *
4
+ * Third driver, and the reason it exists is comparison rather than capability: people want to know
5
+ * whether the cheap typed-decision model is good enough for THEIR app, and "cheap versus one
6
+ * frontier model" is a weaker answer than "cheap versus the two they might otherwise reach for".
7
+ *
8
+ * A translation layer, exactly like `driver.ts` — the loop lives in `harness.ts` against
9
+ * `ModelDriver` and knows nothing about any wire. Chat Completions is a genuinely different shape
10
+ * from the Messages API, and translating OpenAI into Anthropic's wire on the platform side was
11
+ * considered and rejected there: it would put a second, undeclared model-shaped transformation
12
+ * inside the thing being measured. So this speaks the native format and the arm measures OpenAI.
13
+ *
14
+ * NOT cache-annotated, and that is a real asymmetry to hold in mind when reading a cost comparison
15
+ * against the Anthropic arm. OpenAI caches long prefixes automatically and reports it back in
16
+ * `usage.prompt_tokens_details.cached_tokens`, so the saving is not something this driver arranges;
17
+ * it is reported below so the number is visible rather than assumed.
18
+ */
19
+ import { z } from 'zod';
20
+ import { ReticleEnv, apiKeyFrom } from '@reticlehq/core';
21
+ /**
22
+ * The default model.
23
+ *
24
+ * Deliberately not the largest available, for the same reason `DEFAULT_HARNESS_MODEL` is not: the
25
+ * driver is choosing what to touch next, and the engine decides the verdict from evidence. A driver
26
+ * that needed a frontier model would be evidence the engine was not doing its job.
27
+ */
28
+ export const DEFAULT_OPENAI_MODEL = 'gpt-5.6-luna';
29
+ export const DEFAULT_OPENAI_BASE_URL = 'https://api.openai.com';
30
+ /** The platform's own path, which forwards with Reticle's key rather than the caller's. */
31
+ const PLATFORM_PATH = '/v1/model/openai';
32
+ const OPENAI_PATH = '/v1/chat/completions';
33
+ /** Output cap per turn. A driving turn is a sentence and a tool call, never an essay. */
34
+ const MAX_TOKENS = 4096;
35
+ /** How much of one tool result the model is allowed to see. Same reasoning as the Anthropic driver. */
36
+ const MAX_RESULT_CHARS = 8000;
37
+ const ToolCall = z.object({
38
+ id: z.string(),
39
+ function: z.object({ name: z.string(), arguments: z.string().default('{}') }),
40
+ });
41
+ const ChatResponse = z.object({
42
+ choices: z
43
+ .array(z.object({
44
+ message: z.object({
45
+ content: z.string().nullish(),
46
+ tool_calls: z.array(ToolCall).nullish(),
47
+ }),
48
+ }))
49
+ .default([]),
50
+ usage: z
51
+ .object({
52
+ prompt_tokens: z.number().default(0),
53
+ completion_tokens: z.number().default(0),
54
+ prompt_tokens_details: z.object({ cached_tokens: z.number().nullish() }).nullish(),
55
+ })
56
+ .default({ prompt_tokens: 0, completion_tokens: 0 }),
57
+ });
58
+ /**
59
+ * Read this driver's configuration out of the environment.
60
+ *
61
+ * A real OpenAI key goes to OpenAI. The platform key goes to the platform, which forwards with its
62
+ * own — so somebody who has run `reticle link` can drive with this model having never held an
63
+ * OpenAI key, which is the entire point of the proxy.
64
+ */
65
+ export function openAiOptionsFromEnv(env) {
66
+ const model = env[ReticleEnv.HARNESS_OPENAI_MODEL];
67
+ const withModel = (rest) => ({
68
+ ...rest,
69
+ ...(model === undefined || 0 === model.length ? {} : { model }),
70
+ });
71
+ const direct = env[ReticleEnv.HARNESS_OPENAI_KEY];
72
+ if (direct !== undefined && 0 < direct.length)
73
+ return withModel({ apiKey: direct });
74
+ const cloudKey = apiKeyFrom(env);
75
+ const cloudUrl = env[ReticleEnv.CLOUD_URL];
76
+ if (cloudKey === undefined || 0 === cloudKey.length)
77
+ return undefined;
78
+ if (cloudUrl === undefined || 0 === cloudUrl.length)
79
+ return undefined;
80
+ return withModel({ apiKey: cloudKey, baseUrl: cloudUrl });
81
+ }
82
+ function toWireTool(tool) {
83
+ return {
84
+ type: 'function',
85
+ function: { name: tool.name, description: tool.description, parameters: tool.inputSchema },
86
+ };
87
+ }
88
+ function truncate(text) {
89
+ return text.length <= MAX_RESULT_CHARS
90
+ ? text
91
+ : `${text.slice(0, MAX_RESULT_CHARS)}\n…[truncated: ${String(text.length - MAX_RESULT_CHARS)} more characters]`;
92
+ }
93
+ /**
94
+ * The history, in Chat Completions' shape.
95
+ *
96
+ * The one structural difference from the Messages API, and it matters: a tool result is its OWN
97
+ * message carrying `tool_call_id`, where Anthropic puts every result for a turn into one user
98
+ * message. So a turn with three parallel calls becomes one assistant message and three tool
99
+ * messages. That is the format's requirement rather than a choice — an unanswered `tool_call_id`
100
+ * is rejected outright, so every outcome must be emitted, including the failures.
101
+ */
102
+ function toWireMessages(history) {
103
+ const messages = [];
104
+ for (const entry of history) {
105
+ if ('user' === entry.role) {
106
+ messages.push({ role: 'user', content: entry.text });
107
+ continue;
108
+ }
109
+ if ('assistant' === entry.role) {
110
+ messages.push({
111
+ role: 'assistant',
112
+ content: 0 === entry.text.length ? null : entry.text,
113
+ ...(0 === entry.calls.length
114
+ ? {}
115
+ : {
116
+ tool_calls: entry.calls.map((call) => ({
117
+ id: call.id,
118
+ type: 'function',
119
+ function: { name: call.name, arguments: JSON.stringify(call.args) },
120
+ })),
121
+ }),
122
+ });
123
+ continue;
124
+ }
125
+ for (const outcome of entry.outcomes) {
126
+ messages.push({
127
+ role: 'tool',
128
+ tool_call_id: outcome.id,
129
+ content: truncate(JSON.stringify(outcome.result)),
130
+ });
131
+ }
132
+ }
133
+ return messages;
134
+ }
135
+ /** Arguments arrive as a JSON STRING here, not an object — a malformed one is empty, never a throw. */
136
+ function parseArgs(raw) {
137
+ try {
138
+ const parsed = JSON.parse(raw);
139
+ return 'object' === typeof parsed && null !== parsed ? parsed : {};
140
+ }
141
+ catch {
142
+ return {};
143
+ }
144
+ }
145
+ /** Build a driver backed by Chat Completions. */
146
+ export function openAiDriver(options) {
147
+ const model = options.model ?? DEFAULT_OPENAI_MODEL;
148
+ const baseUrl = options.baseUrl ?? DEFAULT_OPENAI_BASE_URL;
149
+ const doFetch = options.fetch ?? ((url, init) => fetch(url, init));
150
+ // The platform does not expose `/v1/chat/completions`; it exposes its own path and forwards. A
151
+ // base URL that is not OpenAI's is the platform's, which is the only other thing this talks to.
152
+ const path = DEFAULT_OPENAI_BASE_URL === baseUrl ? OPENAI_PATH : PLATFORM_PATH;
153
+ return {
154
+ async turn(input) {
155
+ const response = await doFetch(`${baseUrl}${path}`, {
156
+ method: 'POST',
157
+ headers: {
158
+ 'content-type': 'application/json',
159
+ authorization: `Bearer ${options.apiKey}`,
160
+ },
161
+ body: JSON.stringify({
162
+ model,
163
+ max_completion_tokens: MAX_TOKENS,
164
+ tools: input.tools.map(toWireTool),
165
+ messages: [{ role: 'system', content: input.system }, ...toWireMessages(input.history)],
166
+ }),
167
+ });
168
+ const body = await response.text();
169
+ // Thrown, not returned: a model that will not answer is a BROKEN drive, and a broken drive is
170
+ // never reported as clean. Swallowing it would be a verdict about an app nobody drove.
171
+ if (!response.ok)
172
+ throw new Error(`the model refused the request (HTTP ${String(response.status)}): ${body}`);
173
+ const parsed = ChatResponse.parse(JSON.parse(body));
174
+ const message = parsed.choices[0]?.message;
175
+ const calls = (message?.tool_calls ?? []).map((call) => ({
176
+ id: call.id,
177
+ name: call.function.name,
178
+ args: parseArgs(call.function.arguments),
179
+ }));
180
+ const cached = parsed.usage.prompt_tokens_details?.cached_tokens ?? 0;
181
+ return {
182
+ text: message?.content ?? '',
183
+ calls,
184
+ usage: {
185
+ // `prompt_tokens` INCLUDES the cached ones here, unlike the Messages API where the two are
186
+ // disjoint. Subtracting keeps `input` meaning the same thing in both drivers: what was
187
+ // processed at full price. A cost comparison that summed them would charge the arm that
188
+ // cached well for the tokens it did not pay full price for.
189
+ input: Math.max(parsed.usage.prompt_tokens - cached, 0),
190
+ output: parsed.usage.completion_tokens,
191
+ cacheRead: cached,
192
+ cacheWrite: 0,
193
+ },
194
+ };
195
+ },
196
+ };
197
+ }
@@ -0,0 +1,62 @@
1
+ /**
2
+ * The driver preference a person set on the platform, read by the daemon that has to honour it.
3
+ *
4
+ * Choosing a model in a web UI is worth nothing if the thing doing the driving never asks. This is
5
+ * the one call that closes that loop: the console writes a per-project preference, and the daemon
6
+ * reads it before it builds a driver.
7
+ *
8
+ * Three rules shape all of it, and they are the difference between a preference and an outage:
9
+ *
10
+ * - it is a PREFERENCE, not a credential. Every failure — no key, no host, a timeout, a 500, a
11
+ * body that does not parse — answers `undefined`, and the caller falls back to what the
12
+ * environment says. A drive must never fail because a settings endpoint was slow.
13
+ * - it is BOUNDED. The fetch is aborted rather than awaited indefinitely. A drive that hangs
14
+ * holds a leased browser context with nothing anywhere saying why, and "the preferences API was
15
+ * unreachable" is the worst possible reason for that to happen.
16
+ * - it never overrides someone who was EXPLICIT. A driver named in the call, or set in the
17
+ * environment, wins over the stored preference. Precedence lives in the caller.
18
+ */
19
+ /** The subset of the platform's answer the harness acts on. */
20
+ export interface PlatformModelConfig {
21
+ /** `jev` | `anthropic` | `openai`, as the platform spells it. Not validated here. */
22
+ provider: string;
23
+ /** Whether the person wants autonomous driving at all. */
24
+ harnessEnabled: boolean;
25
+ /**
26
+ * Whether this workspace may drive on OUR model spend — a claimed free period, or a paid plan.
27
+ *
28
+ * Deliberately a second boolean rather than folded into `harnessEnabled`. One is a switch a person
29
+ * set, the other is a fact about their account, and a daemon that could not tell them apart would
30
+ * report "you turned this off" to somebody whose free months quietly ran out.
31
+ */
32
+ harnessEntitled: boolean;
33
+ /**
34
+ * Whether the platform actually holds a key for the provider this project is pointed at.
35
+ *
36
+ * Entitlement and readiness are different facts and the HUD needs both. A workspace can be fully
37
+ * entitled -- claimed period, `harnessEnabled` on -- against a deployment that has no provider key
38
+ * configured, and every signal then reads healthy while a drive cannot run. Absent reads as READY,
39
+ * on the same rule as the two booleans above: an older API that does not report availability must
40
+ * not have its silence treated as a refusal.
41
+ */
42
+ providerReady: boolean;
43
+ }
44
+ /** A GET, narrowed to what this file uses, so a test can answer it without a network. */
45
+ export type ConfigFetch = (url: string, init: {
46
+ method: string;
47
+ headers: Record<string, string>;
48
+ signal?: AbortSignal;
49
+ }) => Promise<{
50
+ ok: boolean;
51
+ status: number;
52
+ text(): Promise<string>;
53
+ }>;
54
+ /**
55
+ * Ask the platform which model this project wants driving with.
56
+ *
57
+ * `undefined` means "no answer", and every caller must treat that as "carry on with the
58
+ * environment" rather than as a failure worth reporting. There is deliberately no error channel:
59
+ * an unreachable settings endpoint is not something the person running a drive can act on, and a
60
+ * warning printed on a path that then works correctly is how people learn to ignore stderr.
61
+ */
62
+ export declare function fetchPlatformConfig(env: Record<string, string | undefined>, doFetch?: ConfigFetch, timeoutMs?: number): Promise<PlatformModelConfig | undefined>;
@@ -0,0 +1,97 @@
1
+ /**
2
+ * The driver preference a person set on the platform, read by the daemon that has to honour it.
3
+ *
4
+ * Choosing a model in a web UI is worth nothing if the thing doing the driving never asks. This is
5
+ * the one call that closes that loop: the console writes a per-project preference, and the daemon
6
+ * reads it before it builds a driver.
7
+ *
8
+ * Three rules shape all of it, and they are the difference between a preference and an outage:
9
+ *
10
+ * - it is a PREFERENCE, not a credential. Every failure — no key, no host, a timeout, a 500, a
11
+ * body that does not parse — answers `undefined`, and the caller falls back to what the
12
+ * environment says. A drive must never fail because a settings endpoint was slow.
13
+ * - it is BOUNDED. The fetch is aborted rather than awaited indefinitely. A drive that hangs
14
+ * holds a leased browser context with nothing anywhere saying why, and "the preferences API was
15
+ * unreachable" is the worst possible reason for that to happen.
16
+ * - it never overrides someone who was EXPLICIT. A driver named in the call, or set in the
17
+ * environment, wins over the stored preference. Precedence lives in the caller.
18
+ */
19
+ import { ReticleEnv, apiKeyFrom } from '@reticlehq/core';
20
+ const CONFIG_PATH = '/v1/model/config';
21
+ /**
22
+ * How long the daemon will wait for a preference before driving without it.
23
+ *
24
+ * Short on purpose. This runs before a drive that takes tens of seconds, so a second of budget is
25
+ * affordable and a stall is not — and the fallback is not a degraded mode, it is the behaviour
26
+ * everybody had before this endpoint existed.
27
+ */
28
+ const TIMEOUT_MS = 2_000;
29
+ function parse(body) {
30
+ try {
31
+ const parsed = JSON.parse(body);
32
+ if ('object' !== typeof parsed || null === parsed)
33
+ return undefined;
34
+ const record = parsed;
35
+ const provider = record['provider'];
36
+ if ('string' !== typeof provider || 0 === provider.length)
37
+ return undefined;
38
+ // Absent reads as enabled: the platform's own default is on, and a daemon that treated a
39
+ // missing field as "off" would silently disable the feature for anyone on an older API.
40
+ const enabled = record['harnessEnabled'];
41
+ // Same rule for both, for the same reason: an older API that reports neither must not have its
42
+ // silence read as a refusal.
43
+ const entitled = record['harnessEntitled'];
44
+ // `available` is keyed by provider and says which ones the platform holds a key for. Read only
45
+ // the entry for the provider this project uses: another provider being configured says nothing
46
+ // about whether THIS one can drive.
47
+ const available = record['available'];
48
+ const ready = 'object' === typeof available && null !== available
49
+ ? available[provider]
50
+ : undefined;
51
+ return {
52
+ provider,
53
+ harnessEnabled: 'boolean' === typeof enabled ? enabled : true,
54
+ harnessEntitled: 'boolean' === typeof entitled ? entitled : true,
55
+ providerReady: 'boolean' === typeof ready ? ready : true,
56
+ };
57
+ }
58
+ catch {
59
+ return undefined;
60
+ }
61
+ }
62
+ /**
63
+ * Ask the platform which model this project wants driving with.
64
+ *
65
+ * `undefined` means "no answer", and every caller must treat that as "carry on with the
66
+ * environment" rather than as a failure worth reporting. There is deliberately no error channel:
67
+ * an unreachable settings endpoint is not something the person running a drive can act on, and a
68
+ * warning printed on a path that then works correctly is how people learn to ignore stderr.
69
+ */
70
+ export async function fetchPlatformConfig(env, doFetch = (url, init) => fetch(url, init), timeoutMs = TIMEOUT_MS) {
71
+ const key = apiKeyFrom(env);
72
+ const host = env[ReticleEnv.CLOUD_URL];
73
+ if (key === undefined || 0 === key.length)
74
+ return undefined;
75
+ if (host === undefined || 0 === host.length)
76
+ return undefined;
77
+ const controller = new AbortController();
78
+ const timer = setTimeout(() => {
79
+ controller.abort();
80
+ }, timeoutMs);
81
+ try {
82
+ const res = await doFetch(`${host.replace(/\/+$/, '')}${CONFIG_PATH}`, {
83
+ method: 'GET',
84
+ headers: { authorization: `Bearer ${key}` },
85
+ signal: controller.signal,
86
+ });
87
+ if (!res.ok)
88
+ return undefined;
89
+ return parse(await res.text());
90
+ }
91
+ catch {
92
+ return undefined;
93
+ }
94
+ finally {
95
+ clearTimeout(timer);
96
+ }
97
+ }
@@ -6,6 +6,21 @@ import { ratioSchema } from '../../surface/tools/args/numeric-bounds.js';
6
6
  import { asNumber, asRecord, asString } from '@reticlehq/core';
7
7
  import { diffPng } from './visual-diff.js';
8
8
  import { VisualStore } from './visual-store.js';
9
+ /**
10
+ * The `.reticle` a capture belongs beside: the driven session's own, stamped when it connected.
11
+ *
12
+ * Falls back to the daemon's root only when there is no session to ask — the same fallback the
13
+ * journal and the run artifact use, and for the same reason: a picture of somebody's app has no
14
+ * business in a directory that has nothing to do with it.
15
+ */
16
+ function captureRoot(deps, sessionId) {
17
+ try {
18
+ return deps.sessions.resolve(sessionId).artifactRoot ?? deps.reticleRoot;
19
+ }
20
+ catch {
21
+ return deps.reticleRoot;
22
+ }
23
+ }
9
24
  import { trackCaptureDirectory } from './capture-cleanup.js';
10
25
  import { readFile, unlink } from 'node:fs/promises';
11
26
  import { tmpdir } from 'node:os';
@@ -253,7 +268,16 @@ export const VISUAL_TOOLS = [
253
268
  return reason === VisualReason.NO_PROVIDER ? noProvider : { ok: false, reason };
254
269
  }
255
270
  const name = asString(args['name']) ?? 'default';
256
- const store = new VisualStore(deps.fs, deps.reticleRoot);
271
+ // Beside the app that was captured. The tool RETURNS this path to the agent, so a wrong root
272
+ // is not only a stray PNG — it is a path the agent is told to look at in a tree that has
273
+ // nothing to do with the screenshot.
274
+ //
275
+ // Taken from the SESSION's own stamp rather than re-resolved, which is what `attach-journal`
276
+ // and the run artifact already do: the capture came from that session, so the answer is
277
+ // already in hand, and a second resolution is a second chance to disagree. It also keeps this
278
+ // directory from reaching into `project` for an address it was deliberately freed from
279
+ // needing — see `directory-reach`.
280
+ const store = new VisualStore(deps.fs, captureRoot(deps, sessionId));
257
281
  // Scoped to the runtime that produced it: an Electron window, a Tauri webview and a browser
258
282
  // tab do not render the same url the same way, and one shared baseline makes every
259
283
  // cross-runtime diff wrong. See visualDir.
@@ -292,7 +316,7 @@ export const VISUAL_TOOLS = [
292
316
  },
293
317
  handler: async (deps, args) => {
294
318
  const baseline = asString(args['baseline']) ?? '';
295
- const store = new VisualStore(deps.fs, deps.reticleRoot);
319
+ const store = new VisualStore(deps.fs, captureRoot(deps, asString(args['sessionId'])));
296
320
  // Capture FIRST, then fetch the baseline for the runtime that produced these pixels. Reading it
297
321
  // by the session's runtime looked equivalent and is not: the route decides the renderer, so a
298
322
  // desktop session captured through a driven browser must be compared against the WEB baseline,
package/dist/index.d.ts CHANGED
@@ -21,7 +21,7 @@ export type { RecordedStep, CompiledProgram } from './language/flows/recording/t
21
21
  export { FlowStore, recordedStepToFlowStep } from './language/flows/flows.js';
22
22
  export type { FlowResult } from './language/flows/flows.js';
23
23
  export type { Clock } from './machine/clock.js';
24
- export { assertSuccess, successToPredicate, dynamicTestids, successLabel, } from './language/flows/flow-success.js';
24
+ export { assertSuccess, dynamicTestids, successLabel, successToPredicate, } from './language/flows/flow-success.js';
25
25
  export { classifyFlowAssertions, FlowAssertionGrade } from './language/flows/flow-classify.js';
26
26
  export type { FlowAssertionClassification } from './language/flows/flow-classify.js';
27
27
  export { buildDomainModel } from './judgement/domain/domain-model.js';