@planu/cli 4.13.0 → 4.14.1
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/CHANGELOG.md +29 -0
- package/README.md +24 -24
- package/dist/cli/commands/inspect.d.ts +4 -0
- package/dist/cli/commands/inspect.js +144 -0
- package/dist/cli/commands/install.d.ts +19 -1
- package/dist/cli/commands/install.js +145 -43
- package/dist/cli/commands/job.d.ts +3 -0
- package/dist/cli/commands/job.js +119 -0
- package/dist/cli/commands/offline.d.ts +15 -0
- package/dist/cli/commands/offline.js +132 -0
- package/dist/cli/commands/serve.js +4 -0
- package/dist/cli/commands/spec.js +1 -1
- package/dist/cli/commands/storage.d.ts +3 -0
- package/dist/cli/commands/storage.js +102 -0
- package/dist/cli/commands/uninstall.d.ts +10 -0
- package/dist/cli/commands/uninstall.js +93 -7
- package/dist/cli/commands/validate.js +1 -1
- package/dist/cli/index.js +2 -0
- package/dist/cli/router.js +9 -1
- package/dist/config/crash-shield-framework-rules.json +93 -0
- package/dist/config/environment-schema.json +149 -0
- package/dist/config/hardcode-exceptions.json +4 -0
- package/dist/config/license-plans.json +7 -0
- package/dist/config/native-release-public-key.pem +3 -0
- package/dist/config/native-targets.json +87 -0
- package/dist/config/product-public.d.ts +89 -0
- package/dist/config/product-public.js +140 -0
- package/dist/config/product-public.json +312 -0
- package/dist/config/product-public.ts +148 -0
- package/dist/config/release-compatibility.json +13 -0
- package/dist/config/release-policy.json +26 -0
- package/dist/config/runtime-policy.json +44 -0
- package/dist/config/skill-templates/planu-validate.md +7 -4
- package/dist/config/subagent-templates/planu-spec-implementer.md +7 -3
- package/dist/config/subagent-templates/planu-validator.md +10 -5
- package/dist/config/technology-registry.json +120 -0
- package/dist/config/version.js +7 -8
- package/dist/config/version.ts +10 -7
- package/dist/engine/abortable-process-runner.js +40 -9
- package/dist/engine/advanced-testing/accessibility-checker.js +12 -14
- package/dist/engine/advanced-testing/mutation-advisor.js +3 -4
- package/dist/engine/advanced-testing/property-based.js +2 -3
- package/dist/engine/advanced-testing/test-data-advisor.js +2 -3
- package/dist/engine/agent-generator.js +2 -1
- package/dist/engine/agent-handoff-store.js +2 -1
- package/dist/engine/agent-prompt-generator.js +7 -5
- package/dist/engine/agent-telemetry.js +2 -1
- package/dist/engine/ai-integration/gemini/extensions-advisor.js +41 -9
- package/dist/engine/ambiguity-detector.js +12 -11
- package/dist/engine/analyzer/db-engine.js +2 -3
- package/dist/engine/analyzer/detectors.js +13 -14
- package/dist/engine/analyzer/env-setup.js +9 -10
- package/dist/engine/analyzer-env-scanner/env-example.js +7 -8
- package/dist/engine/api-spec-generator/graphql-parser.js +2 -2
- package/dist/engine/api-validation/graphql-schema-validator.js +2 -1
- package/dist/engine/api-validation/openapi-impl-validator.js +6 -7
- package/dist/engine/architecture-detector.js +10 -8
- package/dist/engine/auth/config.d.ts +1 -1
- package/dist/engine/auth/config.js +4 -3
- package/dist/engine/auto-updater/atomic-upgrade.d.ts +8 -0
- package/dist/engine/auto-updater/atomic-upgrade.js +381 -0
- package/dist/engine/auto-updater/config-detector.js +9 -3
- package/dist/engine/auto-updater/config-patcher.d.ts +0 -4
- package/dist/engine/auto-updater/config-patcher.js +10 -15
- package/dist/engine/auto-updater/index.d.ts +3 -1
- package/dist/engine/auto-updater/index.js +44 -30
- package/dist/engine/auto-updater/npm-registry.js +10 -2
- package/dist/engine/auto-updater/release-verifier.d.ts +3 -0
- package/dist/engine/auto-updater/release-verifier.js +112 -0
- package/dist/engine/auto-updater/upgrade-lock.d.ts +6 -0
- package/dist/engine/auto-updater/upgrade-lock.js +28 -0
- package/dist/engine/auto-updater/upgrade-trust-state.d.ts +7 -0
- package/dist/engine/auto-updater/upgrade-trust-state.js +59 -0
- package/dist/engine/autopilot/audit-logger.js +2 -5
- package/dist/engine/best-practices-library.js +2 -1
- package/dist/engine/browser-validator.js +2 -1
- package/dist/engine/build-tool-detector.js +3 -2
- package/dist/engine/ci-generator/context-builders.js +7 -5
- package/dist/engine/ci-generator/stack-detector.js +0 -2
- package/dist/engine/ci-generator/yaml-builder.js +0 -2
- package/dist/engine/claude-config-auditor/rules-auditor.js +4 -3
- package/dist/engine/code-transforms/typescript/ast-utils.js +2 -3
- package/dist/engine/complexity-budget/trivial-detector.js +2 -1
- package/dist/engine/compliance-test-generator/index.js +7 -2
- package/dist/engine/compliance-test-generator/test-formatter.js +2 -2
- package/dist/engine/config-health/mcp-config-checker.js +2 -1
- package/dist/engine/config-health/ts-checker-scripts.js +4 -3
- package/dist/engine/config-health/ts-checker.js +3 -2
- package/dist/engine/convention-injector.js +5 -7
- package/dist/engine/convention-scanner/convention-parser.js +3 -2
- package/dist/engine/core-bridge-duplicate-blocks.d.ts +3 -0
- package/dist/engine/core-bridge-duplicate-blocks.js +57 -0
- package/dist/engine/core-bridge-gaps.d.ts +4 -0
- package/dist/engine/core-bridge-gaps.js +75 -0
- package/dist/engine/core-bridge.d.ts +9 -9
- package/dist/engine/core-bridge.js +196 -283
- package/dist/engine/cost-tracking/ledger.js +2 -5
- package/dist/engine/coverage-gap-analyzer.js +10 -1
- package/dist/engine/crash-shield/detectors/framework-detector.d.ts +2 -0
- package/dist/engine/crash-shield/detectors/framework-detector.js +110 -192
- package/dist/engine/crash-shield/detectors/typescript-detector.js +2 -1
- package/dist/engine/dashboard/data-loader.js +2 -1
- package/dist/engine/data-projects-gc/gc-runner.d.ts +7 -0
- package/dist/engine/data-projects-gc/gc-runner.js +113 -3
- package/dist/engine/data-projects-gc/scanner.js +5 -1
- package/dist/engine/decision-store.js +11 -14
- package/dist/engine/deleter/core.js +5 -5
- package/dist/engine/dep-auditor/abandonment-data.js +2 -1
- package/dist/engine/dep-auditor/abandonment-registry.js +3 -1
- package/dist/engine/dep-auditor/cve-fetcher.js +3 -0
- package/dist/engine/dep-auditor/dep-duplicates-detector.js +36 -4
- package/dist/engine/dep-auditor/license-registry.js +2 -0
- package/dist/engine/dependency-evaluator.d.ts +14 -0
- package/dist/engine/dependency-evaluator.js +81 -0
- package/dist/engine/deploy/providers/fly.js +7 -7
- package/dist/engine/deploy/providers/netlify.js +7 -7
- package/dist/engine/deploy/providers/railway.js +10 -12
- package/dist/engine/deploy/providers/vercel.js +7 -9
- package/dist/engine/deprecation-scanner/pattern-loader.js +0 -2
- package/dist/engine/desktop-detector.js +2 -3
- package/dist/engine/detect-duplication.js +2 -1
- package/dist/engine/detectors/advanced-framework-detector/css-state-detector.js +2 -1
- package/dist/engine/detectors/advanced-framework-detector/legacy-detector.js +2 -3
- package/dist/engine/detectors/advanced-framework-detector/modern-detector.js +3 -4
- package/dist/engine/detectors/agent-framework-detector.js +3 -2
- package/dist/engine/detectors/ai-native-detector.js +4 -6
- package/dist/engine/detectors/cache-db-detector.js +4 -3
- package/dist/engine/detectors/cicd-detector.js +4 -3
- package/dist/engine/detectors/deployment-detector.js +11 -12
- package/dist/engine/detectors/frontend-perf-detector.js +14 -9
- package/dist/engine/detectors/library-detector-multilang-a.js +16 -3
- package/dist/engine/detectors/library-detector-node.js +14 -4
- package/dist/engine/detectors/library-detector-python.js +7 -1
- package/dist/engine/detectors/library-detector.js +0 -2
- package/dist/engine/detectors/llm-detector/provider-maps.js +3 -2
- package/dist/engine/detectors/mcp-candidate-detector.js +12 -16
- package/dist/engine/detectors/mfe-detector.js +6 -7
- package/dist/engine/detectors/monitoring-detector.js +4 -3
- package/dist/engine/detectors/otel-detector.js +3 -2
- package/dist/engine/detectors/otel-ecosystem-detectors.d.ts +2 -2
- package/dist/engine/detectors/otel-ecosystem-detectors.js +4 -3
- package/dist/engine/detectors/platform-specialty-detector.js +3 -5
- package/dist/engine/detectors/template-engine-detector.js +3 -4
- package/dist/engine/doc-generator/builders.js +2 -3
- package/dist/engine/doc-generator/mobile-distribution-guide.js +13 -17
- package/dist/engine/doc-generator/portal/dirty-flag-map.d.ts +2 -2
- package/dist/engine/doc-generator/portal/portal-regenerator.js +3 -47
- package/dist/engine/domain-detector.js +3 -6
- package/dist/engine/dynamic-knowledge/knowledge-cache.js +3 -4
- package/dist/engine/dynamic-knowledge/knowledge-merger.js +17 -2
- package/dist/engine/dynamic-knowledge/web-researcher.js +15 -14
- package/dist/engine/dynamic-migration-detector/manifest-readers-extended.js +0 -2
- package/dist/engine/e2e-test-generator.js +4 -3
- package/dist/engine/ecosystem-absorber/knowledge-cache.js +2 -1
- package/dist/engine/ecosystem-absorber/platform-crawler.js +2 -2
- package/dist/engine/escalator/retry-counter.js +2 -1
- package/dist/engine/evidence-gates/artifact-reader.d.ts +6 -0
- package/dist/engine/evidence-gates/artifact-reader.js +105 -21
- package/dist/engine/evidence-gates/lifecycle-gate.d.ts +2 -1
- package/dist/engine/evidence-gates/lifecycle-gate.js +54 -0
- package/dist/engine/execution/context.d.ts +19 -0
- package/dist/engine/execution/context.js +127 -0
- package/dist/engine/execution/deadline-io.d.ts +21 -0
- package/dist/engine/execution/deadline-io.js +45 -0
- package/dist/engine/execution/job-executor.d.ts +16 -0
- package/dist/engine/execution/job-executor.js +140 -0
- package/dist/engine/execution/job-runtime.d.ts +78 -0
- package/dist/engine/execution/job-runtime.js +220 -0
- package/dist/engine/execution/native-relevance-scorer.d.ts +6 -0
- package/dist/engine/execution/native-relevance-scorer.js +64 -0
- package/dist/engine/execution/native-worker-dispatch.d.ts +3 -0
- package/dist/engine/execution/native-worker-dispatch.js +46 -0
- package/dist/engine/execution/native-worker-protocol.d.ts +6 -0
- package/dist/engine/execution/native-worker-protocol.js +33 -0
- package/dist/engine/execution/native-worker-runtime.d.ts +4 -0
- package/dist/engine/execution/native-worker-runtime.js +177 -0
- package/dist/engine/execution/native-worker-thread.d.ts +2 -0
- package/dist/engine/execution/native-worker-thread.js +66 -0
- package/dist/engine/execution/operation-journal.d.ts +66 -0
- package/dist/engine/execution/operation-journal.js +260 -0
- package/dist/engine/execution/outbox-worker.d.ts +31 -0
- package/dist/engine/execution/outbox-worker.js +192 -0
- package/dist/engine/execution/validate-job-executor.d.ts +24 -0
- package/dist/engine/execution/validate-job-executor.js +342 -0
- package/dist/engine/execution/validate-job-payload.d.ts +5 -0
- package/dist/engine/execution/validate-job-payload.js +87 -0
- package/dist/engine/execution/validate-job-recovery.d.ts +4 -0
- package/dist/engine/execution/validate-job-recovery.js +47 -0
- package/dist/engine/execution/validate-worker-runtime.d.ts +5 -0
- package/dist/engine/execution/validate-worker-runtime.js +100 -0
- package/dist/engine/execution/validate-worker-thread.d.ts +2 -0
- package/dist/engine/execution/validate-worker-thread.js +71 -0
- package/dist/engine/execution-plan/desktop-distribution.js +3 -7
- package/dist/engine/execution-plan/mobile-distribution.js +4 -9
- package/dist/engine/execution-plan/phases.js +4 -5
- package/dist/engine/execution-plan/plan-utils.js +8 -5
- package/dist/engine/facilitate/context-loader.js +3 -9
- package/dist/engine/figma/code-connect-fetcher.js +9 -8
- package/dist/engine/filesystem-watcher/index.d.ts +3 -3
- package/dist/engine/filesystem-watcher/index.js +5 -5
- package/dist/engine/framework-detector.js +14 -15
- package/dist/engine/git/planu-autocommit.js +8 -7
- package/dist/engine/git/repository-probe.d.ts +3 -0
- package/dist/engine/git/repository-probe.js +13 -0
- package/dist/engine/global-rules-manager.js +2 -2
- package/dist/engine/handoff-artifacts/io.js +2 -3
- package/dist/engine/handoff-artifacts/schemas/red-tests-handoff.js +8 -1
- package/dist/engine/handoff-artifacts/schemas.d.ts +4 -0
- package/dist/engine/handoff-artifacts/schemas.js +5 -0
- package/dist/engine/hook-generator/stack-hook-templates.js +4 -4
- package/dist/engine/hooks/config-loader.js +1 -1
- package/dist/engine/hooks/context-injector.js +4 -7
- package/dist/engine/hooks/file-watcher.js +1 -14
- package/dist/engine/hooks-reconciler.js +6 -4
- package/dist/engine/infrastructure/component-mapper.js +5 -7
- package/dist/engine/infrastructure/docker-compose-generator.js +8 -10
- package/dist/engine/infrastructure/index.js +6 -3
- package/dist/engine/infrastructure/kubernetes-generator.js +2 -2
- package/dist/engine/infrastructure/railway-generator.js +10 -8
- package/dist/engine/infrastructure/signal-detector.js +6 -8
- package/dist/engine/infrastructure/terraform-generator.js +6 -8
- package/dist/engine/legal-compliance/detector.js +3 -2
- package/dist/engine/local-first/storage-advisor.js +5 -6
- package/dist/engine/macos-keychain-native-port.d.ts +5 -0
- package/dist/engine/macos-keychain-native-port.js +26 -0
- package/dist/engine/marketplace-fetcher/cache.js +3 -1
- package/dist/engine/mcp-config/mcp-config-writer.d.ts +2 -2
- package/dist/engine/mcp-config/mcp-config-writer.js +10 -8
- package/dist/engine/migration/db-migrator.js +2 -5
- package/dist/engine/migration/equivalence-mapper.js +12 -13
- package/dist/engine/migration/service-catalogs.js +6 -7
- package/dist/engine/migration/service-migrator-catalogs.js +6 -7
- package/dist/engine/mobile-detector-ios.js +2 -3
- package/dist/engine/mobile-detector.js +16 -4
- package/dist/engine/model-router/complexity-analyzer.js +4 -7
- package/dist/engine/multi-agent-review/security-analyzer.js +3 -1
- package/dist/engine/multi-app-detector/app-type.js +26 -21
- package/dist/engine/multi-app-detector/core.js +3 -2
- package/dist/engine/multi-teammate-review/disagreement-counter.js +2 -1
- package/dist/engine/multi-teammate-review/panel-orchestrator.js +0 -2
- package/dist/engine/mutation-config-generator.js +10 -7
- package/dist/engine/native-capability-policy.d.ts +4 -0
- package/dist/engine/native-capability-policy.js +24 -0
- package/dist/engine/native-platform.d.ts +3 -0
- package/dist/engine/native-platform.js +44 -0
- package/dist/engine/native-runtime-handshake.d.ts +20 -0
- package/dist/engine/native-runtime-handshake.js +230 -0
- package/dist/engine/network-policy.d.ts +27 -0
- package/dist/engine/network-policy.js +174 -0
- package/dist/engine/next-spec-resolver/dependency-filter.js +2 -22
- package/dist/engine/nfr-profile-detector.js +12 -16
- package/dist/engine/nli-keywords.js +8 -9
- package/dist/engine/oauth/config-guard.js +4 -5
- package/dist/engine/observability/local-execution-spans.d.ts +15 -0
- package/dist/engine/observability/local-execution-spans.js +63 -0
- package/dist/engine/orchestrator/runtime.js +0 -1
- package/dist/engine/package-registry.js +2 -6
- package/dist/engine/performance-analyzer.js +2 -5
- package/dist/engine/permissions-merger/stack-detectors.js +5 -5
- package/dist/engine/planu-core.darwin-arm64.node.manifest.json +39 -0
- package/dist/engine/planu-core.darwin-arm64.node.sbom.json +1310 -0
- package/dist/engine/planu-core.darwin-x64.node.manifest.json +39 -0
- package/dist/engine/planu-core.darwin-x64.node.sbom.json +1310 -0
- package/dist/engine/planu-core.linux-arm64-gnu.node.manifest.json +38 -0
- package/dist/engine/planu-core.linux-arm64-gnu.node.sbom.json +1310 -0
- package/dist/engine/planu-core.linux-arm64-musl.node.manifest.json +38 -0
- package/dist/engine/planu-core.linux-arm64-musl.node.sbom.json +1310 -0
- package/dist/engine/planu-core.linux-x64-gnu.node.manifest.json +38 -0
- package/dist/engine/planu-core.linux-x64-gnu.node.sbom.json +1310 -0
- package/dist/engine/planu-core.linux-x64-musl.node.manifest.json +38 -0
- package/dist/engine/planu-core.linux-x64-musl.node.sbom.json +1310 -0
- package/dist/engine/planu-core.win32-arm64-msvc.node.manifest.json +38 -0
- package/dist/engine/planu-core.win32-arm64-msvc.node.sbom.json +1310 -0
- package/dist/engine/planu-core.win32-x64-msvc.node.manifest.json +38 -0
- package/dist/engine/planu-core.win32-x64-msvc.node.sbom.json +1310 -0
- package/dist/engine/platform-detector/desktop.js +15 -2
- package/dist/engine/platform-detector/extensions.js +2 -1
- package/dist/engine/platform-detector/games.js +2 -1
- package/dist/engine/platform-detector.js +3 -2
- package/dist/engine/platform-engineering/idp-detector.js +2 -1
- package/dist/engine/plugin-installer/stack-matcher.js +9 -17
- package/dist/engine/plugins/lifecycle.js +6 -2
- package/dist/engine/prior-decisions/contradiction-detector.js +60 -30
- package/dist/engine/project-dna/stack-detector.js +15 -17
- package/dist/engine/project-graph/builder.js +11 -0
- package/dist/engine/project-graph/cache.js +1 -1
- package/dist/engine/project-graph/freshness-projection.d.ts +16 -0
- package/dist/engine/project-graph/freshness-projection.js +95 -0
- package/dist/engine/project-graph/index.d.ts +1 -0
- package/dist/engine/project-graph/index.js +1 -0
- package/dist/engine/project-graph/query.js +15 -25
- package/dist/engine/project-health-checker.js +3 -4
- package/dist/engine/project-scanner/stack-detector.js +17 -17
- package/dist/engine/property-test-generator.js +2 -3
- package/dist/engine/qa-gate.d.ts +1 -0
- package/dist/engine/qa-gate.js +6 -4
- package/dist/engine/quality-gates/gate-catalog.js +47 -46
- package/dist/engine/quality-gates/gate-injector.js +9 -4
- package/dist/engine/registry/core.js +0 -2
- package/dist/engine/registry/loader.js +9 -12
- package/dist/engine/registry/matcher.js +129 -24
- package/dist/engine/resilience-detector/concurrency-detector.js +4 -4
- package/dist/engine/resilience-detector/middleware-detector.js +11 -13
- package/dist/engine/resilience-detector/validation-detector.js +17 -4
- package/dist/engine/reverse-engineer/config-analyzer.js +9 -8
- package/dist/engine/reverse-engineer/orchestrator.js +5 -9
- package/dist/engine/reverse-engineer/test-file-parser.js +6 -3
- package/dist/engine/rules-generator/index.js +6 -5
- package/dist/engine/runtime-policy.d.ts +7 -0
- package/dist/engine/runtime-policy.js +101 -0
- package/dist/engine/runtime-security/checkers/content-security.js +21 -6
- package/dist/engine/runtime-security/checkers/file-permissions.js +0 -2
- package/dist/engine/safety/atomic-write-file.js +20 -9
- package/dist/engine/safety/atomic-writer.js +10 -3
- package/dist/engine/safety/cross-process-lock.d.ts +3 -40
- package/dist/engine/safety/cross-process-lock.js +268 -272
- package/dist/engine/safety/file-mutex.d.ts +2 -9
- package/dist/engine/safety/file-mutex.js +155 -87
- package/dist/engine/safety/health-monitor.js +15 -6
- package/dist/engine/safety/lock-lease-store.d.ts +79 -0
- package/dist/engine/safety/lock-lease-store.js +372 -0
- package/dist/engine/safety/lock-scavenger.d.ts +2 -5
- package/dist/engine/safety/lock-scavenger.js +158 -76
- package/dist/engine/safety/lock-staleness.js +4 -1
- package/dist/engine/safety/obsolete-lock-guard.d.ts +8 -0
- package/dist/engine/safety/obsolete-lock-guard.js +31 -0
- package/dist/engine/safety/transaction.js +3 -3
- package/dist/engine/sandbox/index.js +2 -1
- package/dist/engine/sandbox/runner-detect.js +3 -2
- package/dist/engine/sandbox/runner-docker.js +4 -3
- package/dist/engine/scan-project/module-discoverer.js +3 -2
- package/dist/engine/schema-generator.js +16 -9
- package/dist/engine/security-analyzer/criteria-generator.js +2 -3
- package/dist/engine/self-healing/healer.js +4 -4
- package/dist/engine/session-safeguard/learnings-buffer.d.ts +1 -2
- package/dist/engine/session-safeguard/learnings-buffer.js +42 -65
- package/dist/engine/shared-agent-memory.js +66 -74
- package/dist/engine/skill-adapter/command-rewriter.js +3 -2
- package/dist/engine/skill-adapter/index.js +3 -3
- package/dist/engine/skill-adapter/placeholder-map.js +3 -2
- package/dist/engine/skill-bootstrap/stack-matcher.js +47 -48
- package/dist/engine/skill-generation/stack-content-generator.js +0 -2
- package/dist/engine/skill-generator/workflow-skill-generator.js +2 -1
- package/dist/engine/skill-registry/ttl-refresh.js +3 -1
- package/dist/engine/skills/skills-fetcher.js +3 -6
- package/dist/engine/skills-reconciler.js +19 -39
- package/dist/engine/spec-coverage/test-finder.js +7 -6
- package/dist/engine/spec-diff-engine.js +3 -3
- package/dist/engine/spec-generator/api-key-resolver.d.ts +1 -1
- package/dist/engine/spec-generator/api-key-resolver.js +3 -24
- package/dist/engine/spec-generators/issue-extractor.js +9 -3
- package/dist/engine/spec-migrator/drift-detector.js +5 -13
- package/dist/engine/spec-migrator/filesystem-import.js +14 -10
- package/dist/engine/spec-migrator/planu-canonical-policy.js +10 -1
- package/dist/engine/spec-migrator/strict-planu-cleanup.js +24 -25
- package/dist/engine/spec-registry/adapter.d.ts +0 -5
- package/dist/engine/spec-registry/adapter.js +45 -46
- package/dist/engine/spec-registry/client.js +2 -0
- package/dist/engine/spec-source-sync.js +3 -2
- package/dist/engine/spec-templates/custom-loader.js +2 -3
- package/dist/engine/spec-templates/templates-domain-specific.js +8 -5
- package/dist/engine/spec-templates/templates-perf-integration.js +2 -3
- package/dist/engine/stack-auditor/manifest-reader.js +0 -2
- package/dist/engine/staleness/stale-implementing.js +7 -7
- package/dist/engine/tdd-scaffold-generator.js +24 -11
- package/dist/engine/teammate-router/green-phase-verifier.js +2 -1
- package/dist/engine/teammate-router/red-phase-verifier.js +2 -1
- package/dist/engine/technology-registry.d.ts +11 -0
- package/dist/engine/technology-registry.js +142 -0
- package/dist/engine/telemetry/error-reporter.d.ts +1 -2
- package/dist/engine/telemetry/error-reporter.js +11 -18
- package/dist/engine/telemetry/health-checker.js +5 -14
- package/dist/engine/telemetry/index.d.ts +0 -1
- package/dist/engine/telemetry/index.js +0 -1
- package/dist/engine/telemetry/stance.js +3 -2
- package/dist/engine/telemetry/telemetry-client.d.ts +1 -5
- package/dist/engine/telemetry/telemetry-client.js +45 -29
- package/dist/engine/telemetry/telemetry-store.d.ts +3 -3
- package/dist/engine/telemetry/telemetry-store.js +30 -23
- package/dist/engine/test-framework-detector/detectors.js +8 -8
- package/dist/engine/test-framework-detector/strategy.js +8 -9
- package/dist/engine/test-generators/agent-test-templates.js +2 -3
- package/dist/engine/test-generators/contract-test-generator.d.ts +1 -1
- package/dist/engine/test-generators/contract-test-generator.js +9 -202
- package/dist/engine/test-generators/platform-test-templates-b.js +2 -3
- package/dist/engine/test-generators/platform-test-templates.js +2 -5
- package/dist/engine/test-mocks-generator.js +4 -3
- package/dist/engine/test-plan-generator.js +30 -12
- package/dist/engine/test-scaffold-generator/advanced-scaffold.js +4 -5
- package/dist/engine/test-scaffold-generator/unit-scaffold.js +5 -6
- package/dist/engine/timing/budget.d.ts +6 -17
- package/dist/engine/timing/budget.js +80 -64
- package/dist/engine/tool-groups/group-manager.js +3 -3
- package/dist/engine/universal-rules/installer.js +1 -1
- package/dist/engine/universal-rules/rules/planu-modes.js +2 -0
- package/dist/engine/universal-rules/rules/planu-release-policy.js +1 -0
- package/dist/engine/update-notifier.js +8 -5
- package/dist/engine/validation/approved-spec-portability.d.ts +12 -0
- package/dist/engine/validation/approved-spec-portability.js +107 -0
- package/dist/engine/validation/durable-validation.d.ts +36 -0
- package/dist/engine/validation/durable-validation.js +335 -0
- package/dist/engine/validation/validation-freshness.d.ts +36 -0
- package/dist/engine/validation/validation-freshness.js +427 -0
- package/dist/engine/validation/validation-receipt-codec.d.ts +13 -0
- package/dist/engine/validation/validation-receipt-codec.js +182 -0
- package/dist/engine/validation/validation-receipt.d.ts +59 -0
- package/dist/engine/validation/validation-receipt.js +282 -0
- package/dist/engine/validation/validation-source-policy.d.ts +4 -0
- package/dist/engine/validation/validation-source-policy.js +16 -0
- package/dist/engine/validation/validation-submission.d.ts +36 -0
- package/dist/engine/validation/validation-submission.js +128 -0
- package/dist/engine/validation-evidence-ledger.js +41 -0
- package/dist/engine/validation-impact-planner.js +25 -9
- package/dist/engine/validator/spec-compliance-runner.d.ts +1 -1
- package/dist/engine/validator/spec-compliance-runner.js +17 -8
- package/dist/engine/validator/validation-report-writer.js +1 -1
- package/dist/engine/validator.js +2 -1
- package/dist/engine/verify-integrations/index.js +1 -1
- package/dist/engine/version-resolver.js +5 -6
- package/dist/engine/web-fetcher/stack-advisor.js +156 -92
- package/dist/engine/web-fetcher/stack-detector.js +114 -54
- package/dist/engine/workspace-manager.js +3 -2
- package/dist/errors/classified-degradation.d.ts +3 -0
- package/dist/errors/classified-degradation.js +10 -0
- package/dist/errors/degradation-sink.d.ts +3 -0
- package/dist/errors/degradation-sink.js +5 -0
- package/dist/errors/error-taxonomy.d.ts +12 -0
- package/dist/errors/error-taxonomy.js +62 -0
- package/dist/hosts/claude-code/ux/mcp-prompts.js +10 -4
- package/dist/hosts/claude-code/ux/mcp-resources.js +4 -2
- package/dist/hosts/codex/config-scaffold.js +4 -3
- package/dist/hosts/gemini/config-scaffold.js +2 -1
- package/dist/hosts/gemini/multimodal-spec-flow.js +7 -4
- package/dist/index.js +21 -6
- package/dist/resources/patterns.js +3 -1
- package/dist/resources/specs.js +3 -1
- package/dist/resources/templates.js +3 -1
- package/dist/security/adapters/environment.d.ts +12 -0
- package/dist/security/adapters/environment.js +25 -0
- package/dist/security/adapters/linux-secret-service.d.ts +8 -0
- package/dist/security/adapters/linux-secret-service.js +60 -0
- package/dist/security/adapters/macos-keychain.d.ts +18 -0
- package/dist/security/adapters/macos-keychain.js +90 -0
- package/dist/security/adapters/windows-credential-manager.d.ts +8 -0
- package/dist/security/adapters/windows-credential-manager.js +58 -0
- package/dist/security/redactor.d.ts +5 -0
- package/dist/security/redactor.js +58 -0
- package/dist/security/secret-field.d.ts +5 -0
- package/dist/security/secret-field.js +17 -0
- package/dist/security/secret-migration.d.ts +3 -0
- package/dist/security/secret-migration.js +123 -0
- package/dist/security/secret-provider.d.ts +23 -0
- package/dist/security/secret-provider.js +145 -0
- package/dist/security/secure-json.d.ts +3 -0
- package/dist/security/secure-json.js +29 -0
- package/dist/storage/api-surfaces-store.js +2 -2
- package/dist/storage/approval-operation-lock.d.ts +1 -1
- package/dist/storage/approval-operation-lock.js +5 -3
- package/dist/storage/audit-trail-store.d.ts +1 -1
- package/dist/storage/audit-trail-store.js +48 -62
- package/dist/storage/autopilot-log-store.js +12 -5
- package/dist/storage/base-store.d.ts +8 -8
- package/dist/storage/base-store.js +57 -20
- package/dist/storage/checkpoint-store.js +5 -2
- package/dist/storage/comments-store.js +2 -2
- package/dist/storage/compliance-audit-store.js +5 -2
- package/dist/storage/compliance-gate-config-store.js +7 -4
- package/dist/storage/compliance-store.js +2 -2
- package/dist/storage/context-profile-store.js +2 -2
- package/dist/storage/crash-shield-store.js +8 -4
- package/dist/storage/feedback-store.js +10 -6
- package/dist/storage/figma-store.js +8 -4
- package/dist/storage/file-mutex.js +9 -1
- package/dist/storage/gaps-log.js +7 -4
- package/dist/storage/global-projects-store.js +4 -2
- package/dist/storage/ideas-store.js +2 -2
- package/dist/storage/index.d.ts +5 -0
- package/dist/storage/index.js +5 -0
- package/dist/storage/knowledge-store/knowledge.js +27 -33
- package/dist/storage/lessons-store.js +2 -2
- package/dist/storage/license-store.js +13 -41
- package/dist/storage/migrations/canonical-storage.d.ts +15 -0
- package/dist/storage/migrations/canonical-storage.js +599 -0
- package/dist/storage/oauth-store.js +36 -8
- package/dist/storage/path-resolver.js +16 -3
- package/dist/storage/pr-store.js +2 -2
- package/dist/storage/project-drift-store.js +20 -8
- package/dist/storage/project-identity.d.ts +32 -0
- package/dist/storage/project-identity.js +194 -0
- package/dist/storage/project-resolver.js +14 -7
- package/dist/storage/release-notes-store.js +2 -6
- package/dist/storage/runtime-db.d.ts +186 -0
- package/dist/storage/runtime-db.js +1054 -0
- package/dist/storage/schema-registry.d.ts +5 -0
- package/dist/storage/schema-registry.js +74 -0
- package/dist/storage/sentry-store.js +20 -9
- package/dist/storage/session-state-store.js +12 -5
- package/dist/storage/session-store.js +12 -4
- package/dist/storage/skill-registry-storage.d.ts +1 -1
- package/dist/storage/skill-registry-storage.js +13 -11
- package/dist/storage/slack-store.js +10 -5
- package/dist/storage/spec-store.js +31 -24
- package/dist/storage/status-store/file-lock.js +31 -9
- package/dist/storage/status-store/self-healing.js +10 -5
- package/dist/storage/status-store/version-sync.js +8 -6
- package/dist/storage/steering-store.js +2 -2
- package/dist/storage/storage-bundle.d.ts +5 -0
- package/dist/storage/storage-bundle.js +117 -0
- package/dist/storage/storage-catalog-validation.d.ts +3 -0
- package/dist/storage/storage-catalog-validation.js +20 -0
- package/dist/storage/storage-catalog.d.ts +25 -0
- package/dist/storage/storage-catalog.js +390 -0
- package/dist/storage/storage-layout.d.ts +24 -0
- package/dist/storage/storage-layout.js +101 -0
- package/dist/storage/storybook-store.js +2 -2
- package/dist/storage/supabase-store.js +24 -6
- package/dist/storage/tdd-policy-store.js +8 -6
- package/dist/storage/tech-debt-store.js +3 -3
- package/dist/storage/technology-selection-store.d.ts +1 -1
- package/dist/storage/technology-selection-store.js +6 -3
- package/dist/storage/token-cache-store.js +3 -3
- package/dist/storage/token-ledger-store.js +13 -8
- package/dist/storage/transition-log.js +7 -4
- package/dist/storage/trash-store.js +15 -6
- package/dist/storage/vector-store/migrator.js +7 -2
- package/dist/storage/vector-store/sqlite-adapter.js +4 -1
- package/dist/storage/webhook-server-store.js +2 -2
- package/dist/tools/api-spec-generator-handler.js +3 -2
- package/dist/tools/auto-update-handler.d.ts +1 -1
- package/dist/tools/auto-update-handler.js +1 -1
- package/dist/tools/browser-validate-handler.js +2 -1
- package/dist/tools/challenge-spec/platform-challenge-scenarios-b.js +8 -5
- package/dist/tools/challenge-spec/scenarios-desktop.js +8 -3
- package/dist/tools/challenge-spec/scenarios-failure.js +7 -2
- package/dist/tools/challenge-spec/security-challenge-scenarios.js +3 -3
- package/dist/tools/clarify-requirements/multiple-choice.js +53 -41
- package/dist/tools/comments-handler.js +2 -3
- package/dist/tools/compliance-test-handler.js +2 -2
- package/dist/tools/configure-telemetry.js +11 -11
- package/dist/tools/create-spec/auto-pipeline.js +13 -1
- package/dist/tools/create-spec/autopilot-analyzer.d.ts +1 -1
- package/dist/tools/create-spec/autopilot-analyzer.js +2 -4
- package/dist/tools/create-spec/mcp-tool-contract.d.ts +10 -4
- package/dist/tools/create-spec/mcp-tool-contract.js +7 -36
- package/dist/tools/create-spec/post-creation.d.ts +2 -1
- package/dist/tools/create-spec/post-creation.js +56 -54
- package/dist/tools/create-spec/relevance-scorer.d.ts +1 -1
- package/dist/tools/create-spec/relevance-scorer.js +17 -1
- package/dist/tools/create-spec/spec-builder.js +2 -12
- package/dist/tools/create-spec/spec-created-outbox-consumer.d.ts +14 -0
- package/dist/tools/create-spec/spec-created-outbox-consumer.js +176 -0
- package/dist/tools/create-spec.js +385 -520
- package/dist/tools/define-ui-contract/agent-interaction-contract.js +2 -4
- package/dist/tools/define-ui-contract-desktop/desktop-contract.js +12 -4
- package/dist/tools/define-ui-contract-desktop/native-contract.js +7 -3
- package/dist/tools/define-ui-contract-extensions.js +2 -3
- package/dist/tools/define-ui-contract-mobile.js +5 -9
- package/dist/tools/define-ui-contract-web/component-tree.js +4 -3
- package/dist/tools/define-ui-contract.js +7 -4
- package/dist/tools/deploy/deploy-spec.js +2 -4
- package/dist/tools/deploy/deploy-status.js +2 -4
- package/dist/tools/design-schema/nosql-category-schemas.js +2 -3
- package/dist/tools/design-schema-sql/migrations.js +3 -2
- package/dist/tools/design-schema-sql/tables.js +4 -1
- package/dist/tools/design-schema.js +4 -3
- package/dist/tools/feedback-handler.js +2 -4
- package/dist/tools/gc-data-projects.js +5 -5
- package/dist/tools/generate-execution-plan.js +3 -4
- package/dist/tools/generate-sub-agent.js +2 -1
- package/dist/tools/generate-tests/generators/a11y-tests-generator.js +5 -4
- package/dist/tools/generate-tests/generators/advanced-testing-generator.js +5 -4
- package/dist/tools/generate-tests/generators/concurrency-test-generator/js-templates.js +9 -4
- package/dist/tools/generate-tests/generators/concurrency-test-generator.js +8 -4
- package/dist/tools/generate-tests/generators/database/detectors.js +9 -3
- package/dist/tools/generate-tests/generators/database/index.js +2 -4
- package/dist/tools/generate-tests/generators/event-test-generator.js +5 -4
- package/dist/tools/generate-tests/generators/game-tests-generator.js +2 -1
- package/dist/tools/generate-tests/generators/graphql-test-generator.js +11 -5
- package/dist/tools/generate-tests/generators/grpc-test-generator.js +2 -3
- package/dist/tools/generate-tests/generators/llm-security-test-generator.js +4 -3
- package/dist/tools/generate-tests/generators/local-first-test-generator.js +4 -3
- package/dist/tools/generate-tests/generators/mcp-tests-generator.js +11 -9
- package/dist/tools/generate-tests/generators/microservices/index.js +2 -3
- package/dist/tools/generate-tests/generators/otel-test-generator.js +6 -3
- package/dist/tools/generate-tests/generators/security/detectors.js +2 -5
- package/dist/tools/generate-tests/generators/security/index.js +2 -4
- package/dist/tools/generate-tests/generators/supply-chain-test-generator.js +2 -3
- package/dist/tools/generate-tests/generators/visual-regression-generator.js +14 -17
- package/dist/tools/generate-tests/generators/websocket-test-generator.js +2 -3
- package/dist/tools/generate-tests/test-helpers.js +11 -12
- package/dist/tools/generate-tests-content.js +4 -3
- package/dist/tools/generate-tests.js +7 -4
- package/dist/tools/git/git-helpers.d.ts +0 -2
- package/dist/tools/git/git-helpers.js +7 -7
- package/dist/tools/github-pr-handler.js +10 -3
- package/dist/tools/heal-spec-docs.js +6 -53
- package/dist/tools/hook-generator-handler.js +6 -6
- package/dist/tools/init-constitution/platform-principles.js +4 -2
- package/dist/tools/init-project/agents-md-writer.js +14 -5
- package/dist/tools/init-project/claude-md-generator.js +19 -12
- package/dist/tools/init-project/handler.js +165 -73
- package/dist/tools/init-project/host-assets-writer.d.ts +1 -1
- package/dist/tools/init-project/host-assets-writer.js +4 -2
- package/dist/tools/init-project/lifecycle-helpers.js +3 -5
- package/dist/tools/init-project/lint-scaffolder.js +6 -2
- package/dist/tools/init-project/migration-runner.d.ts +10 -1
- package/dist/tools/init-project/migration-runner.js +68 -3
- package/dist/tools/init-project/per-client-files-writer.js +14 -4
- package/dist/tools/init-project/rules-generator.js +10 -2
- package/dist/tools/init-project/scaffold-writer.d.ts +1 -1
- package/dist/tools/init-project/scaffold-writer.js +17 -15
- package/dist/tools/jobs/handlers.d.ts +15 -0
- package/dist/tools/jobs/handlers.js +126 -0
- package/dist/tools/list-specs.js +35 -34
- package/dist/tools/manage-plugins-handler.js +17 -9
- package/dist/tools/migrate-tech/advanced-handlers.js +3 -2
- package/dist/tools/migrate-tech/build-tool-handlers.js +3 -2
- package/dist/tools/migrate-tech/core-handlers.js +5 -2
- package/dist/tools/migrate-tech/data-handlers.js +6 -3
- package/dist/tools/migrate-tech-advanced/rollback-handlers.js +3 -2
- package/dist/tools/migrate-tech-advanced/service-handlers.js +5 -2
- package/dist/tools/oauth-handler.js +7 -1
- package/dist/tools/register-sdd-tools.d.ts +1 -1
- package/dist/tools/register-sdd-tools.js +5 -0
- package/dist/tools/register-spec-tools/core-spec-tools.js +31 -0
- package/dist/tools/registry/auth.js +13 -5
- package/dist/tools/registry/publish.js +7 -4
- package/dist/tools/resolve-project-path.d.ts +2 -2
- package/dist/tools/resolve-project-path.js +7 -7
- package/dist/tools/reverse-engineer/analyzer.js +14 -14
- package/dist/tools/rollback-release.js +3 -2
- package/dist/tools/safe-handler.js +295 -171
- package/dist/tools/schema-generator-handler.js +2 -1
- package/dist/tools/schemas/output-schemas.d.ts +88 -82
- package/dist/tools/schemas/output-schemas.js +12 -94
- package/dist/tools/schemas/plugins-schemas.js +0 -2
- package/dist/tools/schemas/registry.js +0 -2
- package/dist/tools/schemas/skill-registry-schemas.js +0 -2
- package/dist/tools/schemas/validate-output-schema.d.ts +256 -0
- package/dist/tools/schemas/validate-output-schema.js +212 -0
- package/dist/tools/sentry-handler.js +6 -1
- package/dist/tools/skill-bootstrap-handler.js +7 -4
- package/dist/tools/status-handler.js +4 -0
- package/dist/tools/storage-bundle-handler.d.ts +9 -0
- package/dist/tools/storage-bundle-handler.js +29 -0
- package/dist/tools/storage-paths-handler.d.ts +9 -0
- package/dist/tools/storage-paths-handler.js +17 -0
- package/dist/tools/suggest-mcp-server.js +11 -5
- package/dist/tools/suggest-mcps.js +29 -9
- package/dist/tools/suggest-tooling/advanced-testing-catalog.js +4 -5
- package/dist/tools/suggest-tooling/build-tool-catalog.js +2 -1
- package/dist/tools/suggest-tooling/css-framework-catalog.js +13 -7
- package/dist/tools/suggest-tooling/framework-catalog.js +3 -5
- package/dist/tools/suggest-tooling/frontend-perf-catalog.js +2 -6
- package/dist/tools/suggest-tooling/handler.js +10 -4
- package/dist/tools/suggest-tooling/hypermedia-catalog.js +11 -3
- package/dist/tools/suggest-tooling/linting-catalog.js +4 -7
- package/dist/tools/suggest-tooling/llm-security-catalog.js +2 -1
- package/dist/tools/suggest-tooling/local-first-catalog.js +7 -5
- package/dist/tools/suggest-tooling/observability-catalog.js +3 -4
- package/dist/tools/suggest-tooling/otel-catalog.js +4 -1
- package/dist/tools/suggest-tooling/resilience-catalog.js +16 -5
- package/dist/tools/suggest-tooling/skills-catalog.js +10 -9
- package/dist/tools/suggest-tooling/supply-chain-catalog.js +2 -3
- package/dist/tools/supabase-handler.js +2 -1
- package/dist/tools/token-intelligence-handler.js +2 -2
- package/dist/tools/token-recording.js +2 -2
- package/dist/tools/token-savings-handler.js +2 -2
- package/dist/tools/tool-registry/core-tools.js +131 -0
- package/dist/tools/tool-registry/group-infra.js +10 -12
- package/dist/tools/tool-registry/group-quality-compliance.js +5 -12
- package/dist/tools/update-status/approval-gates.d.ts +13 -0
- package/dist/tools/update-status/approval-gates.js +81 -0
- package/dist/tools/update-status/batch.js +4 -2
- package/dist/tools/update-status/dod-gates.d.ts +6 -24
- package/dist/tools/update-status/dod-gates.js +60 -135
- package/dist/tools/update-status/done-receipt-verifier.d.ts +15 -0
- package/dist/tools/update-status/done-receipt-verifier.js +145 -0
- package/dist/tools/update-status/evidence-gate.js +154 -2
- package/dist/tools/update-status/file-sync.js +23 -12
- package/dist/tools/update-status/gate-harness.d.ts +7 -0
- package/dist/tools/update-status/gate-harness.js +8 -0
- package/dist/tools/update-status/index.js +228 -325
- package/dist/tools/update-status/qa-gate.d.ts +1 -1
- package/dist/tools/update-status/qa-gate.js +2 -2
- package/dist/tools/update-status/side-effects.js +30 -37
- package/dist/tools/update-status/transition-guard.d.ts +4 -2
- package/dist/tools/update-status/transition-guard.js +57 -10
- package/dist/tools/update-status-convention-gate.js +24 -23
- package/dist/tools/update-status-reconcile.js +2 -2
- package/dist/tools/validate-api-contract-handler.js +3 -3
- package/dist/tools/validate-lint.js +20 -13
- package/dist/tools/validate.d.ts +3 -1
- package/dist/tools/validate.js +213 -5
- package/dist/transports/http-transport.js +84 -61
- package/dist/transports/middleware/with-telemetry.js +3 -2
- package/dist/types/abortable-process.d.ts +2 -0
- package/dist/types/advanced-framework.js +0 -2
- package/dist/types/atomic-upgrade.d.ts +71 -0
- package/dist/types/atomic-upgrade.js +2 -0
- package/dist/types/ci.js +0 -2
- package/dist/types/core-bridge.d.ts +78 -1
- package/dist/types/crash-shield-framework-rules.d.ts +24 -0
- package/dist/types/crash-shield-framework-rules.js +2 -0
- package/dist/types/data-gc.d.ts +16 -0
- package/dist/types/deploy.js +0 -2
- package/dist/types/durable-job.d.ts +78 -0
- package/dist/types/durable-job.js +2 -0
- package/dist/types/durable-validation.d.ts +60 -0
- package/dist/types/durable-validation.js +2 -0
- package/dist/types/estimation.d.ts +2 -0
- package/dist/types/evidence-gates.d.ts +9 -1
- package/dist/types/execution.d.ts +43 -0
- package/dist/types/handoff-artifacts.d.ts +2 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.js +2 -0
- package/dist/types/infrastructure.js +0 -2
- package/dist/types/lifecycle.js +0 -2
- package/dist/types/migration/canonical-storage.d.ts +37 -0
- package/dist/types/migration/canonical-storage.js +2 -0
- package/dist/types/migration/index.d.ts +1 -1
- package/dist/types/native-worker.d.ts +48 -0
- package/dist/types/native-worker.js +2 -0
- package/dist/types/network-policy.d.ts +12 -0
- package/dist/types/network-policy.js +2 -0
- package/dist/types/oauth.js +0 -2
- package/dist/types/observability.d.ts +32 -0
- package/dist/types/outbox-worker.d.ts +35 -0
- package/dist/types/outbox-worker.js +11 -0
- package/dist/types/permissions-config.d.ts +0 -27
- package/dist/types/permissions-config.js +0 -2
- package/dist/types/plugin-install.d.ts +0 -11
- package/dist/types/plugin-install.js +0 -2
- package/dist/types/portal.d.ts +1 -0
- package/dist/types/product-public.d.ts +75 -0
- package/dist/types/product-public.js +2 -0
- package/dist/types/project/inputs.d.ts +2 -0
- package/dist/types/project/mfe-detection.js +0 -2
- package/dist/types/project/platform-mobile.js +0 -2
- package/dist/types/project/platform-specialty.js +0 -2
- package/dist/types/project-knowledge-graph.d.ts +7 -0
- package/dist/types/runtime-database.d.ts +10 -0
- package/dist/types/runtime-database.js +2 -0
- package/dist/types/runtime-policy.d.ts +40 -0
- package/dist/types/runtime-policy.js +2 -0
- package/dist/types/safety.d.ts +4 -5
- package/dist/types/schema-registry.d.ts +12 -0
- package/dist/types/schema-registry.js +2 -0
- package/dist/types/security.d.ts +52 -0
- package/dist/types/skill-registry.js +0 -2
- package/dist/types/spec/inputs.d.ts +2 -0
- package/dist/types/spec-lock-v2.d.ts +13 -7
- package/dist/types/spec-lock-v2.js +1 -1
- package/dist/types/spec-registry.js +0 -2
- package/dist/types/storage-bundle.d.ts +13 -0
- package/dist/types/storage-bundle.js +2 -0
- package/dist/types/storage-catalog.d.ts +18 -0
- package/dist/types/storage-catalog.js +2 -0
- package/dist/types/team-planner.js +0 -2
- package/dist/types/technology-registry.d.ts +35 -0
- package/dist/types/technology-registry.js +2 -0
- package/dist/types/technology-symbols.generated.d.ts +117 -0
- package/dist/types/technology-symbols.generated.js +2 -0
- package/dist/types/telemetry.d.ts +3 -3
- package/dist/types/transport.d.ts +2 -0
- package/dist/types/validate-worker.d.ts +44 -0
- package/dist/types/validate-worker.js +2 -0
- package/dist/types/validation-evidence.d.ts +1 -1
- package/dist/types/validation-receipt.d.ts +104 -0
- package/dist/types/validation-receipt.js +2 -0
- package/package.json +31 -20
- package/planu-native.json +1 -1
- package/planu-plugin.json +1 -1
- package/dist/engine/telemetry/geo-resolver.d.ts +0 -9
- package/dist/engine/telemetry/geo-resolver.js +0 -43
- package/dist/storage/data-dir-discovery.d.ts +0 -31
- package/dist/storage/data-dir-discovery.js +0 -140
- package/dist/storage/migrations/cwd-to-absolute.d.ts +0 -25
- package/dist/storage/migrations/cwd-to-absolute.js +0 -281
- package/dist/tools/create-spec/adapters/prior-decisions-hint.d.ts +0 -14
- package/dist/tools/create-spec/adapters/prior-decisions-hint.js +0 -30
- package/dist/tools/init-project/ancestor-data-detector.d.ts +0 -22
- package/dist/tools/init-project/ancestor-data-detector.js +0 -81
- package/dist/tools/update-status/force-done-audit.d.ts +0 -2
- package/dist/tools/update-status/force-done-audit.js +0 -23
- package/dist/types/migration/cwd-to-absolute.d.ts +0 -8
- package/dist/types/migration/cwd-to-absolute.js +0 -3
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// tools/safe-handler.ts — Generic error-boundary wrapper for MCP tool handlers.
|
|
2
2
|
// Catches any unhandled error and returns a graceful MCP error response
|
|
3
|
-
// instead of crashing the server. Includes execution
|
|
3
|
+
// instead of crashing the server. Includes cancellation-aware execution deadlines.
|
|
4
4
|
import { withLicenseGate, withUsageTracking } from './license-gate.js';
|
|
5
5
|
import { isTrialActive } from '../engine/trial-engine.js';
|
|
6
6
|
import { sanitizePath } from './sanitize-path.js';
|
|
@@ -8,13 +8,12 @@ import { ensureHooksStarted } from './start-hooks.js';
|
|
|
8
8
|
import { ensureWorkersStarted } from '../engine/workers/index.js';
|
|
9
9
|
import { recordError } from '../storage/error-telemetry-store.js';
|
|
10
10
|
import { hashProjectPath } from '../storage/base-store.js';
|
|
11
|
-
import { reportToolError, reportToolValidationError
|
|
11
|
+
import { reportToolError, reportToolValidationError } from '../engine/telemetry/error-reporter.js';
|
|
12
12
|
import { sendTelemetryEvent } from '../engine/telemetry/telemetry-client.js';
|
|
13
13
|
import { PLANU_VERSION } from '../config/version.js';
|
|
14
14
|
import { recordToolTokens, extractOutputText } from './token-recording.js';
|
|
15
15
|
import { DriftCacheStore } from '../storage/drift-cache-store.js';
|
|
16
16
|
import { consumeUpdateBanner } from '../engine/update-notifier.js';
|
|
17
|
-
import { getOrCreateInstallationId } from '../engine/telemetry/telemetry-store.js';
|
|
18
17
|
import { compressToolOutput } from './output-compressor.js';
|
|
19
18
|
import { recordToolTokens as recordLlmTokens } from '../engine/llm-runtime/index.js';
|
|
20
19
|
import { guardToolResultOutput } from './output-integrity-guard.js';
|
|
@@ -26,7 +25,7 @@ import { checkBudgetEnforcement } from '../engine/cost-guardrails.js';
|
|
|
26
25
|
import { existsSync } from 'node:fs';
|
|
27
26
|
import { join } from 'node:path';
|
|
28
27
|
import { maybeWriteCheckpoint } from '../engine/session/checkpoint-writer.js';
|
|
29
|
-
import {
|
|
28
|
+
import { createChildCancellationScope, createExecutionScope, ExecutionCancelledError, getExecutionSignal, } from '../engine/execution/context.js';
|
|
30
29
|
// SPEC-922: Compact response auto-on
|
|
31
30
|
import { parseContextHeader } from '../engine/compact/header-parser.js';
|
|
32
31
|
import { evaluateCompactMode } from '../engine/compact/threshold-evaluator.js';
|
|
@@ -34,6 +33,13 @@ import { loadCompactThresholds } from '../engine/compact/registry-loader.js';
|
|
|
34
33
|
import { applyCompactMode } from '../engine/compact/compact-middleware.js';
|
|
35
34
|
import { globalCompactStateStore } from '../engine/compact/state-store.js';
|
|
36
35
|
import { recordCompactDecision, recordVerboseDecision, recordNoHeader, } from '../engine/compact/metrics.js';
|
|
36
|
+
import { getSessionContext } from '../transports/session-context.js';
|
|
37
|
+
import { LocalExecutionSpan } from '../engine/observability/local-execution-spans.js';
|
|
38
|
+
import { classifyBoundaryFailure } from '../errors/error-taxonomy.js';
|
|
39
|
+
import { boundedEnvironmentDuration, getRuntimePolicy } from '../engine/runtime-policy.js';
|
|
40
|
+
function reportOptionalDegradation(component, error) {
|
|
41
|
+
console.warn(classifyBoundaryFailure(error, component, 'The primary operation completed; inspect local diagnostics before relying on this optional output.').message);
|
|
42
|
+
}
|
|
37
43
|
// ---------------------------------------------------------------------------
|
|
38
44
|
// Project initialization state — read-only check, zero file writes
|
|
39
45
|
// ---------------------------------------------------------------------------
|
|
@@ -87,36 +93,41 @@ function getDriftBannerThreshold() {
|
|
|
87
93
|
}
|
|
88
94
|
/**
|
|
89
95
|
* Checks for pending drift cache entries for a project.
|
|
90
|
-
* Returns
|
|
91
|
-
*
|
|
92
|
-
* Marks all pending entries as shown (fire-and-forget).
|
|
96
|
+
* Returns the banner and a deferred acknowledgement effect. The caller invokes
|
|
97
|
+
* that effect only after every awaited postprocessing step has completed.
|
|
93
98
|
*/
|
|
94
|
-
async function checkPendingDriftBanner(projectPath) {
|
|
99
|
+
async function checkPendingDriftBanner(projectPath, signal) {
|
|
100
|
+
const noBanner = { banner: null, acknowledge: () => undefined };
|
|
95
101
|
if (process.env.PLANU_AUTO_DRIFT === 'false') {
|
|
96
|
-
return
|
|
102
|
+
return noBanner;
|
|
97
103
|
}
|
|
98
104
|
try {
|
|
105
|
+
signal.throwIfAborted();
|
|
99
106
|
const projectId = hashProjectPath(projectPath);
|
|
100
107
|
const store = new DriftCacheStore(projectId);
|
|
101
108
|
const threshold = getDriftBannerThreshold();
|
|
102
109
|
const pending = await store.getPendingBanners(threshold);
|
|
110
|
+
signal.throwIfAborted();
|
|
103
111
|
if (pending.length === 0) {
|
|
104
|
-
return
|
|
112
|
+
return noBanner;
|
|
105
113
|
}
|
|
106
|
-
// Mark as shown — fire-and-forget
|
|
107
|
-
/* v8 ignore start */
|
|
108
|
-
store.markAllShown().catch((err) => {
|
|
109
|
-
console.error('[Planu] Failed to mark drift banners as shown:', err);
|
|
110
|
-
});
|
|
111
|
-
/* v8 ignore stop */
|
|
112
114
|
const specIds = pending.map((e) => e.specId).join(', ');
|
|
113
115
|
const maxScore = Math.max(...pending.map((e) => e.driftScore));
|
|
114
|
-
return
|
|
115
|
-
|
|
116
|
+
return {
|
|
117
|
+
banner: `\n⚠️ Auto-drift alert: specs [${specIds}] may have drifted ` +
|
|
118
|
+
`(score: ${maxScore.toFixed(2)}). Run detect_drift to review.`,
|
|
119
|
+
acknowledge: () => {
|
|
120
|
+
/* v8 ignore start */
|
|
121
|
+
void store.markAllShown().catch((err) => {
|
|
122
|
+
reportOptionalDegradation('drift banner acknowledgement', err);
|
|
123
|
+
});
|
|
124
|
+
/* v8 ignore stop */
|
|
125
|
+
},
|
|
126
|
+
};
|
|
116
127
|
}
|
|
117
128
|
catch {
|
|
118
129
|
// Never block a tool call due to drift cache errors
|
|
119
|
-
return
|
|
130
|
+
return noBanner;
|
|
120
131
|
}
|
|
121
132
|
}
|
|
122
133
|
/**
|
|
@@ -165,18 +176,15 @@ function sanitizeArgs(args, toolName) {
|
|
|
165
176
|
}
|
|
166
177
|
return obj;
|
|
167
178
|
}
|
|
168
|
-
/** Keep the server deadline below the common 60s client deadline. */
|
|
169
|
-
const DEFAULT_TIMEOUT_MS = 55_000;
|
|
170
|
-
const toolAbortContext = new AsyncLocalStorage();
|
|
171
179
|
const activeToolControllers = new Set();
|
|
172
180
|
/** Signal for the currently executing tool, including server deadline and client cancellation. */
|
|
173
181
|
export function getToolExecutionSignal() {
|
|
174
|
-
return
|
|
182
|
+
return getExecutionSignal();
|
|
175
183
|
}
|
|
176
184
|
/** Abort every in-flight tool before stdio shutdown closes the transport. */
|
|
177
185
|
export function abortActiveToolExecutions(reason = 'MCP transport closed') {
|
|
178
186
|
for (const controller of activeToolControllers) {
|
|
179
|
-
controller.abort(new
|
|
187
|
+
controller.abort(new ExecutionCancelledError(reason));
|
|
180
188
|
}
|
|
181
189
|
}
|
|
182
190
|
/**
|
|
@@ -185,23 +193,80 @@ export function abortActiveToolExecutions(reason = 'MCP transport closed') {
|
|
|
185
193
|
*/
|
|
186
194
|
const SESSION_ID = `SES-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
187
195
|
function getTimeoutMs() {
|
|
188
|
-
|
|
189
|
-
if (envVal === undefined || envVal === '') {
|
|
190
|
-
return DEFAULT_TIMEOUT_MS;
|
|
191
|
-
}
|
|
192
|
-
const parsed = Number(envVal);
|
|
193
|
-
return Number.isFinite(parsed) && parsed > 0 ? parsed : DEFAULT_TIMEOUT_MS;
|
|
196
|
+
return boundedEnvironmentDuration('PLANU_TOOL_TIMEOUT_MS', getRuntimePolicy().toolExecution);
|
|
194
197
|
}
|
|
195
198
|
/**
|
|
196
199
|
* Races a handler promise against a timeout. Returns a timeout error ToolResult
|
|
197
200
|
* if the handler exceeds the configured duration.
|
|
198
201
|
*/
|
|
199
|
-
|
|
200
|
-
|
|
202
|
+
function deadlineSafetyMargin(ms) {
|
|
203
|
+
const policy = getRuntimePolicy().toolExecution;
|
|
204
|
+
return Math.min(policy.safetyMarginMaximumMs, Math.max(policy.minimumTimeoutMs, Math.floor(ms * policy.safetyMarginRatio)));
|
|
205
|
+
}
|
|
206
|
+
function executionMeasurements(value) {
|
|
207
|
+
let serialized;
|
|
208
|
+
try {
|
|
209
|
+
serialized = JSON.stringify(value);
|
|
210
|
+
}
|
|
211
|
+
catch {
|
|
212
|
+
serialized = '';
|
|
213
|
+
}
|
|
214
|
+
const files = value !== null && typeof value === 'object'
|
|
215
|
+
? Object.entries(value).filter(([key, entry]) => /(?:file|path)s?$/iu.test(key) && entry !== undefined).length
|
|
216
|
+
: 0;
|
|
217
|
+
return {
|
|
218
|
+
lockWaitMs: 0,
|
|
219
|
+
files,
|
|
220
|
+
bytes: Buffer.byteLength(serialized),
|
|
221
|
+
subprocess: false,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
function commitState(phase) {
|
|
225
|
+
return phase === 'committed' || phase === 'acknowledged' ? phase : 'pre-commit';
|
|
226
|
+
}
|
|
227
|
+
function requestIdentity(extra) {
|
|
228
|
+
if (extra === null || typeof extra !== 'object') {
|
|
229
|
+
return {};
|
|
230
|
+
}
|
|
231
|
+
const record = extra;
|
|
232
|
+
return {
|
|
233
|
+
...(typeof record.requestId === 'string' && record.requestId.trim() !== ''
|
|
234
|
+
? { requestId: record.requestId }
|
|
235
|
+
: {}),
|
|
236
|
+
...(typeof record.idempotencyKey === 'string' && record.idempotencyKey.trim() !== ''
|
|
237
|
+
? { idempotencyKey: record.idempotencyKey }
|
|
238
|
+
: {}),
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
function requestAbortSignal(extra) {
|
|
242
|
+
const sdkSignal = extra !== null &&
|
|
243
|
+
typeof extra === 'object' &&
|
|
244
|
+
extra.signal instanceof AbortSignal
|
|
245
|
+
? extra.signal
|
|
246
|
+
: undefined;
|
|
247
|
+
const transportSignal = getSessionContext()?.signal;
|
|
248
|
+
if (sdkSignal && transportSignal) {
|
|
249
|
+
return AbortSignal.any([sdkSignal, transportSignal]);
|
|
250
|
+
}
|
|
251
|
+
return sdkSignal ?? transportSignal;
|
|
252
|
+
}
|
|
253
|
+
async function withTimeout(fn, ms, upstreamSignal, identity = {}, operation = 'tool', measurements = {
|
|
254
|
+
lockWaitMs: 0,
|
|
255
|
+
files: 0,
|
|
256
|
+
bytes: 0,
|
|
257
|
+
subprocess: false,
|
|
258
|
+
}) {
|
|
201
259
|
const controller = new AbortController();
|
|
260
|
+
const deadlineAt = Date.now() + ms;
|
|
261
|
+
const responseTimeoutMs = Math.max(0, ms - deadlineSafetyMargin(ms));
|
|
202
262
|
activeToolControllers.add(controller);
|
|
203
263
|
const abortFromUpstream = () => {
|
|
204
|
-
|
|
264
|
+
const reason = upstreamSignal?.reason;
|
|
265
|
+
controller.abort(new ExecutionCancelledError(reason instanceof Error
|
|
266
|
+
? reason.message
|
|
267
|
+
: typeof reason === 'string'
|
|
268
|
+
? reason
|
|
269
|
+
: 'Tool request aborted'));
|
|
205
270
|
};
|
|
206
271
|
if (upstreamSignal?.aborted === true) {
|
|
207
272
|
abortFromUpstream();
|
|
@@ -209,42 +274,74 @@ async function withTimeout(fn, ms, upstreamSignal) {
|
|
|
209
274
|
else {
|
|
210
275
|
upstreamSignal?.addEventListener('abort', abortFromUpstream, { once: true });
|
|
211
276
|
}
|
|
212
|
-
const
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
277
|
+
const scope = createExecutionScope({
|
|
278
|
+
deadlineAt,
|
|
279
|
+
upstreamSignal: controller.signal,
|
|
280
|
+
...identity,
|
|
281
|
+
});
|
|
282
|
+
const localSpan = new LocalExecutionSpan({
|
|
283
|
+
requestId: scope.context.requestId,
|
|
284
|
+
operationId: identity.idempotencyKey ?? scope.context.requestId,
|
|
285
|
+
operation,
|
|
286
|
+
deadlineAt,
|
|
287
|
+
...measurements,
|
|
288
|
+
});
|
|
289
|
+
const handlerPromise = scope.run(() => fn(scope.context.signal));
|
|
290
|
+
// Keep an explicit terminal observer because the response path intentionally
|
|
291
|
+
// never awaits abandoned work.
|
|
292
|
+
void handlerPromise.then(() => {
|
|
293
|
+
localSpan.complete(scope.context.phase, commitState(scope.context.phase));
|
|
294
|
+
}, () => {
|
|
295
|
+
localSpan.complete(scope.context.phase, commitState(scope.context.phase));
|
|
218
296
|
});
|
|
219
|
-
const
|
|
297
|
+
const responsePromise = new Promise((resolve, reject) => {
|
|
298
|
+
let settled = false;
|
|
220
299
|
const rejectAbort = () => {
|
|
300
|
+
if (settled) {
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
settled = true;
|
|
221
304
|
const reason = controller.signal.reason;
|
|
222
|
-
|
|
305
|
+
reject(reason instanceof Error
|
|
223
306
|
? reason
|
|
224
|
-
: new Error(typeof reason === 'string' ? reason : 'Tool request aborted');
|
|
225
|
-
reject(error);
|
|
307
|
+
: new Error(typeof reason === 'string' ? reason : 'Tool request aborted'));
|
|
226
308
|
};
|
|
309
|
+
controller.signal.addEventListener('abort', rejectAbort, { once: true });
|
|
310
|
+
handlerPromise.then((value) => {
|
|
311
|
+
if (!settled) {
|
|
312
|
+
settled = true;
|
|
313
|
+
controller.signal.removeEventListener('abort', rejectAbort);
|
|
314
|
+
resolve(value);
|
|
315
|
+
}
|
|
316
|
+
}, (error) => {
|
|
317
|
+
if (!settled) {
|
|
318
|
+
settled = true;
|
|
319
|
+
controller.signal.removeEventListener('abort', rejectAbort);
|
|
320
|
+
reject(error instanceof Error ? error : new Error(String(error)));
|
|
321
|
+
}
|
|
322
|
+
});
|
|
227
323
|
if (controller.signal.aborted) {
|
|
228
324
|
rejectAbort();
|
|
229
325
|
}
|
|
230
|
-
else {
|
|
231
|
-
controller.signal.addEventListener('abort', rejectAbort, { once: true });
|
|
232
|
-
}
|
|
233
326
|
});
|
|
234
|
-
const
|
|
327
|
+
const timer = setTimeout(() => {
|
|
328
|
+
localSpan.timeout(scope.context.phase, commitState(scope.context.phase));
|
|
329
|
+
const error = new ExecutionCancelledError(`Tool execution timed out after ${ms}ms`);
|
|
330
|
+
controller.abort(error);
|
|
331
|
+
scope.cancel(error);
|
|
332
|
+
}, responseTimeoutMs);
|
|
235
333
|
try {
|
|
236
|
-
return await
|
|
237
|
-
}
|
|
238
|
-
catch (error) {
|
|
239
|
-
if (controller.signal.aborted) {
|
|
240
|
-
await handlerPromise.then(() => undefined, () => undefined);
|
|
241
|
-
}
|
|
242
|
-
throw error;
|
|
334
|
+
return await responsePromise;
|
|
243
335
|
}
|
|
244
336
|
finally {
|
|
337
|
+
scope.acknowledge();
|
|
338
|
+
scope.dispose();
|
|
245
339
|
clearTimeout(timer);
|
|
246
340
|
upstreamSignal?.removeEventListener('abort', abortFromUpstream);
|
|
247
341
|
activeToolControllers.delete(controller);
|
|
342
|
+
if (!localSpan.didTimeout) {
|
|
343
|
+
localSpan.complete(scope.context.phase, commitState(scope.context.phase));
|
|
344
|
+
}
|
|
248
345
|
}
|
|
249
346
|
}
|
|
250
347
|
/**
|
|
@@ -257,18 +354,34 @@ async function withTimeout(fn, ms, upstreamSignal) {
|
|
|
257
354
|
* @param fallback - Value returned when the timeout fires
|
|
258
355
|
*/
|
|
259
356
|
export function withToolTimeout(p, ms, fallback) {
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
357
|
+
const scope = createChildCancellationScope(ms);
|
|
358
|
+
return new Promise((resolve, reject) => {
|
|
359
|
+
let settled = false;
|
|
360
|
+
const finish = (value) => {
|
|
361
|
+
if (!settled) {
|
|
362
|
+
settled = true;
|
|
363
|
+
scope.signal.removeEventListener('abort', onAbort);
|
|
364
|
+
scope.dispose();
|
|
365
|
+
resolve(value);
|
|
366
|
+
}
|
|
367
|
+
};
|
|
368
|
+
const fail = (error) => {
|
|
369
|
+
if (!settled) {
|
|
370
|
+
settled = true;
|
|
371
|
+
scope.signal.removeEventListener('abort', onAbort);
|
|
372
|
+
scope.dispose();
|
|
373
|
+
reject(error instanceof Error ? error : new Error(String(error)));
|
|
374
|
+
}
|
|
375
|
+
};
|
|
376
|
+
const onAbort = () => {
|
|
377
|
+
finish(fallback);
|
|
378
|
+
};
|
|
379
|
+
scope.signal.addEventListener('abort', onAbort, { once: true });
|
|
380
|
+
p.then(finish, fail);
|
|
381
|
+
if (scope.signal.aborted) {
|
|
382
|
+
onAbort();
|
|
383
|
+
}
|
|
265
384
|
});
|
|
266
|
-
return Promise.race([
|
|
267
|
-
p.finally(() => {
|
|
268
|
-
clearTimeout(t);
|
|
269
|
-
}),
|
|
270
|
-
timeout,
|
|
271
|
-
]);
|
|
272
385
|
}
|
|
273
386
|
/**
|
|
274
387
|
* Wraps a tool handler so that any unhandled error is caught and returned as a
|
|
@@ -312,61 +425,95 @@ function safeWithTelemetry(toolName, handler) {
|
|
|
312
425
|
recordVerboseDecision();
|
|
313
426
|
}
|
|
314
427
|
try {
|
|
315
|
-
const upstreamSignal = extra
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
428
|
+
const upstreamSignal = requestAbortSignal(extra);
|
|
429
|
+
const guardedResult = await withTimeout(async (signal) => {
|
|
430
|
+
const rawResult = (await handler(safeArgs, {
|
|
431
|
+
...(extra && typeof extra === 'object' ? extra : {}),
|
|
432
|
+
signal,
|
|
433
|
+
}));
|
|
434
|
+
signal.throwIfAborted();
|
|
435
|
+
// Defensive guard: belt-and-suspenders alongside withUsageTracking guard and noImplicitReturns.
|
|
436
|
+
const result = rawResult ?? {
|
|
437
|
+
content: [{ type: 'text', text: 'Internal error: tool handler returned no result' }],
|
|
438
|
+
isError: true,
|
|
439
|
+
};
|
|
440
|
+
// SPEC-455: Compress verbose JSON outputs to save LLM tokens
|
|
441
|
+
const compressed = compressToolOutput(result);
|
|
442
|
+
// SPEC-922: Apply compact mode middleware
|
|
443
|
+
const compacted = applyCompactMode(compressed, decision, {
|
|
444
|
+
projectPath,
|
|
445
|
+
flow: toolName,
|
|
446
|
+
});
|
|
447
|
+
// Postprocessing remains inside the request cancellation tree. In
|
|
448
|
+
// particular, a disconnect while reading drift state cannot start
|
|
449
|
+
// the shown-marker, token, audit or checkpoint effects afterwards.
|
|
450
|
+
const driftBanner = projectPath !== undefined
|
|
451
|
+
? await checkPendingDriftBanner(projectPath, signal)
|
|
452
|
+
: { banner: null, acknowledge: () => undefined };
|
|
453
|
+
signal.throwIfAborted();
|
|
454
|
+
const withDrift = injectDriftBanner(compacted, driftBanner.banner);
|
|
455
|
+
const updateBanner = consumeUpdateBanner();
|
|
456
|
+
const finalResult = updateBanner !== null && withDrift.isError !== true
|
|
457
|
+
? {
|
|
458
|
+
...withDrift,
|
|
459
|
+
content: [...withDrift.content, { type: 'text', text: updateBanner }],
|
|
460
|
+
}
|
|
461
|
+
: withDrift;
|
|
462
|
+
const processedResult = guardToolResultOutput(toolName, finalResult);
|
|
463
|
+
signal.throwIfAborted();
|
|
464
|
+
let appendAudit;
|
|
465
|
+
/* v8 ignore start */
|
|
466
|
+
if (toolName !== undefined) {
|
|
467
|
+
try {
|
|
468
|
+
const [{ appendEntry, getLastHash }, { buildAuditEntry }, { hashEntry }] = await Promise.all([
|
|
469
|
+
import('../storage/audit-trail-store.js'),
|
|
470
|
+
import('../engine/audit-trail/formatter.js'),
|
|
471
|
+
import('../engine/audit-trail/hasher.js'),
|
|
472
|
+
]);
|
|
473
|
+
signal.throwIfAborted();
|
|
474
|
+
appendAudit = () => {
|
|
475
|
+
const prevHash = getLastHash();
|
|
476
|
+
const partial = buildAuditEntry({
|
|
477
|
+
toolName,
|
|
478
|
+
args,
|
|
479
|
+
outputType: processedResult.isError === true ? 'error' : 'success',
|
|
480
|
+
durationMs: Date.now() - startTime,
|
|
481
|
+
prevHash,
|
|
482
|
+
});
|
|
483
|
+
appendEntry({ ...partial, hash: hashEntry(partial) });
|
|
484
|
+
};
|
|
485
|
+
}
|
|
486
|
+
catch (error) {
|
|
487
|
+
if (signal.aborted) {
|
|
488
|
+
throw signal.reason;
|
|
489
|
+
}
|
|
490
|
+
reportOptionalDegradation('tool success audit', error);
|
|
491
|
+
}
|
|
345
492
|
}
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
493
|
+
/* v8 ignore stop */
|
|
494
|
+
signal.throwIfAborted();
|
|
495
|
+
// Report validation errors (isError:true returned by handler logic, not exceptions)
|
|
496
|
+
if (toolName !== undefined && processedResult.isError === true) {
|
|
497
|
+
const firstContent = processedResult.content[0];
|
|
498
|
+
const errText = firstContent?.type === 'text' ? firstContent.text : 'unknown error';
|
|
499
|
+
reportToolValidationError(toolName, errText);
|
|
500
|
+
}
|
|
501
|
+
// Record token usage for successful calls (fire-and-forget, only when projectPath available)
|
|
502
|
+
if (toolName !== undefined &&
|
|
503
|
+
projectPath !== undefined &&
|
|
504
|
+
processedResult.isError !== true) {
|
|
505
|
+
const outputText = extractOutputText(processedResult);
|
|
506
|
+
recordToolTokens(toolName, projectPath, args, outputText, SESSION_ID);
|
|
507
|
+
}
|
|
508
|
+
// SPEC-460: Track real token estimates in LLM runtime (session-scoped, measured)
|
|
509
|
+
if (toolName !== undefined) {
|
|
510
|
+
const inputText = JSON.stringify(args);
|
|
511
|
+
const outputText = extractOutputText(processedResult);
|
|
512
|
+
recordLlmTokens(toolName, inputText, outputText);
|
|
513
|
+
}
|
|
514
|
+
// Emit tool_used telemetry for successful calls (fire-and-forget)
|
|
515
|
+
/* v8 ignore start */
|
|
516
|
+
if (toolName !== undefined && processedResult.isError !== true) {
|
|
370
517
|
sendTelemetryEvent({
|
|
371
518
|
event: 'tool_used',
|
|
372
519
|
properties: {
|
|
@@ -376,47 +523,24 @@ function safeWithTelemetry(toolName, handler) {
|
|
|
376
523
|
platform: process.platform,
|
|
377
524
|
durationMs: Date.now() - startTime,
|
|
378
525
|
},
|
|
379
|
-
installationId,
|
|
380
526
|
});
|
|
381
|
-
})
|
|
382
|
-
.catch(() => {
|
|
383
|
-
/* best-effort — never block tool response */
|
|
384
|
-
});
|
|
385
|
-
}
|
|
386
|
-
/* v8 ignore stop */
|
|
387
|
-
// SPEC-387: Audit trail — fire-and-forget, never throws
|
|
388
|
-
/* v8 ignore start */
|
|
389
|
-
if (toolName !== undefined) {
|
|
390
|
-
try {
|
|
391
|
-
const [{ appendEntry, getLastHash }, { buildAuditEntry }, { hashEntry }] = await Promise.all([
|
|
392
|
-
import('../storage/audit-trail-store.js'),
|
|
393
|
-
import('../engine/audit-trail/formatter.js'),
|
|
394
|
-
import('../engine/audit-trail/hasher.js'),
|
|
395
|
-
]);
|
|
396
|
-
const prevHash = getLastHash();
|
|
397
|
-
const partial = buildAuditEntry({
|
|
398
|
-
toolName,
|
|
399
|
-
args,
|
|
400
|
-
outputType: guardedResult.isError === true ? 'error' : 'success',
|
|
401
|
-
durationMs: Date.now() - startTime,
|
|
402
|
-
prevHash,
|
|
403
|
-
});
|
|
404
|
-
appendEntry({ ...partial, hash: hashEntry(partial) });
|
|
405
527
|
}
|
|
406
|
-
|
|
407
|
-
|
|
528
|
+
/* v8 ignore stop */
|
|
529
|
+
// No awaited boundary remains below this point. Cancellation cannot
|
|
530
|
+
// interleave between the final check and these synchronous starters.
|
|
531
|
+
driftBanner.acknowledge();
|
|
532
|
+
appendAudit?.();
|
|
533
|
+
if (toolName !== undefined) {
|
|
534
|
+
maybeWriteCheckpoint(toolName, processedResult.isError !== true, projectPath);
|
|
408
535
|
}
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
// SPEC-563: Auto session checkpoint — fire-and-forget, non-blocking
|
|
412
|
-
if (toolName !== undefined) {
|
|
413
|
-
maybeWriteCheckpoint(toolName, guardedResult.isError !== true, projectPath);
|
|
414
|
-
}
|
|
536
|
+
return processedResult;
|
|
537
|
+
}, getTimeoutMs(), upstreamSignal, requestIdentity(extra), toolName, executionMeasurements(safeArgs));
|
|
415
538
|
return guardedResult;
|
|
416
539
|
}
|
|
417
540
|
catch (error) {
|
|
418
541
|
const message = error instanceof Error ? error.message : String(error);
|
|
419
|
-
|
|
542
|
+
const cancelledBeforeCommit = error instanceof ExecutionCancelledError;
|
|
543
|
+
if (!cancelledBeforeCommit && toolName !== undefined && projectPath !== undefined) {
|
|
420
544
|
const projectId = hashProjectPath(projectPath);
|
|
421
545
|
// Fire-and-forget: do not block the error response
|
|
422
546
|
recordError(projectId, {
|
|
@@ -426,12 +550,12 @@ function safeWithTelemetry(toolName, handler) {
|
|
|
426
550
|
message,
|
|
427
551
|
/* v8 ignore start */
|
|
428
552
|
}).catch((err) => {
|
|
429
|
-
|
|
553
|
+
reportOptionalDegradation('local error telemetry', err);
|
|
430
554
|
});
|
|
431
555
|
/* v8 ignore stop */
|
|
432
556
|
}
|
|
433
557
|
// Remote error reporting — fire-and-forget, respects PLANU_TELEMETRY=off
|
|
434
|
-
if (toolName !== undefined) {
|
|
558
|
+
if (!cancelledBeforeCommit && toolName !== undefined) {
|
|
435
559
|
reportToolError(toolName, error);
|
|
436
560
|
}
|
|
437
561
|
// SPEC-902: Structured error contract with recovery hints
|
|
@@ -443,7 +567,7 @@ function safeWithTelemetry(toolName, handler) {
|
|
|
443
567
|
// Log unmatched errors for registry improvement (fire-and-forget)
|
|
444
568
|
/* v8 ignore start */
|
|
445
569
|
const matchedRule = registry.match(error);
|
|
446
|
-
if (!matchedRule && toolName !== undefined) {
|
|
570
|
+
if (!cancelledBeforeCommit && !matchedRule && toolName !== undefined) {
|
|
447
571
|
void Promise.resolve().then(async () => {
|
|
448
572
|
try {
|
|
449
573
|
const { recordError: recordErrorTelemetry } = await import('../storage/error-telemetry-store.js');
|
|
@@ -453,25 +577,25 @@ function safeWithTelemetry(toolName, handler) {
|
|
|
453
577
|
module: `tools/${toolName}`,
|
|
454
578
|
severity: 'warning',
|
|
455
579
|
message: `Unmatched error: ${message}`,
|
|
456
|
-
}).catch(() => {
|
|
457
|
-
|
|
580
|
+
}).catch((telemetryError) => {
|
|
581
|
+
reportOptionalDegradation('unmatched error telemetry', telemetryError);
|
|
458
582
|
});
|
|
459
583
|
}
|
|
460
|
-
catch {
|
|
461
|
-
|
|
584
|
+
catch (telemetryError) {
|
|
585
|
+
reportOptionalDegradation('unmatched error telemetry import', telemetryError);
|
|
462
586
|
}
|
|
463
587
|
});
|
|
464
588
|
}
|
|
465
589
|
/* v8 ignore stop */
|
|
466
590
|
// SPEC-387: Audit trail for error path — fire-and-forget, never throws
|
|
467
591
|
/* v8 ignore start */
|
|
468
|
-
if (toolName !== undefined) {
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
])
|
|
592
|
+
if (!cancelledBeforeCommit && toolName !== undefined) {
|
|
593
|
+
void Promise.all([
|
|
594
|
+
import('../storage/audit-trail-store.js'),
|
|
595
|
+
import('../engine/audit-trail/formatter.js'),
|
|
596
|
+
import('../engine/audit-trail/hasher.js'),
|
|
597
|
+
])
|
|
598
|
+
.then(([{ appendEntry, getLastHash }, { buildAuditEntry }, { hashEntry }]) => {
|
|
475
599
|
const prevHash = getLastHash();
|
|
476
600
|
const partial = buildAuditEntry({
|
|
477
601
|
toolName,
|
|
@@ -481,10 +605,10 @@ function safeWithTelemetry(toolName, handler) {
|
|
|
481
605
|
prevHash,
|
|
482
606
|
});
|
|
483
607
|
appendEntry({ ...partial, hash: hashEntry(partial) });
|
|
484
|
-
}
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
}
|
|
608
|
+
})
|
|
609
|
+
.catch((auditError) => {
|
|
610
|
+
reportOptionalDegradation('tool error audit', auditError);
|
|
611
|
+
});
|
|
488
612
|
}
|
|
489
613
|
/* v8 ignore stop */
|
|
490
614
|
return errorResult;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { technologyValue } from '../engine/technology-registry.js';
|
|
1
2
|
// tools/schema-generator-handler.ts — Handler for Validation Schema Generator (SPEC-365)
|
|
2
3
|
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
3
4
|
import { dirname } from 'node:path';
|
|
@@ -51,7 +52,7 @@ export async function handleGenerateValidationSchema(input) {
|
|
|
51
52
|
// Write files if outputPath is provided
|
|
52
53
|
if (outputPath !== undefined) {
|
|
53
54
|
for (const schema of result.schemas) {
|
|
54
|
-
const ext = outputFormat === 'typescript' ? '.ts' : '.js';
|
|
55
|
+
const ext = outputFormat === technologyValue('technology-typescript-969545') ? '.ts' : '.js';
|
|
55
56
|
const libSuffix = library === 'all' ? `.${schema.library}` : '';
|
|
56
57
|
const filePath = outputPath.replace(/\.(ts|js)$/, '') + libSuffix + ext;
|
|
57
58
|
await writeOutputFile(filePath, schema.code);
|