@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,408 @@
|
|
|
1
|
+
import { EventType, HumanControlDataSchema, HumanControlKind, HumanMarkDataSchema, ReticleCommand, MessageKind, PresenterTone, SESSION_HEALTH, SESSION_LEASE, SESSION_LIFECYCLE, SessionState, } from '@reticlehq/core';
|
|
2
|
+
import { RingBuffer } from '../events/ring-buffer.js';
|
|
3
|
+
import { ReviewStore } from './review-store.js';
|
|
4
|
+
import { buildSessionRecommendation } from './session-recommendation.js';
|
|
5
|
+
import { buildPresenterArgs } from './presenter-args.js';
|
|
6
|
+
const DEFAULT_COMMAND_TIMEOUT_MS = 8000;
|
|
7
|
+
/** Prefix on correlated command ids (c1, c2, …) — distinguishes them from mark ids. */
|
|
8
|
+
const COMMAND_ID_PREFIX = 'c';
|
|
9
|
+
/** ws readyState for an OPEN socket — guard fire-and-forget pushes against a closing tab. */
|
|
10
|
+
const WS_OPEN = 1;
|
|
11
|
+
/**
|
|
12
|
+
* One connected browser tab. Owns its socket, a ring buffer of observations, and the
|
|
13
|
+
* in-flight command map. `clock` is injected so elapsed-time logic stays testable.
|
|
14
|
+
*/
|
|
15
|
+
export class Session {
|
|
16
|
+
id;
|
|
17
|
+
/** Stable build-stamped project identity; undefined for v1.0 SDKs that omit it. */
|
|
18
|
+
projectId;
|
|
19
|
+
url;
|
|
20
|
+
title;
|
|
21
|
+
adapters;
|
|
22
|
+
hasCapabilities;
|
|
23
|
+
#socket;
|
|
24
|
+
#clock;
|
|
25
|
+
#startedAt;
|
|
26
|
+
#buffer = new RingBuffer();
|
|
27
|
+
#pending = new Map();
|
|
28
|
+
#listeners = new Set();
|
|
29
|
+
#seq = 0;
|
|
30
|
+
#lastSeenAt;
|
|
31
|
+
#hidden = false;
|
|
32
|
+
#focused = true;
|
|
33
|
+
#state = SessionState.ACTIVE;
|
|
34
|
+
#lastActCursor;
|
|
35
|
+
/** Liveness: wall-clock of the last AGENT command (distinct from browser chatter / lastSeen). */
|
|
36
|
+
#lastAgentActivityAt;
|
|
37
|
+
/** Server-side mirror of the agent-tuned idle window, so the reaper honors reticle_session. */
|
|
38
|
+
#idleEndMs = SESSION_LIFECYCLE.IDLE_END_MS;
|
|
39
|
+
/** True when the reaper/disconnect ended this session — such an end is revivable; explicit ends are not. */
|
|
40
|
+
#autoEnded = false;
|
|
41
|
+
#inbox = [];
|
|
42
|
+
/** Human review marks: mistakes the human pinned to elements, for the agent to drain and fix. */
|
|
43
|
+
#review = new ReviewStore();
|
|
44
|
+
/** Whether the session_lease has already been returned (fire-once per session). */
|
|
45
|
+
#firstCommandDone = false;
|
|
46
|
+
constructor(hello, socket, clock) {
|
|
47
|
+
this.id = hello.sessionId;
|
|
48
|
+
this.projectId = hello.projectId;
|
|
49
|
+
this.url = hello.url;
|
|
50
|
+
this.title = hello.title;
|
|
51
|
+
this.adapters = hello.adapters;
|
|
52
|
+
this.hasCapabilities = hello.hasCapabilities ?? false;
|
|
53
|
+
this.#socket = socket;
|
|
54
|
+
this.#clock = clock;
|
|
55
|
+
this.#startedAt = clock();
|
|
56
|
+
this.#lastSeenAt = clock();
|
|
57
|
+
this.#lastAgentActivityAt = clock();
|
|
58
|
+
}
|
|
59
|
+
/** Milliseconds since this session connected — the authoritative buffer clock. */
|
|
60
|
+
elapsed() {
|
|
61
|
+
return this.#clock() - this.#startedAt;
|
|
62
|
+
}
|
|
63
|
+
/** Mark that the SDK was just heard from. Called on every inbound message. */
|
|
64
|
+
touch() {
|
|
65
|
+
this.#lastSeenAt = this.#clock();
|
|
66
|
+
}
|
|
67
|
+
/** ms since the SDK last reported anything (distinct from elapsed-since-connect). */
|
|
68
|
+
lastSeenMs() {
|
|
69
|
+
return this.#clock() - this.#lastSeenAt;
|
|
70
|
+
}
|
|
71
|
+
/** Record the latest page visibility/focus state from a PAGE_HEALTH event. */
|
|
72
|
+
applyHealth(hidden, focused) {
|
|
73
|
+
this.#hidden = hidden;
|
|
74
|
+
this.#focused = focused;
|
|
75
|
+
}
|
|
76
|
+
/** Throttled if the tab is hidden OR we have not heard from it recently. */
|
|
77
|
+
throttled() {
|
|
78
|
+
return this.#hidden || this.lastSeenMs() > SESSION_HEALTH.STALE_THRESHOLD_MS;
|
|
79
|
+
}
|
|
80
|
+
/** The attachable health block — single source of truth for the tools. */
|
|
81
|
+
health() {
|
|
82
|
+
const base = {
|
|
83
|
+
lastSeenMs: this.lastSeenMs(),
|
|
84
|
+
throttled: this.throttled(),
|
|
85
|
+
focused: this.#focused,
|
|
86
|
+
};
|
|
87
|
+
// attach the escape-hatch hint only when un-scriptable (keeps field absent otherwise).
|
|
88
|
+
const recommendation = buildSessionRecommendation({
|
|
89
|
+
hidden: this.#hidden,
|
|
90
|
+
throttled: base.throttled,
|
|
91
|
+
focused: base.focused,
|
|
92
|
+
});
|
|
93
|
+
return recommendation === undefined ? base : { ...base, recommendation };
|
|
94
|
+
}
|
|
95
|
+
info() {
|
|
96
|
+
const base = {
|
|
97
|
+
sessionId: this.id,
|
|
98
|
+
url: this.url,
|
|
99
|
+
...(this.projectId === undefined ? {} : { projectId: this.projectId }),
|
|
100
|
+
title: this.title,
|
|
101
|
+
adapters: this.adapters,
|
|
102
|
+
hasCapabilities: this.hasCapabilities,
|
|
103
|
+
hidden: this.#hidden,
|
|
104
|
+
...this.health(),
|
|
105
|
+
};
|
|
106
|
+
if (this.staleMs() > SESSION_LEASE.STALE_AFTER_MS) {
|
|
107
|
+
base.stale = true;
|
|
108
|
+
base.cleanup_suggestion =
|
|
109
|
+
'Call reticle_end_session to free this session before starting new work.';
|
|
110
|
+
}
|
|
111
|
+
// Surface human bug reports in reticle_sessions (only when > 0, so a clean session adds nothing).
|
|
112
|
+
const marks = this.#review.pendingCount();
|
|
113
|
+
if (marks > 0) {
|
|
114
|
+
base.pendingMarks = marks;
|
|
115
|
+
const s = marks === 1 ? '' : 's';
|
|
116
|
+
base.review_suggestion = `The human flagged ${String(marks)} issue${s} on this tab — call reticle_review to see and fix ${marks === 1 ? 'it' : 'them'}.`;
|
|
117
|
+
}
|
|
118
|
+
return base;
|
|
119
|
+
}
|
|
120
|
+
/** Wall-clock age of the session in milliseconds. */
|
|
121
|
+
staleMs() {
|
|
122
|
+
return this.#clock() - this.#startedAt;
|
|
123
|
+
}
|
|
124
|
+
/** Re-stamp an incoming event with server-relative time, buffer it, and fan out. */
|
|
125
|
+
pushEvent(event) {
|
|
126
|
+
if (event.type === EventType.PAGE_HEALTH) {
|
|
127
|
+
const data = event.data;
|
|
128
|
+
const hidden = typeof data['hidden'] === 'boolean' ? data['hidden'] : this.#hidden;
|
|
129
|
+
const focused = typeof data['focused'] === 'boolean' ? data['focused'] : this.#focused;
|
|
130
|
+
this.applyHealth(hidden, focused);
|
|
131
|
+
}
|
|
132
|
+
if (event.type === EventType.HUMAN_CONTROL) {
|
|
133
|
+
// Narrow unknown at the boundary; an invalid/unknown control is ignored (never thrown).
|
|
134
|
+
const parsed = HumanControlDataSchema.safeParse(event.data);
|
|
135
|
+
if (parsed.success)
|
|
136
|
+
this.applyHumanControl(parsed.data);
|
|
137
|
+
}
|
|
138
|
+
if (event.type === EventType.HUMAN_MARK) {
|
|
139
|
+
// A human pinned a mistake to an element. Narrow at the boundary; an invalid mark is ignored.
|
|
140
|
+
const parsed = HumanMarkDataSchema.safeParse(event.data);
|
|
141
|
+
if (parsed.success)
|
|
142
|
+
this.#review.add(parsed.data, this.elapsed());
|
|
143
|
+
}
|
|
144
|
+
if (event.type === EventType.ROUTE_CHANGE) {
|
|
145
|
+
// Keep the reported URL live across SPA navigation. The SDK already emits route.change on
|
|
146
|
+
// pushState/replaceState/popstate; without this the URL stays frozen at the hello value, and
|
|
147
|
+
// URL-based CDP correlation (real input) silently breaks after the first client-side nav.
|
|
148
|
+
const to = event.data['to'];
|
|
149
|
+
if (typeof to === 'string' && to.length > 0)
|
|
150
|
+
this.url = to;
|
|
151
|
+
}
|
|
152
|
+
const t = this.elapsed();
|
|
153
|
+
const stamped = { ...event, t, sessionId: this.id };
|
|
154
|
+
this.#buffer.push(stamped, t);
|
|
155
|
+
for (const listener of this.#listeners)
|
|
156
|
+
listener(stamped);
|
|
157
|
+
}
|
|
158
|
+
eventsSince(cursor) {
|
|
159
|
+
return this.#buffer.since(cursor);
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Honesty: remember the event cursor of the most recent act so wait_for/assert can default their
|
|
163
|
+
* evaluation floor to it — a signal buffered before this act can never fake a later pass.
|
|
164
|
+
*/
|
|
165
|
+
markActCursor(cursor) {
|
|
166
|
+
this.#lastActCursor = cursor;
|
|
167
|
+
}
|
|
168
|
+
/** The cursor of the last act, or undefined if nothing has acted yet. */
|
|
169
|
+
lastActCursor() {
|
|
170
|
+
return this.#lastActCursor;
|
|
171
|
+
}
|
|
172
|
+
// ── Server-authoritative liveness (immune to browser-tab throttling) ──────────────
|
|
173
|
+
/**
|
|
174
|
+
* Stamp the wall-clock of the latest AGENT command (called whenever a tool resolves this session).
|
|
175
|
+
* If the reaper had auto-ended the session, a fresh command means the agent is alive again, so the
|
|
176
|
+
* session is REVIVED to ACTIVE. An EXPLICIT end (human/agent reticle_end_session) is terminal and is
|
|
177
|
+
* never revived here.
|
|
178
|
+
*/
|
|
179
|
+
markAgentActivity() {
|
|
180
|
+
this.#lastAgentActivityAt = this.#clock();
|
|
181
|
+
if (this.#state === SessionState.ENDED && this.#autoEnded) {
|
|
182
|
+
this.#autoEnded = false;
|
|
183
|
+
this.setState(SessionState.ACTIVE);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/** ms since the agent last issued a command against this session (the reaper's idle signal). */
|
|
187
|
+
agentIdleMs() {
|
|
188
|
+
return this.#clock() - this.#lastAgentActivityAt;
|
|
189
|
+
}
|
|
190
|
+
/** The agent-idle window after which the reaper ends this session. */
|
|
191
|
+
idleEndMs() {
|
|
192
|
+
return this.#idleEndMs;
|
|
193
|
+
}
|
|
194
|
+
/** Tune the idle window (reticle_session). Floored so an agent can't disable the safety net. */
|
|
195
|
+
setIdleEndMs(ms) {
|
|
196
|
+
this.#idleEndMs = Math.max(SESSION_LIFECYCLE.IDLE_END_MIN_MS, Math.floor(ms));
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Reaper/disconnect end: terminal like a normal end (pushes PRESENTER ended to the browser, which a
|
|
200
|
+
* throttled tab still receives) but flagged auto-ended so a returning agent revives it. No-op if
|
|
201
|
+
* already ended.
|
|
202
|
+
*/
|
|
203
|
+
autoEnd(text, tone = PresenterTone.WARN) {
|
|
204
|
+
if (this.#state === SessionState.ENDED)
|
|
205
|
+
return;
|
|
206
|
+
this.#autoEnded = true;
|
|
207
|
+
this.setState(SessionState.ENDED, text, tone);
|
|
208
|
+
}
|
|
209
|
+
eventsInWindow(windowMs) {
|
|
210
|
+
return this.#buffer.window(windowMs, this.elapsed());
|
|
211
|
+
}
|
|
212
|
+
onEvent(listener) {
|
|
213
|
+
this.#listeners.add(listener);
|
|
214
|
+
return () => this.#listeners.delete(listener);
|
|
215
|
+
}
|
|
216
|
+
/** Send a command to the browser and await its reply (or time out). */
|
|
217
|
+
command(name, args = {}, timeoutMs = DEFAULT_COMMAND_TIMEOUT_MS) {
|
|
218
|
+
this.#seq += 1;
|
|
219
|
+
const id = `${COMMAND_ID_PREFIX}${String(this.#seq)}`;
|
|
220
|
+
const payload = JSON.stringify({
|
|
221
|
+
kind: MessageKind.COMMAND,
|
|
222
|
+
id,
|
|
223
|
+
sessionId: this.id,
|
|
224
|
+
name,
|
|
225
|
+
args,
|
|
226
|
+
});
|
|
227
|
+
return new Promise((resolve, reject) => {
|
|
228
|
+
const timer = setTimeout(() => {
|
|
229
|
+
this.#pending.delete(id);
|
|
230
|
+
reject(new Error(`command '${name}' timed out after ${String(timeoutMs)}ms`));
|
|
231
|
+
}, timeoutMs);
|
|
232
|
+
this.#pending.set(id, { resolve, reject, timer });
|
|
233
|
+
this.#socket.send(payload);
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
handleResult(result) {
|
|
237
|
+
const pending = this.#pending.get(result.id);
|
|
238
|
+
if (pending === undefined)
|
|
239
|
+
return;
|
|
240
|
+
clearTimeout(pending.timer);
|
|
241
|
+
this.#pending.delete(result.id);
|
|
242
|
+
pending.resolve(result);
|
|
243
|
+
}
|
|
244
|
+
/** Reject everything still in flight — used on disconnect. */
|
|
245
|
+
rejectAll(reason) {
|
|
246
|
+
for (const [id, pending] of this.#pending) {
|
|
247
|
+
clearTimeout(pending.timer);
|
|
248
|
+
pending.reject(new Error(reason));
|
|
249
|
+
this.#pending.delete(id);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
/** End this transport without letting a stale socket remove its replacement session. */
|
|
253
|
+
disconnect(reason) {
|
|
254
|
+
this.rejectAll(reason);
|
|
255
|
+
try {
|
|
256
|
+
this.#socket.close(1008, reason);
|
|
257
|
+
}
|
|
258
|
+
catch {
|
|
259
|
+
// A fake or already-closed socket needs no further cleanup.
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
// ── Live-control: state machine + human→agent inbox (server-owned) ───────────────
|
|
263
|
+
getState() {
|
|
264
|
+
return this.#state;
|
|
265
|
+
}
|
|
266
|
+
isPaused() {
|
|
267
|
+
return this.#state === SessionState.PAUSED;
|
|
268
|
+
}
|
|
269
|
+
isEnded() {
|
|
270
|
+
return this.#state === SessionState.ENDED;
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Set the lifecycle state and echo it to the panel in ONE PRESENTER push. The SOLE pusher of
|
|
274
|
+
* PRESENTER for a transition. Optional `text` rides the same push (e.g. an end-of-session
|
|
275
|
+
* summary) so a transition never emits two PRESENTER commands.
|
|
276
|
+
*/
|
|
277
|
+
setState(next, text, tone) {
|
|
278
|
+
this.#state = next;
|
|
279
|
+
this.pushPresenter(this.#state, text, tone);
|
|
280
|
+
}
|
|
281
|
+
/** Push a human note onto the inbox; empty/whitespace-only text is ignored. Stamped with elapsed t. */
|
|
282
|
+
pushMessage(text) {
|
|
283
|
+
const trimmed = text.trim();
|
|
284
|
+
if (trimmed.length === 0)
|
|
285
|
+
return;
|
|
286
|
+
this.#inbox.push({ text: trimmed, t: this.elapsed() });
|
|
287
|
+
}
|
|
288
|
+
/** Return the queued human notes AND clear the inbox (delivered-once). */
|
|
289
|
+
drainInbox() {
|
|
290
|
+
return this.#inbox.splice(0, this.#inbox.length);
|
|
291
|
+
}
|
|
292
|
+
/** Diagnostic read of the inbox depth (does not clear). */
|
|
293
|
+
inboxSize() {
|
|
294
|
+
return this.#inbox.length;
|
|
295
|
+
}
|
|
296
|
+
// ── Human review marks: the "annotate the bug where you see it" inbox (server-owned) ──────────
|
|
297
|
+
/** Human marks still awaiting a fix (oldest first). Reading does not consume — resolveMark() does. */
|
|
298
|
+
pendingMarks() {
|
|
299
|
+
return this.#review.pending();
|
|
300
|
+
}
|
|
301
|
+
/** Full mark history (pending + resolved), oldest first. */
|
|
302
|
+
allMarks() {
|
|
303
|
+
return this.#review.all();
|
|
304
|
+
}
|
|
305
|
+
/** Count of pending marks — surfaced as the panel badge / a session-health hint. */
|
|
306
|
+
pendingMarkCount() {
|
|
307
|
+
return this.#review.pendingCount();
|
|
308
|
+
}
|
|
309
|
+
/** Retire a mark the agent fixed. True on a real pending → resolved transition; false otherwise. */
|
|
310
|
+
resolveMark(id) {
|
|
311
|
+
return this.#review.resolve(id);
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Apply a narrowed human control. `setState` is called only on a GENUINE change, so each real
|
|
315
|
+
* transition pushes exactly one PRESENTER command; no-ops (e.g. resume on active, pause after
|
|
316
|
+
* end) push nothing. `ended` is terminal — pause/resume after end are no-ops.
|
|
317
|
+
*/
|
|
318
|
+
applyHumanControl(data) {
|
|
319
|
+
if (this.#state === SessionState.ENDED) {
|
|
320
|
+
// Terminal: end is idempotent; pause/resume are no-ops.
|
|
321
|
+
return;
|
|
322
|
+
}
|
|
323
|
+
switch (data.kind) {
|
|
324
|
+
case HumanControlKind.PAUSE:
|
|
325
|
+
if (this.#state !== SessionState.PAUSED)
|
|
326
|
+
this.setState(SessionState.PAUSED);
|
|
327
|
+
return;
|
|
328
|
+
case HumanControlKind.RESUME:
|
|
329
|
+
if (this.#state !== SessionState.ACTIVE)
|
|
330
|
+
this.setState(SessionState.ACTIVE);
|
|
331
|
+
return;
|
|
332
|
+
case HumanControlKind.END:
|
|
333
|
+
this.setState(SessionState.ENDED);
|
|
334
|
+
return;
|
|
335
|
+
case HumanControlKind.MESSAGE:
|
|
336
|
+
if (data.text !== undefined)
|
|
337
|
+
this.pushMessage(data.text);
|
|
338
|
+
return;
|
|
339
|
+
default:
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Push a lifecycle state to the panel with optional human-facing `text`. State changes still flow
|
|
345
|
+
* through `setState`; an auto-ended session rides a `warn` tone so the panel can shout "agent stopped".
|
|
346
|
+
*/
|
|
347
|
+
pushPresenter(state, text, tone) {
|
|
348
|
+
this.#post(ReticleCommand.PRESENTER, buildPresenterArgs(state, text, tone));
|
|
349
|
+
}
|
|
350
|
+
/** Fire-and-forget a narration row to the live panel (so a resolved mark shows "✓ fixed"). */
|
|
351
|
+
pushNarration(text) {
|
|
352
|
+
this.#post(ReticleCommand.NARRATE, { text, level: 'info' });
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Returns the one-time session lease block on the very first agent command, then undefined
|
|
356
|
+
* forever after. The lease carries an IMPORTANT reminder to call reticle_end_session. Coding agents
|
|
357
|
+
* (Claude Code, Codex) read tool results — they will see this and remember to clean up.
|
|
358
|
+
*/
|
|
359
|
+
takeSessionLease() {
|
|
360
|
+
if (this.#firstCommandDone)
|
|
361
|
+
return undefined;
|
|
362
|
+
this.#firstCommandDone = true;
|
|
363
|
+
return {
|
|
364
|
+
sessionId: this.id,
|
|
365
|
+
opened_at: this.#startedAt,
|
|
366
|
+
IMPORTANT: 'MANDATORY: the moment you stop driving — finishing a reply or waiting on the human — call reticle_yield (mode:"waiting", or "ask" with your question) so the panel never falsely reads "live". Call reticle_end_session only when the whole task is done. The session revives on your next action.',
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Returns a human-readable age warning after SESSION_LEASE.WARN_AFTER_MS (10 min), else undefined.
|
|
371
|
+
* Spliced onto every session-bound tool result so the agent is passively reminded to clean up
|
|
372
|
+
* without needing an explicit polling loop.
|
|
373
|
+
*/
|
|
374
|
+
ageWarning() {
|
|
375
|
+
const ageMs = this.#clock() - this.#startedAt;
|
|
376
|
+
if (ageMs < SESSION_LEASE.WARN_AFTER_MS)
|
|
377
|
+
return undefined;
|
|
378
|
+
const minutes = Math.floor(ageMs / 60_000);
|
|
379
|
+
return `Session ${this.id} has been open for ${String(minutes)} minutes. If your task is complete, call reticle_end_session now.`;
|
|
380
|
+
}
|
|
381
|
+
/** Fire-and-forget command send — NOT registered in #pending (no correlated result expected). */
|
|
382
|
+
#post(name, args) {
|
|
383
|
+
if (this.#socket.readyState !== WS_OPEN)
|
|
384
|
+
return;
|
|
385
|
+
this.#seq += 1;
|
|
386
|
+
const id = `${COMMAND_ID_PREFIX}${String(this.#seq)}`;
|
|
387
|
+
const payload = JSON.stringify({
|
|
388
|
+
kind: MessageKind.COMMAND,
|
|
389
|
+
id,
|
|
390
|
+
sessionId: this.id,
|
|
391
|
+
name,
|
|
392
|
+
args,
|
|
393
|
+
});
|
|
394
|
+
try {
|
|
395
|
+
this.#socket.send(payload);
|
|
396
|
+
}
|
|
397
|
+
catch {
|
|
398
|
+
// A closing/closed tab must never break event routing for the session.
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
/**
|
|
403
|
+
* Re-exported from session-manager.ts so the public import path (`./session.js`) is unchanged for
|
|
404
|
+
* the many call sites that resolve a target session. The class lives in its own file to keep both
|
|
405
|
+
* units under the file-size cap.
|
|
406
|
+
*/
|
|
407
|
+
export { SessionManager } from './session-manager.js';
|
|
408
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/session/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* reticle_state path selection + depth capping. The pure implementation now lives in
|
|
3
|
+
* `@reticlehq/core` so the BROWSER SDK can apply it BEFORE the transport (scoping a huge store
|
|
4
|
+
* without paying the truncation tax); the server re-exports it for its back-compat fallback path
|
|
5
|
+
* (an older browser that returns the whole store) and for the predicate engine's `state` assertion.
|
|
6
|
+
*/
|
|
7
|
+
export { selectPath, capDepth, type PathSelection } from '@reticlehq/core';
|
|
8
|
+
//# sourceMappingURL=state-select.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-select.d.ts","sourceRoot":"","sources":["../../src/session/state-select.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* reticle_state path selection + depth capping. The pure implementation now lives in
|
|
3
|
+
* `@reticlehq/core` so the BROWSER SDK can apply it BEFORE the transport (scoping a huge store
|
|
4
|
+
* without paying the truncation tax); the server re-exports it for its back-compat fallback path
|
|
5
|
+
* (an older browser that returns the whole store) and for the predicate engine's `state` assertion.
|
|
6
|
+
*/
|
|
7
|
+
export { selectPath, capDepth } from '@reticlehq/core';
|
|
8
|
+
//# sourceMappingURL=state-select.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-select.js","sourceRoot":"","sources":["../../src/session/state-select.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAsB,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { IncomingMessage } from 'node:http';
|
|
2
|
+
/**
|
|
3
|
+
* Timing-safe pairing-token comparison. Length-guards first because `timingSafeEqual` throws on a
|
|
4
|
+
* length mismatch — and the guard itself is not a timing oracle (length is not the secret).
|
|
5
|
+
*/
|
|
6
|
+
export declare function tokensMatch(expected: string, received: string | undefined): boolean;
|
|
7
|
+
/** Pull a request's pairing token from `Authorization: Bearer <t>` first, then a `?token=` query param. */
|
|
8
|
+
export declare function requestToken(req: IncomingMessage, url: URL): string | undefined;
|
|
9
|
+
/** True when the request peer is a loopback address — the local-trust tier that needs no token. */
|
|
10
|
+
export declare function isLoopbackPeer(remoteAddress: string | undefined): boolean;
|
|
11
|
+
/**
|
|
12
|
+
* True when the `Host` header names a loopback host. This is the anti-DNS-rebinding guard: a rebound
|
|
13
|
+
* page reaches us as a loopback *peer* but its browser still sends the attacker's original `Host`
|
|
14
|
+
* (`evil.com`), so a non-loopback Host means "not actually a local client" even when the socket is.
|
|
15
|
+
* Missing Host is untrusted — every real HTTP/1.1 client (incl. `reticle status`, the stdio proxy) sends it.
|
|
16
|
+
*/
|
|
17
|
+
export declare function isLoopbackHost(hostHeader: string | undefined): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* True when neither `Origin` nor `Referer` betrays a non-loopback web origin. Absent headers pass —
|
|
20
|
+
* non-browser local clients (the stdio MCP proxy, `reticle status`) send neither. Any present-but-
|
|
21
|
+
* non-loopback value fails, which is what kills a rebound `http://evil.com` page reading the plane.
|
|
22
|
+
*/
|
|
23
|
+
export declare function isLocalWebOrigin(origin: string | undefined, referer: string | undefined): boolean;
|
|
24
|
+
//# sourceMappingURL=token-auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-auth.d.ts","sourceRoot":"","sources":["../src/token-auth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AASjD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAOnF;AAED,2GAA2G;AAC3G,wBAAgB,YAAY,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,GAAG,GAAG,MAAM,GAAG,SAAS,CAO/E;AAED,mGAAmG;AACnG,wBAAgB,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAGzE;AAYD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAItE;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAOjG"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { timingSafeEqual } from 'node:crypto';
|
|
2
|
+
import { isLoopbackHostname } from '@reticlehq/core';
|
|
3
|
+
/** `Authorization: Bearer <token>` prefix and the query-param fallback for clients that can't set headers. */
|
|
4
|
+
const BEARER_PREFIX = 'Bearer ';
|
|
5
|
+
const TOKEN_QUERY_PARAM = 'token';
|
|
6
|
+
/** Node reports IPv4 loopback over a dual-stack socket as this mapped form; strip it before classifying. */
|
|
7
|
+
const IPV4_MAPPED_PREFIX = /^::ffff:/i;
|
|
8
|
+
/**
|
|
9
|
+
* Timing-safe pairing-token comparison. Length-guards first because `timingSafeEqual` throws on a
|
|
10
|
+
* length mismatch — and the guard itself is not a timing oracle (length is not the secret).
|
|
11
|
+
*/
|
|
12
|
+
export function tokensMatch(expected, received) {
|
|
13
|
+
if (received === undefined)
|
|
14
|
+
return false;
|
|
15
|
+
const expectedBytes = Buffer.from(expected);
|
|
16
|
+
const receivedBytes = Buffer.from(received);
|
|
17
|
+
return (expectedBytes.length === receivedBytes.length && timingSafeEqual(expectedBytes, receivedBytes));
|
|
18
|
+
}
|
|
19
|
+
/** Pull a request's pairing token from `Authorization: Bearer <t>` first, then a `?token=` query param. */
|
|
20
|
+
export function requestToken(req, url) {
|
|
21
|
+
const header = req.headers.authorization;
|
|
22
|
+
if (header !== undefined && header.startsWith(BEARER_PREFIX)) {
|
|
23
|
+
return header.slice(BEARER_PREFIX.length);
|
|
24
|
+
}
|
|
25
|
+
const queryToken = url.searchParams.get(TOKEN_QUERY_PARAM);
|
|
26
|
+
return queryToken !== null ? queryToken : undefined;
|
|
27
|
+
}
|
|
28
|
+
/** True when the request peer is a loopback address — the local-trust tier that needs no token. */
|
|
29
|
+
export function isLoopbackPeer(remoteAddress) {
|
|
30
|
+
if (remoteAddress === undefined)
|
|
31
|
+
return false;
|
|
32
|
+
return isLoopbackHostname(remoteAddress.replace(IPV4_MAPPED_PREFIX, ''));
|
|
33
|
+
}
|
|
34
|
+
/** Extract the hostname from a `Host` value (`127.0.0.1:9000`) or a full origin/referer URL. */
|
|
35
|
+
function hostnameOf(value) {
|
|
36
|
+
const direct = value.includes('://') ? value : `http://${value}`;
|
|
37
|
+
try {
|
|
38
|
+
return new URL(direct).hostname;
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* True when the `Host` header names a loopback host. This is the anti-DNS-rebinding guard: a rebound
|
|
46
|
+
* page reaches us as a loopback *peer* but its browser still sends the attacker's original `Host`
|
|
47
|
+
* (`evil.com`), so a non-loopback Host means "not actually a local client" even when the socket is.
|
|
48
|
+
* Missing Host is untrusted — every real HTTP/1.1 client (incl. `reticle status`, the stdio proxy) sends it.
|
|
49
|
+
*/
|
|
50
|
+
export function isLoopbackHost(hostHeader) {
|
|
51
|
+
if (hostHeader === undefined)
|
|
52
|
+
return false;
|
|
53
|
+
const hostname = hostnameOf(hostHeader);
|
|
54
|
+
return hostname !== undefined && isLoopbackHostname(hostname);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* True when neither `Origin` nor `Referer` betrays a non-loopback web origin. Absent headers pass —
|
|
58
|
+
* non-browser local clients (the stdio MCP proxy, `reticle status`) send neither. Any present-but-
|
|
59
|
+
* non-loopback value fails, which is what kills a rebound `http://evil.com` page reading the plane.
|
|
60
|
+
*/
|
|
61
|
+
export function isLocalWebOrigin(origin, referer) {
|
|
62
|
+
for (const value of [origin, referer]) {
|
|
63
|
+
if (value === undefined)
|
|
64
|
+
continue;
|
|
65
|
+
const hostname = hostnameOf(value);
|
|
66
|
+
if (hostname === undefined || !isLoopbackHostname(hostname))
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=token-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-auth.js","sourceRoot":"","sources":["../src/token-auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD,8GAA8G;AAC9G,MAAM,aAAa,GAAG,SAAS,CAAC;AAChC,MAAM,iBAAiB,GAAG,OAAO,CAAC;AAClC,4GAA4G;AAC5G,MAAM,kBAAkB,GAAG,WAAW,CAAC;AAEvC;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,QAAgB,EAAE,QAA4B;IACxE,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACzC,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5C,OAAO,CACL,aAAa,CAAC,MAAM,KAAK,aAAa,CAAC,MAAM,IAAI,eAAe,CAAC,aAAa,EAAE,aAAa,CAAC,CAC/F,CAAC;AACJ,CAAC;AAED,2GAA2G;AAC3G,MAAM,UAAU,YAAY,CAAC,GAAoB,EAAE,GAAQ;IACzD,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC;IACzC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC7D,OAAO,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAC5C,CAAC;IACD,MAAM,UAAU,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC3D,OAAO,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;AACtD,CAAC;AAED,mGAAmG;AACnG,MAAM,UAAU,cAAc,CAAC,aAAiC;IAC9D,IAAI,aAAa,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAC9C,OAAO,kBAAkB,CAAC,aAAa,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3E,CAAC;AAED,gGAAgG;AAChG,SAAS,UAAU,CAAC,KAAa;IAC/B,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,KAAK,EAAE,CAAC;IACjE,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,UAA8B;IAC3D,IAAI,UAAU,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAC3C,MAAM,QAAQ,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IACxC,OAAO,QAAQ,KAAK,SAAS,IAAI,kBAAkB,CAAC,QAAQ,CAAC,CAAC;AAChE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAA0B,EAAE,OAA2B;IACtF,KAAK,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;QACtC,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAClC,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC;YAAE,OAAO,KAAK,CAAC;IAC5E,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"act-tools.d.ts","sourceRoot":"","sources":["../../src/tools/act-tools.ts"],"names":[],"mappings":"AA0BA,OAAO,EAAE,KAAK,OAAO,EAAiD,MAAM,eAAe,CAAC;AAgI5F,eAAO,MAAM,SAAS,EAAE,OAAO,EA0O9B,CAAC"}
|