kibi-cli 2.0.0 → 2.2.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-protocol.d.ts.map +1 -1
- package/dist/cli-protocol.js +3 -2
- package/dist/cli-register-proof.d.ts.map +1 -1
- package/dist/cli-register-proof.js +25 -1
- package/dist/cli-register-reporting.d.ts.map +1 -1
- package/dist/cli-register-reporting.js +6 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +2 -0
- package/dist/commands/aggregated-checks.d.ts +7 -0
- package/dist/commands/aggregated-checks.d.ts.map +1 -1
- package/dist/commands/aggregated-checks.js +25 -1
- 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.map +1 -1
- package/dist/commands/check.js +24 -15
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +227 -25
- package/dist/commands/engine.d.ts.map +1 -1
- package/dist/commands/engine.js +3 -1
- package/dist/commands/github-init.d.ts +1 -1
- package/dist/commands/github-init.d.ts.map +1 -1
- package/dist/commands/github-init.js +1 -1
- package/dist/commands/init-helpers.d.ts +17 -2
- package/dist/commands/init-helpers.d.ts.map +1 -1
- package/dist/commands/init-helpers.js +136 -30
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +110 -15
- 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.js +1 -1
- package/dist/commands/proof-prune.js +1 -1
- package/dist/commands/prove.d.ts.map +1 -1
- package/dist/commands/prove.js +14 -22
- package/dist/commands/report.d.ts.map +1 -1
- package/dist/commands/report.js +17 -2
- package/dist/commands/sync/cache.d.ts +20 -1
- package/dist/commands/sync/cache.d.ts.map +1 -1
- package/dist/commands/sync/cache.js +51 -2
- package/dist/commands/sync/discovery.d.ts.map +1 -1
- package/dist/commands/sync/discovery.js +1 -1
- package/dist/commands/sync/manifest.d.ts +1 -0
- package/dist/commands/sync/manifest.d.ts.map +1 -1
- package/dist/commands/sync/manifest.js +18 -16
- package/dist/commands/sync/persistence.d.ts.map +1 -1
- package/dist/commands/sync/persistence.js +14 -0
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +11 -3
- package/dist/engine.d.ts +29 -1
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +259 -89
- 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.map +1 -1
- package/dist/extractors/manifest.js +67 -29
- package/dist/extractors/markdown.d.ts +4 -0
- package/dist/extractors/markdown.d.ts.map +1 -1
- package/dist/extractors/markdown.js +33 -3
- package/dist/extractors/relationships.d.ts.map +1 -1
- package/dist/extractors/relationships.js +1 -0
- 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 +8 -19
- package/dist/extractors/symbols-ts.d.ts.map +1 -1
- package/dist/extractors/symbols-ts.js +33 -503
- package/dist/intent-search.d.ts.map +1 -1
- package/dist/intent-search.js +68 -30
- package/dist/operations/bootstrap/generate.d.ts.map +1 -1
- package/dist/operations/bootstrap/generate.js +4 -3
- package/dist/operations/modeling/model-requirement.d.ts +1 -1
- package/dist/operations/modeling/model-requirement.d.ts.map +1 -1
- package/dist/operations/modeling/model-requirement.js +179 -9
- package/dist/operations/modeling/predicate-applyplan.d.ts.map +1 -1
- package/dist/operations/modeling/predicate-applyplan.js +14 -2
- package/dist/operations/modeling/predicate-loader.d.ts.map +1 -1
- package/dist/operations/modeling/predicate-loader.js +24 -0
- package/dist/operations/modeling/predicate-types.d.ts +4 -0
- package/dist/operations/modeling/predicate-types.d.ts.map +1 -1
- package/dist/operations/modeling/predicate-vocabulary.d.ts +54 -0
- package/dist/operations/modeling/predicate-vocabulary.d.ts.map +1 -0
- package/dist/operations/modeling/predicate-vocabulary.js +169 -0
- package/dist/operations/modeling/requirement-types.d.ts +5 -0
- package/dist/operations/modeling/requirement-types.d.ts.map +1 -1
- package/dist/operations/modeling/suggest-predicates.d.ts +1 -1
- package/dist/operations/modeling/suggest-predicates.d.ts.map +1 -1
- package/dist/operations/modeling/suggest-predicates.js +30 -3
- package/dist/operations/modeling/vocabulary-alignment.d.ts +60 -0
- package/dist/operations/modeling/vocabulary-alignment.d.ts.map +1 -0
- package/dist/operations/modeling/vocabulary-alignment.js +178 -0
- package/dist/operations/mutation/contradictions.d.ts +3 -0
- package/dist/operations/mutation/contradictions.d.ts.map +1 -1
- package/dist/operations/mutation/contradictions.js +29 -0
- package/dist/operations/mutation/delete.d.ts.map +1 -1
- package/dist/operations/mutation/delete.js +33 -1
- package/dist/operations/mutation/predicate-vocabulary-guard.d.ts +8 -0
- package/dist/operations/mutation/predicate-vocabulary-guard.d.ts.map +1 -0
- package/dist/operations/mutation/predicate-vocabulary-guard.js +64 -0
- package/dist/operations/mutation/relationships.d.ts +1 -1
- package/dist/operations/mutation/relationships.d.ts.map +1 -1
- package/dist/operations/mutation/relationships.js +1 -0
- package/dist/operations/mutation/saga.d.ts +5 -0
- package/dist/operations/mutation/saga.d.ts.map +1 -1
- package/dist/operations/mutation/saga.js +10 -0
- package/dist/operations/mutation/serialization.d.ts.map +1 -1
- package/dist/operations/mutation/serialization.js +2 -0
- package/dist/operations/mutation/source-authoring.d.ts +6 -0
- package/dist/operations/mutation/source-authoring.d.ts.map +1 -1
- package/dist/operations/mutation/source-authoring.js +65 -26
- package/dist/operations/mutation/strict-fact.d.ts.map +1 -1
- package/dist/operations/mutation/strict-fact.js +5 -0
- package/dist/operations/mutation/symbol-granularity.d.ts.map +1 -1
- package/dist/operations/mutation/symbol-granularity.js +9 -87
- package/dist/operations/mutation/types.d.ts +17 -0
- package/dist/operations/mutation/types.d.ts.map +1 -1
- package/dist/operations/mutation/upsert.d.ts +6 -0
- package/dist/operations/mutation/upsert.d.ts.map +1 -1
- package/dist/operations/mutation/upsert.js +72 -4
- package/dist/operations/mutation/validate-upsert.d.ts.map +1 -1
- package/dist/operations/mutation/validate-upsert.js +24 -1
- package/dist/operations/mutation/validation.d.ts.map +1 -1
- package/dist/operations/mutation/validation.js +16 -3
- package/dist/operations/planning/apply-plan.d.ts.map +1 -1
- package/dist/operations/planning/apply-plan.js +61 -17
- package/dist/operations/planning/compile-intent.d.ts +49 -0
- package/dist/operations/planning/compile-intent.d.ts.map +1 -1
- package/dist/operations/planning/compile-intent.js +66 -4
- 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/code-scope.d.ts +17 -0
- package/dist/operations/proof/code-scope.d.ts.map +1 -0
- package/dist/operations/proof/code-scope.js +60 -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 +4 -2
- package/dist/operations/proof/ingest-proof.d.ts.map +1 -1
- package/dist/operations/proof/ingest-proof.js +251 -77
- package/dist/operations/proof/migrate-legacy-receipts.d.ts.map +1 -1
- package/dist/operations/proof/migrate-legacy-receipts.js +28 -22
- package/dist/operations/proof/prune-receipts.d.ts.map +1 -1
- package/dist/operations/proof/prune-receipts.js +8 -6
- package/dist/operations/proof/receipt-document.js +2 -2
- 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.map +1 -1
- package/dist/operations/semantic-advisor/analyze-prose.js +18 -67
- 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/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 +47 -0
- package/dist/plugins/compose-semantic-classifier.d.ts.map +1 -0
- package/dist/plugins/compose-semantic-classifier.js +216 -0
- package/dist/plugins/compose-vocabulary-alignment.d.ts +23 -0
- package/dist/plugins/compose-vocabulary-alignment.d.ts.map +1 -0
- package/dist/plugins/compose-vocabulary-alignment.js +141 -0
- package/dist/plugins/external-allowlist.d.ts +17 -0
- package/dist/plugins/external-allowlist.d.ts.map +1 -0
- package/dist/plugins/external-allowlist.js +29 -0
- package/dist/plugins/index.d.ts +11 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +37 -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 +94 -0
- package/dist/plugins/registry.d.ts.map +1 -0
- package/dist/plugins/registry.js +359 -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.map +1 -1
- package/dist/prolog/codec.js +2 -0
- package/dist/prolog/janitor.d.ts.map +1 -1
- package/dist/prolog/janitor.js +1 -1
- package/dist/prolog/store-lock.d.ts +1 -1
- package/dist/prolog/store-lock.d.ts.map +1 -1
- package/dist/prolog.d.ts +36 -0
- package/dist/prolog.d.ts.map +1 -1
- package/dist/prolog.js +78 -9
- package/dist/proof/inspect.js +1 -1
- package/dist/proof/producers/playwright-case-id.js +2 -2
- package/dist/proof/producers/playwright-reporter.js +4 -4
- package/dist/public/diagnostic-usage.d.ts.map +1 -1
- package/dist/public/diagnostic-usage.js +7 -25
- 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/full-kb-quality.d.ts.map +1 -1
- package/dist/public/impact/full-kb-quality.js +4 -12
- package/dist/public/operations/catalog.d.ts +39 -7
- package/dist/public/operations/catalog.d.ts.map +1 -1
- package/dist/public/operations/check-executor.d.ts.map +1 -1
- package/dist/public/operations/check-executor.js +11 -3
- package/dist/public/operations/check-helpers.d.ts +7 -1
- package/dist/public/operations/check-helpers.d.ts.map +1 -1
- package/dist/public/operations/check-helpers.js +22 -2
- package/dist/public/operations/contracts.d.ts.map +1 -1
- package/dist/public/operations/contracts.js +51 -12
- package/dist/public/operations/discovery-entities.d.ts +53 -1
- package/dist/public/operations/discovery-entities.d.ts.map +1 -1
- package/dist/public/operations/discovery-entities.js +219 -12
- package/dist/public/operations/discovery-executors.d.ts +1 -0
- package/dist/public/operations/discovery-executors.d.ts.map +1 -1
- package/dist/public/operations/discovery-executors.js +93 -59
- package/dist/public/operations/migration-plan.d.ts +2 -0
- package/dist/public/operations/migration-plan.d.ts.map +1 -1
- package/dist/public/operations/migration-plan.js +50 -0
- package/dist/public/operations/predicate-schema-conformance.d.ts +41 -0
- package/dist/public/operations/predicate-schema-conformance.d.ts.map +1 -0
- package/dist/public/operations/predicate-schema-conformance.js +242 -0
- 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 +16 -10
- package/dist/public/operations/result-envelope.d.ts +34 -1
- package/dist/public/operations/result-envelope.d.ts.map +1 -1
- package/dist/public/operations/result-envelope.js +78 -2
- package/dist/public/operations/runtime-types.d.ts +17 -2
- package/dist/public/operations/runtime-types.d.ts.map +1 -1
- package/dist/public/operations/specs/check-rules.generated.d.ts +1 -1
- package/dist/public/operations/specs/check-rules.generated.d.ts.map +1 -1
- package/dist/public/operations/specs/check-rules.generated.js +9 -1
- package/dist/public/operations/specs/check.d.ts +1 -1
- package/dist/public/operations/specs/discovery.d.ts +10 -1
- package/dist/public/operations/specs/discovery.d.ts.map +1 -1
- package/dist/public/operations/specs/discovery.js +10 -1
- package/dist/public/operations/specs/mutation-schemas.d.ts +27 -4
- package/dist/public/operations/specs/mutation-schemas.d.ts.map +1 -1
- package/dist/public/operations/specs/mutation-schemas.js +21 -3
- package/dist/public/operations/specs/proof.js +1 -1
- package/dist/public/operations/specs/reporting.d.ts +9 -0
- package/dist/public/operations/specs/reporting.d.ts.map +1 -1
- package/dist/public/operations/specs/reporting.js +48 -17
- 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 +28 -5
- package/dist/public/operations/specs/upsert.d.ts.map +1 -1
- package/dist/public/operations/specs/upsert.js +1 -1
- package/dist/public/operations/symbol-repair-plan.d.ts.map +1 -1
- package/dist/public/operations/symbol-repair-plan.js +11 -4
- package/dist/public/operations/types.d.ts +5 -0
- package/dist/public/operations/types.d.ts.map +1 -1
- package/dist/public/proof-protocol.js +4 -4
- package/dist/public/schemas/entity.d.ts.map +1 -1
- package/dist/public/schemas/entity.js +22 -0
- package/dist/public/schemas/relationship.d.ts.map +1 -1
- package/dist/public/schemas/relationship.js +1 -0
- package/dist/public/skills/kibi-usage/SKILL.md +10 -3
- package/dist/public/skills/kibi-usage/resources/fact-lanes.md +4 -0
- package/dist/public/skills/kibi-usage/resources/proof.md +45 -0
- package/dist/public/skills/kibi-usage/resources/relationship-directions.md +35 -17
- package/dist/public/skills/kibi-usage/resources/source-authoring.md +36 -0
- package/dist/public/skills/kibi-usage/resources/workflows.md +52 -1
- package/dist/public/symbol-granularity.d.ts +1 -1
- package/dist/public/symbol-granularity.d.ts.map +1 -1
- package/dist/public/symbol-granularity.generated.d.ts.map +1 -1
- package/dist/public/symbol-granularity.generated.js +38 -5
- package/dist/public/telemetry-acceptance.d.ts.map +1 -1
- package/dist/public/telemetry-acceptance.js +21 -5
- package/dist/relationships/shards.d.ts +6 -0
- package/dist/relationships/shards.d.ts.map +1 -1
- package/dist/relationships/shards.js +26 -19
- package/dist/report/html-report.css +1239 -281
- package/dist/runtime/cli-runtime.d.ts.map +1 -1
- package/dist/runtime/cli-runtime.js +18 -0
- package/dist/schemas/entity.schema.json +32 -0
- package/dist/traceability/staged-diagnostics.d.ts +1 -1
- package/dist/traceability/staged-diagnostics.d.ts.map +1 -1
- package/dist/traceability/staged-entity-id-style.d.ts +12 -0
- package/dist/traceability/staged-entity-id-style.d.ts.map +1 -0
- package/dist/traceability/staged-entity-id-style.js +68 -0
- package/dist/traceability/symbol-extract.d.ts +24 -7
- 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.map +1 -1
- package/dist/traceability/temp-kb.js +8 -0
- package/dist/traceability/validate.js +1 -1
- package/dist/types/entities.d.ts +2 -0
- package/dist/types/entities.d.ts.map +1 -1
- package/dist/types/relationships.d.ts +1 -1
- package/dist/types/relationships.d.ts.map +1 -1
- package/dist/utils/entity-id-style.d.ts +27 -0
- package/dist/utils/entity-id-style.d.ts.map +1 -0
- package/dist/utils/entity-id-style.js +81 -0
- package/dist/utils/git-repository-context.d.ts +50 -0
- package/dist/utils/git-repository-context.d.ts.map +1 -0
- package/dist/utils/git-repository-context.js +259 -0
- package/dist/utils/rule-registry.d.ts +5 -0
- package/dist/utils/rule-registry.d.ts.map +1 -1
- package/dist/utils/rule-registry.generated.d.ts +42 -0
- package/dist/utils/rule-registry.generated.d.ts.map +1 -1
- package/dist/utils/rule-registry.generated.js +50 -0
- package/dist/utils/strict-modeling.d.ts +7 -0
- package/dist/utils/strict-modeling.d.ts.map +1 -1
- package/dist/utils/strict-modeling.js +11 -0
- package/package.json +14 -11
- package/schema/entities.pl +60 -1
- package/schema/relationships.pl +17 -4
- package/schema/validation.pl +118 -20
- package/src/public/diagnostic-usage.ts +16 -24
- package/src/public/extractors/symbols-coordinator.ts +1 -0
- package/src/public/impact/analyzer.ts +15 -12
- package/src/public/impact/full-kb-quality.ts +4 -16
- package/src/public/operations/check-executor.ts +13 -2
- package/src/public/operations/check-helpers.ts +29 -3
- package/src/public/operations/contracts.ts +59 -12
- package/src/public/operations/discovery-entities.ts +327 -12
- package/src/public/operations/discovery-executors.ts +110 -61
- package/src/public/operations/migration-plan.ts +57 -0
- package/src/public/operations/predicate-schema-conformance.ts +362 -0
- package/src/public/operations/prolog-json.ts +22 -8
- package/src/public/operations/result-envelope.ts +114 -2
- package/src/public/operations/runtime-types.ts +22 -3
- package/src/public/operations/specs/check-rules.generated.ts +9 -1
- package/src/public/operations/specs/discovery.ts +11 -1
- package/src/public/operations/specs/mutation-schemas.ts +23 -3
- package/src/public/operations/specs/proof.ts +1 -1
- package/src/public/operations/specs/reporting.ts +71 -24
- package/src/public/operations/specs/semantic.ts +79 -17
- package/src/public/operations/specs/upsert.ts +1 -1
- package/src/public/operations/symbol-repair-plan.ts +16 -7
- package/src/public/operations/types.ts +5 -0
- package/src/public/proof-fingerprint.ts +1 -1
- package/src/public/proof-protocol-types.d.ts +1 -1
- package/src/public/proof-protocol.ts +4 -4
- package/src/public/schemas/entity.ts +22 -0
- package/src/public/schemas/relationship.ts +1 -0
- package/src/public/skills/kibi-usage/SKILL.md +10 -3
- package/src/public/skills/kibi-usage/resources/fact-lanes.md +4 -0
- package/src/public/skills/kibi-usage/resources/proof.md +45 -0
- package/src/public/skills/kibi-usage/resources/relationship-directions.md +35 -17
- package/src/public/skills/kibi-usage/resources/source-authoring.md +36 -0
- package/src/public/skills/kibi-usage/resources/workflows.md +52 -1
- package/src/public/symbol-granularity.generated.ts +45 -12
- package/src/public/symbol-granularity.ts +3 -3
- package/src/public/telemetry-acceptance.ts +37 -6
- package/src/schemas/entity.schema.json +32 -0
- package/src/schemas/relationship.schema.json +1 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { type PluginProviderStamp, type SourceAnalysisResult, type SymbolExtractorV1 } from "kibi-plugin-sdk";
|
|
2
|
+
import type { CapabilityModeResolution, CapabilityRegistry } from "./registry.js";
|
|
3
|
+
export type HostSourceAnalysisShadowComparison = Readonly<{
|
|
4
|
+
pluginId: string;
|
|
5
|
+
stamp: PluginProviderStamp;
|
|
6
|
+
symbolCount: number;
|
|
7
|
+
language: string;
|
|
8
|
+
ok: boolean;
|
|
9
|
+
error?: string;
|
|
10
|
+
}>;
|
|
11
|
+
export type HostSourceAnalysisResult = SourceAnalysisResult & Readonly<{
|
|
12
|
+
providerId: string | null;
|
|
13
|
+
stamp: PluginProviderStamp | null;
|
|
14
|
+
fallbackUsed: boolean;
|
|
15
|
+
diagnostics: readonly string[];
|
|
16
|
+
/** Shadow extractor comparisons; never affect canonical symbols. */
|
|
17
|
+
shadowComparisons: readonly HostSourceAnalysisShadowComparison[];
|
|
18
|
+
}>;
|
|
19
|
+
export type SourceAnalysisServiceOptions = Readonly<{
|
|
20
|
+
registry: CapabilityRegistry;
|
|
21
|
+
/** Injectable resolution for tests. */
|
|
22
|
+
resolveExtractors?: () => Promise<CapabilityModeResolution<SymbolExtractorV1>>;
|
|
23
|
+
}>;
|
|
24
|
+
export declare function createConservativeFallbackAnalysis(filePath: string, fallbackReason: string): HostSourceAnalysisResult;
|
|
25
|
+
/**
|
|
26
|
+
* Host-validated symbol analysis over registry providers with conservative
|
|
27
|
+
* text fallback. Mode semantics:
|
|
28
|
+
* - replace: first choice for claimed files; builtin fallback on failure
|
|
29
|
+
* - augment: builtin first for supported files; additional extractors for
|
|
30
|
+
* unsupported files in activation order
|
|
31
|
+
* - shadow: always run when configured/applicable; never canonical
|
|
32
|
+
*/
|
|
33
|
+
export declare class SourceAnalysisService {
|
|
34
|
+
private readonly registry;
|
|
35
|
+
private readonly resolveExtractors;
|
|
36
|
+
constructor(options: SourceAnalysisServiceOptions);
|
|
37
|
+
analyzeText(filePath: string, content: string): Promise<HostSourceAnalysisResult>;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Analyze using a pre-resolved extractor mode set (useful for tests).
|
|
41
|
+
*/
|
|
42
|
+
export declare function analyzeWithResolution(resolution: CapabilityModeResolution<SymbolExtractorV1>, filePath: string, content: string): Promise<HostSourceAnalysisResult>;
|
|
43
|
+
export declare function createSourceAnalysisService(options: SourceAnalysisServiceOptions): SourceAnalysisService;
|
|
44
|
+
//# sourceMappingURL=source-analysis-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-analysis-service.d.ts","sourceRoot":"","sources":["../../src/plugins/source-analysis-service.ts"],"names":[],"mappings":"AAmBA,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EAGvB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EACV,wBAAwB,EACxB,kBAAkB,EACnB,MAAM,eAAe,CAAC;AA4BvB,MAAM,MAAM,kCAAkC,GAAG,QAAQ,CAAC;IACxD,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,mBAAmB,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC,CAAC;AAGH,MAAM,MAAM,wBAAwB,GAAG,oBAAoB,GACzD,QAAQ,CAAC;IACP,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAClC,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,oEAAoE;IACpE,iBAAiB,EAAE,SAAS,kCAAkC,EAAE,CAAC;CAClE,CAAC,CAAC;AAGL,MAAM,MAAM,4BAA4B,GAAG,QAAQ,CAAC;IAClD,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,uCAAuC;IACvC,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAC/B,wBAAwB,CAAC,iBAAiB,CAAC,CAC5C,CAAC;CACH,CAAC,CAAC;AAgBH,wBAAgB,kCAAkC,CAChD,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,GACrB,wBAAwB,CAkB1B;AAuBD;;;;;;;GAOG;AAEH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAEhC;gBAEU,OAAO,EAAE,4BAA4B;IAO3C,WAAW,CACf,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,wBAAwB,CAAC;CAiIrC;AAED;;GAEG;AAEH,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,wBAAwB,CAAC,iBAAiB,CAAC,EACvD,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,wBAAwB,CAAC,CAQnC;AAGD,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,4BAA4B,GACpC,qBAAqB,CAEvB"}
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Kibi — repo-local, per-branch, queryable long-term memory for software projects
|
|
3
|
+
Copyright (C) 2026 Piotr Franczyk
|
|
4
|
+
|
|
5
|
+
This program is free software: you can redistribute it and/or modify
|
|
6
|
+
it under the terms of the GNU Affero General Public License as published by
|
|
7
|
+
the Free Software Foundation, either version 3 of the License, or
|
|
8
|
+
(at your option) any later version.
|
|
9
|
+
|
|
10
|
+
This program is distributed in the hope that it will be useful,
|
|
11
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13
|
+
GNU Affero General Public License for more details.
|
|
14
|
+
|
|
15
|
+
You should have received a copy of the GNU Affero General Public License
|
|
16
|
+
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
17
|
+
*/
|
|
18
|
+
import * as path from "node:path";
|
|
19
|
+
import { toSourceAnalysisProvider, validateSourceAnalysisResultForPath, } from "kibi-plugin-sdk";
|
|
20
|
+
const SOURCE_LANGUAGE_EXTENSIONS = {
|
|
21
|
+
".c": "c",
|
|
22
|
+
".cc": "cpp",
|
|
23
|
+
".cjs": "javascript",
|
|
24
|
+
".cpp": "cpp",
|
|
25
|
+
".cs": "csharp",
|
|
26
|
+
".cts": "typescript",
|
|
27
|
+
".go": "go",
|
|
28
|
+
".h": "c",
|
|
29
|
+
".hpp": "cpp",
|
|
30
|
+
".java": "java",
|
|
31
|
+
".js": "javascript",
|
|
32
|
+
".jsx": "javascript",
|
|
33
|
+
".kt": "kotlin",
|
|
34
|
+
".mjs": "javascript",
|
|
35
|
+
".mts": "typescript",
|
|
36
|
+
".php": "php",
|
|
37
|
+
".py": "python",
|
|
38
|
+
".rb": "ruby",
|
|
39
|
+
".rs": "rust",
|
|
40
|
+
".swift": "swift",
|
|
41
|
+
".ts": "typescript",
|
|
42
|
+
".tsx": "typescript",
|
|
43
|
+
};
|
|
44
|
+
function detectSourceLanguage(filePath) {
|
|
45
|
+
return (SOURCE_LANGUAGE_EXTENSIONS[path.extname(filePath).toLowerCase()] ??
|
|
46
|
+
"unknown");
|
|
47
|
+
}
|
|
48
|
+
function inferModuleTitle(filePath) {
|
|
49
|
+
const extension = path.extname(filePath);
|
|
50
|
+
const basename = path.basename(filePath, extension);
|
|
51
|
+
return basename.length > 0 ? basename : path.basename(filePath);
|
|
52
|
+
}
|
|
53
|
+
// implements REQ-capability-plugin-activation-disclosure-v1
|
|
54
|
+
export function createConservativeFallbackAnalysis(filePath, fallbackReason) {
|
|
55
|
+
const language = detectSourceLanguage(filePath);
|
|
56
|
+
return {
|
|
57
|
+
sourceFile: filePath,
|
|
58
|
+
language,
|
|
59
|
+
providerId: null,
|
|
60
|
+
stamp: null,
|
|
61
|
+
fallbackUsed: true,
|
|
62
|
+
diagnostics: [`conservative fallback: ${fallbackReason}`],
|
|
63
|
+
shadowComparisons: [],
|
|
64
|
+
module: {
|
|
65
|
+
title: inferModuleTitle(filePath),
|
|
66
|
+
language,
|
|
67
|
+
analysisMode: "fallback",
|
|
68
|
+
fallbackReason,
|
|
69
|
+
},
|
|
70
|
+
symbols: [],
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
function dedupeSymbols(symbols) {
|
|
74
|
+
const seen = new Set();
|
|
75
|
+
const output = [];
|
|
76
|
+
for (const symbol of symbols) {
|
|
77
|
+
const key = [
|
|
78
|
+
symbol.name,
|
|
79
|
+
symbol.kind,
|
|
80
|
+
symbol.startLine,
|
|
81
|
+
symbol.startColumn,
|
|
82
|
+
symbol.endLine,
|
|
83
|
+
symbol.endColumn,
|
|
84
|
+
].join("\0");
|
|
85
|
+
if (seen.has(key))
|
|
86
|
+
continue;
|
|
87
|
+
seen.add(key);
|
|
88
|
+
output.push(symbol);
|
|
89
|
+
}
|
|
90
|
+
return output;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Host-validated symbol analysis over registry providers with conservative
|
|
94
|
+
* text fallback. Mode semantics:
|
|
95
|
+
* - replace: first choice for claimed files; builtin fallback on failure
|
|
96
|
+
* - augment: builtin first for supported files; additional extractors for
|
|
97
|
+
* unsupported files in activation order
|
|
98
|
+
* - shadow: always run when configured/applicable; never canonical
|
|
99
|
+
*/
|
|
100
|
+
// implements REQ-capability-plugin-activation-disclosure-v1
|
|
101
|
+
export class SourceAnalysisService {
|
|
102
|
+
registry;
|
|
103
|
+
resolveExtractors;
|
|
104
|
+
constructor(options) {
|
|
105
|
+
this.registry = options.registry;
|
|
106
|
+
this.resolveExtractors =
|
|
107
|
+
options.resolveExtractors ??
|
|
108
|
+
(() => this.registry.resolveSymbolExtractors());
|
|
109
|
+
}
|
|
110
|
+
async analyzeText(filePath, content) {
|
|
111
|
+
const resolution = await this.resolveExtractors();
|
|
112
|
+
const diagnostics = [];
|
|
113
|
+
const tryAnalyze = (extractor, stamp) => {
|
|
114
|
+
const provider = toSourceAnalysisProvider(extractor);
|
|
115
|
+
if (!provider.supportsFile(filePath))
|
|
116
|
+
return null;
|
|
117
|
+
try {
|
|
118
|
+
const raw = provider.analyzeText(filePath, content);
|
|
119
|
+
const validated = validateSourceAnalysisResultForPath(raw, filePath);
|
|
120
|
+
return {
|
|
121
|
+
...validated,
|
|
122
|
+
symbols: dedupeSymbols(validated.symbols),
|
|
123
|
+
providerId: extractor.id,
|
|
124
|
+
stamp,
|
|
125
|
+
fallbackUsed: false,
|
|
126
|
+
diagnostics,
|
|
127
|
+
shadowComparisons: [],
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
132
|
+
diagnostics.push(`extractor '${extractor.id}' failed: ${message}`);
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
const runShadow = (canonical) => {
|
|
137
|
+
if (resolution.shadow.length === 0) {
|
|
138
|
+
return { ...canonical, diagnostics: [...diagnostics] };
|
|
139
|
+
}
|
|
140
|
+
const shadowComparisons = [];
|
|
141
|
+
for (const entry of resolution.shadow) {
|
|
142
|
+
const provider = toSourceAnalysisProvider(entry.capability);
|
|
143
|
+
if (!provider.supportsFile(filePath))
|
|
144
|
+
continue;
|
|
145
|
+
try {
|
|
146
|
+
const validated = validateSourceAnalysisResultForPath(provider.analyzeText(filePath, content), filePath);
|
|
147
|
+
shadowComparisons.push({
|
|
148
|
+
pluginId: entry.pluginId,
|
|
149
|
+
stamp: entry.stamp,
|
|
150
|
+
symbolCount: validated.symbols.length,
|
|
151
|
+
language: validated.language,
|
|
152
|
+
ok: true,
|
|
153
|
+
});
|
|
154
|
+
diagnostics.push(`shadow extractor '${entry.pluginId}' produced ${validated.symbols.length} non-canonical symbol(s)`);
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
158
|
+
shadowComparisons.push({
|
|
159
|
+
pluginId: entry.pluginId,
|
|
160
|
+
stamp: entry.stamp,
|
|
161
|
+
symbolCount: 0,
|
|
162
|
+
language: detectSourceLanguage(filePath),
|
|
163
|
+
ok: false,
|
|
164
|
+
error: message,
|
|
165
|
+
});
|
|
166
|
+
diagnostics.push(`shadow extractor '${entry.pluginId}' failed: ${message}`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return {
|
|
170
|
+
...canonical,
|
|
171
|
+
diagnostics: [...diagnostics],
|
|
172
|
+
shadowComparisons,
|
|
173
|
+
};
|
|
174
|
+
};
|
|
175
|
+
let canonical = null;
|
|
176
|
+
if (resolution.replace) {
|
|
177
|
+
const replaced = tryAnalyze(resolution.replace.capability, resolution.replace.stamp);
|
|
178
|
+
if (replaced) {
|
|
179
|
+
canonical = replaced;
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
diagnostics.push(`replace extractor '${resolution.replace.pluginId}' did not claim or failed; trying builtin`);
|
|
183
|
+
const builtin = tryAnalyze(resolution.builtin.capability, {
|
|
184
|
+
...resolution.builtin.stamp,
|
|
185
|
+
fallbackUsed: true,
|
|
186
|
+
});
|
|
187
|
+
if (builtin) {
|
|
188
|
+
canonical = { ...builtin, fallbackUsed: true };
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
canonical = createConservativeFallbackAnalysis(filePath, "provider_error");
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
const builtin = tryAnalyze(resolution.builtin.capability, resolution.builtin.stamp);
|
|
197
|
+
if (builtin) {
|
|
198
|
+
canonical = builtin;
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
for (const entry of resolution.augment) {
|
|
202
|
+
const analyzed = tryAnalyze(entry.capability, entry.stamp);
|
|
203
|
+
if (analyzed) {
|
|
204
|
+
canonical = analyzed;
|
|
205
|
+
break;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
if (!canonical) {
|
|
209
|
+
canonical = createConservativeFallbackAnalysis(filePath, diagnostics.length > 0 ? "provider_error" : "unsupported_language");
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return runShadow(canonical);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Analyze using a pre-resolved extractor mode set (useful for tests).
|
|
218
|
+
*/
|
|
219
|
+
// implements REQ-capability-plugin-activation-disclosure-v1
|
|
220
|
+
export async function analyzeWithResolution(resolution, filePath, content) {
|
|
221
|
+
const service = new SourceAnalysisService({
|
|
222
|
+
registry: {
|
|
223
|
+
resolveSymbolExtractors: async () => resolution,
|
|
224
|
+
},
|
|
225
|
+
resolveExtractors: async () => resolution,
|
|
226
|
+
});
|
|
227
|
+
return service.analyzeText(filePath, content);
|
|
228
|
+
}
|
|
229
|
+
// implements REQ-capability-plugin-activation-disclosure-v1
|
|
230
|
+
export function createSourceAnalysisService(options) {
|
|
231
|
+
return new SourceAnalysisService(options);
|
|
232
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../../src/prolog/codec.ts"],"names":[],"mappings":"AAUA;;;GAGG;AAEH;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAYhD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIlD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CASpD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGvD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,CAU5D;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,GACrC,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAO9B;AAED,wBAAgB,uBAAuB,CAAC,CAAC,EACvC,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EAClC,QAAQ,EAAE,CAAC,GACV,CAAC,GAAG,IAAI,CAEV;AAID,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,EACtC,QAAQ,EAAE,MAAM,GACf,OAAO,CAoCT;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMjD;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,GACrC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAiBzB;AAED,wBAAgB,sBAAsB,CAEpC,UAAU,EAAE,MAAM,GACjB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAGzB;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAqB3E;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../../src/prolog/codec.ts"],"names":[],"mappings":"AAUA;;;GAGG;AAEH;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAYhD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIlD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CASpD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGvD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,CAU5D;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,GACrC,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAO9B;AAED,wBAAgB,uBAAuB,CAAC,CAAC,EACvC,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EAClC,QAAQ,EAAE,CAAC,GACV,CAAC,GAAG,IAAI,CAEV;AAID,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,EACtC,QAAQ,EAAE,MAAM,GACf,OAAO,CAoCT;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMjD;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,GACrC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAiBzB;AAED,wBAAgB,sBAAsB,CAEpC,UAAU,EAAE,MAAM,GACjB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAGzB;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAqB3E;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAsD3E;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CA6D5D;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAG7E;AAuFD,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAGtE;AAYD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAUvD;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAenD;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAmBlE;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAoBzE;AAyCD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,EAAE,CA6DjE"}
|
package/dist/prolog/codec.js
CHANGED
|
@@ -191,6 +191,8 @@ export function parsePropertyList(propsStr) {
|
|
|
191
191
|
}
|
|
192
192
|
let parsed = parsePrologValue(value);
|
|
193
193
|
if ((key === "rule_ir" ||
|
|
194
|
+
key === "argument_constants" ||
|
|
195
|
+
key === "argument_aliases" ||
|
|
194
196
|
key === "semantic_inventory" ||
|
|
195
197
|
key === "proof_receipts" ||
|
|
196
198
|
key === "proof_contract" ||
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"janitor.d.ts","sourceRoot":"","sources":["../../src/prolog/janitor.ts"],"names":[],"mappings":"AAoBA,OAAO,
|
|
1
|
+
{"version":3,"file":"janitor.d.ts","sourceRoot":"","sources":["../../src/prolog/janitor.ts"],"names":[],"mappings":"AAoBA,OAAO,EACL,KAAK,oBAAoB,EAK1B,MAAM,iBAAiB,CAAC;AAEzB;;;;;;;;GAQG;AAGH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,oBAAoB,CAAC;IAC3C,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,gBAAgB,GAAG,MAAM,CAAC;CACtD;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,oBAAoB,CAAC;IAC3C,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC;CACnC;AAED,MAAM,MAAM,cAAc,GAAG,gBAAgB,GAAG,aAAa,CAAC;AAE9D,MAAM,WAAW,cAAc;IAC7B,6DAA6D;IAC7D,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,8DAA8D;IAC9D,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,kEAAkE;IAClE,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IACvB,oEAAoE;IACpE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,2EAA2E;AAE3E,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,OAAO,GACb,gBAAgB,GAAG,IAAI,CA+CzB;AAED,iEAAiE;AAEjE,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,cAAc,GACtB,gBAAgB,EAAE,CAepB;AAED;;;GAGG;AAEH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,cAAc,GAAG,aAAa,EAAE,CA8C5E;AAED,gFAAgF;AAEhF,wBAAgB,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,cAAc,EAAE,CAKpE"}
|
package/dist/prolog/janitor.js
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
You should have received a copy of the GNU Affero General Public License
|
|
16
16
|
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
17
17
|
*/
|
|
18
|
-
import { existsSync,
|
|
18
|
+
import { existsSync, readFileSync, readdirSync, rmSync } from "node:fs";
|
|
19
19
|
import { join } from "node:path";
|
|
20
20
|
import { breakStoreLock, classifyStoreLockHolder, isProcessAlive, readStoreLockOwner, } from "./store-lock.js";
|
|
21
21
|
/** Scan one branch store's ownership journal and clean stale artifacts. */
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { PrologStoreLockOwner } from "./error-terms.js";
|
|
2
1
|
import type { QueryResult } from "../prolog.js";
|
|
2
|
+
import type { PrologStoreLockOwner } from "./error-terms.js";
|
|
3
3
|
/** Linux boot id; guards against PID reuse across reboots. Null elsewhere. */
|
|
4
4
|
export declare function currentBootId(): string | null;
|
|
5
5
|
export declare function isProcessAlive(pid: number): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store-lock.d.ts","sourceRoot":"","sources":["../../src/prolog/store-lock.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"store-lock.d.ts","sourceRoot":"","sources":["../../src/prolog/store-lock.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,KAAK,EAAqB,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAgBhF,8EAA8E;AAC9E,wBAAgB,aAAa,IAAI,MAAM,GAAG,IAAI,CAa7C;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAUnD;AAED,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;AAEzE,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,oBAAoB,GAAG,IAAI,GACjC,oBAAoB,CAYtB;AAED;;;;;GAKG;AAEH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,GAChB;IAAE,KAAK,EAAE,oBAAoB,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CA4B7D;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAWzD;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,oBAAoB,GAAG,IAAI,GACjC,yBAAyB,CAoB3B;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;CACxD;AAED;;;;;;GAMG;AAEH,wBAAsB,iCAAiC,CACrD,MAAM,EAAE,qBAAqB,EAC7B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,WAAW,CAAC,CA4BtB"}
|
package/dist/prolog.d.ts
CHANGED
|
@@ -9,6 +9,23 @@ export interface PrologOptions {
|
|
|
9
9
|
* repository tests that still run under Bun.
|
|
10
10
|
*/
|
|
11
11
|
oneShot?: boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Bounded stdout/stderr capacity per query. Defaults to 8 MiB; tests inject
|
|
14
|
+
* a small cap to exercise the overflow path deterministically.
|
|
15
|
+
*/
|
|
16
|
+
maxOutputBytes?: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Raised when a query reaches an interactive process that was started and
|
|
20
|
+
* later terminated (output overflow, timeout, crash, or explicit terminate).
|
|
21
|
+
* Such a port must be restarted by its owner (the engine daemon recycles it);
|
|
22
|
+
* it never degrades into isolated one-shot SWI processes, which would lose
|
|
23
|
+
* the attached KB and every module loaded into the interactive session.
|
|
24
|
+
*/
|
|
25
|
+
export declare class PrologProcessTerminatedError extends Error {
|
|
26
|
+
readonly code = "prolog_process_terminated";
|
|
27
|
+
readonly reason: string;
|
|
28
|
+
constructor(reason: string);
|
|
12
29
|
}
|
|
13
30
|
export interface QueryResult {
|
|
14
31
|
success: boolean;
|
|
@@ -34,8 +51,26 @@ export declare class PrologProcess {
|
|
|
34
51
|
private useOneShotMode;
|
|
35
52
|
private attachedKbPath;
|
|
36
53
|
private onProcessExit;
|
|
54
|
+
private readonly maxOutputBytes;
|
|
55
|
+
/**
|
|
56
|
+
* Set once start() spawned an interactive process. From then on the
|
|
57
|
+
* isolated one-shot fallback is unreachable: a lost interactive process
|
|
58
|
+
* must fail loudly instead of silently changing execution semantics.
|
|
59
|
+
*/
|
|
60
|
+
private interactiveStarted;
|
|
61
|
+
private terminationReason;
|
|
37
62
|
constructor(options?: PrologOptions);
|
|
38
63
|
attachProcessExitHandler(on?: (event: "exit", listener: () => void) => void): void;
|
|
64
|
+
/**
|
|
65
|
+
* True when every query runs in its own isolated SWI process, so callers
|
|
66
|
+
* must not rely on state (loaded modules) carried between queries.
|
|
67
|
+
*/
|
|
68
|
+
get oneShotMode(): boolean;
|
|
69
|
+
/**
|
|
70
|
+
* True once a started interactive process has been lost. The owner must
|
|
71
|
+
* restart it (and re-establish its session state) before querying again.
|
|
72
|
+
*/
|
|
73
|
+
needsRestart(): boolean;
|
|
39
74
|
start(): Promise<void>;
|
|
40
75
|
private waitForReady;
|
|
41
76
|
query(goal: string | string[]): Promise<QueryResult>;
|
|
@@ -63,6 +98,7 @@ export declare class PrologProcess {
|
|
|
63
98
|
private translateError;
|
|
64
99
|
isRunning(): boolean;
|
|
65
100
|
getPid(): number;
|
|
101
|
+
private lostProcessError;
|
|
66
102
|
terminate(): Promise<void>;
|
|
67
103
|
}
|
|
68
104
|
//# sourceMappingURL=prolog.d.ts.map
|
package/dist/prolog.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prolog.d.ts","sourceRoot":"","sources":["../src/prolog.ts"],"names":[],"mappings":"AAwBA,OAAO,EACL,KAAK,iBAAiB,EAEvB,MAAM,yBAAyB,CAAC;AA2BjC,wBAAgB,eAAe,IAAI,MAAM,CAsCxC;AACD,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"prolog.d.ts","sourceRoot":"","sources":["../src/prolog.ts"],"names":[],"mappings":"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"}
|
package/dist/prolog.js
CHANGED
|
@@ -23,7 +23,7 @@ import { fileURLToPath } from "node:url";
|
|
|
23
23
|
import { getKbPlPathOverride, isPrologDebugEnabled } from "./env.js";
|
|
24
24
|
import { extractPrologErrorRecord, } from "./prolog/error-terms.js";
|
|
25
25
|
const importMetaDir = path.dirname(fileURLToPath(import.meta.url));
|
|
26
|
-
const
|
|
26
|
+
const DEFAULT_PROLOG_OUTPUT_MAX_BUFFER_BYTES = 8 * 1024 * 1024;
|
|
27
27
|
const PROLOG_OUTPUT_OVERFLOW_ERROR = "Query exceeded bounded Prolog output capacity (ENOBUFS); narrow the operation or reduce stored entity size";
|
|
28
28
|
const INTERACTIVE_QUERY_FRAME_END = "__KIBI_QUERY_FRAME_END__";
|
|
29
29
|
const require = createRequire(import.meta.url);
|
|
@@ -79,6 +79,22 @@ export function resolveKbPlPath() {
|
|
|
79
79
|
throw new Error("Unable to resolve kb.pl. Expected kibi-core to be installed (node_modules) " +
|
|
80
80
|
"or to be running inside the monorepo checkout.");
|
|
81
81
|
}
|
|
82
|
+
/**
|
|
83
|
+
* Raised when a query reaches an interactive process that was started and
|
|
84
|
+
* later terminated (output overflow, timeout, crash, or explicit terminate).
|
|
85
|
+
* Such a port must be restarted by its owner (the engine daemon recycles it);
|
|
86
|
+
* it never degrades into isolated one-shot SWI processes, which would lose
|
|
87
|
+
* the attached KB and every module loaded into the interactive session.
|
|
88
|
+
*/
|
|
89
|
+
export class PrologProcessTerminatedError extends Error {
|
|
90
|
+
code = "prolog_process_terminated";
|
|
91
|
+
reason;
|
|
92
|
+
constructor(reason) {
|
|
93
|
+
super(`Kibi Prolog process is no longer running (${reason}); the interactive session and its attached KB were lost. The owning engine must restart it before serving more queries — run 'kibi engine stop' and retry if this persists.`);
|
|
94
|
+
this.name = "PrologProcessTerminatedError";
|
|
95
|
+
this.reason = reason;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
82
98
|
// implements REQ-core-prolog-process-management
|
|
83
99
|
export function registerProcessExitOnce(current, handler, on = (event, listener) => process.on(event, listener)) {
|
|
84
100
|
if (current)
|
|
@@ -108,9 +124,23 @@ export class PrologProcess {
|
|
|
108
124
|
useOneShotMode;
|
|
109
125
|
attachedKbPath = null;
|
|
110
126
|
onProcessExit = null;
|
|
127
|
+
maxOutputBytes;
|
|
128
|
+
/**
|
|
129
|
+
* Set once start() spawned an interactive process. From then on the
|
|
130
|
+
* isolated one-shot fallback is unreachable: a lost interactive process
|
|
131
|
+
* must fail loudly instead of silently changing execution semantics.
|
|
132
|
+
*/
|
|
133
|
+
interactiveStarted = false;
|
|
134
|
+
terminationReason = null;
|
|
111
135
|
constructor(options = {}) {
|
|
112
136
|
this.swiplPath = options.swiplPath || "swipl";
|
|
113
137
|
this.timeout = options.timeout || 30000;
|
|
138
|
+
this.maxOutputBytes =
|
|
139
|
+
options.maxOutputBytes !== undefined &&
|
|
140
|
+
Number.isInteger(options.maxOutputBytes) &&
|
|
141
|
+
options.maxOutputBytes > 0
|
|
142
|
+
? options.maxOutputBytes
|
|
143
|
+
: DEFAULT_PROLOG_OUTPUT_MAX_BUFFER_BYTES;
|
|
114
144
|
this.useOneShotMode =
|
|
115
145
|
options.oneShot ??
|
|
116
146
|
(process.env.NODE_ENV === "test" &&
|
|
@@ -120,11 +150,28 @@ export class PrologProcess {
|
|
|
120
150
|
attachProcessExitHandler(on = (event, listener) => process.on(event, listener)) {
|
|
121
151
|
this.onProcessExit = bindProcessExitHandler(this.onProcessExit, () => this.terminate(), on);
|
|
122
152
|
}
|
|
153
|
+
/**
|
|
154
|
+
* True when every query runs in its own isolated SWI process, so callers
|
|
155
|
+
* must not rely on state (loaded modules) carried between queries.
|
|
156
|
+
*/
|
|
157
|
+
get oneShotMode() {
|
|
158
|
+
return this.useOneShotMode || !this.interactiveStarted;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* True once a started interactive process has been lost. The owner must
|
|
162
|
+
* restart it (and re-establish its session state) before querying again.
|
|
163
|
+
*/
|
|
164
|
+
needsRestart() {
|
|
165
|
+
return this.interactiveStarted && !this.isProcessUsable();
|
|
166
|
+
}
|
|
123
167
|
async start() {
|
|
124
168
|
if (!existsSync(this.swiplPath) && this.swiplPath !== "swipl") {
|
|
125
169
|
throw new Error(`SWI-Prolog not found at ${this.swiplPath}. Please install SWI-Prolog or check your PATH.`);
|
|
126
170
|
}
|
|
127
171
|
const kbPath = resolveKbPlPath();
|
|
172
|
+
this.interactiveStarted = true;
|
|
173
|
+
this.terminationReason = null;
|
|
174
|
+
this.invalidateCache();
|
|
128
175
|
this.process = spawn(this.swiplPath, [
|
|
129
176
|
"-g",
|
|
130
177
|
`use_module('${kbPath}'), use_module(library(semweb/rdf_db)), set_prolog_flag(answer_write_options, [max_depth(0), quoted(true)])`,
|
|
@@ -148,6 +195,16 @@ export class PrologProcess {
|
|
|
148
195
|
this.process.stderr.on("data", (chunk) => {
|
|
149
196
|
this.appendErrorChunk(chunk);
|
|
150
197
|
});
|
|
198
|
+
// A write racing the child's death (native crash, external kill) fails
|
|
199
|
+
// asynchronously with EPIPE. Unhandled, that error event crashes the
|
|
200
|
+
// whole host (the engine daemon); record the loss instead so the owner
|
|
201
|
+
// sees needsRestart() and the in-flight query reports the termination.
|
|
202
|
+
const child = this.process;
|
|
203
|
+
child.stdin?.on("error", (error) => {
|
|
204
|
+
if (this.process === child) {
|
|
205
|
+
this.terminationReason ??= `stdin ${error.code ?? "error"}`;
|
|
206
|
+
}
|
|
207
|
+
});
|
|
151
208
|
this.process.stdin.write("true.\n");
|
|
152
209
|
this.attachProcessExitHandler();
|
|
153
210
|
await this.waitForReady();
|
|
@@ -223,10 +280,10 @@ export class PrologProcess {
|
|
|
223
280
|
// runtimes provide an EngineClient, while explicitly attached callers
|
|
224
281
|
// call start() and stay interactive; this fallback never participates
|
|
225
282
|
// in the engine-backed workflow.
|
|
226
|
-
if (this.process === null) {
|
|
283
|
+
if (this.process === null && !this.interactiveStarted) {
|
|
227
284
|
return this.execOneShot(goal, this.attachedKbPath);
|
|
228
285
|
}
|
|
229
|
-
throw
|
|
286
|
+
throw this.lostProcessError();
|
|
230
287
|
}
|
|
231
288
|
const runInteractiveQuery = async () => {
|
|
232
289
|
this.clearQueryBuffers();
|
|
@@ -264,6 +321,7 @@ export class PrologProcess {
|
|
|
264
321
|
console.error(`[prolog debug] runtime=${runtime ?? "unknown"} packages=${process.env.KIBI_PACKAGE_VERSIONS ?? KIBI_PACKAGE_VERSIONS}`);
|
|
265
322
|
}
|
|
266
323
|
settled = true;
|
|
324
|
+
this.terminationReason = `query timeout: ${goalLabel}`;
|
|
267
325
|
void this.terminate().finally(() => {
|
|
268
326
|
reject(new Error(msg));
|
|
269
327
|
});
|
|
@@ -275,6 +333,7 @@ export class PrologProcess {
|
|
|
275
333
|
if (this.outputOverflowed) {
|
|
276
334
|
clearTimeout(timeoutId);
|
|
277
335
|
settled = true;
|
|
336
|
+
this.terminationReason = `output overflow (ENOBUFS): ${goalLabel}`;
|
|
278
337
|
void this.terminate().finally(() => {
|
|
279
338
|
resolve({
|
|
280
339
|
success: false,
|
|
@@ -287,6 +346,7 @@ export class PrologProcess {
|
|
|
287
346
|
if (!this.isProcessUsable()) {
|
|
288
347
|
clearTimeout(timeoutId);
|
|
289
348
|
settled = true;
|
|
349
|
+
this.terminationReason ??= `process exited during query: ${goalLabel}`;
|
|
290
350
|
resolve({
|
|
291
351
|
success: false,
|
|
292
352
|
bindings: {},
|
|
@@ -358,7 +418,7 @@ export class PrologProcess {
|
|
|
358
418
|
await previousQuery;
|
|
359
419
|
try {
|
|
360
420
|
if (!this.isProcessUsable()) {
|
|
361
|
-
throw
|
|
421
|
+
throw this.lostProcessError();
|
|
362
422
|
}
|
|
363
423
|
return await runInteractiveQuery();
|
|
364
424
|
}
|
|
@@ -508,7 +568,7 @@ export class PrologProcess {
|
|
|
508
568
|
if (outputOverflowed)
|
|
509
569
|
return;
|
|
510
570
|
const bytes = target === "stdout" ? outputBytes : errorBytes;
|
|
511
|
-
const remaining =
|
|
571
|
+
const remaining = this.maxOutputBytes - bytes;
|
|
512
572
|
if (chunk.byteLength > remaining) {
|
|
513
573
|
const clipped = chunk.subarray(0, Math.max(0, remaining)).toString();
|
|
514
574
|
if (target === "stdout")
|
|
@@ -624,10 +684,10 @@ export class PrologProcess {
|
|
|
624
684
|
appendOutputChunk(chunk) {
|
|
625
685
|
if (this.outputOverflowed)
|
|
626
686
|
return;
|
|
627
|
-
const remaining =
|
|
687
|
+
const remaining = this.maxOutputBytes - this.outputBufferBytes;
|
|
628
688
|
if (chunk.byteLength > remaining) {
|
|
629
689
|
this.outputBuffer += chunk.subarray(0, remaining).toString();
|
|
630
|
-
this.outputBufferBytes =
|
|
690
|
+
this.outputBufferBytes = this.maxOutputBytes;
|
|
631
691
|
this.outputOverflowed = true;
|
|
632
692
|
return;
|
|
633
693
|
}
|
|
@@ -637,10 +697,10 @@ export class PrologProcess {
|
|
|
637
697
|
appendErrorChunk(chunk) {
|
|
638
698
|
if (this.outputOverflowed)
|
|
639
699
|
return;
|
|
640
|
-
const remaining =
|
|
700
|
+
const remaining = this.maxOutputBytes - this.errorBufferBytes;
|
|
641
701
|
if (chunk.byteLength > remaining) {
|
|
642
702
|
this.errorBuffer += chunk.subarray(0, remaining).toString();
|
|
643
|
-
this.errorBufferBytes =
|
|
703
|
+
this.errorBufferBytes = this.maxOutputBytes;
|
|
644
704
|
this.outputOverflowed = true;
|
|
645
705
|
return;
|
|
646
706
|
}
|
|
@@ -827,7 +887,16 @@ export class PrologProcess {
|
|
|
827
887
|
getPid() {
|
|
828
888
|
return this.process?.pid || 0;
|
|
829
889
|
}
|
|
890
|
+
lostProcessError() {
|
|
891
|
+
if (!this.interactiveStarted) {
|
|
892
|
+
return new Error("Prolog process not started");
|
|
893
|
+
}
|
|
894
|
+
return new PrologProcessTerminatedError(this.terminationReason ?? "process exited");
|
|
895
|
+
}
|
|
830
896
|
async terminate() {
|
|
897
|
+
if (this.interactiveStarted) {
|
|
898
|
+
this.terminationReason ??= "terminated";
|
|
899
|
+
}
|
|
831
900
|
if (this.terminationPromise) {
|
|
832
901
|
await this.terminationPromise;
|
|
833
902
|
return;
|
package/dist/proof/inspect.js
CHANGED
|
@@ -148,7 +148,7 @@ function directoryExists(root, relative) {
|
|
|
148
148
|
return false;
|
|
149
149
|
}
|
|
150
150
|
}
|
|
151
|
-
// implements REQ-kibi-
|
|
151
|
+
// implements REQ-kibi-verification-evidence-contract
|
|
152
152
|
export function inspectProofEnvironment(root) {
|
|
153
153
|
const languages = new Set();
|
|
154
154
|
const buildSystems = new Set();
|
|
@@ -5,7 +5,7 @@ import path from "node:path";
|
|
|
5
5
|
* The path is always repository-relative before hashing so the same case has
|
|
6
6
|
* the same identity in a checkout, packed consumer, and dogfood workspace.
|
|
7
7
|
*/
|
|
8
|
-
// implements REQ-kibi-
|
|
8
|
+
// implements REQ-kibi-verification-evidence-contract
|
|
9
9
|
export function playwrightCaseId(sourceFile, qualifiedTitle) {
|
|
10
10
|
const normalizedPath = sourceFile
|
|
11
11
|
.replaceAll("\\", "/")
|
|
@@ -14,7 +14,7 @@ export function playwrightCaseId(sourceFile, qualifiedTitle) {
|
|
|
14
14
|
const key = `${normalizedPath}\0${qualifiedTitle.trim()}`;
|
|
15
15
|
return `SYM-PW-${createHash("sha256").update(key).digest("hex").slice(0, 16).toUpperCase()}`;
|
|
16
16
|
}
|
|
17
|
-
// implements REQ-kibi-
|
|
17
|
+
// implements REQ-kibi-verification-evidence-contract
|
|
18
18
|
export function normalizePlaywrightSourceFile(sourceFile, workspaceRoot) {
|
|
19
19
|
const absolute = path.resolve(sourceFile);
|
|
20
20
|
if (!workspaceRoot)
|