@reticlehq/server 2.7.0 → 2.8.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 (236) hide show
  1. package/README.md +14 -5
  2. package/SKILL.md +64 -29
  3. package/dist/capsule/causal-summary.d.ts +20 -0
  4. package/dist/capsule/causal-summary.js +31 -6
  5. package/dist/capsule/divergence.js +7 -1
  6. package/dist/cli/chromium-hint.d.ts +33 -5
  7. package/dist/cli/chromium-hint.js +82 -12
  8. package/dist/cli/cli-doctor.js +28 -25
  9. package/dist/cli/cli-kill.d.ts +58 -0
  10. package/dist/cli/cli-kill.js +162 -0
  11. package/dist/cli/cli-launch.d.ts +17 -0
  12. package/dist/cli/cli-launch.js +28 -0
  13. package/dist/cli/cli-parse.d.ts +16 -1
  14. package/dist/cli/cli-parse.js +32 -9
  15. package/dist/cli/cli-port.d.ts +8 -0
  16. package/dist/cli/cli-port.js +16 -0
  17. package/dist/cli/cli-verify.js +2 -2
  18. package/dist/cli/doctor-sessions-line.d.ts +12 -0
  19. package/dist/cli/doctor-sessions-line.js +66 -0
  20. package/dist/cli/port-holder.d.ts +10 -0
  21. package/dist/cli/port-holder.js +26 -2
  22. package/dist/cli.js +99 -14
  23. package/dist/crawl/crawl-tools.js +12 -2
  24. package/dist/crawl/crawl.d.ts +13 -0
  25. package/dist/crawl/crawl.js +50 -2
  26. package/dist/events/contradictions.d.ts +14 -0
  27. package/dist/events/contradictions.js +26 -17
  28. package/dist/events/predicate-eval.d.ts +20 -1
  29. package/dist/events/predicate-eval.js +125 -3
  30. package/dist/events/predicate.js +170 -18
  31. package/dist/flows/flow-classify.js +1 -1
  32. package/dist/flows/flow-tools.js +12 -4
  33. package/dist/flows/heal-run.js +1 -1
  34. package/dist/honesty/blind-spots.js +6 -2
  35. package/dist/honesty/unsettled.d.ts +40 -0
  36. package/dist/honesty/unsettled.js +78 -0
  37. package/dist/honesty/verified.d.ts +7 -0
  38. package/dist/honesty/verified.js +3 -3
  39. package/dist/index.js +3 -0
  40. package/dist/init/agent-rules.d.ts +16 -0
  41. package/dist/init/agent-rules.js +96 -22
  42. package/dist/init/astro-patch.d.ts +2 -1
  43. package/dist/init/astro-patch.js +11 -5
  44. package/dist/init/capabilities.d.ts +22 -0
  45. package/dist/init/capabilities.js +76 -0
  46. package/dist/init/confirm.d.ts +96 -0
  47. package/dist/init/confirm.js +138 -0
  48. package/dist/init/cra.js +3 -2
  49. package/dist/init/non-js-project.js +29 -5
  50. package/dist/init/plan-framework.js +53 -15
  51. package/dist/init/plan.d.ts +40 -4
  52. package/dist/init/plan.js +163 -40
  53. package/dist/init/run.d.ts +24 -2
  54. package/dist/init/run.js +148 -42
  55. package/dist/init/slash-command.d.ts +1 -1
  56. package/dist/init/slash-command.js +46 -6
  57. package/dist/init/snippets.d.ts +44 -4
  58. package/dist/init/snippets.js +161 -37
  59. package/dist/init/vite-config.js +29 -3
  60. package/dist/input/network-mock-tools.d.ts +19 -0
  61. package/dist/input/network-mock-tools.js +29 -4
  62. package/dist/license/license.js +1 -1
  63. package/dist/mcp/mcp-proxy.d.ts +69 -3
  64. package/dist/mcp/mcp-proxy.js +205 -20
  65. package/dist/mcp/mcp.js +23 -7
  66. package/dist/mcp/proxy-lifecycle.d.ts +1 -1
  67. package/dist/mcp/proxy-lifecycle.js +1 -1
  68. package/dist/pool/browser-pool.d.ts +22 -2
  69. package/dist/pool/browser-pool.js +44 -4
  70. package/dist/project/learned-routes.d.ts +24 -0
  71. package/dist/project/learned-routes.js +63 -0
  72. package/dist/project/project-store.d.ts +6 -0
  73. package/dist/project/project-store.js +25 -1
  74. package/dist/session/no-session-diagnosis.d.ts +19 -0
  75. package/dist/session/no-session-diagnosis.js +71 -18
  76. package/dist/session/no-session-watch.js +12 -0
  77. package/dist/session/ref-provenance.d.ts +54 -0
  78. package/dist/session/ref-provenance.js +61 -0
  79. package/dist/session/session-lease.js +1 -1
  80. package/dist/telemetry/automation-hint.d.ts +17 -0
  81. package/dist/telemetry/automation-hint.js +71 -0
  82. package/dist/telemetry/bug-found.d.ts +0 -20
  83. package/dist/telemetry/bug-found.js +38 -21
  84. package/dist/telemetry/cli-telemetry.js +7 -1
  85. package/dist/telemetry/feedback.js +1 -1
  86. package/dist/telemetry/init-telemetry.js +9 -1
  87. package/dist/telemetry/install-source.d.ts +36 -0
  88. package/dist/telemetry/install-source.js +40 -0
  89. package/dist/telemetry/run-telemetry.js +4 -1
  90. package/dist/telemetry/session-metrics.js +5 -0
  91. package/dist/telemetry/telemetry.d.ts +5 -1
  92. package/dist/telemetry/telemetry.js +15 -2
  93. package/dist/telemetry/tool-refused.d.ts +19 -0
  94. package/dist/telemetry/tool-refused.js +55 -0
  95. package/dist/telemetry/verification-of.js +46 -7
  96. package/dist/temp-dir.d.ts +27 -0
  97. package/dist/temp-dir.js +46 -0
  98. package/dist/tools/act-tools.js +45 -1
  99. package/dist/tools/assert-grade.d.ts +1 -1
  100. package/dist/tools/assert-grade.js +27 -5
  101. package/dist/tools/assert-verdict.js +18 -1
  102. package/dist/tools/contract-tools.js +4 -0
  103. package/dist/tools/dynamic-tools.js +1 -1
  104. package/dist/tools/error-recovery.d.ts +10 -0
  105. package/dist/tools/error-recovery.js +64 -4
  106. package/dist/tools/feedback-invite.js +1 -1
  107. package/dist/tools/invoke-tool.js +139 -23
  108. package/dist/tools/lease-tools.d.ts +29 -1
  109. package/dist/tools/lease-tools.js +58 -5
  110. package/dist/tools/navigate-result.js +1 -1
  111. package/dist/tools/observe-tools.js +1 -1
  112. package/dist/tools/observed-nothing.js +1 -1
  113. package/dist/tools/react-grace.d.ts +48 -0
  114. package/dist/tools/react-grace.js +87 -0
  115. package/dist/tools/read-tools.js +20 -4
  116. package/dist/tools/settle-in-flight.d.ts +79 -0
  117. package/dist/tools/settle-in-flight.js +106 -0
  118. package/dist/tools/snapshot-delta.d.ts +7 -0
  119. package/dist/tools/snapshot-delta.js +130 -6
  120. package/dist/tools/tool-surface.js +19 -0
  121. package/dist/tools/tools.js +16 -4
  122. package/docs/README.md +56 -11
  123. package/docs/actions.mdx +87 -0
  124. package/docs/agent-cheatsheet.md +93 -29
  125. package/docs/architecture.md +46 -35
  126. package/docs/benchmarks.md +76 -72
  127. package/docs/best-practices.mdx +211 -0
  128. package/docs/capabilities.mdx +387 -0
  129. package/docs/cli/affected.mdx +51 -0
  130. package/docs/cli/capsules.mdx +69 -0
  131. package/docs/cli/cloud.mdx +127 -0
  132. package/docs/cli/doctor.mdx +76 -0
  133. package/docs/cli/drive.mdx +55 -0
  134. package/docs/cli/feedback.mdx +67 -0
  135. package/docs/cli/gate.mdx +64 -0
  136. package/docs/cli/help.mdx +92 -0
  137. package/docs/cli/hunt.mdx +57 -0
  138. package/docs/cli/identify.mdx +62 -0
  139. package/docs/cli/init.mdx +94 -0
  140. package/docs/cli/kill.mdx +91 -0
  141. package/docs/cli/license.mdx +48 -0
  142. package/docs/cli/mcp.mdx +61 -0
  143. package/docs/cli/open.mdx +68 -0
  144. package/docs/cli/restart.mdx +60 -0
  145. package/docs/cli/rollback.mdx +35 -0
  146. package/docs/cli/serve.mdx +62 -0
  147. package/docs/cli/status.mdx +64 -0
  148. package/docs/cli/stop.mdx +56 -0
  149. package/docs/cli/telemetry.mdx +57 -0
  150. package/docs/cli/update.mdx +52 -0
  151. package/docs/cli/verify.mdx +57 -0
  152. package/docs/cli/version.mdx +39 -0
  153. package/docs/cli/watch.mdx +55 -0
  154. package/docs/cli.mdx +219 -0
  155. package/docs/debugging.md +13 -9
  156. package/docs/deploy-checks.md +15 -11
  157. package/docs/desktop-apps.md +49 -40
  158. package/docs/desktop.mdx +188 -0
  159. package/docs/docs.json +363 -0
  160. package/docs/enterprise.md +20 -16
  161. package/docs/faq.mdx +88 -0
  162. package/docs/fixtures.md +11 -7
  163. package/docs/flows.md +26 -22
  164. package/docs/for-agents.md +71 -0
  165. package/docs/frameworks.mdx +199 -0
  166. package/docs/gate-plan.md +45 -41
  167. package/docs/gates.md +22 -18
  168. package/docs/getting-started.md +76 -65
  169. package/docs/human-control.md +22 -18
  170. package/docs/index.mdx +101 -0
  171. package/docs/install-agentic.mdx +215 -0
  172. package/docs/install-manual.mdx +194 -0
  173. package/docs/instrumentation.mdx +232 -0
  174. package/docs/integration-patterns.md +38 -34
  175. package/docs/local-registry.md +16 -12
  176. package/docs/multi-agent-testing.md +16 -12
  177. package/docs/packages/babel-plugin.mdx +70 -0
  178. package/docs/packages/browser.mdx +111 -0
  179. package/docs/packages/core.mdx +106 -0
  180. package/docs/packages/electron.mdx +87 -0
  181. package/docs/packages/eslint-plugin.mdx +84 -0
  182. package/docs/packages/next.mdx +91 -0
  183. package/docs/packages/react.mdx +91 -0
  184. package/docs/packages/server.mdx +98 -0
  185. package/docs/packages/tauri.mdx +63 -0
  186. package/docs/packages/test.mdx +108 -0
  187. package/docs/packages/vite-plugin.mdx +96 -0
  188. package/docs/packages.mdx +217 -0
  189. package/docs/platform-integration.md +33 -26
  190. package/docs/predicates.mdx +179 -0
  191. package/docs/quickstart.mdx +211 -0
  192. package/docs/recipes.mdx +242 -0
  193. package/docs/skill-file.mdx +105 -0
  194. package/docs/state-management.mdx +197 -0
  195. package/docs/style.css +14 -0
  196. package/docs/system-map.md +47 -32
  197. package/docs/telemetry-contract.md +93 -50
  198. package/docs/telemetry-events.mdx +430 -0
  199. package/docs/telemetry.md +57 -52
  200. package/docs/testing.md +10 -6
  201. package/docs/token-efficiency.md +30 -26
  202. package/docs/tools-act-and-wait.mdx +123 -0
  203. package/docs/tools-act-sequence.mdx +120 -0
  204. package/docs/tools-act.mdx +82 -0
  205. package/docs/tools-assert.mdx +70 -0
  206. package/docs/tools-console.mdx +59 -0
  207. package/docs/tools-inspect.mdx +85 -0
  208. package/docs/tools-navigate.mdx +63 -0
  209. package/docs/tools-network.mdx +86 -0
  210. package/docs/tools-observe.mdx +89 -0
  211. package/docs/tools-overview.mdx +157 -0
  212. package/docs/tools-query.mdx +82 -0
  213. package/docs/tools-session-and-feedback.mdx +91 -0
  214. package/docs/tools-sessions.mdx +65 -0
  215. package/docs/tools-snapshot.mdx +75 -0
  216. package/docs/tools-state.mdx +81 -0
  217. package/docs/tools-tools-and-run.mdx +125 -0
  218. package/docs/tools-wait-for.mdx +66 -0
  219. package/docs/troubleshooting.mdx +193 -0
  220. package/docs/usage.md +175 -153
  221. package/docs/vs-chrome-devtools-mcp.mdx +82 -0
  222. package/docs/vs-playwright-mcp.mdx +85 -0
  223. package/docs/vs-screenshots.mdx +96 -0
  224. package/docs/what-is-reticle.mdx +63 -0
  225. package/docs/why-reticle.mdx +107 -0
  226. package/package.json +2 -2
  227. package/docs/matrix/2.5.0/claude-code-machine.json +0 -19
  228. package/docs/matrix/2.5.0/codex-machine.json +0 -20
  229. package/docs/matrix/2.5.0/cursor-machine.json +0 -22
  230. package/docs/matrix/2.5.0/gemini-machine.json +0 -22
  231. package/docs/matrix/2.5.0/opencode-machine.json +0 -22
  232. package/docs/matrix/2.5.0/vscode-machine.json +0 -22
  233. package/docs/matrix/2.5.0/windsurf-machine.json +0 -22
  234. package/docs/matrix/MATRIX.md +0 -26
  235. package/docs/matrix/README.md +0 -59
  236. package/docs/mint.json +0 -61
@@ -0,0 +1,111 @@
1
+ ---
2
+ title: '@reticlehq/browser'
3
+ description: The Reticle instrumentation SDK that runs inside your page, observing the DOM, network, console, routing and state.
4
+ icon: window
5
+ ---
6
+
7
+ `@reticlehq/browser` is the half of Reticle that lives in your app. It installs the observers, builds semantic snapshots, executes actions, and talks to the bridge.
8
+
9
+ **Version 2.8.0. Apache 2.0. Depends on `@reticlehq/core` and `@testing-library/dom`.**
10
+
11
+ ## Why it exists
12
+
13
+ This is what makes Reticle different from a browser-automation tool. Because it runs _inside_ the app rather than driving it from outside, it can see a state mutation and a fired signal, not just a rendered pixel. It never imports a Node API; that boundary is enforced by the dependency graph.
14
+
15
+ `@testing-library/dom` is why [`reticle_query`](/tools-query) speaks role, label and testid instead of CSS selectors.
16
+
17
+ ## When you need it directly
18
+
19
+ Install it yourself when you are not on React, or when you want `connect()` under your own control. React users install [`@reticlehq/react`](/packages/react) instead, which re-exports everything here.
20
+
21
+ ```bash
22
+ npm i -D @reticlehq/browser
23
+ ```
24
+
25
+ ```ts
26
+ import { reticle } from '@reticlehq/browser';
27
+ if (import.meta.env.DEV) reticle.connect();
28
+ ```
29
+
30
+ ## The `reticle` singleton
31
+
32
+ One instance, memoized on `globalThis` so hot module replacement does not create a second one.
33
+
34
+ | Method | Signature |
35
+ | -------------- | -------------------------------------------------------- |
36
+ | `connect` | `(options?: ReticleConnectOptions) => void` |
37
+ | `connected` | `get connected(): boolean` |
38
+ | `signal` | `(name: string, data?: Record<string, unknown>) => void` |
39
+ | `state` | `(name: string, value: unknown) => void` |
40
+ | `renderCommit` | `(commits: number) => void` |
41
+ | `describe` | `(input: CapabilitiesInput) => void` |
42
+ | `endSession` | `() => void` |
43
+ | `disconnect` | `() => void` |
44
+
45
+ Everything else on the class is private. `Reticle` itself is exported for typing.
46
+
47
+ ## `ReticleConnectOptions`
48
+
49
+ Every field is optional.
50
+
51
+ | Option | Type | What it controls |
52
+ | --- | --- | --- |
53
+ | `url` | `string` | Bridge URL, when you are not on the default port |
54
+ | `session` | `string` | Session id. Defaults to the auto id (`SESSION_AUTO` is re-exported here) |
55
+ | `projectId` | `string` | Project identity stamped on the handshake |
56
+ | `token` | `string` | Pairing token, required for a non-loopback page |
57
+ | `allowNonLocalhost` | `boolean` | Opt in to connecting from a non-localhost origin |
58
+ | `allowInProduction` | `boolean` | Opt in to connecting from a production build. Desktop apps need this |
59
+ | `overlay` | `boolean` | The in-page overlay |
60
+ | `captureNetworkBodies` | `boolean` | Record request and response bodies |
61
+ | `root` | `string` | Repository root, so source paths come back relative |
62
+ | `sdkVersion` | `string` | Reported on the handshake for skew detection |
63
+ | `present` | `boolean` | Presenter mode |
64
+ | `pace` | `number` | Presenter pacing |
65
+ | `narrationDwellMs` | `number` | Presenter narration dwell |
66
+ | `border` | `'session' \| 'busy'` | Which border the overlay draws |
67
+ | `logMax` | `number` | Console buffer cap |
68
+ | `recorder` | `boolean` | Enable flow recording |
69
+ | `annotate` | `boolean` | Enable the human annotation layer |
70
+ | `endedFadeMs` | `number` | Fade after a session ends |
71
+ | `idleEndMs` | `number` | Idle timeout before the session ends itself |
72
+ | `redact` | `RedactionConfig` | Redaction policy, from core |
73
+
74
+ ## Capabilities
75
+
76
+ Declaring a capability surface is what lets an agent discover what your app can do without guessing.
77
+
78
+ ```ts
79
+ import { registerCapabilities } from '@reticlehq/browser';
80
+
81
+ registerCapabilities({
82
+ testids: ['login-submit'],
83
+ signals: ['auth:granted'],
84
+ stores: ['session'],
85
+ flows: [{ name: 'login', steps: ['fill email', 'fill password', 'submit'] }],
86
+ });
87
+ ```
88
+
89
+ Also exported: `getCapabilities()`, `hasCapabilities()`, `setCapabilitiesListener(cb?)`, and the `Capabilities`, `CapabilitiesInput` and `CapabilityFlow` types.
90
+
91
+ ## State adapters
92
+
93
+ Register a store and its contents become readable through [`reticle_state`](/tools-state).
94
+
95
+ `registerStore`, `unregisterStore`, `storeNames`, `readStores`, `readStoresWithTruncation`.
96
+
97
+ Ready-made adapters ship for TanStack Query, Jotai, XState, Valtio, MobX, Recoil, Svelte, Pinia, and a plain push store: `tanstackQueryStore`, `jotaiStore`, `xstateStore`, `valtioStore`, `mobxStore`, `recoilStore`, `svelteStore`, `piniaStore`, `pushStore`.
98
+
99
+ ## Framework adapters
100
+
101
+ `registerAdapter`, `identifyComponent`, `readComponentState`, `elementHasHoverHandlers`, `adapterNames`, with the `ReticleAdapter`, `ComponentInfo` and `ComponentSource` types. [`@reticlehq/react`](/packages/react) registers the React one.
102
+
103
+ ## Lower-level building blocks
104
+
105
+ Exported because the server and the test runner use them, and because an integration may need them: `buildSnapshot`, `matchQuery`, `runQuery`, `executeAction`, `executeSequence`, `describe`, `getRole`, `getAccessibleName`, `getStates`, `isVisible`, `refs`, `RefRegistry`, `setIgnoreSelectors`, `Annotator`, `installAnnotator`, `resolveMarkAnchor`, `inspectChart`, `canvasChartData`.
106
+
107
+ Signal helpers: `createReticleEmitter`, `commitAndSignal`, `registerReticleDomain`.
108
+
109
+ <Card title="Instrumenting an app properly" icon="plug" href="/instrumentation">
110
+ Signals, stores, and what makes evidence strong rather than circumstantial.
111
+ </Card>
@@ -0,0 +1,106 @@
1
+ ---
2
+ title: "@reticlehq/core"
3
+ description: The shared wire contract for Reticle: constants, zod schemas, and the isomorphic kernel every other package imports.
4
+ icon: cube
5
+ ---
6
+
7
+ `@reticlehq/core` is the bottom of the dependency graph. Every message that crosses a boundary, browser to bridge, bridge to agent, is defined here as a named constant plus a zod schema.
8
+
9
+ **Version 2.8.0. Apache 2.0. Depends on `zod` and nothing else.**
10
+
11
+ ## Why it exists
12
+
13
+ Without one shared definition the browser and the server drift. One side renames a field, the other keeps reading the old one, and the failure is silent: a verdict that quietly stops carrying its evidence. Core makes that a type error instead.
14
+
15
+ The single dependency is the point. Everything can depend on core without cycles, and nothing core does can drag a filesystem call into the browser bundle.
16
+
17
+ ## Do you install it?
18
+
19
+ No. It arrives as a dependency of `@reticlehq/browser`, `@reticlehq/react`, `@reticlehq/server`, `@reticlehq/vite-plugin` or `@reticlehq/electron`. Install it directly only if you are building your own integration against the wire format.
20
+
21
+ ```bash
22
+ npm i @reticlehq/core
23
+ ```
24
+
25
+ ## Exports map
26
+
27
+ | Subpath | What it is |
28
+ | --- | --- |
29
+ | `.` | The ESM barrel. Types at `dist/index.d.ts` |
30
+ | `./desktop-contract` | A CommonJS shim, generated at build, for the five strings the desktop adapters share |
31
+ | `./schema/*.json` | Generated JSON Schema for the wire types |
32
+ | `./package.json` | The manifest |
33
+
34
+ <Warning>
35
+ There is no `@reticlehq/core/vite` subpath. It was documented in an old README and never existed
36
+ in the exports map. The Vite plugin is [`@reticlehq/vite-plugin`](/packages/vite-plugin).
37
+ </Warning>
38
+
39
+ ## What the barrel exports
40
+
41
+ `src/index.ts` is a pure barrel: 26 `export *` re-exports plus one named export. Grouped by what they are for:
42
+
43
+ ### Wire constants
44
+
45
+ `RETICLE_DEFAULT_PORT` (`4400`), `RETICLE_WS_PATH` (`/reticle`), `MCP_SSE_PATH`, `MCP_MESSAGE_PATH`, `STATUS_PATH`, `RETICLE_PROTOCOL_VERSION` (`1`), `RETICLE_URL_PARAM`, `LOOPBACK_HOST` (`127.0.0.1`), `TRANSPORT_LIMITS`, `REDACTED_VALUE`, `RING_BUFFER_DEFAULTS`, `DEFAULT_ASSERT_TIMEOUT_MS` (`4000`), `VISUAL_PIXEL_THRESHOLD` (`0.1`), `SCROLL_FIND_DEFAULTS`, `CRAWL_DEFAULTS`.
46
+
47
+ ### Environment and directories
48
+
49
+ `ReticleEnv` names every environment variable Reticle reads: `RETICLE_TOKEN`, `RETICLE_HOST`, `RETICLE_ALLOWED_ORIGINS`, `RETICLE_PORT`, `RETICLE_STATE_DIR`, `RETICLE_CDP_URL`, `RETICLE_MAX_CONTEXTS`, `RETICLE_MAX_MESSAGES_PER_SECOND` and the rest. `ReticleDir` names the paths under `.reticle/`.
50
+
51
+ ### Enum-like frozen objects
52
+
53
+ `EventType`, `ActionType`, `ElementState`, `QueryBy`, `MessageKind`, `ReticleCommand`, `PhenomenonType`, `SettleReason`, `ComponentStateReason`, `ComponentStateResult`, `InputMode`, `InputModeReason`, `ActionWarning`, `DriveErrorCode`, `TruncationChannel`, `EventAttribution`, `PerfMetric`, `PresenterMode`, `SnapshotMode`, `VisualReason`, `CONSOLE_LEVELS`, `Verified`.
54
+
55
+ ### Zod schemas
56
+
57
+ `ReticleMessageSchema` (a discriminated union on `kind`) and its members `HelloMessageSchema`, `CommandMessageSchema`, `CommandResultSchema`, `EventMessageSchema`, plus `ReticleEventSchema`. Flows are `FlowStepSchema`, `FlowExpectSchema`, `FlowAnchorSchema`, `FlowFileSchema`, `RecordedFlowSchema`. CI runs are `ReticleVerificationRunSchema`, `RunVerdictSchema`, `RunFlowResultSchema`, `RunCheckSchema`, `RunRiskSchema`, `RepairPacketSchema`, `VerificationEvidenceSchema`. Telemetry is `TelemetryEventSchema`, `SessionSummarySchema`, `ProjectProfileSchema`, `FeedbackSchema`, `IdentitySchema`.
58
+
59
+ ### Kernel functions
60
+
61
+ Pure, isomorphic, and safe on both sides of the wire:
62
+
63
+ | Function | What it does |
64
+ | --- | --- |
65
+ | `fingerprintOf` / `CONTRACT_FINGERPRINT` | The contract hash the daemon and the SDK compare on handshake |
66
+ | `bridgeWsUrl` | Build the bridge WebSocket URL |
67
+ | `parseEventPayload`, `isHighValueEvent` | Narrow and rank inbound events |
68
+ | `isConsequenceKind`, `isPresenceKind`, `flowExpectHasConsequence`, `flowExpectIsPresenceOnly` | The consequence versus presence distinction the gate's anti-downgrade check runs on |
69
+ | `selectPath`, `capDepth`, `projectComponentState` | Bounded state projection |
70
+ | `isLoopbackHostname`, `isLocalPage`, `isOpaqueOrigin`, `isDangerousActionText` | The security predicates |
71
+ | `defaultIsSensitiveKey`, `buildRedactionPolicy`, `setActiveRedactionPolicy`, `isSensitiveKey`, `scrubKnownSecrets` | Redaction |
72
+ | `toToon`, `resultToToon`, `isToonable` | The compact result encoding |
73
+ | `projectIdFrom`, `slugifyPackageName` | Project identity |
74
+ | `pickDaemonPort`, `daemonRegistryFileName`, `daemonRegistryPort` | Daemon discovery |
75
+ | `isSessionScoped`, `isSessionState` | Session scoping |
76
+ | `buildUpgradeHint`, `isCloudCapability` | Upgrade hints |
77
+
78
+ ## The desktop contract
79
+
80
+ ```ts
81
+ import { DESKTOP_CONTRACT, RETICLE_IPC_GLOBAL } from '@reticlehq/core/desktop-contract';
82
+ ```
83
+
84
+ Five strings shared by the Electron preload and the Tauri crate, in CommonJS because a preload script is required before any ESM transform:
85
+
86
+ | Constant | Value |
87
+ | ------------------------------- | -------------------------------------------------------- |
88
+ | `RETICLE_IPC_GLOBAL` | `__reticleIpc` |
89
+ | `RETICLE_CAPTURE_CHANNEL` | `__reticle:capture` |
90
+ | `RETICLE_CAPTURE_FILE_PREFIX` | `reticle-capture-` |
91
+ | `RETICLE_TAURI_CAPTURE_COMMAND` | `reticle_capture` |
92
+ | `RETICLE_FULL_PAGE_UNSUPPORTED` | The `VisualReason` value for a refused full-page capture |
93
+
94
+ ## The JSON schemas
95
+
96
+ Seven files, generated at build from the zod definitions:
97
+
98
+ `reticle-message.json`, `reticle-event.json`, `hello-message.json`, `command-message.json`, `command-result.json`, `event-message.json`, `event-type.json`.
99
+
100
+ ```ts
101
+ import schema from '@reticlehq/core/schema/reticle-message.json' with { type: 'json' };
102
+ ```
103
+
104
+ <Card title="How the pieces fit" icon="sitemap" href="/architecture">
105
+ Where the contract sits between the SDK, the bridge, and the agent.
106
+ </Card>
@@ -0,0 +1,87 @@
1
+ ---
2
+ title: '@reticlehq/electron'
3
+ description: The Reticle adapter for Electron, making main-process IPC observable and the window screenshottable.
4
+ icon: display
5
+ ---
6
+
7
+ `@reticlehq/electron` reaches the two places the renderer cannot: the IPC boundary, and `capturePage()`.
8
+
9
+ **Version 2.8.0. Apache 2.0. Depends on `@reticlehq/core`. Peer dependency: `electron >= 22`. No build step.**
10
+
11
+ ## Why it exists
12
+
13
+ In Electron the interesting failures happen across IPC. The renderer asks the main process for something, the main process quietly fails, and the renderer-side SDK sees nothing at all. That reads as "this app makes no backend calls" rather than "you are blind to them".
14
+
15
+ ```bash
16
+ npm i -D @reticlehq/electron
17
+ ```
18
+
19
+ ## Exports map
20
+
21
+ There is no `.` export. Two subpaths only.
22
+
23
+ | Subpath | File | Shape |
24
+ | ----------- | ------------- | --------------------------------- |
25
+ | `./preload` | `preload.cjs` | Side effect only. Exports nothing |
26
+ | `./main` | `main.cjs` | `{ installReticleCapture }` |
27
+
28
+ ## The preload
29
+
30
+ ```js
31
+ // preload.js: this line must be FIRST
32
+ require('@reticlehq/electron/preload');
33
+
34
+ const { contextBridge, ipcRenderer } = require('electron');
35
+ // ... your own bridge setup
36
+ ```
37
+
38
+ <Warning>
39
+ It must run before `require('electron')` and before any `contextBridge.exposeInMainWorld` call. It
40
+ patches `ipcRenderer` while those methods are still writable, so ordering is not a style
41
+ preference.
42
+ </Warning>
43
+
44
+ It patches three methods, and each IPC call then surfaces to Reticle as a network record on `ipc://<channel>` with `initiator: 'ipc'`:
45
+
46
+ | Method | Recorded as |
47
+ | ---------------------- | ------------------------------------ |
48
+ | `ipcRenderer.invoke` | Two-way, with its outcome |
49
+ | `ipcRenderer.sendSync` | Two-way, with its outcome |
50
+ | `ipcRenderer.send` | One-way, dispatched, with no outcome |
51
+
52
+ It then exposes `window.__reticleIpc` through the context bridge, with three members used by the SDK rather than by you:
53
+
54
+ | Member | Signature | Notes |
55
+ | --- | --- | --- |
56
+ | `subscribe` | `(callback) => number` | Returns a token, or `-1` if the argument is not a function |
57
+ | `unsubscribe` | `(token) => void` | Real removal |
58
+ | `capture` | `(fullPage) => Promise<string \| null>` | Resolves to a capture file path, `null` when no main handler is installed, and propagates the explicit full-page refusal |
59
+
60
+ ## The main process
61
+
62
+ ```js
63
+ const { installReticleCapture } = require('@reticlehq/electron/main');
64
+
65
+ const win = new BrowserWindow({
66
+ /* ... */
67
+ });
68
+ installReticleCapture(win);
69
+ ```
70
+
71
+ `installReticleCapture(win): void` is a no-op on `null` or `undefined`, tracks the window until it closes, and registers the capture handler once for the whole app.
72
+
73
+ The handler calls `webContents.capturePage()`, writes the PNG into a per-process `0700` captures directory as `reticle-capture-<n>.png`, and **returns the file path rather than the bytes**, because the transport has a 64KB cap. It returns `null` on an empty image or any error, and it refuses `fullPage: true` explicitly rather than silently returning a viewport shot.
74
+
75
+ ## Renderer wiring
76
+
77
+ The renderer still needs the SDK. A packaged app is a production build, so the connect call has to opt in:
78
+
79
+ ```ts
80
+ reticle.connect({ allowInProduction: true });
81
+ ```
82
+
83
+ Or, with the Vite plugin, `reticle({ desktop: true })`.
84
+
85
+ <Card title="Desktop setup in full" icon="display" href="/desktop-apps">
86
+ Electron and Tauri wiring, and what `reticle doctor` checks for each.
87
+ </Card>
@@ -0,0 +1,84 @@
1
+ ---
2
+ title: '@reticlehq/eslint-plugin'
3
+ description: Two lint rules that keep Reticle's signal layer and its comment hygiene self-enforcing.
4
+ icon: shield-check
5
+ ---
6
+
7
+ `@reticlehq/eslint-plugin` exists because conventions rot. Someone adds a mutation, forgets the signal, and every verdict for that flow quietly drops a grade. Nothing breaks, the tests still pass, the evidence just gets weaker. A lint rule is the only way a convention survives contact with a deadline.
8
+
9
+ **Version 2.8.0. Apache 2.0. Depends on `@typescript-eslint/utils`. Peer dependency: `eslint >= 9`.**
10
+
11
+ ```bash
12
+ npm i -D @reticlehq/eslint-plugin
13
+ ```
14
+
15
+ ## Exports
16
+
17
+ | Export | What it is |
18
+ | ------------------------- | ------------------------------------------------------------------ |
19
+ | `default` | The plugin object: `{ meta: { name: 'reticle' }, rules, configs }` |
20
+ | `rules` | `{ 'require-signal-on-mutation': ..., 'no-internal-tags': ... }` |
21
+ | `requireSignalOnMutation` | The rule, exported individually |
22
+ | `noInternalTags` | The rule, exported individually |
23
+
24
+ ## The rules
25
+
26
+ ### `reticle/require-signal-on-mutation`
27
+
28
+ Warns when a store mutation happens without a mapped Reticle signal.
29
+
30
+ **Message id:** `mutationWithoutSignal`. **Text:** `store mutation without a mapped Reticle signal`.
31
+
32
+ **Options** (`options[0]`, no additional properties):
33
+
34
+ | Option | Type | Default |
35
+ | --- | --- | --- |
36
+ | `mutators` | `string[]` | `[]`. With the default the rule is a no-op, which is deliberate: name your own mutators |
37
+ | `signalCallee` | `string \| string[]` | `['reticleSignal', 'signal']` |
38
+
39
+ ```js
40
+ 'reticle/require-signal-on-mutation': ['warn', {
41
+ mutators: ['setState', 'commit', 'dispatch'],
42
+ signalCallee: ['reticleSignal'],
43
+ }]
44
+ ```
45
+
46
+ The check is scoped per function: a mutation and its signal must live in the same function body.
47
+
48
+ ### `reticle/no-internal-tags`
49
+
50
+ Errors on internal design-doc reference codes and internal version strings appearing in comments, file names, directory names or test descriptions. **Message id:** `internalTag`, with a `{ tag }` placeholder. No options.
51
+
52
+ This one is mostly for contributors to Reticle itself, but the `recommended` config turns it on for everyone.
53
+
54
+ ## The recommended config
55
+
56
+ One config, `recommended`:
57
+
58
+ ```js
59
+ import reticle from '@reticlehq/eslint-plugin';
60
+
61
+ export default [reticle.configs.recommended];
62
+ ```
63
+
64
+ Which is exactly:
65
+
66
+ ```js
67
+ {
68
+ plugins: { reticle: plugin },
69
+ rules: {
70
+ 'reticle/require-signal-on-mutation': 'warn',
71
+ 'reticle/no-internal-tags': 'error',
72
+ },
73
+ }
74
+ ```
75
+
76
+ <Warning>
77
+ `recommended` enables **both** rules, and `no-internal-tags` at `error`. An older README
78
+ documented only the first rule, so the second can arrive as a surprise. Enable the rules
79
+ individually if you want just the signal check.
80
+ </Warning>
81
+
82
+ <Card title="Why signals are the strongest evidence" icon="tower-broadcast" href="/instrumentation">
83
+ What a signal proves that a rendered pixel cannot.
84
+ </Card>
@@ -0,0 +1,91 @@
1
+ ---
2
+ title: '@reticlehq/next'
3
+ description: Next.js source mapping for Reticle without giving up SWC, via a dev-only loader.
4
+ icon: n
5
+ ---
6
+
7
+ `@reticlehq/next` gives Next.js users the same `data-reticle-source` stamping the Vite plugin does, without asking them to migrate to Babel.
8
+
9
+ **Version 2.8.0. Apache 2.0. CommonJS, no build step. Depends on `@babel/core` and `@reticlehq/babel-plugin`. Peer dependency: `next >= 13`.**
10
+
11
+ ## Why it exists
12
+
13
+ Next users are on SWC. Telling them to switch to Babel for a dev tool would be a rude trade, and it would slow down every build they run. This adds a dev-only pre-loader for `.jsx` and `.tsx` and leaves the rest of the pipeline alone.
14
+
15
+ ## Install and use
16
+
17
+ ```bash
18
+ npm i -D @reticlehq/next @reticlehq/react
19
+ ```
20
+
21
+ ```js
22
+ // next.config.js
23
+ const { withReticle } = require('@reticlehq/next');
24
+
25
+ module.exports = withReticle({
26
+ /* your config */
27
+ });
28
+ ```
29
+
30
+ <Note>
31
+ This package is CommonJS on purpose. `next.config.js` is loaded by Node before any ESM transform,
32
+ so an ESM-only helper would fail at the least helpful possible moment.
33
+ </Note>
34
+
35
+ ## Exports
36
+
37
+ ### `.`
38
+
39
+ ```ts
40
+ function withReticle<T = unknown>(nextConfig?: T): T;
41
+ ```
42
+
43
+ Returns the config unchanged when `NODE_ENV === 'production'`. Otherwise it merges in:
44
+
45
+ | Addition | What it does |
46
+ | --- | --- |
47
+ | `webpack` | Pushes an `enforce: 'pre'` rule for `/\.(t\|j)sx$/`, excluding `node_modules`, using this package's loader. Your own `webpack` function still runs afterwards |
48
+ | `turbopack` | On Next 15.3 and above only: rules for `*.tsx` and `*.jsx` pointing at `@reticlehq/next/loader` |
49
+ | `env.NEXT_PUBLIC_RETICLE_TOKEN` | The pairing token, when one exists on disk |
50
+ | `env.NEXT_PUBLIC_RETICLE_ROOT` | `process.cwd()`, so source paths come back repository-relative |
51
+ | `env.NEXT_PUBLIC_RETICLE_SDK_VERSION` | The version of the app's installed `@reticlehq/react` |
52
+
53
+ `readPairingToken()` is also exported at runtime. It is not declared in `index.d.ts`, so TypeScript will not see it.
54
+
55
+ ### `./loader`
56
+
57
+ ```ts
58
+ declare function reticleNextLoader(this: unknown, source: string, inputMap?: unknown): void;
59
+ export = reticleNextLoader;
60
+ ```
61
+
62
+ An async webpack loader. It skips anything that is not `.jsx` or `.tsx`, and anything under `node_modules`. It lazily imports `@reticlehq/babel-plugin` and runs `babel.transformAsync` with `configFile: false`, `babelrc: false`, `retainLines`, and source maps on.
63
+
64
+ <Note>
65
+ The loader never fails the build. Any error falls back to the original source, because a dev-only
66
+ source stamp is not worth breaking someone's `next dev` over.
67
+ </Note>
68
+
69
+ ## What it does not do
70
+
71
+ It does not inject `connect()`. On Next you call it yourself, once, in a client component:
72
+
73
+ ```tsx
74
+ 'use client';
75
+ import { useEffect } from 'react';
76
+ import { reticle, install } from '@reticlehq/react';
77
+
78
+ export function ReticleDev() {
79
+ useEffect(() => {
80
+ if (process.env.NODE_ENV !== 'production') {
81
+ install();
82
+ reticle.connect();
83
+ }
84
+ }, []);
85
+ return null;
86
+ }
87
+ ```
88
+
89
+ <Card title="Framework by framework" icon="layer-group" href="/frameworks">
90
+ What each supported stack needs, and what it gets for free.
91
+ </Card>
@@ -0,0 +1,91 @@
1
+ ---
2
+ title: '@reticlehq/react'
3
+ description: The React kit for Reticle, mapping a DOM node to its component stack, its hook state, and its source file.
4
+ icon: react
5
+ ---
6
+
7
+ `@reticlehq/react` is the package most React users install, and usually the only SDK package they need. It re-exports the whole browser SDK and adds the fiber-tree work on top.
8
+
9
+ **Version 2.8.0. Apache 2.0. Depends on `@reticlehq/browser` and `@reticlehq/core`. Peer dependency: `react >= 18`.**
10
+
11
+ ## Why it exists
12
+
13
+ This is the package that turns "the button is broken" into `src/components/Login.tsx:81`. Finding a bug is half the job; Reticle's answer to the other half lives here.
14
+
15
+ ```bash
16
+ npm i -D @reticlehq/react
17
+ ```
18
+
19
+ ## It re-exports the browser SDK
20
+
21
+ `export * from '@reticlehq/browser'` is in the barrel, so one install gives you `reticle`, `registerCapabilities`, every store adapter, and everything else on the [browser page](/packages/browser). You do not add `@reticlehq/browser` separately.
22
+
23
+ ```ts
24
+ import { reticle, install } from '@reticlehq/react';
25
+ install();
26
+ reticle.connect();
27
+ ```
28
+
29
+ ## Exports
30
+
31
+ ### Setup
32
+
33
+ | Export | Signature | What it does |
34
+ | --- | --- | --- |
35
+ | `install` | `(): void` | Idempotent. Registers the `react` adapter and installs the render meter. Call it once, before `connect()` |
36
+
37
+ The [Vite plugin](/packages/vite-plugin) injects exactly these two lines for you, so a Vite user never writes them.
38
+
39
+ ### Mapping a node to its component
40
+
41
+ | Export | Signature |
42
+ | ------------------ | ---------------------------------------- |
43
+ | `identify` | `(el: Element) => ComponentInfo \| null` |
44
+ | `readState` | `(el: Element) => ComponentStateResult` |
45
+ | `hasHoverHandlers` | `(el: Element) => boolean` |
46
+ | `relativeToRoot` | `(file: string) => string` |
47
+
48
+ `identify` walks the fiber tree to build the component stack and source location. `readState` reads hook state, bounded. `relativeToRoot` turns an absolute source path into a repository-relative one using the root the plugin stamped.
49
+
50
+ ### Render measurement
51
+
52
+ `installRenderMeter`, `resetRenderMeter`, `getRenderStats`, and the `RenderStats` type. This is what makes a render loop visible as a number rather than a hunch.
53
+
54
+ ### Hydration
55
+
56
+ `HYDRATION_COMPLETE_SIGNAL`, `createHydrationTracker`, type `HydrationTracker`.
57
+
58
+ ### Error boundaries
59
+
60
+ `buildErrorBoundaryData`, `reticleOnCaughtError`, type `ErrorBoundaryData`. Wire `reticleOnCaughtError` into React's `onCaughtError` and a boundary that swallows an error stops being invisible.
61
+
62
+ ### Hydration mismatches
63
+
64
+ `buildHydrationErrorData`, `isHydrationMismatch`, `reticleOnRecoverableError`, type `HydrationErrorData`.
65
+
66
+ ### Commits and CDP
67
+
68
+ `createCommitAggregator`, type `CommitAggregator`. `readComponentAt`, `buildReaderExpression`, `parseComponentRead`, type `CdpComponentRead`.
69
+
70
+ ## The `./store` subpath
71
+
72
+ One export, and the only module in the package that imports React:
73
+
74
+ ```ts
75
+ import { useReticleStore } from '@reticlehq/react/store';
76
+
77
+ function Cart() {
78
+ const [items, setItems] = useState([]);
79
+ useReticleStore('cart', items); // now readable via reticle_state
80
+ }
81
+ ```
82
+
83
+ `useReticleStore(name: string, value: unknown): void`.
84
+
85
+ ## Source mapping needs a build step
86
+
87
+ React 19 dropped `_debugSource`, so `identify` can name the component but not the file unless something stamps the source at build time. That is [`@reticlehq/babel-plugin`](/packages/babel-plugin), pulled in for you by [`@reticlehq/vite-plugin`](/packages/vite-plugin) or [`@reticlehq/next`](/packages/next).
88
+
89
+ <Card title="Reading component state" icon="layer-group" href="/state-management">
90
+ What `reticle_state` can see, and how to widen it.
91
+ </Card>
@@ -0,0 +1,98 @@
1
+ ---
2
+ title: '@reticlehq/server'
3
+ description: The Reticle bridge, MCP server, and the reticle CLI, all in one Node package.
4
+ icon: server
5
+ ---
6
+
7
+ `@reticlehq/server` hosts the WebSocket your app dials into, exposes the MCP tools your agent calls, and ships the `reticle` binary.
8
+
9
+ **Version 2.8.0. Licensed under `SEE LICENSE IN LICENSE`, not Apache 2.0 like the rest.** This is the package the enterprise terms apply to.
10
+
11
+ ## Why it exists
12
+
13
+ Agents speak MCP. Browsers speak WebSocket. Somebody has to be fluent in both, and own the `.reticle/` directory where flows, baselines, capsules and runs are stored. It never imports a DOM API.
14
+
15
+ ## Do you install it?
16
+
17
+ Not into your project. Your agent launches it:
18
+
19
+ ```bash
20
+ npx @reticlehq/server mcp
21
+ ```
22
+
23
+ The `bin` entry is `reticle`, so `npx @reticlehq/server <command>` works once it is on disk.
24
+
25
+ ## Dependencies
26
+
27
+ **Runtime:** `@modelcontextprotocol/sdk`, `@reticlehq/core`, `ws`, `zod`.
28
+
29
+ **Optional:** `playwright`, `pixelmatch`, `pngjs`. Optional on purpose: Reticle observes the browser you already have. You only need Playwright for the paths that launch or diff one, which is `reticle drive`, `reticle verify`, and visual baselines.
30
+
31
+ ## Exports map
32
+
33
+ | Subpath | What it is |
34
+ | ------- | -------------------------------------------------------------------------------------- |
35
+ | `.` | The programmatic API |
36
+ | `./cli` | The CLI entry, which also exports `parseCliArgs`, `CLI_USAGE` and the `CliResult` type |
37
+
38
+ ## Starting a server in process
39
+
40
+ ```ts
41
+ import { start, startDaemon, type StartOptions, type RunningServer } from '@reticlehq/server';
42
+
43
+ const server: RunningServer = await start({ port: 4400, headless: true });
44
+ await server.close();
45
+ ```
46
+
47
+ `start(options?: StartOptions): Promise<RunningServer>` boots the bridge plus the MCP stdio transport. `startDaemon(options?: StartOptions): Promise<RunningServer>` is what the detached daemon runs.
48
+
49
+ ### `StartOptions`
50
+
51
+ | Option | Type | Default |
52
+ | --- | --- | --- |
53
+ | `port` | `number` | `RETICLE_PORT`, else `4400` |
54
+ | `host` | `string` | `RETICLE_HOST`, else loopback. A non-loopback host requires a token |
55
+ | `token` | `string` | `RETICLE_TOKEN` |
56
+ | `allowedOrigins` | `string[]` | `RETICLE_ALLOWED_ORIGINS` |
57
+ | `mcp` | `boolean` | `true`. `false` skips the stdio transport |
58
+ | `cdpUrl` | `string` | `RETICLE_CDP_URL`. Attach to a running browser instead of launching one |
59
+ | `driveUrl` | `string` | unset |
60
+ | `headless` | `boolean` | `true` |
61
+ | `realInputFactory` | `(opts) => OwnedRealInputProvider` | built in |
62
+ | `injectConnect` | `InjectConnectOptions` | unset |
63
+ | `storageState` | `string` | unset |
64
+ | `reticleRoot` | `string` | `cwd()/.reticle` |
65
+ | `pairingTokenDir` | `string` | `~/.reticle` |
66
+ | `now` | `() => number` | `Date.now` |
67
+ | `toolProfile` | `string` | `RETICLE_TOOL_PROFILE`, else `full`. `core` serves the lean surface |
68
+ | `httpVerify` | `boolean` | `false` |
69
+ | `httpVerifyPort` | `number` | `RETICLE_VERIFY_DEFAULT_PORT` (`7331`) |
70
+ | `httpVerifyToken` | `string` | `RETICLE_VERIFY_TOKEN` |
71
+
72
+ ### `RunningServer`
73
+
74
+ `bridge: Bridge`, `close(): Promise<void>`, and the optional `realInput`, `verifyPort`, `isIdle()`, `agentAttached()`, `token`.
75
+
76
+ ## What else the barrel exports
77
+
78
+ A large surface, because the test runner and the CI paths are built on it. The families:
79
+
80
+ | Family | Representative exports |
81
+ | --- | --- |
82
+ | Tools | `TOOLS`, `ReticleTool`, `runTool`, `createToolInvoker`, `filterTools`, `resolveToolSurface`, `CORE_TOOL_NAMES`, `SESSION_BOUND_TOOLS`, `SESSION_EXEMPT_TOOLS` |
83
+ | Bridge and sessions | `Bridge`, `Session`, `SessionManager`, `RingBuffer`, `resolveBridgeSecurity`, `buildSessionRecommendation` |
84
+ | Stores on disk | `FlowStore`, `BaselineStore`, `VisualStore`, `RecordingStore`, `RunStore`, `ProjectStore`, `AnnotationStore`, `createNodeFileSystem`, `reticleDirPaths`, `readContract`, `writeContract` |
85
+ | Flow replay | `replayFlow`, `assertSuccess`, `successToPredicate`, `classifyFlowAssertions`, `FlowAssertionGrade`, `nearestTestid` |
86
+ | Runs and CI | `ReticleRunner`, `buildVerificationRun`, `computeVerdict`, `renderRunReport`, `buildRepairPacket`, `classifyChangedFiles`, `buildRisks`, `redactForProfile` |
87
+ | HTTP verify | `handleVerifyRequest`, `createVerifyRequestListener`, `startVerifyServer`, `VERIFY_PATH`, `TOKEN_HEADER`, `tokenOk` |
88
+ | Predicates | `evaluatePredicate`, `waitForPredicate`, `PredicateSchema`, `buildReactionReport` |
89
+ | Browser pool | `BrowserPool`, `playwrightLauncher`, `resolveMaxContexts`, `DEFAULT_LEASE_TTL_MS` |
90
+ | Real input | `CdpRealInputProvider`, `LaunchedRealInputProvider`, `performGesture`, `boxCenter`, `isPointerAction`, `DriveError` |
91
+ | Daemon lifecycle | `writePid`, `readPid`, `removePid`, `isRunning`, `isAlive`, `logPath`, `classifyDaemonLife`, `DAEMON_HEARTBEAT_MS` |
92
+ | Crawl and scroll | `crawl`, `scrollToFind` |
93
+ | Visual | `diffPng` |
94
+ | Domain model | `buildDomainModel` |
95
+
96
+ <Card title="Every CLI command" icon="terminal" href="/cli">
97
+ The commands this package installs, one page each.
98
+ </Card>