kibi-cli 0.19.0 → 2.0.0

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