@reticlehq/server 3.8.1 → 3.9.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.
- package/LICENSE +201 -104
- package/NOTICE +5 -0
- package/README.md +1 -1
- package/bin/launch.js +13 -0
- package/bin/package.json +3 -0
- package/bin/reticle.js +66 -8
- package/dist/chromium-launch-options.d.ts +25 -0
- package/dist/chromium-launch-options.js +21 -1
- package/dist/command/cli/adhoc-verdict.js +34 -7
- package/dist/command/cli/answers/gate-exit.d.ts +6 -2
- package/dist/command/cli/answers/gate-exit.js +12 -2
- package/dist/command/cli/ci-hint.d.ts +44 -0
- package/dist/command/cli/ci-hint.js +72 -0
- package/dist/command/cli/cli-doctor.d.ts +6 -1
- package/dist/command/cli/cli-doctor.js +45 -4
- package/dist/command/cli/cli-flow-commands.d.ts +7 -1
- package/dist/command/cli/cli-flow-commands.js +39 -17
- package/dist/command/cli/cli-kill.d.ts +21 -0
- package/dist/command/cli/cli-kill.js +46 -3
- package/dist/command/cli/cli-parse.d.ts +5 -2
- package/dist/command/cli/cli-parse.js +10 -5
- package/dist/command/cli/cli-usage.js +3 -2
- package/dist/command/cli/cli-verify.d.ts +6 -1
- package/dist/command/cli/cli-verify.js +32 -13
- package/dist/command/cli/doctor/browser/chromium-hint.d.ts +6 -1
- package/dist/command/cli/doctor/browser/chromium-hint.js +11 -5
- package/dist/command/cli/doctor/doctor-fix.d.ts +44 -0
- package/dist/command/cli/doctor/doctor-fix.js +89 -0
- package/dist/command/cli/doctor/doctor-launcher-line.d.ts +23 -0
- package/dist/command/cli/doctor/doctor-launcher-line.js +60 -0
- package/dist/command/cli/doctor/doctor-rows.d.ts +4 -0
- package/dist/command/cli/doctor/doctor-rows.js +4 -0
- package/dist/command/cli/doctor-repairs.d.ts +64 -0
- package/dist/command/cli/doctor-repairs.js +214 -0
- package/dist/command/cli/drive/drive-command.js +3 -7
- package/dist/command/cli/first-use-checks.d.ts +41 -0
- package/dist/command/cli/first-use-checks.js +127 -0
- package/dist/command/cli/first-verdict-node.d.ts +3 -0
- package/dist/command/cli/first-verdict-node.js +189 -0
- package/dist/command/cli/first-verdict.d.ts +126 -0
- package/dist/command/cli/first-verdict.js +267 -0
- package/dist/command/cli/launch/sdk-version-match.d.ts +3 -2
- package/dist/command/cli/launch/sdk-version-match.js +3 -2
- package/dist/command/cli/lifecycle/daemon-lifecycle.js +6 -5
- package/dist/command/cli/mcp-command.js +13 -4
- package/dist/command/cli/ports/port-holder.d.ts +2 -0
- package/dist/command/cli/ports/port-holder.js +11 -3
- package/dist/command/cli/setup-mcp-cli.d.ts +27 -1
- package/dist/command/cli/setup-mcp-cli.js +98 -23
- package/dist/command/cli/status/status-lines.d.ts +1 -0
- package/dist/command/cli/status/status-lines.js +50 -17
- package/dist/command/cli/status-fields.js +17 -3
- package/dist/command/cli/try-command.d.ts +7 -0
- package/dist/command/cli/try-command.js +11 -3
- package/dist/command/cli.js +70 -33
- package/dist/command/daemon/binding/daemon-status-probe.d.ts +3 -1
- package/dist/command/daemon/binding/daemon-status-probe.js +4 -2
- package/dist/command/daemon/daemon-argv.d.ts +9 -0
- package/dist/command/daemon/daemon-argv.js +11 -0
- package/dist/command/daemon/daemon.d.ts +10 -3
- package/dist/command/daemon/daemon.js +17 -6
- package/dist/command/daemon/lifetime/daemon-exit.d.ts +24 -0
- package/dist/command/daemon/lifetime/daemon-exit.js +39 -0
- package/dist/command/daemon/lifetime/death-cause.d.ts +15 -0
- package/dist/command/daemon/lifetime/death-cause.js +130 -0
- package/dist/command/daemon/lifetime/heartbeat.d.ts +7 -15
- package/dist/command/daemon/lifetime/heartbeat.js +4 -13
- package/dist/command/daemon/port-state.d.ts +14 -0
- package/dist/command/daemon/port-state.js +31 -0
- package/dist/command/setup/agent-configs.d.ts +2 -0
- package/dist/command/setup/agent-configs.js +42 -15
- package/dist/command/setup/agent-next-steps.d.ts +77 -0
- package/dist/command/setup/agent-next-steps.js +284 -0
- package/dist/command/setup/agent-writer.js +11 -6
- package/dist/command/setup/init/init-host.js +2 -0
- package/dist/command/setup/init/init-runtime.d.ts +6 -1
- package/dist/command/setup/init/init-runtime.js +57 -21
- package/dist/command/setup/mcp-launcher.d.ts +3 -0
- package/dist/command/setup/mcp-launcher.js +11 -0
- package/dist/command/setup/setup-command.js +30 -12
- package/dist/command/setup/setup-mcp.d.ts +8 -0
- package/dist/command/setup/setup-mcp.js +47 -20
- package/dist/command/setup/start-dev-server.d.ts +8 -0
- package/dist/command/setup/start-dev-server.js +43 -0
- package/dist/command/version/identity/server-version.d.ts +2 -0
- package/dist/command/version/identity/server-version.js +2 -0
- package/dist/command/version/version-skew.d.ts +7 -0
- package/dist/command/version/version-skew.js +13 -2
- package/dist/features/license/license.d.ts +11 -71
- package/dist/features/license/license.js +43 -136
- package/dist/features/visual/desktop-capture.d.ts +33 -0
- package/dist/features/visual/desktop-capture.js +94 -0
- package/dist/features/visual/step-shots.js +139 -35
- package/dist/features/visual/visual-tools.d.ts +0 -18
- package/dist/features/visual/visual-tools.js +2 -81
- package/dist/import-graph.js +5 -6
- package/dist/index.d.ts +3 -1
- package/dist/index.js +14 -5
- package/dist/judgement/runs/run-ledger.d.ts +7 -5
- package/dist/judgement/runs/run-ledger.js +98 -69
- package/dist/judgement/runs/verification-sync.d.ts +6 -3
- package/dist/judgement/runs/verification-sync.js +21 -10
- package/dist/language/flows/flow-store-for-session.js +7 -5
- package/dist/language/flows/recording/tape/recordings.d.ts +2 -13
- package/dist/language/flows/recording/tape/recordings.js +41 -44
- package/dist/language/flows/replay.d.ts +17 -7
- package/dist/language/flows/replay.js +95 -44
- package/dist/launch-chromium.d.ts +1 -0
- package/dist/launch-chromium.js +49 -12
- package/dist/memory/cloud/sync-screenshots.js +6 -1
- package/dist/portal/bridge/bridge.d.ts +13 -4
- package/dist/portal/bridge/bridge.js +10 -9
- package/dist/portal/input/drive-error.d.ts +6 -0
- package/dist/portal/input/drive-error.js +9 -0
- package/dist/portal/input/network-mock.js +3 -2
- package/dist/portal/input/real-input-press.d.ts +34 -0
- package/dist/portal/input/real-input-press.js +150 -0
- package/dist/portal/input/real-input.d.ts +21 -23
- package/dist/portal/input/real-input.js +153 -194
- package/dist/portal/input/viewport-tools.js +6 -3
- package/dist/portal/pool/browser-pool.d.ts +5 -1
- package/dist/portal/pool/browser-pool.js +32 -38
- package/dist/portal/pool/context-permissions.d.ts +20 -17
- package/dist/portal/pool/context-permissions.js +63 -1
- package/dist/portal/pool/csp-widen.d.ts +62 -0
- package/dist/portal/pool/csp-widen.js +132 -0
- package/dist/portal/pool/lease-page-error.d.ts +29 -0
- package/dist/portal/pool/lease-page-error.js +18 -0
- package/dist/portal/pool/page-error-journal.d.ts +57 -0
- package/dist/portal/pool/page-error-journal.js +181 -0
- package/dist/portal/pool/playwright-launcher.js +21 -8
- package/dist/portal/pool/pool-contract.d.ts +22 -0
- package/dist/portal/pool/pool-lease.d.ts +35 -2
- package/dist/portal/pool/pool-lease.js +23 -0
- package/dist/portal/pool/zero-install.js +69 -1
- package/dist/portal/session/dev-server/dev-command.d.ts +8 -0
- package/dist/portal/session/dev-server/dev-command.js +56 -8
- package/dist/portal/session/no-session-diagnosis.js +10 -3
- package/dist/portal/session/no-session-next-action.d.ts +12 -0
- package/dist/portal/session/no-session-next-action.js +44 -4
- package/dist/portal/session/no-session-watch.js +3 -1
- package/dist/portal/session/page-commands/undeclared-command.d.ts +9 -3
- package/dist/portal/session/page-commands/undeclared-command.js +16 -7
- package/dist/portal/session/recorded-gaps.d.ts +1 -1
- package/dist/portal/session/recorded-gaps.js +5 -2
- package/dist/portal/session/session-manager.js +40 -21
- package/dist/portal/session/session.js +4 -3
- package/dist/portal/session/zero-install-first-call.d.ts +20 -1
- package/dist/portal/session/zero-install-first-call.js +34 -2
- package/dist/start-wiring.d.ts +29 -2
- package/dist/start-wiring.js +73 -9
- package/dist/surface/mcp/mcp-proxy.js +10 -2
- package/dist/surface/mcp/mcp.js +5 -3
- package/dist/surface/mcp/peer/agents-connected.d.ts +6 -0
- package/dist/surface/mcp/peer/agents-connected.js +58 -0
- package/dist/surface/mcp/proxy/proxy-daemon-probe.js +17 -5
- package/dist/surface/tools/act/act-preflight.js +37 -17
- package/dist/surface/tools/act/act-target.js +3 -1
- package/dist/surface/tools/act/after-match.d.ts +7 -0
- package/dist/surface/tools/act/after-match.js +33 -0
- package/dist/surface/tools/act/resolve-target.d.ts +2 -0
- package/dist/surface/tools/act/resolve-target.js +35 -8
- package/dist/surface/tools/act/sequence-grade.d.ts +3 -1
- package/dist/surface/tools/act/sequence-grade.js +8 -1
- package/dist/surface/tools/act-sequence-tool.js +3 -0
- package/dist/surface/tools/act-tools.js +12 -12
- package/dist/surface/tools/assert/assert-verdict.js +28 -1
- package/dist/surface/tools/browser-tools.js +75 -7
- package/dist/surface/tools/dynamic-tools.js +2 -1
- package/dist/surface/tools/empty-session-list.d.ts +2 -0
- package/dist/surface/tools/empty-session-list.js +4 -2
- package/dist/surface/tools/error-recovery.js +43 -22
- package/dist/surface/tools/invoke-tool.js +27 -20
- package/dist/surface/tools/lease-hint.d.ts +7 -0
- package/dist/surface/tools/lease-hint.js +10 -3
- package/dist/surface/tools/lease-readiness.d.ts +21 -0
- package/dist/surface/tools/lease-readiness.js +47 -0
- package/dist/surface/tools/lease-seed.d.ts +2 -0
- package/dist/surface/tools/lease-seed.js +2 -1
- package/dist/surface/tools/lease-tools.js +43 -15
- package/dist/surface/tools/real-input-attempt.js +70 -31
- package/dist/surface/tools/repeat-hint.d.ts +40 -0
- package/dist/surface/tools/repeat-hint.js +171 -0
- package/dist/surface/tools/run-report.d.ts +2 -2
- package/dist/surface/tools/run-report.js +27 -15
- package/dist/surface/tools/tool-kit.d.ts +12 -0
- package/dist/surface/tools/tool-kit.js +7 -0
- package/dist/surface/tools/tools.js +26 -13
- package/dist/telemetry/argument-shape.js +16 -7
- package/dist/telemetry/cli-telemetry.d.ts +10 -1
- package/dist/telemetry/cli-telemetry.js +15 -0
- package/dist/telemetry/init-telemetry.d.ts +2 -1
- package/dist/telemetry/init-telemetry.js +47 -2
- package/dist/telemetry/install-trace.js +23 -4
- package/dist/telemetry/onboarding-funnel.d.ts +19 -2
- package/dist/telemetry/onboarding-funnel.js +25 -3
- package/dist/telemetry/proxy-telemetry.d.ts +2 -1
- package/dist/telemetry/proxy-telemetry.js +2 -2
- package/dist/telemetry/session-metrics.d.ts +1 -1
- package/dist/telemetry/session-metrics.js +67 -27
- package/dist/telemetry/telemetry.d.ts +3 -1
- package/dist/telemetry/telemetry.js +60 -28
- package/dist/telemetry/tool-refused.d.ts +2 -2
- package/dist/telemetry/tool-refused.js +9 -2
- package/docs/architecture.md +3 -6
- package/docs/cli/doctor.mdx +41 -2
- package/docs/cli/help.mdx +4 -2
- package/docs/cli/license.mdx +4 -5
- package/docs/cli/setup.mdx +13 -2
- package/docs/cli/status.mdx +4 -0
- package/docs/cli.mdx +1 -1
- package/docs/deploy-checks.md +25 -0
- package/docs/desktop.mdx +1 -1
- package/docs/enterprise.md +15 -20
- package/docs/environment.mdx +1 -0
- package/docs/first-drive.md +1 -1
- package/docs/install-manual.mdx +16 -1
- package/docs/packages/engine.mdx +1 -1
- package/docs/packages/react.mdx +14 -2
- package/docs/packages/server.mdx +1 -1
- package/docs/packages/tauri.mdx +1 -1
- package/docs/packages/test.mdx +1 -1
- package/docs/packages/vite-plugin.mdx +1 -0
- package/docs/packages.mdx +1 -1
- package/docs/platform-integration.md +1 -1
- package/docs/skill.md +1 -1
- package/docs/telemetry.md +4 -2
- package/package.json +14 -10
- package/LICENSE-ENTERPRISE +0 -37
- package/dist/features/ee/audit-log.d.ts +0 -14
- package/dist/features/ee/audit-log.js +0 -11
package/docs/cli/license.mdx
CHANGED
|
@@ -20,17 +20,16 @@ One `reticle_license` JSON line, on stderr. On a checkout with no issuer key con
|
|
|
20
20
|
{
|
|
21
21
|
"t": "2026-08-15T18:42:26.758Z",
|
|
22
22
|
"event": "reticle_license",
|
|
23
|
-
"gated": ["audit-log"],
|
|
24
23
|
"contact": "hey@reticle.sh",
|
|
25
24
|
"status": "eval",
|
|
26
|
-
"detail": "evaluation mode
|
|
25
|
+
"detail": "evaluation mode (no issuer key configured)"
|
|
27
26
|
}
|
|
28
27
|
```
|
|
29
28
|
|
|
30
29
|
| `status` | Meaning |
|
|
31
30
|
| --------- | --------------------------------------------------- |
|
|
32
31
|
| `active` | A valid license is present |
|
|
33
|
-
| `eval` | Evaluation mode.
|
|
32
|
+
| `eval` | Evaluation mode. No issuer key is configured |
|
|
34
33
|
| `missing` | No license, and the build expects one |
|
|
35
34
|
| `expired` | The key verified, but its expiry has passed |
|
|
36
35
|
| `invalid` | The key was rejected, or the build is misconfigured |
|
|
@@ -47,6 +46,6 @@ Always `0`.
|
|
|
47
46
|
npx @reticlehq/server license 2>&1 | jq -r .status
|
|
48
47
|
```
|
|
49
48
|
|
|
50
|
-
<Card title="
|
|
51
|
-
|
|
49
|
+
<Card title="Enterprise" icon="building" href="/enterprise">
|
|
50
|
+
License keys, the roadmap, and the licensing model.
|
|
52
51
|
</Card>
|
package/docs/cli/setup.mdx
CHANGED
|
@@ -14,10 +14,21 @@ No flags, and nothing is asked. It works for your user account, not for one proj
|
|
|
14
14
|
|
|
15
15
|
## What it prints
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
A `Your agents:` block, with one line for each agent and the one next step for that agent:
|
|
18
|
+
|
|
19
|
+
```text
|
|
20
|
+
Your agents:
|
|
21
|
+
Claude Code plugin active: type /reload-plugins if it is open
|
|
22
|
+
Cursor added: restart Cursor, then turn Reticle on in Settings › MCP
|
|
23
|
+
Codex added: restart Codex, then /mcp shows reticle
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
`already set up` means that Reticle was there already. `registration failed` gives the command to retry, and the command then exits `1`. `not added: add the reticle entry to <path> by hand` is for a config that it does not rewrite. If it finds no agent, it names every agent it looked for.
|
|
27
|
+
|
|
28
|
+
In a terminal, and not in CI, it then waits up to 60 seconds for each agent to connect. Then it prints `Connected: <agent> ✓`, or the step that is still missing for that agent. Press Ctrl+C to stop the wait. [`reticle status`](/cli/status) shows the same lines later.
|
|
18
29
|
|
|
19
30
|
## How you know it worked
|
|
20
31
|
|
|
21
|
-
|
|
32
|
+
Do the next step for your agent. Most agents read their server list only when they start. The Claude Code plugin loads with `/reload-plugins`. Then the `reticle_*` tools are listed, and `reticle status` shows `Connected: <agent> ✓`.
|
|
22
33
|
|
|
23
34
|
Codex CLI keeps a TOML config. When the `codex` binary is on your PATH, Reticle registers through `codex mcp add`. Otherwise it prints the hand-edit lines above. Reticle then adds one line, `default_tools_approval_mode = "approve"`, under `[mcp_servers.reticle]` in `~/.codex/config.toml`. This line approves Reticle's own tools, so Codex does not ask before each call. Reticle changes no other line, and it keeps a mode that you set. To undo it, change that line to `default_tools_approval_mode = "prompt"`. Reticle does not change a mode that is already there.
|
package/docs/cli/status.mdx
CHANGED
|
@@ -35,8 +35,12 @@ reticle status
|
|
|
35
35
|
http://localhost:5173/ (throttled, hidden)
|
|
36
36
|
http://localhost:7699/ (throttled, hidden)
|
|
37
37
|
agent link ✓ your agent has read and used Reticle's tools
|
|
38
|
+
agents Connected: Claude Code ✓
|
|
39
|
+
Cursor not connected yet: restart Cursor, then turn Reticle on in Settings › MCP
|
|
38
40
|
```
|
|
39
41
|
|
|
42
|
+
The `agents` row has one line for each coding agent on this machine. A line shows `✓` when that agent connected to Reticle at least one time. Otherwise it shows the step that is still missing. `reticle setup mcp` prints the same lines.
|
|
43
|
+
|
|
40
44
|
And with no daemon on the port:
|
|
41
45
|
|
|
42
46
|
```text
|
package/docs/cli.mdx
CHANGED
|
@@ -197,7 +197,7 @@ policy https://github.com/reticlehq/reticle/blob/main/docs/telemetry.md
|
|
|
197
197
|
| `reticle drive <url>` | Foreground mode, for debugging |
|
|
198
198
|
| `reticle mcp` | The MCP stdio proxy. Auto-starts the daemon if needed. This is what your agent runs |
|
|
199
199
|
|
|
200
|
-
A bare `reticle` with no arguments is not help.
|
|
200
|
+
A bare `reticle` with no arguments is not help. In a project that `init` wired, it is `reticle serve`. In a folder that Reticle has not wired, it gives a first verdict with no agent and no `init`. It finds the folder's web app (it starts the dev script when the app does not run), or the one dev server that runs on this computer. It opens the page in a Reticle browser and checks four things: the page loads, no console error, no failed request, and each same-origin link opens (8 at most). It prints `verified: yes` or `verified: no` with each fault, and exits 0 only for `yes`. A page that goes to a sign-in page is verified up to there. It stops the dev server it started.
|
|
201
201
|
|
|
202
202
|
<Note>
|
|
203
203
|
When the Reticle SDK installed in the project is a different **major** version from the CLI you ran,
|
package/docs/deploy-checks.md
CHANGED
|
@@ -12,6 +12,8 @@ That makes the non-developer story complete: the SDK is auto-injected by the bui
|
|
|
12
12
|
|
|
13
13
|
> **Recipe A works today; Recipe B does not exist yet.** `reticle verify` exits 0/1 and persists a run artifact right now. What is _not_ built is a hosted Reticle app that registers itself as a Vercel or Netlify check provider. Until it exists, use the CI recipe.
|
|
14
14
|
|
|
15
|
+
Using Reticle in CI or in a pipeline? Talk to a founder: [book a call](https://calendar.app.google/h9NRDbBBQetyTzWM6) or write to [hey@reticle.sh](mailto:hey@reticle.sh).
|
|
16
|
+
|
|
15
17
|
## The shape
|
|
16
18
|
|
|
17
19
|
```
|
|
@@ -54,6 +56,29 @@ The job's own pass/fail becomes the PR check. Nothing else is required.
|
|
|
54
56
|
|
|
55
57
|
**Non-loopback previews need pairing.** For a real preview URL (not `localhost`), Reticle injects `reticle.connect()` with a one-time token and allow-lists the preview origin, so the app does not need to be rebuilt per environment. Confirm the SDK actually runs on the deployed build: a production build that tree-shakes the dev-only SDK will connect to nothing, and `verify` will (correctly) fail with _"no app connected."_
|
|
56
58
|
|
|
59
|
+
## The Reticle GitHub Action
|
|
60
|
+
|
|
61
|
+
The Action replays your saved flows on each preview and posts one check with a verdict for each flow. On `deployment_status`, it reads the preview URL from the event, so you type no URL.
|
|
62
|
+
|
|
63
|
+
```yaml
|
|
64
|
+
# .github/workflows/reticle.yml
|
|
65
|
+
name: reticle
|
|
66
|
+
on: [deployment_status]
|
|
67
|
+
jobs:
|
|
68
|
+
verify:
|
|
69
|
+
if: github.event.deployment_status.state == 'success'
|
|
70
|
+
runs-on: ubuntu-latest
|
|
71
|
+
steps:
|
|
72
|
+
- uses: actions/checkout@v4
|
|
73
|
+
- uses: reticlehq/reticle/action@v3.9.0
|
|
74
|
+
with:
|
|
75
|
+
api-key: ${{ secrets.RETICLE_API_KEY }}
|
|
76
|
+
# Only for a Vercel preview behind Deployment Protection.
|
|
77
|
+
vercel-bypass-secret: ${{ secrets.VERCEL_AUTOMATION_BYPASS_SECRET }}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
A Vercel preview behind Deployment Protection needs a [Protection Bypass for Automation](https://vercel.com/docs/deployment-protection/methods-to-bypass-deployment-protection/protection-bypass-automation) secret. Netlify has no bypass secret for its password protection, so turn off protection for deploy previews. The [Action README](https://github.com/reticlehq/reticle/tree/main/action) gives each input.
|
|
81
|
+
|
|
57
82
|
## Recipe B: the Checks API pattern (what a hosted Reticle would do)
|
|
58
83
|
|
|
59
84
|
Both providers expose the same shape, which is why this is one integration rather than two:
|
package/docs/desktop.mdx
CHANGED
package/docs/enterprise.md
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Enterprise
|
|
3
|
-
description: '
|
|
3
|
+
description: 'License keys and activation, the enterprise roadmap, the security and data-handling posture, and the licensing model.'
|
|
4
4
|
icon: building
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Every Reticle package is Apache-2.0. An enterprise customer gets a signed license key, which you set as `RETICLE_LICENSE_KEY`. Activation is verified locally with Ed25519 and makes **no network call**. Usage metrics are separate: they are on by default, and on a licensed build they carry your licence id. Turn them off with `RETICLE_TELEMETRY=0`. See [telemetry](/telemetry). Run `npx @reticlehq/server license` to see whether you are `active`, `eval`, `missing`, `expired` or `invalid`.
|
|
8
8
|
|
|
9
9
|
> For how to connect a platform to Reticle, see [Platform integration](/platform-integration).
|
|
10
10
|
|
|
11
11
|
> **Already have a key and just need to switch it on?** [Activating a license key](./license-activation) is the step-by-step version: where to set it on each platform, the editor and CI cases, how to read every status, and what to do when it does not work.
|
|
12
12
|
|
|
13
|
-
## How
|
|
13
|
+
## How a license key works (offline, no phone-home)
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
No feature in the open packages needs a key. A key identifies your organisation to Reticle. Activation is verified locally with Ed25519 and sends nothing. Usage metrics, which you can turn off, carry your licence id on a licensed build.
|
|
16
16
|
|
|
17
17
|
**The flow, end to end:**
|
|
18
18
|
|
|
19
|
-
1. **Buy.** Contact **[hey@reticle.sh](mailto:hey@reticle.sh)**; we issue you a signed license key (license id, org, plan, expiry
|
|
19
|
+
1. **Buy.** Contact **[hey@reticle.sh](mailto:hey@reticle.sh)**; we issue you a signed license key (license id, org, plan, expiry). The **license id** is the stable handle on your subscription: it survives a rename, and it is what a renewal continues.
|
|
20
20
|
2. **Install.** Set it on the machine running the Reticle server:
|
|
21
21
|
```bash
|
|
22
22
|
export RETICLE_LICENSE_KEY="<your key>"
|
|
@@ -26,25 +26,21 @@ Enterprise (`ee/`) features ship **inside the open package**; they're source-ava
|
|
|
26
26
|
|
|
27
27
|
```
|
|
28
28
|
active licensed to Acme Corp (enterprise), expires 2027-06-20T00:00:00.000Z
|
|
29
|
-
eval evaluation mode
|
|
30
|
-
missing set RETICLE_LICENSE_KEY to activate
|
|
31
|
-
expired license expired. Renew with hey@reticle.sh
|
|
29
|
+
eval evaluation mode (no issuer key configured)
|
|
30
|
+
missing set RETICLE_LICENSE_KEY to activate a license. Request a key from hey@reticle.sh
|
|
31
|
+
expired license expired. Renew with hey@reticle.sh
|
|
32
32
|
invalid license key rejected (<reason>). hey@reticle.sh can re-issue it
|
|
33
33
|
```
|
|
34
34
|
|
|
35
|
-
Every status reports `contact`, so a reader who is stuck always has somebody to write to.
|
|
35
|
+
Every status reports `contact`, so a reader who is stuck always has somebody to write to. A published release has the issuer key baked in. Only a build from source, with no issuer key, reports `eval`.
|
|
36
36
|
|
|
37
|
-
4. **
|
|
38
|
-
5. **Renew.** Keys carry an expiry, shown as `expiresAt`; once it passes, the status is `expired`.
|
|
37
|
+
4. **Renew.** Keys carry an expiry, shown as `expiresAt`; once it passes, the status is `expired`.
|
|
39
38
|
|
|
40
39
|
> Procuring a license: contact **[hey@reticle.sh](mailto:hey@reticle.sh)**. Keys are issued offline and signed with Ed25519; the activation you run (`reticle license`) verifies them locally with no network call.
|
|
41
40
|
|
|
42
|
-
##
|
|
41
|
+
## Roadmap
|
|
43
42
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
- **Today:** the activation gate + one gated feature (audit event recording, `audit-log`).
|
|
47
|
-
- **Roadmap** (the reliably enterprise-only set): **SSO/SAML, SCIM, RBAC / team permissions, audit logs, multi-org management, verify-before-merge policy gates, and the hosted control-plane connectors.** These are the things a security/compliance org pays for; the core verification engine stays free forever.
|
|
43
|
+
**SSO/SAML, SCIM, RBAC / team permissions, audit logs, multi-org management, verify-before-merge policy gates, and the hosted control-plane connectors** are planned for the hosted Reticle platform, not for the open packages. The core verification engine stays free.
|
|
48
44
|
|
|
49
45
|
> For pricing, write to [hey@reticle.sh](mailto:hey@reticle.sh). This page describes the mechanism, not the price list.
|
|
50
46
|
|
|
@@ -62,15 +58,14 @@ The honest one-pager a security review needs. Reticle is built so the answer to
|
|
|
62
58
|
| Leak risk downstream? | The **`prod-preview` profile** redacts source `file:line`, raw bodies, and app-state values. |
|
|
63
59
|
| Path safety | Run/flow ids are validated as single path segments on read **and** write (no traversal). |
|
|
64
60
|
|
|
65
|
-
**Verify it yourself:** the SDK
|
|
61
|
+
**Verify it yourself:** the SDK and server are open source, so read the tree-shaking, the `127.0.0.1` bind, and the offline license verify. `SECURITY.md` has the disclosure process; an SBOM is available on request. SOC 2 is not in place; the posture above is the honest current state.
|
|
66
62
|
|
|
67
|
-
## Licensing model
|
|
63
|
+
## Licensing model
|
|
68
64
|
|
|
69
65
|
| Scope | License | Why |
|
|
70
66
|
| --- | --- | --- |
|
|
71
67
|
| The protocol and the rules (`open-verification`, `core`, `engine`) | **Apache-2.0** | the part that DECIDES a verdict, auditable and reimplementable by anyone |
|
|
72
68
|
| Embeddable SDK (`browser`, `react`, `babel-plugin`, `next`, `vite-plugin`, `electron`, `eslint-plugin`) | **Apache-2.0** | safe to ship inside your customers' apps; explicit patent grant |
|
|
73
|
-
| Server / CLI / MCP (`server`, `init`, `test`) | **
|
|
74
|
-
| Enterprise features (`server/src/features/ee/`) | **Reticle Enterprise License** | source-available; free for dev/eval, license key required in production |
|
|
69
|
+
| Server / CLI / MCP (`server`, `init`, `test`) | **Apache-2.0** | use, change and redistribute it anywhere |
|
|
75
70
|
|
|
76
71
|
Embedding / OEM / enterprise: **[hey@reticle.sh](mailto:hey@reticle.sh)**.
|
package/docs/environment.mdx
CHANGED
|
@@ -53,6 +53,7 @@ Reticle works with none of these set. Each one changes a single behaviour, and m
|
|
|
53
53
|
| Variable | Read by | What it does |
|
|
54
54
|
| --- | --- | --- |
|
|
55
55
|
| `RETICLE_SKIP_GATE` | `reticle gate --hook` | Lets an agent's stop hook proceed past a failing gate. The skip is printed and recorded, never silent. It does not affect `reticle gate` without `--hook`, which is what CI runs. |
|
|
56
|
+
| `RETICLE_NO_CI_HINT` | `reticle gate`, `reticle verify`, `reticle affected` | `1` stops the one line these commands write to stderr at the end of a run in a CI runner or a container. The line names the pull request check and `https://reticle.sh/ci`. It never prints in an interactive terminal or for `gate --hook`, and it makes no network call. |
|
|
56
57
|
| `RETICLE_VERIFY_TOKEN` | `reticle serve --http` | The bearer token the optional HTTP verify endpoint requires. |
|
|
57
58
|
| `RETICLE_SECRET_<FIELD>` | replay, verify, crawl | The value typed into a password or secret field at replay. A recorded flow never stores it. See [what is recorded](/what-is-recorded). |
|
|
58
59
|
|
package/docs/first-drive.md
CHANGED
|
@@ -12,7 +12,7 @@ Everything here is written from a run of these exact steps, including the places
|
|
|
12
12
|
## Before you start
|
|
13
13
|
|
|
14
14
|
```bash
|
|
15
|
-
node --version # 22.
|
|
15
|
+
node --version # 22.15 or newer
|
|
16
16
|
pnpm --version # this is a pnpm workspace; npm will not resolve it
|
|
17
17
|
```
|
|
18
18
|
|
package/docs/install-manual.mdx
CHANGED
|
@@ -32,6 +32,21 @@ npx @reticlehq/server setup mcp
|
|
|
32
32
|
|
|
33
33
|
`reticle setup mcp` is exactly the registration half of the installer, and it prints any client it could not write for you.
|
|
34
34
|
|
|
35
|
+
### Sandbox and container images
|
|
36
|
+
|
|
37
|
+
Install the CLI once, in the image:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
npm install -g @reticlehq/server
|
|
41
|
+
npx @reticlehq/server setup mcp
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
npx runs the installed copy. When the CLI is installed, `reticle init` and `reticle setup mcp` register its absolute path (`node <path>/bin/reticle.js mcp`). Each boot then starts the MCP server from the local copy, and your agent does not wait for a download.
|
|
45
|
+
|
|
46
|
+
Without an install, the registration is `npx @reticlehq/server@<version> mcp`, with one exact version. npx uses its cache again only when that cache is in the image. A fresh sandbox with an empty npm cache downloads the package at each boot, and your agent waits for it before its first turn.
|
|
47
|
+
|
|
48
|
+
If you remove the installed copy later, the agent shows the server as failed. `reticle doctor` then prints a `launcher` row with the missing path and the command to run.
|
|
49
|
+
|
|
35
50
|
## Part 1. Register the MCP server
|
|
36
51
|
|
|
37
52
|
There is no config file that all agents share. Each harness has its own path and its own schema, so write only the one you actually use.
|
|
@@ -187,7 +202,7 @@ Screenshots and headless mode need the Rust crate, which is versioned independen
|
|
|
187
202
|
|
|
188
203
|
```toml
|
|
189
204
|
[dependencies]
|
|
190
|
-
reticle-tauri = "3.
|
|
205
|
+
reticle-tauri = "3.9"
|
|
191
206
|
```
|
|
192
207
|
|
|
193
208
|
```rust
|
package/docs/packages/engine.mdx
CHANGED
|
@@ -12,7 +12,7 @@ icon: gavel
|
|
|
12
12
|
|
|
13
13
|
It was nine thousand lines in the middle of the server, which meant the rules that decide a verdict could only be read, tested or trusted by running the whole daemon. Carving it out has three consequences that matter more than tidiness:
|
|
14
14
|
|
|
15
|
-
- **It can be audited.** The verdict is the product, so the code that produces one is the code a sceptical reader most wants to see. It is Apache 2.0
|
|
15
|
+
- **It can be audited.** The verdict is the product, so the code that produces one is the code a sceptical reader most wants to see. It is Apache 2.0, the same as every other Reticle package.
|
|
16
16
|
- **It can be reused.** Anything that has evidence in the protocol's shape can reach a verdict without Reticle in the loop.
|
|
17
17
|
- **It cannot quietly depend on the daemon.** A rule that needs a browser to decide something is not a rule, it is a measurement, and the package boundary is what makes that confusion a compile error.
|
|
18
18
|
|
package/docs/packages/react.mdx
CHANGED
|
@@ -38,9 +38,21 @@ The bridge refuses a connect without the pairing token, also on localhost. `reti
|
|
|
38
38
|
|
|
39
39
|
| Export | Signature | What it does |
|
|
40
40
|
| --- | --- | --- |
|
|
41
|
-
| `install` | `(): void` | Idempotent. Registers the `react` adapter and installs the render meter. Call it once, before `connect()` |
|
|
41
|
+
| `install` | `(options?: InstallOptions): void` | Idempotent. Registers the `react` adapter and installs the render meter. Call it once, before `connect()` |
|
|
42
42
|
|
|
43
|
-
|
|
43
|
+
#### `InstallOptions`
|
|
44
|
+
|
|
45
|
+
| Option | Type | Default | What it does |
|
|
46
|
+
| --- | --- | --- | --- |
|
|
47
|
+
| `discoverStores` | `boolean` | `true` | When `true`, `install` walks the React fiber tree after each of the first ten commits and registers stores it finds in Redux `Provider`, TanStack `QueryClientProvider`, and similar context providers. Set to `false` to skip auto-discovery. Use this when your app has more than one context provider and you want only the stores you name with `registerStore` to appear in `reticle_look`. The render meter still runs. |
|
|
48
|
+
|
|
49
|
+
```ts
|
|
50
|
+
// Only expose the store you control:
|
|
51
|
+
install({ discoverStores: false });
|
|
52
|
+
registerStore('safe', safeStore);
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
The [Vite plugin](/packages/vite-plugin) injects `install()` and `reticle.connect()` for you. In Vite, pass `discoverStores: false` to the plugin (`reticle({ discoverStores: false })`) to disable auto-discovery. With manual setup, pass `{ discoverStores: false }` to `install()` before calling `reticle.connect()`.
|
|
44
56
|
|
|
45
57
|
### Mapping a node to its component
|
|
46
58
|
|
package/docs/packages/server.mdx
CHANGED
|
@@ -6,7 +6,7 @@ icon: server
|
|
|
6
6
|
|
|
7
7
|
`@reticlehq/server` is the Reticle bridge, MCP server and CLI in one Node package. It hosts the WebSocket your app dials into, exposes the MCP tools your agent calls, and ships the `reticle` binary. **You do not add it to your project**: your agent runs it with `npx @reticlehq/server mcp`.
|
|
8
8
|
|
|
9
|
-
**Licensed under `
|
|
9
|
+
**Licensed under `Apache-2.0`, the same as every other Reticle package.**
|
|
10
10
|
|
|
11
11
|
## Why it exists
|
|
12
12
|
|
package/docs/packages/tauri.mdx
CHANGED
|
@@ -16,7 +16,7 @@ Tauri IPC observation needs nothing on the Rust side. An `invoke('load_todos')`
|
|
|
16
16
|
|
|
17
17
|
```toml
|
|
18
18
|
[dependencies]
|
|
19
|
-
reticle-tauri = "3.
|
|
19
|
+
reticle-tauri = "3.9"
|
|
20
20
|
```
|
|
21
21
|
|
|
22
22
|
Its own dependencies are `tauri = "2.12"` (the Windows backend must use the same `webview2-com` and `windows` versions Tauri does, so it follows Tauri's minor version) plus the per-platform capture backends: `objc2` and friends on macOS, `webview2-com` and `windows` on Windows, `webkit2gtk` and `cairo-rs` on Linux and the BSDs.
|
package/docs/packages/test.mdx
CHANGED
|
@@ -6,7 +6,7 @@ icon: vial
|
|
|
6
6
|
|
|
7
7
|
`@reticlehq/test` is Reticle's spec runner for CI. It turns an interactive session into a suite that runs on every pull request, without an agent and without paying model tokens to re-derive the same checks. Install it when you want unattended verification; skip it if you only ever drive Reticle interactively through MCP.
|
|
8
8
|
|
|
9
|
-
**Licensed under `
|
|
9
|
+
**Licensed under `Apache-2.0`. Depends on `@reticlehq/core` and `@reticlehq/server`. Optional peer dependency: `vitest ^3.2.6 || ^4.0.0`.**
|
|
10
10
|
|
|
11
11
|
```bash
|
|
12
12
|
npm i -D @reticlehq/test
|
|
@@ -67,6 +67,7 @@ Plus a dynamic import of your dev module if one exists. It looks for `src/reticl
|
|
|
67
67
|
| `present` | `boolean` | `true`. Set `false` to hide Reticle's presenter while keeping the agent connection active |
|
|
68
68
|
| `sourceMapping` | `boolean` | `true`. Set `false` to skip the Babel pass |
|
|
69
69
|
| `inject` | `boolean` | `true`. Set `false` to call `connect()` yourself |
|
|
70
|
+
| `discoverStores` | `boolean` | `true`. Set `false` to disable auto-discovery of context stores in React apps (`install({ discoverStores: false })`) |
|
|
70
71
|
| `desktop` | `boolean` | `false`. When `true` the connect passes `allowInProduction: true`, which an Electron or Tauri renderer needs, and a `vite build` in a non-production mode (`--mode development`) is instrumented too. A production-mode build is stubbed like a web build |
|
|
71
72
|
| `captureNetworkBodies` | `boolean` | `false`. Also enabled by `VITE_RETICLE_CAPTURE_BODIES=1` |
|
|
72
73
|
| `networkBodyMaxChars` | `number` | `8192`, clamped to 256 to 262144. Also `VITE_RETICLE_BODY_MAX_CHARS` |
|
package/docs/packages.mdx
CHANGED
|
@@ -154,4 +154,4 @@ A service that drives apps it did not build uses these seams.
|
|
|
154
154
|
|
|
155
155
|
## Licensing for embedding
|
|
156
156
|
|
|
157
|
-
|
|
157
|
+
Every Reticle package is **Apache-2.0**, so you can ship the SDK in your customers' apps. Hosted and team features: [`enterprise.md`](./enterprise.md). OEM terms: **[hey@reticle.sh](mailto:hey@reticle.sh)**.
|
package/docs/skill.md
CHANGED
|
@@ -3,7 +3,7 @@ name: reticle-docs
|
|
|
3
3
|
description: Install, instrument and verify this running web app from the inside (DOM, network, routing, console and framework state) instead of screenshots or guessing. Drives one real flow end to end and returns a verdict with the file:line to fix. Use when the user asks to set up or install Reticle, when a user-facing change needs proving before you call it done, when a test passes but the UI is broken, or when the user types /reticle.
|
|
4
4
|
license: Apache-2.0
|
|
5
5
|
metadata:
|
|
6
|
-
version: 3.
|
|
6
|
+
version: 3.9.0
|
|
7
7
|
homepage: https://docs.reticle.sh
|
|
8
8
|
repository: https://github.com/reticlehq/reticle
|
|
9
9
|
internal: true
|
package/docs/telemetry.md
CHANGED
|
@@ -40,7 +40,7 @@ Twenty-five kinds of events, each a single small JSON object. This is the whole
|
|
|
40
40
|
| `mcp_proxy_exited` | The process that gives your agent its Reticle tools ends | Why it ended (`stdin_end`, `idle`, `client_gone_storm`, `wake_failed`), how long it ran, and two counts: how many times it lost the daemon and how many tool calls it carried, with its random id. Never what the calls were |
|
|
41
41
|
| `daemon_died_unclean` | Reticle finds that an earlier daemon stopped without a clean exit | How long that daemon had run. Nothing else |
|
|
42
42
|
| `wake_refused` | Reticle will not use the daemon port it found, because something else holds it | Whether the holder was another program (`foreign`) or a Reticle daemon for another project (`other_project`). Never the port or the project |
|
|
43
|
-
| `onboarding_step` | One step of getting set up begins, finishes, fails, is skipped, or is walked away from | Which phase (`install`, `onboard`, `first_run`), which step, what became of it, how long it took, and the framework. The step name comes from a closed list we define -- it can only ever be one of the names in `core/src/onboarding.ts`, so nothing you typed or any path on your disk can arrive in it. `unattended` says whether anybody was asked anything |
|
|
43
|
+
| `onboarding_step` | One step of getting set up begins, finishes, fails, is skipped, or is walked away from | Which phase (`install`, `onboard`, `first_run`), which step, what became of it, how long it took, and the framework. The step name comes from a closed list we define -- it can only ever be one of the names in `core/src/onboarding.ts`, so nothing you typed or any path on your disk can arrive in it. `unattended` says whether anybody was asked anything. A step that failed can carry why setup stopped, also from a closed list (`no_node`, `node_too_old`, `no_web_app`, `dev_server_failed`, `chromium_unavailable`, and so on) |
|
|
44
44
|
| `init_completed` | `reticle init` finishes | Whether it worked, a classified reason when it did not, and which published install route you came through, DECLARED by that route via `RETICLE_INSTALL_SOURCE` and never inferred, and `unknown` when nothing declared one |
|
|
45
45
|
| `bug_found` | Reticle finds a defect in the app under test | The **kind** of defect (`signal-contradicted`, `console-error`, …) and how it was found, never what it was found in |
|
|
46
46
|
| `tool_refused` | A tool cannot do what an agent asked | Which tool, why (one of six buckets: no session, no match, unsupported, bad arguments, not ready, other), and whether the same call was retried. **Never the message**, because a refusal interpolates whatever you asked for, so only the tool name and the bucket are sent. Capped at 50 per daemon run |
|
|
@@ -49,11 +49,12 @@ Twenty-five kinds of events, each a single small JSON object. This is the whole
|
|
|
49
49
|
| `hud_signin_prompted` | The HUD shows you a sign-in or "link this project" prompt | Which prompt (`rail`, `harness` or `header`), once per prompt for each daemon run |
|
|
50
50
|
| `platform_linked` | A project on this machine is linked to a Reticle workspace | How (`connect`, `hud` or `link`) and the workspace's id; see [The platform side](#the-platform-side) |
|
|
51
51
|
| `harness_run` | A Reticle Harness run starts, and again when it ends | Who started it (`agent`, `hud`, `dashboard`, `cli_try`, `plan`), whether the platform drove it, and at the end how it went (`proved`, `not_proved`, `failed`, `blocked`, `stopped`), how many journeys it answered and replayed, as buckets, and for a `blocked` or `failed` run why it did not drive, from a closed list (`not_linked`, `harness_off`, `no_credits`, and so on) |
|
|
52
|
+
| `gate_completed` | `reticle gate` ends | How it ended (`pass`, `fail`, `nothing_to_check`, `regression` or `error`) and how many saved flows it judged. Never a flow name or a file path |
|
|
52
53
|
| `identified` | **Never** from this version. Only an earlier version's `reticle identify`, which has been removed | What you chose to tell us then; see [Telling us who you are](#telling-us-who-you-are) |
|
|
53
54
|
|
|
54
55
|
**There is no per-tool-call event.** Tool usage is counted in memory and leaves once, inside `daemon_stopped`, as a histogram like `{"reticle_act": 40, "reticle_assert": 12}`. That is counts of tool NAMES from a fixed list we define, never arguments, results, selectors, or URLs.
|
|
55
56
|
|
|
56
|
-
**Parameter and flag NAMES are collected; their VALUES are not.** We record that `reticle_act` was called with `ref` and `action`, and that you ran `reticle serve --headed --port`. We do not record what you set them to. This distinction is the whole safety property, and it is absolute for CLI flags: `--http-token` holds a secret, `--drive` holds a URL, `--storage-state` holds a file path, so no flag value is ever sent. For tool parameters there is one narrow exception: a short, explicit allowlist of parameters whose values are enums _we_ defined (`action: "click"`), listed in [`argument-shape.ts`](https://github.com/reticlehq/reticle/blob/main/server/src/telemetry/argument-shape.ts). A value outside that allowlist reports as `other`, so a future schema change cannot quietly start forwarding free text. `reticle_act`'s `args` (the text being typed into your app, which on a login form is a password) is **never** in that allowlist.
|
|
57
|
+
**Parameter and flag NAMES are collected; their VALUES are not.** We record that `reticle_act` was called with `ref` and `action`, and that you ran `reticle serve --headed --port`. We do not record what you set them to. This distinction is the whole safety property, and it is absolute for CLI flags: `--http-token` holds a secret, `--drive` holds a URL, `--storage-state` holds a file path, so no flag value is ever sent. For tool parameters there is one narrow exception: a short, explicit allowlist of parameters whose values are enums _we_ defined (`action: "click"`, and the name of the Reticle tool that `reticle_run` calls), listed in [`argument-shape.ts`](https://github.com/reticlehq/reticle/blob/main/server/src/telemetry/argument-shape.ts). A value outside that allowlist reports as `other`, so a future schema change cannot quietly start forwarding free text. `reticle_act`'s `args` (the text being typed into your app, which on a login form is a password) is **never** in that allowlist.
|
|
57
58
|
|
|
58
59
|
`daemon_stopped` carries: how long the session ran, how many tool calls and of which tools, how many of those calls came before an app connected, the version of the Reticle SDK in the last page that connected, how long each tool took (total and worst case), how many failed, how many verifications ran, browser/lease connection attempts with their failure causes, and which MCP clients connected (`claude-code`, `cursor`). It also carries how the in-page HUD was used: presses per control (`hudControls`, by the control's name from a closed list Reticle defines, a toggle as `name:on` / `name:off`), how long the HUD sat as a bubble, collapsed or open and on which page (`hudViewMs`, `hudPanelMs`), which rail slides were shown (`hudSlides`), and the order of those presses and views, cut at 60 (`hudJourney`). Control names, never anything typed or shown on the page.
|
|
59
60
|
|
|
@@ -113,6 +114,7 @@ Every event carries the same few fields:
|
|
|
113
114
|
| `version` | The Reticle version running | n/a |
|
|
114
115
|
| `os` | The platform (`darwin` / `linux` / `win32`) | Not the OS version, hostname, or hardware |
|
|
115
116
|
| `ci` | Whether the run is inside CI | n/a |
|
|
117
|
+
| `internal` | `true`, only on the Reticle team's own machines and test runs, which set it on purpose | Not set for anybody else, and never guessed from a name, an email or a path |
|
|
116
118
|
|
|
117
119
|
There are no IP-based profiles, no cookies, no fingerprinting, and no person profiles: events are processed in "personless" mode, so they are never joined into a person profile.
|
|
118
120
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@reticlehq/server",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.9.0",
|
|
4
4
|
"mcpName": "io.github.reticlehq/reticle",
|
|
5
5
|
"description": "Reticle CLI, bridge and MCP server: a coding agent drives your running web app from the inside and gets a verdict with evidence, for change verification, access control, accessibility, performance and SEO checks.",
|
|
6
6
|
"type": "module",
|
|
@@ -23,11 +23,11 @@
|
|
|
23
23
|
"@modelcontextprotocol/sdk": "^1.31.0",
|
|
24
24
|
"ws": "^8.21.3",
|
|
25
25
|
"zod": "^4.6.6",
|
|
26
|
-
"@reticlehq/
|
|
27
|
-
"@reticlehq/core": "3.
|
|
28
|
-
"@reticlehq/init": "3.
|
|
29
|
-
"open-verification": "1.
|
|
30
|
-
"@reticlehq/
|
|
26
|
+
"@reticlehq/browser": "3.9.0",
|
|
27
|
+
"@reticlehq/core": "3.9.0",
|
|
28
|
+
"@reticlehq/init": "3.9.0",
|
|
29
|
+
"open-verification": "1.1.0",
|
|
30
|
+
"@reticlehq/engine": "3.9.0"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
33
|
"@types/pngjs": "^6.0.5",
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"playwright": "^1.63.0",
|
|
40
40
|
"pngjs": "^7.0.0"
|
|
41
41
|
},
|
|
42
|
-
"license": "
|
|
42
|
+
"license": "Apache-2.0",
|
|
43
43
|
"author": "Reticle contributors",
|
|
44
44
|
"repository": {
|
|
45
45
|
"type": "git",
|
|
@@ -52,7 +52,8 @@
|
|
|
52
52
|
"bin",
|
|
53
53
|
"dist",
|
|
54
54
|
"README.md",
|
|
55
|
-
"LICENSE
|
|
55
|
+
"LICENSE",
|
|
56
|
+
"NOTICE",
|
|
56
57
|
"SKILL.md",
|
|
57
58
|
"docs"
|
|
58
59
|
],
|
|
@@ -64,8 +65,11 @@
|
|
|
64
65
|
"cli"
|
|
65
66
|
],
|
|
66
67
|
"reticle": {
|
|
67
|
-
"changelog": "
|
|
68
|
-
"breakingChanges": [
|
|
68
|
+
"changelog": "3.9.0 gets more installs to a first verdict. The one-line installer and reticle init now check your app and wait for your agent to connect. A lease reads a deployed preview with no SDK installed. Several false verdicts are fixed: a click that hit Reticle's own panel, a recorded flow that lost its assertion, and an iframe that took over a page's session. Every package is now Apache-2.0. Update the CLI and the SDK in your app.",
|
|
69
|
+
"breakingChanges": [
|
|
70
|
+
"A headless page now opens at 1440x900, not 1280x720. Record your headless screenshot baselines again, or they report dimension-mismatch.",
|
|
71
|
+
"The JSON line of `reticle license` no longer has the `gated` and `coversNothingHere` fields."
|
|
72
|
+
]
|
|
69
73
|
},
|
|
70
74
|
"publishConfig": {
|
|
71
75
|
"access": "public"
|
package/LICENSE-ENTERPRISE
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
The Reticle Enterprise License (the "Enterprise License")
|
|
2
|
-
Copyright (c) 2026 Reticle Labs
|
|
3
|
-
|
|
4
|
-
With regard to the Reticle software (the "Software"):
|
|
5
|
-
|
|
6
|
-
This Software and associated documentation files (the "Software") may only be
|
|
7
|
-
used in production if you (and any entity that you represent) hold a valid Reticle
|
|
8
|
-
Enterprise subscription for the correct number of seats and/or usage as agreed
|
|
9
|
-
with Reticle Labs.
|
|
10
|
-
|
|
11
|
-
Subject to the foregoing, you are free to use, copy, modify, and create
|
|
12
|
-
derivative works of the Software for development, testing, and evaluation
|
|
13
|
-
purposes without a subscription.
|
|
14
|
-
|
|
15
|
-
You may not move, change, disable, or circumvent the license-key functionality
|
|
16
|
-
in the Software, and you may not remove or obscure any functionality in the
|
|
17
|
-
Software that is protected by the license key.
|
|
18
|
-
|
|
19
|
-
You may not alter, remove, or obscure any licensing, copyright, or other
|
|
20
|
-
notices.
|
|
21
|
-
|
|
22
|
-
Any use of the Software in violation of this Enterprise License will
|
|
23
|
-
automatically terminate your rights under this Enterprise License for the
|
|
24
|
-
current and all other versions of the Software.
|
|
25
|
-
|
|
26
|
-
This Enterprise License does not grant you any rights to any trademark, trade
|
|
27
|
-
name, service mark, logo, or product name of Reticle Labs.
|
|
28
|
-
|
|
29
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
30
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
31
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
32
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
33
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
34
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
35
|
-
SOFTWARE.
|
|
36
|
-
|
|
37
|
-
For a Reticle Enterprise subscription: hey@reticle.sh
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Example enterprise feature (Reticle Enterprise License — see./LICENSE). Demonstrates the pattern every
|
|
3
|
-
* ee feature follows: call assertEnterprise...) first, then do the privileged work. The body here is a
|
|
4
|
-
* stub — the real audit sink is the hosted control plane. It exists now to prove the gate.
|
|
5
|
-
*/
|
|
6
|
-
import { type GateContext } from '../license/license.js';
|
|
7
|
-
interface AuditEvent {
|
|
8
|
-
actor: string;
|
|
9
|
-
action: string;
|
|
10
|
-
at: number;
|
|
11
|
-
}
|
|
12
|
-
/** Record an audit event — gated. Throws EnterpriseLicenseError in production without a valid license. */
|
|
13
|
-
export declare function recordAuditEvent(event: AuditEvent, ctx: GateContext): AuditEvent;
|
|
14
|
-
export {};
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Example enterprise feature (Reticle Enterprise License — see./LICENSE). Demonstrates the pattern every
|
|
3
|
-
* ee feature follows: call assertEnterprise...) first, then do the privileged work. The body here is a
|
|
4
|
-
* stub — the real audit sink is the hosted control plane. It exists now to prove the gate.
|
|
5
|
-
*/
|
|
6
|
-
import { assertEnterprise, EnterpriseFeature, } from '../license/license.js';
|
|
7
|
-
/** Record an audit event — gated. Throws EnterpriseLicenseError in production without a valid license. */
|
|
8
|
-
export function recordAuditEvent(event, ctx) {
|
|
9
|
-
assertEnterprise(EnterpriseFeature.AUDIT_LOG, ctx);
|
|
10
|
-
return event; // stub: a real implementation persists to the enterprise audit store
|
|
11
|
-
}
|