@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.
- package/README.md +14 -5
- package/SKILL.md +64 -29
- package/dist/capsule/causal-summary.d.ts +20 -0
- package/dist/capsule/causal-summary.js +31 -6
- package/dist/capsule/divergence.js +7 -1
- package/dist/cli/chromium-hint.d.ts +33 -5
- package/dist/cli/chromium-hint.js +82 -12
- package/dist/cli/cli-doctor.js +28 -25
- package/dist/cli/cli-kill.d.ts +58 -0
- package/dist/cli/cli-kill.js +162 -0
- package/dist/cli/cli-launch.d.ts +17 -0
- package/dist/cli/cli-launch.js +28 -0
- package/dist/cli/cli-parse.d.ts +16 -1
- package/dist/cli/cli-parse.js +32 -9
- package/dist/cli/cli-port.d.ts +8 -0
- package/dist/cli/cli-port.js +16 -0
- package/dist/cli/cli-verify.js +2 -2
- package/dist/cli/doctor-sessions-line.d.ts +12 -0
- package/dist/cli/doctor-sessions-line.js +66 -0
- package/dist/cli/port-holder.d.ts +10 -0
- package/dist/cli/port-holder.js +26 -2
- package/dist/cli.js +99 -14
- package/dist/crawl/crawl-tools.js +12 -2
- package/dist/crawl/crawl.d.ts +13 -0
- package/dist/crawl/crawl.js +50 -2
- package/dist/events/contradictions.d.ts +14 -0
- package/dist/events/contradictions.js +26 -17
- package/dist/events/predicate-eval.d.ts +20 -1
- package/dist/events/predicate-eval.js +125 -3
- package/dist/events/predicate.js +170 -18
- package/dist/flows/flow-classify.js +1 -1
- package/dist/flows/flow-tools.js +12 -4
- package/dist/flows/heal-run.js +1 -1
- package/dist/honesty/blind-spots.js +6 -2
- package/dist/honesty/unsettled.d.ts +40 -0
- package/dist/honesty/unsettled.js +78 -0
- package/dist/honesty/verified.d.ts +7 -0
- package/dist/honesty/verified.js +3 -3
- package/dist/index.js +3 -0
- package/dist/init/agent-rules.d.ts +16 -0
- package/dist/init/agent-rules.js +96 -22
- package/dist/init/astro-patch.d.ts +2 -1
- package/dist/init/astro-patch.js +11 -5
- package/dist/init/capabilities.d.ts +22 -0
- package/dist/init/capabilities.js +76 -0
- package/dist/init/confirm.d.ts +96 -0
- package/dist/init/confirm.js +138 -0
- package/dist/init/cra.js +3 -2
- package/dist/init/non-js-project.js +29 -5
- package/dist/init/plan-framework.js +53 -15
- package/dist/init/plan.d.ts +40 -4
- package/dist/init/plan.js +163 -40
- package/dist/init/run.d.ts +24 -2
- package/dist/init/run.js +148 -42
- package/dist/init/slash-command.d.ts +1 -1
- package/dist/init/slash-command.js +46 -6
- package/dist/init/snippets.d.ts +44 -4
- package/dist/init/snippets.js +161 -37
- package/dist/init/vite-config.js +29 -3
- package/dist/input/network-mock-tools.d.ts +19 -0
- package/dist/input/network-mock-tools.js +29 -4
- package/dist/license/license.js +1 -1
- package/dist/mcp/mcp-proxy.d.ts +69 -3
- package/dist/mcp/mcp-proxy.js +205 -20
- package/dist/mcp/mcp.js +23 -7
- package/dist/mcp/proxy-lifecycle.d.ts +1 -1
- package/dist/mcp/proxy-lifecycle.js +1 -1
- package/dist/pool/browser-pool.d.ts +22 -2
- package/dist/pool/browser-pool.js +44 -4
- package/dist/project/learned-routes.d.ts +24 -0
- package/dist/project/learned-routes.js +63 -0
- package/dist/project/project-store.d.ts +6 -0
- package/dist/project/project-store.js +25 -1
- package/dist/session/no-session-diagnosis.d.ts +19 -0
- package/dist/session/no-session-diagnosis.js +71 -18
- package/dist/session/no-session-watch.js +12 -0
- package/dist/session/ref-provenance.d.ts +54 -0
- package/dist/session/ref-provenance.js +61 -0
- package/dist/session/session-lease.js +1 -1
- package/dist/telemetry/automation-hint.d.ts +17 -0
- package/dist/telemetry/automation-hint.js +71 -0
- package/dist/telemetry/bug-found.d.ts +0 -20
- package/dist/telemetry/bug-found.js +38 -21
- package/dist/telemetry/cli-telemetry.js +7 -1
- package/dist/telemetry/feedback.js +1 -1
- package/dist/telemetry/init-telemetry.js +9 -1
- package/dist/telemetry/install-source.d.ts +36 -0
- package/dist/telemetry/install-source.js +40 -0
- package/dist/telemetry/run-telemetry.js +4 -1
- package/dist/telemetry/session-metrics.js +5 -0
- package/dist/telemetry/telemetry.d.ts +5 -1
- package/dist/telemetry/telemetry.js +15 -2
- package/dist/telemetry/tool-refused.d.ts +19 -0
- package/dist/telemetry/tool-refused.js +55 -0
- package/dist/telemetry/verification-of.js +46 -7
- package/dist/temp-dir.d.ts +27 -0
- package/dist/temp-dir.js +46 -0
- package/dist/tools/act-tools.js +45 -1
- package/dist/tools/assert-grade.d.ts +1 -1
- package/dist/tools/assert-grade.js +27 -5
- package/dist/tools/assert-verdict.js +18 -1
- package/dist/tools/contract-tools.js +4 -0
- package/dist/tools/dynamic-tools.js +1 -1
- package/dist/tools/error-recovery.d.ts +10 -0
- package/dist/tools/error-recovery.js +64 -4
- package/dist/tools/feedback-invite.js +1 -1
- package/dist/tools/invoke-tool.js +139 -23
- package/dist/tools/lease-tools.d.ts +29 -1
- package/dist/tools/lease-tools.js +58 -5
- package/dist/tools/navigate-result.js +1 -1
- package/dist/tools/observe-tools.js +1 -1
- package/dist/tools/observed-nothing.js +1 -1
- package/dist/tools/react-grace.d.ts +48 -0
- package/dist/tools/react-grace.js +87 -0
- package/dist/tools/read-tools.js +20 -4
- package/dist/tools/settle-in-flight.d.ts +79 -0
- package/dist/tools/settle-in-flight.js +106 -0
- package/dist/tools/snapshot-delta.d.ts +7 -0
- package/dist/tools/snapshot-delta.js +130 -6
- package/dist/tools/tool-surface.js +19 -0
- package/dist/tools/tools.js +16 -4
- package/docs/README.md +56 -11
- package/docs/actions.mdx +87 -0
- package/docs/agent-cheatsheet.md +93 -29
- package/docs/architecture.md +46 -35
- package/docs/benchmarks.md +76 -72
- package/docs/best-practices.mdx +211 -0
- package/docs/capabilities.mdx +387 -0
- package/docs/cli/affected.mdx +51 -0
- package/docs/cli/capsules.mdx +69 -0
- package/docs/cli/cloud.mdx +127 -0
- package/docs/cli/doctor.mdx +76 -0
- package/docs/cli/drive.mdx +55 -0
- package/docs/cli/feedback.mdx +67 -0
- package/docs/cli/gate.mdx +64 -0
- package/docs/cli/help.mdx +92 -0
- package/docs/cli/hunt.mdx +57 -0
- package/docs/cli/identify.mdx +62 -0
- package/docs/cli/init.mdx +94 -0
- package/docs/cli/kill.mdx +91 -0
- package/docs/cli/license.mdx +48 -0
- package/docs/cli/mcp.mdx +61 -0
- package/docs/cli/open.mdx +68 -0
- package/docs/cli/restart.mdx +60 -0
- package/docs/cli/rollback.mdx +35 -0
- package/docs/cli/serve.mdx +62 -0
- package/docs/cli/status.mdx +64 -0
- package/docs/cli/stop.mdx +56 -0
- package/docs/cli/telemetry.mdx +57 -0
- package/docs/cli/update.mdx +52 -0
- package/docs/cli/verify.mdx +57 -0
- package/docs/cli/version.mdx +39 -0
- package/docs/cli/watch.mdx +55 -0
- package/docs/cli.mdx +219 -0
- package/docs/debugging.md +13 -9
- package/docs/deploy-checks.md +15 -11
- package/docs/desktop-apps.md +49 -40
- package/docs/desktop.mdx +188 -0
- package/docs/docs.json +363 -0
- package/docs/enterprise.md +20 -16
- package/docs/faq.mdx +88 -0
- package/docs/fixtures.md +11 -7
- package/docs/flows.md +26 -22
- package/docs/for-agents.md +71 -0
- package/docs/frameworks.mdx +199 -0
- package/docs/gate-plan.md +45 -41
- package/docs/gates.md +22 -18
- package/docs/getting-started.md +76 -65
- package/docs/human-control.md +22 -18
- package/docs/index.mdx +101 -0
- package/docs/install-agentic.mdx +215 -0
- package/docs/install-manual.mdx +194 -0
- package/docs/instrumentation.mdx +232 -0
- package/docs/integration-patterns.md +38 -34
- package/docs/local-registry.md +16 -12
- package/docs/multi-agent-testing.md +16 -12
- package/docs/packages/babel-plugin.mdx +70 -0
- package/docs/packages/browser.mdx +111 -0
- package/docs/packages/core.mdx +106 -0
- package/docs/packages/electron.mdx +87 -0
- package/docs/packages/eslint-plugin.mdx +84 -0
- package/docs/packages/next.mdx +91 -0
- package/docs/packages/react.mdx +91 -0
- package/docs/packages/server.mdx +98 -0
- package/docs/packages/tauri.mdx +63 -0
- package/docs/packages/test.mdx +108 -0
- package/docs/packages/vite-plugin.mdx +96 -0
- package/docs/packages.mdx +217 -0
- package/docs/platform-integration.md +33 -26
- package/docs/predicates.mdx +179 -0
- package/docs/quickstart.mdx +211 -0
- package/docs/recipes.mdx +242 -0
- package/docs/skill-file.mdx +105 -0
- package/docs/state-management.mdx +197 -0
- package/docs/style.css +14 -0
- package/docs/system-map.md +47 -32
- package/docs/telemetry-contract.md +93 -50
- package/docs/telemetry-events.mdx +430 -0
- package/docs/telemetry.md +57 -52
- package/docs/testing.md +10 -6
- package/docs/token-efficiency.md +30 -26
- package/docs/tools-act-and-wait.mdx +123 -0
- package/docs/tools-act-sequence.mdx +120 -0
- package/docs/tools-act.mdx +82 -0
- package/docs/tools-assert.mdx +70 -0
- package/docs/tools-console.mdx +59 -0
- package/docs/tools-inspect.mdx +85 -0
- package/docs/tools-navigate.mdx +63 -0
- package/docs/tools-network.mdx +86 -0
- package/docs/tools-observe.mdx +89 -0
- package/docs/tools-overview.mdx +157 -0
- package/docs/tools-query.mdx +82 -0
- package/docs/tools-session-and-feedback.mdx +91 -0
- package/docs/tools-sessions.mdx +65 -0
- package/docs/tools-snapshot.mdx +75 -0
- package/docs/tools-state.mdx +81 -0
- package/docs/tools-tools-and-run.mdx +125 -0
- package/docs/tools-wait-for.mdx +66 -0
- package/docs/troubleshooting.mdx +193 -0
- package/docs/usage.md +175 -153
- package/docs/vs-chrome-devtools-mcp.mdx +82 -0
- package/docs/vs-playwright-mcp.mdx +85 -0
- package/docs/vs-screenshots.mdx +96 -0
- package/docs/what-is-reticle.mdx +63 -0
- package/docs/why-reticle.mdx +107 -0
- package/package.json +2 -2
- package/docs/matrix/2.5.0/claude-code-machine.json +0 -19
- package/docs/matrix/2.5.0/codex-machine.json +0 -20
- package/docs/matrix/2.5.0/cursor-machine.json +0 -22
- package/docs/matrix/2.5.0/gemini-machine.json +0 -22
- package/docs/matrix/2.5.0/opencode-machine.json +0 -22
- package/docs/matrix/2.5.0/vscode-machine.json +0 -22
- package/docs/matrix/2.5.0/windsurf-machine.json +0 -22
- package/docs/matrix/MATRIX.md +0 -26
- package/docs/matrix/README.md +0 -59
- package/docs/mint.json +0 -61
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: reticle_wait_for
|
|
3
|
+
description: Block until a predicate holds. Or return immediately if it is already true in the recent buffer.
|
|
4
|
+
icon: hourglass
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
`reticle_wait_for` takes the same predicate grammar as [`reticle_act_and_wait`](/tools-act-and-wait), without the action. Use it when the thing you are waiting for was triggered by something other than your own click. A timer, a websocket push, a background refresh.
|
|
8
|
+
|
|
9
|
+
## Example
|
|
10
|
+
|
|
11
|
+
```json
|
|
12
|
+
{
|
|
13
|
+
"predicate": { "kind": "text", "value": "Invalid email or password" },
|
|
14
|
+
"timeout_ms": 3000
|
|
15
|
+
}
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Real response:
|
|
19
|
+
|
|
20
|
+
```json
|
|
21
|
+
{
|
|
22
|
+
"pass": true,
|
|
23
|
+
"evidence": [
|
|
24
|
+
{
|
|
25
|
+
"ref": "e104",
|
|
26
|
+
"role": "alert",
|
|
27
|
+
"name": "Invalid email or password",
|
|
28
|
+
"visible": false,
|
|
29
|
+
"source": "src/components/Login.tsx:72",
|
|
30
|
+
"states": ["present", "hidden", "enabled"]
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
The evidence is the element itself, with the file and line that rendered it.
|
|
37
|
+
|
|
38
|
+
<Note>
|
|
39
|
+
Look at `visible: false` and `states: ["present", "hidden", "enabled"]`. The alert exists in the
|
|
40
|
+
DOM and is not visible. `wait_for` on a `text` predicate matches presence, if you need it on
|
|
41
|
+
screen, that is a different question, and [`reticle_inspect`](/tools-inspect) answers it.
|
|
42
|
+
</Note>
|
|
43
|
+
|
|
44
|
+
## It checks the buffer first
|
|
45
|
+
|
|
46
|
+
`wait_for` does not always wait. If the predicate is already satisfied in the recent event buffer, it returns immediately. This means you can act, then wait, without racing. The event that happened while you were composing the second call is not lost.
|
|
47
|
+
|
|
48
|
+
## Arguments
|
|
49
|
+
|
|
50
|
+
| Argument | What it does |
|
|
51
|
+
| --- | --- |
|
|
52
|
+
| `predicate` (or `until`) | `{ kind, ...fields }`, see the [predicate grammar](/tools-act-and-wait) |
|
|
53
|
+
| `timeout_ms` | Maximum wait |
|
|
54
|
+
| `since` | Cursor from a prior act, to scope the wait |
|
|
55
|
+
|
|
56
|
+
## Prefer `act_and_wait` when you caused it
|
|
57
|
+
|
|
58
|
+
If your own action is supposed to trigger the thing, put the predicate in the action:
|
|
59
|
+
|
|
60
|
+
```json
|
|
61
|
+
{ "ref": "e103", "action": "click", "until": { "kind": "signal", "name": "auth:granted" } }
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
One call instead of two, no gap for an event to slip through, and. The part that matters. The expectation is recorded _before_ the action rather than chosen after it.
|
|
65
|
+
|
|
66
|
+
Save `wait_for` for consequences you did not cause.
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Troubleshooting: it worked on my tab
|
|
3
|
+
sidebarTitle: Troubleshooting
|
|
4
|
+
description: Nothing connected, the click did nothing, the verdict says unknown. The failures people actually hit, and the diagnostic for each.
|
|
5
|
+
icon: stethoscope
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Most of these were hit while writing these docs. The diagnostics quoted are real output.
|
|
9
|
+
|
|
10
|
+
## Start here
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
npx @reticlehq/server doctor
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
reticle doctor
|
|
18
|
+
node v22.14.0
|
|
19
|
+
chromium ✓ installed
|
|
20
|
+
daemon ✓ running on :4400 (pid 24735, v2.8.0)
|
|
21
|
+
sessions ✓ 1 page connected
|
|
22
|
+
bridge port 4400 (your app must dial THIS port, not your dev-server port)
|
|
23
|
+
daemon log /Users/you/.reticle/daemon-4400.log
|
|
24
|
+
tracing RETICLE_TRACE=1 on the daemon for per-stage timings in that log
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
One command, the whole setup. If this is clean and things still fail, the problem is in the app rather than the wiring.
|
|
28
|
+
|
|
29
|
+
The `sessions` line is the one to read first. Zero connected pages is a failing check, not a footnote, because it is the state a setup most often stalls in: everything installed, the daemon up, and nothing having dialled in. When it is zero, `doctor` prints the same diagnosis described below underneath the checklist, so you do not have to call a tool to see it.
|
|
30
|
+
|
|
31
|
+
## "No browser session connected"
|
|
32
|
+
|
|
33
|
+
By far the most common. Reticle's own diagnostic is unusually good here. It tells you whether the wiring was ever correct:
|
|
34
|
+
|
|
35
|
+
```json
|
|
36
|
+
{
|
|
37
|
+
"sessionCount": 0,
|
|
38
|
+
"why": "no browser session connected, but one WAS connected to this daemon earlier, so the wiring is correct. The tab was closed, navigated away, or hard-reloaded. Ask the human to reopen the app (or run `reticle open`), or reload the tab. You do not have to wait for the human: reticle_lease {action:\"acquire\", url} opens a browser Reticle drives itself."
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Read the `why`. "One WAS connected earlier" means stop debugging your config, just reopen the tab.
|
|
43
|
+
|
|
44
|
+
If nothing ever connected:
|
|
45
|
+
|
|
46
|
+
- Is the app running, and open in a browser?
|
|
47
|
+
- Is `reticle.connect()` actually executing? Check the dev guard is true.
|
|
48
|
+
- **Port mismatch.** This is the big one.
|
|
49
|
+
|
|
50
|
+
### The port mismatch
|
|
51
|
+
|
|
52
|
+
Your app dials a port; the daemon listens on one. When they disagree, the app runs perfectly and silently never connects. The browser console says so:
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
[Reticle] could not reach the bridge at ws://localhost:4460/reticle after 3 attempts.
|
|
56
|
+
Is the Reticle daemon running on that port? If your app runs in a container/devcontainer/WSL,
|
|
57
|
+
the daemon is on a different host, so set the WS URL explicitly
|
|
58
|
+
(Vite: VITE_RETICLE_WS_URL, or reticle.connect({ url })). Still retrying…
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
That message names the exact port it tried. Compare it with `bridge port` from `doctor` and set the one that is wrong:
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
VITE_RETICLE_WS_URL=ws://localhost:4400/reticle pnpm dev
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
<Warning>
|
|
68
|
+
The bridge port is **not** your dev-server port. A dev server on 4312 and a daemon on 4400 is
|
|
69
|
+
normal and correct.
|
|
70
|
+
</Warning>
|
|
71
|
+
|
|
72
|
+
## The click did nothing
|
|
73
|
+
|
|
74
|
+
Check whether the tab is throttled. Every response tells you:
|
|
75
|
+
|
|
76
|
+
```json
|
|
77
|
+
"warning": "tab throttled; timer/rAF/pointer gestures may silently no-op; refocus before driving"
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
A backgrounded browser tab has its timers suppressed. Synthetic pointer gestures and timers can silently no-op, so an action reports success and nothing happens.
|
|
81
|
+
|
|
82
|
+
Three fixes, in order of preference:
|
|
83
|
+
|
|
84
|
+
1. **Drive a lease**. A context Reticle owns, never backgrounded:
|
|
85
|
+
|
|
86
|
+
```json
|
|
87
|
+
{ "tool": "reticle_lease", "args": { "action": "acquire", "url": "http://localhost:4312/" } }
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Release it when you finish: `{ "action": "release", "sessionId": "lease-…" }`.
|
|
91
|
+
|
|
92
|
+
2. **Focus the tab.**
|
|
93
|
+
3. **Fail loudly** instead of pretending. Pass `refuseWhenThrottled: true` to your action.
|
|
94
|
+
|
|
95
|
+
If the tab is fine, check `occluded` on the element. A click that lands on a modal overlay is the other half of "the button doesn't work":
|
|
96
|
+
|
|
97
|
+
```json
|
|
98
|
+
{ "occluded": true, "occludedBy": "div.modal-backdrop" }
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## "ref no longer resolves to an element"
|
|
102
|
+
|
|
103
|
+
```
|
|
104
|
+
That ref is stale: refs are invalidated whenever the DOM re-renders, so any action that navigated,
|
|
105
|
+
opened a modal, re-sorted a list or changed the page invalidates every ref taken before it.
|
|
106
|
+
Reticle refuses here rather than clicking whatever now occupies that slot.
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
This is Reticle protecting you, not failing. Re-query for a fresh ref.
|
|
110
|
+
|
|
111
|
+
Better: use `reticle_act_and_wait { until }` for actions that change the page, so the next ref is taken after things settle.
|
|
112
|
+
|
|
113
|
+
<Warning>
|
|
114
|
+
Refs never survive a full navigation. A new document means new refs, the same button was `e5`
|
|
115
|
+
before a navigation and `e103` after.
|
|
116
|
+
</Warning>
|
|
117
|
+
|
|
118
|
+
## The verdict says `unknown`
|
|
119
|
+
|
|
120
|
+
`verified: "unknown"` means Reticle drove the app and could not tell. It is **not** a pass.
|
|
121
|
+
|
|
122
|
+
The usual cause is a throttled tab: throttling suppresses the quiescence detection used to decide the page has settled, so even a successful action can come back unsettled. Drive a lease and try again.
|
|
123
|
+
|
|
124
|
+
If it persists on an unthrottled context, that is worth reporting. Reticle's own response says so:
|
|
125
|
+
|
|
126
|
+
```json
|
|
127
|
+
"feedback_invite": "Reticle could not tell what happened here. If you expected otherwise, reticle_feedback. An unknown verdict is our defect, not yours"
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## A negative result you are not sure about
|
|
131
|
+
|
|
132
|
+
Before concluding "no request fired", read the buffer note:
|
|
133
|
+
|
|
134
|
+
```json
|
|
135
|
+
"buffer": { "held": 15, "dropped": 529, "note": "…a negative result here may be a false negative; the evidence may have expired…" }
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
"Nothing found" and "I no longer have what you asked about" are different answers. Grade sooner, or widen the buffer.
|
|
139
|
+
|
|
140
|
+
## The agent cannot find an element
|
|
141
|
+
|
|
142
|
+
- `reticle_snapshot { mode: "interactive" }` shows everything actionable.
|
|
143
|
+
- Add a `data-testid` for a stable handle.
|
|
144
|
+
- Narrow with `scope`. A CSS selector or a ref.
|
|
145
|
+
|
|
146
|
+
## Assertions are flaky on async UIs
|
|
147
|
+
|
|
148
|
+
- Use `timeout_ms` on `assert` and `wait_for`.
|
|
149
|
+
- Pass the `since` cursor from `reticle_act` so only post-action events count. Without it, an assertion can pass on an event from two clicks ago.
|
|
150
|
+
|
|
151
|
+
## `reticle_state` returns nothing
|
|
152
|
+
|
|
153
|
+
`storeNames` empty means no store was registered. `reticle_state` reads what your app registered in `src/reticle-dev.ts`.
|
|
154
|
+
|
|
155
|
+
<Warning>
|
|
156
|
+
Pass the **store**, not `() => store.getState()`. The getter form is read-only and silently produces
|
|
157
|
+
empty `stateDiffs`. Which reads as "nothing changed" and means "I was never watching".
|
|
158
|
+
</Warning>
|
|
159
|
+
|
|
160
|
+
## Source file is not resolving on React 19
|
|
161
|
+
|
|
162
|
+
React 19 dropped `_debugSource`. Wire up `@reticlehq/babel-plugin`. Or just use `@reticlehq/vite-plugin` or `@reticlehq/next`, which both include it. Without it you get component identity but no `file:line`.
|
|
163
|
+
|
|
164
|
+
## `ERESOLVE` installing next to a prerelease
|
|
165
|
+
|
|
166
|
+
`@reticlehq/next` declares `peer next >=13` and `@reticlehq/react` declares `peer react >=18`. On a Next canary or React RC, npm refuses. See [the prerelease notes](/getting-started#installing-alongside-a-nextjs-or-react-prerelease).
|
|
167
|
+
|
|
168
|
+
## Restarting things
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
npx @reticlehq/server stop # clean daemon shutdown, no pkill needed
|
|
172
|
+
npx @reticlehq/server status # confirm it came back
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
<Warning>
|
|
176
|
+
Do not kill port 4400 with `lsof -ti tcp:4400 | xargs kill -9`. That matches the MCP proxy as well
|
|
177
|
+
as the daemon and takes your agent's connection down with it. Use `reticle stop`, or at minimum
|
|
178
|
+
`lsof -sTCP:LISTEN`.
|
|
179
|
+
</Warning>
|
|
180
|
+
|
|
181
|
+
## Sessions piling up
|
|
182
|
+
|
|
183
|
+
Stale sessions pointing at dev servers you restarted an hour ago look completely plausible in a list, and one of them will get picked.
|
|
184
|
+
|
|
185
|
+
```json
|
|
186
|
+
{ "action": "end" }
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
`reticle_session { action: "end" }` when you are done, `{ action: "yield" }` when pausing. Both revive on your next action.
|
|
190
|
+
|
|
191
|
+
<Card title="Still stuck?" icon="comments" href="/tools-session-and-feedback">
|
|
192
|
+
`reticle feedback --agent` works even when nothing is installed and the daemon will not start.
|
|
193
|
+
</Card>
|