@reticlehq/server 3.1.0 → 3.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/SKILL.md +30 -28
- package/dist/command/cli/adhoc-suite.d.ts +19 -0
- package/dist/command/cli/adhoc-suite.js +88 -0
- package/dist/command/cli/adhoc-verdict.d.ts +23 -2
- package/dist/command/cli/adhoc-verdict.js +18 -10
- package/dist/command/cli/auth/device-flow.d.ts +2 -2
- package/dist/command/cli/cli-doctor.js +37 -5
- package/dist/command/cli/cli-flow-commands.d.ts +2 -1
- package/dist/command/cli/cli-kill.js +1 -1
- package/dist/command/cli/cli-parse-grammar.d.ts +7 -0
- package/dist/command/cli/cli-parse-grammar.js +7 -0
- package/dist/command/cli/cli-parse-verify.d.ts +2 -5
- package/dist/command/cli/cli-parse-verify.js +86 -13
- package/dist/command/cli/cli-parse.d.ts +8 -1
- package/dist/command/cli/cli-parse.js +38 -7
- package/dist/command/cli/cli-verify.d.ts +59 -0
- package/dist/command/cli/cli-verify.js +131 -19
- package/dist/command/cli/cloud-cli.js +7 -6
- package/dist/command/cli/cloud-kit.d.ts +0 -2
- package/dist/command/cli/cloud-kit.js +3 -7
- package/dist/command/cli/config/config-discovery.d.ts +12 -0
- package/dist/command/cli/config/config-discovery.js +19 -0
- package/dist/command/cli/doctor/doctor-rows.d.ts +12 -0
- package/dist/command/cli/doctor/doctor-rows.js +12 -0
- package/dist/command/cli/doctor/doctor-sessions-line.d.ts +2 -1
- package/dist/command/cli/drive/drive-command.js +1 -1
- package/dist/command/cli/launch/cli-launch.d.ts +3 -23
- package/dist/command/cli/launch/cli-launch.js +29 -70
- package/dist/command/cli/lifecycle/daemon-lifecycle.d.ts +33 -0
- package/dist/command/cli/lifecycle/daemon-lifecycle.js +198 -0
- package/dist/command/cli/mcp-command.js +5 -3
- package/dist/command/cli/ports/resolve/cli-port.d.ts +15 -1
- package/dist/command/cli/ports/resolve/cli-port.js +50 -2
- package/dist/command/cli/report-command.d.ts +16 -0
- package/dist/command/cli/report-command.js +97 -0
- package/dist/command/cli/status/status-lines.d.ts +28 -0
- package/dist/command/cli/status/status-lines.js +117 -0
- package/dist/command/cli.d.ts +1 -1
- package/dist/command/cli.js +29 -177
- package/dist/command/daemon/binding/daemon-status-probe.d.ts +32 -0
- package/dist/command/daemon/binding/daemon-status-probe.js +93 -0
- package/dist/command/daemon/binding/loopback-reach.d.ts +42 -0
- package/dist/command/daemon/binding/loopback-reach.js +63 -0
- package/dist/command/daemon/binding/port-presence.d.ts +1 -1
- package/dist/command/daemon/daemon-resilience.d.ts +13 -1
- package/dist/command/daemon/daemon-resilience.js +12 -1
- package/dist/command/daemon/daemon.d.ts +2 -11
- package/dist/command/daemon/daemon.js +8 -11
- package/dist/command/daemon/idle-shutdown.d.ts +2 -1
- package/dist/command/daemon/lifetime/heartbeat.d.ts +8 -0
- package/dist/command/daemon/lifetime/heartbeat.js +10 -0
- package/dist/command/daemon/lifetime/log-cap.d.ts +68 -0
- package/dist/command/daemon/lifetime/log-cap.js +115 -0
- package/dist/command/setup/agent-notice-memory.d.ts +16 -0
- package/dist/command/setup/agent-notice-memory.js +65 -0
- package/dist/command/setup/bringup/dev-server-wait.d.ts +1 -0
- package/dist/command/setup/bringup/dev-server-wait.js +16 -0
- package/dist/command/setup/bringup/ensure-daemon.js +1 -1
- package/dist/command/setup/init/init-host.js +8 -0
- package/dist/command/setup/init/init-runtime.js +13 -1
- package/dist/command/setup/node-effects.js +1 -1
- package/dist/command/setup/probe/page-probe.js +9 -2
- package/dist/command/setup/run-setup.d.ts +25 -7
- package/dist/command/setup/run-setup.js +51 -9
- package/dist/command/setup/setup-command.js +31 -3
- package/dist/command/setup/terminal/confirm.js +2 -1
- package/dist/command/update/updater.d.ts +27 -0
- package/dist/command/update/updater.js +35 -2
- package/dist/features/crawl/crawl-tools.js +3 -1
- package/dist/features/crawl/crawl.d.ts +2 -0
- package/dist/features/crawl/crawl.js +3 -1
- package/dist/features/harness/drive-report.d.ts +73 -0
- package/dist/features/harness/drive-report.js +196 -0
- package/dist/features/harness/driver.js +29 -8
- package/dist/features/harness/drivers.d.ts +19 -0
- package/dist/features/harness/drivers.js +19 -0
- package/dist/features/harness/fill-values.d.ts +67 -0
- package/dist/features/harness/fill-values.js +153 -0
- package/dist/features/harness/jev-driver.d.ts +188 -0
- package/dist/features/harness/jev-driver.js +661 -0
- package/dist/features/harness/openai-driver.d.ts +46 -0
- package/dist/features/harness/openai-driver.js +197 -0
- package/dist/features/harness/platform-config.d.ts +62 -0
- package/dist/features/harness/platform-config.js +97 -0
- package/dist/features/visual/visual-tools.js +26 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.js +80 -130
- package/dist/judgement/capsule/capsule-store.d.ts +31 -2
- package/dist/judgement/capsule/capsule-store.js +58 -6
- package/dist/judgement/capsule/capsule.js +5 -0
- package/dist/judgement/capsule/causal-summary.d.ts +13 -1
- package/dist/judgement/capsule/causal-summary.js +7 -0
- package/dist/judgement/domain/domain-model.js +38 -9
- package/dist/judgement/domain/domain-tools.js +4 -2
- package/dist/judgement/outcome/assertion-integrity.d.ts +3 -3
- package/dist/judgement/phenomena/phenomena.d.ts +2 -1
- package/dist/judgement/runs/artifact/gap-report.d.ts +17 -0
- package/dist/judgement/runs/artifact/gap-report.js +46 -0
- package/dist/judgement/runs/artifact/gap-summary.d.ts +58 -0
- package/dist/judgement/runs/artifact/gap-summary.js +85 -0
- package/dist/judgement/runs/artifact/render-report.js +4 -1
- package/dist/judgement/runs/artifact/to-artifact.d.ts +7 -2
- package/dist/judgement/runs/artifact/to-artifact.js +1 -1
- package/dist/judgement/runs/context-tools.js +21 -3
- package/dist/judgement/runs/drive-run.js +7 -2
- package/dist/judgement/runs/verification-sync.d.ts +2 -2
- package/dist/judgement/runs/verification-sync.js +9 -2
- package/dist/language/flows/affected-tools.js +6 -3
- package/dist/language/flows/annotate-notes/annotate.d.ts +0 -15
- package/dist/language/flows/annotate-notes/annotate.js +66 -18
- package/dist/language/flows/flow-anchor.d.ts +12 -0
- package/dist/language/flows/flow-anchor.js +20 -0
- package/dist/language/flows/flow-expect-grammar.d.ts +2 -2
- package/dist/language/flows/flow-expect-grammar.js +92 -11
- package/dist/language/flows/flow-intent.js +1 -1
- package/dist/language/flows/flow-learning.d.ts +3 -0
- package/dist/language/flows/flow-learning.js +39 -8
- package/dist/language/flows/flow-replay-run.d.ts +55 -10
- package/dist/language/flows/flow-replay-run.js +217 -58
- package/dist/language/flows/flow-replay-types.d.ts +9 -0
- package/dist/language/flows/flow-replay.d.ts +29 -11
- package/dist/language/flows/flow-replay.js +221 -203
- package/dist/language/flows/flow-result.d.ts +18 -1
- package/dist/language/flows/flow-result.js +18 -2
- package/dist/language/flows/flow-step-runners.d.ts +26 -10
- package/dist/language/flows/flow-step-runners.js +20 -4
- package/dist/language/flows/flow-store-for-session.d.ts +2 -1
- package/dist/language/flows/flow-success.d.ts +21 -6
- package/dist/language/flows/flow-success.js +50 -138
- package/dist/language/flows/flow-tools.js +8 -4
- package/dist/language/flows/flows.d.ts +15 -10
- package/dist/language/flows/flows.js +17 -4
- package/dist/language/flows/heal.d.ts +9 -1
- package/dist/language/flows/heal.js +24 -2
- package/dist/language/flows/learned-sources.d.ts +21 -0
- package/dist/language/flows/learned-sources.js +84 -0
- package/dist/language/flows/narrow-write.d.ts +4 -4
- package/dist/language/flows/recording/recording-backtrack.d.ts +0 -7
- package/dist/language/flows/recording/recording-backtrack.js +1 -1
- package/dist/language/flows/recording/replay-halt.d.ts +2 -1
- package/dist/language/flows/recording/tape/recordings.d.ts +2 -2
- package/dist/language/flows/replay.js +13 -9
- package/dist/language/flows/stores/annotation-store.d.ts +5 -5
- package/dist/language/flows/stores/assertion-tiers-store.js +2 -3
- package/dist/language/flows/stores/flake-store.js +2 -3
- package/dist/language/flows/suite/coverage.d.ts +1 -1
- package/dist/language/flows/suite/parallel-suite.d.ts +2 -1
- package/dist/language/flows/suite-selection.d.ts +15 -1
- package/dist/language/flows/suite-selection.js +1 -1
- package/dist/language/flows/verify-change-tools.js +21 -4
- package/dist/memory/cloud/account-state.d.ts +1 -1
- package/dist/memory/cloud/account-state.js +5 -4
- package/dist/memory/cloud/cloud-config.d.ts +9 -0
- package/dist/memory/cloud/cloud-config.js +9 -0
- package/dist/memory/cloud/cloud-sync.d.ts +7 -4
- package/dist/memory/cloud/cloud-sync.js +11 -6
- package/dist/memory/cloud/harness-config.d.ts +12 -0
- package/dist/memory/cloud/harness-config.js +58 -0
- package/dist/memory/cloud/harness-offer.d.ts +44 -0
- package/dist/memory/cloud/harness-offer.js +146 -0
- package/dist/memory/cloud/harness-switch.d.ts +11 -0
- package/dist/memory/cloud/harness-switch.js +53 -0
- package/dist/memory/cloud/sync-cycle.d.ts +12 -0
- package/dist/memory/cloud/sync-cycle.js +29 -4
- package/dist/memory/cloud/sync-daemon.d.ts +35 -2
- package/dist/memory/cloud/sync-daemon.js +45 -0
- package/dist/memory/cloud/sync-disk.js +11 -6
- package/dist/memory/impact/impact-recorder.d.ts +8 -0
- package/dist/memory/impact/impact-recorder.js +2 -1
- package/dist/memory/impact/impact-store.d.ts +5 -0
- package/dist/memory/impact/impact-store.js +25 -0
- package/dist/memory/intent/inline-intent.js +8 -3
- package/dist/memory/intent/intent-shard-store.d.ts +33 -47
- package/dist/memory/intent/intent-shard-store.js +253 -141
- package/dist/memory/intent/intent-shard.d.ts +22 -23
- package/dist/memory/intent/intent-shard.js +1 -1
- package/dist/memory/intent/intent-store.d.ts +13 -8
- package/dist/memory/intent/intent-store.js +46 -90
- package/dist/memory/intent/intent-tools.js +34 -23
- package/dist/memory/journal/ambient-store.js +2 -3
- package/dist/memory/journal/attach-journal.d.ts +11 -0
- package/dist/memory/journal/attach-journal.js +1 -1
- package/dist/memory/journal/deviation-report.js +4 -1
- package/dist/memory/journal/deviation-service.js +10 -2
- package/dist/memory/journal/drive-flow.d.ts +2 -2
- package/dist/memory/journal/drive-flow.js +21 -12
- package/dist/memory/journal/envelope-store.js +2 -3
- package/dist/memory/journal/journal-query.d.ts +35 -1
- package/dist/memory/journal/journal-query.js +46 -0
- package/dist/memory/journal/journal-recorder.d.ts +71 -2
- package/dist/memory/journal/journal-recorder.js +45 -7
- package/dist/memory/journal/on-disk/retain-policy.d.ts +34 -0
- package/dist/memory/journal/on-disk/retain-policy.js +44 -0
- package/dist/memory/journal/on-disk/retention.d.ts +91 -2
- package/dist/memory/journal/on-disk/retention.js +181 -11
- package/dist/memory/journal/on-disk/startup-maintenance.d.ts +42 -0
- package/dist/memory/journal/on-disk/startup-maintenance.js +14 -0
- package/dist/memory/journal/on-disk/workspace-gitignore.d.ts +0 -2
- package/dist/memory/journal/on-disk/workspace-gitignore.js +6 -38
- package/dist/memory/journal/on-disk/workspace-tiers.d.ts +52 -0
- package/dist/memory/journal/on-disk/workspace-tiers.js +88 -0
- package/dist/memory/journal/route-template.d.ts +22 -0
- package/dist/memory/journal/route-template.js +44 -0
- package/dist/memory/journal/self-observation.d.ts +3 -0
- package/dist/memory/journal/self-observation.js +67 -0
- package/dist/memory/journal/session-end.d.ts +17 -4
- package/dist/memory/journal/session-end.js +85 -7
- package/dist/memory/journal/session-journal.d.ts +122 -5
- package/dist/memory/journal/session-journal.js +489 -32
- package/dist/memory/project/artifact-root-resolver.d.ts +3 -0
- package/dist/memory/project/artifact-root-resolver.js +89 -0
- package/dist/memory/project/artifact-root.d.ts +39 -2
- package/dist/memory/project/artifact-root.js +58 -1
- package/dist/memory/project/baselines.d.ts +1 -1
- package/dist/memory/project/dir/fill-value-store.d.ts +32 -0
- package/dist/memory/project/dir/fill-value-store.js +88 -0
- package/dist/memory/project/dir/reticle-dir.d.ts +15 -5
- package/dist/memory/project/dir/reticle-dir.js +11 -0
- package/dist/memory/project/fs/fs-port.d.ts +22 -1
- package/dist/memory/project/fs/fs-port.js +72 -5
- package/dist/memory/project/fs/write-atomic.d.ts +26 -0
- package/dist/memory/project/fs/write-atomic.js +48 -0
- package/dist/memory/project/learned-routes.d.ts +16 -2
- package/dist/memory/project/learned-routes.js +26 -10
- package/dist/memory/project/project-for-root.d.ts +30 -0
- package/dist/memory/project/project-for-root.js +43 -0
- package/dist/memory/project/project-tools.js +10 -5
- package/dist/memory/project/session-root.d.ts +35 -6
- package/dist/memory/project/session-root.js +70 -8
- package/dist/memory/recall/prior/connection-memory.d.ts +6 -0
- package/dist/memory/recall/prior/connection-memory.js +8 -0
- package/dist/memory/recall/registered-projects.d.ts +2 -1
- package/dist/portal/bridge/auth-failure-reason.d.ts +9 -0
- package/dist/portal/bridge/auth-failure-reason.js +20 -3
- package/dist/portal/bridge/bridge.d.ts +6 -1
- package/dist/portal/bridge/bridge.js +36 -2
- package/dist/portal/input/real-input.js +2 -1
- package/dist/portal/pool/browser-pool.d.ts +10 -0
- package/dist/portal/pool/browser-pool.js +10 -0
- package/dist/portal/pool/playwright-launcher.js +1 -0
- package/dist/portal/pool/pool-contract.d.ts +2 -0
- package/dist/portal/pool/storage-seed.d.ts +2 -1
- package/dist/portal/pool/zero-install.d.ts +27 -0
- package/dist/portal/pool/zero-install.js +54 -0
- package/dist/portal/realm/web-realm.js +6 -0
- package/dist/portal/session/dev-server/dev-server-probe.d.ts +2 -1
- package/dist/portal/session/dev-server/served-document.d.ts +21 -0
- package/dist/portal/session/dev-server/served-document.js +57 -0
- package/dist/portal/session/facts/background-traffic.d.ts +9 -0
- package/dist/portal/session/facts/background-traffic.js +25 -0
- package/dist/portal/session/facts/session-replaced.d.ts +19 -0
- package/dist/portal/session/facts/session-replaced.js +22 -0
- package/dist/portal/session/live-control-tools.js +48 -3
- package/dist/portal/session/no-session-diagnosis.d.ts +1 -0
- package/dist/portal/session/no-session-diagnosis.js +67 -60
- package/dist/portal/session/no-session-next-action.js +3 -2
- package/dist/portal/session/no-session-watch.js +14 -10
- package/dist/portal/session/presence/attachment-history.d.ts +13 -2
- package/dist/portal/session/rebind.d.ts +18 -0
- package/dist/portal/session/rebind.js +38 -0
- package/dist/portal/session/session-health.d.ts +61 -0
- package/dist/portal/session/session-health.js +40 -1
- package/dist/portal/session/session-info.d.ts +6 -0
- package/dist/portal/session/session-manager.d.ts +13 -0
- package/dist/portal/session/session-manager.js +42 -3
- package/dist/portal/session/session-successor.d.ts +11 -0
- package/dist/portal/session/session-successor.js +14 -1
- package/dist/portal/session/session-verdict-facts.d.ts +28 -0
- package/dist/portal/session/session-verdict-facts.js +15 -0
- package/dist/portal/session/session.d.ts +26 -10
- package/dist/portal/session/session.js +48 -49
- package/dist/status-payload.d.ts +12 -1
- package/dist/status-payload.js +4 -1
- package/dist/surface/http-server.js +3 -5
- package/dist/surface/mcp/faults/mcp-outage.d.ts +2 -1
- package/dist/surface/mcp/faults/mcp-outage.js +20 -4
- package/dist/surface/mcp/mcp-proxy.d.ts +10 -1
- package/dist/surface/mcp/mcp-proxy.js +23 -12
- package/dist/surface/mcp/mcp.d.ts +10 -1
- package/dist/surface/mcp/mcp.js +59 -29
- package/dist/surface/mcp/proxy/proxy-daemon-probe.d.ts +15 -2
- package/dist/surface/mcp/proxy/proxy-daemon-probe.js +22 -5
- package/dist/surface/mcp/proxy/proxy-log.d.ts +5 -11
- package/dist/surface/mcp/proxy/proxy-log.js +7 -22
- package/dist/surface/mcp/proxy-idle-exit.d.ts +2 -1
- package/dist/surface/mcp/server-instructions.js +12 -1
- package/dist/surface/tools/act/act-preflight.js +6 -1
- package/dist/surface/tools/act/already-true.d.ts +40 -0
- package/dist/surface/tools/act/already-true.js +36 -0
- package/dist/surface/tools/act/navigation/navigate-arrival.d.ts +6 -0
- package/dist/surface/tools/act/navigation/navigate-arrival.js +13 -0
- package/dist/surface/tools/act/sequence-grade.js +13 -0
- package/dist/surface/tools/act/settle-in-flight.d.ts +6 -2
- package/dist/surface/tools/act/settle-in-flight.js +29 -6
- package/dist/surface/tools/act-capsule.js +49 -8
- package/dist/surface/tools/act-tools.js +25 -24
- package/dist/surface/tools/args/numeric-bounds.d.ts +15 -2
- package/dist/surface/tools/args/numeric-bounds.js +30 -3
- package/dist/surface/tools/assert/assert-grade.js +14 -2
- package/dist/surface/tools/assert/assert-verdict.js +74 -21
- package/dist/surface/tools/browser-tools.js +4 -3
- package/dist/surface/tools/coverage-tools.js +5 -2
- package/dist/surface/tools/dynamic-tools.js +43 -46
- package/dist/surface/tools/error-recovery.d.ts +6 -0
- package/dist/surface/tools/error-recovery.js +15 -0
- package/dist/surface/tools/explore-tools.js +80 -7
- package/dist/surface/tools/feedback-tools.d.ts +2 -1
- package/dist/surface/tools/feedback-tools.js +50 -3
- package/dist/surface/tools/first-sentence.d.ts +24 -0
- package/dist/surface/tools/first-sentence.js +0 -0
- package/dist/surface/tools/harness-explore.d.ts +125 -1
- package/dist/surface/tools/harness-explore.js +401 -15
- package/dist/surface/tools/harness-plan.d.ts +76 -0
- package/dist/surface/tools/harness-plan.js +156 -0
- package/dist/surface/tools/harness-toolset.js +12 -1
- package/dist/surface/tools/invoke-tool.js +82 -9
- package/dist/surface/tools/lease-hint.d.ts +8 -0
- package/dist/surface/tools/lease-hint.js +10 -0
- package/dist/surface/tools/lease-tools.d.ts +16 -28
- package/dist/surface/tools/lease-tools.js +53 -5
- package/dist/surface/tools/lineage-tools.js +1 -1
- package/dist/surface/tools/live-call-text.d.ts +6 -0
- package/dist/surface/tools/live-call-text.js +36 -2
- package/dist/surface/tools/observe-tools.js +69 -15
- package/dist/surface/tools/read/query-windowed.d.ts +1 -1
- package/dist/surface/tools/read/query-windowed.js +1 -1
- package/dist/surface/tools/read-tools.js +1 -2
- package/dist/surface/tools/real-input-attempt.d.ts +0 -5
- package/dist/surface/tools/real-input-attempt.js +1 -1
- package/dist/surface/tools/tool-kit.d.ts +23 -3
- package/dist/surface/tools/tool-kit.js +6 -1
- package/dist/surface/tools/tool-surface.js +17 -5
- package/dist/surface/tools/tools-helpers.d.ts +8 -7
- package/dist/surface/tools/tools-helpers.js +11 -13
- package/dist/surface/tools/tools.js +70 -30
- package/dist/telemetry/bug-found.js +32 -2
- package/dist/telemetry/feedback-context.js +3 -3
- package/dist/telemetry/feedback-local.d.ts +1 -0
- package/dist/telemetry/feedback-local.js +1 -3
- package/dist/telemetry/feedback.d.ts +1 -1
- package/dist/telemetry/harness-drive.d.ts +6 -0
- package/dist/telemetry/harness-drive.js +39 -0
- package/dist/telemetry/hud-metrics.d.ts +32 -0
- package/dist/telemetry/hud-metrics.js +95 -0
- package/dist/telemetry/mcp-connection.d.ts +14 -1
- package/dist/telemetry/mcp-connection.js +17 -2
- package/dist/telemetry/onboarding-firsts.d.ts +30 -1
- package/dist/telemetry/onboarding-firsts.js +54 -12
- package/dist/telemetry/session-metrics.d.ts +5 -0
- package/dist/telemetry/session-metrics.js +15 -1
- package/dist/telemetry/verification-of.js +31 -3
- package/dist/wire-journal.d.ts +31 -0
- package/dist/wire-journal.js +100 -0
- package/docs/README.md +1 -0
- package/docs/agent-cheatsheet.md +7 -3
- package/docs/autodrive.md +42 -2
- package/docs/benchmarks.md +1 -1
- package/docs/capabilities.mdx +1 -1
- package/docs/cli/cloud.mdx +11 -9
- package/docs/cli/doctor.mdx +1 -0
- package/docs/cli/init.mdx +1 -0
- package/docs/cli/report.mdx +44 -0
- package/docs/cli/status.mdx +35 -20
- package/docs/cli.mdx +8 -18
- package/docs/desktop.mdx +1 -1
- package/docs/faq.mdx +1 -1
- package/docs/flows.md +11 -0
- package/docs/frameworks.mdx +113 -1
- package/docs/install-agentic.mdx +36 -0
- package/docs/install-manual.mdx +1 -1
- package/docs/packages/tauri.mdx +1 -1
- package/docs/packages.mdx +1 -1
- package/docs/predicates.mdx +144 -4
- package/docs/system-map.md +6 -4
- package/docs/telemetry.md +2 -1
- package/docs/token-efficiency.md +2 -2
- package/docs/tools/overview.mdx +1 -1
- package/docs/tools/query.mdx +10 -10
- package/docs/troubleshooting.mdx +8 -2
- package/docs/usage.md +2 -2
- package/docs/what-is-recorded.md +62 -0
- package/package.json +5 -5
- package/dist/judgement/outcome/predicate-to-expect.d.ts +0 -44
- package/dist/judgement/outcome/predicate-to-expect.js +0 -148
package/docs/usage.md
CHANGED
|
@@ -84,7 +84,7 @@ Who benefits most: anyone shipping **dashboards, internal tools, SaaS apps**. Be
|
|
|
84
84
|
|
|
85
85
|
### `reticle_session { action: "list" }`
|
|
86
86
|
|
|
87
|
-
List connected tabs. → `{ sessions: [{ sessionId, url, title, lastSeenMs, hidden, focused, throttled }] }`. `lastSeenMs` is the silence since the tab last reported (not time-since-connect); `throttled` is `true` when the tab is hidden or has gone quiet, and a
|
|
87
|
+
List connected tabs. → `{ sessions: [{ sessionId, url, title, lastSeenMs, hidden, focused, throttled }] }`. `lastSeenMs` is the silence since the tab last reported (not time-since-connect); `throttled` is `true` when the tab is hidden **or** has merely gone quiet, and the two are not the same finding: a hidden tab clamps timers/rAF/pointer so an action can land on a page that never advances, while a quiet-but-visible tab is usually still driveable. The accompanying `recommendation` says which case you are in; treat `throttled` as a reason to read it, not as a reason to lease.
|
|
88
88
|
|
|
89
89
|
### `reticle_look { action: "page" }`
|
|
90
90
|
|
|
@@ -200,7 +200,7 @@ Verify a predicate; optionally wait for it.
|
|
|
200
200
|
- **args:** `predicate`, `timeout_ms?` (0 = evaluate once), `since?`, `intent?`, `sessionId?`.
|
|
201
201
|
- Same `since` default as `reticle_assert { action: "wait" }`: scoped to your last act so a stale buffered event can't fake a pass; override with an explicit `since`.
|
|
202
202
|
- **returns:** `{ verified, because, pass, evidence, contradictions?, coverage?, failureReason?, session, warning? }`. On failure includes a **near-miss** (e.g. "found the dialog but not visible", or "no button named 'Submit'; saw: Cancel"). The `session` block `{ lastSeenMs, throttled, focused }` reports tab health on every assert; when throttled a `warning` is attached so you never assert against a tab that is silently no-oping.
|
|
203
|
-
- **`intent` declares what the change was FOR, inline.** Pass a sentence in your own words and it lands in `.reticle/intent
|
|
203
|
+
- **`intent` declares what the change was FOR, inline.** Pass a sentence in your own words and it lands in `.reticle/intent/` (one directory per subject, a flow's name being its subject), the same git-checked ledger `reticle_intent` writes, before the verdict is drawn; a green verdict then marks it proved and names itself as the proof. Pass the **id** of an intent you already declared instead, to point several verdicts at one statement rather than restating it. `reticle_act_and_wait` takes the same argument. Omit it and nothing is written.
|
|
204
204
|
- **Read `verified`, not `pass`.** `pass` says the predicate held; `verified` says whether that means anything. It is `"no"` when a channel contradicts the assertion (a failed write under a green screen, a batch whose body reports per-item failures, a request still in flight), and `"unknown"` when the outcome could not be known yet: a `202 Accepted` that has not reconciled, or a write whose response body was never recorded. `because` names the deciding evidence in one sentence.
|
|
205
205
|
|
|
206
206
|
### `reticle_reconcile`
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: What is recorded
|
|
3
|
+
description: What Reticle keeps on your machine, what is redacted, and what it takes for any of it to leave.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Reticle drives your app and reads what it did. That means it holds real content from real pages, so this page says exactly what it keeps, where it keeps it, and what it takes to make any of it leave.
|
|
7
|
+
|
|
8
|
+
If you read one line: **a verdict is entirely local and needs no account.** Nothing is sent anywhere until you run `reticle login` and `reticle link`. Without them there is nowhere for anything to go.
|
|
9
|
+
|
|
10
|
+
## On your machine
|
|
11
|
+
|
|
12
|
+
Everything lands in `.reticle/` in your project, and it is yours. Three kinds of thing:
|
|
13
|
+
|
|
14
|
+
| | what it is | what is in it |
|
|
15
|
+
| --- | --- | --- |
|
|
16
|
+
| **runs** | a verdict and its evidence | what was claimed, whether it held, the request or state change that decided it, and the `file:line` of the element driven |
|
|
17
|
+
| **flows** | a journey you drove, saved so it can be replayed | the steps, the anchors they resolve by, and the values that were typed |
|
|
18
|
+
| **memory** | what this project has learned across sessions | intents you declared, envelopes of normal behaviour, notes about anchors that drift |
|
|
19
|
+
|
|
20
|
+
`.reticle/` splits into a part meant for git and a part meant to stay local. Flows are the part worth committing: a saved flow is a regression test. Evidence is the part that is not.
|
|
21
|
+
|
|
22
|
+
## What is redacted, and what is not
|
|
23
|
+
|
|
24
|
+
**Credential-shaped fields are redacted when a flow is saved.** A value typed into a field whose name looks like a secret is replaced with `<redacted: supply at replay>`, and replay reads the real value from `RETICLE_SECRET_<FIELD>` at run time. It keys off the field's name across every anchor kind (a testid, an accessible name, a signal), so an app without test ids is covered too.
|
|
25
|
+
|
|
26
|
+
**It is name-based, and that is the limit worth knowing.** It redacts a password. It does not redact a customer's name typed into a search box, because nothing about that field says "secret". A flow records the journey you actually drove.
|
|
27
|
+
|
|
28
|
+
So: **drive staging.** Not because the risk is large, but because it is real and avoiding it is free.
|
|
29
|
+
|
|
30
|
+
Network bodies are **not** captured by default. Page content that reaches a verdict is the element text and attributes the assertion needed, not a copy of the DOM.
|
|
31
|
+
|
|
32
|
+
## What leaves, only if you ask
|
|
33
|
+
|
|
34
|
+
`reticle login` signs this machine in. `reticle link` binds one repo to one cloud project. Until both have happened, `reticle push` has nothing to talk to and the sync path is a no-op. The code calls this the no-phone-home default.
|
|
35
|
+
|
|
36
|
+
Once linked, you choose what syncs:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
npx @reticlehq/server config --runs on|off --flows on|off --memory on|off
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Telemetry, which is separate from all of the above
|
|
43
|
+
|
|
44
|
+
The CLI sends anonymous usage events: event names and a random installation id. No code, no page content, no URLs from your app. It is how we know which parts of the product are reached at all.
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
RETICLE_TELEMETRY=0 # this shell
|
|
48
|
+
DO_NOT_TRACK=1 # the convention, honoured
|
|
49
|
+
npx @reticlehq/server telemetry disable # this machine, permanently
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Feedback is the only free text that ever leaves, it is never collected passively, and `RETICLE_FEEDBACK=0` disables it.
|
|
53
|
+
|
|
54
|
+
## What `init` writes to your project
|
|
55
|
+
|
|
56
|
+
Run it with `--dry-run` and it prints the whole plan without writing anything:
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
npx @reticlehq/server init --dry-run
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
`--app <dir>` picks which app in a monorepo. `--no-mcp` skips registering the MCP server with your agents and skips the agent rule files with it. `--files-only` writes the files and stops, without booting your dev server.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@reticlehq/server",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.3.0",
|
|
4
4
|
"description": "Reticle bridge + MCP server. Hosts the browser WS endpoint and exposes MCP tools to the coding agent.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -23,11 +23,11 @@
|
|
|
23
23
|
"ws": "^8.21.3",
|
|
24
24
|
"zod": "^3.24.1",
|
|
25
25
|
"zod-to-json-schema": "^3.24.0",
|
|
26
|
-
"@reticlehq/
|
|
27
|
-
"@reticlehq/
|
|
26
|
+
"@reticlehq/engine": "3.3.0",
|
|
27
|
+
"@reticlehq/browser": "3.3.0",
|
|
28
|
+
"@reticlehq/init": "3.3.0",
|
|
28
29
|
"open-verification": "1.0.0",
|
|
29
|
-
"@reticlehq/
|
|
30
|
-
"@reticlehq/init": "3.1.0"
|
|
30
|
+
"@reticlehq/core": "3.3.0"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
33
|
"@types/pngjs": "^6.0.5",
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The assertion the agent MADE, in the shape a saved flow can keep.
|
|
3
|
-
*
|
|
4
|
-
* `reticle_act_and_wait { until }` is how agents assert — nearly every asserting call in a day of telemetry
|
|
5
|
-
* carried an `until`. `compileActStep` recorded only the ACTION, so a flow saved after an asserted
|
|
6
|
-
* drive came back graded `assertion-free`: "performs actions but asserts no observable consequence —
|
|
7
|
-
* it will pass even if the feature is broken." The agent had already said what success meant;
|
|
8
|
-
* Reticle discarded it and then warned the agent that the flow asserts nothing.
|
|
9
|
-
*
|
|
10
|
-
* That is the regression-suite story failing at its last step. "Record once, verify forever" is only
|
|
11
|
-
* worth anything if the recorded flow can go RED, and locally 32 of 39 saved flows cannot.
|
|
12
|
-
*
|
|
13
|
-
* The inverse of `successToPredicate`. Only the kinds FlowExpect can express are carried: `settled`
|
|
14
|
-
* is a wait rather than a claim, and `animation`/`anyOf`/`not` have no representation at all (`route` gained one — see its case below).
|
|
15
|
-
* Inventing one would write an assertion into the file that the agent never made, which is worse
|
|
16
|
-
* than recording none — a flow that asserts something nobody chose is a false green with extra steps.
|
|
17
|
-
*/
|
|
18
|
-
import type { FlowExpect } from '@reticlehq/core';
|
|
19
|
-
import type { Predicate } from '@reticlehq/engine/question/predicate/predicate.js';
|
|
20
|
-
export declare function predicateToExpect(predicate: Predicate): FlowExpect | undefined;
|
|
21
|
-
/**
|
|
22
|
-
* The subset a REPLAY actually enforces.
|
|
23
|
-
*
|
|
24
|
-
* The rule has never changed: never write an assertion into a flow file that nothing evaluates. A
|
|
25
|
-
* flow reporting `grade: "asserted"` while its assertion is read by no one is a false green, in the
|
|
26
|
-
* feature whose entire purpose is preventing them.
|
|
27
|
-
*
|
|
28
|
-
* What changed is the SET. This kept only `element.testid` and `state`, because for a long time
|
|
29
|
-
* those were the only kinds replay checked — and the note here said lifting it "requires replay to
|
|
30
|
-
* evaluate them per step". Replay now does exactly that: `assertStepExpect` compiles every
|
|
31
|
-
* remaining kind through `successToPredicate` and waits on it. The condition was met and the filter
|
|
32
|
-
* was not updated, so the two drifted.
|
|
33
|
-
*
|
|
34
|
-
* That drift had a cost, and it fell on the agent. `reticle_act_and_wait { until }` IS the agent
|
|
35
|
-
* saying what success means, and `net` is overwhelmingly what it says. Every one of those was
|
|
36
|
-
* discarded at capture, so an agent-recorded flow reached disk assertion-free BY CONSTRUCTION and
|
|
37
|
-
* `reticle_verify` then correctly called it `unverifiable` — the record → save → verify path
|
|
38
|
-
* completing all the way to a run that could never be a pass. Found by driving it.
|
|
39
|
-
*
|
|
40
|
-
* The list below is exactly what `successToPredicate` reads, including an element located by
|
|
41
|
-
* role or name. A testid is also asserted directly against the DOM by the step runner. Anything
|
|
42
|
-
* it cannot compile is still dropped.
|
|
43
|
-
*/
|
|
44
|
-
export declare function enforcedOnReplay(expect: FlowExpect | undefined): FlowExpect | undefined;
|
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
import { PredicateKind } from '@reticlehq/core';
|
|
2
|
-
/** Merge two partial expectations; later keys win only where the earlier one said nothing. */
|
|
3
|
-
function merge(into, from) {
|
|
4
|
-
return { ...from, ...into };
|
|
5
|
-
}
|
|
6
|
-
export function predicateToExpect(predicate) {
|
|
7
|
-
switch (predicate.kind) {
|
|
8
|
-
case PredicateKind.SIGNAL: {
|
|
9
|
-
if (predicate.name === undefined)
|
|
10
|
-
return undefined;
|
|
11
|
-
const signal = { signal: predicate.name };
|
|
12
|
-
if (predicate.dataMatches !== undefined)
|
|
13
|
-
signal.signalData = predicate.dataMatches;
|
|
14
|
-
if (predicate.count !== undefined)
|
|
15
|
-
signal.signalCount = predicate.count;
|
|
16
|
-
return signal;
|
|
17
|
-
}
|
|
18
|
-
case PredicateKind.ROUTE: {
|
|
19
|
-
// Carried, not invented: the agent said "until the route is X" in so many words. The kinds
|
|
20
|
-
// below this comment's twin in the header — animation, anyOf, not — stay refused because
|
|
21
|
-
// there the file would gain a claim nobody made.
|
|
22
|
-
const route = {};
|
|
23
|
-
if (predicate.pathname !== undefined)
|
|
24
|
-
route.pathname = predicate.pathname;
|
|
25
|
-
if (predicate.contains !== undefined)
|
|
26
|
-
route.contains = predicate.contains;
|
|
27
|
-
return 0 === Object.keys(route).length ? undefined : { route };
|
|
28
|
-
}
|
|
29
|
-
case PredicateKind.NET: {
|
|
30
|
-
const net = {};
|
|
31
|
-
if (predicate.method !== undefined)
|
|
32
|
-
net.method = predicate.method;
|
|
33
|
-
if (predicate.urlContains !== undefined)
|
|
34
|
-
net.urlContains = predicate.urlContains;
|
|
35
|
-
if (predicate.status !== undefined)
|
|
36
|
-
net.status = predicate.status;
|
|
37
|
-
if (predicate.count !== undefined)
|
|
38
|
-
net.count = predicate.count;
|
|
39
|
-
return 0 === Object.keys(net).length ? undefined : { net };
|
|
40
|
-
}
|
|
41
|
-
case PredicateKind.CONSOLE: {
|
|
42
|
-
// `contains` has no representation in FlowExpect.console (core keeps `level` and `absent`
|
|
43
|
-
// and nothing else). Copying the rest through anyway would record an assertion the agent
|
|
44
|
-
// never made: {console, level:'warn', contains:'no-op', absent:true} would save "no warn
|
|
45
|
-
// entries at all", a false red on any unrelated warning, and in the presence direction it
|
|
46
|
-
// saves a strictly weaker claim than the one chosen. This file's own rule applies: record
|
|
47
|
-
// nothing rather than something different, so the flow stays assertion-free there instead.
|
|
48
|
-
if (predicate.contains !== undefined)
|
|
49
|
-
return undefined;
|
|
50
|
-
const console_ = {};
|
|
51
|
-
if (predicate.level !== undefined)
|
|
52
|
-
console_.level = predicate.level;
|
|
53
|
-
if (predicate.absent !== undefined)
|
|
54
|
-
console_.absent = predicate.absent;
|
|
55
|
-
return 0 === Object.keys(console_).length ? undefined : { console: console_ };
|
|
56
|
-
}
|
|
57
|
-
case PredicateKind.ELEMENT: {
|
|
58
|
-
const element = {};
|
|
59
|
-
if (predicate.query.testid !== undefined)
|
|
60
|
-
element.testid = predicate.query.testid;
|
|
61
|
-
if (predicate.query.role !== undefined)
|
|
62
|
-
element.role = predicate.query.role;
|
|
63
|
-
if (predicate.query.name !== undefined)
|
|
64
|
-
element.name = predicate.query.name;
|
|
65
|
-
return 0 === Object.keys(element).length ? undefined : { element };
|
|
66
|
-
}
|
|
67
|
-
case PredicateKind.STATE: {
|
|
68
|
-
const state = { path: predicate.path };
|
|
69
|
-
if (predicate.store !== undefined)
|
|
70
|
-
state.store = predicate.store;
|
|
71
|
-
if (predicate.equals !== undefined)
|
|
72
|
-
state.equals = predicate.equals;
|
|
73
|
-
return { state };
|
|
74
|
-
}
|
|
75
|
-
case PredicateKind.ALL_OF: {
|
|
76
|
-
// `settled` members drop out on their own by returning undefined.
|
|
77
|
-
let combined;
|
|
78
|
-
for (const part of predicate.predicates) {
|
|
79
|
-
const expect = predicateToExpect(part);
|
|
80
|
-
if (expect === undefined)
|
|
81
|
-
continue;
|
|
82
|
-
combined = combined === undefined ? expect : merge(combined, expect);
|
|
83
|
-
}
|
|
84
|
-
return combined;
|
|
85
|
-
}
|
|
86
|
-
default:
|
|
87
|
-
// settled | route | animation | anyOf | not — nothing FlowExpect can say honestly.
|
|
88
|
-
return undefined;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* The subset a REPLAY actually enforces.
|
|
93
|
-
*
|
|
94
|
-
* The rule has never changed: never write an assertion into a flow file that nothing evaluates. A
|
|
95
|
-
* flow reporting `grade: "asserted"` while its assertion is read by no one is a false green, in the
|
|
96
|
-
* feature whose entire purpose is preventing them.
|
|
97
|
-
*
|
|
98
|
-
* What changed is the SET. This kept only `element.testid` and `state`, because for a long time
|
|
99
|
-
* those were the only kinds replay checked — and the note here said lifting it "requires replay to
|
|
100
|
-
* evaluate them per step". Replay now does exactly that: `assertStepExpect` compiles every
|
|
101
|
-
* remaining kind through `successToPredicate` and waits on it. The condition was met and the filter
|
|
102
|
-
* was not updated, so the two drifted.
|
|
103
|
-
*
|
|
104
|
-
* That drift had a cost, and it fell on the agent. `reticle_act_and_wait { until }` IS the agent
|
|
105
|
-
* saying what success means, and `net` is overwhelmingly what it says. Every one of those was
|
|
106
|
-
* discarded at capture, so an agent-recorded flow reached disk assertion-free BY CONSTRUCTION and
|
|
107
|
-
* `reticle_verify` then correctly called it `unverifiable` — the record → save → verify path
|
|
108
|
-
* completing all the way to a run that could never be a pass. Found by driving it.
|
|
109
|
-
*
|
|
110
|
-
* The list below is exactly what `successToPredicate` reads, including an element located by
|
|
111
|
-
* role or name. A testid is also asserted directly against the DOM by the step runner. Anything
|
|
112
|
-
* it cannot compile is still dropped.
|
|
113
|
-
*/
|
|
114
|
-
export function enforcedOnReplay(expect) {
|
|
115
|
-
if (expect === undefined)
|
|
116
|
-
return undefined;
|
|
117
|
-
const kept = {};
|
|
118
|
-
// The step runner asserts a testid against the live DOM before the predicate engine. Role and
|
|
119
|
-
// name are not that path: successToPredicate compiles them, and dropping them here made a
|
|
120
|
-
// recorded `until` by button name vanish so the saved flow could not go red.
|
|
121
|
-
const element = expect.element;
|
|
122
|
-
if (undefined !== element &&
|
|
123
|
-
(undefined !== element.testid || undefined !== element.role || undefined !== element.name)) {
|
|
124
|
-
kept.element = element;
|
|
125
|
-
}
|
|
126
|
-
// Everything `successToPredicate` can compile. Replay evaluates EVERY kind of expect through it
|
|
127
|
-
// (see assertStepExpect); this list is what that function actually reads.
|
|
128
|
-
if (expect.state !== undefined)
|
|
129
|
-
kept.state = expect.state;
|
|
130
|
-
if (expect.signal !== undefined)
|
|
131
|
-
kept.signal = expect.signal;
|
|
132
|
-
if (expect.signalData !== undefined)
|
|
133
|
-
kept.signalData = expect.signalData;
|
|
134
|
-
if (expect.signalCount !== undefined)
|
|
135
|
-
kept.signalCount = expect.signalCount;
|
|
136
|
-
if (expect.net !== undefined)
|
|
137
|
-
kept.net = expect.net;
|
|
138
|
-
if (expect.console !== undefined)
|
|
139
|
-
kept.console = expect.console;
|
|
140
|
-
// `route` joined the list the day FlowExpect gained the field. This filter and
|
|
141
|
-
// `successToPredicate` are two allowlists for one question — "can replay check this?" — and the
|
|
142
|
-
// note above records them drifting once already. They drifted again here, in the same direction,
|
|
143
|
-
// within an hour: the field was added, the mapping was added, and a route assertion still reached
|
|
144
|
-
// disk as nothing because THIS list had not heard of it. Found by driving, not by a test.
|
|
145
|
-
if (expect.route !== undefined)
|
|
146
|
-
kept.route = expect.route;
|
|
147
|
-
return 0 === Object.keys(kept).length ? undefined : kept;
|
|
148
|
-
}
|