@reticlehq/server 2.2.0 → 2.3.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/README.md +1 -1
- package/dist/bridge-security.d.ts +0 -1
- package/dist/bridge-security.js +0 -1
- package/dist/bridge.d.ts +0 -1
- package/dist/bridge.js +60 -10
- package/dist/bridge.test-harness.d.ts +0 -1
- package/dist/bridge.test-harness.js +0 -1
- package/dist/capsule/capsule-store.d.ts +2 -3
- package/dist/capsule/capsule-store.js +0 -1
- package/dist/capsule/capsule.d.ts +0 -1
- package/dist/capsule/capsule.js +0 -1
- package/dist/capsule/causal-summary.d.ts +21 -1
- package/dist/capsule/causal-summary.js +20 -2
- package/dist/capsule/divergence.d.ts +0 -1
- package/dist/capsule/divergence.js +0 -1
- package/dist/capsule/minimize.d.ts +0 -1
- package/dist/capsule/minimize.js +0 -1
- package/dist/capsule/predicate-to-links.d.ts +0 -1
- package/dist/capsule/predicate-to-links.js +0 -1
- package/dist/cli-doctor.d.ts +6 -0
- package/dist/cli-doctor.js +60 -0
- package/dist/cli-flow-commands.d.ts +0 -1
- package/dist/cli-flow-commands.js +0 -1
- package/dist/cli-launch.d.ts +0 -1
- package/dist/cli-launch.js +7 -3
- package/dist/cli-parse.d.ts +52 -2
- package/dist/cli-parse.js +147 -3
- package/dist/cli-port.d.ts +0 -1
- package/dist/cli-port.js +0 -1
- package/dist/cli-verify.d.ts +2 -1
- package/dist/cli-verify.js +24 -3
- package/dist/cli.d.ts +2 -4
- package/dist/cli.js +109 -10
- package/dist/cloud/cloud-config.d.ts +36 -0
- package/dist/cloud/cloud-config.js +86 -0
- package/dist/cloud/cloud-sync.d.ts +96 -4
- package/dist/cloud/cloud-sync.js +131 -3
- package/dist/cloud-cli.d.ts +3 -0
- package/dist/cloud-cli.js +514 -0
- package/dist/crawl/crawl-tools.d.ts +0 -1
- package/dist/crawl/crawl-tools.js +1 -2
- package/dist/crawl/crawl.d.ts +17 -3
- package/dist/crawl/crawl.js +43 -4
- package/dist/daemon-resilience.d.ts +6 -1
- package/dist/daemon-resilience.js +63 -1
- package/dist/daemon.d.ts +23 -3
- package/dist/daemon.js +78 -21
- package/dist/domain/domain-model.d.ts +0 -1
- package/dist/domain/domain-model.js +1 -2
- package/dist/domain/domain-tools.d.ts +0 -7
- package/dist/domain/domain-tools.js +21 -4
- package/dist/domain/flow-risk.d.ts +0 -1
- package/dist/domain/flow-risk.js +0 -1
- package/dist/ee/audit-log.d.ts +0 -1
- package/dist/ee/audit-log.js +0 -1
- package/dist/events/body-failures.d.ts +4 -0
- package/dist/events/body-failures.js +113 -0
- package/dist/events/contradictions.d.ts +53 -0
- package/dist/events/contradictions.js +282 -0
- package/dist/events/echo-mismatch.d.ts +4 -0
- package/dist/events/echo-mismatch.js +138 -0
- package/dist/events/event-filters.d.ts +17 -3
- package/dist/events/event-filters.js +13 -3
- package/dist/events/json-salvage.d.ts +32 -0
- package/dist/events/json-salvage.js +96 -0
- package/dist/events/predicate-eval.d.ts +2 -1
- package/dist/events/predicate-eval.js +56 -9
- package/dist/events/predicate.d.ts +0 -1
- package/dist/events/predicate.js +56 -2
- package/dist/events/reaction.d.ts +0 -1
- package/dist/events/reaction.js +0 -1
- package/dist/events/reconcile.d.ts +39 -0
- package/dist/events/reconcile.js +211 -0
- package/dist/events/ring-buffer.d.ts +0 -1
- package/dist/events/ring-buffer.js +0 -1
- package/dist/events/stale-response.d.ts +4 -0
- package/dist/events/stale-response.js +139 -0
- package/dist/events/unit-mismatch.d.ts +16 -0
- package/dist/events/unit-mismatch.js +167 -0
- package/dist/flows/affected-tools.d.ts +18 -0
- package/dist/flows/affected-tools.js +52 -0
- package/dist/flows/affected.d.ts +0 -1
- package/dist/flows/affected.js +0 -1
- package/dist/flows/annotate-tools.d.ts +0 -1
- package/dist/flows/annotate-tools.js +21 -3
- package/dist/flows/annotate.d.ts +0 -1
- package/dist/flows/annotate.js +0 -1
- package/dist/flows/annotation-store.d.ts +0 -1
- package/dist/flows/annotation-store.js +0 -1
- package/dist/flows/assertion-integrity.d.ts +0 -1
- package/dist/flows/assertion-integrity.js +0 -1
- package/dist/flows/assertion-tiers-store.d.ts +0 -1
- package/dist/flows/assertion-tiers-store.js +0 -1
- package/dist/flows/buddy-status.d.ts +0 -1
- package/dist/flows/buddy-status.js +0 -1
- package/dist/flows/coverage.d.ts +0 -1
- package/dist/flows/coverage.js +0 -1
- package/dist/flows/decision.d.ts +0 -1
- package/dist/flows/decision.js +0 -1
- package/dist/flows/flake-store.d.ts +0 -1
- package/dist/flows/flake-store.js +0 -1
- package/dist/flows/flake.d.ts +0 -1
- package/dist/flows/flake.js +0 -1
- package/dist/flows/flow-classify.d.ts +0 -1
- package/dist/flows/flow-classify.js +0 -1
- package/dist/flows/flow-replay-run.d.ts +0 -1
- package/dist/flows/flow-replay-run.js +24 -8
- package/dist/flows/flow-replay.d.ts +20 -4
- package/dist/flows/flow-replay.js +9 -43
- package/dist/flows/flow-report.d.ts +0 -1
- package/dist/flows/flow-report.js +0 -1
- package/dist/flows/flow-scope.d.ts +0 -1
- package/dist/flows/flow-scope.js +0 -1
- package/dist/flows/flow-sources.d.ts +0 -1
- package/dist/flows/flow-sources.js +0 -1
- package/dist/flows/flow-step-runners.d.ts +23 -0
- package/dist/flows/flow-step-runners.js +102 -0
- package/dist/flows/flow-success.d.ts +0 -1
- package/dist/flows/flow-success.js +0 -1
- package/dist/flows/flow-tools.d.ts +0 -1
- package/dist/flows/flow-tools.js +54 -16
- package/dist/flows/flows.d.ts +6 -2
- package/dist/flows/flows.js +15 -2
- package/dist/flows/gate.d.ts +0 -1
- package/dist/flows/gate.js +0 -1
- package/dist/flows/git-changed.d.ts +0 -1
- package/dist/flows/git-changed.js +0 -1
- package/dist/flows/heal-run.d.ts +0 -1
- package/dist/flows/heal-run.js +0 -1
- package/dist/flows/heal.d.ts +0 -1
- package/dist/flows/heal.js +0 -1
- package/dist/flows/parallel-suite.d.ts +0 -1
- package/dist/flows/parallel-suite.js +0 -1
- package/dist/flows/recordings.d.ts +0 -1
- package/dist/flows/recordings.js +0 -1
- package/dist/flows/replay.d.ts +0 -1
- package/dist/flows/replay.js +71 -4
- package/dist/flows/server-verify.d.ts +15 -0
- package/dist/flows/server-verify.js +42 -0
- package/dist/flows/verify-change-tools.d.ts +2 -0
- package/dist/flows/verify-change-tools.js +187 -0
- package/dist/flows/watch-batcher.d.ts +0 -1
- package/dist/flows/watch-batcher.js +0 -1
- package/dist/honesty/accepted-write.d.ts +14 -0
- package/dist/honesty/accepted-write.js +17 -0
- package/dist/honesty/blind-spots.d.ts +18 -1
- package/dist/honesty/blind-spots.js +47 -5
- package/dist/honesty/honesty.d.ts +0 -1
- package/dist/honesty/honesty.js +0 -1
- package/dist/honesty/uncaptured-bodies.d.ts +19 -0
- package/dist/honesty/uncaptured-bodies.js +30 -0
- package/dist/honesty/unread-outcome.d.ts +2 -0
- package/dist/honesty/unread-outcome.js +50 -0
- package/dist/honesty/verified.d.ts +40 -0
- package/dist/honesty/verified.js +86 -0
- package/dist/http-server.d.ts +0 -1
- package/dist/http-server.js +5 -1
- package/dist/hunt/hunt-report.d.ts +50 -0
- package/dist/hunt/hunt-report.js +84 -0
- package/dist/idle-shutdown.d.ts +0 -1
- package/dist/idle-shutdown.js +0 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.js +0 -1
- package/dist/init/agent-rules.d.ts +0 -1
- package/dist/init/agent-rules.js +4 -2
- package/dist/init/cursor.d.ts +0 -1
- package/dist/init/cursor.js +0 -1
- package/dist/init/desktop-doctor.d.ts +40 -0
- package/dist/init/desktop-doctor.js +198 -0
- package/dist/init/detect.d.ts +0 -1
- package/dist/init/detect.js +0 -1
- package/dist/init/mcp.d.ts +0 -1
- package/dist/init/mcp.js +0 -1
- package/dist/init/node-io.d.ts +0 -1
- package/dist/init/node-io.js +0 -1
- package/dist/init/plan.d.ts +4 -1
- package/dist/init/plan.js +23 -5
- package/dist/init/project-id.d.ts +0 -1
- package/dist/init/project-id.js +0 -1
- package/dist/init/run.d.ts +0 -1
- package/dist/init/run.js +31 -3
- package/dist/init/snippets.d.ts +5 -1
- package/dist/init/snippets.js +5 -1
- package/dist/init/vite-config.d.ts +0 -1
- package/dist/init/vite-config.js +0 -1
- package/dist/input/network-detail.d.ts +0 -1
- package/dist/input/network-detail.js +0 -1
- package/dist/input/network-mock-tools.d.ts +0 -1
- package/dist/input/network-mock-tools.js +3 -4
- package/dist/input/network-mock.d.ts +0 -1
- package/dist/input/network-mock.js +0 -1
- package/dist/input/real-input.d.ts +14 -1
- package/dist/input/real-input.js +45 -3
- package/dist/input/scroll-find.d.ts +0 -1
- package/dist/input/scroll-find.js +0 -1
- package/dist/input/scroll-tools.d.ts +0 -1
- package/dist/input/scroll-tools.js +0 -1
- package/dist/input/viewport-tools.d.ts +0 -1
- package/dist/input/viewport-tools.js +3 -4
- package/dist/journal/ambient-store.d.ts +0 -1
- package/dist/journal/ambient-store.js +0 -1
- package/dist/journal/ambient.d.ts +0 -1
- package/dist/journal/ambient.js +0 -1
- package/dist/journal/attach-journal.d.ts +0 -1
- package/dist/journal/attach-journal.js +0 -1
- package/dist/journal/deviation-report.d.ts +0 -1
- package/dist/journal/deviation-report.js +0 -1
- package/dist/journal/deviation-service.d.ts +0 -1
- package/dist/journal/deviation-service.js +0 -1
- package/dist/journal/envelope-store.d.ts +0 -1
- package/dist/journal/envelope-store.js +0 -1
- package/dist/journal/envelope.d.ts +8 -9
- package/dist/journal/envelope.js +0 -1
- package/dist/journal/journal-query.d.ts +0 -1
- package/dist/journal/journal-query.js +0 -1
- package/dist/journal/journal-recorder.d.ts +0 -1
- package/dist/journal/journal-recorder.js +0 -1
- package/dist/journal/retention.d.ts +0 -1
- package/dist/journal/retention.js +0 -1
- package/dist/journal/rollups.d.ts +0 -1
- package/dist/journal/rollups.js +0 -1
- package/dist/journal/session-end.d.ts +0 -1
- package/dist/journal/session-end.js +0 -1
- package/dist/journal/session-journal.d.ts +0 -1
- package/dist/journal/session-journal.js +0 -1
- package/dist/license/license.d.ts +0 -1
- package/dist/license/license.js +0 -1
- package/dist/log.d.ts +0 -1
- package/dist/log.js +0 -1
- package/dist/mcp-proxy.d.ts +0 -1
- package/dist/mcp-proxy.js +0 -1
- package/dist/mcp.d.ts +15 -1
- package/dist/mcp.js +145 -17
- package/dist/oracles/flow-instrument-gaps.d.ts +0 -1
- package/dist/oracles/flow-instrument-gaps.js +0 -1
- package/dist/oracles/propose-consequences.d.ts +0 -1
- package/dist/oracles/propose-consequences.js +0 -1
- package/dist/oracles/self-instrument.d.ts +0 -1
- package/dist/oracles/self-instrument.js +0 -1
- package/dist/pairing-token.d.ts +0 -1
- package/dist/pairing-token.js +0 -1
- package/dist/phenomena/phenomena.d.ts +0 -1
- package/dist/phenomena/phenomena.js +0 -1
- package/dist/pool/browser-pool.d.ts +0 -1
- package/dist/pool/browser-pool.js +0 -1
- package/dist/pool/lease-reaper.d.ts +0 -1
- package/dist/pool/lease-reaper.js +0 -1
- package/dist/pool/playwright-launcher.d.ts +2 -1
- package/dist/pool/playwright-launcher.js +22 -2
- package/dist/project/baselines.d.ts +0 -1
- package/dist/project/baselines.js +5 -4
- package/dist/project/file-lock.d.ts +2 -1
- package/dist/project/file-lock.js +12 -2
- package/dist/project/fs-port.d.ts +0 -1
- package/dist/project/fs-port.js +0 -1
- package/dist/project/project-store.d.ts +0 -1
- package/dist/project/project-store.js +20 -9
- package/dist/project/project-tools.d.ts +0 -1
- package/dist/project/project-tools.js +57 -9
- package/dist/project/reticle-dir.d.ts +0 -1
- package/dist/project/reticle-dir.js +0 -1
- package/dist/runs/build-verification-run.d.ts +0 -1
- package/dist/runs/build-verification-run.js +0 -1
- package/dist/runs/profile-redact.d.ts +0 -1
- package/dist/runs/profile-redact.js +0 -1
- package/dist/runs/render-report.d.ts +0 -1
- package/dist/runs/render-report.js +0 -1
- package/dist/runs/repair-prompt.d.ts +0 -1
- package/dist/runs/repair-prompt.js +0 -1
- package/dist/runs/replay-mapping.d.ts +0 -1
- package/dist/runs/replay-mapping.js +0 -1
- package/dist/runs/reticle-runner.d.ts +0 -1
- package/dist/runs/reticle-runner.js +4 -2
- package/dist/runs/risk-classify.d.ts +0 -1
- package/dist/runs/risk-classify.js +0 -1
- package/dist/runs/run-diff.d.ts +0 -1
- package/dist/runs/run-diff.js +0 -1
- package/dist/runs/run-store.d.ts +0 -1
- package/dist/runs/run-store.js +0 -1
- package/dist/runs/run-tools.d.ts +0 -1
- package/dist/runs/run-tools.js +0 -1
- package/dist/runs/runner-port.d.ts +0 -1
- package/dist/runs/runner-port.js +0 -1
- package/dist/runs/verification-sync.d.ts +23 -0
- package/dist/runs/verification-sync.js +66 -0
- package/dist/runs/verify-http.d.ts +0 -1
- package/dist/runs/verify-http.js +0 -1
- package/dist/runs/verify-server.d.ts +0 -1
- package/dist/runs/verify-server.js +0 -1
- package/dist/server-version.d.ts +0 -1
- package/dist/server-version.js +0 -1
- package/dist/session/command-timeout.d.ts +35 -0
- package/dist/session/command-timeout.js +41 -0
- package/dist/session/control-envelope.d.ts +2 -3
- package/dist/session/control-envelope.js +2 -3
- package/dist/session/last-act.d.ts +31 -0
- package/dist/session/last-act.js +24 -0
- package/dist/session/live-control-tools.d.ts +0 -1
- package/dist/session/live-control-tools.js +3 -4
- package/dist/session/live-control.d.ts +0 -1
- package/dist/session/live-control.js +0 -1
- package/dist/session/observed-state.d.ts +12 -2
- package/dist/session/observed-state.js +29 -2
- package/dist/session/output-budget.d.ts +0 -1
- package/dist/session/output-budget.js +0 -1
- package/dist/session/pending-commands.d.ts +12 -0
- package/dist/session/pending-commands.js +36 -0
- package/dist/session/presenter-args.d.ts +0 -1
- package/dist/session/presenter-args.js +0 -1
- package/dist/session/review-store.d.ts +0 -1
- package/dist/session/review-store.js +0 -1
- package/dist/session/session-health.d.ts +26 -2
- package/dist/session/session-health.js +13 -1
- package/dist/session/session-info.d.ts +29 -0
- package/dist/session/session-info.js +1 -0
- package/dist/session/session-lease.d.ts +25 -0
- package/dist/session/session-lease.js +14 -0
- package/dist/session/session-manager.d.ts +7 -19
- package/dist/session/session-manager.js +29 -2
- package/dist/session/session-readiness.d.ts +0 -1
- package/dist/session/session-readiness.js +3 -4
- package/dist/session/session-reaper.d.ts +0 -1
- package/dist/session/session-reaper.js +0 -1
- package/dist/session/session-recommendation.d.ts +0 -1
- package/dist/session/session-recommendation.js +0 -1
- package/dist/session/session-tools.d.ts +0 -1
- package/dist/session/session-tools.js +2 -3
- package/dist/session/session.d.ts +27 -53
- package/dist/session/session.js +95 -66
- package/dist/session/state-select.d.ts +0 -1
- package/dist/session/state-select.js +0 -1
- package/dist/telemetry/argument-shape.d.ts +41 -0
- package/dist/telemetry/argument-shape.js +87 -0
- package/dist/telemetry/bug-found.d.ts +33 -0
- package/dist/telemetry/bug-found.js +95 -0
- package/dist/telemetry/cli-telemetry.d.ts +13 -0
- package/dist/telemetry/cli-telemetry.js +43 -0
- package/dist/telemetry/connect-failure.d.ts +16 -0
- package/dist/telemetry/connect-failure.js +44 -0
- package/dist/telemetry/daemon-telemetry.d.ts +19 -0
- package/dist/telemetry/daemon-telemetry.js +76 -0
- package/dist/telemetry/dev-repo.d.ts +10 -0
- package/dist/telemetry/dev-repo.js +80 -0
- package/dist/telemetry/error-fingerprint.d.ts +24 -0
- package/dist/telemetry/error-fingerprint.js +88 -0
- package/dist/telemetry/feedback-cli.d.ts +31 -0
- package/dist/telemetry/feedback-cli.js +102 -0
- package/dist/telemetry/feedback-context.d.ts +32 -0
- package/dist/telemetry/feedback-context.js +143 -0
- package/dist/telemetry/feedback.d.ts +66 -0
- package/dist/telemetry/feedback.js +175 -0
- package/dist/telemetry/git-facts.d.ts +21 -0
- package/dist/telemetry/git-facts.js +109 -0
- package/dist/telemetry/identify.d.ts +22 -0
- package/dist/telemetry/identify.js +73 -0
- package/dist/telemetry/init-telemetry.d.ts +26 -0
- package/dist/telemetry/init-telemetry.js +33 -0
- package/dist/telemetry/machine-snapshot.d.ts +6 -0
- package/dist/telemetry/machine-snapshot.js +39 -0
- package/dist/telemetry/mcp-connection.d.ts +5 -0
- package/dist/telemetry/mcp-connection.js +44 -0
- package/dist/telemetry/project-profile.d.ts +44 -0
- package/dist/telemetry/project-profile.js +205 -0
- package/dist/telemetry/run-telemetry.d.ts +21 -0
- package/dist/telemetry/run-telemetry.js +62 -0
- package/dist/telemetry/session-metrics.d.ts +103 -0
- package/dist/telemetry/session-metrics.js +329 -0
- package/dist/telemetry/telemetry.d.ts +68 -0
- package/dist/telemetry/telemetry.js +313 -0
- package/dist/token-auth.d.ts +0 -1
- package/dist/token-auth.js +0 -1
- package/dist/tools/act-capsule.d.ts +23 -0
- package/dist/tools/act-capsule.js +47 -0
- package/dist/tools/act-danger.d.ts +7 -0
- package/dist/tools/act-danger.js +44 -0
- package/dist/tools/act-helpers.d.ts +17 -0
- package/dist/tools/act-helpers.js +40 -0
- package/dist/tools/act-tools.d.ts +8 -1
- package/dist/tools/act-tools.js +96 -98
- package/dist/tools/act-view.d.ts +7 -1
- package/dist/tools/act-view.js +13 -1
- package/dist/tools/assert-grade.d.ts +22 -1
- package/dist/tools/assert-grade.js +46 -1
- package/dist/tools/assert-verdict.d.ts +21 -0
- package/dist/tools/assert-verdict.js +62 -0
- package/dist/tools/browser-tools.d.ts +0 -1
- package/dist/tools/browser-tools.js +2 -2
- package/dist/tools/contract-tools.d.ts +0 -1
- package/dist/tools/contract-tools.js +0 -1
- package/dist/tools/coverage-tools.d.ts +9 -0
- package/dist/tools/coverage-tools.js +92 -0
- package/dist/tools/dynamic-tools.d.ts +0 -1
- package/dist/tools/dynamic-tools.js +21 -2
- package/dist/tools/error-recovery.d.ts +18 -2
- package/dist/tools/error-recovery.js +42 -7
- package/dist/tools/feedback-tools.d.ts +24 -0
- package/dist/tools/feedback-tools.js +180 -0
- package/dist/tools/invoke-tool.d.ts +0 -1
- package/dist/tools/invoke-tool.js +116 -2
- package/dist/tools/lease-tools.d.ts +0 -1
- package/dist/tools/lease-tools.js +6 -5
- package/dist/tools/merge-tools.d.ts +0 -1
- package/dist/tools/merge-tools.js +0 -1
- package/dist/tools/observe-tools.d.ts +0 -1
- package/dist/tools/observe-tools.js +91 -39
- package/dist/tools/profiles.d.ts +1 -2
- package/dist/tools/profiles.js +43 -16
- package/dist/tools/query-paginate.d.ts +0 -1
- package/dist/tools/query-paginate.js +0 -1
- package/dist/tools/read-tools.d.ts +0 -1
- package/dist/tools/read-tools.js +10 -8
- package/dist/tools/reconcile-tools.d.ts +2 -0
- package/dist/tools/reconcile-tools.js +111 -0
- package/dist/tools/snapshot-delta.d.ts +0 -1
- package/dist/tools/snapshot-delta.js +0 -0
- package/dist/tools/tool-invoker.d.ts +0 -1
- package/dist/tools/tool-invoker.js +0 -1
- package/dist/tools/tool-kit.d.ts +16 -1
- package/dist/tools/tool-kit.js +8 -2
- package/dist/tools/tool-names.d.ts +6 -1
- package/dist/tools/tool-names.js +6 -1
- package/dist/tools/tools-helpers.d.ts +0 -1
- package/dist/tools/tools-helpers.js +0 -1
- package/dist/tools/tools.d.ts +0 -1
- package/dist/tools/tools.js +24 -4
- package/dist/update/update-checker.d.ts +0 -1
- package/dist/update/update-checker.js +26 -2
- package/dist/update/update-nudge.d.ts +20 -0
- package/dist/update/update-nudge.js +72 -0
- package/dist/update/updater.d.ts +14 -1
- package/dist/update/updater.js +33 -2
- package/dist/visual/visual-diff.d.ts +0 -1
- package/dist/visual/visual-diff.js +0 -1
- package/dist/visual/visual-store.d.ts +0 -1
- package/dist/visual/visual-store.js +0 -1
- package/dist/visual/visual-tools.d.ts +0 -1
- package/dist/visual/visual-tools.js +103 -16
- package/package.json +2 -2
- package/dist/bridge-security.d.ts.map +0 -1
- package/dist/bridge-security.js.map +0 -1
- package/dist/bridge.d.ts.map +0 -1
- package/dist/bridge.js.map +0 -1
- package/dist/bridge.test-harness.d.ts.map +0 -1
- package/dist/bridge.test-harness.js.map +0 -1
- package/dist/capsule/capsule-store.d.ts.map +0 -1
- package/dist/capsule/capsule-store.js.map +0 -1
- package/dist/capsule/capsule.d.ts.map +0 -1
- package/dist/capsule/capsule.js.map +0 -1
- package/dist/capsule/causal-summary.d.ts.map +0 -1
- package/dist/capsule/causal-summary.js.map +0 -1
- package/dist/capsule/divergence.d.ts.map +0 -1
- package/dist/capsule/divergence.js.map +0 -1
- package/dist/capsule/minimize.d.ts.map +0 -1
- package/dist/capsule/minimize.js.map +0 -1
- package/dist/capsule/predicate-to-links.d.ts.map +0 -1
- package/dist/capsule/predicate-to-links.js.map +0 -1
- package/dist/cli-flow-commands.d.ts.map +0 -1
- package/dist/cli-flow-commands.js.map +0 -1
- package/dist/cli-launch.d.ts.map +0 -1
- package/dist/cli-launch.js.map +0 -1
- package/dist/cli-parse.d.ts.map +0 -1
- package/dist/cli-parse.js.map +0 -1
- package/dist/cli-port.d.ts.map +0 -1
- package/dist/cli-port.js.map +0 -1
- package/dist/cli-verify.d.ts.map +0 -1
- package/dist/cli-verify.js.map +0 -1
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/cloud/cloud-sync.d.ts.map +0 -1
- package/dist/cloud/cloud-sync.js.map +0 -1
- package/dist/crawl/crawl-tools.d.ts.map +0 -1
- package/dist/crawl/crawl-tools.js.map +0 -1
- package/dist/crawl/crawl.d.ts.map +0 -1
- package/dist/crawl/crawl.js.map +0 -1
- package/dist/daemon-resilience.d.ts.map +0 -1
- package/dist/daemon-resilience.js.map +0 -1
- package/dist/daemon.d.ts.map +0 -1
- package/dist/daemon.js.map +0 -1
- package/dist/domain/domain-model.d.ts.map +0 -1
- package/dist/domain/domain-model.js.map +0 -1
- package/dist/domain/domain-tools.d.ts.map +0 -1
- package/dist/domain/domain-tools.js.map +0 -1
- package/dist/domain/flow-risk.d.ts.map +0 -1
- package/dist/domain/flow-risk.js.map +0 -1
- package/dist/ee/audit-log.d.ts.map +0 -1
- package/dist/ee/audit-log.js.map +0 -1
- package/dist/events/event-filters.d.ts.map +0 -1
- package/dist/events/event-filters.js.map +0 -1
- package/dist/events/predicate-eval.d.ts.map +0 -1
- package/dist/events/predicate-eval.js.map +0 -1
- package/dist/events/predicate.d.ts.map +0 -1
- package/dist/events/predicate.js.map +0 -1
- package/dist/events/reaction.d.ts.map +0 -1
- package/dist/events/reaction.js.map +0 -1
- package/dist/events/ring-buffer.d.ts.map +0 -1
- package/dist/events/ring-buffer.js.map +0 -1
- package/dist/flows/affected.d.ts.map +0 -1
- package/dist/flows/affected.js.map +0 -1
- package/dist/flows/annotate-tools.d.ts.map +0 -1
- package/dist/flows/annotate-tools.js.map +0 -1
- package/dist/flows/annotate.d.ts.map +0 -1
- package/dist/flows/annotate.js.map +0 -1
- package/dist/flows/annotation-store.d.ts.map +0 -1
- package/dist/flows/annotation-store.js.map +0 -1
- package/dist/flows/assertion-integrity.d.ts.map +0 -1
- package/dist/flows/assertion-integrity.js.map +0 -1
- package/dist/flows/assertion-tiers-store.d.ts.map +0 -1
- package/dist/flows/assertion-tiers-store.js.map +0 -1
- package/dist/flows/buddy-status.d.ts.map +0 -1
- package/dist/flows/buddy-status.js.map +0 -1
- package/dist/flows/coverage.d.ts.map +0 -1
- package/dist/flows/coverage.js.map +0 -1
- package/dist/flows/decision.d.ts.map +0 -1
- package/dist/flows/decision.js.map +0 -1
- package/dist/flows/flake-store.d.ts.map +0 -1
- package/dist/flows/flake-store.js.map +0 -1
- package/dist/flows/flake.d.ts.map +0 -1
- package/dist/flows/flake.js.map +0 -1
- package/dist/flows/flow-classify.d.ts.map +0 -1
- package/dist/flows/flow-classify.js.map +0 -1
- package/dist/flows/flow-replay-run.d.ts.map +0 -1
- package/dist/flows/flow-replay-run.js.map +0 -1
- package/dist/flows/flow-replay.d.ts.map +0 -1
- package/dist/flows/flow-replay.js.map +0 -1
- package/dist/flows/flow-report.d.ts.map +0 -1
- package/dist/flows/flow-report.js.map +0 -1
- package/dist/flows/flow-scope.d.ts.map +0 -1
- package/dist/flows/flow-scope.js.map +0 -1
- package/dist/flows/flow-sources.d.ts.map +0 -1
- package/dist/flows/flow-sources.js.map +0 -1
- package/dist/flows/flow-success.d.ts.map +0 -1
- package/dist/flows/flow-success.js.map +0 -1
- package/dist/flows/flow-tools.d.ts.map +0 -1
- package/dist/flows/flow-tools.js.map +0 -1
- package/dist/flows/flows.d.ts.map +0 -1
- package/dist/flows/flows.js.map +0 -1
- package/dist/flows/gate.d.ts.map +0 -1
- package/dist/flows/gate.js.map +0 -1
- package/dist/flows/git-changed.d.ts.map +0 -1
- package/dist/flows/git-changed.js.map +0 -1
- package/dist/flows/heal-run.d.ts.map +0 -1
- package/dist/flows/heal-run.js.map +0 -1
- package/dist/flows/heal.d.ts.map +0 -1
- package/dist/flows/heal.js.map +0 -1
- package/dist/flows/parallel-suite.d.ts.map +0 -1
- package/dist/flows/parallel-suite.js.map +0 -1
- package/dist/flows/recordings.d.ts.map +0 -1
- package/dist/flows/recordings.js.map +0 -1
- package/dist/flows/replay.d.ts.map +0 -1
- package/dist/flows/replay.js.map +0 -1
- package/dist/flows/watch-batcher.d.ts.map +0 -1
- package/dist/flows/watch-batcher.js.map +0 -1
- package/dist/honesty/blind-spots.d.ts.map +0 -1
- package/dist/honesty/blind-spots.js.map +0 -1
- package/dist/honesty/honesty.d.ts.map +0 -1
- package/dist/honesty/honesty.js.map +0 -1
- package/dist/http-server.d.ts.map +0 -1
- package/dist/http-server.js.map +0 -1
- package/dist/idle-shutdown.d.ts.map +0 -1
- package/dist/idle-shutdown.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/init/agent-rules.d.ts.map +0 -1
- package/dist/init/agent-rules.js.map +0 -1
- package/dist/init/cursor.d.ts.map +0 -1
- package/dist/init/cursor.js.map +0 -1
- package/dist/init/detect.d.ts.map +0 -1
- package/dist/init/detect.js.map +0 -1
- package/dist/init/mcp.d.ts.map +0 -1
- package/dist/init/mcp.js.map +0 -1
- package/dist/init/node-io.d.ts.map +0 -1
- package/dist/init/node-io.js.map +0 -1
- package/dist/init/plan.d.ts.map +0 -1
- package/dist/init/plan.js.map +0 -1
- package/dist/init/project-id.d.ts.map +0 -1
- package/dist/init/project-id.js.map +0 -1
- package/dist/init/run.d.ts.map +0 -1
- package/dist/init/run.js.map +0 -1
- package/dist/init/snippets.d.ts.map +0 -1
- package/dist/init/snippets.js.map +0 -1
- package/dist/init/vite-config.d.ts.map +0 -1
- package/dist/init/vite-config.js.map +0 -1
- package/dist/input/network-detail.d.ts.map +0 -1
- package/dist/input/network-detail.js.map +0 -1
- package/dist/input/network-mock-tools.d.ts.map +0 -1
- package/dist/input/network-mock-tools.js.map +0 -1
- package/dist/input/network-mock.d.ts.map +0 -1
- package/dist/input/network-mock.js.map +0 -1
- package/dist/input/real-input.d.ts.map +0 -1
- package/dist/input/real-input.js.map +0 -1
- package/dist/input/scroll-find.d.ts.map +0 -1
- package/dist/input/scroll-find.js.map +0 -1
- package/dist/input/scroll-tools.d.ts.map +0 -1
- package/dist/input/scroll-tools.js.map +0 -1
- package/dist/input/viewport-tools.d.ts.map +0 -1
- package/dist/input/viewport-tools.js.map +0 -1
- package/dist/journal/ambient-store.d.ts.map +0 -1
- package/dist/journal/ambient-store.js.map +0 -1
- package/dist/journal/ambient.d.ts.map +0 -1
- package/dist/journal/ambient.js.map +0 -1
- package/dist/journal/attach-journal.d.ts.map +0 -1
- package/dist/journal/attach-journal.js.map +0 -1
- package/dist/journal/deviation-report.d.ts.map +0 -1
- package/dist/journal/deviation-report.js.map +0 -1
- package/dist/journal/deviation-service.d.ts.map +0 -1
- package/dist/journal/deviation-service.js.map +0 -1
- package/dist/journal/envelope-store.d.ts.map +0 -1
- package/dist/journal/envelope-store.js.map +0 -1
- package/dist/journal/envelope.d.ts.map +0 -1
- package/dist/journal/envelope.js.map +0 -1
- package/dist/journal/journal-query.d.ts.map +0 -1
- package/dist/journal/journal-query.js.map +0 -1
- package/dist/journal/journal-recorder.d.ts.map +0 -1
- package/dist/journal/journal-recorder.js.map +0 -1
- package/dist/journal/retention.d.ts.map +0 -1
- package/dist/journal/retention.js.map +0 -1
- package/dist/journal/rollups.d.ts.map +0 -1
- package/dist/journal/rollups.js.map +0 -1
- package/dist/journal/session-end.d.ts.map +0 -1
- package/dist/journal/session-end.js.map +0 -1
- package/dist/journal/session-journal.d.ts.map +0 -1
- package/dist/journal/session-journal.js.map +0 -1
- package/dist/license/license.d.ts.map +0 -1
- package/dist/license/license.js.map +0 -1
- package/dist/log.d.ts.map +0 -1
- package/dist/log.js.map +0 -1
- package/dist/mcp-proxy.d.ts.map +0 -1
- package/dist/mcp-proxy.js.map +0 -1
- package/dist/mcp.d.ts.map +0 -1
- package/dist/mcp.js.map +0 -1
- package/dist/oracles/flow-instrument-gaps.d.ts.map +0 -1
- package/dist/oracles/flow-instrument-gaps.js.map +0 -1
- package/dist/oracles/propose-consequences.d.ts.map +0 -1
- package/dist/oracles/propose-consequences.js.map +0 -1
- package/dist/oracles/self-instrument.d.ts.map +0 -1
- package/dist/oracles/self-instrument.js.map +0 -1
- package/dist/pairing-token.d.ts.map +0 -1
- package/dist/pairing-token.js.map +0 -1
- package/dist/phenomena/phenomena.d.ts.map +0 -1
- package/dist/phenomena/phenomena.js.map +0 -1
- package/dist/pool/browser-pool.d.ts.map +0 -1
- package/dist/pool/browser-pool.js.map +0 -1
- package/dist/pool/lease-reaper.d.ts.map +0 -1
- package/dist/pool/lease-reaper.js.map +0 -1
- package/dist/pool/playwright-launcher.d.ts.map +0 -1
- package/dist/pool/playwright-launcher.js.map +0 -1
- package/dist/project/baselines.d.ts.map +0 -1
- package/dist/project/baselines.js.map +0 -1
- package/dist/project/file-lock.d.ts.map +0 -1
- package/dist/project/file-lock.js.map +0 -1
- package/dist/project/fs-port.d.ts.map +0 -1
- package/dist/project/fs-port.js.map +0 -1
- package/dist/project/project-store.d.ts.map +0 -1
- package/dist/project/project-store.js.map +0 -1
- package/dist/project/project-tools.d.ts.map +0 -1
- package/dist/project/project-tools.js.map +0 -1
- package/dist/project/reticle-dir.d.ts.map +0 -1
- package/dist/project/reticle-dir.js.map +0 -1
- package/dist/runs/build-verification-run.d.ts.map +0 -1
- package/dist/runs/build-verification-run.js.map +0 -1
- package/dist/runs/profile-redact.d.ts.map +0 -1
- package/dist/runs/profile-redact.js.map +0 -1
- package/dist/runs/render-report.d.ts.map +0 -1
- package/dist/runs/render-report.js.map +0 -1
- package/dist/runs/repair-prompt.d.ts.map +0 -1
- package/dist/runs/repair-prompt.js.map +0 -1
- package/dist/runs/replay-mapping.d.ts.map +0 -1
- package/dist/runs/replay-mapping.js.map +0 -1
- package/dist/runs/reticle-runner.d.ts.map +0 -1
- package/dist/runs/reticle-runner.js.map +0 -1
- package/dist/runs/risk-classify.d.ts.map +0 -1
- package/dist/runs/risk-classify.js.map +0 -1
- package/dist/runs/run-diff.d.ts.map +0 -1
- package/dist/runs/run-diff.js.map +0 -1
- package/dist/runs/run-store.d.ts.map +0 -1
- package/dist/runs/run-store.js.map +0 -1
- package/dist/runs/run-tools.d.ts.map +0 -1
- package/dist/runs/run-tools.js.map +0 -1
- package/dist/runs/runner-port.d.ts.map +0 -1
- package/dist/runs/runner-port.js.map +0 -1
- package/dist/runs/verify-http.d.ts.map +0 -1
- package/dist/runs/verify-http.js.map +0 -1
- package/dist/runs/verify-server.d.ts.map +0 -1
- package/dist/runs/verify-server.js.map +0 -1
- package/dist/server-version.d.ts.map +0 -1
- package/dist/server-version.js.map +0 -1
- package/dist/session/control-envelope.d.ts.map +0 -1
- package/dist/session/control-envelope.js.map +0 -1
- package/dist/session/live-control-tools.d.ts.map +0 -1
- package/dist/session/live-control-tools.js.map +0 -1
- package/dist/session/live-control.d.ts.map +0 -1
- package/dist/session/live-control.js.map +0 -1
- package/dist/session/observed-state.d.ts.map +0 -1
- package/dist/session/observed-state.js.map +0 -1
- package/dist/session/output-budget.d.ts.map +0 -1
- package/dist/session/output-budget.js.map +0 -1
- package/dist/session/presenter-args.d.ts.map +0 -1
- package/dist/session/presenter-args.js.map +0 -1
- package/dist/session/review-store.d.ts.map +0 -1
- package/dist/session/review-store.js.map +0 -1
- package/dist/session/session-health.d.ts.map +0 -1
- package/dist/session/session-health.js.map +0 -1
- package/dist/session/session-manager.d.ts.map +0 -1
- package/dist/session/session-manager.js.map +0 -1
- package/dist/session/session-readiness.d.ts.map +0 -1
- package/dist/session/session-readiness.js.map +0 -1
- package/dist/session/session-reaper.d.ts.map +0 -1
- package/dist/session/session-reaper.js.map +0 -1
- package/dist/session/session-recommendation.d.ts.map +0 -1
- package/dist/session/session-recommendation.js.map +0 -1
- package/dist/session/session-tools.d.ts.map +0 -1
- package/dist/session/session-tools.js.map +0 -1
- package/dist/session/session.d.ts.map +0 -1
- package/dist/session/session.js.map +0 -1
- package/dist/session/state-select.d.ts.map +0 -1
- package/dist/session/state-select.js.map +0 -1
- package/dist/token-auth.d.ts.map +0 -1
- package/dist/token-auth.js.map +0 -1
- package/dist/tools/act-tools.d.ts.map +0 -1
- package/dist/tools/act-tools.js.map +0 -1
- package/dist/tools/act-view.d.ts.map +0 -1
- package/dist/tools/act-view.js.map +0 -1
- package/dist/tools/assert-grade.d.ts.map +0 -1
- package/dist/tools/assert-grade.js.map +0 -1
- package/dist/tools/browser-tools.d.ts.map +0 -1
- package/dist/tools/browser-tools.js.map +0 -1
- package/dist/tools/contract-tools.d.ts.map +0 -1
- package/dist/tools/contract-tools.js.map +0 -1
- package/dist/tools/dynamic-tools.d.ts.map +0 -1
- package/dist/tools/dynamic-tools.js.map +0 -1
- package/dist/tools/error-recovery.d.ts.map +0 -1
- package/dist/tools/error-recovery.js.map +0 -1
- package/dist/tools/invoke-tool.d.ts.map +0 -1
- package/dist/tools/invoke-tool.js.map +0 -1
- package/dist/tools/lease-tools.d.ts.map +0 -1
- package/dist/tools/lease-tools.js.map +0 -1
- package/dist/tools/merge-tools.d.ts.map +0 -1
- package/dist/tools/merge-tools.js.map +0 -1
- package/dist/tools/observe-tools.d.ts.map +0 -1
- package/dist/tools/observe-tools.js.map +0 -1
- package/dist/tools/profiles.d.ts.map +0 -1
- package/dist/tools/profiles.js.map +0 -1
- package/dist/tools/query-paginate.d.ts.map +0 -1
- package/dist/tools/query-paginate.js.map +0 -1
- package/dist/tools/read-tools.d.ts.map +0 -1
- package/dist/tools/read-tools.js.map +0 -1
- package/dist/tools/snapshot-delta.d.ts.map +0 -1
- package/dist/tools/snapshot-delta.js.map +0 -1
- package/dist/tools/tool-invoker.d.ts.map +0 -1
- package/dist/tools/tool-invoker.js.map +0 -1
- package/dist/tools/tool-kit.d.ts.map +0 -1
- package/dist/tools/tool-kit.js.map +0 -1
- package/dist/tools/tool-names.d.ts.map +0 -1
- package/dist/tools/tool-names.js.map +0 -1
- package/dist/tools/tools-helpers.d.ts.map +0 -1
- package/dist/tools/tools-helpers.js.map +0 -1
- package/dist/tools/tools.d.ts.map +0 -1
- package/dist/tools/tools.js.map +0 -1
- package/dist/update/update-checker.d.ts.map +0 -1
- package/dist/update/update-checker.js.map +0 -1
- package/dist/update/updater.d.ts.map +0 -1
- package/dist/update/updater.js.map +0 -1
- package/dist/visual/visual-diff.d.ts.map +0 -1
- package/dist/visual/visual-diff.js.map +0 -1
- package/dist/visual/visual-store.d.ts.map +0 -1
- package/dist/visual/visual-store.js.map +0 -1
- package/dist/visual/visual-tools.d.ts.map +0 -1
- package/dist/visual/visual-tools.js.map +0 -1
package/dist/cli-parse.js
CHANGED
|
@@ -5,10 +5,11 @@
|
|
|
5
5
|
* imports are unchanged.
|
|
6
6
|
*/
|
|
7
7
|
export const CLI_USAGE = `usage:
|
|
8
|
-
reticle init [--
|
|
8
|
+
reticle init [--dry-run] [--port N] [--no-mcp] [--no-install] (wire Reticle into the project in this directory)
|
|
9
9
|
reticle serve [--port N] [--drive <url>] [--headed] [--http] [--http-port N] [--http-token T]
|
|
10
10
|
reticle stop [--port N] [--quiet]
|
|
11
11
|
reticle status [--port N]
|
|
12
|
+
reticle doctor [--port N] (diagnose setup: Chromium, daemon, port — one command)
|
|
12
13
|
reticle open [url] [--port N] (show the app: reuse the connected tab, else open one)
|
|
13
14
|
reticle verify <url> [--headed] [--timeout N] [--storage-state <file>] (one-shot: drive the URL, verify saved flows, exit 0=pass)
|
|
14
15
|
reticle affected [--since <ref>] [file...] (which saved flows must re-verify for the changed files)
|
|
@@ -18,7 +19,20 @@ export const CLI_USAGE = `usage:
|
|
|
18
19
|
reticle mcp [--port N] [--drive <url>] [--headed] (MCP stdio proxy — auto-starts daemon if needed)
|
|
19
20
|
reticle update (install the latest server version and restart)
|
|
20
21
|
reticle rollback (restore the previous server version and restart)
|
|
21
|
-
reticle license (show enterprise license status: active | eval | missing)
|
|
22
|
+
reticle license (show enterprise license status: active | eval | missing)
|
|
23
|
+
reticle telemetry [status|enable|disable] (anonymous usage metrics — status shows what's sent + the policy)
|
|
24
|
+
reticle feedback [--rating 1-5] [--bug] "message" (tell us what worked and what didn't — prints exactly what it sends)
|
|
25
|
+
reticle identify --context company|side_project|open_source|learning [--company N] [--email E] [--forget]
|
|
26
|
+
(OPT-IN: tell us who you are, e.g. for support or an enterprise trial)
|
|
27
|
+
|
|
28
|
+
Cloud (link this project to Reticle Cloud — runs/flows recorded on the dashboard):
|
|
29
|
+
reticle login --email <e> [--code <c>] [--org <n>] (sign in: mails a code, then exchanges it)
|
|
30
|
+
reticle link [--project <name|id>] (bind this repo: mints a scoped key, writes .reticle/cloud.json)
|
|
31
|
+
reticle whoami (who am I signed in as, and is this repo attached?)
|
|
32
|
+
reticle project <ls|create <name>> (list or create cloud projects)
|
|
33
|
+
reticle config [--runs on|off] [--memory on|off] [--flows on|off] [--verify local|server]
|
|
34
|
+
reticle push (send local run artifacts to the dashboard)
|
|
35
|
+
reticle runs | regression | share <runId> (read cloud state; regression exits 3 if any flow broke)`;
|
|
22
36
|
const INIT_COMMAND = 'init';
|
|
23
37
|
const SERVE_COMMAND = 'serve';
|
|
24
38
|
const STOP_COMMAND = 'stop';
|
|
@@ -27,6 +41,7 @@ const OPEN_COMMAND = 'open';
|
|
|
27
41
|
const DRIVE_COMMAND = 'drive';
|
|
28
42
|
const VERIFY_COMMAND = 'verify';
|
|
29
43
|
const AFFECTED_COMMAND = 'affected';
|
|
44
|
+
const HUNT_COMMAND = 'hunt';
|
|
30
45
|
const CAPSULES_COMMAND = 'capsules';
|
|
31
46
|
const GATE_COMMAND = 'gate';
|
|
32
47
|
const WATCH_COMMAND = 'watch';
|
|
@@ -35,7 +50,75 @@ const ROLLBACK_COMMAND = 'rollback';
|
|
|
35
50
|
const MCP_COMMAND = 'mcp';
|
|
36
51
|
const LICENSE_COMMAND = 'license';
|
|
37
52
|
const VERSION_COMMAND = 'version';
|
|
53
|
+
const TELEMETRY_COMMAND = 'telemetry';
|
|
54
|
+
const FEEDBACK_COMMAND = 'feedback';
|
|
55
|
+
const IDENTIFY_COMMAND = 'identify';
|
|
56
|
+
export const COMPANY_FLAG = '--company';
|
|
57
|
+
export const EMAIL_FLAG = '--email';
|
|
58
|
+
export const CONTEXT_FLAG = '--context';
|
|
59
|
+
export const FORGET_FLAG = '--forget';
|
|
60
|
+
/** `reticle feedback --rating 4 "the words"` — the human half of the channel. */
|
|
61
|
+
export const RATING_FLAG = '--rating';
|
|
62
|
+
export const BUG_FLAG = '--bug';
|
|
63
|
+
/** The `reticle telemetry` sub-actions. Bare `reticle telemetry` means `status`. */
|
|
64
|
+
export const TelemetryAction = {
|
|
65
|
+
STATUS: 'status',
|
|
66
|
+
ENABLE: 'enable',
|
|
67
|
+
DISABLE: 'disable',
|
|
68
|
+
};
|
|
38
69
|
export const DAEMON_INNER_COMMAND = '_daemon';
|
|
70
|
+
/**
|
|
71
|
+
* Every subcommand a person can type, as one closed vocabulary. Telemetry reports which one ran, and
|
|
72
|
+
* this is what keeps that property low-cardinality and non-identifying: an argument we do not
|
|
73
|
+
* recognize reports as `unknown` rather than being echoed, so a typo — which may be a path, a URL, or
|
|
74
|
+
* a flow name — can never reach the wire just because someone misspelled `status`.
|
|
75
|
+
*
|
|
76
|
+
* Lives here rather than in the telemetry module because this is where the command names are already
|
|
77
|
+
* defined; a second list somewhere else would drift the first time a command is added.
|
|
78
|
+
*/
|
|
79
|
+
export const UNKNOWN_COMMAND = 'unknown';
|
|
80
|
+
const KNOWN_COMMANDS = new Set([
|
|
81
|
+
INIT_COMMAND,
|
|
82
|
+
SERVE_COMMAND,
|
|
83
|
+
STOP_COMMAND,
|
|
84
|
+
STATUS_COMMAND,
|
|
85
|
+
OPEN_COMMAND,
|
|
86
|
+
DRIVE_COMMAND,
|
|
87
|
+
VERIFY_COMMAND,
|
|
88
|
+
AFFECTED_COMMAND,
|
|
89
|
+
HUNT_COMMAND,
|
|
90
|
+
CAPSULES_COMMAND,
|
|
91
|
+
GATE_COMMAND,
|
|
92
|
+
WATCH_COMMAND,
|
|
93
|
+
UPDATE_COMMAND,
|
|
94
|
+
ROLLBACK_COMMAND,
|
|
95
|
+
MCP_COMMAND,
|
|
96
|
+
LICENSE_COMMAND,
|
|
97
|
+
VERSION_COMMAND,
|
|
98
|
+
TELEMETRY_COMMAND,
|
|
99
|
+
FEEDBACK_COMMAND,
|
|
100
|
+
IDENTIFY_COMMAND,
|
|
101
|
+
DAEMON_INNER_COMMAND,
|
|
102
|
+
// Cloud subcommands dispatch before the local parser but are still commands a human ran.
|
|
103
|
+
'login',
|
|
104
|
+
'logout',
|
|
105
|
+
'whoami',
|
|
106
|
+
'link',
|
|
107
|
+
'project',
|
|
108
|
+
'config',
|
|
109
|
+
'push',
|
|
110
|
+
'runs',
|
|
111
|
+
'regression',
|
|
112
|
+
'share',
|
|
113
|
+
'doctor',
|
|
114
|
+
'help',
|
|
115
|
+
]);
|
|
116
|
+
/** The subcommand name if we recognize it, else `unknown`. Bare `reticle` reports `help`. */
|
|
117
|
+
export function knownCommand(arg) {
|
|
118
|
+
if (arg === undefined || arg === '')
|
|
119
|
+
return 'help';
|
|
120
|
+
return KNOWN_COMMANDS.has(arg) ? arg : UNKNOWN_COMMAND;
|
|
121
|
+
}
|
|
39
122
|
export const HEADED_FLAG = '--headed';
|
|
40
123
|
export const PORT_FLAG = '--port';
|
|
41
124
|
export const DRIVE_FLAG = '--drive';
|
|
@@ -261,6 +344,10 @@ export function parseCliArgs(argv, defaultPort) {
|
|
|
261
344
|
// troubleshooting docs lean on to confirm which npx-resolved build is actually executing.
|
|
262
345
|
if (cmd === VERSION_COMMAND || cmd === '--version' || cmd === '-v')
|
|
263
346
|
return { kind: 'version' };
|
|
347
|
+
// `help` (and the conventional -h/--help) print usage to stdout and exit 0 — the universal first move
|
|
348
|
+
// for a new user, which otherwise fell through to a JSON error with exit 1.
|
|
349
|
+
if (cmd === 'help' || cmd === '--help' || cmd === '-h')
|
|
350
|
+
return { kind: 'help' };
|
|
264
351
|
switch (cmd) {
|
|
265
352
|
case INIT_COMMAND: {
|
|
266
353
|
const r = parseInitFlags(rest);
|
|
@@ -291,8 +378,57 @@ export function parseCliArgs(argv, defaultPort) {
|
|
|
291
378
|
const port = parsePortFlag(rest, defaultPort);
|
|
292
379
|
return { kind: 'status', port };
|
|
293
380
|
}
|
|
381
|
+
case 'doctor': {
|
|
382
|
+
const port = parsePortFlag(rest, defaultPort);
|
|
383
|
+
return { kind: 'doctor', port };
|
|
384
|
+
}
|
|
294
385
|
case LICENSE_COMMAND:
|
|
295
386
|
return { kind: 'license' };
|
|
387
|
+
case TELEMETRY_COMMAND: {
|
|
388
|
+
const action = rest[0] ?? TelemetryAction.STATUS;
|
|
389
|
+
if (action !== TelemetryAction.STATUS &&
|
|
390
|
+
action !== TelemetryAction.ENABLE &&
|
|
391
|
+
action !== TelemetryAction.DISABLE) {
|
|
392
|
+
return { kind: 'error', message: `unknown telemetry action: ${action}` };
|
|
393
|
+
}
|
|
394
|
+
return { kind: 'telemetry', action };
|
|
395
|
+
}
|
|
396
|
+
case IDENTIFY_COMMAND: {
|
|
397
|
+
const flag = (name) => {
|
|
398
|
+
const at = rest.indexOf(name);
|
|
399
|
+
return at === -1 ? undefined : rest[at + 1];
|
|
400
|
+
};
|
|
401
|
+
const context = flag(CONTEXT_FLAG);
|
|
402
|
+
const company = flag(COMPANY_FLAG);
|
|
403
|
+
const email = flag(EMAIL_FLAG);
|
|
404
|
+
return {
|
|
405
|
+
kind: 'identify',
|
|
406
|
+
...(context !== undefined ? { context } : {}),
|
|
407
|
+
...(company !== undefined ? { company } : {}),
|
|
408
|
+
...(email !== undefined ? { email } : {}),
|
|
409
|
+
forget: rest.includes(FORGET_FLAG),
|
|
410
|
+
};
|
|
411
|
+
}
|
|
412
|
+
case FEEDBACK_COMMAND: {
|
|
413
|
+
const ratingAt = rest.indexOf(RATING_FLAG);
|
|
414
|
+
const rating = ratingAt === -1 ? undefined : Number(rest[ratingAt + 1]);
|
|
415
|
+
if (rating !== undefined && (!Number.isInteger(rating) || rating < 1 || rating > 5)) {
|
|
416
|
+
return { kind: 'error', message: `${RATING_FLAG} takes a whole number from 1 to 5` };
|
|
417
|
+
}
|
|
418
|
+
// Everything that is not a flag or the rating's value is the message. Quoting is the user's
|
|
419
|
+
// job for shell reasons, but joining the remainder means an unquoted sentence still works.
|
|
420
|
+
const consumed = new Set(ratingAt === -1 ? [] : [ratingAt, ratingAt + 1]);
|
|
421
|
+
const text = rest
|
|
422
|
+
.filter((arg, i) => !consumed.has(i) && !arg.startsWith('--'))
|
|
423
|
+
.join(' ')
|
|
424
|
+
.trim();
|
|
425
|
+
return {
|
|
426
|
+
kind: 'feedback',
|
|
427
|
+
text,
|
|
428
|
+
...(rating !== undefined ? { rating } : {}),
|
|
429
|
+
bug: rest.includes(BUG_FLAG),
|
|
430
|
+
};
|
|
431
|
+
}
|
|
296
432
|
case OPEN_COMMAND: {
|
|
297
433
|
const port = parsePortFlag(rest, defaultPort);
|
|
298
434
|
// The first non-flag arg is the url (optional — omitting reuses a connected tab).
|
|
@@ -333,6 +469,12 @@ export function parseCliArgs(argv, defaultPort) {
|
|
|
333
469
|
}
|
|
334
470
|
case CAPSULES_COMMAND:
|
|
335
471
|
return { kind: 'capsules' };
|
|
472
|
+
case HUNT_COMMAND: {
|
|
473
|
+
const dir = rest.find((a) => !a.startsWith('-'));
|
|
474
|
+
return dir === undefined
|
|
475
|
+
? { kind: 'error', message: 'usage: reticle hunt <dir-of-crawl-reports>' }
|
|
476
|
+
: { kind: 'hunt', dir };
|
|
477
|
+
}
|
|
336
478
|
case AFFECTED_COMMAND: {
|
|
337
479
|
const t = parseTargetArgs(rest);
|
|
338
480
|
if (t.files.length === 0 && t.since === undefined) {
|
|
@@ -368,11 +510,13 @@ export function parseCliArgs(argv, defaultPort) {
|
|
|
368
510
|
kind: 'mcp',
|
|
369
511
|
port: r.port,
|
|
370
512
|
headless: r.headless,
|
|
513
|
+
http: r.http,
|
|
371
514
|
...(r.driveUrl !== undefined ? { driveUrl: r.driveUrl } : {}),
|
|
515
|
+
...(r.httpPort !== undefined ? { httpPort: r.httpPort } : {}),
|
|
516
|
+
...(r.httpToken !== undefined ? { httpToken: r.httpToken } : {}),
|
|
372
517
|
};
|
|
373
518
|
}
|
|
374
519
|
default:
|
|
375
520
|
return { kind: 'error', message: CLI_USAGE };
|
|
376
521
|
}
|
|
377
522
|
}
|
|
378
|
-
//# sourceMappingURL=cli-parse.js.map
|
package/dist/cli-port.d.ts
CHANGED
|
@@ -29,4 +29,3 @@ export declare function readJournalEnabled(cwd: string, env: string | undefined)
|
|
|
29
29
|
* Pass `portFlag` when the user explicitly supplied --port; pass `undefined` to fall through.
|
|
30
30
|
*/
|
|
31
31
|
export declare function resolvePort(portFlag: number | undefined, envPort: number | undefined, projectPort: number | undefined, defaultPort: number): number;
|
|
32
|
-
//# sourceMappingURL=cli-port.d.ts.map
|
package/dist/cli-port.js
CHANGED
package/dist/cli-verify.d.ts
CHANGED
|
@@ -41,6 +41,7 @@ export declare function handleVerify(parsed: {
|
|
|
41
41
|
headless: boolean;
|
|
42
42
|
timeoutMs?: number;
|
|
43
43
|
storageState?: string;
|
|
44
|
+
/** Bridge port — parseCliArgs already resolves --port / RETICLE_PORT / .reticle.json into this. */
|
|
45
|
+
port?: number;
|
|
44
46
|
}): void;
|
|
45
47
|
export {};
|
|
46
|
-
//# sourceMappingURL=cli-verify.d.ts.map
|
package/dist/cli-verify.js
CHANGED
|
@@ -13,6 +13,7 @@ import { join, basename } from 'node:path';
|
|
|
13
13
|
import { randomUUID } from 'node:crypto';
|
|
14
14
|
import { RETICLE_DEFAULT_PORT, ReticleEnv, bridgeWsUrl, isLoopbackHostname, ReticleDir, RunAgentKind, RunFramework, RunProfile, RunTrigger, VerdictStatus, } from '@reticlehq/core';
|
|
15
15
|
import { start } from './index.js';
|
|
16
|
+
import { resolveCloudConfig, syncRunToCloud, SyncOutcome } from './cloud/cloud-sync.js';
|
|
16
17
|
import { ReticleRunner } from './runs/reticle-runner.js';
|
|
17
18
|
import { createRunnerPort } from './runs/runner-port.js';
|
|
18
19
|
import { RunStore } from './runs/run-store.js';
|
|
@@ -33,7 +34,8 @@ const MSG_NO_SESSION = 'No app connected — Reticle drove the URL but no @retic
|
|
|
33
34
|
' Make sure the SDK is in the build and reticle.connect() runs on the preview page' +
|
|
34
35
|
' (for a non-localhost preview: allowNonLocalhost + a pairing token).';
|
|
35
36
|
const MSG_NO_FLOWS = 'No saved flows to verify (.reticle/flows is empty) — refusing to report a pass for verifying nothing.\n' +
|
|
36
|
-
'
|
|
37
|
+
' Flows are recorded interactively by an agent (reticle_record{action:"start"} → act → reticle_flow_save via the\n' +
|
|
38
|
+
' MCP tools), then committed to .reticle/flows/. In CI, check those files in and re-run `reticle verify`.';
|
|
37
39
|
const MSG_VERIFY_PREFIX = 'verify failed: ';
|
|
38
40
|
function errMessage(error) {
|
|
39
41
|
return error instanceof Error ? error.message : String(error);
|
|
@@ -67,6 +69,7 @@ export async function runVerify(args, ports) {
|
|
|
67
69
|
return;
|
|
68
70
|
}
|
|
69
71
|
const run = await conn.verify();
|
|
72
|
+
await pushRunToCloud(run, ports); // best-effort; opt-in; never changes the verdict or exit code
|
|
70
73
|
ports.out(renderRunReport(run));
|
|
71
74
|
ports.exit(run.verdict.status === VerdictStatus.PASS ? EXIT_PASS : EXIT_FAIL);
|
|
72
75
|
}
|
|
@@ -78,6 +81,24 @@ export async function runVerify(args, ports) {
|
|
|
78
81
|
await conn.close().catch(() => undefined);
|
|
79
82
|
}
|
|
80
83
|
}
|
|
84
|
+
/**
|
|
85
|
+
* Best-effort push of a finished run to the cloud dashboard. Opt-in: only fires when the user has set
|
|
86
|
+
* RETICLE_CLOUD_URL + RETICLE_CLOUD_KEY (the "shifted to server" step). Absent → no-op, nothing leaves the
|
|
87
|
+
* machine (the no-phone-home default). A push failure NEVER changes the verdict or exit code — the run is
|
|
88
|
+
* already reported locally; the cloud copy is an enhancement.
|
|
89
|
+
*/
|
|
90
|
+
async function pushRunToCloud(run, ports) {
|
|
91
|
+
const config = resolveCloudConfig(process.env);
|
|
92
|
+
if (config === null)
|
|
93
|
+
return;
|
|
94
|
+
const result = await syncRunToCloud(run, config, (url, init) => fetch(url, init));
|
|
95
|
+
if (result.outcome === SyncOutcome.SYNCED) {
|
|
96
|
+
ports.out(`↑ run ${run.runId} recorded on the Reticle Cloud dashboard`);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
ports.fail(`cloud run sync failed (${result.status ?? result.error ?? 'error'}); run kept locally`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
81
102
|
function delay(ms) {
|
|
82
103
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
83
104
|
}
|
|
@@ -127,7 +148,7 @@ async function openLiveConnection(opts) {
|
|
|
127
148
|
// `reticle verify` boots its OWN daemon. Hardcoding the default port meant it crashed with EADDRINUSE
|
|
128
149
|
// on any machine already running a daemon — i.e. every developer machine — so honour RETICLE_PORT.
|
|
129
150
|
const envPort = Number(process.env[ReticleEnv.PORT]);
|
|
130
|
-
const port = Number.isFinite(envPort) && envPort > 0 ? envPort :
|
|
151
|
+
const port = Number.isFinite(envPort) && envPort > 0 ? envPort : opts.port;
|
|
131
152
|
const { origin, loopback } = urlParts(opts.url);
|
|
132
153
|
const pairing = loopback
|
|
133
154
|
? {}
|
|
@@ -189,6 +210,7 @@ export function handleVerify(parsed) {
|
|
|
189
210
|
reticleRoot,
|
|
190
211
|
projectName,
|
|
191
212
|
now,
|
|
213
|
+
port: parsed.port ?? RETICLE_DEFAULT_PORT,
|
|
192
214
|
...(parsed.storageState !== undefined ? { storageState: parsed.storageState } : {}),
|
|
193
215
|
}),
|
|
194
216
|
out: (line) => process.stdout.write(`${line}\n`),
|
|
@@ -197,4 +219,3 @@ export function handleVerify(parsed) {
|
|
|
197
219
|
};
|
|
198
220
|
void runVerify({ url: parsed.url, timeoutMs: parsed.timeoutMs ?? DEFAULT_SESSION_TIMEOUT_MS }, ports);
|
|
199
221
|
}
|
|
200
|
-
//# sourceMappingURL=cli-verify.js.map
|
package/dist/cli.d.ts
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { parseCliArgs } from './cli-parse.js';
|
|
3
|
-
export { parseCliArgs };
|
|
4
|
-
export { CLI_USAGE } from './cli-parse.js';
|
|
2
|
+
import { parseCliArgs, CLI_USAGE } from './cli-parse.js';
|
|
3
|
+
export { parseCliArgs, CLI_USAGE };
|
|
5
4
|
export type { CliResult } from './cli-parse.js';
|
|
6
|
-
//# sourceMappingURL=cli.d.ts.map
|
package/dist/cli.js
CHANGED
|
@@ -4,11 +4,13 @@ import { realpathSync } from 'node:fs';
|
|
|
4
4
|
import { join } from 'node:path';
|
|
5
5
|
import { handleWatch, handleCapsules, handleGate, loadNamedFlows, resolveChangedFiles, } from './cli-flow-commands.js';
|
|
6
6
|
import { RETICLE_DEFAULT_PORT, ReticleDir, ReticleEnv } from '@reticlehq/core';
|
|
7
|
+
import { loadDotEnv } from './telemetry/dev-repo.js';
|
|
7
8
|
import { createNodeFileSystem } from './project/fs-port.js';
|
|
8
9
|
import { affectedSavedFlows } from './flows/flow-sources.js';
|
|
9
10
|
import { checkForUpdate } from './update/update-checker.js';
|
|
10
11
|
import { applyUpdate, rollback } from './update/updater.js';
|
|
11
12
|
import { start, startDaemon } from './index.js';
|
|
13
|
+
import { isCloudCommand, runCloudCommand } from './cloud-cli.js';
|
|
12
14
|
import { SERVER_VERSION } from './server-version.js';
|
|
13
15
|
import { log } from './log.js';
|
|
14
16
|
import { readPid, isAlive, isRunning, removePid, spawnDaemon, discoverDaemonPort, writeDaemonRegistry, } from './daemon.js';
|
|
@@ -17,14 +19,18 @@ import { installDaemonResilience } from './daemon-resilience.js';
|
|
|
17
19
|
import { IdleShutdown, resolveIdleShutdownMs } from './idle-shutdown.js';
|
|
18
20
|
import { fetchStatus, summarizeStatus, decideOpen, openInBrowser } from './cli-launch.js';
|
|
19
21
|
import { handleVerify } from './cli-verify.js';
|
|
22
|
+
import { summarizeHunt } from './hunt/hunt-report.js';
|
|
20
23
|
import { runInit } from './init/run.js';
|
|
24
|
+
import { handleDoctor } from './cli-doctor.js';
|
|
21
25
|
import { buildNodeIo } from './init/node-io.js';
|
|
22
26
|
import { describeLicense } from './license/license.js';
|
|
23
27
|
import { readProjectPort, readProjectId } from './cli-port.js';
|
|
24
|
-
import { DAEMON_INNER_COMMAND, PORT_FLAG, DRIVE_FLAG, HEADED_FLAG, HTTP_FLAG, HTTP_PORT_FLAG, HTTP_TOKEN_FLAG, parseCliArgs, } from './cli-parse.js';
|
|
28
|
+
import { DAEMON_INNER_COMMAND, PORT_FLAG, DRIVE_FLAG, HEADED_FLAG, HTTP_FLAG, HTTP_PORT_FLAG, HTTP_TOKEN_FLAG, parseCliArgs, CLI_USAGE, } from './cli-parse.js';
|
|
29
|
+
import { handleFeedback, handleIdentify, handleTelemetry } from './telemetry/feedback-cli.js';
|
|
30
|
+
import { installDaemonTelemetry } from './telemetry/daemon-telemetry.js';
|
|
31
|
+
import { reportCliRun } from './telemetry/cli-telemetry.js';
|
|
25
32
|
// Re-exported so existing imports (and the CLI tests) keep resolving from './cli.js'.
|
|
26
|
-
export { parseCliArgs };
|
|
27
|
-
export { CLI_USAGE } from './cli-parse.js';
|
|
33
|
+
export { parseCliArgs, CLI_USAGE };
|
|
28
34
|
function handleInit(parsed) {
|
|
29
35
|
const cwd = process.cwd();
|
|
30
36
|
const result = runInit({ cwd, port: parsed.port, mcp: parsed.mcp, dryRun: parsed.dryRun, install: parsed.install }, buildNodeIo(cwd));
|
|
@@ -99,11 +105,11 @@ function handleStatus(port) {
|
|
|
99
105
|
log('reticle_status', { port, running: true, pid, ...summarizeStatus(payload) });
|
|
100
106
|
});
|
|
101
107
|
}
|
|
102
|
-
/** `reticle license` — show enterprise activation resolved from the environment (offline; nothing leaves). */
|
|
103
108
|
/** Print the running package version (resolved once in server-version.ts). */
|
|
104
109
|
function handleVersion() {
|
|
105
110
|
log('reticle_version', { version: SERVER_VERSION });
|
|
106
111
|
}
|
|
112
|
+
/** `reticle license` — show enterprise activation resolved from the environment (offline; nothing leaves). */
|
|
107
113
|
function handleLicense() {
|
|
108
114
|
log('reticle_license', { ...describeLicense(Date.now()) });
|
|
109
115
|
}
|
|
@@ -130,6 +136,42 @@ async function handleAffected(files, since) {
|
|
|
130
136
|
});
|
|
131
137
|
}
|
|
132
138
|
}
|
|
139
|
+
/**
|
|
140
|
+
* `reticle hunt <dir>` — aggregate crawl reports from many checkouts into one number.
|
|
141
|
+
*
|
|
142
|
+
* Detection already exists (`reticle_crawl`). This is the arithmetic that turns a pile of runs into
|
|
143
|
+
* the claim worth making: over N already-merged, already-green changes, how many carried a candidate
|
|
144
|
+
* false green? No control arm is needed, because those changes SHIPPED — the counterfactual is
|
|
145
|
+
* already established, which is what makes this the cheapest credible evidence available.
|
|
146
|
+
*
|
|
147
|
+
* Each file in <dir> is one crawl result. Producing them is a shell loop over a commit range:
|
|
148
|
+
* check out, boot the app, `reticle_crawl`, write the JSON here.
|
|
149
|
+
*/
|
|
150
|
+
async function handleHunt(dir) {
|
|
151
|
+
try {
|
|
152
|
+
const fs = createNodeFileSystem();
|
|
153
|
+
const names = await fs.readdir(dir);
|
|
154
|
+
const runs = [];
|
|
155
|
+
for (const name of names.filter((n) => n.endsWith('.json'))) {
|
|
156
|
+
const raw = await fs.readFile(join(dir, name));
|
|
157
|
+
if (raw === undefined)
|
|
158
|
+
continue;
|
|
159
|
+
const parsed = JSON.parse(raw);
|
|
160
|
+
const report = parsed;
|
|
161
|
+
runs.push({
|
|
162
|
+
label: report.label ?? name.replace(/\.json$/, ''),
|
|
163
|
+
anomalies: report.anomalies ?? [],
|
|
164
|
+
...(report.stepsRun === undefined ? {} : { stepsRun: report.stepsRun }),
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
log('reticle_hunt', { ...summarizeHunt(runs) });
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
log('reticle_hunt_failed', {
|
|
171
|
+
error: error instanceof Error ? error.message : String(error),
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
}
|
|
133
175
|
/** `reticle update` — install the latest server version and restart (moved off the MCP surface). */
|
|
134
176
|
async function handleUpdate() {
|
|
135
177
|
try {
|
|
@@ -188,7 +230,11 @@ function handleOpen(requestedPort, url) {
|
|
|
188
230
|
const { sessions } = summarizeStatus(await fetchStatus(port));
|
|
189
231
|
const decision = decideOpen(sessions, url);
|
|
190
232
|
if (decision.action === 'need-url') {
|
|
191
|
-
log('reticle_open', {
|
|
233
|
+
log('reticle_open', {
|
|
234
|
+
port,
|
|
235
|
+
error: 'no app connected — pass a url: reticle open <url>. Desktop app (Electron/Tauri)? ' +
|
|
236
|
+
'There is no url to open: start it as you normally would and it connects to this bridge itself.',
|
|
237
|
+
});
|
|
192
238
|
return;
|
|
193
239
|
}
|
|
194
240
|
if (decision.action === 'reuse') {
|
|
@@ -220,6 +266,9 @@ function handleDaemonInner(parsed) {
|
|
|
220
266
|
startDaemon(options)
|
|
221
267
|
.then((server) => {
|
|
222
268
|
log('reticle_daemon_ready', { port: parsed.port, pid: process.pid });
|
|
269
|
+
// Daemon lifecycle telemetry: started, a one-shot project profile, the periodic counter flush,
|
|
270
|
+
// and the rich summary on shutdown. All of it lives in one module — see daemon-telemetry.ts.
|
|
271
|
+
const daemonTelemetry = installDaemonTelemetry(process.cwd());
|
|
223
272
|
// Publish to the discovery registry so a build plugin can find this daemon by projectId — no
|
|
224
273
|
// hand-reconciled port. Written from the child (only it knows its cwd); removePid drops it.
|
|
225
274
|
const registryProjectId = readProjectId(process.cwd());
|
|
@@ -236,8 +285,12 @@ function handleDaemonInner(parsed) {
|
|
|
236
285
|
process.exit(1);
|
|
237
286
|
});
|
|
238
287
|
const shutdown = () => {
|
|
239
|
-
|
|
240
|
-
|
|
288
|
+
// Awaited before the close/exit chain: `process.exit(0)` kills an in-flight POST, and this is
|
|
289
|
+
// the one event carrying the whole session. A failed send resolves anyway (emit swallows its
|
|
290
|
+
// own errors), so this can delay the exit by at most the send timeout, never prevent it.
|
|
291
|
+
void daemonTelemetry
|
|
292
|
+
.shutdown()
|
|
293
|
+
.then(() => server.close())
|
|
241
294
|
.then(() => {
|
|
242
295
|
removePid(parsed.port);
|
|
243
296
|
process.exit(0);
|
|
@@ -279,7 +332,7 @@ function handleDaemonInner(parsed) {
|
|
|
279
332
|
* URL. The agent then has full autonomous control without relying on the user's browser.
|
|
280
333
|
*/
|
|
281
334
|
function handleMcp(opts) {
|
|
282
|
-
const { port, driveUrl, headless } = opts;
|
|
335
|
+
const { port, driveUrl, headless, http, httpPort, httpToken } = opts;
|
|
283
336
|
// Probe the port first — a daemon with a stale PID file is still usable.
|
|
284
337
|
// Only spawn when nothing is actually listening on the port.
|
|
285
338
|
probeDaemon(port)
|
|
@@ -297,6 +350,14 @@ function handleMcp(opts) {
|
|
|
297
350
|
if (!headless)
|
|
298
351
|
daemonArgs.push(HEADED_FLAG);
|
|
299
352
|
}
|
|
353
|
+
// Forward the HTTP-verify flags too (previously silently dropped for `reticle mcp`).
|
|
354
|
+
if (http) {
|
|
355
|
+
daemonArgs.push(HTTP_FLAG);
|
|
356
|
+
if (httpPort !== undefined)
|
|
357
|
+
daemonArgs.push(HTTP_PORT_FLAG, String(httpPort));
|
|
358
|
+
if (httpToken !== undefined)
|
|
359
|
+
daemonArgs.push(HTTP_TOKEN_FLAG, httpToken);
|
|
360
|
+
}
|
|
300
361
|
spawnDaemon(process.execPath, scriptPath, daemonArgs, port);
|
|
301
362
|
log('reticle_mcp_daemon_started', {
|
|
302
363
|
port,
|
|
@@ -328,11 +389,32 @@ function handleLegacyDrive(parsed) {
|
|
|
328
389
|
});
|
|
329
390
|
}
|
|
330
391
|
function main() {
|
|
392
|
+
// Before anything reads process.env — notably the telemetry gate and the bridge's security
|
|
393
|
+
// options — fold in a project-local `.env`. Values already in the environment always win.
|
|
394
|
+
loadDotEnv(process.cwd());
|
|
395
|
+
const argv = process.argv.slice(2);
|
|
396
|
+
// Every invocation passes through here — the single chokepoint for the "how often is it used / how
|
|
397
|
+
// many distinct machines + projects" metrics. Fire-and-forget: a metric must never delay or fail a run.
|
|
398
|
+
//
|
|
399
|
+
// `_daemon` is EXCLUDED, and that exclusion is the whole point of this branch. `reticle mcp` and
|
|
400
|
+
// `reticle serve` start the daemon by re-running this very binary, so the child re-entered main()
|
|
401
|
+
// and emitted a second event for what a person experienced as one action. The old `invoke` metric
|
|
402
|
+
// was therefore inflated ~2x — and inflated worst on the agent-driven sessions that matter most,
|
|
403
|
+
// while one-shot commands like `version` counted once. That skewed the RATIO between commands, not
|
|
404
|
+
// just the scale, which is the kind of error you cannot correct for after the fact. The daemon's
|
|
405
|
+
// own lifecycle is already reported by `daemon_started` / `daemon_stopped`; it is not a CLI run.
|
|
406
|
+
reportCliRun(argv);
|
|
407
|
+
// Cloud subcommands (login/link/project/config/push) are a distinct family with their own async client;
|
|
408
|
+
// handle them before the local typed parser so `reticle login` etc. work as one tool.
|
|
409
|
+
if (isCloudCommand(argv[0])) {
|
|
410
|
+
void runCloudCommand(argv).then((code) => process.exit(code));
|
|
411
|
+
return;
|
|
412
|
+
}
|
|
331
413
|
const portEnv = process.env[ReticleEnv.PORT];
|
|
332
414
|
const envPort = portEnv !== undefined ? parseInt(portEnv, 10) : undefined;
|
|
333
415
|
const projectPort = readProjectPort(process.cwd());
|
|
334
416
|
const defaultPort = envPort ?? projectPort ?? RETICLE_DEFAULT_PORT;
|
|
335
|
-
const parsed = parseCliArgs(
|
|
417
|
+
const parsed = parseCliArgs(argv, defaultPort);
|
|
336
418
|
switch (parsed.kind) {
|
|
337
419
|
case 'error':
|
|
338
420
|
log('reticle_usage_error', { message: parsed.message });
|
|
@@ -353,9 +435,24 @@ function main() {
|
|
|
353
435
|
case 'license':
|
|
354
436
|
handleLicense();
|
|
355
437
|
break;
|
|
438
|
+
case 'telemetry':
|
|
439
|
+
handleTelemetry(parsed.action);
|
|
440
|
+
break;
|
|
441
|
+
case 'feedback':
|
|
442
|
+
void handleFeedback(parsed.text, parsed.rating, parsed.bug);
|
|
443
|
+
break;
|
|
444
|
+
case 'identify':
|
|
445
|
+
void handleIdentify(parsed);
|
|
446
|
+
break;
|
|
356
447
|
case 'version':
|
|
357
448
|
handleVersion();
|
|
358
449
|
break;
|
|
450
|
+
case 'help':
|
|
451
|
+
process.stdout.write(`${CLI_USAGE}\n`);
|
|
452
|
+
break;
|
|
453
|
+
case 'doctor':
|
|
454
|
+
void handleDoctor(parsed.port);
|
|
455
|
+
break;
|
|
359
456
|
case 'open':
|
|
360
457
|
handleOpen(parsed.port, parsed.url);
|
|
361
458
|
break;
|
|
@@ -371,6 +468,9 @@ function main() {
|
|
|
371
468
|
case 'affected':
|
|
372
469
|
void handleAffected(parsed.files, parsed.since);
|
|
373
470
|
break;
|
|
471
|
+
case 'hunt':
|
|
472
|
+
void handleHunt(parsed.dir);
|
|
473
|
+
break;
|
|
374
474
|
case 'gate':
|
|
375
475
|
void handleGate(parsed.files, parsed.since);
|
|
376
476
|
break;
|
|
@@ -413,4 +513,3 @@ function isEntryPoint() {
|
|
|
413
513
|
if (isEntryPoint()) {
|
|
414
514
|
main();
|
|
415
515
|
}
|
|
416
|
-
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { FileSystemPort } from '../project/fs-port.js';
|
|
2
|
+
import { type CloudConfig } from './cloud-sync.js';
|
|
3
|
+
/** `<reticleRoot>/cloud.json` — the project's cloud binding + sync policy (non-secret). */
|
|
4
|
+
export declare const CLOUD_LINK_FILE = "cloud.json";
|
|
5
|
+
/** `~/.reticle/credentials.json` — the user's per-cloud-project API keys (the only secret). */
|
|
6
|
+
export declare const CREDENTIALS_FILE = "credentials.json";
|
|
7
|
+
/** What the daemon mirrors to the cloud for a project. Each surface is independently toggleable. */
|
|
8
|
+
export interface SyncPolicy {
|
|
9
|
+
/** Push verification-run artifacts to the dashboard Runs tab. */
|
|
10
|
+
runs: boolean;
|
|
11
|
+
/** Push per-flow project-memory outcomes (the regression history). */
|
|
12
|
+
memory: boolean;
|
|
13
|
+
/** Sync saved flow files (the shared regression suite). */
|
|
14
|
+
flows: boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare const DEFAULT_SYNC_POLICY: SyncPolicy;
|
|
17
|
+
/** Where a verification actually executes. Reserved for the hosted-runner path; default local. */
|
|
18
|
+
export declare const VerifyMode: {
|
|
19
|
+
readonly LOCAL: "local";
|
|
20
|
+
readonly SERVER: "server";
|
|
21
|
+
};
|
|
22
|
+
export type VerifyMode = (typeof VerifyMode)[keyof typeof VerifyMode];
|
|
23
|
+
/** The resolved cloud picture for one project. `config === null` ⇒ cloud NOT attached (stay 100% local). */
|
|
24
|
+
export interface ProjectCloud {
|
|
25
|
+
config: CloudConfig | null;
|
|
26
|
+
policy: SyncPolicy;
|
|
27
|
+
verify: VerifyMode;
|
|
28
|
+
/** The cloud project id this project is linked to (for display/logging); null when env-fallback. */
|
|
29
|
+
projectId: string | null;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Resolve the cloud picture for a project rooted at `reticleRoot`. Reads the project's link file + the
|
|
33
|
+
* user credential store; if the project isn't linked (no cloud.json), falls back to the global env creds
|
|
34
|
+
* so the single-project / CI flow is unchanged. `homeDir` is injected (testable; `os.homedir()` at call).
|
|
35
|
+
*/
|
|
36
|
+
export declare function resolveProjectCloud(fs: FileSystemPort, reticleRoot: string, homeDir: string, env: NodeJS.ProcessEnv): Promise<ProjectCloud>;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-project cloud resolution for a SHARED daemon. One reticle MCP/daemon serves many projects; each
|
|
3
|
+
* project declares its own cloud binding + sync policy in `<root>/.reticle/cloud.json`, and the SECRET
|
|
4
|
+
* (the API key) lives once per user in `~/.reticle/credentials.json` (keyed by cloud project id) — never
|
|
5
|
+
* in the repo. The daemon resolves "is cloud attached for THIS project, and what should I push where?"
|
|
6
|
+
* from those two files, falling back to the global `RETICLE_CLOUD_*` env vars for the single-project /
|
|
7
|
+
* CI case (backward compatible).
|
|
8
|
+
*
|
|
9
|
+
* Vercel-style split: `.reticle/cloud.json` is the safe-to-commit-but-gitignored binding, the key is a
|
|
10
|
+
* user-level credential. "Cloud attached" = a valid link file AND a key for its project id (or env creds).
|
|
11
|
+
*/
|
|
12
|
+
import { join } from 'node:path';
|
|
13
|
+
import { ReticleDir } from '@reticlehq/core';
|
|
14
|
+
import { resolveCloudConfig } from './cloud-sync.js';
|
|
15
|
+
/** `<reticleRoot>/cloud.json` — the project's cloud binding + sync policy (non-secret). */
|
|
16
|
+
export const CLOUD_LINK_FILE = 'cloud.json';
|
|
17
|
+
/** `~/.reticle/credentials.json` — the user's per-cloud-project API keys (the only secret). */
|
|
18
|
+
export const CREDENTIALS_FILE = 'credentials.json';
|
|
19
|
+
export const DEFAULT_SYNC_POLICY = { runs: true, memory: true, flows: true };
|
|
20
|
+
/** Where a verification actually executes. Reserved for the hosted-runner path; default local. */
|
|
21
|
+
export const VerifyMode = { LOCAL: 'local', SERVER: 'server' };
|
|
22
|
+
const asBool = (v, fallback) => (typeof v === 'boolean' ? v : fallback);
|
|
23
|
+
/** Read + JSON-parse a file, or null on any problem (missing/malformed) — never throws. */
|
|
24
|
+
async function readJson(fs, path) {
|
|
25
|
+
try {
|
|
26
|
+
if (!(await fs.exists(path)))
|
|
27
|
+
return null;
|
|
28
|
+
return JSON.parse(await fs.readFile(path));
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/** Validate the shape of `.reticle/cloud.json`. Requires projectId + url; policy/verify default in. */
|
|
35
|
+
function parseLink(raw) {
|
|
36
|
+
if (typeof raw !== 'object' || raw === null)
|
|
37
|
+
return null;
|
|
38
|
+
const o = raw;
|
|
39
|
+
if (typeof o.projectId !== 'string' || o.projectId.length === 0)
|
|
40
|
+
return null;
|
|
41
|
+
if (typeof o.url !== 'string' || o.url.length === 0)
|
|
42
|
+
return null;
|
|
43
|
+
const sync = typeof o.sync === 'object' && o.sync !== null ? o.sync : {};
|
|
44
|
+
return {
|
|
45
|
+
projectId: o.projectId,
|
|
46
|
+
url: o.url,
|
|
47
|
+
sync: {
|
|
48
|
+
runs: asBool(sync.runs, DEFAULT_SYNC_POLICY.runs),
|
|
49
|
+
memory: asBool(sync.memory, DEFAULT_SYNC_POLICY.memory),
|
|
50
|
+
flows: asBool(sync.flows, DEFAULT_SYNC_POLICY.flows),
|
|
51
|
+
},
|
|
52
|
+
verify: o.verify === VerifyMode.SERVER ? VerifyMode.SERVER : VerifyMode.LOCAL,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/** Look up the API key for a cloud project id in the user credentials map. */
|
|
56
|
+
function credentialFor(raw, projectId) {
|
|
57
|
+
if (typeof raw !== 'object' || raw === null)
|
|
58
|
+
return null;
|
|
59
|
+
const key = raw[projectId];
|
|
60
|
+
return typeof key === 'string' && key.length > 0 ? key : null;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Resolve the cloud picture for a project rooted at `reticleRoot`. Reads the project's link file + the
|
|
64
|
+
* user credential store; if the project isn't linked (no cloud.json), falls back to the global env creds
|
|
65
|
+
* so the single-project / CI flow is unchanged. `homeDir` is injected (testable; `os.homedir()` at call).
|
|
66
|
+
*/
|
|
67
|
+
export async function resolveProjectCloud(fs, reticleRoot, homeDir, env) {
|
|
68
|
+
const link = parseLink(await readJson(fs, join(reticleRoot, CLOUD_LINK_FILE)));
|
|
69
|
+
if (link === null) {
|
|
70
|
+
// No per-project link → the env vars are the whole story (legacy single-project / CI behaviour).
|
|
71
|
+
return {
|
|
72
|
+
config: resolveCloudConfig(env),
|
|
73
|
+
policy: DEFAULT_SYNC_POLICY,
|
|
74
|
+
verify: VerifyMode.LOCAL,
|
|
75
|
+
projectId: null,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
const policy = {
|
|
79
|
+
runs: link.sync.runs ?? DEFAULT_SYNC_POLICY.runs,
|
|
80
|
+
memory: link.sync.memory ?? DEFAULT_SYNC_POLICY.memory,
|
|
81
|
+
flows: link.sync.flows ?? DEFAULT_SYNC_POLICY.flows,
|
|
82
|
+
};
|
|
83
|
+
const key = credentialFor(await readJson(fs, join(homeDir, ReticleDir.ROOT, CREDENTIALS_FILE)), link.projectId);
|
|
84
|
+
const config = key !== null ? { url: link.url.replace(/\/+$/, ''), apiKey: key } : null;
|
|
85
|
+
return { config, policy, verify: link.verify, projectId: link.projectId };
|
|
86
|
+
}
|