@descryy/mcp 0.11.5 → 0.11.7
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/dist/action-handshake.d.ts +38 -0
- package/dist/action-handshake.d.ts.map +1 -0
- package/dist/action-handshake.js +127 -0
- package/dist/action-handshake.js.map +1 -0
- package/dist/bin/descry-mcp.d.ts +7 -0
- package/dist/bin/descry-mcp.d.ts.map +1 -0
- package/dist/bin/descry-mcp.js +73 -0
- package/dist/bin/descry-mcp.js.map +1 -0
- package/dist/browser/auth.d.ts +84 -0
- package/dist/browser/auth.d.ts.map +1 -0
- package/dist/browser/auth.js +233 -0
- package/dist/browser/auth.js.map +1 -0
- package/dist/browser/capability-probe.d.ts +109 -0
- package/dist/browser/capability-probe.d.ts.map +1 -0
- package/dist/browser/capability-probe.js +201 -0
- package/dist/browser/capability-probe.js.map +1 -0
- package/dist/browser/driver.d.ts +591 -0
- package/dist/browser/driver.d.ts.map +1 -0
- package/dist/browser/driver.js +116 -0
- package/dist/browser/driver.js.map +1 -0
- package/dist/browser/evidence.d.ts +28 -0
- package/dist/browser/evidence.d.ts.map +1 -0
- package/dist/browser/evidence.js +82 -0
- package/dist/browser/evidence.js.map +1 -0
- package/dist/browser/fake-driver.d.ts +116 -0
- package/dist/browser/fake-driver.d.ts.map +1 -0
- package/dist/browser/fake-driver.js +416 -0
- package/dist/browser/fake-driver.js.map +1 -0
- package/dist/browser/fault-attribution.d.ts +178 -0
- package/dist/browser/fault-attribution.d.ts.map +1 -0
- package/dist/browser/fault-attribution.js +266 -0
- package/dist/browser/fault-attribution.js.map +1 -0
- package/dist/browser/graph-write.d.ts +45 -0
- package/dist/browser/graph-write.d.ts.map +1 -0
- package/dist/browser/graph-write.js +103 -0
- package/dist/browser/graph-write.js.map +1 -0
- package/dist/browser/identity-graph-write.d.ts +55 -0
- package/dist/browser/identity-graph-write.d.ts.map +1 -0
- package/dist/browser/identity-graph-write.js +45 -0
- package/dist/browser/identity-graph-write.js.map +1 -0
- package/dist/browser/page-probe.d.ts +81 -0
- package/dist/browser/page-probe.d.ts.map +1 -0
- package/dist/browser/page-probe.js +202 -0
- package/dist/browser/page-probe.js.map +1 -0
- package/dist/browser/playwright-driver.d.ts +115 -0
- package/dist/browser/playwright-driver.d.ts.map +1 -0
- package/dist/browser/playwright-driver.js +1545 -0
- package/dist/browser/playwright-driver.js.map +1 -0
- package/dist/browser/provider.d.ts +26 -0
- package/dist/browser/provider.d.ts.map +1 -0
- package/dist/browser/provider.js +14 -0
- package/dist/browser/provider.js.map +1 -0
- package/dist/browser/reach-recording-session.d.ts +44 -0
- package/dist/browser/reach-recording-session.d.ts.map +1 -0
- package/dist/browser/reach-recording-session.js +151 -0
- package/dist/browser/reach-recording-session.js.map +1 -0
- package/dist/browser/reachability.d.ts +168 -0
- package/dist/browser/reachability.d.ts.map +1 -0
- package/dist/browser/reachability.js +294 -0
- package/dist/browser/reachability.js.map +1 -0
- package/dist/browser/registry.d.ts +126 -0
- package/dist/browser/registry.d.ts.map +1 -0
- package/dist/browser/registry.js +177 -0
- package/dist/browser/registry.js.map +1 -0
- package/dist/browser/scenario-provenance.d.ts +23 -0
- package/dist/browser/scenario-provenance.d.ts.map +1 -0
- package/dist/browser/scenario-provenance.js +73 -0
- package/dist/browser/scenario-provenance.js.map +1 -0
- package/dist/browser/scenario-resolve.d.ts +28 -0
- package/dist/browser/scenario-resolve.d.ts.map +1 -0
- package/dist/browser/scenario-resolve.js +96 -0
- package/dist/browser/scenario-resolve.js.map +1 -0
- package/dist/browser/scenario-runner.d.ts +72 -0
- package/dist/browser/scenario-runner.d.ts.map +1 -0
- package/dist/browser/scenario-runner.js +353 -0
- package/dist/browser/scenario-runner.js.map +1 -0
- package/dist/browser/stack-parser.d.ts +19 -0
- package/dist/browser/stack-parser.d.ts.map +1 -0
- package/dist/browser/stack-parser.js +85 -0
- package/dist/browser/stack-parser.js.map +1 -0
- package/dist/browser/tool-support.d.ts +71 -0
- package/dist/browser/tool-support.d.ts.map +1 -0
- package/dist/browser/tool-support.js +216 -0
- package/dist/browser/tool-support.js.map +1 -0
- package/dist/browser/url-scheme.d.ts +14 -0
- package/dist/browser/url-scheme.d.ts.map +1 -0
- package/dist/browser/url-scheme.js +38 -0
- package/dist/browser/url-scheme.js.map +1 -0
- package/dist/browser/wait-target.d.ts +37 -0
- package/dist/browser/wait-target.d.ts.map +1 -0
- package/dist/browser/wait-target.js +54 -0
- package/dist/browser/wait-target.js.map +1 -0
- package/dist/cancellation.d.ts +20 -0
- package/dist/cancellation.d.ts.map +1 -0
- package/dist/cancellation.js +41 -0
- package/dist/cancellation.js.map +1 -0
- package/dist/capped.d.ts +39 -0
- package/dist/capped.d.ts.map +1 -0
- package/dist/capped.js +43 -0
- package/dist/capped.js.map +1 -0
- package/dist/credential-store.d.ts +22 -0
- package/dist/credential-store.d.ts.map +1 -0
- package/dist/credential-store.js +33 -0
- package/dist/credential-store.js.map +1 -0
- package/dist/disclosure-ledger.d.ts +14 -0
- package/dist/disclosure-ledger.d.ts.map +1 -0
- package/dist/disclosure-ledger.js +18 -0
- package/dist/disclosure-ledger.js.map +1 -0
- package/dist/evidence/observed-route-evidence.d.ts +25 -0
- package/dist/evidence/observed-route-evidence.d.ts.map +1 -0
- package/dist/evidence/observed-route-evidence.js +76 -0
- package/dist/evidence/observed-route-evidence.js.map +1 -0
- package/dist/heap.d.ts +61 -0
- package/dist/heap.d.ts.map +1 -0
- package/dist/heap.js +82 -0
- package/dist/heap.js.map +1 -0
- package/dist/heartbeat.d.ts +46 -0
- package/dist/heartbeat.d.ts.map +1 -0
- package/dist/heartbeat.js +66 -0
- package/dist/heartbeat.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/module-trust.d.ts +37 -0
- package/dist/module-trust.d.ts.map +1 -0
- package/dist/module-trust.js +77 -0
- package/dist/module-trust.js.map +1 -0
- package/dist/path-confinement.d.ts +31 -0
- package/dist/path-confinement.d.ts.map +1 -0
- package/dist/path-confinement.js +44 -0
- package/dist/path-confinement.js.map +1 -0
- package/dist/planner/predict-then-propose.d.ts +134 -0
- package/dist/planner/predict-then-propose.d.ts.map +1 -0
- package/dist/planner/predict-then-propose.js +138 -0
- package/dist/planner/predict-then-propose.js.map +1 -0
- package/dist/planner/propose-journey.d.ts +75 -0
- package/dist/planner/propose-journey.d.ts.map +1 -0
- package/dist/planner/propose-journey.js +96 -0
- package/dist/planner/propose-journey.js.map +1 -0
- package/dist/protocol.d.ts +57 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +90 -0
- package/dist/protocol.js.map +1 -0
- package/dist/ready-checks.d.ts +12 -0
- package/dist/ready-checks.d.ts.map +1 -0
- package/dist/ready-checks.js +43 -0
- package/dist/ready-checks.js.map +1 -0
- package/dist/registry.d.ts +103 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +327 -0
- package/dist/registry.js.map +1 -0
- package/dist/render.d.ts +623 -0
- package/dist/render.d.ts.map +1 -0
- package/dist/render.js +968 -0
- package/dist/render.js.map +1 -0
- package/dist/runtime-registry.d.ts +22 -0
- package/dist/runtime-registry.d.ts.map +1 -0
- package/dist/runtime-registry.js +142 -0
- package/dist/runtime-registry.js.map +1 -0
- package/dist/sandbox-defaults.d.ts +41 -0
- package/dist/sandbox-defaults.d.ts.map +1 -0
- package/dist/sandbox-defaults.js +14 -0
- package/dist/sandbox-defaults.js.map +1 -0
- package/dist/scenarios/browser-run-plan-projection.d.ts +161 -0
- package/dist/scenarios/browser-run-plan-projection.d.ts.map +1 -0
- package/dist/scenarios/browser-run-plan-projection.js +264 -0
- package/dist/scenarios/browser-run-plan-projection.js.map +1 -0
- package/dist/scenarios/credential-ref.d.ts +102 -0
- package/dist/scenarios/credential-ref.d.ts.map +1 -0
- package/dist/scenarios/credential-ref.js +148 -0
- package/dist/scenarios/credential-ref.js.map +1 -0
- package/dist/scenarios/index.d.ts +7 -0
- package/dist/scenarios/index.d.ts.map +1 -0
- package/dist/scenarios/index.js +7 -0
- package/dist/scenarios/index.js.map +1 -0
- package/dist/scenarios/parse.d.ts +18 -0
- package/dist/scenarios/parse.d.ts.map +1 -0
- package/dist/scenarios/parse.js +212 -0
- package/dist/scenarios/parse.js.map +1 -0
- package/dist/scenarios/scenario.d.ts +93 -0
- package/dist/scenarios/scenario.d.ts.map +1 -0
- package/dist/scenarios/scenario.js +27 -0
- package/dist/scenarios/scenario.js.map +1 -0
- package/dist/scenarios/secret-ref.d.ts +86 -0
- package/dist/scenarios/secret-ref.d.ts.map +1 -0
- package/dist/scenarios/secret-ref.js +125 -0
- package/dist/scenarios/secret-ref.js.map +1 -0
- package/dist/scenarios/storage.d.ts +21 -0
- package/dist/scenarios/storage.d.ts.map +1 -0
- package/dist/scenarios/storage.js +103 -0
- package/dist/scenarios/storage.js.map +1 -0
- package/dist/server.d.ts +61 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +642 -0
- package/dist/server.js.map +1 -0
- package/dist/session.d.ts +356 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +779 -0
- package/dist/session.js.map +1 -0
- package/dist/tools/alias-kit.d.ts +29 -0
- package/dist/tools/alias-kit.d.ts.map +1 -0
- package/dist/tools/alias-kit.js +21 -0
- package/dist/tools/alias-kit.js.map +1 -0
- package/dist/tools/aliases.d.ts +42 -0
- package/dist/tools/aliases.d.ts.map +1 -0
- package/dist/tools/aliases.js +52 -0
- package/dist/tools/aliases.js.map +1 -0
- package/dist/tools/analyze-workspace.d.ts +52 -0
- package/dist/tools/analyze-workspace.d.ts.map +1 -0
- package/dist/tools/analyze-workspace.js +207 -0
- package/dist/tools/analyze-workspace.js.map +1 -0
- package/dist/tools/analyze.d.ts +163 -0
- package/dist/tools/analyze.d.ts.map +1 -0
- package/dist/tools/analyze.js +724 -0
- package/dist/tools/analyze.js.map +1 -0
- package/dist/tools/browser-click.d.ts +18 -0
- package/dist/tools/browser-click.d.ts.map +1 -0
- package/dist/tools/browser-click.js +110 -0
- package/dist/tools/browser-click.js.map +1 -0
- package/dist/tools/browser-close-session.d.ts +39 -0
- package/dist/tools/browser-close-session.d.ts.map +1 -0
- package/dist/tools/browser-close-session.js +120 -0
- package/dist/tools/browser-close-session.js.map +1 -0
- package/dist/tools/browser-fill.d.ts +18 -0
- package/dist/tools/browser-fill.d.ts.map +1 -0
- package/dist/tools/browser-fill.js +117 -0
- package/dist/tools/browser-fill.js.map +1 -0
- package/dist/tools/browser-navigate.d.ts +15 -0
- package/dist/tools/browser-navigate.d.ts.map +1 -0
- package/dist/tools/browser-navigate.js +106 -0
- package/dist/tools/browser-navigate.js.map +1 -0
- package/dist/tools/browser-read.d.ts +33 -0
- package/dist/tools/browser-read.d.ts.map +1 -0
- package/dist/tools/browser-read.js +105 -0
- package/dist/tools/browser-read.js.map +1 -0
- package/dist/tools/browser-run-scenario.d.ts +28 -0
- package/dist/tools/browser-run-scenario.d.ts.map +1 -0
- package/dist/tools/browser-run-scenario.js +238 -0
- package/dist/tools/browser-run-scenario.js.map +1 -0
- package/dist/tools/browser-save-scenario.d.ts +19 -0
- package/dist/tools/browser-save-scenario.d.ts.map +1 -0
- package/dist/tools/browser-save-scenario.js +447 -0
- package/dist/tools/browser-save-scenario.js.map +1 -0
- package/dist/tools/browser-select.d.ts +20 -0
- package/dist/tools/browser-select.d.ts.map +1 -0
- package/dist/tools/browser-select.js +120 -0
- package/dist/tools/browser-select.js.map +1 -0
- package/dist/tools/browser-snapshot.d.ts +46 -0
- package/dist/tools/browser-snapshot.d.ts.map +1 -0
- package/dist/tools/browser-snapshot.js +127 -0
- package/dist/tools/browser-snapshot.js.map +1 -0
- package/dist/tools/browser-start-session.d.ts +24 -0
- package/dist/tools/browser-start-session.d.ts.map +1 -0
- package/dist/tools/browser-start-session.js +653 -0
- package/dist/tools/browser-start-session.js.map +1 -0
- package/dist/tools/browser-submit.d.ts +18 -0
- package/dist/tools/browser-submit.d.ts.map +1 -0
- package/dist/tools/browser-submit.js +106 -0
- package/dist/tools/browser-submit.js.map +1 -0
- package/dist/tools/browser-type.d.ts +18 -0
- package/dist/tools/browser-type.d.ts.map +1 -0
- package/dist/tools/browser-type.js +115 -0
- package/dist/tools/browser-type.js.map +1 -0
- package/dist/tools/browser-wait-for.d.ts +45 -0
- package/dist/tools/browser-wait-for.d.ts.map +1 -0
- package/dist/tools/browser-wait-for.js +164 -0
- package/dist/tools/browser-wait-for.js.map +1 -0
- package/dist/tools/browser.d.ts +69 -0
- package/dist/tools/browser.d.ts.map +1 -0
- package/dist/tools/browser.js +326 -0
- package/dist/tools/browser.js.map +1 -0
- package/dist/tools/chain.d.ts +41 -0
- package/dist/tools/chain.d.ts.map +1 -0
- package/dist/tools/chain.js +101 -0
- package/dist/tools/chain.js.map +1 -0
- package/dist/tools/change-scope.d.ts +25 -0
- package/dist/tools/change-scope.d.ts.map +1 -0
- package/dist/tools/change-scope.js +103 -0
- package/dist/tools/change-scope.js.map +1 -0
- package/dist/tools/code-context.d.ts +83 -0
- package/dist/tools/code-context.d.ts.map +1 -0
- package/dist/tools/code-context.js +432 -0
- package/dist/tools/code-context.js.map +1 -0
- package/dist/tools/contracts.d.ts +74 -0
- package/dist/tools/contracts.d.ts.map +1 -0
- package/dist/tools/contracts.js +214 -0
- package/dist/tools/contracts.js.map +1 -0
- package/dist/tools/cross-pr.d.ts +178 -0
- package/dist/tools/cross-pr.d.ts.map +1 -0
- package/dist/tools/cross-pr.js +362 -0
- package/dist/tools/cross-pr.js.map +1 -0
- package/dist/tools/disclosure.d.ts +75 -0
- package/dist/tools/disclosure.d.ts.map +1 -0
- package/dist/tools/disclosure.js +325 -0
- package/dist/tools/disclosure.js.map +1 -0
- package/dist/tools/draw-conclusion.d.ts +55 -0
- package/dist/tools/draw-conclusion.d.ts.map +1 -0
- package/dist/tools/draw-conclusion.js +243 -0
- package/dist/tools/draw-conclusion.js.map +1 -0
- package/dist/tools/git-context.d.ts +39 -0
- package/dist/tools/git-context.d.ts.map +1 -0
- package/dist/tools/git-context.js +374 -0
- package/dist/tools/git-context.js.map +1 -0
- package/dist/tools/git-diff.d.ts +45 -0
- package/dist/tools/git-diff.d.ts.map +1 -0
- package/dist/tools/git-diff.js +338 -0
- package/dist/tools/git-diff.js.map +1 -0
- package/dist/tools/git-history.d.ts +16 -0
- package/dist/tools/git-history.d.ts.map +1 -0
- package/dist/tools/git-history.js +106 -0
- package/dist/tools/git-history.js.map +1 -0
- package/dist/tools/history.d.ts +34 -0
- package/dist/tools/history.d.ts.map +1 -0
- package/dist/tools/history.js +121 -0
- package/dist/tools/history.js.map +1 -0
- package/dist/tools/impact.d.ts +46 -0
- package/dist/tools/impact.d.ts.map +1 -0
- package/dist/tools/impact.js +225 -0
- package/dist/tools/impact.js.map +1 -0
- package/dist/tools/index.d.ts +59 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +70 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/kit.d.ts +165 -0
- package/dist/tools/kit.d.ts.map +1 -0
- package/dist/tools/kit.js +153 -0
- package/dist/tools/kit.js.map +1 -0
- package/dist/tools/link-workspace.d.ts +24 -0
- package/dist/tools/link-workspace.d.ts.map +1 -0
- package/dist/tools/link-workspace.js +131 -0
- package/dist/tools/link-workspace.js.map +1 -0
- package/dist/tools/lookup.d.ts +19 -0
- package/dist/tools/lookup.d.ts.map +1 -0
- package/dist/tools/lookup.js +63 -0
- package/dist/tools/lookup.js.map +1 -0
- package/dist/tools/mark-incident.d.ts +28 -0
- package/dist/tools/mark-incident.d.ts.map +1 -0
- package/dist/tools/mark-incident.js +171 -0
- package/dist/tools/mark-incident.js.map +1 -0
- package/dist/tools/merged-browser.d.ts +11 -0
- package/dist/tools/merged-browser.d.ts.map +1 -0
- package/dist/tools/merged-browser.js +20 -0
- package/dist/tools/merged-browser.js.map +1 -0
- package/dist/tools/merged-context.d.ts +11 -0
- package/dist/tools/merged-context.d.ts.map +1 -0
- package/dist/tools/merged-context.js +21 -0
- package/dist/tools/merged-context.js.map +1 -0
- package/dist/tools/merged-observe.d.ts +13 -0
- package/dist/tools/merged-observe.d.ts.map +1 -0
- package/dist/tools/merged-observe.js +21 -0
- package/dist/tools/merged-observe.js.map +1 -0
- package/dist/tools/merged-workspace.d.ts +14 -0
- package/dist/tools/merged-workspace.d.ts.map +1 -0
- package/dist/tools/merged-workspace.js +21 -0
- package/dist/tools/merged-workspace.js.map +1 -0
- package/dist/tools/observe-runtime.d.ts +262 -0
- package/dist/tools/observe-runtime.d.ts.map +1 -0
- package/dist/tools/observe-runtime.js +1966 -0
- package/dist/tools/observe-runtime.js.map +1 -0
- package/dist/tools/observe-tests.d.ts +57 -0
- package/dist/tools/observe-tests.d.ts.map +1 -0
- package/dist/tools/observe-tests.js +391 -0
- package/dist/tools/observe-tests.js.map +1 -0
- package/dist/tools/observe.d.ts +28 -0
- package/dist/tools/observe.d.ts.map +1 -0
- package/dist/tools/observe.js +291 -0
- package/dist/tools/observe.js.map +1 -0
- package/dist/tools/pr-analysis.d.ts +189 -0
- package/dist/tools/pr-analysis.d.ts.map +1 -0
- package/dist/tools/pr-analysis.js +365 -0
- package/dist/tools/pr-analysis.js.map +1 -0
- package/dist/tools/pre-push.d.ts +168 -0
- package/dist/tools/pre-push.d.ts.map +1 -0
- package/dist/tools/pre-push.js +416 -0
- package/dist/tools/pre-push.js.map +1 -0
- package/dist/tools/predict-reach.d.ts +57 -0
- package/dist/tools/predict-reach.d.ts.map +1 -0
- package/dist/tools/predict-reach.js +183 -0
- package/dist/tools/predict-reach.js.map +1 -0
- package/dist/tools/propagation.d.ts +37 -0
- package/dist/tools/propagation.d.ts.map +1 -0
- package/dist/tools/propagation.js +162 -0
- package/dist/tools/propagation.js.map +1 -0
- package/dist/tools/propose-journey.d.ts +16 -0
- package/dist/tools/propose-journey.d.ts.map +1 -0
- package/dist/tools/propose-journey.js +132 -0
- package/dist/tools/propose-journey.js.map +1 -0
- package/dist/tools/prove-reach.d.ts +74 -0
- package/dist/tools/prove-reach.d.ts.map +1 -0
- package/dist/tools/prove-reach.js +274 -0
- package/dist/tools/prove-reach.js.map +1 -0
- package/dist/tools/questions.d.ts +30 -0
- package/dist/tools/questions.d.ts.map +1 -0
- package/dist/tools/questions.js +230 -0
- package/dist/tools/questions.js.map +1 -0
- package/dist/tools/refusal-fetch.d.ts +35 -0
- package/dist/tools/refusal-fetch.d.ts.map +1 -0
- package/dist/tools/refusal-fetch.js +123 -0
- package/dist/tools/refusal-fetch.js.map +1 -0
- package/dist/tools/runtime-incident.d.ts +33 -0
- package/dist/tools/runtime-incident.d.ts.map +1 -0
- package/dist/tools/runtime-incident.js +67 -0
- package/dist/tools/runtime-incident.js.map +1 -0
- package/dist/tools/runtime-journey-drive.d.ts +102 -0
- package/dist/tools/runtime-journey-drive.d.ts.map +1 -0
- package/dist/tools/runtime-journey-drive.js +247 -0
- package/dist/tools/runtime-journey-drive.js.map +1 -0
- package/dist/tools/scope.d.ts +45 -0
- package/dist/tools/scope.d.ts.map +1 -0
- package/dist/tools/scope.js +217 -0
- package/dist/tools/scope.js.map +1 -0
- package/dist/tools/similar-incidents.d.ts +43 -0
- package/dist/tools/similar-incidents.d.ts.map +1 -0
- package/dist/tools/similar-incidents.js +190 -0
- package/dist/tools/similar-incidents.js.map +1 -0
- package/dist/tools/validate.d.ts +133 -0
- package/dist/tools/validate.d.ts.map +1 -0
- package/dist/tools/validate.js +488 -0
- package/dist/tools/validate.js.map +1 -0
- package/dist/tools/verb.d.ts +46 -0
- package/dist/tools/verb.d.ts.map +1 -0
- package/dist/tools/verb.js +78 -0
- package/dist/tools/verb.js.map +1 -0
- package/dist/tools/verification-status.d.ts +38 -0
- package/dist/tools/verification-status.d.ts.map +1 -0
- package/dist/tools/verification-status.js +203 -0
- package/dist/tools/verification-status.js.map +1 -0
- package/dist/tools/verify-claim.d.ts +29 -0
- package/dist/tools/verify-claim.d.ts.map +1 -0
- package/dist/tools/verify-claim.js +218 -0
- package/dist/tools/verify-claim.js.map +1 -0
- package/dist/tools/workspace.d.ts +28 -0
- package/dist/tools/workspace.d.ts.map +1 -0
- package/dist/tools/workspace.js +94 -0
- package/dist/tools/workspace.js.map +1 -0
- package/dist/transport.d.ts +32 -0
- package/dist/transport.d.ts.map +1 -0
- package/dist/transport.js +85 -0
- package/dist/transport.js.map +1 -0
- package/dist/workspace-index.d.ts +164 -0
- package/dist/workspace-index.d.ts.map +1 -0
- package/dist/workspace-index.js +381 -0
- package/dist/workspace-index.js.map +1 -0
- package/package.json +5 -5
|
@@ -0,0 +1,488 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `validate` — §15 static validation: env/config checks.
|
|
3
|
+
* Omits a var unless its read fails-on-absence AND declaration surface is complete
|
|
4
|
+
* (18/107 wrong findings measured otherwise); refuses rather than `ok` when no reads
|
|
5
|
+
* exist. Pass `files` for NEW_READ_UNDECLARED — catches accessor-shape-independent reads.
|
|
6
|
+
* Add `changedLines` (from get_git_diff's patch) to verify against an added line rather
|
|
7
|
+
* than a file scope, and get `defect` instead of `lead` back for it — see C2, UAT phase 4. */
|
|
8
|
+
import { existsSync } from "node:fs";
|
|
9
|
+
import { join } from "node:path";
|
|
10
|
+
import { buildConfigGraph, checkAttributeExistence, checkEnvironment, checkMigrationIntegrity, checkObservedRoutes, checkOrmModelRegistration, checkRollbackReadiness, declaredRoutesFrom, scanConfigSurfaces, scanMigrations, } from "@descryy/core";
|
|
11
|
+
import { EvidenceStore } from "@descryy/runtime-evidence-store";
|
|
12
|
+
import { extractObservedRouteEvidence } from "../evidence/observed-route-evidence.js";
|
|
13
|
+
import { optionalInteger, optionalStringArray, ToolInputError, } from "./kit.js";
|
|
14
|
+
import { DEFAULT_EVIDENCE_RELATIVE_PATH } from "./observe-runtime.js";
|
|
15
|
+
import { capBySize, sizeCapNote } from "../capped.js";
|
|
16
|
+
/**
|
|
17
|
+
* `fitToBudget` for `ValidateData` — six independently-`maxFindings`-capped
|
|
18
|
+
* finding lists, none sharing a payload with another, so shrinking is only
|
|
19
|
+
* ever dropping trailing rows from one list at a time. Trimmed in an order
|
|
20
|
+
* that spends the budget on the two lists this tool exists to catch last:
|
|
21
|
+
* `observedRoutes`, `ormRegistration` and `rollback` are always leads, worth
|
|
22
|
+
* a look but never a graph-provable contradiction; `attributeExistence` and
|
|
23
|
+
* `migrationIntegrity` are always defects; `findings` (env) mixes both and is
|
|
24
|
+
* kept longest because it is the check's own headline count.
|
|
25
|
+
*/
|
|
26
|
+
function fitValidate(rest, budgetBytes) {
|
|
27
|
+
const scaffoldBytes = Buffer.byteLength(JSON.stringify({
|
|
28
|
+
...rest,
|
|
29
|
+
findings: [],
|
|
30
|
+
rollback: { ...rest.rollback, findings: [] },
|
|
31
|
+
attributeExistence: { ...rest.attributeExistence, findings: [] },
|
|
32
|
+
migrationIntegrity: { ...rest.migrationIntegrity, findings: [] },
|
|
33
|
+
ormRegistration: { ...rest.ormRegistration, findings: [] },
|
|
34
|
+
observedRoutes: { ...rest.observedRoutes, findings: [] },
|
|
35
|
+
}), "utf8");
|
|
36
|
+
let budget = Math.max(budgetBytes - scaffoldBytes, 0);
|
|
37
|
+
const spend = (items) => {
|
|
38
|
+
const fit = capBySize(items, budget, 0);
|
|
39
|
+
budget = Math.max(budget - Buffer.byteLength(JSON.stringify(fit.shown), "utf8"), 0);
|
|
40
|
+
return fit;
|
|
41
|
+
};
|
|
42
|
+
const observedRoutesFit = spend(rest.observedRoutes.findings);
|
|
43
|
+
const ormRegistrationFit = spend(rest.ormRegistration.findings);
|
|
44
|
+
const rollbackFit = spend(rest.rollback.findings);
|
|
45
|
+
const migrationIntegrityFit = spend(rest.migrationIntegrity.findings);
|
|
46
|
+
const attributeExistenceFit = spend(rest.attributeExistence.findings);
|
|
47
|
+
const findingsFit = spend(rest.findings);
|
|
48
|
+
const notes = [];
|
|
49
|
+
const noteIfDropped = (noun, fit, before) => {
|
|
50
|
+
if (fit.droppedForSize > 0)
|
|
51
|
+
notes.push(sizeCapNote(noun, fit.shown.length, before, fit.droppedForSize));
|
|
52
|
+
};
|
|
53
|
+
noteIfDropped("env/config finding", findingsFit, rest.findings.length);
|
|
54
|
+
noteIfDropped("rollback finding", rollbackFit, rest.rollback.findings.length);
|
|
55
|
+
noteIfDropped("attribute-existence finding", attributeExistenceFit, rest.attributeExistence.findings.length);
|
|
56
|
+
noteIfDropped("migration-integrity finding", migrationIntegrityFit, rest.migrationIntegrity.findings.length);
|
|
57
|
+
noteIfDropped("ORM-registration finding", ormRegistrationFit, rest.ormRegistration.findings.length);
|
|
58
|
+
noteIfDropped("observed-route finding", observedRoutesFit, rest.observedRoutes.findings.length);
|
|
59
|
+
const droppedNow = findingsFit.droppedForSize +
|
|
60
|
+
rollbackFit.droppedForSize +
|
|
61
|
+
attributeExistenceFit.droppedForSize +
|
|
62
|
+
migrationIntegrityFit.droppedForSize +
|
|
63
|
+
ormRegistrationFit.droppedForSize +
|
|
64
|
+
observedRoutesFit.droppedForSize;
|
|
65
|
+
const shownNow = findingsFit.shown.length +
|
|
66
|
+
rollbackFit.shown.length +
|
|
67
|
+
attributeExistenceFit.shown.length +
|
|
68
|
+
migrationIntegrityFit.shown.length +
|
|
69
|
+
ormRegistrationFit.shown.length +
|
|
70
|
+
observedRoutesFit.shown.length;
|
|
71
|
+
const totalBefore = rest.findings.length +
|
|
72
|
+
rest.rollback.findings.length +
|
|
73
|
+
rest.attributeExistence.findings.length +
|
|
74
|
+
rest.migrationIntegrity.findings.length +
|
|
75
|
+
rest.ormRegistration.findings.length +
|
|
76
|
+
rest.observedRoutes.findings.length;
|
|
77
|
+
return {
|
|
78
|
+
data: {
|
|
79
|
+
...rest,
|
|
80
|
+
findings: findingsFit.shown,
|
|
81
|
+
rollback: { ...rest.rollback, findings: rollbackFit.shown },
|
|
82
|
+
attributeExistence: { ...rest.attributeExistence, findings: attributeExistenceFit.shown },
|
|
83
|
+
migrationIntegrity: { ...rest.migrationIntegrity, findings: migrationIntegrityFit.shown },
|
|
84
|
+
ormRegistration: { ...rest.ormRegistration, findings: ormRegistrationFit.shown },
|
|
85
|
+
observedRoutes: { ...rest.observedRoutes, findings: observedRoutesFit.shown },
|
|
86
|
+
},
|
|
87
|
+
notes,
|
|
88
|
+
...(droppedNow === 0 ? {} : { truncatedDetail: { shown: shownNow, total: totalBefore, more: null } }),
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Flattens every one of `validate`'s finding sources into one array: the
|
|
93
|
+
* top-level env array plus the nested reports (`rollback`, `attributeExistence`,
|
|
94
|
+
* `migrationIntegrity`, `ormRegistration`, `observedRoutes`).
|
|
95
|
+
*
|
|
96
|
+
* `validate` publishes findings across several separate sub-objects because
|
|
97
|
+
* each check examines a different kind of evidence and discloses its own
|
|
98
|
+
* `ran`/`examined`/`withheld` detail alongside its findings. A composer that
|
|
99
|
+
* reads only one of them silently drops the rest — the exact failure UAT
|
|
100
|
+
* phase 5 §4 found in `pre_push`, which read `data.findings` and nothing
|
|
101
|
+
* else. This function is the one place that knows the full list, so a new
|
|
102
|
+
* sub-check added here is inherited by every composer automatically instead
|
|
103
|
+
* of requiring a second, easily-forgotten edit at each call site.
|
|
104
|
+
*/
|
|
105
|
+
export function collectValidateFindings(data) {
|
|
106
|
+
return [
|
|
107
|
+
...data.findings,
|
|
108
|
+
...data.rollback.findings,
|
|
109
|
+
...data.attributeExistence.findings,
|
|
110
|
+
...data.migrationIntegrity.findings,
|
|
111
|
+
...data.ormRegistration.findings,
|
|
112
|
+
...data.observedRoutes.findings,
|
|
113
|
+
];
|
|
114
|
+
}
|
|
115
|
+
const SCHEMA = {
|
|
116
|
+
type: "object",
|
|
117
|
+
properties: {
|
|
118
|
+
files: {
|
|
119
|
+
type: "array",
|
|
120
|
+
items: { type: "string" },
|
|
121
|
+
description: "Restrict to these files (config files always read in full).",
|
|
122
|
+
},
|
|
123
|
+
coverageFloor: {
|
|
124
|
+
type: "number",
|
|
125
|
+
minimum: 0,
|
|
126
|
+
maximum: 1,
|
|
127
|
+
description: "Fraction of variables that must be declared before a missing-var finding fires. Default 0.6.",
|
|
128
|
+
},
|
|
129
|
+
maxFindings: {
|
|
130
|
+
type: "integer",
|
|
131
|
+
minimum: 1,
|
|
132
|
+
description: "Cap on findings returned. Default 25; overflow is disclosed, not dropped.",
|
|
133
|
+
},
|
|
134
|
+
changedLines: {
|
|
135
|
+
type: "array",
|
|
136
|
+
items: {
|
|
137
|
+
type: "object",
|
|
138
|
+
properties: {
|
|
139
|
+
file: {
|
|
140
|
+
type: "string",
|
|
141
|
+
description: "Path, matching one entry of \"files\".",
|
|
142
|
+
},
|
|
143
|
+
ranges: {
|
|
144
|
+
type: "array",
|
|
145
|
+
items: {
|
|
146
|
+
type: "object",
|
|
147
|
+
properties: {
|
|
148
|
+
start: { type: "integer", minimum: 1 },
|
|
149
|
+
end: { type: "integer", minimum: 1 },
|
|
150
|
+
},
|
|
151
|
+
required: ["start", "end"],
|
|
152
|
+
additionalProperties: false,
|
|
153
|
+
},
|
|
154
|
+
description: "1-based, inclusive line ranges actually added.",
|
|
155
|
+
},
|
|
156
|
+
},
|
|
157
|
+
required: ["file", "ranges"],
|
|
158
|
+
additionalProperties: false,
|
|
159
|
+
},
|
|
160
|
+
description: "Lines the diff added, per file. Sharpens a same-file finding to a verified defect.",
|
|
161
|
+
},
|
|
162
|
+
},
|
|
163
|
+
additionalProperties: false,
|
|
164
|
+
};
|
|
165
|
+
/** `changedLines`' wire shape ({ file, ranges }[], JSON-schema-friendly) into the
|
|
166
|
+
* `Map` `checkEnvironment` takes. Malformed input is refused, not silently dropped —
|
|
167
|
+
* a caller that thinks it narrowed the check and did not is worse off than one who
|
|
168
|
+
* never tried. */
|
|
169
|
+
function parseChangedLines(args) {
|
|
170
|
+
const raw = args["changedLines"];
|
|
171
|
+
if (raw === undefined)
|
|
172
|
+
return undefined;
|
|
173
|
+
if (!Array.isArray(raw)) {
|
|
174
|
+
throw new ToolInputError('"changedLines" must be an array of { file, ranges }.');
|
|
175
|
+
}
|
|
176
|
+
const map = new Map();
|
|
177
|
+
for (const entry of raw) {
|
|
178
|
+
if (typeof entry !== "object" || entry === null) {
|
|
179
|
+
throw new ToolInputError('Each "changedLines" entry must be an object with "file" and "ranges".');
|
|
180
|
+
}
|
|
181
|
+
const row = entry;
|
|
182
|
+
const file = row["file"];
|
|
183
|
+
const ranges = row["ranges"];
|
|
184
|
+
if (typeof file !== "string" || file === "" || !Array.isArray(ranges)) {
|
|
185
|
+
throw new ToolInputError('Each "changedLines" entry needs a non-empty "file" and a "ranges" array.');
|
|
186
|
+
}
|
|
187
|
+
const parsedRanges = [];
|
|
188
|
+
for (const range of ranges) {
|
|
189
|
+
const r = typeof range === "object" && range !== null ? range : null;
|
|
190
|
+
const start = r?.["start"];
|
|
191
|
+
const end = r?.["end"];
|
|
192
|
+
if (typeof start !== "number" || typeof end !== "number") {
|
|
193
|
+
throw new ToolInputError(`"changedLines" entry for "${file}" has a range that is not { start, end }.`);
|
|
194
|
+
}
|
|
195
|
+
parsedRanges.push({ start, end });
|
|
196
|
+
}
|
|
197
|
+
map.set(file, parsedRanges);
|
|
198
|
+
}
|
|
199
|
+
return map;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* UAT phase 5 §5 (D2): reads `observe_runtime`'s own evidence database, if one
|
|
203
|
+
* already exists, and checks its `NETWORK_RESPONSE`/`HTTP_ERROR` evidence
|
|
204
|
+
* against the graph's declared routes.
|
|
205
|
+
*
|
|
206
|
+
* Never creates the database — this is a read tool, and `observe_runtime` (an
|
|
207
|
+
* action tool) is the only thing with a legitimate reason to write one.
|
|
208
|
+
*/
|
|
209
|
+
function readObservedRoutes(repoPath, provider) {
|
|
210
|
+
const evidencePath = join(repoPath, DEFAULT_EVIDENCE_RELATIVE_PATH);
|
|
211
|
+
if (!existsSync(evidencePath)) {
|
|
212
|
+
return {
|
|
213
|
+
findings: [],
|
|
214
|
+
examined: 0,
|
|
215
|
+
ran: false,
|
|
216
|
+
note: `No evidence database exists yet at ${evidencePath} — observe_runtime has not run against ` +
|
|
217
|
+
"this repository. observedRoutes did not run.",
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
const store = new EvidenceStore({ path: evidencePath });
|
|
221
|
+
try {
|
|
222
|
+
const events = [
|
|
223
|
+
...store.query({ executionId: null, eventType: "NETWORK_REQUEST" }),
|
|
224
|
+
...store.query({ executionId: null, eventType: "NETWORK_RESPONSE" }),
|
|
225
|
+
...store.query({ executionId: null, eventType: "HTTP_ERROR" }),
|
|
226
|
+
];
|
|
227
|
+
const observed = extractObservedRouteEvidence(events);
|
|
228
|
+
if (observed.length === 0) {
|
|
229
|
+
return {
|
|
230
|
+
findings: [],
|
|
231
|
+
examined: 0,
|
|
232
|
+
ran: false,
|
|
233
|
+
note: "The evidence database exists but holds no NETWORK_RESPONSE/HTTP_ERROR evidence with a " +
|
|
234
|
+
"usable method, URL and status. observedRoutes did not run.",
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
const result = checkObservedRoutes(observed, declaredRoutesFrom(provider));
|
|
238
|
+
return { findings: result.findings, examined: result.examined, ran: true, note: null };
|
|
239
|
+
}
|
|
240
|
+
finally {
|
|
241
|
+
store.close();
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
async function run(args, ctx) {
|
|
245
|
+
const files = optionalStringArray(args, "files");
|
|
246
|
+
const maxFindings = optionalInteger(args, "maxFindings", 1);
|
|
247
|
+
const rawFloor = args["coverageFloor"];
|
|
248
|
+
const coverageFloor = typeof rawFloor === "number" && rawFloor >= 0 && rawFloor <= 1 ? rawFloor : undefined;
|
|
249
|
+
const changedLines = parseChangedLines(args);
|
|
250
|
+
ctx.progress("Reading configuration files");
|
|
251
|
+
const scan = scanConfigSurfaces(ctx.session.repoPath);
|
|
252
|
+
ctx.progress("Cross-checking against environment reads in the graph");
|
|
253
|
+
const provider = ctx.session.provider();
|
|
254
|
+
const checked = checkEnvironment(provider, scan, {
|
|
255
|
+
...(files === undefined ? {} : { files }),
|
|
256
|
+
...(maxFindings === undefined ? {} : { maxFindings }),
|
|
257
|
+
...(coverageFloor === undefined ? {} : { coverageFloor }),
|
|
258
|
+
...(changedLines === undefined ? {} : { changedLines }),
|
|
259
|
+
});
|
|
260
|
+
ctx.progress("Tracing what depends on each configuration variable");
|
|
261
|
+
const configGraph = buildConfigGraph(provider, scan);
|
|
262
|
+
ctx.progress("Reading migrations for destructive operations");
|
|
263
|
+
const rollback = checkRollbackReadiness(provider, scanMigrations(ctx.session.repoPath), {
|
|
264
|
+
...(files === undefined ? {} : { files }),
|
|
265
|
+
...(maxFindings === undefined ? {} : { maxFindings }),
|
|
266
|
+
});
|
|
267
|
+
ctx.progress("Checking attribute reads against declared types");
|
|
268
|
+
const attributeExistence = checkAttributeExistence(provider, {
|
|
269
|
+
...(files === undefined ? {} : { files }),
|
|
270
|
+
...(maxFindings === undefined ? {} : { maxFindings }),
|
|
271
|
+
});
|
|
272
|
+
ctx.progress("Checking migration location and revision chain");
|
|
273
|
+
const migrationIntegrity = checkMigrationIntegrity(provider, {
|
|
274
|
+
...(files === undefined ? {} : { files }),
|
|
275
|
+
...(maxFindings === undefined ? {} : { maxFindings }),
|
|
276
|
+
});
|
|
277
|
+
ctx.progress("Checking ORM models are reached by their package's __init__");
|
|
278
|
+
const ormRegistration = checkOrmModelRegistration(provider, {
|
|
279
|
+
...(files === undefined ? {} : { files }),
|
|
280
|
+
...(maxFindings === undefined ? {} : { maxFindings }),
|
|
281
|
+
});
|
|
282
|
+
ctx.progress("Checking observed HTTP responses against declared routes");
|
|
283
|
+
const observedRoutes = readObservedRoutes(ctx.session.repoPath, provider);
|
|
284
|
+
const report = checked.data;
|
|
285
|
+
const defects = report.findings.filter((f) => f.claim === "defect").length +
|
|
286
|
+
attributeExistence.data.findings.length +
|
|
287
|
+
migrationIntegrity.data.findings.length;
|
|
288
|
+
const leads = report.findings.length - report.findings.filter((f) => f.claim === "defect").length;
|
|
289
|
+
// Nothing compared at all: no config files, reads, migrations, attribute reads,
|
|
290
|
+
// or migration revisions — any one alone is a real answer, none of them is not.
|
|
291
|
+
const nothingToCheck = report.surfaces.length === 0 &&
|
|
292
|
+
!report.readsAvailable &&
|
|
293
|
+
!rollback.data.ran &&
|
|
294
|
+
!attributeExistence.data.ran &&
|
|
295
|
+
!migrationIntegrity.data.ran &&
|
|
296
|
+
!ormRegistration.data.ran &&
|
|
297
|
+
!observedRoutes.ran;
|
|
298
|
+
// A `files` scope matching zero FILE nodes means those files were never read into
|
|
299
|
+
// the graph (bad path, or unparsed) — not "read and clean". Same collapse as
|
|
300
|
+
// `contracts(paths)`, one level down.
|
|
301
|
+
const filesMatchedNothing = files !== undefined && report.reads.filesWithReads + report.reads.filesWithoutReads === 0;
|
|
302
|
+
// Leads and rollback findings are worth a look; defects are what this tool exists
|
|
303
|
+
// to catch. Never blur the two into one count (see EnvFindingReport.claim).
|
|
304
|
+
const otherFindings = leads + rollback.data.findings.length + ormRegistration.data.findings.length + observedRoutes.findings.length;
|
|
305
|
+
// A "Clean" verdict from a files scope matching nothing would misreport "checked,
|
|
306
|
+
// fine" when nothing was read. Only pure-Clean is downgraded — real findings from
|
|
307
|
+
// unscoped checks still surface.
|
|
308
|
+
const falseClean = filesMatchedNothing && defects === 0 && otherFindings === 0;
|
|
309
|
+
const verdict = falseClean
|
|
310
|
+
? "not checked"
|
|
311
|
+
: defects > 0
|
|
312
|
+
? `${defects} defect(s) found`
|
|
313
|
+
: otherFindings > 0
|
|
314
|
+
? `No defects; ${otherFindings} lead(s)/rollback finding(s) to review`
|
|
315
|
+
: "Clean";
|
|
316
|
+
const scopeNotes = filesMatchedNothing
|
|
317
|
+
? [
|
|
318
|
+
`0 of the ${(files ?? []).length} named file(s) matched a FILE node this graph's read side ` +
|
|
319
|
+
"considered — either the path is wrong, or the file was never read into the graph. The " +
|
|
320
|
+
"environment-read half of this report has nothing to say about them; it is not evidence " +
|
|
321
|
+
"they are clean.",
|
|
322
|
+
]
|
|
323
|
+
: [];
|
|
324
|
+
// render.ts requires truncatedDetail whenever truncated=true. `truncated` folds 5
|
|
325
|
+
// independently-truncatable sources; shown/total cover the finding lists a
|
|
326
|
+
// maxFindings cap acts on — configGraph's own truncation stays prose-only.
|
|
327
|
+
// `observedRoutes` has no cap of its own (bounded by evidence volume, not by
|
|
328
|
+
// this tool), so it contributes the same count to both.
|
|
329
|
+
const shown = report.findings.length +
|
|
330
|
+
rollback.data.findings.length +
|
|
331
|
+
attributeExistence.data.findings.length +
|
|
332
|
+
migrationIntegrity.data.findings.length +
|
|
333
|
+
ormRegistration.data.findings.length +
|
|
334
|
+
observedRoutes.findings.length;
|
|
335
|
+
const total = report.findingsTotal +
|
|
336
|
+
rollback.data.findingsTotal +
|
|
337
|
+
attributeExistence.data.findingsTotal +
|
|
338
|
+
migrationIntegrity.data.findingsTotal +
|
|
339
|
+
ormRegistration.data.findingsTotal +
|
|
340
|
+
observedRoutes.findings.length;
|
|
341
|
+
const truncated = checked.truncated ||
|
|
342
|
+
rollback.truncated ||
|
|
343
|
+
attributeExistence.truncated ||
|
|
344
|
+
migrationIntegrity.truncated ||
|
|
345
|
+
ormRegistration.truncated ||
|
|
346
|
+
configGraph.truncated;
|
|
347
|
+
const truncatedDetail = truncated
|
|
348
|
+
? { shown, total: Math.max(total, shown), more: null }
|
|
349
|
+
: undefined;
|
|
350
|
+
const validateData = {
|
|
351
|
+
findings: report.findings.map((f) => ({
|
|
352
|
+
kind: f.kind,
|
|
353
|
+
name: f.name,
|
|
354
|
+
claim: f.claim,
|
|
355
|
+
detail: f.detail,
|
|
356
|
+
evidence: f.evidence,
|
|
357
|
+
resolution: f.resolution,
|
|
358
|
+
})),
|
|
359
|
+
findingsTotal: report.findingsTotal,
|
|
360
|
+
surfaces: report.surfaces,
|
|
361
|
+
reads: report.reads,
|
|
362
|
+
coverage: report.coverage,
|
|
363
|
+
declaredNeverRead: report.declaredNeverRead,
|
|
364
|
+
readsAvailable: report.readsAvailable,
|
|
365
|
+
// §15.3's third check feeds the first. Only variables with a computable
|
|
366
|
+
// dependent set are carried — unknown count is not a zero, not worth a row.
|
|
367
|
+
configGraph: {
|
|
368
|
+
counts: configGraph.data.counts,
|
|
369
|
+
importsAvailable: configGraph.data.importsAvailable,
|
|
370
|
+
mostDependedOn: configGraph.data.variables
|
|
371
|
+
.filter((v) => v.dependents !== null && v.dependents > 0)
|
|
372
|
+
.slice(0, 10)
|
|
373
|
+
.map((v) => ({
|
|
374
|
+
name: v.name,
|
|
375
|
+
dependents: v.dependents,
|
|
376
|
+
truncated: v.dependentsTruncated,
|
|
377
|
+
readAt: v.readAt.slice(0, 3),
|
|
378
|
+
sample: v.dependentSample,
|
|
379
|
+
})),
|
|
380
|
+
},
|
|
381
|
+
rollback: {
|
|
382
|
+
findings: rollback.data.findings,
|
|
383
|
+
findingsTotal: rollback.data.findingsTotal,
|
|
384
|
+
examined: rollback.data.examined,
|
|
385
|
+
withheld: rollback.data.withheld,
|
|
386
|
+
ran: rollback.data.ran,
|
|
387
|
+
blockers: rollback.data.blockers,
|
|
388
|
+
},
|
|
389
|
+
attributeExistence: {
|
|
390
|
+
findings: attributeExistence.data.findings,
|
|
391
|
+
findingsTotal: attributeExistence.data.findingsTotal,
|
|
392
|
+
examined: attributeExistence.data.examined,
|
|
393
|
+
ran: attributeExistence.data.ran,
|
|
394
|
+
},
|
|
395
|
+
migrationIntegrity: {
|
|
396
|
+
findings: migrationIntegrity.data.findings,
|
|
397
|
+
findingsTotal: migrationIntegrity.data.findingsTotal,
|
|
398
|
+
examined: migrationIntegrity.data.examined,
|
|
399
|
+
migrationsDirectory: migrationIntegrity.data.migrationsDirectory,
|
|
400
|
+
ran: migrationIntegrity.data.ran,
|
|
401
|
+
withheld: migrationIntegrity.data.withheld,
|
|
402
|
+
},
|
|
403
|
+
ormRegistration: {
|
|
404
|
+
findings: ormRegistration.data.findings,
|
|
405
|
+
findingsTotal: ormRegistration.data.findingsTotal,
|
|
406
|
+
examined: ormRegistration.data.examined,
|
|
407
|
+
ran: ormRegistration.data.ran,
|
|
408
|
+
withheld: ormRegistration.data.withheld,
|
|
409
|
+
},
|
|
410
|
+
observedRoutes: {
|
|
411
|
+
findings: observedRoutes.findings,
|
|
412
|
+
findingsTotal: observedRoutes.findings.length,
|
|
413
|
+
examined: observedRoutes.examined,
|
|
414
|
+
ran: observedRoutes.ran,
|
|
415
|
+
},
|
|
416
|
+
};
|
|
417
|
+
return {
|
|
418
|
+
result: {
|
|
419
|
+
...checked,
|
|
420
|
+
data: validateData,
|
|
421
|
+
// Every check's disclosures reach the reader — dropping one half silently
|
|
422
|
+
// is the degradation rule 7 exists to prevent.
|
|
423
|
+
notes: [
|
|
424
|
+
...scopeNotes,
|
|
425
|
+
...(observedRoutes.note === null ? [] : [observedRoutes.note]),
|
|
426
|
+
...checked.notes,
|
|
427
|
+
...rollback.notes,
|
|
428
|
+
...attributeExistence.notes,
|
|
429
|
+
...migrationIntegrity.notes,
|
|
430
|
+
...ormRegistration.notes,
|
|
431
|
+
...configGraph.notes,
|
|
432
|
+
],
|
|
433
|
+
truncated,
|
|
434
|
+
stamp: {
|
|
435
|
+
...checked.stamp,
|
|
436
|
+
resolutionFloor: Math.min(checked.stamp.resolutionFloor, rollback.stamp.resolutionFloor, attributeExistence.stamp.resolutionFloor, migrationIntegrity.stamp.resolutionFloor, ormRegistration.stamp.resolutionFloor, configGraph.stamp.resolutionFloor),
|
|
437
|
+
},
|
|
438
|
+
},
|
|
439
|
+
// §11A.5's canonical name-level fact (exists or not) — the one claim R2 supports
|
|
440
|
+
// at class A. Value shape is never asserted here.
|
|
441
|
+
nameLevel: true,
|
|
442
|
+
fitToBudget: (budgetBytes) => fitValidate(validateData, budgetBytes),
|
|
443
|
+
...(truncatedDetail === undefined ? {} : { truncatedDetail }),
|
|
444
|
+
...(nothingToCheck
|
|
445
|
+
? { state: "refused" }
|
|
446
|
+
: falseClean
|
|
447
|
+
? { state: "empty" }
|
|
448
|
+
: {}),
|
|
449
|
+
headline: nothingToCheck
|
|
450
|
+
? "No configuration files, environment reads, migrations or attribute reads were found, so " +
|
|
451
|
+
"there was nothing to check."
|
|
452
|
+
: falseClean
|
|
453
|
+
? `0 of the ${(files ?? []).length} named file(s) matched anything on the read side. Not ` +
|
|
454
|
+
"checked, not clean."
|
|
455
|
+
: `${verdict}. ${report.surfaces.length} configuration file(s) declare ` +
|
|
456
|
+
`${countDeclared(report.surfaces)} variable(s); ` +
|
|
457
|
+
`${report.reads.required} variable(s) are read through an accessor that fails when unset; ` +
|
|
458
|
+
`${rollback.data.examined.operations} destructive migration operation(s) examined; ` +
|
|
459
|
+
`${attributeExistence.data.examined.readEdgesExamined} attribute read(s) checked against ` +
|
|
460
|
+
`a declared type; ${migrationIntegrity.data.examined.modulesWithRevision} migration(s) ` +
|
|
461
|
+
"checked for location and revision-chain integrity; " +
|
|
462
|
+
`${ormRegistration.data.examined.candidates} ORM model(s) inheriting a declarative base ` +
|
|
463
|
+
"checked for package-import reachability; " +
|
|
464
|
+
`${observedRoutes.examined} observed HTTP response(s) checked against declared routes.`,
|
|
465
|
+
};
|
|
466
|
+
}
|
|
467
|
+
function countDeclared(surfaces) {
|
|
468
|
+
return surfaces.reduce((total, s) => total + s.declared, 0);
|
|
469
|
+
}
|
|
470
|
+
export const validateTool = {
|
|
471
|
+
name: "validate",
|
|
472
|
+
class: "read",
|
|
473
|
+
tier: "conclusion",
|
|
474
|
+
// 1.1.0 (C2, UAT phase 4): without "changedLines", NEW_READ_UNDECLARED for a
|
|
475
|
+
// pre-existing read in a "files"-scoped file is now a `lead`, worded without
|
|
476
|
+
// an authorship claim, where it used to be a `defect` calling it "a new read
|
|
477
|
+
// this change introduces" — a claim `files` alone never supported. A caller
|
|
478
|
+
// that passes "changedLines" gets the stronger `defect` back, now genuinely
|
|
479
|
+
// verified against an added line rather than assumed from file scope.
|
|
480
|
+
version: "1.1.0",
|
|
481
|
+
title: "Environment and configuration checks",
|
|
482
|
+
description: "Five checks: missing env vars, an undocumented var, an unresolved attribute read, an " +
|
|
483
|
+
"out-of-order migration, an unregistered ORM model. files/changedLines sharpen a finding " +
|
|
484
|
+
"into a verified defect. States a verdict.",
|
|
485
|
+
inputSchema: SCHEMA,
|
|
486
|
+
run,
|
|
487
|
+
};
|
|
488
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/tools/validate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-verb argument validation for a merged tool.
|
|
3
|
+
*
|
|
4
|
+
* ## Why a merged tool needs this at all
|
|
5
|
+
*
|
|
6
|
+
* The dispatch loop refuses any argument no schema declares
|
|
7
|
+
* (`server.ts`'s `unknownArgumentKeys`, built for UAT phase 5's F12 after
|
|
8
|
+
* `browser_start_session({ profile })` silently read `environment` and issued
|
|
9
|
+
* the wrong consent sentence). That check reads one flat `inputSchema`.
|
|
10
|
+
*
|
|
11
|
+
* A merged tool has one schema for many verbs, so its schema must declare the
|
|
12
|
+
* *union* of every verb's properties. `text` is then a declared property of the
|
|
13
|
+
* `browser` tool as a whole, and `browser({ verb: "snapshot", text: "hi" })`
|
|
14
|
+
* sails through the dispatch gate — the same silent-acceptance defect, one
|
|
15
|
+
* level further down, and invisible to the test that caught it the first time.
|
|
16
|
+
*
|
|
17
|
+
* So the strength the flat schema loses is re-established here, per verb. This
|
|
18
|
+
* is the price of merging, paid explicitly rather than absorbed.
|
|
19
|
+
*
|
|
20
|
+
* ## Why it names the other verb
|
|
21
|
+
*
|
|
22
|
+
* "unknown argument" is true but useless when the argument is real and the verb
|
|
23
|
+
* is wrong — the caller who sent `text` to `snapshot` did not misspell
|
|
24
|
+
* anything, they picked the wrong verb. Saying *`"text"` belongs to `type`*
|
|
25
|
+
* turns a refusal the caller must debug into one they can act on, which is the
|
|
26
|
+
* same reason `ToolInputError` exists separately from a thrown `Error`.
|
|
27
|
+
*/
|
|
28
|
+
export interface VerbSpec<V extends string = string> {
|
|
29
|
+
readonly verb: V;
|
|
30
|
+
/** Properties this verb accepts, beyond the shared ones. */
|
|
31
|
+
readonly accepts: readonly string[];
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Resolve and validate the verb of a merged tool call.
|
|
35
|
+
*
|
|
36
|
+
* Refuses, rather than defaulting or ignoring, on: a missing verb, an unknown
|
|
37
|
+
* verb, and any property that belongs to a different verb. Returns the verb so
|
|
38
|
+
* the caller can switch on a value already known to be valid.
|
|
39
|
+
*
|
|
40
|
+
* `shared` are properties every verb accepts — a session id, a budget. A
|
|
41
|
+
* property in neither `shared` nor any verb's `accepts` is not this function's
|
|
42
|
+
* to judge: the dispatch gate already refused it against the declared schema,
|
|
43
|
+
* and re-refusing it here would put the tool's property list in two places.
|
|
44
|
+
*/
|
|
45
|
+
export declare function selectVerb<V extends string>(args: Record<string, unknown>, key: string, specs: readonly VerbSpec<V>[], shared?: readonly string[]): V;
|
|
46
|
+
//# sourceMappingURL=verb.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verb.d.ts","sourceRoot":"","sources":["../../src/tools/verb.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAIH,MAAM,WAAW,QAAQ,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM;IACjD,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACjB,4DAA4D;IAC5D,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,MAAM,EACzC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,SAAS,QAAQ,CAAC,CAAC,CAAC,EAAE,EAC7B,MAAM,GAAE,SAAS,MAAM,EAAO,GAC7B,CAAC,CAwCH"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-verb argument validation for a merged tool.
|
|
3
|
+
*
|
|
4
|
+
* ## Why a merged tool needs this at all
|
|
5
|
+
*
|
|
6
|
+
* The dispatch loop refuses any argument no schema declares
|
|
7
|
+
* (`server.ts`'s `unknownArgumentKeys`, built for UAT phase 5's F12 after
|
|
8
|
+
* `browser_start_session({ profile })` silently read `environment` and issued
|
|
9
|
+
* the wrong consent sentence). That check reads one flat `inputSchema`.
|
|
10
|
+
*
|
|
11
|
+
* A merged tool has one schema for many verbs, so its schema must declare the
|
|
12
|
+
* *union* of every verb's properties. `text` is then a declared property of the
|
|
13
|
+
* `browser` tool as a whole, and `browser({ verb: "snapshot", text: "hi" })`
|
|
14
|
+
* sails through the dispatch gate — the same silent-acceptance defect, one
|
|
15
|
+
* level further down, and invisible to the test that caught it the first time.
|
|
16
|
+
*
|
|
17
|
+
* So the strength the flat schema loses is re-established here, per verb. This
|
|
18
|
+
* is the price of merging, paid explicitly rather than absorbed.
|
|
19
|
+
*
|
|
20
|
+
* ## Why it names the other verb
|
|
21
|
+
*
|
|
22
|
+
* "unknown argument" is true but useless when the argument is real and the verb
|
|
23
|
+
* is wrong — the caller who sent `text` to `snapshot` did not misspell
|
|
24
|
+
* anything, they picked the wrong verb. Saying *`"text"` belongs to `type`*
|
|
25
|
+
* turns a refusal the caller must debug into one they can act on, which is the
|
|
26
|
+
* same reason `ToolInputError` exists separately from a thrown `Error`.
|
|
27
|
+
*/
|
|
28
|
+
import { ToolInputError } from "./kit.js";
|
|
29
|
+
/**
|
|
30
|
+
* Resolve and validate the verb of a merged tool call.
|
|
31
|
+
*
|
|
32
|
+
* Refuses, rather than defaulting or ignoring, on: a missing verb, an unknown
|
|
33
|
+
* verb, and any property that belongs to a different verb. Returns the verb so
|
|
34
|
+
* the caller can switch on a value already known to be valid.
|
|
35
|
+
*
|
|
36
|
+
* `shared` are properties every verb accepts — a session id, a budget. A
|
|
37
|
+
* property in neither `shared` nor any verb's `accepts` is not this function's
|
|
38
|
+
* to judge: the dispatch gate already refused it against the declared schema,
|
|
39
|
+
* and re-refusing it here would put the tool's property list in two places.
|
|
40
|
+
*/
|
|
41
|
+
export function selectVerb(args, key, specs, shared = []) {
|
|
42
|
+
const raw = args[key];
|
|
43
|
+
if (raw === undefined || raw === null || raw === "") {
|
|
44
|
+
throw new ToolInputError(`"${key}" is required — one of: ${specs.map((s) => s.verb).join(", ")}`);
|
|
45
|
+
}
|
|
46
|
+
if (typeof raw !== "string")
|
|
47
|
+
throw new ToolInputError(`"${key}" must be a string`);
|
|
48
|
+
const spec = specs.find((s) => s.verb === raw);
|
|
49
|
+
if (spec === undefined) {
|
|
50
|
+
throw new ToolInputError(`"${key}" must be one of: ${specs.map((s) => s.verb).join(", ")}`);
|
|
51
|
+
}
|
|
52
|
+
// Where each property that is not this verb's does belong. Built per call
|
|
53
|
+
// rather than hoisted: the specs are a handful of entries, and a module-level
|
|
54
|
+
// cache keyed on a caller-supplied array is a lifetime question this does not
|
|
55
|
+
// need to have.
|
|
56
|
+
const ownerOf = new Map();
|
|
57
|
+
for (const other of specs) {
|
|
58
|
+
if (other.verb === spec.verb)
|
|
59
|
+
continue;
|
|
60
|
+
for (const property of other.accepts) {
|
|
61
|
+
if (spec.accepts.includes(property))
|
|
62
|
+
continue;
|
|
63
|
+
// First owner wins only for the message; the refusal is the same either
|
|
64
|
+
// way, and listing every owner of a property shared by two other verbs
|
|
65
|
+
// would bury the one fact the caller needs.
|
|
66
|
+
if (!ownerOf.has(property))
|
|
67
|
+
ownerOf.set(property, other.verb);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
const strays = Object.keys(args).filter((property) => property !== key && !shared.includes(property) && ownerOf.has(property));
|
|
71
|
+
if (strays.length > 0) {
|
|
72
|
+
const detail = strays.map((property) => `"${property}" belongs to ${ownerOf.get(property)}`).join("; ");
|
|
73
|
+
throw new ToolInputError(`${spec.verb} does not accept ${strays.map((p) => `"${p}"`).join(", ")} — ${detail}. ` +
|
|
74
|
+
`${spec.verb} accepts: ${[...shared, ...spec.accepts].join(", ") || "no arguments beyond the verb"}.`);
|
|
75
|
+
}
|
|
76
|
+
return spec.verb;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=verb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verb.js","sourceRoot":"","sources":["../../src/tools/verb.ts"],"names":[],"mappings":"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"}
|