@reticlehq/server 3.5.0 → 3.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/SKILL.md +123 -116
- package/dist/chromium-launch-options.d.ts +3 -1
- package/dist/chromium-launch-options.js +2 -1
- package/dist/command/cli/adhoc-suite.d.ts +14 -0
- package/dist/command/cli/adhoc-suite.js +42 -7
- package/dist/command/cli/adhoc-verdict.d.ts +19 -2
- package/dist/command/cli/adhoc-verdict.js +76 -9
- package/dist/command/cli/answers/gate-exit.d.ts +23 -0
- package/dist/command/cli/answers/gate-exit.js +45 -0
- package/dist/command/cli/answers/gate-hook-message.d.ts +2 -0
- package/dist/command/cli/answers/gate-hook-message.js +3 -1
- package/dist/command/cli/answers/open-note.d.ts +2 -0
- package/dist/command/cli/answers/open-note.js +22 -0
- package/dist/command/cli/auth/device-flow.d.ts +13 -2
- package/dist/command/cli/auth/device-flow.js +17 -0
- package/dist/command/cli/cli-doctor.js +14 -0
- package/dist/command/cli/cli-flow-commands.d.ts +0 -11
- package/dist/command/cli/cli-flow-commands.js +31 -112
- package/dist/command/cli/cli-kill.js +3 -2
- package/dist/command/cli/cli-parse-grammar.d.ts +24 -0
- package/dist/command/cli/cli-parse-grammar.js +75 -0
- package/dist/command/cli/cli-parse-verify.d.ts +2 -0
- package/dist/command/cli/cli-parse-verify.js +18 -0
- package/dist/command/cli/cli-parse.d.ts +19 -28
- package/dist/command/cli/cli-parse.js +82 -182
- package/dist/command/cli/cli-update-commands.d.ts +1 -1
- package/dist/command/cli/cli-update-commands.js +61 -9
- package/dist/command/cli/cli-usage.d.ts +33 -0
- package/dist/command/cli/cli-usage.js +287 -0
- package/dist/command/cli/cli-verify.d.ts +35 -5
- package/dist/command/cli/cli-verify.js +114 -35
- package/dist/command/cli/cloud-cli.d.ts +13 -0
- package/dist/command/cli/cloud-cli.js +192 -341
- package/dist/command/cli/cloud-kit.d.ts +12 -0
- package/dist/command/cli/cloud-kit.js +41 -2
- package/dist/command/cli/cloud-link.d.ts +57 -0
- package/dist/command/cli/cloud-link.js +308 -0
- package/dist/command/cli/cloud-login.d.ts +22 -0
- package/dist/command/cli/cloud-login.js +96 -8
- package/dist/command/cli/context-command.d.ts +1 -0
- package/dist/command/cli/context-command.js +33 -0
- package/dist/command/cli/daemon-start-options.d.ts +3 -0
- package/dist/command/cli/daemon-start-options.js +24 -3
- package/dist/command/cli/doctor/browser/chromium-hint.d.ts +46 -0
- package/dist/command/cli/doctor/browser/chromium-hint.js +99 -1
- package/dist/command/cli/doctor/doctor-coverage-line.d.ts +2 -0
- package/dist/command/cli/doctor/doctor-coverage-line.js +47 -0
- package/dist/command/cli/doctor/doctor-project-line.d.ts +0 -12
- package/dist/command/cli/doctor/doctor-project-line.js +5 -4
- package/dist/command/cli/doctor/doctor-rows.d.ts +6 -0
- package/dist/command/cli/doctor/doctor-rows.js +6 -0
- package/dist/command/cli/doctor/doctor-signing-line.d.ts +38 -0
- package/dist/command/cli/doctor/doctor-signing-line.js +114 -0
- package/dist/command/cli/drive/drive-attach.d.ts +27 -2
- package/dist/command/cli/drive/drive-attach.js +71 -4
- package/dist/command/cli/drive/drive-command.d.ts +2 -1
- package/dist/command/cli/drive/drive-command.js +13 -7
- package/dist/command/cli/known-regression.d.ts +13 -0
- package/dist/command/cli/known-regression.js +34 -0
- package/dist/command/cli/launch/sdk-version-match.d.ts +12 -0
- package/dist/command/cli/launch/sdk-version-match.js +25 -0
- package/dist/command/cli/lifecycle/daemon-lifecycle.js +15 -3
- package/dist/command/cli/mcp-command.d.ts +6 -0
- package/dist/command/cli/mcp-command.js +13 -5
- package/dist/command/cli/ports/port-holder.d.ts +10 -0
- package/dist/command/cli/ports/port-holder.js +25 -1
- package/dist/command/cli/project-name.d.ts +29 -1
- package/dist/command/cli/project-name.js +107 -2
- package/dist/command/cli/setup-mcp-cli.d.ts +17 -1
- package/dist/command/cli/setup-mcp-cli.js +35 -12
- package/dist/command/cli/status/status-lines.d.ts +1 -0
- package/dist/command/cli/status/status-lines.js +47 -2
- package/dist/command/cli/status/workspace-links.d.ts +10 -0
- package/dist/command/cli/status/workspace-links.js +29 -0
- package/dist/command/cli/try-command.d.ts +96 -0
- package/dist/command/cli/try-command.js +362 -0
- package/dist/command/cli/tutorial.d.ts +0 -100
- package/dist/command/cli/tutorial.js +0 -181
- package/dist/command/cli/verify-results.d.ts +19 -0
- package/dist/command/cli/verify-results.js +29 -0
- package/dist/command/cli-onboarding.d.ts +0 -11
- package/dist/command/cli-onboarding.js +0 -15
- package/dist/command/cli.d.ts +20 -0
- package/dist/command/cli.js +130 -104
- package/dist/command/daemon/binding/daemon-status-probe.d.ts +2 -0
- package/dist/command/daemon/binding/daemon-status-probe.js +1 -0
- package/dist/command/daemon/daemon-resilience.js +4 -4
- package/dist/command/daemon/daemon-resolve.d.ts +23 -1
- package/dist/command/daemon/daemon-resolve.js +79 -9
- package/dist/command/setup/agent-writer.d.ts +1 -1
- package/dist/command/setup/agent-writer.js +3 -2
- package/dist/command/setup/bringup/bridge-port.d.ts +3 -1
- package/dist/command/setup/bringup/bridge-port.js +13 -3
- package/dist/command/setup/bringup/connect-lease.d.ts +1 -0
- package/dist/command/setup/bringup/connect-lease.js +1 -0
- package/dist/command/setup/bringup/dev-server-log-cap.js +2 -0
- package/dist/command/setup/bringup/dev-server-wait.d.ts +8 -0
- package/dist/command/setup/bringup/dev-server-wait.js +19 -0
- package/dist/command/setup/bringup/ensure-daemon.js +9 -2
- package/dist/command/setup/init/agent-restart.d.ts +23 -0
- package/dist/command/setup/init/agent-restart.js +28 -0
- package/dist/command/setup/init/init-port.d.ts +14 -1
- package/dist/command/setup/init/init-port.js +32 -2
- package/dist/command/setup/init/init-runtime.d.ts +22 -2
- package/dist/command/setup/init/init-runtime.js +114 -38
- package/dist/command/setup/node-effects.d.ts +2 -0
- package/dist/command/setup/node-effects.js +38 -9
- package/dist/command/setup/probe/existing-app.d.ts +12 -0
- package/dist/command/setup/probe/existing-app.js +14 -0
- package/dist/command/setup/remaining-steps.js +2 -1
- package/dist/command/setup/run-setup.d.ts +34 -9
- package/dist/command/setup/run-setup.js +65 -51
- package/dist/command/setup/setup-command.d.ts +25 -1
- package/dist/command/setup/setup-command.js +59 -4
- package/dist/command/setup/setup-mcp.js +25 -2
- package/dist/command/setup/tauri-signing.d.ts +19 -0
- package/dist/command/setup/tauri-signing.js +79 -0
- package/dist/command/setup/terminal/listeners.d.ts +10 -1
- package/dist/command/setup/terminal/listeners.js +37 -6
- package/dist/command/update/update-nudge.d.ts +9 -0
- package/dist/command/update/update-nudge.js +1 -1
- package/dist/command/update/updater.js +11 -15
- package/dist/command/version/version-nudge.js +3 -0
- package/dist/command/version/version-skew.d.ts +20 -1
- package/dist/command/version/version-skew.js +49 -4
- package/dist/features/crawl/crawl-tools.js +4 -0
- package/dist/features/crawl/crawl.d.ts +6 -0
- package/dist/features/crawl/crawl.js +23 -2
- package/dist/features/exhaust/ledger.d.ts +21 -14
- package/dist/features/exhaust/ledger.js +35 -9
- package/dist/features/harness/app-findings.d.ts +2 -0
- package/dist/features/harness/app-findings.js +52 -0
- package/dist/features/harness/drive-report.d.ts +61 -1
- package/dist/features/harness/drive-report.js +394 -26
- package/dist/features/harness/drive-runs.d.ts +120 -0
- package/dist/features/harness/drive-runs.js +289 -0
- package/dist/features/harness/drivers.d.ts +10 -14
- package/dist/features/harness/drivers.js +10 -14
- package/dist/features/harness/explore/console-pages.d.ts +15 -0
- package/dist/features/harness/explore/console-pages.js +146 -0
- package/dist/features/harness/explore/disparity.d.ts +19 -0
- package/dist/features/harness/explore/disparity.js +71 -0
- package/dist/features/harness/explore/fake-app.d.ts +16 -0
- package/dist/features/harness/explore/fake-app.js +49 -0
- package/dist/features/harness/explore/goal-search.d.ts +26 -0
- package/dist/features/harness/explore/goal-search.js +144 -0
- package/dist/features/harness/explore/page-tree.d.ts +49 -0
- package/dist/features/harness/explore/page-tree.js +148 -0
- package/dist/features/harness/explore/site-map.d.ts +34 -0
- package/dist/features/harness/explore/site-map.js +150 -0
- package/dist/features/harness/fill-values.d.ts +3 -73
- package/dist/features/harness/fill-values.js +3 -169
- package/dist/features/harness/goals.d.ts +82 -0
- package/dist/features/harness/goals.js +330 -0
- package/dist/features/harness/harness.d.ts +51 -1
- package/dist/features/harness/harness.js +207 -6
- package/dist/features/harness/platform/drive-target.d.ts +30 -0
- package/dist/features/harness/platform/drive-target.js +81 -0
- package/dist/features/harness/platform/local-apps.d.ts +127 -0
- package/dist/features/harness/platform/local-apps.js +280 -0
- package/dist/features/harness/platform/persona-credentials.d.ts +20 -0
- package/dist/features/harness/platform/persona-credentials.js +69 -0
- package/dist/features/harness/platform/platform-drives.d.ts +61 -0
- package/dist/features/harness/platform/platform-drives.js +114 -0
- package/dist/features/harness/platform/refusal.d.ts +52 -0
- package/dist/features/harness/platform/refusal.js +71 -0
- package/dist/features/harness/platform/remote-drive.d.ts +186 -0
- package/dist/features/harness/platform/remote-drive.js +378 -0
- package/dist/features/harness/platform/script.d.ts +94 -0
- package/dist/features/harness/platform/script.js +260 -0
- package/dist/features/harness/platform/server-driver.d.ts +54 -0
- package/dist/features/harness/platform/server-driver.js +182 -0
- package/dist/features/harness/platform-config.d.ts +41 -1
- package/dist/features/harness/platform-config.js +106 -9
- package/dist/features/harness/route-guess.d.ts +13 -0
- package/dist/features/harness/route-guess.js +49 -0
- package/dist/features/harness/script/app-controls.d.ts +5 -0
- package/dist/features/harness/script/app-controls.js +40 -0
- package/dist/features/harness/script/lane-ids.d.ts +14 -0
- package/dist/features/harness/script/lane-ids.js +16 -0
- package/dist/features/harness/script/script-run.d.ts +70 -0
- package/dist/features/harness/script/script-run.js +606 -0
- package/dist/features/license/license.d.ts +2 -2
- package/dist/features/visual/step-shots.d.ts +31 -0
- package/dist/features/visual/step-shots.js +231 -0
- package/dist/features/visual/visual-tools.d.ts +10 -1
- package/dist/features/visual/visual-tools.js +62 -17
- package/dist/hooks/client-directory.d.ts +18 -0
- package/dist/hooks/client-directory.js +57 -0
- package/dist/hooks/coding-agents.d.ts +34 -0
- package/dist/hooks/coding-agents.js +117 -0
- package/dist/hooks/driven-by.d.ts +23 -0
- package/dist/hooks/driven-by.js +56 -0
- package/dist/hooks/hook-bus.d.ts +4 -0
- package/dist/hooks/hook-bus.js +18 -0
- package/dist/hooks/hook-commands.js +15 -4
- package/dist/hooks/tool-log.d.ts +9 -0
- package/dist/hooks/tool-log.js +29 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +80 -243
- package/dist/judgement/capsule/capsule-store.d.ts +2 -2
- package/dist/judgement/capsule/causal-summary.d.ts +15 -1
- package/dist/judgement/capsule/causal-summary.js +33 -0
- package/dist/judgement/runs/artifact/build-verification-run.d.ts +1 -1
- package/dist/judgement/runs/artifact/build-verification-run.js +25 -3
- package/dist/judgement/runs/artifact/gap-summary.d.ts +0 -18
- package/dist/judgement/runs/artifact/gap-summary.js +12 -3
- package/dist/judgement/runs/artifact/replay-mapping.d.ts +1 -1
- package/dist/judgement/runs/artifact/replay-mapping.js +37 -11
- package/dist/judgement/runs/artifact/run-store.d.ts +14 -2
- package/dist/judgement/runs/artifact/run-store.js +195 -3
- package/dist/judgement/runs/context-tools.js +59 -1
- package/dist/judgement/runs/default-run-id.d.ts +3 -0
- package/dist/judgement/runs/default-run-id.js +16 -0
- package/dist/judgement/runs/drive-run.d.ts +71 -1
- package/dist/judgement/runs/drive-run.js +317 -5
- package/dist/judgement/runs/repair-prompt.js +1 -1
- package/dist/judgement/runs/resume.d.ts +44 -0
- package/dist/judgement/runs/resume.js +137 -0
- package/dist/judgement/runs/reticle-runner.js +13 -3
- package/dist/judgement/runs/runner-port.d.ts +5 -1
- package/dist/judgement/runs/runner-port.js +8 -2
- package/dist/judgement/runs/verification-sync.d.ts +5 -2
- package/dist/judgement/runs/verification-sync.js +40 -18
- package/dist/language/flows/change/gate.d.ts +10 -0
- package/dist/language/flows/change/gate.js +22 -0
- package/dist/language/flows/decision.js +36 -1
- package/dist/language/flows/fields/flow-secret-field.d.ts +12 -0
- package/dist/language/flows/fields/flow-secret-field.js +25 -2
- package/dist/language/flows/flow-anchor.d.ts +61 -10
- package/dist/language/flows/flow-anchor.js +98 -6
- package/dist/language/flows/flow-cross-step.d.ts +15 -0
- package/dist/language/flows/flow-cross-step.js +21 -0
- package/dist/language/flows/flow-intent.d.ts +1 -0
- package/dist/language/flows/flow-journey.d.ts +6 -0
- package/dist/language/flows/flow-journey.js +20 -0
- package/dist/language/flows/flow-learning.d.ts +4 -0
- package/dist/language/flows/flow-learning.js +45 -14
- package/dist/language/flows/flow-mutate-tools.js +5 -3
- package/dist/language/flows/flow-replay-run.d.ts +23 -9
- package/dist/language/flows/flow-replay-run.js +115 -110
- package/dist/language/flows/flow-replay-types.d.ts +1 -1
- package/dist/language/flows/flow-replay.d.ts +40 -1
- package/dist/language/flows/flow-replay.js +110 -22
- package/dist/language/flows/flow-result.d.ts +22 -1
- package/dist/language/flows/flow-result.js +47 -2
- package/dist/language/flows/flow-scope.js +5 -1
- package/dist/language/flows/flow-step-runners.d.ts +22 -2
- package/dist/language/flows/flow-step-runners.js +247 -47
- package/dist/language/flows/flow-store-for-session.d.ts +2 -2
- package/dist/language/flows/flow-store-for-session.js +7 -3
- package/dist/language/flows/flow-tools.d.ts +10 -0
- package/dist/language/flows/flow-tools.js +112 -89
- package/dist/language/flows/flows.d.ts +16 -1
- package/dist/language/flows/flows.js +74 -12
- package/dist/language/flows/heal-run.js +6 -4
- package/dist/language/flows/narrow-write.d.ts +7 -0
- package/dist/language/flows/narrow-write.js +36 -1
- package/dist/language/flows/recording/flake.d.ts +2 -2
- package/dist/language/flows/recording/recording-backtrack.js +14 -1
- package/dist/language/flows/recording/tape/recordings.d.ts +58 -4
- package/dist/language/flows/recording/tape/recordings.js +95 -13
- package/dist/language/flows/replay-from-hud.d.ts +20 -0
- package/dist/language/flows/replay-from-hud.js +51 -0
- package/dist/language/flows/replay.d.ts +9 -5
- package/dist/language/flows/replay.js +56 -15
- package/dist/language/flows/single-replay.d.ts +7 -0
- package/dist/language/flows/single-replay.js +26 -0
- package/dist/language/flows/suite/suite-flakes.js +2 -0
- package/dist/language/flows/suite-selection.d.ts +2 -15
- package/dist/language/flows/suite-selection.js +4 -3
- package/dist/language/flows/verify-change-tools.d.ts +1 -0
- package/dist/language/flows/verify-change-tools.js +202 -191
- package/dist/launch-chromium.d.ts +27 -5
- package/dist/launch-chromium.js +38 -8
- package/dist/memory/cloud/cloud-config.d.ts +22 -1
- package/dist/memory/cloud/cloud-config.js +34 -5
- package/dist/memory/cloud/cloud-sync.d.ts +17 -14
- package/dist/memory/cloud/cloud-sync.js +15 -4
- package/dist/memory/cloud/harness-config.d.ts +75 -1
- package/dist/memory/cloud/harness-config.js +115 -24
- package/dist/memory/cloud/hud-notices-source.d.ts +21 -0
- package/dist/memory/cloud/hud-notices-source.js +128 -0
- package/dist/memory/cloud/memory-scope.d.ts +161 -0
- package/dist/memory/cloud/memory-scope.js +227 -0
- package/dist/memory/cloud/sync-cycle.d.ts +44 -7
- package/dist/memory/cloud/sync-cycle.js +129 -15
- package/dist/memory/cloud/sync-daemon.d.ts +11 -0
- package/dist/memory/cloud/sync-daemon.js +121 -9
- package/dist/memory/cloud/sync-disk.d.ts +1 -1
- package/dist/memory/cloud/sync-disk.js +31 -10
- package/dist/memory/cloud/sync-screenshots.d.ts +32 -0
- package/dist/memory/cloud/sync-screenshots.js +105 -0
- package/dist/memory/cloud/unsynced-roots.d.ts +47 -0
- package/dist/memory/cloud/unsynced-roots.js +166 -0
- package/dist/memory/impact/account-watch.d.ts +34 -0
- package/dist/memory/impact/account-watch.js +59 -0
- package/dist/memory/impact/impact-recorder.d.ts +8 -0
- package/dist/memory/impact/impact-recorder.js +12 -2
- package/dist/memory/impact/impact-store.d.ts +17 -4
- package/dist/memory/impact/impact-store.js +169 -63
- package/dist/memory/intent/inline-intent.d.ts +1 -0
- package/dist/memory/intent/intent-shard-store.js +16 -4
- package/dist/memory/intent/intent-shard.d.ts +14 -2
- package/dist/memory/intent/intent-store.d.ts +1 -0
- package/dist/memory/intent/intent-tools.js +122 -4
- package/dist/memory/intent/open-intents.d.ts +6 -0
- package/dist/memory/intent/open-intents.js +10 -1
- package/dist/memory/intent/settled-words.d.ts +24 -0
- package/dist/memory/intent/settled-words.js +130 -0
- package/dist/memory/journal/drive-flow.d.ts +16 -0
- package/dist/memory/journal/drive-flow.js +34 -2
- package/dist/memory/journal/drive-run-flush.d.ts +2 -0
- package/dist/memory/journal/drive-run-flush.js +20 -5
- package/dist/memory/journal/envelope.d.ts +8 -8
- package/dist/memory/journal/journal-recorder.js +52 -3
- package/dist/memory/journal/on-disk/retention.d.ts +8 -0
- package/dist/memory/journal/on-disk/retention.js +32 -2
- package/dist/memory/journal/on-disk/startup-maintenance.js +3 -1
- package/dist/memory/journal/on-disk/workspace-tiers.js +9 -4
- package/dist/memory/journal/session-end.d.ts +15 -1
- package/dist/memory/journal/session-end.js +42 -9
- package/dist/memory/project/artifact-root-resolver.d.ts +26 -1
- package/dist/memory/project/artifact-root-resolver.js +125 -16
- package/dist/memory/project/artifact-root.d.ts +46 -8
- package/dist/memory/project/artifact-root.js +89 -10
- package/dist/memory/project/dir/reticle-dir.d.ts +18 -2
- package/dist/memory/project/dir/reticle-dir.js +26 -3
- package/dist/memory/project/link-directory.d.ts +15 -0
- package/dist/memory/project/link-directory.js +44 -0
- package/dist/memory/project/project-tools.js +22 -3
- package/dist/memory/project/root-claims.d.ts +6 -0
- package/dist/memory/project/root-claims.js +39 -0
- package/dist/memory/project/session-root.d.ts +26 -1
- package/dist/memory/project/session-root.js +49 -5
- package/dist/memory/project/sync-status.d.ts +85 -0
- package/dist/memory/project/sync-status.js +224 -0
- package/dist/memory/recall/memory-tools.js +47 -2
- package/dist/memory/recall/platform-memory.d.ts +34 -0
- package/dist/memory/recall/platform-memory.js +139 -0
- package/dist/memory/recall/project-memory.d.ts +19 -0
- package/dist/memory/recall/project-memory.js +80 -13
- package/dist/portal/bridge/bridge.d.ts +9 -3
- package/dist/portal/bridge/bridge.js +82 -22
- package/dist/portal/bridge/harness-request.d.ts +23 -0
- package/dist/portal/bridge/harness-request.js +27 -0
- package/dist/portal/bridge/pairing-token.d.ts +9 -0
- package/dist/portal/bridge/pairing-token.js +17 -0
- package/dist/portal/bridge/wrong-path.d.ts +17 -0
- package/dist/portal/bridge/wrong-path.js +35 -0
- package/dist/portal/input/network-mock-tools.js +11 -2
- package/dist/portal/input/real-input.d.ts +83 -10
- package/dist/portal/input/real-input.js +218 -30
- package/dist/portal/input/viewport-tools.js +3 -3
- package/dist/portal/pool/browser-pool.d.ts +70 -9
- package/dist/portal/pool/browser-pool.js +190 -37
- package/dist/portal/pool/context-permissions.d.ts +33 -0
- package/dist/portal/pool/context-permissions.js +33 -0
- package/dist/portal/pool/lease-marker-stamp.d.ts +23 -0
- package/dist/portal/pool/lease-marker-stamp.js +49 -0
- package/dist/portal/pool/playwright-launcher.d.ts +35 -0
- package/dist/portal/pool/playwright-launcher.js +64 -3
- package/dist/portal/pool/pool-contract.d.ts +28 -5
- package/dist/portal/session/agent-link.d.ts +8 -0
- package/dist/portal/session/agent-link.js +17 -0
- package/dist/portal/session/command-payload.d.ts +8 -0
- package/dist/portal/session/command-payload.js +24 -0
- package/dist/portal/session/daemon-answers.d.ts +3 -3
- package/dist/portal/session/daemon-answers.js +4 -2
- package/dist/portal/session/dev-server/dev-command.d.ts +21 -0
- package/dist/portal/session/dev-server/dev-command.js +87 -12
- package/dist/portal/session/facts/departure-note.d.ts +22 -0
- package/dist/portal/session/facts/departure-note.js +47 -0
- package/dist/portal/session/facts/observed-state.d.ts +16 -18
- package/dist/portal/session/facts/observed-state.js +46 -3
- package/dist/portal/session/facts/session-replaced.d.ts +5 -0
- package/dist/portal/session/facts/session-replaced.js +5 -0
- package/dist/portal/session/first-run-wiring.d.ts +42 -0
- package/dist/portal/session/first-run-wiring.js +132 -0
- package/dist/portal/session/human/live-control.d.ts +9 -2
- package/dist/portal/session/human/live-control.js +12 -3
- package/dist/portal/session/human/notes-ledger.d.ts +20 -0
- package/dist/portal/session/human/notes-ledger.js +55 -0
- package/dist/portal/session/human/review-store.d.ts +12 -0
- package/dist/portal/session/human/review-store.js +18 -10
- package/dist/portal/session/live-control-tools.d.ts +0 -13
- package/dist/portal/session/live-control-tools.js +107 -13
- package/dist/portal/session/narration-args.d.ts +5 -0
- package/dist/portal/session/narration-args.js +17 -0
- package/dist/portal/session/no-session-diagnosis.d.ts +8 -1
- package/dist/portal/session/no-session-diagnosis.js +46 -9
- package/dist/portal/session/no-session-next-action.d.ts +31 -0
- package/dist/portal/session/no-session-next-action.js +159 -60
- package/dist/portal/session/no-session-watch.d.ts +14 -1
- package/dist/portal/session/no-session-watch.js +227 -17
- package/dist/portal/session/presence/session-lease.js +1 -1
- package/dist/portal/session/presence/session-mirror.js +3 -0
- package/dist/portal/session/recorded-gaps.d.ts +97 -0
- package/dist/portal/session/recorded-gaps.js +251 -0
- package/dist/portal/session/serving-directory.d.ts +27 -0
- package/dist/portal/session/serving-directory.js +45 -0
- package/dist/portal/session/session-health.d.ts +18 -0
- package/dist/portal/session/session-health.js +9 -1
- package/dist/portal/session/session-info.d.ts +8 -1
- package/dist/portal/session/session-info.js +8 -1
- package/dist/portal/session/session-manager.d.ts +39 -0
- package/dist/portal/session/session-manager.js +98 -11
- package/dist/portal/session/session-reaper.js +4 -1
- package/dist/portal/session/session-successor.d.ts +13 -0
- package/dist/portal/session/session-successor.js +1 -1
- package/dist/portal/session/session-tools.js +26 -3
- package/dist/portal/session/session.d.ts +22 -30
- package/dist/portal/session/session.js +81 -79
- package/dist/portal/session/timing/command-timeout.js +25 -1
- package/dist/portal/session/timing/wall-clock.d.ts +1 -1
- package/dist/portal/session/timing/wall-clock.js +1 -1
- package/dist/portal/session/zero-install-first-call.d.ts +31 -0
- package/dist/portal/session/zero-install-first-call.js +88 -0
- package/dist/start-options.d.ts +12 -0
- package/dist/start-wiring.d.ts +63 -0
- package/dist/start-wiring.js +169 -0
- package/dist/status-payload.d.ts +23 -1
- package/dist/status-payload.js +36 -1
- package/dist/surface/http-server.js +18 -2
- package/dist/surface/mcp/attach-memory.d.ts +1 -0
- package/dist/surface/mcp/attach-memory.js +12 -1
- package/dist/surface/mcp/mcp-proxy.d.ts +9 -0
- package/dist/surface/mcp/mcp-proxy.js +65 -13
- package/dist/surface/mcp/mcp.d.ts +34 -6
- package/dist/surface/mcp/mcp.js +61 -17
- package/dist/surface/mcp/proxy/drive-calls.d.ts +10 -0
- package/dist/surface/mcp/proxy/drive-calls.js +27 -0
- package/dist/surface/mcp/proxy/mcp-post-transport.js +5 -0
- package/dist/surface/mcp/server-instructions.d.ts +4 -2
- package/dist/surface/mcp/server-instructions.js +32 -14
- package/dist/surface/mcp/shared-params.js +2 -2
- package/dist/surface/mcp/surface-vocabulary.d.ts +2 -0
- package/dist/surface/mcp/surface-vocabulary.js +1 -0
- package/dist/surface/tools/account-tool.d.ts +22 -0
- package/dist/surface/tools/account-tool.js +157 -0
- package/dist/surface/tools/act/act-danger.d.ts +11 -0
- package/dist/surface/tools/act/act-danger.js +38 -1
- package/dist/surface/tools/act/act-observation.d.ts +33 -0
- package/dist/surface/tools/act/act-observation.js +57 -0
- package/dist/surface/tools/act/act-preflight.js +25 -2
- package/dist/surface/tools/act/act-target.js +8 -3
- package/dist/surface/tools/act/navigation/navigate-arrival.d.ts +8 -0
- package/dist/surface/tools/act/navigation/navigate-arrival.js +56 -2
- package/dist/surface/tools/act/resolve-target.d.ts +1 -1
- package/dist/surface/tools/act/resolve-target.js +18 -3
- package/dist/surface/tools/act/screen-request.d.ts +34 -0
- package/dist/surface/tools/act/screen-request.js +113 -0
- package/dist/surface/tools/act/sequence-grade.d.ts +8 -0
- package/dist/surface/tools/act/sequence-grade.js +13 -2
- package/dist/surface/tools/act/settle-in-flight.js +25 -3
- package/dist/surface/tools/act-sequence-tool.js +138 -29
- package/dist/surface/tools/act-tools.d.ts +0 -9
- package/dist/surface/tools/act-tools.js +71 -41
- package/dist/surface/tools/agent/app-notes-learning.d.ts +7 -0
- package/dist/surface/tools/agent/app-notes-learning.js +80 -0
- package/dist/surface/tools/agent/app-notes.d.ts +4 -0
- package/dist/surface/tools/agent/app-notes.js +48 -0
- package/dist/surface/tools/agent/build-staleness.d.ts +7 -0
- package/dist/surface/tools/agent/build-staleness.js +62 -0
- package/dist/surface/tools/agent/compact-envelope.d.ts +80 -0
- package/dist/surface/tools/agent/compact-envelope.js +374 -0
- package/dist/surface/tools/agent/for-the-agent.d.ts +12 -0
- package/dist/surface/tools/agent/for-the-agent.js +44 -0
- package/dist/surface/tools/agent/notices.d.ts +50 -0
- package/dist/surface/tools/agent/notices.js +152 -0
- package/dist/surface/tools/agent/reteach.d.ts +11 -0
- package/dist/surface/tools/agent/reteach.js +50 -0
- package/dist/surface/tools/args/alias-args.d.ts +5 -0
- package/dist/surface/tools/args/alias-args.js +10 -0
- package/dist/surface/tools/args/confirm-dangerous-arg.d.ts +6 -0
- package/dist/surface/tools/args/confirm-dangerous-arg.js +6 -0
- package/dist/surface/tools/assert/assert-source.d.ts +15 -0
- package/dist/surface/tools/assert/assert-source.js +40 -0
- package/dist/surface/tools/assert/assert-verdict.d.ts +1 -1
- package/dist/surface/tools/assert/assert-verdict.js +42 -17
- package/dist/surface/tools/browser-tools.js +51 -2
- package/dist/surface/tools/chat-drives.d.ts +101 -0
- package/dist/surface/tools/chat-drives.js +409 -0
- package/dist/surface/tools/coverage-tools.d.ts +2 -10
- package/dist/surface/tools/coverage-tools.js +2 -53
- package/dist/surface/tools/dynamic-tools.js +29 -1
- package/dist/surface/tools/empty-session-list.d.ts +51 -0
- package/dist/surface/tools/empty-session-list.js +120 -0
- package/dist/surface/tools/error-recovery.d.ts +14 -0
- package/dist/surface/tools/error-recovery.js +105 -8
- package/dist/surface/tools/explore-tools.d.ts +31 -1
- package/dist/surface/tools/explore-tools.js +438 -66
- package/dist/surface/tools/feedback-tools.d.ts +2 -3
- package/dist/surface/tools/feedback-tools.js +18 -3
- package/dist/surface/tools/gap-novelty.d.ts +3 -1
- package/dist/surface/tools/gap-novelty.js +8 -1
- package/dist/surface/tools/harness-explore.d.ts +118 -57
- package/dist/surface/tools/harness-explore.js +344 -292
- package/dist/surface/tools/harness-gate.d.ts +88 -0
- package/dist/surface/tools/harness-gate.js +235 -0
- package/dist/surface/tools/harness-hunt.d.ts +43 -0
- package/dist/surface/tools/harness-hunt.js +215 -0
- package/dist/surface/tools/harness-plan.d.ts +17 -0
- package/dist/surface/tools/harness-plan.js +38 -0
- package/dist/surface/tools/harness-script.d.ts +30 -0
- package/dist/surface/tools/harness-script.js +560 -0
- package/dist/surface/tools/harness-tab-guard.d.ts +5 -0
- package/dist/surface/tools/harness-tab-guard.js +27 -0
- package/dist/surface/tools/harness-toolset.d.ts +22 -1
- package/dist/surface/tools/harness-toolset.js +101 -7
- package/dist/surface/tools/human-notes.d.ts +16 -0
- package/dist/surface/tools/human-notes.js +27 -0
- package/dist/surface/tools/invoke-tool.d.ts +5 -2
- package/dist/surface/tools/invoke-tool.js +263 -85
- package/dist/surface/tools/lease-hint.js +26 -5
- package/dist/surface/tools/lease-permissions.d.ts +33 -0
- package/dist/surface/tools/lease-permissions.js +73 -0
- package/dist/surface/tools/lease-readiness.d.ts +38 -0
- package/dist/surface/tools/lease-readiness.js +57 -0
- package/dist/surface/tools/lease-seed.d.ts +49 -0
- package/dist/surface/tools/lease-seed.js +167 -0
- package/dist/surface/tools/lease-tools.d.ts +13 -24
- package/dist/surface/tools/lease-tools.js +146 -197
- package/dist/surface/tools/live-call-text.js +4 -4
- package/dist/surface/tools/merge-tools.js +42 -2
- package/dist/surface/tools/merged-name-redirect.js +4 -0
- package/dist/surface/tools/next-step.d.ts +29 -0
- package/dist/surface/tools/next-step.js +214 -0
- package/dist/surface/tools/observe-tools.js +45 -9
- package/dist/surface/tools/platform-moment.d.ts +72 -0
- package/dist/surface/tools/platform-moment.js +296 -0
- package/dist/surface/tools/query-hint-schema.d.ts +7 -0
- package/dist/surface/tools/query-hint-schema.js +10 -0
- package/dist/surface/tools/read-tools.js +71 -14
- package/dist/surface/tools/real-input-attempt.js +96 -13
- package/dist/surface/tools/reticle-result.d.ts +120 -0
- package/dist/surface/tools/reticle-result.js +364 -0
- package/dist/surface/tools/tool-kit.d.ts +83 -3
- package/dist/surface/tools/tool-kit.js +77 -7
- package/dist/surface/tools/tools.js +43 -59
- package/dist/telemetry/account-envelope.d.ts +7 -0
- package/dist/telemetry/account-envelope.js +61 -0
- package/dist/telemetry/agent-client.d.ts +15 -0
- package/dist/telemetry/agent-client.js +57 -0
- package/dist/telemetry/app-instrumented.js +9 -2
- package/dist/telemetry/argument-shape.d.ts +7 -0
- package/dist/telemetry/argument-shape.js +86 -1
- package/dist/telemetry/automation-hint.d.ts +2 -3
- package/dist/telemetry/automation-hint.js +33 -8
- package/dist/telemetry/cli-telemetry.js +7 -2
- package/dist/telemetry/daemon-telemetry.js +3 -0
- package/dist/telemetry/error-fingerprint.d.ts +10 -1
- package/dist/telemetry/error-fingerprint.js +61 -5
- package/dist/telemetry/feedback-cli.d.ts +0 -13
- package/dist/telemetry/feedback-cli.js +0 -77
- package/dist/telemetry/feedback.d.ts +13 -0
- package/dist/telemetry/feedback.js +183 -17
- package/dist/telemetry/harness-run.d.ts +18 -0
- package/dist/telemetry/harness-run.js +80 -0
- package/dist/telemetry/hud-events.d.ts +16 -0
- package/dist/telemetry/hud-events.js +27 -0
- package/dist/telemetry/hud-metrics.d.ts +29 -6
- package/dist/telemetry/hud-metrics.js +116 -25
- package/dist/telemetry/init-telemetry.js +2 -2
- package/dist/telemetry/install-source.d.ts +13 -25
- package/dist/telemetry/install-source.js +44 -3
- package/dist/telemetry/mcp-connection.d.ts +0 -14
- package/dist/telemetry/mcp-connection.js +5 -1
- package/dist/telemetry/onboarding-firsts.d.ts +32 -0
- package/dist/telemetry/onboarding-firsts.js +81 -6
- package/dist/telemetry/platform-linked.d.ts +5 -0
- package/dist/telemetry/platform-linked.js +32 -0
- package/dist/telemetry/project-profile.js +5 -3
- package/dist/telemetry/proxy-telemetry.js +4 -1
- package/dist/telemetry/session-metrics.d.ts +15 -4
- package/dist/telemetry/session-metrics.js +88 -52
- package/dist/telemetry/telemetry.d.ts +38 -2
- package/dist/telemetry/telemetry.js +144 -34
- package/dist/telemetry/verification-of.d.ts +3 -1
- package/dist/telemetry/verification-of.js +13 -4
- package/dist/wire-journal.d.ts +2 -2
- package/dist/wire-journal.js +20 -6
- package/docs/README.md +3 -3
- package/docs/actions.mdx +6 -3
- package/docs/adapters.md +1 -1
- package/docs/agent-cheatsheet.md +25 -28
- package/docs/architecture.md +5 -5
- package/docs/autodrive.md +33 -28
- package/docs/benchmarks.md +5 -5
- package/docs/best-practices.mdx +27 -9
- package/docs/capabilities.mdx +14 -16
- package/docs/cli/affected.mdx +1 -1
- package/docs/cli/cloud.mdx +54 -75
- package/docs/cli/doctor.mdx +14 -3
- package/docs/cli/drive.mdx +20 -14
- package/docs/cli/feedback.mdx +3 -3
- package/docs/cli/gate.mdx +7 -2
- package/docs/cli/help.mdx +50 -55
- package/docs/cli/init.mdx +43 -28
- package/docs/cli/license.mdx +12 -8
- package/docs/cli/mcp.mdx +4 -4
- package/docs/cli/open.mdx +3 -3
- package/docs/cli/report.mdx +4 -2
- package/docs/cli/restart.mdx +2 -2
- package/docs/cli/rollback.mdx +14 -8
- package/docs/cli/serve.mdx +4 -4
- package/docs/cli/setup.mdx +23 -0
- package/docs/cli/status.mdx +18 -5
- package/docs/cli/stop.mdx +67 -8
- package/docs/cli/try.mdx +62 -0
- package/docs/cli/update.mdx +4 -3
- package/docs/cli/verify.mdx +17 -6
- package/docs/cli/version.mdx +5 -4
- package/docs/cli.mdx +111 -42
- package/docs/debugging.md +3 -3
- package/docs/deploy-checks.md +1 -1
- package/docs/desktop.mdx +9 -3
- package/docs/enterprise.md +11 -10
- package/docs/environment.mdx +7 -8
- package/docs/faq.mdx +3 -3
- package/docs/first-drive.md +5 -4
- package/docs/flows.md +35 -27
- package/docs/for-agents.md +4 -5
- package/docs/frameworks.mdx +32 -21
- package/docs/getting-started.md +65 -61
- package/docs/human-control.md +16 -16
- package/docs/index.mdx +15 -42
- package/docs/install-agentic.mdx +22 -37
- package/docs/install-manual.mdx +23 -13
- package/docs/instrumentation.mdx +5 -3
- package/docs/integration-patterns.md +7 -7
- package/docs/license-activation.mdx +1 -1
- package/docs/multi-agent-testing.md +24 -6
- package/docs/packages/babel-plugin.mdx +4 -2
- package/docs/packages/browser.mdx +16 -10
- package/docs/packages/core.mdx +12 -5
- package/docs/packages/electron.mdx +3 -2
- package/docs/packages/engine.mdx +1 -1
- package/docs/packages/eslint-plugin.mdx +18 -12
- package/docs/packages/next.mdx +8 -7
- package/docs/packages/open-verification.mdx +1 -1
- package/docs/packages/server.mdx +5 -5
- package/docs/packages/tauri.mdx +9 -9
- package/docs/packages/test.mdx +4 -10
- package/docs/packages/vite-plugin.mdx +32 -4
- package/docs/packages.mdx +11 -15
- package/docs/platform-integration.md +6 -5
- package/docs/predicates.mdx +40 -24
- package/docs/quickstart.mdx +69 -30
- package/docs/required-checks.md +8 -7
- package/docs/reticle-manual.md +15 -5
- package/docs/skill-file.mdx +17 -79
- package/docs/skill-setup.md +9 -9
- package/docs/skill.md +200 -0
- package/docs/system-map.md +7 -7
- package/docs/telemetry.md +23 -25
- package/docs/testing.md +4 -4
- package/docs/token-efficiency.md +12 -12
- package/docs/tools/act-and-wait.mdx +9 -2
- package/docs/tools/act-sequence.mdx +6 -7
- package/docs/tools/act.mdx +2 -2
- package/docs/tools/assert.mdx +18 -17
- package/docs/tools/console.mdx +9 -9
- package/docs/tools/inspect.mdx +16 -7
- package/docs/tools/look.mdx +24 -0
- package/docs/tools/navigate.mdx +5 -3
- package/docs/tools/network.mdx +2 -2
- package/docs/tools/observe.mdx +6 -6
- package/docs/tools/overview.mdx +34 -33
- package/docs/tools/query.mdx +5 -5
- package/docs/tools/session-and-feedback.mdx +22 -13
- package/docs/tools/sessions.mdx +8 -8
- package/docs/tools/snapshot.mdx +6 -5
- package/docs/tools/state.mdx +9 -9
- package/docs/tools/tools-and-run.mdx +26 -24
- package/docs/tools/verify.mdx +28 -0
- package/docs/tools/wait-for.mdx +8 -4
- package/docs/troubleshooting.mdx +21 -6
- package/docs/usage.md +55 -46
- package/docs/use-cases.mdx +3 -3
- package/docs/vs-chrome-devtools-mcp.mdx +9 -6
- package/docs/vs-playwright-mcp.mdx +3 -1
- package/docs/what-is-recorded.md +17 -5
- package/docs/what-is-reticle.mdx +5 -3
- package/docs/why-reticle.mdx +1 -1
- package/package.json +9 -12
- package/dist/command/cli/demo/demo-page.d.ts +0 -78
- package/dist/command/cli/demo/demo-page.js +0 -241
- package/dist/command/cli/demo/demo-run.d.ts +0 -38
- package/dist/command/cli/demo/demo-run.js +0 -138
- package/dist/features/harness/driver.d.ts +0 -50
- package/dist/features/harness/driver.js +0 -236
- package/dist/features/harness/jev-driver.d.ts +0 -188
- package/dist/features/harness/jev-driver.js +0 -678
- package/dist/features/harness/openai-driver.d.ts +0 -58
- package/dist/features/harness/openai-driver.js +0 -206
- package/dist/judgement/hunt/hunt-report.d.ts +0 -49
- package/dist/judgement/hunt/hunt-report.js +0 -84
- package/dist/language/flows/buddy-status.d.ts +0 -25
- package/dist/language/flows/buddy-status.js +0 -32
- package/dist/language/flows/change/watch-batcher.d.ts +0 -18
- package/dist/language/flows/change/watch-batcher.js +0 -19
- package/dist/memory/cloud/harness-offer.d.ts +0 -44
- package/dist/memory/cloud/harness-offer.js +0 -145
- package/dist/memory/project/dir/fill-value-store.d.ts +0 -32
- package/dist/memory/project/dir/fill-value-store.js +0 -88
- package/dist/surface/tools/feature-capture.d.ts +0 -151
- package/dist/surface/tools/feature-capture.js +0 -235
- package/dist/surface/tools/tool-hit-rate.d.ts +0 -87
- package/dist/surface/tools/tool-hit-rate.js +0 -90
- package/dist/telemetry/harness-drive.d.ts +0 -4
- package/dist/telemetry/harness-drive.js +0 -35
- package/dist/telemetry/identify.d.ts +0 -22
- package/dist/telemetry/identify.js +0 -73
- package/docs/cli/capsules.mdx +0 -70
- package/docs/cli/hunt.mdx +0 -73
- package/docs/cli/identify.mdx +0 -76
- package/docs/cli/kill.mdx +0 -91
- package/docs/cli/watch.mdx +0 -62
- package/docs/local-registry.md +0 -143
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What `reticle_session { action: "list" }` answers when nothing is connected.
|
|
3
|
+
*
|
|
4
|
+
* An empty list is the most common thing that tool returns, and on its own it is a dead end: the
|
|
5
|
+
* agent asked the one question it knows to ask and got no next step. So it carries why nothing is
|
|
6
|
+
* connected, the executable next action, the last tab that was here, and, on a project that has
|
|
7
|
+
* never connected, the first-run wiring itself (see first-run-wiring.ts).
|
|
8
|
+
*/
|
|
9
|
+
import { dirname } from 'node:path';
|
|
10
|
+
import { z } from 'zod';
|
|
11
|
+
import { DiscoveryInvite, NoSessionAction } from '@reticlehq/core';
|
|
12
|
+
import { readProjectId } from '../../command/cli/ports/resolve/cli-port.js';
|
|
13
|
+
import { callingClientDirectory } from '../../hooks/client-directory.js';
|
|
14
|
+
/** The answers that mean "this app is not set up yet", which a first run can settle by wiring it. */
|
|
15
|
+
const FIRST_RUN_ACTIONS = new Set([
|
|
16
|
+
NoSessionAction.RUN_INIT,
|
|
17
|
+
NoSessionAction.START_DEV_SERVER,
|
|
18
|
+
NoSessionAction.OPEN_APP,
|
|
19
|
+
]);
|
|
20
|
+
/** The fields only an empty list carries, declared so a schema-aware client does not strip them. */
|
|
21
|
+
export const EMPTY_SESSION_LIST_OUTPUT = {
|
|
22
|
+
why: z
|
|
23
|
+
.string()
|
|
24
|
+
.optional()
|
|
25
|
+
.describe('Present ONLY when `sessions` is empty: why nothing is connected, and the next action that fixes it. An empty list is never the end of the road — read this before concluding the app cannot be driven.'),
|
|
26
|
+
next_action: z
|
|
27
|
+
.object({
|
|
28
|
+
action: z.nativeEnum(NoSessionAction),
|
|
29
|
+
command: z.string().optional(),
|
|
30
|
+
port: z.number().optional(),
|
|
31
|
+
reason: z.string(),
|
|
32
|
+
})
|
|
33
|
+
.optional()
|
|
34
|
+
.describe("Present ONLY when `sessions` is empty: the same answer as `why`, executable. `command` is the LITERAL command to run, sourced from this project's own package.json scripts and lockfile — it is absent, never guessed, when the project declares no dev script. `action` is one of daemon_split | start_dev_server | run_init | open_app | reopen_app. `daemon_split` outranks the rest and means the app IS running and instrumented, on a DIFFERENT daemon than the one you are attached to — do not start or re-init anything, read `reason`."),
|
|
35
|
+
talk_to_us: z
|
|
36
|
+
.string()
|
|
37
|
+
.optional()
|
|
38
|
+
.describe('Present ONLY when `sessions` is empty: a call with the founder for the person you are working with. Offer it; never act on it.'),
|
|
39
|
+
wired: z
|
|
40
|
+
.record(z.unknown())
|
|
41
|
+
.optional()
|
|
42
|
+
.describe('Files the first run changed (`steps`); tell the user.'),
|
|
43
|
+
lastKnown: z
|
|
44
|
+
.object({
|
|
45
|
+
sessionId: z.string(),
|
|
46
|
+
url: z.string(),
|
|
47
|
+
})
|
|
48
|
+
.optional()
|
|
49
|
+
.describe('Present ONLY when `sessions` is empty AND a tab was connected to this daemon earlier: the last sessionId and URL that tab was on when it disappeared. A route that 500s tears the page down and the SDK never reconnects — this is the last thing we knew, not a route-500 verdict. An empty list with no lastKnown is a tab that never arrived.'),
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Wire the calling project when another project's tab is the one currently connected.
|
|
53
|
+
*
|
|
54
|
+
* The list handler only used to reach {@link emptySessionList} when the daemon's whole list was
|
|
55
|
+
* empty. A live tab in project A then answered project B's first call with A's sessions, and B
|
|
56
|
+
* was never wired.
|
|
57
|
+
*/
|
|
58
|
+
export async function wireCallerBesideLiveSessions(deps, sessions) {
|
|
59
|
+
const dir = callingClientDirectory();
|
|
60
|
+
if (dir === undefined)
|
|
61
|
+
return undefined;
|
|
62
|
+
const projectId = readProjectId(dir);
|
|
63
|
+
if (projectId !== undefined && sessions.some((session) => session.projectId === projectId)) {
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
const next = deps.sessions.noSessionNextAction();
|
|
67
|
+
const target = next !== undefined && FIRST_RUN_ACTIONS.has(next.action)
|
|
68
|
+
? deps.firstRun?.projectDirectory(dir)
|
|
69
|
+
: undefined;
|
|
70
|
+
if (target === undefined || deps.firstRun === undefined)
|
|
71
|
+
return undefined;
|
|
72
|
+
return deps.firstRun.wire(target);
|
|
73
|
+
}
|
|
74
|
+
/** The departed tab for this call: the caller's own project when it named one, else the daemon's newest. */
|
|
75
|
+
function departedForCaller(deps) {
|
|
76
|
+
const dir = callingClientDirectory();
|
|
77
|
+
if (dir === undefined)
|
|
78
|
+
return deps.sessions.lastKnown?.();
|
|
79
|
+
const projectId = readProjectId(dir);
|
|
80
|
+
if (projectId === undefined)
|
|
81
|
+
return undefined;
|
|
82
|
+
return deps.sessions.lastKnownFor?.(projectId);
|
|
83
|
+
}
|
|
84
|
+
export async function emptySessionList(deps, sessions) {
|
|
85
|
+
// The lead and its next action: the full differential (~3 KB of ranked causes) read as
|
|
86
|
+
// speculation on the call an agent makes first. Optional-call: test stubs predate the lead.
|
|
87
|
+
const why = deps.sessions.noSessionLead?.() ?? deps.sessions.noSessionHint();
|
|
88
|
+
// The executable half. `why` is for the human reading the transcript; this is the one the
|
|
89
|
+
// agent acts on, so it never has to parse a paragraph to find a command inside it.
|
|
90
|
+
const next = deps.sessions.noSessionNextAction();
|
|
91
|
+
// The first run wires the app the client is in, not the directory the daemon was started in.
|
|
92
|
+
// One daemon serves every project; the proxy names its cwd on the call. With no caller (an
|
|
93
|
+
// embed, a test) it is still the daemon's own project. A daemon outside any project asks instead.
|
|
94
|
+
// ponytail: cwd, not an MCP roots/list round trip. A proxy started outside the project still
|
|
95
|
+
// answers run_init; roots are the upgrade when a client launches there but names the project.
|
|
96
|
+
// Not only on `run_init`: an unwired app whose dev server is not running yet answers
|
|
97
|
+
// `start_dev_server`, which is the commonest first run of all, and init starts that server itself.
|
|
98
|
+
// `projectDirectory` refuses a project that is already wired, so a wired app is never re-run.
|
|
99
|
+
const dir = next !== undefined && FIRST_RUN_ACTIONS.has(next.action)
|
|
100
|
+
? deps.firstRun?.projectDirectory(callingClientDirectory() ?? dirname(deps.reticleRoot))
|
|
101
|
+
: undefined;
|
|
102
|
+
if (dir !== undefined && deps.firstRun !== undefined) {
|
|
103
|
+
const wired = await deps.firstRun.wire(dir);
|
|
104
|
+
const connected = deps.sessions.list();
|
|
105
|
+
if (wired.ok && 0 < connected.length)
|
|
106
|
+
return { sessions: connected, wired };
|
|
107
|
+
return { sessions, wired, ...(why === undefined ? {} : { why }) };
|
|
108
|
+
}
|
|
109
|
+
// The last tab, when one was here. Optional-call: test stubs of SessionManager predate it.
|
|
110
|
+
const known = departedForCaller(deps);
|
|
111
|
+
const lastKnown = undefined === known ? undefined : { sessionId: known.id, url: known.url };
|
|
112
|
+
return {
|
|
113
|
+
sessions,
|
|
114
|
+
...(why === undefined ? {} : { why }),
|
|
115
|
+
...(next === undefined ? {} : { next_action: next }),
|
|
116
|
+
...(undefined === lastKnown ? {} : { lastKnown }),
|
|
117
|
+
// Setup that never connects is where most people give up; it is the talk worth having.
|
|
118
|
+
talk_to_us: DiscoveryInvite.AGENT,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
@@ -18,6 +18,7 @@ export declare const RECOVERY: {
|
|
|
18
18
|
readonly MISSING_BASELINE: string;
|
|
19
19
|
readonly MISSING_RECORDING: string;
|
|
20
20
|
readonly STALE_REF: string;
|
|
21
|
+
readonly UNISSUED_REF: string;
|
|
21
22
|
readonly STALE_REF_AFTER_EDIT: string;
|
|
22
23
|
readonly INVALID_NAME: string;
|
|
23
24
|
/**
|
|
@@ -66,12 +67,25 @@ export declare const RECOVERY: {
|
|
|
66
67
|
readonly COMMAND_TIMEOUT: string;
|
|
67
68
|
readonly FLOW_STEP_MISSING: string;
|
|
68
69
|
readonly NO_POOL: string;
|
|
70
|
+
/**
|
|
71
|
+
* RETICLE_CHROMIUM_PATH names a browser the daemon cannot launch. The call was fine and so is the
|
|
72
|
+
* Playwright install, so neither a retry nor the install command can help: only the daemon's own
|
|
73
|
+
* environment can, and a running daemon keeps the values it started with.
|
|
74
|
+
*/
|
|
75
|
+
readonly CHROMIUM_PATH: string;
|
|
69
76
|
/**
|
|
70
77
|
* The two ways a platform answer can refuse a drive. Neither is a fault, and both were telling the
|
|
71
78
|
* agent that a perfectly understood refusal might be a defect in Reticle — which is how a person
|
|
72
79
|
* who deliberately switched the harness off gets a bug report filed about their own decision.
|
|
73
80
|
*/
|
|
74
81
|
readonly HARNESS_OFF: string;
|
|
82
|
+
/**
|
|
83
|
+
* The Harness asked for on a project that is not linked to the platform. The call was valid, and
|
|
84
|
+
* the refusal names reticle_act_and_wait as the alternative, which the catch-all below read as an
|
|
85
|
+
* agent's malformed call: it was then told to fix arguments that were never wrong.
|
|
86
|
+
*/
|
|
87
|
+
readonly HARNESS_LOCKED: string;
|
|
88
|
+
readonly HARNESS_NOT_LINKED: string;
|
|
75
89
|
};
|
|
76
90
|
/**
|
|
77
91
|
* The actionable next move for a known error message, or undefined when none is recognized.
|
|
@@ -8,9 +8,11 @@
|
|
|
8
8
|
* on stable, human-authored substrings of the thrown messages (see session-manager.ts, the flow/
|
|
9
9
|
* baseline stores). No clock, no IO — unit-testable in isolation.
|
|
10
10
|
*/
|
|
11
|
-
import { RefusalReason, TRANSPORT_LIMITS } from '@reticlehq/core';
|
|
11
|
+
import { RefusalReason, ReticleEnv, TRANSPORT_LIMITS, UNISSUED_REF_REFUSAL } from '@reticlehq/core';
|
|
12
12
|
import { SELF_RECOVERING_MARKER } from '../../portal/session/no-session-diagnosis.js';
|
|
13
|
-
import {
|
|
13
|
+
import { MSG_HARNESS_DISABLED, MSG_HARNESS_UNCLAIMED, MSG_HARNESS_UNCONFIRMED, PlatformRefusalCode, RefusalLead, } from '../../features/harness/platform/refusal.js';
|
|
14
|
+
import { BODY_CLAUSE_REFUSAL_OPENING } from '@reticlehq/engine/evidence/body-capture-remedy.js';
|
|
15
|
+
import { CHROMIUM_PATH_REFUSAL_PREFIX, chromiumInstallCommand, bundledPlaywrightVersion, } from '../../command/cli/doctor/browser/chromium-hint.js';
|
|
14
16
|
/** Marks where an over-long message had its middle removed. Named so tests assert it by value. */
|
|
15
17
|
const ELISION = '… [elided] …';
|
|
16
18
|
/**
|
|
@@ -33,11 +35,21 @@ function capMessage(message) {
|
|
|
33
35
|
const keep = Math.floor((max - ELISION.length) / 2);
|
|
34
36
|
return `${message.slice(0, keep)}${ELISION}${message.slice(message.length - keep)}`;
|
|
35
37
|
}
|
|
38
|
+
/**
|
|
39
|
+
* A fixed phrase as a pattern for the table below, which matches on phrasing.
|
|
40
|
+
*
|
|
41
|
+
* The phrase comes from the module that throws it rather than being retyped here, and a constant is
|
|
42
|
+
* still text: escaped so a future reword containing `(` or `?` cannot turn into a pattern that means
|
|
43
|
+
* something else — or fails to compile at import time, taking the whole surface with it.
|
|
44
|
+
*/
|
|
45
|
+
function literally(phrase) {
|
|
46
|
+
return new RegExp(phrase.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'i');
|
|
47
|
+
}
|
|
36
48
|
/**
|
|
37
49
|
* Messages that already spell out the exact retry, so any hint we add can only argue with them.
|
|
38
50
|
*
|
|
39
51
|
* The no-session diagnosis is one (it inspected the machine and named the cause). The native-input
|
|
40
|
-
* refusal is
|
|
52
|
+
* refusal is another: it names the tool, the argument and the follow-up call to make instead — and
|
|
41
53
|
* it was still collecting the defect ask, inviting a bug report about a refusal that had just told
|
|
42
54
|
* the agent precisely what to do.
|
|
43
55
|
*/
|
|
@@ -47,7 +59,22 @@ const SELF_RECOVERING = [
|
|
|
47
59
|
// the current ids" to a message that just named them contradicts the shorter path it offers, and
|
|
48
60
|
// a contradicted instruction is how one agent came to retry a dead id twelve times.
|
|
49
61
|
{ match: /Connected right now:/i, reason: RefusalReason.NO_SESSION },
|
|
62
|
+
// The body-clause pre-flight: nothing ran, no action was spent, and the message names the setting
|
|
63
|
+
// to switch on — or says the page's SDK predates it, which is a limit and not a defect either. It
|
|
64
|
+
// was collecting the defect ask on top of its own remedy, so the envelope contradicted itself and
|
|
65
|
+
// asked for a bug report about somebody's connect() options.
|
|
66
|
+
{ match: literally(BODY_CLAUSE_REFUSAL_OPENING), reason: RefusalReason.UNSUPPORTED },
|
|
50
67
|
];
|
|
68
|
+
/**
|
|
69
|
+
* The refusal for a `ref` Reticle never minted — decided BEFORE every other rule, not by one inside
|
|
70
|
+
* the table. The message echoes the caller's own string, and every pattern below matches on words:
|
|
71
|
+
* a ref reading `Connected right now:` was read as a missing session, and one opening with the
|
|
72
|
+
* Chromium-path prefix as browser configuration. The marker is Reticle's own wording, so testing it
|
|
73
|
+
* first classifies the refusal by what it IS rather than by what the caller typed into it.
|
|
74
|
+
*/
|
|
75
|
+
function isUnissuedRefRefusal(message) {
|
|
76
|
+
return message.includes(UNISSUED_REF_REFUSAL);
|
|
77
|
+
}
|
|
51
78
|
/** A message that already carries its own concrete next action, so nothing should be appended. */
|
|
52
79
|
function isSelfRecovering(message) {
|
|
53
80
|
if (message.includes(SELF_RECOVERING_MARKER))
|
|
@@ -80,7 +107,16 @@ export const RECOVERY = {
|
|
|
80
107
|
'navigated, opened a modal, re-sorted a list or changed the page invalidates every ref taken ' +
|
|
81
108
|
'before it. Reticle refuses here rather than clicking whatever now occupies that slot. Call ' +
|
|
82
109
|
'reticle_query again for a fresh ref and retry the action — and prefer reticle_act_and_wait ' +
|
|
83
|
-
'{ until } when an action changes the page, so the next ref is taken after it settles.'
|
|
110
|
+
'{ until } when an action changes the page, so the next ref is taken after it settles. On a ' +
|
|
111
|
+
'page that keeps re-rendering (a dashboard that refetches), skip the ref and pass ' +
|
|
112
|
+
'`target: { role, name }`, `{ label }` or `{ text }` instead: it is looked up in the same call ' +
|
|
113
|
+
'as the action, which shrinks the window a re-render can invalidate it in, though a render ' +
|
|
114
|
+
'landing between the lookup and the action can still refuse it — retry once if it does.',
|
|
115
|
+
UNISSUED_REF: 'The `ref` was not one Reticle handed out, so nothing was looked up and nothing was acted on. ' +
|
|
116
|
+
'Refs are minted by reticle_snapshot / reticle_query and look like e12. To name an element by ' +
|
|
117
|
+
'what it shows, pass `target` instead — { label }, { role, name }, { text } or { testid } — and ' +
|
|
118
|
+
'it is found in the same call. This is an invalid call, not a Reticle defect: there is nothing ' +
|
|
119
|
+
'to report.',
|
|
84
120
|
STALE_REF_AFTER_EDIT: 'That ref went stale because YOUR OWN EDIT landed: the dev server hot-updated the module named ' +
|
|
85
121
|
'in the message above and the framework re-rendered, so the node the ref pointed at was ' +
|
|
86
122
|
'replaced. Nothing is wrong with the app and nothing is wrong with Reticle — this is the ' +
|
|
@@ -199,15 +235,38 @@ export const RECOVERY = {
|
|
|
199
235
|
chromiumInstallCommand(bundledPlaywrightVersion()) +
|
|
200
236
|
'` if that is what is missing. Meanwhile drive ' +
|
|
201
237
|
'a tab the human already has open — reticle_sessions lists them.',
|
|
238
|
+
/**
|
|
239
|
+
* RETICLE_CHROMIUM_PATH names a browser the daemon cannot launch. The call was fine and so is the
|
|
240
|
+
* Playwright install, so neither a retry nor the install command can help: only the daemon's own
|
|
241
|
+
* environment can, and a running daemon keeps the values it started with.
|
|
242
|
+
*/
|
|
243
|
+
CHROMIUM_PATH: `Reticle cannot launch the browser ${ReticleEnv.CHROMIUM_PATH} names (the message above says ` +
|
|
244
|
+
'what is wrong with the path). The call itself was fine, so retrying it will not help, and ' +
|
|
245
|
+
'neither will installing Chromium. Ask the human to fix that path, or unset it to use ' +
|
|
246
|
+
"Playwright's own Chromium, in the environment the daemon starts from, then run " +
|
|
247
|
+
'`npx @reticlehq/server restart`. Meanwhile drive a tab the human already has open, which ' +
|
|
248
|
+
'reticle_sessions lists. This is configuration, not a Reticle defect: there is nothing to report.',
|
|
202
249
|
/**
|
|
203
250
|
* The two ways a platform answer can refuse a drive. Neither is a fault, and both were telling the
|
|
204
251
|
* agent that a perfectly understood refusal might be a defect in Reticle — which is how a person
|
|
205
252
|
* who deliberately switched the harness off gets a bug report filed about their own decision.
|
|
206
253
|
*/
|
|
207
|
-
HARNESS_OFF: '
|
|
208
|
-
'
|
|
254
|
+
HARNESS_OFF: 'The Harness is off for this project (it is opt-in), or the workspace cannot drive it now. ' +
|
|
255
|
+
'This is a deliberate refusal and there is nothing to report: drive the app yourself ' +
|
|
209
256
|
'through the MCP tools — reticle_navigate, then reticle_act_and_wait with an `until` — which is ' +
|
|
210
257
|
'the same verification without a model driving it.',
|
|
258
|
+
/**
|
|
259
|
+
* The Harness asked for on a project that is not linked to the platform. The call was valid, and
|
|
260
|
+
* the refusal names reticle_act_and_wait as the alternative, which the catch-all below read as an
|
|
261
|
+
* agent's malformed call: it was then told to fix arguments that were never wrong.
|
|
262
|
+
*/
|
|
263
|
+
HARNESS_LOCKED: 'The Harness unlocks once Reticle sees enough of this app; the refusal names what is missing ' +
|
|
264
|
+
'and how to close each gap. Nothing to report: close them, or drive the journey yourself with ' +
|
|
265
|
+
'reticle_act_and_wait and an `until` on its last step. Every other tool works at any coverage.',
|
|
266
|
+
HARNESS_NOT_LINKED: 'This project is not linked to the Reticle platform, where the Harness runs. The call itself was ' +
|
|
267
|
+
'valid. Either the human runs `npx @reticlehq/server connect` once in the app directory, or you ' +
|
|
268
|
+
'drive the journey yourself: reticle_navigate, then reticle_act_and_wait with an `until` on its ' +
|
|
269
|
+
'last step. There is nothing to report.',
|
|
211
270
|
};
|
|
212
271
|
/**
|
|
213
272
|
* Which OWNER each recovery belongs to, for `tool_refused`.
|
|
@@ -227,11 +286,14 @@ const REASON_OF = {
|
|
|
227
286
|
THROTTLED: RefusalReason.NOT_READY,
|
|
228
287
|
COMMAND_TIMEOUT: RefusalReason.NOT_READY,
|
|
229
288
|
NO_POOL: RefusalReason.NOT_READY,
|
|
289
|
+
CHROMIUM_PATH: RefusalReason.NOT_READY,
|
|
230
290
|
TOKEN_REQUIRED: RefusalReason.NOT_READY,
|
|
231
291
|
MISSING_BASELINE: RefusalReason.NO_MATCH,
|
|
232
292
|
MISSING_RECORDING: RefusalReason.NO_MATCH,
|
|
233
293
|
STALE_REF: RefusalReason.NO_MATCH,
|
|
234
294
|
STALE_REF_AFTER_EDIT: RefusalReason.NO_MATCH,
|
|
295
|
+
// The caller passed something that was never a ref: a malformed call, not a page that moved.
|
|
296
|
+
UNISSUED_REF: RefusalReason.BAD_ARGS,
|
|
235
297
|
NO_SUCH_OPTION: RefusalReason.NO_MATCH,
|
|
236
298
|
TARGET_MISSED: RefusalReason.NO_MATCH,
|
|
237
299
|
// Target resolution failed to name one element. NO_MATCH rather than BAD_ARGS: the arguments were
|
|
@@ -247,11 +309,23 @@ const REASON_OF = {
|
|
|
247
309
|
INVALID_NAME: RefusalReason.BAD_ARGS,
|
|
248
310
|
// Nothing about the app or the call is wrong; the feature is switched off or unpaid for.
|
|
249
311
|
HARNESS_OFF: RefusalReason.UNSUPPORTED,
|
|
312
|
+
// Nothing about the call is wrong either; the project is not linked yet.
|
|
313
|
+
HARNESS_NOT_LINKED: RefusalReason.UNSUPPORTED,
|
|
314
|
+
// The call is valid; the app is not instrumented enough for the Harness yet.
|
|
315
|
+
HARNESS_LOCKED: RefusalReason.UNSUPPORTED,
|
|
250
316
|
};
|
|
251
317
|
/** Hint text back to its reason. The hints are distinct strings, so this inverts cleanly. */
|
|
252
318
|
const REASON_BY_HINT = new Map(Object.entries(RECOVERY).map(([key, hint]) => [hint, REASON_OF[key]]));
|
|
253
319
|
/** Ordered match rules; the first hit wins. Substrings track the thrown messages they recover. */
|
|
320
|
+
const escapeRegExp = (text) => text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
321
|
+
/** Matches a message that opens with any of these sentences (their first sentence, as said). */
|
|
322
|
+
const startsWithAny = (sentences) => new RegExp(`^(?:${sentences.map((s) => escapeRegExp(s.split('. ')[0] ?? s)).join('|')})`);
|
|
254
323
|
const RULES = [
|
|
324
|
+
// First, because the message carries a path the user chose, and a path can hold any word a later
|
|
325
|
+
// rule keys on. Without it the variable's name read as a `reticle_*` tool and the agent was told
|
|
326
|
+
// its call failed the schema. Not anchored, so a launch error that wraps it is still caught. The
|
|
327
|
+
// prefix has no regex metacharacters, so it is used as is.
|
|
328
|
+
{ match: new RegExp(CHROMIUM_PATH_REFUSAL_PREFIX), hint: RECOVERY.CHROMIUM_PATH },
|
|
255
329
|
{ match: /no browser session connected/i, hint: RECOVERY.NO_SESSION },
|
|
256
330
|
{ match: /multiple sessions connected/i, hint: RECOVERY.MULTIPLE_SESSIONS },
|
|
257
331
|
{ match: /no connected session with id/i, hint: RECOVERY.UNKNOWN_SESSION },
|
|
@@ -260,14 +334,31 @@ const RULES = [
|
|
|
260
334
|
{ match: /no (?:active|compiled) recording named/i, hint: RECOVERY.MISSING_RECORDING },
|
|
261
335
|
{ match: /pairing token is required/i, hint: RECOVERY.TOKEN_REQUIRED },
|
|
262
336
|
{
|
|
263
|
-
|
|
337
|
+
// Credits spent, not entitled, or the platform not answering: deliberate refusals, each naming
|
|
338
|
+
// its own way out, never "may be a defect in Reticle".
|
|
339
|
+
match: startsWithAny([
|
|
340
|
+
RefusalLead[PlatformRefusalCode.HARNESS_OFF],
|
|
341
|
+
RefusalLead[PlatformRefusalCode.NEEDS_CARD],
|
|
342
|
+
MSG_HARNESS_DISABLED,
|
|
343
|
+
MSG_HARNESS_UNCLAIMED,
|
|
344
|
+
MSG_HARNESS_UNCONFIRMED,
|
|
345
|
+
]),
|
|
264
346
|
hint: RECOVERY.HARNESS_OFF,
|
|
265
347
|
},
|
|
348
|
+
// A credits sentence is core's own wording (core/src/artifacts/harness-credits.ts), not the
|
|
349
|
+
// platform's: matching it is matching ourselves.
|
|
350
|
+
{ match: /credits are used\./, hint: RECOVERY.HARNESS_OFF },
|
|
351
|
+
{
|
|
352
|
+
// The gate's own words, and the platform's "locked: connect your app first": expected states.
|
|
353
|
+
match: new RegExp(`(?:^Harness unlocks at \\d+% instrumentation)|(?:^${escapeRegExp(RefusalLead[PlatformRefusalCode.HARNESS_LOCKED])})`),
|
|
354
|
+
hint: RECOVERY.HARNESS_LOCKED,
|
|
355
|
+
},
|
|
356
|
+
{ match: /The Reticle Harness runs on the Reticle platform/, hint: RECOVERY.HARNESS_NOT_LINKED },
|
|
266
357
|
// Three conditions the daemon understands perfectly and still asked for a bug report about. Each
|
|
267
358
|
// needs its own rule: none of them contains "no browser session connected" (the scope miss is
|
|
268
359
|
// "no browser session FOR project 'x'", which is the opposite claim — sessions exist).
|
|
269
360
|
{
|
|
270
|
-
match: /scope mismatch|session\(s\) ARE connected under a different project/i,
|
|
361
|
+
match: /scope mismatch|session\(s\) ARE connected (?:under a different project|with no projectId)/i,
|
|
271
362
|
hint: RECOVERY.SCOPE_MISMATCH,
|
|
272
363
|
},
|
|
273
364
|
{ match: /^session disconnected$|session .* never connected/i, hint: RECOVERY.SESSION_GONE },
|
|
@@ -364,6 +455,8 @@ const RULES = [
|
|
|
364
455
|
* saying a server is running and the recovery saying to go start one.
|
|
365
456
|
*/
|
|
366
457
|
export function recoveryFor(message) {
|
|
458
|
+
if (isUnissuedRefRefusal(message))
|
|
459
|
+
return RECOVERY.UNISSUED_REF;
|
|
367
460
|
if (isSelfRecovering(message))
|
|
368
461
|
return undefined;
|
|
369
462
|
for (const rule of RULES) {
|
|
@@ -382,6 +475,8 @@ export function recoveryFor(message) {
|
|
|
382
475
|
*/
|
|
383
476
|
export function refusalReasonFor(rawMessage) {
|
|
384
477
|
const message = zodArrayAsSentence(rawMessage);
|
|
478
|
+
if (isUnissuedRefRefusal(message))
|
|
479
|
+
return RefusalReason.BAD_ARGS;
|
|
385
480
|
// The no-session diagnosis inspected the machine and named the cause itself, so it never reaches
|
|
386
481
|
// the recovery table. It is the single largest refusal there is; missing it would gut the metric.
|
|
387
482
|
if (message.includes(SELF_RECOVERING_MARKER))
|
|
@@ -505,6 +600,8 @@ export function buildErrorPayload(rawMessage) {
|
|
|
505
600
|
// Render the zod array BEFORE capping: the cap would otherwise truncate the JSON mid-issue and
|
|
506
601
|
// leave an unparseable fragment as the agent's error text — the worst of both shapes.
|
|
507
602
|
const message = capMessage(zodArrayAsSentence(rawMessage));
|
|
603
|
+
if (isUnissuedRefRefusal(message))
|
|
604
|
+
return { error: message, recovery: RECOVERY.UNISSUED_REF };
|
|
508
605
|
// A self-diagnosing message gets NEITHER a generic recovery nor the feedback ask. It already
|
|
509
606
|
// inspected the machine and named the cause; a second, contradictory hint is noise, and inviting a
|
|
510
607
|
// bug report about a condition Reticle diagnosed itself is exactly backwards.
|
|
@@ -10,5 +10,35 @@
|
|
|
10
10
|
* Those flows are the point. From the second run onwards `reticle_verify { action: "flows" }` replays
|
|
11
11
|
* them deterministically with no model in the loop at all.
|
|
12
12
|
*/
|
|
13
|
-
import type { ToolDef } from './tool-kit.js';
|
|
13
|
+
import type { ToolCall, ToolDef, ToolDeps } from './tool-kit.js';
|
|
14
|
+
import { DriveStatus, type DriveControl } from '../../features/harness/drive-runs.js';
|
|
15
|
+
import { type RemoteDriveOutcome } from '../../features/harness/platform/remote-drive.js';
|
|
16
|
+
import type { ExploreResult } from './harness-explore.js';
|
|
17
|
+
export declare const WAIT_MAX_S = 240;
|
|
14
18
|
export declare const EXPLORE_TOOLS: ToolDef[];
|
|
19
|
+
export declare const MSG_ALREADY_DRIVING = "A Harness drive is already running on this app; this is that drive. Poll it by runId; do not start another.";
|
|
20
|
+
/** One drive, run to its end: the tool's own full answer, and how it ended. */
|
|
21
|
+
export type ExploreDrive = (deps: ToolDeps, env: Record<string, string | undefined>, args: Record<string, unknown>, harness: string, control: DriveControl) => Promise<{
|
|
22
|
+
status: DriveStatus;
|
|
23
|
+
result: Record<string, unknown>;
|
|
24
|
+
}>;
|
|
25
|
+
/**
|
|
26
|
+
* Start a drive and wait on it for a while, or poll, stop or speak to one by `runId`.
|
|
27
|
+
*
|
|
28
|
+
* The drive itself never runs inside the call: it is started in the registry and the call waits up
|
|
29
|
+
* to `wait` seconds, so a client's timeout loses nothing. A second start on the same app answers
|
|
30
|
+
* with the drive already running rather than paying for another.
|
|
31
|
+
*/
|
|
32
|
+
export declare function answerExplore(deps: ToolDeps, args: Record<string, unknown>, call: ToolCall | undefined, drive: ExploreDrive): Promise<unknown>;
|
|
33
|
+
/** The tool's answer for a finished drive. */
|
|
34
|
+
export declare function exploreReport(explored: ExploreResult): Record<string, unknown>;
|
|
35
|
+
/**
|
|
36
|
+
* A drive the platform's chat asked for, run as the very tool an agent would call.
|
|
37
|
+
*
|
|
38
|
+
* Through `runTool`, not a second path to `exploreApp`: a dispatch that skips it is a drive nobody
|
|
39
|
+
* counted, and the chat's answer is then the same derived summary the agent would have read — never
|
|
40
|
+
* a model's account of its own drive.
|
|
41
|
+
*/
|
|
42
|
+
export declare function driveForChat(deps: ToolDeps, goal: string, sessionId?: string, planId?: string,
|
|
43
|
+
/** The person who started it acknowledged the saved flows' destructive steps. */
|
|
44
|
+
confirmDangerous?: boolean): Promise<RemoteDriveOutcome>;
|