kibi-cli 1.0.1 → 2.1.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/dist/cli-errors.d.ts +3 -1
- package/dist/cli-errors.d.ts.map +1 -1
- package/dist/cli-errors.js +4 -1
- package/dist/cli-json-command.d.ts +1 -0
- package/dist/cli-json-command.d.ts.map +1 -1
- package/dist/cli-json-command.js +13 -4
- package/dist/cli-operation-loader.js +3 -3
- package/dist/cli-operation-metadata.d.ts +4 -3
- package/dist/cli-operation-metadata.d.ts.map +1 -1
- package/dist/cli-operation-metadata.js +7 -5
- package/dist/cli-protocol.js +1 -1
- package/dist/cli-register-maintenance.d.ts.map +1 -1
- package/dist/cli-register-maintenance.js +7 -0
- package/dist/cli-register-proof.d.ts +3 -0
- package/dist/cli-register-proof.d.ts.map +1 -0
- package/dist/cli-register-proof.js +127 -0
- package/dist/cli-register-reporting.d.ts.map +1 -1
- package/dist/cli-register-reporting.js +7 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +19 -10
- package/dist/commands/branch.d.ts +1 -0
- package/dist/commands/branch.d.ts.map +1 -1
- package/dist/commands/branch.js +8 -4
- package/dist/commands/check-generated.d.ts +7 -0
- package/dist/commands/check-generated.d.ts.map +1 -0
- package/dist/commands/check-generated.js +192 -0
- package/dist/commands/check.d.ts +14 -0
- package/dist/commands/check.d.ts.map +1 -1
- package/dist/commands/check.js +193 -46
- package/dist/commands/coverage.d.ts +1 -0
- package/dist/commands/coverage.d.ts.map +1 -1
- package/dist/commands/coverage.js +6 -0
- package/dist/commands/doctor.d.ts +22 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +170 -23
- package/dist/commands/engine.d.ts +12 -0
- package/dist/commands/engine.d.ts.map +1 -1
- package/dist/commands/engine.js +42 -0
- package/dist/commands/github-init.d.ts +1 -0
- package/dist/commands/github-init.d.ts.map +1 -1
- package/dist/commands/github-init.js +9 -5
- package/dist/commands/init-helpers.d.ts.map +1 -1
- package/dist/commands/init-helpers.js +49 -10
- package/dist/commands/migrate.d.ts +4 -0
- package/dist/commands/migrate.d.ts.map +1 -1
- package/dist/commands/migrate.js +7 -7
- package/dist/commands/proof-explain.d.ts +10 -0
- package/dist/commands/proof-explain.d.ts.map +1 -0
- package/dist/commands/proof-explain.js +45 -0
- package/dist/commands/proof-impact.d.ts +7 -0
- package/dist/commands/proof-impact.d.ts.map +1 -0
- package/dist/commands/proof-impact.js +39 -0
- package/dist/commands/proof-migrate-legacy.d.ts +7 -0
- package/dist/commands/proof-migrate-legacy.d.ts.map +1 -0
- package/dist/commands/proof-migrate-legacy.js +45 -0
- package/dist/commands/proof-prune.d.ts +8 -0
- package/dist/commands/proof-prune.d.ts.map +1 -0
- package/dist/commands/proof-prune.js +53 -0
- package/dist/commands/prove.d.ts +37 -0
- package/dist/commands/prove.d.ts.map +1 -0
- package/dist/commands/prove.js +470 -0
- package/dist/commands/report.d.ts.map +1 -1
- package/dist/commands/report.js +18 -3
- package/dist/commands/sync/discovery.d.ts +3 -0
- package/dist/commands/sync/discovery.d.ts.map +1 -1
- package/dist/commands/sync/discovery.js +36 -28
- package/dist/commands/sync/manifest.d.ts +2 -1
- package/dist/commands/sync/manifest.d.ts.map +1 -1
- package/dist/commands/sync/manifest.js +55 -21
- package/dist/commands/sync/persistence.d.ts +4 -1
- package/dist/commands/sync/persistence.d.ts.map +1 -1
- package/dist/commands/sync/persistence.js +31 -14
- package/dist/commands/sync/staging.d.ts +1 -0
- package/dist/commands/sync/staging.d.ts.map +1 -1
- package/dist/commands/sync/staging.js +5 -2
- package/dist/commands/sync/untracked-targets.d.ts +24 -0
- package/dist/commands/sync/untracked-targets.d.ts.map +1 -0
- package/dist/commands/sync/untracked-targets.js +108 -0
- package/dist/commands/sync.d.ts +11 -1
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +74 -30
- package/dist/engine-daemon.d.ts +3 -1
- package/dist/engine-daemon.d.ts.map +1 -1
- package/dist/engine-daemon.js +49 -20
- package/dist/engine.d.ts +17 -77
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +331 -91
- package/dist/env/bootstrap.d.ts +84 -0
- package/dist/env/bootstrap.d.ts.map +1 -0
- package/dist/env/bootstrap.js +310 -0
- package/dist/extractors/manifest.d.ts +5 -0
- package/dist/extractors/manifest.d.ts.map +1 -1
- package/dist/extractors/manifest.js +46 -1
- package/dist/extractors/markdown.d.ts +7 -3
- package/dist/extractors/markdown.d.ts.map +1 -1
- package/dist/extractors/markdown.js +60 -24
- package/dist/extractors/playwright-cases.js +1 -1
- package/dist/extractors/relationships.d.ts +6 -0
- package/dist/extractors/relationships.d.ts.map +1 -1
- package/dist/extractors/relationships.js +1 -1
- package/dist/extractors/symbol-coordinates.d.ts.map +1 -1
- package/dist/extractors/symbols-coordinator.d.ts +8 -0
- package/dist/extractors/symbols-coordinator.d.ts.map +1 -1
- package/dist/extractors/symbols-coordinator.js +40 -0
- package/dist/extractors/symbols-ts.d.ts +9 -19
- package/dist/extractors/symbols-ts.d.ts.map +1 -1
- package/dist/extractors/symbols-ts.js +34 -429
- package/dist/intent-search.d.ts +1 -0
- package/dist/intent-search.d.ts.map +1 -1
- package/dist/intent-search.js +11 -8
- package/dist/logic/ir.d.ts +1 -0
- package/dist/logic/ir.d.ts.map +1 -1
- package/dist/logic/ir.js +1 -1
- package/dist/operations/bootstrap/activation.d.ts +2 -1
- package/dist/operations/bootstrap/activation.d.ts.map +1 -1
- package/dist/operations/bootstrap/activation.js +11 -3
- package/dist/operations/bootstrap/generate.d.ts +2 -1
- package/dist/operations/bootstrap/generate.d.ts.map +1 -1
- package/dist/operations/bootstrap/generate.js +6 -3
- package/dist/operations/bootstrap/guidance.d.ts +1 -0
- package/dist/operations/bootstrap/guidance.d.ts.map +1 -1
- package/dist/operations/bootstrap/guidance.js +1 -1
- package/dist/operations/modeling/model-requirement.d.ts +5 -0
- package/dist/operations/modeling/model-requirement.d.ts.map +1 -1
- package/dist/operations/modeling/model-requirement.js +57 -46
- package/dist/operations/modeling/predicate-applicability.d.ts.map +1 -1
- package/dist/operations/modeling/predicate-applicability.js +103 -4
- package/dist/operations/modeling/predicate-catalog-2.d.ts.map +1 -1
- package/dist/operations/modeling/predicate-catalog-2.js +18 -2
- package/dist/operations/modeling/predicate-catalog-3.d.ts.map +1 -1
- package/dist/operations/modeling/predicate-catalog-3.js +17 -1
- package/dist/operations/modeling/predicate-catalog-5.d.ts +10 -0
- package/dist/operations/modeling/predicate-catalog-5.d.ts.map +1 -0
- package/dist/operations/modeling/predicate-catalog-5.js +291 -0
- package/dist/operations/modeling/predicate-catalog.d.ts.map +1 -1
- package/dist/operations/modeling/predicate-catalog.js +4 -0
- package/dist/operations/modeling/predicate-loader.d.ts +1 -0
- package/dist/operations/modeling/predicate-loader.d.ts.map +1 -1
- package/dist/operations/modeling/predicate-loader.js +4 -3
- package/dist/operations/modeling/predicate-ranker.d.ts.map +1 -1
- package/dist/operations/modeling/predicate-ranker.js +4 -1
- package/dist/operations/modeling/predicate-types.d.ts +1 -1
- package/dist/operations/modeling/predicate-types.d.ts.map +1 -1
- package/dist/operations/modeling/predicate-usage-hints-4.d.ts +3 -0
- package/dist/operations/modeling/predicate-usage-hints-4.d.ts.map +1 -0
- package/dist/operations/modeling/predicate-usage-hints-4.js +84 -0
- package/dist/operations/modeling/suggest-predicates.d.ts +4 -2
- package/dist/operations/modeling/suggest-predicates.d.ts.map +1 -1
- package/dist/operations/modeling/suggest-predicates.js +82 -22
- package/dist/operations/mutation/contradictions.d.ts +2 -1
- package/dist/operations/mutation/contradictions.d.ts.map +1 -1
- package/dist/operations/mutation/contradictions.js +26 -5
- package/dist/operations/mutation/delete.d.ts +3 -0
- package/dist/operations/mutation/delete.d.ts.map +1 -1
- package/dist/operations/mutation/delete.js +100 -32
- package/dist/operations/mutation/relationships.d.ts +1 -0
- package/dist/operations/mutation/relationships.d.ts.map +1 -1
- package/dist/operations/mutation/relationships.js +6 -4
- package/dist/operations/mutation/saga.d.ts +51 -0
- package/dist/operations/mutation/saga.d.ts.map +1 -0
- package/dist/operations/mutation/saga.js +67 -0
- package/dist/operations/mutation/serialization.d.ts.map +1 -1
- package/dist/operations/mutation/serialization.js +3 -2
- package/dist/operations/mutation/source-authoring.d.ts +5 -1
- package/dist/operations/mutation/source-authoring.d.ts.map +1 -1
- package/dist/operations/mutation/source-authoring.js +79 -46
- package/dist/operations/mutation/strict-fact.d.ts +1 -0
- package/dist/operations/mutation/strict-fact.d.ts.map +1 -1
- package/dist/operations/mutation/strict-fact.js +8 -5
- package/dist/operations/mutation/symbol-compiler-lock.d.ts +5 -2
- package/dist/operations/mutation/symbol-compiler-lock.d.ts.map +1 -1
- package/dist/operations/mutation/symbol-compiler-lock.js +65 -2
- package/dist/operations/mutation/symbol-granularity.d.ts.map +1 -1
- package/dist/operations/mutation/symbol-granularity.js +11 -89
- package/dist/operations/mutation/symbol-refresh.d.ts +1 -0
- package/dist/operations/mutation/symbol-refresh.d.ts.map +1 -1
- package/dist/operations/mutation/symbol-refresh.js +10 -8
- package/dist/operations/mutation/upsert.d.ts +18 -2
- package/dist/operations/mutation/upsert.d.ts.map +1 -1
- package/dist/operations/mutation/upsert.js +86 -54
- package/dist/operations/mutation/validate-upsert.js +2 -2
- package/dist/operations/mutation/validation.d.ts.map +1 -1
- package/dist/operations/mutation/validation.js +46 -4
- package/dist/operations/mutation/warnings.d.ts +1 -0
- package/dist/operations/mutation/warnings.d.ts.map +1 -1
- package/dist/operations/mutation/warnings.js +7 -5
- package/dist/operations/mutation/workspace-mutation-lock.d.ts +60 -0
- package/dist/operations/mutation/workspace-mutation-lock.d.ts.map +1 -0
- package/dist/operations/mutation/workspace-mutation-lock.js +362 -0
- package/dist/operations/planning/apply-plan.d.ts +8 -106
- package/dist/operations/planning/apply-plan.d.ts.map +1 -1
- package/dist/operations/planning/apply-plan.js +113 -36
- package/dist/operations/planning/compile-intent.d.ts +51 -0
- package/dist/operations/planning/compile-intent.d.ts.map +1 -1
- package/dist/operations/planning/compile-intent.js +133 -17
- package/dist/operations/proof/baseline-diff.d.ts +41 -0
- package/dist/operations/proof/baseline-diff.d.ts.map +1 -0
- package/dist/operations/proof/baseline-diff.js +153 -0
- package/dist/operations/proof/explain.d.ts +75 -0
- package/dist/operations/proof/explain.d.ts.map +1 -0
- package/dist/operations/proof/explain.js +294 -0
- package/dist/operations/proof/impact.d.ts +45 -0
- package/dist/operations/proof/impact.d.ts.map +1 -0
- package/dist/operations/proof/impact.js +118 -0
- package/dist/operations/proof/ingest-proof.d.ts +34 -0
- package/dist/operations/proof/ingest-proof.d.ts.map +1 -0
- package/dist/operations/proof/ingest-proof.js +348 -0
- package/dist/operations/proof/migrate-legacy-receipts.d.ts +30 -0
- package/dist/operations/proof/migrate-legacy-receipts.d.ts.map +1 -0
- package/dist/operations/proof/migrate-legacy-receipts.js +92 -0
- package/dist/operations/proof/prune-receipts.d.ts +35 -0
- package/dist/operations/proof/prune-receipts.d.ts.map +1 -0
- package/dist/operations/proof/prune-receipts.js +91 -0
- package/dist/operations/proof/receipt-document.d.ts +29 -0
- package/dist/operations/proof/receipt-document.d.ts.map +1 -0
- package/dist/operations/proof/receipt-document.js +117 -0
- package/dist/operations/semantic-advisor/analysis-receipt.d.ts.map +1 -1
- package/dist/operations/semantic-advisor/analysis-receipt.js +3 -9
- package/dist/operations/semantic-advisor/analyze-prose.d.ts +1 -0
- package/dist/operations/semantic-advisor/analyze-prose.d.ts.map +1 -1
- package/dist/operations/semantic-advisor/analyze-prose.js +64 -93
- package/dist/operations/semantic-advisor/clauses.d.ts.map +1 -1
- package/dist/operations/semantic-advisor/clauses.js +20 -7
- package/dist/operations/semantic-advisor/plugin-orchestration.d.ts +63 -0
- package/dist/operations/semantic-advisor/plugin-orchestration.d.ts.map +1 -0
- package/dist/operations/semantic-advisor/plugin-orchestration.js +489 -0
- package/dist/operations/semantic-advisor/predicate-rules-core.d.ts +15 -2
- package/dist/operations/semantic-advisor/predicate-rules-core.d.ts.map +1 -1
- package/dist/operations/semantic-advisor/predicate-rules-core.js +7 -140
- package/dist/operations/semantic-advisor/predicate-rules-launcher.d.ts +11 -12
- package/dist/operations/semantic-advisor/predicate-rules-launcher.d.ts.map +1 -1
- package/dist/operations/semantic-advisor/predicate-rules-launcher.js +6 -94
- package/dist/operations/semantic-advisor/predicate-rules-policy.d.ts +16 -0
- package/dist/operations/semantic-advisor/predicate-rules-policy.d.ts.map +1 -1
- package/dist/operations/semantic-advisor/predicate-rules-policy.js +7 -150
- package/dist/operations/semantic-advisor/predicate-rules-product-tail.d.ts +9 -0
- package/dist/operations/semantic-advisor/predicate-rules-product-tail.d.ts.map +1 -1
- package/dist/operations/semantic-advisor/predicate-rules-product-tail.js +7 -102
- package/dist/operations/semantic-advisor/predicate-rules-product.d.ts +13 -0
- package/dist/operations/semantic-advisor/predicate-rules-product.d.ts.map +1 -1
- package/dist/operations/semantic-advisor/predicate-rules-product.js +7 -133
- package/dist/operations/semantic-advisor/strict-count-rules.d.ts +2 -0
- package/dist/operations/semantic-advisor/strict-count-rules.d.ts.map +1 -1
- package/dist/operations/semantic-advisor/strict-count-rules.js +40 -25
- package/dist/operations/semantic-advisor/types.d.ts +1 -0
- package/dist/operations/semantic-advisor/types.d.ts.map +1 -1
- package/dist/plugins/compose-ontology-packs.d.ts +51 -0
- package/dist/plugins/compose-ontology-packs.d.ts.map +1 -0
- package/dist/plugins/compose-ontology-packs.js +257 -0
- package/dist/plugins/compose-semantic-classifier.d.ts +42 -0
- package/dist/plugins/compose-semantic-classifier.d.ts.map +1 -0
- package/dist/plugins/compose-semantic-classifier.js +211 -0
- package/dist/plugins/external-allowlist.d.ts +10 -0
- package/dist/plugins/external-allowlist.d.ts.map +1 -0
- package/dist/plugins/external-allowlist.js +16 -0
- package/dist/plugins/index.d.ts +9 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +33 -0
- package/dist/plugins/load-plugin.d.ts +19 -0
- package/dist/plugins/load-plugin.d.ts.map +1 -0
- package/dist/plugins/load-plugin.js +59 -0
- package/dist/plugins/project-config.d.ts +28 -0
- package/dist/plugins/project-config.d.ts.map +1 -0
- package/dist/plugins/project-config.js +90 -0
- package/dist/plugins/registry.d.ts +93 -0
- package/dist/plugins/registry.d.ts.map +1 -0
- package/dist/plugins/registry.js +338 -0
- package/dist/plugins/resolve-package.d.ts +47 -0
- package/dist/plugins/resolve-package.d.ts.map +1 -0
- package/dist/plugins/resolve-package.js +262 -0
- package/dist/plugins/source-analysis-service.d.ts +44 -0
- package/dist/plugins/source-analysis-service.d.ts.map +1 -0
- package/dist/plugins/source-analysis-service.js +232 -0
- package/dist/prolog/codec.d.ts +13 -1
- package/dist/prolog/codec.d.ts.map +1 -1
- package/dist/prolog/codec.js +269 -154
- package/dist/prolog/error-terms.d.ts +47 -0
- package/dist/prolog/error-terms.d.ts.map +1 -0
- package/dist/prolog/error-terms.js +334 -0
- package/dist/prolog/janitor.d.ts +50 -0
- package/dist/prolog/janitor.d.ts.map +1 -0
- package/dist/prolog/janitor.js +154 -0
- package/dist/prolog/store-lock.d.ts +45 -0
- package/dist/prolog/store-lock.d.ts.map +1 -0
- package/dist/prolog/store-lock.js +195 -0
- package/dist/prolog.d.ts +7 -0
- package/dist/prolog.d.ts.map +1 -1
- package/dist/prolog.js +55 -17
- package/dist/proof/evaluate.d.ts +27 -0
- package/dist/proof/evaluate.d.ts.map +1 -0
- package/dist/proof/evaluate.js +151 -0
- package/dist/proof/inspect.d.ts +12 -0
- package/dist/proof/inspect.d.ts.map +1 -0
- package/dist/proof/inspect.js +236 -0
- package/dist/proof/integrations.d.ts +35 -0
- package/dist/proof/integrations.d.ts.map +1 -0
- package/dist/proof/integrations.js +123 -0
- package/dist/proof/producers/junit-adapter.d.ts +26 -0
- package/dist/proof/producers/junit-adapter.d.ts.map +1 -0
- package/dist/proof/producers/junit-adapter.js +186 -0
- package/dist/{public → proof/producers}/playwright-case-id.d.ts +1 -1
- package/dist/proof/producers/playwright-case-id.d.ts.map +1 -0
- package/dist/{public → proof/producers}/playwright-case-id.js +1 -1
- package/dist/proof/producers/playwright-reporter.d.ts +27 -0
- package/dist/proof/producers/playwright-reporter.d.ts.map +1 -0
- package/dist/proof/producers/playwright-reporter.js +138 -0
- package/dist/proof/producers/tap-adapter.d.ts +10 -0
- package/dist/proof/producers/tap-adapter.d.ts.map +1 -0
- package/dist/proof/producers/tap-adapter.js +200 -0
- package/dist/proof/receipt-outcome.d.ts +2 -0
- package/dist/proof/receipt-outcome.d.ts.map +1 -0
- package/dist/proof/receipt-outcome.js +1 -0
- package/dist/public/diagnostic-usage.js +6 -6
- package/dist/public/distribution-parity.d.ts +7 -1
- package/dist/public/distribution-parity.d.ts.map +1 -1
- package/dist/public/distribution-parity.js +15 -10
- package/dist/public/extractors/symbols-coordinator.d.ts +1 -1
- package/dist/public/extractors/symbols-coordinator.d.ts.map +1 -1
- package/dist/public/extractors/symbols-coordinator.js +1 -1
- package/dist/public/impact/analyzer.d.ts +1 -1
- package/dist/public/impact/analyzer.d.ts.map +1 -1
- package/dist/public/impact/analyzer.js +6 -4
- package/dist/public/impact/coverage-depth-quality.d.ts +1 -0
- package/dist/public/impact/coverage-depth-quality.d.ts.map +1 -1
- package/dist/public/impact/coverage-depth-quality.js +1 -1
- package/dist/public/impact/diagnostics.d.ts.map +1 -1
- package/dist/public/impact/diagnostics.js +2 -2
- package/dist/public/impact/diff-meaning.d.ts +1 -0
- package/dist/public/impact/diff-meaning.d.ts.map +1 -1
- package/dist/public/impact/diff-meaning.js +5 -2
- package/dist/public/impact/full-kb-quality.d.ts +5 -2
- package/dist/public/impact/full-kb-quality.d.ts.map +1 -1
- package/dist/public/impact/full-kb-quality.js +329 -64
- package/dist/public/operations/catalog.d.ts +450 -196
- package/dist/public/operations/catalog.d.ts.map +1 -1
- package/dist/public/operations/catalog.js +6 -4
- package/dist/public/operations/check-executor.d.ts.map +1 -1
- package/dist/public/operations/check-executor.js +4 -8
- package/dist/public/operations/check-helpers.d.ts +1 -1
- package/dist/public/operations/check-helpers.d.ts.map +1 -1
- package/dist/public/operations/check-helpers.js +1 -1
- package/dist/public/operations/contracts.d.ts +7 -0
- package/dist/public/operations/contracts.d.ts.map +1 -1
- package/dist/public/operations/contracts.js +66 -34
- package/dist/public/operations/discovery-entities.d.ts +15 -0
- package/dist/public/operations/discovery-entities.d.ts.map +1 -1
- package/dist/public/operations/discovery-entities.js +38 -0
- package/dist/public/operations/discovery-executors.d.ts +9 -9
- package/dist/public/operations/discovery-executors.d.ts.map +1 -1
- package/dist/public/operations/discovery-executors.js +39 -31
- package/dist/public/operations/index.d.ts +1 -1
- package/dist/public/operations/index.d.ts.map +1 -1
- package/dist/public/operations/index.js +1 -1
- package/dist/public/operations/migration-plan.d.ts +4 -3
- package/dist/public/operations/migration-plan.d.ts.map +1 -1
- package/dist/public/operations/migration-plan.js +23 -21
- package/dist/public/operations/node-ports.js +6 -6
- package/dist/public/operations/prolog-json.d.ts +1 -1
- package/dist/public/operations/prolog-json.d.ts.map +1 -1
- package/dist/public/operations/prolog-json.js +7 -7
- package/dist/public/operations/repair-plan.d.ts +3 -3
- package/dist/public/operations/repair-plan.d.ts.map +1 -1
- package/dist/public/operations/repair-plan.js +49 -19
- package/dist/public/operations/result-envelope.d.ts +1 -0
- package/dist/public/operations/result-envelope.d.ts.map +1 -1
- package/dist/public/operations/result-envelope.js +12 -10
- package/dist/public/operations/runtime-types.d.ts +21 -1
- package/dist/public/operations/runtime-types.d.ts.map +1 -1
- package/dist/public/operations/specs/check-rules.generated.d.ts +5 -0
- package/dist/public/operations/specs/check-rules.generated.d.ts.map +1 -0
- package/dist/public/operations/specs/check-rules.generated.js +35 -0
- package/dist/public/operations/specs/check.d.ts +7 -2
- package/dist/public/operations/specs/check.d.ts.map +1 -1
- package/dist/public/operations/specs/check.js +8 -20
- package/dist/public/operations/specs/discovery.d.ts +3 -0
- package/dist/public/operations/specs/discovery.d.ts.map +1 -1
- package/dist/public/operations/specs/discovery.js +3 -0
- package/dist/public/operations/specs/mutation-schemas.d.ts +257 -163
- package/dist/public/operations/specs/mutation-schemas.d.ts.map +1 -1
- package/dist/public/operations/specs/mutation-schemas.js +15 -7
- package/dist/public/operations/specs/planning.d.ts +9 -0
- package/dist/public/operations/specs/planning.d.ts.map +1 -1
- package/dist/public/operations/specs/planning.js +6 -0
- package/dist/public/operations/specs/proof.d.ts +212 -0
- package/dist/public/operations/specs/proof.d.ts.map +1 -0
- package/dist/public/operations/specs/proof.js +30 -0
- package/dist/public/operations/specs/reporting.d.ts +20 -0
- package/dist/public/operations/specs/reporting.d.ts.map +1 -1
- package/dist/public/operations/specs/reporting.js +112 -12
- package/dist/public/operations/specs/semantic.d.ts +1 -1
- package/dist/public/operations/specs/semantic.d.ts.map +1 -1
- package/dist/public/operations/specs/semantic.js +54 -4
- package/dist/public/operations/specs/upsert.d.ts +257 -163
- package/dist/public/operations/specs/upsert.d.ts.map +1 -1
- package/dist/public/operations/symbol-repair-plan.d.ts +11 -0
- package/dist/public/operations/symbol-repair-plan.d.ts.map +1 -1
- package/dist/public/operations/symbol-repair-plan.js +121 -4
- package/dist/public/operations/types.d.ts +6 -1
- package/dist/public/operations/types.d.ts.map +1 -1
- package/dist/public/proof-fingerprint.d.ts +54 -0
- package/dist/public/proof-fingerprint.d.ts.map +1 -0
- package/dist/public/proof-fingerprint.js +141 -0
- package/dist/public/proof-protocol.d.ts +354 -0
- package/dist/public/proof-protocol.d.ts.map +1 -0
- package/dist/public/proof-protocol.js +454 -0
- package/dist/public/proof-receipt.d.ts +279 -0
- package/dist/public/proof-receipt.d.ts.map +1 -0
- package/dist/public/proof-receipt.js +377 -0
- package/dist/public/schemas/entity.d.ts.map +1 -1
- package/dist/public/schemas/entity.js +21 -7
- package/dist/public/skills/kibi-freshness/SKILL.md +1 -1
- package/dist/public/skills/kibi-usage/SKILL.md +44 -12
- package/dist/public/skills/kibi-usage/resources/operation-access.md +1 -1
- package/dist/public/skills/kibi-usage/resources/proof.md +150 -0
- package/dist/public/skills/kibi-usage/resources/workflows.md +6 -6
- package/dist/public/symbol-granularity.d.ts +3 -14
- package/dist/public/symbol-granularity.d.ts.map +1 -1
- package/dist/public/symbol-granularity.generated.d.ts +16 -0
- package/dist/public/symbol-granularity.generated.d.ts.map +1 -0
- package/dist/public/symbol-granularity.generated.js +53 -0
- package/dist/public/symbol-granularity.js +6 -47
- package/dist/public/telemetry-acceptance.d.ts +3 -77
- package/dist/public/telemetry-acceptance.d.ts.map +1 -1
- package/dist/public/telemetry-acceptance.js +4 -2
- package/dist/public/telemetry-remediation.js +1 -1
- package/dist/report/html-report.css +1240 -0
- package/dist/report/html-report.d.ts +4 -2
- package/dist/report/html-report.d.ts.map +1 -1
- package/dist/report/html-report.js +37 -300
- package/dist/runtime/cli-runtime.d.ts +2 -0
- package/dist/runtime/cli-runtime.d.ts.map +1 -1
- package/dist/runtime/cli-runtime.js +32 -7
- package/dist/schemas/entity.schema.json +355 -215
- package/dist/search-ranking.d.ts +1 -0
- package/dist/search-ranking.d.ts.map +1 -1
- package/dist/search-ranking.js +3 -0
- package/dist/traceability/evidence-model.d.ts +28 -0
- package/dist/traceability/evidence-model.d.ts.map +1 -1
- package/dist/traceability/git-staged.d.ts +20 -0
- package/dist/traceability/git-staged.d.ts.map +1 -1
- package/dist/traceability/git-staged.js +145 -1
- package/dist/traceability/staged-diagnostics.d.ts +7 -0
- package/dist/traceability/staged-diagnostics.d.ts.map +1 -1
- package/dist/traceability/staged-diagnostics.js +78 -7
- package/dist/traceability/staged-file-coverage.d.ts +33 -0
- package/dist/traceability/staged-file-coverage.d.ts.map +1 -0
- package/dist/traceability/staged-file-coverage.js +284 -0
- package/dist/traceability/staged-impact-contract.js +4 -4
- package/dist/traceability/staged-symbols-manifest.d.ts +13 -0
- package/dist/traceability/staged-symbols-manifest.d.ts.map +1 -1
- package/dist/traceability/staged-symbols-manifest.js +138 -27
- package/dist/traceability/symbol-extract.d.ts +24 -2
- package/dist/traceability/symbol-extract.d.ts.map +1 -1
- package/dist/traceability/symbol-extract.js +64 -208
- package/dist/traceability/temp-kb.d.ts +2 -0
- package/dist/traceability/temp-kb.d.ts.map +1 -1
- package/dist/traceability/temp-kb.js +13 -4
- package/dist/types/entities.d.ts +5 -3
- package/dist/types/entities.d.ts.map +1 -1
- package/dist/utils/branch-resolver.d.ts +1 -0
- package/dist/utils/branch-resolver.d.ts.map +1 -1
- package/dist/utils/branch-resolver.js +7 -4
- package/dist/utils/branch-store.d.ts +6 -0
- package/dist/utils/branch-store.d.ts.map +1 -1
- package/dist/utils/branch-store.js +27 -0
- package/dist/utils/kb-paths.d.ts +1 -1
- package/dist/utils/kb-paths.d.ts.map +1 -1
- package/dist/utils/kb-paths.js +1 -1
- package/dist/utils/rule-registry.d.ts +1 -11
- package/dist/utils/rule-registry.d.ts.map +1 -1
- package/dist/utils/rule-registry.generated.d.ts +102 -0
- package/dist/utils/rule-registry.generated.d.ts.map +1 -0
- package/dist/utils/rule-registry.generated.js +131 -0
- package/dist/utils/rule-registry.js +12 -113
- package/dist/utils/strict-modeling.d.ts +1 -0
- package/dist/utils/strict-modeling.d.ts.map +1 -1
- package/dist/utils/strict-modeling.js +1 -1
- package/package.json +20 -20
- package/src/public/diagnostic-usage.ts +6 -6
- package/src/public/distribution-parity.ts +17 -10
- package/src/public/extractors/symbols-coordinator.ts +1 -0
- package/src/public/impact/analyzer.ts +15 -12
- package/src/public/impact/coverage-depth-quality.ts +1 -1
- package/src/public/impact/diagnostics.ts +2 -1
- package/src/public/impact/diff-meaning.ts +11 -4
- package/src/public/impact/full-kb-quality.ts +463 -72
- package/src/public/operations/catalog.ts +10 -4
- package/src/public/operations/check-executor.ts +4 -8
- package/src/public/operations/check-helpers.ts +2 -2
- package/src/public/operations/contracts.ts +78 -34
- package/src/public/operations/discovery-entities.ts +53 -0
- package/src/public/operations/discovery-executors.ts +64 -48
- package/src/public/operations/index.ts +1 -1
- package/src/public/operations/migration-plan.ts +32 -25
- package/src/public/operations/node-ports.ts +6 -6
- package/src/public/operations/prolog-json.ts +13 -5
- package/src/public/operations/repair-plan.ts +60 -23
- package/src/public/operations/result-envelope.ts +15 -10
- package/src/public/operations/runtime-types.ts +26 -2
- package/src/public/operations/specs/check-rules.generated.ts +38 -0
- package/src/public/operations/specs/check.ts +12 -21
- package/src/public/operations/specs/discovery.ts +3 -0
- package/src/public/operations/specs/mutation-schemas.ts +22 -9
- package/src/public/operations/specs/planning.ts +7 -0
- package/src/public/operations/specs/proof.ts +43 -0
- package/src/public/operations/specs/reporting.ts +140 -13
- package/src/public/operations/specs/semantic.ts +79 -17
- package/src/public/operations/symbol-repair-plan.ts +166 -7
- package/src/public/operations/types.ts +6 -1
- package/src/public/proof-fingerprint.ts +216 -0
- package/src/public/proof-protocol-types.d.ts +96 -0
- package/src/public/proof-protocol.ts +589 -0
- package/src/public/proof-receipt.ts +499 -0
- package/src/public/schemas/entity.ts +26 -10
- package/src/public/skills/kibi-freshness/SKILL.md +1 -1
- package/src/public/skills/kibi-usage/SKILL.md +44 -12
- package/src/public/skills/kibi-usage/resources/operation-access.md +1 -1
- package/src/public/skills/kibi-usage/resources/proof.md +150 -0
- package/src/public/skills/kibi-usage/resources/workflows.md +6 -6
- package/src/public/symbol-granularity.generated.ts +74 -0
- package/src/public/symbol-granularity.ts +34 -59
- package/src/public/telemetry-acceptance-types.d.ts +98 -0
- package/src/public/telemetry-acceptance.ts +22 -100
- package/src/public/telemetry-remediation.ts +1 -1
- package/src/schemas/entity.schema.json +355 -215
- package/dist/cli-register-verification.d.ts +0 -3
- package/dist/cli-register-verification.d.ts.map +0 -1
- package/dist/cli-register-verification.js +0 -16
- package/dist/commands/verify.d.ts +0 -10
- package/dist/commands/verify.d.ts.map +0 -1
- package/dist/commands/verify.js +0 -126
- package/dist/operations/verification/ingest-verification.d.ts +0 -29
- package/dist/operations/verification/ingest-verification.d.ts.map +0 -1
- package/dist/operations/verification/ingest-verification.js +0 -192
- package/dist/public/operations/specs/verification.d.ts +0 -78
- package/dist/public/operations/specs/verification.d.ts.map +0 -1
- package/dist/public/operations/specs/verification.js +0 -62
- package/dist/public/playwright-case-id.d.ts.map +0 -1
- package/dist/public/verification-receipt.d.ts +0 -242
- package/dist/public/verification-receipt.d.ts.map +0 -1
- package/dist/public/verification-receipt.js +0 -296
- package/dist/verification/playwright-reporter.d.ts +0 -21
- package/dist/verification/playwright-reporter.d.ts.map +0 -1
- package/dist/verification/playwright-reporter.js +0 -114
- package/src/public/operations/specs/verification.ts +0 -78
- package/src/public/playwright-case-id.ts +0 -35
- package/src/public/verification-receipt.ts +0 -412
package/dist/engine.js
CHANGED
|
@@ -14,8 +14,9 @@ import * as path from "node:path";
|
|
|
14
14
|
import { fileURLToPath } from "node:url";
|
|
15
15
|
import { PrologProcess, resolveKbPlPath } from "./prolog.js";
|
|
16
16
|
import { parseEntityFromList, parseListOfLists } from "./prolog/codec.js";
|
|
17
|
+
import { retryAttachAfterBreakingStaleLock } from "./prolog/store-lock.js";
|
|
17
18
|
import { isValidBranchName } from "./utils/branch-resolver.js";
|
|
18
|
-
import { ensureBranchStoreManifest } from "./utils/branch-store-locator.js";
|
|
19
|
+
import { branchStorePath, ensureBranchStoreManifest, } from "./utils/branch-store-locator.js";
|
|
19
20
|
export const ENGINE_PROTOCOL_VERSION = 1;
|
|
20
21
|
export const ENGINE_IDLE_TIMEOUT_MS = 10 * 60 * 1000;
|
|
21
22
|
export const ENGINE_PACKAGE_VERSIONS = process.env.KIBI_PACKAGE_VERSIONS ?? "unknown";
|
|
@@ -23,12 +24,95 @@ const ENGINE_QUERY_CACHE_MAX_ENTRIES = 128;
|
|
|
23
24
|
const ENGINE_QUERY_CACHE_MAX_RESULT_BYTES = 8 * 1024 * 1024;
|
|
24
25
|
const ENGINE_FRESHNESS_CACHE_MS = 100;
|
|
25
26
|
const ENGINE_PUBLICATION_LOCK_STALE_MS = 5_000;
|
|
27
|
+
const ENGINE_WORKSPACE_WATCHDOG_MS = 30_000;
|
|
28
|
+
export function requestEngineSignalShutdown(shutdown) {
|
|
29
|
+
return () => {
|
|
30
|
+
void shutdown();
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
export function readJournalGeneration(branchPath) {
|
|
34
|
+
// implements REQ-core-journaled-engine-persistence
|
|
35
|
+
const currentPath = path.join(branchPath, "CURRENT");
|
|
36
|
+
if (!existsSync(currentPath))
|
|
37
|
+
return "";
|
|
38
|
+
return readFileSync(currentPath, "utf8").trim();
|
|
39
|
+
}
|
|
40
|
+
export function readEngineAttachmentIdentity(branchPath) {
|
|
41
|
+
// implements REQ-core-journaled-engine-persistence
|
|
42
|
+
if (!existsSync(branchPath))
|
|
43
|
+
return null;
|
|
44
|
+
const stats = statSync(branchPath);
|
|
45
|
+
let resolved = path.resolve(branchPath);
|
|
46
|
+
try {
|
|
47
|
+
resolved = realpathSync(branchPath);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
// The live path may be replaced between stat and realpath.
|
|
51
|
+
}
|
|
52
|
+
return {
|
|
53
|
+
path: resolved,
|
|
54
|
+
generation: readJournalGeneration(branchPath),
|
|
55
|
+
dev: stats.dev,
|
|
56
|
+
ino: stats.ino,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
export function parseEngineAttachmentIdentity(statusJson) {
|
|
60
|
+
// implements REQ-core-journaled-engine-persistence
|
|
61
|
+
if (statusJson === undefined)
|
|
62
|
+
return null;
|
|
63
|
+
try {
|
|
64
|
+
const decoded = JSON.parse(JSON.parse(statusJson));
|
|
65
|
+
if (typeof decoded.attachedPath !== "string" ||
|
|
66
|
+
typeof decoded.attachedGeneration !== "string" ||
|
|
67
|
+
typeof decoded.attachedDev !== "number" ||
|
|
68
|
+
typeof decoded.attachedIno !== "number") {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
path: decoded.attachedPath,
|
|
73
|
+
generation: decoded.attachedGeneration,
|
|
74
|
+
dev: decoded.attachedDev,
|
|
75
|
+
ino: decoded.attachedIno,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
export function engineAttachmentsMatch(expected, attached) {
|
|
83
|
+
// implements REQ-core-journaled-engine-persistence
|
|
84
|
+
if (expected === null || attached === null)
|
|
85
|
+
return false;
|
|
86
|
+
if (expected.path !== attached.path)
|
|
87
|
+
return false;
|
|
88
|
+
if (expected.ino !== 0 && attached.ino !== 0) {
|
|
89
|
+
return expected.dev === attached.dev && expected.ino === attached.ino;
|
|
90
|
+
}
|
|
91
|
+
return (expected.generation.length > 0 &&
|
|
92
|
+
expected.generation === attached.generation);
|
|
93
|
+
}
|
|
94
|
+
export function formatEngineAttachmentMismatch(operation, expected, attached) {
|
|
95
|
+
// implements REQ-core-journaled-engine-persistence
|
|
96
|
+
return [
|
|
97
|
+
`operation=${operation}`,
|
|
98
|
+
`branchStore=${expected?.path ?? "missing"}`,
|
|
99
|
+
`expectedGeneration=${expected?.generation || "missing"}`,
|
|
100
|
+
`attachedPath=${attached?.path ?? "missing"}`,
|
|
101
|
+
`attachedGeneration=${attached?.generation || "missing"}`,
|
|
102
|
+
].join(" ");
|
|
103
|
+
}
|
|
26
104
|
function engineIdleTimeoutMs() {
|
|
27
105
|
const configured = Number.parseInt(process.env.KIBI_ENGINE_IDLE_TIMEOUT_MS ?? "", 10);
|
|
28
106
|
return Number.isFinite(configured) && configured >= 100
|
|
29
107
|
? configured
|
|
30
108
|
: ENGINE_IDLE_TIMEOUT_MS;
|
|
31
109
|
}
|
|
110
|
+
function engineWorkspaceWatchdogMs() {
|
|
111
|
+
const configured = Number.parseInt(process.env.KIBI_ENGINE_WORKSPACE_WATCHDOG_MS ?? "", 10);
|
|
112
|
+
return Number.isFinite(configured) && configured >= 100
|
|
113
|
+
? configured
|
|
114
|
+
: ENGINE_WORKSPACE_WATCHDOG_MS;
|
|
115
|
+
}
|
|
32
116
|
function quoteProlog(value) {
|
|
33
117
|
return value.replaceAll("'", "''");
|
|
34
118
|
}
|
|
@@ -162,7 +246,7 @@ function parseFrames(buffer, onFrame) {
|
|
|
162
246
|
}
|
|
163
247
|
return buffer.subarray(cursor);
|
|
164
248
|
}
|
|
165
|
-
function runtimeDirectory() {
|
|
249
|
+
export function runtimeDirectory() {
|
|
166
250
|
const configured = process.env.KIBI_RUNTIME_DIR ??
|
|
167
251
|
process.env.XDG_RUNTIME_DIR ??
|
|
168
252
|
path.join(os.tmpdir(), "kibi-runtime");
|
|
@@ -577,6 +661,7 @@ export class EngineClient {
|
|
|
577
661
|
pending = new Map();
|
|
578
662
|
requestTail = Promise.resolve();
|
|
579
663
|
lastResult = null;
|
|
664
|
+
replacingStaleDaemon = false;
|
|
580
665
|
constructor(options) {
|
|
581
666
|
if (!isValidBranchName(options.branch)) {
|
|
582
667
|
throw new Error(`Invalid Kibi engine branch name: ${options.branch}`);
|
|
@@ -593,6 +678,13 @@ export class EngineClient {
|
|
|
593
678
|
this.allowPublicationLock = options.allowPublicationLock ?? false;
|
|
594
679
|
}
|
|
595
680
|
async start(allowSpawn = true) {
|
|
681
|
+
const wasConnected = this.socket !== null && !this.socket.destroyed;
|
|
682
|
+
await this.connect(allowSpawn);
|
|
683
|
+
if (!wasConnected && this.socket !== null) {
|
|
684
|
+
await this.reconcileAttachment();
|
|
685
|
+
}
|
|
686
|
+
}
|
|
687
|
+
async connect(allowSpawn = true) {
|
|
596
688
|
if (this.socket !== null && !this.socket.destroyed)
|
|
597
689
|
return;
|
|
598
690
|
const socketPath = engineSocketPath(this.workspaceRoot, this.branch);
|
|
@@ -691,16 +783,26 @@ export class EngineClient {
|
|
|
691
783
|
socket.on("close", () => {
|
|
692
784
|
this.socket = null;
|
|
693
785
|
const error = new Error("Kibi engine connection closed");
|
|
694
|
-
for (const pending of this.pending.values())
|
|
695
|
-
pending.reject(error);
|
|
786
|
+
for (const pending of this.pending.values()) {
|
|
787
|
+
this.settlePending(pending, () => pending.reject(error));
|
|
788
|
+
}
|
|
696
789
|
this.pending.clear();
|
|
697
790
|
});
|
|
698
791
|
socket.on("error", (error) => {
|
|
699
|
-
for (const pending of this.pending.values())
|
|
700
|
-
pending.reject(error);
|
|
792
|
+
for (const pending of this.pending.values()) {
|
|
793
|
+
this.settlePending(pending, () => pending.reject(error));
|
|
794
|
+
}
|
|
701
795
|
this.pending.clear();
|
|
702
796
|
});
|
|
703
797
|
}
|
|
798
|
+
/** Settle a pending RPC at most once (abort vs response race-safe). */
|
|
799
|
+
settlePending(pending, settle) {
|
|
800
|
+
if (pending.settled)
|
|
801
|
+
return false;
|
|
802
|
+
pending.settled = true;
|
|
803
|
+
settle();
|
|
804
|
+
return true;
|
|
805
|
+
}
|
|
704
806
|
handleResponse(value) {
|
|
705
807
|
if (value === null || typeof value !== "object")
|
|
706
808
|
return;
|
|
@@ -711,55 +813,20 @@ export class EngineClient {
|
|
|
711
813
|
if (!pending)
|
|
712
814
|
return;
|
|
713
815
|
this.pending.delete(response.id);
|
|
714
|
-
if (response.ok)
|
|
715
|
-
pending.resolve(response.result);
|
|
716
|
-
|
|
717
|
-
|
|
816
|
+
if (response.ok) {
|
|
817
|
+
this.settlePending(pending, () => pending.resolve(response.result));
|
|
818
|
+
}
|
|
819
|
+
else {
|
|
820
|
+
this.settlePending(pending, () => pending.reject(new Error(response.error ?? "Kibi engine request failed")));
|
|
821
|
+
}
|
|
718
822
|
}
|
|
719
823
|
async request(request, signal) {
|
|
824
|
+
// Connect/reconcile before taking the client queue. Holding requestTail
|
|
825
|
+
// across start()→reconcileAttachment()→queryStatusJson() deadlocks because
|
|
826
|
+
// that nested status RPC needs the same queue (see command-first clients).
|
|
720
827
|
await this.start();
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
throw new Error("Kibi engine is not connected");
|
|
724
|
-
const id = ++this.requestId;
|
|
725
|
-
const result = new Promise((resolve, reject) => {
|
|
726
|
-
this.pending.set(id, {
|
|
727
|
-
resolve: resolve,
|
|
728
|
-
reject,
|
|
729
|
-
});
|
|
730
|
-
try {
|
|
731
|
-
socket.write(frame({
|
|
732
|
-
...request,
|
|
733
|
-
id,
|
|
734
|
-
protocolVersion: ENGINE_PROTOCOL_VERSION,
|
|
735
|
-
packageVersions: ENGINE_PACKAGE_VERSIONS,
|
|
736
|
-
workspaceRoot: this.workspaceRoot,
|
|
737
|
-
branch: this.branch,
|
|
738
|
-
}));
|
|
739
|
-
}
|
|
740
|
-
catch (error) {
|
|
741
|
-
this.pending.delete(id);
|
|
742
|
-
reject(error instanceof Error ? error : new Error(String(error)));
|
|
743
|
-
return;
|
|
744
|
-
}
|
|
745
|
-
if (signal !== undefined) {
|
|
746
|
-
const abort = () => {
|
|
747
|
-
if (!this.pending.has(id))
|
|
748
|
-
return;
|
|
749
|
-
this.pending.delete(id);
|
|
750
|
-
this.cancel(id);
|
|
751
|
-
reject(new Error("Kibi engine request cancelled"));
|
|
752
|
-
};
|
|
753
|
-
if (signal.aborted)
|
|
754
|
-
abort();
|
|
755
|
-
else
|
|
756
|
-
signal.addEventListener("abort", abort, { once: true });
|
|
757
|
-
}
|
|
758
|
-
});
|
|
759
|
-
return result;
|
|
760
|
-
}
|
|
761
|
-
async query(goal, signal) {
|
|
762
|
-
let result;
|
|
828
|
+
// Serialize query and command frames on one socket so concurrent MCP
|
|
829
|
+
// traffic cannot interleave length-prefixed writes/responses.
|
|
763
830
|
const previous = this.requestTail;
|
|
764
831
|
let release;
|
|
765
832
|
this.requestTail = new Promise((resolve) => {
|
|
@@ -767,14 +834,59 @@ export class EngineClient {
|
|
|
767
834
|
});
|
|
768
835
|
await previous;
|
|
769
836
|
try {
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
837
|
+
const socket = this.socket;
|
|
838
|
+
if (socket === null || socket.destroyed)
|
|
839
|
+
throw new Error("Kibi engine is not connected");
|
|
840
|
+
const id = ++this.requestId;
|
|
841
|
+
return await new Promise((resolve, reject) => {
|
|
842
|
+
this.pending.set(id, {
|
|
843
|
+
resolve: resolve,
|
|
844
|
+
reject,
|
|
845
|
+
settled: false,
|
|
846
|
+
});
|
|
847
|
+
try {
|
|
848
|
+
socket.write(frame({
|
|
849
|
+
...request,
|
|
850
|
+
id,
|
|
851
|
+
protocolVersion: ENGINE_PROTOCOL_VERSION,
|
|
852
|
+
packageVersions: ENGINE_PACKAGE_VERSIONS,
|
|
853
|
+
workspaceRoot: this.workspaceRoot,
|
|
854
|
+
branch: this.branch,
|
|
855
|
+
}));
|
|
856
|
+
}
|
|
857
|
+
catch (error) {
|
|
858
|
+
const pending = this.pending.get(id);
|
|
859
|
+
this.pending.delete(id);
|
|
860
|
+
if (pending) {
|
|
861
|
+
this.settlePending(pending, () => reject(error instanceof Error ? error : new Error(String(error))));
|
|
862
|
+
}
|
|
863
|
+
return;
|
|
864
|
+
}
|
|
865
|
+
if (signal !== undefined) {
|
|
866
|
+
const abort = () => {
|
|
867
|
+
const pending = this.pending.get(id);
|
|
868
|
+
if (!pending || pending.settled)
|
|
869
|
+
return;
|
|
870
|
+
this.pending.delete(id);
|
|
871
|
+
this.cancel(id);
|
|
872
|
+
this.settlePending(pending, () => reject(new Error("Kibi engine request cancelled")));
|
|
873
|
+
};
|
|
874
|
+
if (signal.aborted)
|
|
875
|
+
abort();
|
|
876
|
+
else
|
|
877
|
+
signal.addEventListener("abort", abort, { once: true });
|
|
878
|
+
}
|
|
879
|
+
});
|
|
773
880
|
}
|
|
774
881
|
finally {
|
|
775
882
|
release();
|
|
776
883
|
}
|
|
777
884
|
}
|
|
885
|
+
async query(goal, signal) {
|
|
886
|
+
const result = await this.request({ method: "query", goal }, signal);
|
|
887
|
+
this.lastResult = result;
|
|
888
|
+
return result;
|
|
889
|
+
}
|
|
778
890
|
/** Execute a versioned, goal-free engine command. Raw query remains private
|
|
779
891
|
* compatibility traffic for the in-process Prolog adapter only. */
|
|
780
892
|
async command(command, signal) {
|
|
@@ -860,8 +972,8 @@ export class EngineClient {
|
|
|
860
972
|
async checkpoint() {
|
|
861
973
|
return this.command({ version: 1, kind: "checkpoint" });
|
|
862
974
|
}
|
|
863
|
-
async queryStatusJson() {
|
|
864
|
-
return this.command({ version: 1, kind: "status" });
|
|
975
|
+
async queryStatusJson(signal) {
|
|
976
|
+
return this.command({ version: 1, kind: "status" }, signal);
|
|
865
977
|
}
|
|
866
978
|
async compact() {
|
|
867
979
|
return this.command({ version: 1, kind: "compact" });
|
|
@@ -878,27 +990,36 @@ export class EngineClient {
|
|
|
878
990
|
isRunning() {
|
|
879
991
|
return this.socket !== null && !this.socket.destroyed;
|
|
880
992
|
}
|
|
881
|
-
|
|
882
|
-
const
|
|
993
|
+
async readAttachedIdentity() {
|
|
994
|
+
const status = await this.queryStatusJson();
|
|
995
|
+
if (!status.success)
|
|
996
|
+
return null;
|
|
997
|
+
return parseEngineAttachmentIdentity(status.bindings.JsonString);
|
|
998
|
+
}
|
|
999
|
+
async reconcileAttachment() {
|
|
1000
|
+
if (this.replacingStaleDaemon || this.socket === null)
|
|
1001
|
+
return;
|
|
1002
|
+
const livePath = branchStorePath(this.workspaceRoot, this.branch);
|
|
1003
|
+
const expected = readEngineAttachmentIdentity(livePath);
|
|
1004
|
+
const attached = await this.readAttachedIdentity();
|
|
1005
|
+
if (engineAttachmentsMatch(expected, attached))
|
|
1006
|
+
return;
|
|
1007
|
+
this.replacingStaleDaemon = true;
|
|
883
1008
|
try {
|
|
884
|
-
|
|
1009
|
+
await this.shutdownConnectedDaemon();
|
|
1010
|
+
await this.connect(true);
|
|
1011
|
+
const live = readEngineAttachmentIdentity(livePath);
|
|
1012
|
+
const retried = await this.readAttachedIdentity();
|
|
1013
|
+
if (!engineAttachmentsMatch(live, retried)) {
|
|
1014
|
+
throw new Error(`Kibi engine is attached to a stale branch generation: ${formatEngineAttachmentMismatch("attachment-handshake", live, retried)}`);
|
|
1015
|
+
}
|
|
885
1016
|
}
|
|
886
|
-
|
|
887
|
-
|
|
1017
|
+
finally {
|
|
1018
|
+
this.replacingStaleDaemon = false;
|
|
888
1019
|
}
|
|
889
1020
|
}
|
|
890
|
-
async
|
|
1021
|
+
async shutdownConnectedDaemon() {
|
|
891
1022
|
const socketPath = engineSocketPath(this.workspaceRoot, this.branch);
|
|
892
|
-
if (!this.isRunning()) {
|
|
893
|
-
try {
|
|
894
|
-
await this.start(startIfMissing);
|
|
895
|
-
}
|
|
896
|
-
catch {
|
|
897
|
-
if (!startIfMissing)
|
|
898
|
-
return;
|
|
899
|
-
throw new Error("Unable to start Kibi engine for stop request");
|
|
900
|
-
}
|
|
901
|
-
}
|
|
902
1023
|
if (!this.isRunning()) {
|
|
903
1024
|
if (existsSync(socketPath)) {
|
|
904
1025
|
throw new Error(`Kibi engine socket remains present but is not reachable: ${socketPath}`);
|
|
@@ -914,9 +1035,6 @@ export class EngineClient {
|
|
|
914
1035
|
}
|
|
915
1036
|
this.socket?.destroy();
|
|
916
1037
|
this.socket = null;
|
|
917
|
-
// The daemon acknowledges stop before its SWI child has flushed and the
|
|
918
|
-
// listening socket has closed. Do not let a following auto-start attach to
|
|
919
|
-
// that half-shutdown process.
|
|
920
1038
|
const deadline = Date.now() + 5_000;
|
|
921
1039
|
while (existsSync(socketPath) && Date.now() < deadline) {
|
|
922
1040
|
await new Promise((resolve) => setTimeout(resolve, 25));
|
|
@@ -926,6 +1044,35 @@ export class EngineClient {
|
|
|
926
1044
|
throw new Error(`Kibi engine did not stop within 5 seconds${detail}`);
|
|
927
1045
|
}
|
|
928
1046
|
}
|
|
1047
|
+
getPid() {
|
|
1048
|
+
const pidPath = enginePidPath(this.workspaceRoot, this.branch);
|
|
1049
|
+
try {
|
|
1050
|
+
return Number.parseInt(readFileSync(pidPath, "utf8").trim(), 10) || 0;
|
|
1051
|
+
}
|
|
1052
|
+
catch {
|
|
1053
|
+
return 0;
|
|
1054
|
+
}
|
|
1055
|
+
}
|
|
1056
|
+
async stop(startIfMissing = true) {
|
|
1057
|
+
const socketPath = engineSocketPath(this.workspaceRoot, this.branch);
|
|
1058
|
+
if (!this.isRunning()) {
|
|
1059
|
+
try {
|
|
1060
|
+
await this.connect(startIfMissing);
|
|
1061
|
+
}
|
|
1062
|
+
catch {
|
|
1063
|
+
if (!startIfMissing)
|
|
1064
|
+
return;
|
|
1065
|
+
throw new Error("Unable to start Kibi engine for stop request");
|
|
1066
|
+
}
|
|
1067
|
+
}
|
|
1068
|
+
if (!this.isRunning()) {
|
|
1069
|
+
if (existsSync(socketPath)) {
|
|
1070
|
+
throw new Error(`Kibi engine socket remains present but is not reachable: ${socketPath}`);
|
|
1071
|
+
}
|
|
1072
|
+
return;
|
|
1073
|
+
}
|
|
1074
|
+
await this.shutdownConnectedDaemon();
|
|
1075
|
+
}
|
|
929
1076
|
async terminate() {
|
|
930
1077
|
// Closing a client connection releases the engine; the daemon remains
|
|
931
1078
|
// available for other operations until its idle timeout expires.
|
|
@@ -1149,25 +1296,78 @@ export async function runEngineDaemon(options) {
|
|
|
1149
1296
|
const prolog = new PrologProcess({ timeout: 120_000, oneShot: false });
|
|
1150
1297
|
await prolog.start();
|
|
1151
1298
|
const attached = await prolog.query(`kb_attach('${quoteProlog(branchPath)}')`);
|
|
1152
|
-
if (!attached.success)
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1299
|
+
if (!attached.success) {
|
|
1300
|
+
// The daemon hosts the branch store for every later request, so a
|
|
1301
|
+
// store-locked startup with a provably dead holder is auto-healed here
|
|
1302
|
+
// exactly like the CLI runtime path; live holders abort the startup
|
|
1303
|
+
// with the holder identity surfaced.
|
|
1304
|
+
const recovered = await retryAttachAfterBreakingStaleLock(prolog, branchPath, attached);
|
|
1305
|
+
if (!recovered.success)
|
|
1306
|
+
throw new Error(recovered.error ?? "Failed to attach branch KB");
|
|
1307
|
+
}
|
|
1308
|
+
const attachedIdentity = readEngineAttachmentIdentity(branchPath);
|
|
1309
|
+
const coreModuleDir = path.dirname(resolveKbPlPath());
|
|
1310
|
+
for (const [fileName, label] of [
|
|
1311
|
+
["status.pl", "status"],
|
|
1312
|
+
["discovery.pl", "discovery"],
|
|
1313
|
+
]) {
|
|
1314
|
+
const modulePath = path.join(coreModuleDir, fileName);
|
|
1315
|
+
const loaded = await prolog.query(`use_module('${quoteProlog(modulePath.replaceAll("\\", "/"))}')`);
|
|
1316
|
+
if (!loaded.success) {
|
|
1317
|
+
throw new Error(loaded.error ?? `Failed to load Kibi ${label} module`);
|
|
1318
|
+
}
|
|
1158
1319
|
}
|
|
1159
1320
|
mkdirSync(path.dirname(options.socketPath), { recursive: true, mode: 0o700 });
|
|
1160
1321
|
if (existsSync(options.socketPath)) {
|
|
1322
|
+
const isLivePeerSignal = (error) => {
|
|
1323
|
+
if (error && typeof error === "object") {
|
|
1324
|
+
const code = "code" in error ? String(error.code) : "";
|
|
1325
|
+
if (code === "EPIPE" || code === "ECONNRESET")
|
|
1326
|
+
return true;
|
|
1327
|
+
const errno = "errno" in error
|
|
1328
|
+
? Number(error.errno)
|
|
1329
|
+
: Number.NaN;
|
|
1330
|
+
// POSIX EPIPE
|
|
1331
|
+
if (errno === -32)
|
|
1332
|
+
return true;
|
|
1333
|
+
}
|
|
1334
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
1335
|
+
return /\bEPIPE\b|\bECONNRESET\b|broken pipe/i.test(message);
|
|
1336
|
+
};
|
|
1161
1337
|
let live = false;
|
|
1162
1338
|
try {
|
|
1163
1339
|
const existing = await connectSocket(options.socketPath, 100);
|
|
1164
|
-
|
|
1340
|
+
// Keep a permanent error sink. Bun 1.4 can surface write EPIPE from
|
|
1341
|
+
// teardown into the caller promise on some CI runners, replacing the
|
|
1342
|
+
// intended live-listener error.
|
|
1343
|
+
existing.on("error", () => undefined);
|
|
1165
1344
|
live = true;
|
|
1345
|
+
try {
|
|
1346
|
+
existing.destroy();
|
|
1347
|
+
}
|
|
1348
|
+
catch {
|
|
1349
|
+
// Ignore destroy races; live detection already succeeded.
|
|
1350
|
+
}
|
|
1351
|
+
existing.unref?.();
|
|
1166
1352
|
}
|
|
1167
|
-
catch {
|
|
1168
|
-
//
|
|
1353
|
+
catch (error) {
|
|
1354
|
+
// Bun 1.4 can reject the probe with EPIPE/ECONNRESET against a live
|
|
1355
|
+
// unix listener instead of resolving connect.
|
|
1356
|
+
if (isLivePeerSignal(error)) {
|
|
1357
|
+
live = true;
|
|
1358
|
+
}
|
|
1359
|
+
// Otherwise a refused connection means a stale filesystem socket.
|
|
1169
1360
|
}
|
|
1170
1361
|
if (live) {
|
|
1362
|
+
try {
|
|
1363
|
+
await prolog.terminate();
|
|
1364
|
+
}
|
|
1365
|
+
catch (error) {
|
|
1366
|
+
// Best-effort cleanup; Bun may surface late EPIPE here too.
|
|
1367
|
+
if (!isLivePeerSignal(error)) {
|
|
1368
|
+
// Ignore non-EPIPE terminate failures.
|
|
1369
|
+
}
|
|
1370
|
+
}
|
|
1171
1371
|
throw new Error(`A Kibi engine is already listening at ${options.socketPath}`);
|
|
1172
1372
|
}
|
|
1173
1373
|
try {
|
|
@@ -1185,7 +1385,6 @@ export async function runEngineDaemon(options) {
|
|
|
1185
1385
|
let idleCompactionQueued = false;
|
|
1186
1386
|
const queryCache = new Map();
|
|
1187
1387
|
let freshnessCache = null;
|
|
1188
|
-
const cancelledRequests = new Set();
|
|
1189
1388
|
const clients = new Set();
|
|
1190
1389
|
let shuttingDown = false;
|
|
1191
1390
|
const exactBranchStatus = (result) => {
|
|
@@ -1195,6 +1394,12 @@ export async function runEngineDaemon(options) {
|
|
|
1195
1394
|
try {
|
|
1196
1395
|
const decoded = JSON.parse(JSON.parse(result.bindings.JsonString));
|
|
1197
1396
|
decoded.branch = options.branch;
|
|
1397
|
+
if (attachedIdentity !== null) {
|
|
1398
|
+
decoded.attachedPath = attachedIdentity.path;
|
|
1399
|
+
decoded.attachedGeneration = attachedIdentity.generation;
|
|
1400
|
+
decoded.attachedDev = attachedIdentity.dev;
|
|
1401
|
+
decoded.attachedIno = attachedIdentity.ino;
|
|
1402
|
+
}
|
|
1198
1403
|
return {
|
|
1199
1404
|
...result,
|
|
1200
1405
|
bindings: {
|
|
@@ -1207,6 +1412,27 @@ export async function runEngineDaemon(options) {
|
|
|
1207
1412
|
return result;
|
|
1208
1413
|
}
|
|
1209
1414
|
};
|
|
1415
|
+
// A daemon whose workspace vanished (git worktree remove --force, deleted
|
|
1416
|
+
// checkout) can never serve a request again, but it would keep holding the
|
|
1417
|
+
// branch-store lock and wedge every later operation behind an opaque
|
|
1418
|
+
// "KB locked". Detect the loss and shut down cleanly instead.
|
|
1419
|
+
let workspaceMissingStreak = 0;
|
|
1420
|
+
const workspaceWatchdog = setInterval(() => {
|
|
1421
|
+
if (shuttingDown)
|
|
1422
|
+
return;
|
|
1423
|
+
// Two consecutive misses before giving up: a transient blip (slow
|
|
1424
|
+
// rename, network mount hiccup) must not stop a healthy daemon.
|
|
1425
|
+
if (!existsSync(options.workspaceRoot)) {
|
|
1426
|
+
workspaceMissingStreak += 1;
|
|
1427
|
+
if (workspaceMissingStreak < 2)
|
|
1428
|
+
return;
|
|
1429
|
+
console.error(`[KIBI] workspace ${options.workspaceRoot} no longer exists; stopping engine`);
|
|
1430
|
+
void shutdown();
|
|
1431
|
+
return;
|
|
1432
|
+
}
|
|
1433
|
+
workspaceMissingStreak = 0;
|
|
1434
|
+
}, engineWorkspaceWatchdogMs());
|
|
1435
|
+
workspaceWatchdog.unref();
|
|
1210
1436
|
const scheduleIdleExit = () => {
|
|
1211
1437
|
if (activeClients > 0)
|
|
1212
1438
|
return;
|
|
@@ -1230,7 +1456,7 @@ export async function runEngineDaemon(options) {
|
|
|
1230
1456
|
void shutdown();
|
|
1231
1457
|
}, engineIdleTimeoutMs());
|
|
1232
1458
|
};
|
|
1233
|
-
const handle = async (request) => {
|
|
1459
|
+
const handle = async (request, cancelledRequests) => {
|
|
1234
1460
|
if (request.protocolVersion !== ENGINE_PROTOCOL_VERSION) {
|
|
1235
1461
|
throw new Error(`Kibi engine protocol mismatch: client=${request.protocolVersion ?? "missing"}, server=${ENGINE_PROTOCOL_VERSION}`);
|
|
1236
1462
|
}
|
|
@@ -1493,6 +1719,13 @@ export async function runEngineDaemon(options) {
|
|
|
1493
1719
|
setImmediate(() => void shutdown());
|
|
1494
1720
|
return { stopped: true };
|
|
1495
1721
|
case "cancel":
|
|
1722
|
+
// Best-effort: marks the id so a *queued* request on this connection
|
|
1723
|
+
// is skipped before handle(). A request already inside
|
|
1724
|
+
// `await prolog.query(...)` cannot be interrupted without redesigning
|
|
1725
|
+
// SWI interactive cancellation; the client still rejects locally on
|
|
1726
|
+
// AbortSignal, but the daemon queue remains occupied until that Prolog
|
|
1727
|
+
// call returns. Cancel marks are per-connection. See
|
|
1728
|
+
// docs/mcp-reference.md ("Engine cancellation limits").
|
|
1496
1729
|
if (typeof request.cancelOf === "number") {
|
|
1497
1730
|
cancelledRequests.add(request.cancelOf);
|
|
1498
1731
|
}
|
|
@@ -1507,6 +1740,7 @@ export async function runEngineDaemon(options) {
|
|
|
1507
1740
|
process.off("SIGINT", requestSignalShutdown);
|
|
1508
1741
|
if (idleTimer)
|
|
1509
1742
|
clearTimeout(idleTimer);
|
|
1743
|
+
clearInterval(workspaceWatchdog);
|
|
1510
1744
|
const saved = await prolog.query("kb_save").catch(() => null);
|
|
1511
1745
|
if (saved?.success) {
|
|
1512
1746
|
try {
|
|
@@ -1545,14 +1779,15 @@ export async function runEngineDaemon(options) {
|
|
|
1545
1779
|
// Detached engines must cross the same durability boundary when a service
|
|
1546
1780
|
// manager or a test harness terminates them as they do for an RPC stop.
|
|
1547
1781
|
// implements REQ-test-journaled-engine-harness
|
|
1548
|
-
const requestSignalShutdown = ()
|
|
1549
|
-
void shutdown();
|
|
1550
|
-
};
|
|
1782
|
+
const requestSignalShutdown = requestEngineSignalShutdown(shutdown);
|
|
1551
1783
|
process.once("SIGTERM", requestSignalShutdown);
|
|
1552
1784
|
process.once("SIGINT", requestSignalShutdown);
|
|
1553
1785
|
server.on("connection", (socket) => {
|
|
1554
1786
|
clients.add(socket);
|
|
1555
1787
|
activeClients += 1;
|
|
1788
|
+
// Request ids are per-connection. Cancel marks must not be daemon-global
|
|
1789
|
+
// or Client B's id=1 is poisoned by Client A's cancelOf=1.
|
|
1790
|
+
const cancelledRequests = new Set();
|
|
1556
1791
|
let buffer = Buffer.alloc(0);
|
|
1557
1792
|
socket.on("data", (chunk) => {
|
|
1558
1793
|
try {
|
|
@@ -1575,7 +1810,7 @@ export async function runEngineDaemon(options) {
|
|
|
1575
1810
|
return;
|
|
1576
1811
|
}
|
|
1577
1812
|
try {
|
|
1578
|
-
const result = await handle(request);
|
|
1813
|
+
const result = await handle(request, cancelledRequests);
|
|
1579
1814
|
writeSocketFrame(socket, {
|
|
1580
1815
|
id: request.id,
|
|
1581
1816
|
ok: true,
|
|
@@ -1591,6 +1826,11 @@ export async function runEngineDaemon(options) {
|
|
|
1591
1826
|
serverPackageVersions: ENGINE_PACKAGE_VERSIONS,
|
|
1592
1827
|
});
|
|
1593
1828
|
}
|
|
1829
|
+
finally {
|
|
1830
|
+
// Drop stale cancel marks for in-flight goals that still ran
|
|
1831
|
+
// to completion after cancelOf (SWI cannot interrupt them).
|
|
1832
|
+
cancelledRequests.delete(request.id);
|
|
1833
|
+
}
|
|
1594
1834
|
})
|
|
1595
1835
|
.catch(() => undefined);
|
|
1596
1836
|
});
|