kibi-cli 0.19.0 → 2.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/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.d.ts.map +1 -1
- package/dist/cli-operation-loader.js +53 -20
- package/dist/cli-operation-metadata.d.ts +21 -8
- package/dist/cli-operation-metadata.d.ts.map +1 -1
- package/dist/cli-operation-metadata.js +27 -10
- package/dist/cli-protocol.d.ts.map +1 -1
- package/dist/cli-protocol.js +38 -8
- package/dist/cli-register-foundation.d.ts.map +1 -1
- package/dist/cli-register-foundation.js +14 -2
- package/dist/cli-register-maintenance.d.ts.map +1 -1
- package/dist/cli-register-maintenance.js +33 -4
- 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 +103 -0
- package/dist/cli-register-reporting.d.ts.map +1 -1
- package/dist/cli-register-reporting.js +11 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +17 -8
- package/dist/commands/aggregated-checks.d.ts +1 -2
- package/dist/commands/aggregated-checks.d.ts.map +1 -1
- package/dist/commands/aggregated-checks.js +14 -9
- package/dist/commands/branch.d.ts +37 -0
- package/dist/commands/branch.d.ts.map +1 -1
- package/dist/commands/branch.js +375 -40
- package/dist/commands/check.d.ts +14 -0
- package/dist/commands/check.d.ts.map +1 -1
- package/dist/commands/check.js +209 -110
- 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/discovery-shared.d.ts.map +1 -1
- package/dist/commands/discovery-shared.js +10 -19
- package/dist/commands/doctor.d.ts +26 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +291 -30
- package/dist/commands/engine.d.ts +12 -0
- package/dist/commands/engine.d.ts.map +1 -1
- package/dist/commands/engine.js +50 -7
- package/dist/commands/gc.d.ts +5 -2
- package/dist/commands/gc.d.ts.map +1 -1
- package/dist/commands/gc.js +140 -71
- package/dist/commands/github-init.d.ts +57 -0
- package/dist/commands/github-init.d.ts.map +1 -0
- package/dist/commands/github-init.js +314 -0
- package/dist/commands/init-helpers.d.ts +1 -1
- package/dist/commands/init-helpers.d.ts.map +1 -1
- package/dist/commands/init-helpers.js +109 -28
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +79 -24
- package/dist/commands/legacy-storage-migration.d.ts +54 -0
- package/dist/commands/legacy-storage-migration.d.ts.map +1 -0
- package/dist/commands/legacy-storage-migration.js +277 -0
- package/dist/commands/migrate.d.ts +11 -0
- package/dist/commands/migrate.d.ts.map +1 -1
- package/dist/commands/migrate.js +249 -96
- 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 +24 -0
- package/dist/commands/report.d.ts.map +1 -0
- package/dist/commands/report.js +191 -0
- package/dist/commands/sync/cache.d.ts +16 -3
- package/dist/commands/sync/cache.d.ts.map +1 -1
- package/dist/commands/sync/cache.js +111 -4
- package/dist/commands/sync/discovery.d.ts +26 -2
- package/dist/commands/sync/discovery.d.ts.map +1 -1
- package/dist/commands/sync/discovery.js +204 -15
- package/dist/commands/sync/extraction.d.ts +8 -1
- package/dist/commands/sync/extraction.d.ts.map +1 -1
- package/dist/commands/sync/extraction.js +38 -4
- package/dist/commands/sync/manifest.d.ts +9 -6
- package/dist/commands/sync/manifest.d.ts.map +1 -1
- package/dist/commands/sync/manifest.js +195 -60
- 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 +26 -12
- 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 +17 -1
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +375 -106
- package/dist/diagnostics.d.ts +1 -1
- package/dist/diagnostics.d.ts.map +1 -1
- 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 +34 -3
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +578 -42
- package/dist/env.d.ts.map +1 -1
- package/dist/env.js +5 -6
- package/dist/extractors/manifest.d.ts +13 -1
- package/dist/extractors/manifest.d.ts.map +1 -1
- package/dist/extractors/manifest.js +97 -10
- package/dist/extractors/markdown.d.ts +5 -2
- package/dist/extractors/markdown.d.ts.map +1 -1
- package/dist/extractors/markdown.js +47 -12
- package/dist/extractors/playwright-cases.d.ts +24 -0
- package/dist/extractors/playwright-cases.d.ts.map +1 -0
- package/dist/extractors/playwright-cases.js +126 -0
- package/dist/extractors/relationships.d.ts +6 -0
- package/dist/extractors/relationships.d.ts.map +1 -1
- package/dist/extractors/relationships.js +2 -1
- package/dist/extractors/symbol-coordinates.d.ts +81 -3
- package/dist/extractors/symbol-coordinates.d.ts.map +1 -1
- package/dist/extractors/symbol-coordinates.js +389 -51
- package/dist/extractors/symbols-coordinator.js +11 -1
- package/dist/extractors/symbols-ts.d.ts +1 -0
- package/dist/extractors/symbols-ts.d.ts.map +1 -1
- package/dist/extractors/symbols-ts.js +142 -67
- package/dist/intent-search.d.ts +61 -0
- package/dist/intent-search.d.ts.map +1 -0
- package/dist/intent-search.js +437 -0
- 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 +5 -0
- package/dist/operations/bootstrap/activation.d.ts.map +1 -0
- package/dist/operations/{autopilot → bootstrap}/activation.js +58 -33
- package/dist/operations/{autopilot → bootstrap}/candidate-helpers.d.ts.map +1 -1
- package/dist/operations/bootstrap/candidates.d.ts +4 -0
- package/dist/operations/{autopilot → bootstrap}/candidates.d.ts.map +1 -1
- package/dist/operations/{autopilot → bootstrap}/candidates.js +22 -8
- package/dist/operations/{autopilot → bootstrap}/discovery-evidence.d.ts +2 -2
- package/dist/operations/{autopilot → bootstrap}/discovery-evidence.d.ts.map +1 -1
- package/dist/operations/{autopilot → bootstrap}/discovery-evidence.js +46 -6
- package/dist/operations/{autopilot → bootstrap}/discovery.d.ts +1 -1
- package/dist/operations/bootstrap/discovery.d.ts.map +1 -0
- package/dist/operations/{autopilot → bootstrap}/discovery.js +21 -14
- package/dist/operations/bootstrap/generate.d.ts +9 -0
- package/dist/operations/bootstrap/generate.d.ts.map +1 -0
- package/dist/operations/bootstrap/generate.js +207 -0
- package/dist/operations/{autopilot → bootstrap}/guidance-actions.d.ts +2 -2
- package/dist/operations/{autopilot → bootstrap}/guidance-actions.d.ts.map +1 -1
- package/dist/operations/{autopilot → bootstrap}/guidance-actions.js +4 -4
- package/dist/operations/{autopilot → bootstrap}/guidance.d.ts +3 -2
- package/dist/operations/bootstrap/guidance.d.ts.map +1 -0
- package/dist/operations/{autopilot → bootstrap}/guidance.js +3 -1
- package/dist/operations/{autopilot → bootstrap}/markdown-candidates.d.ts +2 -2
- package/dist/operations/{autopilot → bootstrap}/markdown-candidates.d.ts.map +1 -1
- package/dist/operations/{autopilot → bootstrap}/markdown-candidates.js +4 -3
- package/dist/operations/bootstrap/presentation.d.ts +15 -0
- package/dist/operations/bootstrap/presentation.d.ts.map +1 -0
- package/dist/operations/bootstrap/presentation.js +177 -0
- package/dist/operations/{autopilot → bootstrap}/requirement-claims.d.ts.map +1 -1
- package/dist/operations/{autopilot → bootstrap}/types.d.ts +63 -21
- package/dist/operations/bootstrap/types.d.ts.map +1 -0
- package/dist/operations/bootstrap/types.js +25 -0
- 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 -63
- package/dist/operations/modeling/predicate-applicability.d.ts +16 -0
- package/dist/operations/modeling/predicate-applicability.d.ts.map +1 -0
- package/dist/operations/modeling/predicate-applicability.js +375 -0
- package/dist/operations/modeling/predicate-applyplan.d.ts +13 -2
- package/dist/operations/modeling/predicate-applyplan.d.ts.map +1 -1
- package/dist/operations/modeling/predicate-applyplan.js +100 -3
- package/dist/operations/modeling/predicate-bindings.d.ts +6 -0
- package/dist/operations/modeling/predicate-bindings.d.ts.map +1 -0
- package/dist/operations/modeling/predicate-bindings.js +122 -0
- 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-4.d.ts.map +1 -1
- package/dist/operations/modeling/predicate-catalog-4.js +155 -0
- 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-inference-1.d.ts.map +1 -1
- package/dist/operations/modeling/predicate-inference-1.js +8 -0
- package/dist/operations/modeling/predicate-inference-launcher.d.ts +10 -0
- package/dist/operations/modeling/predicate-inference-launcher.d.ts.map +1 -0
- package/dist/operations/modeling/predicate-inference-launcher.js +13 -0
- package/dist/operations/modeling/predicate-inference.d.ts.map +1 -1
- package/dist/operations/modeling/predicate-inference.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 +11 -3
- package/dist/operations/modeling/predicate-ranker.d.ts +8 -1
- package/dist/operations/modeling/predicate-ranker.d.ts.map +1 -1
- package/dist/operations/modeling/predicate-ranker.js +159 -24
- package/dist/operations/modeling/predicate-score-3.d.ts.map +1 -1
- package/dist/operations/modeling/predicate-score-3.js +6 -0
- package/dist/operations/modeling/predicate-types.d.ts +35 -1
- package/dist/operations/modeling/predicate-types.d.ts.map +1 -1
- package/dist/operations/modeling/predicate-usage-hints-3.d.ts.map +1 -1
- package/dist/operations/modeling/predicate-usage-hints-3.js +40 -0
- 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/predicate-utils.d.ts.map +1 -1
- package/dist/operations/modeling/predicate-utils.js +2 -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 +203 -32
- 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 +483 -19
- package/dist/operations/mutation/entity-projection.d.ts +11 -0
- package/dist/operations/mutation/entity-projection.d.ts.map +1 -0
- package/dist/operations/mutation/entity-projection.js +14 -0
- package/dist/operations/mutation/relationships.d.ts +11 -0
- package/dist/operations/mutation/relationships.d.ts.map +1 -1
- package/dist/operations/mutation/relationships.js +77 -5
- 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 -1
- package/dist/operations/mutation/source-authoring.d.ts +65 -0
- package/dist/operations/mutation/source-authoring.d.ts.map +1 -0
- package/dist/operations/mutation/source-authoring.js +576 -0
- 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 +54 -0
- package/dist/operations/mutation/symbol-compiler-lock.d.ts.map +1 -0
- package/dist/operations/mutation/symbol-compiler-lock.js +337 -0
- package/dist/operations/mutation/symbol-granularity.d.ts.map +1 -1
- package/dist/operations/mutation/symbol-granularity.js +35 -4
- package/dist/operations/mutation/symbol-refresh.d.ts +19 -1
- package/dist/operations/mutation/symbol-refresh.d.ts.map +1 -1
- package/dist/operations/mutation/symbol-refresh.js +227 -63
- package/dist/operations/mutation/types.d.ts +57 -1
- package/dist/operations/mutation/types.d.ts.map +1 -1
- 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 +403 -32
- 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 +47 -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 +19 -0
- package/dist/operations/planning/apply-plan.d.ts.map +1 -0
- package/dist/operations/planning/apply-plan.js +1514 -0
- package/dist/operations/planning/compile-intent.d.ts +108 -0
- package/dist/operations/planning/compile-intent.d.ts.map +1 -0
- package/dist/operations/planning/compile-intent.js +618 -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 +307 -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 +88 -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/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 +52 -28
- package/dist/operations/semantic-advisor/clauses.d.ts.map +1 -1
- package/dist/operations/semantic-advisor/clauses.js +35 -9
- package/dist/operations/semantic-advisor/ingestion-boundary.d.ts.map +1 -1
- package/dist/operations/semantic-advisor/ingestion-boundary.js +7 -3
- package/dist/operations/semantic-advisor/predicate-rules-launcher.d.ts +51 -0
- package/dist/operations/semantic-advisor/predicate-rules-launcher.d.ts.map +1 -0
- package/dist/operations/semantic-advisor/predicate-rules-launcher.js +96 -0
- 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 +13 -5
- package/dist/operations/semantic-advisor/types.d.ts.map +1 -1
- package/dist/prolog/codec.d.ts +13 -1
- package/dist/prolog/codec.d.ts.map +1 -1
- package/dist/prolog/codec.js +269 -153
- 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 +82 -25
- 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/proof/producers/playwright-case-id.d.ts +8 -0
- package/dist/proof/producers/playwright-case-id.d.ts.map +1 -0
- package/dist/proof/producers/playwright-case-id.js +25 -0
- 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/branch-resolver.d.ts +1 -0
- package/dist/public/branch-resolver.d.ts.map +1 -1
- package/dist/public/branch-resolver.js +1 -0
- package/dist/public/check-types.d.ts +2 -2
- package/dist/public/check-types.d.ts.map +1 -1
- package/dist/public/check-types.js +16 -16
- package/dist/public/diagnostic-usage.d.ts.map +1 -1
- package/dist/public/diagnostic-usage.js +74 -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 -9
- package/dist/public/ignore-policy.d.ts.map +1 -1
- package/dist/public/ignore-policy.js +16 -4
- package/dist/public/impact/coverage-depth-quality.d.ts +7 -1
- package/dist/public/impact/coverage-depth-quality.d.ts.map +1 -1
- package/dist/public/impact/coverage-depth-quality.js +22 -4
- 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 +7 -2
- package/dist/public/impact/full-kb-quality.d.ts.map +1 -1
- package/dist/public/impact/full-kb-quality.js +364 -39
- package/dist/public/impact/manifest.d.ts.map +1 -1
- package/dist/public/impact/manifest.js +2 -5
- package/dist/public/operational-artifacts.d.ts.map +1 -1
- package/dist/public/operational-artifacts.js +7 -1
- package/dist/public/operations/catalog.d.ts +900 -34
- package/dist/public/operations/catalog.d.ts.map +1 -1
- package/dist/public/operations/catalog.js +130 -6
- package/dist/public/operations/check-executor.d.ts +2 -2
- package/dist/public/operations/check-executor.d.ts.map +1 -1
- package/dist/public/operations/check-executor.js +68 -13
- package/dist/public/operations/check-format-shared.d.ts +3 -0
- package/dist/public/operations/check-format-shared.d.ts.map +1 -1
- package/dist/public/operations/check-format-shared.js +3 -0
- package/dist/public/operations/check-helpers.d.ts +27 -2
- package/dist/public/operations/check-helpers.d.ts.map +1 -1
- package/dist/public/operations/check-helpers.js +62 -26
- package/dist/public/operations/contracts.d.ts +18 -0
- package/dist/public/operations/contracts.d.ts.map +1 -0
- package/dist/public/operations/contracts.js +334 -0
- package/dist/public/operations/discovery-entities.d.ts +3 -0
- package/dist/public/operations/discovery-entities.d.ts.map +1 -1
- package/dist/public/operations/discovery-entities.js +4 -0
- package/dist/public/operations/discovery-executors.d.ts +43 -7
- package/dist/public/operations/discovery-executors.d.ts.map +1 -1
- package/dist/public/operations/discovery-executors.js +216 -13
- package/dist/public/operations/index.d.ts +9 -4
- package/dist/public/operations/index.d.ts.map +1 -1
- package/dist/public/operations/index.js +8 -3
- package/dist/public/operations/migration-plan.d.ts +102 -0
- package/dist/public/operations/migration-plan.d.ts.map +1 -0
- package/dist/public/operations/migration-plan.js +539 -0
- package/dist/public/operations/node-ports.d.ts.map +1 -1
- package/dist/public/operations/node-ports.js +71 -11
- package/dist/public/operations/prolog-json.d.ts +14 -0
- package/dist/public/operations/prolog-json.d.ts.map +1 -1
- package/dist/public/operations/prolog-json.js +44 -5
- 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 -18
- package/dist/public/operations/result-envelope.d.ts +14 -0
- package/dist/public/operations/result-envelope.d.ts.map +1 -0
- package/dist/public/operations/result-envelope.js +106 -0
- package/dist/public/operations/runtime-types.d.ts +102 -7
- package/dist/public/operations/runtime-types.d.ts.map +1 -1
- package/dist/public/operations/source-relationship-parity.d.ts +13 -0
- package/dist/public/operations/source-relationship-parity.d.ts.map +1 -0
- package/dist/public/operations/source-relationship-parity.js +162 -0
- package/dist/public/operations/specs/{autopilot.d.ts → bootstrap.d.ts} +9 -9
- package/dist/public/operations/specs/bootstrap.d.ts.map +1 -0
- package/dist/public/operations/specs/{autopilot.js → bootstrap.js} +8 -7
- 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 +34 -0
- package/dist/public/operations/specs/check.d.ts +9 -4
- package/dist/public/operations/specs/check.d.ts.map +1 -1
- package/dist/public/operations/specs/check.js +10 -21
- package/dist/public/operations/specs/discovery.d.ts +87 -3
- package/dist/public/operations/specs/discovery.d.ts.map +1 -1
- package/dist/public/operations/specs/discovery.js +53 -3
- package/dist/public/operations/specs/modeling.d.ts +3 -3
- package/dist/public/operations/specs/modeling.js +3 -3
- package/dist/public/operations/specs/mutation-schemas.d.ts +251 -14
- package/dist/public/operations/specs/mutation-schemas.d.ts.map +1 -1
- package/dist/public/operations/specs/mutation-schemas.js +16 -6
- package/dist/public/operations/specs/mutation.d.ts +42 -2
- package/dist/public/operations/specs/mutation.d.ts.map +1 -1
- package/dist/public/operations/specs/mutation.js +26 -2
- package/dist/public/operations/specs/planning.d.ts +279 -0
- package/dist/public/operations/specs/planning.d.ts.map +1 -0
- package/dist/public/operations/specs/planning.js +197 -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 +23 -1
- package/dist/public/operations/specs/reporting.d.ts.map +1 -1
- package/dist/public/operations/specs/reporting.js +156 -11
- package/dist/public/operations/specs/upsert.d.ts +265 -14
- package/dist/public/operations/specs/upsert.d.ts.map +1 -1
- package/dist/public/operations/specs/upsert.js +9 -0
- package/dist/public/operations/symbol-repair-plan.d.ts +22 -0
- package/dist/public/operations/symbol-repair-plan.d.ts.map +1 -0
- package/dist/public/operations/symbol-repair-plan.js +238 -0
- package/dist/public/operations/types.d.ts +52 -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 +22 -6
- package/dist/public/skills/kibi-bootstrap/SKILL.md +58 -0
- package/dist/public/skills/kibi-bootstrap/resources/bootstrap.md +11 -0
- package/dist/public/skills/kibi-bootstrap/resources/branch-lifecycle.md +7 -0
- package/dist/public/skills/kibi-bootstrap/resources/operation-access.md +5 -0
- package/dist/public/skills/kibi-bootstrap/resources/source-authoring.md +8 -0
- package/dist/public/skills/kibi-freshness/SKILL.md +39 -9
- package/dist/public/skills/kibi-freshness/resources/branch-lifecycle.md +7 -0
- package/dist/public/skills/kibi-freshness/resources/operation-access.md +6 -0
- package/dist/public/skills/kibi-freshness/resources/source-authoring.md +7 -0
- package/dist/public/skills/kibi-traceability/SKILL.md +47 -47
- package/dist/public/skills/kibi-traceability/resources/branch-lifecycle.md +7 -0
- package/dist/public/skills/kibi-traceability/resources/operation-access.md +5 -0
- package/dist/public/skills/kibi-traceability/resources/source-authoring.md +6 -0
- package/dist/public/skills/kibi-traceability/resources/traceability.md +8 -0
- package/dist/public/skills/kibi-usage/SKILL.md +136 -231
- package/dist/public/skills/kibi-usage/resources/branch-lifecycle.md +31 -0
- package/dist/public/skills/kibi-usage/resources/kb-improvement.md +38 -0
- package/dist/public/skills/kibi-usage/resources/operation-access.md +36 -38
- package/dist/public/skills/kibi-usage/resources/proof.md +105 -0
- package/dist/public/skills/kibi-usage/resources/relationship-directions.md +3 -3
- package/dist/public/skills/kibi-usage/resources/source-authoring.md +31 -0
- package/dist/public/skills/kibi-usage/resources/workflows.md +57 -4
- 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 +20 -0
- package/dist/public/symbol-granularity.js +6 -46
- package/dist/public/telemetry-acceptance.d.ts +3 -70
- package/dist/public/telemetry-acceptance.d.ts.map +1 -1
- package/dist/public/telemetry-acceptance.js +11 -2
- package/dist/public/telemetry-remediation.js +1 -1
- package/dist/relationships/shards.d.ts +16 -0
- package/dist/relationships/shards.d.ts.map +1 -1
- package/dist/relationships/shards.js +87 -2
- package/dist/report/brand.d.ts +19 -0
- package/dist/report/brand.d.ts.map +1 -0
- package/dist/report/brand.js +112 -0
- package/dist/report/html-report.css +282 -0
- package/dist/report/html-report.d.ts +21 -0
- package/dist/report/html-report.d.ts.map +1 -0
- package/dist/report/html-report.js +700 -0
- package/dist/report/relative-time.d.ts +4 -0
- package/dist/report/relative-time.d.ts.map +1 -0
- package/dist/report/relative-time.js +46 -0
- package/dist/report/report-view.d.ts +17 -0
- package/dist/report/report-view.d.ts.map +1 -0
- package/dist/report/report-view.js +33 -0
- package/dist/report/repository.d.ts +35 -0
- package/dist/report/repository.d.ts.map +1 -0
- package/dist/report/repository.js +151 -0
- 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 +90 -23
- package/dist/schemas/entity.schema.json +1254 -239
- 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 +30 -2
- package/dist/traceability/evidence-model.d.ts.map +1 -1
- package/dist/traceability/evidence-model.js +2 -2
- 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 +156 -37
- package/dist/traceability/markdown-validate.d.ts.map +1 -1
- package/dist/traceability/markdown-validate.js +12 -7
- 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.d.ts +3 -3
- package/dist/traceability/staged-impact-contract.d.ts.map +1 -1
- package/dist/traceability/staged-impact-contract.js +12 -40
- 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 +142 -26
- package/dist/traceability/symbol-extract.d.ts +5 -0
- package/dist/traceability/symbol-extract.d.ts.map +1 -1
- package/dist/traceability/symbol-extract.js +1 -1
- 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 +14 -2
- package/dist/types/entities.d.ts +5 -0
- package/dist/types/entities.d.ts.map +1 -1
- package/dist/utils/branch-resolver.d.ts +25 -10
- package/dist/utils/branch-resolver.d.ts.map +1 -1
- package/dist/utils/branch-resolver.js +124 -38
- package/dist/utils/branch-store-locator.d.ts +23 -0
- package/dist/utils/branch-store-locator.d.ts.map +1 -0
- package/dist/utils/branch-store-locator.js +90 -0
- package/dist/utils/branch-store.d.ts +21 -0
- package/dist/utils/branch-store.d.ts.map +1 -0
- package/dist/utils/branch-store.js +157 -0
- package/dist/utils/config.d.ts +39 -37
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +107 -119
- package/dist/utils/kb-manifest.d.ts +35 -0
- package/dist/utils/kb-manifest.d.ts.map +1 -0
- package/dist/utils/kb-manifest.js +154 -0
- package/dist/utils/kb-paths.d.ts +54 -0
- package/dist/utils/kb-paths.d.ts.map +1 -0
- package/dist/utils/kb-paths.js +125 -0
- package/dist/utils/manifest-paths.d.ts +4 -4
- package/dist/utils/manifest-paths.d.ts.map +1 -1
- package/dist/utils/manifest-paths.js +8 -56
- package/dist/utils/rule-registry.d.ts +42 -24
- package/dist/utils/rule-registry.d.ts.map +1 -1
- package/dist/utils/rule-registry.generated.d.ts +97 -0
- package/dist/utils/rule-registry.generated.d.ts.map +1 -0
- package/dist/utils/rule-registry.generated.js +125 -0
- package/dist/utils/rule-registry.js +52 -148
- package/dist/utils/schema-version.d.ts +5 -5
- package/dist/utils/schema-version.d.ts.map +1 -1
- package/dist/utils/schema-version.js +26 -6
- package/dist/utils/strict-modeling.d.ts +1 -4
- package/dist/utils/strict-modeling.d.ts.map +1 -1
- package/dist/utils/strict-modeling.js +8 -9
- package/package.json +47 -11
- package/schema/config.json +2 -2
- package/schema/manifest.json +26 -0
- package/src/public/branch-resolver.ts +1 -0
- package/src/public/check-types.ts +22 -19
- package/src/public/diagnostic-usage.ts +84 -6
- package/src/public/distribution-parity.ts +17 -9
- package/src/public/ignore-policy.ts +16 -10
- package/src/public/impact/coverage-depth-quality.ts +37 -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 +545 -41
- package/src/public/impact/manifest.ts +2 -4
- package/src/public/operational-artifacts.ts +9 -1
- package/src/public/operations/catalog.ts +153 -10
- package/src/public/operations/check-executor.ts +98 -15
- package/src/public/operations/check-format-shared.ts +6 -0
- package/src/public/operations/check-helpers.ts +74 -35
- package/src/public/operations/contracts.ts +382 -0
- package/src/public/operations/discovery-entities.ts +7 -0
- package/src/public/operations/discovery-executors.ts +315 -25
- package/src/public/operations/index.ts +9 -4
- package/src/public/operations/migration-plan.ts +747 -0
- package/src/public/operations/node-ports.ts +87 -13
- package/src/public/operations/prolog-json.ts +60 -5
- package/src/public/operations/repair-plan.ts +60 -22
- package/src/public/operations/result-envelope.ts +141 -0
- package/src/public/operations/runtime-types.ts +96 -5
- package/src/public/operations/source-relationship-parity.ts +226 -0
- package/src/public/operations/specs/{autopilot.ts → bootstrap.ts} +17 -16
- package/src/public/operations/specs/check-rules.generated.ts +37 -0
- package/src/public/operations/specs/check.ts +14 -22
- package/src/public/operations/specs/discovery.ts +57 -3
- package/src/public/operations/specs/modeling.ts +3 -3
- package/src/public/operations/specs/mutation-schemas.ts +24 -6
- package/src/public/operations/specs/mutation.ts +27 -2
- package/src/public/operations/specs/planning.ts +241 -0
- package/src/public/operations/specs/proof.ts +43 -0
- package/src/public/operations/specs/reporting.ts +193 -12
- package/src/public/operations/specs/upsert.ts +10 -0
- package/src/public/operations/symbol-repair-plan.ts +324 -0
- package/src/public/operations/types.ts +62 -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 +27 -6
- package/src/public/skills/kibi-bootstrap/SKILL.md +58 -0
- package/src/public/skills/kibi-bootstrap/resources/bootstrap.md +11 -0
- package/src/public/skills/kibi-bootstrap/resources/branch-lifecycle.md +7 -0
- package/src/public/skills/kibi-bootstrap/resources/operation-access.md +5 -0
- package/src/public/skills/kibi-bootstrap/resources/source-authoring.md +8 -0
- package/src/public/skills/kibi-freshness/SKILL.md +39 -9
- package/src/public/skills/kibi-freshness/resources/branch-lifecycle.md +7 -0
- package/src/public/skills/kibi-freshness/resources/operation-access.md +6 -0
- package/src/public/skills/kibi-freshness/resources/source-authoring.md +7 -0
- package/src/public/skills/kibi-traceability/SKILL.md +47 -47
- package/src/public/skills/kibi-traceability/resources/branch-lifecycle.md +7 -0
- package/src/public/skills/kibi-traceability/resources/operation-access.md +5 -0
- package/src/public/skills/kibi-traceability/resources/source-authoring.md +6 -0
- package/src/public/skills/kibi-traceability/resources/traceability.md +8 -0
- package/src/public/skills/kibi-usage/SKILL.md +136 -231
- package/src/public/skills/kibi-usage/resources/branch-lifecycle.md +31 -0
- package/src/public/skills/kibi-usage/resources/kb-improvement.md +38 -0
- package/src/public/skills/kibi-usage/resources/operation-access.md +36 -38
- package/src/public/skills/kibi-usage/resources/proof.md +105 -0
- package/src/public/skills/kibi-usage/resources/relationship-directions.md +3 -3
- package/src/public/skills/kibi-usage/resources/source-authoring.md +31 -0
- package/src/public/skills/kibi-usage/resources/workflows.md +57 -4
- package/src/public/symbol-granularity.generated.ts +41 -0
- package/src/public/symbol-granularity.ts +35 -59
- package/src/public/telemetry-acceptance-types.d.ts +98 -0
- package/src/public/telemetry-acceptance.ts +30 -93
- package/src/public/telemetry-remediation.ts +1 -1
- package/src/schemas/entity.schema.json +1254 -239
- package/templates/github/kibi-badge.yml +86 -0
- package/templates/github/kibi-report.yml +84 -0
- package/dist/operations/autopilot/activation.d.ts +0 -4
- package/dist/operations/autopilot/activation.d.ts.map +0 -1
- package/dist/operations/autopilot/candidates.d.ts +0 -4
- package/dist/operations/autopilot/discovery.d.ts.map +0 -1
- package/dist/operations/autopilot/generate.d.ts +0 -8
- package/dist/operations/autopilot/generate.d.ts.map +0 -1
- package/dist/operations/autopilot/generate.js +0 -112
- package/dist/operations/autopilot/guidance.d.ts.map +0 -1
- package/dist/operations/autopilot/presentation.d.ts +0 -13
- package/dist/operations/autopilot/presentation.d.ts.map +0 -1
- package/dist/operations/autopilot/presentation.js +0 -91
- package/dist/operations/autopilot/types.d.ts.map +0 -1
- package/dist/operations/autopilot/types.js +0 -8
- package/dist/public/operations/specs/autopilot.d.ts.map +0 -1
- package/dist/public/skills/init-kibi/SKILL.md +0 -62
- package/dist/public/verification-receipt.d.ts +0 -75
- package/dist/public/verification-receipt.d.ts.map +0 -1
- package/dist/public/verification-receipt.js +0 -129
- package/src/public/skills/init-kibi/SKILL.md +0 -62
- package/src/public/verification-receipt.ts +0 -170
- /package/dist/operations/{autopilot → bootstrap}/candidate-helpers.d.ts +0 -0
- /package/dist/operations/{autopilot → bootstrap}/candidate-helpers.js +0 -0
- /package/dist/operations/{autopilot → bootstrap}/requirement-claims.d.ts +0 -0
- /package/dist/operations/{autopilot → bootstrap}/requirement-claims.js +0 -0
package/dist/engine.js
CHANGED
|
@@ -14,19 +14,105 @@ 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";
|
|
19
|
+
import { branchStorePath, ensureBranchStoreManifest, } from "./utils/branch-store-locator.js";
|
|
18
20
|
export const ENGINE_PROTOCOL_VERSION = 1;
|
|
19
21
|
export const ENGINE_IDLE_TIMEOUT_MS = 10 * 60 * 1000;
|
|
20
22
|
export const ENGINE_PACKAGE_VERSIONS = process.env.KIBI_PACKAGE_VERSIONS ?? "unknown";
|
|
21
23
|
const ENGINE_QUERY_CACHE_MAX_ENTRIES = 128;
|
|
22
24
|
const ENGINE_QUERY_CACHE_MAX_RESULT_BYTES = 8 * 1024 * 1024;
|
|
23
25
|
const ENGINE_FRESHNESS_CACHE_MS = 100;
|
|
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
|
+
}
|
|
24
104
|
function engineIdleTimeoutMs() {
|
|
25
105
|
const configured = Number.parseInt(process.env.KIBI_ENGINE_IDLE_TIMEOUT_MS ?? "", 10);
|
|
26
106
|
return Number.isFinite(configured) && configured >= 100
|
|
27
107
|
? configured
|
|
28
108
|
: ENGINE_IDLE_TIMEOUT_MS;
|
|
29
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
|
+
}
|
|
30
116
|
function quoteProlog(value) {
|
|
31
117
|
return value.replaceAll("'", "''");
|
|
32
118
|
}
|
|
@@ -48,15 +134,84 @@ function cacheableEngineGoal(goal) {
|
|
|
48
134
|
function mutatingEngineGoal(goal) {
|
|
49
135
|
return /(?:kb_(?:assert|retract|commit|save|delete)|rdf_transaction|rdf_assert|rdf_retract)/.test(goal);
|
|
50
136
|
}
|
|
137
|
+
function maskPrologData(goal) {
|
|
138
|
+
const chars = [...goal];
|
|
139
|
+
let quote = null;
|
|
140
|
+
let lineComment = false;
|
|
141
|
+
let blockComment = false;
|
|
142
|
+
for (let index = 0; index < chars.length; index += 1) {
|
|
143
|
+
const current = chars[index];
|
|
144
|
+
const next = chars[index + 1];
|
|
145
|
+
if (lineComment) {
|
|
146
|
+
if (current === "\n")
|
|
147
|
+
lineComment = false;
|
|
148
|
+
else
|
|
149
|
+
chars[index] = " ";
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
if (blockComment) {
|
|
153
|
+
if (current === "*" && next === "/") {
|
|
154
|
+
chars[index] = " ";
|
|
155
|
+
chars[index + 1] = " ";
|
|
156
|
+
index += 1;
|
|
157
|
+
blockComment = false;
|
|
158
|
+
}
|
|
159
|
+
else if (current !== "\n") {
|
|
160
|
+
chars[index] = " ";
|
|
161
|
+
}
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
if (quote !== null) {
|
|
165
|
+
if (current === "\\") {
|
|
166
|
+
chars[index] = " ";
|
|
167
|
+
if (index + 1 < chars.length) {
|
|
168
|
+
chars[index + 1] = " ";
|
|
169
|
+
index += 1;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
else if (current === quote) {
|
|
173
|
+
if (next === quote) {
|
|
174
|
+
chars[index] = " ";
|
|
175
|
+
chars[index + 1] = " ";
|
|
176
|
+
index += 1;
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
chars[index] = " ";
|
|
180
|
+
quote = null;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
else if (current !== "\n") {
|
|
184
|
+
chars[index] = " ";
|
|
185
|
+
}
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
if (current === "%") {
|
|
189
|
+
chars[index] = " ";
|
|
190
|
+
lineComment = true;
|
|
191
|
+
}
|
|
192
|
+
else if (current === "/" && next === "*") {
|
|
193
|
+
chars[index] = " ";
|
|
194
|
+
chars[index + 1] = " ";
|
|
195
|
+
index += 1;
|
|
196
|
+
blockComment = true;
|
|
197
|
+
}
|
|
198
|
+
else if (current === "'" || current === '"' || current === "`") {
|
|
199
|
+
chars[index] = " ";
|
|
200
|
+
quote = current;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
return chars.join("");
|
|
204
|
+
}
|
|
51
205
|
function safeEngineGoal(goal) {
|
|
52
206
|
// The socket is a local capability boundary, not a general-purpose SWI
|
|
53
207
|
// console. Public clients may compose the typed Kibi predicates needed by
|
|
54
|
-
// the
|
|
208
|
+
// the typed operation contracts, but process/filesystem/network escape hatches
|
|
55
209
|
// are rejected before they reach Prolog.
|
|
56
|
-
|
|
210
|
+
const executable = maskPrologData(goal);
|
|
211
|
+
if (/\b(?:halt|abort|shell|system|process_create|consult|load_files|open|close|delete_file|rename_file|make_directory|thread_create|rdf_attach_db|rdf_load|rdf_save|assertz|asserta|retractall|set_prolog_flag)\s*\(/.test(executable)) {
|
|
57
212
|
return false;
|
|
58
213
|
}
|
|
59
|
-
return /(?:^|[(:,\s])(?:kb_|checks:|status:|discovery:|requirement_proof:|findall\(|aggregate_all\(|rdf_transaction\(|
|
|
214
|
+
return /(?:^|[(:,\s])(?:kb_|checks:|status:|discovery:|requirement_proof:|findall\(|aggregate_all\(|rdf_transaction\(|use_module\(|atom_json_dict\(|member\(|once\(|true\b|fail\b)/.test(goal.trim());
|
|
60
215
|
}
|
|
61
216
|
function frame(value) {
|
|
62
217
|
const payload = Buffer.from(JSON.stringify(value), "utf8");
|
|
@@ -91,7 +246,7 @@ function parseFrames(buffer, onFrame) {
|
|
|
91
246
|
}
|
|
92
247
|
return buffer.subarray(cursor);
|
|
93
248
|
}
|
|
94
|
-
function runtimeDirectory() {
|
|
249
|
+
export function runtimeDirectory() {
|
|
95
250
|
const configured = process.env.KIBI_RUNTIME_DIR ??
|
|
96
251
|
process.env.XDG_RUNTIME_DIR ??
|
|
97
252
|
path.join(os.tmpdir(), "kibi-runtime");
|
|
@@ -199,6 +354,127 @@ export function engineStartLockPath(workspaceRoot, branch) {
|
|
|
199
354
|
}
|
|
200
355
|
return `${engineSocketPath(workspaceRoot, branch)}.start.lock`;
|
|
201
356
|
}
|
|
357
|
+
/**
|
|
358
|
+
* A generation publisher holds this lease from the existing daemon shutdown
|
|
359
|
+
* through the atomic branch-store cutover. Engine clients honor the lease so
|
|
360
|
+
* another process cannot auto-start a writer in the stop-to-publish gap.
|
|
361
|
+
*/
|
|
362
|
+
export function enginePublicationLockPath(workspaceRoot, branch) {
|
|
363
|
+
return `${engineSocketPath(workspaceRoot, branch)}.publish.lock`;
|
|
364
|
+
}
|
|
365
|
+
function publicationLockOwner(lockPath) {
|
|
366
|
+
try {
|
|
367
|
+
const [pidText, createdText] = readFileSync(lockPath, "utf8")
|
|
368
|
+
.trim()
|
|
369
|
+
.split(":");
|
|
370
|
+
const pid = Number.parseInt(pidText ?? "", 10);
|
|
371
|
+
const createdAt = Number.parseInt(createdText ?? "", 10);
|
|
372
|
+
if (!Number.isInteger(pid) || pid <= 1 || !Number.isFinite(createdAt)) {
|
|
373
|
+
return null;
|
|
374
|
+
}
|
|
375
|
+
return { pid, createdAt };
|
|
376
|
+
}
|
|
377
|
+
catch {
|
|
378
|
+
return null;
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
function processIsAlive(pid) {
|
|
382
|
+
try {
|
|
383
|
+
process.kill(pid, 0);
|
|
384
|
+
return true;
|
|
385
|
+
}
|
|
386
|
+
catch {
|
|
387
|
+
return false;
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
function clearStalePublicationLock(lockPath) {
|
|
391
|
+
if (!existsSync(lockPath))
|
|
392
|
+
return true;
|
|
393
|
+
const owner = publicationLockOwner(lockPath);
|
|
394
|
+
let age = 0;
|
|
395
|
+
try {
|
|
396
|
+
age = Date.now() - statSync(lockPath).mtimeMs;
|
|
397
|
+
}
|
|
398
|
+
catch {
|
|
399
|
+
return false;
|
|
400
|
+
}
|
|
401
|
+
if ((owner === null || !processIsAlive(owner.pid)) &&
|
|
402
|
+
age > ENGINE_PUBLICATION_LOCK_STALE_MS) {
|
|
403
|
+
try {
|
|
404
|
+
unlinkSync(lockPath);
|
|
405
|
+
return true;
|
|
406
|
+
}
|
|
407
|
+
catch {
|
|
408
|
+
return false;
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
return false;
|
|
412
|
+
}
|
|
413
|
+
function publicationLockIsActive(lockPath) {
|
|
414
|
+
if (!existsSync(lockPath))
|
|
415
|
+
return false;
|
|
416
|
+
if (clearStalePublicationLock(lockPath))
|
|
417
|
+
return false;
|
|
418
|
+
return existsSync(lockPath);
|
|
419
|
+
}
|
|
420
|
+
export function acquireEnginePublicationLease(workspaceRoot, branch) {
|
|
421
|
+
const lockPath = enginePublicationLockPath(workspaceRoot, branch);
|
|
422
|
+
mkdirSync(path.dirname(lockPath), { recursive: true, mode: 0o700 });
|
|
423
|
+
let descriptor = null;
|
|
424
|
+
try {
|
|
425
|
+
descriptor = openSync(lockPath, "wx", 0o600);
|
|
426
|
+
}
|
|
427
|
+
catch {
|
|
428
|
+
if (clearStalePublicationLock(lockPath)) {
|
|
429
|
+
try {
|
|
430
|
+
descriptor = openSync(lockPath, "wx", 0o600);
|
|
431
|
+
}
|
|
432
|
+
catch {
|
|
433
|
+
// Fall through to the stable fail-closed error below.
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
if (descriptor === null) {
|
|
438
|
+
throw new Error(`Kibi engine publication is already in progress: ${lockPath}`);
|
|
439
|
+
}
|
|
440
|
+
try {
|
|
441
|
+
writeFileSync(lockPath, `${process.pid}:${Date.now()}\n`, { flag: "w" });
|
|
442
|
+
}
|
|
443
|
+
catch (error) {
|
|
444
|
+
closeSync(descriptor);
|
|
445
|
+
unlinkSync(lockPath);
|
|
446
|
+
throw error;
|
|
447
|
+
}
|
|
448
|
+
const startLockPath = engineStartLockPath(workspaceRoot, branch);
|
|
449
|
+
const startDescriptor = tryAcquireStartLock(startLockPath);
|
|
450
|
+
if (startDescriptor === null) {
|
|
451
|
+
closeSync(descriptor);
|
|
452
|
+
unlinkSync(lockPath);
|
|
453
|
+
throw new Error(`Kibi engine publication cannot acquire the engine start lease: ${startLockPath}`);
|
|
454
|
+
}
|
|
455
|
+
let released = false;
|
|
456
|
+
return {
|
|
457
|
+
path: lockPath,
|
|
458
|
+
release: () => {
|
|
459
|
+
if (released)
|
|
460
|
+
return;
|
|
461
|
+
released = true;
|
|
462
|
+
try {
|
|
463
|
+
closeSync(descriptor);
|
|
464
|
+
}
|
|
465
|
+
catch {
|
|
466
|
+
// The descriptor may already have been closed during process cleanup.
|
|
467
|
+
}
|
|
468
|
+
releaseStartLock(startLockPath, startDescriptor);
|
|
469
|
+
try {
|
|
470
|
+
unlinkSync(lockPath);
|
|
471
|
+
}
|
|
472
|
+
catch {
|
|
473
|
+
// A subsequent publisher may have replaced a stale lock after a crash.
|
|
474
|
+
}
|
|
475
|
+
},
|
|
476
|
+
};
|
|
477
|
+
}
|
|
202
478
|
function tryAcquireStartLock(lockPath) {
|
|
203
479
|
try {
|
|
204
480
|
const descriptor = openSync(lockPath, "wx", 0o600);
|
|
@@ -377,6 +653,7 @@ export class EngineClient {
|
|
|
377
653
|
workspaceRoot;
|
|
378
654
|
branch;
|
|
379
655
|
timeout;
|
|
656
|
+
allowPublicationLock;
|
|
380
657
|
socket = null;
|
|
381
658
|
daemon = null;
|
|
382
659
|
inputBuffer = Buffer.alloc(0);
|
|
@@ -384,6 +661,7 @@ export class EngineClient {
|
|
|
384
661
|
pending = new Map();
|
|
385
662
|
requestTail = Promise.resolve();
|
|
386
663
|
lastResult = null;
|
|
664
|
+
replacingStaleDaemon = false;
|
|
387
665
|
constructor(options) {
|
|
388
666
|
if (!isValidBranchName(options.branch)) {
|
|
389
667
|
throw new Error(`Invalid Kibi engine branch name: ${options.branch}`);
|
|
@@ -397,11 +675,24 @@ export class EngineClient {
|
|
|
397
675
|
}
|
|
398
676
|
this.branch = options.branch;
|
|
399
677
|
this.timeout = options.timeout ?? 120_000;
|
|
678
|
+
this.allowPublicationLock = options.allowPublicationLock ?? false;
|
|
400
679
|
}
|
|
401
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) {
|
|
402
688
|
if (this.socket !== null && !this.socket.destroyed)
|
|
403
689
|
return;
|
|
404
690
|
const socketPath = engineSocketPath(this.workspaceRoot, this.branch);
|
|
691
|
+
const publicationLockPath = enginePublicationLockPath(this.workspaceRoot, this.branch);
|
|
692
|
+
if (!this.allowPublicationLock &&
|
|
693
|
+
publicationLockIsActive(publicationLockPath)) {
|
|
694
|
+
throw new Error(`Kibi engine publication is in progress: ${publicationLockPath}`);
|
|
695
|
+
}
|
|
405
696
|
try {
|
|
406
697
|
if (existsSync(socketPath)) {
|
|
407
698
|
this.socket = await connectWithRetry(socketPath, 150);
|
|
@@ -576,22 +867,28 @@ export class EngineClient {
|
|
|
576
867
|
release();
|
|
577
868
|
}
|
|
578
869
|
}
|
|
870
|
+
/** Execute a versioned, goal-free engine command. Raw query remains private
|
|
871
|
+
* compatibility traffic for the in-process Prolog adapter only. */
|
|
872
|
+
async command(command, signal) {
|
|
873
|
+
return this.request({ method: "command", command }, signal);
|
|
874
|
+
}
|
|
579
875
|
async queryBatch(goals) {
|
|
580
876
|
const normalized = goals.map((goal) => goal.trim().replace(/\.+\s*$/, ""));
|
|
581
877
|
return this.query(`rdf_transaction((${normalized.join(", ")}))`);
|
|
582
878
|
}
|
|
583
|
-
async queryEntities(input) {
|
|
584
|
-
const result = await this.
|
|
585
|
-
|
|
879
|
+
async queryEntities(input, signal) {
|
|
880
|
+
const result = await this.command({
|
|
881
|
+
version: 1,
|
|
882
|
+
kind: "entities",
|
|
586
883
|
...(input.type !== undefined ? { type: input.type } : {}),
|
|
587
|
-
...(input.id !== undefined ? {
|
|
884
|
+
...(input.id !== undefined ? { id: input.id } : {}),
|
|
588
885
|
...(input.tags !== undefined ? { tags: input.tags } : {}),
|
|
589
886
|
...(input.sourceFile !== undefined
|
|
590
887
|
? { sourceFile: input.sourceFile }
|
|
591
888
|
: {}),
|
|
592
889
|
limit: input.limit,
|
|
593
890
|
offset: input.offset,
|
|
594
|
-
});
|
|
891
|
+
}, signal);
|
|
595
892
|
if (!result.success) {
|
|
596
893
|
throw new Error(result.error ?? "Indexed entity query failed");
|
|
597
894
|
}
|
|
@@ -604,14 +901,15 @@ export class EngineClient {
|
|
|
604
901
|
count: Number.isFinite(count) ? count : rows.length,
|
|
605
902
|
};
|
|
606
903
|
}
|
|
607
|
-
async searchEntities(input) {
|
|
608
|
-
const result = await this.
|
|
609
|
-
|
|
610
|
-
|
|
904
|
+
async searchEntities(input, signal) {
|
|
905
|
+
const result = await this.command({
|
|
906
|
+
version: 1,
|
|
907
|
+
kind: "search",
|
|
908
|
+
query: input.query,
|
|
611
909
|
...(input.type !== undefined ? { type: input.type } : {}),
|
|
612
910
|
limit: input.limit,
|
|
613
911
|
offset: input.offset,
|
|
614
|
-
});
|
|
912
|
+
}, signal);
|
|
615
913
|
if (!result.success) {
|
|
616
914
|
throw new Error(result.error ?? "Indexed search candidate query failed");
|
|
617
915
|
}
|
|
@@ -645,20 +943,20 @@ export class EngineClient {
|
|
|
645
943
|
this.lastResult = null;
|
|
646
944
|
return result;
|
|
647
945
|
}
|
|
648
|
-
async save() {
|
|
649
|
-
return this.query("kb_save");
|
|
946
|
+
async save(signal) {
|
|
947
|
+
return this.query("kb_save", signal);
|
|
650
948
|
}
|
|
651
949
|
async storageStatus() {
|
|
652
950
|
return this.request({ method: "status" });
|
|
653
951
|
}
|
|
654
952
|
async checkpoint() {
|
|
655
|
-
return this.
|
|
953
|
+
return this.command({ version: 1, kind: "checkpoint" });
|
|
656
954
|
}
|
|
657
955
|
async queryStatusJson() {
|
|
658
|
-
return this.
|
|
956
|
+
return this.command({ version: 1, kind: "status" });
|
|
659
957
|
}
|
|
660
958
|
async compact() {
|
|
661
|
-
return this.
|
|
959
|
+
return this.command({ version: 1, kind: "compact" });
|
|
662
960
|
}
|
|
663
961
|
async exportStorage(targetDirectory) {
|
|
664
962
|
return this.request({
|
|
@@ -672,6 +970,60 @@ export class EngineClient {
|
|
|
672
970
|
isRunning() {
|
|
673
971
|
return this.socket !== null && !this.socket.destroyed;
|
|
674
972
|
}
|
|
973
|
+
async readAttachedIdentity() {
|
|
974
|
+
const status = await this.queryStatusJson();
|
|
975
|
+
if (!status.success)
|
|
976
|
+
return null;
|
|
977
|
+
return parseEngineAttachmentIdentity(status.bindings.JsonString);
|
|
978
|
+
}
|
|
979
|
+
async reconcileAttachment() {
|
|
980
|
+
if (this.replacingStaleDaemon || this.socket === null)
|
|
981
|
+
return;
|
|
982
|
+
const livePath = branchStorePath(this.workspaceRoot, this.branch);
|
|
983
|
+
const expected = readEngineAttachmentIdentity(livePath);
|
|
984
|
+
const attached = await this.readAttachedIdentity();
|
|
985
|
+
if (engineAttachmentsMatch(expected, attached))
|
|
986
|
+
return;
|
|
987
|
+
this.replacingStaleDaemon = true;
|
|
988
|
+
try {
|
|
989
|
+
await this.shutdownConnectedDaemon();
|
|
990
|
+
await this.connect(true);
|
|
991
|
+
const live = readEngineAttachmentIdentity(livePath);
|
|
992
|
+
const retried = await this.readAttachedIdentity();
|
|
993
|
+
if (!engineAttachmentsMatch(live, retried)) {
|
|
994
|
+
throw new Error(`Kibi engine is attached to a stale branch generation: ${formatEngineAttachmentMismatch("attachment-handshake", live, retried)}`);
|
|
995
|
+
}
|
|
996
|
+
}
|
|
997
|
+
finally {
|
|
998
|
+
this.replacingStaleDaemon = false;
|
|
999
|
+
}
|
|
1000
|
+
}
|
|
1001
|
+
async shutdownConnectedDaemon() {
|
|
1002
|
+
const socketPath = engineSocketPath(this.workspaceRoot, this.branch);
|
|
1003
|
+
if (!this.isRunning()) {
|
|
1004
|
+
if (existsSync(socketPath)) {
|
|
1005
|
+
throw new Error(`Kibi engine socket remains present but is not reachable: ${socketPath}`);
|
|
1006
|
+
}
|
|
1007
|
+
return;
|
|
1008
|
+
}
|
|
1009
|
+
let requestError;
|
|
1010
|
+
try {
|
|
1011
|
+
await this.request({ method: "stop" });
|
|
1012
|
+
}
|
|
1013
|
+
catch (error) {
|
|
1014
|
+
requestError = error;
|
|
1015
|
+
}
|
|
1016
|
+
this.socket?.destroy();
|
|
1017
|
+
this.socket = null;
|
|
1018
|
+
const deadline = Date.now() + 5_000;
|
|
1019
|
+
while (existsSync(socketPath) && Date.now() < deadline) {
|
|
1020
|
+
await new Promise((resolve) => setTimeout(resolve, 25));
|
|
1021
|
+
}
|
|
1022
|
+
if (existsSync(socketPath)) {
|
|
1023
|
+
const detail = requestError instanceof Error ? `: ${requestError.message}` : "";
|
|
1024
|
+
throw new Error(`Kibi engine did not stop within 5 seconds${detail}`);
|
|
1025
|
+
}
|
|
1026
|
+
}
|
|
675
1027
|
getPid() {
|
|
676
1028
|
const pidPath = enginePidPath(this.workspaceRoot, this.branch);
|
|
677
1029
|
try {
|
|
@@ -685,7 +1037,7 @@ export class EngineClient {
|
|
|
685
1037
|
const socketPath = engineSocketPath(this.workspaceRoot, this.branch);
|
|
686
1038
|
if (!this.isRunning()) {
|
|
687
1039
|
try {
|
|
688
|
-
await this.
|
|
1040
|
+
await this.connect(startIfMissing);
|
|
689
1041
|
}
|
|
690
1042
|
catch {
|
|
691
1043
|
if (!startIfMissing)
|
|
@@ -693,18 +1045,13 @@ export class EngineClient {
|
|
|
693
1045
|
throw new Error("Unable to start Kibi engine for stop request");
|
|
694
1046
|
}
|
|
695
1047
|
}
|
|
696
|
-
if (!this.isRunning())
|
|
1048
|
+
if (!this.isRunning()) {
|
|
1049
|
+
if (existsSync(socketPath)) {
|
|
1050
|
+
throw new Error(`Kibi engine socket remains present but is not reachable: ${socketPath}`);
|
|
1051
|
+
}
|
|
697
1052
|
return;
|
|
698
|
-
await this.request({ method: "stop" }).catch(() => undefined);
|
|
699
|
-
this.socket?.destroy();
|
|
700
|
-
this.socket = null;
|
|
701
|
-
// The daemon acknowledges stop before its SWI child has flushed and the
|
|
702
|
-
// listening socket has closed. Do not let a following auto-start attach to
|
|
703
|
-
// that half-shutdown process.
|
|
704
|
-
const deadline = Date.now() + 5_000;
|
|
705
|
-
while (existsSync(socketPath) && Date.now() < deadline) {
|
|
706
|
-
await new Promise((resolve) => setTimeout(resolve, 25));
|
|
707
1053
|
}
|
|
1054
|
+
await this.shutdownConnectedDaemon();
|
|
708
1055
|
}
|
|
709
1056
|
async terminate() {
|
|
710
1057
|
// Closing a client connection releases the engine; the daemon remains
|
|
@@ -924,17 +1271,31 @@ export async function runEngineDaemon(options) {
|
|
|
924
1271
|
if (!isValidBranchName(options.branch)) {
|
|
925
1272
|
throw new Error(`Invalid Kibi engine branch name: ${options.branch}`);
|
|
926
1273
|
}
|
|
927
|
-
|
|
1274
|
+
const branchPath = ensureBranchStoreManifest(options.workspaceRoot, options.branch);
|
|
1275
|
+
await ensureJournaledBranchStoreAsync(branchPath);
|
|
928
1276
|
const prolog = new PrologProcess({ timeout: 120_000, oneShot: false });
|
|
929
1277
|
await prolog.start();
|
|
930
|
-
const branchPath = path.join(options.workspaceRoot, ".kb", "branches", options.branch);
|
|
931
1278
|
const attached = await prolog.query(`kb_attach('${quoteProlog(branchPath)}')`);
|
|
932
|
-
if (!attached.success)
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
1279
|
+
if (!attached.success) {
|
|
1280
|
+
// The daemon hosts the branch store for every later request, so a
|
|
1281
|
+
// store-locked startup with a provably dead holder is auto-healed here
|
|
1282
|
+
// exactly like the CLI runtime path; live holders abort the startup
|
|
1283
|
+
// with the holder identity surfaced.
|
|
1284
|
+
const recovered = await retryAttachAfterBreakingStaleLock(prolog, branchPath, attached);
|
|
1285
|
+
if (!recovered.success)
|
|
1286
|
+
throw new Error(recovered.error ?? "Failed to attach branch KB");
|
|
1287
|
+
}
|
|
1288
|
+
const attachedIdentity = readEngineAttachmentIdentity(branchPath);
|
|
1289
|
+
const coreModuleDir = path.dirname(resolveKbPlPath());
|
|
1290
|
+
for (const [fileName, label] of [
|
|
1291
|
+
["status.pl", "status"],
|
|
1292
|
+
["discovery.pl", "discovery"],
|
|
1293
|
+
]) {
|
|
1294
|
+
const modulePath = path.join(coreModuleDir, fileName);
|
|
1295
|
+
const loaded = await prolog.query(`use_module('${quoteProlog(modulePath.replaceAll("\\", "/"))}')`);
|
|
1296
|
+
if (!loaded.success) {
|
|
1297
|
+
throw new Error(loaded.error ?? `Failed to load Kibi ${label} module`);
|
|
1298
|
+
}
|
|
938
1299
|
}
|
|
939
1300
|
mkdirSync(path.dirname(options.socketPath), { recursive: true, mode: 0o700 });
|
|
940
1301
|
if (existsSync(options.socketPath)) {
|
|
@@ -968,6 +1329,52 @@ export async function runEngineDaemon(options) {
|
|
|
968
1329
|
const cancelledRequests = new Set();
|
|
969
1330
|
const clients = new Set();
|
|
970
1331
|
let shuttingDown = false;
|
|
1332
|
+
const exactBranchStatus = (result) => {
|
|
1333
|
+
if (!result.success || typeof result.bindings.JsonString !== "string") {
|
|
1334
|
+
return result;
|
|
1335
|
+
}
|
|
1336
|
+
try {
|
|
1337
|
+
const decoded = JSON.parse(JSON.parse(result.bindings.JsonString));
|
|
1338
|
+
decoded.branch = options.branch;
|
|
1339
|
+
if (attachedIdentity !== null) {
|
|
1340
|
+
decoded.attachedPath = attachedIdentity.path;
|
|
1341
|
+
decoded.attachedGeneration = attachedIdentity.generation;
|
|
1342
|
+
decoded.attachedDev = attachedIdentity.dev;
|
|
1343
|
+
decoded.attachedIno = attachedIdentity.ino;
|
|
1344
|
+
}
|
|
1345
|
+
return {
|
|
1346
|
+
...result,
|
|
1347
|
+
bindings: {
|
|
1348
|
+
...result.bindings,
|
|
1349
|
+
JsonString: JSON.stringify(JSON.stringify(decoded)),
|
|
1350
|
+
},
|
|
1351
|
+
};
|
|
1352
|
+
}
|
|
1353
|
+
catch {
|
|
1354
|
+
return result;
|
|
1355
|
+
}
|
|
1356
|
+
};
|
|
1357
|
+
// A daemon whose workspace vanished (git worktree remove --force, deleted
|
|
1358
|
+
// checkout) can never serve a request again, but it would keep holding the
|
|
1359
|
+
// branch-store lock and wedge every later operation behind an opaque
|
|
1360
|
+
// "KB locked". Detect the loss and shut down cleanly instead.
|
|
1361
|
+
let workspaceMissingStreak = 0;
|
|
1362
|
+
const workspaceWatchdog = setInterval(() => {
|
|
1363
|
+
if (shuttingDown)
|
|
1364
|
+
return;
|
|
1365
|
+
// Two consecutive misses before giving up: a transient blip (slow
|
|
1366
|
+
// rename, network mount hiccup) must not stop a healthy daemon.
|
|
1367
|
+
if (!existsSync(options.workspaceRoot)) {
|
|
1368
|
+
workspaceMissingStreak += 1;
|
|
1369
|
+
if (workspaceMissingStreak < 2)
|
|
1370
|
+
return;
|
|
1371
|
+
console.error(`[KIBI] workspace ${options.workspaceRoot} no longer exists; stopping engine`);
|
|
1372
|
+
void shutdown();
|
|
1373
|
+
return;
|
|
1374
|
+
}
|
|
1375
|
+
workspaceMissingStreak = 0;
|
|
1376
|
+
}, engineWorkspaceWatchdogMs());
|
|
1377
|
+
workspaceWatchdog.unref();
|
|
971
1378
|
const scheduleIdleExit = () => {
|
|
972
1379
|
if (activeClients > 0)
|
|
973
1380
|
return;
|
|
@@ -1057,12 +1464,142 @@ export async function runEngineDaemon(options) {
|
|
|
1057
1464
|
}
|
|
1058
1465
|
return result;
|
|
1059
1466
|
}
|
|
1467
|
+
case "command": {
|
|
1468
|
+
const command = request.command;
|
|
1469
|
+
if (command === undefined || command.version !== 1) {
|
|
1470
|
+
throw new Error("engine.command must use version 1");
|
|
1471
|
+
}
|
|
1472
|
+
switch (command.kind) {
|
|
1473
|
+
case "status":
|
|
1474
|
+
return exactBranchStatus(await prolog.query("status:kb_status_json(JsonString)"));
|
|
1475
|
+
case "checkpoint": {
|
|
1476
|
+
queryCache.clear();
|
|
1477
|
+
freshnessCache = null;
|
|
1478
|
+
const result = await prolog.query("kb_sync_checkpoint");
|
|
1479
|
+
if (result.success)
|
|
1480
|
+
fsyncJournaledBranchStore(branchPath);
|
|
1481
|
+
return result;
|
|
1482
|
+
}
|
|
1483
|
+
case "compact": {
|
|
1484
|
+
const result = await prolog.query("kb_storage_compact");
|
|
1485
|
+
if (result.success)
|
|
1486
|
+
fsyncJournaledBranchStore(branchPath);
|
|
1487
|
+
return result;
|
|
1488
|
+
}
|
|
1489
|
+
case "save": {
|
|
1490
|
+
const result = await prolog.query("kb_save");
|
|
1491
|
+
if (result.success)
|
|
1492
|
+
fsyncJournaledBranchStore(branchPath);
|
|
1493
|
+
return result;
|
|
1494
|
+
}
|
|
1495
|
+
case "check": {
|
|
1496
|
+
if (command.rule !== undefined &&
|
|
1497
|
+
!/^[a-z][a-z0-9_]*$/.test(command.rule)) {
|
|
1498
|
+
throw new Error("engine.check.rule must be a lowercase rule name");
|
|
1499
|
+
}
|
|
1500
|
+
// Rule selection is intentionally resolved inside the engine. A
|
|
1501
|
+
// caller never supplies a Prolog goal over the command boundary.
|
|
1502
|
+
return prolog.query("checks:check_all_json(JsonString)");
|
|
1503
|
+
}
|
|
1504
|
+
case "relationship": {
|
|
1505
|
+
if (!command.type || !command.from || !command.to) {
|
|
1506
|
+
throw new Error("engine.relationship requires type, from, and to");
|
|
1507
|
+
}
|
|
1508
|
+
const type = quoteProlog(command.type);
|
|
1509
|
+
const from = quoteProlog(command.from);
|
|
1510
|
+
const to = quoteProlog(command.to);
|
|
1511
|
+
const goal = command.action === "assert"
|
|
1512
|
+
? `kb_assert_relationship('${type}', '${from}', '${to}', [])`
|
|
1513
|
+
: `kb_retract_relationship('${type}', '${from}', '${to}')`;
|
|
1514
|
+
const result = await prolog.query(goal);
|
|
1515
|
+
if (result.success) {
|
|
1516
|
+
queryCache.clear();
|
|
1517
|
+
freshnessCache = null;
|
|
1518
|
+
fsyncJournaledBranchStore(branchPath);
|
|
1519
|
+
}
|
|
1520
|
+
return result;
|
|
1521
|
+
}
|
|
1522
|
+
case "persistence": {
|
|
1523
|
+
const goal = command.action === "checkpoint"
|
|
1524
|
+
? "kb_sync_checkpoint"
|
|
1525
|
+
: command.action === "compact"
|
|
1526
|
+
? "kb_storage_compact"
|
|
1527
|
+
: command.action === "save"
|
|
1528
|
+
? "kb_save"
|
|
1529
|
+
: command.targetDirectory
|
|
1530
|
+
? `kb_storage_export('${quoteProlog(command.targetDirectory)}')`
|
|
1531
|
+
: null;
|
|
1532
|
+
if (goal === null) {
|
|
1533
|
+
throw new Error("engine.persistence.export requires targetDirectory");
|
|
1534
|
+
}
|
|
1535
|
+
const result = await prolog.query(goal);
|
|
1536
|
+
if (result.success)
|
|
1537
|
+
fsyncJournaledBranchStore(branchPath);
|
|
1538
|
+
return result;
|
|
1539
|
+
}
|
|
1540
|
+
case "lifecycle": {
|
|
1541
|
+
if (command.action === "stop") {
|
|
1542
|
+
setImmediate(() => void shutdown());
|
|
1543
|
+
return { stopped: true };
|
|
1544
|
+
}
|
|
1545
|
+
if (!Number.isInteger(command.requestId)) {
|
|
1546
|
+
throw new Error("engine.lifecycle.cancel requires requestId");
|
|
1547
|
+
}
|
|
1548
|
+
const requestId = command.requestId;
|
|
1549
|
+
cancelledRequests.add(requestId);
|
|
1550
|
+
return { cancelled: requestId };
|
|
1551
|
+
}
|
|
1552
|
+
case "stop":
|
|
1553
|
+
setImmediate(() => void shutdown());
|
|
1554
|
+
return { stopped: true };
|
|
1555
|
+
case "cancel":
|
|
1556
|
+
cancelledRequests.add(command.requestId);
|
|
1557
|
+
return { cancelled: command.requestId };
|
|
1558
|
+
case "entities": {
|
|
1559
|
+
if (!Number.isInteger(command.limit) ||
|
|
1560
|
+
!Number.isInteger(command.offset) ||
|
|
1561
|
+
command.limit < 0 ||
|
|
1562
|
+
command.offset < 0 ||
|
|
1563
|
+
command.limit > 100_000) {
|
|
1564
|
+
throw new Error("engine.entities.limit/offset must be bounded integers");
|
|
1565
|
+
}
|
|
1566
|
+
const type = command.type === undefined
|
|
1567
|
+
? "none"
|
|
1568
|
+
: `'${quoteProlog(command.type)}'`;
|
|
1569
|
+
const id = command.id === undefined
|
|
1570
|
+
? "none"
|
|
1571
|
+
: `'${quoteProlog(command.id)}'`;
|
|
1572
|
+
const tags = `[${(command.tags ?? []).map((tag) => `'${quoteProlog(tag)}'`).join(",")}]`;
|
|
1573
|
+
const source = command.sourceFile === undefined
|
|
1574
|
+
? "none"
|
|
1575
|
+
: `'${quoteProlog(command.sourceFile)}'`;
|
|
1576
|
+
return prolog.query(`kb_query_entities(${type}, ${id}, ${tags}, ${source}, ${command.limit}, ${command.offset}, Rows, Count)`);
|
|
1577
|
+
}
|
|
1578
|
+
case "search": {
|
|
1579
|
+
if (!command.query.trim())
|
|
1580
|
+
throw new Error("engine.search.query must be non-empty");
|
|
1581
|
+
if (!Number.isInteger(command.limit) ||
|
|
1582
|
+
!Number.isInteger(command.offset) ||
|
|
1583
|
+
command.limit < 0 ||
|
|
1584
|
+
command.offset < 0 ||
|
|
1585
|
+
command.limit > 100_000) {
|
|
1586
|
+
throw new Error("engine.search.limit/offset must be bounded integers");
|
|
1587
|
+
}
|
|
1588
|
+
const type = command.type === undefined
|
|
1589
|
+
? "none"
|
|
1590
|
+
: `'${quoteProlog(command.type)}'`;
|
|
1591
|
+
return prolog.query(`kb_search_entities(${type}, '${quoteProlog(command.query)}', ${command.limit}, ${command.offset}, Rows, Count)`);
|
|
1592
|
+
}
|
|
1593
|
+
default:
|
|
1594
|
+
throw new Error("engine.command kind is unsupported");
|
|
1595
|
+
}
|
|
1596
|
+
}
|
|
1060
1597
|
case "kbStatus": {
|
|
1061
1598
|
if (freshnessCache !== null &&
|
|
1062
1599
|
Date.now() - freshnessCache.capturedAt <= ENGINE_FRESHNESS_CACHE_MS) {
|
|
1063
1600
|
return freshnessCache.result;
|
|
1064
1601
|
}
|
|
1065
|
-
const result = await prolog.query("status:kb_status_json(JsonString)");
|
|
1602
|
+
const result = exactBranchStatus(await prolog.query("status:kb_status_json(JsonString)"));
|
|
1066
1603
|
if (result.success) {
|
|
1067
1604
|
freshnessCache = { capturedAt: Date.now(), result };
|
|
1068
1605
|
}
|
|
@@ -1138,6 +1675,7 @@ export async function runEngineDaemon(options) {
|
|
|
1138
1675
|
process.off("SIGINT", requestSignalShutdown);
|
|
1139
1676
|
if (idleTimer)
|
|
1140
1677
|
clearTimeout(idleTimer);
|
|
1678
|
+
clearInterval(workspaceWatchdog);
|
|
1141
1679
|
const saved = await prolog.query("kb_save").catch(() => null);
|
|
1142
1680
|
if (saved?.success) {
|
|
1143
1681
|
try {
|
|
@@ -1176,9 +1714,7 @@ export async function runEngineDaemon(options) {
|
|
|
1176
1714
|
// Detached engines must cross the same durability boundary when a service
|
|
1177
1715
|
// manager or a test harness terminates them as they do for an RPC stop.
|
|
1178
1716
|
// implements REQ-test-journaled-engine-harness
|
|
1179
|
-
const requestSignalShutdown = ()
|
|
1180
|
-
void shutdown();
|
|
1181
|
-
};
|
|
1717
|
+
const requestSignalShutdown = requestEngineSignalShutdown(shutdown);
|
|
1182
1718
|
process.once("SIGTERM", requestSignalShutdown);
|
|
1183
1719
|
process.once("SIGINT", requestSignalShutdown);
|
|
1184
1720
|
server.on("connection", (socket) => {
|