@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
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { Bridge } from './bridge.js';
|
|
2
|
+
import type { OwnedRealInputProvider, RealInputProvider, InjectConnectOptions } from './input/real-input.js';
|
|
3
|
+
export { ReticleTool } from './tools/tool-names.js';
|
|
4
|
+
export { RingBuffer } from './events/ring-buffer.js';
|
|
5
|
+
export { Bridge } from './bridge.js';
|
|
6
|
+
export { Session, SessionManager } from './session/session.js';
|
|
7
|
+
export type { SessionInfo, SessionHealth } from './session/session.js';
|
|
8
|
+
export { buildSessionRecommendation } from './session/session-recommendation.js';
|
|
9
|
+
export type { RecommendationInputs } from './session/session-recommendation.js';
|
|
10
|
+
export { TOOLS } from './tools/tools.js';
|
|
11
|
+
export type { ToolDeps, ToolDef } from './tools/tools.js';
|
|
12
|
+
export { createToolInvoker, UNKNOWN_TOOL_ERROR } from './tools/tool-invoker.js';
|
|
13
|
+
export { runTool, SESSION_BOUND_TOOLS, SESSION_EXEMPT_TOOLS } from './tools/invoke-tool.js';
|
|
14
|
+
export type { ToolInvoker } from './tools/tool-invoker.js';
|
|
15
|
+
export { BaselineStore, normalizeLines, diffLines } from './project/baselines.js';
|
|
16
|
+
export { RecordingStore } from './flows/recordings.js';
|
|
17
|
+
export type { RecordedStep, CompiledProgram } from './flows/recordings.js';
|
|
18
|
+
export { FlowStore, recordedStepToFlowStep } from './flows/flows.js';
|
|
19
|
+
export type { FlowResult, Clock } from './flows/flows.js';
|
|
20
|
+
export { assertSuccess, successToPredicate, dynamicTestids, successLabel, } from './flows/flow-success.js';
|
|
21
|
+
export { classifyFlowAssertions, FlowAssertionGrade } from './flows/flow-classify.js';
|
|
22
|
+
export type { FlowAssertionClassification } from './flows/flow-classify.js';
|
|
23
|
+
export { buildDomainModel } from './domain/domain-model.js';
|
|
24
|
+
export type { DomainModel, DomainFlowSummary, DomainGaps } from './domain/domain-model.js';
|
|
25
|
+
export { ProjectStore } from './project/project-store.js';
|
|
26
|
+
export type { ReadProjectResult } from './project/project-store.js';
|
|
27
|
+
export { VisualStore } from './visual/visual-store.js';
|
|
28
|
+
export { diffPng } from './visual/visual-diff.js';
|
|
29
|
+
export type { VisualDiffResult, VisualRect, DiffOptions } from './visual/visual-diff.js';
|
|
30
|
+
export { crawl } from './crawl/crawl.js';
|
|
31
|
+
export { MCP_SSE_PATH, MCP_MESSAGE_PATH } from './http-server.js';
|
|
32
|
+
export { BrowserPool, DEFAULT_LEASE_TTL_MS } from './pool/browser-pool.js';
|
|
33
|
+
export type { Lease, Launcher, PooledBrowser } from './pool/browser-pool.js';
|
|
34
|
+
export { playwrightLauncher, resolveMaxContexts } from './pool/playwright-launcher.js';
|
|
35
|
+
export { appendReticleParams } from './tools/lease-tools.js';
|
|
36
|
+
export { writePid, removePid, isRunning, logPath, readPid, isAlive } from './daemon.js';
|
|
37
|
+
export type { CrawlReport, CrawlAnomaly, CrawlOptions, CrawlSession } from './crawl/crawl.js';
|
|
38
|
+
export { scrollToFind } from './input/scroll-find.js';
|
|
39
|
+
export type { ScrollFindResult, ScrollFindQuery, ScrollFindSession } from './input/scroll-find.js';
|
|
40
|
+
export { CORE_TOOL_NAMES, TOOL_PROFILE, TOOL_PROFILE_ENV, filterTools, resolveToolProfile, } from './tools/profiles.js';
|
|
41
|
+
export type { ToolProfile } from './tools/profiles.js';
|
|
42
|
+
export { AnnotationStore } from './flows/annotation-store.js';
|
|
43
|
+
export { replayFlow, nearestTestid } from './flows/flow-replay.js';
|
|
44
|
+
export type { FlowReplaySession, WaitForSignal } from './flows/flow-replay.js';
|
|
45
|
+
export { ensureReticleDir, writeContract, readContract, reticleDirPaths, flowPath, baselinePath, } from './project/reticle-dir.js';
|
|
46
|
+
export type { ReticleDirPaths, ReadContractResult } from './project/reticle-dir.js';
|
|
47
|
+
export { createNodeFileSystem } from './project/fs-port.js';
|
|
48
|
+
export type { FileSystemPort } from './project/fs-port.js';
|
|
49
|
+
export { ReticleRunner } from './runs/reticle-runner.js';
|
|
50
|
+
export type { RunnerPort, VerifyOptions } from './runs/reticle-runner.js';
|
|
51
|
+
export { createRunnerPort, defaultRunId } from './runs/runner-port.js';
|
|
52
|
+
export { buildVerificationRun, computeVerdict } from './runs/build-verification-run.js';
|
|
53
|
+
export type { VerificationRunInput } from './runs/build-verification-run.js';
|
|
54
|
+
export { RunStore } from './runs/run-store.js';
|
|
55
|
+
export type { ReadRunResult } from './runs/run-store.js';
|
|
56
|
+
export { classifyChangedFiles, buildRisks, risksForPath } from './runs/risk-classify.js';
|
|
57
|
+
export type { ChangedFileInput, RiskPolicy } from './runs/risk-classify.js';
|
|
58
|
+
export { buildRepairPacket, buildRepairPackets } from './runs/repair-prompt.js';
|
|
59
|
+
export { redactForProfile, REDACTED } from './runs/profile-redact.js';
|
|
60
|
+
export { renderRunReport } from './runs/render-report.js';
|
|
61
|
+
export { handleVerifyRequest, tokenOk, VERIFY_PATH } from './runs/verify-http.js';
|
|
62
|
+
export type { VerifyHttpRequest, VerifyHttpResponse } from './runs/verify-http.js';
|
|
63
|
+
export { createVerifyRequestListener, startVerifyServer, TOKEN_HEADER, } from './runs/verify-server.js';
|
|
64
|
+
export type { VerifyServerOptions } from './runs/verify-server.js';
|
|
65
|
+
export { evaluatePredicate, waitForPredicate, PredicateSchema } from './events/predicate.js';
|
|
66
|
+
export type { Predicate, EvalResult } from './events/predicate.js';
|
|
67
|
+
export { buildReactionReport } from './events/reaction.js';
|
|
68
|
+
export { CdpRealInputProvider, LaunchedRealInputProvider, DriveError, performGesture, boxCenter, isPointerAction, } from './input/real-input.js';
|
|
69
|
+
export type { RealInputProvider, OwnedRealInputProvider, LaunchFn, LaunchedProviderOptions, ElementBox, RealInputArgs, } from './input/real-input.js';
|
|
70
|
+
export interface StartOptions {
|
|
71
|
+
port?: number;
|
|
72
|
+
/** Bind address. Non-loopback hosts require a token. Defaults to RETICLE_HOST or localhost. */
|
|
73
|
+
host?: string;
|
|
74
|
+
/** Browser/bridge pairing token. Defaults to RETICLE_TOKEN. */
|
|
75
|
+
token?: string;
|
|
76
|
+
/** Browser origins allowed in addition to localhost. Defaults to RETICLE_ALLOWED_ORIGINS. */
|
|
77
|
+
allowedOrigins?: string[];
|
|
78
|
+
/** When false, skip the MCP stdio transport (used in tests). */
|
|
79
|
+
mcp?: boolean;
|
|
80
|
+
/** CDP endpoint for native real-input mode. Defaults to env RETICLE_CDP_URL. No-op if unset. */
|
|
81
|
+
cdpUrl?: string;
|
|
82
|
+
/** launch+own a Playwright Chromium at this url and route pointer actions through it. */
|
|
83
|
+
driveUrl?: string;
|
|
84
|
+
/** launch headless (default true; CLI `--headed` sets false). */
|
|
85
|
+
headless?: boolean;
|
|
86
|
+
/** injected so tests swap in a fake launched provider instead of real Playwright. */
|
|
87
|
+
realInputFactory?: (opts: {
|
|
88
|
+
driveUrl: string;
|
|
89
|
+
headless: boolean;
|
|
90
|
+
}) => OwnedRealInputProvider;
|
|
91
|
+
/** When driving, force the page's SDK to (re)connect to our bridge with this token — verify a hosted preview. */
|
|
92
|
+
injectConnect?: InjectConnectOptions;
|
|
93
|
+
/** Path to a Playwright storageState JSON so the driven browser starts authenticated (past a login wall). */
|
|
94
|
+
storageState?: string;
|
|
95
|
+
/** absolute .reticle root. Defaults to process.cwd()/.reticle. Injectable for tests. */
|
|
96
|
+
reticleRoot?: string;
|
|
97
|
+
/** Directory holding the auto-provisioned pairing token. Defaults to ~/.reticle. Injectable for tests. */
|
|
98
|
+
pairingTokenDir?: string;
|
|
99
|
+
/** injectable clock for contract.json's generatedAt stamp. Defaults to Date.now. */
|
|
100
|
+
now?: () => number;
|
|
101
|
+
/** 'core' exposes the lean tool surface. Defaults to env RETICLE_TOOL_PROFILE, else 'full'. */
|
|
102
|
+
toolProfile?: string;
|
|
103
|
+
/** Start the OEM/CI verify HTTP endpoint alongside the daemon (`reticle serve --http`). */
|
|
104
|
+
httpVerify?: boolean;
|
|
105
|
+
/** Port for the verify endpoint. Defaults to RETICLE_VERIFY_DEFAULT_PORT. */
|
|
106
|
+
httpVerifyPort?: number;
|
|
107
|
+
/** Shared token for the verify endpoint. Defaults to env RETICLE_VERIFY_TOKEN, else open (localhost). */
|
|
108
|
+
httpVerifyToken?: string;
|
|
109
|
+
}
|
|
110
|
+
/** Default localhost port for the verify HTTP endpoint (see docs/integration.md). */
|
|
111
|
+
export declare const RETICLE_VERIFY_DEFAULT_PORT = 7331;
|
|
112
|
+
export interface RunningServer {
|
|
113
|
+
bridge: Bridge;
|
|
114
|
+
/** the active real-input provider (launched/CDP), if any. */
|
|
115
|
+
realInput?: RealInputProvider;
|
|
116
|
+
/** the bound port of the verify HTTP endpoint, when `httpVerify` is enabled. */
|
|
117
|
+
verifyPort?: number;
|
|
118
|
+
/** True when nothing is using the daemon: no agent connected, no browser session, no pool lease.
|
|
119
|
+
* The daemon entry (cli.ts) polls this to self-shut-down when idle so Reticle never lingers. */
|
|
120
|
+
isIdle?: () => boolean;
|
|
121
|
+
/** The pairing token the bridge is enforcing (explicit, env, or auto-provisioned); undefined if none. */
|
|
122
|
+
token?: string;
|
|
123
|
+
close: () => Promise<void>;
|
|
124
|
+
}
|
|
125
|
+
export { resolveBridgeSecurity } from './bridge-security.js';
|
|
126
|
+
/** Start the Reticle bridge (browser WS endpoint) and, by default, the MCP stdio server. */
|
|
127
|
+
export declare function start(options?: StartOptions): Promise<RunningServer>;
|
|
128
|
+
/**
|
|
129
|
+
* Start the Reticle bridge in daemon mode: a single HTTP server handles both the WebSocket
|
|
130
|
+
* bridge (browser SDK) and the SSE MCP transport (Claude/agent). Unlike start(), the MCP
|
|
131
|
+
* connection is not tied to the process lifetime — Claude reconnects across sessions while
|
|
132
|
+
* browser sessions persist in the daemon.
|
|
133
|
+
*/
|
|
134
|
+
export declare function startDaemon(options?: StartOptions): Promise<RunningServer>;
|
|
135
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
3
|
+
import { AGENT_STOPPED_NOTICE, RETICLE_DEFAULT_PORT, ReticleCommand, ReticleDir, ReticleEnv, LOOPBACK_HOST, ReplayStatus, } from '@reticlehq/core';
|
|
4
|
+
import { replayNamedFlow } from './flows/flow-tools.js';
|
|
5
|
+
import { createSharedServer } from './http-server.js';
|
|
6
|
+
import { resolveBridgeSecurityWithAutoToken } from './bridge-security.js';
|
|
7
|
+
import { Bridge } from './bridge.js';
|
|
8
|
+
import { BaselineStore } from './project/baselines.js';
|
|
9
|
+
import { RecordingStore } from './flows/recordings.js';
|
|
10
|
+
import { FlowStore } from './flows/flows.js';
|
|
11
|
+
import { buildFlowChips } from './flows/flow-scope.js';
|
|
12
|
+
import { ProjectStore } from './project/project-store.js';
|
|
13
|
+
import { AnnotationStore } from './flows/annotation-store.js';
|
|
14
|
+
import { createNodeFileSystem } from './project/fs-port.js';
|
|
15
|
+
import { ReticleRunner } from './runs/reticle-runner.js';
|
|
16
|
+
import { createRunnerPort } from './runs/runner-port.js';
|
|
17
|
+
import { RunStore } from './runs/run-store.js';
|
|
18
|
+
import { startVerifyServer } from './runs/verify-server.js';
|
|
19
|
+
import { createMcpServer } from './mcp.js';
|
|
20
|
+
import { SessionReaper, endAllSessions, MCP_DISCONNECT_SUMMARY } from './session/session-reaper.js';
|
|
21
|
+
import { resolveToolProfile } from './tools/profiles.js';
|
|
22
|
+
import { CdpRealInputProvider, LaunchedRealInputProvider } from './input/real-input.js';
|
|
23
|
+
import { cpus } from 'node:os';
|
|
24
|
+
import { BrowserPool } from './pool/browser-pool.js';
|
|
25
|
+
import { playwrightLauncher, resolveMaxContexts } from './pool/playwright-launcher.js';
|
|
26
|
+
import { LeaseReaper } from './pool/lease-reaper.js';
|
|
27
|
+
import { readProjectId } from './cli-port.js';
|
|
28
|
+
import { log } from './log.js';
|
|
29
|
+
/** A human-facing one-liner for a panel replay verdict — ✓ passed / ⚠ drifted / ✗ errored. */
|
|
30
|
+
function replayVerdictLine(result) {
|
|
31
|
+
if (result.status === ReplayStatus.OK)
|
|
32
|
+
return `✓ "${result.name}" passed`;
|
|
33
|
+
if (result.status === ReplayStatus.DRIFT)
|
|
34
|
+
return `⚠ "${result.name}" drifted — a step no longer matches`;
|
|
35
|
+
return `✗ "${result.name}" failed — ${result.error?.message ?? 'could not replay'}`;
|
|
36
|
+
}
|
|
37
|
+
export { ReticleTool } from './tools/tool-names.js';
|
|
38
|
+
export { RingBuffer } from './events/ring-buffer.js';
|
|
39
|
+
export { Bridge } from './bridge.js';
|
|
40
|
+
export { Session, SessionManager } from './session/session.js';
|
|
41
|
+
export { buildSessionRecommendation } from './session/session-recommendation.js';
|
|
42
|
+
export { TOOLS } from './tools/tools.js';
|
|
43
|
+
export { createToolInvoker, UNKNOWN_TOOL_ERROR } from './tools/tool-invoker.js';
|
|
44
|
+
export { runTool, SESSION_BOUND_TOOLS, SESSION_EXEMPT_TOOLS } from './tools/invoke-tool.js';
|
|
45
|
+
export { BaselineStore, normalizeLines, diffLines } from './project/baselines.js';
|
|
46
|
+
export { RecordingStore } from './flows/recordings.js';
|
|
47
|
+
export { FlowStore, recordedStepToFlowStep } from './flows/flows.js';
|
|
48
|
+
export { assertSuccess, successToPredicate, dynamicTestids, successLabel, } from './flows/flow-success.js';
|
|
49
|
+
export { classifyFlowAssertions, FlowAssertionGrade } from './flows/flow-classify.js';
|
|
50
|
+
export { buildDomainModel } from './domain/domain-model.js';
|
|
51
|
+
export { ProjectStore } from './project/project-store.js';
|
|
52
|
+
export { VisualStore } from './visual/visual-store.js';
|
|
53
|
+
export { diffPng } from './visual/visual-diff.js';
|
|
54
|
+
export { crawl } from './crawl/crawl.js';
|
|
55
|
+
export { MCP_SSE_PATH, MCP_MESSAGE_PATH } from './http-server.js';
|
|
56
|
+
export { BrowserPool, DEFAULT_LEASE_TTL_MS } from './pool/browser-pool.js';
|
|
57
|
+
export { playwrightLauncher, resolveMaxContexts } from './pool/playwright-launcher.js';
|
|
58
|
+
export { appendReticleParams } from './tools/lease-tools.js';
|
|
59
|
+
export { writePid, removePid, isRunning, logPath, readPid, isAlive } from './daemon.js';
|
|
60
|
+
export { scrollToFind } from './input/scroll-find.js';
|
|
61
|
+
export { CORE_TOOL_NAMES, TOOL_PROFILE, TOOL_PROFILE_ENV, filterTools, resolveToolProfile, } from './tools/profiles.js';
|
|
62
|
+
export { AnnotationStore } from './flows/annotation-store.js';
|
|
63
|
+
export { replayFlow, nearestTestid } from './flows/flow-replay.js';
|
|
64
|
+
export { ensureReticleDir, writeContract, readContract, reticleDirPaths, flowPath, baselinePath, } from './project/reticle-dir.js';
|
|
65
|
+
export { createNodeFileSystem } from './project/fs-port.js';
|
|
66
|
+
// Replay/Verify API — the programmatic surface an OEM/CI pipeline drives (see docs/integration.md).
|
|
67
|
+
export { ReticleRunner } from './runs/reticle-runner.js';
|
|
68
|
+
export { createRunnerPort, defaultRunId } from './runs/runner-port.js';
|
|
69
|
+
export { buildVerificationRun, computeVerdict } from './runs/build-verification-run.js';
|
|
70
|
+
export { RunStore } from './runs/run-store.js';
|
|
71
|
+
export { classifyChangedFiles, buildRisks, risksForPath } from './runs/risk-classify.js';
|
|
72
|
+
export { buildRepairPacket, buildRepairPackets } from './runs/repair-prompt.js';
|
|
73
|
+
export { redactForProfile, REDACTED } from './runs/profile-redact.js';
|
|
74
|
+
export { renderRunReport } from './runs/render-report.js';
|
|
75
|
+
export { handleVerifyRequest, tokenOk, VERIFY_PATH } from './runs/verify-http.js';
|
|
76
|
+
export { createVerifyRequestListener, startVerifyServer, TOKEN_HEADER, } from './runs/verify-server.js';
|
|
77
|
+
export { evaluatePredicate, waitForPredicate, PredicateSchema } from './events/predicate.js';
|
|
78
|
+
export { buildReactionReport } from './events/reaction.js';
|
|
79
|
+
export { CdpRealInputProvider, LaunchedRealInputProvider, DriveError, performGesture, boxCenter, isPointerAction, } from './input/real-input.js';
|
|
80
|
+
/** Default localhost port for the verify HTTP endpoint (see docs/integration.md). */
|
|
81
|
+
export const RETICLE_VERIFY_DEFAULT_PORT = 7331;
|
|
82
|
+
export { resolveBridgeSecurity } from './bridge-security.js';
|
|
83
|
+
/**
|
|
84
|
+
* Build the shared browser pool (one headless Chromium, N capped isolated leased contexts). Lazy —
|
|
85
|
+
* no Chromium launches until the first lease — so creating it is free even when never used.
|
|
86
|
+
*/
|
|
87
|
+
function createBrowserPool(headless) {
|
|
88
|
+
const maxContexts = resolveMaxContexts(process.env[ReticleEnv.MAX_CONTEXTS], cpus().length);
|
|
89
|
+
const genSessionId = () => `lease-${typeof globalThis.crypto?.randomUUID === 'function'
|
|
90
|
+
? globalThis.crypto.randomUUID()
|
|
91
|
+
: String(Date.now())}`;
|
|
92
|
+
return new BrowserPool(playwrightLauncher({ headless }), { maxContexts, genSessionId });
|
|
93
|
+
}
|
|
94
|
+
/** Start the Reticle bridge (browser WS endpoint) and, by default, the MCP stdio server. */
|
|
95
|
+
export async function start(options = {}) {
|
|
96
|
+
const port = options.port ?? RETICLE_DEFAULT_PORT;
|
|
97
|
+
const security = await resolveBridgeSecurityWithAutoToken(options);
|
|
98
|
+
const bridge = new Bridge({ port, ...security });
|
|
99
|
+
// Server-authoritative liveness: a Node-side reaper (immune to browser throttling) ends sessions
|
|
100
|
+
// whose agent has gone idle, so a forgotten/crashed agent never leaves the HUD "running" forever.
|
|
101
|
+
const reaper = new SessionReaper(bridge.sessions);
|
|
102
|
+
reaper.start();
|
|
103
|
+
// Scope auto-selection to the active project (from .reticle.json) so a stray tab from another app is
|
|
104
|
+
// never picked when the agent omits a sessionId. Explicit per-call scope/sessionId still overrides.
|
|
105
|
+
const activeProjectId = readProjectId(process.cwd());
|
|
106
|
+
if (activeProjectId !== undefined) {
|
|
107
|
+
bridge.sessions.setDefaultScope({ projectId: activeProjectId });
|
|
108
|
+
}
|
|
109
|
+
const baselines = new BaselineStore();
|
|
110
|
+
const recordings = new RecordingStore();
|
|
111
|
+
// drive precedence: driveUrl (launch+own a browser) → CDP (attach) → none.
|
|
112
|
+
let owned;
|
|
113
|
+
let realInput;
|
|
114
|
+
let pool;
|
|
115
|
+
let leaseReaper;
|
|
116
|
+
const driveUrl = options.driveUrl;
|
|
117
|
+
if (driveUrl !== undefined && driveUrl.length > 0) {
|
|
118
|
+
const headless = options.headless ?? true;
|
|
119
|
+
const injectConnect = options.injectConnect;
|
|
120
|
+
const storageState = options.storageState;
|
|
121
|
+
const factory = options.realInputFactory ??
|
|
122
|
+
((opts) => new LaunchedRealInputProvider({
|
|
123
|
+
driveUrl: opts.driveUrl,
|
|
124
|
+
headless: opts.headless,
|
|
125
|
+
...(injectConnect !== undefined ? { injectConnect } : {}),
|
|
126
|
+
...(storageState !== undefined ? { storageState } : {}),
|
|
127
|
+
}));
|
|
128
|
+
const launched = factory({ driveUrl, headless });
|
|
129
|
+
try {
|
|
130
|
+
await launched.navigate();
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
await bridge.close(); // no leaked WS port on a failed start
|
|
134
|
+
throw error;
|
|
135
|
+
}
|
|
136
|
+
owned = launched;
|
|
137
|
+
realInput = launched;
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
const cdpUrl = options.cdpUrl ?? process.env[ReticleEnv.CDP_URL];
|
|
141
|
+
if (cdpUrl !== undefined && cdpUrl.length > 0) {
|
|
142
|
+
const cdp = new CdpRealInputProvider({ cdpUrl });
|
|
143
|
+
owned = cdp;
|
|
144
|
+
realInput = cdp;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
if (options.mcp !== false) {
|
|
148
|
+
// cwd()/Date.now() are confined to start() — never inside reticle-dir.ts's pure logic (rule 7).
|
|
149
|
+
const fs = createNodeFileSystem();
|
|
150
|
+
const reticleRoot = options.reticleRoot ?? join(process.cwd(), ReticleDir.ROOT);
|
|
151
|
+
const now = options.now ?? (() => Date.now());
|
|
152
|
+
const flows = new FlowStore(fs, reticleRoot, { now });
|
|
153
|
+
const project = new ProjectStore(fs, reticleRoot, { now });
|
|
154
|
+
const annotations = new AnnotationStore();
|
|
155
|
+
pool = createBrowserPool(options.headless ?? true);
|
|
156
|
+
leaseReaper = new LeaseReaper(pool);
|
|
157
|
+
leaseReaper.start();
|
|
158
|
+
const deps = {
|
|
159
|
+
sessions: bridge.sessions,
|
|
160
|
+
pool,
|
|
161
|
+
baselines,
|
|
162
|
+
recordings,
|
|
163
|
+
annotations,
|
|
164
|
+
flows,
|
|
165
|
+
project,
|
|
166
|
+
fs,
|
|
167
|
+
reticleRoot,
|
|
168
|
+
now,
|
|
169
|
+
};
|
|
170
|
+
const profile = resolveToolProfile(options.toolProfile);
|
|
171
|
+
const server = createMcpServer(realInput !== undefined ? { ...deps, realInput } : deps, profile);
|
|
172
|
+
// When the agent (the MCP client) disconnects cleanly, end every active session at once so the
|
|
173
|
+
// HUD doesn't linger. (If the agent instead KILLS this process, the WS dies and the browser
|
|
174
|
+
// self-ends via SESSION_LIFECYCLE.BRIDGE_LOST_MS — see transport.ts.)
|
|
175
|
+
server.server.onclose = () => {
|
|
176
|
+
endAllSessions(bridge.sessions, MCP_DISCONNECT_SUMMARY);
|
|
177
|
+
};
|
|
178
|
+
await server.connect(new StdioServerTransport());
|
|
179
|
+
log('mcp_connected', { port });
|
|
180
|
+
}
|
|
181
|
+
return {
|
|
182
|
+
bridge,
|
|
183
|
+
...(realInput !== undefined ? { realInput } : {}),
|
|
184
|
+
...(security.token !== undefined ? { token: security.token } : {}),
|
|
185
|
+
close: async () => {
|
|
186
|
+
reaper.stop();
|
|
187
|
+
leaseReaper?.stop();
|
|
188
|
+
await pool?.shutdown();
|
|
189
|
+
await owned?.dispose();
|
|
190
|
+
await bridge.close();
|
|
191
|
+
},
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Start the Reticle bridge in daemon mode: a single HTTP server handles both the WebSocket
|
|
196
|
+
* bridge (browser SDK) and the SSE MCP transport (Claude/agent). Unlike start(), the MCP
|
|
197
|
+
* connection is not tied to the process lifetime — Claude reconnects across sessions while
|
|
198
|
+
* browser sessions persist in the daemon.
|
|
199
|
+
*/
|
|
200
|
+
export async function startDaemon(options = {}) {
|
|
201
|
+
const port = options.port ?? RETICLE_DEFAULT_PORT;
|
|
202
|
+
const security = await resolveBridgeSecurityWithAutoToken(options);
|
|
203
|
+
const shared = createSharedServer(security.token === undefined ? {} : { token: security.token });
|
|
204
|
+
const bridge = new Bridge({ port, server: shared.httpServer, ...security });
|
|
205
|
+
// The daemon owns listen() (below), so the real bind error is reported there; absorb bridge.ready's
|
|
206
|
+
// mirror rejection so a port collision can't surface as an unhandled promise rejection.
|
|
207
|
+
void bridge.ready.catch(() => undefined);
|
|
208
|
+
// `reticle status` GETs this for a live, at-a-glance view of connected tabs + their health.
|
|
209
|
+
shared.attachStatus(() => ({
|
|
210
|
+
running: true,
|
|
211
|
+
sessionCount: bridge.sessions.count(),
|
|
212
|
+
sessions: bridge.sessions.list(),
|
|
213
|
+
}));
|
|
214
|
+
// Agent-independent presence: the daemon outlives any single agent, so when the LAST agent's MCP
|
|
215
|
+
// connection drops (it stopped, or is waiting on the human), end every session and push a clear
|
|
216
|
+
// "go to your terminal" notice to the panel — the human is on the browser and must not lose a typed
|
|
217
|
+
// prompt into a dead session. A returning agent's next tool call revives the auto-ended session.
|
|
218
|
+
// Track agent presence for the idle-shutdown predicate (below): the daemon is "idle" only when no
|
|
219
|
+
// agent is attached AND no browser tab is connected AND no pool lease is active.
|
|
220
|
+
let agentConnected = false;
|
|
221
|
+
shared.attachAgentPresence((connected) => {
|
|
222
|
+
agentConnected = connected;
|
|
223
|
+
if (!connected)
|
|
224
|
+
endAllSessions(bridge.sessions, AGENT_STOPPED_NOTICE);
|
|
225
|
+
});
|
|
226
|
+
const reaper = new SessionReaper(bridge.sessions);
|
|
227
|
+
reaper.start();
|
|
228
|
+
// Scope auto-selection to the active project (from .reticle.json) so a stray tab from another app is
|
|
229
|
+
// never picked when the agent omits a sessionId. Explicit per-call scope/sessionId still overrides.
|
|
230
|
+
const activeProjectId = readProjectId(process.cwd());
|
|
231
|
+
if (activeProjectId !== undefined) {
|
|
232
|
+
bridge.sessions.setDefaultScope({ projectId: activeProjectId });
|
|
233
|
+
}
|
|
234
|
+
let owned;
|
|
235
|
+
let realInput;
|
|
236
|
+
const driveUrl = options.driveUrl;
|
|
237
|
+
if (driveUrl !== undefined && driveUrl.length > 0) {
|
|
238
|
+
const headless = options.headless ?? true;
|
|
239
|
+
const injectConnect = options.injectConnect;
|
|
240
|
+
const storageState = options.storageState;
|
|
241
|
+
const factory = options.realInputFactory ??
|
|
242
|
+
((opts) => new LaunchedRealInputProvider({
|
|
243
|
+
driveUrl: opts.driveUrl,
|
|
244
|
+
headless: opts.headless,
|
|
245
|
+
...(injectConnect !== undefined ? { injectConnect } : {}),
|
|
246
|
+
...(storageState !== undefined ? { storageState } : {}),
|
|
247
|
+
}));
|
|
248
|
+
const launched = factory({ driveUrl, headless });
|
|
249
|
+
try {
|
|
250
|
+
await launched.navigate();
|
|
251
|
+
}
|
|
252
|
+
catch (error) {
|
|
253
|
+
await shared.close();
|
|
254
|
+
throw error;
|
|
255
|
+
}
|
|
256
|
+
owned = launched;
|
|
257
|
+
realInput = launched;
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
const cdpUrl = options.cdpUrl ?? process.env[ReticleEnv.CDP_URL];
|
|
261
|
+
if (cdpUrl !== undefined && cdpUrl.length > 0) {
|
|
262
|
+
const cdp = new CdpRealInputProvider({ cdpUrl });
|
|
263
|
+
owned = cdp;
|
|
264
|
+
realInput = cdp;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
const fs = createNodeFileSystem();
|
|
268
|
+
const reticleRoot = options.reticleRoot ?? join(process.cwd(), ReticleDir.ROOT);
|
|
269
|
+
const now = options.now ?? (() => Date.now());
|
|
270
|
+
const flows = new FlowStore(fs, reticleRoot, { now });
|
|
271
|
+
const project = new ProjectStore(fs, reticleRoot, { now });
|
|
272
|
+
const annotations = new AnnotationStore();
|
|
273
|
+
const pool = createBrowserPool(options.headless ?? true);
|
|
274
|
+
const leaseReaper = new LeaseReaper(pool);
|
|
275
|
+
leaseReaper.start();
|
|
276
|
+
const deps = {
|
|
277
|
+
sessions: bridge.sessions,
|
|
278
|
+
pool,
|
|
279
|
+
baselines: new BaselineStore(),
|
|
280
|
+
recordings: new RecordingStore(),
|
|
281
|
+
annotations,
|
|
282
|
+
flows,
|
|
283
|
+
project,
|
|
284
|
+
fs,
|
|
285
|
+
reticleRoot,
|
|
286
|
+
now,
|
|
287
|
+
};
|
|
288
|
+
const profile = resolveToolProfile(options.toolProfile);
|
|
289
|
+
const effectiveDeps = realInput !== undefined ? { ...deps, realInput } : deps;
|
|
290
|
+
shared.attachMcp(() => createMcpServer(effectiveDeps, profile));
|
|
291
|
+
// Optional OEM/CI verify endpoint: a host platform POSTs to /verify and gets an ReticleVerificationRun,
|
|
292
|
+
// driving the same flow-replay machinery the agent uses — no MCP stdio, no human. Each verdict is
|
|
293
|
+
// persisted via RunStore. Localhost-bound + token-guarded. Off unless `reticle serve --http`.
|
|
294
|
+
let verifyHttp;
|
|
295
|
+
if (options.httpVerify === true) {
|
|
296
|
+
const runStore = new RunStore(fs, reticleRoot);
|
|
297
|
+
const runner = new ReticleRunner(createRunnerPort(effectiveDeps));
|
|
298
|
+
const token = options.httpVerifyToken ?? process.env[ReticleEnv.VERIFY_TOKEN] ?? '';
|
|
299
|
+
verifyHttp = await startVerifyServer({ runner, token, persist: (run) => runStore.write(run) }, options.httpVerifyPort ?? RETICLE_VERIFY_DEFAULT_PORT);
|
|
300
|
+
log('reticle_verify_http_started', { port: verifyHttp.port, tokenRequired: token.length > 0 });
|
|
301
|
+
}
|
|
302
|
+
// Replay-from-panel: the human clicks ▶ on a saved flow; run it with NO agent and narrate the
|
|
303
|
+
// verdict into the same activity log they watch the agent in. The page animates via the normal
|
|
304
|
+
// replay path, so they see it re-drive and the ✓/⚠/✗ land.
|
|
305
|
+
bridge.attachReplay((sessionId, flowName) => {
|
|
306
|
+
const session = bridge.sessions.get(sessionId);
|
|
307
|
+
if (session === undefined)
|
|
308
|
+
return;
|
|
309
|
+
session.pushNarration(`▶ Replaying "${flowName}"…`);
|
|
310
|
+
replayNamedFlow(effectiveDeps, { flowName, sessionId })
|
|
311
|
+
.then((result) => session.pushNarration(replayVerdictLine(result)))
|
|
312
|
+
.catch((error) => {
|
|
313
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
314
|
+
session.pushNarration(`✗ Replay "${flowName}" failed — ${message}`);
|
|
315
|
+
});
|
|
316
|
+
});
|
|
317
|
+
// On connect, hand the panel the replayable flows so it can render the ▶ list. Scoped to the
|
|
318
|
+
// connecting session's project (a shared daemon serves many apps; each panel shows only its own
|
|
319
|
+
// flows + legacy untagged ones). Each chip carries a `start` hint (the first step's testid anchor)
|
|
320
|
+
// so the HUD shows a flow only on the page it can begin from — the panel re-scopes per route.
|
|
321
|
+
bridge.attachSessionReady((session) => {
|
|
322
|
+
flows
|
|
323
|
+
.list(session.projectId)
|
|
324
|
+
.then(async (names) => {
|
|
325
|
+
const loaded = await Promise.all(names.map((name) => flows.load(name, session.projectId)));
|
|
326
|
+
const files = loaded.flatMap((r) => (r.ok ? [r.value] : []));
|
|
327
|
+
await session.command(ReticleCommand.FLOWS, {
|
|
328
|
+
flows: buildFlowChips(files, session.projectId),
|
|
329
|
+
});
|
|
330
|
+
})
|
|
331
|
+
.catch(() => undefined);
|
|
332
|
+
});
|
|
333
|
+
// Bind with BOTH a 'listening' and an 'error' handler. Without the error path, a port collision
|
|
334
|
+
// (EADDRINUSE — another daemon already owns this port) emits 'error' with no listener, so the
|
|
335
|
+
// promise never settles and the daemon hangs forever, orphaning the process and its PID file.
|
|
336
|
+
await new Promise((resolve, reject) => {
|
|
337
|
+
const onError = (err) => {
|
|
338
|
+
shared.httpServer.removeListener('listening', onListening);
|
|
339
|
+
reject(err);
|
|
340
|
+
};
|
|
341
|
+
const onListening = () => {
|
|
342
|
+
shared.httpServer.removeListener('error', onError);
|
|
343
|
+
resolve();
|
|
344
|
+
};
|
|
345
|
+
shared.httpServer.once('error', onError);
|
|
346
|
+
shared.httpServer.once('listening', onListening);
|
|
347
|
+
shared.httpServer.listen(port, security.host ?? LOOPBACK_HOST);
|
|
348
|
+
});
|
|
349
|
+
log('mcp_daemon_started', { port });
|
|
350
|
+
return {
|
|
351
|
+
bridge,
|
|
352
|
+
...(realInput !== undefined ? { realInput } : {}),
|
|
353
|
+
...(verifyHttp !== undefined ? { verifyPort: verifyHttp.port } : {}),
|
|
354
|
+
...(security.token !== undefined ? { token: security.token } : {}),
|
|
355
|
+
// Idle = nobody is using the daemon: no agent attached, no browser tab connected, no pool lease.
|
|
356
|
+
// The daemon entry self-shuts-down after this holds for the grace window (see cli.ts / IdleShutdown).
|
|
357
|
+
isIdle: () => !agentConnected && bridge.sessions.count() === 0 && pool.activeCount() === 0,
|
|
358
|
+
close: async () => {
|
|
359
|
+
reaper.stop();
|
|
360
|
+
const vh = verifyHttp;
|
|
361
|
+
if (vh !== undefined)
|
|
362
|
+
await new Promise((resolve) => vh.server.close(() => resolve()));
|
|
363
|
+
leaseReaper.stop();
|
|
364
|
+
await pool.shutdown();
|
|
365
|
+
await owned?.dispose();
|
|
366
|
+
await bridge.close();
|
|
367
|
+
await shared.close();
|
|
368
|
+
},
|
|
369
|
+
};
|
|
370
|
+
}
|
|
371
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,cAAc,EACd,UAAU,EACV,UAAU,EACV,aAAa,EACb,YAAY,GACb,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,kCAAkC,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACpG,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AACxF,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACvF,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAM9C,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE/B,8FAA8F;AAC9F,SAAS,iBAAiB,CAAC,MAAwB;IACjD,IAAI,MAAM,CAAC,MAAM,KAAK,YAAY,CAAC,EAAE;QAAE,OAAO,MAAM,MAAM,CAAC,IAAI,UAAU,CAAC;IAC1E,IAAI,MAAM,CAAC,MAAM,KAAK,YAAY,CAAC,KAAK;QACtC,OAAO,MAAM,MAAM,CAAC,IAAI,sCAAsC,CAAC;IACjE,OAAO,MAAM,MAAM,CAAC,IAAI,cAAc,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,kBAAkB,EAAE,CAAC;AACtF,CAAC;AAED,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AAEjF,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEzC,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAChF,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE5F,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAClF,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAErE,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,YAAY,GACb,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAEtF,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAElD,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE3E,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACvF,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAExF,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEtD,OAAO,EACL,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEnE,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,YAAY,EACZ,eAAe,EACf,QAAQ,EACR,YAAY,GACb,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE5D,oGAAoG;AACpG,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAExF,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE/C,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEzF,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAElF,OAAO,EACL,2BAA2B,EAC3B,iBAAiB,EACjB,YAAY,GACb,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7F,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EACL,oBAAoB,EACpB,yBAAyB,EACzB,UAAU,EACV,cAAc,EACd,SAAS,EACT,eAAe,GAChB,MAAM,uBAAuB,CAAC;AAgD/B,qFAAqF;AACrF,MAAM,CAAC,MAAM,2BAA2B,GAAG,IAAI,CAAC;AAgBhD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7D;;;GAGG;AACH,SAAS,iBAAiB,CAAC,QAAiB;IAC1C,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC;IAC5F,MAAM,YAAY,GAAG,GAAW,EAAE,CAChC,SACE,OAAO,UAAU,CAAC,MAAM,EAAE,UAAU,KAAK,UAAU;QACjD,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,EAAE;QAChC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CACvB,EAAE,CAAC;IACL,OAAO,IAAI,WAAW,CAAC,kBAAkB,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CAAC;AAC1F,CAAC;AAED,4FAA4F;AAC5F,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,UAAwB,EAAE;IACpD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,oBAAoB,CAAC;IAClD,MAAM,QAAQ,GAAG,MAAM,kCAAkC,CAAC,OAAO,CAAC,CAAC;IACnE,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,IAAI,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC;IACjD,iGAAiG;IACjG,kGAAkG;IAClG,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAClD,MAAM,CAAC,KAAK,EAAE,CAAC;IACf,qGAAqG;IACrG,oGAAoG;IACpG,MAAM,eAAe,GAAG,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACrD,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;QAClC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,CAAC;IAClE,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,aAAa,EAAE,CAAC;IACtC,MAAM,UAAU,GAAG,IAAI,cAAc,EAAE,CAAC;IACxC,2EAA2E;IAC3E,IAAI,KAAmD,CAAC;IACxD,IAAI,SAAwC,CAAC;IAC7C,IAAI,IAA6B,CAAC;IAClC,IAAI,WAAoC,CAAC;IACzC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC;QAC1C,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;QAC5C,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;QAC1C,MAAM,OAAO,GACX,OAAO,CAAC,gBAAgB;YACxB,CAAC,CAAC,IAAI,EAAE,EAAE,CACR,IAAI,yBAAyB,CAAC;gBAC5B,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzD,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACxD,CAAC,CAAC,CAAC;QACR,MAAM,QAAQ,GAAG,OAAO,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;QACjD,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,sCAAsC;YAC5D,MAAM,KAAK,CAAC;QACd,CAAC;QACD,KAAK,GAAG,QAAQ,CAAC;QACjB,SAAS,GAAG,QAAQ,CAAC;IACvB,CAAC;SAAM,CAAC;QACN,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACjE,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9C,MAAM,GAAG,GAAG,IAAI,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;YACjD,KAAK,GAAG,GAAG,CAAC;YACZ,SAAS,GAAG,GAAG,CAAC;QAClB,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,GAAG,KAAK,KAAK,EAAE,CAAC;QAC1B,gGAAgG;QAChG,MAAM,EAAE,GAAG,oBAAoB,EAAE,CAAC;QAClC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;QAChF,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,GAAW,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,EAAE,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,EAAE,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QAC3D,MAAM,WAAW,GAAG,IAAI,eAAe,EAAE,CAAC;QAC1C,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC;QACnD,WAAW,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;QACpC,WAAW,CAAC,KAAK,EAAE,CAAC;QACpB,MAAM,IAAI,GAAG;YACX,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,IAAI;YACJ,SAAS;YACT,UAAU;YACV,WAAW;YACX,KAAK;YACL,OAAO;YACP,EAAE;YACF,WAAW;YACX,GAAG;SACJ,CAAC;QACF,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,eAAe,CAC5B,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,EACvD,OAAO,CACR,CAAC;QACF,+FAA+F;QAC/F,4FAA4F;QAC5F,sEAAsE;QACtE,MAAM,CAAC,MAAM,CAAC,OAAO,GAAG,GAAG,EAAE;YAC3B,cAAc,CAAC,MAAM,CAAC,QAAQ,EAAE,sBAAsB,CAAC,CAAC;QAC1D,CAAC,CAAC;QACF,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAC;QACjD,GAAG,CAAC,eAAe,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IACjC,CAAC;IAED,OAAO;QACL,MAAM;QACN,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,GAAG,CAAC,QAAQ,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE,KAAK,EAAE,KAAK,IAAI,EAAE;YAChB,MAAM,CAAC,IAAI,EAAE,CAAC;YACd,WAAW,EAAE,IAAI,EAAE,CAAC;YACpB,MAAM,IAAI,EAAE,QAAQ,EAAE,CAAC;YACvB,MAAM,KAAK,EAAE,OAAO,EAAE,CAAC;YACvB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,UAAwB,EAAE;IAC1D,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,oBAAoB,CAAC;IAElD,MAAM,QAAQ,GAAG,MAAM,kCAAkC,CAAC,OAAO,CAAC,CAAC;IACnE,MAAM,MAAM,GAAG,kBAAkB,CAAC,QAAQ,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IACjG,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC;IAC5E,oGAAoG;IACpG,wFAAwF;IACxF,KAAK,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACzC,4FAA4F;IAC5F,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC;QACzB,OAAO,EAAE,IAAI;QACb,YAAY,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE;QACrC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE;KACjC,CAAC,CAAC,CAAC;IACJ,iGAAiG;IACjG,gGAAgG;IAChG,oGAAoG;IACpG,iGAAiG;IACjG,kGAAkG;IAClG,iFAAiF;IACjF,IAAI,cAAc,GAAG,KAAK,CAAC;IAC3B,MAAM,CAAC,mBAAmB,CAAC,CAAC,SAAS,EAAE,EAAE;QACvC,cAAc,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,SAAS;YAAE,cAAc,CAAC,MAAM,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAClD,MAAM,CAAC,KAAK,EAAE,CAAC;IACf,qGAAqG;IACrG,oGAAoG;IACpG,MAAM,eAAe,GAAG,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACrD,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;QAClC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,IAAI,KAAmD,CAAC;IACxD,IAAI,SAAwC,CAAC;IAC7C,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC;QAC1C,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;QAC5C,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;QAC1C,MAAM,OAAO,GACX,OAAO,CAAC,gBAAgB;YACxB,CAAC,CAAC,IAAI,EAAE,EAAE,CACR,IAAI,yBAAyB,CAAC;gBAC5B,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzD,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACxD,CAAC,CAAC,CAAC;QACR,MAAM,QAAQ,GAAG,OAAO,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;QACjD,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACrB,MAAM,KAAK,CAAC;QACd,CAAC;QACD,KAAK,GAAG,QAAQ,CAAC;QACjB,SAAS,GAAG,QAAQ,CAAC;IACvB,CAAC;SAAM,CAAC;QACN,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACjE,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9C,MAAM,GAAG,GAAG,IAAI,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;YACjD,KAAK,GAAG,GAAG,CAAC;YACZ,SAAS,GAAG,GAAG,CAAC;QAClB,CAAC;IACH,CAAC;IAED,MAAM,EAAE,GAAG,oBAAoB,EAAE,CAAC;IAClC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;IAChF,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,GAAW,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACtD,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,EAAE,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,EAAE,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IAC3D,MAAM,WAAW,GAAG,IAAI,eAAe,EAAE,CAAC;IAC1C,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC;IACzD,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;IAC1C,WAAW,CAAC,KAAK,EAAE,CAAC;IACpB,MAAM,IAAI,GAAG;QACX,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,IAAI;QACJ,SAAS,EAAE,IAAI,aAAa,EAAE;QAC9B,UAAU,EAAE,IAAI,cAAc,EAAE;QAChC,WAAW;QACX,KAAK;QACL,OAAO;QACP,EAAE;QACF,WAAW;QACX,GAAG;KACJ,CAAC;IACF,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACxD,MAAM,aAAa,GAAG,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9E,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC;IAEhE,wGAAwG;IACxG,kGAAkG;IAClG,8FAA8F;IAC9F,IAAI,UAAwD,CAAC;IAC7D,IAAI,OAAO,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC,CAAC;QAClE,MAAM,KAAK,GAAG,OAAO,CAAC,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;QACpF,UAAU,GAAG,MAAM,iBAAiB,CAClC,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EACxD,OAAO,CAAC,cAAc,IAAI,2BAA2B,CACtD,CAAC;QACF,GAAG,CAAC,6BAA6B,EAAE,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC;IACjG,CAAC;IAED,8FAA8F;IAC9F,+FAA+F;IAC/F,2DAA2D;IAC3D,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE;QAC1C,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC/C,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO;QAClC,OAAO,CAAC,aAAa,CAAC,gBAAgB,QAAQ,IAAI,CAAC,CAAC;QACpD,eAAe,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;aACpD,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC;aAClE,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YACxB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,OAAO,CAAC,aAAa,CAAC,aAAa,QAAQ,cAAc,OAAO,EAAE,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IACH,6FAA6F;IAC7F,gGAAgG;IAChG,mGAAmG;IACnG,8FAA8F;IAC9F,MAAM,CAAC,kBAAkB,CAAC,CAAC,OAAO,EAAE,EAAE;QACpC,KAAK;aACF,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;aACvB,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YACpB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAC3F,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC7D,MAAM,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,EAAE;gBAC1C,KAAK,EAAE,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC;aAChD,CAAC,CAAC;QACL,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,gGAAgG;IAChG,8FAA8F;IAC9F,8FAA8F;IAC9F,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,MAAM,OAAO,GAAG,CAAC,GAAU,EAAQ,EAAE;YACnC,MAAM,CAAC,UAAU,CAAC,cAAc,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;YAC3D,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC;QACF,MAAM,WAAW,GAAG,GAAS,EAAE;YAC7B,MAAM,CAAC,UAAU,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACnD,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;QACF,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACzC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QACjD,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,aAAa,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,oBAAoB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IAEpC,OAAO;QACL,MAAM;QACN,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,GAAG,CAAC,QAAQ,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE,iGAAiG;QACjG,sGAAsG;QACtG,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,cAAc,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC;QAC1F,KAAK,EAAE,KAAK,IAAI,EAAE;YAChB,MAAM,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,EAAE,GAAG,UAAU,CAAC;YACtB,IAAI,EAAE,KAAK,SAAS;gBAAE,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAC7F,WAAW,CAAC,IAAI,EAAE,CAAC;YACnB,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;YACtB,MAAM,KAAK,EAAE,OAAO,EAAE,CAAC;YACvB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACrB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Global Cursor registration for `reticle init`. Cursor has no CLI, but its global MCP config is a
|
|
3
|
+
* small dedicated file (`~/.cursor/mcp.json`) — safe to merge directly (unlike `~/.claude.json`).
|
|
4
|
+
* We add the `reticle` server once at this global path so every project picks it up. Unparseable
|
|
5
|
+
* (jsonc/comment) files bail to manual rather than being rewritten.
|
|
6
|
+
*/
|
|
7
|
+
/** Path of Cursor's global MCP config, relative to the user's home directory. */
|
|
8
|
+
export declare const CURSOR_MCP_RELPATH = ".cursor/mcp.json";
|
|
9
|
+
/** The directory whose presence signals Cursor is installed for this user. */
|
|
10
|
+
export declare const CURSOR_DIR_RELPATH = ".cursor";
|
|
11
|
+
export declare const CursorMergeStatus: {
|
|
12
|
+
readonly APPLY: "apply";
|
|
13
|
+
readonly ALREADY: "already";
|
|
14
|
+
readonly MANUAL: "manual";
|
|
15
|
+
};
|
|
16
|
+
export type CursorMergeStatus = (typeof CursorMergeStatus)[keyof typeof CursorMergeStatus];
|
|
17
|
+
interface CursorMergeResult {
|
|
18
|
+
status: CursorMergeStatus;
|
|
19
|
+
/** Full file content to write (2-space JSON, trailing newline). Unchanged when not `apply`. */
|
|
20
|
+
content: string;
|
|
21
|
+
}
|
|
22
|
+
export declare function cursorServerEntry(): Record<string, unknown>;
|
|
23
|
+
export declare function mergeCursorConfig(existing: string | null): CursorMergeResult;
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=cursor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../src/init/cursor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,iFAAiF;AACjF,eAAO,MAAM,kBAAkB,qBAAqB,CAAC;AACrD,8EAA8E;AAC9E,eAAO,MAAM,kBAAkB,YAAY,CAAC;AAE5C,eAAO,MAAM,iBAAiB;;;;CAIpB,CAAC;AACX,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,OAAO,iBAAiB,CAAC,CAAC;AAE3F,UAAU,iBAAiB;IACzB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,+FAA+F;IAC/F,OAAO,EAAE,MAAM,CAAC;CACjB;AAOD,wBAAgB,iBAAiB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAE3D;AAeD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,iBAAiB,CAe5E"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Global Cursor registration for `reticle init`. Cursor has no CLI, but its global MCP config is a
|
|
3
|
+
* small dedicated file (`~/.cursor/mcp.json`) — safe to merge directly (unlike `~/.claude.json`).
|
|
4
|
+
* We add the `reticle` server once at this global path so every project picks it up. Unparseable
|
|
5
|
+
* (jsonc/comment) files bail to manual rather than being rewritten.
|
|
6
|
+
*/
|
|
7
|
+
import { NPX, MCP_SERVER_NAME, npxServerArgs } from './mcp.js';
|
|
8
|
+
/** Path of Cursor's global MCP config, relative to the user's home directory. */
|
|
9
|
+
export const CURSOR_MCP_RELPATH = '.cursor/mcp.json';
|
|
10
|
+
/** The directory whose presence signals Cursor is installed for this user. */
|
|
11
|
+
export const CURSOR_DIR_RELPATH = '.cursor';
|
|
12
|
+
export const CursorMergeStatus = {
|
|
13
|
+
APPLY: 'apply',
|
|
14
|
+
ALREADY: 'already',
|
|
15
|
+
MANUAL: 'manual',
|
|
16
|
+
};
|
|
17
|
+
export function cursorServerEntry() {
|
|
18
|
+
return { command: NPX, args: npxServerArgs() };
|
|
19
|
+
}
|
|
20
|
+
function parseConfig(existing) {
|
|
21
|
+
if (existing === null || existing.trim().length === 0)
|
|
22
|
+
return { ok: true, config: {} };
|
|
23
|
+
try {
|
|
24
|
+
const parsed = JSON.parse(existing);
|
|
25
|
+
if (typeof parsed !== 'object' || parsed === null)
|
|
26
|
+
return { ok: true, config: {} };
|
|
27
|
+
return { ok: true, config: parsed };
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return { ok: false };
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export function mergeCursorConfig(existing) {
|
|
34
|
+
const parsed = parseConfig(existing);
|
|
35
|
+
if (!parsed.ok) {
|
|
36
|
+
return { status: CursorMergeStatus.MANUAL, content: existing ?? '' };
|
|
37
|
+
}
|
|
38
|
+
const config = parsed.config;
|
|
39
|
+
const servers = config.mcpServers ?? {};
|
|
40
|
+
if (Object.prototype.hasOwnProperty.call(servers, MCP_SERVER_NAME)) {
|
|
41
|
+
return { status: CursorMergeStatus.ALREADY, content: existing ?? '' };
|
|
42
|
+
}
|
|
43
|
+
const merged = {
|
|
44
|
+
...config,
|
|
45
|
+
mcpServers: { ...servers, [MCP_SERVER_NAME]: cursorServerEntry() },
|
|
46
|
+
};
|
|
47
|
+
return { status: CursorMergeStatus.APPLY, content: `${JSON.stringify(merged, null, 2)}\n` };
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=cursor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/init/cursor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,GAAG,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE/D,iFAAiF;AACjF,MAAM,CAAC,MAAM,kBAAkB,GAAG,kBAAkB,CAAC;AACrD,8EAA8E;AAC9E,MAAM,CAAC,MAAM,kBAAkB,GAAG,SAAS,CAAC;AAE5C,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,SAAS;IAClB,MAAM,EAAE,QAAQ;CACR,CAAC;AAcX,MAAM,UAAU,iBAAiB;IAC/B,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,CAAC;AACjD,CAAC;AAID,SAAS,WAAW,CAAC,QAAuB;IAC1C,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACvF,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC7C,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QACnF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAA2B,EAAE,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,QAAuB;IACvD,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IACrC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO,EAAE,MAAM,EAAE,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,CAAC;IACvE,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC7B,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;IACxC,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,EAAE,CAAC;QACnE,OAAO,EAAE,MAAM,EAAE,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,CAAC;IACxE,CAAC;IACD,MAAM,MAAM,GAAsB;QAChC,GAAG,MAAM;QACT,UAAU,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,eAAe,CAAC,EAAE,iBAAiB,EAAE,EAAE;KACnE,CAAC;IACF,OAAO,EAAE,MAAM,EAAE,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAC9F,CAAC"}
|