vibecheck-ai 2.0.1 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/.generated +25 -0
- package/bin/_deprecations.js +463 -0
- package/bin/_router.js +46 -0
- package/bin/cli-hygiene.js +241 -0
- package/bin/dev/run-v2-torture.js +30 -0
- package/bin/registry.js +656 -0
- package/bin/runners/CLI_REFACTOR_SUMMARY.md +229 -0
- package/bin/runners/ENHANCEMENT_GUIDE.md +121 -0
- package/bin/runners/REPORT_AUDIT.md +64 -0
- package/bin/runners/cli-utils.js +1070 -0
- package/bin/runners/context/ai-task-decomposer.js +337 -0
- package/bin/runners/context/analyzer.js +513 -0
- package/bin/runners/context/api-contracts.js +427 -0
- package/bin/runners/context/context-diff.js +342 -0
- package/bin/runners/context/context-pruner.js +291 -0
- package/bin/runners/context/dependency-graph.js +414 -0
- package/bin/runners/context/generators/claude.js +107 -0
- package/bin/runners/context/generators/codex.js +108 -0
- package/bin/runners/context/generators/copilot.js +119 -0
- package/bin/runners/context/generators/cursor-enhanced.js +2525 -0
- package/bin/runners/context/generators/cursor.js +514 -0
- package/bin/runners/context/generators/mcp.js +169 -0
- package/bin/runners/context/generators/windsurf.js +180 -0
- package/bin/runners/context/git-context.js +304 -0
- package/bin/runners/context/index.js +1110 -0
- package/bin/runners/context/insights.js +173 -0
- package/bin/runners/context/mcp-server/generate-rules.js +337 -0
- package/bin/runners/context/mcp-server/index.js +1176 -0
- package/bin/runners/context/mcp-server/package.json +24 -0
- package/bin/runners/context/memory.js +200 -0
- package/bin/runners/context/monorepo.js +215 -0
- package/bin/runners/context/multi-repo-federation.js +404 -0
- package/bin/runners/context/patterns.js +253 -0
- package/bin/runners/context/proof-context.js +1264 -0
- package/bin/runners/context/security-scanner.js +541 -0
- package/bin/runners/context/semantic-search.js +350 -0
- package/bin/runners/context/shared.js +264 -0
- package/bin/runners/context/team-conventions.js +336 -0
- package/bin/runners/lib/__tests__/entitlements-v2.test.js +295 -0
- package/bin/runners/lib/agent-firewall/ai/false-positive-analyzer.js +474 -0
- package/bin/runners/lib/agent-firewall/change-packet/builder.js +488 -0
- package/bin/runners/lib/agent-firewall/change-packet/schema.json +228 -0
- package/bin/runners/lib/agent-firewall/change-packet/store.js +200 -0
- package/bin/runners/lib/agent-firewall/claims/claim-types.js +21 -0
- package/bin/runners/lib/agent-firewall/claims/extractor.js +303 -0
- package/bin/runners/lib/agent-firewall/claims/patterns.js +24 -0
- package/bin/runners/lib/agent-firewall/critic/index.js +151 -0
- package/bin/runners/lib/agent-firewall/critic/judge.js +432 -0
- package/bin/runners/lib/agent-firewall/critic/prompts.js +305 -0
- package/bin/runners/lib/agent-firewall/enforcement/gateway.js +1059 -0
- package/bin/runners/lib/agent-firewall/enforcement/index.js +98 -0
- package/bin/runners/lib/agent-firewall/enforcement/mode.js +318 -0
- package/bin/runners/lib/agent-firewall/enforcement/orchestrator.js +484 -0
- package/bin/runners/lib/agent-firewall/enforcement/proof-artifact.js +418 -0
- package/bin/runners/lib/agent-firewall/enforcement/schemas/change-event.schema.json +173 -0
- package/bin/runners/lib/agent-firewall/enforcement/schemas/intent.schema.json +181 -0
- package/bin/runners/lib/agent-firewall/enforcement/schemas/verdict.schema.json +222 -0
- package/bin/runners/lib/agent-firewall/enforcement/verdict-v2.js +333 -0
- package/bin/runners/lib/agent-firewall/evidence/auth-evidence.js +88 -0
- package/bin/runners/lib/agent-firewall/evidence/contract-evidence.js +75 -0
- package/bin/runners/lib/agent-firewall/evidence/env-evidence.js +127 -0
- package/bin/runners/lib/agent-firewall/evidence/resolver.js +102 -0
- package/bin/runners/lib/agent-firewall/evidence/route-evidence.js +213 -0
- package/bin/runners/lib/agent-firewall/evidence/side-effect-evidence.js +145 -0
- package/bin/runners/lib/agent-firewall/fs-hook/daemon.js +19 -0
- package/bin/runners/lib/agent-firewall/fs-hook/installer.js +87 -0
- package/bin/runners/lib/agent-firewall/fs-hook/watcher.js +184 -0
- package/bin/runners/lib/agent-firewall/git-hook/pre-commit.js +163 -0
- package/bin/runners/lib/agent-firewall/ide-extension/cursor.js +107 -0
- package/bin/runners/lib/agent-firewall/ide-extension/vscode.js +68 -0
- package/bin/runners/lib/agent-firewall/ide-extension/windsurf.js +66 -0
- package/bin/runners/lib/agent-firewall/index.js +200 -0
- package/bin/runners/lib/agent-firewall/integration/index.js +20 -0
- package/bin/runners/lib/agent-firewall/integration/ship-gate.js +437 -0
- package/bin/runners/lib/agent-firewall/intent/alignment-engine.js +634 -0
- package/bin/runners/lib/agent-firewall/intent/auto-detect.js +426 -0
- package/bin/runners/lib/agent-firewall/intent/index.js +102 -0
- package/bin/runners/lib/agent-firewall/intent/schema.js +352 -0
- package/bin/runners/lib/agent-firewall/intent/store.js +283 -0
- package/bin/runners/lib/agent-firewall/interception/fs-interceptor.js +502 -0
- package/bin/runners/lib/agent-firewall/interception/index.js +23 -0
- package/bin/runners/lib/agent-firewall/interceptor/base.js +308 -0
- package/bin/runners/lib/agent-firewall/interceptor/cursor.js +35 -0
- package/bin/runners/lib/agent-firewall/interceptor/vscode.js +35 -0
- package/bin/runners/lib/agent-firewall/interceptor/windsurf.js +34 -0
- package/bin/runners/lib/agent-firewall/lawbook/distributor.js +465 -0
- package/bin/runners/lib/agent-firewall/lawbook/evaluator.js +604 -0
- package/bin/runners/lib/agent-firewall/lawbook/index.js +304 -0
- package/bin/runners/lib/agent-firewall/lawbook/registry.js +514 -0
- package/bin/runners/lib/agent-firewall/lawbook/schema.js +420 -0
- package/bin/runners/lib/agent-firewall/logger.js +141 -0
- package/bin/runners/lib/agent-firewall/policy/default-policy.json +90 -0
- package/bin/runners/lib/agent-firewall/policy/engine.js +103 -0
- package/bin/runners/lib/agent-firewall/policy/loader.js +451 -0
- package/bin/runners/lib/agent-firewall/policy/rules/auth-drift.js +50 -0
- package/bin/runners/lib/agent-firewall/policy/rules/contract-drift.js +50 -0
- package/bin/runners/lib/agent-firewall/policy/rules/fake-success.js +79 -0
- package/bin/runners/lib/agent-firewall/policy/rules/ghost-env.js +227 -0
- package/bin/runners/lib/agent-firewall/policy/rules/ghost-route.js +191 -0
- package/bin/runners/lib/agent-firewall/policy/rules/scope.js +93 -0
- package/bin/runners/lib/agent-firewall/policy/rules/unsafe-side-effect.js +57 -0
- package/bin/runners/lib/agent-firewall/policy/schema.json +183 -0
- package/bin/runners/lib/agent-firewall/policy/verdict.js +54 -0
- package/bin/runners/lib/agent-firewall/proposal/extractor.js +394 -0
- package/bin/runners/lib/agent-firewall/proposal/index.js +212 -0
- package/bin/runners/lib/agent-firewall/proposal/schema.js +251 -0
- package/bin/runners/lib/agent-firewall/proposal/validator.js +386 -0
- package/bin/runners/lib/agent-firewall/reality/index.js +332 -0
- package/bin/runners/lib/agent-firewall/reality/state.js +625 -0
- package/bin/runners/lib/agent-firewall/reality/watcher.js +322 -0
- package/bin/runners/lib/agent-firewall/risk/index.js +173 -0
- package/bin/runners/lib/agent-firewall/risk/scorer.js +328 -0
- package/bin/runners/lib/agent-firewall/risk/thresholds.js +322 -0
- package/bin/runners/lib/agent-firewall/risk/vectors.js +421 -0
- package/bin/runners/lib/agent-firewall/session/collector.js +451 -0
- package/bin/runners/lib/agent-firewall/session/index.js +26 -0
- package/bin/runners/lib/agent-firewall/simulator/diff-simulator.js +472 -0
- package/bin/runners/lib/agent-firewall/simulator/import-resolver.js +346 -0
- package/bin/runners/lib/agent-firewall/simulator/index.js +181 -0
- package/bin/runners/lib/agent-firewall/simulator/route-validator.js +380 -0
- package/bin/runners/lib/agent-firewall/time-machine/incident-correlator.js +661 -0
- package/bin/runners/lib/agent-firewall/time-machine/index.js +267 -0
- package/bin/runners/lib/agent-firewall/time-machine/replay-engine.js +436 -0
- package/bin/runners/lib/agent-firewall/time-machine/state-reconstructor.js +490 -0
- package/bin/runners/lib/agent-firewall/time-machine/timeline-builder.js +530 -0
- package/bin/runners/lib/agent-firewall/truthpack/index.js +67 -0
- package/bin/runners/lib/agent-firewall/truthpack/loader.js +137 -0
- package/bin/runners/lib/agent-firewall/unblock/planner.js +337 -0
- package/bin/runners/lib/agent-firewall/utils/ignore-checker.js +118 -0
- package/bin/runners/lib/ai-bridge.js +416 -0
- package/bin/runners/lib/analysis-core.js +309 -0
- package/bin/runners/lib/analyzers.js +2500 -0
- package/bin/runners/lib/api-client.js +269 -0
- package/bin/runners/lib/approve-output.js +235 -0
- package/bin/runners/lib/artifact-envelope.js +540 -0
- package/bin/runners/lib/assets/vibecheck-logo.png +0 -0
- package/bin/runners/lib/audit-bridge.js +391 -0
- package/bin/runners/lib/auth-shared.js +977 -0
- package/bin/runners/lib/auth-truth.js +193 -0
- package/bin/runners/lib/auth.js +215 -0
- package/bin/runners/lib/authority-badge.js +425 -0
- package/bin/runners/lib/backup.js +62 -0
- package/bin/runners/lib/billing.js +107 -0
- package/bin/runners/lib/checkpoint.js +941 -0
- package/bin/runners/lib/claims.js +118 -0
- package/bin/runners/lib/classify-output.js +204 -0
- package/bin/runners/lib/cleanup/engine.js +571 -0
- package/bin/runners/lib/cleanup/index.js +53 -0
- package/bin/runners/lib/cleanup/output.js +375 -0
- package/bin/runners/lib/cleanup/rules.js +1060 -0
- package/bin/runners/lib/cli-output.js +400 -0
- package/bin/runners/lib/cli-ui.js +540 -0
- package/bin/runners/lib/compliance-bridge-new.js +0 -0
- package/bin/runners/lib/compliance-bridge.js +165 -0
- package/bin/runners/lib/contracts/auth-contract.js +202 -0
- package/bin/runners/lib/contracts/env-contract.js +181 -0
- package/bin/runners/lib/contracts/external-contract.js +206 -0
- package/bin/runners/lib/contracts/guard.js +168 -0
- package/bin/runners/lib/contracts/index.js +89 -0
- package/bin/runners/lib/contracts/plan-validator.js +311 -0
- package/bin/runners/lib/contracts/route-contract.js +199 -0
- package/bin/runners/lib/contracts.js +804 -0
- package/bin/runners/lib/default-config.js +127 -0
- package/bin/runners/lib/detect.js +89 -0
- package/bin/runners/lib/detectors-v2.js +622 -0
- package/bin/runners/lib/doctor/autofix.js +254 -0
- package/bin/runners/lib/doctor/diagnosis-receipt.js +454 -0
- package/bin/runners/lib/doctor/failure-signatures.js +526 -0
- package/bin/runners/lib/doctor/fix-script.js +336 -0
- package/bin/runners/lib/doctor/index.js +37 -0
- package/bin/runners/lib/doctor/modules/build-tools.js +453 -0
- package/bin/runners/lib/doctor/modules/dependencies.js +325 -0
- package/bin/runners/lib/doctor/modules/index.js +105 -0
- package/bin/runners/lib/doctor/modules/network.js +250 -0
- package/bin/runners/lib/doctor/modules/os-quirks.js +706 -0
- package/bin/runners/lib/doctor/modules/project.js +312 -0
- package/bin/runners/lib/doctor/modules/repo-integrity.js +485 -0
- package/bin/runners/lib/doctor/modules/runtime.js +224 -0
- package/bin/runners/lib/doctor/modules/security.js +350 -0
- package/bin/runners/lib/doctor/modules/system.js +213 -0
- package/bin/runners/lib/doctor/modules/vibecheck.js +394 -0
- package/bin/runners/lib/doctor/reporter.js +262 -0
- package/bin/runners/lib/doctor/safe-repair.js +384 -0
- package/bin/runners/lib/doctor/service.js +262 -0
- package/bin/runners/lib/doctor/types.js +113 -0
- package/bin/runners/lib/doctor/ui.js +263 -0
- package/bin/runners/lib/doctor-enhanced.js +233 -0
- package/bin/runners/lib/doctor-output.js +226 -0
- package/bin/runners/lib/doctor-v2.js +608 -0
- package/bin/runners/lib/drift.js +425 -0
- package/bin/runners/lib/enforcement.js +72 -0
- package/bin/runners/lib/engine/ast-cache.js +210 -0
- package/bin/runners/lib/engine/auth-extractor.js +211 -0
- package/bin/runners/lib/engine/billing-extractor.js +112 -0
- package/bin/runners/lib/engine/enforcement-extractor.js +100 -0
- package/bin/runners/lib/engine/env-extractor.js +207 -0
- package/bin/runners/lib/engine/express-extractor.js +208 -0
- package/bin/runners/lib/engine/extractors.js +849 -0
- package/bin/runners/lib/engine/index.js +207 -0
- package/bin/runners/lib/engine/repo-index.js +514 -0
- package/bin/runners/lib/engine/types.js +124 -0
- package/bin/runners/lib/engines/accessibility-engine.js +190 -0
- package/bin/runners/lib/engines/api-consistency-engine.js +162 -0
- package/bin/runners/lib/engines/ast-cache.js +99 -0
- package/bin/runners/lib/engines/attack-detector.js +1192 -0
- package/bin/runners/lib/engines/code-quality-engine.js +255 -0
- package/bin/runners/lib/engines/console-logs-engine.js +115 -0
- package/bin/runners/lib/engines/cross-file-analysis-engine.js +268 -0
- package/bin/runners/lib/engines/dead-code-engine.js +198 -0
- package/bin/runners/lib/engines/deprecated-api-engine.js +226 -0
- package/bin/runners/lib/engines/empty-catch-engine.js +150 -0
- package/bin/runners/lib/engines/file-filter.js +131 -0
- package/bin/runners/lib/engines/hardcoded-secrets-engine.js +251 -0
- package/bin/runners/lib/engines/mock-data-engine.js +272 -0
- package/bin/runners/lib/engines/parallel-processor.js +71 -0
- package/bin/runners/lib/engines/performance-issues-engine.js +265 -0
- package/bin/runners/lib/engines/security-vulnerabilities-engine.js +243 -0
- package/bin/runners/lib/engines/todo-fixme-engine.js +115 -0
- package/bin/runners/lib/engines/type-aware-engine.js +152 -0
- package/bin/runners/lib/engines/unsafe-regex-engine.js +225 -0
- package/bin/runners/lib/engines/vibecheck-engines/README.md +53 -0
- package/bin/runners/lib/engines/vibecheck-engines/index.js +15 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/ast-cache.js +164 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/code-quality-engine.js +291 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/console-logs-engine.js +83 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/dead-code-engine.js +198 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/deprecated-api-engine.js +275 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/empty-catch-engine.js +167 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/file-filter.js +217 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/hardcoded-secrets-engine.js +139 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/mock-data-engine.js +140 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/parallel-processor.js +164 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/performance-issues-engine.js +234 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/type-aware-engine.js +217 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/unsafe-regex-engine.js +78 -0
- package/bin/runners/lib/engines/vibecheck-engines/package.json +13 -0
- package/bin/runners/lib/enterprise-detect.js +603 -0
- package/bin/runners/lib/enterprise-init.js +942 -0
- package/bin/runners/lib/entitlements-v2.js +265 -0
- package/bin/runners/lib/entitlements.generated.js +0 -0
- package/bin/runners/lib/entitlements.js +340 -0
- package/bin/runners/lib/env-resolver.js +417 -0
- package/bin/runners/lib/env-template.js +66 -0
- package/bin/runners/lib/env.js +189 -0
- package/bin/runners/lib/error-handler.js +368 -0
- package/bin/runners/lib/error-messages.js +289 -0
- package/bin/runners/lib/evidence-pack.js +684 -0
- package/bin/runners/lib/exit-codes.js +275 -0
- package/bin/runners/lib/extractors/client-calls.js +990 -0
- package/bin/runners/lib/extractors/fastify-route-dump.js +573 -0
- package/bin/runners/lib/extractors/fastify-routes.js +426 -0
- package/bin/runners/lib/extractors/index.js +363 -0
- package/bin/runners/lib/extractors/next-routes.js +524 -0
- package/bin/runners/lib/extractors/proof-graph.js +431 -0
- package/bin/runners/lib/extractors/route-matcher.js +451 -0
- package/bin/runners/lib/extractors/truthpack-v2.js +377 -0
- package/bin/runners/lib/extractors/ui-bindings.js +547 -0
- package/bin/runners/lib/finding-id.js +69 -0
- package/bin/runners/lib/finding-sorter.js +89 -0
- package/bin/runners/lib/findings-schema.js +281 -0
- package/bin/runners/lib/fingerprint.js +377 -0
- package/bin/runners/lib/firewall-prompt.js +50 -0
- package/bin/runners/lib/fix-output.js +228 -0
- package/bin/runners/lib/global-flags.js +250 -0
- package/bin/runners/lib/graph/graph-builder.js +265 -0
- package/bin/runners/lib/graph/html-renderer.js +413 -0
- package/bin/runners/lib/graph/index.js +32 -0
- package/bin/runners/lib/graph/runtime-collector.js +215 -0
- package/bin/runners/lib/graph/static-extractor.js +518 -0
- package/bin/runners/lib/help-formatter.js +413 -0
- package/bin/runners/lib/html-proof-report.js +913 -0
- package/bin/runners/lib/html-report.js +650 -0
- package/bin/runners/lib/init-wizard.js +601 -0
- package/bin/runners/lib/interactive-menu.js +1496 -0
- package/bin/runners/lib/json-output.js +76 -0
- package/bin/runners/lib/llm.js +75 -0
- package/bin/runners/lib/logger.js +38 -0
- package/bin/runners/lib/meter.js +61 -0
- package/bin/runners/lib/missions/briefing.js +427 -0
- package/bin/runners/lib/missions/checkpoint.js +753 -0
- package/bin/runners/lib/missions/evidence.js +126 -0
- package/bin/runners/lib/missions/hardening.js +851 -0
- package/bin/runners/lib/missions/plan.js +648 -0
- package/bin/runners/lib/missions/safety-gates.js +645 -0
- package/bin/runners/lib/missions/schema.js +478 -0
- package/bin/runners/lib/missions/templates.js +317 -0
- package/bin/runners/lib/next-action.js +560 -0
- package/bin/runners/lib/packs/bundle.js +675 -0
- package/bin/runners/lib/packs/evidence-pack.js +671 -0
- package/bin/runners/lib/packs/pack-factory.js +837 -0
- package/bin/runners/lib/packs/permissions-pack.js +686 -0
- package/bin/runners/lib/packs/proof-graph-pack.js +779 -0
- package/bin/runners/lib/patch.js +40 -0
- package/bin/runners/lib/permissions/auth-model.js +213 -0
- package/bin/runners/lib/permissions/idor-prover.js +205 -0
- package/bin/runners/lib/permissions/index.js +45 -0
- package/bin/runners/lib/permissions/matrix-builder.js +198 -0
- package/bin/runners/lib/pkgjson.js +28 -0
- package/bin/runners/lib/policy.js +295 -0
- package/bin/runners/lib/polish/accessibility.js +62 -0
- package/bin/runners/lib/polish/analyzer.js +93 -0
- package/bin/runners/lib/polish/backend.js +87 -0
- package/bin/runners/lib/polish/configuration.js +83 -0
- package/bin/runners/lib/polish/documentation.js +83 -0
- package/bin/runners/lib/polish/frontend.js +817 -0
- package/bin/runners/lib/polish/index.js +27 -0
- package/bin/runners/lib/polish/infrastructure.js +80 -0
- package/bin/runners/lib/polish/internationalization.js +85 -0
- package/bin/runners/lib/polish/libraries.js +180 -0
- package/bin/runners/lib/polish/observability.js +75 -0
- package/bin/runners/lib/polish/performance.js +64 -0
- package/bin/runners/lib/polish/privacy.js +110 -0
- package/bin/runners/lib/polish/resilience.js +92 -0
- package/bin/runners/lib/polish/security.js +78 -0
- package/bin/runners/lib/polish/seo.js +71 -0
- package/bin/runners/lib/polish/styles.js +62 -0
- package/bin/runners/lib/polish/utils.js +104 -0
- package/bin/runners/lib/preflight.js +142 -0
- package/bin/runners/lib/prerequisites.js +149 -0
- package/bin/runners/lib/prove-output.js +220 -0
- package/bin/runners/lib/reality/correlation-detectors.js +359 -0
- package/bin/runners/lib/reality/index.js +318 -0
- package/bin/runners/lib/reality/request-hashing.js +416 -0
- package/bin/runners/lib/reality/request-mapper.js +453 -0
- package/bin/runners/lib/reality/safety-rails.js +463 -0
- package/bin/runners/lib/reality/semantic-snapshot.js +408 -0
- package/bin/runners/lib/reality/toast-detector.js +393 -0
- package/bin/runners/lib/reality-findings.js +84 -0
- package/bin/runners/lib/reality-output.js +231 -0
- package/bin/runners/lib/receipts.js +179 -0
- package/bin/runners/lib/redact.js +29 -0
- package/bin/runners/lib/replay/capsule-manager.js +154 -0
- package/bin/runners/lib/replay/index.js +263 -0
- package/bin/runners/lib/replay/player.js +348 -0
- package/bin/runners/lib/replay/recorder.js +331 -0
- package/bin/runners/lib/report-engine.js +626 -0
- package/bin/runners/lib/report-html.js +1233 -0
- package/bin/runners/lib/report-output.js +366 -0
- package/bin/runners/lib/report-templates.js +967 -0
- package/bin/runners/lib/report.js +135 -0
- package/bin/runners/lib/route-detection.js +1209 -0
- package/bin/runners/lib/route-truth.js +1322 -0
- package/bin/runners/lib/safelist/index.js +96 -0
- package/bin/runners/lib/safelist/integration.js +334 -0
- package/bin/runners/lib/safelist/matcher.js +696 -0
- package/bin/runners/lib/safelist/schema.js +948 -0
- package/bin/runners/lib/safelist/store.js +438 -0
- package/bin/runners/lib/sandbox/index.js +59 -0
- package/bin/runners/lib/sandbox/proof-chain.js +399 -0
- package/bin/runners/lib/sandbox/sandbox-runner.js +205 -0
- package/bin/runners/lib/sandbox/worktree.js +174 -0
- package/bin/runners/lib/scan-cache.js +330 -0
- package/bin/runners/lib/scan-output-schema.js +344 -0
- package/bin/runners/lib/scan-output.js +631 -0
- package/bin/runners/lib/scan-runner.js +135 -0
- package/bin/runners/lib/schema-validator.js +350 -0
- package/bin/runners/lib/schemas/ajv-validator.js +464 -0
- package/bin/runners/lib/schemas/contracts.schema.json +160 -0
- package/bin/runners/lib/schemas/error-envelope.schema.json +105 -0
- package/bin/runners/lib/schemas/finding-v3.schema.json +151 -0
- package/bin/runners/lib/schemas/finding.schema.json +100 -0
- package/bin/runners/lib/schemas/mission-pack.schema.json +206 -0
- package/bin/runners/lib/schemas/proof-graph.schema.json +176 -0
- package/bin/runners/lib/schemas/reality-report.schema.json +162 -0
- package/bin/runners/lib/schemas/report-artifact.schema.json +120 -0
- package/bin/runners/lib/schemas/run-request.schema.json +108 -0
- package/bin/runners/lib/schemas/share-pack.schema.json +180 -0
- package/bin/runners/lib/schemas/ship-manifest.schema.json +251 -0
- package/bin/runners/lib/schemas/ship-report.schema.json +117 -0
- package/bin/runners/lib/schemas/truthpack-v2.schema.json +303 -0
- package/bin/runners/lib/schemas/validator.js +465 -0
- package/bin/runners/lib/schemas/verdict.schema.json +140 -0
- package/bin/runners/lib/score-history.js +282 -0
- package/bin/runners/lib/security-bridge.js +249 -0
- package/bin/runners/lib/server-usage.js +513 -0
- package/bin/runners/lib/share-pack.js +239 -0
- package/bin/runners/lib/ship-gate.js +832 -0
- package/bin/runners/lib/ship-manifest.js +1153 -0
- package/bin/runners/lib/ship-output-enterprise.js +239 -0
- package/bin/runners/lib/ship-output.js +1128 -0
- package/bin/runners/lib/snippets.js +67 -0
- package/bin/runners/lib/status-output.js +340 -0
- package/bin/runners/lib/terminal-ui.js +356 -0
- package/bin/runners/lib/truth.js +1691 -0
- package/bin/runners/lib/ui.js +562 -0
- package/bin/runners/lib/unified-cli-output.js +947 -0
- package/bin/runners/lib/unified-output.js +197 -0
- package/bin/runners/lib/upsell.js +410 -0
- package/bin/runners/lib/usage.js +153 -0
- package/bin/runners/lib/validate-patch.js +156 -0
- package/bin/runners/lib/verdict-engine.js +628 -0
- package/bin/runners/lib/verification.js +345 -0
- package/bin/runners/lib/why-tree.js +650 -0
- package/bin/runners/reality/engine.js +917 -0
- package/bin/runners/reality/flows.js +122 -0
- package/bin/runners/reality/report.js +378 -0
- package/bin/runners/reality/session.js +193 -0
- package/bin/runners/runAIAgent.js +229 -0
- package/bin/runners/runAgent.d.ts +5 -0
- package/bin/runners/runAgent.js +161 -0
- package/bin/runners/runAllowlist.js +418 -0
- package/bin/runners/runApprove.js +320 -0
- package/bin/runners/runAudit.js +692 -0
- package/bin/runners/runAuth.js +731 -0
- package/bin/runners/runCI.js +353 -0
- package/bin/runners/runCheckpoint.js +530 -0
- package/bin/runners/runClassify.js +928 -0
- package/bin/runners/runCleanup.js +343 -0
- package/bin/runners/runContext.d.ts +4 -0
- package/bin/runners/runContext.js +175 -0
- package/bin/runners/runDoctor.js +877 -0
- package/bin/runners/runEvidencePack.js +362 -0
- package/bin/runners/runFirewall.d.ts +5 -0
- package/bin/runners/runFirewall.js +134 -0
- package/bin/runners/runFirewallHook.d.ts +5 -0
- package/bin/runners/runFirewallHook.js +56 -0
- package/bin/runners/runFix.js +1355 -0
- package/bin/runners/runForge.js +451 -0
- package/bin/runners/runGuard.js +262 -0
- package/bin/runners/runInit.js +1927 -0
- package/bin/runners/runIntent.js +906 -0
- package/bin/runners/runKickoff.js +878 -0
- package/bin/runners/runLabs.js +424 -0
- package/bin/runners/runLaunch.js +2000 -0
- package/bin/runners/runLink.js +785 -0
- package/bin/runners/runMcp.js +1875 -0
- package/bin/runners/runPacks.js +2089 -0
- package/bin/runners/runPolish.d.ts +4 -0
- package/bin/runners/runPolish.js +390 -0
- package/bin/runners/runPromptFirewall.js +211 -0
- package/bin/runners/runProve.js +1411 -0
- package/bin/runners/runQuickstart.js +531 -0
- package/bin/runners/runReality.js +2260 -0
- package/bin/runners/runReport.js +726 -0
- package/bin/runners/runRuntime.js +110 -0
- package/bin/runners/runSafelist.js +1190 -0
- package/bin/runners/runScan.js +688 -0
- package/bin/runners/runShield.js +1282 -0
- package/bin/runners/runShip.js +1660 -0
- package/bin/runners/runTruth.d.ts +5 -0
- package/bin/runners/runTruth.js +101 -0
- package/bin/runners/runValidate.js +179 -0
- package/bin/runners/runWatch.js +478 -0
- package/bin/runners/utils.js +360 -0
- package/bin/scan.js +617 -0
- package/bin/vibecheck.js +1617 -0
- package/dist/guardrail/index.d.ts +2405 -0
- package/dist/guardrail/index.js +9747 -0
- package/dist/guardrail/index.js.map +1 -0
- package/dist/scanner/index.d.ts +282 -0
- package/dist/scanner/index.js +3395 -0
- package/dist/scanner/index.js.map +1 -0
- package/package.json +123 -104
- package/README.md +0 -491
- package/dist/index.js +0 -99711
- package/dist/index.js.map +0 -1
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Intent Schema v2 - Enforcement-Grade Intent Declaration
|
|
3
|
+
*
|
|
4
|
+
* ═══════════════════════════════════════════════════════════════════════════════
|
|
5
|
+
* AGENT FIREWALL™ - INTENT DECLARATION SYSTEM
|
|
6
|
+
* ═══════════════════════════════════════════════════════════════════════════════
|
|
7
|
+
*
|
|
8
|
+
* Intent is the foundation of the Agent Firewall enforcement model.
|
|
9
|
+
* All AI actions MUST be checked against declared intent.
|
|
10
|
+
*
|
|
11
|
+
* Properties:
|
|
12
|
+
* - Intent is explicit, human-written, short, and structured
|
|
13
|
+
* - Intent is captured BEFORE any AI code generation
|
|
14
|
+
* - Intent is IMMUTABLE during a session unless explicitly updated
|
|
15
|
+
* - If intent is missing → Agent Firewall defaults to BLOCK
|
|
16
|
+
*
|
|
17
|
+
* @module intent/schema
|
|
18
|
+
* @version 2.0.0
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
"use strict";
|
|
22
|
+
|
|
23
|
+
const crypto = require("crypto");
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Intent Declaration JSON Schema
|
|
27
|
+
*/
|
|
28
|
+
const INTENT_SCHEMA = {
|
|
29
|
+
$schema: "http://json-schema.org/draft-07/schema#",
|
|
30
|
+
$id: "https://vibecheckai.dev/schemas/intent/v2",
|
|
31
|
+
type: "object",
|
|
32
|
+
required: ["summary", "constraints", "created_at", "hash"],
|
|
33
|
+
properties: {
|
|
34
|
+
// Core required fields
|
|
35
|
+
summary: {
|
|
36
|
+
type: "string",
|
|
37
|
+
description: "Human-written summary of what the change intends to accomplish",
|
|
38
|
+
minLength: 10,
|
|
39
|
+
maxLength: 500,
|
|
40
|
+
},
|
|
41
|
+
constraints: {
|
|
42
|
+
type: "array",
|
|
43
|
+
description: "Explicit constraints that MUST be respected. Violations = BLOCK.",
|
|
44
|
+
items: {
|
|
45
|
+
type: "string",
|
|
46
|
+
minLength: 5,
|
|
47
|
+
},
|
|
48
|
+
minItems: 0,
|
|
49
|
+
},
|
|
50
|
+
allowed_changes: {
|
|
51
|
+
type: "array",
|
|
52
|
+
description: "Explicit list of allowed modifications (files, routes, env vars)",
|
|
53
|
+
items: {
|
|
54
|
+
type: "object",
|
|
55
|
+
required: ["type", "target"],
|
|
56
|
+
properties: {
|
|
57
|
+
type: {
|
|
58
|
+
type: "string",
|
|
59
|
+
enum: ["file_create", "file_modify", "file_delete", "route_add", "route_modify", "env_add", "permission_modify", "config_change"],
|
|
60
|
+
description: "Type of allowed change",
|
|
61
|
+
},
|
|
62
|
+
target: {
|
|
63
|
+
type: "string",
|
|
64
|
+
description: "Target of the change (file path, route pattern, env var name)",
|
|
65
|
+
},
|
|
66
|
+
pattern: {
|
|
67
|
+
type: "string",
|
|
68
|
+
description: "Glob pattern for matching multiple targets",
|
|
69
|
+
},
|
|
70
|
+
reason: {
|
|
71
|
+
type: "string",
|
|
72
|
+
description: "Why this change is allowed",
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
created_at: {
|
|
78
|
+
type: "string",
|
|
79
|
+
format: "date-time",
|
|
80
|
+
description: "ISO timestamp when intent was declared",
|
|
81
|
+
},
|
|
82
|
+
hash: {
|
|
83
|
+
type: "string",
|
|
84
|
+
pattern: "^[a-f0-9]{64}$",
|
|
85
|
+
description: "SHA-256 hash of intent content for immutability verification",
|
|
86
|
+
},
|
|
87
|
+
|
|
88
|
+
// Optional metadata
|
|
89
|
+
session_id: {
|
|
90
|
+
type: "string",
|
|
91
|
+
description: "Session identifier for tracking",
|
|
92
|
+
},
|
|
93
|
+
author: {
|
|
94
|
+
type: "string",
|
|
95
|
+
description: "Who declared the intent (user identifier)",
|
|
96
|
+
},
|
|
97
|
+
version: {
|
|
98
|
+
type: "number",
|
|
99
|
+
description: "Intent version (increments on explicit update)",
|
|
100
|
+
minimum: 1,
|
|
101
|
+
},
|
|
102
|
+
parent_hash: {
|
|
103
|
+
type: "string",
|
|
104
|
+
description: "Hash of parent intent if this is an update",
|
|
105
|
+
},
|
|
106
|
+
expires_at: {
|
|
107
|
+
type: "string",
|
|
108
|
+
format: "date-time",
|
|
109
|
+
description: "Optional expiration time for the intent",
|
|
110
|
+
},
|
|
111
|
+
scope: {
|
|
112
|
+
type: "object",
|
|
113
|
+
description: "Scope restrictions for the intent",
|
|
114
|
+
properties: {
|
|
115
|
+
directories: {
|
|
116
|
+
type: "array",
|
|
117
|
+
items: { type: "string" },
|
|
118
|
+
description: "Allowed directories for changes",
|
|
119
|
+
},
|
|
120
|
+
file_patterns: {
|
|
121
|
+
type: "array",
|
|
122
|
+
items: { type: "string" },
|
|
123
|
+
description: "Allowed file glob patterns",
|
|
124
|
+
},
|
|
125
|
+
domains: {
|
|
126
|
+
type: "array",
|
|
127
|
+
items: {
|
|
128
|
+
type: "string",
|
|
129
|
+
enum: ["auth", "payments", "routes", "contracts", "ui", "database", "config", "general"],
|
|
130
|
+
},
|
|
131
|
+
description: "Allowed domains for changes",
|
|
132
|
+
},
|
|
133
|
+
excluded_paths: {
|
|
134
|
+
type: "array",
|
|
135
|
+
items: { type: "string" },
|
|
136
|
+
description: "Explicitly excluded paths",
|
|
137
|
+
},
|
|
138
|
+
},
|
|
139
|
+
},
|
|
140
|
+
},
|
|
141
|
+
additionalProperties: false,
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Compute content hash for intent immutability verification
|
|
146
|
+
* @param {Object} intent - Intent object (without hash)
|
|
147
|
+
* @returns {string} SHA-256 hash
|
|
148
|
+
*/
|
|
149
|
+
function computeIntentHash(intent) {
|
|
150
|
+
// Normalize intent for consistent hashing
|
|
151
|
+
const normalized = {
|
|
152
|
+
summary: intent.summary?.trim() || "",
|
|
153
|
+
constraints: (intent.constraints || []).map(c => c.trim()).sort(),
|
|
154
|
+
allowed_changes: (intent.allowed_changes || [])
|
|
155
|
+
.map(c => ({ type: c.type, target: c.target, pattern: c.pattern }))
|
|
156
|
+
.sort((a, b) => `${a.type}:${a.target}`.localeCompare(`${b.type}:${b.target}`)),
|
|
157
|
+
created_at: intent.created_at,
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
const content = JSON.stringify(normalized, null, 0);
|
|
161
|
+
return crypto.createHash("sha256").update(content).digest("hex");
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Create a new intent declaration
|
|
166
|
+
* @param {Object} params - Intent parameters
|
|
167
|
+
* @param {string} params.summary - Human-readable summary
|
|
168
|
+
* @param {string[]} params.constraints - Constraints to enforce
|
|
169
|
+
* @param {Object[]} params.allowed_changes - Explicitly allowed changes
|
|
170
|
+
* @param {Object} params.scope - Scope restrictions
|
|
171
|
+
* @param {string} params.author - Who declared the intent
|
|
172
|
+
* @param {string} params.session_id - Session identifier
|
|
173
|
+
* @returns {Object} Complete intent object with hash
|
|
174
|
+
*/
|
|
175
|
+
function createIntent({
|
|
176
|
+
summary,
|
|
177
|
+
constraints = [],
|
|
178
|
+
allowed_changes = [],
|
|
179
|
+
scope = null,
|
|
180
|
+
author = null,
|
|
181
|
+
session_id = null,
|
|
182
|
+
}) {
|
|
183
|
+
const created_at = new Date().toISOString();
|
|
184
|
+
|
|
185
|
+
const intent = {
|
|
186
|
+
summary: summary?.trim(),
|
|
187
|
+
constraints: constraints.map(c => c.trim()).filter(Boolean),
|
|
188
|
+
allowed_changes,
|
|
189
|
+
created_at,
|
|
190
|
+
version: 1,
|
|
191
|
+
hash: "", // Placeholder
|
|
192
|
+
};
|
|
193
|
+
|
|
194
|
+
// Add optional fields
|
|
195
|
+
if (scope) intent.scope = scope;
|
|
196
|
+
if (author) intent.author = author;
|
|
197
|
+
if (session_id) intent.session_id = session_id;
|
|
198
|
+
|
|
199
|
+
// Compute and set hash
|
|
200
|
+
intent.hash = computeIntentHash(intent);
|
|
201
|
+
|
|
202
|
+
return intent;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Verify intent has not been tampered with
|
|
207
|
+
* @param {Object} intent - Intent to verify
|
|
208
|
+
* @returns {Object} Verification result { valid, computed_hash, stored_hash }
|
|
209
|
+
*/
|
|
210
|
+
function verifyIntentIntegrity(intent) {
|
|
211
|
+
if (!intent || !intent.hash) {
|
|
212
|
+
return {
|
|
213
|
+
valid: false,
|
|
214
|
+
reason: "MISSING_HASH",
|
|
215
|
+
computed_hash: null,
|
|
216
|
+
stored_hash: null,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
const computed = computeIntentHash(intent);
|
|
221
|
+
const stored = intent.hash;
|
|
222
|
+
|
|
223
|
+
return {
|
|
224
|
+
valid: computed === stored,
|
|
225
|
+
reason: computed === stored ? "VERIFIED" : "HASH_MISMATCH",
|
|
226
|
+
computed_hash: computed,
|
|
227
|
+
stored_hash: stored,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* Update an existing intent (creates new version with parent reference)
|
|
233
|
+
* @param {Object} currentIntent - Current intent
|
|
234
|
+
* @param {Object} updates - Fields to update
|
|
235
|
+
* @returns {Object} New intent with incremented version
|
|
236
|
+
*/
|
|
237
|
+
function updateIntent(currentIntent, updates) {
|
|
238
|
+
const parent_hash = currentIntent.hash;
|
|
239
|
+
const version = (currentIntent.version || 1) + 1;
|
|
240
|
+
|
|
241
|
+
const newIntent = {
|
|
242
|
+
...currentIntent,
|
|
243
|
+
...updates,
|
|
244
|
+
created_at: new Date().toISOString(),
|
|
245
|
+
version,
|
|
246
|
+
parent_hash,
|
|
247
|
+
hash: "", // Will be recomputed
|
|
248
|
+
};
|
|
249
|
+
|
|
250
|
+
// Ensure constraints are clean
|
|
251
|
+
if (newIntent.constraints) {
|
|
252
|
+
newIntent.constraints = newIntent.constraints.map(c => c.trim()).filter(Boolean);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
// Recompute hash
|
|
256
|
+
newIntent.hash = computeIntentHash(newIntent);
|
|
257
|
+
|
|
258
|
+
return newIntent;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/**
|
|
262
|
+
* Check if intent is expired
|
|
263
|
+
* @param {Object} intent - Intent to check
|
|
264
|
+
* @returns {boolean} True if expired
|
|
265
|
+
*/
|
|
266
|
+
function isIntentExpired(intent) {
|
|
267
|
+
if (!intent.expires_at) return false;
|
|
268
|
+
return new Date(intent.expires_at) < new Date();
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* Create a minimal blocking intent (for when no intent is declared)
|
|
273
|
+
* This intent blocks ALL changes by having no allowed_changes.
|
|
274
|
+
* @returns {Object} Blocking intent
|
|
275
|
+
*/
|
|
276
|
+
function createBlockingIntent() {
|
|
277
|
+
return createIntent({
|
|
278
|
+
summary: "NO INTENT DECLARED - ALL CHANGES BLOCKED BY DEFAULT",
|
|
279
|
+
constraints: [
|
|
280
|
+
"No changes allowed without explicit intent declaration",
|
|
281
|
+
"All file operations blocked",
|
|
282
|
+
"All route additions blocked",
|
|
283
|
+
"All env var references blocked",
|
|
284
|
+
],
|
|
285
|
+
allowed_changes: [],
|
|
286
|
+
scope: {
|
|
287
|
+
directories: [],
|
|
288
|
+
file_patterns: [],
|
|
289
|
+
domains: [],
|
|
290
|
+
},
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* Intent constraint types for enforcement
|
|
296
|
+
*/
|
|
297
|
+
const CONSTRAINT_TYPES = {
|
|
298
|
+
NO_NEW_ROUTES: "no_new_routes",
|
|
299
|
+
NO_AUTH_CHANGES: "no_auth_changes",
|
|
300
|
+
NO_PAYMENT_CHANGES: "no_payment_changes",
|
|
301
|
+
NO_DATABASE_MIGRATIONS: "no_database_migrations",
|
|
302
|
+
NO_ENV_ADDITIONS: "no_env_additions",
|
|
303
|
+
NO_PERMISSION_CHANGES: "no_permission_changes",
|
|
304
|
+
NO_EXTERNAL_CALLS: "no_external_calls",
|
|
305
|
+
NO_FILE_DELETIONS: "no_file_deletions",
|
|
306
|
+
SINGLE_FILE_ONLY: "single_file_only",
|
|
307
|
+
TESTS_REQUIRED: "tests_required",
|
|
308
|
+
REVIEW_REQUIRED: "review_required",
|
|
309
|
+
};
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* Pre-built constraint templates
|
|
313
|
+
*/
|
|
314
|
+
const CONSTRAINT_TEMPLATES = {
|
|
315
|
+
STRICT_BUGFIX: [
|
|
316
|
+
"No new routes allowed",
|
|
317
|
+
"No auth logic changes",
|
|
318
|
+
"No new environment variables",
|
|
319
|
+
"Changes limited to specified file(s)",
|
|
320
|
+
"No new dependencies",
|
|
321
|
+
],
|
|
322
|
+
FEATURE_ADDITION: [
|
|
323
|
+
"New routes must be documented in intent",
|
|
324
|
+
"No changes to existing auth logic",
|
|
325
|
+
"New env vars must be declared",
|
|
326
|
+
"Tests required for new functionality",
|
|
327
|
+
],
|
|
328
|
+
REFACTOR: [
|
|
329
|
+
"No behavior changes",
|
|
330
|
+
"No new routes",
|
|
331
|
+
"No API contract changes",
|
|
332
|
+
"No auth boundary changes",
|
|
333
|
+
],
|
|
334
|
+
SECURITY_PATCH: [
|
|
335
|
+
"Auth changes must be explicit in intent",
|
|
336
|
+
"No new external endpoints",
|
|
337
|
+
"No permission relaxation",
|
|
338
|
+
"Review required before ship",
|
|
339
|
+
],
|
|
340
|
+
};
|
|
341
|
+
|
|
342
|
+
module.exports = {
|
|
343
|
+
INTENT_SCHEMA,
|
|
344
|
+
createIntent,
|
|
345
|
+
computeIntentHash,
|
|
346
|
+
verifyIntentIntegrity,
|
|
347
|
+
updateIntent,
|
|
348
|
+
isIntentExpired,
|
|
349
|
+
createBlockingIntent,
|
|
350
|
+
CONSTRAINT_TYPES,
|
|
351
|
+
CONSTRAINT_TEMPLATES,
|
|
352
|
+
};
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Intent Store - Persistent Intent Storage
|
|
3
|
+
*
|
|
4
|
+
* ═══════════════════════════════════════════════════════════════════════════════
|
|
5
|
+
* AGENT FIREWALL™ - INTENT PERSISTENCE
|
|
6
|
+
* ═══════════════════════════════════════════════════════════════════════════════
|
|
7
|
+
*
|
|
8
|
+
* Stores intent declarations for session and audit purposes.
|
|
9
|
+
* Intent is immutable once stored - updates create new versions.
|
|
10
|
+
*
|
|
11
|
+
* @module intent/store
|
|
12
|
+
* @version 2.0.0
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
"use strict";
|
|
16
|
+
|
|
17
|
+
const fs = require("fs");
|
|
18
|
+
const path = require("path");
|
|
19
|
+
const { verifyIntentIntegrity, createBlockingIntent } = require("./schema");
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Intent Store - manages intent persistence
|
|
23
|
+
*/
|
|
24
|
+
class IntentStore {
|
|
25
|
+
constructor(projectRoot) {
|
|
26
|
+
this.projectRoot = projectRoot;
|
|
27
|
+
this.intentDir = path.join(projectRoot, ".vibecheck", "intents");
|
|
28
|
+
this.currentIntentPath = path.join(this.intentDir, "current.json");
|
|
29
|
+
this.historyDir = path.join(this.intentDir, "history");
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Ensure storage directories exist
|
|
34
|
+
*/
|
|
35
|
+
ensureDirectories() {
|
|
36
|
+
if (!fs.existsSync(this.intentDir)) {
|
|
37
|
+
fs.mkdirSync(this.intentDir, { recursive: true });
|
|
38
|
+
}
|
|
39
|
+
if (!fs.existsSync(this.historyDir)) {
|
|
40
|
+
fs.mkdirSync(this.historyDir, { recursive: true });
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Store a new intent (or update)
|
|
46
|
+
* @param {Object} intent - Intent to store
|
|
47
|
+
* @returns {Object} Storage result
|
|
48
|
+
*/
|
|
49
|
+
store(intent) {
|
|
50
|
+
this.ensureDirectories();
|
|
51
|
+
|
|
52
|
+
// Verify intent integrity
|
|
53
|
+
const verification = verifyIntentIntegrity(intent);
|
|
54
|
+
if (!verification.valid) {
|
|
55
|
+
return {
|
|
56
|
+
success: false,
|
|
57
|
+
error: `INTENT_INTEGRITY_FAILED: ${verification.reason}`,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Archive current intent if exists (use allowMissing to avoid archiving blocking intent)
|
|
62
|
+
const current = this.getCurrent({ allowMissing: true });
|
|
63
|
+
if (current && current.hash !== intent.hash) {
|
|
64
|
+
this.archive(current);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Write new current intent
|
|
68
|
+
const data = {
|
|
69
|
+
intent,
|
|
70
|
+
stored_at: new Date().toISOString(),
|
|
71
|
+
verified: true,
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
fs.writeFileSync(this.currentIntentPath, JSON.stringify(data, null, 2));
|
|
75
|
+
|
|
76
|
+
return {
|
|
77
|
+
success: true,
|
|
78
|
+
hash: intent.hash,
|
|
79
|
+
path: this.currentIntentPath,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Get current intent (returns blocking intent if none exists)
|
|
85
|
+
* @param {Object} options - Options
|
|
86
|
+
* @param {boolean} options.allowMissing - Don't return blocking intent if missing
|
|
87
|
+
* @returns {Object|null} Current intent or blocking intent
|
|
88
|
+
*/
|
|
89
|
+
getCurrent(options = {}) {
|
|
90
|
+
if (!fs.existsSync(this.currentIntentPath)) {
|
|
91
|
+
if (options.allowMissing) {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
// Return blocking intent when no intent declared
|
|
95
|
+
return createBlockingIntent();
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
try {
|
|
99
|
+
const data = JSON.parse(fs.readFileSync(this.currentIntentPath, "utf-8"));
|
|
100
|
+
const intent = data.intent;
|
|
101
|
+
|
|
102
|
+
// Verify integrity on load
|
|
103
|
+
const verification = verifyIntentIntegrity(intent);
|
|
104
|
+
if (!verification.valid) {
|
|
105
|
+
console.error(`[IntentStore] INTEGRITY VIOLATION: ${verification.reason}`);
|
|
106
|
+
// Return blocking intent on integrity failure
|
|
107
|
+
return createBlockingIntent();
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return intent;
|
|
111
|
+
} catch (error) {
|
|
112
|
+
console.error(`[IntentStore] Error loading intent: ${error.message}`);
|
|
113
|
+
if (options.allowMissing) {
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
return createBlockingIntent();
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Check if an intent is currently declared
|
|
122
|
+
* @returns {boolean} True if intent exists
|
|
123
|
+
*/
|
|
124
|
+
hasIntent() {
|
|
125
|
+
return fs.existsSync(this.currentIntentPath);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Archive an intent to history
|
|
130
|
+
* @param {Object} intent - Intent to archive
|
|
131
|
+
*/
|
|
132
|
+
archive(intent) {
|
|
133
|
+
this.ensureDirectories();
|
|
134
|
+
|
|
135
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, "-");
|
|
136
|
+
const archivePath = path.join(this.historyDir, `${timestamp}_${intent.hash.slice(0, 8)}.json`);
|
|
137
|
+
|
|
138
|
+
const data = {
|
|
139
|
+
intent,
|
|
140
|
+
archived_at: new Date().toISOString(),
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
fs.writeFileSync(archivePath, JSON.stringify(data, null, 2));
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Get intent history
|
|
148
|
+
* @param {number} limit - Maximum number of intents to return
|
|
149
|
+
* @returns {Object[]} Array of historical intents
|
|
150
|
+
*/
|
|
151
|
+
getHistory(limit = 10) {
|
|
152
|
+
if (!fs.existsSync(this.historyDir)) {
|
|
153
|
+
return [];
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
const files = fs.readdirSync(this.historyDir)
|
|
157
|
+
.filter(f => f.endsWith(".json"))
|
|
158
|
+
.sort()
|
|
159
|
+
.reverse()
|
|
160
|
+
.slice(0, limit);
|
|
161
|
+
|
|
162
|
+
return files.map(file => {
|
|
163
|
+
try {
|
|
164
|
+
const data = JSON.parse(fs.readFileSync(path.join(this.historyDir, file), "utf-8"));
|
|
165
|
+
return {
|
|
166
|
+
...data.intent,
|
|
167
|
+
archived_at: data.archived_at,
|
|
168
|
+
};
|
|
169
|
+
} catch {
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
172
|
+
}).filter(Boolean);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Clear current intent
|
|
177
|
+
* @returns {boolean} Success
|
|
178
|
+
*/
|
|
179
|
+
clear() {
|
|
180
|
+
const current = this.getCurrent({ allowMissing: true });
|
|
181
|
+
if (current) {
|
|
182
|
+
this.archive(current);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
if (fs.existsSync(this.currentIntentPath)) {
|
|
186
|
+
fs.unlinkSync(this.currentIntentPath);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
return true;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Get intent by hash (from history)
|
|
194
|
+
* @param {string} hash - Intent hash
|
|
195
|
+
* @returns {Object|null} Intent or null
|
|
196
|
+
*/
|
|
197
|
+
getByHash(hash) {
|
|
198
|
+
// Check current
|
|
199
|
+
const current = this.getCurrent({ allowMissing: true });
|
|
200
|
+
if (current && current.hash === hash) {
|
|
201
|
+
return current;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// Check history
|
|
205
|
+
if (!fs.existsSync(this.historyDir)) {
|
|
206
|
+
return null;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
const files = fs.readdirSync(this.historyDir);
|
|
210
|
+
for (const file of files) {
|
|
211
|
+
if (file.includes(hash.slice(0, 8))) {
|
|
212
|
+
try {
|
|
213
|
+
const data = JSON.parse(fs.readFileSync(path.join(this.historyDir, file), "utf-8"));
|
|
214
|
+
if (data.intent.hash === hash) {
|
|
215
|
+
return data.intent;
|
|
216
|
+
}
|
|
217
|
+
} catch {
|
|
218
|
+
continue;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
return null;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Session-scoped intent tracking
|
|
229
|
+
*/
|
|
230
|
+
class SessionIntentTracker {
|
|
231
|
+
constructor() {
|
|
232
|
+
this.sessions = new Map();
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* Set intent for a session
|
|
237
|
+
* @param {string} sessionId - Session identifier
|
|
238
|
+
* @param {Object} intent - Intent object
|
|
239
|
+
*/
|
|
240
|
+
setIntent(sessionId, intent) {
|
|
241
|
+
this.sessions.set(sessionId, {
|
|
242
|
+
intent,
|
|
243
|
+
set_at: new Date().toISOString(),
|
|
244
|
+
locked: true, // Immutable by default
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* Get intent for a session
|
|
250
|
+
* @param {string} sessionId - Session identifier
|
|
251
|
+
* @returns {Object|null} Intent or null
|
|
252
|
+
*/
|
|
253
|
+
getIntent(sessionId) {
|
|
254
|
+
const session = this.sessions.get(sessionId);
|
|
255
|
+
return session?.intent || null;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* Check if session has intent
|
|
260
|
+
* @param {string} sessionId - Session identifier
|
|
261
|
+
* @returns {boolean} True if intent exists
|
|
262
|
+
*/
|
|
263
|
+
hasIntent(sessionId) {
|
|
264
|
+
return this.sessions.has(sessionId);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* Clear session intent
|
|
269
|
+
* @param {string} sessionId - Session identifier
|
|
270
|
+
*/
|
|
271
|
+
clearIntent(sessionId) {
|
|
272
|
+
this.sessions.delete(sessionId);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// Global session tracker
|
|
277
|
+
const globalSessionTracker = new SessionIntentTracker();
|
|
278
|
+
|
|
279
|
+
module.exports = {
|
|
280
|
+
IntentStore,
|
|
281
|
+
SessionIntentTracker,
|
|
282
|
+
globalSessionTracker,
|
|
283
|
+
};
|