@aquex/cmos-mcp 1.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/CHANGELOG.md +99 -0
- package/LICENSE +15 -0
- package/README.md +250 -0
- package/cmos-seed/README.md +153 -0
- package/cmos-seed/context/master_context.json +27 -0
- package/cmos-seed/context/project_context.json +12 -0
- package/cmos-seed/db/schema.sql +334 -0
- package/cmos-seed/docs/README.md +128 -0
- package/cmos-seed/docs/agents-md-guide.md +253 -0
- package/cmos-seed/docs/build-session-prompt.md +137 -0
- package/cmos-seed/docs/getting-started.md +150 -0
- package/cmos-seed/docs/session-management-guide.md +163 -0
- package/cmos-seed/docs/sqlite-schema-reference.md +188 -0
- package/cmos-seed/foundational-docs/roadmap_template.md +365 -0
- package/cmos-seed/foundational-docs/tech_arch_template.md +331 -0
- package/cmos-seed/templates/PROJECT-README-template.md +110 -0
- package/cmos-seed/templates/agents.md +306 -0
- package/cmos-seed/tiers/build.md +110 -0
- package/cmos-seed/tiers/general.md +112 -0
- package/cmos-seed/tiers/managed.md +118 -0
- package/dist/.build-manifest.json +5 -0
- package/dist/auth/auth-state.d.ts +96 -0
- package/dist/auth/auth-state.d.ts.map +1 -0
- package/dist/auth/auth-state.js +115 -0
- package/dist/auth/auth-state.js.map +1 -0
- package/dist/auth/delivery-ack-cache.d.ts +27 -0
- package/dist/auth/delivery-ack-cache.d.ts.map +1 -0
- package/dist/auth/delivery-ack-cache.js +21 -0
- package/dist/auth/delivery-ack-cache.js.map +1 -0
- package/dist/auth/device-code.d.ts +136 -0
- package/dist/auth/device-code.d.ts.map +1 -0
- package/dist/auth/device-code.js +334 -0
- package/dist/auth/device-code.js.map +1 -0
- package/dist/auth/project-key-capture.d.ts +124 -0
- package/dist/auth/project-key-capture.d.ts.map +1 -0
- package/dist/auth/project-key-capture.js +218 -0
- package/dist/auth/project-key-capture.js.map +1 -0
- package/dist/combination/dependency-resolver.d.ts +69 -0
- package/dist/combination/dependency-resolver.d.ts.map +1 -0
- package/dist/combination/dependency-resolver.js +303 -0
- package/dist/combination/dependency-resolver.js.map +1 -0
- package/dist/combination/merge-strategies.d.ts +87 -0
- package/dist/combination/merge-strategies.d.ts.map +1 -0
- package/dist/combination/merge-strategies.js +210 -0
- package/dist/combination/merge-strategies.js.map +1 -0
- package/dist/combination/pack-combiner.d.ts +84 -0
- package/dist/combination/pack-combiner.d.ts.map +1 -0
- package/dist/combination/pack-combiner.js +288 -0
- package/dist/combination/pack-combiner.js.map +1 -0
- package/dist/combination/types.d.ts +112 -0
- package/dist/combination/types.d.ts.map +1 -0
- package/dist/combination/types.js +39 -0
- package/dist/combination/types.js.map +1 -0
- package/dist/domains/domain-pack-loader.d.ts +148 -0
- package/dist/domains/domain-pack-loader.d.ts.map +1 -0
- package/dist/domains/domain-pack-loader.js +501 -0
- package/dist/domains/domain-pack-loader.js.map +1 -0
- package/dist/domains/types.d.ts +64 -0
- package/dist/domains/types.d.ts.map +1 -0
- package/dist/domains/types.js +10 -0
- package/dist/domains/types.js.map +1 -0
- package/dist/errors/config-error.d.ts +13 -0
- package/dist/errors/config-error.d.ts.map +1 -0
- package/dist/errors/config-error.js +19 -0
- package/dist/errors/config-error.js.map +1 -0
- package/dist/errors/domain-error.d.ts +13 -0
- package/dist/errors/domain-error.d.ts.map +1 -0
- package/dist/errors/domain-error.js +19 -0
- package/dist/errors/domain-error.js.map +1 -0
- package/dist/errors/handler.d.ts +30 -0
- package/dist/errors/handler.d.ts.map +1 -0
- package/dist/errors/handler.js +63 -0
- package/dist/errors/handler.js.map +1 -0
- package/dist/errors/index.d.ts +9 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +25 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/errors/io-error.d.ts +13 -0
- package/dist/errors/io-error.d.ts.map +1 -0
- package/dist/errors/io-error.js +19 -0
- package/dist/errors/io-error.js.map +1 -0
- package/dist/errors/logger.d.ts +21 -0
- package/dist/errors/logger.d.ts.map +1 -0
- package/dist/errors/logger.js +88 -0
- package/dist/errors/logger.js.map +1 -0
- package/dist/errors/mission-error.d.ts +27 -0
- package/dist/errors/mission-error.d.ts.map +1 -0
- package/dist/errors/mission-error.js +76 -0
- package/dist/errors/mission-error.js.map +1 -0
- package/dist/errors/types.d.ts +52 -0
- package/dist/errors/types.d.ts.map +1 -0
- package/dist/errors/types.js +3 -0
- package/dist/errors/types.js.map +1 -0
- package/dist/errors/utils.d.ts +24 -0
- package/dist/errors/utils.d.ts.map +1 -0
- package/dist/errors/utils.js +64 -0
- package/dist/errors/utils.js.map +1 -0
- package/dist/errors/validation-error.d.ts +13 -0
- package/dist/errors/validation-error.d.ts.map +1 -0
- package/dist/errors/validation-error.js +19 -0
- package/dist/errors/validation-error.js.map +1 -0
- package/dist/extraction/template-extractor.d.ts +59 -0
- package/dist/extraction/template-extractor.d.ts.map +1 -0
- package/dist/extraction/template-extractor.js +553 -0
- package/dist/extraction/template-extractor.js.map +1 -0
- package/dist/extraction/types.d.ts +160 -0
- package/dist/extraction/types.d.ts.map +1 -0
- package/dist/extraction/types.js +7 -0
- package/dist/extraction/types.js.map +1 -0
- package/dist/http-server.d.ts +18 -0
- package/dist/http-server.d.ts.map +1 -0
- package/dist/http-server.js +326 -0
- package/dist/http-server.js.map +1 -0
- package/dist/import-export/hybrid-template-parser.d.ts +44 -0
- package/dist/import-export/hybrid-template-parser.d.ts.map +1 -0
- package/dist/import-export/hybrid-template-parser.js +373 -0
- package/dist/import-export/hybrid-template-parser.js.map +1 -0
- package/dist/import-export/security-validator.d.ts +93 -0
- package/dist/import-export/security-validator.d.ts.map +1 -0
- package/dist/import-export/security-validator.js +441 -0
- package/dist/import-export/security-validator.js.map +1 -0
- package/dist/import-export/template-exporter.d.ts +106 -0
- package/dist/import-export/template-exporter.d.ts.map +1 -0
- package/dist/import-export/template-exporter.js +247 -0
- package/dist/import-export/template-exporter.js.map +1 -0
- package/dist/import-export/template-importer.d.ts +97 -0
- package/dist/import-export/template-importer.d.ts.map +1 -0
- package/dist/import-export/template-importer.js +308 -0
- package/dist/import-export/template-importer.js.map +1 -0
- package/dist/import-export/types.d.ts +118 -0
- package/dist/import-export/types.d.ts.map +1 -0
- package/dist/import-export/types.js +41 -0
- package/dist/import-export/types.js.map +1 -0
- package/dist/index.d.ts +157 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +972 -0
- package/dist/index.js.map +1 -0
- package/dist/intelligence/agentic-controller.d.ts +345 -0
- package/dist/intelligence/agentic-controller.d.ts.map +1 -0
- package/dist/intelligence/agentic-controller.js +1376 -0
- package/dist/intelligence/agentic-controller.js.map +1 -0
- package/dist/intelligence/agentic-observability.d.ts +43 -0
- package/dist/intelligence/agentic-observability.d.ts.map +1 -0
- package/dist/intelligence/agentic-observability.js +62 -0
- package/dist/intelligence/agentic-observability.js.map +1 -0
- package/dist/intelligence/agents-md-loader.d.ts +81 -0
- package/dist/intelligence/agents-md-loader.d.ts.map +1 -0
- package/dist/intelligence/agents-md-loader.js +298 -0
- package/dist/intelligence/agents-md-loader.js.map +1 -0
- package/dist/intelligence/attribution-verification.d.ts +58 -0
- package/dist/intelligence/attribution-verification.d.ts.map +1 -0
- package/dist/intelligence/attribution-verification.js +133 -0
- package/dist/intelligence/attribution-verification.js.map +1 -0
- package/dist/intelligence/boomerang-workflow.d.ts +87 -0
- package/dist/intelligence/boomerang-workflow.d.ts.map +1 -0
- package/dist/intelligence/boomerang-workflow.js +311 -0
- package/dist/intelligence/boomerang-workflow.js.map +1 -0
- package/dist/intelligence/cmos-detector.d.ts +42 -0
- package/dist/intelligence/cmos-detector.d.ts.map +1 -0
- package/dist/intelligence/cmos-detector.js +94 -0
- package/dist/intelligence/cmos-detector.js.map +1 -0
- package/dist/intelligence/cmos-sync.d.ts +101 -0
- package/dist/intelligence/cmos-sync.d.ts.map +1 -0
- package/dist/intelligence/cmos-sync.js +435 -0
- package/dist/intelligence/cmos-sync.js.map +1 -0
- package/dist/intelligence/complexity-scorer.d.ts +111 -0
- package/dist/intelligence/complexity-scorer.d.ts.map +1 -0
- package/dist/intelligence/complexity-scorer.js +299 -0
- package/dist/intelligence/complexity-scorer.js.map +1 -0
- package/dist/intelligence/compression-rules.d.ts +62 -0
- package/dist/intelligence/compression-rules.d.ts.map +1 -0
- package/dist/intelligence/compression-rules.js +303 -0
- package/dist/intelligence/compression-rules.js.map +1 -0
- package/dist/intelligence/content-sanitizer.d.ts +61 -0
- package/dist/intelligence/content-sanitizer.d.ts.map +1 -0
- package/dist/intelligence/content-sanitizer.js +170 -0
- package/dist/intelligence/content-sanitizer.js.map +1 -0
- package/dist/intelligence/context-propagator-v2.d.ts +23 -0
- package/dist/intelligence/context-propagator-v2.d.ts.map +1 -0
- package/dist/intelligence/context-propagator-v2.js +37 -0
- package/dist/intelligence/context-propagator-v2.js.map +1 -0
- package/dist/intelligence/context-propagator-v3.d.ts +46 -0
- package/dist/intelligence/context-propagator-v3.d.ts.map +1 -0
- package/dist/intelligence/context-propagator-v3.js +266 -0
- package/dist/intelligence/context-propagator-v3.js.map +1 -0
- package/dist/intelligence/context-propagator.d.ts +108 -0
- package/dist/intelligence/context-propagator.d.ts.map +1 -0
- package/dist/intelligence/context-propagator.js +283 -0
- package/dist/intelligence/context-propagator.js.map +1 -0
- package/dist/intelligence/context-windows.d.ts +5 -0
- package/dist/intelligence/context-windows.d.ts.map +1 -0
- package/dist/intelligence/context-windows.js +18 -0
- package/dist/intelligence/context-windows.js.map +1 -0
- package/dist/intelligence/credential-store.d.ts +145 -0
- package/dist/intelligence/credential-store.d.ts.map +1 -0
- package/dist/intelligence/credential-store.js +243 -0
- package/dist/intelligence/credential-store.js.map +1 -0
- package/dist/intelligence/dependency-analyzer.d.ts +117 -0
- package/dist/intelligence/dependency-analyzer.d.ts.map +1 -0
- package/dist/intelligence/dependency-analyzer.js +398 -0
- package/dist/intelligence/dependency-analyzer.js.map +1 -0
- package/dist/intelligence/dependency-inferrer.d.ts +68 -0
- package/dist/intelligence/dependency-inferrer.d.ts.map +1 -0
- package/dist/intelligence/dependency-inferrer.js +281 -0
- package/dist/intelligence/dependency-inferrer.js.map +1 -0
- package/dist/intelligence/enhanced-dependency-analyzer.d.ts +25 -0
- package/dist/intelligence/enhanced-dependency-analyzer.d.ts.map +1 -0
- package/dist/intelligence/enhanced-dependency-analyzer.js +207 -0
- package/dist/intelligence/enhanced-dependency-analyzer.js.map +1 -0
- package/dist/intelligence/graph-validator.d.ts +61 -0
- package/dist/intelligence/graph-validator.d.ts.map +1 -0
- package/dist/intelligence/graph-validator.js +212 -0
- package/dist/intelligence/graph-validator.js.map +1 -0
- package/dist/intelligence/lifecycle-analyzer.d.ts +64 -0
- package/dist/intelligence/lifecycle-analyzer.d.ts.map +1 -0
- package/dist/intelligence/lifecycle-analyzer.js +587 -0
- package/dist/intelligence/lifecycle-analyzer.js.map +1 -0
- package/dist/intelligence/mission-history.d.ts +56 -0
- package/dist/intelligence/mission-history.d.ts.map +1 -0
- package/dist/intelligence/mission-history.js +145 -0
- package/dist/intelligence/mission-history.js.map +1 -0
- package/dist/intelligence/mission-outcome-analytics.d.ts +84 -0
- package/dist/intelligence/mission-outcome-analytics.d.ts.map +1 -0
- package/dist/intelligence/mission-outcome-analytics.js +499 -0
- package/dist/intelligence/mission-outcome-analytics.js.map +1 -0
- package/dist/intelligence/mission-splitter.d.ts +148 -0
- package/dist/intelligence/mission-splitter.d.ts.map +1 -0
- package/dist/intelligence/mission-splitter.js +461 -0
- package/dist/intelligence/mission-splitter.js.map +1 -0
- package/dist/intelligence/model-transpilers.d.ts +59 -0
- package/dist/intelligence/model-transpilers.d.ts.map +1 -0
- package/dist/intelligence/model-transpilers.js +185 -0
- package/dist/intelligence/model-transpilers.js.map +1 -0
- package/dist/intelligence/project-registry.d.ts +265 -0
- package/dist/intelligence/project-registry.d.ts.map +1 -0
- package/dist/intelligence/project-registry.js +484 -0
- package/dist/intelligence/project-registry.js.map +1 -0
- package/dist/intelligence/rsip-loop.d.ts +52 -0
- package/dist/intelligence/rsip-loop.d.ts.map +1 -0
- package/dist/intelligence/rsip-loop.js +139 -0
- package/dist/intelligence/rsip-loop.js.map +1 -0
- package/dist/intelligence/sender-context.d.ts +114 -0
- package/dist/intelligence/sender-context.d.ts.map +1 -0
- package/dist/intelligence/sender-context.js +275 -0
- package/dist/intelligence/sender-context.js.map +1 -0
- package/dist/intelligence/sqlite-client.d.ts +144 -0
- package/dist/intelligence/sqlite-client.d.ts.map +1 -0
- package/dist/intelligence/sqlite-client.js +568 -0
- package/dist/intelligence/sqlite-client.js.map +1 -0
- package/dist/intelligence/telemetry.d.ts +44 -0
- package/dist/intelligence/telemetry.d.ts.map +1 -0
- package/dist/intelligence/telemetry.js +106 -0
- package/dist/intelligence/telemetry.js.map +1 -0
- package/dist/intelligence/token-counters.d.ts +69 -0
- package/dist/intelligence/token-counters.d.ts.map +1 -0
- package/dist/intelligence/token-counters.js +197 -0
- package/dist/intelligence/token-counters.js.map +1 -0
- package/dist/intelligence/token-optimizer.d.ts +52 -0
- package/dist/intelligence/token-optimizer.d.ts.map +1 -0
- package/dist/intelligence/token-optimizer.js +205 -0
- package/dist/intelligence/token-optimizer.js.map +1 -0
- package/dist/intelligence/tokenizer-bootstrap.d.ts +54 -0
- package/dist/intelligence/tokenizer-bootstrap.d.ts.map +1 -0
- package/dist/intelligence/tokenizer-bootstrap.js +238 -0
- package/dist/intelligence/tokenizer-bootstrap.js.map +1 -0
- package/dist/intelligence/types.d.ts +117 -0
- package/dist/intelligence/types.d.ts.map +1 -0
- package/dist/intelligence/types.js +8 -0
- package/dist/intelligence/types.js.map +1 -0
- package/dist/intelligence/worker-manifest-loader.d.ts +70 -0
- package/dist/intelligence/worker-manifest-loader.d.ts.map +1 -0
- package/dist/intelligence/worker-manifest-loader.js +387 -0
- package/dist/intelligence/worker-manifest-loader.js.map +1 -0
- package/dist/loaders/yaml-loader.d.ts +99 -0
- package/dist/loaders/yaml-loader.d.ts.map +1 -0
- package/dist/loaders/yaml-loader.js +236 -0
- package/dist/loaders/yaml-loader.js.map +1 -0
- package/dist/merge/deep-merge.d.ts +93 -0
- package/dist/merge/deep-merge.d.ts.map +1 -0
- package/dist/merge/deep-merge.js +168 -0
- package/dist/merge/deep-merge.js.map +1 -0
- package/dist/quality/analyzers/ai-readiness-analyzer.d.ts +35 -0
- package/dist/quality/analyzers/ai-readiness-analyzer.d.ts.map +1 -0
- package/dist/quality/analyzers/ai-readiness-analyzer.js +357 -0
- package/dist/quality/analyzers/ai-readiness-analyzer.js.map +1 -0
- package/dist/quality/analyzers/clarity-analyzer.d.ts +52 -0
- package/dist/quality/analyzers/clarity-analyzer.d.ts.map +1 -0
- package/dist/quality/analyzers/clarity-analyzer.js +405 -0
- package/dist/quality/analyzers/clarity-analyzer.js.map +1 -0
- package/dist/quality/analyzers/completeness-analyzer.d.ts +45 -0
- package/dist/quality/analyzers/completeness-analyzer.d.ts.map +1 -0
- package/dist/quality/analyzers/completeness-analyzer.js +331 -0
- package/dist/quality/analyzers/completeness-analyzer.js.map +1 -0
- package/dist/quality/improvement-engine.d.ts +37 -0
- package/dist/quality/improvement-engine.d.ts.map +1 -0
- package/dist/quality/improvement-engine.js +260 -0
- package/dist/quality/improvement-engine.js.map +1 -0
- package/dist/quality/quality-scorer.d.ts +36 -0
- package/dist/quality/quality-scorer.d.ts.map +1 -0
- package/dist/quality/quality-scorer.js +95 -0
- package/dist/quality/quality-scorer.js.map +1 -0
- package/dist/quality/types.d.ts +92 -0
- package/dist/quality/types.d.ts.map +1 -0
- package/dist/quality/types.js +33 -0
- package/dist/quality/types.js.map +1 -0
- package/dist/registry/registry-parser.d.ts +59 -0
- package/dist/registry/registry-parser.d.ts.map +1 -0
- package/dist/registry/registry-parser.js +161 -0
- package/dist/registry/registry-parser.js.map +1 -0
- package/dist/registry/semver-validator.d.ts +48 -0
- package/dist/registry/semver-validator.d.ts.map +1 -0
- package/dist/registry/semver-validator.js +115 -0
- package/dist/registry/semver-validator.js.map +1 -0
- package/dist/schemas/generic-mission.d.ts +120 -0
- package/dist/schemas/generic-mission.d.ts.map +1 -0
- package/dist/schemas/generic-mission.js +118 -0
- package/dist/schemas/generic-mission.js.map +1 -0
- package/dist/security/workspace-guard.d.ts +10 -0
- package/dist/security/workspace-guard.d.ts.map +1 -0
- package/dist/security/workspace-guard.js +116 -0
- package/dist/security/workspace-guard.js.map +1 -0
- package/dist/server-health.d.ts +73 -0
- package/dist/server-health.d.ts.map +1 -0
- package/dist/server-health.js +181 -0
- package/dist/server-health.js.map +1 -0
- package/dist/tools/analyze-dependencies.d.ts +99 -0
- package/dist/tools/analyze-dependencies.d.ts.map +1 -0
- package/dist/tools/analyze-dependencies.js +329 -0
- package/dist/tools/analyze-dependencies.js.map +1 -0
- package/dist/tools/cmos/agent-feedback.d.ts +25 -0
- package/dist/tools/cmos/agent-feedback.d.ts.map +1 -0
- package/dist/tools/cmos/agent-feedback.js +50 -0
- package/dist/tools/cmos/agent-feedback.js.map +1 -0
- package/dist/tools/cmos/blob-migrations.d.ts +77 -0
- package/dist/tools/cmos/blob-migrations.d.ts.map +1 -0
- package/dist/tools/cmos/blob-migrations.js +210 -0
- package/dist/tools/cmos/blob-migrations.js.map +1 -0
- package/dist/tools/cmos/checkpoint-backfill.d.ts +33 -0
- package/dist/tools/cmos/checkpoint-backfill.d.ts.map +1 -0
- package/dist/tools/cmos/checkpoint-backfill.js +186 -0
- package/dist/tools/cmos/checkpoint-backfill.js.map +1 -0
- package/dist/tools/cmos/client.d.ts +293 -0
- package/dist/tools/cmos/client.d.ts.map +1 -0
- package/dist/tools/cmos/client.js +669 -0
- package/dist/tools/cmos/client.js.map +1 -0
- package/dist/tools/cmos/cmos-agent-onboard.d.ts +344 -0
- package/dist/tools/cmos/cmos-agent-onboard.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-agent-onboard.js +1533 -0
- package/dist/tools/cmos/cmos-agent-onboard.js.map +1 -0
- package/dist/tools/cmos/cmos-auth.d.ts +283 -0
- package/dist/tools/cmos/cmos-auth.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-auth.js +687 -0
- package/dist/tools/cmos/cmos-auth.js.map +1 -0
- package/dist/tools/cmos/cmos-backlog-export.d.ts +142 -0
- package/dist/tools/cmos/cmos-backlog-export.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-backlog-export.js +340 -0
- package/dist/tools/cmos/cmos-backlog-export.js.map +1 -0
- package/dist/tools/cmos/cmos-constraints.d.ts +58 -0
- package/dist/tools/cmos/cmos-constraints.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-constraints.js +227 -0
- package/dist/tools/cmos/cmos-constraints.js.map +1 -0
- package/dist/tools/cmos/cmos-context-condense.d.ts +129 -0
- package/dist/tools/cmos/cmos-context-condense.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-context-condense.js +649 -0
- package/dist/tools/cmos/cmos-context-condense.js.map +1 -0
- package/dist/tools/cmos/cmos-context-history.d.ts +145 -0
- package/dist/tools/cmos/cmos-context-history.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-context-history.js +235 -0
- package/dist/tools/cmos/cmos-context-history.js.map +1 -0
- package/dist/tools/cmos/cmos-context-project-identity.d.ts +34 -0
- package/dist/tools/cmos/cmos-context-project-identity.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-context-project-identity.js +145 -0
- package/dist/tools/cmos/cmos-context-project-identity.js.map +1 -0
- package/dist/tools/cmos/cmos-context-search.d.ts +44 -0
- package/dist/tools/cmos/cmos-context-search.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-context-search.js +79 -0
- package/dist/tools/cmos/cmos-context-search.js.map +1 -0
- package/dist/tools/cmos/cmos-context-snapshot.d.ts +105 -0
- package/dist/tools/cmos/cmos-context-snapshot.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-context-snapshot.js +213 -0
- package/dist/tools/cmos/cmos-context-snapshot.js.map +1 -0
- package/dist/tools/cmos/cmos-context-update.d.ts +193 -0
- package/dist/tools/cmos/cmos-context-update.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-context-update.js +710 -0
- package/dist/tools/cmos/cmos-context-update.js.map +1 -0
- package/dist/tools/cmos/cmos-context-view.d.ts +159 -0
- package/dist/tools/cmos/cmos-context-view.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-context-view.js +531 -0
- package/dist/tools/cmos/cmos-context-view.js.map +1 -0
- package/dist/tools/cmos/cmos-context.d.ts +325 -0
- package/dist/tools/cmos/cmos-context.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-context.js +424 -0
- package/dist/tools/cmos/cmos-context.js.map +1 -0
- package/dist/tools/cmos/cmos-db-backfill.d.ts +119 -0
- package/dist/tools/cmos/cmos-db-backfill.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-db-backfill.js +889 -0
- package/dist/tools/cmos/cmos-db-backfill.js.map +1 -0
- package/dist/tools/cmos/cmos-db-health.d.ts +76 -0
- package/dist/tools/cmos/cmos-db-health.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-db-health.js +226 -0
- package/dist/tools/cmos/cmos-db-health.js.map +1 -0
- package/dist/tools/cmos/cmos-db-restore.d.ts +92 -0
- package/dist/tools/cmos/cmos-db-restore.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-db-restore.js +359 -0
- package/dist/tools/cmos/cmos-db-restore.js.map +1 -0
- package/dist/tools/cmos/cmos-db-snapshot.d.ts +108 -0
- package/dist/tools/cmos/cmos-db-snapshot.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-db-snapshot.js +359 -0
- package/dist/tools/cmos/cmos-db-snapshot.js.map +1 -0
- package/dist/tools/cmos/cmos-db.d.ts +103 -0
- package/dist/tools/cmos/cmos-db.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-db.js +182 -0
- package/dist/tools/cmos/cmos-db.js.map +1 -0
- package/dist/tools/cmos/cmos-decisions-batch-update.d.ts +34 -0
- package/dist/tools/cmos/cmos-decisions-batch-update.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-decisions-batch-update.js +90 -0
- package/dist/tools/cmos/cmos-decisions-batch-update.js.map +1 -0
- package/dist/tools/cmos/cmos-decisions-list.d.ts +134 -0
- package/dist/tools/cmos/cmos-decisions-list.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-decisions-list.js +153 -0
- package/dist/tools/cmos/cmos-decisions-list.js.map +1 -0
- package/dist/tools/cmos/cmos-decisions-review.d.ts +21 -0
- package/dist/tools/cmos/cmos-decisions-review.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-decisions-review.js +83 -0
- package/dist/tools/cmos/cmos-decisions-review.js.map +1 -0
- package/dist/tools/cmos/cmos-decisions-search.d.ts +119 -0
- package/dist/tools/cmos/cmos-decisions-search.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-decisions-search.js +219 -0
- package/dist/tools/cmos/cmos-decisions-search.js.map +1 -0
- package/dist/tools/cmos/cmos-decisions-update.d.ts +34 -0
- package/dist/tools/cmos/cmos-decisions-update.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-decisions-update.js +121 -0
- package/dist/tools/cmos/cmos-decisions-update.js.map +1 -0
- package/dist/tools/cmos/cmos-decisions.d.ts +156 -0
- package/dist/tools/cmos/cmos-decisions.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-decisions.js +223 -0
- package/dist/tools/cmos/cmos-decisions.js.map +1 -0
- package/dist/tools/cmos/cmos-feedback.d.ts +127 -0
- package/dist/tools/cmos/cmos-feedback.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-feedback.js +259 -0
- package/dist/tools/cmos/cmos-feedback.js.map +1 -0
- package/dist/tools/cmos/cmos-learnings-list.d.ts +81 -0
- package/dist/tools/cmos/cmos-learnings-list.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-learnings-list.js +120 -0
- package/dist/tools/cmos/cmos-learnings-list.js.map +1 -0
- package/dist/tools/cmos/cmos-learnings-reaffirm.d.ts +27 -0
- package/dist/tools/cmos/cmos-learnings-reaffirm.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-learnings-reaffirm.js +69 -0
- package/dist/tools/cmos/cmos-learnings-reaffirm.js.map +1 -0
- package/dist/tools/cmos/cmos-learnings-search.d.ts +69 -0
- package/dist/tools/cmos/cmos-learnings-search.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-learnings-search.js +130 -0
- package/dist/tools/cmos/cmos-learnings-search.js.map +1 -0
- package/dist/tools/cmos/cmos-learnings-update.d.ts +52 -0
- package/dist/tools/cmos/cmos-learnings-update.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-learnings-update.js +122 -0
- package/dist/tools/cmos/cmos-learnings-update.js.map +1 -0
- package/dist/tools/cmos/cmos-learnings.d.ts +137 -0
- package/dist/tools/cmos/cmos-learnings.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-learnings.js +197 -0
- package/dist/tools/cmos/cmos-learnings.js.map +1 -0
- package/dist/tools/cmos/cmos-message.d.ts +257 -0
- package/dist/tools/cmos/cmos-message.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-message.js +729 -0
- package/dist/tools/cmos/cmos-message.js.map +1 -0
- package/dist/tools/cmos/cmos-mission-add.d.ts +186 -0
- package/dist/tools/cmos/cmos-mission-add.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-mission-add.js +328 -0
- package/dist/tools/cmos/cmos-mission-add.js.map +1 -0
- package/dist/tools/cmos/cmos-mission-block.d.ts +104 -0
- package/dist/tools/cmos/cmos-mission-block.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-mission-block.js +248 -0
- package/dist/tools/cmos/cmos-mission-block.js.map +1 -0
- package/dist/tools/cmos/cmos-mission-complete.d.ts +127 -0
- package/dist/tools/cmos/cmos-mission-complete.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-mission-complete.js +529 -0
- package/dist/tools/cmos/cmos-mission-complete.js.map +1 -0
- package/dist/tools/cmos/cmos-mission-defer.d.ts +41 -0
- package/dist/tools/cmos/cmos-mission-defer.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-mission-defer.js +169 -0
- package/dist/tools/cmos/cmos-mission-defer.js.map +1 -0
- package/dist/tools/cmos/cmos-mission-depends.d.ts +98 -0
- package/dist/tools/cmos/cmos-mission-depends.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-mission-depends.js +221 -0
- package/dist/tools/cmos/cmos-mission-depends.js.map +1 -0
- package/dist/tools/cmos/cmos-mission-drop.d.ts +36 -0
- package/dist/tools/cmos/cmos-mission-drop.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-mission-drop.js +139 -0
- package/dist/tools/cmos/cmos-mission-drop.js.map +1 -0
- package/dist/tools/cmos/cmos-mission-list.d.ts +127 -0
- package/dist/tools/cmos/cmos-mission-list.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-mission-list.js +277 -0
- package/dist/tools/cmos/cmos-mission-list.js.map +1 -0
- package/dist/tools/cmos/cmos-mission-show.d.ts +115 -0
- package/dist/tools/cmos/cmos-mission-show.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-mission-show.js +278 -0
- package/dist/tools/cmos/cmos-mission-show.js.map +1 -0
- package/dist/tools/cmos/cmos-mission-start.d.ts +94 -0
- package/dist/tools/cmos/cmos-mission-start.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-mission-start.js +347 -0
- package/dist/tools/cmos/cmos-mission-start.js.map +1 -0
- package/dist/tools/cmos/cmos-mission-status.d.ts +152 -0
- package/dist/tools/cmos/cmos-mission-status.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-mission-status.js +420 -0
- package/dist/tools/cmos/cmos-mission-status.js.map +1 -0
- package/dist/tools/cmos/cmos-mission-transition.d.ts +126 -0
- package/dist/tools/cmos/cmos-mission-transition.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-mission-transition.js +222 -0
- package/dist/tools/cmos/cmos-mission-transition.js.map +1 -0
- package/dist/tools/cmos/cmos-mission-unblock.d.ts +102 -0
- package/dist/tools/cmos/cmos-mission-unblock.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-mission-unblock.js +242 -0
- package/dist/tools/cmos/cmos-mission-unblock.js.map +1 -0
- package/dist/tools/cmos/cmos-mission-undepends.d.ts +39 -0
- package/dist/tools/cmos/cmos-mission-undepends.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-mission-undepends.js +94 -0
- package/dist/tools/cmos/cmos-mission-undepends.js.map +1 -0
- package/dist/tools/cmos/cmos-mission-update.d.ts +225 -0
- package/dist/tools/cmos/cmos-mission-update.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-mission-update.js +350 -0
- package/dist/tools/cmos/cmos-mission-update.js.map +1 -0
- package/dist/tools/cmos/cmos-mission.d.ts +300 -0
- package/dist/tools/cmos/cmos-mission.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-mission.js +318 -0
- package/dist/tools/cmos/cmos-mission.js.map +1 -0
- package/dist/tools/cmos/cmos-next-steps.d.ts +57 -0
- package/dist/tools/cmos/cmos-next-steps.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-next-steps.js +154 -0
- package/dist/tools/cmos/cmos-next-steps.js.map +1 -0
- package/dist/tools/cmos/cmos-project-init.d.ts +283 -0
- package/dist/tools/cmos/cmos-project-init.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-project-init.js +502 -0
- package/dist/tools/cmos/cmos-project-init.js.map +1 -0
- package/dist/tools/cmos/cmos-project-list.d.ts +79 -0
- package/dist/tools/cmos/cmos-project-list.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-project-list.js +150 -0
- package/dist/tools/cmos/cmos-project-list.js.map +1 -0
- package/dist/tools/cmos/cmos-project-register.d.ts +90 -0
- package/dist/tools/cmos/cmos-project-register.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-project-register.js +199 -0
- package/dist/tools/cmos/cmos-project-register.js.map +1 -0
- package/dist/tools/cmos/cmos-project-sweep.d.ts +34 -0
- package/dist/tools/cmos/cmos-project-sweep.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-project-sweep.js +210 -0
- package/dist/tools/cmos/cmos-project-sweep.js.map +1 -0
- package/dist/tools/cmos/cmos-project-unregister.d.ts +66 -0
- package/dist/tools/cmos/cmos-project-unregister.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-project-unregister.js +108 -0
- package/dist/tools/cmos/cmos-project-unregister.js.map +1 -0
- package/dist/tools/cmos/cmos-project-update.d.ts +21 -0
- package/dist/tools/cmos/cmos-project-update.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-project-update.js +46 -0
- package/dist/tools/cmos/cmos-project-update.js.map +1 -0
- package/dist/tools/cmos/cmos-project-validate.d.ts +89 -0
- package/dist/tools/cmos/cmos-project-validate.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-project-validate.js +155 -0
- package/dist/tools/cmos/cmos-project-validate.js.map +1 -0
- package/dist/tools/cmos/cmos-project.d.ts +225 -0
- package/dist/tools/cmos/cmos-project.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-project.js +255 -0
- package/dist/tools/cmos/cmos-project.js.map +1 -0
- package/dist/tools/cmos/cmos-resolve-references.d.ts +145 -0
- package/dist/tools/cmos/cmos-resolve-references.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-resolve-references.js +273 -0
- package/dist/tools/cmos/cmos-resolve-references.js.map +1 -0
- package/dist/tools/cmos/cmos-session-capture.d.ts +228 -0
- package/dist/tools/cmos/cmos-session-capture.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-session-capture.js +552 -0
- package/dist/tools/cmos/cmos-session-capture.js.map +1 -0
- package/dist/tools/cmos/cmos-session-complete.d.ts +201 -0
- package/dist/tools/cmos/cmos-session-complete.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-session-complete.js +816 -0
- package/dist/tools/cmos/cmos-session-complete.js.map +1 -0
- package/dist/tools/cmos/cmos-session-list.d.ts +150 -0
- package/dist/tools/cmos/cmos-session-list.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-session-list.js +234 -0
- package/dist/tools/cmos/cmos-session-list.js.map +1 -0
- package/dist/tools/cmos/cmos-session-search.d.ts +176 -0
- package/dist/tools/cmos/cmos-session-search.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-session-search.js +374 -0
- package/dist/tools/cmos/cmos-session-search.js.map +1 -0
- package/dist/tools/cmos/cmos-session-start.d.ts +136 -0
- package/dist/tools/cmos/cmos-session-start.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-session-start.js +305 -0
- package/dist/tools/cmos/cmos-session-start.js.map +1 -0
- package/dist/tools/cmos/cmos-session.d.ts +223 -0
- package/dist/tools/cmos/cmos-session.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-session.js +255 -0
- package/dist/tools/cmos/cmos-session.js.map +1 -0
- package/dist/tools/cmos/cmos-sprint-add.d.ts +114 -0
- package/dist/tools/cmos/cmos-sprint-add.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-sprint-add.js +164 -0
- package/dist/tools/cmos/cmos-sprint-add.js.map +1 -0
- package/dist/tools/cmos/cmos-sprint-analytics.d.ts +66 -0
- package/dist/tools/cmos/cmos-sprint-analytics.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-sprint-analytics.js +289 -0
- package/dist/tools/cmos/cmos-sprint-analytics.js.map +1 -0
- package/dist/tools/cmos/cmos-sprint-carry-forward.d.ts +55 -0
- package/dist/tools/cmos/cmos-sprint-carry-forward.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-sprint-carry-forward.js +271 -0
- package/dist/tools/cmos/cmos-sprint-carry-forward.js.map +1 -0
- package/dist/tools/cmos/cmos-sprint-complete.d.ts +155 -0
- package/dist/tools/cmos/cmos-sprint-complete.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-sprint-complete.js +768 -0
- package/dist/tools/cmos/cmos-sprint-complete.js.map +1 -0
- package/dist/tools/cmos/cmos-sprint-list.d.ts +115 -0
- package/dist/tools/cmos/cmos-sprint-list.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-sprint-list.js +225 -0
- package/dist/tools/cmos/cmos-sprint-list.js.map +1 -0
- package/dist/tools/cmos/cmos-sprint-retro.d.ts +114 -0
- package/dist/tools/cmos/cmos-sprint-retro.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-sprint-retro.js +331 -0
- package/dist/tools/cmos/cmos-sprint-retro.js.map +1 -0
- package/dist/tools/cmos/cmos-sprint-show.d.ts +109 -0
- package/dist/tools/cmos/cmos-sprint-show.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-sprint-show.js +238 -0
- package/dist/tools/cmos/cmos-sprint-show.js.map +1 -0
- package/dist/tools/cmos/cmos-sprint-update.d.ts +150 -0
- package/dist/tools/cmos/cmos-sprint-update.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-sprint-update.js +191 -0
- package/dist/tools/cmos/cmos-sprint-update.js.map +1 -0
- package/dist/tools/cmos/cmos-sprint.d.ts +219 -0
- package/dist/tools/cmos/cmos-sprint.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-sprint.js +304 -0
- package/dist/tools/cmos/cmos-sprint.js.map +1 -0
- package/dist/tools/cmos/cmos-status.d.ts +69 -0
- package/dist/tools/cmos/cmos-status.d.ts.map +1 -0
- package/dist/tools/cmos/cmos-status.js +136 -0
- package/dist/tools/cmos/cmos-status.js.map +1 -0
- package/dist/tools/cmos/context-freshness.d.ts +67 -0
- package/dist/tools/cmos/context-freshness.d.ts.map +1 -0
- package/dist/tools/cmos/context-freshness.js +352 -0
- package/dist/tools/cmos/context-freshness.js.map +1 -0
- package/dist/tools/cmos/context-retention.d.ts +58 -0
- package/dist/tools/cmos/context-retention.d.ts.map +1 -0
- package/dist/tools/cmos/context-retention.js +507 -0
- package/dist/tools/cmos/context-retention.js.map +1 -0
- package/dist/tools/cmos/dashboard-client.d.ts +513 -0
- package/dist/tools/cmos/dashboard-client.d.ts.map +1 -0
- package/dist/tools/cmos/dashboard-client.js +800 -0
- package/dist/tools/cmos/dashboard-client.js.map +1 -0
- package/dist/tools/cmos/decision-memory.d.ts +39 -0
- package/dist/tools/cmos/decision-memory.d.ts.map +1 -0
- package/dist/tools/cmos/decision-memory.js +263 -0
- package/dist/tools/cmos/decision-memory.js.map +1 -0
- package/dist/tools/cmos/errors.d.ts +113 -0
- package/dist/tools/cmos/errors.d.ts.map +1 -0
- package/dist/tools/cmos/errors.js +315 -0
- package/dist/tools/cmos/errors.js.map +1 -0
- package/dist/tools/cmos/fts5-retriever.d.ts +101 -0
- package/dist/tools/cmos/fts5-retriever.d.ts.map +1 -0
- package/dist/tools/cmos/fts5-retriever.js +210 -0
- package/dist/tools/cmos/fts5-retriever.js.map +1 -0
- package/dist/tools/cmos/index.d.ts +1238 -0
- package/dist/tools/cmos/index.d.ts.map +1 -0
- package/dist/tools/cmos/index.js +359 -0
- package/dist/tools/cmos/index.js.map +1 -0
- package/dist/tools/cmos/learning-reaffirm.d.ts +74 -0
- package/dist/tools/cmos/learning-reaffirm.d.ts.map +1 -0
- package/dist/tools/cmos/learning-reaffirm.js +145 -0
- package/dist/tools/cmos/learning-reaffirm.js.map +1 -0
- package/dist/tools/cmos/orphan-detection.d.ts +55 -0
- package/dist/tools/cmos/orphan-detection.d.ts.map +1 -0
- package/dist/tools/cmos/orphan-detection.js +139 -0
- package/dist/tools/cmos/orphan-detection.js.map +1 -0
- package/dist/tools/cmos/owner-resolution.d.ts +21 -0
- package/dist/tools/cmos/owner-resolution.d.ts.map +1 -0
- package/dist/tools/cmos/owner-resolution.js +162 -0
- package/dist/tools/cmos/owner-resolution.js.map +1 -0
- package/dist/tools/cmos/project-identity.d.ts +112 -0
- package/dist/tools/cmos/project-identity.d.ts.map +1 -0
- package/dist/tools/cmos/project-identity.js +261 -0
- package/dist/tools/cmos/project-identity.js.map +1 -0
- package/dist/tools/cmos/relevance-surfacing.d.ts +40 -0
- package/dist/tools/cmos/relevance-surfacing.d.ts.map +1 -0
- package/dist/tools/cmos/relevance-surfacing.js +153 -0
- package/dist/tools/cmos/relevance-surfacing.js.map +1 -0
- package/dist/tools/cmos/schema-migrations.d.ts +157 -0
- package/dist/tools/cmos/schema-migrations.d.ts.map +1 -0
- package/dist/tools/cmos/schema-migrations.js +678 -0
- package/dist/tools/cmos/schema-migrations.js.map +1 -0
- package/dist/tools/cmos/schema.d.ts +76 -0
- package/dist/tools/cmos/schema.d.ts.map +1 -0
- package/dist/tools/cmos/schema.js +462 -0
- package/dist/tools/cmos/schema.js.map +1 -0
- package/dist/tools/cmos/sender-identity.d.ts +87 -0
- package/dist/tools/cmos/sender-identity.d.ts.map +1 -0
- package/dist/tools/cmos/sender-identity.js +207 -0
- package/dist/tools/cmos/sender-identity.js.map +1 -0
- package/dist/tools/cmos/staleness-detection.d.ts +128 -0
- package/dist/tools/cmos/staleness-detection.d.ts.map +1 -0
- package/dist/tools/cmos/staleness-detection.js +381 -0
- package/dist/tools/cmos/staleness-detection.js.map +1 -0
- package/dist/tools/cmos/supersession-detection.d.ts +46 -0
- package/dist/tools/cmos/supersession-detection.d.ts.map +1 -0
- package/dist/tools/cmos/supersession-detection.js +235 -0
- package/dist/tools/cmos/supersession-detection.js.map +1 -0
- package/dist/tools/cmos/sync-event-payloads.d.ts +576 -0
- package/dist/tools/cmos/sync-event-payloads.d.ts.map +1 -0
- package/dist/tools/cmos/sync-event-payloads.js +521 -0
- package/dist/tools/cmos/sync-event-payloads.js.map +1 -0
- package/dist/tools/cmos/sync-health-check.d.ts +43 -0
- package/dist/tools/cmos/sync-health-check.d.ts.map +1 -0
- package/dist/tools/cmos/sync-health-check.js +93 -0
- package/dist/tools/cmos/sync-health-check.js.map +1 -0
- package/dist/tools/cmos/sync-hooks.d.ts +82 -0
- package/dist/tools/cmos/sync-hooks.d.ts.map +1 -0
- package/dist/tools/cmos/sync-hooks.js +162 -0
- package/dist/tools/cmos/sync-hooks.js.map +1 -0
- package/dist/tools/cmos/sync-pusher.d.ts +128 -0
- package/dist/tools/cmos/sync-pusher.d.ts.map +1 -0
- package/dist/tools/cmos/sync-pusher.js +248 -0
- package/dist/tools/cmos/sync-pusher.js.map +1 -0
- package/dist/tools/cmos/sync-queue.d.ts +87 -0
- package/dist/tools/cmos/sync-queue.d.ts.map +1 -0
- package/dist/tools/cmos/sync-queue.js +208 -0
- package/dist/tools/cmos/sync-queue.js.map +1 -0
- package/dist/tools/cmos/tier-config.d.ts +32 -0
- package/dist/tools/cmos/tier-config.d.ts.map +1 -0
- package/dist/tools/cmos/tier-config.js +123 -0
- package/dist/tools/cmos/tier-config.js.map +1 -0
- package/dist/tools/cmos/types.d.ts +164 -0
- package/dist/tools/cmos/types.d.ts.map +1 -0
- package/dist/tools/cmos/types.js +11 -0
- package/dist/tools/cmos/types.js.map +1 -0
- package/dist/tools/combine-packs.d.ts +194 -0
- package/dist/tools/combine-packs.d.ts.map +1 -0
- package/dist/tools/combine-packs.js +283 -0
- package/dist/tools/combine-packs.js.map +1 -0
- package/dist/tools/create-mission.d.ts +192 -0
- package/dist/tools/create-mission.d.ts.map +1 -0
- package/dist/tools/create-mission.js +453 -0
- package/dist/tools/create-mission.js.map +1 -0
- package/dist/tools/export-template.d.ts +175 -0
- package/dist/tools/export-template.d.ts.map +1 -0
- package/dist/tools/export-template.js +212 -0
- package/dist/tools/export-template.js.map +1 -0
- package/dist/tools/extract-template.d.ts +106 -0
- package/dist/tools/extract-template.d.ts.map +1 -0
- package/dist/tools/extract-template.js +322 -0
- package/dist/tools/extract-template.js.map +1 -0
- package/dist/tools/formatters/mission-protocol-json.d.ts +122 -0
- package/dist/tools/formatters/mission-protocol-json.d.ts.map +1 -0
- package/dist/tools/formatters/mission-protocol-json.js +155 -0
- package/dist/tools/formatters/mission-protocol-json.js.map +1 -0
- package/dist/tools/import-template.d.ts +170 -0
- package/dist/tools/import-template.d.ts.map +1 -0
- package/dist/tools/import-template.js +203 -0
- package/dist/tools/import-template.js.map +1 -0
- package/dist/tools/list-domains.d.ts +70 -0
- package/dist/tools/list-domains.d.ts.map +1 -0
- package/dist/tools/list-domains.js +110 -0
- package/dist/tools/list-domains.js.map +1 -0
- package/dist/tools/optimize-tokens.d.ts +190 -0
- package/dist/tools/optimize-tokens.d.ts.map +1 -0
- package/dist/tools/optimize-tokens.js +193 -0
- package/dist/tools/optimize-tokens.js.map +1 -0
- package/dist/tools/score-quality.d.ts +76 -0
- package/dist/tools/score-quality.d.ts.map +1 -0
- package/dist/tools/score-quality.js +191 -0
- package/dist/tools/score-quality.js.map +1 -0
- package/dist/tools/split-mission.d.ts +181 -0
- package/dist/tools/split-mission.d.ts.map +1 -0
- package/dist/tools/split-mission.js +416 -0
- package/dist/tools/split-mission.js.map +1 -0
- package/dist/tools/suggest-splits.d.ts +162 -0
- package/dist/tools/suggest-splits.d.ts.map +1 -0
- package/dist/tools/suggest-splits.js +344 -0
- package/dist/tools/suggest-splits.js.map +1 -0
- package/dist/tools/tool-execution.d.ts +4 -0
- package/dist/tools/tool-execution.d.ts.map +1 -0
- package/dist/tools/tool-execution.js +3 -0
- package/dist/tools/tool-execution.js.map +1 -0
- package/dist/tools/version-template.d.ts +515 -0
- package/dist/tools/version-template.d.ts.map +1 -0
- package/dist/tools/version-template.js +338 -0
- package/dist/tools/version-template.js.map +1 -0
- package/dist/types/errors.d.ts +19 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +52 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/mission-types.d.ts +8 -0
- package/dist/types/mission-types.d.ts.map +1 -0
- package/dist/types/mission-types.js +12 -0
- package/dist/types/mission-types.js.map +1 -0
- package/dist/types/registry.d.ts +55 -0
- package/dist/types/registry.d.ts.map +1 -0
- package/dist/types/registry.js +10 -0
- package/dist/types/registry.js.map +1 -0
- package/dist/types/schemas.d.ts +25 -0
- package/dist/types/schemas.d.ts.map +1 -0
- package/dist/types/schemas.js +6 -0
- package/dist/types/schemas.js.map +1 -0
- package/dist/types/tools.d.ts +22 -0
- package/dist/types/tools.d.ts.map +1 -0
- package/dist/types/tools.js +10 -0
- package/dist/types/tools.js.map +1 -0
- package/dist/utils/abort.d.ts +16 -0
- package/dist/utils/abort.d.ts.map +1 -0
- package/dist/utils/abort.js +89 -0
- package/dist/utils/abort.js.map +1 -0
- package/dist/utils/fs.d.ts +14 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +114 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/workspace-io.d.ts +18 -0
- package/dist/utils/workspace-io.d.ts.map +1 -0
- package/dist/utils/workspace-io.js +40 -0
- package/dist/utils/workspace-io.js.map +1 -0
- package/dist/validation/common.d.ts +21 -0
- package/dist/validation/common.d.ts.map +1 -0
- package/dist/validation/common.js +241 -0
- package/dist/validation/common.js.map +1 -0
- package/dist/validation/errors.d.ts +21 -0
- package/dist/validation/errors.d.ts.map +1 -0
- package/dist/validation/errors.js +122 -0
- package/dist/validation/errors.js.map +1 -0
- package/dist/validation/middleware.d.ts +6 -0
- package/dist/validation/middleware.d.ts.map +1 -0
- package/dist/validation/middleware.js +26 -0
- package/dist/validation/middleware.js.map +1 -0
- package/dist/validation/schemas/config-schema.d.ts +25 -0
- package/dist/validation/schemas/config-schema.d.ts.map +1 -0
- package/dist/validation/schemas/config-schema.js +22 -0
- package/dist/validation/schemas/config-schema.js.map +1 -0
- package/dist/validation/schemas/domain-schema.d.ts +129 -0
- package/dist/validation/schemas/domain-schema.d.ts.map +1 -0
- package/dist/validation/schemas/domain-schema.js +28 -0
- package/dist/validation/schemas/domain-schema.js.map +1 -0
- package/dist/validation/schemas/file-path-schema.d.ts +10 -0
- package/dist/validation/schemas/file-path-schema.d.ts.map +1 -0
- package/dist/validation/schemas/file-path-schema.js +29 -0
- package/dist/validation/schemas/file-path-schema.js.map +1 -0
- package/dist/validation/schemas/mission-schema.d.ts +65 -0
- package/dist/validation/schemas/mission-schema.d.ts.map +1 -0
- package/dist/validation/schemas/mission-schema.js +24 -0
- package/dist/validation/schemas/mission-schema.js.map +1 -0
- package/dist/validation/schemas/template-schema.d.ts +364 -0
- package/dist/validation/schemas/template-schema.d.ts.map +1 -0
- package/dist/validation/schemas/template-schema.js +64 -0
- package/dist/validation/schemas/template-schema.js.map +1 -0
- package/dist/versioning/migration-engine.d.ts +82 -0
- package/dist/versioning/migration-engine.d.ts.map +1 -0
- package/dist/versioning/migration-engine.js +352 -0
- package/dist/versioning/migration-engine.js.map +1 -0
- package/dist/versioning/types.d.ts +236 -0
- package/dist/versioning/types.d.ts.map +1 -0
- package/dist/versioning/types.js +57 -0
- package/dist/versioning/types.js.map +1 -0
- package/dist/versioning/version-manager.d.ts +76 -0
- package/dist/versioning/version-manager.d.ts.map +1 -0
- package/dist/versioning/version-manager.js +386 -0
- package/dist/versioning/version-manager.js.map +1 -0
- package/package.json +117 -0
|
@@ -0,0 +1,889 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ABOUTME: cmos_db backfill action — replays CMOS state as sync events to the dashboard PG mirror.
|
|
3
|
+
// ABOUTME: Includes large-delta guard, per-request timeout, overall wall-clock timeout, and progress logging.
|
|
4
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
5
|
+
if (k2 === undefined) k2 = k;
|
|
6
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
7
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
8
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
9
|
+
}
|
|
10
|
+
Object.defineProperty(o, k2, desc);
|
|
11
|
+
}) : (function(o, m, k, k2) {
|
|
12
|
+
if (k2 === undefined) k2 = k;
|
|
13
|
+
o[k2] = m[k];
|
|
14
|
+
}));
|
|
15
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
16
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
17
|
+
}) : function(o, v) {
|
|
18
|
+
o["default"] = v;
|
|
19
|
+
});
|
|
20
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
21
|
+
var ownKeys = function(o) {
|
|
22
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
23
|
+
var ar = [];
|
|
24
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
25
|
+
return ar;
|
|
26
|
+
};
|
|
27
|
+
return ownKeys(o);
|
|
28
|
+
};
|
|
29
|
+
return function (mod) {
|
|
30
|
+
if (mod && mod.__esModule) return mod;
|
|
31
|
+
var result = {};
|
|
32
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
33
|
+
__setModuleDefault(result, mod);
|
|
34
|
+
return result;
|
|
35
|
+
};
|
|
36
|
+
})();
|
|
37
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
38
|
+
exports.LARGE_DELTA_THRESHOLD = void 0;
|
|
39
|
+
exports.cmosDbBackfill = cmosDbBackfill;
|
|
40
|
+
exports.cmosDbReconcile = cmosDbReconcile;
|
|
41
|
+
exports.formatReconciliationForLLM = formatReconciliationForLLM;
|
|
42
|
+
exports.identifyPgOrphans = identifyPgOrphans;
|
|
43
|
+
exports.formatPgOrphanReportForLLM = formatPgOrphanReportForLLM;
|
|
44
|
+
exports.cmosDbPurge = cmosDbPurge;
|
|
45
|
+
exports.formatPurgeForLLM = formatPurgeForLLM;
|
|
46
|
+
exports.formatBackfillForLLM = formatBackfillForLLM;
|
|
47
|
+
/**
|
|
48
|
+
* cmos_db backfill action
|
|
49
|
+
*
|
|
50
|
+
* Replays existing CMOS state (sprints, missions, sessions, decisions)
|
|
51
|
+
* as sync events so the dashboard has the full project picture.
|
|
52
|
+
*
|
|
53
|
+
* Idempotency: Tracks a `backfill_cursor` in the metadata table.
|
|
54
|
+
* Re-running only pushes events with timestamps after the cursor.
|
|
55
|
+
* Use `force: true` to replay everything regardless of cursor.
|
|
56
|
+
*
|
|
57
|
+
* Reliability:
|
|
58
|
+
* - Large-delta guard: skips push when any table exceeds LARGE_DELTA_THRESHOLD (50) records.
|
|
59
|
+
* Instructs the user to re-upload the SQLite file instead.
|
|
60
|
+
* - Per-request timeout: each HTTP push aborts after PER_REQUEST_TIMEOUT_MS (30s).
|
|
61
|
+
* - Overall timeout: the push loop aborts after OVERALL_TIMEOUT_MS (120s) wall-clock time.
|
|
62
|
+
* - Progress logging: reports pushed/failed/remaining to stderr every PROGRESS_LOG_INTERVAL events.
|
|
63
|
+
*
|
|
64
|
+
* @module tools/cmos/cmos-db-backfill
|
|
65
|
+
*/
|
|
66
|
+
const path = __importStar(require("path"));
|
|
67
|
+
const client_1 = require("./client");
|
|
68
|
+
const dashboard_client_1 = require("./dashboard-client");
|
|
69
|
+
const errors_1 = require("./errors");
|
|
70
|
+
const schema_migrations_1 = require("./schema-migrations");
|
|
71
|
+
// ─── Types ───────────────────────────────────────────────────────────────────
|
|
72
|
+
// ─── Constants ───────────────────────────────────────────────────────────────
|
|
73
|
+
/**
|
|
74
|
+
* Maximum per-table event delta before skipping push and recommending SQLite re-upload.
|
|
75
|
+
* Exported so tests can reference the boundary without magic numbers.
|
|
76
|
+
*/
|
|
77
|
+
exports.LARGE_DELTA_THRESHOLD = 50;
|
|
78
|
+
/** Per-request HTTP timeout for sync event pushes (ms). */
|
|
79
|
+
const PER_REQUEST_TIMEOUT_MS = 30000;
|
|
80
|
+
/** Maximum wall-clock time for a full backfill run (ms). */
|
|
81
|
+
const OVERALL_TIMEOUT_MS = 120000;
|
|
82
|
+
/** Log a progress line every N events pushed/failed. */
|
|
83
|
+
const PROGRESS_LOG_INTERVAL = 10;
|
|
84
|
+
/** Build a sync envelope for the dashboard push API */
|
|
85
|
+
function buildSyncEnvelope(identity, eventType, timestamp, data) {
|
|
86
|
+
return {
|
|
87
|
+
projectId: identity.projectId,
|
|
88
|
+
projectName: identity.projectName,
|
|
89
|
+
eventType,
|
|
90
|
+
timestamp,
|
|
91
|
+
data,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
// ─── Implementation ──────────────────────────────────────────────────────────
|
|
95
|
+
async function cmosDbBackfill(params) {
|
|
96
|
+
// Validate dashboard is configured; honour per-request timeout override
|
|
97
|
+
const clientResult = dashboard_client_1.DashboardClient.fromEnv({
|
|
98
|
+
timeoutMs: params.perRequestTimeoutMs ?? PER_REQUEST_TIMEOUT_MS,
|
|
99
|
+
});
|
|
100
|
+
if (!clientResult.success || !clientResult.data) {
|
|
101
|
+
return (0, errors_1.createError)(errors_1.CmosErrors.dashboardNotConfigured());
|
|
102
|
+
}
|
|
103
|
+
const dashboardClient = clientResult.data;
|
|
104
|
+
return (0, client_1.withClientAsync)(async (db) => {
|
|
105
|
+
const identity = getProjectIdentity(db);
|
|
106
|
+
const previousCursor = getCursor(db);
|
|
107
|
+
// force=true bypasses the large-delta guard but still resumes from the cursor.
|
|
108
|
+
// Starting from scratch on every force run means the timeout always hits the same
|
|
109
|
+
// early events and the cursor can never advance past them (or worse, regresses).
|
|
110
|
+
// True "replay from scratch" can be achieved by clearing the cursor first.
|
|
111
|
+
const since = previousCursor;
|
|
112
|
+
// File-based sync: if the project is registered (has a dashboard_slug), use
|
|
113
|
+
// POST /api/sync/sqlite-backfill instead of event-replay. One HTTP call handles
|
|
114
|
+
// any number of records without timeout or cursor issues.
|
|
115
|
+
if (!params.dryRun) {
|
|
116
|
+
const slugResult = db.getOne(`SELECT value FROM metadata WHERE key = 'dashboard_slug'`);
|
|
117
|
+
const slug = (slugResult.success && slugResult.data?.value) || null;
|
|
118
|
+
if (slug) {
|
|
119
|
+
const fileResult = await dashboardClient.syncSqliteFile(db.path, slug, deriveProjectSlug(identity.projectName));
|
|
120
|
+
if (fileResult.success && fileResult.data) {
|
|
121
|
+
const d = fileResult.data;
|
|
122
|
+
const counts = d.counts ?? {};
|
|
123
|
+
const total = Object.values(counts).reduce((a, b) => a + b, 0);
|
|
124
|
+
return (0, errors_1.createSuccess)({
|
|
125
|
+
mode: 'backfill',
|
|
126
|
+
dryRun: false,
|
|
127
|
+
totalEvents: total,
|
|
128
|
+
pushed: total,
|
|
129
|
+
failed: d.errors.length,
|
|
130
|
+
skipped: 0,
|
|
131
|
+
deduped: 0,
|
|
132
|
+
breakdown: {
|
|
133
|
+
sprints: counts['sprints'] ?? 0,
|
|
134
|
+
missions: counts['missions'] ?? 0,
|
|
135
|
+
sessions: counts['sessions'] ?? 0,
|
|
136
|
+
decisions: counts['decisions'] ?? 0,
|
|
137
|
+
learnings: counts['learnings'] ?? 0,
|
|
138
|
+
dependencies: counts['dependencies'] ?? 0,
|
|
139
|
+
},
|
|
140
|
+
cursor: null,
|
|
141
|
+
previousCursor,
|
|
142
|
+
message: `File-based sync complete (${d.durationMs}ms): ${total} record(s) synced` +
|
|
143
|
+
(d.errors.length > 0 ? `, ${d.errors.length} error(s)` : '') +
|
|
144
|
+
`. Sprints: ${counts['sprints'] ?? 0}, missions: ${counts['missions'] ?? 0}, sessions: ${counts['sessions'] ?? 0}, decisions: ${counts['decisions'] ?? 0}, learnings: ${counts['learnings'] ?? 0}.`,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
// File sync failed — fall through to event-replay as fallback
|
|
148
|
+
console.error(`[backfill] File-based sync failed (slug: ${slug}), falling back to event-replay: ${fileResult.error?.message ?? 'unknown'}`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// Ensure content_hash columns exist and are populated
|
|
152
|
+
(0, schema_migrations_1.migrateContentHash)(db);
|
|
153
|
+
const warnings = [];
|
|
154
|
+
if (identity.repaired) {
|
|
155
|
+
warnings.push(`Project metadata was empty — repaired from ${identity.repairSource} (id: ${identity.projectId}, name: ${identity.projectName})`);
|
|
156
|
+
}
|
|
157
|
+
else if (identity.projectId === 'unknown') {
|
|
158
|
+
warnings.push('Project identity is still "unknown" after repair attempts. ' +
|
|
159
|
+
'Run cmos_project(action="register", projectRoot="<path>", name="<name>") to set identity.');
|
|
160
|
+
}
|
|
161
|
+
const events = [];
|
|
162
|
+
const breakdown = {
|
|
163
|
+
sprints: 0,
|
|
164
|
+
missions: 0,
|
|
165
|
+
sessions: 0,
|
|
166
|
+
decisions: 0,
|
|
167
|
+
learnings: 0,
|
|
168
|
+
dependencies: 0,
|
|
169
|
+
};
|
|
170
|
+
// 1. Sprints
|
|
171
|
+
const sprintsResult = db.getMany(`SELECT * FROM sprints ORDER BY id`);
|
|
172
|
+
if (sprintsResult.success && sprintsResult.data) {
|
|
173
|
+
for (const sprint of sprintsResult.data) {
|
|
174
|
+
const ts = sprint.start_date ?? sprint.end_date ?? new Date().toISOString();
|
|
175
|
+
if (since && ts <= since)
|
|
176
|
+
continue;
|
|
177
|
+
events.push({
|
|
178
|
+
type: 'sprint_added',
|
|
179
|
+
timestamp: ts,
|
|
180
|
+
data: { sprintId: sprint.id, title: sprint.title },
|
|
181
|
+
});
|
|
182
|
+
breakdown.sprints++;
|
|
183
|
+
if (sprint.status === 'Completed' && sprint.end_date) {
|
|
184
|
+
events.push({
|
|
185
|
+
type: 'sprint_completed',
|
|
186
|
+
timestamp: sprint.end_date,
|
|
187
|
+
data: {
|
|
188
|
+
sprintId: sprint.id,
|
|
189
|
+
previousStatus: 'Active',
|
|
190
|
+
completedAt: sprint.end_date,
|
|
191
|
+
lifecycle: {
|
|
192
|
+
kpis: {
|
|
193
|
+
totalMissions: sprint.total_missions,
|
|
194
|
+
completedMissions: sprint.completed_missions,
|
|
195
|
+
},
|
|
196
|
+
},
|
|
197
|
+
},
|
|
198
|
+
});
|
|
199
|
+
breakdown.sprints++;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
// 2. Missions
|
|
204
|
+
const missionsResult = db.getMany(`SELECT * FROM missions ORDER BY COALESCE(created_at, started_at, completed_at, id)`);
|
|
205
|
+
if (missionsResult.success && missionsResult.data) {
|
|
206
|
+
for (const mission of missionsResult.data) {
|
|
207
|
+
const createdTs = mission.created_at ?? mission.started_at ?? new Date().toISOString();
|
|
208
|
+
if (since && createdTs <= since)
|
|
209
|
+
continue;
|
|
210
|
+
// Always emit mission_added so every mission gets a PG row
|
|
211
|
+
events.push({
|
|
212
|
+
type: 'mission_added',
|
|
213
|
+
timestamp: createdTs,
|
|
214
|
+
data: {
|
|
215
|
+
missionId: mission.id,
|
|
216
|
+
name: mission.name,
|
|
217
|
+
sprintId: mission.sprint_id ?? '',
|
|
218
|
+
status: mission.status,
|
|
219
|
+
objective: mission.notes ?? null,
|
|
220
|
+
successCriteria: null,
|
|
221
|
+
deliverables: null,
|
|
222
|
+
addedAt: createdTs,
|
|
223
|
+
},
|
|
224
|
+
});
|
|
225
|
+
breakdown.missions++;
|
|
226
|
+
if (mission.started_at) {
|
|
227
|
+
events.push({
|
|
228
|
+
type: 'mission_started',
|
|
229
|
+
timestamp: mission.started_at,
|
|
230
|
+
data: {
|
|
231
|
+
missionId: mission.id,
|
|
232
|
+
previousStatus: 'Queued',
|
|
233
|
+
currentStatus: 'In Progress',
|
|
234
|
+
sprintId: mission.sprint_id,
|
|
235
|
+
notes: null,
|
|
236
|
+
transitionAt: mission.started_at,
|
|
237
|
+
},
|
|
238
|
+
});
|
|
239
|
+
breakdown.missions++;
|
|
240
|
+
}
|
|
241
|
+
if (mission.status === 'Completed' && mission.completed_at) {
|
|
242
|
+
events.push({
|
|
243
|
+
type: 'mission_completed',
|
|
244
|
+
timestamp: mission.completed_at,
|
|
245
|
+
data: {
|
|
246
|
+
missionId: mission.id,
|
|
247
|
+
previousStatus: 'In Progress',
|
|
248
|
+
currentStatus: 'Completed',
|
|
249
|
+
completedAt: mission.completed_at,
|
|
250
|
+
},
|
|
251
|
+
});
|
|
252
|
+
breakdown.missions++;
|
|
253
|
+
}
|
|
254
|
+
if (mission.status === 'Blocked') {
|
|
255
|
+
events.push({
|
|
256
|
+
type: 'mission_blocked',
|
|
257
|
+
timestamp: createdTs,
|
|
258
|
+
data: {
|
|
259
|
+
missionId: mission.id,
|
|
260
|
+
previousStatus: 'In Progress',
|
|
261
|
+
currentStatus: 'Blocked',
|
|
262
|
+
reason: mission.notes ?? 'Unknown',
|
|
263
|
+
},
|
|
264
|
+
});
|
|
265
|
+
breakdown.missions++;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
// 3. Sessions
|
|
270
|
+
const sessionsResult = db.getMany(`SELECT * FROM sessions ORDER BY started_at`);
|
|
271
|
+
if (sessionsResult.success && sessionsResult.data) {
|
|
272
|
+
for (const session of sessionsResult.data) {
|
|
273
|
+
if (since && session.started_at <= since)
|
|
274
|
+
continue;
|
|
275
|
+
events.push({
|
|
276
|
+
type: 'session_started',
|
|
277
|
+
timestamp: session.started_at,
|
|
278
|
+
data: {
|
|
279
|
+
sessionId: session.id,
|
|
280
|
+
type: session.type,
|
|
281
|
+
title: session.title,
|
|
282
|
+
startedAt: session.started_at,
|
|
283
|
+
sprintId: session.sprint_id,
|
|
284
|
+
},
|
|
285
|
+
});
|
|
286
|
+
breakdown.sessions++;
|
|
287
|
+
if (session.status === 'completed' && session.completed_at) {
|
|
288
|
+
let captureCount = 0;
|
|
289
|
+
let nextSteps = null;
|
|
290
|
+
try {
|
|
291
|
+
captureCount = JSON.parse(session.captures ?? '[]').length;
|
|
292
|
+
}
|
|
293
|
+
catch {
|
|
294
|
+
/* ignore */
|
|
295
|
+
}
|
|
296
|
+
try {
|
|
297
|
+
nextSteps = session.next_steps ? JSON.parse(session.next_steps) : null;
|
|
298
|
+
}
|
|
299
|
+
catch {
|
|
300
|
+
/* ignore */
|
|
301
|
+
}
|
|
302
|
+
events.push({
|
|
303
|
+
type: 'session_completed',
|
|
304
|
+
timestamp: session.completed_at,
|
|
305
|
+
data: {
|
|
306
|
+
sessionId: session.id,
|
|
307
|
+
completedAt: session.completed_at,
|
|
308
|
+
summary: session.summary,
|
|
309
|
+
captureCount,
|
|
310
|
+
nextSteps,
|
|
311
|
+
},
|
|
312
|
+
});
|
|
313
|
+
breakdown.sessions++;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
// 4. Decisions (with content hash dedup)
|
|
318
|
+
const seenDecisionHashes = new Set();
|
|
319
|
+
let deduped = 0;
|
|
320
|
+
const decisionsResult = db.getMany(`SELECT * FROM strategic_decisions ORDER BY created_at`);
|
|
321
|
+
if (decisionsResult.success && decisionsResult.data) {
|
|
322
|
+
for (const decision of decisionsResult.data) {
|
|
323
|
+
if (since && decision.created_at <= since)
|
|
324
|
+
continue;
|
|
325
|
+
// Compute or use stored content hash for dedup
|
|
326
|
+
const hash = decision.content_hash ??
|
|
327
|
+
(0, schema_migrations_1.computeContentHash)(decision.decision_text, decision.project_domain ?? 'general');
|
|
328
|
+
if (seenDecisionHashes.has(hash)) {
|
|
329
|
+
deduped++;
|
|
330
|
+
continue;
|
|
331
|
+
}
|
|
332
|
+
seenDecisionHashes.add(hash);
|
|
333
|
+
events.push({
|
|
334
|
+
type: 'decision_captured',
|
|
335
|
+
timestamp: decision.created_at,
|
|
336
|
+
data: {
|
|
337
|
+
decisionId: decision.id,
|
|
338
|
+
sessionId: decision.session_id ?? '',
|
|
339
|
+
category: 'decision',
|
|
340
|
+
content: decision.decision_text,
|
|
341
|
+
contentHash: hash,
|
|
342
|
+
missionId: decision.mission_id,
|
|
343
|
+
sprintId: decision.sprint_id,
|
|
344
|
+
},
|
|
345
|
+
});
|
|
346
|
+
breakdown.decisions++;
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
// 5. Learnings (with content hash dedup)
|
|
350
|
+
const seenLearningHashes = new Set();
|
|
351
|
+
const learningsResult = db.getMany(`SELECT * FROM learnings ORDER BY created_at`);
|
|
352
|
+
if (learningsResult.success && learningsResult.data) {
|
|
353
|
+
for (const learning of learningsResult.data) {
|
|
354
|
+
if (since && learning.created_at <= since)
|
|
355
|
+
continue;
|
|
356
|
+
// Compute or use stored content hash for dedup
|
|
357
|
+
const hash = learning.content_hash ?? (0, schema_migrations_1.computeContentHash)(learning.content, learning.category ?? '');
|
|
358
|
+
if (seenLearningHashes.has(hash)) {
|
|
359
|
+
deduped++;
|
|
360
|
+
continue;
|
|
361
|
+
}
|
|
362
|
+
seenLearningHashes.add(hash);
|
|
363
|
+
events.push({
|
|
364
|
+
type: 'learning_captured',
|
|
365
|
+
timestamp: learning.created_at,
|
|
366
|
+
data: {
|
|
367
|
+
learningId: learning.id,
|
|
368
|
+
content: learning.content,
|
|
369
|
+
contentHash: hash,
|
|
370
|
+
sessionId: learning.session_id ?? '',
|
|
371
|
+
sprintId: learning.sprint_id,
|
|
372
|
+
missionId: learning.mission_id,
|
|
373
|
+
capturedAt: learning.created_at,
|
|
374
|
+
},
|
|
375
|
+
});
|
|
376
|
+
breakdown.learnings++;
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
// 6. Dependencies (join with missions to get a timestamp)
|
|
380
|
+
const dependenciesResult = db.getMany(`SELECT d.from_id, d.to_id, d.type, m.created_at AS from_created_at
|
|
381
|
+
FROM mission_dependencies d
|
|
382
|
+
LEFT JOIN missions m ON d.from_id = m.id
|
|
383
|
+
ORDER BY COALESCE(m.created_at, d.from_id)`);
|
|
384
|
+
if (dependenciesResult.success && dependenciesResult.data) {
|
|
385
|
+
for (const dep of dependenciesResult.data) {
|
|
386
|
+
const ts = dep.from_created_at ?? new Date().toISOString();
|
|
387
|
+
if (since && ts <= since)
|
|
388
|
+
continue;
|
|
389
|
+
events.push({
|
|
390
|
+
type: 'dependency_added',
|
|
391
|
+
timestamp: ts,
|
|
392
|
+
data: {
|
|
393
|
+
fromId: dep.from_id,
|
|
394
|
+
toId: dep.to_id,
|
|
395
|
+
type: dep.type,
|
|
396
|
+
},
|
|
397
|
+
});
|
|
398
|
+
breakdown.dependencies++;
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
// Sort chronologically
|
|
402
|
+
events.sort((a, b) => a.timestamp.localeCompare(b.timestamp));
|
|
403
|
+
const totalEvents = events.length;
|
|
404
|
+
// Large-delta guard: skip push when any entity type exceeds threshold.
|
|
405
|
+
// Directs the user to re-upload the SQLite file instead.
|
|
406
|
+
// Bypassed when force=true — upserts are idempotent, large-batch replays are safe.
|
|
407
|
+
if (!params.dryRun && !params.force) {
|
|
408
|
+
const tableNames = Object.keys(breakdown);
|
|
409
|
+
for (const table of tableNames) {
|
|
410
|
+
if (breakdown[table] > exports.LARGE_DELTA_THRESHOLD) {
|
|
411
|
+
const dashUrl = process.env['CMOS_DASHBOARD_URL'] ?? '';
|
|
412
|
+
const slugResult = db.getOne(`SELECT value FROM metadata WHERE key = 'dashboard_slug'`);
|
|
413
|
+
const slug = (slugResult.success && slugResult.data?.value) || 'your-project';
|
|
414
|
+
const uploadPath = dashUrl ? `${dashUrl}/projects/${slug}` : 'your dashboard';
|
|
415
|
+
const warningMsg = `Delta too large: ${breakdown[table]} ${table} records exceed threshold of ` +
|
|
416
|
+
`${exports.LARGE_DELTA_THRESHOLD}. Re-upload your SQLite file at ${uploadPath} instead.`;
|
|
417
|
+
console.error(`[backfill] ${warningMsg}`);
|
|
418
|
+
return (0, errors_1.createSuccess)({
|
|
419
|
+
mode: 'backfill',
|
|
420
|
+
dryRun: false,
|
|
421
|
+
totalEvents,
|
|
422
|
+
pushed: 0,
|
|
423
|
+
failed: 0,
|
|
424
|
+
skipped: totalEvents,
|
|
425
|
+
deduped,
|
|
426
|
+
breakdown,
|
|
427
|
+
cursor: previousCursor,
|
|
428
|
+
previousCursor,
|
|
429
|
+
message: `Delta too large (${breakdown[table]} ${table} records). Re-upload your SQLite file at ${uploadPath} instead.`,
|
|
430
|
+
warnings: [warningMsg, ...(warnings.length > 0 ? warnings : [])],
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
if (params.dryRun) {
|
|
436
|
+
return (0, errors_1.createSuccess)({
|
|
437
|
+
mode: 'backfill',
|
|
438
|
+
dryRun: true,
|
|
439
|
+
totalEvents,
|
|
440
|
+
pushed: 0,
|
|
441
|
+
failed: 0,
|
|
442
|
+
skipped: 0,
|
|
443
|
+
deduped,
|
|
444
|
+
breakdown,
|
|
445
|
+
cursor: previousCursor,
|
|
446
|
+
previousCursor,
|
|
447
|
+
message: `Dry run: ${totalEvents} events would be pushed (${breakdown.sprints} sprint, ${breakdown.missions} mission, ${breakdown.sessions} session, ${breakdown.decisions} decision, ${breakdown.learnings} learning, ${breakdown.dependencies} dependency events)${deduped > 0 ? `. ${deduped} duplicate(s) skipped by content hash.` : ''}.`,
|
|
448
|
+
warnings: warnings.length > 0 ? warnings : undefined,
|
|
449
|
+
});
|
|
450
|
+
}
|
|
451
|
+
// Push events sequentially with per-request and overall timeouts
|
|
452
|
+
const getNow = params._getNow ?? Date.now;
|
|
453
|
+
const effectiveOverallTimeout = params.overallTimeoutMs ?? OVERALL_TIMEOUT_MS;
|
|
454
|
+
const wallClockStart = getNow();
|
|
455
|
+
let pushed = 0;
|
|
456
|
+
let failed = 0;
|
|
457
|
+
let latestTimestamp = null;
|
|
458
|
+
let timedOut = false;
|
|
459
|
+
for (const event of events) {
|
|
460
|
+
// Check wall-clock overall timeout before each push
|
|
461
|
+
if (getNow() - wallClockStart > effectiveOverallTimeout) {
|
|
462
|
+
timedOut = true;
|
|
463
|
+
const remaining = totalEvents - pushed - failed;
|
|
464
|
+
console.error(`[backfill] Overall timeout (${effectiveOverallTimeout}ms) exceeded. ` +
|
|
465
|
+
`Aborted: ${pushed} pushed, ${failed} failed, ${remaining} remaining.`);
|
|
466
|
+
break;
|
|
467
|
+
}
|
|
468
|
+
const envelope = buildSyncEnvelope(identity, event.type, event.timestamp, event.data);
|
|
469
|
+
const result = await dashboardClient.pushSyncEvent(envelope);
|
|
470
|
+
if (result.success) {
|
|
471
|
+
pushed++;
|
|
472
|
+
latestTimestamp = event.timestamp;
|
|
473
|
+
}
|
|
474
|
+
else {
|
|
475
|
+
failed++;
|
|
476
|
+
console.warn(`[backfill] Failed to push ${event.type}: ${result.error?.message}`);
|
|
477
|
+
}
|
|
478
|
+
// Progress logging every PROGRESS_LOG_INTERVAL events
|
|
479
|
+
const processed = pushed + failed;
|
|
480
|
+
if (processed % PROGRESS_LOG_INTERVAL === 0) {
|
|
481
|
+
const remaining = totalEvents - processed;
|
|
482
|
+
console.error(`[backfill] Progress: ${pushed} pushed, ${failed} failed, ${remaining} remaining`);
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
// Update cursor — only advance, never regress.
|
|
486
|
+
// A force=true run that times out early must not overwrite a previously-advanced
|
|
487
|
+
// cursor with an earlier timestamp, or the next run re-processes the same events.
|
|
488
|
+
if (latestTimestamp && (!previousCursor || latestTimestamp > previousCursor)) {
|
|
489
|
+
db.execute(`INSERT OR REPLACE INTO metadata (key, value) VALUES ('backfill_cursor', ?)`, [
|
|
490
|
+
latestTimestamp,
|
|
491
|
+
]);
|
|
492
|
+
}
|
|
493
|
+
const finalWarnings = warnings.length > 0 ? [...warnings] : [];
|
|
494
|
+
if (timedOut) {
|
|
495
|
+
const remaining = totalEvents - pushed - failed;
|
|
496
|
+
finalWarnings.push(`Backfill timed out after ${effectiveOverallTimeout}ms. ` +
|
|
497
|
+
`${remaining} event(s) not pushed. Re-run to continue from cursor.`);
|
|
498
|
+
}
|
|
499
|
+
return (0, errors_1.createSuccess)({
|
|
500
|
+
mode: 'backfill',
|
|
501
|
+
dryRun: false,
|
|
502
|
+
totalEvents,
|
|
503
|
+
pushed,
|
|
504
|
+
failed,
|
|
505
|
+
skipped: 0,
|
|
506
|
+
deduped,
|
|
507
|
+
breakdown,
|
|
508
|
+
cursor: latestTimestamp ?? previousCursor,
|
|
509
|
+
previousCursor,
|
|
510
|
+
message: `Backfill complete: ${pushed}/${totalEvents} events pushed${failed > 0 ? ` (${failed} failed)` : ''}${deduped > 0 ? ` (${deduped} duplicates skipped)` : ''}. ${breakdown.sprints} sprint, ${breakdown.missions} mission, ${breakdown.sessions} session, ${breakdown.decisions} decision, ${breakdown.learnings} learning, ${breakdown.dependencies} dependency events.`,
|
|
511
|
+
warnings: finalWarnings.length > 0 ? finalWarnings : undefined,
|
|
512
|
+
});
|
|
513
|
+
}, { projectRoot: params.projectRoot });
|
|
514
|
+
}
|
|
515
|
+
function getProjectIdentity(db) {
|
|
516
|
+
const pidResult = db.getOne(`SELECT value FROM metadata WHERE key = 'project_id'`);
|
|
517
|
+
const pnameResult = db.getOne(`SELECT value FROM metadata WHERE key = 'project_name'`);
|
|
518
|
+
let projectId = (pidResult.success && pidResult.data?.value) || '';
|
|
519
|
+
let projectName = (pnameResult.success && pnameResult.data?.value) || '';
|
|
520
|
+
// If both are present, return as-is
|
|
521
|
+
if (projectId && projectName) {
|
|
522
|
+
return { projectId, projectName, repaired: false, repairSource: null };
|
|
523
|
+
}
|
|
524
|
+
// Attempt repair from directory name (db path: {root}/cmos/db/cmos.sqlite)
|
|
525
|
+
const dbPath = db.path;
|
|
526
|
+
const projectRoot = path.resolve(dbPath, '..', '..', '..');
|
|
527
|
+
const dirName = path.basename(projectRoot);
|
|
528
|
+
if (dirName && dirName !== '.' && dirName !== '/') {
|
|
529
|
+
if (!projectName) {
|
|
530
|
+
projectName = dirName
|
|
531
|
+
.split('-')
|
|
532
|
+
.map((w) => w.charAt(0).toUpperCase() + w.slice(1))
|
|
533
|
+
.join(' ');
|
|
534
|
+
}
|
|
535
|
+
if (!projectId) {
|
|
536
|
+
projectId = dirName.toLowerCase().replace(/\s+/g, '-');
|
|
537
|
+
}
|
|
538
|
+
// Persist the repair
|
|
539
|
+
db.execute(`INSERT OR REPLACE INTO metadata (key, value) VALUES ('project_id', ?)`, [
|
|
540
|
+
projectId,
|
|
541
|
+
]);
|
|
542
|
+
db.execute(`INSERT OR REPLACE INTO metadata (key, value) VALUES ('project_name', ?)`, [
|
|
543
|
+
projectName,
|
|
544
|
+
]);
|
|
545
|
+
return { projectId, projectName, repaired: true, repairSource: 'directory' };
|
|
546
|
+
}
|
|
547
|
+
// Attempt repair from master_context
|
|
548
|
+
const contextResult = db.getOne(`SELECT content FROM contexts WHERE id = 'master_context'`);
|
|
549
|
+
if (contextResult.success && contextResult.data?.content) {
|
|
550
|
+
try {
|
|
551
|
+
const content = JSON.parse(contextResult.data.content);
|
|
552
|
+
const ctxProject = content.project_identity || content.project || {};
|
|
553
|
+
const ctxName = ctxProject.name;
|
|
554
|
+
if (ctxName) {
|
|
555
|
+
if (!projectName)
|
|
556
|
+
projectName = ctxName;
|
|
557
|
+
if (!projectId)
|
|
558
|
+
projectId = ctxName.toLowerCase().replace(/\s+/g, '-');
|
|
559
|
+
db.execute(`INSERT OR REPLACE INTO metadata (key, value) VALUES ('project_id', ?)`, [
|
|
560
|
+
projectId,
|
|
561
|
+
]);
|
|
562
|
+
db.execute(`INSERT OR REPLACE INTO metadata (key, value) VALUES ('project_name', ?)`, [
|
|
563
|
+
projectName,
|
|
564
|
+
]);
|
|
565
|
+
return { projectId, projectName, repaired: true, repairSource: 'master_context' };
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
catch {
|
|
569
|
+
// JSON parse failure — fall through to fallback
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
// Fallback: still unknown
|
|
573
|
+
return {
|
|
574
|
+
projectId: projectId || 'unknown',
|
|
575
|
+
projectName: projectName || 'Unknown',
|
|
576
|
+
repaired: false,
|
|
577
|
+
repairSource: null,
|
|
578
|
+
};
|
|
579
|
+
}
|
|
580
|
+
function getCursor(db) {
|
|
581
|
+
const result = db.getOne(`SELECT value FROM metadata WHERE key = 'backfill_cursor'`);
|
|
582
|
+
return (result.success && result.data?.value) || null;
|
|
583
|
+
}
|
|
584
|
+
/** PG table → SQLite table name mapping (used by global reconciliation fallback) */
|
|
585
|
+
const PG_TO_SQLITE_TABLE = {
|
|
586
|
+
cmos_sprints: 'sprints',
|
|
587
|
+
cmos_missions: 'missions',
|
|
588
|
+
cmos_sessions: 'sessions',
|
|
589
|
+
cmos_decisions: 'strategic_decisions',
|
|
590
|
+
cmos_learnings: 'learnings',
|
|
591
|
+
cmos_mission_dependencies: 'mission_dependencies',
|
|
592
|
+
};
|
|
593
|
+
/** Derive a dashboard-compatible slug from the project name */
|
|
594
|
+
function deriveProjectSlug(projectName) {
|
|
595
|
+
return projectName.toLowerCase().replace(/\s+/g, '-');
|
|
596
|
+
}
|
|
597
|
+
async function cmosDbReconcile(params) {
|
|
598
|
+
const clientResult = dashboard_client_1.DashboardClient.fromEnv();
|
|
599
|
+
if (!clientResult.success || !clientResult.data) {
|
|
600
|
+
return (0, errors_1.createError)(errors_1.CmosErrors.dashboardNotConfigured());
|
|
601
|
+
}
|
|
602
|
+
const dashboardClient = clientResult.data;
|
|
603
|
+
return (0, client_1.withClientAsync)(async (db) => {
|
|
604
|
+
// Resolve project slug from metadata
|
|
605
|
+
const identity = getProjectIdentity(db);
|
|
606
|
+
const slug = deriveProjectSlug(identity.projectName);
|
|
607
|
+
// Use project-scoped status endpoint for accurate table counts
|
|
608
|
+
// (project-state endpoint caps entity arrays, e.g. sessions LIMIT 50)
|
|
609
|
+
const statusResult = await dashboardClient.getSyncStatus(slug);
|
|
610
|
+
if (!statusResult.success || !statusResult.data) {
|
|
611
|
+
// Fallback to global endpoint if project-scoped status fails
|
|
612
|
+
return reconcileWithGlobalEndpoint(db, dashboardClient);
|
|
613
|
+
}
|
|
614
|
+
const pgStatus = statusResult.data;
|
|
615
|
+
const tables = [];
|
|
616
|
+
for (const pgTable of pgStatus.tables) {
|
|
617
|
+
const sqliteTable = PG_TO_SQLITE_TABLE[pgTable.table];
|
|
618
|
+
if (!sqliteTable)
|
|
619
|
+
continue;
|
|
620
|
+
const countResult = db.getOne(`SELECT COUNT(*) AS cnt FROM ${sqliteTable}`);
|
|
621
|
+
const sqliteCount = countResult.success && countResult.data ? countResult.data.cnt : 0;
|
|
622
|
+
tables.push({
|
|
623
|
+
table: sqliteTable,
|
|
624
|
+
sqliteCount,
|
|
625
|
+
pgCount: pgTable.count,
|
|
626
|
+
match: sqliteCount === pgTable.count,
|
|
627
|
+
delta: sqliteCount - pgTable.count,
|
|
628
|
+
});
|
|
629
|
+
}
|
|
630
|
+
const totalSqlite = tables.reduce((sum, t) => sum + t.sqliteCount, 0);
|
|
631
|
+
const totalPg = tables.reduce((sum, t) => sum + t.pgCount, 0);
|
|
632
|
+
return (0, errors_1.createSuccess)({
|
|
633
|
+
tables,
|
|
634
|
+
allMatch: tables.every((t) => t.match),
|
|
635
|
+
totalSqlite,
|
|
636
|
+
totalPg,
|
|
637
|
+
projectScoped: true,
|
|
638
|
+
projectSlug: slug,
|
|
639
|
+
syncLogEntries: pgStatus.totalSyncLogEntries,
|
|
640
|
+
failedEntries: pgStatus.failedSyncLogEntries,
|
|
641
|
+
lastSyncAt: pgStatus.lastSyncAt,
|
|
642
|
+
});
|
|
643
|
+
}, { projectRoot: params.projectRoot });
|
|
644
|
+
}
|
|
645
|
+
/** Fallback: reconcile using global endpoint (pre-Sprint 34 behavior) */
|
|
646
|
+
async function reconcileWithGlobalEndpoint(db, client) {
|
|
647
|
+
const statusResult = await client.getSyncStatus();
|
|
648
|
+
if (!statusResult.success || !statusResult.data) {
|
|
649
|
+
return (0, errors_1.createError)(statusResult.error ?? errors_1.CmosErrors.dashboardError('Failed to fetch sync status'));
|
|
650
|
+
}
|
|
651
|
+
const pgStatus = statusResult.data;
|
|
652
|
+
const tables = [];
|
|
653
|
+
for (const pgTable of pgStatus.tables) {
|
|
654
|
+
const sqliteTable = PG_TO_SQLITE_TABLE[pgTable.table];
|
|
655
|
+
if (!sqliteTable)
|
|
656
|
+
continue;
|
|
657
|
+
const countResult = db.getOne(`SELECT COUNT(*) AS cnt FROM ${sqliteTable}`);
|
|
658
|
+
const sqliteCount = countResult.success && countResult.data ? countResult.data.cnt : 0;
|
|
659
|
+
tables.push({
|
|
660
|
+
table: sqliteTable,
|
|
661
|
+
sqliteCount,
|
|
662
|
+
pgCount: pgTable.count,
|
|
663
|
+
match: sqliteCount === pgTable.count,
|
|
664
|
+
delta: sqliteCount - pgTable.count,
|
|
665
|
+
});
|
|
666
|
+
}
|
|
667
|
+
const totalSqlite = tables.reduce((sum, t) => sum + t.sqliteCount, 0);
|
|
668
|
+
const totalPg = tables.reduce((sum, t) => sum + t.pgCount, 0);
|
|
669
|
+
return (0, errors_1.createSuccess)({
|
|
670
|
+
tables,
|
|
671
|
+
allMatch: tables.every((t) => t.match),
|
|
672
|
+
totalSqlite,
|
|
673
|
+
totalPg,
|
|
674
|
+
projectScoped: false,
|
|
675
|
+
projectSlug: null,
|
|
676
|
+
syncLogEntries: pgStatus.totalSyncLogEntries,
|
|
677
|
+
failedEntries: pgStatus.failedSyncLogEntries,
|
|
678
|
+
lastSyncAt: pgStatus.lastSyncAt,
|
|
679
|
+
});
|
|
680
|
+
}
|
|
681
|
+
function formatReconciliationForLLM(result) {
|
|
682
|
+
if (!result.success) {
|
|
683
|
+
return `Reconciliation failed: ${result.error?.message ?? 'Unknown error'}`;
|
|
684
|
+
}
|
|
685
|
+
const d = result.data;
|
|
686
|
+
const scopeLabel = d.projectScoped
|
|
687
|
+
? `Reconciliation (project-scoped: ${d.projectSlug}): `
|
|
688
|
+
: 'Reconciliation (global): ';
|
|
689
|
+
const lines = [
|
|
690
|
+
scopeLabel + (d.allMatch ? 'ALL MATCH' : 'MISMATCHES DETECTED'),
|
|
691
|
+
'',
|
|
692
|
+
'Table | SQLite | PG | Match | Delta',
|
|
693
|
+
'-------------------------|--------|------|-------|------',
|
|
694
|
+
];
|
|
695
|
+
for (const t of d.tables) {
|
|
696
|
+
const status = t.match ? 'YES' : 'NO';
|
|
697
|
+
const delta = t.delta === 0 ? '0' : t.delta > 0 ? `+${t.delta}` : `${t.delta}`;
|
|
698
|
+
lines.push(`${t.table.padEnd(25)}| ${String(t.sqliteCount).padEnd(7)}| ${String(t.pgCount).padEnd(5)}| ${status.padEnd(6)}| ${delta}`);
|
|
699
|
+
}
|
|
700
|
+
lines.push('');
|
|
701
|
+
lines.push(`Totals: SQLite=${d.totalSqlite}, PG=${d.totalPg}`);
|
|
702
|
+
lines.push(`Sync log: ${d.syncLogEntries} entries, ${d.failedEntries} failed`);
|
|
703
|
+
if (d.lastSyncAt) {
|
|
704
|
+
lines.push(`Last sync: ${d.lastSyncAt}`);
|
|
705
|
+
}
|
|
706
|
+
return lines.join('\n');
|
|
707
|
+
}
|
|
708
|
+
/**
|
|
709
|
+
* Identify PG-side orphan entity IDs that don't exist in SQLite.
|
|
710
|
+
* Compares entity IDs from the dashboard project state API against local SQLite.
|
|
711
|
+
*
|
|
712
|
+
* Note: The project state API may cap entity arrays for large tables.
|
|
713
|
+
* When caps are hit, orphan detection for that table is skipped.
|
|
714
|
+
*/
|
|
715
|
+
async function identifyPgOrphans(params) {
|
|
716
|
+
const clientResult = dashboard_client_1.DashboardClient.fromEnv();
|
|
717
|
+
if (!clientResult.success || !clientResult.data) {
|
|
718
|
+
return (0, errors_1.createError)(errors_1.CmosErrors.dashboardNotConfigured());
|
|
719
|
+
}
|
|
720
|
+
const dashboardClient = clientResult.data;
|
|
721
|
+
return (0, client_1.withClientAsync)(async (db) => {
|
|
722
|
+
const identity = getProjectIdentity(db);
|
|
723
|
+
const slug = deriveProjectSlug(identity.projectName);
|
|
724
|
+
// Get full PG state
|
|
725
|
+
const stateResult = await dashboardClient.getSyncProjectState(slug);
|
|
726
|
+
if (!stateResult.success || !stateResult.data) {
|
|
727
|
+
return (0, errors_1.createError)(stateResult.error ?? errors_1.CmosErrors.dashboardError('Failed to fetch PG project state'));
|
|
728
|
+
}
|
|
729
|
+
const pgState = stateResult.data;
|
|
730
|
+
const orphans = [];
|
|
731
|
+
const tablesChecked = [];
|
|
732
|
+
// Compare missions
|
|
733
|
+
if (pgState.missions && Array.isArray(pgState.missions)) {
|
|
734
|
+
tablesChecked.push('missions');
|
|
735
|
+
const sqliteIds = getSqliteIds(db, 'missions', 'id');
|
|
736
|
+
for (const pgMission of pgState.missions) {
|
|
737
|
+
const id = pgMission.missionId ??
|
|
738
|
+
pgMission.id;
|
|
739
|
+
if (id && !sqliteIds.has(id)) {
|
|
740
|
+
orphans.push({ table: 'missions', id });
|
|
741
|
+
}
|
|
742
|
+
}
|
|
743
|
+
}
|
|
744
|
+
// Compare sessions
|
|
745
|
+
if (pgState.sessions && Array.isArray(pgState.sessions)) {
|
|
746
|
+
tablesChecked.push('sessions');
|
|
747
|
+
const sqliteIds = getSqliteIds(db, 'sessions', 'id');
|
|
748
|
+
for (const pgSession of pgState.sessions) {
|
|
749
|
+
const id = pgSession.sessionId ??
|
|
750
|
+
pgSession.id;
|
|
751
|
+
if (id && !sqliteIds.has(id)) {
|
|
752
|
+
orphans.push({ table: 'sessions', id });
|
|
753
|
+
}
|
|
754
|
+
}
|
|
755
|
+
}
|
|
756
|
+
// Compare dependencies (composite key: from_id + to_id)
|
|
757
|
+
if (pgState.dependencies && Array.isArray(pgState.dependencies)) {
|
|
758
|
+
tablesChecked.push('mission_dependencies');
|
|
759
|
+
const sqliteDeps = getSqliteDependencyKeys(db);
|
|
760
|
+
for (const pgDep of pgState.dependencies) {
|
|
761
|
+
const dep = pgDep;
|
|
762
|
+
const fromId = (dep.fromId ?? dep.from_id);
|
|
763
|
+
const toId = (dep.toId ?? dep.to_id);
|
|
764
|
+
if (fromId && toId) {
|
|
765
|
+
const key = `${fromId}|${toId}`;
|
|
766
|
+
if (!sqliteDeps.has(key)) {
|
|
767
|
+
orphans.push({ table: 'mission_dependencies', id: fromId, secondaryId: toId });
|
|
768
|
+
}
|
|
769
|
+
}
|
|
770
|
+
}
|
|
771
|
+
}
|
|
772
|
+
return (0, errors_1.createSuccess)({
|
|
773
|
+
orphans,
|
|
774
|
+
totalOrphans: orphans.length,
|
|
775
|
+
tablesChecked,
|
|
776
|
+
projectSlug: slug,
|
|
777
|
+
});
|
|
778
|
+
}, { projectRoot: params.projectRoot });
|
|
779
|
+
}
|
|
780
|
+
/** Get all entity IDs from a SQLite table as a Set */
|
|
781
|
+
function getSqliteIds(db, table, idColumn) {
|
|
782
|
+
const result = db.getMany(`SELECT ${idColumn} as id FROM ${table}`);
|
|
783
|
+
if (!result.success || !result.data)
|
|
784
|
+
return new Set();
|
|
785
|
+
return new Set(result.data.map((row) => row.id));
|
|
786
|
+
}
|
|
787
|
+
/** Get all dependency composite keys as a Set */
|
|
788
|
+
function getSqliteDependencyKeys(db) {
|
|
789
|
+
const result = db.getMany(`SELECT from_id, to_id FROM mission_dependencies`);
|
|
790
|
+
if (!result.success || !result.data)
|
|
791
|
+
return new Set();
|
|
792
|
+
return new Set(result.data.map((row) => `${row.from_id}|${row.to_id}`));
|
|
793
|
+
}
|
|
794
|
+
function formatPgOrphanReportForLLM(result) {
|
|
795
|
+
if (!result.success) {
|
|
796
|
+
return `PG orphan identification failed: ${result.error?.message ?? 'Unknown error'}`;
|
|
797
|
+
}
|
|
798
|
+
const d = result.data;
|
|
799
|
+
if (d.totalOrphans === 0) {
|
|
800
|
+
return `PG Orphan Check (${d.projectSlug}): No orphans found across ${d.tablesChecked.length} tables.`;
|
|
801
|
+
}
|
|
802
|
+
const lines = [`PG Orphan Report (${d.projectSlug}): ${d.totalOrphans} orphan(s) found`, ''];
|
|
803
|
+
const byTable = new Map();
|
|
804
|
+
for (const orphan of d.orphans) {
|
|
805
|
+
const existing = byTable.get(orphan.table) ?? [];
|
|
806
|
+
existing.push(orphan);
|
|
807
|
+
byTable.set(orphan.table, existing);
|
|
808
|
+
}
|
|
809
|
+
for (const [table, entries] of byTable) {
|
|
810
|
+
lines.push(`${table} (${entries.length} orphan${entries.length > 1 ? 's' : ''}):`);
|
|
811
|
+
for (const entry of entries) {
|
|
812
|
+
if (entry.secondaryId) {
|
|
813
|
+
lines.push(` - ${entry.id} → ${entry.secondaryId}`);
|
|
814
|
+
}
|
|
815
|
+
else {
|
|
816
|
+
lines.push(` - ${entry.id}`);
|
|
817
|
+
}
|
|
818
|
+
}
|
|
819
|
+
lines.push('');
|
|
820
|
+
}
|
|
821
|
+
lines.push(`Tables checked: ${d.tablesChecked.join(', ')}`);
|
|
822
|
+
return lines.join('\n');
|
|
823
|
+
}
|
|
824
|
+
async function cmosDbPurge(params) {
|
|
825
|
+
if (!params.confirm) {
|
|
826
|
+
return (0, errors_1.createError)({
|
|
827
|
+
code: 'CONFIRMATION_REQUIRED',
|
|
828
|
+
message: 'Purge requires explicit confirmation. Pass confirm=true to proceed. ' +
|
|
829
|
+
'This will delete ALL mirrored data for this project from the PG mirror.',
|
|
830
|
+
suggestion: 'Call cmos_db(action="purge", confirm=true) to proceed.',
|
|
831
|
+
});
|
|
832
|
+
}
|
|
833
|
+
const clientResult = dashboard_client_1.DashboardClient.fromEnv();
|
|
834
|
+
if (!clientResult.success || !clientResult.data) {
|
|
835
|
+
return (0, errors_1.createError)(errors_1.CmosErrors.dashboardNotConfigured());
|
|
836
|
+
}
|
|
837
|
+
const dashboardClient = clientResult.data;
|
|
838
|
+
return (0, client_1.withClientAsync)(async (db) => {
|
|
839
|
+
const identity = getProjectIdentity(db);
|
|
840
|
+
const slug = deriveProjectSlug(identity.projectName);
|
|
841
|
+
const purgeResult = await dashboardClient.purgeMirror(slug, params.expectedSlug ?? undefined);
|
|
842
|
+
if (!purgeResult.success || !purgeResult.data) {
|
|
843
|
+
return (0, errors_1.createError)(purgeResult.error ?? errors_1.CmosErrors.dashboardError('Failed to purge mirror'));
|
|
844
|
+
}
|
|
845
|
+
return (0, errors_1.createSuccess)({
|
|
846
|
+
purgedProject: purgeResult.data.purgedProject,
|
|
847
|
+
tablesCleared: purgeResult.data.tablesCleared,
|
|
848
|
+
rowsDeleted: purgeResult.data.rowsDeleted,
|
|
849
|
+
});
|
|
850
|
+
}, { projectRoot: params.projectRoot });
|
|
851
|
+
}
|
|
852
|
+
function formatPurgeForLLM(result) {
|
|
853
|
+
if (!result.success) {
|
|
854
|
+
return `Purge failed: ${result.error?.message ?? 'Unknown error'}`;
|
|
855
|
+
}
|
|
856
|
+
const d = result.data;
|
|
857
|
+
const lines = [
|
|
858
|
+
`Purge Complete: ${d.purgedProject}`,
|
|
859
|
+
'',
|
|
860
|
+
`Tables cleared: ${d.tablesCleared.join(', ')}`,
|
|
861
|
+
`Rows deleted: ${d.rowsDeleted}`,
|
|
862
|
+
'',
|
|
863
|
+
'Run cmos_db(action="backfill", force=true) to re-sync all data.',
|
|
864
|
+
];
|
|
865
|
+
return lines.join('\n');
|
|
866
|
+
}
|
|
867
|
+
// ─── LLM Formatter ───────────────────────────────────────────────────────────
|
|
868
|
+
function formatBackfillForLLM(result) {
|
|
869
|
+
if (!result.success) {
|
|
870
|
+
return `Backfill failed: ${result.error?.message ?? 'Unknown error'}`;
|
|
871
|
+
}
|
|
872
|
+
const d = result.data;
|
|
873
|
+
const lines = [
|
|
874
|
+
d.dryRun ? 'Backfill Dry Run' : 'Backfill Complete',
|
|
875
|
+
'',
|
|
876
|
+
d.message,
|
|
877
|
+
'',
|
|
878
|
+
`Events: ${d.pushed} pushed, ${d.failed} failed`,
|
|
879
|
+
`Breakdown: ${d.breakdown.sprints} sprint, ${d.breakdown.missions} mission, ${d.breakdown.sessions} session, ${d.breakdown.decisions} decision, ${d.breakdown.learnings} learning, ${d.breakdown.dependencies} dependency`,
|
|
880
|
+
];
|
|
881
|
+
if (d.previousCursor) {
|
|
882
|
+
lines.push(`Previous cursor: ${d.previousCursor}`);
|
|
883
|
+
}
|
|
884
|
+
if (d.cursor) {
|
|
885
|
+
lines.push(`Current cursor: ${d.cursor}`);
|
|
886
|
+
}
|
|
887
|
+
return lines.join('\n');
|
|
888
|
+
}
|
|
889
|
+
//# sourceMappingURL=cmos-db-backfill.js.map
|