@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
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anonymous adoption telemetry — the OSS runtime's ONLY phone-home for product metrics (DAU/WAU/MAU,
|
|
3
|
+
* invocations, sessions, installs, tool usage). It answers the "npm downloads don't count, show me
|
|
4
|
+
* platform usage" question without collecting anything personal:
|
|
5
|
+
*
|
|
6
|
+
* - identity is a random UUID minted locally at `~/.reticle/telemetry-id` (never derived from you),
|
|
7
|
+
* - the project is a one-way HASH of the cwd (counts DISTINCT projects, reveals none),
|
|
8
|
+
* - it is strictly opt-OUT: `RETICLE_TELEMETRY=0` or the `DO_NOT_TRACK` convention disables it,
|
|
9
|
+
* - it is best-effort and non-blocking: a send failure NEVER changes what the tool does.
|
|
10
|
+
*
|
|
11
|
+
* Events are `@reticlehq/core`'s `TelemetryEventSchema`, mapped at the wire into PostHog's capture
|
|
12
|
+
* format (https://posthog.com/docs/api/capture) — PostHog is the analytics backend until Reticle Cloud
|
|
13
|
+
* grows its own; a project API key is WRITE-ONLY by design, so embedding it in an OSS client is safe.
|
|
14
|
+
* Everything here is wrapped so a telemetry bug can never surface to a user — a broken metric must not
|
|
15
|
+
* break a verification.
|
|
16
|
+
*/
|
|
17
|
+
import { spawn } from 'node:child_process';
|
|
18
|
+
import { randomUUID, createHash } from 'node:crypto';
|
|
19
|
+
import { readFileSync, writeFileSync, mkdirSync, existsSync, rmSync } from 'node:fs';
|
|
20
|
+
import { homedir, platform } from 'node:os';
|
|
21
|
+
import { join } from 'node:path';
|
|
22
|
+
import { TelemetryEventKind, TELEMETRY_EVENT_VERSION, ProjectIdSource, } from '@reticlehq/core';
|
|
23
|
+
import { SERVER_VERSION } from '../server-version.js';
|
|
24
|
+
const RETICLE_DIR = join(homedir(), '.reticle');
|
|
25
|
+
const ID_FILE = join(RETICLE_DIR, 'telemetry-id');
|
|
26
|
+
const NOTICE_FILE = join(RETICLE_DIR, 'telemetry-notice-shown');
|
|
27
|
+
/** Presence of this file = a persistent, machine-wide opt-out (`reticle telemetry disable`). */
|
|
28
|
+
const OPT_OUT_FILE = join(RETICLE_DIR, 'telemetry-opt-out');
|
|
29
|
+
/** Where the full disclosure lives — printed in the first-run notice and `reticle telemetry status`. */
|
|
30
|
+
const POLICY_URL = 'https://github.com/reticlehq/reticle/blob/main/docs/telemetry.md';
|
|
31
|
+
/** PostHog batch-capture endpoint (US cloud). `RETICLE_TELEMETRY_URL` overrides the host (EU/self-host). */
|
|
32
|
+
const DEFAULT_URL = 'https://us.i.posthog.com';
|
|
33
|
+
const TELEMETRY_PATH = '/batch/';
|
|
34
|
+
/**
|
|
35
|
+
* The write-only PostHog project key (safe to embed: it can only WRITE events, never read anything —
|
|
36
|
+
* PostHog's own docs ship it in client-side JS). `RETICLE_TELEMETRY_KEY` overrides it; empty disables.
|
|
37
|
+
*/
|
|
38
|
+
const POSTHOG_KEY = 'phc_q4yCxKMXHfWQ43VAz4HxJXZFLqFi4nBbg5v3avemggYo';
|
|
39
|
+
/**
|
|
40
|
+
* Skip PostHog person-profile processing: our users are anonymous by construction (never $identify'd),
|
|
41
|
+
* so profiles buy nothing — and personless events are up to 4x cheaper while unique counts/retention
|
|
42
|
+
* still key on distinct_id.
|
|
43
|
+
*/
|
|
44
|
+
const POSTHOG_PERSONLESS = { $process_person_profile: false };
|
|
45
|
+
const SEND_TIMEOUT_MS = 2000;
|
|
46
|
+
/**
|
|
47
|
+
* The sender a `detach: true` emit runs in a disowned child (argv: [url, body]) — an in-process fetch
|
|
48
|
+
* keeps Node's event loop alive until the POST finishes, which taxed every short-lived CLI command
|
|
49
|
+
* (`reticle version`/`gate`) ~800ms. Long-lived daemon events still send in-process: a spawn per tool
|
|
50
|
+
* call would be far heavier than a fetch inside an already-running server.
|
|
51
|
+
*/
|
|
52
|
+
const DETACHED_SEND_SCRIPT = "fetch(process.argv[1],{method:'POST',headers:{'content-type':'application/json'}," +
|
|
53
|
+
`body:process.argv[2],signal:AbortSignal.timeout(${SEND_TIMEOUT_MS})})` +
|
|
54
|
+
'.catch(()=>{}).finally(()=>process.exit(0))';
|
|
55
|
+
/** Env var names — mirror cloud-sync's `RETICLE_*` convention. */
|
|
56
|
+
import { isReticleSourceCheckout } from './dev-repo.js';
|
|
57
|
+
import { gitFacts } from './git-facts.js';
|
|
58
|
+
const Env = {
|
|
59
|
+
DISABLE: 'RETICLE_TELEMETRY', // "0" / "false" / "off" → disabled
|
|
60
|
+
DO_NOT_TRACK: 'DO_NOT_TRACK', // the cross-tool opt-out convention (any truthy value)
|
|
61
|
+
URL: 'RETICLE_TELEMETRY_URL', // override the PostHog host (EU cloud / self-hosted)
|
|
62
|
+
KEY: 'RETICLE_TELEMETRY_KEY', // override the PostHog project key
|
|
63
|
+
CI: 'CI', // presence marks a CI environment
|
|
64
|
+
VITEST: 'VITEST', // set by vitest — unit tests must never phone home
|
|
65
|
+
};
|
|
66
|
+
const isDisabled = (env, cwd = process.cwd()) => {
|
|
67
|
+
const off = new Set(['0', 'false', 'off', 'no']);
|
|
68
|
+
if (off.has((env[Env.DISABLE] ?? '').toLowerCase()))
|
|
69
|
+
return true;
|
|
70
|
+
if (env[Env.VITEST] !== undefined)
|
|
71
|
+
return true; // a test run is not a user
|
|
72
|
+
// Developing Reticle is not using Reticle. The `.env` carrying RETICLE_TELEMETRY=0 is gitignored,
|
|
73
|
+
// so it only exists on the machine that made it — a fresh clone would phone home on a
|
|
74
|
+
// contributor's first `reticle serve`. The repo marker is committed, so this guarantee travels.
|
|
75
|
+
if (isReticleSourceCheckout(cwd))
|
|
76
|
+
return true;
|
|
77
|
+
const dnt = env[Env.DO_NOT_TRACK];
|
|
78
|
+
return typeof dnt === 'string' && dnt !== '' && dnt !== '0';
|
|
79
|
+
};
|
|
80
|
+
/** Read (or mint-and-persist) the anonymous machine id. `firstRun` is true the run that created it. */
|
|
81
|
+
const resolveIdentity = () => {
|
|
82
|
+
try {
|
|
83
|
+
if (existsSync(ID_FILE)) {
|
|
84
|
+
const id = readFileSync(ID_FILE, 'utf8').trim();
|
|
85
|
+
if (id.length > 0)
|
|
86
|
+
return { anonymousId: id, firstRun: false };
|
|
87
|
+
}
|
|
88
|
+
const id = randomUUID();
|
|
89
|
+
mkdirSync(RETICLE_DIR, { recursive: true });
|
|
90
|
+
writeFileSync(ID_FILE, id, 'utf8');
|
|
91
|
+
return { anonymousId: id, firstRun: true };
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
// Can't persist (read-only home, sandbox): still report, just as a fresh ephemeral id each time.
|
|
95
|
+
return { anonymousId: randomUUID(), firstRun: false };
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
/**
|
|
99
|
+
* One-way project fingerprint: distinct-count of this = "projects Reticle is used in", reveals nothing.
|
|
100
|
+
*
|
|
101
|
+
* Prefers a hash of the git ORIGIN over a hash of the cwd. The contract in `@reticlehq/core` always
|
|
102
|
+
* said "one-way hash of the git remote (or cwd)", but the implementation only ever hashed the path —
|
|
103
|
+
* which meant the same repo cloned by four teammates, or checked out twice on one machine, counted as
|
|
104
|
+
* four separate projects. That inflates the project count and, worse, makes team adoption look like
|
|
105
|
+
* unrelated individuals. Hashing the origin dedupes a real project down to one id across every clone.
|
|
106
|
+
*
|
|
107
|
+
* Still one-way, still non-reversible, and still exactly what the published policy describes: the
|
|
108
|
+
* remote URL itself never leaves the machine, only its SHA-256. The URL is normalized first (scheme,
|
|
109
|
+
* credentials, `.git` suffix and case removed) so `git@github.com:acme/web.git` and
|
|
110
|
+
* `https://github.com/Acme/web` are recognized as the same project rather than two.
|
|
111
|
+
*/
|
|
112
|
+
const projectFingerprint = (cwd) => {
|
|
113
|
+
const { origin } = gitFacts(cwd);
|
|
114
|
+
return {
|
|
115
|
+
projectId: createHash('sha256')
|
|
116
|
+
.update(origin ?? cwd)
|
|
117
|
+
.digest('hex')
|
|
118
|
+
.slice(0, 32),
|
|
119
|
+
// Reported alongside so the analytics knows whether this id is comparable to another machine's.
|
|
120
|
+
source: origin !== undefined ? ProjectIdSource.GIT_ORIGIN : ProjectIdSource.CWD,
|
|
121
|
+
};
|
|
122
|
+
};
|
|
123
|
+
/** Print the opt-out notice exactly once per machine (honest disclosure, the OSS-trust bar). */
|
|
124
|
+
const showNoticeOnce = () => {
|
|
125
|
+
try {
|
|
126
|
+
if (existsSync(NOTICE_FILE))
|
|
127
|
+
return;
|
|
128
|
+
mkdirSync(RETICLE_DIR, { recursive: true });
|
|
129
|
+
writeFileSync(NOTICE_FILE, '1', 'utf8');
|
|
130
|
+
process.stderr.write('reticle: anonymous usage telemetry helps improve reticle — no code, no PII, ' +
|
|
131
|
+
`and your app's data never leaves your machine (${POLICY_URL}). ` +
|
|
132
|
+
'Opt out any time: reticle telemetry disable\n');
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
/* notice is a courtesy; never fail on it */
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
/** The current telemetry state and which control set it — what `reticle telemetry status` prints. */
|
|
139
|
+
export const describeTelemetry = (env = process.env, dir = RETICLE_DIR, cwd = process.cwd()) => {
|
|
140
|
+
// Report the reason that ACTUALLY applies. Saying "environment variable" when the real cause is
|
|
141
|
+
// the source-checkout guard would send a contributor hunting for a variable that is not set.
|
|
142
|
+
if (isReticleSourceCheckout(cwd)) {
|
|
143
|
+
return {
|
|
144
|
+
enabled: false,
|
|
145
|
+
reason: 'this is a Reticle source checkout — developing it is not using it',
|
|
146
|
+
policyUrl: POLICY_URL,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
if (isDisabled(env, cwd)) {
|
|
150
|
+
return { enabled: false, reason: 'disabled by environment variable', policyUrl: POLICY_URL };
|
|
151
|
+
}
|
|
152
|
+
if (existsSync(join(dir, 'telemetry-opt-out'))) {
|
|
153
|
+
return {
|
|
154
|
+
enabled: false,
|
|
155
|
+
reason: 'disabled via `reticle telemetry disable`',
|
|
156
|
+
policyUrl: POLICY_URL,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
return {
|
|
160
|
+
enabled: true,
|
|
161
|
+
reason: 'anonymous usage metrics only — no code, no PII',
|
|
162
|
+
policyUrl: POLICY_URL,
|
|
163
|
+
};
|
|
164
|
+
};
|
|
165
|
+
/** Persist (or lift) the machine-wide opt-out — `reticle telemetry disable` / `enable`. */
|
|
166
|
+
export const setTelemetryEnabled = (enabled, dir = RETICLE_DIR) => {
|
|
167
|
+
const optOutFile = join(dir, 'telemetry-opt-out');
|
|
168
|
+
if (enabled) {
|
|
169
|
+
rmSync(optOutFile, { force: true });
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
mkdirSync(dir, { recursive: true });
|
|
173
|
+
writeFileSync(optOutFile, '1', 'utf8');
|
|
174
|
+
};
|
|
175
|
+
const NOOP = { emit: async () => { }, enabled: false, firstRun: false };
|
|
176
|
+
/**
|
|
177
|
+
* Build the telemetry emitter for this process. Resolves identity + opt-out ONCE; each `emit` builds a
|
|
178
|
+
* fully-validated core event, maps it into PostHog capture shape, and fires a best-effort POST.
|
|
179
|
+
* `version` is the running reticle version (for the `version` dimension); `now`/`fetchImpl` are
|
|
180
|
+
* injected so this is testable without a clock or network.
|
|
181
|
+
*/
|
|
182
|
+
export const createTelemetry = (opts) => {
|
|
183
|
+
const env = opts.env ?? process.env;
|
|
184
|
+
const cwd = opts.cwd ?? process.cwd();
|
|
185
|
+
if (isDisabled(env, cwd))
|
|
186
|
+
return NOOP;
|
|
187
|
+
try {
|
|
188
|
+
if (existsSync(OPT_OUT_FILE))
|
|
189
|
+
return NOOP; // the persistent `reticle telemetry disable` opt-out
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
/* unreadable home dir — fall through; the env-var opt-outs above still apply */
|
|
193
|
+
}
|
|
194
|
+
const apiKey = env[Env.KEY] ?? POSTHOG_KEY;
|
|
195
|
+
if (apiKey === '')
|
|
196
|
+
return NOOP; // no key baked in (dev/test build) — nowhere to send, stay silent
|
|
197
|
+
const now = opts.now ?? (() => Date.now());
|
|
198
|
+
const doFetch = opts.fetchImpl ?? fetch;
|
|
199
|
+
const url = `${(env[Env.URL] ?? DEFAULT_URL).replace(/\/+$/, '')}${TELEMETRY_PATH}`;
|
|
200
|
+
const ci = env[Env.CI] !== undefined && env[Env.CI] !== '';
|
|
201
|
+
const os = platform();
|
|
202
|
+
const { anonymousId, firstRun } = resolveIdentity();
|
|
203
|
+
/**
|
|
204
|
+
* One id per PROCESS, minted in memory and never persisted — which is exactly right: a daemon run
|
|
205
|
+
* IS the session, and a restarted daemon is genuinely a new one. Ephemeral by construction, so it
|
|
206
|
+
* adds no durable identifier to the machine.
|
|
207
|
+
*/
|
|
208
|
+
const sessionId = randomUUID();
|
|
209
|
+
const { projectId, source: projectIdSource } = projectFingerprint(opts.cwd ?? process.cwd());
|
|
210
|
+
showNoticeOnce();
|
|
211
|
+
const spawnDetached = opts.spawnImpl ??
|
|
212
|
+
((command, args) => {
|
|
213
|
+
spawn(command, args, { detached: true, stdio: 'ignore' }).unref();
|
|
214
|
+
});
|
|
215
|
+
const emit = async (kind, extra) => {
|
|
216
|
+
const event = {
|
|
217
|
+
v: TELEMETRY_EVENT_VERSION,
|
|
218
|
+
anonymousId,
|
|
219
|
+
sessionId,
|
|
220
|
+
projectId,
|
|
221
|
+
event: kind,
|
|
222
|
+
ts: now(),
|
|
223
|
+
version: opts.version,
|
|
224
|
+
ci,
|
|
225
|
+
os,
|
|
226
|
+
projectIdSource,
|
|
227
|
+
...(extra?.actor !== undefined ? { actor: extra.actor } : {}),
|
|
228
|
+
...(extra?.command !== undefined ? { command: extra.command } : {}),
|
|
229
|
+
...(extra?.flags !== undefined ? { flags: extra.flags } : {}),
|
|
230
|
+
...(extra?.session !== undefined ? { session: extra.session } : {}),
|
|
231
|
+
...(extra?.project !== undefined ? { project: extra.project } : {}),
|
|
232
|
+
...(extra?.verification !== undefined ? { verification: extra.verification } : {}),
|
|
233
|
+
...(extra?.versionChange !== undefined ? { versionChange: extra.versionChange } : {}),
|
|
234
|
+
...(extra?.crash !== undefined ? { crash: extra.crash } : {}),
|
|
235
|
+
...(extra?.feedback !== undefined ? { feedback: extra.feedback } : {}),
|
|
236
|
+
...(extra?.identity !== undefined ? { identity: extra.identity } : {}),
|
|
237
|
+
...(extra?.connection !== undefined ? { connection: extra.connection } : {}),
|
|
238
|
+
...(extra?.init !== undefined ? { init: extra.init } : {}),
|
|
239
|
+
...(extra?.bug !== undefined ? { bug: extra.bug } : {}),
|
|
240
|
+
};
|
|
241
|
+
// Map the core contract onto PostHog's capture shape: id/name/time move up, the rest are properties.
|
|
242
|
+
// The feedback body is FLATTENED into `feedback_*` properties rather than sent as a nested object:
|
|
243
|
+
// PostHog filters and breakdowns operate on top-level properties, so a nested `feedback.stack`
|
|
244
|
+
// would be invisible to the exact "which stacks report the most bugs" question this exists to
|
|
245
|
+
// answer. One prefix keeps them grouped in the UI without a nested path.
|
|
246
|
+
const { anonymousId: distinctId, event: name, ts, sessionId: eventSessionId, feedback, session, project, verification, versionChange, crash, identity, connection, init, bug, ...rest } = event;
|
|
247
|
+
// `$session_id` is PostHog's OWN session property, so sending ours under that name lights up
|
|
248
|
+
// its built-in session views and funnels for free rather than requiring custom HogQL everywhere.
|
|
249
|
+
const properties = {
|
|
250
|
+
...rest,
|
|
251
|
+
sessionId: eventSessionId,
|
|
252
|
+
$session_id: eventSessionId,
|
|
253
|
+
};
|
|
254
|
+
// Each block is flattened under its own prefix rather than nested. PostHog filters, breakdowns and
|
|
255
|
+
// insight builders all operate on TOP-LEVEL properties, so a nested `project.stack` is invisible to
|
|
256
|
+
// the exact "which stacks retain best" question these exist to answer — you would have to drop to
|
|
257
|
+
// raw HogQL for every chart. One prefix per block keeps them grouped in the property list without
|
|
258
|
+
// paying that cost. The two genuine maps (`toolCounts`, `errorKinds`) stay objects: their keys are
|
|
259
|
+
// open-ended, so flattening them would mint an unbounded number of property names, which is the one
|
|
260
|
+
// thing that actually degrades a PostHog project.
|
|
261
|
+
const blocks = {
|
|
262
|
+
feedback,
|
|
263
|
+
session,
|
|
264
|
+
project,
|
|
265
|
+
verification,
|
|
266
|
+
version: versionChange,
|
|
267
|
+
crash,
|
|
268
|
+
identity,
|
|
269
|
+
connection,
|
|
270
|
+
init,
|
|
271
|
+
bug,
|
|
272
|
+
};
|
|
273
|
+
for (const [prefix, block] of Object.entries(blocks)) {
|
|
274
|
+
for (const [key, value] of Object.entries(block ?? {})) {
|
|
275
|
+
properties[`${prefix}_${key}`] = value;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
const body = JSON.stringify({
|
|
279
|
+
api_key: apiKey,
|
|
280
|
+
batch: [
|
|
281
|
+
{
|
|
282
|
+
event: name,
|
|
283
|
+
distinct_id: distinctId,
|
|
284
|
+
timestamp: new Date(ts).toISOString(),
|
|
285
|
+
properties: { ...properties, ...POSTHOG_PERSONLESS },
|
|
286
|
+
},
|
|
287
|
+
],
|
|
288
|
+
});
|
|
289
|
+
try {
|
|
290
|
+
if (extra?.detach === true && opts.fetchImpl === undefined) {
|
|
291
|
+
spawnDetached(process.execPath, ['-e', DETACHED_SEND_SCRIPT, url, body]);
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
await doFetch(url, {
|
|
295
|
+
method: 'POST',
|
|
296
|
+
headers: { 'content-type': 'application/json' },
|
|
297
|
+
body,
|
|
298
|
+
signal: AbortSignal.timeout(SEND_TIMEOUT_MS),
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
catch {
|
|
302
|
+
/* best-effort: a lost metric must never surface to the user */
|
|
303
|
+
}
|
|
304
|
+
};
|
|
305
|
+
return { emit, enabled: true, firstRun };
|
|
306
|
+
};
|
|
307
|
+
/**
|
|
308
|
+
* The process-wide emitter. One identity resolution + one opt-out check per process; both the CLI
|
|
309
|
+
* lifecycle (install/invoke/session) and the per-tool hook in `runTool` share it.
|
|
310
|
+
*/
|
|
311
|
+
let singleton;
|
|
312
|
+
export const getTelemetry = () => (singleton ??= createTelemetry({ version: SERVER_VERSION }));
|
|
313
|
+
export { TelemetryEventKind };
|
package/dist/token-auth.d.ts
CHANGED
|
@@ -21,4 +21,3 @@ export declare function isLoopbackHost(hostHeader: string | undefined): boolean;
|
|
|
21
21
|
* non-loopback value fails, which is what kills a rebound `http://evil.com` page reading the plane.
|
|
22
22
|
*/
|
|
23
23
|
export declare function isLocalWebOrigin(origin: string | undefined, referer: string | undefined): boolean;
|
|
24
|
-
//# sourceMappingURL=token-auth.d.ts.map
|
package/dist/token-auth.js
CHANGED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { ExpectedLink } from '../capsule/divergence.js';
|
|
2
|
+
import type { DivergenceCapsule } from '../capsule/capsule.js';
|
|
3
|
+
import type { ToolDeps } from './tool-kit.js';
|
|
4
|
+
interface CapsuleSaveInputs {
|
|
5
|
+
deps: ToolDeps;
|
|
6
|
+
verdict: {
|
|
7
|
+
pass: boolean;
|
|
8
|
+
failureReason?: string;
|
|
9
|
+
};
|
|
10
|
+
capsule?: DivergenceCapsule | undefined;
|
|
11
|
+
links: readonly ExpectedLink[];
|
|
12
|
+
args: Record<string, unknown>;
|
|
13
|
+
actResult: {
|
|
14
|
+
result?: unknown;
|
|
15
|
+
};
|
|
16
|
+
actedSource?: {
|
|
17
|
+
file: string;
|
|
18
|
+
line: number;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
/** Returns the capsule id when one was written, or undefined when there was nothing to save. */
|
|
22
|
+
export declare function saveFailedAssertCapsule(inputs: CapsuleSaveInputs): Promise<string | undefined>;
|
|
23
|
+
export {};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persist a failed assertion as a replayable fail-to-pass capsule.
|
|
3
|
+
*
|
|
4
|
+
* : a red assertion is the ONE moment the evidence explaining it is in hand. Persist it as a
|
|
5
|
+
// replayable fail-to-pass capsule so the bug survives the turn — and becomes a regression flow
|
|
6
|
+
// the moment it goes green. Best-effort: capturing evidence must never fail the run that found it.
|
|
7
|
+
*
|
|
8
|
+
* Split out of act-tools.ts when it crossed the 600-line cap. The seam is real: this is the only
|
|
9
|
+
* part of the act path that writes to disk, and it is best-effort by design — capturing evidence
|
|
10
|
+
* must never fail the run that found it.
|
|
11
|
+
*/
|
|
12
|
+
import { ActionType, AnchorKind } from '@reticlehq/core';
|
|
13
|
+
import { CapsuleStore, capsuleId } from '../capsule/capsule-store.js';
|
|
14
|
+
import { ReticleTool } from './tool-names.js';
|
|
15
|
+
import { asRecord, asString } from './tools-helpers.js';
|
|
16
|
+
/** Returns the capsule id when one was written, or undefined when there was nothing to save. */
|
|
17
|
+
export async function saveFailedAssertCapsule(inputs) {
|
|
18
|
+
const { deps, verdict, capsule, links, args, actResult, actedSource } = inputs;
|
|
19
|
+
if (verdict.pass || capsule === undefined)
|
|
20
|
+
return undefined;
|
|
21
|
+
const id = capsuleId(deps.now(), asString(args['ref']) ?? 'assert');
|
|
22
|
+
const expectedText = links
|
|
23
|
+
.map((l) => ('name' in l ? `${l.kind} ${String(l.name)}` : l.kind))
|
|
24
|
+
.join(' AND ');
|
|
25
|
+
const saved = await new CapsuleStore(deps.fs, deps.reticleRoot).save({
|
|
26
|
+
version: 1,
|
|
27
|
+
id,
|
|
28
|
+
createdAt: deps.now(),
|
|
29
|
+
origin: 'failed-assert',
|
|
30
|
+
expected: expectedText.length > 0 ? expectedText : 'declared consequence',
|
|
31
|
+
observed: capsule.firstDivergence?.observed ?? verdict.failureReason ?? 'not observed',
|
|
32
|
+
steps: [
|
|
33
|
+
{
|
|
34
|
+
tool: ReticleTool.ACT,
|
|
35
|
+
anchor: {
|
|
36
|
+
kind: AnchorKind.TESTID,
|
|
37
|
+
value: asString(asRecord(actResult.result)['testid']) ?? asString(args['ref']) ?? '',
|
|
38
|
+
// Carried so the saved capsule — which outlives this turn and becomes a regression flow
|
|
39
|
+
// when it goes green — still knows which file the failure came from.
|
|
40
|
+
...(actedSource === undefined ? {} : { source: actedSource }),
|
|
41
|
+
},
|
|
42
|
+
action: (asString(args['action']) ?? ActionType.CLICK),
|
|
43
|
+
},
|
|
44
|
+
],
|
|
45
|
+
});
|
|
46
|
+
return saved ? id : undefined;
|
|
47
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ActionType } from '@reticlehq/core';
|
|
2
|
+
export declare function assertNotDestructive(action: ActionType, innerArgs: Record<string, unknown>, inspected: unknown): void;
|
|
3
|
+
/**
|
|
4
|
+
* A drag is judged on BOTH ends. Dropping a harmless row onto "Delete" is destructive, and the
|
|
5
|
+
* source alone never says so.
|
|
6
|
+
*/
|
|
7
|
+
export declare function assertDragNotDestructive(innerArgs: Record<string, unknown>, from: unknown, to: unknown): void;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { ActionType, DANGEROUS_ACTION_CONFIRM_ARG, isDangerousActionText } from '@reticlehq/core';
|
|
2
|
+
import { asRecord, asString } from './tools-helpers.js';
|
|
3
|
+
/**
|
|
4
|
+
* Refuse to drive a money-moving or destructive control by accident.
|
|
5
|
+
*
|
|
6
|
+
* A native click is indistinguishable from a user's, so an agent exploring an unfamiliar app can
|
|
7
|
+
* refund a payment or delete an account while "just looking". The guard reads every text surface the
|
|
8
|
+
* control exposes — its name, its text, its value, where it points, and the form it submits — because
|
|
9
|
+
* a button labelled only with an icon still says what it does through its `formAction`.
|
|
10
|
+
*
|
|
11
|
+
* Opt in per action with `args.confirmDangerous: true`. Deliberately a THROW rather than a warning:
|
|
12
|
+
* a caller that has not thought about it must not proceed by ignoring a field.
|
|
13
|
+
*/
|
|
14
|
+
function descriptorText(value) {
|
|
15
|
+
const descriptor = asRecord(value);
|
|
16
|
+
return [
|
|
17
|
+
asString(descriptor['name']) ?? '',
|
|
18
|
+
asString(descriptor['text']) ?? '',
|
|
19
|
+
asString(descriptor['value']) ?? '',
|
|
20
|
+
asString(descriptor['href']) ?? '',
|
|
21
|
+
asString(descriptor['formAction']) ?? '',
|
|
22
|
+
asString(descriptor['formText']) ?? '',
|
|
23
|
+
].join(' ');
|
|
24
|
+
}
|
|
25
|
+
export function assertNotDestructive(action, innerArgs, inspected) {
|
|
26
|
+
if (action !== ActionType.CLICK && action !== ActionType.DBLCLICK)
|
|
27
|
+
return;
|
|
28
|
+
if (innerArgs[DANGEROUS_ACTION_CONFIRM_ARG] === true)
|
|
29
|
+
return;
|
|
30
|
+
if (!isDangerousActionText(descriptorText(inspected)))
|
|
31
|
+
return;
|
|
32
|
+
throw new Error(`potentially destructive native action blocked; retry with args.${DANGEROUS_ACTION_CONFIRM_ARG}=true`);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* A drag is judged on BOTH ends. Dropping a harmless row onto "Delete" is destructive, and the
|
|
36
|
+
* source alone never says so.
|
|
37
|
+
*/
|
|
38
|
+
export function assertDragNotDestructive(innerArgs, from, to) {
|
|
39
|
+
if (innerArgs[DANGEROUS_ACTION_CONFIRM_ARG] === true)
|
|
40
|
+
return;
|
|
41
|
+
if (!isDangerousActionText(`${descriptorText(from)} ${descriptorText(to)}`))
|
|
42
|
+
return;
|
|
43
|
+
throw new Error(`potentially destructive native action blocked; retry with args.${DANGEROUS_ACTION_CONFIRM_ARG}=true`);
|
|
44
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure coercion + grading helpers behind the act tools.
|
|
3
|
+
*
|
|
4
|
+
* Split out when act-tools.ts crossed the 600-line cap. The seam is that nothing here touches a
|
|
5
|
+
* session, a command, or a tool definition — these are total functions over their arguments, which
|
|
6
|
+
* is why they can be tested without a browser and why they were the right thing to move.
|
|
7
|
+
*/
|
|
8
|
+
import { ActionType } from '@reticlehq/core';
|
|
9
|
+
import type { ElementBox } from '../input/real-input.js';
|
|
10
|
+
import { HonestyGrade } from '../honesty/honesty.js';
|
|
11
|
+
import type { ExpectedLink } from '../capsule/divergence.js';
|
|
12
|
+
/** The strongest consequence grade a set of expected links proves (signal > net > state > presence). */
|
|
13
|
+
export declare function gradeOf(links: readonly ExpectedLink[]): HonestyGrade;
|
|
14
|
+
/** Narrow an INSPECT result's `box` into a positive-area ElementBox (else undefined). */
|
|
15
|
+
export declare function asBox(value: unknown): ElementBox | undefined;
|
|
16
|
+
/** Outcome of a real-input attempt — real success (result set) or synthetic with a reason. */
|
|
17
|
+
export declare function asActionType(value: unknown): ActionType | undefined;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure coercion + grading helpers behind the act tools.
|
|
3
|
+
*
|
|
4
|
+
* Split out when act-tools.ts crossed the 600-line cap. The seam is that nothing here touches a
|
|
5
|
+
* session, a command, or a tool definition — these are total functions over their arguments, which
|
|
6
|
+
* is why they can be tested without a browser and why they were the right thing to move.
|
|
7
|
+
*/
|
|
8
|
+
import { ActionType } from '@reticlehq/core';
|
|
9
|
+
import { HonestyGrade } from '../honesty/honesty.js';
|
|
10
|
+
import { asNumber, asRecord, asString } from './tools-helpers.js';
|
|
11
|
+
/** The strongest consequence grade a set of expected links proves (signal > net > state > presence). */
|
|
12
|
+
export function gradeOf(links) {
|
|
13
|
+
if (links.some((l) => l.kind === 'signal'))
|
|
14
|
+
return HonestyGrade.SIGNAL;
|
|
15
|
+
if (links.some((l) => l.kind === 'net'))
|
|
16
|
+
return HonestyGrade.NET;
|
|
17
|
+
if (links.some((l) => l.kind === 'state'))
|
|
18
|
+
return HonestyGrade.STATE;
|
|
19
|
+
return HonestyGrade.PRESENCE;
|
|
20
|
+
}
|
|
21
|
+
/** Narrow an INSPECT result's `box` into a positive-area ElementBox (else undefined). */
|
|
22
|
+
export function asBox(value) {
|
|
23
|
+
const b = asRecord(asRecord(value)['box']);
|
|
24
|
+
const x = asNumber(b['x']);
|
|
25
|
+
const y = asNumber(b['y']);
|
|
26
|
+
const w = asNumber(b['width']);
|
|
27
|
+
const h = asNumber(b['height']);
|
|
28
|
+
if (x === undefined || y === undefined || w === undefined || h === undefined)
|
|
29
|
+
return undefined;
|
|
30
|
+
if (w <= 0 || h <= 0)
|
|
31
|
+
return undefined; // zero-area (display:none) ⇒ native click would miss
|
|
32
|
+
return { x, y, width: w, height: h };
|
|
33
|
+
}
|
|
34
|
+
/** Outcome of a real-input attempt — real success (result set) or synthetic with a reason. */
|
|
35
|
+
export function asActionType(value) {
|
|
36
|
+
const raw = asString(value);
|
|
37
|
+
if (raw === undefined)
|
|
38
|
+
return undefined;
|
|
39
|
+
return Object.values(ActionType).includes(raw) ? raw : undefined;
|
|
40
|
+
}
|
|
@@ -1,3 +1,10 @@
|
|
|
1
1
|
import { type ToolDef } from './tool-kit.js';
|
|
2
|
+
/**
|
|
3
|
+
* Narrow the wire's `action` to a real ActionType, or undefined.
|
|
4
|
+
*
|
|
5
|
+
* It used to be `asString(args['action']) ?? ''`, so an unknown or missing action became the empty
|
|
6
|
+
* string and travelled on — reaching the browser as a command it could not perform, and reported back
|
|
7
|
+
* as a generic failure rather than "that is not an action". Validate at the boundary, per the project's
|
|
8
|
+
* unknown-plus-narrowing rule, so a typo is rejected where it can still be explained.
|
|
9
|
+
*/
|
|
2
10
|
export declare const ACT_TOOLS: ToolDef[];
|
|
3
|
-
//# sourceMappingURL=act-tools.d.ts.map
|