@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,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The real Playwright adapter behind BrowserPool: wraps `chromium.launch` into the pool's small
|
|
3
|
+
* PooledBrowser/Context/Page interfaces. Kept thin and separate so the pool's lifecycle logic stays
|
|
4
|
+
* unit-tested with a fake while this glue is exercised only by the e2e battery (it needs Chromium).
|
|
5
|
+
*
|
|
6
|
+
* Headless by default — the pool exists for fault-tolerant headless multi-agent testing.
|
|
7
|
+
*/
|
|
8
|
+
import { chromium } from 'playwright';
|
|
9
|
+
function wrapBrowser(browser) {
|
|
10
|
+
return {
|
|
11
|
+
isConnected: () => browser.isConnected(),
|
|
12
|
+
newContext: async () => {
|
|
13
|
+
const context = await browser.newContext();
|
|
14
|
+
return {
|
|
15
|
+
newPage: async () => {
|
|
16
|
+
const page = await context.newPage();
|
|
17
|
+
return {
|
|
18
|
+
goto: (url, opts) => page.goto(url, opts?.timeoutMs === undefined ? undefined : { timeout: opts.timeoutMs }),
|
|
19
|
+
close: () => page.close(),
|
|
20
|
+
onCrash: (handler) => page.on('crash', handler),
|
|
21
|
+
};
|
|
22
|
+
},
|
|
23
|
+
close: () => context.close(),
|
|
24
|
+
};
|
|
25
|
+
},
|
|
26
|
+
close: () => browser.close(),
|
|
27
|
+
onDisconnected: (handler) => browser.on('disconnected', handler),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/** A Launcher that boots a real headless Chromium and adapts it to the pool's interface. */
|
|
31
|
+
export function playwrightLauncher(opts = {}) {
|
|
32
|
+
const headless = opts.headless ?? true;
|
|
33
|
+
return async () => wrapBrowser(await chromium.launch({ headless }));
|
|
34
|
+
}
|
|
35
|
+
const MAX_CONTEXTS_CEILING = 8;
|
|
36
|
+
const MAX_CONTEXTS_FLOOR = 1;
|
|
37
|
+
/**
|
|
38
|
+
* Resolve the pool's concurrency cap. An explicit RETICLE_MAX_CONTEXTS wins (clamped to >=1); otherwise
|
|
39
|
+
* scale with the machine but never above a sane ceiling so a big box can't fan out into a fork bomb.
|
|
40
|
+
* Pure (env value + cpu count passed in) so it's testable.
|
|
41
|
+
*/
|
|
42
|
+
export function resolveMaxContexts(envValue, cpuCount) {
|
|
43
|
+
if (envValue !== undefined) {
|
|
44
|
+
const parsed = parseInt(envValue, 10);
|
|
45
|
+
if (!isNaN(parsed) && parsed >= MAX_CONTEXTS_FLOOR)
|
|
46
|
+
return parsed;
|
|
47
|
+
}
|
|
48
|
+
const byCpu = Math.max(MAX_CONTEXTS_FLOOR, cpuCount - 1);
|
|
49
|
+
return Math.min(MAX_CONTEXTS_CEILING, byCpu);
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=playwright-launcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playwright-launcher.js","sourceRoot":"","sources":["../../src/pool/playwright-launcher.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAgB,MAAM,YAAY,CAAC;AAGpD,SAAS,WAAW,CAAC,OAAgB;IACnC,OAAO;QACL,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE;QACxC,UAAU,EAAE,KAAK,IAA4B,EAAE;YAC7C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;YAC3C,OAAO;gBACL,OAAO,EAAE,KAAK,IAAyB,EAAE;oBACvC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;oBACrC,OAAO;wBACL,IAAI,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAClB,IAAI,CAAC,IAAI,CACP,GAAG,EACH,IAAI,EAAE,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,CACxE;wBACH,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE;wBACzB,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC;qBAChD,CAAC;gBACJ,CAAC;gBACD,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE;aAC7B,CAAC;QACJ,CAAC;QACD,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE;QAC5B,cAAc,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,cAAc,EAAE,OAAO,CAAC;KACjE,CAAC;AACJ,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,kBAAkB,CAAC,OAA+B,EAAE;IAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC;IACvC,OAAO,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAC/B,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAE7B;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAA4B,EAAE,QAAgB;IAC/E,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,kBAAkB;YAAE,OAAO,MAAM,CAAC;IACpE,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,kBAAkB,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;IACzD,OAAO,IAAI,CAAC,GAAG,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface Baseline {
|
|
2
|
+
name: string;
|
|
3
|
+
lines: string[];
|
|
4
|
+
route: string;
|
|
5
|
+
}
|
|
6
|
+
interface DiffResult {
|
|
7
|
+
removed: string[];
|
|
8
|
+
added: string[];
|
|
9
|
+
}
|
|
10
|
+
/** Strip volatile ref ids so snapshots compare by semantics, not by ref number. */
|
|
11
|
+
export declare function normalizeLines(tree: string): string[];
|
|
12
|
+
/** Multiset diff: what's in baseline-but-not-current (removed) and current-but-not-baseline (added). */
|
|
13
|
+
export declare function diffLines(baseline: string[], current: string[]): DiffResult;
|
|
14
|
+
/** In-memory baseline store (per server run). */
|
|
15
|
+
export declare class BaselineStore {
|
|
16
|
+
#private;
|
|
17
|
+
save(baseline: Baseline): void;
|
|
18
|
+
get(name: string): Baseline | undefined;
|
|
19
|
+
list(): string[];
|
|
20
|
+
}
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=baselines.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baselines.d.ts","sourceRoot":"","sources":["../../src/project/baselines.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,UAAU;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,mFAAmF;AACnF,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAKrD;AAQD,wGAAwG;AACxG,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,UAAU,CAc3E;AAED,iDAAiD;AACjD,qBAAa,aAAa;;IAGxB,IAAI,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAI9B,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAIvC,IAAI,IAAI,MAAM,EAAE;CAGjB"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/** Strip volatile ref ids so snapshots compare by semantics, not by ref number. */
|
|
2
|
+
export function normalizeLines(tree) {
|
|
3
|
+
return tree
|
|
4
|
+
.split('\n')
|
|
5
|
+
.map((line) => line.replace(/\s*\(ref=e\d+\)/, '').trim())
|
|
6
|
+
.filter((line) => line.length > 0);
|
|
7
|
+
}
|
|
8
|
+
function frequency(lines) {
|
|
9
|
+
const map = new Map();
|
|
10
|
+
for (const line of lines)
|
|
11
|
+
map.set(line, (map.get(line) ?? 0) + 1);
|
|
12
|
+
return map;
|
|
13
|
+
}
|
|
14
|
+
/** Multiset diff: what's in baseline-but-not-current (removed) and current-but-not-baseline (added). */
|
|
15
|
+
export function diffLines(baseline, current) {
|
|
16
|
+
const b = frequency(baseline);
|
|
17
|
+
const c = frequency(current);
|
|
18
|
+
const removed = [];
|
|
19
|
+
const added = [];
|
|
20
|
+
for (const [line, n] of b) {
|
|
21
|
+
const have = c.get(line) ?? 0;
|
|
22
|
+
for (let i = 0; i < n - have; i += 1)
|
|
23
|
+
removed.push(line);
|
|
24
|
+
}
|
|
25
|
+
for (const [line, n] of c) {
|
|
26
|
+
const had = b.get(line) ?? 0;
|
|
27
|
+
for (let i = 0; i < n - had; i += 1)
|
|
28
|
+
added.push(line);
|
|
29
|
+
}
|
|
30
|
+
return { removed, added };
|
|
31
|
+
}
|
|
32
|
+
/** In-memory baseline store (per server run). */
|
|
33
|
+
export class BaselineStore {
|
|
34
|
+
#map = new Map();
|
|
35
|
+
save(baseline) {
|
|
36
|
+
this.#map.set(baseline.name, baseline);
|
|
37
|
+
}
|
|
38
|
+
get(name) {
|
|
39
|
+
return this.#map.get(name);
|
|
40
|
+
}
|
|
41
|
+
list() {
|
|
42
|
+
return [...this.#map.keys()];
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=baselines.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baselines.js","sourceRoot":"","sources":["../../src/project/baselines.ts"],"names":[],"mappings":"AAWA,mFAAmF;AACnF,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,IAAI;SACR,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;SACzD,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,SAAS,CAAC,KAAe;IAChC,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IACtC,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAClE,OAAO,GAAG,CAAC;AACb,CAAC;AAED,wGAAwG;AACxG,MAAM,UAAU,SAAS,CAAC,QAAkB,EAAE,OAAiB;IAC7D,MAAM,CAAC,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC9B,MAAM,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAC7B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3D,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAC5B,CAAC;AAED,iDAAiD;AACjD,MAAM,OAAO,aAAa;IACf,IAAI,GAAG,IAAI,GAAG,EAAoB,CAAC;IAE5C,IAAI,CAAC,QAAkB;QACrB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACzC,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/B,CAAC;CACF"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The injectable filesystem seam. Server logic depends on this interface, never on node:fs
|
|
3
|
+
* directly — so tests pass an in-memory or temp-dir adapter and never touch the repo's .reticle/.
|
|
4
|
+
*/
|
|
5
|
+
export interface FileSystemPort {
|
|
6
|
+
/** Read a UTF-8 file. Rejects (ENOENT) if absent. */
|
|
7
|
+
readFile(path: string): Promise<string>;
|
|
8
|
+
writeFile(path: string, data: string): Promise<void>;
|
|
9
|
+
/** Read raw bytes (PNG baselines). Rejects (ENOENT) if absent. */
|
|
10
|
+
readFileBytes(path: string): Promise<Uint8Array>;
|
|
11
|
+
/** Write raw bytes (PNG screenshots/diffs). */
|
|
12
|
+
writeFileBytes(path: string, data: Uint8Array): Promise<void>;
|
|
13
|
+
/** Recursive + idempotent: no throw if the directory already exists. */
|
|
14
|
+
mkdir(path: string): Promise<void>;
|
|
15
|
+
exists(path: string): Promise<boolean>;
|
|
16
|
+
/** List entries of a directory (for flows/baselines listing). */
|
|
17
|
+
readdir(path: string): Promise<string[]>;
|
|
18
|
+
/** Atomically replace `to` with `from` (same-FS rename) — for crash-safe writes. */
|
|
19
|
+
rename(from: string, to: string): Promise<void>;
|
|
20
|
+
/** Idempotent remove (no throw if absent) — for retention pruning + cleaning temp files. */
|
|
21
|
+
rm(path: string): Promise<void>;
|
|
22
|
+
/** ENOENT classifier — narrows unknown without `any`, so callers can distinguish missing-file. */
|
|
23
|
+
isNotFound(error: unknown): boolean;
|
|
24
|
+
}
|
|
25
|
+
/** Production adapter — the single import site of node:fs/promises in the server. */
|
|
26
|
+
export declare function createNodeFileSystem(): FileSystemPort;
|
|
27
|
+
//# sourceMappingURL=fs-port.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs-port.d.ts","sourceRoot":"","sources":["../../src/project/fs-port.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,qDAAqD;IACrD,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACxC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,kEAAkE;IAClE,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACjD,+CAA+C;IAC/C,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,wEAAwE;IACxE,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACvC,iEAAiE;IACjE,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,oFAAoF;IACpF,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,4FAA4F;IAC5F,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,kGAAkG;IAClG,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;CACrC;AAED,qFAAqF;AACrF,wBAAgB,oBAAoB,IAAI,cAAc,CA2BrD"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { access, mkdir, readdir, readFile, rename, rm, writeFile } from 'node:fs/promises';
|
|
2
|
+
/** Production adapter — the single import site of node:fs/promises in the server. */
|
|
3
|
+
export function createNodeFileSystem() {
|
|
4
|
+
return {
|
|
5
|
+
readFile: (path) => readFile(path, 'utf8'),
|
|
6
|
+
writeFile: (path, data) => writeFile(path, data, 'utf8'),
|
|
7
|
+
readFileBytes: async (path) => {
|
|
8
|
+
const buf = await readFile(path);
|
|
9
|
+
return new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);
|
|
10
|
+
},
|
|
11
|
+
writeFileBytes: (path, data) => writeFile(path, data),
|
|
12
|
+
mkdir: async (path) => {
|
|
13
|
+
await mkdir(path, { recursive: true });
|
|
14
|
+
},
|
|
15
|
+
exists: async (path) => {
|
|
16
|
+
try {
|
|
17
|
+
await access(path);
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
readdir: (path) => readdir(path),
|
|
25
|
+
rename: (from, to) => rename(from, to),
|
|
26
|
+
rm: async (path) => {
|
|
27
|
+
await rm(path, { force: true });
|
|
28
|
+
},
|
|
29
|
+
isNotFound: (error) => error?.code === 'ENOENT',
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=fs-port.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs-port.js","sourceRoot":"","sources":["../../src/project/fs-port.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AA2B3F,qFAAqF;AACrF,MAAM,UAAU,oBAAoB;IAClC,OAAO;QACL,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAC1C,SAAS,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC;QACxD,aAAa,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAC5B,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;YACjC,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;QACpE,CAAC;QACD,cAAc,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC;QACrD,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACpB,MAAM,KAAK,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACrB,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;gBACnB,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QACD,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;QAChC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QACtC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACjB,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAClC,CAAC;QACD,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,CAAE,KAA2C,EAAE,IAAI,KAAK,QAAQ;KACvF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { ProjectReadError, type ProjectFile, type RunRecord } from '@reticlehq/core';
|
|
2
|
+
import type { FileSystemPort } from './fs-port.js';
|
|
3
|
+
import type { Clock } from '../flows/flows.js';
|
|
4
|
+
/** Never-throws read result (mirrors ReadContractResult). */
|
|
5
|
+
export type ReadProjectResult = {
|
|
6
|
+
ok: true;
|
|
7
|
+
file: ProjectFile;
|
|
8
|
+
} | {
|
|
9
|
+
ok: false;
|
|
10
|
+
reason: ProjectReadError;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Cross-run outcome memory persisted at .reticle/project.json. Models FlowStore:
|
|
14
|
+
* injected FileSystemPort + Clock, byte-stable serialize, never-throws read. The clock is the
|
|
15
|
+
* single `at`-stamp site so handlers pass an un-stamped record and no Date.now leaks into logic.
|
|
16
|
+
*/
|
|
17
|
+
export declare class ProjectStore {
|
|
18
|
+
#private;
|
|
19
|
+
constructor(fs: FileSystemPort, root: string, clock: Clock);
|
|
20
|
+
/** Never throws. Missing → MISSING. Bad JSON / failed schema → MALFORMED. Mirrors readContract. */
|
|
21
|
+
read(): Promise<ReadProjectResult>;
|
|
22
|
+
/**
|
|
23
|
+
* Append a run, stamping `at` from the injected clock (the one clock site). A MISSING **or
|
|
24
|
+
* MALFORMED** existing file self-heals to a fresh empty file so corrupt history never blocks
|
|
25
|
+
* recording — unlike the read path, which surfaces MALFORMED honestly. Truncates per policy
|
|
26
|
+
* (last PER_NAME of any one name, then cap to TOTAL overall) and writes byte-stably.
|
|
27
|
+
*/
|
|
28
|
+
recordRun(record: Omit<RunRecord, 'at'>): Promise<void>;
|
|
29
|
+
/** The most-recent run for `name` (undefined on missing/malformed/none). Powers diff-vs-last. */
|
|
30
|
+
lastRun(name: string): Promise<RunRecord | undefined>;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=project-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-store.d.ts","sourceRoot":"","sources":["../../src/project/project-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,gBAAgB,EAChB,KAAK,WAAW,EAEhB,KAAK,SAAS,EACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAK/C,6DAA6D;AAC7D,MAAM,MAAM,iBAAiB,GACzB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,WAAW,CAAA;CAAE,GAC/B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAA;CAAE,CAAC;AAI5C;;;;GAIG;AACH,qBAAa,YAAY;;gBAKX,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK;IAoB1D,mGAAmG;IAC7F,IAAI,IAAI,OAAO,CAAC,iBAAiB,CAAC;IA0BxC;;;;;OAKG;IACG,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAU7D,iGAAiG;IAC3F,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;CAS5D"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { PROJECT_FILE_VERSION, PROJECT_RUN_CAP, ProjectFileSchema, ProjectReadError, } from '@reticlehq/core';
|
|
2
|
+
import { reticleDirPaths } from './reticle-dir.js';
|
|
3
|
+
const JSON_INDENT = 2;
|
|
4
|
+
const EMPTY_PROJECT = { version: PROJECT_FILE_VERSION, runs: [] };
|
|
5
|
+
/**
|
|
6
|
+
* Cross-run outcome memory persisted at .reticle/project.json. Models FlowStore:
|
|
7
|
+
* injected FileSystemPort + Clock, byte-stable serialize, never-throws read. The clock is the
|
|
8
|
+
* single `at`-stamp site so handlers pass an un-stamped record and no Date.now leaks into logic.
|
|
9
|
+
*/
|
|
10
|
+
export class ProjectStore {
|
|
11
|
+
#fs;
|
|
12
|
+
#root;
|
|
13
|
+
#clock;
|
|
14
|
+
constructor(fs, root, clock) {
|
|
15
|
+
this.#fs = fs;
|
|
16
|
+
this.#root = root;
|
|
17
|
+
this.#clock = clock;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Byte-stable serializer: fixed field order (rebuilt literals, never insertion order), 2-space
|
|
21
|
+
* indent + trailing newline. `runs` stays chronological (append order = the data, never sorted);
|
|
22
|
+
* `learned` arrays ARE sorted for diff-stability. Two semantically-equal files → identical bytes.
|
|
23
|
+
*/
|
|
24
|
+
#serialize(file) {
|
|
25
|
+
const envelope = {
|
|
26
|
+
version: PROJECT_FILE_VERSION,
|
|
27
|
+
...(file.learned !== undefined ? { learned: serializeLearned(file.learned) } : {}),
|
|
28
|
+
runs: file.runs.map(serializeRun),
|
|
29
|
+
};
|
|
30
|
+
return `${JSON.stringify(envelope, null, JSON_INDENT)}\n`;
|
|
31
|
+
}
|
|
32
|
+
/** Never throws. Missing → MISSING. Bad JSON / failed schema → MALFORMED. Mirrors readContract. */
|
|
33
|
+
async read() {
|
|
34
|
+
const path = reticleDirPaths(this.#root).project;
|
|
35
|
+
if (!(await this.#fs.exists(path)))
|
|
36
|
+
return { ok: false, reason: ProjectReadError.MISSING };
|
|
37
|
+
let text;
|
|
38
|
+
try {
|
|
39
|
+
text = await this.#fs.readFile(path);
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
return {
|
|
43
|
+
ok: false,
|
|
44
|
+
reason: this.#fs.isNotFound(error) ? ProjectReadError.MISSING : ProjectReadError.MALFORMED,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
let parsed;
|
|
48
|
+
try {
|
|
49
|
+
parsed = JSON.parse(text);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return { ok: false, reason: ProjectReadError.MALFORMED };
|
|
53
|
+
}
|
|
54
|
+
const result = ProjectFileSchema.safeParse(parsed);
|
|
55
|
+
if (!result.success)
|
|
56
|
+
return { ok: false, reason: ProjectReadError.MALFORMED };
|
|
57
|
+
return { ok: true, file: result.data };
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Append a run, stamping `at` from the injected clock (the one clock site). A MISSING **or
|
|
61
|
+
* MALFORMED** existing file self-heals to a fresh empty file so corrupt history never blocks
|
|
62
|
+
* recording — unlike the read path, which surfaces MALFORMED honestly. Truncates per policy
|
|
63
|
+
* (last PER_NAME of any one name, then cap to TOTAL overall) and writes byte-stably.
|
|
64
|
+
*/
|
|
65
|
+
async recordRun(record) {
|
|
66
|
+
const existing = await this.read();
|
|
67
|
+
const base = existing.ok ? existing.file : EMPTY_PROJECT;
|
|
68
|
+
const stamped = { ...record, at: this.#clock.now() };
|
|
69
|
+
const runs = truncate([...base.runs, stamped]);
|
|
70
|
+
const next = { ...base, runs };
|
|
71
|
+
await this.#fs.mkdir(reticleDirPaths(this.#root).root);
|
|
72
|
+
await this.#fs.writeFile(reticleDirPaths(this.#root).project, this.#serialize(next));
|
|
73
|
+
}
|
|
74
|
+
/** The most-recent run for `name` (undefined on missing/malformed/none). Powers diff-vs-last. */
|
|
75
|
+
async lastRun(name) {
|
|
76
|
+
const read = await this.read();
|
|
77
|
+
if (!read.ok)
|
|
78
|
+
return undefined;
|
|
79
|
+
for (let i = read.file.runs.length - 1; i >= 0; i -= 1) {
|
|
80
|
+
const run = read.file.runs[i];
|
|
81
|
+
if (run !== undefined && run.name === name)
|
|
82
|
+
return run;
|
|
83
|
+
}
|
|
84
|
+
return undefined;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/** Field-ordered rebuild of one run record so serialization is byte-stable. */
|
|
88
|
+
function serializeRun(run) {
|
|
89
|
+
return {
|
|
90
|
+
kind: run.kind,
|
|
91
|
+
name: run.name,
|
|
92
|
+
status: run.status,
|
|
93
|
+
at: run.at,
|
|
94
|
+
...(run.summary !== undefined ? { summary: run.summary } : {}),
|
|
95
|
+
...(run.evidence !== undefined ? { evidence: run.evidence } : {}),
|
|
96
|
+
...(run.durationMs !== undefined ? { durationMs: run.durationMs } : {}),
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/** Sorted, field-ordered rebuild of the learned map for diff-stability. */
|
|
100
|
+
function serializeLearned(learned) {
|
|
101
|
+
return {
|
|
102
|
+
...(learned.flows !== undefined ? { flows: [...learned.flows].sort() } : {}),
|
|
103
|
+
...(learned.routes !== undefined ? { routes: [...learned.routes].sort() } : {}),
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Keep at most PER_NAME most-recent runs of any single name, then cap the whole list to TOTAL
|
|
108
|
+
* most-recent overall. Chronological order (oldest→newest) is preserved throughout.
|
|
109
|
+
*/
|
|
110
|
+
function truncate(runs) {
|
|
111
|
+
const perName = new Map();
|
|
112
|
+
const keptReversed = [];
|
|
113
|
+
for (let i = runs.length - 1; i >= 0; i -= 1) {
|
|
114
|
+
const run = runs[i];
|
|
115
|
+
if (run === undefined)
|
|
116
|
+
continue;
|
|
117
|
+
const count = perName.get(run.name) ?? 0;
|
|
118
|
+
if (count >= PROJECT_RUN_CAP.PER_NAME)
|
|
119
|
+
continue;
|
|
120
|
+
perName.set(run.name, count + 1);
|
|
121
|
+
keptReversed.push(run);
|
|
122
|
+
if (keptReversed.length >= PROJECT_RUN_CAP.TOTAL)
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
125
|
+
return keptReversed.reverse();
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=project-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-store.js","sourceRoot":"","sources":["../../src/project/project-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ToolDef } from '../tools/tools.js';
|
|
2
|
+
/**
|
|
3
|
+
* The cross-run memory tools. `reticle_project` reads .reticle/project.json (optionally
|
|
4
|
+
* scoped to a name, with a diff-vs-last summary); `reticle_run_record` explicitly records an outcome
|
|
5
|
+
* (the manual companion to the auto-record on reticle_flow_replay). Both keep the agent's "did this
|
|
6
|
+
* behave like last run?" question answerable without re-deriving it from raw observations.
|
|
7
|
+
*/
|
|
8
|
+
export declare const PROJECT_TOOLS: ToolDef[];
|
|
9
|
+
//# sourceMappingURL=project-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-tools.d.ts","sourceRoot":"","sources":["../../src/project/project-tools.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAY,MAAM,mBAAmB,CAAC;AA4D3D;;;;;GAKG;AACH,eAAO,MAAM,aAAa,EAAE,OAAO,EAoElC,CAAC"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { ProjectReadError, RunKind, RunStatus } from '@reticlehq/core';
|
|
3
|
+
import { ReticleTool } from '../tools/tool-names.js';
|
|
4
|
+
import { asString } from '../tools/tools-helpers.js';
|
|
5
|
+
const sessionIdShape = {
|
|
6
|
+
sessionId: z
|
|
7
|
+
.string()
|
|
8
|
+
.optional()
|
|
9
|
+
.describe('Active session ID from reticle_sessions. Omit when only one browser session is open.'),
|
|
10
|
+
};
|
|
11
|
+
const REGRESSION_STATUSES = new Set([
|
|
12
|
+
RunStatus.FAIL,
|
|
13
|
+
RunStatus.DRIFT,
|
|
14
|
+
RunStatus.ERROR,
|
|
15
|
+
]);
|
|
16
|
+
function diffRuns(previous, current) {
|
|
17
|
+
const consoleErrorsDelta = numericDelta(previous.evidence?.consoleErrors, current.evidence?.consoleErrors);
|
|
18
|
+
const driftStepsDelta = numericDelta(previous.evidence?.driftSteps, current.evidence?.driftSteps);
|
|
19
|
+
return {
|
|
20
|
+
statusChanged: previous.status !== current.status,
|
|
21
|
+
previousStatus: previous.status,
|
|
22
|
+
currentStatus: current.status,
|
|
23
|
+
// Regressed = current is a non-pass outcome that the previous run was not.
|
|
24
|
+
regressed: REGRESSION_STATUSES.has(current.status) && !REGRESSION_STATUSES.has(previous.status),
|
|
25
|
+
...(consoleErrorsDelta !== undefined ? { consoleErrorsDelta } : {}),
|
|
26
|
+
...(driftStepsDelta !== undefined ? { driftStepsDelta } : {}),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function numericDelta(before, after) {
|
|
30
|
+
if (before === undefined && after === undefined)
|
|
31
|
+
return undefined;
|
|
32
|
+
return (after ?? 0) - (before ?? 0);
|
|
33
|
+
}
|
|
34
|
+
/** The two most-recent runs for `name`, oldest-first, or undefined if there are fewer than two. */
|
|
35
|
+
function lastTwoFor(runs, name) {
|
|
36
|
+
const matching = runs.filter((r) => r.name === name);
|
|
37
|
+
const n = matching.length;
|
|
38
|
+
if (n < 2)
|
|
39
|
+
return undefined;
|
|
40
|
+
const previous = matching[n - 2];
|
|
41
|
+
const current = matching[n - 1];
|
|
42
|
+
if (previous === undefined || current === undefined)
|
|
43
|
+
return undefined;
|
|
44
|
+
return [previous, current];
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* The cross-run memory tools. `reticle_project` reads .reticle/project.json (optionally
|
|
48
|
+
* scoped to a name, with a diff-vs-last summary); `reticle_run_record` explicitly records an outcome
|
|
49
|
+
* (the manual companion to the auto-record on reticle_flow_replay). Both keep the agent's "did this
|
|
50
|
+
* behave like last run?" question answerable without re-deriving it from raw observations.
|
|
51
|
+
*/
|
|
52
|
+
export const PROJECT_TOOLS = [
|
|
53
|
+
{
|
|
54
|
+
name: ReticleTool.PROJECT,
|
|
55
|
+
description: 'Read cross-run history from .reticle/project.json — the memory of how past runs behaved. With { name } it also returns the last run for that flow plus a diff-vs-last summary (status change, regressed flag, consoleErrors/driftSteps deltas) so you can answer "did it behave like last time?". Returns { runs, learned?, lastRun?, diff? } or { error, reason } when no/invalid history exists.',
|
|
56
|
+
inputSchema: {
|
|
57
|
+
name: z.string().optional().describe('Filter runs by this name. Omit to return all runs.'),
|
|
58
|
+
...sessionIdShape,
|
|
59
|
+
},
|
|
60
|
+
outputSchema: {
|
|
61
|
+
runs: z.array(z.unknown()),
|
|
62
|
+
diff: z.unknown().optional(),
|
|
63
|
+
},
|
|
64
|
+
handler: async (deps, args) => {
|
|
65
|
+
const read = await deps.project.read();
|
|
66
|
+
if (!read.ok) {
|
|
67
|
+
return {
|
|
68
|
+
error: read.reason === ProjectReadError.MISSING
|
|
69
|
+
? 'no .reticle/project.json yet — run a flow (reticle_flow_replay) or reticle_run_record first'
|
|
70
|
+
: '.reticle/project.json is malformed — it will self-heal on the next recorded run',
|
|
71
|
+
reason: read.reason,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
const name = asString(args['name']);
|
|
75
|
+
if (name === undefined) {
|
|
76
|
+
return { runs: read.file.runs, learned: read.file.learned };
|
|
77
|
+
}
|
|
78
|
+
const lastRun = await deps.project.lastRun(name);
|
|
79
|
+
const pair = lastTwoFor(read.file.runs, name);
|
|
80
|
+
return {
|
|
81
|
+
runs: read.file.runs.filter((r) => r.name === name),
|
|
82
|
+
learned: read.file.learned,
|
|
83
|
+
lastRun,
|
|
84
|
+
...(pair !== undefined ? { diff: diffRuns(pair[0], pair[1]) } : {}),
|
|
85
|
+
};
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
name: ReticleTool.RUN_RECORD,
|
|
90
|
+
description: 'Explicitly record a run outcome into .reticle/project.json (the manual companion to the auto-record on reticle_flow_replay). Use it to log the result of an assertion sequence or a manual journey so future runs can diff against it. Returns { recorded:true, name, status }.',
|
|
91
|
+
inputSchema: {
|
|
92
|
+
name: z.string().describe('Run name for grouping in reticle_project history.'),
|
|
93
|
+
status: z.nativeEnum(RunStatus).describe('Outcome: pass | fail | drift | error'),
|
|
94
|
+
kind: z.nativeEnum(RunKind).optional(),
|
|
95
|
+
summary: z.string().optional().describe('One-line human summary of what this run covered.'),
|
|
96
|
+
...sessionIdShape,
|
|
97
|
+
},
|
|
98
|
+
outputSchema: {
|
|
99
|
+
recorded: z.boolean(),
|
|
100
|
+
runName: z.string(),
|
|
101
|
+
status: z.string(),
|
|
102
|
+
},
|
|
103
|
+
handler: async (deps, args) => {
|
|
104
|
+
const name = asString(args['name']) ?? '';
|
|
105
|
+
const status = args['status'];
|
|
106
|
+
const kindArg = args['kind'];
|
|
107
|
+
const summary = asString(args['summary']);
|
|
108
|
+
await deps.project.recordRun({
|
|
109
|
+
kind: typeof kindArg === 'string' ? kindArg : RunKind.MANUAL,
|
|
110
|
+
name,
|
|
111
|
+
status,
|
|
112
|
+
...(summary !== undefined ? { summary } : {}),
|
|
113
|
+
});
|
|
114
|
+
return { recorded: true, runName: name, status };
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
];
|
|
118
|
+
//# sourceMappingURL=project-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-tools.js","sourceRoot":"","sources":["../../src/project/project-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { ContractReadError, type CapabilitiesContract, type RunId } from '@reticlehq/core';
|
|
2
|
+
import type { FileSystemPort } from './fs-port.js';
|
|
3
|
+
/** Resolved absolute paths inside a `.reticle/` root. Pure: join() only, no IO, no cwd. */
|
|
4
|
+
export interface ReticleDirPaths {
|
|
5
|
+
/** .../.reticle */
|
|
6
|
+
root: string;
|
|
7
|
+
/** .../.reticle/contract.json */
|
|
8
|
+
contract: string;
|
|
9
|
+
/** .../.reticle/flows */
|
|
10
|
+
flows: string;
|
|
11
|
+
/** .../.reticle/baselines */
|
|
12
|
+
baselines: string;
|
|
13
|
+
/** .../.reticle/project.json (cross-run outcome memory) */
|
|
14
|
+
project: string;
|
|
15
|
+
/** .../.reticle/visual (PNG baselines + diffs) */
|
|
16
|
+
visual: string;
|
|
17
|
+
/** .../.reticle/runs (verification-run artifacts) */
|
|
18
|
+
runs: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function reticleDirPaths(root: string): ReticleDirPaths;
|
|
21
|
+
/** The verification-run artifact path for `runId` (.reticle/runs/<runId>.json). */
|
|
22
|
+
export declare function runPath(root: string, runId: string): string;
|
|
23
|
+
/**
|
|
24
|
+
* A runId must be a single safe path segment — same guard as flow names (rejects '../', '/', '\\',
|
|
25
|
+
* absolute, dotfiles). uuid-style ids (hyphens/underscores) pass. Guards every disk op before join.
|
|
26
|
+
*/
|
|
27
|
+
export declare function isValidRunId(runId: string): runId is RunId;
|
|
28
|
+
/** The PNG baseline path for `name` (.reticle/visual/<name>.png). */
|
|
29
|
+
export declare function visualPath(root: string, name: string): string;
|
|
30
|
+
/** The overlay-diff PNG path for `name` (.reticle/visual/<name>.diff.png). */
|
|
31
|
+
export declare function visualDiffPath(root: string, name: string): string;
|
|
32
|
+
/**
|
|
33
|
+
* Path to a flow file. With a `projectId`, the flow lives in a per-project subdir
|
|
34
|
+
* (`.reticle/flows/<projectId>/<name>.json`) so a shared daemon serving many apps can't collide two
|
|
35
|
+
* apps' flows of the same name; without one it's the flat legacy path (`.reticle/flows/<name>.json`),
|
|
36
|
+
* which is also where pre-existing (untagged) flows stay. Callers pass ONLY a validated projectId.
|
|
37
|
+
*/
|
|
38
|
+
export declare function flowPath(root: string, name: string, projectId?: string): string;
|
|
39
|
+
/** The directory a flow write targets: the per-project subdir, or the flat flows root for global. */
|
|
40
|
+
export declare function flowDir(root: string, projectId?: string): string;
|
|
41
|
+
/**
|
|
42
|
+
* A flow name must be a single safe path segment — rejects '../', '/', '\\', absolute, dotfiles.
|
|
43
|
+
* Guards every disk op before a path is ever joined, so a traversal name never escapes .reticle/.
|
|
44
|
+
*/
|
|
45
|
+
export declare function isValidFlowName(name: string): boolean;
|
|
46
|
+
export declare function baselinePath(root: string, name: string): string;
|
|
47
|
+
/** Idempotent: creates .reticle/, .reticle/flows/, .reticle/baselines/ (recursive mkdir → safe to re-run). */
|
|
48
|
+
export declare function ensureReticleDir(fs: FileSystemPort, root: string): Promise<void>;
|
|
49
|
+
/** Write the contract to .reticle/contract.json (auto-creating .reticle/ first). */
|
|
50
|
+
export declare function writeContract(fs: FileSystemPort, root: string, capabilities: CapabilitiesContract, now: () => number): Promise<void>;
|
|
51
|
+
export type ReadContractResult = {
|
|
52
|
+
ok: true;
|
|
53
|
+
capabilities: CapabilitiesContract;
|
|
54
|
+
generatedAt: number;
|
|
55
|
+
} | {
|
|
56
|
+
ok: false;
|
|
57
|
+
reason: ContractReadError;
|
|
58
|
+
};
|
|
59
|
+
/** Never throws. Missing → MISSING. Bad JSON / failed schema → MALFORMED. */
|
|
60
|
+
export declare function readContract(fs: FileSystemPort, root: string): Promise<ReadContractResult>;
|
|
61
|
+
//# sourceMappingURL=reticle-dir.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reticle-dir.d.ts","sourceRoot":"","sources":["../../src/project/reticle-dir.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,iBAAiB,EAGjB,KAAK,oBAAoB,EAEzB,KAAK,KAAK,EACX,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,2FAA2F;AAC3F,MAAM,WAAW,eAAe;IAC9B,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,iCAAiC;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,yBAAyB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,6BAA6B;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,2DAA2D;IAC3D,OAAO,EAAE,MAAM,CAAC;IAChB,kDAAkD;IAClD,MAAM,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAU7D;AAED,mFAAmF;AACnF,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,KAAK,CAE1D;AAED,qEAAqE;AACrE,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAK/E;AAED,qGAAqG;AACrG,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAGhE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAErD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED,8GAA8G;AAC9G,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKtF;AAiDD,oFAAoF;AACpF,wBAAsB,aAAa,CACjC,EAAE,EAAE,cAAc,EAClB,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,oBAAoB,EAClC,GAAG,EAAE,MAAM,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAGf;AAED,MAAM,MAAM,kBAAkB,GAC1B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,YAAY,EAAE,oBAAoB,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GACrE;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAA;CAAE,CAAC;AAE7C,6EAA6E;AAC7E,wBAAsB,YAAY,CAAC,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAyBhG"}
|