@reticlehq/server 2.11.0 → 2.13.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/SKILL.md +93 -111
- package/dist/bridge/auth-failure-reason.d.ts +6 -2
- package/dist/bridge/auth-failure-reason.js +15 -8
- package/dist/bridge/bridge.d.ts +18 -14
- package/dist/bridge/bridge.js +248 -165
- package/dist/bridge/bridge.test-harness.d.ts +2 -0
- package/dist/bridge/bridge.test-harness.js +8 -1
- package/dist/bridge/pairing-token.d.ts +5 -0
- package/dist/bridge/pairing-token.js +28 -0
- package/dist/bridge/protocol-skew.d.ts +37 -0
- package/dist/bridge/protocol-skew.js +45 -0
- package/dist/capsule/capsule-store.d.ts +8 -7
- package/dist/capsule/capsule-store.js +1 -1
- package/dist/capsule/causal-summary.d.ts +2 -2
- package/dist/capsule/causal-summary.js +7 -2
- package/dist/chromium-launch-options.d.ts +28 -0
- package/dist/chromium-launch-options.js +29 -0
- package/dist/cli/cli-doctor.js +39 -1
- package/dist/cli/cli-flow-commands.d.ts +3 -1
- package/dist/cli/cli-flow-commands.js +34 -4
- package/dist/cli/cli-kill.d.ts +2 -1
- package/dist/cli/cli-launch.d.ts +11 -1
- package/dist/cli/cli-launch.js +59 -10
- package/dist/cli/cli-parse.d.ts +17 -1
- package/dist/cli/cli-parse.js +238 -12
- package/dist/cli/cli-update-commands.js +20 -1
- package/dist/cli/cli-verify.d.ts +2 -1
- package/dist/cli/cli-verify.js +5 -4
- package/dist/cli/cloud-cli.js +428 -253
- package/dist/cli/cloud-keystore.d.ts +37 -0
- package/dist/cli/cloud-keystore.js +97 -0
- package/dist/cli/cloud-kit.d.ts +37 -0
- package/dist/cli/cloud-kit.js +121 -0
- package/dist/cli/cloud-login.d.ts +17 -0
- package/dist/cli/cloud-login.js +183 -0
- package/dist/cli/cloud-session.d.ts +48 -0
- package/dist/cli/cloud-session.js +53 -0
- package/dist/cli/config-discovery.d.ts +2 -1
- package/dist/cli/config-discovery.js +1 -0
- package/dist/cli/daemon-start-options.d.ts +32 -0
- package/dist/cli/daemon-start-options.js +38 -0
- package/dist/cli/device-flow.d.ts +76 -0
- package/dist/cli/device-flow.js +56 -0
- package/dist/cli/doctor-rows.d.ts +12 -1
- package/dist/cli/doctor-rows.js +12 -1
- package/dist/cli/drive-attach.d.ts +13 -0
- package/dist/cli/drive-attach.js +18 -0
- package/dist/cli/drive-command.js +7 -3
- package/dist/cli/gate-exit.d.ts +21 -0
- package/dist/cli/gate-exit.js +21 -0
- package/dist/cli/gate-hook-message.d.ts +33 -0
- package/dist/cli/gate-hook-message.js +46 -0
- package/dist/cli/mcp-command.d.ts +25 -0
- package/dist/cli/mcp-command.js +174 -0
- package/dist/cli/project-name.d.ts +30 -0
- package/dist/cli/project-name.js +44 -0
- package/dist/cli/sibling-ports.d.ts +37 -0
- package/dist/cli/sibling-ports.js +56 -0
- package/dist/cli/status-next-action.d.ts +14 -0
- package/dist/cli/status-next-action.js +4 -4
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +167 -186
- package/dist/cloud/cloud-config.d.ts +24 -2
- package/dist/cloud/cloud-config.js +64 -5
- package/dist/cloud/cloud-sync.d.ts +16 -5
- package/dist/cloud/cloud-sync.js +64 -1
- package/dist/cloud/sync-cycle.d.ts +110 -0
- package/dist/cloud/sync-cycle.js +270 -0
- package/dist/cloud/sync-daemon.d.ts +69 -0
- package/dist/cloud/sync-daemon.js +260 -0
- package/dist/cloud/sync-disk.d.ts +9 -0
- package/dist/cloud/sync-disk.js +191 -0
- package/dist/cloud/sync-hash.d.ts +2 -0
- package/dist/cloud/sync-hash.js +35 -0
- package/dist/crawl/crawl-tools.js +5 -3
- package/dist/crawl/crawl.d.ts +12 -13
- package/dist/crawl/crawl.js +25 -3
- package/dist/daemon/daemon-resolve.d.ts +122 -0
- package/dist/daemon/daemon-resolve.js +187 -0
- package/dist/daemon/dev-servers.d.ts +15 -0
- package/dist/daemon/dev-servers.js +68 -0
- package/dist/daemon/free-port.d.ts +29 -0
- package/dist/daemon/free-port.js +55 -0
- package/dist/daemon/heartbeat.d.ts +0 -4
- package/dist/daemon/heartbeat.js +2 -2
- package/dist/daemon/wake-decision.d.ts +32 -0
- package/dist/daemon/wake-decision.js +38 -0
- package/dist/dev/stale-issue-guard.d.ts +0 -2
- package/dist/dev/stale-issue-guard.js +1 -1
- package/dist/domain/domain-tools.js +2 -2
- package/dist/events/contradictions.d.ts +59 -0
- package/dist/events/contradictions.js +253 -27
- package/dist/events/declared.d.ts +17 -0
- package/dist/events/declared.js +43 -1
- package/dist/events/echo-mismatch.js +65 -1
- package/dist/events/event-filters.d.ts +8 -0
- package/dist/events/event-filters.js +19 -2
- package/dist/events/observed-in-window.d.ts +12 -0
- package/dist/events/observed-in-window.js +17 -0
- package/dist/events/predicate-asks.d.ts +13 -0
- package/dist/events/predicate-asks.js +22 -0
- package/dist/events/predicate-eval.js +117 -27
- package/dist/events/predicate-parse.d.ts +0 -6
- package/dist/events/predicate-parse.js +43 -3
- package/dist/events/predicate-precheck.d.ts +8 -0
- package/dist/events/predicate-precheck.js +41 -0
- package/dist/events/predicate-route.d.ts +14 -0
- package/dist/events/predicate-route.js +36 -8
- package/dist/events/predicate-schema.d.ts +44 -0
- package/dist/events/predicate-schema.js +126 -23
- package/dist/events/predicate.d.ts +20 -0
- package/dist/events/predicate.js +77 -6
- package/dist/events/split-text-miss.d.ts +30 -0
- package/dist/events/split-text-miss.js +44 -0
- package/dist/flows/coverage.d.ts +0 -8
- package/dist/flows/coverage.js +1 -1
- package/dist/flows/decision.d.ts +5 -1
- package/dist/flows/decision.js +33 -7
- package/dist/flows/flake.d.ts +6 -8
- package/dist/flows/flake.js +1 -1
- package/dist/flows/flow-intent.d.ts +52 -0
- package/dist/flows/flow-intent.js +123 -0
- package/dist/flows/flow-memory-consult.d.ts +55 -0
- package/dist/flows/flow-memory-consult.js +38 -0
- package/dist/flows/flow-replay-run.d.ts +18 -7
- package/dist/flows/flow-replay-run.js +263 -23
- package/dist/flows/flow-replay.js +11 -2
- package/dist/flows/flow-step-runners.d.ts +8 -0
- package/dist/flows/flow-step-runners.js +8 -2
- package/dist/flows/flow-store-for-session.d.ts +31 -0
- package/dist/flows/flow-store-for-session.js +33 -0
- package/dist/flows/flow-success.js +15 -3
- package/dist/flows/flow-tools.js +87 -33
- package/dist/flows/flows.d.ts +14 -1
- package/dist/flows/flows.js +502 -24
- package/dist/flows/heal-run.js +5 -2
- package/dist/flows/predicate-to-expect.d.ts +17 -12
- package/dist/flows/predicate-to-expect.js +36 -15
- package/dist/flows/recordings.d.ts +13 -1
- package/dist/flows/recordings.js +17 -2
- package/dist/flows/replay.d.ts +22 -2
- package/dist/flows/replay.js +28 -2
- package/dist/flows/server-verify.js +16 -2
- package/dist/flows/verify-change-tools.js +9 -3
- package/dist/honesty/blind-spots.d.ts +51 -15
- package/dist/honesty/blind-spots.js +64 -4
- package/dist/honesty/feature-capture.d.ts +150 -0
- package/dist/honesty/feature-capture.js +233 -0
- package/dist/honesty/honesty.d.ts +24 -0
- package/dist/honesty/honesty.js +25 -1
- package/dist/honesty/instrumentation-gaps.d.ts +39 -6
- package/dist/honesty/instrumentation-gaps.js +88 -5
- package/dist/honesty/tool-hit-rate.d.ts +86 -0
- package/dist/honesty/tool-hit-rate.js +90 -0
- package/dist/honesty/undeclared-change.d.ts +51 -0
- package/dist/honesty/undeclared-change.js +56 -0
- package/dist/honesty/verified.d.ts +16 -0
- package/dist/honesty/verified.js +84 -5
- package/dist/http-server.d.ts +0 -1
- package/dist/http-server.js +13 -1
- package/dist/hunt/hunt-report.d.ts +0 -2
- package/dist/hunt/hunt-report.js +1 -1
- package/dist/impact/impact-recorder.d.ts +31 -8
- package/dist/impact/impact-recorder.js +104 -21
- package/dist/impact/impact-store.d.ts +13 -4
- package/dist/impact/impact-store.js +44 -3
- package/dist/index.d.ts +4 -1
- package/dist/index.js +113 -7
- package/dist/init/agent-rules.d.ts +30 -6
- package/dist/init/agent-rules.js +54 -13
- package/dist/init/astro-patch.d.ts +16 -0
- package/dist/init/astro-patch.js +28 -0
- package/dist/init/capabilities.d.ts +4 -3
- package/dist/init/capabilities.js +23 -3
- package/dist/init/closing-hint.d.ts +36 -0
- package/dist/init/closing-hint.js +120 -0
- package/dist/init/confirm.d.ts +27 -28
- package/dist/init/confirm.js +51 -11
- package/dist/init/cra.d.ts +34 -5
- package/dist/init/cra.js +96 -25
- package/dist/init/csp-check.js +17 -2
- package/dist/init/csp-doctor.d.ts +8 -1
- package/dist/init/csp-doctor.js +8 -3
- package/dist/init/dev-script.d.ts +50 -0
- package/dist/init/dev-script.js +66 -0
- package/dist/init/format-generated.d.ts +18 -0
- package/dist/init/format-generated.js +39 -0
- package/dist/init/install-hint.d.ts +9 -0
- package/dist/init/install-hint.js +29 -0
- package/dist/init/mcp-clients.d.ts +7 -0
- package/dist/init/mcp-clients.js +7 -0
- package/dist/init/mcp.d.ts +17 -6
- package/dist/init/mcp.js +27 -11
- package/dist/init/node-io.js +11 -1
- package/dist/init/plan-framework.d.ts +0 -5
- package/dist/init/plan-framework.js +147 -37
- package/dist/init/plan.d.ts +30 -37
- package/dist/init/plan.js +50 -60
- package/dist/init/preflight.d.ts +28 -0
- package/dist/init/preflight.js +38 -0
- package/dist/init/refresh-rules.d.ts +39 -0
- package/dist/init/refresh-rules.js +51 -0
- package/dist/init/run.d.ts +32 -35
- package/dist/init/run.js +151 -202
- package/dist/init/slash-command.d.ts +1 -1
- package/dist/init/snippets.js +90 -31
- package/dist/init/vite-config.d.ts +1 -1
- package/dist/init/vite-config.js +39 -25
- package/dist/init/workspace-apps.d.ts +17 -10
- package/dist/init/workspace-apps.js +110 -0
- package/dist/input/network-mock-tools.js +3 -6
- package/dist/input/real-input.d.ts +2 -0
- package/dist/input/real-input.js +28 -7
- package/dist/input/scroll-find.d.ts +7 -4
- package/dist/input/scroll-find.js +63 -25
- package/dist/input/scroll-tools.js +4 -6
- package/dist/input/viewport-tools.js +5 -4
- package/dist/intent/inline-intent.d.ts +37 -0
- package/dist/intent/inline-intent.js +193 -0
- package/dist/intent/intent-shard-store.d.ts +72 -0
- package/dist/intent/intent-shard-store.js +203 -0
- package/dist/intent/intent-shard.d.ts +411 -0
- package/dist/intent/intent-shard.js +176 -0
- package/dist/intent/intent-store.d.ts +49 -0
- package/dist/intent/intent-store.js +133 -0
- package/dist/intent/intent-subject.d.ts +45 -0
- package/dist/intent/intent-subject.js +177 -0
- package/dist/intent/intent-tools.d.ts +2 -0
- package/dist/intent/intent-tools.js +143 -0
- package/dist/intent/open-intents.d.ts +42 -0
- package/dist/intent/open-intents.js +40 -0
- package/dist/journal/envelope.d.ts +26 -26
- package/dist/journal/journal-recorder.d.ts +23 -0
- package/dist/journal/journal-recorder.js +35 -0
- package/dist/license/license-env.d.ts +29 -0
- package/dist/license/license-env.js +148 -0
- package/dist/loopback-agent.d.ts +31 -0
- package/dist/loopback-agent.js +57 -0
- package/dist/mcp/attach-memory.d.ts +83 -0
- package/dist/mcp/attach-memory.js +185 -0
- package/dist/mcp/client-identity.d.ts +31 -0
- package/dist/mcp/client-identity.js +51 -0
- package/dist/mcp/mcp-post-transport.d.ts +26 -0
- package/dist/mcp/mcp-post-transport.js +109 -0
- package/dist/mcp/mcp-proxy.d.ts +2 -8
- package/dist/mcp/mcp-proxy.js +64 -62
- package/dist/mcp/mcp.d.ts +2 -0
- package/dist/mcp/mcp.js +52 -24
- package/dist/mcp/proxy-backoff.d.ts +11 -0
- package/dist/mcp/proxy-backoff.js +13 -0
- package/dist/mcp/proxy-daemon-probe.d.ts +1 -0
- package/dist/mcp/proxy-daemon-probe.js +7 -1
- package/dist/mcp/proxy-handshake.d.ts +23 -0
- package/dist/mcp/proxy-handshake.js +31 -0
- package/dist/mcp/server-instructions.js +45 -3
- package/dist/mcp/tool-catalog-cache.d.ts +16 -0
- package/dist/mcp/tool-catalog-cache.js +22 -0
- package/dist/memory/memory-tools.d.ts +2 -0
- package/dist/memory/memory-tools.js +82 -0
- package/dist/memory/project-memory.d.ts +34 -0
- package/dist/memory/project-memory.js +96 -0
- package/dist/oracles/flow-instrument-gaps.d.ts +4 -4
- package/dist/oracles/flow-instrument-gaps.js +4 -5
- package/dist/oracles/propose-consequences.js +12 -3
- package/dist/oracles/self-instrument.d.ts +9 -9
- package/dist/oracles/self-instrument.js +19 -13
- package/dist/pool/browser-pool.d.ts +75 -5
- package/dist/pool/browser-pool.js +144 -5
- package/dist/pool/playwright-launcher.js +12 -1
- package/dist/project/fs-port.d.ts +3 -0
- package/dist/project/fs-port.js +3 -2
- package/dist/project/memory-fs.js +6 -1
- package/dist/project/project-tools.js +6 -35
- package/dist/project/reticle-dir.d.ts +17 -2
- package/dist/project/reticle-dir.js +22 -4
- package/dist/runs/context-tools.d.ts +2 -0
- package/dist/runs/context-tools.js +89 -0
- package/dist/runs/run-context.d.ts +40 -0
- package/dist/runs/run-context.js +158 -0
- package/dist/runs/run-diff.d.ts +2 -1
- package/dist/runs/run-store.d.ts +10 -0
- package/dist/runs/run-store.js +10 -0
- package/dist/runs/verification-sync.d.ts +0 -11
- package/dist/runs/verification-sync.js +24 -3
- package/dist/runs/verify-server.d.ts +8 -1
- package/dist/runs/verify-server.js +14 -2
- package/dist/session/command-timeout.d.ts +5 -2
- package/dist/session/command-timeout.js +5 -4
- package/dist/session/dev-server-probe.d.ts +0 -8
- package/dist/session/dev-server-probe.js +1 -1
- package/dist/session/last-act.d.ts +7 -1
- package/dist/session/last-act.js +2 -2
- package/dist/session/lease-visibility.d.ts +67 -0
- package/dist/session/lease-visibility.js +76 -0
- package/dist/session/live-control-tools.js +1 -42
- package/dist/session/no-session-diagnosis.d.ts +33 -0
- package/dist/session/no-session-diagnosis.js +82 -24
- package/dist/session/no-session-next-action.d.ts +12 -0
- package/dist/session/no-session-next-action.js +77 -6
- package/dist/session/no-session-watch.d.ts +18 -6
- package/dist/session/no-session-watch.js +125 -75
- package/dist/session/output-budget.js +4 -1
- package/dist/session/pending-commands.d.ts +11 -1
- package/dist/session/pending-commands.js +12 -2
- package/dist/session/resolve-within.d.ts +34 -0
- package/dist/session/resolve-within.js +53 -0
- package/dist/session/session-health.d.ts +9 -0
- package/dist/session/session-health.js +23 -0
- package/dist/session/session-info.d.ts +18 -0
- package/dist/session/session-info.js +11 -0
- package/dist/session/session-manager.d.ts +14 -0
- package/dist/session/session-manager.js +111 -4
- package/dist/session/session-mirror.d.ts +16 -0
- package/dist/session/session-mirror.js +22 -0
- package/dist/session/session-recommendation.d.ts +19 -5
- package/dist/session/session-recommendation.js +25 -9
- package/dist/session/session-successor.d.ts +37 -0
- package/dist/session/session-successor.js +113 -0
- package/dist/session/session-tools.js +2 -2
- package/dist/session/session.d.ts +53 -3
- package/dist/session/session.js +162 -9
- package/dist/session/wall-clock.d.ts +12 -0
- package/dist/session/wall-clock.js +14 -0
- package/dist/setup/agent-configs.d.ts +96 -0
- package/dist/setup/agent-configs.js +333 -0
- package/dist/setup/agent-io.d.ts +9 -0
- package/dist/setup/agent-io.js +16 -0
- package/dist/setup/agent-writer.d.ts +51 -0
- package/dist/setup/agent-writer.js +115 -0
- package/dist/setup/approval-migration.d.ts +47 -0
- package/dist/setup/approval-migration.js +68 -0
- package/dist/setup/auto-approve.d.ts +85 -0
- package/dist/setup/auto-approve.js +150 -0
- package/dist/setup/bridge-port.d.ts +15 -0
- package/dist/setup/bridge-port.js +24 -0
- package/dist/setup/desktop-shape.d.ts +57 -0
- package/dist/setup/desktop-shape.js +63 -0
- package/dist/setup/dev-server-wait.d.ts +60 -0
- package/dist/setup/dev-server-wait.js +65 -0
- package/dist/setup/drive-agent.d.ts +71 -0
- package/dist/setup/drive-agent.js +171 -0
- package/dist/setup/drive-plan.d.ts +68 -0
- package/dist/setup/drive-plan.js +130 -0
- package/dist/setup/ensure-daemon.d.ts +29 -0
- package/dist/setup/ensure-daemon.js +58 -0
- package/dist/setup/init-runtime.d.ts +47 -0
- package/dist/setup/init-runtime.js +160 -0
- package/dist/setup/interrupt.d.ts +25 -0
- package/dist/setup/interrupt.js +40 -0
- package/dist/setup/license-key.d.ts +39 -0
- package/dist/setup/license-key.js +72 -0
- package/dist/setup/listeners.d.ts +37 -0
- package/dist/setup/listeners.js +85 -0
- package/dist/setup/node-effects.d.ts +60 -0
- package/dist/setup/node-effects.js +210 -0
- package/dist/setup/page-probe.d.ts +39 -0
- package/dist/setup/page-probe.js +49 -0
- package/dist/setup/relaunch.d.ts +36 -0
- package/dist/setup/relaunch.js +57 -0
- package/dist/setup/remaining-steps.d.ts +19 -0
- package/dist/setup/remaining-steps.js +31 -0
- package/dist/setup/run-setup.d.ts +99 -0
- package/dist/setup/run-setup.js +187 -0
- package/dist/setup/session-pick.d.ts +47 -0
- package/dist/setup/session-pick.js +51 -0
- package/dist/setup/setup-command.d.ts +45 -0
- package/dist/setup/setup-command.js +199 -0
- package/dist/setup/setup-options.d.ts +74 -0
- package/dist/setup/setup-options.js +67 -0
- package/dist/setup/transcripts.d.ts +16 -0
- package/dist/setup/transcripts.js +43 -0
- package/dist/status-payload.d.ts +14 -1
- package/dist/status-payload.js +23 -1
- package/dist/telemetry/automation-hint.d.ts +2 -1
- package/dist/telemetry/daemon-telemetry.d.ts +8 -1
- package/dist/telemetry/daemon-telemetry.js +52 -5
- package/dist/telemetry/error-class.js +1 -1
- package/dist/telemetry/feedback-context.d.ts +9 -1
- package/dist/telemetry/feedback-context.js +60 -29
- package/dist/telemetry/feedback-local.d.ts +15 -0
- package/dist/telemetry/feedback-local.js +56 -0
- package/dist/telemetry/feedback-outbox.d.ts +2 -1
- package/dist/telemetry/feedback.d.ts +11 -0
- package/dist/telemetry/feedback.js +19 -6
- package/dist/telemetry/init-telemetry.d.ts +2 -0
- package/dist/telemetry/init-telemetry.js +2 -0
- package/dist/telemetry/install-source.d.ts +14 -0
- package/dist/telemetry/install-source.js +30 -0
- package/dist/telemetry/license-activation.d.ts +7 -1
- package/dist/telemetry/license-activation.js +9 -5
- package/dist/telemetry/mcp-connection.js +7 -0
- package/dist/telemetry/project-profile.d.ts +12 -9
- package/dist/telemetry/project-profile.js +12 -7
- package/dist/telemetry/proxy-telemetry.d.ts +3 -0
- package/dist/telemetry/proxy-telemetry.js +21 -0
- package/dist/telemetry/run-telemetry.d.ts +0 -2
- package/dist/telemetry/run-telemetry.js +1 -1
- package/dist/telemetry/session-metrics.d.ts +12 -0
- package/dist/telemetry/session-metrics.js +35 -1
- package/dist/telemetry/telemetry.js +17 -2
- package/dist/telemetry/tool-refused.d.ts +3 -1
- package/dist/telemetry/tool-refused.js +34 -2
- package/dist/telemetry/verification-of.js +2 -2
- package/dist/tools/act-capsule.d.ts +10 -0
- package/dist/tools/act-capsule.js +8 -2
- package/dist/tools/act-danger.d.ts +2 -1
- package/dist/tools/act-danger.js +11 -3
- package/dist/tools/act-observation.d.ts +41 -0
- package/dist/tools/act-observation.js +36 -0
- package/dist/tools/act-preflight.d.ts +20 -0
- package/dist/tools/act-preflight.js +98 -0
- package/dist/tools/act-sequence-retry.d.ts +45 -0
- package/dist/tools/act-sequence-retry.js +58 -0
- package/dist/tools/act-sequence-tool.d.ts +13 -0
- package/dist/tools/act-sequence-tool.js +135 -0
- package/dist/tools/act-target.d.ts +14 -0
- package/dist/tools/act-target.js +47 -0
- package/dist/tools/act-tools.d.ts +21 -1
- package/dist/tools/act-tools.js +196 -204
- package/dist/tools/assert-source.d.ts +22 -0
- package/dist/tools/assert-source.js +53 -0
- package/dist/tools/assert-verdict.d.ts +20 -3
- package/dist/tools/assert-verdict.js +58 -20
- package/dist/tools/browser-tools.js +6 -22
- package/dist/tools/complete-snapshot.d.ts +48 -0
- package/dist/tools/complete-snapshot.js +75 -0
- package/dist/tools/coverage-tools.d.ts +10 -1
- package/dist/tools/coverage-tools.js +123 -69
- package/dist/tools/dynamic-tools.js +53 -13
- package/dist/tools/error-recovery.d.ts +25 -14
- package/dist/tools/error-recovery.js +78 -9
- package/dist/tools/feedback-tools.d.ts +1 -1
- package/dist/tools/feedback-tools.js +2 -2
- package/dist/tools/invoke-tool.js +121 -11
- package/dist/tools/lease-hint.d.ts +10 -0
- package/dist/tools/lease-hint.js +53 -4
- package/dist/tools/lease-tools.d.ts +35 -5
- package/dist/tools/lease-tools.js +191 -13
- package/dist/tools/merged-name-redirect.d.ts +13 -0
- package/dist/tools/merged-name-redirect.js +22 -0
- package/dist/tools/navigate-arrival.d.ts +0 -2
- package/dist/tools/navigate-arrival.js +1 -1
- package/dist/tools/numeric-bounds.d.ts +100 -0
- package/dist/tools/numeric-bounds.js +125 -0
- package/dist/tools/observe-tools.js +109 -65
- package/dist/tools/read-tools.js +31 -8
- package/dist/tools/real-input-attempt.d.ts +32 -0
- package/dist/tools/real-input-attempt.js +212 -2
- package/dist/tools/reconcile-tools.js +22 -8
- package/dist/tools/resolve-target.d.ts +0 -7
- package/dist/tools/sdk-marker-probe.d.ts +29 -0
- package/dist/tools/sdk-marker-probe.js +57 -0
- package/dist/tools/snapshot-delta.d.ts +1 -1
- package/dist/tools/tool-kit.d.ts +24 -0
- package/dist/tools/tool-kit.js +21 -0
- package/dist/tools/tool-names.d.ts +5 -0
- package/dist/tools/tool-names.js +5 -0
- package/dist/tools/tool-surface.d.ts +85 -6
- package/dist/tools/tool-surface.js +122 -2
- package/dist/tools/tools-helpers.d.ts +19 -0
- package/dist/tools/tools-helpers.js +46 -0
- package/dist/tools/tools.d.ts +2 -0
- package/dist/tools/tools.js +78 -12
- package/dist/tools/unadvertised-help.js +4 -4
- package/dist/tools/verify-next-baton.d.ts +53 -0
- package/dist/tools/verify-next-baton.js +52 -0
- package/dist/update/reticle-deps.d.ts +9 -0
- package/dist/update/reticle-deps.js +27 -0
- package/dist/update/sdk-sync.d.ts +1 -2
- package/dist/update/sdk-sync.js +1 -21
- package/dist/update/update-nudge.d.ts +25 -10
- package/dist/update/update-nudge.js +32 -3
- package/dist/update/updater.d.ts +1 -1
- package/dist/version/peer-announce.js +4 -2
- package/dist/version/sdk-fix.d.ts +47 -0
- package/dist/version/sdk-fix.js +127 -0
- package/dist/version/version-nudge.d.ts +14 -0
- package/dist/version/version-nudge.js +21 -0
- package/dist/version/version-skew.d.ts +38 -3
- package/dist/version/version-skew.js +83 -7
- package/dist/visual/visual-store.d.ts +6 -6
- package/dist/visual/visual-store.js +18 -16
- package/dist/visual/visual-tools.js +57 -12
- package/docs/README.md +2 -1
- package/docs/cli/cloud.mdx +1 -1
- package/docs/cli/doctor.mdx +2 -0
- package/docs/cli/serve.mdx +4 -2
- package/docs/cli/verify.mdx +4 -5
- package/docs/cli.mdx +7 -3
- package/docs/desktop.mdx +1 -1
- package/docs/docs.json +2 -2
- package/docs/gates.md +1 -1
- package/docs/getting-started.md +19 -3
- package/docs/index.mdx +9 -6
- package/docs/install-agentic.mdx +38 -12
- package/docs/install-manual.mdx +1 -1
- package/docs/packages/browser.mdx +2 -2
- package/docs/packages/server.mdx +1 -1
- package/docs/packages.mdx +8 -6
- package/docs/platform-integration.md +17 -0
- package/docs/predicates.mdx +8 -0
- package/docs/reticle-manual.md +106 -0
- package/docs/skill-file.mdx +3 -3
- package/docs/telemetry-contract.md +108 -4
- package/docs/tools-act-sequence.mdx +16 -0
- package/docs/tools-tools-and-run.mdx +2 -4
- package/docs/troubleshooting.mdx +9 -0
- package/docs/usage.md +4 -3
- package/package.json +4 -3
- package/dist/init/cursor.d.ts +0 -24
- package/dist/init/cursor.js +0 -80
- package/dist/session/session-readiness.d.ts +0 -34
- package/dist/session/session-readiness.js +0 -36
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { IntentStore } from './intent-store.js';
|
|
3
|
+
import { IntentShardStore } from './intent-shard-store.js';
|
|
4
|
+
import { IntentStatus } from './intent-shard.js';
|
|
5
|
+
import { ReticleTool } from '../tools/tool-names.js';
|
|
6
|
+
import { sessionIdShape } from '../tools/tool-kit.js';
|
|
7
|
+
import { sessionRoot } from '../project/session-root.js';
|
|
8
|
+
import { asString } from '../tools/tools-helpers.js';
|
|
9
|
+
/**
|
|
10
|
+
* Declare what a change was SUPPOSED to make true, while somebody still knows.
|
|
11
|
+
*
|
|
12
|
+
* One tool with three actions rather than three tools, because the surface is capped and because an
|
|
13
|
+
* agent that has to discover three names to use one idea uses none of them.
|
|
14
|
+
*
|
|
15
|
+
* There is deliberately no `discharge` action. A verdict discharges an intent by satisfying its
|
|
16
|
+
* binding, and a discharge an agent has to remember to file would be the same forgetting problem
|
|
17
|
+
* this exists to solve, moved one layer up.
|
|
18
|
+
*/
|
|
19
|
+
const DECLARE = 'declare';
|
|
20
|
+
const LIST = 'list';
|
|
21
|
+
const BIND = 'bind';
|
|
22
|
+
/* The sharded store's surface. Same tool, because a second tool name is a second thing to discover. */
|
|
23
|
+
const INDEX = 'index';
|
|
24
|
+
const SUBJECT = 'subject';
|
|
25
|
+
const GET = 'get';
|
|
26
|
+
const RECORD = 'record';
|
|
27
|
+
const MIGRATE = 'migrate';
|
|
28
|
+
export const INTENT_TOOLS = [
|
|
29
|
+
{
|
|
30
|
+
name: ReticleTool.INTENT,
|
|
31
|
+
description: 'Record what a change is SUPPOSED to make true, as a durable statement ABOUT THE PRODUCT that a teammate who was not here will understand in six months — name the behaviour, not this run or its step number, and never "renders cleanly", which nothing can check. It is SHARED memory: pooled per project and read back by later agents. Capture it while you still know — then verification does not have to re-derive it from the DOM later. { action:"declare", intents:[{ id, statement, surface? }] } takes prose and needs NO predicate: at declare time there is often no route, no ref and no code yet, and a predicate demanded there is just a mechanism. Declare EARLY (as you build) and batch them — one call per feature is the whole budget. { action:"bind", id, binding } attaches the predicate that would prove it once you know how; an intent with no binding is not a failure, it is the most interesting row in the ledger — something meant that nothing can currently prove. { action:"list" } returns what is still open. Stored in .reticle/intent.json, git-checked so a human sees in review if an intent was later narrowed to match what was easy to prove.',
|
|
32
|
+
example: {
|
|
33
|
+
action: DECLARE,
|
|
34
|
+
intents: [
|
|
35
|
+
{ id: 'checkin', statement: 'clicking Send check-in makes the badge read "checked in"' },
|
|
36
|
+
],
|
|
37
|
+
},
|
|
38
|
+
inputSchema: {
|
|
39
|
+
action: z.enum([DECLARE, LIST, BIND, INDEX, SUBJECT, GET, RECORD, MIGRATE]),
|
|
40
|
+
subject: z
|
|
41
|
+
.string()
|
|
42
|
+
.optional()
|
|
43
|
+
.describe('subject/record: what the intent is ABOUT — the shard it lives in.'),
|
|
44
|
+
statement: z.string().optional().describe('record only: what must be true, in prose.'),
|
|
45
|
+
why: z
|
|
46
|
+
.string()
|
|
47
|
+
.optional()
|
|
48
|
+
.describe('record only: WHY it must be true. The thing somebody says once and forgets.'),
|
|
49
|
+
source: z
|
|
50
|
+
.string()
|
|
51
|
+
.optional()
|
|
52
|
+
.describe('record only: where it came from — a person, a ticket, a conversation.'),
|
|
53
|
+
status: z
|
|
54
|
+
.enum([IntentStatus.PROPOSED, IntentStatus.AGREED, IntentStatus.PROVED, IntentStatus.STALE])
|
|
55
|
+
.optional()
|
|
56
|
+
.describe('record only: how settled it is. Defaults to proposed.'),
|
|
57
|
+
intents: z
|
|
58
|
+
.array(z.object({
|
|
59
|
+
id: z.string(),
|
|
60
|
+
statement: z.string(),
|
|
61
|
+
surface: z
|
|
62
|
+
.object({
|
|
63
|
+
route: z.string().optional(),
|
|
64
|
+
flow: z.string().optional(),
|
|
65
|
+
files: z.array(z.string()).optional(),
|
|
66
|
+
})
|
|
67
|
+
.optional(),
|
|
68
|
+
}))
|
|
69
|
+
.optional()
|
|
70
|
+
.describe('declare only. Batchable — declare every intent for a feature in one call.'),
|
|
71
|
+
id: z.string().optional().describe('bind only: which intent the predicate proves.'),
|
|
72
|
+
binding: z
|
|
73
|
+
.unknown()
|
|
74
|
+
.optional()
|
|
75
|
+
.describe("bind only: the predicate that would prove it, in reticle_assert's shape."),
|
|
76
|
+
...sessionIdShape,
|
|
77
|
+
},
|
|
78
|
+
outputSchema: {
|
|
79
|
+
intents: z
|
|
80
|
+
.array(z.unknown())
|
|
81
|
+
.optional()
|
|
82
|
+
.describe('The intents this call declared, or on `list` everything still open — each { id, statement, state, declaredAt, binding?, surface?, provenBy?, amended? }. `state` is declared (prose only), bound (a predicate exists), or proved (a verdict satisfied it).'),
|
|
83
|
+
bound: z.boolean().optional().describe('bind only: false when the id names no intent.'),
|
|
84
|
+
path: z.string().optional().describe('Where the ledger was written.'),
|
|
85
|
+
entries: z
|
|
86
|
+
.array(z.unknown())
|
|
87
|
+
.optional()
|
|
88
|
+
.describe('index only: one line per intent — { id, subject, statement (summarised), status }. The cheap read: enough to decide WHICH subject to open, without loading any of them.'),
|
|
89
|
+
records: z
|
|
90
|
+
.array(z.unknown())
|
|
91
|
+
.optional()
|
|
92
|
+
.describe('subject only: every full record for that subject.'),
|
|
93
|
+
record: z.unknown().optional().describe('get/record: the single full record, or null.'),
|
|
94
|
+
migrated: z
|
|
95
|
+
.number()
|
|
96
|
+
.optional()
|
|
97
|
+
.describe('migrate only: how many flat-file intents were folded into shards.'),
|
|
98
|
+
subjects: z
|
|
99
|
+
.array(z.string())
|
|
100
|
+
.optional()
|
|
101
|
+
.describe('migrate only: which subjects received them.'),
|
|
102
|
+
},
|
|
103
|
+
handler: async (deps, args) => {
|
|
104
|
+
const root = sessionRoot(deps, asString(args['sessionId']));
|
|
105
|
+
const store = new IntentStore(deps.fs, root, { now: deps.now });
|
|
106
|
+
const shards = new IntentShardStore(deps.fs, root, { now: deps.now });
|
|
107
|
+
const action = asString(args['action']);
|
|
108
|
+
if (INDEX === action)
|
|
109
|
+
return { entries: (await shards.index()).entries, path: root };
|
|
110
|
+
if (SUBJECT === action)
|
|
111
|
+
return { records: await shards.subject(asString(args['subject']) ?? ''), path: root };
|
|
112
|
+
if (GET === action)
|
|
113
|
+
return { record: await shards.get(asString(args['id']) ?? '') };
|
|
114
|
+
if (MIGRATE === action)
|
|
115
|
+
return { ...(await shards.migrate()), path: root };
|
|
116
|
+
if (RECORD === action) {
|
|
117
|
+
const written = await shards.record({
|
|
118
|
+
id: asString(args['id']) ?? '',
|
|
119
|
+
statement: asString(args['statement']) ?? '',
|
|
120
|
+
subject: asString(args['subject']),
|
|
121
|
+
why: asString(args['why']),
|
|
122
|
+
source: asString(args['source']),
|
|
123
|
+
status: asString(args['status']),
|
|
124
|
+
binding: args['binding'],
|
|
125
|
+
});
|
|
126
|
+
return { record: written, path: root };
|
|
127
|
+
}
|
|
128
|
+
if (BIND === action) {
|
|
129
|
+
const id = asString(args['id']) ?? '';
|
|
130
|
+
return { bound: await store.bind(id, args['binding']) };
|
|
131
|
+
}
|
|
132
|
+
if (LIST === action) {
|
|
133
|
+
return { intents: await store.open() };
|
|
134
|
+
}
|
|
135
|
+
const raw = args['intents'];
|
|
136
|
+
const entries = Array.isArray(raw)
|
|
137
|
+
? raw
|
|
138
|
+
: [];
|
|
139
|
+
const declared = await store.declare(entries);
|
|
140
|
+
return { intents: declared, path: root };
|
|
141
|
+
},
|
|
142
|
+
},
|
|
143
|
+
];
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { Intent } from '@reticlehq/core';
|
|
2
|
+
import type { ToolDeps } from '../tools/tool-kit.js';
|
|
3
|
+
/**
|
|
4
|
+
* What this project still owes — the ledger's undischarged intents, for a tool that has `deps` and a
|
|
5
|
+
* session id rather than a store.
|
|
6
|
+
*
|
|
7
|
+
* One helper rather than the same three-line construction at each site: the ROOT resolution is the
|
|
8
|
+
* part that must not drift. A caller that resolved the daemon's own directory while the declaring
|
|
9
|
+
* tool wrote to the project's would read an empty ledger and report that nothing was declared, which
|
|
10
|
+
* is a false accusation rather than an error.
|
|
11
|
+
*/
|
|
12
|
+
export declare function openSessionIntents(deps: ToolDeps, sessionId: string | undefined): Promise<Intent[]>;
|
|
13
|
+
/**
|
|
14
|
+
* EVERY intent in the ledger, proved ones included — the denominator the open list is a subset of.
|
|
15
|
+
*
|
|
16
|
+
* Separate from `openSessionIntents` rather than a flag on it, because the two answer different
|
|
17
|
+
* questions: "what does this project still owe" drives a verdict's honesty, and "was anything ever
|
|
18
|
+
* declared" is what decides whether `reticle_intent` is used at all. Same root resolution, for the
|
|
19
|
+
* same reason it is shared above.
|
|
20
|
+
*/
|
|
21
|
+
export declare function allSessionIntents(deps: ToolDeps, sessionId: string | undefined): Promise<Intent[]>;
|
|
22
|
+
/** What the ledger still owes once this verdict's own intent is discharged, and how old it is. */
|
|
23
|
+
export interface IntentDebt {
|
|
24
|
+
openIntentCount: number;
|
|
25
|
+
/**
|
|
26
|
+
* Age of the OLDEST open intent, in ms. Absent when nothing is open.
|
|
27
|
+
*
|
|
28
|
+
* A count alone cannot tell "declared a minute ago and not proved yet" from "this project has
|
|
29
|
+
* owed eighteen things since last week", and only the first is actionable on the result being
|
|
30
|
+
* read. A number that is always large is one people learn to skip, which is how an honest gap
|
|
31
|
+
* gets filtered out along with the noise.
|
|
32
|
+
*/
|
|
33
|
+
oldestOpenIntentAgeMs?: number;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* The debt a verdict should report, MINUS the intent it is about to discharge.
|
|
37
|
+
*
|
|
38
|
+
* The discharge happens after the gaps are built, so counting the raw ledger would include the
|
|
39
|
+
* intent this very call proves — measured live: an inline intent was declared, asserted and proved
|
|
40
|
+
* by one verdict, and the result still said "1 declared intent(s) are still unproved".
|
|
41
|
+
*/
|
|
42
|
+
export declare function intentDebt(open: readonly Intent[], dischargedId: string | undefined, now: number): IntentDebt;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { IntentStore } from './intent-store.js';
|
|
2
|
+
import { sessionRoot } from '../project/session-root.js';
|
|
3
|
+
/**
|
|
4
|
+
* What this project still owes — the ledger's undischarged intents, for a tool that has `deps` and a
|
|
5
|
+
* session id rather than a store.
|
|
6
|
+
*
|
|
7
|
+
* One helper rather than the same three-line construction at each site: the ROOT resolution is the
|
|
8
|
+
* part that must not drift. A caller that resolved the daemon's own directory while the declaring
|
|
9
|
+
* tool wrote to the project's would read an empty ledger and report that nothing was declared, which
|
|
10
|
+
* is a false accusation rather than an error.
|
|
11
|
+
*/
|
|
12
|
+
export async function openSessionIntents(deps, sessionId) {
|
|
13
|
+
return new IntentStore(deps.fs, sessionRoot(deps, sessionId), { now: deps.now }).open();
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* EVERY intent in the ledger, proved ones included — the denominator the open list is a subset of.
|
|
17
|
+
*
|
|
18
|
+
* Separate from `openSessionIntents` rather than a flag on it, because the two answer different
|
|
19
|
+
* questions: "what does this project still owe" drives a verdict's honesty, and "was anything ever
|
|
20
|
+
* declared" is what decides whether `reticle_intent` is used at all. Same root resolution, for the
|
|
21
|
+
* same reason it is shared above.
|
|
22
|
+
*/
|
|
23
|
+
export async function allSessionIntents(deps, sessionId) {
|
|
24
|
+
return new IntentStore(deps.fs, sessionRoot(deps, sessionId), { now: deps.now }).read();
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* The debt a verdict should report, MINUS the intent it is about to discharge.
|
|
28
|
+
*
|
|
29
|
+
* The discharge happens after the gaps are built, so counting the raw ledger would include the
|
|
30
|
+
* intent this very call proves — measured live: an inline intent was declared, asserted and proved
|
|
31
|
+
* by one verdict, and the result still said "1 declared intent(s) are still unproved".
|
|
32
|
+
*/
|
|
33
|
+
export function intentDebt(open, dischargedId, now) {
|
|
34
|
+
const stillOpen = open.filter((i) => dischargedId === undefined || i.id !== dischargedId);
|
|
35
|
+
const oldest = stillOpen.reduce((min, i) => (min === undefined || i.declaredAt < min ? i.declaredAt : min), undefined);
|
|
36
|
+
return {
|
|
37
|
+
openIntentCount: stillOpen.length,
|
|
38
|
+
...(oldest === undefined ? {} : { oldestOpenIntentAgeMs: now - oldest }),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
@@ -8,7 +8,7 @@ import type { SegmentRollup } from './rollups.js';
|
|
|
8
8
|
* (slower, more errors, more requests) — a segment doing less than expected is not a regression.
|
|
9
9
|
*/
|
|
10
10
|
/** Online mean/variance/max for one metric (Welford's algorithm). Immutable: addStat returns a copy. */
|
|
11
|
-
|
|
11
|
+
interface MetricStats {
|
|
12
12
|
count: number;
|
|
13
13
|
mean: number;
|
|
14
14
|
/** Sum of squared deviations (Welford M2); variance = m2/(count-1). */
|
|
@@ -22,7 +22,7 @@ export declare function stddev(stats: MetricStats): number;
|
|
|
22
22
|
export declare function zScore(stats: MetricStats, x: number): number;
|
|
23
23
|
/** The metrics an envelope tracks per route. */
|
|
24
24
|
declare const ENVELOPE_METRICS: readonly ["durationMs", "net", "netErrors", "consoleErrors"];
|
|
25
|
-
|
|
25
|
+
type EnvelopeMetric = (typeof ENVELOPE_METRICS)[number];
|
|
26
26
|
export interface RouteEnvelope {
|
|
27
27
|
route: string;
|
|
28
28
|
/** Runs that contributed a sample — below MIN_ENVELOPE_SAMPLES the envelope is too green to judge. */
|
|
@@ -43,14 +43,14 @@ export declare const RouteEnvelopeSchema: z.ZodObject<{
|
|
|
43
43
|
max: z.ZodNumber;
|
|
44
44
|
}, "strip", z.ZodTypeAny, {
|
|
45
45
|
count: number;
|
|
46
|
-
max: number;
|
|
47
46
|
mean: number;
|
|
48
47
|
m2: number;
|
|
48
|
+
max: number;
|
|
49
49
|
}, {
|
|
50
50
|
count: number;
|
|
51
|
-
max: number;
|
|
52
51
|
mean: number;
|
|
53
52
|
m2: number;
|
|
53
|
+
max: number;
|
|
54
54
|
}>;
|
|
55
55
|
net: z.ZodObject<{
|
|
56
56
|
count: z.ZodNumber;
|
|
@@ -59,14 +59,14 @@ export declare const RouteEnvelopeSchema: z.ZodObject<{
|
|
|
59
59
|
max: z.ZodNumber;
|
|
60
60
|
}, "strip", z.ZodTypeAny, {
|
|
61
61
|
count: number;
|
|
62
|
-
max: number;
|
|
63
62
|
mean: number;
|
|
64
63
|
m2: number;
|
|
64
|
+
max: number;
|
|
65
65
|
}, {
|
|
66
66
|
count: number;
|
|
67
|
-
max: number;
|
|
68
67
|
mean: number;
|
|
69
68
|
m2: number;
|
|
69
|
+
max: number;
|
|
70
70
|
}>;
|
|
71
71
|
netErrors: z.ZodObject<{
|
|
72
72
|
count: z.ZodNumber;
|
|
@@ -75,14 +75,14 @@ export declare const RouteEnvelopeSchema: z.ZodObject<{
|
|
|
75
75
|
max: z.ZodNumber;
|
|
76
76
|
}, "strip", z.ZodTypeAny, {
|
|
77
77
|
count: number;
|
|
78
|
-
max: number;
|
|
79
78
|
mean: number;
|
|
80
79
|
m2: number;
|
|
80
|
+
max: number;
|
|
81
81
|
}, {
|
|
82
82
|
count: number;
|
|
83
|
-
max: number;
|
|
84
83
|
mean: number;
|
|
85
84
|
m2: number;
|
|
85
|
+
max: number;
|
|
86
86
|
}>;
|
|
87
87
|
consoleErrors: z.ZodObject<{
|
|
88
88
|
count: z.ZodNumber;
|
|
@@ -91,64 +91,64 @@ export declare const RouteEnvelopeSchema: z.ZodObject<{
|
|
|
91
91
|
max: z.ZodNumber;
|
|
92
92
|
}, "strip", z.ZodTypeAny, {
|
|
93
93
|
count: number;
|
|
94
|
-
max: number;
|
|
95
94
|
mean: number;
|
|
96
95
|
m2: number;
|
|
96
|
+
max: number;
|
|
97
97
|
}, {
|
|
98
98
|
count: number;
|
|
99
|
-
max: number;
|
|
100
99
|
mean: number;
|
|
101
100
|
m2: number;
|
|
101
|
+
max: number;
|
|
102
102
|
}>;
|
|
103
103
|
}, "strip", z.ZodTypeAny, {
|
|
104
104
|
durationMs: {
|
|
105
105
|
count: number;
|
|
106
|
-
max: number;
|
|
107
106
|
mean: number;
|
|
108
107
|
m2: number;
|
|
108
|
+
max: number;
|
|
109
109
|
};
|
|
110
110
|
net: {
|
|
111
111
|
count: number;
|
|
112
|
-
max: number;
|
|
113
112
|
mean: number;
|
|
114
113
|
m2: number;
|
|
114
|
+
max: number;
|
|
115
115
|
};
|
|
116
116
|
consoleErrors: {
|
|
117
117
|
count: number;
|
|
118
|
-
max: number;
|
|
119
118
|
mean: number;
|
|
120
119
|
m2: number;
|
|
120
|
+
max: number;
|
|
121
121
|
};
|
|
122
122
|
netErrors: {
|
|
123
123
|
count: number;
|
|
124
|
-
max: number;
|
|
125
124
|
mean: number;
|
|
126
125
|
m2: number;
|
|
126
|
+
max: number;
|
|
127
127
|
};
|
|
128
128
|
}, {
|
|
129
129
|
durationMs: {
|
|
130
130
|
count: number;
|
|
131
|
-
max: number;
|
|
132
131
|
mean: number;
|
|
133
132
|
m2: number;
|
|
133
|
+
max: number;
|
|
134
134
|
};
|
|
135
135
|
net: {
|
|
136
136
|
count: number;
|
|
137
|
-
max: number;
|
|
138
137
|
mean: number;
|
|
139
138
|
m2: number;
|
|
139
|
+
max: number;
|
|
140
140
|
};
|
|
141
141
|
consoleErrors: {
|
|
142
142
|
count: number;
|
|
143
|
-
max: number;
|
|
144
143
|
mean: number;
|
|
145
144
|
m2: number;
|
|
145
|
+
max: number;
|
|
146
146
|
};
|
|
147
147
|
netErrors: {
|
|
148
148
|
count: number;
|
|
149
|
-
max: number;
|
|
150
149
|
mean: number;
|
|
151
150
|
m2: number;
|
|
151
|
+
max: number;
|
|
152
152
|
};
|
|
153
153
|
}>;
|
|
154
154
|
}, "strip", z.ZodTypeAny, {
|
|
@@ -157,27 +157,27 @@ export declare const RouteEnvelopeSchema: z.ZodObject<{
|
|
|
157
157
|
stats: {
|
|
158
158
|
durationMs: {
|
|
159
159
|
count: number;
|
|
160
|
-
max: number;
|
|
161
160
|
mean: number;
|
|
162
161
|
m2: number;
|
|
162
|
+
max: number;
|
|
163
163
|
};
|
|
164
164
|
net: {
|
|
165
165
|
count: number;
|
|
166
|
-
max: number;
|
|
167
166
|
mean: number;
|
|
168
167
|
m2: number;
|
|
168
|
+
max: number;
|
|
169
169
|
};
|
|
170
170
|
consoleErrors: {
|
|
171
171
|
count: number;
|
|
172
|
-
max: number;
|
|
173
172
|
mean: number;
|
|
174
173
|
m2: number;
|
|
174
|
+
max: number;
|
|
175
175
|
};
|
|
176
176
|
netErrors: {
|
|
177
177
|
count: number;
|
|
178
|
-
max: number;
|
|
179
178
|
mean: number;
|
|
180
179
|
m2: number;
|
|
180
|
+
max: number;
|
|
181
181
|
};
|
|
182
182
|
};
|
|
183
183
|
}, {
|
|
@@ -186,27 +186,27 @@ export declare const RouteEnvelopeSchema: z.ZodObject<{
|
|
|
186
186
|
stats: {
|
|
187
187
|
durationMs: {
|
|
188
188
|
count: number;
|
|
189
|
-
max: number;
|
|
190
189
|
mean: number;
|
|
191
190
|
m2: number;
|
|
191
|
+
max: number;
|
|
192
192
|
};
|
|
193
193
|
net: {
|
|
194
194
|
count: number;
|
|
195
|
-
max: number;
|
|
196
195
|
mean: number;
|
|
197
196
|
m2: number;
|
|
197
|
+
max: number;
|
|
198
198
|
};
|
|
199
199
|
consoleErrors: {
|
|
200
200
|
count: number;
|
|
201
|
-
max: number;
|
|
202
201
|
mean: number;
|
|
203
202
|
m2: number;
|
|
203
|
+
max: number;
|
|
204
204
|
};
|
|
205
205
|
netErrors: {
|
|
206
206
|
count: number;
|
|
207
|
-
max: number;
|
|
208
207
|
mean: number;
|
|
209
208
|
m2: number;
|
|
209
|
+
max: number;
|
|
210
210
|
};
|
|
211
211
|
};
|
|
212
212
|
}>;
|
|
@@ -7,6 +7,11 @@ export interface JournalSink {
|
|
|
7
7
|
/** Read side of the durable journal — the fall-through source when the ring buffer has evicted. */
|
|
8
8
|
export interface JournalReader {
|
|
9
9
|
readEvents(): Promise<ReticleEvent[]>;
|
|
10
|
+
/**
|
|
11
|
+
* The action ledger. Optional because a test double is a partial reader, and nothing that only
|
|
12
|
+
* needs events should be forced to grow a second method to satisfy the type.
|
|
13
|
+
*/
|
|
14
|
+
readActions?(): Promise<JournalAction[]>;
|
|
10
15
|
}
|
|
11
16
|
interface JournalRecorderOptions {
|
|
12
17
|
/** Injected elapsed-ms clock (never read from Date here — the clock-injection rule). */
|
|
@@ -32,6 +37,24 @@ export declare class JournalRecorder {
|
|
|
32
37
|
beginAction(actionId: string, tool: string, args: Record<string, unknown>): void;
|
|
33
38
|
/** Close the active window: persist its buffered events, then the action record. No-op if none active. */
|
|
34
39
|
finishAction(effect?: unknown, settled?: boolean, settledInMs?: number): void;
|
|
40
|
+
/**
|
|
41
|
+
* Append one action record for a tool that PROVED something without driving the page.
|
|
42
|
+
*
|
|
43
|
+
* `reticle_assert` produces a verdict and moves nothing, so it must never open an attribution
|
|
44
|
+
* window: while one is open every observed event is stamped with that action's id, and stamping
|
|
45
|
+
* ambient traffic with an assertion's id would manufacture a causal link that does not exist —
|
|
46
|
+
* exactly what `EventAttribution.WINDOW` is carefully labelled to avoid claiming. So this writes
|
|
47
|
+
* the record and leaves `#active` precisely as it found it: an act window open across an assert
|
|
48
|
+
* keeps attributing to itself, which is the truth of what caused those events.
|
|
49
|
+
*
|
|
50
|
+
* `settled` is left unset for the same reason — nothing was dispatched, so there is no settle
|
|
51
|
+
* outcome to report, and the run fold skips actions that state none rather than inventing one.
|
|
52
|
+
*
|
|
53
|
+
* Ordering rides the same chain as `finishAction`: buffered events flush first, so a record is
|
|
54
|
+
* always persisted after the events that preceded it. Records land in the order verdicts were
|
|
55
|
+
* REACHED, so an assert taken mid-window is written before the act it interrupted.
|
|
56
|
+
*/
|
|
57
|
+
recordAction(actionId: string, tool: string, args: Record<string, unknown>, effect?: unknown): void;
|
|
35
58
|
/** Persist any buffered events now (call on session end). Awaits the write chain to settle. */
|
|
36
59
|
flush(): Promise<void>;
|
|
37
60
|
}
|
|
@@ -65,6 +65,41 @@ export class JournalRecorder {
|
|
|
65
65
|
this.#enqueueFlush();
|
|
66
66
|
this.#chain = this.#chain.then(() => this.#sink.appendAction(action)).catch(() => undefined);
|
|
67
67
|
}
|
|
68
|
+
/**
|
|
69
|
+
* Append one action record for a tool that PROVED something without driving the page.
|
|
70
|
+
*
|
|
71
|
+
* `reticle_assert` produces a verdict and moves nothing, so it must never open an attribution
|
|
72
|
+
* window: while one is open every observed event is stamped with that action's id, and stamping
|
|
73
|
+
* ambient traffic with an assertion's id would manufacture a causal link that does not exist —
|
|
74
|
+
* exactly what `EventAttribution.WINDOW` is carefully labelled to avoid claiming. So this writes
|
|
75
|
+
* the record and leaves `#active` precisely as it found it: an act window open across an assert
|
|
76
|
+
* keeps attributing to itself, which is the truth of what caused those events.
|
|
77
|
+
*
|
|
78
|
+
* `settled` is left unset for the same reason — nothing was dispatched, so there is no settle
|
|
79
|
+
* outcome to report, and the run fold skips actions that state none rather than inventing one.
|
|
80
|
+
*
|
|
81
|
+
* Ordering rides the same chain as `finishAction`: buffered events flush first, so a record is
|
|
82
|
+
* always persisted after the events that preceded it. Records land in the order verdicts were
|
|
83
|
+
* REACHED, so an assert taken mid-window is written before the act it interrupted.
|
|
84
|
+
*/
|
|
85
|
+
recordAction(actionId, tool, args, effect) {
|
|
86
|
+
const at = this.#now();
|
|
87
|
+
const action = {
|
|
88
|
+
v: JOURNAL_FILE_VERSION,
|
|
89
|
+
actionId,
|
|
90
|
+
tool,
|
|
91
|
+
args,
|
|
92
|
+
effect,
|
|
93
|
+
// No window was opened, so no event carries this id: `seqRange` is omitted rather than
|
|
94
|
+
// invented, because any range here would claim an attribution that never happened. `tRange` is
|
|
95
|
+
// required by the schema and the honest value is the instant the verdict was recorded — a span
|
|
96
|
+
// of zero, which is exactly how much time this action attributed events over.
|
|
97
|
+
tRange: { from: at, to: at },
|
|
98
|
+
at,
|
|
99
|
+
};
|
|
100
|
+
this.#enqueueFlush();
|
|
101
|
+
this.#chain = this.#chain.then(() => this.#sink.appendAction(action)).catch(() => undefined);
|
|
102
|
+
}
|
|
68
103
|
/** Persist any buffered events now (call on session end). Awaits the write chain to settle. */
|
|
69
104
|
async flush() {
|
|
70
105
|
this.#enqueueFlush();
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Find an enterprise licence key the customer actually placed, wherever they reasonably placed it.
|
|
3
|
+
*
|
|
4
|
+
* The daemon folded in `<cwd>/.env` and nothing else. It is spawned without an explicit `cwd`, so it
|
|
5
|
+
* inherits whatever directory the editor launched the MCP server from — in a monorepo that is the
|
|
6
|
+
* workspace root while the key sits in the app's own `.env`, and under some editors it is the user's
|
|
7
|
+
* home. The key was never read, `describeLicense` reported `missing`, and every event that customer
|
|
8
|
+
* produced said they had no licence, which is indistinguishable from a customer who has none.
|
|
9
|
+
*
|
|
10
|
+
* That is the worst shape a licensing bug can take. A key that fails LOUDLY gets reported by the
|
|
11
|
+
* customer within the hour. A key that silently fails to register leaves them believing they are
|
|
12
|
+
* licensed and us believing they are not, and neither side finds out.
|
|
13
|
+
*
|
|
14
|
+
* Two directions, because the field hits both: DOWN one level into app directories (the daemon
|
|
15
|
+
* starts at the workspace root) and UP to the project root (the editor starts inside the app).
|
|
16
|
+
*
|
|
17
|
+
* ONLY the licence key is ever taken out of a file found this way, and that restriction is the point
|
|
18
|
+
* rather than an optimisation. Bulk-importing a `.env` discovered by walking would let a directory
|
|
19
|
+
* the caller never named rebind the daemon's port, its telemetry gate or its allowed origins — a far
|
|
20
|
+
* worse bug than the one this fixes. `loadDotEnv` still owns the local file, where importing
|
|
21
|
+
* everything is what the caller asked for.
|
|
22
|
+
*/
|
|
23
|
+
/**
|
|
24
|
+
* The key, or undefined. Never throws, never mutates anything the caller did not ask it to.
|
|
25
|
+
*
|
|
26
|
+
* A key already present in `env` always wins: that is the operator stating it explicitly, and a file
|
|
27
|
+
* silently overriding it is the surprise `loadDotEnv` already refuses to cause.
|
|
28
|
+
*/
|
|
29
|
+
export declare function licenseKeyFromEnvFiles(startDir: string, env?: NodeJS.ProcessEnv): string | undefined;
|