@reticlehq/server 3.7.0 → 3.8.1
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 +59 -68
- package/bin/reticle.js +9 -2
- package/dist/command/cli/adhoc-suite.js +1 -1
- package/dist/command/cli/adhoc-verdict.d.ts +12 -0
- package/dist/command/cli/adhoc-verdict.js +62 -4
- package/dist/command/cli/answers/gate-hook-message.d.ts +2 -0
- package/dist/command/cli/answers/gate-hook-message.js +5 -1
- package/dist/command/cli/auth/cloud-session.d.ts +11 -19
- package/dist/command/cli/auth/cloud-session.js +23 -0
- package/dist/command/cli/auth/device-flow.d.ts +3 -37
- package/dist/command/cli/cli-doctor.js +66 -21
- package/dist/command/cli/cli-flow-commands.js +53 -11
- package/dist/command/cli/cli-kill.d.ts +8 -0
- package/dist/command/cli/cli-kill.js +43 -3
- package/dist/command/cli/cli-parse-feedback.d.ts +4 -0
- package/dist/command/cli/cli-parse-feedback.js +13 -1
- package/dist/command/cli/cli-parse-grammar.d.ts +1 -2
- package/dist/command/cli/cli-parse-grammar.js +1 -6
- package/dist/command/cli/cli-parse-serve.d.ts +24 -0
- package/dist/command/cli/cli-parse-serve.js +124 -0
- package/dist/command/cli/cli-parse.d.ts +12 -11
- package/dist/command/cli/cli-parse.js +100 -123
- package/dist/command/cli/cli-usage.d.ts +0 -11
- package/dist/command/cli/cli-usage.js +43 -16
- package/dist/command/cli/cli-verify.d.ts +1 -1
- package/dist/command/cli/cli-verify.js +29 -14
- package/dist/command/cli/cloud-cli.js +27 -9
- package/dist/command/cli/cloud-kit.js +3 -3
- package/dist/command/cli/cloud-link.d.ts +1 -20
- package/dist/command/cli/cloud-link.js +2 -0
- package/dist/command/cli/cloud-login.d.ts +6 -2
- package/dist/command/cli/cloud-login.js +13 -41
- package/dist/command/cli/config/checkout.d.ts +10 -0
- package/dist/command/cli/config/checkout.js +78 -0
- package/dist/command/cli/doctor/doctor-agent-link.d.ts +23 -0
- package/dist/command/cli/doctor/doctor-agent-link.js +28 -0
- package/dist/command/cli/doctor/doctor-coverage-line.js +1 -7
- 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/drive/drive-attach.d.ts +5 -0
- package/dist/command/cli/drive/drive-attach.js +21 -1
- package/dist/command/cli/hook/codex-transcript.d.ts +20 -0
- package/dist/command/cli/hook/codex-transcript.js +224 -0
- package/dist/command/cli/hook/episode-structure.d.ts +24 -0
- package/dist/command/cli/hook/episode-structure.js +138 -0
- package/dist/command/cli/hook/hook-command.d.ts +9 -0
- package/dist/command/cli/hook/hook-command.js +211 -0
- package/dist/command/cli/hook/hook-fast.d.ts +31 -0
- package/dist/command/cli/hook/hook-fast.js +136 -0
- package/dist/command/cli/hook/prompt-hook.d.ts +30 -0
- package/dist/command/cli/hook/prompt-hook.js +199 -0
- package/dist/command/cli/hook/tool-hook.d.ts +21 -0
- package/dist/command/cli/hook/tool-hook.js +259 -0
- package/dist/command/cli/launch/cli-launch.d.ts +2 -0
- package/dist/command/cli/launch/cli-launch.js +22 -2
- package/dist/command/cli/lifecycle/daemon-lifecycle.js +28 -2
- package/dist/command/cli/mcp-command.d.ts +9 -0
- package/dist/command/cli/mcp-command.js +127 -41
- package/dist/command/cli/open-navigate.d.ts +43 -0
- package/dist/command/cli/open-navigate.js +85 -0
- package/dist/command/cli/ports/port-holder.d.ts +16 -4
- package/dist/command/cli/ports/port-holder.js +58 -12
- package/dist/command/cli/ports/resolve/cli-port.js +18 -2
- package/dist/command/cli/project-name.d.ts +1 -7
- package/dist/command/cli/project-name.js +1 -0
- package/dist/command/cli/report-command.d.ts +8 -2
- package/dist/command/cli/report-command.js +95 -18
- package/dist/command/cli/status-fields.d.ts +9 -2
- package/dist/command/cli/status-fields.js +148 -4
- package/dist/command/cli/try-command.d.ts +3 -4
- package/dist/command/cli/try-command.js +6 -11
- package/dist/command/cli/verify-results.d.ts +4 -1
- package/dist/command/cli/verify-results.js +3 -1
- package/dist/command/cli.d.ts +1 -7
- package/dist/command/cli.js +79 -160
- package/dist/command/daemon/daemon-resilience.d.ts +6 -1
- package/dist/command/daemon/daemon-resilience.js +31 -18
- package/dist/command/daemon/daemon.d.ts +11 -0
- package/dist/command/daemon/daemon.js +70 -2
- package/dist/command/daemon/lifetime/daemon-usefulness.d.ts +2 -0
- package/dist/command/daemon/lifetime/daemon-usefulness.js +13 -2
- package/dist/command/daemon/wake-decision.js +4 -2
- package/dist/command/daemon/win32-escape.d.ts +32 -0
- package/dist/command/daemon/win32-escape.js +119 -0
- package/dist/command/setup/agent-configs.d.ts +9 -0
- package/dist/command/setup/agent-configs.js +9 -0
- package/dist/command/setup/auto-approve.d.ts +10 -3
- package/dist/command/setup/auto-approve.js +51 -3
- package/dist/command/setup/bringup/dev-server-files.d.ts +1 -9
- package/dist/command/setup/bringup/dev-server-wait.js +5 -1
- package/dist/command/setup/bringup/ensure-daemon.js +4 -7
- package/dist/command/setup/init/init-host.js +6 -0
- package/dist/command/setup/init/init-port.js +5 -4
- package/dist/command/setup/init/init-runtime.js +7 -1
- package/dist/command/setup/node-effects.d.ts +8 -0
- package/dist/command/setup/node-effects.js +36 -4
- package/dist/command/setup/probe/dev-port.d.ts +26 -0
- package/dist/command/setup/probe/dev-port.js +117 -0
- package/dist/command/setup/probe/page-probe.d.ts +1 -1
- package/dist/command/setup/probe/page-probe.js +11 -3
- package/dist/command/setup/remaining-steps.d.ts +0 -7
- package/dist/command/setup/remaining-steps.js +3 -2
- package/dist/command/setup/run-setup.d.ts +11 -0
- package/dist/command/setup/run-setup.js +33 -5
- package/dist/command/setup/setup-command.d.ts +2 -0
- package/dist/command/setup/setup-command.js +22 -4
- package/dist/command/update/updater.d.ts +1 -6
- package/dist/command/update/updater.js +4 -5
- package/dist/command/update/version-seen.d.ts +24 -0
- package/dist/command/update/version-seen.js +65 -0
- package/dist/command/version/peer-announce.d.ts +9 -1
- package/dist/command/version/peer-announce.js +25 -2
- package/dist/command/version/sdk-fix.d.ts +5 -6
- package/dist/command/version/sdk-fix.js +17 -32
- package/dist/command/version/version-skew.d.ts +16 -1
- package/dist/command/version/version-skew.js +84 -10
- package/dist/features/crawl/crawl-tools.js +2 -2
- package/dist/features/crawl/crawl.js +2 -0
- package/dist/features/exhaust/ledger.d.ts +15 -96
- package/dist/features/exhaust/ledger.js +3 -3
- package/dist/features/harness/drive-runs.d.ts +28 -4
- package/dist/features/harness/drive-runs.js +99 -7
- package/dist/features/harness/drivers.d.ts +1 -1
- package/dist/features/harness/drivers.js +1 -1
- package/dist/features/harness/harness.d.ts +5 -0
- package/dist/features/harness/harness.js +24 -12
- package/dist/features/harness/platform/platform-drives.d.ts +7 -1
- package/dist/features/harness/platform/platform-drives.js +12 -7
- package/dist/features/harness/platform/refusal.d.ts +1 -1
- package/dist/features/harness/platform/refusal.js +4 -4
- package/dist/features/harness/platform/remote-drive.js +70 -28
- package/dist/features/harness/platform/server-driver.js +22 -1
- package/dist/features/harness/platform-config.d.ts +1 -10
- package/dist/features/harness/platform-config.js +0 -20
- package/dist/features/license/license.d.ts +2 -14
- package/dist/features/visual/step-shots.d.ts +33 -1
- package/dist/features/visual/step-shots.js +155 -1
- package/dist/features/visual/visual-tools.js +12 -4
- package/dist/hooks/coding-agents.d.ts +6 -0
- package/dist/hooks/coding-agents.js +24 -3
- package/dist/hooks/episode-stamp.d.ts +32 -0
- package/dist/hooks/episode-stamp.js +61 -0
- package/dist/hooks/hook-commands.js +19 -9
- package/dist/index.d.ts +5 -1
- package/dist/index.js +66 -24
- package/dist/judgement/app-graph/journal-steps.d.ts +8 -0
- package/dist/judgement/app-graph/journal-steps.js +92 -0
- package/dist/judgement/capsule/capsule-store.d.ts +2 -39
- package/dist/judgement/domain/domain-model.js +1 -10
- package/dist/judgement/domain/domain-tools.js +4 -2
- package/dist/judgement/runs/artifact/run-store.d.ts +28 -8
- package/dist/judgement/runs/artifact/run-store.js +153 -28
- package/dist/judgement/runs/default-run-id.d.ts +3 -1
- package/dist/judgement/runs/default-run-id.js +15 -3
- package/dist/judgement/runs/drive-run.d.ts +3 -3
- package/dist/judgement/runs/drive-run.js +11 -7
- package/dist/judgement/runs/run-ledger.d.ts +21 -0
- package/dist/judgement/runs/run-ledger.js +143 -0
- package/dist/judgement/runs/runner-port.d.ts +1 -1
- package/dist/judgement/runs/runner-port.js +8 -2
- package/dist/judgement/runs/verification-sync.d.ts +4 -3
- package/dist/judgement/runs/verification-sync.js +27 -5
- package/dist/language/flows/affected-tools.js +2 -1
- package/dist/language/flows/annotate-notes/annotate.js +8 -3
- package/dist/language/flows/annotate-tools.js +1 -1
- package/dist/language/flows/change/affected.d.ts +8 -0
- package/dist/language/flows/change/affected.js +20 -7
- package/dist/language/flows/decision.js +19 -4
- package/dist/language/flows/fields/flow-secret-field.d.ts +9 -0
- package/dist/language/flows/fields/flow-secret-field.js +67 -5
- package/dist/language/flows/flow-anchor.d.ts +5 -0
- package/dist/language/flows/flow-anchor.js +4 -0
- package/dist/language/flows/flow-cross-step.d.ts +7 -1
- package/dist/language/flows/flow-cross-step.js +9 -0
- package/dist/language/flows/flow-expect-grammar.js +15 -10
- package/dist/language/flows/flow-intent.js +6 -1
- package/dist/language/flows/flow-journey.d.ts +8 -0
- package/dist/language/flows/flow-journey.js +13 -0
- package/dist/language/flows/flow-lease.d.ts +27 -0
- package/dist/language/flows/flow-lease.js +59 -0
- package/dist/language/flows/flow-replay-run.d.ts +1 -87
- package/dist/language/flows/flow-replay-run.js +111 -310
- package/dist/language/flows/flow-replay.js +21 -19
- package/dist/language/flows/flow-replayable.d.ts +38 -0
- package/dist/language/flows/flow-replayable.js +179 -0
- package/dist/language/flows/flow-start-path.d.ts +108 -0
- package/dist/language/flows/flow-start-path.js +313 -0
- package/dist/language/flows/flow-step-runners.d.ts +23 -2
- package/dist/language/flows/flow-step-runners.js +191 -32
- package/dist/language/flows/flow-store-for-session.d.ts +8 -1
- package/dist/language/flows/flow-store-for-session.js +6 -0
- package/dist/language/flows/flow-tools.d.ts +2 -23
- package/dist/language/flows/flow-tools.js +63 -113
- package/dist/language/flows/flows.d.ts +4 -6
- package/dist/language/flows/flows.js +90 -15
- package/dist/language/flows/heal-run.d.ts +10 -4
- package/dist/language/flows/heal-run.js +26 -9
- package/dist/language/flows/recording/flake.d.ts +3 -27
- package/dist/language/flows/recording/flake.js +1 -1
- package/dist/language/flows/recording/recording-backtrack.js +1 -4
- package/dist/language/flows/recording/tape/recordings.d.ts +11 -1
- package/dist/language/flows/recording/tape/recordings.js +9 -3
- package/dist/language/flows/replay.d.ts +25 -5
- package/dist/language/flows/replay.js +83 -16
- package/dist/language/flows/stores/assertion-tiers-store.js +1 -1
- package/dist/language/flows/suite/coverage.d.ts +9 -0
- package/dist/language/flows/suite/coverage.js +12 -1
- package/dist/language/flows/suite-selection.d.ts +25 -0
- package/dist/language/flows/suite-selection.js +41 -9
- package/dist/machine/git-tracks.d.ts +6 -0
- package/dist/machine/git-tracks.js +36 -0
- package/dist/memory/cloud/background-sync.d.ts +25 -0
- package/dist/memory/cloud/background-sync.js +79 -0
- package/dist/memory/cloud/cloud-config.d.ts +12 -1
- package/dist/memory/cloud/cloud-config.js +39 -13
- package/dist/memory/cloud/cloud-sync.d.ts +3 -24
- package/dist/memory/cloud/cloud-sync.js +5 -2
- package/dist/memory/cloud/harness-config.d.ts +0 -7
- package/dist/memory/cloud/memory-scope.d.ts +19 -0
- package/dist/memory/cloud/memory-scope.js +48 -0
- package/dist/memory/cloud/sync-answer.d.ts +43 -0
- package/dist/memory/cloud/sync-answer.js +42 -0
- package/dist/memory/cloud/sync-cycle.d.ts +40 -10
- package/dist/memory/cloud/sync-cycle.js +97 -144
- package/dist/memory/cloud/sync-daemon.d.ts +50 -3
- package/dist/memory/cloud/sync-daemon.js +473 -83
- package/dist/memory/cloud/sync-describe.d.ts +28 -0
- package/dist/memory/cloud/sync-describe.js +92 -0
- package/dist/memory/cloud/sync-disk.d.ts +9 -1
- package/dist/memory/cloud/sync-disk.js +137 -33
- package/dist/memory/cloud/sync-flow-versions.d.ts +26 -0
- package/dist/memory/cloud/sync-flow-versions.js +42 -0
- package/dist/memory/impact/impact-store.js +32 -15
- package/dist/memory/intent/intent-shard.d.ts +41 -266
- package/dist/memory/intent/intent-tools.js +20 -61
- package/dist/memory/intent/record-request.d.ts +27 -0
- package/dist/memory/intent/record-request.js +88 -0
- package/dist/memory/intent/settled-words.js +9 -1
- package/dist/memory/journal/drive-flow.d.ts +3 -0
- package/dist/memory/journal/drive-flow.js +11 -41
- package/dist/memory/journal/envelope-store.js +1 -1
- package/dist/memory/journal/envelope.d.ts +6 -154
- package/dist/memory/journal/episode-log.d.ts +107 -0
- package/dist/memory/journal/episode-log.js +302 -0
- package/dist/memory/journal/journal-recorder.d.ts +7 -0
- package/dist/memory/journal/journal-recorder.js +22 -9
- package/dist/memory/journal/on-disk/ambient-file.d.ts +1 -7
- package/dist/memory/journal/on-disk/ambient-file.js +1 -1
- package/dist/memory/journal/on-disk/workspace-gitignore.d.ts +24 -3
- package/dist/memory/journal/on-disk/workspace-gitignore.js +38 -7
- package/dist/memory/journal/on-disk/workspace-tiers.js +7 -0
- package/dist/memory/journal/self-observation.js +3 -1
- package/dist/memory/journal/session-end.js +23 -9
- package/dist/memory/journal/session-journal.js +39 -20
- package/dist/memory/project/artifact-root-resolver.d.ts +14 -1
- package/dist/memory/project/artifact-root-resolver.js +68 -23
- package/dist/memory/project/artifact-root.d.ts +17 -3
- package/dist/memory/project/artifact-root.js +47 -9
- package/dist/memory/project/fs/fs-port.d.ts +5 -0
- package/dist/memory/project/fs/fs-port.js +13 -0
- package/dist/memory/project/learned-routes.d.ts +3 -4
- package/dist/memory/project/learned-routes.js +3 -11
- package/dist/memory/project/link-directory.js +5 -2
- package/dist/memory/project/root-claims.d.ts +3 -1
- package/dist/memory/project/root-claims.js +41 -7
- package/dist/memory/project/session-root.d.ts +1 -1
- package/dist/memory/project/session-root.js +1 -15
- package/dist/memory/project/sync-status.js +5 -6
- package/dist/memory/recall/memory-tools.js +2 -2
- package/dist/memory/recall/platform-memory.d.ts +3 -1
- package/dist/memory/recall/platform-memory.js +9 -1
- package/dist/memory/recall/project-memory.js +15 -19
- package/dist/portal/bridge/auth-failure-reason.d.ts +13 -0
- package/dist/portal/bridge/auth-failure-reason.js +19 -0
- package/dist/portal/bridge/bridge.d.ts +19 -4
- package/dist/portal/bridge/bridge.js +150 -177
- package/dist/portal/bridge/harness-request.d.ts +15 -0
- package/dist/portal/bridge/harness-request.js +19 -0
- package/dist/portal/bridge/origin/origin-follow.d.ts +46 -0
- package/dist/portal/bridge/origin/origin-follow.js +110 -0
- package/dist/portal/bridge/pairing-token.d.ts +6 -0
- package/dist/portal/bridge/pairing-token.js +47 -16
- package/dist/portal/bridge/protocol-skew.d.ts +27 -2
- package/dist/portal/bridge/protocol-skew.js +66 -2
- package/dist/portal/bridge/session-nonces.d.ts +46 -0
- package/dist/portal/bridge/session-nonces.js +72 -0
- package/dist/portal/input/viewport-tools.d.ts +31 -0
- package/dist/portal/input/viewport-tools.js +106 -15
- package/dist/portal/pool/bounded-close.d.ts +23 -0
- package/dist/portal/pool/bounded-close.js +38 -0
- package/dist/portal/pool/browser-pool.d.ts +44 -39
- package/dist/portal/pool/browser-pool.js +247 -95
- package/dist/portal/pool/context-permissions.d.ts +9 -1
- package/dist/portal/pool/context-permissions.js +26 -0
- package/dist/portal/pool/lease-emulation.d.ts +37 -0
- package/dist/portal/pool/lease-emulation.js +29 -0
- package/dist/portal/pool/playwright-launcher.d.ts +6 -0
- package/dist/portal/pool/playwright-launcher.js +74 -7
- package/dist/portal/pool/pool-contract.d.ts +23 -1
- package/dist/portal/pool/pool-lease.d.ts +128 -0
- package/dist/portal/pool/pool-lease.js +49 -0
- package/dist/portal/pool/zero-install.d.ts +8 -1
- package/dist/portal/pool/zero-install.js +24 -2
- package/dist/portal/production/production-activation.d.ts +136 -0
- package/dist/portal/production/production-activation.js +173 -0
- package/dist/portal/production/production-drive.d.ts +52 -0
- package/dist/portal/production/production-drive.js +301 -0
- package/dist/portal/production/production-hello.d.ts +23 -0
- package/dist/portal/production/production-hello.js +23 -0
- package/dist/portal/realm/web-realm.js +42 -15
- package/dist/portal/session/control-envelope.d.ts +1 -1
- package/dist/portal/session/dev-server/served-document.d.ts +0 -5
- package/dist/portal/session/dev-server/served-document.js +6 -8
- package/dist/portal/session/facts/handshake-facts.d.ts +8 -1
- package/dist/portal/session/first-run-wiring.d.ts +3 -36
- package/dist/portal/session/first-run-wiring.js +10 -103
- package/dist/portal/session/live-control-tools.js +61 -19
- package/dist/portal/session/no-session-next-action.d.ts +11 -0
- package/dist/portal/session/no-session-next-action.js +40 -15
- package/dist/portal/session/no-session-watch.d.ts +7 -0
- package/dist/portal/session/no-session-watch.js +67 -23
- package/dist/portal/session/output-budget.d.ts +10 -0
- package/dist/portal/session/output-budget.js +16 -0
- package/dist/portal/session/presence/session-lease.d.ts +2 -0
- package/dist/portal/session/presence/session-lease.js +8 -0
- package/dist/portal/session/recorded-gaps.d.ts +15 -11
- package/dist/portal/session/recorded-gaps.js +39 -18
- package/dist/portal/session/serving-directory.d.ts +24 -2
- package/dist/portal/session/serving-directory.js +93 -5
- package/dist/portal/session/session-info.d.ts +26 -0
- package/dist/portal/session/session-info.js +20 -0
- package/dist/portal/session/session-manager.d.ts +35 -3
- package/dist/portal/session/session-manager.js +69 -14
- package/dist/portal/session/session-successor.js +1 -9
- package/dist/portal/session/session-tools.js +22 -4
- package/dist/portal/session/session.d.ts +10 -10
- package/dist/portal/session/session.js +37 -29
- package/dist/portal/session/zero-install-first-call.d.ts +7 -2
- package/dist/portal/session/zero-install-first-call.js +43 -20
- package/dist/start-wiring.d.ts +2 -2
- package/dist/start-wiring.js +17 -3
- package/dist/status-payload.d.ts +11 -1
- package/dist/status-payload.js +7 -1
- package/dist/surface/agent-presence-grace.d.ts +11 -0
- package/dist/surface/agent-presence-grace.js +34 -0
- package/dist/surface/http-server.d.ts +12 -1
- package/dist/surface/http-server.js +64 -15
- package/dist/surface/mcp/faults/mcp-outage.d.ts +12 -2
- package/dist/surface/mcp/faults/mcp-outage.js +19 -1
- package/dist/surface/mcp/mcp-proxy.d.ts +17 -74
- package/dist/surface/mcp/mcp-proxy.js +194 -267
- package/dist/surface/mcp/mcp.d.ts +20 -3
- package/dist/surface/mcp/mcp.js +88 -25
- package/dist/surface/mcp/proxy/drive-calls.d.ts +44 -0
- package/dist/surface/mcp/proxy/drive-calls.js +114 -5
- package/dist/surface/mcp/proxy/proxy-boot.d.ts +11 -0
- package/dist/surface/mcp/proxy/proxy-boot.js +1 -0
- package/dist/surface/mcp/proxy/proxy-daemon-probe.d.ts +6 -0
- package/dist/surface/mcp/proxy/proxy-daemon-probe.js +14 -1
- package/dist/surface/mcp/proxy/proxy-handshake.d.ts +34 -2
- package/dist/surface/mcp/proxy/proxy-handshake.js +76 -8
- package/dist/surface/mcp/server-instructions.js +35 -16
- package/dist/surface/mcp/shared-params.d.ts +8 -0
- package/dist/surface/mcp/shared-params.js +15 -1
- package/dist/surface/mcp/sse-frame-parser.d.ts +11 -0
- package/dist/surface/mcp/sse-frame-parser.js +18 -0
- package/dist/surface/mcp/surface-vocabulary.d.ts +2 -0
- package/dist/surface/mcp/surface-vocabulary.js +13 -0
- package/dist/surface/mcp/tool-catalog-cache.d.ts +2 -0
- package/dist/surface/mcp/tool-catalog-cache.js +14 -4
- package/dist/surface/tools/account-tool.d.ts +4 -3
- package/dist/surface/tools/account-tool.js +20 -31
- package/dist/surface/tools/act/act-danger.d.ts +2 -0
- package/dist/surface/tools/act/act-danger.js +41 -14
- package/dist/surface/tools/act/act-observation.d.ts +11 -0
- package/dist/surface/tools/act/act-observation.js +33 -0
- package/dist/surface/tools/act/act-preflight.js +10 -3
- package/dist/surface/tools/act/act-sequence-retry.js +2 -1
- package/dist/surface/tools/act/act-target.js +19 -5
- package/dist/surface/tools/act/durable.js +1 -1
- package/dist/surface/tools/act/navigation/navigate-arrival.d.ts +9 -7
- package/dist/surface/tools/act/navigation/navigate-arrival.js +11 -14
- package/dist/surface/tools/act/unsettled-find.d.ts +36 -0
- package/dist/surface/tools/act/unsettled-find.js +71 -0
- package/dist/surface/tools/act-sequence-tool.js +53 -24
- package/dist/surface/tools/act-tools.d.ts +2 -3
- package/dist/surface/tools/act-tools.js +49 -47
- package/dist/surface/tools/agent/compact-envelope.d.ts +2 -2
- package/dist/surface/tools/agent/for-the-agent.js +41 -3
- package/dist/surface/tools/assert/assert-grade.js +8 -3
- package/dist/surface/tools/assert/assert-verdict.js +4 -2
- package/dist/surface/tools/browser-tools.js +7 -4
- package/dist/surface/tools/chat-drives.js +50 -25
- package/dist/surface/tools/coverage-tools.js +1 -1
- package/dist/surface/tools/dynamic-tools.d.ts +8 -0
- package/dist/surface/tools/dynamic-tools.js +89 -34
- package/dist/surface/tools/empty-session-list.d.ts +18 -25
- package/dist/surface/tools/empty-session-list.js +67 -38
- package/dist/surface/tools/error-recovery.d.ts +17 -7
- package/dist/surface/tools/error-recovery.js +53 -20
- package/dist/surface/tools/explore-tools.d.ts +10 -0
- package/dist/surface/tools/explore-tools.js +72 -19
- package/dist/surface/tools/feedback-tools.js +23 -2
- package/dist/surface/tools/gap-novelty.d.ts +6 -0
- package/dist/surface/tools/gap-novelty.js +9 -0
- package/dist/surface/tools/gaps/capability-absences.js +4 -3
- package/dist/surface/tools/harness-explore.d.ts +1 -1
- package/dist/surface/tools/harness-explore.js +6 -4
- package/dist/surface/tools/harness-gate.d.ts +43 -21
- package/dist/surface/tools/harness-gate.js +55 -81
- package/dist/surface/tools/harness-script.d.ts +2 -0
- package/dist/surface/tools/harness-script.js +11 -6
- package/dist/surface/tools/harness-toolset.js +3 -4
- package/dist/surface/tools/invoke-tool.d.ts +0 -8
- package/dist/surface/tools/invoke-tool.js +164 -178
- package/dist/surface/tools/lease-hint.d.ts +9 -0
- package/dist/surface/tools/lease-hint.js +22 -3
- package/dist/surface/tools/lease-permissions.d.ts +1 -1
- package/dist/surface/tools/lease-readiness.d.ts +55 -0
- package/dist/surface/tools/lease-readiness.js +150 -2
- package/dist/surface/tools/lease-tools.d.ts +3 -75
- package/dist/surface/tools/lease-tools.js +124 -188
- package/dist/surface/tools/map-tools.d.ts +20 -0
- package/dist/surface/tools/map-tools.js +145 -0
- package/dist/surface/tools/merge-tools.js +11 -7
- package/dist/surface/tools/next-step.js +6 -3
- package/dist/surface/tools/observe-tools.js +46 -35
- package/dist/surface/tools/platform-moment.d.ts +3 -12
- package/dist/surface/tools/platform-moment.js +12 -24
- package/dist/surface/tools/read/complete-snapshot.d.ts +7 -1
- package/dist/surface/tools/read/complete-snapshot.js +13 -2
- package/dist/surface/tools/read/query-paginate.js +6 -0
- package/dist/surface/tools/read/query-shape.d.ts +9 -0
- package/dist/surface/tools/read/query-shape.js +15 -0
- package/dist/surface/tools/read/snapshot-unmounted-note.d.ts +1 -0
- package/dist/surface/tools/read/snapshot-unmounted-note.js +73 -0
- package/dist/surface/tools/read-tools.js +5 -5
- package/dist/surface/tools/real-input-attempt.d.ts +11 -0
- package/dist/surface/tools/real-input-attempt.js +206 -38
- package/dist/surface/tools/reconcile-tools.js +21 -8
- package/dist/surface/tools/reticle-result.d.ts +3 -0
- package/dist/surface/tools/reticle-result.js +8 -1
- package/dist/surface/tools/run-report.d.ts +22 -0
- package/dist/surface/tools/run-report.js +141 -0
- package/dist/surface/tools/session-ports.d.ts +57 -0
- package/dist/surface/tools/session-ports.js +102 -0
- package/dist/surface/tools/tool-kit.d.ts +58 -4
- package/dist/surface/tools/tool-kit.js +140 -6
- package/dist/surface/tools/tool-surface.d.ts +2 -0
- package/dist/surface/tools/tool-surface.js +45 -0
- package/dist/surface/tools/tools.js +49 -87
- package/dist/telemetry/automation-hint.d.ts +5 -0
- package/dist/telemetry/automation-hint.js +7 -0
- package/dist/telemetry/cli-telemetry.d.ts +22 -0
- package/dist/telemetry/cli-telemetry.js +80 -11
- package/dist/telemetry/daemon-telemetry.d.ts +3 -1
- package/dist/telemetry/daemon-telemetry.js +9 -2
- package/dist/telemetry/feedback-cli.d.ts +1 -1
- package/dist/telemetry/feedback-cli.js +8 -3
- package/dist/telemetry/feedback.d.ts +1 -1
- package/dist/telemetry/feedback.js +51 -4
- package/dist/telemetry/harness-run.d.ts +3 -3
- package/dist/telemetry/harness-run.js +18 -7
- package/dist/telemetry/hud-events.d.ts +1 -1
- package/dist/telemetry/hud-metrics.d.ts +6 -3
- package/dist/telemetry/hud-metrics.js +20 -8
- package/dist/telemetry/install-source.js +1 -1
- package/dist/telemetry/mcp-connection.d.ts +1 -1
- package/dist/telemetry/mcp-connection.js +21 -2
- package/dist/telemetry/onboarding-firsts.d.ts +6 -1
- package/dist/telemetry/onboarding-firsts.js +41 -1
- package/dist/telemetry/proxy-telemetry.d.ts +42 -0
- package/dist/telemetry/proxy-telemetry.js +70 -1
- package/dist/telemetry/session-metrics.d.ts +1 -3
- package/dist/telemetry/session-metrics.js +16 -12
- package/dist/telemetry/telemetry.d.ts +9 -1
- package/dist/telemetry/telemetry.js +16 -1
- package/dist/telemetry/verification-of.d.ts +3 -1
- package/dist/telemetry/verification-of.js +7 -1
- package/dist/wire-journal.js +12 -2
- package/docs/README.md +4 -2
- package/docs/actions.mdx +7 -6
- package/docs/adapters.md +2 -1
- package/docs/agent-cheatsheet.md +19 -5
- package/docs/architecture.md +13 -10
- package/docs/autodrive.md +6 -5
- package/docs/benchmarks.md +2 -2
- package/docs/capabilities.mdx +1 -1
- package/docs/cli/affected.mdx +1 -1
- package/docs/cli/cloud.mdx +6 -6
- package/docs/cli/doctor.mdx +3 -1
- package/docs/cli/feedback.mdx +11 -7
- package/docs/cli/gate.mdx +1 -1
- package/docs/cli/help.mdx +1 -1
- package/docs/cli/init.mdx +20 -16
- package/docs/cli/mcp.mdx +5 -2
- package/docs/cli/open.mdx +5 -2
- package/docs/cli/report.mdx +1 -1
- package/docs/cli/restart.mdx +1 -1
- package/docs/cli/rollback.mdx +4 -4
- package/docs/cli/serve.mdx +7 -5
- package/docs/cli/setup.mdx +1 -1
- package/docs/cli/status.mdx +6 -2
- package/docs/cli/stop.mdx +3 -3
- package/docs/cli/telemetry.mdx +5 -1
- package/docs/cli/try.mdx +8 -8
- package/docs/cli/update.mdx +8 -5
- package/docs/cli/verify.mdx +12 -5
- package/docs/cli/version.mdx +1 -1
- package/docs/cli.mdx +10 -6
- package/docs/debugging.md +1 -1
- package/docs/deploy-checks.md +8 -6
- package/docs/desktop.mdx +14 -18
- package/docs/enterprise.md +6 -6
- package/docs/environment.mdx +5 -3
- package/docs/faq.mdx +9 -6
- package/docs/first-drive.md +19 -9
- package/docs/flows.md +3 -4
- package/docs/for-agents.md +1 -1
- package/docs/frameworks.mdx +34 -11
- package/docs/getting-started.md +46 -29
- package/docs/http-transport.md +2 -2
- package/docs/human-control.md +8 -8
- package/docs/index.mdx +2 -2
- package/docs/install-agentic.mdx +18 -19
- package/docs/install-manual.mdx +8 -4
- package/docs/integration-patterns.md +5 -5
- package/docs/multi-agent-testing.md +7 -5
- package/docs/packages/browser.mdx +34 -2
- package/docs/packages/core.mdx +2 -1
- package/docs/packages/electron.mdx +15 -3
- package/docs/packages/eslint-plugin.mdx +1 -1
- package/docs/packages/next.mdx +17 -5
- package/docs/packages/react.mdx +8 -1
- package/docs/packages/server.mdx +3 -3
- package/docs/packages/tauri.mdx +3 -3
- package/docs/packages/vite-plugin.mdx +1 -1
- package/docs/packages.mdx +19 -6
- package/docs/platform-integration.md +12 -4
- package/docs/predicates.mdx +18 -7
- package/docs/production-mode.md +108 -0
- package/docs/prompt-capture.md +99 -0
- package/docs/quickstart.mdx +14 -12
- package/docs/recipes.mdx +9 -8
- package/docs/required-checks.md +3 -2
- package/docs/skill-file.mdx +4 -3
- package/docs/skill-setup.md +2 -2
- package/docs/skill.md +62 -70
- package/docs/state-files.md +1 -0
- package/docs/state-management.mdx +11 -9
- package/docs/system-map.md +14 -13
- package/docs/telemetry.md +32 -24
- package/docs/testing.md +9 -5
- package/docs/tools/act-and-wait.mdx +17 -13
- package/docs/tools/act-sequence.mdx +40 -66
- package/docs/tools/act.mdx +7 -5
- package/docs/tools/assert.mdx +1 -1
- package/docs/tools/look.mdx +1 -1
- package/docs/tools/navigate.mdx +1 -1
- package/docs/tools/network.mdx +13 -11
- package/docs/tools/overview.mdx +3 -3
- package/docs/tools/query.mdx +3 -3
- package/docs/tools/session-and-feedback.mdx +9 -6
- package/docs/tools/sessions.mdx +7 -0
- package/docs/tools/snapshot.mdx +9 -7
- package/docs/tools/tools-and-run.mdx +11 -10
- package/docs/tools/verify.mdx +1 -1
- package/docs/troubleshooting.mdx +21 -9
- package/docs/usage.md +58 -43
- package/docs/use-cases.mdx +2 -2
- package/docs/vs-chrome-devtools-mcp.mdx +5 -5
- package/docs/vs-playwright-mcp.mdx +5 -4
- package/docs/what-is-recorded.md +12 -7
- package/docs/what-is-reticle.mdx +2 -2
- package/docs/why-reticle.mdx +1 -1
- package/package.json +9 -12
- package/dist/command/dev/stale-issue-guard.d.ts +0 -34
- package/dist/command/dev/stale-issue-guard.js +0 -69
|
@@ -7,13 +7,14 @@
|
|
|
7
7
|
* or a step's events land in the wrong window depending on how it was addressed.
|
|
8
8
|
*/
|
|
9
9
|
import { expectedElementTestid } from '@reticlehq/core';
|
|
10
|
-
import { AnchorKind, DEGRADED_ANCHOR_ROLE, DriftReason, PredicateKind, QueryBy, ReplayStatus, ReticleCommand, } from '@reticlehq/core';
|
|
11
|
-
import { ReticleTool } from '@reticlehq/core';
|
|
10
|
+
import { AnchorKind, DEGRADED_ANCHOR_ROLE, DOCUMENT_ANCHOR_ROLE, DriftReason, PredicateKind, QueryBy, ReplayStatus, ReticleCommand, } from '@reticlehq/core';
|
|
11
|
+
import { ReticleTool, isGlobalPressCall } from '@reticlehq/core';
|
|
12
12
|
import { replayActionArgs } from './replay.js';
|
|
13
13
|
import { isStaleRefError } from '../../surface/tools/act/act-sequence-retry.js';
|
|
14
14
|
import { waitForReaction } from '../../surface/tools/act/react-grace.js';
|
|
15
|
+
import { unreachableTargetNote } from '../../surface/tools/act/act-observation.js';
|
|
15
16
|
import { anchorFieldName } from './flows.js';
|
|
16
|
-
import { ambiguityDrift, refFor, anchorLabel, componentLabel, componentQueryArgs, expectElementDrift, reresolved, resolveQuery, testidDrift, } from './flow-anchor.js';
|
|
17
|
+
import { ambiguityDrift, refFor, anchorLabel, componentLabel, componentQueryArgs, expectElementDrift, queryOnce, reresolved, resolveQuery, testidDrift, } from './flow-anchor.js';
|
|
17
18
|
import { nearestRoleName } from './role-anchor-nearest.js';
|
|
18
19
|
import { roleDriftReason } from '../../judgement/outcome/role-drift-reason.js';
|
|
19
20
|
/** The live act_sequence tool gives each step this transport budget when none was supplied. */
|
|
@@ -168,7 +169,7 @@ reresolve) {
|
|
|
168
169
|
action: step.action ?? '',
|
|
169
170
|
args: replayActionArgs(step.args, confirmDangerous, field),
|
|
170
171
|
});
|
|
171
|
-
return { ok: r.ok, error: r.error };
|
|
172
|
+
return { ok: r.ok, error: r.error, result: r.result };
|
|
172
173
|
}
|
|
173
174
|
finally {
|
|
174
175
|
session.finishAction?.();
|
|
@@ -216,6 +217,19 @@ reresolve) {
|
|
|
216
217
|
const result = { step: index, tool: step.tool, anchor: label, ok: act.ok };
|
|
217
218
|
if (!act.ok)
|
|
218
219
|
result.error = replayDestructiveActionHint(act.error ?? 'command failed');
|
|
220
|
+
// A click no person could have made decides nothing, on replay as on a live act.
|
|
221
|
+
const unreachable = act.ok ? unreachableTargetNote(act.result) : undefined;
|
|
222
|
+
if (unreachable !== undefined)
|
|
223
|
+
return {
|
|
224
|
+
...result,
|
|
225
|
+
ok: false,
|
|
226
|
+
drift: {
|
|
227
|
+
reasonKind: DriftReason.TARGET_UNREACHABLE,
|
|
228
|
+
reason: unreachable,
|
|
229
|
+
anchor: label,
|
|
230
|
+
nearest: null,
|
|
231
|
+
},
|
|
232
|
+
};
|
|
219
233
|
return result;
|
|
220
234
|
}
|
|
221
235
|
/** How long to let the app finish re-rendering before the one retry. Matches the sequence path. */
|
|
@@ -279,6 +293,26 @@ export function isDegradedAnchor(anchor) {
|
|
|
279
293
|
anchor.role === DEGRADED_ANCHOR_ROLE &&
|
|
280
294
|
anchor.name === undefined);
|
|
281
295
|
}
|
|
296
|
+
/**
|
|
297
|
+
* A saved document-key press (#1559): the nameless `document` ROLE anchor on a press of a document
|
|
298
|
+
* key. It is dispatched with no ref, the way `act` ran it live, and never QUERIED: there is no
|
|
299
|
+
* element with that role to find, and the page's root would be the wrong target if there were.
|
|
300
|
+
*
|
|
301
|
+
* The press is checked as well as the anchor, so the same anchor on any other action stays an
|
|
302
|
+
* anchor that addresses nothing.
|
|
303
|
+
*/
|
|
304
|
+
export function isDocumentPressStep(step) {
|
|
305
|
+
return (step.anchor.kind === AnchorKind.ROLE &&
|
|
306
|
+
step.anchor.role === DOCUMENT_ANCHOR_ROLE &&
|
|
307
|
+
step.anchor.name === undefined &&
|
|
308
|
+
isGlobalPressCall({ action: step.action, args: step.args }));
|
|
309
|
+
}
|
|
310
|
+
/** A `document` ROLE anchor names no element, whatever the step's action. */
|
|
311
|
+
function isDocumentAnchor(anchor) {
|
|
312
|
+
return (anchor.kind === AnchorKind.ROLE &&
|
|
313
|
+
anchor.role === DOCUMENT_ANCHOR_ROLE &&
|
|
314
|
+
anchor.name === undefined);
|
|
315
|
+
}
|
|
282
316
|
/** What a step with no resolvable anchor reports, instead of a missing-element story. */
|
|
283
317
|
const DEGRADED_STEP_REASON = 'recorded without a resolvable anchor (no data-testid, no accessible role+name), so it can never ' +
|
|
284
318
|
'resolve on replay — add a data-testid to the element and record this flow again';
|
|
@@ -310,8 +344,9 @@ export function anchorQueryArgs(anchor) {
|
|
|
310
344
|
return { by: QueryBy.TESTID, value: anchor.value };
|
|
311
345
|
if (anchor.kind === AnchorKind.COMPONENT)
|
|
312
346
|
return componentQueryArgs(anchor);
|
|
313
|
-
if (anchor.kind === AnchorKind.ROLE && !isDegradedAnchor(anchor))
|
|
347
|
+
if (anchor.kind === AnchorKind.ROLE && !isDegradedAnchor(anchor) && !isDocumentAnchor(anchor)) {
|
|
314
348
|
return roleQueryArgs(anchor);
|
|
349
|
+
}
|
|
315
350
|
return null;
|
|
316
351
|
}
|
|
317
352
|
/**
|
|
@@ -324,7 +359,7 @@ export function anchorPrecondition(anchor) {
|
|
|
324
359
|
if (anchor.kind === AnchorKind.TESTID) {
|
|
325
360
|
return { kind: PredicateKind.ELEMENT, query: { testid: anchor.value } };
|
|
326
361
|
}
|
|
327
|
-
if (anchor.kind === AnchorKind.ROLE && !isDegradedAnchor(anchor)) {
|
|
362
|
+
if (anchor.kind === AnchorKind.ROLE && !isDegradedAnchor(anchor) && !isDocumentAnchor(anchor)) {
|
|
328
363
|
return { kind: PredicateKind.ELEMENT, query: { role: anchor.role, name: anchor.name } };
|
|
329
364
|
}
|
|
330
365
|
return undefined;
|
|
@@ -373,6 +408,10 @@ function staleSubStep(error, live, from, to) {
|
|
|
373
408
|
* drift whatever else happened, and a failure that is not staleness is a failure.
|
|
374
409
|
*/
|
|
375
410
|
export function staleTargetResult(name, steps) {
|
|
411
|
+
// A target no person could reach is the same kind of answer: nothing about the app was decided.
|
|
412
|
+
const unreachable = unreachableTargetResult(name, steps) ?? unreachedStepResult(name, steps);
|
|
413
|
+
if (unreachable !== undefined)
|
|
414
|
+
return unreachable;
|
|
376
415
|
if (steps.some((step) => step.drift !== undefined))
|
|
377
416
|
return undefined;
|
|
378
417
|
const failed = steps.filter((step) => !step.ok);
|
|
@@ -386,6 +425,64 @@ export function staleTargetResult(name, steps) {
|
|
|
386
425
|
unverifiable: { reason: staleTargetReason(only.step) },
|
|
387
426
|
};
|
|
388
427
|
}
|
|
428
|
+
/**
|
|
429
|
+
* The honest answer when a step acted on a target no person could have clicked (covered, of no
|
|
430
|
+
* size, off screen). The replay stopped there, and nothing about the app was decided: undecided as a
|
|
431
|
+
* whole, with the cause and the fix, as a live act answers it. Read as a drift, the suite counted it
|
|
432
|
+
* as a failed flow ("Reticle result: failed") on an app that may be fine.
|
|
433
|
+
*/
|
|
434
|
+
export function unreachableTargetResult(name, steps) {
|
|
435
|
+
const step = steps.find((s) => DriftReason.TARGET_UNREACHABLE === s.drift?.reasonKind);
|
|
436
|
+
if (step?.drift === undefined)
|
|
437
|
+
return undefined;
|
|
438
|
+
return {
|
|
439
|
+
name,
|
|
440
|
+
status: ReplayStatus.UNVERIFIABLE,
|
|
441
|
+
steps: [...steps],
|
|
442
|
+
unverifiable: { reason: `step ${String(step.step)}: ${step.drift.reason}` },
|
|
443
|
+
};
|
|
444
|
+
}
|
|
445
|
+
/** Drifts where the step's own control was never resolved, so the step never acted. */
|
|
446
|
+
const ANCHOR_MISSES = new Set([
|
|
447
|
+
DriftReason.TESTID_NOT_FOUND,
|
|
448
|
+
DriftReason.COMPONENT_NOT_FOUND,
|
|
449
|
+
DriftReason.ANCHOR_AMBIGUOUS,
|
|
450
|
+
DriftReason.ANCHOR_DEGRADED,
|
|
451
|
+
]);
|
|
452
|
+
/**
|
|
453
|
+
* The honest answer when a replay stopped before it acted on anything: its first failing step's
|
|
454
|
+
* control was not on the page, often because the page lacks a state the recording had (a task added
|
|
455
|
+
* before recording started). Nothing ran, so nothing was proved. Read as drift, the run synced as
|
|
456
|
+
* FAIL, and the dashboard showed a failure for a journey that was never tested.
|
|
457
|
+
*
|
|
458
|
+
* Only when no earlier step ran. A control that is missing after earlier steps acted is on a page
|
|
459
|
+
* those steps made, so it stays drift, and heal reads it. A step that acted and whose expectation
|
|
460
|
+
* did not hold is a consequence drift and stays a failure. The failing step keeps its index and
|
|
461
|
+
* its `drift.reasonKind`, which the synced run carries in `stepResults`.
|
|
462
|
+
*/
|
|
463
|
+
function unreachedStepResult(name, steps) {
|
|
464
|
+
const at = steps.findIndex((s) => !s.ok);
|
|
465
|
+
const step = steps[at];
|
|
466
|
+
const drift = step?.drift;
|
|
467
|
+
if (step === undefined || drift === undefined || !ANCHOR_MISSES.has(drift.reasonKind))
|
|
468
|
+
return undefined;
|
|
469
|
+
if (steps.slice(0, at).some((s) => s.ok))
|
|
470
|
+
return undefined;
|
|
471
|
+
// ponytail: one close, unambiguous survivor reads as a rename (heal's case), so it stays drift. A
|
|
472
|
+
// page with exactly one sibling of the missing control (`toggle-1` for `toggle-3`) reads the same.
|
|
473
|
+
if (drift.nearest !== null && true !== drift.ambiguous)
|
|
474
|
+
return undefined;
|
|
475
|
+
return {
|
|
476
|
+
name,
|
|
477
|
+
status: ReplayStatus.UNVERIFIABLE,
|
|
478
|
+
steps: [...steps],
|
|
479
|
+
unverifiable: {
|
|
480
|
+
reason: `did not reach step ${String(step.step + 1)} (${drift.reason}), so nothing was acted ` +
|
|
481
|
+
`on and nothing was proved. Start the replay from the state this step needs, or record the ` +
|
|
482
|
+
`steps that make it.`,
|
|
483
|
+
},
|
|
484
|
+
};
|
|
485
|
+
}
|
|
389
486
|
/**
|
|
390
487
|
* Run an act_sequence step: resolve every sub-step's OWN anchor, then dispatch the whole thing as one
|
|
391
488
|
* ACT_SEQUENCE — the same shape `replayProgram` already uses, so a recorded sequence and a saved one
|
|
@@ -398,7 +495,12 @@ export function staleTargetResult(name, steps) {
|
|
|
398
495
|
*/
|
|
399
496
|
export async function runSequenceStep(session, step, index, subs, confirmDangerous, sleep,
|
|
400
497
|
/** Testids whose presence is deliberately NOT asserted — the LLM-output case. */
|
|
401
|
-
dynamic = new Set()
|
|
498
|
+
dynamic = new Set(),
|
|
499
|
+
/**
|
|
500
|
+
* Judge one sub-step's `expect` over the window from `since`, which opens just before that
|
|
501
|
+
* sub-step's dispatch. Omitted for a setup step, whose consequences are not checked.
|
|
502
|
+
*/
|
|
503
|
+
judge) {
|
|
402
504
|
/**
|
|
403
505
|
* Find one sub-step's element as the page is NOW. Either the live step to dispatch, or the step
|
|
404
506
|
* result that ends the run: a degraded anchor, or one that is no longer on the page.
|
|
@@ -407,19 +509,36 @@ dynamic = new Set()) {
|
|
|
407
509
|
* that now matches several elements is drift there, as it is for a single step's retry: the first of
|
|
408
510
|
* the new matches may be an element the recording did not mean, and acting on it would report a pass
|
|
409
511
|
* for a click nobody can attribute. The first look keeps taking the first match.
|
|
512
|
+
*
|
|
513
|
+
* `ahead` is a look at a sub-step before its turn. It is one query with no settle. An anchor that is
|
|
514
|
+
* not on the page yet is `pending`, not drift, because an earlier sub-step can render it.
|
|
410
515
|
*/
|
|
411
|
-
const resolveSub = async (sub, subIndex, afterRerender = false) => {
|
|
516
|
+
const resolveSub = async (sub, subIndex, afterRerender = false, ahead = false) => {
|
|
412
517
|
const label = `${anchorLabel(sub.anchor)} (sub-step ${String(subIndex)})`;
|
|
518
|
+
if (isDocumentPressStep(sub)) {
|
|
519
|
+
// Dispatched as it ran live, at the document with no ref (#1559).
|
|
520
|
+
return {
|
|
521
|
+
live: {
|
|
522
|
+
ref: '',
|
|
523
|
+
action: sub.action ?? '',
|
|
524
|
+
args: replayActionArgs(sub.args, confirmDangerous, undefined),
|
|
525
|
+
},
|
|
526
|
+
};
|
|
527
|
+
}
|
|
413
528
|
const queryArgs = anchorQueryArgs(sub.anchor);
|
|
414
529
|
if (null === queryArgs)
|
|
415
530
|
return { stop: degradedStepResult(step, index, label) };
|
|
416
|
-
const { refs, hint } =
|
|
531
|
+
const { refs, hint } = ahead
|
|
532
|
+
? await queryOnce(session, queryArgs)
|
|
533
|
+
: await resolveQuery(session, queryArgs, sleep);
|
|
417
534
|
const ambiguous = afterRerender ? ambiguityDrift(sub.anchor, refs) : null;
|
|
418
535
|
if (ambiguous !== null) {
|
|
419
536
|
return { stop: { step: index, tool: step.tool, anchor: label, ok: false, drift: ambiguous } };
|
|
420
537
|
}
|
|
421
538
|
const ref = afterRerender ? refFor(sub.anchor, refs) : refs[0];
|
|
422
539
|
if (ref === undefined) {
|
|
540
|
+
if (ahead)
|
|
541
|
+
return { pending: true };
|
|
423
542
|
return {
|
|
424
543
|
stop: {
|
|
425
544
|
step: index,
|
|
@@ -447,15 +566,31 @@ dynamic = new Set()) {
|
|
|
447
566
|
},
|
|
448
567
|
};
|
|
449
568
|
};
|
|
450
|
-
// Every anchor is checked before anything runs, so a sub-step that has drifted away is reported as
|
|
451
|
-
// drift and not discovered half way through a sequence that has already acted.
|
|
452
569
|
const live = [];
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
570
|
+
/**
|
|
571
|
+
* Resolve sub-steps from `from`, as far as the page allows now. Return the index where the run must
|
|
572
|
+
* dispatch before it can look further.
|
|
573
|
+
*
|
|
574
|
+
* Sub-step `from` is the one whose turn it is. It gets the full settle, and it drifts if it is
|
|
575
|
+
* missing. At 0, that is before anything acted. Each later sub-step gets one look before its turn.
|
|
576
|
+
* The first one that is not on the page yet ends the stretch. Live, a later sub-step can target
|
|
577
|
+
* what an earlier one renders, for example the "Cancel" of a form that "Edit" opens (#1523). A
|
|
578
|
+
* sequence whose anchors are all on the page at the start is one stretch, so it is one batch.
|
|
579
|
+
*/
|
|
580
|
+
const resolveFrom = async (from) => {
|
|
581
|
+
for (let at = from; at < subs.length; at += 1) {
|
|
582
|
+
const sub = subs[at];
|
|
583
|
+
if (sub === undefined)
|
|
584
|
+
continue;
|
|
585
|
+
const resolved = await resolveSub(sub, at, false, at > from);
|
|
586
|
+
if ('pending' in resolved)
|
|
587
|
+
return { end: at };
|
|
588
|
+
if ('stop' in resolved)
|
|
589
|
+
return resolved;
|
|
590
|
+
live[at] = resolved.live;
|
|
591
|
+
}
|
|
592
|
+
return { end: subs.length };
|
|
593
|
+
};
|
|
459
594
|
const result = {
|
|
460
595
|
step: index,
|
|
461
596
|
tool: step.tool,
|
|
@@ -482,7 +617,7 @@ dynamic = new Set()) {
|
|
|
482
617
|
/**
|
|
483
618
|
* Run sub-steps [from, to), and survive the page re-rendering under them.
|
|
484
619
|
*
|
|
485
|
-
* The refs were resolved before
|
|
620
|
+
* The refs were resolved before their stretch ran, and the first action of a sequence is allowed to
|
|
486
621
|
* re-render the page, so by the time a later sub-step is reached its ref may be dead. The same
|
|
487
622
|
* anchor is almost always still there under a new ref; what was missing is a second look.
|
|
488
623
|
*
|
|
@@ -531,7 +666,9 @@ dynamic = new Set()) {
|
|
|
531
666
|
result.drift = resolved.stop.drift;
|
|
532
667
|
return false;
|
|
533
668
|
}
|
|
534
|
-
|
|
669
|
+
// A second look settles, so it is never `pending`.
|
|
670
|
+
if ('live' in resolved)
|
|
671
|
+
live[at] = resolved.live;
|
|
535
672
|
}
|
|
536
673
|
start = staleAt;
|
|
537
674
|
}
|
|
@@ -567,19 +704,41 @@ dynamic = new Set()) {
|
|
|
567
704
|
*
|
|
568
705
|
* The walk costs a round trip per sub-step, so only a flow that declared something pays for it.
|
|
569
706
|
*/
|
|
570
|
-
const
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
707
|
+
const judged = (sub) => judge !== undefined && sub.expect !== undefined;
|
|
708
|
+
const declaring = subs.some((sub) => declaredBy(sub) !== undefined || judged(sub));
|
|
709
|
+
for (let next = 0; next < subs.length;) {
|
|
710
|
+
const stretch = await resolveFrom(next);
|
|
711
|
+
if ('stop' in stretch)
|
|
712
|
+
return stretch.stop;
|
|
713
|
+
const { end } = stretch;
|
|
714
|
+
if (!declaring) {
|
|
715
|
+
if (!(await dispatchFrom(next, end)))
|
|
716
|
+
return result;
|
|
717
|
+
}
|
|
718
|
+
else {
|
|
719
|
+
for (let at = next; at < end; at += 1) {
|
|
720
|
+
const sub = subs[at];
|
|
721
|
+
if (sub === undefined)
|
|
722
|
+
continue;
|
|
723
|
+
const since = session.elapsed();
|
|
724
|
+
if (!(await dispatchFrom(at, at + 1)))
|
|
725
|
+
return result;
|
|
726
|
+
const testid = declaredBy(sub);
|
|
727
|
+
if (testid !== undefined && !(await assertDeclared(testid)))
|
|
728
|
+
return result;
|
|
729
|
+
// The claim is about THIS sub-step: a later one has not run, and an earlier one is before
|
|
730
|
+
// `since`. Judged at the end, a middle route expect failed and a late claim passed early.
|
|
731
|
+
const drift = judge !== undefined && sub.expect !== undefined
|
|
732
|
+
? await judge(sub.expect, since)
|
|
733
|
+
: undefined;
|
|
734
|
+
if (drift !== undefined) {
|
|
735
|
+
result.ok = false;
|
|
736
|
+
result.drift = drift;
|
|
737
|
+
return result;
|
|
738
|
+
}
|
|
739
|
+
}
|
|
740
|
+
}
|
|
741
|
+
next = end;
|
|
583
742
|
}
|
|
584
743
|
return result;
|
|
585
744
|
}
|
|
@@ -24,9 +24,16 @@
|
|
|
24
24
|
* returned unchanged.
|
|
25
25
|
*/
|
|
26
26
|
import { FlowStore } from './flows.js';
|
|
27
|
-
import type
|
|
27
|
+
import { type ProjectTarget } from '../../memory/project/session-root.js';
|
|
28
|
+
import type { ProjectId } from '@reticlehq/core';
|
|
28
29
|
import type { ToolDeps } from '../../surface/tools/tool-kit.js';
|
|
29
30
|
export declare function flowsForSession(deps: ToolDeps, target: ProjectTarget): {
|
|
30
31
|
flows: FlowStore;
|
|
31
32
|
root: string;
|
|
32
33
|
};
|
|
34
|
+
/** `flowsForSession` for a session id, with the project id to scope the store by. Same refusals. */
|
|
35
|
+
export declare function flowsForSessionId(deps: ToolDeps, sessionId: string | undefined): {
|
|
36
|
+
flows: FlowStore;
|
|
37
|
+
root: string;
|
|
38
|
+
projectId: ProjectId | undefined;
|
|
39
|
+
};
|
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
* returned unchanged.
|
|
25
25
|
*/
|
|
26
26
|
import { FlowStore } from './flows.js';
|
|
27
|
+
import { sessionTarget } from '../../memory/project/session-root.js';
|
|
27
28
|
export function flowsForSession(deps, target) {
|
|
28
29
|
const resolved = deps.artifactRootFor?.(target.projectId, target.origin);
|
|
29
30
|
if (resolved === undefined || resolved.root === deps.reticleRoot) {
|
|
@@ -35,3 +36,8 @@ export function flowsForSession(deps, target) {
|
|
|
35
36
|
root: resolved.root,
|
|
36
37
|
};
|
|
37
38
|
}
|
|
39
|
+
/** `flowsForSession` for a session id, with the project id to scope the store by. Same refusals. */
|
|
40
|
+
export function flowsForSessionId(deps, sessionId) {
|
|
41
|
+
const target = sessionTarget(deps, sessionId);
|
|
42
|
+
return { ...flowsForSession(deps, target), projectId: target.projectId };
|
|
43
|
+
}
|
|
@@ -1,25 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import type { ToolDef, ToolDeps } from '../../surface/tools/tool-kit.js';
|
|
1
|
+
import type { ToolDef } from '../../surface/tools/tool-kit.js';
|
|
3
2
|
export { replayNamedFlow } from './flow-replay-run.js';
|
|
4
|
-
|
|
5
|
-
* The URL a leased context should open: the app's ORIGIN, not the live tab's current location.
|
|
6
|
-
*
|
|
7
|
-
* The live tab drifts — every replay navigates it — so using its full URL made each lease start wherever
|
|
8
|
-
* the previous run happened to finish (observed: leases opening /deployments and failing to find the
|
|
9
|
-
* login control that only exists at the root). A lease must be a FRESH visit to a deterministic entry
|
|
10
|
-
* point; flows that need another page carry their own startPath.
|
|
11
|
-
*/
|
|
12
|
-
export declare function leasableAppUrl(deps: ToolDeps, sessionId: string | undefined): string | undefined;
|
|
13
|
-
/**
|
|
14
|
-
* The live session's own URL — what the fixture port must be looked up by.
|
|
15
|
-
*
|
|
16
|
-
* NOT `leasableAppUrl`. That returns an ORIGIN, and the input provider finds a page by comparing
|
|
17
|
-
* full URLs, so an origin matched no page: `suiteFixtureSeed` answered `undefined` on every run and
|
|
18
|
-
* every leased flow booted cold while the code read as if it were seeded. Silent, because every
|
|
19
|
-
* refusal on that path is deliberately silent — a fixture is an optimisation, and a suite must not
|
|
20
|
-
* die when one is unavailable.
|
|
21
|
-
*/
|
|
22
|
-
export declare function sessionUrlOf(deps: ToolDeps, sessionId: string | undefined): string | undefined;
|
|
23
|
-
/** A flow whose leased context never came up is a suite ERROR, never a silent pass. */
|
|
24
|
-
export declare function leaseFailureReplay(name: string, error: string | undefined): FlowReplayResult;
|
|
3
|
+
export { leasableAppUrl, leaseFailureReplay, sessionUrlOf } from './flow-lease.js';
|
|
25
4
|
export declare const FLOW_TOOLS: ToolDef[];
|