@reticlehq/server 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +105 -0
- package/README.md +17 -0
- package/dist/bridge-security.d.ts +23 -0
- package/dist/bridge-security.d.ts.map +1 -0
- package/dist/bridge-security.js +44 -0
- package/dist/bridge-security.js.map +1 -0
- package/dist/bridge.d.ts +42 -0
- package/dist/bridge.d.ts.map +1 -0
- package/dist/bridge.js +281 -0
- package/dist/bridge.js.map +1 -0
- package/dist/bridge.test-harness.d.ts +42 -0
- package/dist/bridge.test-harness.d.ts.map +1 -0
- package/dist/bridge.test-harness.js +192 -0
- package/dist/bridge.test-harness.js.map +1 -0
- package/dist/cli-launch.d.ts +53 -0
- package/dist/cli-launch.d.ts.map +1 -0
- package/dist/cli-launch.js +109 -0
- package/dist/cli-launch.js.map +1 -0
- package/dist/cli-parse.d.ts +74 -0
- package/dist/cli-parse.d.ts.map +1 -0
- package/dist/cli-parse.js +321 -0
- package/dist/cli-parse.js.map +1 -0
- package/dist/cli-port.d.ts +26 -0
- package/dist/cli-port.d.ts.map +1 -0
- package/dist/cli-port.js +57 -0
- package/dist/cli-port.js.map +1 -0
- package/dist/cli-verify.d.ts +46 -0
- package/dist/cli-verify.d.ts.map +1 -0
- package/dist/cli-verify.js +181 -0
- package/dist/cli-verify.js.map +1 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +337 -0
- package/dist/cli.js.map +1 -0
- package/dist/cloud/cloud-sync.d.ts +50 -0
- package/dist/cloud/cloud-sync.d.ts.map +1 -0
- package/dist/cloud/cloud-sync.js +47 -0
- package/dist/cloud/cloud-sync.js.map +1 -0
- package/dist/crawl/crawl-tools.d.ts +8 -0
- package/dist/crawl/crawl-tools.d.ts.map +1 -0
- package/dist/crawl/crawl-tools.js +61 -0
- package/dist/crawl/crawl-tools.js.map +1 -0
- package/dist/crawl/crawl.d.ts +45 -0
- package/dist/crawl/crawl.d.ts.map +1 -0
- package/dist/crawl/crawl.js +106 -0
- package/dist/crawl/crawl.js.map +1 -0
- package/dist/daemon-resilience.d.ts +17 -0
- package/dist/daemon-resilience.d.ts.map +1 -0
- package/dist/daemon-resilience.js +23 -0
- package/dist/daemon-resilience.js.map +1 -0
- package/dist/daemon.d.ts +26 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +122 -0
- package/dist/daemon.js.map +1 -0
- package/dist/domain/domain-model.d.ts +64 -0
- package/dist/domain/domain-model.d.ts.map +1 -0
- package/dist/domain/domain-model.js +127 -0
- package/dist/domain/domain-model.js.map +1 -0
- package/dist/domain/domain-tools.d.ts +9 -0
- package/dist/domain/domain-tools.d.ts.map +1 -0
- package/dist/domain/domain-tools.js +66 -0
- package/dist/domain/domain-tools.js.map +1 -0
- package/dist/domain/flow-risk.d.ts +34 -0
- package/dist/domain/flow-risk.d.ts.map +1 -0
- package/dist/domain/flow-risk.js +81 -0
- package/dist/domain/flow-risk.js.map +1 -0
- package/dist/ee/audit-log.d.ts +15 -0
- package/dist/ee/audit-log.d.ts.map +1 -0
- package/dist/ee/audit-log.js +12 -0
- package/dist/ee/audit-log.js.map +1 -0
- package/dist/events/event-filters.d.ts +65 -0
- package/dist/events/event-filters.d.ts.map +1 -0
- package/dist/events/event-filters.js +98 -0
- package/dist/events/event-filters.js.map +1 -0
- package/dist/events/predicate-eval.d.ts +91 -0
- package/dist/events/predicate-eval.d.ts.map +1 -0
- package/dist/events/predicate-eval.js +299 -0
- package/dist/events/predicate-eval.js.map +1 -0
- package/dist/events/predicate.d.ts +19 -0
- package/dist/events/predicate.d.ts.map +1 -0
- package/dist/events/predicate.js +188 -0
- package/dist/events/predicate.js.map +1 -0
- package/dist/events/reaction.d.ts +34 -0
- package/dist/events/reaction.d.ts.map +1 -0
- package/dist/events/reaction.js +60 -0
- package/dist/events/reaction.js.map +1 -0
- package/dist/events/ring-buffer.d.ts +32 -0
- package/dist/events/ring-buffer.d.ts.map +1 -0
- package/dist/events/ring-buffer.js +75 -0
- package/dist/events/ring-buffer.js.map +1 -0
- package/dist/flows/annotate-tools.d.ts +16 -0
- package/dist/flows/annotate-tools.d.ts.map +1 -0
- package/dist/flows/annotate-tools.js +136 -0
- package/dist/flows/annotate-tools.js.map +1 -0
- package/dist/flows/annotate.d.ts +22 -0
- package/dist/flows/annotate.d.ts.map +1 -0
- package/dist/flows/annotate.js +134 -0
- package/dist/flows/annotate.js.map +1 -0
- package/dist/flows/annotation-store.d.ts +23 -0
- package/dist/flows/annotation-store.d.ts.map +1 -0
- package/dist/flows/annotation-store.js +51 -0
- package/dist/flows/annotation-store.js.map +1 -0
- package/dist/flows/decision.d.ts +13 -0
- package/dist/flows/decision.d.ts.map +1 -0
- package/dist/flows/decision.js +111 -0
- package/dist/flows/decision.js.map +1 -0
- package/dist/flows/flow-classify.d.ts +52 -0
- package/dist/flows/flow-classify.d.ts.map +1 -0
- package/dist/flows/flow-classify.js +99 -0
- package/dist/flows/flow-classify.js.map +1 -0
- package/dist/flows/flow-replay-run.d.ts +15 -0
- package/dist/flows/flow-replay-run.d.ts.map +1 -0
- package/dist/flows/flow-replay-run.js +120 -0
- package/dist/flows/flow-replay-run.js.map +1 -0
- package/dist/flows/flow-replay.d.ts +49 -0
- package/dist/flows/flow-replay.d.ts.map +1 -0
- package/dist/flows/flow-replay.js +391 -0
- package/dist/flows/flow-replay.js.map +1 -0
- package/dist/flows/flow-report.d.ts +23 -0
- package/dist/flows/flow-report.d.ts.map +1 -0
- package/dist/flows/flow-report.js +106 -0
- package/dist/flows/flow-report.js.map +1 -0
- package/dist/flows/flow-scope.d.ts +25 -0
- package/dist/flows/flow-scope.d.ts.map +1 -0
- package/dist/flows/flow-scope.js +32 -0
- package/dist/flows/flow-scope.js.map +1 -0
- package/dist/flows/flow-success.d.ts +33 -0
- package/dist/flows/flow-success.d.ts.map +1 -0
- package/dist/flows/flow-success.js +131 -0
- package/dist/flows/flow-success.js.map +1 -0
- package/dist/flows/flow-tools.d.ts +4 -0
- package/dist/flows/flow-tools.d.ts.map +1 -0
- package/dist/flows/flow-tools.js +460 -0
- package/dist/flows/flow-tools.js.map +1 -0
- package/dist/flows/flows.d.ts +86 -0
- package/dist/flows/flows.d.ts.map +1 -0
- package/dist/flows/flows.js +319 -0
- package/dist/flows/flows.js.map +1 -0
- package/dist/flows/heal.d.ts +43 -0
- package/dist/flows/heal.d.ts.map +1 -0
- package/dist/flows/heal.js +98 -0
- package/dist/flows/heal.js.map +1 -0
- package/dist/flows/recordings.d.ts +46 -0
- package/dist/flows/recordings.d.ts.map +1 -0
- package/dist/flows/recordings.js +43 -0
- package/dist/flows/recordings.js.map +1 -0
- package/dist/flows/replay.d.ts +23 -0
- package/dist/flows/replay.d.ts.map +1 -0
- package/dist/flows/replay.js +160 -0
- package/dist/flows/replay.js.map +1 -0
- package/dist/http-server.d.ts +39 -0
- package/dist/http-server.d.ts.map +1 -0
- package/dist/http-server.js +145 -0
- package/dist/http-server.js.map +1 -0
- package/dist/idle-shutdown.d.ts +34 -0
- package/dist/idle-shutdown.d.ts.map +1 -0
- package/dist/idle-shutdown.js +68 -0
- package/dist/idle-shutdown.js.map +1 -0
- package/dist/index.d.ts +135 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +371 -0
- package/dist/index.js.map +1 -0
- package/dist/init/cursor.d.ts +25 -0
- package/dist/init/cursor.d.ts.map +1 -0
- package/dist/init/cursor.js +49 -0
- package/dist/init/cursor.js.map +1 -0
- package/dist/init/detect.d.ts +49 -0
- package/dist/init/detect.d.ts.map +1 -0
- package/dist/init/detect.js +84 -0
- package/dist/init/detect.js.map +1 -0
- package/dist/init/mcp.d.ts +40 -0
- package/dist/init/mcp.d.ts.map +1 -0
- package/dist/init/mcp.js +55 -0
- package/dist/init/mcp.js.map +1 -0
- package/dist/init/node-io.d.ts +8 -0
- package/dist/init/node-io.d.ts.map +1 -0
- package/dist/init/node-io.js +57 -0
- package/dist/init/node-io.js.map +1 -0
- package/dist/init/plan.d.ts +72 -0
- package/dist/init/plan.d.ts.map +1 -0
- package/dist/init/plan.js +280 -0
- package/dist/init/plan.js.map +1 -0
- package/dist/init/project-id.d.ts +17 -0
- package/dist/init/project-id.d.ts.map +1 -0
- package/dist/init/project-id.js +38 -0
- package/dist/init/project-id.js.map +1 -0
- package/dist/init/run.d.ts +42 -0
- package/dist/init/run.d.ts.map +1 -0
- package/dist/init/run.js +171 -0
- package/dist/init/run.js.map +1 -0
- package/dist/init/snippets.d.ts +33 -0
- package/dist/init/snippets.d.ts.map +1 -0
- package/dist/init/snippets.js +117 -0
- package/dist/init/snippets.js.map +1 -0
- package/dist/init/vite-config.d.ts +25 -0
- package/dist/init/vite-config.d.ts.map +1 -0
- package/dist/init/vite-config.js +45 -0
- package/dist/init/vite-config.js.map +1 -0
- package/dist/input/network-mock-tools.d.ts +3 -0
- package/dist/input/network-mock-tools.d.ts.map +1 -0
- package/dist/input/network-mock-tools.js +94 -0
- package/dist/input/network-mock-tools.js.map +1 -0
- package/dist/input/network-mock.d.ts +55 -0
- package/dist/input/network-mock.d.ts.map +1 -0
- package/dist/input/network-mock.js +62 -0
- package/dist/input/network-mock.js.map +1 -0
- package/dist/input/real-input.d.ts +174 -0
- package/dist/input/real-input.d.ts.map +1 -0
- package/dist/input/real-input.js +289 -0
- package/dist/input/real-input.js.map +1 -0
- package/dist/input/scroll-find.d.ts +41 -0
- package/dist/input/scroll-find.d.ts.map +1 -0
- package/dist/input/scroll-find.js +59 -0
- package/dist/input/scroll-find.js.map +1 -0
- package/dist/input/scroll-tools.d.ts +8 -0
- package/dist/input/scroll-tools.d.ts.map +1 -0
- package/dist/input/scroll-tools.js +68 -0
- package/dist/input/scroll-tools.js.map +1 -0
- package/dist/input/viewport-tools.d.ts +3 -0
- package/dist/input/viewport-tools.d.ts.map +1 -0
- package/dist/input/viewport-tools.js +65 -0
- package/dist/input/viewport-tools.js.map +1 -0
- package/dist/license/license.d.ts +108 -0
- package/dist/license/license.d.ts.map +1 -0
- package/dist/license/license.js +203 -0
- package/dist/license/license.js.map +1 -0
- package/dist/log.d.ts +6 -0
- package/dist/log.d.ts.map +1 -0
- package/dist/log.js +9 -0
- package/dist/log.js.map +1 -0
- package/dist/mcp-proxy.d.ts +16 -0
- package/dist/mcp-proxy.d.ts.map +1 -0
- package/dist/mcp-proxy.js +168 -0
- package/dist/mcp-proxy.js.map +1 -0
- package/dist/mcp.d.ts +14 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +101 -0
- package/dist/mcp.js.map +1 -0
- package/dist/pairing-token.d.ts +28 -0
- package/dist/pairing-token.d.ts.map +1 -0
- package/dist/pairing-token.js +62 -0
- package/dist/pairing-token.js.map +1 -0
- package/dist/pool/browser-pool.d.ts +90 -0
- package/dist/pool/browser-pool.d.ts.map +1 -0
- package/dist/pool/browser-pool.js +221 -0
- package/dist/pool/browser-pool.js.map +1 -0
- package/dist/pool/lease-reaper.d.ts +16 -0
- package/dist/pool/lease-reaper.d.ts.map +1 -0
- package/dist/pool/lease-reaper.js +41 -0
- package/dist/pool/lease-reaper.js.map +1 -0
- package/dist/pool/playwright-launcher.d.ts +19 -0
- package/dist/pool/playwright-launcher.d.ts.map +1 -0
- package/dist/pool/playwright-launcher.js +51 -0
- package/dist/pool/playwright-launcher.js.map +1 -0
- package/dist/project/baselines.d.ts +22 -0
- package/dist/project/baselines.d.ts.map +1 -0
- package/dist/project/baselines.js +45 -0
- package/dist/project/baselines.js.map +1 -0
- package/dist/project/fs-port.d.ts +27 -0
- package/dist/project/fs-port.d.ts.map +1 -0
- package/dist/project/fs-port.js +32 -0
- package/dist/project/fs-port.js.map +1 -0
- package/dist/project/project-store.d.ts +32 -0
- package/dist/project/project-store.d.ts.map +1 -0
- package/dist/project/project-store.js +127 -0
- package/dist/project/project-store.js.map +1 -0
- package/dist/project/project-tools.d.ts +9 -0
- package/dist/project/project-tools.d.ts.map +1 -0
- package/dist/project/project-tools.js +118 -0
- package/dist/project/project-tools.js.map +1 -0
- package/dist/project/reticle-dir.d.ts +61 -0
- package/dist/project/reticle-dir.d.ts.map +1 -0
- package/dist/project/reticle-dir.js +144 -0
- package/dist/project/reticle-dir.js.map +1 -0
- package/dist/runs/build-verification-run.d.ts +30 -0
- package/dist/runs/build-verification-run.d.ts.map +1 -0
- package/dist/runs/build-verification-run.js +71 -0
- package/dist/runs/build-verification-run.js.map +1 -0
- package/dist/runs/profile-redact.d.ts +16 -0
- package/dist/runs/profile-redact.d.ts.map +1 -0
- package/dist/runs/profile-redact.js +32 -0
- package/dist/runs/profile-redact.js.map +1 -0
- package/dist/runs/render-report.d.ts +9 -0
- package/dist/runs/render-report.d.ts.map +1 -0
- package/dist/runs/render-report.js +70 -0
- package/dist/runs/render-report.js.map +1 -0
- package/dist/runs/repair-prompt.d.ts +15 -0
- package/dist/runs/repair-prompt.d.ts.map +1 -0
- package/dist/runs/repair-prompt.js +59 -0
- package/dist/runs/repair-prompt.js.map +1 -0
- package/dist/runs/replay-mapping.d.ts +12 -0
- package/dist/runs/replay-mapping.d.ts.map +1 -0
- package/dist/runs/replay-mapping.js +35 -0
- package/dist/runs/replay-mapping.js.map +1 -0
- package/dist/runs/reticle-runner.d.ts +48 -0
- package/dist/runs/reticle-runner.d.ts.map +1 -0
- package/dist/runs/reticle-runner.js +56 -0
- package/dist/runs/reticle-runner.js.map +1 -0
- package/dist/runs/risk-classify.d.ts +27 -0
- package/dist/runs/risk-classify.d.ts.map +1 -0
- package/dist/runs/risk-classify.js +76 -0
- package/dist/runs/risk-classify.js.map +1 -0
- package/dist/runs/run-store.d.ts +40 -0
- package/dist/runs/run-store.d.ts.map +1 -0
- package/dist/runs/run-store.js +118 -0
- package/dist/runs/run-store.js.map +1 -0
- package/dist/runs/run-tools.d.ts +10 -0
- package/dist/runs/run-tools.d.ts.map +1 -0
- package/dist/runs/run-tools.js +69 -0
- package/dist/runs/run-tools.js.map +1 -0
- package/dist/runs/runner-port.d.ts +14 -0
- package/dist/runs/runner-port.d.ts.map +1 -0
- package/dist/runs/runner-port.js +23 -0
- package/dist/runs/runner-port.js.map +1 -0
- package/dist/runs/verify-http.d.ts +34 -0
- package/dist/runs/verify-http.d.ts.map +1 -0
- package/dist/runs/verify-http.js +102 -0
- package/dist/runs/verify-http.js.map +1 -0
- package/dist/runs/verify-server.d.ts +26 -0
- package/dist/runs/verify-server.d.ts.map +1 -0
- package/dist/runs/verify-server.js +99 -0
- package/dist/runs/verify-server.js.map +1 -0
- package/dist/server-version.d.ts +3 -0
- package/dist/server-version.d.ts.map +1 -0
- package/dist/server-version.js +5 -0
- package/dist/server-version.js.map +1 -0
- package/dist/session/control-envelope.d.ts +49 -0
- package/dist/session/control-envelope.d.ts.map +1 -0
- package/dist/session/control-envelope.js +44 -0
- package/dist/session/control-envelope.js.map +1 -0
- package/dist/session/live-control-tools.d.ts +16 -0
- package/dist/session/live-control-tools.d.ts.map +1 -0
- package/dist/session/live-control-tools.js +204 -0
- package/dist/session/live-control-tools.js.map +1 -0
- package/dist/session/output-budget.d.ts +41 -0
- package/dist/session/output-budget.d.ts.map +1 -0
- package/dist/session/output-budget.js +54 -0
- package/dist/session/output-budget.js.map +1 -0
- package/dist/session/presenter-args.d.ts +8 -0
- package/dist/session/presenter-args.d.ts.map +1 -0
- package/dist/session/presenter-args.js +15 -0
- package/dist/session/presenter-args.js.map +1 -0
- package/dist/session/review-store.d.ts +40 -0
- package/dist/session/review-store.d.ts.map +1 -0
- package/dist/session/review-store.js +61 -0
- package/dist/session/review-store.js.map +1 -0
- package/dist/session/session-health.d.ts +22 -0
- package/dist/session/session-health.d.ts.map +1 -0
- package/dist/session/session-health.js +26 -0
- package/dist/session/session-health.js.map +1 -0
- package/dist/session/session-manager.d.ts +43 -0
- package/dist/session/session-manager.d.ts.map +1 -0
- package/dist/session/session-manager.js +155 -0
- package/dist/session/session-manager.js.map +1 -0
- package/dist/session/session-readiness.d.ts +35 -0
- package/dist/session/session-readiness.d.ts.map +1 -0
- package/dist/session/session-readiness.js +32 -0
- package/dist/session/session-readiness.js.map +1 -0
- package/dist/session/session-reaper.d.ts +37 -0
- package/dist/session/session-reaper.d.ts.map +1 -0
- package/dist/session/session-reaper.js +94 -0
- package/dist/session/session-reaper.js.map +1 -0
- package/dist/session/session-recommendation.d.ts +18 -0
- package/dist/session/session-recommendation.d.ts.map +1 -0
- package/dist/session/session-recommendation.js +14 -0
- package/dist/session/session-recommendation.js.map +1 -0
- package/dist/session/session-tools.d.ts +9 -0
- package/dist/session/session-tools.d.ts.map +1 -0
- package/dist/session/session-tools.js +43 -0
- package/dist/session/session-tools.js.map +1 -0
- package/dist/session/session.d.ts +166 -0
- package/dist/session/session.d.ts.map +1 -0
- package/dist/session/session.js +408 -0
- package/dist/session/session.js.map +1 -0
- package/dist/session/state-select.d.ts +8 -0
- package/dist/session/state-select.d.ts.map +1 -0
- package/dist/session/state-select.js +8 -0
- package/dist/session/state-select.js.map +1 -0
- package/dist/token-auth.d.ts +24 -0
- package/dist/token-auth.d.ts.map +1 -0
- package/dist/token-auth.js +71 -0
- package/dist/token-auth.js.map +1 -0
- package/dist/tools/act-tools.d.ts +3 -0
- package/dist/tools/act-tools.d.ts.map +1 -0
- package/dist/tools/act-tools.js +327 -0
- package/dist/tools/act-tools.js.map +1 -0
- package/dist/tools/act-view.d.ts +19 -0
- package/dist/tools/act-view.d.ts.map +1 -0
- package/dist/tools/act-view.js +46 -0
- package/dist/tools/act-view.js.map +1 -0
- package/dist/tools/assert-grade.d.ts +21 -0
- package/dist/tools/assert-grade.d.ts.map +1 -0
- package/dist/tools/assert-grade.js +52 -0
- package/dist/tools/assert-grade.js.map +1 -0
- package/dist/tools/browser-tools.d.ts +3 -0
- package/dist/tools/browser-tools.d.ts.map +1 -0
- package/dist/tools/browser-tools.js +52 -0
- package/dist/tools/browser-tools.js.map +1 -0
- package/dist/tools/contract-tools.d.ts +8 -0
- package/dist/tools/contract-tools.d.ts.map +1 -0
- package/dist/tools/contract-tools.js +62 -0
- package/dist/tools/contract-tools.js.map +1 -0
- package/dist/tools/dynamic-tools.d.ts +7 -0
- package/dist/tools/dynamic-tools.d.ts.map +1 -0
- package/dist/tools/dynamic-tools.js +103 -0
- package/dist/tools/dynamic-tools.js.map +1 -0
- package/dist/tools/error-recovery.d.ts +31 -0
- package/dist/tools/error-recovery.d.ts.map +1 -0
- package/dist/tools/error-recovery.js +52 -0
- package/dist/tools/error-recovery.js.map +1 -0
- package/dist/tools/invoke-tool.d.ts +23 -0
- package/dist/tools/invoke-tool.d.ts.map +1 -0
- package/dist/tools/invoke-tool.js +99 -0
- package/dist/tools/invoke-tool.js.map +1 -0
- package/dist/tools/lease-tools.d.ts +31 -0
- package/dist/tools/lease-tools.d.ts.map +1 -0
- package/dist/tools/lease-tools.js +164 -0
- package/dist/tools/lease-tools.js.map +1 -0
- package/dist/tools/observe-tools.d.ts +3 -0
- package/dist/tools/observe-tools.d.ts.map +1 -0
- package/dist/tools/observe-tools.js +259 -0
- package/dist/tools/observe-tools.js.map +1 -0
- package/dist/tools/profiles.d.ts +33 -0
- package/dist/tools/profiles.d.ts.map +1 -0
- package/dist/tools/profiles.js +105 -0
- package/dist/tools/profiles.js.map +1 -0
- package/dist/tools/query-paginate.d.ts +15 -0
- package/dist/tools/query-paginate.d.ts.map +1 -0
- package/dist/tools/query-paginate.js +31 -0
- package/dist/tools/query-paginate.js.map +1 -0
- package/dist/tools/read-tools.d.ts +3 -0
- package/dist/tools/read-tools.d.ts.map +1 -0
- package/dist/tools/read-tools.js +329 -0
- package/dist/tools/read-tools.js.map +1 -0
- package/dist/tools/snapshot-delta.d.ts +59 -0
- package/dist/tools/snapshot-delta.d.ts.map +1 -0
- package/dist/tools/snapshot-delta.js +0 -0
- package/dist/tools/snapshot-delta.js.map +1 -0
- package/dist/tools/tool-invoker.d.ts +15 -0
- package/dist/tools/tool-invoker.d.ts.map +1 -0
- package/dist/tools/tool-invoker.js +20 -0
- package/dist/tools/tool-invoker.js.map +1 -0
- package/dist/tools/tool-kit.d.ts +60 -0
- package/dist/tools/tool-kit.d.ts.map +1 -0
- package/dist/tools/tool-kit.js +33 -0
- package/dist/tools/tool-kit.js.map +1 -0
- package/dist/tools/tool-names.d.ts +89 -0
- package/dist/tools/tool-names.d.ts.map +1 -0
- package/dist/tools/tool-names.js +88 -0
- package/dist/tools/tool-names.js.map +1 -0
- package/dist/tools/tools-helpers.d.ts +12 -0
- package/dist/tools/tools-helpers.d.ts.map +1 -0
- package/dist/tools/tools-helpers.js +22 -0
- package/dist/tools/tools-helpers.js.map +1 -0
- package/dist/tools/tools.d.ts +4 -0
- package/dist/tools/tools.d.ts.map +1 -0
- package/dist/tools/tools.js +268 -0
- package/dist/tools/tools.js.map +1 -0
- package/dist/update/update-checker.d.ts +20 -0
- package/dist/update/update-checker.d.ts.map +1 -0
- package/dist/update/update-checker.js +94 -0
- package/dist/update/update-checker.js.map +1 -0
- package/dist/update/update-tools.d.ts +3 -0
- package/dist/update/update-tools.d.ts.map +1 -0
- package/dist/update/update-tools.js +94 -0
- package/dist/update/update-tools.js.map +1 -0
- package/dist/update/updater.d.ts +31 -0
- package/dist/update/updater.d.ts.map +1 -0
- package/dist/update/updater.js +120 -0
- package/dist/update/updater.js.map +1 -0
- package/dist/visual/visual-diff.d.ts +46 -0
- package/dist/visual/visual-diff.d.ts.map +1 -0
- package/dist/visual/visual-diff.js +100 -0
- package/dist/visual/visual-diff.js.map +1 -0
- package/dist/visual/visual-store.d.ts +22 -0
- package/dist/visual/visual-store.d.ts.map +1 -0
- package/dist/visual/visual-store.js +60 -0
- package/dist/visual/visual-store.js.map +1 -0
- package/dist/visual/visual-tools.d.ts +9 -0
- package/dist/visual/visual-tools.d.ts.map +1 -0
- package/dist/visual/visual-tools.js +182 -0
- package/dist/visual/visual-tools.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-checker.js","sourceRoot":"","sources":["../../src/update/update-checker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-tools.d.ts","sourceRoot":"","sources":["../../src/update/update-tools.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAY,MAAM,mBAAmB,CAAC;AAK3D,eAAO,MAAM,YAAY,EAAE,OAAO,EAgGjC,CAAC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { ReticleTool } from '../tools/tool-names.js';
|
|
3
|
+
import { checkForUpdate } from './update-checker.js';
|
|
4
|
+
import { applyUpdate, rollback, detectExecutionKind } from './updater.js';
|
|
5
|
+
import { SERVER_VERSION } from '../server-version.js';
|
|
6
|
+
export const UPDATE_TOOLS = [
|
|
7
|
+
{
|
|
8
|
+
name: ReticleTool.VERSION_INFO,
|
|
9
|
+
description: 'Returns the running Reticle version, latest available version, release changelog, and any breaking changes. Call this at the start of a session or when unexpected tool behavior suggests a version mismatch.',
|
|
10
|
+
inputSchema: {},
|
|
11
|
+
outputSchema: {
|
|
12
|
+
currentVersion: z.string().describe('The Reticle server version currently running.'),
|
|
13
|
+
latestVersion: z.string().optional().describe('Latest published version on npm.'),
|
|
14
|
+
updateAvailable: z.boolean().describe('True when a newer version is available to install.'),
|
|
15
|
+
executionKind: z
|
|
16
|
+
.string()
|
|
17
|
+
.describe('How reticle was launched: "npx" (no install needed — restart applies update), "global" (npm install -g), or "local" (project node_modules).'),
|
|
18
|
+
changelog: z.string().optional().describe('Release notes for the latest version.'),
|
|
19
|
+
breakingChanges: z
|
|
20
|
+
.array(z.string())
|
|
21
|
+
.optional()
|
|
22
|
+
.describe('Breaking changes in the latest version that may affect your scripts.'),
|
|
23
|
+
rollbackAvailable: z
|
|
24
|
+
.boolean()
|
|
25
|
+
.describe('True when a previous version is stored and can be restored.'),
|
|
26
|
+
previousVersion: z
|
|
27
|
+
.string()
|
|
28
|
+
.optional()
|
|
29
|
+
.describe('The version that would be restored on rollback.'),
|
|
30
|
+
},
|
|
31
|
+
handler: async (deps) => {
|
|
32
|
+
const manifest = await checkForUpdate(SERVER_VERSION, deps.now);
|
|
33
|
+
return {
|
|
34
|
+
currentVersion: manifest.currentVersion,
|
|
35
|
+
...(manifest.latestVersion !== undefined ? { latestVersion: manifest.latestVersion } : {}),
|
|
36
|
+
updateAvailable: manifest.updateAvailable,
|
|
37
|
+
executionKind: detectExecutionKind(),
|
|
38
|
+
...(manifest.changelog !== undefined ? { changelog: manifest.changelog } : {}),
|
|
39
|
+
...(manifest.breakingChanges !== undefined
|
|
40
|
+
? { breakingChanges: manifest.breakingChanges }
|
|
41
|
+
: {}),
|
|
42
|
+
rollbackAvailable: manifest.previousVersion !== undefined,
|
|
43
|
+
...(manifest.previousVersion !== undefined
|
|
44
|
+
? { previousVersion: manifest.previousVersion }
|
|
45
|
+
: {}),
|
|
46
|
+
};
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
name: ReticleTool.APPLY_UPDATE,
|
|
51
|
+
description: 'Install the latest Reticle server version and restart. Strategy depends on how reticle was launched (check executionKind from reticle_version_info): "global" and "local" installs run npm install then exit; "npx" just exits — Claude Code restarts and npx re-resolves the latest version from npm automatically. The MCP connection briefly drops during restart.',
|
|
52
|
+
inputSchema: {
|
|
53
|
+
confirm: z
|
|
54
|
+
.boolean()
|
|
55
|
+
.describe('Set to true to confirm the update should be applied. Required to prevent accidental upgrades.'),
|
|
56
|
+
},
|
|
57
|
+
outputSchema: {
|
|
58
|
+
ok: z.boolean(),
|
|
59
|
+
message: z.string().optional(),
|
|
60
|
+
},
|
|
61
|
+
handler: async (deps, args) => {
|
|
62
|
+
if (args['confirm'] !== true) {
|
|
63
|
+
return { ok: false, message: 'Set confirm:true to apply the update' };
|
|
64
|
+
}
|
|
65
|
+
const manifest = await checkForUpdate(SERVER_VERSION, deps.now);
|
|
66
|
+
if (!manifest.updateAvailable || manifest.latestVersion === undefined) {
|
|
67
|
+
return { ok: false, message: 'No update available — already on the latest version' };
|
|
68
|
+
}
|
|
69
|
+
await applyUpdate(manifest.latestVersion);
|
|
70
|
+
return { ok: true }; // unreachable — applyUpdate calls process.exit()
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
name: ReticleTool.ROLLBACK,
|
|
75
|
+
description: 'Restore the previous Reticle server version and restart. Use when an update introduced a regression. The MCP connection will briefly drop — Claude Code restarts the process automatically with the restored binary.',
|
|
76
|
+
inputSchema: {
|
|
77
|
+
confirm: z
|
|
78
|
+
.boolean()
|
|
79
|
+
.describe('Set to true to confirm the rollback. Required to prevent accidental downgrades.'),
|
|
80
|
+
},
|
|
81
|
+
outputSchema: {
|
|
82
|
+
ok: z.boolean(),
|
|
83
|
+
message: z.string().optional(),
|
|
84
|
+
},
|
|
85
|
+
handler: async (_deps, args) => {
|
|
86
|
+
if (args['confirm'] !== true) {
|
|
87
|
+
return { ok: false, message: 'Set confirm:true to apply the rollback' };
|
|
88
|
+
}
|
|
89
|
+
await rollback();
|
|
90
|
+
return { ok: true }; // unreachable — rollback() calls process.exit()
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
];
|
|
94
|
+
//# sourceMappingURL=update-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-tools.js","sourceRoot":"","sources":["../../src/update/update-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,CAAC,MAAM,YAAY,GAAc;IACrC;QACE,IAAI,EAAE,WAAW,CAAC,YAAY;QAC9B,WAAW,EACT,+MAA+M;QACjN,WAAW,EAAE,EAAE;QACf,YAAY,EAAE;YACZ,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;YACpF,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;YACjF,eAAe,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,oDAAoD,CAAC;YAC3F,aAAa,EAAE,CAAC;iBACb,MAAM,EAAE;iBACR,QAAQ,CACP,6IAA6I,CAC9I;YACH,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;YAClF,eAAe,EAAE,CAAC;iBACf,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;iBACjB,QAAQ,EAAE;iBACV,QAAQ,CAAC,sEAAsE,CAAC;YACnF,iBAAiB,EAAE,CAAC;iBACjB,OAAO,EAAE;iBACT,QAAQ,CAAC,6DAA6D,CAAC;YAC1E,eAAe,EAAE,CAAC;iBACf,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,iDAAiD,CAAC;SAC/D;QACD,OAAO,EAAE,KAAK,EAAE,IAAc,EAAE,EAAE;YAChC,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,cAAc,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;YAChE,OAAO;gBACL,cAAc,EAAE,QAAQ,CAAC,cAAc;gBACvC,GAAG,CAAC,QAAQ,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1F,eAAe,EAAE,QAAQ,CAAC,eAAe;gBACzC,aAAa,EAAE,mBAAmB,EAAE;gBACpC,GAAG,CAAC,QAAQ,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC9E,GAAG,CAAC,QAAQ,CAAC,eAAe,KAAK,SAAS;oBACxC,CAAC,CAAC,EAAE,eAAe,EAAE,QAAQ,CAAC,eAAe,EAAE;oBAC/C,CAAC,CAAC,EAAE,CAAC;gBACP,iBAAiB,EAAE,QAAQ,CAAC,eAAe,KAAK,SAAS;gBACzD,GAAG,CAAC,QAAQ,CAAC,eAAe,KAAK,SAAS;oBACxC,CAAC,CAAC,EAAE,eAAe,EAAE,QAAQ,CAAC,eAAe,EAAE;oBAC/C,CAAC,CAAC,EAAE,CAAC;aACR,CAAC;QACJ,CAAC;KACF;IACD;QACE,IAAI,EAAE,WAAW,CAAC,YAAY;QAC9B,WAAW,EACT,uWAAuW;QACzW,WAAW,EAAE;YACX,OAAO,EAAE,CAAC;iBACP,OAAO,EAAE;iBACT,QAAQ,CACP,+FAA+F,CAChG;SACJ;QACD,YAAY,EAAE;YACZ,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE;YACf,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;SAC/B;QACD,OAAO,EAAE,KAAK,EAAE,IAAc,EAAE,IAA6B,EAAE,EAAE;YAC/D,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC7B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,sCAAsC,EAAE,CAAC;YACxE,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,cAAc,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;YAChE,IAAI,CAAC,QAAQ,CAAC,eAAe,IAAI,QAAQ,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;gBACtE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,qDAAqD,EAAE,CAAC;YACvF,CAAC;YACD,MAAM,WAAW,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;YAC1C,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,iDAAiD;QACxE,CAAC;KACF;IACD;QACE,IAAI,EAAE,WAAW,CAAC,QAAQ;QAC1B,WAAW,EACT,sNAAsN;QACxN,WAAW,EAAE;YACX,OAAO,EAAE,CAAC;iBACP,OAAO,EAAE;iBACT,QAAQ,CACP,iFAAiF,CAClF;SACJ;QACD,YAAY,EAAE;YACZ,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE;YACf,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;SAC/B;QACD,OAAO,EAAE,KAAK,EAAE,KAAe,EAAE,IAA6B,EAAE,EAAE;YAChE,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC7B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,wCAAwC,EAAE,CAAC;YAC1E,CAAC;YACD,MAAM,QAAQ,EAAE,CAAC;YACjB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,gDAAgD;QACvE,CAAC;KACF;CACF,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/** How this reticle process was launched — determines which npm strategy to use for updates. */
|
|
2
|
+
declare const ExecutionKind: {
|
|
3
|
+
/** Launched via `npx @reticlehq/core` — npm re-resolves the package on restart. */
|
|
4
|
+
readonly NPX: "npx";
|
|
5
|
+
/** Installed globally via `npm install -g`. */
|
|
6
|
+
readonly GLOBAL: "global";
|
|
7
|
+
/** Installed as a local project dependency. */
|
|
8
|
+
readonly LOCAL: "local";
|
|
9
|
+
};
|
|
10
|
+
type ExecutionKind = (typeof ExecutionKind)[keyof typeof ExecutionKind];
|
|
11
|
+
/**
|
|
12
|
+
* Infer how reticle was launched from process.argv[1].
|
|
13
|
+
*
|
|
14
|
+
* npm's npx cache stores packages under a path containing `_npx`, which is the
|
|
15
|
+
* most reliable cross-platform signal. Local installs always live inside a
|
|
16
|
+
* `node_modules` directory. Everything else is treated as a global install.
|
|
17
|
+
*/
|
|
18
|
+
export declare function detectExecutionKind(): ExecutionKind;
|
|
19
|
+
/**
|
|
20
|
+
* Install targetVersion using the appropriate strategy for the detected execution kind,
|
|
21
|
+
* then exit so Claude Code restarts with the new binary. Saves the current version
|
|
22
|
+
* first so rollback() can restore it.
|
|
23
|
+
*/
|
|
24
|
+
export declare function applyUpdate(targetVersion: string): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Reinstall the previousVersion saved in the update manifest using the appropriate
|
|
27
|
+
* strategy, then exit so Claude Code restarts with the restored binary.
|
|
28
|
+
*/
|
|
29
|
+
export declare function rollback(): Promise<void>;
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=updater.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updater.d.ts","sourceRoot":"","sources":["../../src/update/updater.ts"],"names":[],"mappings":"AAUA,gGAAgG;AAChG,QAAA,MAAM,aAAa;IACjB,mFAAmF;;IAEnF,+CAA+C;;IAE/C,+CAA+C;;CAEvC,CAAC;AACX,KAAK,aAAa,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,OAAO,aAAa,CAAC,CAAC;AAExE;;;;;;GAMG;AACH,wBAAgB,mBAAmB,IAAI,aAAa,CAOnD;AAoED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAWtE;AAED;;;GAGG;AACH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAW9C"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import { platform } from 'node:os';
|
|
4
|
+
import { dirname, join } from 'node:path';
|
|
5
|
+
import { loadManifest, saveManifest } from './update-checker.js';
|
|
6
|
+
import { log } from '../log.js';
|
|
7
|
+
const NPM_BIN = platform() === 'win32' ? 'npm.cmd' : 'npm';
|
|
8
|
+
const NPM_TIMEOUT_MS = 120_000;
|
|
9
|
+
/** How this reticle process was launched — determines which npm strategy to use for updates. */
|
|
10
|
+
const ExecutionKind = {
|
|
11
|
+
/** Launched via `npx @reticlehq/core` — npm re-resolves the package on restart. */
|
|
12
|
+
NPX: 'npx',
|
|
13
|
+
/** Installed globally via `npm install -g`. */
|
|
14
|
+
GLOBAL: 'global',
|
|
15
|
+
/** Installed as a local project dependency. */
|
|
16
|
+
LOCAL: 'local',
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Infer how reticle was launched from process.argv[1].
|
|
20
|
+
*
|
|
21
|
+
* npm's npx cache stores packages under a path containing `_npx`, which is the
|
|
22
|
+
* most reliable cross-platform signal. Local installs always live inside a
|
|
23
|
+
* `node_modules` directory. Everything else is treated as a global install.
|
|
24
|
+
*/
|
|
25
|
+
export function detectExecutionKind() {
|
|
26
|
+
const script = process.argv[1] ?? '';
|
|
27
|
+
if (script.includes('/_npx/') || script.includes('\\_npx\\'))
|
|
28
|
+
return ExecutionKind.NPX;
|
|
29
|
+
if (script.includes('/node_modules/') || script.includes('\\node_modules\\')) {
|
|
30
|
+
return ExecutionKind.LOCAL;
|
|
31
|
+
}
|
|
32
|
+
return ExecutionKind.GLOBAL;
|
|
33
|
+
}
|
|
34
|
+
/** Walk up from cwd until a directory containing package.json is found. */
|
|
35
|
+
function findLocalProjectRoot() {
|
|
36
|
+
let dir = process.cwd();
|
|
37
|
+
for (;;) {
|
|
38
|
+
if (existsSync(join(dir, 'package.json')))
|
|
39
|
+
return dir;
|
|
40
|
+
const parent = dirname(dir);
|
|
41
|
+
if (parent === dir)
|
|
42
|
+
return null; // reached filesystem root
|
|
43
|
+
dir = parent;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function runNpm(args, opts = {}) {
|
|
47
|
+
return new Promise((resolve, reject) => {
|
|
48
|
+
execFile(NPM_BIN, args, { timeout: NPM_TIMEOUT_MS, ...(opts.cwd !== undefined ? { cwd: opts.cwd } : {}) }, (err, _stdout, stderr) => {
|
|
49
|
+
if (err !== null) {
|
|
50
|
+
reject(new Error(`npm ${args.join(' ')} failed: ${stderr !== '' ? stderr : err.message}`));
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
resolve();
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
async function installVersion(version, kind) {
|
|
59
|
+
const pkg = `@reticlehq/core@${version}`;
|
|
60
|
+
if (kind === ExecutionKind.NPX) {
|
|
61
|
+
// npx re-resolves the package from npm on the next Claude Code restart — no npm
|
|
62
|
+
// install needed. The restart itself is what triggers the update.
|
|
63
|
+
log('reticle_update_npx_strategy', {
|
|
64
|
+
note: 'Running via npx — exiting so Claude Code restarts and npx fetches the new version',
|
|
65
|
+
});
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
if (kind === ExecutionKind.LOCAL) {
|
|
69
|
+
const root = findLocalProjectRoot();
|
|
70
|
+
if (root !== null) {
|
|
71
|
+
await runNpm(['install', pkg], { cwd: root });
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
// Could not find a project root — fall through to global install as a safe default
|
|
75
|
+
log('reticle_update_local_no_root', { fallback: 'global' });
|
|
76
|
+
}
|
|
77
|
+
await runNpm(['install', '-g', pkg]);
|
|
78
|
+
}
|
|
79
|
+
async function installVersionRollback(version, kind) {
|
|
80
|
+
if (kind === ExecutionKind.NPX) {
|
|
81
|
+
log('reticle_rollback_npx_strategy', {
|
|
82
|
+
note: 'Running via npx — update your .mcp.json args to pin the version you want to restore',
|
|
83
|
+
});
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
await installVersion(version, kind);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Install targetVersion using the appropriate strategy for the detected execution kind,
|
|
90
|
+
* then exit so Claude Code restarts with the new binary. Saves the current version
|
|
91
|
+
* first so rollback() can restore it.
|
|
92
|
+
*/
|
|
93
|
+
export async function applyUpdate(targetVersion) {
|
|
94
|
+
const manifest = loadManifest();
|
|
95
|
+
if (manifest !== null) {
|
|
96
|
+
saveManifest({ ...manifest, previousVersion: manifest.currentVersion });
|
|
97
|
+
}
|
|
98
|
+
const kind = detectExecutionKind();
|
|
99
|
+
log('reticle_update_applying', { version: targetVersion, executionKind: kind });
|
|
100
|
+
await installVersion(targetVersion, kind);
|
|
101
|
+
log('reticle_update_applied', { version: targetVersion, executionKind: kind });
|
|
102
|
+
process.exit(0);
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Reinstall the previousVersion saved in the update manifest using the appropriate
|
|
106
|
+
* strategy, then exit so Claude Code restarts with the restored binary.
|
|
107
|
+
*/
|
|
108
|
+
export async function rollback() {
|
|
109
|
+
const manifest = loadManifest();
|
|
110
|
+
if (manifest === null || manifest.previousVersion === undefined) {
|
|
111
|
+
throw new Error('No previous version available for rollback');
|
|
112
|
+
}
|
|
113
|
+
const prev = manifest.previousVersion;
|
|
114
|
+
const kind = detectExecutionKind();
|
|
115
|
+
log('reticle_rollback_applying', { version: prev, executionKind: kind });
|
|
116
|
+
await installVersionRollback(prev, kind);
|
|
117
|
+
log('reticle_rollback_applied', { version: prev, executionKind: kind });
|
|
118
|
+
process.exit(0);
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=updater.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updater.js","sourceRoot":"","sources":["../../src/update/updater.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/** A rectangle in image pixel space — a mask to ignore, or the bounding box of what changed. */
|
|
2
|
+
export interface VisualRect {
|
|
3
|
+
x: number;
|
|
4
|
+
y: number;
|
|
5
|
+
width: number;
|
|
6
|
+
height: number;
|
|
7
|
+
}
|
|
8
|
+
/** Knobs for a perceptual diff. masks zero out volatile regions (clocks, avatars) before comparing. */
|
|
9
|
+
export interface DiffOptions {
|
|
10
|
+
/** pixelmatch per-pixel color threshold (0..1; higher = more lenient). */
|
|
11
|
+
threshold?: number;
|
|
12
|
+
/** A run passes when changed/total ≤ maxRatio. Default 0 (any change fails). */
|
|
13
|
+
maxRatio?: number;
|
|
14
|
+
/** Regions to neutralize in BOTH images before diffing, so dynamic content never trips the diff. */
|
|
15
|
+
masks?: VisualRect[];
|
|
16
|
+
}
|
|
17
|
+
/** The verdict of a perceptual diff (also the reticle_visual_diff result body). */
|
|
18
|
+
export interface VisualDiffResult {
|
|
19
|
+
matched: boolean;
|
|
20
|
+
changedPixels: number;
|
|
21
|
+
totalPixels: number;
|
|
22
|
+
/** changedPixels / totalPixels (0 on a dimension mismatch). */
|
|
23
|
+
ratio: number;
|
|
24
|
+
width: number;
|
|
25
|
+
height: number;
|
|
26
|
+
/** True when baseline and current differ in size — a pixel diff is impossible, so it's a fail. */
|
|
27
|
+
dimensionMismatch: boolean;
|
|
28
|
+
baseline: {
|
|
29
|
+
width: number;
|
|
30
|
+
height: number;
|
|
31
|
+
};
|
|
32
|
+
current: {
|
|
33
|
+
width: number;
|
|
34
|
+
height: number;
|
|
35
|
+
};
|
|
36
|
+
/** Bounding box of the changed pixels (omitted when nothing changed / dimension mismatch). */
|
|
37
|
+
region?: VisualRect;
|
|
38
|
+
/** Encoded overlay diff PNG (omitted on a dimension mismatch). */
|
|
39
|
+
diffPng?: Uint8Array;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Perceptually diff two PNGs. Pure (deps injected by lazy import), no IO. A size
|
|
43
|
+
* mismatch is a hard fail (can't pixel-diff) reported as `dimensionMismatch`, never a throw.
|
|
44
|
+
*/
|
|
45
|
+
export declare function diffPng(baselineBytes: Uint8Array, currentBytes: Uint8Array, opts?: DiffOptions): Promise<VisualDiffResult>;
|
|
46
|
+
//# sourceMappingURL=visual-diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visual-diff.d.ts","sourceRoot":"","sources":["../../src/visual/visual-diff.ts"],"names":[],"mappings":"AAEA,gGAAgG;AAChG,MAAM,WAAW,UAAU;IACzB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,uGAAuG;AACvG,MAAM,WAAW,WAAW;IAC1B,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gFAAgF;IAChF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oGAAoG;IACpG,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;CACtB;AAED,mFAAmF;AACnF,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,+DAA+D;IAC/D,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,kGAAkG;IAClG,iBAAiB,EAAE,OAAO,CAAC;IAC3B,QAAQ,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3C,8FAA8F;IAC9F,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,kEAAkE;IAClE,OAAO,CAAC,EAAE,UAAU,CAAC;CACtB;AAyED;;;GAGG;AACH,wBAAsB,OAAO,CAC3B,aAAa,EAAE,UAAU,EACzB,YAAY,EAAE,UAAU,EACxB,IAAI,GAAE,WAAgB,GACrB,OAAO,CAAC,gBAAgB,CAAC,CAgD3B"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { VISUAL_PIXEL_THRESHOLD } from '@reticlehq/core';
|
|
2
|
+
/** Lazy load — pngjs/pixelmatch are optional deps, so the always-on path never imports them. */
|
|
3
|
+
async function loadDeps() {
|
|
4
|
+
const png = (await import('pngjs'));
|
|
5
|
+
const pm = (await import('pixelmatch'));
|
|
6
|
+
return { PNG: png.PNG, pixelmatch: pm.default };
|
|
7
|
+
}
|
|
8
|
+
const RGBA = 4;
|
|
9
|
+
/** Zero a rectangle (clamped to bounds) in an RGBA buffer so masked regions compare equal. */
|
|
10
|
+
function applyMask(data, width, height, rect) {
|
|
11
|
+
const x0 = Math.max(0, Math.floor(rect.x));
|
|
12
|
+
const y0 = Math.max(0, Math.floor(rect.y));
|
|
13
|
+
const x1 = Math.min(width, Math.floor(rect.x + rect.width));
|
|
14
|
+
const y1 = Math.min(height, Math.floor(rect.y + rect.height));
|
|
15
|
+
for (let y = y0; y < y1; y += 1) {
|
|
16
|
+
for (let x = x0; x < x1; x += 1) {
|
|
17
|
+
const i = (y * width + x) * RGBA;
|
|
18
|
+
data[i] = 0;
|
|
19
|
+
data[i + 1] = 0;
|
|
20
|
+
data[i + 2] = 0;
|
|
21
|
+
data[i + 3] = 0;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/** Bounding box of pixelmatch's red diff pixels in the overlay output (undefined if none). */
|
|
26
|
+
function changedRegion(out, width, height) {
|
|
27
|
+
let minX = width;
|
|
28
|
+
let minY = height;
|
|
29
|
+
let maxX = -1;
|
|
30
|
+
let maxY = -1;
|
|
31
|
+
for (let y = 0; y < height; y += 1) {
|
|
32
|
+
for (let x = 0; x < width; x += 1) {
|
|
33
|
+
const i = (y * width + x) * RGBA;
|
|
34
|
+
// pixelmatch marks a changed pixel solid red (default diffColor) at full alpha.
|
|
35
|
+
if (out[i] === 255 && out[i + 1] === 0 && out[i + 2] === 0 && out[i + 3] === 255) {
|
|
36
|
+
if (x < minX)
|
|
37
|
+
minX = x;
|
|
38
|
+
if (y < minY)
|
|
39
|
+
minY = y;
|
|
40
|
+
if (x > maxX)
|
|
41
|
+
maxX = x;
|
|
42
|
+
if (y > maxY)
|
|
43
|
+
maxY = y;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (maxX < 0)
|
|
48
|
+
return undefined;
|
|
49
|
+
return { x: minX, y: minY, width: maxX - minX + 1, height: maxY - minY + 1 };
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Perceptually diff two PNGs. Pure (deps injected by lazy import), no IO. A size
|
|
53
|
+
* mismatch is a hard fail (can't pixel-diff) reported as `dimensionMismatch`, never a throw.
|
|
54
|
+
*/
|
|
55
|
+
export async function diffPng(baselineBytes, currentBytes, opts = {}) {
|
|
56
|
+
const { PNG, pixelmatch } = await loadDeps();
|
|
57
|
+
const a = PNG.sync.read(Buffer.from(baselineBytes));
|
|
58
|
+
const b = PNG.sync.read(Buffer.from(currentBytes));
|
|
59
|
+
const baseDims = { width: a.width, height: a.height };
|
|
60
|
+
const curDims = { width: b.width, height: b.height };
|
|
61
|
+
if (a.width !== b.width || a.height !== b.height) {
|
|
62
|
+
return {
|
|
63
|
+
matched: false,
|
|
64
|
+
changedPixels: 0,
|
|
65
|
+
totalPixels: a.width * a.height,
|
|
66
|
+
ratio: 0,
|
|
67
|
+
width: a.width,
|
|
68
|
+
height: a.height,
|
|
69
|
+
dimensionMismatch: true,
|
|
70
|
+
baseline: baseDims,
|
|
71
|
+
current: curDims,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
const { width, height } = a;
|
|
75
|
+
for (const rect of opts.masks ?? []) {
|
|
76
|
+
applyMask(a.data, width, height, rect);
|
|
77
|
+
applyMask(b.data, width, height, rect);
|
|
78
|
+
}
|
|
79
|
+
const out = new PNG({ width, height });
|
|
80
|
+
const threshold = opts.threshold ?? VISUAL_PIXEL_THRESHOLD;
|
|
81
|
+
const changedPixels = pixelmatch(a.data, b.data, out.data, width, height, { threshold });
|
|
82
|
+
const totalPixels = width * height;
|
|
83
|
+
const ratio = totalPixels === 0 ? 0 : changedPixels / totalPixels;
|
|
84
|
+
const maxRatio = opts.maxRatio ?? 0;
|
|
85
|
+
const region = changedPixels > 0 ? changedRegion(out.data, width, height) : undefined;
|
|
86
|
+
const result = {
|
|
87
|
+
matched: ratio <= maxRatio,
|
|
88
|
+
changedPixels,
|
|
89
|
+
totalPixels,
|
|
90
|
+
ratio,
|
|
91
|
+
width,
|
|
92
|
+
height,
|
|
93
|
+
dimensionMismatch: false,
|
|
94
|
+
baseline: baseDims,
|
|
95
|
+
current: curDims,
|
|
96
|
+
diffPng: new Uint8Array(PNG.sync.write(out)),
|
|
97
|
+
};
|
|
98
|
+
return region === undefined ? result : { ...result, region };
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=visual-diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visual-diff.js","sourceRoot":"","sources":["../../src/visual/visual-diff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { FileSystemPort } from '../project/fs-port.js';
|
|
2
|
+
/**
|
|
3
|
+
* On-disk PNG baselines + diffs under .reticle/visual/. Binary sibling of FlowStore — same
|
|
4
|
+
* name guard (rejects path traversal before any join) and injected FileSystemPort, but bytes not text.
|
|
5
|
+
*/
|
|
6
|
+
export declare class VisualStore {
|
|
7
|
+
#private;
|
|
8
|
+
constructor(fs: FileSystemPort, root: string);
|
|
9
|
+
/** The absolute baseline path for `name` (for echoing back to the agent). */
|
|
10
|
+
baselinePath(name: string): string;
|
|
11
|
+
/** The absolute overlay-diff path for `name`. */
|
|
12
|
+
diffPath(name: string): string;
|
|
13
|
+
/** True iff a valid name and a baseline PNG exists on disk. */
|
|
14
|
+
hasBaseline(name: string): Promise<boolean>;
|
|
15
|
+
/** Write a PNG baseline (auto-creating .reticle/visual/). Returns its path; throws on a bad name. */
|
|
16
|
+
saveBaseline(name: string, png: Uint8Array): Promise<string>;
|
|
17
|
+
/** Read a PNG baseline, or undefined if absent / invalid name (never throws on missing). */
|
|
18
|
+
readBaseline(name: string): Promise<Uint8Array | undefined>;
|
|
19
|
+
/** Write the overlay diff PNG for `name` (auto-creating .reticle/visual/). Returns its path. */
|
|
20
|
+
saveDiff(name: string, png: Uint8Array): Promise<string>;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=visual-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visual-store.d.ts","sourceRoot":"","sources":["../../src/visual/visual-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAQ5D;;;GAGG;AACH,qBAAa,WAAW;;gBAIV,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM;IAK5C,6EAA6E;IAC7E,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAIlC,iDAAiD;IACjD,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAI9B,+DAA+D;IACzD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKjD,qGAAqG;IAC/F,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAQlE,4FAA4F;IACtF,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAYjE,gGAAgG;IAC1F,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;CAO/D"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { reticleDirPaths, isValidFlowName, visualDiffPath, visualPath, } from '../project/reticle-dir.js';
|
|
2
|
+
/**
|
|
3
|
+
* On-disk PNG baselines + diffs under .reticle/visual/. Binary sibling of FlowStore — same
|
|
4
|
+
* name guard (rejects path traversal before any join) and injected FileSystemPort, but bytes not text.
|
|
5
|
+
*/
|
|
6
|
+
export class VisualStore {
|
|
7
|
+
#fs;
|
|
8
|
+
#root;
|
|
9
|
+
constructor(fs, root) {
|
|
10
|
+
this.#fs = fs;
|
|
11
|
+
this.#root = root;
|
|
12
|
+
}
|
|
13
|
+
/** The absolute baseline path for `name` (for echoing back to the agent). */
|
|
14
|
+
baselinePath(name) {
|
|
15
|
+
return visualPath(this.#root, name);
|
|
16
|
+
}
|
|
17
|
+
/** The absolute overlay-diff path for `name`. */
|
|
18
|
+
diffPath(name) {
|
|
19
|
+
return visualDiffPath(this.#root, name);
|
|
20
|
+
}
|
|
21
|
+
/** True iff a valid name and a baseline PNG exists on disk. */
|
|
22
|
+
async hasBaseline(name) {
|
|
23
|
+
if (!isValidFlowName(name))
|
|
24
|
+
return false;
|
|
25
|
+
return this.#fs.exists(visualPath(this.#root, name));
|
|
26
|
+
}
|
|
27
|
+
/** Write a PNG baseline (auto-creating .reticle/visual/). Returns its path; throws on a bad name. */
|
|
28
|
+
async saveBaseline(name, png) {
|
|
29
|
+
if (!isValidFlowName(name))
|
|
30
|
+
throw new Error(`invalid visual baseline name: ${name}`);
|
|
31
|
+
await this.#fs.mkdir(reticleDirPaths(this.#root).visual);
|
|
32
|
+
const path = visualPath(this.#root, name);
|
|
33
|
+
await this.#fs.writeFileBytes(path, png);
|
|
34
|
+
return path;
|
|
35
|
+
}
|
|
36
|
+
/** Read a PNG baseline, or undefined if absent / invalid name (never throws on missing). */
|
|
37
|
+
async readBaseline(name) {
|
|
38
|
+
if (!isValidFlowName(name) || !(await this.#fs.exists(visualPath(this.#root, name)))) {
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
try {
|
|
42
|
+
return await this.#fs.readFileBytes(visualPath(this.#root, name));
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
if (this.#fs.isNotFound(error))
|
|
46
|
+
return undefined; // exists/read TOCTOU race
|
|
47
|
+
throw error;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/** Write the overlay diff PNG for `name` (auto-creating .reticle/visual/). Returns its path. */
|
|
51
|
+
async saveDiff(name, png) {
|
|
52
|
+
if (!isValidFlowName(name))
|
|
53
|
+
throw new Error(`invalid visual baseline name: ${name}`);
|
|
54
|
+
await this.#fs.mkdir(reticleDirPaths(this.#root).visual);
|
|
55
|
+
const path = visualDiffPath(this.#root, name);
|
|
56
|
+
await this.#fs.writeFileBytes(path, png);
|
|
57
|
+
return path;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=visual-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visual-store.js","sourceRoot":"","sources":["../../src/visual/visual-store.ts"],"names":[],"mappings":"AACA,OAAO,EACL,eAAe,EACf,eAAe,EACf,cAAc,EACd,UAAU,GACX,MAAM,2BAA2B,CAAC;AAEnC;;;GAGG;AACH,MAAM,OAAO,WAAW;IACb,GAAG,CAAiB;IACpB,KAAK,CAAS;IAEvB,YAAY,EAAkB,EAAE,IAAY;QAC1C,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;QACd,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,6EAA6E;IAC7E,YAAY,CAAC,IAAY;QACvB,OAAO,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC;IAED,iDAAiD;IACjD,QAAQ,CAAC,IAAY;QACnB,OAAO,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC1C,CAAC;IAED,+DAA+D;IAC/D,KAAK,CAAC,WAAW,CAAC,IAAY;QAC5B,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;QACzC,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;IACvD,CAAC;IAED,qGAAqG;IACrG,KAAK,CAAC,YAAY,CAAC,IAAY,EAAE,GAAe;QAC9C,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,IAAI,EAAE,CAAC,CAAC;QACrF,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC;QACzD,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC1C,MAAM,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,4FAA4F;IAC5F,KAAK,CAAC,YAAY,CAAC,IAAY;QAC7B,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YACrF,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;QACpE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC;gBAAE,OAAO,SAAS,CAAC,CAAC,0BAA0B;YAC5E,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,gGAAgG;IAChG,KAAK,CAAC,QAAQ,CAAC,IAAY,EAAE,GAAe;QAC1C,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,IAAI,EAAE,CAAC,CAAC;QACrF,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC;QACzD,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC9C,MAAM,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ToolDef } from '../tools/tools.js';
|
|
2
|
+
/**
|
|
3
|
+
* The opt-in pixel layer. Both tools require a DRIVEN browser (reticle drive /
|
|
4
|
+
* RETICLE_CDP_URL) — the always-on SDK ships no screenshotter — and return a structured NO_PROVIDER
|
|
5
|
+
* envelope (with a recommendation) instead of throwing when none is attached. Behavioral checks
|
|
6
|
+
* stay the default; this is the complementary "does it look right" surface, never bundled in.
|
|
7
|
+
*/
|
|
8
|
+
export declare const VISUAL_TOOLS: ToolDef[];
|
|
9
|
+
//# sourceMappingURL=visual-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visual-tools.d.ts","sourceRoot":"","sources":["../../src/visual/visual-tools.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAY,MAAM,mBAAmB,CAAC;AA+E3D;;;;;GAKG;AACH,eAAO,MAAM,YAAY,EAAE,OAAO,EA+GjC,CAAC"}
|