kibi-cli 1.0.1 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (548) hide show
  1. package/dist/cli-errors.d.ts +3 -1
  2. package/dist/cli-errors.d.ts.map +1 -1
  3. package/dist/cli-errors.js +4 -1
  4. package/dist/cli-json-command.d.ts +1 -0
  5. package/dist/cli-json-command.d.ts.map +1 -1
  6. package/dist/cli-json-command.js +13 -4
  7. package/dist/cli-operation-loader.js +3 -3
  8. package/dist/cli-operation-metadata.d.ts +4 -3
  9. package/dist/cli-operation-metadata.d.ts.map +1 -1
  10. package/dist/cli-operation-metadata.js +7 -5
  11. package/dist/cli-protocol.js +1 -1
  12. package/dist/cli-register-maintenance.d.ts.map +1 -1
  13. package/dist/cli-register-maintenance.js +7 -0
  14. package/dist/cli-register-proof.d.ts +3 -0
  15. package/dist/cli-register-proof.d.ts.map +1 -0
  16. package/dist/cli-register-proof.js +127 -0
  17. package/dist/cli-register-reporting.d.ts.map +1 -1
  18. package/dist/cli-register-reporting.js +7 -0
  19. package/dist/cli.d.ts +4 -0
  20. package/dist/cli.d.ts.map +1 -1
  21. package/dist/cli.js +19 -10
  22. package/dist/commands/branch.d.ts +1 -0
  23. package/dist/commands/branch.d.ts.map +1 -1
  24. package/dist/commands/branch.js +8 -4
  25. package/dist/commands/check-generated.d.ts +7 -0
  26. package/dist/commands/check-generated.d.ts.map +1 -0
  27. package/dist/commands/check-generated.js +192 -0
  28. package/dist/commands/check.d.ts +14 -0
  29. package/dist/commands/check.d.ts.map +1 -1
  30. package/dist/commands/check.js +193 -46
  31. package/dist/commands/coverage.d.ts +1 -0
  32. package/dist/commands/coverage.d.ts.map +1 -1
  33. package/dist/commands/coverage.js +6 -0
  34. package/dist/commands/doctor.d.ts +22 -0
  35. package/dist/commands/doctor.d.ts.map +1 -1
  36. package/dist/commands/doctor.js +170 -23
  37. package/dist/commands/engine.d.ts +12 -0
  38. package/dist/commands/engine.d.ts.map +1 -1
  39. package/dist/commands/engine.js +42 -0
  40. package/dist/commands/github-init.d.ts +1 -0
  41. package/dist/commands/github-init.d.ts.map +1 -1
  42. package/dist/commands/github-init.js +9 -5
  43. package/dist/commands/init-helpers.d.ts.map +1 -1
  44. package/dist/commands/init-helpers.js +49 -10
  45. package/dist/commands/migrate.d.ts +4 -0
  46. package/dist/commands/migrate.d.ts.map +1 -1
  47. package/dist/commands/migrate.js +7 -7
  48. package/dist/commands/proof-explain.d.ts +10 -0
  49. package/dist/commands/proof-explain.d.ts.map +1 -0
  50. package/dist/commands/proof-explain.js +45 -0
  51. package/dist/commands/proof-impact.d.ts +7 -0
  52. package/dist/commands/proof-impact.d.ts.map +1 -0
  53. package/dist/commands/proof-impact.js +39 -0
  54. package/dist/commands/proof-migrate-legacy.d.ts +7 -0
  55. package/dist/commands/proof-migrate-legacy.d.ts.map +1 -0
  56. package/dist/commands/proof-migrate-legacy.js +45 -0
  57. package/dist/commands/proof-prune.d.ts +8 -0
  58. package/dist/commands/proof-prune.d.ts.map +1 -0
  59. package/dist/commands/proof-prune.js +53 -0
  60. package/dist/commands/prove.d.ts +37 -0
  61. package/dist/commands/prove.d.ts.map +1 -0
  62. package/dist/commands/prove.js +470 -0
  63. package/dist/commands/report.d.ts.map +1 -1
  64. package/dist/commands/report.js +18 -3
  65. package/dist/commands/sync/discovery.d.ts +3 -0
  66. package/dist/commands/sync/discovery.d.ts.map +1 -1
  67. package/dist/commands/sync/discovery.js +36 -28
  68. package/dist/commands/sync/manifest.d.ts +2 -1
  69. package/dist/commands/sync/manifest.d.ts.map +1 -1
  70. package/dist/commands/sync/manifest.js +55 -21
  71. package/dist/commands/sync/persistence.d.ts +4 -1
  72. package/dist/commands/sync/persistence.d.ts.map +1 -1
  73. package/dist/commands/sync/persistence.js +31 -14
  74. package/dist/commands/sync/staging.d.ts +1 -0
  75. package/dist/commands/sync/staging.d.ts.map +1 -1
  76. package/dist/commands/sync/staging.js +5 -2
  77. package/dist/commands/sync/untracked-targets.d.ts +24 -0
  78. package/dist/commands/sync/untracked-targets.d.ts.map +1 -0
  79. package/dist/commands/sync/untracked-targets.js +108 -0
  80. package/dist/commands/sync.d.ts +11 -1
  81. package/dist/commands/sync.d.ts.map +1 -1
  82. package/dist/commands/sync.js +74 -30
  83. package/dist/engine-daemon.d.ts +3 -1
  84. package/dist/engine-daemon.d.ts.map +1 -1
  85. package/dist/engine-daemon.js +49 -20
  86. package/dist/engine.d.ts +17 -77
  87. package/dist/engine.d.ts.map +1 -1
  88. package/dist/engine.js +331 -91
  89. package/dist/env/bootstrap.d.ts +84 -0
  90. package/dist/env/bootstrap.d.ts.map +1 -0
  91. package/dist/env/bootstrap.js +310 -0
  92. package/dist/extractors/manifest.d.ts +5 -0
  93. package/dist/extractors/manifest.d.ts.map +1 -1
  94. package/dist/extractors/manifest.js +46 -1
  95. package/dist/extractors/markdown.d.ts +7 -3
  96. package/dist/extractors/markdown.d.ts.map +1 -1
  97. package/dist/extractors/markdown.js +60 -24
  98. package/dist/extractors/playwright-cases.js +1 -1
  99. package/dist/extractors/relationships.d.ts +6 -0
  100. package/dist/extractors/relationships.d.ts.map +1 -1
  101. package/dist/extractors/relationships.js +1 -1
  102. package/dist/extractors/symbol-coordinates.d.ts.map +1 -1
  103. package/dist/extractors/symbols-coordinator.d.ts +8 -0
  104. package/dist/extractors/symbols-coordinator.d.ts.map +1 -1
  105. package/dist/extractors/symbols-coordinator.js +40 -0
  106. package/dist/extractors/symbols-ts.d.ts +9 -19
  107. package/dist/extractors/symbols-ts.d.ts.map +1 -1
  108. package/dist/extractors/symbols-ts.js +34 -429
  109. package/dist/intent-search.d.ts +1 -0
  110. package/dist/intent-search.d.ts.map +1 -1
  111. package/dist/intent-search.js +11 -8
  112. package/dist/logic/ir.d.ts +1 -0
  113. package/dist/logic/ir.d.ts.map +1 -1
  114. package/dist/logic/ir.js +1 -1
  115. package/dist/operations/bootstrap/activation.d.ts +2 -1
  116. package/dist/operations/bootstrap/activation.d.ts.map +1 -1
  117. package/dist/operations/bootstrap/activation.js +11 -3
  118. package/dist/operations/bootstrap/generate.d.ts +2 -1
  119. package/dist/operations/bootstrap/generate.d.ts.map +1 -1
  120. package/dist/operations/bootstrap/generate.js +6 -3
  121. package/dist/operations/bootstrap/guidance.d.ts +1 -0
  122. package/dist/operations/bootstrap/guidance.d.ts.map +1 -1
  123. package/dist/operations/bootstrap/guidance.js +1 -1
  124. package/dist/operations/modeling/model-requirement.d.ts +5 -0
  125. package/dist/operations/modeling/model-requirement.d.ts.map +1 -1
  126. package/dist/operations/modeling/model-requirement.js +57 -46
  127. package/dist/operations/modeling/predicate-applicability.d.ts.map +1 -1
  128. package/dist/operations/modeling/predicate-applicability.js +103 -4
  129. package/dist/operations/modeling/predicate-catalog-2.d.ts.map +1 -1
  130. package/dist/operations/modeling/predicate-catalog-2.js +18 -2
  131. package/dist/operations/modeling/predicate-catalog-3.d.ts.map +1 -1
  132. package/dist/operations/modeling/predicate-catalog-3.js +17 -1
  133. package/dist/operations/modeling/predicate-catalog-5.d.ts +10 -0
  134. package/dist/operations/modeling/predicate-catalog-5.d.ts.map +1 -0
  135. package/dist/operations/modeling/predicate-catalog-5.js +291 -0
  136. package/dist/operations/modeling/predicate-catalog.d.ts.map +1 -1
  137. package/dist/operations/modeling/predicate-catalog.js +4 -0
  138. package/dist/operations/modeling/predicate-loader.d.ts +1 -0
  139. package/dist/operations/modeling/predicate-loader.d.ts.map +1 -1
  140. package/dist/operations/modeling/predicate-loader.js +4 -3
  141. package/dist/operations/modeling/predicate-ranker.d.ts.map +1 -1
  142. package/dist/operations/modeling/predicate-ranker.js +4 -1
  143. package/dist/operations/modeling/predicate-types.d.ts +1 -1
  144. package/dist/operations/modeling/predicate-types.d.ts.map +1 -1
  145. package/dist/operations/modeling/predicate-usage-hints-4.d.ts +3 -0
  146. package/dist/operations/modeling/predicate-usage-hints-4.d.ts.map +1 -0
  147. package/dist/operations/modeling/predicate-usage-hints-4.js +84 -0
  148. package/dist/operations/modeling/suggest-predicates.d.ts +4 -2
  149. package/dist/operations/modeling/suggest-predicates.d.ts.map +1 -1
  150. package/dist/operations/modeling/suggest-predicates.js +82 -22
  151. package/dist/operations/mutation/contradictions.d.ts +2 -1
  152. package/dist/operations/mutation/contradictions.d.ts.map +1 -1
  153. package/dist/operations/mutation/contradictions.js +26 -5
  154. package/dist/operations/mutation/delete.d.ts +3 -0
  155. package/dist/operations/mutation/delete.d.ts.map +1 -1
  156. package/dist/operations/mutation/delete.js +100 -32
  157. package/dist/operations/mutation/relationships.d.ts +1 -0
  158. package/dist/operations/mutation/relationships.d.ts.map +1 -1
  159. package/dist/operations/mutation/relationships.js +6 -4
  160. package/dist/operations/mutation/saga.d.ts +51 -0
  161. package/dist/operations/mutation/saga.d.ts.map +1 -0
  162. package/dist/operations/mutation/saga.js +67 -0
  163. package/dist/operations/mutation/serialization.d.ts.map +1 -1
  164. package/dist/operations/mutation/serialization.js +3 -2
  165. package/dist/operations/mutation/source-authoring.d.ts +5 -1
  166. package/dist/operations/mutation/source-authoring.d.ts.map +1 -1
  167. package/dist/operations/mutation/source-authoring.js +79 -46
  168. package/dist/operations/mutation/strict-fact.d.ts +1 -0
  169. package/dist/operations/mutation/strict-fact.d.ts.map +1 -1
  170. package/dist/operations/mutation/strict-fact.js +8 -5
  171. package/dist/operations/mutation/symbol-compiler-lock.d.ts +5 -2
  172. package/dist/operations/mutation/symbol-compiler-lock.d.ts.map +1 -1
  173. package/dist/operations/mutation/symbol-compiler-lock.js +65 -2
  174. package/dist/operations/mutation/symbol-granularity.d.ts.map +1 -1
  175. package/dist/operations/mutation/symbol-granularity.js +11 -89
  176. package/dist/operations/mutation/symbol-refresh.d.ts +1 -0
  177. package/dist/operations/mutation/symbol-refresh.d.ts.map +1 -1
  178. package/dist/operations/mutation/symbol-refresh.js +10 -8
  179. package/dist/operations/mutation/upsert.d.ts +18 -2
  180. package/dist/operations/mutation/upsert.d.ts.map +1 -1
  181. package/dist/operations/mutation/upsert.js +86 -54
  182. package/dist/operations/mutation/validate-upsert.js +2 -2
  183. package/dist/operations/mutation/validation.d.ts.map +1 -1
  184. package/dist/operations/mutation/validation.js +46 -4
  185. package/dist/operations/mutation/warnings.d.ts +1 -0
  186. package/dist/operations/mutation/warnings.d.ts.map +1 -1
  187. package/dist/operations/mutation/warnings.js +7 -5
  188. package/dist/operations/mutation/workspace-mutation-lock.d.ts +60 -0
  189. package/dist/operations/mutation/workspace-mutation-lock.d.ts.map +1 -0
  190. package/dist/operations/mutation/workspace-mutation-lock.js +362 -0
  191. package/dist/operations/planning/apply-plan.d.ts +8 -106
  192. package/dist/operations/planning/apply-plan.d.ts.map +1 -1
  193. package/dist/operations/planning/apply-plan.js +113 -36
  194. package/dist/operations/planning/compile-intent.d.ts +51 -0
  195. package/dist/operations/planning/compile-intent.d.ts.map +1 -1
  196. package/dist/operations/planning/compile-intent.js +133 -17
  197. package/dist/operations/proof/baseline-diff.d.ts +41 -0
  198. package/dist/operations/proof/baseline-diff.d.ts.map +1 -0
  199. package/dist/operations/proof/baseline-diff.js +153 -0
  200. package/dist/operations/proof/explain.d.ts +75 -0
  201. package/dist/operations/proof/explain.d.ts.map +1 -0
  202. package/dist/operations/proof/explain.js +294 -0
  203. package/dist/operations/proof/impact.d.ts +45 -0
  204. package/dist/operations/proof/impact.d.ts.map +1 -0
  205. package/dist/operations/proof/impact.js +118 -0
  206. package/dist/operations/proof/ingest-proof.d.ts +34 -0
  207. package/dist/operations/proof/ingest-proof.d.ts.map +1 -0
  208. package/dist/operations/proof/ingest-proof.js +348 -0
  209. package/dist/operations/proof/migrate-legacy-receipts.d.ts +30 -0
  210. package/dist/operations/proof/migrate-legacy-receipts.d.ts.map +1 -0
  211. package/dist/operations/proof/migrate-legacy-receipts.js +92 -0
  212. package/dist/operations/proof/prune-receipts.d.ts +35 -0
  213. package/dist/operations/proof/prune-receipts.d.ts.map +1 -0
  214. package/dist/operations/proof/prune-receipts.js +91 -0
  215. package/dist/operations/proof/receipt-document.d.ts +29 -0
  216. package/dist/operations/proof/receipt-document.d.ts.map +1 -0
  217. package/dist/operations/proof/receipt-document.js +117 -0
  218. package/dist/operations/semantic-advisor/analysis-receipt.d.ts.map +1 -1
  219. package/dist/operations/semantic-advisor/analysis-receipt.js +3 -9
  220. package/dist/operations/semantic-advisor/analyze-prose.d.ts +1 -0
  221. package/dist/operations/semantic-advisor/analyze-prose.d.ts.map +1 -1
  222. package/dist/operations/semantic-advisor/analyze-prose.js +64 -93
  223. package/dist/operations/semantic-advisor/clauses.d.ts.map +1 -1
  224. package/dist/operations/semantic-advisor/clauses.js +20 -7
  225. package/dist/operations/semantic-advisor/plugin-orchestration.d.ts +63 -0
  226. package/dist/operations/semantic-advisor/plugin-orchestration.d.ts.map +1 -0
  227. package/dist/operations/semantic-advisor/plugin-orchestration.js +489 -0
  228. package/dist/operations/semantic-advisor/predicate-rules-core.d.ts +15 -2
  229. package/dist/operations/semantic-advisor/predicate-rules-core.d.ts.map +1 -1
  230. package/dist/operations/semantic-advisor/predicate-rules-core.js +7 -140
  231. package/dist/operations/semantic-advisor/predicate-rules-launcher.d.ts +11 -12
  232. package/dist/operations/semantic-advisor/predicate-rules-launcher.d.ts.map +1 -1
  233. package/dist/operations/semantic-advisor/predicate-rules-launcher.js +6 -94
  234. package/dist/operations/semantic-advisor/predicate-rules-policy.d.ts +16 -0
  235. package/dist/operations/semantic-advisor/predicate-rules-policy.d.ts.map +1 -1
  236. package/dist/operations/semantic-advisor/predicate-rules-policy.js +7 -150
  237. package/dist/operations/semantic-advisor/predicate-rules-product-tail.d.ts +9 -0
  238. package/dist/operations/semantic-advisor/predicate-rules-product-tail.d.ts.map +1 -1
  239. package/dist/operations/semantic-advisor/predicate-rules-product-tail.js +7 -102
  240. package/dist/operations/semantic-advisor/predicate-rules-product.d.ts +13 -0
  241. package/dist/operations/semantic-advisor/predicate-rules-product.d.ts.map +1 -1
  242. package/dist/operations/semantic-advisor/predicate-rules-product.js +7 -133
  243. package/dist/operations/semantic-advisor/strict-count-rules.d.ts +2 -0
  244. package/dist/operations/semantic-advisor/strict-count-rules.d.ts.map +1 -1
  245. package/dist/operations/semantic-advisor/strict-count-rules.js +40 -25
  246. package/dist/operations/semantic-advisor/types.d.ts +1 -0
  247. package/dist/operations/semantic-advisor/types.d.ts.map +1 -1
  248. package/dist/plugins/compose-ontology-packs.d.ts +51 -0
  249. package/dist/plugins/compose-ontology-packs.d.ts.map +1 -0
  250. package/dist/plugins/compose-ontology-packs.js +257 -0
  251. package/dist/plugins/compose-semantic-classifier.d.ts +42 -0
  252. package/dist/plugins/compose-semantic-classifier.d.ts.map +1 -0
  253. package/dist/plugins/compose-semantic-classifier.js +211 -0
  254. package/dist/plugins/external-allowlist.d.ts +10 -0
  255. package/dist/plugins/external-allowlist.d.ts.map +1 -0
  256. package/dist/plugins/external-allowlist.js +16 -0
  257. package/dist/plugins/index.d.ts +9 -0
  258. package/dist/plugins/index.d.ts.map +1 -0
  259. package/dist/plugins/index.js +33 -0
  260. package/dist/plugins/load-plugin.d.ts +19 -0
  261. package/dist/plugins/load-plugin.d.ts.map +1 -0
  262. package/dist/plugins/load-plugin.js +59 -0
  263. package/dist/plugins/project-config.d.ts +28 -0
  264. package/dist/plugins/project-config.d.ts.map +1 -0
  265. package/dist/plugins/project-config.js +90 -0
  266. package/dist/plugins/registry.d.ts +93 -0
  267. package/dist/plugins/registry.d.ts.map +1 -0
  268. package/dist/plugins/registry.js +338 -0
  269. package/dist/plugins/resolve-package.d.ts +47 -0
  270. package/dist/plugins/resolve-package.d.ts.map +1 -0
  271. package/dist/plugins/resolve-package.js +262 -0
  272. package/dist/plugins/source-analysis-service.d.ts +44 -0
  273. package/dist/plugins/source-analysis-service.d.ts.map +1 -0
  274. package/dist/plugins/source-analysis-service.js +232 -0
  275. package/dist/prolog/codec.d.ts +13 -1
  276. package/dist/prolog/codec.d.ts.map +1 -1
  277. package/dist/prolog/codec.js +269 -154
  278. package/dist/prolog/error-terms.d.ts +47 -0
  279. package/dist/prolog/error-terms.d.ts.map +1 -0
  280. package/dist/prolog/error-terms.js +334 -0
  281. package/dist/prolog/janitor.d.ts +50 -0
  282. package/dist/prolog/janitor.d.ts.map +1 -0
  283. package/dist/prolog/janitor.js +154 -0
  284. package/dist/prolog/store-lock.d.ts +45 -0
  285. package/dist/prolog/store-lock.d.ts.map +1 -0
  286. package/dist/prolog/store-lock.js +195 -0
  287. package/dist/prolog.d.ts +7 -0
  288. package/dist/prolog.d.ts.map +1 -1
  289. package/dist/prolog.js +55 -17
  290. package/dist/proof/evaluate.d.ts +27 -0
  291. package/dist/proof/evaluate.d.ts.map +1 -0
  292. package/dist/proof/evaluate.js +151 -0
  293. package/dist/proof/inspect.d.ts +12 -0
  294. package/dist/proof/inspect.d.ts.map +1 -0
  295. package/dist/proof/inspect.js +236 -0
  296. package/dist/proof/integrations.d.ts +35 -0
  297. package/dist/proof/integrations.d.ts.map +1 -0
  298. package/dist/proof/integrations.js +123 -0
  299. package/dist/proof/producers/junit-adapter.d.ts +26 -0
  300. package/dist/proof/producers/junit-adapter.d.ts.map +1 -0
  301. package/dist/proof/producers/junit-adapter.js +186 -0
  302. package/dist/{public → proof/producers}/playwright-case-id.d.ts +1 -1
  303. package/dist/proof/producers/playwright-case-id.d.ts.map +1 -0
  304. package/dist/{public → proof/producers}/playwright-case-id.js +1 -1
  305. package/dist/proof/producers/playwright-reporter.d.ts +27 -0
  306. package/dist/proof/producers/playwright-reporter.d.ts.map +1 -0
  307. package/dist/proof/producers/playwright-reporter.js +138 -0
  308. package/dist/proof/producers/tap-adapter.d.ts +10 -0
  309. package/dist/proof/producers/tap-adapter.d.ts.map +1 -0
  310. package/dist/proof/producers/tap-adapter.js +200 -0
  311. package/dist/proof/receipt-outcome.d.ts +2 -0
  312. package/dist/proof/receipt-outcome.d.ts.map +1 -0
  313. package/dist/proof/receipt-outcome.js +1 -0
  314. package/dist/public/diagnostic-usage.js +6 -6
  315. package/dist/public/distribution-parity.d.ts +7 -1
  316. package/dist/public/distribution-parity.d.ts.map +1 -1
  317. package/dist/public/distribution-parity.js +15 -10
  318. package/dist/public/extractors/symbols-coordinator.d.ts +1 -1
  319. package/dist/public/extractors/symbols-coordinator.d.ts.map +1 -1
  320. package/dist/public/extractors/symbols-coordinator.js +1 -1
  321. package/dist/public/impact/analyzer.d.ts +1 -1
  322. package/dist/public/impact/analyzer.d.ts.map +1 -1
  323. package/dist/public/impact/analyzer.js +6 -4
  324. package/dist/public/impact/coverage-depth-quality.d.ts +1 -0
  325. package/dist/public/impact/coverage-depth-quality.d.ts.map +1 -1
  326. package/dist/public/impact/coverage-depth-quality.js +1 -1
  327. package/dist/public/impact/diagnostics.d.ts.map +1 -1
  328. package/dist/public/impact/diagnostics.js +2 -2
  329. package/dist/public/impact/diff-meaning.d.ts +1 -0
  330. package/dist/public/impact/diff-meaning.d.ts.map +1 -1
  331. package/dist/public/impact/diff-meaning.js +5 -2
  332. package/dist/public/impact/full-kb-quality.d.ts +5 -2
  333. package/dist/public/impact/full-kb-quality.d.ts.map +1 -1
  334. package/dist/public/impact/full-kb-quality.js +329 -64
  335. package/dist/public/operations/catalog.d.ts +450 -196
  336. package/dist/public/operations/catalog.d.ts.map +1 -1
  337. package/dist/public/operations/catalog.js +6 -4
  338. package/dist/public/operations/check-executor.d.ts.map +1 -1
  339. package/dist/public/operations/check-executor.js +4 -8
  340. package/dist/public/operations/check-helpers.d.ts +1 -1
  341. package/dist/public/operations/check-helpers.d.ts.map +1 -1
  342. package/dist/public/operations/check-helpers.js +1 -1
  343. package/dist/public/operations/contracts.d.ts +7 -0
  344. package/dist/public/operations/contracts.d.ts.map +1 -1
  345. package/dist/public/operations/contracts.js +66 -34
  346. package/dist/public/operations/discovery-entities.d.ts +15 -0
  347. package/dist/public/operations/discovery-entities.d.ts.map +1 -1
  348. package/dist/public/operations/discovery-entities.js +38 -0
  349. package/dist/public/operations/discovery-executors.d.ts +9 -9
  350. package/dist/public/operations/discovery-executors.d.ts.map +1 -1
  351. package/dist/public/operations/discovery-executors.js +39 -31
  352. package/dist/public/operations/index.d.ts +1 -1
  353. package/dist/public/operations/index.d.ts.map +1 -1
  354. package/dist/public/operations/index.js +1 -1
  355. package/dist/public/operations/migration-plan.d.ts +4 -3
  356. package/dist/public/operations/migration-plan.d.ts.map +1 -1
  357. package/dist/public/operations/migration-plan.js +23 -21
  358. package/dist/public/operations/node-ports.js +6 -6
  359. package/dist/public/operations/prolog-json.d.ts +1 -1
  360. package/dist/public/operations/prolog-json.d.ts.map +1 -1
  361. package/dist/public/operations/prolog-json.js +7 -7
  362. package/dist/public/operations/repair-plan.d.ts +3 -3
  363. package/dist/public/operations/repair-plan.d.ts.map +1 -1
  364. package/dist/public/operations/repair-plan.js +49 -19
  365. package/dist/public/operations/result-envelope.d.ts +1 -0
  366. package/dist/public/operations/result-envelope.d.ts.map +1 -1
  367. package/dist/public/operations/result-envelope.js +12 -10
  368. package/dist/public/operations/runtime-types.d.ts +21 -1
  369. package/dist/public/operations/runtime-types.d.ts.map +1 -1
  370. package/dist/public/operations/specs/check-rules.generated.d.ts +5 -0
  371. package/dist/public/operations/specs/check-rules.generated.d.ts.map +1 -0
  372. package/dist/public/operations/specs/check-rules.generated.js +35 -0
  373. package/dist/public/operations/specs/check.d.ts +7 -2
  374. package/dist/public/operations/specs/check.d.ts.map +1 -1
  375. package/dist/public/operations/specs/check.js +8 -20
  376. package/dist/public/operations/specs/discovery.d.ts +3 -0
  377. package/dist/public/operations/specs/discovery.d.ts.map +1 -1
  378. package/dist/public/operations/specs/discovery.js +3 -0
  379. package/dist/public/operations/specs/mutation-schemas.d.ts +257 -163
  380. package/dist/public/operations/specs/mutation-schemas.d.ts.map +1 -1
  381. package/dist/public/operations/specs/mutation-schemas.js +15 -7
  382. package/dist/public/operations/specs/planning.d.ts +9 -0
  383. package/dist/public/operations/specs/planning.d.ts.map +1 -1
  384. package/dist/public/operations/specs/planning.js +6 -0
  385. package/dist/public/operations/specs/proof.d.ts +212 -0
  386. package/dist/public/operations/specs/proof.d.ts.map +1 -0
  387. package/dist/public/operations/specs/proof.js +30 -0
  388. package/dist/public/operations/specs/reporting.d.ts +20 -0
  389. package/dist/public/operations/specs/reporting.d.ts.map +1 -1
  390. package/dist/public/operations/specs/reporting.js +112 -12
  391. package/dist/public/operations/specs/semantic.d.ts +1 -1
  392. package/dist/public/operations/specs/semantic.d.ts.map +1 -1
  393. package/dist/public/operations/specs/semantic.js +54 -4
  394. package/dist/public/operations/specs/upsert.d.ts +257 -163
  395. package/dist/public/operations/specs/upsert.d.ts.map +1 -1
  396. package/dist/public/operations/symbol-repair-plan.d.ts +11 -0
  397. package/dist/public/operations/symbol-repair-plan.d.ts.map +1 -1
  398. package/dist/public/operations/symbol-repair-plan.js +121 -4
  399. package/dist/public/operations/types.d.ts +6 -1
  400. package/dist/public/operations/types.d.ts.map +1 -1
  401. package/dist/public/proof-fingerprint.d.ts +54 -0
  402. package/dist/public/proof-fingerprint.d.ts.map +1 -0
  403. package/dist/public/proof-fingerprint.js +141 -0
  404. package/dist/public/proof-protocol.d.ts +354 -0
  405. package/dist/public/proof-protocol.d.ts.map +1 -0
  406. package/dist/public/proof-protocol.js +454 -0
  407. package/dist/public/proof-receipt.d.ts +279 -0
  408. package/dist/public/proof-receipt.d.ts.map +1 -0
  409. package/dist/public/proof-receipt.js +377 -0
  410. package/dist/public/schemas/entity.d.ts.map +1 -1
  411. package/dist/public/schemas/entity.js +21 -7
  412. package/dist/public/skills/kibi-freshness/SKILL.md +1 -1
  413. package/dist/public/skills/kibi-usage/SKILL.md +44 -12
  414. package/dist/public/skills/kibi-usage/resources/operation-access.md +1 -1
  415. package/dist/public/skills/kibi-usage/resources/proof.md +150 -0
  416. package/dist/public/skills/kibi-usage/resources/workflows.md +6 -6
  417. package/dist/public/symbol-granularity.d.ts +3 -14
  418. package/dist/public/symbol-granularity.d.ts.map +1 -1
  419. package/dist/public/symbol-granularity.generated.d.ts +16 -0
  420. package/dist/public/symbol-granularity.generated.d.ts.map +1 -0
  421. package/dist/public/symbol-granularity.generated.js +53 -0
  422. package/dist/public/symbol-granularity.js +6 -47
  423. package/dist/public/telemetry-acceptance.d.ts +3 -77
  424. package/dist/public/telemetry-acceptance.d.ts.map +1 -1
  425. package/dist/public/telemetry-acceptance.js +4 -2
  426. package/dist/public/telemetry-remediation.js +1 -1
  427. package/dist/report/html-report.css +1240 -0
  428. package/dist/report/html-report.d.ts +4 -2
  429. package/dist/report/html-report.d.ts.map +1 -1
  430. package/dist/report/html-report.js +37 -300
  431. package/dist/runtime/cli-runtime.d.ts +2 -0
  432. package/dist/runtime/cli-runtime.d.ts.map +1 -1
  433. package/dist/runtime/cli-runtime.js +32 -7
  434. package/dist/schemas/entity.schema.json +355 -215
  435. package/dist/search-ranking.d.ts +1 -0
  436. package/dist/search-ranking.d.ts.map +1 -1
  437. package/dist/search-ranking.js +3 -0
  438. package/dist/traceability/evidence-model.d.ts +28 -0
  439. package/dist/traceability/evidence-model.d.ts.map +1 -1
  440. package/dist/traceability/git-staged.d.ts +20 -0
  441. package/dist/traceability/git-staged.d.ts.map +1 -1
  442. package/dist/traceability/git-staged.js +145 -1
  443. package/dist/traceability/staged-diagnostics.d.ts +7 -0
  444. package/dist/traceability/staged-diagnostics.d.ts.map +1 -1
  445. package/dist/traceability/staged-diagnostics.js +78 -7
  446. package/dist/traceability/staged-file-coverage.d.ts +33 -0
  447. package/dist/traceability/staged-file-coverage.d.ts.map +1 -0
  448. package/dist/traceability/staged-file-coverage.js +284 -0
  449. package/dist/traceability/staged-impact-contract.js +4 -4
  450. package/dist/traceability/staged-symbols-manifest.d.ts +13 -0
  451. package/dist/traceability/staged-symbols-manifest.d.ts.map +1 -1
  452. package/dist/traceability/staged-symbols-manifest.js +138 -27
  453. package/dist/traceability/symbol-extract.d.ts +24 -2
  454. package/dist/traceability/symbol-extract.d.ts.map +1 -1
  455. package/dist/traceability/symbol-extract.js +64 -208
  456. package/dist/traceability/temp-kb.d.ts +2 -0
  457. package/dist/traceability/temp-kb.d.ts.map +1 -1
  458. package/dist/traceability/temp-kb.js +13 -4
  459. package/dist/types/entities.d.ts +5 -3
  460. package/dist/types/entities.d.ts.map +1 -1
  461. package/dist/utils/branch-resolver.d.ts +1 -0
  462. package/dist/utils/branch-resolver.d.ts.map +1 -1
  463. package/dist/utils/branch-resolver.js +7 -4
  464. package/dist/utils/branch-store.d.ts +6 -0
  465. package/dist/utils/branch-store.d.ts.map +1 -1
  466. package/dist/utils/branch-store.js +27 -0
  467. package/dist/utils/kb-paths.d.ts +1 -1
  468. package/dist/utils/kb-paths.d.ts.map +1 -1
  469. package/dist/utils/kb-paths.js +1 -1
  470. package/dist/utils/rule-registry.d.ts +1 -11
  471. package/dist/utils/rule-registry.d.ts.map +1 -1
  472. package/dist/utils/rule-registry.generated.d.ts +102 -0
  473. package/dist/utils/rule-registry.generated.d.ts.map +1 -0
  474. package/dist/utils/rule-registry.generated.js +131 -0
  475. package/dist/utils/rule-registry.js +12 -113
  476. package/dist/utils/strict-modeling.d.ts +1 -0
  477. package/dist/utils/strict-modeling.d.ts.map +1 -1
  478. package/dist/utils/strict-modeling.js +1 -1
  479. package/package.json +20 -20
  480. package/src/public/diagnostic-usage.ts +6 -6
  481. package/src/public/distribution-parity.ts +17 -10
  482. package/src/public/extractors/symbols-coordinator.ts +1 -0
  483. package/src/public/impact/analyzer.ts +15 -12
  484. package/src/public/impact/coverage-depth-quality.ts +1 -1
  485. package/src/public/impact/diagnostics.ts +2 -1
  486. package/src/public/impact/diff-meaning.ts +11 -4
  487. package/src/public/impact/full-kb-quality.ts +463 -72
  488. package/src/public/operations/catalog.ts +10 -4
  489. package/src/public/operations/check-executor.ts +4 -8
  490. package/src/public/operations/check-helpers.ts +2 -2
  491. package/src/public/operations/contracts.ts +78 -34
  492. package/src/public/operations/discovery-entities.ts +53 -0
  493. package/src/public/operations/discovery-executors.ts +64 -48
  494. package/src/public/operations/index.ts +1 -1
  495. package/src/public/operations/migration-plan.ts +32 -25
  496. package/src/public/operations/node-ports.ts +6 -6
  497. package/src/public/operations/prolog-json.ts +13 -5
  498. package/src/public/operations/repair-plan.ts +60 -23
  499. package/src/public/operations/result-envelope.ts +15 -10
  500. package/src/public/operations/runtime-types.ts +26 -2
  501. package/src/public/operations/specs/check-rules.generated.ts +38 -0
  502. package/src/public/operations/specs/check.ts +12 -21
  503. package/src/public/operations/specs/discovery.ts +3 -0
  504. package/src/public/operations/specs/mutation-schemas.ts +22 -9
  505. package/src/public/operations/specs/planning.ts +7 -0
  506. package/src/public/operations/specs/proof.ts +43 -0
  507. package/src/public/operations/specs/reporting.ts +140 -13
  508. package/src/public/operations/specs/semantic.ts +79 -17
  509. package/src/public/operations/symbol-repair-plan.ts +166 -7
  510. package/src/public/operations/types.ts +6 -1
  511. package/src/public/proof-fingerprint.ts +216 -0
  512. package/src/public/proof-protocol-types.d.ts +96 -0
  513. package/src/public/proof-protocol.ts +589 -0
  514. package/src/public/proof-receipt.ts +499 -0
  515. package/src/public/schemas/entity.ts +26 -10
  516. package/src/public/skills/kibi-freshness/SKILL.md +1 -1
  517. package/src/public/skills/kibi-usage/SKILL.md +44 -12
  518. package/src/public/skills/kibi-usage/resources/operation-access.md +1 -1
  519. package/src/public/skills/kibi-usage/resources/proof.md +150 -0
  520. package/src/public/skills/kibi-usage/resources/workflows.md +6 -6
  521. package/src/public/symbol-granularity.generated.ts +74 -0
  522. package/src/public/symbol-granularity.ts +34 -59
  523. package/src/public/telemetry-acceptance-types.d.ts +98 -0
  524. package/src/public/telemetry-acceptance.ts +22 -100
  525. package/src/public/telemetry-remediation.ts +1 -1
  526. package/src/schemas/entity.schema.json +355 -215
  527. package/dist/cli-register-verification.d.ts +0 -3
  528. package/dist/cli-register-verification.d.ts.map +0 -1
  529. package/dist/cli-register-verification.js +0 -16
  530. package/dist/commands/verify.d.ts +0 -10
  531. package/dist/commands/verify.d.ts.map +0 -1
  532. package/dist/commands/verify.js +0 -126
  533. package/dist/operations/verification/ingest-verification.d.ts +0 -29
  534. package/dist/operations/verification/ingest-verification.d.ts.map +0 -1
  535. package/dist/operations/verification/ingest-verification.js +0 -192
  536. package/dist/public/operations/specs/verification.d.ts +0 -78
  537. package/dist/public/operations/specs/verification.d.ts.map +0 -1
  538. package/dist/public/operations/specs/verification.js +0 -62
  539. package/dist/public/playwright-case-id.d.ts.map +0 -1
  540. package/dist/public/verification-receipt.d.ts +0 -242
  541. package/dist/public/verification-receipt.d.ts.map +0 -1
  542. package/dist/public/verification-receipt.js +0 -296
  543. package/dist/verification/playwright-reporter.d.ts +0 -21
  544. package/dist/verification/playwright-reporter.d.ts.map +0 -1
  545. package/dist/verification/playwright-reporter.js +0 -114
  546. package/src/public/operations/specs/verification.ts +0 -78
  547. package/src/public/playwright-case-id.ts +0 -35
  548. package/src/public/verification-receipt.ts +0 -412
package/dist/engine.js CHANGED
@@ -14,8 +14,9 @@ import * as path from "node:path";
14
14
  import { fileURLToPath } from "node:url";
15
15
  import { PrologProcess, resolveKbPlPath } from "./prolog.js";
16
16
  import { parseEntityFromList, parseListOfLists } from "./prolog/codec.js";
17
+ import { retryAttachAfterBreakingStaleLock } from "./prolog/store-lock.js";
17
18
  import { isValidBranchName } from "./utils/branch-resolver.js";
18
- import { ensureBranchStoreManifest } from "./utils/branch-store-locator.js";
19
+ import { branchStorePath, ensureBranchStoreManifest, } from "./utils/branch-store-locator.js";
19
20
  export const ENGINE_PROTOCOL_VERSION = 1;
20
21
  export const ENGINE_IDLE_TIMEOUT_MS = 10 * 60 * 1000;
21
22
  export const ENGINE_PACKAGE_VERSIONS = process.env.KIBI_PACKAGE_VERSIONS ?? "unknown";
@@ -23,12 +24,95 @@ const ENGINE_QUERY_CACHE_MAX_ENTRIES = 128;
23
24
  const ENGINE_QUERY_CACHE_MAX_RESULT_BYTES = 8 * 1024 * 1024;
24
25
  const ENGINE_FRESHNESS_CACHE_MS = 100;
25
26
  const ENGINE_PUBLICATION_LOCK_STALE_MS = 5_000;
27
+ const ENGINE_WORKSPACE_WATCHDOG_MS = 30_000;
28
+ export function requestEngineSignalShutdown(shutdown) {
29
+ return () => {
30
+ void shutdown();
31
+ };
32
+ }
33
+ export function readJournalGeneration(branchPath) {
34
+ // implements REQ-core-journaled-engine-persistence
35
+ const currentPath = path.join(branchPath, "CURRENT");
36
+ if (!existsSync(currentPath))
37
+ return "";
38
+ return readFileSync(currentPath, "utf8").trim();
39
+ }
40
+ export function readEngineAttachmentIdentity(branchPath) {
41
+ // implements REQ-core-journaled-engine-persistence
42
+ if (!existsSync(branchPath))
43
+ return null;
44
+ const stats = statSync(branchPath);
45
+ let resolved = path.resolve(branchPath);
46
+ try {
47
+ resolved = realpathSync(branchPath);
48
+ }
49
+ catch {
50
+ // The live path may be replaced between stat and realpath.
51
+ }
52
+ return {
53
+ path: resolved,
54
+ generation: readJournalGeneration(branchPath),
55
+ dev: stats.dev,
56
+ ino: stats.ino,
57
+ };
58
+ }
59
+ export function parseEngineAttachmentIdentity(statusJson) {
60
+ // implements REQ-core-journaled-engine-persistence
61
+ if (statusJson === undefined)
62
+ return null;
63
+ try {
64
+ const decoded = JSON.parse(JSON.parse(statusJson));
65
+ if (typeof decoded.attachedPath !== "string" ||
66
+ typeof decoded.attachedGeneration !== "string" ||
67
+ typeof decoded.attachedDev !== "number" ||
68
+ typeof decoded.attachedIno !== "number") {
69
+ return null;
70
+ }
71
+ return {
72
+ path: decoded.attachedPath,
73
+ generation: decoded.attachedGeneration,
74
+ dev: decoded.attachedDev,
75
+ ino: decoded.attachedIno,
76
+ };
77
+ }
78
+ catch {
79
+ return null;
80
+ }
81
+ }
82
+ export function engineAttachmentsMatch(expected, attached) {
83
+ // implements REQ-core-journaled-engine-persistence
84
+ if (expected === null || attached === null)
85
+ return false;
86
+ if (expected.path !== attached.path)
87
+ return false;
88
+ if (expected.ino !== 0 && attached.ino !== 0) {
89
+ return expected.dev === attached.dev && expected.ino === attached.ino;
90
+ }
91
+ return (expected.generation.length > 0 &&
92
+ expected.generation === attached.generation);
93
+ }
94
+ export function formatEngineAttachmentMismatch(operation, expected, attached) {
95
+ // implements REQ-core-journaled-engine-persistence
96
+ return [
97
+ `operation=${operation}`,
98
+ `branchStore=${expected?.path ?? "missing"}`,
99
+ `expectedGeneration=${expected?.generation || "missing"}`,
100
+ `attachedPath=${attached?.path ?? "missing"}`,
101
+ `attachedGeneration=${attached?.generation || "missing"}`,
102
+ ].join(" ");
103
+ }
26
104
  function engineIdleTimeoutMs() {
27
105
  const configured = Number.parseInt(process.env.KIBI_ENGINE_IDLE_TIMEOUT_MS ?? "", 10);
28
106
  return Number.isFinite(configured) && configured >= 100
29
107
  ? configured
30
108
  : ENGINE_IDLE_TIMEOUT_MS;
31
109
  }
110
+ function engineWorkspaceWatchdogMs() {
111
+ const configured = Number.parseInt(process.env.KIBI_ENGINE_WORKSPACE_WATCHDOG_MS ?? "", 10);
112
+ return Number.isFinite(configured) && configured >= 100
113
+ ? configured
114
+ : ENGINE_WORKSPACE_WATCHDOG_MS;
115
+ }
32
116
  function quoteProlog(value) {
33
117
  return value.replaceAll("'", "''");
34
118
  }
@@ -162,7 +246,7 @@ function parseFrames(buffer, onFrame) {
162
246
  }
163
247
  return buffer.subarray(cursor);
164
248
  }
165
- function runtimeDirectory() {
249
+ export function runtimeDirectory() {
166
250
  const configured = process.env.KIBI_RUNTIME_DIR ??
167
251
  process.env.XDG_RUNTIME_DIR ??
168
252
  path.join(os.tmpdir(), "kibi-runtime");
@@ -577,6 +661,7 @@ export class EngineClient {
577
661
  pending = new Map();
578
662
  requestTail = Promise.resolve();
579
663
  lastResult = null;
664
+ replacingStaleDaemon = false;
580
665
  constructor(options) {
581
666
  if (!isValidBranchName(options.branch)) {
582
667
  throw new Error(`Invalid Kibi engine branch name: ${options.branch}`);
@@ -593,6 +678,13 @@ export class EngineClient {
593
678
  this.allowPublicationLock = options.allowPublicationLock ?? false;
594
679
  }
595
680
  async start(allowSpawn = true) {
681
+ const wasConnected = this.socket !== null && !this.socket.destroyed;
682
+ await this.connect(allowSpawn);
683
+ if (!wasConnected && this.socket !== null) {
684
+ await this.reconcileAttachment();
685
+ }
686
+ }
687
+ async connect(allowSpawn = true) {
596
688
  if (this.socket !== null && !this.socket.destroyed)
597
689
  return;
598
690
  const socketPath = engineSocketPath(this.workspaceRoot, this.branch);
@@ -691,16 +783,26 @@ export class EngineClient {
691
783
  socket.on("close", () => {
692
784
  this.socket = null;
693
785
  const error = new Error("Kibi engine connection closed");
694
- for (const pending of this.pending.values())
695
- pending.reject(error);
786
+ for (const pending of this.pending.values()) {
787
+ this.settlePending(pending, () => pending.reject(error));
788
+ }
696
789
  this.pending.clear();
697
790
  });
698
791
  socket.on("error", (error) => {
699
- for (const pending of this.pending.values())
700
- pending.reject(error);
792
+ for (const pending of this.pending.values()) {
793
+ this.settlePending(pending, () => pending.reject(error));
794
+ }
701
795
  this.pending.clear();
702
796
  });
703
797
  }
798
+ /** Settle a pending RPC at most once (abort vs response race-safe). */
799
+ settlePending(pending, settle) {
800
+ if (pending.settled)
801
+ return false;
802
+ pending.settled = true;
803
+ settle();
804
+ return true;
805
+ }
704
806
  handleResponse(value) {
705
807
  if (value === null || typeof value !== "object")
706
808
  return;
@@ -711,55 +813,20 @@ export class EngineClient {
711
813
  if (!pending)
712
814
  return;
713
815
  this.pending.delete(response.id);
714
- if (response.ok)
715
- pending.resolve(response.result);
716
- else
717
- pending.reject(new Error(response.error ?? "Kibi engine request failed"));
816
+ if (response.ok) {
817
+ this.settlePending(pending, () => pending.resolve(response.result));
818
+ }
819
+ else {
820
+ this.settlePending(pending, () => pending.reject(new Error(response.error ?? "Kibi engine request failed")));
821
+ }
718
822
  }
719
823
  async request(request, signal) {
824
+ // Connect/reconcile before taking the client queue. Holding requestTail
825
+ // across start()→reconcileAttachment()→queryStatusJson() deadlocks because
826
+ // that nested status RPC needs the same queue (see command-first clients).
720
827
  await this.start();
721
- const socket = this.socket;
722
- if (socket === null || socket.destroyed)
723
- throw new Error("Kibi engine is not connected");
724
- const id = ++this.requestId;
725
- const result = new Promise((resolve, reject) => {
726
- this.pending.set(id, {
727
- resolve: resolve,
728
- reject,
729
- });
730
- try {
731
- socket.write(frame({
732
- ...request,
733
- id,
734
- protocolVersion: ENGINE_PROTOCOL_VERSION,
735
- packageVersions: ENGINE_PACKAGE_VERSIONS,
736
- workspaceRoot: this.workspaceRoot,
737
- branch: this.branch,
738
- }));
739
- }
740
- catch (error) {
741
- this.pending.delete(id);
742
- reject(error instanceof Error ? error : new Error(String(error)));
743
- return;
744
- }
745
- if (signal !== undefined) {
746
- const abort = () => {
747
- if (!this.pending.has(id))
748
- return;
749
- this.pending.delete(id);
750
- this.cancel(id);
751
- reject(new Error("Kibi engine request cancelled"));
752
- };
753
- if (signal.aborted)
754
- abort();
755
- else
756
- signal.addEventListener("abort", abort, { once: true });
757
- }
758
- });
759
- return result;
760
- }
761
- async query(goal, signal) {
762
- let result;
828
+ // Serialize query and command frames on one socket so concurrent MCP
829
+ // traffic cannot interleave length-prefixed writes/responses.
763
830
  const previous = this.requestTail;
764
831
  let release;
765
832
  this.requestTail = new Promise((resolve) => {
@@ -767,14 +834,59 @@ export class EngineClient {
767
834
  });
768
835
  await previous;
769
836
  try {
770
- result = await this.request({ method: "query", goal }, signal);
771
- this.lastResult = result;
772
- return result;
837
+ const socket = this.socket;
838
+ if (socket === null || socket.destroyed)
839
+ throw new Error("Kibi engine is not connected");
840
+ const id = ++this.requestId;
841
+ return await new Promise((resolve, reject) => {
842
+ this.pending.set(id, {
843
+ resolve: resolve,
844
+ reject,
845
+ settled: false,
846
+ });
847
+ try {
848
+ socket.write(frame({
849
+ ...request,
850
+ id,
851
+ protocolVersion: ENGINE_PROTOCOL_VERSION,
852
+ packageVersions: ENGINE_PACKAGE_VERSIONS,
853
+ workspaceRoot: this.workspaceRoot,
854
+ branch: this.branch,
855
+ }));
856
+ }
857
+ catch (error) {
858
+ const pending = this.pending.get(id);
859
+ this.pending.delete(id);
860
+ if (pending) {
861
+ this.settlePending(pending, () => reject(error instanceof Error ? error : new Error(String(error))));
862
+ }
863
+ return;
864
+ }
865
+ if (signal !== undefined) {
866
+ const abort = () => {
867
+ const pending = this.pending.get(id);
868
+ if (!pending || pending.settled)
869
+ return;
870
+ this.pending.delete(id);
871
+ this.cancel(id);
872
+ this.settlePending(pending, () => reject(new Error("Kibi engine request cancelled")));
873
+ };
874
+ if (signal.aborted)
875
+ abort();
876
+ else
877
+ signal.addEventListener("abort", abort, { once: true });
878
+ }
879
+ });
773
880
  }
774
881
  finally {
775
882
  release();
776
883
  }
777
884
  }
885
+ async query(goal, signal) {
886
+ const result = await this.request({ method: "query", goal }, signal);
887
+ this.lastResult = result;
888
+ return result;
889
+ }
778
890
  /** Execute a versioned, goal-free engine command. Raw query remains private
779
891
  * compatibility traffic for the in-process Prolog adapter only. */
780
892
  async command(command, signal) {
@@ -860,8 +972,8 @@ export class EngineClient {
860
972
  async checkpoint() {
861
973
  return this.command({ version: 1, kind: "checkpoint" });
862
974
  }
863
- async queryStatusJson() {
864
- return this.command({ version: 1, kind: "status" });
975
+ async queryStatusJson(signal) {
976
+ return this.command({ version: 1, kind: "status" }, signal);
865
977
  }
866
978
  async compact() {
867
979
  return this.command({ version: 1, kind: "compact" });
@@ -878,27 +990,36 @@ export class EngineClient {
878
990
  isRunning() {
879
991
  return this.socket !== null && !this.socket.destroyed;
880
992
  }
881
- getPid() {
882
- const pidPath = enginePidPath(this.workspaceRoot, this.branch);
993
+ async readAttachedIdentity() {
994
+ const status = await this.queryStatusJson();
995
+ if (!status.success)
996
+ return null;
997
+ return parseEngineAttachmentIdentity(status.bindings.JsonString);
998
+ }
999
+ async reconcileAttachment() {
1000
+ if (this.replacingStaleDaemon || this.socket === null)
1001
+ return;
1002
+ const livePath = branchStorePath(this.workspaceRoot, this.branch);
1003
+ const expected = readEngineAttachmentIdentity(livePath);
1004
+ const attached = await this.readAttachedIdentity();
1005
+ if (engineAttachmentsMatch(expected, attached))
1006
+ return;
1007
+ this.replacingStaleDaemon = true;
883
1008
  try {
884
- return Number.parseInt(readFileSync(pidPath, "utf8").trim(), 10) || 0;
1009
+ await this.shutdownConnectedDaemon();
1010
+ await this.connect(true);
1011
+ const live = readEngineAttachmentIdentity(livePath);
1012
+ const retried = await this.readAttachedIdentity();
1013
+ if (!engineAttachmentsMatch(live, retried)) {
1014
+ throw new Error(`Kibi engine is attached to a stale branch generation: ${formatEngineAttachmentMismatch("attachment-handshake", live, retried)}`);
1015
+ }
885
1016
  }
886
- catch {
887
- return 0;
1017
+ finally {
1018
+ this.replacingStaleDaemon = false;
888
1019
  }
889
1020
  }
890
- async stop(startIfMissing = true) {
1021
+ async shutdownConnectedDaemon() {
891
1022
  const socketPath = engineSocketPath(this.workspaceRoot, this.branch);
892
- if (!this.isRunning()) {
893
- try {
894
- await this.start(startIfMissing);
895
- }
896
- catch {
897
- if (!startIfMissing)
898
- return;
899
- throw new Error("Unable to start Kibi engine for stop request");
900
- }
901
- }
902
1023
  if (!this.isRunning()) {
903
1024
  if (existsSync(socketPath)) {
904
1025
  throw new Error(`Kibi engine socket remains present but is not reachable: ${socketPath}`);
@@ -914,9 +1035,6 @@ export class EngineClient {
914
1035
  }
915
1036
  this.socket?.destroy();
916
1037
  this.socket = null;
917
- // The daemon acknowledges stop before its SWI child has flushed and the
918
- // listening socket has closed. Do not let a following auto-start attach to
919
- // that half-shutdown process.
920
1038
  const deadline = Date.now() + 5_000;
921
1039
  while (existsSync(socketPath) && Date.now() < deadline) {
922
1040
  await new Promise((resolve) => setTimeout(resolve, 25));
@@ -926,6 +1044,35 @@ export class EngineClient {
926
1044
  throw new Error(`Kibi engine did not stop within 5 seconds${detail}`);
927
1045
  }
928
1046
  }
1047
+ getPid() {
1048
+ const pidPath = enginePidPath(this.workspaceRoot, this.branch);
1049
+ try {
1050
+ return Number.parseInt(readFileSync(pidPath, "utf8").trim(), 10) || 0;
1051
+ }
1052
+ catch {
1053
+ return 0;
1054
+ }
1055
+ }
1056
+ async stop(startIfMissing = true) {
1057
+ const socketPath = engineSocketPath(this.workspaceRoot, this.branch);
1058
+ if (!this.isRunning()) {
1059
+ try {
1060
+ await this.connect(startIfMissing);
1061
+ }
1062
+ catch {
1063
+ if (!startIfMissing)
1064
+ return;
1065
+ throw new Error("Unable to start Kibi engine for stop request");
1066
+ }
1067
+ }
1068
+ if (!this.isRunning()) {
1069
+ if (existsSync(socketPath)) {
1070
+ throw new Error(`Kibi engine socket remains present but is not reachable: ${socketPath}`);
1071
+ }
1072
+ return;
1073
+ }
1074
+ await this.shutdownConnectedDaemon();
1075
+ }
929
1076
  async terminate() {
930
1077
  // Closing a client connection releases the engine; the daemon remains
931
1078
  // available for other operations until its idle timeout expires.
@@ -1149,25 +1296,78 @@ export async function runEngineDaemon(options) {
1149
1296
  const prolog = new PrologProcess({ timeout: 120_000, oneShot: false });
1150
1297
  await prolog.start();
1151
1298
  const attached = await prolog.query(`kb_attach('${quoteProlog(branchPath)}')`);
1152
- if (!attached.success)
1153
- throw new Error(attached.error ?? "Failed to attach branch KB");
1154
- const statusModulePath = path.join(path.dirname(resolveKbPlPath()), "status.pl");
1155
- const statusLoaded = await prolog.query(`use_module('${quoteProlog(statusModulePath.replaceAll("\\", "/"))}')`);
1156
- if (!statusLoaded.success) {
1157
- throw new Error(statusLoaded.error ?? "Failed to load Kibi status module");
1299
+ if (!attached.success) {
1300
+ // The daemon hosts the branch store for every later request, so a
1301
+ // store-locked startup with a provably dead holder is auto-healed here
1302
+ // exactly like the CLI runtime path; live holders abort the startup
1303
+ // with the holder identity surfaced.
1304
+ const recovered = await retryAttachAfterBreakingStaleLock(prolog, branchPath, attached);
1305
+ if (!recovered.success)
1306
+ throw new Error(recovered.error ?? "Failed to attach branch KB");
1307
+ }
1308
+ const attachedIdentity = readEngineAttachmentIdentity(branchPath);
1309
+ const coreModuleDir = path.dirname(resolveKbPlPath());
1310
+ for (const [fileName, label] of [
1311
+ ["status.pl", "status"],
1312
+ ["discovery.pl", "discovery"],
1313
+ ]) {
1314
+ const modulePath = path.join(coreModuleDir, fileName);
1315
+ const loaded = await prolog.query(`use_module('${quoteProlog(modulePath.replaceAll("\\", "/"))}')`);
1316
+ if (!loaded.success) {
1317
+ throw new Error(loaded.error ?? `Failed to load Kibi ${label} module`);
1318
+ }
1158
1319
  }
1159
1320
  mkdirSync(path.dirname(options.socketPath), { recursive: true, mode: 0o700 });
1160
1321
  if (existsSync(options.socketPath)) {
1322
+ const isLivePeerSignal = (error) => {
1323
+ if (error && typeof error === "object") {
1324
+ const code = "code" in error ? String(error.code) : "";
1325
+ if (code === "EPIPE" || code === "ECONNRESET")
1326
+ return true;
1327
+ const errno = "errno" in error
1328
+ ? Number(error.errno)
1329
+ : Number.NaN;
1330
+ // POSIX EPIPE
1331
+ if (errno === -32)
1332
+ return true;
1333
+ }
1334
+ const message = error instanceof Error ? error.message : String(error);
1335
+ return /\bEPIPE\b|\bECONNRESET\b|broken pipe/i.test(message);
1336
+ };
1161
1337
  let live = false;
1162
1338
  try {
1163
1339
  const existing = await connectSocket(options.socketPath, 100);
1164
- existing.destroy();
1340
+ // Keep a permanent error sink. Bun 1.4 can surface write EPIPE from
1341
+ // teardown into the caller promise on some CI runners, replacing the
1342
+ // intended live-listener error.
1343
+ existing.on("error", () => undefined);
1165
1344
  live = true;
1345
+ try {
1346
+ existing.destroy();
1347
+ }
1348
+ catch {
1349
+ // Ignore destroy races; live detection already succeeded.
1350
+ }
1351
+ existing.unref?.();
1166
1352
  }
1167
- catch {
1168
- // A refused connection means this is a stale filesystem socket.
1353
+ catch (error) {
1354
+ // Bun 1.4 can reject the probe with EPIPE/ECONNRESET against a live
1355
+ // unix listener instead of resolving connect.
1356
+ if (isLivePeerSignal(error)) {
1357
+ live = true;
1358
+ }
1359
+ // Otherwise a refused connection means a stale filesystem socket.
1169
1360
  }
1170
1361
  if (live) {
1362
+ try {
1363
+ await prolog.terminate();
1364
+ }
1365
+ catch (error) {
1366
+ // Best-effort cleanup; Bun may surface late EPIPE here too.
1367
+ if (!isLivePeerSignal(error)) {
1368
+ // Ignore non-EPIPE terminate failures.
1369
+ }
1370
+ }
1171
1371
  throw new Error(`A Kibi engine is already listening at ${options.socketPath}`);
1172
1372
  }
1173
1373
  try {
@@ -1185,7 +1385,6 @@ export async function runEngineDaemon(options) {
1185
1385
  let idleCompactionQueued = false;
1186
1386
  const queryCache = new Map();
1187
1387
  let freshnessCache = null;
1188
- const cancelledRequests = new Set();
1189
1388
  const clients = new Set();
1190
1389
  let shuttingDown = false;
1191
1390
  const exactBranchStatus = (result) => {
@@ -1195,6 +1394,12 @@ export async function runEngineDaemon(options) {
1195
1394
  try {
1196
1395
  const decoded = JSON.parse(JSON.parse(result.bindings.JsonString));
1197
1396
  decoded.branch = options.branch;
1397
+ if (attachedIdentity !== null) {
1398
+ decoded.attachedPath = attachedIdentity.path;
1399
+ decoded.attachedGeneration = attachedIdentity.generation;
1400
+ decoded.attachedDev = attachedIdentity.dev;
1401
+ decoded.attachedIno = attachedIdentity.ino;
1402
+ }
1198
1403
  return {
1199
1404
  ...result,
1200
1405
  bindings: {
@@ -1207,6 +1412,27 @@ export async function runEngineDaemon(options) {
1207
1412
  return result;
1208
1413
  }
1209
1414
  };
1415
+ // A daemon whose workspace vanished (git worktree remove --force, deleted
1416
+ // checkout) can never serve a request again, but it would keep holding the
1417
+ // branch-store lock and wedge every later operation behind an opaque
1418
+ // "KB locked". Detect the loss and shut down cleanly instead.
1419
+ let workspaceMissingStreak = 0;
1420
+ const workspaceWatchdog = setInterval(() => {
1421
+ if (shuttingDown)
1422
+ return;
1423
+ // Two consecutive misses before giving up: a transient blip (slow
1424
+ // rename, network mount hiccup) must not stop a healthy daemon.
1425
+ if (!existsSync(options.workspaceRoot)) {
1426
+ workspaceMissingStreak += 1;
1427
+ if (workspaceMissingStreak < 2)
1428
+ return;
1429
+ console.error(`[KIBI] workspace ${options.workspaceRoot} no longer exists; stopping engine`);
1430
+ void shutdown();
1431
+ return;
1432
+ }
1433
+ workspaceMissingStreak = 0;
1434
+ }, engineWorkspaceWatchdogMs());
1435
+ workspaceWatchdog.unref();
1210
1436
  const scheduleIdleExit = () => {
1211
1437
  if (activeClients > 0)
1212
1438
  return;
@@ -1230,7 +1456,7 @@ export async function runEngineDaemon(options) {
1230
1456
  void shutdown();
1231
1457
  }, engineIdleTimeoutMs());
1232
1458
  };
1233
- const handle = async (request) => {
1459
+ const handle = async (request, cancelledRequests) => {
1234
1460
  if (request.protocolVersion !== ENGINE_PROTOCOL_VERSION) {
1235
1461
  throw new Error(`Kibi engine protocol mismatch: client=${request.protocolVersion ?? "missing"}, server=${ENGINE_PROTOCOL_VERSION}`);
1236
1462
  }
@@ -1493,6 +1719,13 @@ export async function runEngineDaemon(options) {
1493
1719
  setImmediate(() => void shutdown());
1494
1720
  return { stopped: true };
1495
1721
  case "cancel":
1722
+ // Best-effort: marks the id so a *queued* request on this connection
1723
+ // is skipped before handle(). A request already inside
1724
+ // `await prolog.query(...)` cannot be interrupted without redesigning
1725
+ // SWI interactive cancellation; the client still rejects locally on
1726
+ // AbortSignal, but the daemon queue remains occupied until that Prolog
1727
+ // call returns. Cancel marks are per-connection. See
1728
+ // docs/mcp-reference.md ("Engine cancellation limits").
1496
1729
  if (typeof request.cancelOf === "number") {
1497
1730
  cancelledRequests.add(request.cancelOf);
1498
1731
  }
@@ -1507,6 +1740,7 @@ export async function runEngineDaemon(options) {
1507
1740
  process.off("SIGINT", requestSignalShutdown);
1508
1741
  if (idleTimer)
1509
1742
  clearTimeout(idleTimer);
1743
+ clearInterval(workspaceWatchdog);
1510
1744
  const saved = await prolog.query("kb_save").catch(() => null);
1511
1745
  if (saved?.success) {
1512
1746
  try {
@@ -1545,14 +1779,15 @@ export async function runEngineDaemon(options) {
1545
1779
  // Detached engines must cross the same durability boundary when a service
1546
1780
  // manager or a test harness terminates them as they do for an RPC stop.
1547
1781
  // implements REQ-test-journaled-engine-harness
1548
- const requestSignalShutdown = () => {
1549
- void shutdown();
1550
- };
1782
+ const requestSignalShutdown = requestEngineSignalShutdown(shutdown);
1551
1783
  process.once("SIGTERM", requestSignalShutdown);
1552
1784
  process.once("SIGINT", requestSignalShutdown);
1553
1785
  server.on("connection", (socket) => {
1554
1786
  clients.add(socket);
1555
1787
  activeClients += 1;
1788
+ // Request ids are per-connection. Cancel marks must not be daemon-global
1789
+ // or Client B's id=1 is poisoned by Client A's cancelOf=1.
1790
+ const cancelledRequests = new Set();
1556
1791
  let buffer = Buffer.alloc(0);
1557
1792
  socket.on("data", (chunk) => {
1558
1793
  try {
@@ -1575,7 +1810,7 @@ export async function runEngineDaemon(options) {
1575
1810
  return;
1576
1811
  }
1577
1812
  try {
1578
- const result = await handle(request);
1813
+ const result = await handle(request, cancelledRequests);
1579
1814
  writeSocketFrame(socket, {
1580
1815
  id: request.id,
1581
1816
  ok: true,
@@ -1591,6 +1826,11 @@ export async function runEngineDaemon(options) {
1591
1826
  serverPackageVersions: ENGINE_PACKAGE_VERSIONS,
1592
1827
  });
1593
1828
  }
1829
+ finally {
1830
+ // Drop stale cancel marks for in-flight goals that still ran
1831
+ // to completion after cancelOf (SWI cannot interrupt them).
1832
+ cancelledRequests.delete(request.id);
1833
+ }
1594
1834
  })
1595
1835
  .catch(() => undefined);
1596
1836
  });