@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,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enterprise license-key verification + the assertEnterprise gate. ENTERPRISE CODE (Reticle Enterprise
|
|
3
|
+
* License — see ./LICENSE), not the FSL that covers the rest of the server.
|
|
4
|
+
*
|
|
5
|
+
* Offline + no phone-home (preserves the no-telemetry brand): a key is a signed payload Reticle issues
|
|
6
|
+
* with its private key; this verifies it against the issuer's PUBLIC key with Ed25519. Dev/eval is a
|
|
7
|
+
* no-op (requireLicense:false) so the gate never gets in a contributor's way; only a production-mode
|
|
8
|
+
* caller with requireLicense:true must present a valid, unexpired key. The clock is injected (rule 7).
|
|
9
|
+
*
|
|
10
|
+
* Rules for this directory: the free server must never import from ee/; ee/ depends only on protocol +
|
|
11
|
+
* node + zod. This file imports neither server core nor any sibling outside ee/.
|
|
12
|
+
*/
|
|
13
|
+
import { type KeyObject } from 'node:crypto';
|
|
14
|
+
import { z } from 'zod';
|
|
15
|
+
/** Outcome of verifying a license key. */
|
|
16
|
+
export declare const LicenseStatus: {
|
|
17
|
+
readonly VALID: "valid";
|
|
18
|
+
readonly MISSING: "missing";
|
|
19
|
+
readonly MALFORMED: "malformed";
|
|
20
|
+
readonly BAD_SIGNATURE: "bad-signature";
|
|
21
|
+
readonly EXPIRED: "expired";
|
|
22
|
+
};
|
|
23
|
+
export type LicenseStatus = (typeof LicenseStatus)[keyof typeof LicenseStatus];
|
|
24
|
+
/** The signed claims inside a key. `exp` is epoch ms; `features` (optional) scopes which ee features unlock. */
|
|
25
|
+
declare const LicensePayloadSchema: z.ZodObject<{
|
|
26
|
+
org: z.ZodString;
|
|
27
|
+
plan: z.ZodString;
|
|
28
|
+
exp: z.ZodNumber;
|
|
29
|
+
features: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
30
|
+
}, "strip", z.ZodTypeAny, {
|
|
31
|
+
org: string;
|
|
32
|
+
plan: string;
|
|
33
|
+
exp: number;
|
|
34
|
+
features?: string[] | undefined;
|
|
35
|
+
}, {
|
|
36
|
+
org: string;
|
|
37
|
+
plan: string;
|
|
38
|
+
exp: number;
|
|
39
|
+
features?: string[] | undefined;
|
|
40
|
+
}>;
|
|
41
|
+
export type LicensePayload = z.infer<typeof LicensePayloadSchema>;
|
|
42
|
+
type LicenseCheck = {
|
|
43
|
+
status: typeof LicenseStatus.VALID;
|
|
44
|
+
payload: LicensePayload;
|
|
45
|
+
} | {
|
|
46
|
+
status: Exclude<LicenseStatus, typeof LicenseStatus.VALID>;
|
|
47
|
+
};
|
|
48
|
+
/** Sign a payload into a license key — the ISSUER side (Reticle's private key). Exposed for the issuer tool + tests. */
|
|
49
|
+
export declare function signLicenseKey(payload: LicensePayload, privateKey: KeyObject): string;
|
|
50
|
+
/** Verify a key against the issuer public key. Never throws — returns a structured status. */
|
|
51
|
+
export declare function verifyLicenseKey(key: string | undefined, publicKey: KeyObject, now: number): LicenseCheck;
|
|
52
|
+
/** Thrown when a production-mode enterprise feature is used without a valid license. */
|
|
53
|
+
export declare class EnterpriseLicenseError extends Error {
|
|
54
|
+
readonly feature: string;
|
|
55
|
+
readonly reason: string;
|
|
56
|
+
constructor(feature: string, reason: string);
|
|
57
|
+
}
|
|
58
|
+
/** Context for the gate. requireLicense:false ⇒ dev/eval no-op. publicKey injectable for tests. */
|
|
59
|
+
export interface GateContext {
|
|
60
|
+
requireLicense: boolean;
|
|
61
|
+
now: () => number;
|
|
62
|
+
key?: string;
|
|
63
|
+
publicKey?: KeyObject;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Gate an enterprise feature. No-op in dev/eval (requireLicense:false). In production it throws
|
|
67
|
+
* EnterpriseLicenseError unless a valid, unexpired key that covers `feature` is present.
|
|
68
|
+
*/
|
|
69
|
+
export declare function assertEnterprise(feature: string, ctx: GateContext): void;
|
|
70
|
+
/** Env names that carry the activation: the operator's key, and the issuer public key baked at release. */
|
|
71
|
+
export declare const LICENSE_KEY_ENV = "RETICLE_LICENSE_KEY";
|
|
72
|
+
export declare const LICENSE_PUBLIC_KEY_ENV = "RETICLE_LICENSE_PUBLIC_KEY";
|
|
73
|
+
/**
|
|
74
|
+
* Issuer public key COMPILED INTO the build. Empty in the source tree; the release pipeline replaces
|
|
75
|
+
* this literal with the real spki PEM. Baking it (rather than only reading env) is what makes the
|
|
76
|
+
* enterprise gate fail closed: a self-hosted operator can no longer disable enforcement by simply
|
|
77
|
+
* never setting RETICLE_LICENSE_PUBLIC_KEY, because the baked key takes precedence. The public key is
|
|
78
|
+
* safe to ship openly — it can only verify licenses, never mint them (that needs the private key).
|
|
79
|
+
*/
|
|
80
|
+
export declare const BAKED_ISSUER_PUBLIC_KEY_PEM = "";
|
|
81
|
+
/**
|
|
82
|
+
* Resolve the issuer public-key PEM enforcement uses: the baked-in release key wins, so it can't be
|
|
83
|
+
* turned off from the environment. Only when nothing is baked (dev/repo) does the env var apply — that
|
|
84
|
+
* env path is the test/self-eval escape hatch, not the production switch.
|
|
85
|
+
*/
|
|
86
|
+
export declare function resolveIssuerPublicKeyPem(env: NodeJS.ProcessEnv, baked?: string): string | undefined;
|
|
87
|
+
/** The human-facing state of enterprise activation on this machine (what `reticle license status` shows). */
|
|
88
|
+
interface LicenseReport {
|
|
89
|
+
status: 'active' | 'missing' | 'invalid' | 'expired' | 'eval';
|
|
90
|
+
org?: string;
|
|
91
|
+
plan?: string;
|
|
92
|
+
expiresAt?: number;
|
|
93
|
+
features?: string[];
|
|
94
|
+
detail: string;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Resolve activation entirely from the environment — the install mechanism: the release bakes the
|
|
98
|
+
* issuer public key, the operator sets RETICLE_LICENSE_KEY. No public key configured ⇒ evaluation mode
|
|
99
|
+
* (enterprise features run free, dev/test only). Offline, no phone-home.
|
|
100
|
+
*/
|
|
101
|
+
export declare function describeLicense(now: number, env?: NodeJS.ProcessEnv, baked?: string): LicenseReport;
|
|
102
|
+
/**
|
|
103
|
+
* Gate an enterprise feature using env-resolved activation. Enforcement is ON only when the issuer
|
|
104
|
+
* public key is configured (i.e. a real release); without it (dev/repo) features run free in eval mode.
|
|
105
|
+
*/
|
|
106
|
+
export declare function assertEnterpriseFromEnv(feature: string, now: number, env?: NodeJS.ProcessEnv, baked?: string): void;
|
|
107
|
+
export {};
|
|
108
|
+
//# sourceMappingURL=license.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"license.d.ts","sourceRoot":"","sources":["../../src/license/license.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAuD,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAClG,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,0CAA0C;AAC1C,eAAO,MAAM,aAAa;;;;;;CAMhB,CAAC;AACX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,OAAO,aAAa,CAAC,CAAC;AAE/E,gHAAgH;AAChH,QAAA,MAAM,oBAAoB;;;;;;;;;;;;;;;EAKxB,CAAC;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,KAAK,YAAY,GACb;IAAE,MAAM,EAAE,OAAO,aAAa,CAAC,KAAK,CAAC;IAAC,OAAO,EAAE,cAAc,CAAA;CAAE,GAC/D;IAAE,MAAM,EAAE,OAAO,CAAC,aAAa,EAAE,OAAO,aAAa,CAAC,KAAK,CAAC,CAAA;CAAE,CAAC;AAKnE,wHAAwH;AACxH,wBAAgB,cAAc,CAAC,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,GAAG,MAAM,CAIrF;AAED,8FAA8F;AAC9F,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,MAAM,GACV,YAAY,CAqCd;AAED,wFAAwF;AACxF,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBACZ,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAQ5C;AAED,mGAAmG;AACnG,MAAM,WAAW,WAAW;IAC1B,cAAc,EAAE,OAAO,CAAC;IACxB,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAaD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAaxE;AAED,2GAA2G;AAC3G,eAAO,MAAM,eAAe,wBAAwB,CAAC;AACrD,eAAO,MAAM,sBAAsB,+BAA+B,CAAC;AAEnE;;;;;;GAMG;AACH,eAAO,MAAM,2BAA2B,KAAK,CAAC;AAE9C;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,KAAK,GAAE,MAAoC,GAC1C,MAAM,GAAG,SAAS,CAIpB;AAED,6GAA6G;AAC7G,UAAU,aAAa;IACrB,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;IAC9D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB;AAWD;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,EACX,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,KAAK,GAAE,MAAoC,GAC1C,aAAa,CAqCf;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,KAAK,GAAE,MAAoC,GAC1C,IAAI,CASN"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enterprise license-key verification + the assertEnterprise gate. ENTERPRISE CODE (Reticle Enterprise
|
|
3
|
+
* License — see ./LICENSE), not the FSL that covers the rest of the server.
|
|
4
|
+
*
|
|
5
|
+
* Offline + no phone-home (preserves the no-telemetry brand): a key is a signed payload Reticle issues
|
|
6
|
+
* with its private key; this verifies it against the issuer's PUBLIC key with Ed25519. Dev/eval is a
|
|
7
|
+
* no-op (requireLicense:false) so the gate never gets in a contributor's way; only a production-mode
|
|
8
|
+
* caller with requireLicense:true must present a valid, unexpired key. The clock is injected (rule 7).
|
|
9
|
+
*
|
|
10
|
+
* Rules for this directory: the free server must never import from ee/; ee/ depends only on protocol +
|
|
11
|
+
* node + zod. This file imports neither server core nor any sibling outside ee/.
|
|
12
|
+
*/
|
|
13
|
+
import { createPublicKey, sign as edSign, verify as edVerify } from 'node:crypto';
|
|
14
|
+
import { z } from 'zod';
|
|
15
|
+
/** Outcome of verifying a license key. */
|
|
16
|
+
export const LicenseStatus = {
|
|
17
|
+
VALID: 'valid',
|
|
18
|
+
MISSING: 'missing',
|
|
19
|
+
MALFORMED: 'malformed',
|
|
20
|
+
BAD_SIGNATURE: 'bad-signature',
|
|
21
|
+
EXPIRED: 'expired',
|
|
22
|
+
};
|
|
23
|
+
/** The signed claims inside a key. `exp` is epoch ms; `features` (optional) scopes which ee features unlock. */
|
|
24
|
+
const LicensePayloadSchema = z.object({
|
|
25
|
+
org: z.string(),
|
|
26
|
+
plan: z.string(),
|
|
27
|
+
exp: z.number(),
|
|
28
|
+
features: z.array(z.string()).optional(),
|
|
29
|
+
});
|
|
30
|
+
/** A key is `base64url(payloadJson).base64url(ed25519Signature)`. */
|
|
31
|
+
const KEY_SEP = '.';
|
|
32
|
+
/** Sign a payload into a license key — the ISSUER side (Reticle's private key). Exposed for the issuer tool + tests. */
|
|
33
|
+
export function signLicenseKey(payload, privateKey) {
|
|
34
|
+
const json = JSON.stringify(payload);
|
|
35
|
+
const sig = edSign(null, Buffer.from(json, 'utf8'), privateKey);
|
|
36
|
+
return `${Buffer.from(json, 'utf8').toString('base64url')}${KEY_SEP}${sig.toString('base64url')}`;
|
|
37
|
+
}
|
|
38
|
+
/** Verify a key against the issuer public key. Never throws — returns a structured status. */
|
|
39
|
+
export function verifyLicenseKey(key, publicKey, now) {
|
|
40
|
+
if (key === undefined || key.length === 0)
|
|
41
|
+
return { status: LicenseStatus.MISSING };
|
|
42
|
+
const parts = key.split(KEY_SEP);
|
|
43
|
+
if (parts.length !== 2 ||
|
|
44
|
+
parts[0] === undefined ||
|
|
45
|
+
parts[1] === undefined ||
|
|
46
|
+
parts[0].length === 0) {
|
|
47
|
+
return { status: LicenseStatus.MALFORMED };
|
|
48
|
+
}
|
|
49
|
+
let json;
|
|
50
|
+
let payload;
|
|
51
|
+
try {
|
|
52
|
+
json = Buffer.from(parts[0], 'base64url').toString('utf8');
|
|
53
|
+
const parsed = LicensePayloadSchema.safeParse(JSON.parse(json));
|
|
54
|
+
if (!parsed.success)
|
|
55
|
+
return { status: LicenseStatus.MALFORMED };
|
|
56
|
+
payload = parsed.data;
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return { status: LicenseStatus.MALFORMED };
|
|
60
|
+
}
|
|
61
|
+
let signatureOk = false;
|
|
62
|
+
try {
|
|
63
|
+
signatureOk = edVerify(null, Buffer.from(json, 'utf8'), publicKey, Buffer.from(parts[1], 'base64url'));
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return { status: LicenseStatus.BAD_SIGNATURE };
|
|
67
|
+
}
|
|
68
|
+
if (!signatureOk)
|
|
69
|
+
return { status: LicenseStatus.BAD_SIGNATURE };
|
|
70
|
+
if (payload.exp <= now)
|
|
71
|
+
return { status: LicenseStatus.EXPIRED };
|
|
72
|
+
return { status: LicenseStatus.VALID, payload };
|
|
73
|
+
}
|
|
74
|
+
/** Thrown when a production-mode enterprise feature is used without a valid license. */
|
|
75
|
+
export class EnterpriseLicenseError extends Error {
|
|
76
|
+
feature;
|
|
77
|
+
reason;
|
|
78
|
+
constructor(feature, reason) {
|
|
79
|
+
super(`Reticle Enterprise feature "${feature}" requires a valid license (${reason}). Contact hey@reticle.ai.`);
|
|
80
|
+
this.name = 'EnterpriseLicenseError';
|
|
81
|
+
this.feature = feature;
|
|
82
|
+
this.reason = reason;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/** The issuer public key from the environment (set at release / by the operator); undefined if unset. */
|
|
86
|
+
function issuerPublicKey() {
|
|
87
|
+
const pem = process.env['RETICLE_LICENSE_PUBLIC_KEY'];
|
|
88
|
+
if (pem === undefined || pem.length === 0)
|
|
89
|
+
return undefined;
|
|
90
|
+
try {
|
|
91
|
+
return createPublicKey(pem);
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
return undefined;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Gate an enterprise feature. No-op in dev/eval (requireLicense:false). In production it throws
|
|
99
|
+
* EnterpriseLicenseError unless a valid, unexpired key that covers `feature` is present.
|
|
100
|
+
*/
|
|
101
|
+
export function assertEnterprise(feature, ctx) {
|
|
102
|
+
if (!ctx.requireLicense)
|
|
103
|
+
return;
|
|
104
|
+
const publicKey = ctx.publicKey ?? issuerPublicKey();
|
|
105
|
+
if (publicKey === undefined)
|
|
106
|
+
throw new EnterpriseLicenseError(feature, 'no-issuer-key');
|
|
107
|
+
const check = verifyLicenseKey(ctx.key, publicKey, ctx.now());
|
|
108
|
+
if (check.status !== LicenseStatus.VALID)
|
|
109
|
+
throw new EnterpriseLicenseError(feature, check.status);
|
|
110
|
+
const { features } = check.payload;
|
|
111
|
+
if (features !== undefined && !features.includes(feature)) {
|
|
112
|
+
throw new EnterpriseLicenseError(feature, 'feature-not-licensed');
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/** Env names that carry the activation: the operator's key, and the issuer public key baked at release. */
|
|
116
|
+
export const LICENSE_KEY_ENV = 'RETICLE_LICENSE_KEY';
|
|
117
|
+
export const LICENSE_PUBLIC_KEY_ENV = 'RETICLE_LICENSE_PUBLIC_KEY';
|
|
118
|
+
/**
|
|
119
|
+
* Issuer public key COMPILED INTO the build. Empty in the source tree; the release pipeline replaces
|
|
120
|
+
* this literal with the real spki PEM. Baking it (rather than only reading env) is what makes the
|
|
121
|
+
* enterprise gate fail closed: a self-hosted operator can no longer disable enforcement by simply
|
|
122
|
+
* never setting RETICLE_LICENSE_PUBLIC_KEY, because the baked key takes precedence. The public key is
|
|
123
|
+
* safe to ship openly — it can only verify licenses, never mint them (that needs the private key).
|
|
124
|
+
*/
|
|
125
|
+
export const BAKED_ISSUER_PUBLIC_KEY_PEM = '';
|
|
126
|
+
/**
|
|
127
|
+
* Resolve the issuer public-key PEM enforcement uses: the baked-in release key wins, so it can't be
|
|
128
|
+
* turned off from the environment. Only when nothing is baked (dev/repo) does the env var apply — that
|
|
129
|
+
* env path is the test/self-eval escape hatch, not the production switch.
|
|
130
|
+
*/
|
|
131
|
+
export function resolveIssuerPublicKeyPem(env, baked = BAKED_ISSUER_PUBLIC_KEY_PEM) {
|
|
132
|
+
if (baked.length > 0)
|
|
133
|
+
return baked;
|
|
134
|
+
const envPem = env[LICENSE_PUBLIC_KEY_ENV];
|
|
135
|
+
return envPem !== undefined && envPem.length > 0 ? envPem : undefined;
|
|
136
|
+
}
|
|
137
|
+
function loadPublicKey(pem) {
|
|
138
|
+
if (pem === undefined || pem.length === 0)
|
|
139
|
+
return undefined;
|
|
140
|
+
try {
|
|
141
|
+
return createPublicKey(pem);
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
return undefined;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Resolve activation entirely from the environment — the install mechanism: the release bakes the
|
|
149
|
+
* issuer public key, the operator sets RETICLE_LICENSE_KEY. No public key configured ⇒ evaluation mode
|
|
150
|
+
* (enterprise features run free, dev/test only). Offline, no phone-home.
|
|
151
|
+
*/
|
|
152
|
+
export function describeLicense(now, env = process.env, baked = BAKED_ISSUER_PUBLIC_KEY_PEM) {
|
|
153
|
+
const pem = resolveIssuerPublicKeyPem(env, baked);
|
|
154
|
+
if (pem === undefined || pem.length === 0) {
|
|
155
|
+
return {
|
|
156
|
+
status: 'eval',
|
|
157
|
+
detail: 'evaluation mode — enterprise features run free (no issuer key configured)',
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
const publicKey = loadPublicKey(pem);
|
|
161
|
+
if (publicKey === undefined)
|
|
162
|
+
return { status: 'invalid', detail: `${LICENSE_PUBLIC_KEY_ENV} is not a valid public key` };
|
|
163
|
+
const check = verifyLicenseKey(env[LICENSE_KEY_ENV], publicKey, now);
|
|
164
|
+
if (check.status === LicenseStatus.VALID) {
|
|
165
|
+
const { org, plan, exp, features } = check.payload;
|
|
166
|
+
return {
|
|
167
|
+
status: 'active',
|
|
168
|
+
org,
|
|
169
|
+
plan,
|
|
170
|
+
expiresAt: exp,
|
|
171
|
+
...(features !== undefined ? { features } : {}),
|
|
172
|
+
detail: `licensed to ${org} (${plan}), expires ${new Date(exp).toISOString()}`,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
if (check.status === LicenseStatus.MISSING) {
|
|
176
|
+
return {
|
|
177
|
+
status: 'missing',
|
|
178
|
+
detail: `set ${LICENSE_KEY_ENV} to activate enterprise features in production`,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
if (check.status === LicenseStatus.EXPIRED) {
|
|
182
|
+
return {
|
|
183
|
+
status: 'expired',
|
|
184
|
+
detail: 'license expired — renew to keep using enterprise features',
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
return { status: 'invalid', detail: `license key rejected (${check.status})` };
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Gate an enterprise feature using env-resolved activation. Enforcement is ON only when the issuer
|
|
191
|
+
* public key is configured (i.e. a real release); without it (dev/repo) features run free in eval mode.
|
|
192
|
+
*/
|
|
193
|
+
export function assertEnterpriseFromEnv(feature, now, env = process.env, baked = BAKED_ISSUER_PUBLIC_KEY_PEM) {
|
|
194
|
+
const publicKey = loadPublicKey(resolveIssuerPublicKeyPem(env, baked));
|
|
195
|
+
const key = env[LICENSE_KEY_ENV];
|
|
196
|
+
assertEnterprise(feature, {
|
|
197
|
+
requireLicense: publicKey !== undefined,
|
|
198
|
+
now: () => now,
|
|
199
|
+
...(key !== undefined ? { key } : {}),
|
|
200
|
+
...(publicKey !== undefined ? { publicKey } : {}),
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=license.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"license.js","sourceRoot":"","sources":["../../src/license/license.ts"],"names":[],"mappings":"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"}
|
package/dist/log.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../src/log.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,IAAI,CAG7E"}
|
package/dist/log.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured logging to stderr. stdout is reserved for the MCP stdio transport — never
|
|
3
|
+
* write logs there.
|
|
4
|
+
*/
|
|
5
|
+
export function log(event, fields = {}) {
|
|
6
|
+
const line = JSON.stringify({ event, ...fields });
|
|
7
|
+
process.stderr.write(`${line}\n`);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=log.js.map
|
package/dist/log.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log.js","sourceRoot":"","sources":["../src/log.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,GAAG,CAAC,KAAa,EAAE,SAAkC,EAAE;IACrE,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;IAClD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns true if something is already listening on the reticle port.
|
|
3
|
+
* Uses a plain TCP probe so we don't create a side-effectful SSE session
|
|
4
|
+
* inside the daemon just to check reachability.
|
|
5
|
+
*/
|
|
6
|
+
export declare function probeDaemon(port: number): Promise<boolean>;
|
|
7
|
+
/** Poll until the daemon's HTTP port accepts connections or the deadline is reached. */
|
|
8
|
+
export declare function waitForDaemon(port: number): Promise<void>;
|
|
9
|
+
/**
|
|
10
|
+
* Bridge stdio ↔ SSE: connects to the running daemon's MCP endpoint and forwards
|
|
11
|
+
* Claude Code's stdin/stdout JSON-RPC through it. Never resolves — runs until
|
|
12
|
+
* stdin closes or the SSE stream ends (at which point the process exits so
|
|
13
|
+
* Claude Code restarts the proxy fresh).
|
|
14
|
+
*/
|
|
15
|
+
export declare function startMcpProxy(port: number): Promise<never>;
|
|
16
|
+
//# sourceMappingURL=mcp-proxy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-proxy.d.ts","sourceRoot":"","sources":["../src/mcp-proxy.ts"],"names":[],"mappings":"AAuBA;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAe1D;AAED,wFAAwF;AACxF,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAU/D;AAiCD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAuF1D"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import * as http from 'node:http';
|
|
2
|
+
import * as net from 'node:net';
|
|
3
|
+
import { LOOPBACK_HOST } from '@reticlehq/core';
|
|
4
|
+
import { MCP_SSE_PATH } from './http-server.js';
|
|
5
|
+
import { log } from './log.js';
|
|
6
|
+
const DEFAULT_DAEMON_READY_TIMEOUT_MS = 10_000;
|
|
7
|
+
/**
|
|
8
|
+
* How long to wait for the spawned daemon's port to accept connections before giving up. The default
|
|
9
|
+
* suits a normal machine; a slow CI/VM (heavy headless-browser launch) can raise it via the
|
|
10
|
+
* RETICLE_DAEMON_READY_TIMEOUT_MS env var. Invalid/absent values fall back to the default.
|
|
11
|
+
*/
|
|
12
|
+
const envDaemonReadyTimeoutMs = Number(process.env['RETICLE_DAEMON_READY_TIMEOUT_MS']);
|
|
13
|
+
const DAEMON_READY_TIMEOUT_MS = Number.isFinite(envDaemonReadyTimeoutMs) && envDaemonReadyTimeoutMs > 0
|
|
14
|
+
? envDaemonReadyTimeoutMs
|
|
15
|
+
: DEFAULT_DAEMON_READY_TIMEOUT_MS;
|
|
16
|
+
const DAEMON_POLL_INTERVAL_MS = 100;
|
|
17
|
+
function delay(ms) {
|
|
18
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Returns true if something is already listening on the reticle port.
|
|
22
|
+
* Uses a plain TCP probe so we don't create a side-effectful SSE session
|
|
23
|
+
* inside the daemon just to check reachability.
|
|
24
|
+
*/
|
|
25
|
+
export function probeDaemon(port) {
|
|
26
|
+
return new Promise((resolve) => {
|
|
27
|
+
const socket = new net.Socket();
|
|
28
|
+
socket.setTimeout(500);
|
|
29
|
+
socket.on('connect', () => {
|
|
30
|
+
socket.destroy();
|
|
31
|
+
resolve(true);
|
|
32
|
+
});
|
|
33
|
+
socket.on('error', () => resolve(false));
|
|
34
|
+
socket.on('timeout', () => {
|
|
35
|
+
socket.destroy();
|
|
36
|
+
resolve(false);
|
|
37
|
+
});
|
|
38
|
+
socket.connect(port, LOOPBACK_HOST);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
/** Poll until the daemon's HTTP port accepts connections or the deadline is reached. */
|
|
42
|
+
export async function waitForDaemon(port) {
|
|
43
|
+
const deadline = Date.now() + DAEMON_READY_TIMEOUT_MS;
|
|
44
|
+
while (Date.now() < deadline) {
|
|
45
|
+
const reachable = await probeDaemon(port);
|
|
46
|
+
if (reachable)
|
|
47
|
+
return;
|
|
48
|
+
await delay(DAEMON_POLL_INTERVAL_MS);
|
|
49
|
+
}
|
|
50
|
+
throw new Error(`reticle daemon did not become ready on port ${port} within ${DAEMON_READY_TIMEOUT_MS}ms`);
|
|
51
|
+
}
|
|
52
|
+
function postToSession(url, body) {
|
|
53
|
+
return new Promise((resolve) => {
|
|
54
|
+
const parsed = new URL(url);
|
|
55
|
+
const bodyBuf = Buffer.from(body, 'utf8');
|
|
56
|
+
const options = {
|
|
57
|
+
host: parsed.hostname,
|
|
58
|
+
port: parsed.port !== '' ? parseInt(parsed.port, 10) : 80,
|
|
59
|
+
path: `${parsed.pathname}${parsed.search}`,
|
|
60
|
+
method: 'POST',
|
|
61
|
+
headers: {
|
|
62
|
+
'Content-Type': 'application/json',
|
|
63
|
+
'Content-Length': bodyBuf.byteLength,
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
const req = http.request(options, (res) => {
|
|
67
|
+
res.resume(); // drain so the socket is reused
|
|
68
|
+
resolve();
|
|
69
|
+
});
|
|
70
|
+
req.on('error', (err) => {
|
|
71
|
+
log('reticle_mcp_proxy_post_error', { error: err.message });
|
|
72
|
+
resolve();
|
|
73
|
+
});
|
|
74
|
+
req.write(bodyBuf);
|
|
75
|
+
req.end();
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
function buildSessionUrl(rawData, port) {
|
|
79
|
+
return rawData.startsWith('/') ? `http://${LOOPBACK_HOST}:${port}${rawData}` : rawData;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Bridge stdio ↔ SSE: connects to the running daemon's MCP endpoint and forwards
|
|
83
|
+
* Claude Code's stdin/stdout JSON-RPC through it. Never resolves — runs until
|
|
84
|
+
* stdin closes or the SSE stream ends (at which point the process exits so
|
|
85
|
+
* Claude Code restarts the proxy fresh).
|
|
86
|
+
*/
|
|
87
|
+
export function startMcpProxy(port) {
|
|
88
|
+
return new Promise((_resolve, reject) => {
|
|
89
|
+
let postUrl = null;
|
|
90
|
+
const stdinQueue = [];
|
|
91
|
+
// ── SSE reader ──────────────────────────────────────────────────────────
|
|
92
|
+
const req = http.get({ host: LOOPBACK_HOST, port, path: MCP_SSE_PATH }, (res) => {
|
|
93
|
+
res.setEncoding('utf8');
|
|
94
|
+
let sseBuffer = '';
|
|
95
|
+
let currentEvent = '';
|
|
96
|
+
let currentData = '';
|
|
97
|
+
res.on('data', (chunk) => {
|
|
98
|
+
sseBuffer += chunk;
|
|
99
|
+
// Normalise CRLF/CR so the line splitter only needs to handle \n
|
|
100
|
+
const normalised = sseBuffer.replace(/\r\n/g, '\n').replace(/\r/g, '\n');
|
|
101
|
+
const lines = normalised.split('\n');
|
|
102
|
+
sseBuffer = lines.pop() ?? '';
|
|
103
|
+
for (const line of lines) {
|
|
104
|
+
if (line === '') {
|
|
105
|
+
// Blank line → dispatch accumulated event
|
|
106
|
+
if (currentData !== '') {
|
|
107
|
+
onSseEvent(currentEvent !== '' ? currentEvent : 'message', currentData, port);
|
|
108
|
+
}
|
|
109
|
+
currentEvent = '';
|
|
110
|
+
currentData = '';
|
|
111
|
+
}
|
|
112
|
+
else if (line.startsWith('event:')) {
|
|
113
|
+
currentEvent = line.slice(6).trim();
|
|
114
|
+
}
|
|
115
|
+
else if (line.startsWith('data:')) {
|
|
116
|
+
const val = line.slice(5).trim();
|
|
117
|
+
currentData = currentData !== '' ? `${currentData}\n${val}` : val;
|
|
118
|
+
}
|
|
119
|
+
// id:/retry:/comment lines are ignored — not needed for the MCP bridge
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
res.on('end', () => {
|
|
123
|
+
log('reticle_mcp_proxy_sse_ended', { port });
|
|
124
|
+
process.exit(0);
|
|
125
|
+
});
|
|
126
|
+
res.on('error', (err) => {
|
|
127
|
+
log('reticle_mcp_proxy_sse_error', { error: err.message });
|
|
128
|
+
process.exit(1);
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
req.on('error', (err) => reject(err));
|
|
132
|
+
function onSseEvent(event, data, p) {
|
|
133
|
+
if (event === 'endpoint') {
|
|
134
|
+
const url = buildSessionUrl(data, p);
|
|
135
|
+
postUrl = url;
|
|
136
|
+
// Flush messages that arrived before the session URL was known
|
|
137
|
+
for (const queued of stdinQueue.splice(0)) {
|
|
138
|
+
void postToSession(url, queued);
|
|
139
|
+
}
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
if (event === 'message') {
|
|
143
|
+
process.stdout.write(`${data}\n`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
// ── stdin reader ─────────────────────────────────────────────────────────
|
|
147
|
+
process.stdin.setEncoding('utf8');
|
|
148
|
+
let stdinBuffer = '';
|
|
149
|
+
process.stdin.on('data', (chunk) => {
|
|
150
|
+
stdinBuffer += chunk;
|
|
151
|
+
const lines = stdinBuffer.split('\n');
|
|
152
|
+
stdinBuffer = lines.pop() ?? '';
|
|
153
|
+
for (const line of lines) {
|
|
154
|
+
const trimmed = line.trim();
|
|
155
|
+
if (trimmed === '')
|
|
156
|
+
continue;
|
|
157
|
+
if (postUrl === null) {
|
|
158
|
+
stdinQueue.push(trimmed);
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
void postToSession(postUrl, trimmed);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
process.stdin.on('end', () => process.exit(0));
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=mcp-proxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-proxy.js","sourceRoot":"","sources":["../src/mcp-proxy.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { type ToolDeps } from './tools/tools.js';
|
|
3
|
+
import { type ToolProfile } from './tools/profiles.js';
|
|
4
|
+
/**
|
|
5
|
+
* Serialize a tool result to the MCP `text` content block. The agent consumes this text — the
|
|
6
|
+
* typed contract travels separately as `structuredContent`, unchanged by encoding — so the text
|
|
7
|
+
* is compact JSON (no indentation) by default: pretty-printing spends a whitespace token on every
|
|
8
|
+
* field of every line, ~40% overhead on the structured payloads that dominate Reticle's cost, for
|
|
9
|
+
* readability only a human re-reading a raw transcript would notice. Opt into the older indented
|
|
10
|
+
* form with `RETICLE_ENCODING=pretty`; `RETICLE_ENCODING=toon` is the even-denser tabular encoding.
|
|
11
|
+
*/
|
|
12
|
+
export declare function encodeResult(result: unknown, encoding: string): string;
|
|
13
|
+
export declare function createMcpServer(deps: ToolDeps, profile?: ToolProfile): McpServer;
|
|
14
|
+
//# sourceMappingURL=mcp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,OAAO,EAAS,KAAK,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAA6B,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAwClF;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAKtE;AAuBD,wBAAgB,eAAe,CAC7B,IAAI,EAAE,QAAQ,EACd,OAAO,GAAE,WAAiC,GACzC,SAAS,CAgDX"}
|