@tenphi/akno-core 0.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 (485) hide show
  1. package/LICENSE +83 -0
  2. package/README.md +26 -0
  3. package/config/default.jsonc +548 -0
  4. package/dist/bench/answer-corpus.d.ts +48 -0
  5. package/dist/bench/answer-corpus.d.ts.map +1 -0
  6. package/dist/bench/answer-corpus.js +491 -0
  7. package/dist/bench/answer-corpus.js.map +1 -0
  8. package/dist/bench/answer.d.ts +156 -0
  9. package/dist/bench/answer.d.ts.map +1 -0
  10. package/dist/bench/answer.js +608 -0
  11. package/dist/bench/answer.js.map +1 -0
  12. package/dist/bench/auto-recall-answer-corpus.d.ts +21 -0
  13. package/dist/bench/auto-recall-answer-corpus.d.ts.map +1 -0
  14. package/dist/bench/auto-recall-answer-corpus.js +245 -0
  15. package/dist/bench/auto-recall-answer-corpus.js.map +1 -0
  16. package/dist/bench/auto-recall-answer.d.ts +198 -0
  17. package/dist/bench/auto-recall-answer.d.ts.map +1 -0
  18. package/dist/bench/auto-recall-answer.js +720 -0
  19. package/dist/bench/auto-recall-answer.js.map +1 -0
  20. package/dist/bench/auto-recall-corpus.d.ts +45 -0
  21. package/dist/bench/auto-recall-corpus.d.ts.map +1 -0
  22. package/dist/bench/auto-recall-corpus.js +221 -0
  23. package/dist/bench/auto-recall-corpus.js.map +1 -0
  24. package/dist/bench/auto-recall.d.ts +171 -0
  25. package/dist/bench/auto-recall.d.ts.map +1 -0
  26. package/dist/bench/auto-recall.js +651 -0
  27. package/dist/bench/auto-recall.js.map +1 -0
  28. package/dist/bench/entity-resolution.d.ts +37 -0
  29. package/dist/bench/entity-resolution.d.ts.map +1 -0
  30. package/dist/bench/entity-resolution.js +121 -0
  31. package/dist/bench/entity-resolution.js.map +1 -0
  32. package/dist/bench/graph.d.ts +57 -0
  33. package/dist/bench/graph.d.ts.map +1 -0
  34. package/dist/bench/graph.js +573 -0
  35. package/dist/bench/graph.js.map +1 -0
  36. package/dist/bench/llm-ranking-probe.d.ts +27 -0
  37. package/dist/bench/llm-ranking-probe.d.ts.map +1 -0
  38. package/dist/bench/llm-ranking-probe.js +105 -0
  39. package/dist/bench/llm-ranking-probe.js.map +1 -0
  40. package/dist/bench/merge-discovery-corpus.d.ts +26 -0
  41. package/dist/bench/merge-discovery-corpus.d.ts.map +1 -0
  42. package/dist/bench/merge-discovery-corpus.js +114 -0
  43. package/dist/bench/merge-discovery-corpus.js.map +1 -0
  44. package/dist/bench/merge-discovery-review.d.ts +81 -0
  45. package/dist/bench/merge-discovery-review.d.ts.map +1 -0
  46. package/dist/bench/merge-discovery-review.js +149 -0
  47. package/dist/bench/merge-discovery-review.js.map +1 -0
  48. package/dist/bench/merge-discovery.d.ts +122 -0
  49. package/dist/bench/merge-discovery.d.ts.map +1 -0
  50. package/dist/bench/merge-discovery.js +390 -0
  51. package/dist/bench/merge-discovery.js.map +1 -0
  52. package/dist/bench/mixed-retrieval.d.ts +35 -0
  53. package/dist/bench/mixed-retrieval.d.ts.map +1 -0
  54. package/dist/bench/mixed-retrieval.js +355 -0
  55. package/dist/bench/mixed-retrieval.js.map +1 -0
  56. package/dist/bench/ranking-corpus.d.ts +29 -0
  57. package/dist/bench/ranking-corpus.d.ts.map +1 -0
  58. package/dist/bench/ranking-corpus.js +514 -0
  59. package/dist/bench/ranking-corpus.js.map +1 -0
  60. package/dist/bench/ranking-end-to-end.d.ts +112 -0
  61. package/dist/bench/ranking-end-to-end.d.ts.map +1 -0
  62. package/dist/bench/ranking-end-to-end.js +479 -0
  63. package/dist/bench/ranking-end-to-end.js.map +1 -0
  64. package/dist/bench/ranking-latency.d.ts +71 -0
  65. package/dist/bench/ranking-latency.d.ts.map +1 -0
  66. package/dist/bench/ranking-latency.js +130 -0
  67. package/dist/bench/ranking-latency.js.map +1 -0
  68. package/dist/bench/ranking-matrix.d.ts +141 -0
  69. package/dist/bench/ranking-matrix.d.ts.map +1 -0
  70. package/dist/bench/ranking-matrix.js +526 -0
  71. package/dist/bench/ranking-matrix.js.map +1 -0
  72. package/dist/bench/ranking-review.d.ts +93 -0
  73. package/dist/bench/ranking-review.d.ts.map +1 -0
  74. package/dist/bench/ranking-review.js +249 -0
  75. package/dist/bench/ranking-review.js.map +1 -0
  76. package/dist/bench/ranking.d.ts +122 -0
  77. package/dist/bench/ranking.d.ts.map +1 -0
  78. package/dist/bench/ranking.js +547 -0
  79. package/dist/bench/ranking.js.map +1 -0
  80. package/dist/bench.d.ts +60 -0
  81. package/dist/bench.d.ts.map +1 -0
  82. package/dist/bench.js +167 -0
  83. package/dist/bench.js.map +1 -0
  84. package/dist/config/jsonc.d.ts +8 -0
  85. package/dist/config/jsonc.d.ts.map +1 -0
  86. package/dist/config/jsonc.js +85 -0
  87. package/dist/config/jsonc.js.map +1 -0
  88. package/dist/config/load.d.ts +43 -0
  89. package/dist/config/load.d.ts.map +1 -0
  90. package/dist/config/load.js +608 -0
  91. package/dist/config/load.js.map +1 -0
  92. package/dist/config/paths.d.ts +10 -0
  93. package/dist/config/paths.d.ts.map +1 -0
  94. package/dist/config/paths.js +38 -0
  95. package/dist/config/paths.js.map +1 -0
  96. package/dist/config/schema.d.ts +698 -0
  97. package/dist/config/schema.d.ts.map +1 -0
  98. package/dist/config/schema.js +394 -0
  99. package/dist/config/schema.js.map +1 -0
  100. package/dist/config/write-rules.d.ts +41 -0
  101. package/dist/config/write-rules.d.ts.map +1 -0
  102. package/dist/config/write-rules.js +225 -0
  103. package/dist/config/write-rules.js.map +1 -0
  104. package/dist/config/write-setup.d.ts +42 -0
  105. package/dist/config/write-setup.d.ts.map +1 -0
  106. package/dist/config/write-setup.js +358 -0
  107. package/dist/config/write-setup.js.map +1 -0
  108. package/dist/context.d.ts +64 -0
  109. package/dist/context.d.ts.map +1 -0
  110. package/dist/context.js +14 -0
  111. package/dist/context.js.map +1 -0
  112. package/dist/doctor.d.ts +115 -0
  113. package/dist/doctor.d.ts.map +1 -0
  114. package/dist/doctor.js +388 -0
  115. package/dist/doctor.js.map +1 -0
  116. package/dist/index/chunk.d.ts +62 -0
  117. package/dist/index/chunk.d.ts.map +1 -0
  118. package/dist/index/chunk.js +307 -0
  119. package/dist/index/chunk.js.map +1 -0
  120. package/dist/index/defer.d.ts +32 -0
  121. package/dist/index/defer.d.ts.map +1 -0
  122. package/dist/index/defer.js +66 -0
  123. package/dist/index/defer.js.map +1 -0
  124. package/dist/index/derive.d.ts +99 -0
  125. package/dist/index/derive.d.ts.map +1 -0
  126. package/dist/index/derive.js +378 -0
  127. package/dist/index/derive.js.map +1 -0
  128. package/dist/index/entity-resolution.d.ts +68 -0
  129. package/dist/index/entity-resolution.d.ts.map +1 -0
  130. package/dist/index/entity-resolution.js +305 -0
  131. package/dist/index/entity-resolution.js.map +1 -0
  132. package/dist/index/graph.d.ts +46 -0
  133. package/dist/index/graph.d.ts.map +1 -0
  134. package/dist/index/graph.js +618 -0
  135. package/dist/index/graph.js.map +1 -0
  136. package/dist/index/indexer.d.ts +301 -0
  137. package/dist/index/indexer.d.ts.map +1 -0
  138. package/dist/index/indexer.js +1398 -0
  139. package/dist/index/indexer.js.map +1 -0
  140. package/dist/index/revision-barrier.d.ts +30 -0
  141. package/dist/index/revision-barrier.d.ts.map +1 -0
  142. package/dist/index/revision-barrier.js +140 -0
  143. package/dist/index/revision-barrier.js.map +1 -0
  144. package/dist/index.d.ts +55 -0
  145. package/dist/index.d.ts.map +1 -0
  146. package/dist/index.js +37 -0
  147. package/dist/index.js.map +1 -0
  148. package/dist/ingest/adoption-eligibility.d.ts +4 -0
  149. package/dist/ingest/adoption-eligibility.d.ts.map +1 -0
  150. package/dist/ingest/adoption-eligibility.js +18 -0
  151. package/dist/ingest/adoption-eligibility.js.map +1 -0
  152. package/dist/ingest/availability.d.ts +15 -0
  153. package/dist/ingest/availability.d.ts.map +1 -0
  154. package/dist/ingest/availability.js +37 -0
  155. package/dist/ingest/availability.js.map +1 -0
  156. package/dist/ingest/extract.d.ts +58 -0
  157. package/dist/ingest/extract.d.ts.map +1 -0
  158. package/dist/ingest/extract.js +255 -0
  159. package/dist/ingest/extract.js.map +1 -0
  160. package/dist/ingest/fetch.d.ts +35 -0
  161. package/dist/ingest/fetch.d.ts.map +1 -0
  162. package/dist/ingest/fetch.js +142 -0
  163. package/dist/ingest/fetch.js.map +1 -0
  164. package/dist/ingest/inbox.d.ts +53 -0
  165. package/dist/ingest/inbox.d.ts.map +1 -0
  166. package/dist/ingest/inbox.js +110 -0
  167. package/dist/ingest/inbox.js.map +1 -0
  168. package/dist/ingest/name.d.ts +72 -0
  169. package/dist/ingest/name.d.ts.map +1 -0
  170. package/dist/ingest/name.js +208 -0
  171. package/dist/ingest/name.js.map +1 -0
  172. package/dist/ingest/parts.d.ts +78 -0
  173. package/dist/ingest/parts.d.ts.map +1 -0
  174. package/dist/ingest/parts.js +52 -0
  175. package/dist/ingest/parts.js.map +1 -0
  176. package/dist/ingest/rendition.d.ts +75 -0
  177. package/dist/ingest/rendition.d.ts.map +1 -0
  178. package/dist/ingest/rendition.js +92 -0
  179. package/dist/ingest/rendition.js.map +1 -0
  180. package/dist/ingest/store.d.ts +66 -0
  181. package/dist/ingest/store.d.ts.map +1 -0
  182. package/dist/ingest/store.js +92 -0
  183. package/dist/ingest/store.js.map +1 -0
  184. package/dist/kb/folders.d.ts +37 -0
  185. package/dist/kb/folders.d.ts.map +1 -0
  186. package/dist/kb/folders.js +133 -0
  187. package/dist/kb/folders.js.map +1 -0
  188. package/dist/kb/frontmatter.d.ts +91 -0
  189. package/dist/kb/frontmatter.d.ts.map +1 -0
  190. package/dist/kb/frontmatter.js +274 -0
  191. package/dist/kb/frontmatter.js.map +1 -0
  192. package/dist/kb/line-facts.d.ts +29 -0
  193. package/dist/kb/line-facts.d.ts.map +1 -0
  194. package/dist/kb/line-facts.js +23 -0
  195. package/dist/kb/line-facts.js.map +1 -0
  196. package/dist/kb/page.d.ts +92 -0
  197. package/dist/kb/page.d.ts.map +1 -0
  198. package/dist/kb/page.js +243 -0
  199. package/dist/kb/page.js.map +1 -0
  200. package/dist/kb/scan.d.ts +38 -0
  201. package/dist/kb/scan.d.ts.map +1 -0
  202. package/dist/kb/scan.js +109 -0
  203. package/dist/kb/scan.js.map +1 -0
  204. package/dist/kb/words.d.ts +30 -0
  205. package/dist/kb/words.d.ts.map +1 -0
  206. package/dist/kb/words.js +107 -0
  207. package/dist/kb/words.js.map +1 -0
  208. package/dist/maintenance/adopt.d.ts +65 -0
  209. package/dist/maintenance/adopt.d.ts.map +1 -0
  210. package/dist/maintenance/adopt.js +238 -0
  211. package/dist/maintenance/adopt.js.map +1 -0
  212. package/dist/maintenance/budget.d.ts +55 -0
  213. package/dist/maintenance/budget.d.ts.map +1 -0
  214. package/dist/maintenance/budget.js +61 -0
  215. package/dist/maintenance/budget.js.map +1 -0
  216. package/dist/maintenance/conflicts.d.ts +105 -0
  217. package/dist/maintenance/conflicts.d.ts.map +1 -0
  218. package/dist/maintenance/conflicts.js +368 -0
  219. package/dist/maintenance/conflicts.js.map +1 -0
  220. package/dist/maintenance/contradictions.d.ts +34 -0
  221. package/dist/maintenance/contradictions.d.ts.map +1 -0
  222. package/dist/maintenance/contradictions.js +199 -0
  223. package/dist/maintenance/contradictions.js.map +1 -0
  224. package/dist/maintenance/curate.d.ts +156 -0
  225. package/dist/maintenance/curate.d.ts.map +1 -0
  226. package/dist/maintenance/curate.js +2070 -0
  227. package/dist/maintenance/curate.js.map +1 -0
  228. package/dist/maintenance/dream.d.ts +139 -0
  229. package/dist/maintenance/dream.d.ts.map +1 -0
  230. package/dist/maintenance/dream.js +1632 -0
  231. package/dist/maintenance/dream.js.map +1 -0
  232. package/dist/maintenance/graph-candidates.d.ts +19 -0
  233. package/dist/maintenance/graph-candidates.d.ts.map +1 -0
  234. package/dist/maintenance/graph-candidates.js +120 -0
  235. package/dist/maintenance/graph-candidates.js.map +1 -0
  236. package/dist/maintenance/housekeeping.d.ts +81 -0
  237. package/dist/maintenance/housekeeping.d.ts.map +1 -0
  238. package/dist/maintenance/housekeeping.js +281 -0
  239. package/dist/maintenance/housekeeping.js.map +1 -0
  240. package/dist/maintenance/link-repairs.d.ts +58 -0
  241. package/dist/maintenance/link-repairs.d.ts.map +1 -0
  242. package/dist/maintenance/link-repairs.js +281 -0
  243. package/dist/maintenance/link-repairs.js.map +1 -0
  244. package/dist/maintenance/log.d.ts +41 -0
  245. package/dist/maintenance/log.d.ts.map +1 -0
  246. package/dist/maintenance/log.js +72 -0
  247. package/dist/maintenance/log.js.map +1 -0
  248. package/dist/maintenance/managed-item-routing.d.ts +48 -0
  249. package/dist/maintenance/managed-item-routing.d.ts.map +1 -0
  250. package/dist/maintenance/managed-item-routing.js +281 -0
  251. package/dist/maintenance/managed-item-routing.js.map +1 -0
  252. package/dist/maintenance/managed-item-sources.d.ts +38 -0
  253. package/dist/maintenance/managed-item-sources.d.ts.map +1 -0
  254. package/dist/maintenance/managed-item-sources.js +324 -0
  255. package/dist/maintenance/managed-item-sources.js.map +1 -0
  256. package/dist/maintenance/managed-items.d.ts +162 -0
  257. package/dist/maintenance/managed-items.d.ts.map +1 -0
  258. package/dist/maintenance/managed-items.js +1329 -0
  259. package/dist/maintenance/managed-items.js.map +1 -0
  260. package/dist/maintenance/merge-classifier.d.ts +19 -0
  261. package/dist/maintenance/merge-classifier.d.ts.map +1 -0
  262. package/dist/maintenance/merge-classifier.js +49 -0
  263. package/dist/maintenance/merge-classifier.js.map +1 -0
  264. package/dist/maintenance/model-telemetry.d.ts +45 -0
  265. package/dist/maintenance/model-telemetry.d.ts.map +1 -0
  266. package/dist/maintenance/model-telemetry.js +107 -0
  267. package/dist/maintenance/model-telemetry.js.map +1 -0
  268. package/dist/maintenance/observe.d.ts +72 -0
  269. package/dist/maintenance/observe.d.ts.map +1 -0
  270. package/dist/maintenance/observe.js +265 -0
  271. package/dist/maintenance/observe.js.map +1 -0
  272. package/dist/maintenance/path-policy.d.ts +83 -0
  273. package/dist/maintenance/path-policy.d.ts.map +1 -0
  274. package/dist/maintenance/path-policy.js +360 -0
  275. package/dist/maintenance/path-policy.js.map +1 -0
  276. package/dist/maintenance/plans.d.ts +366 -0
  277. package/dist/maintenance/plans.d.ts.map +1 -0
  278. package/dist/maintenance/plans.js +4060 -0
  279. package/dist/maintenance/plans.js.map +1 -0
  280. package/dist/maintenance/profile.d.ts +33 -0
  281. package/dist/maintenance/profile.d.ts.map +1 -0
  282. package/dist/maintenance/profile.js +99 -0
  283. package/dist/maintenance/profile.js.map +1 -0
  284. package/dist/maintenance/recovery.d.ts +38 -0
  285. package/dist/maintenance/recovery.d.ts.map +1 -0
  286. package/dist/maintenance/recovery.js +217 -0
  287. package/dist/maintenance/recovery.js.map +1 -0
  288. package/dist/maintenance/repair.d.ts +37 -0
  289. package/dist/maintenance/repair.d.ts.map +1 -0
  290. package/dist/maintenance/repair.js +183 -0
  291. package/dist/maintenance/repair.js.map +1 -0
  292. package/dist/maintenance/rule-drift.d.ts +104 -0
  293. package/dist/maintenance/rule-drift.d.ts.map +1 -0
  294. package/dist/maintenance/rule-drift.js +507 -0
  295. package/dist/maintenance/rule-drift.js.map +1 -0
  296. package/dist/maintenance/run-verification.d.ts +44 -0
  297. package/dist/maintenance/run-verification.d.ts.map +1 -0
  298. package/dist/maintenance/run-verification.js +253 -0
  299. package/dist/maintenance/run-verification.js.map +1 -0
  300. package/dist/maintenance/runs.d.ts +142 -0
  301. package/dist/maintenance/runs.d.ts.map +1 -0
  302. package/dist/maintenance/runs.js +439 -0
  303. package/dist/maintenance/runs.js.map +1 -0
  304. package/dist/maintenance/semantic-merge-discovery.d.ts +54 -0
  305. package/dist/maintenance/semantic-merge-discovery.d.ts.map +1 -0
  306. package/dist/maintenance/semantic-merge-discovery.js +308 -0
  307. package/dist/maintenance/semantic-merge-discovery.js.map +1 -0
  308. package/dist/maintenance/temporal.d.ts +44 -0
  309. package/dist/maintenance/temporal.d.ts.map +1 -0
  310. package/dist/maintenance/temporal.js +295 -0
  311. package/dist/maintenance/temporal.js.map +1 -0
  312. package/dist/models/client.d.ts +214 -0
  313. package/dist/models/client.d.ts.map +1 -0
  314. package/dist/models/client.js +904 -0
  315. package/dist/models/client.js.map +1 -0
  316. package/dist/models/provider-api.d.ts +28 -0
  317. package/dist/models/provider-api.d.ts.map +1 -0
  318. package/dist/models/provider-api.js +320 -0
  319. package/dist/models/provider-api.js.map +1 -0
  320. package/dist/open.d.ts +163 -0
  321. package/dist/open.d.ts.map +1 -0
  322. package/dist/open.js +382 -0
  323. package/dist/open.js.map +1 -0
  324. package/dist/ops/adopt.d.ts +12 -0
  325. package/dist/ops/adopt.d.ts.map +1 -0
  326. package/dist/ops/adopt.js +138 -0
  327. package/dist/ops/adopt.js.map +1 -0
  328. package/dist/ops/answer.d.ts +29 -0
  329. package/dist/ops/answer.d.ts.map +1 -0
  330. package/dist/ops/answer.js +557 -0
  331. package/dist/ops/answer.js.map +1 -0
  332. package/dist/ops/context.d.ts +18 -0
  333. package/dist/ops/context.d.ts.map +1 -0
  334. package/dist/ops/context.js +713 -0
  335. package/dist/ops/context.js.map +1 -0
  336. package/dist/ops/folder.d.ts +23 -0
  337. package/dist/ops/folder.d.ts.map +1 -0
  338. package/dist/ops/folder.js +130 -0
  339. package/dist/ops/folder.js.map +1 -0
  340. package/dist/ops/forget.d.ts +14 -0
  341. package/dist/ops/forget.d.ts.map +1 -0
  342. package/dist/ops/forget.js +212 -0
  343. package/dist/ops/forget.js.map +1 -0
  344. package/dist/ops/graph.d.ts +10 -0
  345. package/dist/ops/graph.d.ts.map +1 -0
  346. package/dist/ops/graph.js +480 -0
  347. package/dist/ops/graph.js.map +1 -0
  348. package/dist/ops/ingest.d.ts +40 -0
  349. package/dist/ops/ingest.d.ts.map +1 -0
  350. package/dist/ops/ingest.js +434 -0
  351. package/dist/ops/ingest.js.map +1 -0
  352. package/dist/ops/list.d.ts +9 -0
  353. package/dist/ops/list.d.ts.map +1 -0
  354. package/dist/ops/list.js +217 -0
  355. package/dist/ops/list.js.map +1 -0
  356. package/dist/ops/move.d.ts +20 -0
  357. package/dist/ops/move.d.ts.map +1 -0
  358. package/dist/ops/move.js +173 -0
  359. package/dist/ops/move.js.map +1 -0
  360. package/dist/ops/read.d.ts +9 -0
  361. package/dist/ops/read.d.ts.map +1 -0
  362. package/dist/ops/read.js +271 -0
  363. package/dist/ops/read.js.map +1 -0
  364. package/dist/ops/recall.d.ts +13 -0
  365. package/dist/ops/recall.d.ts.map +1 -0
  366. package/dist/ops/recall.js +297 -0
  367. package/dist/ops/recall.js.map +1 -0
  368. package/dist/ops/remember.d.ts +34 -0
  369. package/dist/ops/remember.d.ts.map +1 -0
  370. package/dist/ops/remember.js +660 -0
  371. package/dist/ops/remember.js.map +1 -0
  372. package/dist/ops/timeline.d.ts +11 -0
  373. package/dist/ops/timeline.d.ts.map +1 -0
  374. package/dist/ops/timeline.js +111 -0
  375. package/dist/ops/timeline.js.map +1 -0
  376. package/dist/ops/undo.d.ts +9 -0
  377. package/dist/ops/undo.d.ts.map +1 -0
  378. package/dist/ops/undo.js +38 -0
  379. package/dist/ops/undo.js.map +1 -0
  380. package/dist/ops/write.d.ts +55 -0
  381. package/dist/ops/write.d.ts.map +1 -0
  382. package/dist/ops/write.js +463 -0
  383. package/dist/ops/write.js.map +1 -0
  384. package/dist/recall/assemble.d.ts +81 -0
  385. package/dist/recall/assemble.d.ts.map +1 -0
  386. package/dist/recall/assemble.js +603 -0
  387. package/dist/recall/assemble.js.map +1 -0
  388. package/dist/recall/expand.d.ts +55 -0
  389. package/dist/recall/expand.d.ts.map +1 -0
  390. package/dist/recall/expand.js +282 -0
  391. package/dist/recall/expand.js.map +1 -0
  392. package/dist/recall/graph-arm.d.ts +17 -0
  393. package/dist/recall/graph-arm.d.ts.map +1 -0
  394. package/dist/recall/graph-arm.js +227 -0
  395. package/dist/recall/graph-arm.js.map +1 -0
  396. package/dist/recall/llm-rerank.d.ts +55 -0
  397. package/dist/recall/llm-rerank.d.ts.map +1 -0
  398. package/dist/recall/llm-rerank.js +213 -0
  399. package/dist/recall/llm-rerank.js.map +1 -0
  400. package/dist/recall/reranker-calibration.d.ts +23 -0
  401. package/dist/recall/reranker-calibration.d.ts.map +1 -0
  402. package/dist/recall/reranker-calibration.js +161 -0
  403. package/dist/recall/reranker-calibration.js.map +1 -0
  404. package/dist/recall/search.d.ts +107 -0
  405. package/dist/recall/search.d.ts.map +1 -0
  406. package/dist/recall/search.js +530 -0
  407. package/dist/recall/search.js.map +1 -0
  408. package/dist/reserved.d.ts +39 -0
  409. package/dist/reserved.d.ts.map +1 -0
  410. package/dist/reserved.js +63 -0
  411. package/dist/reserved.js.map +1 -0
  412. package/dist/rules/compile.d.ts +27 -0
  413. package/dist/rules/compile.d.ts.map +1 -0
  414. package/dist/rules/compile.js +105 -0
  415. package/dist/rules/compile.js.map +1 -0
  416. package/dist/setup/model-free.d.ts +15 -0
  417. package/dist/setup/model-free.d.ts.map +1 -0
  418. package/dist/setup/model-free.js +26 -0
  419. package/dist/setup/model-free.js.map +1 -0
  420. package/dist/setup/openai.d.ts +46 -0
  421. package/dist/setup/openai.d.ts.map +1 -0
  422. package/dist/setup/openai.js +165 -0
  423. package/dist/setup/openai.js.map +1 -0
  424. package/dist/store/db.d.ts +61 -0
  425. package/dist/store/db.d.ts.map +1 -0
  426. package/dist/store/db.js +265 -0
  427. package/dist/store/db.js.map +1 -0
  428. package/dist/store/ids.d.ts +29 -0
  429. package/dist/store/ids.d.ts.map +1 -0
  430. package/dist/store/ids.js +0 -0
  431. package/dist/store/ids.js.map +1 -0
  432. package/dist/store/migrations.d.ts +54 -0
  433. package/dist/store/migrations.d.ts.map +1 -0
  434. package/dist/store/migrations.js +923 -0
  435. package/dist/store/migrations.js.map +1 -0
  436. package/dist/store/vectors.d.ts +34 -0
  437. package/dist/store/vectors.d.ts.map +1 -0
  438. package/dist/store/vectors.js +158 -0
  439. package/dist/store/vectors.js.map +1 -0
  440. package/dist/timeline/documents.d.ts +23 -0
  441. package/dist/timeline/documents.d.ts.map +1 -0
  442. package/dist/timeline/documents.js +262 -0
  443. package/dist/timeline/documents.js.map +1 -0
  444. package/dist/watch/watcher.d.ts +43 -0
  445. package/dist/watch/watcher.d.ts.map +1 -0
  446. package/dist/watch/watcher.js +143 -0
  447. package/dist/watch/watcher.js.map +1 -0
  448. package/dist/write/atomic.d.ts +34 -0
  449. package/dist/write/atomic.d.ts.map +1 -0
  450. package/dist/write/atomic.js +58 -0
  451. package/dist/write/atomic.js.map +1 -0
  452. package/dist/write/conflict.d.ts +43 -0
  453. package/dist/write/conflict.d.ts.map +1 -0
  454. package/dist/write/conflict.js +149 -0
  455. package/dist/write/conflict.js.map +1 -0
  456. package/dist/write/edit.d.ts +59 -0
  457. package/dist/write/edit.d.ts.map +1 -0
  458. package/dist/write/edit.js +231 -0
  459. package/dist/write/edit.js.map +1 -0
  460. package/dist/write/gate.d.ts +59 -0
  461. package/dist/write/gate.d.ts.map +1 -0
  462. package/dist/write/gate.js +99 -0
  463. package/dist/write/gate.js.map +1 -0
  464. package/dist/write/journal.d.ts +90 -0
  465. package/dist/write/journal.d.ts.map +1 -0
  466. package/dist/write/journal.js +187 -0
  467. package/dist/write/journal.js.map +1 -0
  468. package/dist/write/ledger.d.ts +28 -0
  469. package/dist/write/ledger.d.ts.map +1 -0
  470. package/dist/write/ledger.js +141 -0
  471. package/dist/write/ledger.js.map +1 -0
  472. package/dist/write/placement.d.ts +29 -0
  473. package/dist/write/placement.d.ts.map +1 -0
  474. package/dist/write/placement.js +140 -0
  475. package/dist/write/placement.js.map +1 -0
  476. package/dist/write/remember-fallback.d.ts +18 -0
  477. package/dist/write/remember-fallback.d.ts.map +1 -0
  478. package/dist/write/remember-fallback.js +48 -0
  479. package/dist/write/remember-fallback.js.map +1 -0
  480. package/dist/write/retain.d.ts +61 -0
  481. package/dist/write/retain.d.ts.map +1 -0
  482. package/dist/write/retain.js +272 -0
  483. package/dist/write/retain.js.map +1 -0
  484. package/package.json +50 -0
  485. package/swift/extract.swift +232 -0
@@ -0,0 +1,923 @@
1
+ /**
2
+ * One SQLite file. Deleting it costs one re-index and no data — that
3
+ * property is the design, and it is why nothing here is a source of truth.
4
+ * The journal, live maintenance plans, replayable managed-item source quotes, and content-safe run receipts are
5
+ * the durable exceptions. The journal keeps prior bytes for undo; a sealed plan keeps exact proposed bytes so a
6
+ * decision survives a restart and never has to regenerate a possibly different rewrite; one bounded exact
7
+ * quote lets a generated sentence be checked later; the receipt explains the lifecycle around them.
8
+ *
9
+ * The first entry is the canonical 0.1.0 schema, compacted from historical versions
10
+ * 1–8. Later entries add durable exceptions or new rebuildable index capabilities.
11
+ * `user_version` therefore uses the historical schema number, not this array's length.
12
+ * Upgrade code capability-checks durable tables and columns so databases created before
13
+ * or after the compaction converge on the same schema.
14
+ */
15
+ export const SCHEMA_VERSION = 32;
16
+ export const MAINTENANCE_PLANS_MIGRATION_INDEX = 1;
17
+ export const MAINTENANCE_EVIDENCE_MIGRATION_INDEX = 2;
18
+ export const CONFLICT_VERDICTS_MIGRATION_INDEX = 3;
19
+ export const CONFLICT_QUALIFICATION_MIGRATION_INDEX = 4;
20
+ export const MAINTENANCE_RUNS_MIGRATION_INDEX = 5;
21
+ export const ORPHAN_DOCUMENT_CHUNKS_MIGRATION_INDEX = 6;
22
+ export const DOCUMENT_AVAILABILITY_MIGRATION_INDEX = 7;
23
+ export const DOCUMENT_FILE_DATES_MIGRATION_INDEX = 8;
24
+ export const MAINTENANCE_ITEM_POLICY_MIGRATION_INDEX = 9;
25
+ export const MAINTENANCE_ITEM_STATUS_CODE_MIGRATION_INDEX = 10;
26
+ export const STRUCTURAL_GRAPH_MIGRATION_INDEX = 11;
27
+ export const ENTITY_GRAPH_MIGRATION_INDEX = 12;
28
+ export const FACT_GRAPH_MIGRATION_INDEX = 13;
29
+ export const CONTEXTUAL_ENTITY_MIGRATION_INDEX = 14;
30
+ export const MAINTENANCE_PLAN_PAYLOAD_RETENTION_MIGRATION_INDEX = 15;
31
+ export const MAINTENANCE_ITEM_COMPONENT_COUNT_MIGRATION_INDEX = 16;
32
+ export const SEMANTIC_MERGE_VERDICTS_MIGRATION_INDEX = 17;
33
+ export const SEMANTIC_MERGE_EMBEDDINGS_MIGRATION_INDEX = 18;
34
+ export const MANAGED_ITEM_PLACEMENT_VERDICTS_MIGRATION_INDEX = 19;
35
+ export const MANAGED_ITEM_SOURCES_MIGRATION_INDEX = 20;
36
+ export const MANAGED_ITEM_ROUTING_VERDICTS_MIGRATION_INDEX = 21;
37
+ export const MAINTENANCE_ITEM_REVISIONS_MIGRATION_INDEX = 22;
38
+ export const MAINTENANCE_REVISION_ACTOR_MIGRATION_INDEX = 23;
39
+ export const MAINTENANCE_ACTION_RECEIPTS_MIGRATION_INDEX = 24;
40
+ export const MAINTENANCE_RECOVERY_STATE_MIGRATION_INDEX = 25;
41
+ export const MIGRATIONS = [
42
+ // ── 1. The schema as of 0.1.0 ─────────────────────────────────────────────
43
+ `
44
+ CREATE TABLE meta (
45
+ key TEXT PRIMARY KEY,
46
+ value TEXT NOT NULL
47
+ );
48
+
49
+ -- Identity lives here rather than in the page, in sidecar mode. 'slug' is
50
+ -- derived from the path and changes on a rename; 'id' never does.
51
+ CREATE TABLE pages (
52
+ id TEXT PRIMARY KEY,
53
+ slug TEXT NOT NULL UNIQUE,
54
+ rel_path TEXT NOT NULL UNIQUE,
55
+ title TEXT NOT NULL,
56
+ type TEXT,
57
+ tags TEXT NOT NULL DEFAULT '[]',
58
+ -- What the page contributes: 'knowledge', 'source' or 'ignored'. Distinct from
59
+ -- management below, which says what an automatic curator may do to it — one
60
+ -- column governing both meant recall shape, fact eligibility and edit authority
61
+ -- could not be set independently.
62
+ role TEXT NOT NULL DEFAULT 'knowledge',
63
+ frontmatter TEXT NOT NULL DEFAULT '{}',
64
+ body_hash TEXT NOT NULL,
65
+ summary TEXT,
66
+ keywords TEXT,
67
+ -- Where the <!-- source --> fence sits, when the page has one. Below it the
68
+ -- page is quotable source rather than knowledge.
69
+ source_fence_line INTEGER,
70
+ body_line INTEGER NOT NULL DEFAULT 1,
71
+ line_count INTEGER NOT NULL DEFAULT 0,
72
+ bytes INTEGER NOT NULL DEFAULT 0,
73
+ created_at TEXT,
74
+ updated_at TEXT,
75
+ indexed_at TEXT NOT NULL,
76
+ -- Which model-backed derivations are current for this body_hash. Lets an
77
+ -- index pass run structurally now and fill in summaries later without
78
+ -- forgetting which pages still owe one.
79
+ derived_hash TEXT,
80
+ -- What automatic writers may do. 'remember' governs the per-turn retain tier;
81
+ -- 'dream' opts a page into nightly hygiene or synthesis and defaults to neither,
82
+ -- because a curator that edits pages nobody offered it is not a feature.
83
+ remember_management TEXT NOT NULL DEFAULT 'deny',
84
+ dream_management TEXT NOT NULL DEFAULT 'none',
85
+ about TEXT NOT NULL DEFAULT '[]',
86
+ aliases TEXT NOT NULL DEFAULT '[]',
87
+ -- Curation freshness, content-addressed. A page opting into hygiene or synthesis
88
+ -- is permission, not a nightly work order: an unchanged input fingerprint skips
89
+ -- the page without spending a model call. 'preview' is a distinct status because
90
+ -- enabling writes must reconsider a previously accepted preview exactly once.
91
+ curate_input_hash TEXT,
92
+ curate_status TEXT,
93
+ curated_at TEXT
94
+ );
95
+ CREATE INDEX pages_role ON pages(role);
96
+ CREATE INDEX pages_type ON pages(type);
97
+ CREATE INDEX pages_updated ON pages(updated_at DESC);
98
+
99
+ -- The stat fast path. mtime+size decide whether to hash at all; sha256 is
100
+ -- the correctness path that catches a sync client preserving mtime.
101
+ CREATE TABLE files (
102
+ rel_path TEXT PRIMARY KEY,
103
+ size INTEGER NOT NULL,
104
+ mtime_ns TEXT NOT NULL,
105
+ sha256 TEXT NOT NULL,
106
+ kind TEXT NOT NULL,
107
+ page_id TEXT,
108
+ indexed_at TEXT NOT NULL
109
+ );
110
+ CREATE INDEX files_sha ON files(sha256);
111
+
112
+ -- A stored document is a memory object with its own row: bytes on disk
113
+ -- beside its page, plus extracted text, so a PDF is searchable by its content.
114
+ CREATE TABLE documents (
115
+ id TEXT PRIMARY KEY,
116
+ page_id TEXT REFERENCES pages(id) ON DELETE SET NULL,
117
+ rel_path TEXT NOT NULL UNIQUE,
118
+ mime TEXT,
119
+ sha256 TEXT NOT NULL,
120
+ label TEXT,
121
+ text TEXT,
122
+ summary TEXT,
123
+ page_count INTEGER,
124
+ ocr INTEGER NOT NULL DEFAULT 0,
125
+ bytes INTEGER NOT NULL DEFAULT 0,
126
+ indexed_at TEXT NOT NULL,
127
+ -- The file hash the current text was extracted from. The invalidation rule, written
128
+ -- down: text is re-extracted when this stops matching the file.
129
+ extracted_sha TEXT,
130
+ -- A scanner that produced 'passport.pdf' and 'passport-2.pdf' did not produce two
131
+ -- documents. Parts share a group_key — the rel_path of part one — which is what gives
132
+ -- them one owning page, one summary, and page numbers that run through the whole
133
+ -- thing rather than restarting at 1 halfway.
134
+ group_key TEXT,
135
+ part INTEGER NOT NULL DEFAULT 1,
136
+ -- Pages in the parts before this one, so a citation can say "page 5 of the passport"
137
+ -- rather than "page 2 of the second file", which is not a thing a reader can look up.
138
+ page_offset INTEGER NOT NULL DEFAULT 0,
139
+ -- Set on a *rendition*: 'contract.pdf.txt' is the same document in a format a reader
140
+ -- can open, not a second half of one. Parts concatenate; a rendition does not, and
141
+ -- treating one as the other returns every phrase in a contract twice against one
142
+ -- budget. A rendition carries no text of its own for that reason — the text is the
143
+ -- source's and is already indexed there. What it carries is the pointer back.
144
+ renders TEXT,
145
+ -- On the *source* row: the hash the rendition was last decided against. Set after a
146
+ -- write and after a decline, so a photo that earns no rendition is not reconsidered
147
+ -- every pass.
148
+ rendition_sha TEXT,
149
+ -- How the text was obtained: 'plain', 'textutil', 'text-layer', 'ocr', 'vision' or
150
+ -- 'none'. Recorded rather than reconstructed from the ocr flag, which cannot express
151
+ -- the case the distinction exists for — an image a model *described* rather than read.
152
+ extract_via TEXT,
153
+ confidence REAL
154
+ );
155
+ CREATE INDEX documents_page ON documents(page_id);
156
+ CREATE INDEX documents_sha ON documents(sha256);
157
+ CREATE INDEX documents_group ON documents(group_key, part);
158
+ CREATE INDEX documents_renders ON documents(renders);
159
+
160
+ -- A page's chunks and a document's chunks live in one table on purpose: FTS, the
161
+ -- vector table and rank fusion all read it, so a PDF's text is searched by the same
162
+ -- machinery as a note's with nothing new to keep in step. A document chunk carries
163
+ -- the owning page's id as well, which is what lets a hit inside a PDF surface as a
164
+ -- card for the page it belongs to. Migration 7 relaxes this for orphan documents.
165
+ CREATE TABLE chunks (
166
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
167
+ page_id TEXT NOT NULL REFERENCES pages(id) ON DELETE CASCADE,
168
+ ord INTEGER NOT NULL,
169
+ -- 'knowledge' or 'source' — a page can switch role mid-body at the
170
+ -- <!-- source --> fence, so this is a property of the chunk.
171
+ kind TEXT NOT NULL DEFAULT 'knowledge',
172
+ heading_path TEXT NOT NULL DEFAULT '',
173
+ text TEXT NOT NULL,
174
+ line_start INTEGER NOT NULL,
175
+ line_end INTEGER NOT NULL,
176
+ -- Set once the chunk's vector is present, so a partial embed is visible
177
+ -- rather than looking like a complete index with poor recall.
178
+ embedded INTEGER NOT NULL DEFAULT 0,
179
+ document_id TEXT REFERENCES documents(id) ON DELETE CASCADE,
180
+ -- The page number *within the document*. NULL for a format with no pages: a .txt
181
+ -- file has none, and inventing "page 1" would be a claim rather than a fact.
182
+ doc_page INTEGER
183
+ );
184
+ CREATE INDEX chunks_page ON chunks(page_id, ord);
185
+ CREATE INDEX chunks_embedded ON chunks(embedded);
186
+ CREATE INDEX chunks_document ON chunks(document_id, ord);
187
+
188
+ -- External-content FTS5: the text lives in 'chunks' and is never duplicated.
189
+ -- Porter stemming means "renewing" finds "renews" without a model.
190
+ CREATE VIRTUAL TABLE chunks_fts USING fts5(
191
+ text,
192
+ heading_path,
193
+ content='chunks',
194
+ content_rowid='id',
195
+ tokenize='porter unicode61 remove_diacritics 2'
196
+ );
197
+
198
+ -- A fact is a pointer into Markdown, not a record beside it. Edit the
199
+ -- line, the hash breaks, the fact is re-derived. Delete the line, it is gone.
200
+ CREATE TABLE facts (
201
+ id TEXT PRIMARY KEY,
202
+ page_id TEXT NOT NULL REFERENCES pages(id) ON DELETE CASCADE,
203
+ claim TEXT NOT NULL,
204
+ subject TEXT,
205
+ attribute TEXT,
206
+ value TEXT,
207
+ line_start INTEGER NOT NULL,
208
+ line_end INTEGER NOT NULL,
209
+ source_line_hash TEXT NOT NULL,
210
+ confidence REAL NOT NULL DEFAULT 0.5,
211
+ valid_from TEXT,
212
+ -- Set when a value is replaced. A superseded fact is returned *as*
213
+ -- superseded, never as a second competing current answer.
214
+ valid_to TEXT,
215
+ first_seen TEXT NOT NULL,
216
+ last_seen TEXT NOT NULL,
217
+ -- Managed content carries this stable id in Markdown. A fact derived from a reworded
218
+ -- or moved unit follows it instead of manufacturing a supersession on the night the
219
+ -- page was merely reformatted.
220
+ item_id TEXT
221
+ );
222
+ CREATE INDEX facts_page ON facts(page_id, line_start);
223
+ CREATE INDEX facts_subject ON facts(subject, attribute);
224
+ CREATE INDEX facts_live ON facts(valid_to);
225
+ CREATE INDEX facts_item ON facts(item_id);
226
+
227
+ -- Dated lines are indexed from any page, not just the ledger, so events typed
228
+ -- into someone's own daily notes are found for free.
229
+ CREATE TABLE events (
230
+ id TEXT PRIMARY KEY,
231
+ date TEXT NOT NULL,
232
+ summary TEXT NOT NULL,
233
+ -- The page the event *links to*, when it has one.
234
+ target_slug TEXT,
235
+ -- The page the line was *written on*.
236
+ source_slug TEXT NOT NULL,
237
+ source_page TEXT REFERENCES pages(id) ON DELETE CASCADE,
238
+ line INTEGER
239
+ );
240
+ CREATE INDEX events_date ON events(date DESC);
241
+ CREATE INDEX events_target ON events(target_slug);
242
+
243
+ CREATE TABLE links (
244
+ from_page TEXT NOT NULL REFERENCES pages(id) ON DELETE CASCADE,
245
+ to_slug TEXT NOT NULL,
246
+ to_page TEXT,
247
+ kind TEXT NOT NULL DEFAULT 'wikilink',
248
+ line INTEGER,
249
+ broken INTEGER NOT NULL DEFAULT 0
250
+ );
251
+ CREATE INDEX links_from ON links(from_page);
252
+ CREATE INDEX links_to ON links(to_slug);
253
+
254
+ -- One row per change. The unit 'undo' takes: a single 'write' can touch a page, the
255
+ -- event ledger and an attachment, and undo has to reverse all of them or none.
256
+ CREATE TABLE changes (
257
+ id TEXT PRIMARY KEY,
258
+ at TEXT NOT NULL,
259
+ -- Who asked: 'agent', 'user', 'akno' (the observe tier), 'inbox'.
260
+ actor TEXT NOT NULL,
261
+ op TEXT NOT NULL,
262
+ summary TEXT NOT NULL,
263
+ -- 'applied' | 'undone'. An undone change is kept: it is the record that
264
+ -- something was reversed, which a reader needs as much as the change itself.
265
+ status TEXT NOT NULL DEFAULT 'applied',
266
+ undone_at TEXT
267
+ );
268
+ -- Ordering is by rowid, which SQLite increments monotonically. 'at' has
269
+ -- millisecond resolution and two changes can share one, so it cannot order them.
270
+ CREATE INDEX changes_at ON changes(at DESC);
271
+
272
+ -- One row per file the change touched, in application order. 'before' holds the
273
+ -- previous bytes rather than a pointer to them, which is why undo survives a
274
+ -- full rebuild of every other table: only the journal is irreplaceable.
275
+ CREATE TABLE change_files (
276
+ change_id TEXT NOT NULL REFERENCES changes(id) ON DELETE CASCADE,
277
+ ord INTEGER NOT NULL,
278
+ rel_path TEXT NOT NULL,
279
+ action TEXT NOT NULL,
280
+ before TEXT,
281
+ after TEXT,
282
+ -- Set instead of 'before' for a binary: the bytes live in trash/<change>/.
283
+ snapshot TEXT,
284
+ -- Where a moved file went. Without it undo reverses "no prior content" by deleting,
285
+ -- which for an attachment ate the binary; with it the reversal is a rename, which
286
+ -- is what the change was.
287
+ moved_to TEXT,
288
+ PRIMARY KEY (change_id, ord)
289
+ );
290
+ CREATE INDEX change_files_path ON change_files(rel_path);
291
+
292
+ -- A declined proposal is remembered, so an agent stops re-asking for the
293
+ -- same folder. The pending content is held here, so approving completes the
294
+ -- write rather than asking the caller to repeat it.
295
+ CREATE TABLE proposals (
296
+ id TEXT PRIMARY KEY,
297
+ at TEXT NOT NULL,
298
+ kind TEXT NOT NULL,
299
+ reason TEXT NOT NULL,
300
+ -- What is being asked for, e.g. the top-level folder a write would create.
301
+ subject TEXT NOT NULL,
302
+ -- The op input, replayed verbatim on approval.
303
+ payload TEXT NOT NULL,
304
+ nearest TEXT NOT NULL DEFAULT '[]',
305
+ status TEXT NOT NULL DEFAULT 'pending',
306
+ resolved_at TEXT,
307
+ -- Set when approving produced a change, so a proposal can be traced to it.
308
+ change_id TEXT
309
+ );
310
+ CREATE INDEX proposals_status ON proposals(status);
311
+ CREATE INDEX proposals_subject ON proposals(subject, status);
312
+ `,
313
+ // ── 2. Durable maintenance plans ──────────────────────────────────────────
314
+ // Full proposed bytes live here rather than in the human-gate proposal table. A maintenance
315
+ // item is independently decidable, may outlive the process that planned it, and points to the
316
+ // journal change that eventually applied it.
317
+ `
318
+ CREATE TABLE maintenance_plans (
319
+ id TEXT PRIMARY KEY,
320
+ created_at TEXT NOT NULL,
321
+ updated_at TEXT NOT NULL,
322
+ mode TEXT NOT NULL,
323
+ phase TEXT NOT NULL,
324
+ status TEXT NOT NULL,
325
+ fingerprint TEXT NOT NULL,
326
+ summary TEXT NOT NULL,
327
+ error TEXT
328
+ );
329
+ CREATE INDEX maintenance_plans_status ON maintenance_plans(status, created_at DESC);
330
+ CREATE INDEX maintenance_plans_fingerprint ON maintenance_plans(fingerprint, mode, status);
331
+
332
+ CREATE TABLE maintenance_items (
333
+ id TEXT PRIMARY KEY,
334
+ plan_id TEXT NOT NULL REFERENCES maintenance_plans(id) ON DELETE CASCADE,
335
+ ord INTEGER NOT NULL,
336
+ revision INTEGER NOT NULL DEFAULT 1,
337
+ kind TEXT NOT NULL,
338
+ risk TEXT NOT NULL,
339
+ status TEXT NOT NULL,
340
+ subject TEXT NOT NULL,
341
+ rationale TEXT NOT NULL,
342
+ input_hash TEXT NOT NULL,
343
+ operations TEXT NOT NULL,
344
+ checks TEXT NOT NULL DEFAULT '[]',
345
+ decision_actor TEXT,
346
+ decision_outcome TEXT,
347
+ decision_reason TEXT,
348
+ decided_at TEXT,
349
+ change_id TEXT,
350
+ verification TEXT,
351
+ updated_at TEXT NOT NULL,
352
+ UNIQUE(plan_id, ord)
353
+ );
354
+ CREATE INDEX maintenance_items_plan ON maintenance_items(plan_id, ord);
355
+ CREATE INDEX maintenance_items_status ON maintenance_items(status, updated_at DESC);
356
+ `,
357
+ // ── 3. Evidence supplied to the independent maintenance curator ──────────
358
+ // Exact page operations were already durable. Synthesis decisions also need the bounded
359
+ // evidence graph that justified new knowledge, kept in state_dir with the private plan.
360
+ `
361
+ ALTER TABLE maintenance_items ADD COLUMN evidence TEXT NOT NULL DEFAULT '[]';
362
+ `,
363
+ // ── 4. Content-addressed typed conflict verdicts ──────────────────────────
364
+ // A verdict is derived state, but caching it is what makes an unchanged nightly cycle converge
365
+ // instead of paying a classifier to reach the same decision forever.
366
+ `
367
+ CREATE TABLE conflict_verdicts (
368
+ fingerprint TEXT NOT NULL,
369
+ model_id TEXT NOT NULL,
370
+ prompt_version TEXT NOT NULL,
371
+ verdict TEXT NOT NULL,
372
+ current_slug TEXT,
373
+ reason TEXT,
374
+ updated_at TEXT NOT NULL,
375
+ PRIMARY KEY (fingerprint, model_id, prompt_version)
376
+ );
377
+ `,
378
+ // ── 5. Evidence-backed qualified conflict verdicts ────────────────────────
379
+ // The JSON contains exact claim references and the verbatim scope phrase. Keeping it with the
380
+ // cached verdict avoids rerunning a classifier while preserving everything needed by planning.
381
+ `
382
+ ALTER TABLE conflict_verdicts ADD COLUMN qualification TEXT;
383
+ `,
384
+ // ── 6. Content-safe dream lifecycle receipts ─────────────────────────────
385
+ // Exact page content belongs in sealed plan items and the opt-in private log. This table is
386
+ // deliberately safe for routine status output: fingerprints, counts, ids, and typed outcomes.
387
+ `
388
+ CREATE TABLE maintenance_runs (
389
+ id TEXT PRIMARY KEY,
390
+ started_at TEXT NOT NULL,
391
+ finished_at TEXT,
392
+ status TEXT NOT NULL,
393
+ receipt TEXT NOT NULL,
394
+ error_code TEXT
395
+ );
396
+ CREATE INDEX maintenance_runs_status ON maintenance_runs(status, started_at DESC);
397
+ `,
398
+ // ── 7. First-class orphan document chunks ────────────────────────────────
399
+ // Chunks are derived, but preserving their ids keeps FTS citations stable through the migration.
400
+ // Existing vectors are re-embedded because the fallback table follows the renamed parent table.
401
+ `
402
+ DROP TABLE IF EXISTS vec_fallback;
403
+ DROP TABLE chunks_fts;
404
+ ALTER TABLE chunks RENAME TO chunks_page_only;
405
+
406
+ CREATE TABLE chunks (
407
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
408
+ page_id TEXT REFERENCES pages(id) ON DELETE CASCADE,
409
+ ord INTEGER NOT NULL,
410
+ kind TEXT NOT NULL DEFAULT 'knowledge',
411
+ heading_path TEXT NOT NULL DEFAULT '',
412
+ text TEXT NOT NULL,
413
+ line_start INTEGER NOT NULL,
414
+ line_end INTEGER NOT NULL,
415
+ embedded INTEGER NOT NULL DEFAULT 0,
416
+ document_id TEXT REFERENCES documents(id) ON DELETE CASCADE,
417
+ doc_page INTEGER,
418
+ CHECK (page_id IS NOT NULL OR document_id IS NOT NULL)
419
+ );
420
+ INSERT INTO chunks(id, page_id, ord, kind, heading_path, text, line_start, line_end,
421
+ embedded, document_id, doc_page)
422
+ SELECT id, page_id, ord, kind, heading_path, text, line_start, line_end,
423
+ 0, document_id, doc_page
424
+ FROM chunks_page_only;
425
+ DROP TABLE chunks_page_only;
426
+
427
+ CREATE INDEX chunks_page ON chunks(page_id, ord);
428
+ CREATE INDEX chunks_embedded ON chunks(embedded);
429
+ CREATE INDEX chunks_document ON chunks(document_id, ord);
430
+ CREATE VIRTUAL TABLE chunks_fts USING fts5(
431
+ text,
432
+ heading_path,
433
+ content='chunks',
434
+ content_rowid='id',
435
+ tokenize='porter unicode61 remove_diacritics 2'
436
+ );
437
+ INSERT INTO chunks_fts(chunks_fts) VALUES('rebuild');
438
+ `,
439
+ // ── 8. Durable document availability ─────────────────────────────────────
440
+ // Extracted text may outlive an original file. Preserve that evidence and say
441
+ // that it is a retained copy instead of silently turning a missing file into
442
+ // "nothing recorded". Explicit forget remains the operation that removes rows.
443
+ `
444
+ ALTER TABLE documents ADD COLUMN availability TEXT NOT NULL DEFAULT 'available';
445
+ ALTER TABLE documents ADD COLUMN missing_since TEXT;
446
+ CREATE INDEX documents_availability ON documents(availability, page_id);
447
+ `,
448
+ // ── 9. Document filesystem date evidence ─────────────────────────────────
449
+ // Copied onto the document row because `files` is removed when an original
450
+ // disappears. Timeline can then keep saying exactly which metadata date it
451
+ // knows instead of turning a missing source into an empty result.
452
+ `
453
+ ALTER TABLE documents ADD COLUMN file_created_at TEXT;
454
+ ALTER TABLE documents ADD COLUMN file_modified_at TEXT;
455
+ UPDATE documents
456
+ SET file_modified_at = (
457
+ SELECT datetime(CAST(files.mtime_ns AS INTEGER) / 1000000000.0, 'unixepoch')
458
+ FROM files WHERE files.rel_path = documents.rel_path
459
+ )
460
+ WHERE file_modified_at IS NULL;
461
+ `,
462
+ // ── 10. Per-item maintenance authority ──────────────────────────────────
463
+ // Mixed plans need the curator and recovery path to know which exact items are autonomous.
464
+ // Existing sealed items inherit their plan's historical mode byte-for-byte.
465
+ `
466
+ ALTER TABLE maintenance_items ADD COLUMN policy TEXT NOT NULL DEFAULT 'audit';
467
+ UPDATE maintenance_items
468
+ SET policy = COALESCE(
469
+ (SELECT mode FROM maintenance_plans WHERE maintenance_plans.id = maintenance_items.plan_id),
470
+ 'audit'
471
+ );
472
+ `,
473
+ // ── 11. Typed maintenance deferral reasons ──────────────────────────────
474
+ // Human-readable detail remains in decision_reason; automation must not parse prose to detect backlog.
475
+ `
476
+ ALTER TABLE maintenance_items ADD COLUMN status_code TEXT;
477
+ `,
478
+ // ── 12. Rebuildable structural evidence graph ───────────────────────────
479
+ // These rows are pointers into the canonical page/document/event tables, never another
480
+ // knowledge store. The indexer replaces the complete structural graph transactionally.
481
+ `
482
+ CREATE TABLE graph_nodes (
483
+ id TEXT PRIMARY KEY,
484
+ kind TEXT NOT NULL,
485
+ source_id TEXT NOT NULL,
486
+ source_hash TEXT NOT NULL,
487
+ derivation_version TEXT NOT NULL,
488
+ UNIQUE(kind, source_id)
489
+ );
490
+ CREATE INDEX graph_nodes_kind ON graph_nodes(kind, source_id);
491
+
492
+ CREATE TABLE graph_edges (
493
+ id TEXT PRIMARY KEY,
494
+ from_node TEXT NOT NULL REFERENCES graph_nodes(id) ON DELETE CASCADE,
495
+ to_node TEXT NOT NULL REFERENCES graph_nodes(id) ON DELETE CASCADE,
496
+ relation TEXT NOT NULL,
497
+ predicate TEXT,
498
+ source_kind TEXT NOT NULL,
499
+ source_page TEXT REFERENCES pages(id) ON DELETE CASCADE,
500
+ source_document TEXT REFERENCES documents(id) ON DELETE CASCADE,
501
+ source_event TEXT REFERENCES events(id) ON DELETE CASCADE,
502
+ line_start INTEGER,
503
+ line_end INTEGER,
504
+ source_field TEXT,
505
+ source_hash TEXT NOT NULL,
506
+ derivation TEXT NOT NULL,
507
+ resolution TEXT NOT NULL,
508
+ confidence REAL NOT NULL,
509
+ derivation_version TEXT NOT NULL,
510
+ CHECK (confidence >= 0 AND confidence <= 1)
511
+ );
512
+ CREATE INDEX graph_edges_from ON graph_edges(from_node, relation);
513
+ CREATE INDEX graph_edges_to ON graph_edges(to_node, relation);
514
+ CREATE INDEX graph_edges_source_page ON graph_edges(source_page);
515
+ CREATE INDEX graph_edges_source_document ON graph_edges(source_document);
516
+ CREATE INDEX graph_edges_source_event ON graph_edges(source_event);
517
+ `,
518
+ // ── 13. Canonical graph entities and conservative mention resolution ──
519
+ // An entity is anchored to one canonical knowledge page. Names and mention outcomes stay
520
+ // separate so an ambiguous name is inspectable without becoming a traversable graph edge.
521
+ `
522
+ CREATE TABLE graph_entities (
523
+ id TEXT PRIMARY KEY,
524
+ canonical_page TEXT NOT NULL UNIQUE REFERENCES pages(id) ON DELETE CASCADE,
525
+ entity_type TEXT NOT NULL,
526
+ label TEXT NOT NULL,
527
+ normalized_label TEXT NOT NULL,
528
+ source_hash TEXT NOT NULL,
529
+ derivation_version TEXT NOT NULL
530
+ );
531
+ CREATE INDEX graph_entities_type ON graph_entities(entity_type, canonical_page);
532
+
533
+ CREATE TABLE graph_entity_names (
534
+ entity_id TEXT NOT NULL REFERENCES graph_entities(id) ON DELETE CASCADE,
535
+ name TEXT NOT NULL,
536
+ normalized_name TEXT NOT NULL,
537
+ signal TEXT NOT NULL,
538
+ source_page TEXT NOT NULL REFERENCES pages(id) ON DELETE CASCADE,
539
+ source_hash TEXT NOT NULL,
540
+ derivation_version TEXT NOT NULL,
541
+ PRIMARY KEY(entity_id, normalized_name, signal)
542
+ );
543
+ CREATE INDEX graph_entity_names_normalized
544
+ ON graph_entity_names(normalized_name, signal, entity_id);
545
+
546
+ CREATE TABLE graph_mentions (
547
+ id TEXT PRIMARY KEY,
548
+ mention TEXT NOT NULL,
549
+ normalized_mention TEXT NOT NULL,
550
+ source_page TEXT NOT NULL REFERENCES pages(id) ON DELETE CASCADE,
551
+ source_field TEXT NOT NULL,
552
+ source_line INTEGER,
553
+ source_hash TEXT NOT NULL,
554
+ resolved_entity TEXT REFERENCES graph_entities(id) ON DELETE SET NULL,
555
+ resolution TEXT NOT NULL,
556
+ signal TEXT,
557
+ candidates TEXT NOT NULL DEFAULT '[]',
558
+ derivation_version TEXT NOT NULL,
559
+ CHECK (resolution IN ('exact', 'ambiguous', 'unresolved'))
560
+ );
561
+ CREATE INDEX graph_mentions_source ON graph_mentions(source_page, source_field);
562
+ CREATE INDEX graph_mentions_entity ON graph_mentions(resolved_entity);
563
+ CREATE INDEX graph_mentions_normalized ON graph_mentions(normalized_mention, resolution);
564
+ `,
565
+ // ── 14. Provenance-bound fact relationships and eligibility ────────────
566
+ // All derived facts remain inspectable, but only exact, current, conflict-eligible claims
567
+ // become default-traversable edges. Direct entity relationships retain their fact locator.
568
+ `
569
+ ALTER TABLE graph_edges ADD COLUMN source_fact TEXT REFERENCES facts(id) ON DELETE CASCADE;
570
+ ALTER TABLE graph_edges ADD COLUMN valid_from TEXT;
571
+ ALTER TABLE graph_edges ADD COLUMN valid_to TEXT;
572
+ CREATE INDEX graph_edges_source_fact ON graph_edges(source_fact);
573
+ CREATE INDEX graph_edges_current ON graph_edges(valid_to, relation);
574
+
575
+ CREATE TABLE graph_fact_status (
576
+ fact_id TEXT PRIMARY KEY REFERENCES facts(id) ON DELETE CASCADE,
577
+ subject_entity TEXT REFERENCES graph_entities(id) ON DELETE SET NULL,
578
+ object_entity TEXT REFERENCES graph_entities(id) ON DELETE SET NULL,
579
+ subject_resolution TEXT NOT NULL,
580
+ subject_candidates TEXT NOT NULL DEFAULT '[]',
581
+ object_resolution TEXT NOT NULL,
582
+ object_candidates TEXT NOT NULL DEFAULT '[]',
583
+ predicate TEXT,
584
+ eligibility TEXT NOT NULL,
585
+ traversable INTEGER NOT NULL DEFAULT 0,
586
+ conflict_fingerprint TEXT,
587
+ source_hash TEXT NOT NULL,
588
+ derivation_version TEXT NOT NULL,
589
+ CHECK (subject_resolution IN ('missing', 'exact', 'ambiguous', 'unresolved')),
590
+ CHECK (object_resolution IN ('scalar', 'exact', 'ambiguous')),
591
+ CHECK (eligibility IN (
592
+ 'eligible', 'superseded', 'low_confidence', 'conflict_unverified',
593
+ 'conflict_unresolved', 'conflict_qualified', 'conflict_superseded'
594
+ )),
595
+ CHECK (traversable IN (0, 1))
596
+ );
597
+ CREATE INDEX graph_fact_status_subject ON graph_fact_status(subject_entity, traversable);
598
+ CREATE INDEX graph_fact_status_object ON graph_fact_status(object_entity, traversable);
599
+ CREATE INDEX graph_fact_status_eligibility ON graph_fact_status(eligibility, traversable);
600
+ `,
601
+ // ── 15. Provenance-bound contextual entity verdicts ───────────────────
602
+ // Verdicts are a cache over authored evidence, not knowledge. Rebuilding the graph applies
603
+ // only a verdict whose source and candidate fingerprints still match.
604
+ `
605
+ DROP INDEX graph_fact_status_subject;
606
+ DROP INDEX graph_fact_status_object;
607
+ DROP INDEX graph_fact_status_eligibility;
608
+ DROP INDEX graph_mentions_source;
609
+ DROP INDEX graph_mentions_entity;
610
+ DROP INDEX graph_mentions_normalized;
611
+ ALTER TABLE graph_fact_status RENAME TO graph_fact_status_v21;
612
+ ALTER TABLE graph_mentions RENAME TO graph_mentions_v21;
613
+
614
+ CREATE TABLE graph_mentions (
615
+ id TEXT PRIMARY KEY,
616
+ mention TEXT NOT NULL,
617
+ normalized_mention TEXT NOT NULL,
618
+ source_page TEXT NOT NULL REFERENCES pages(id) ON DELETE CASCADE,
619
+ source_field TEXT NOT NULL,
620
+ source_line INTEGER,
621
+ source_hash TEXT NOT NULL,
622
+ resolved_entity TEXT REFERENCES graph_entities(id) ON DELETE SET NULL,
623
+ resolution TEXT NOT NULL,
624
+ signal TEXT,
625
+ candidates TEXT NOT NULL DEFAULT '[]',
626
+ decision_fingerprint TEXT,
627
+ model_id TEXT,
628
+ prompt_version TEXT,
629
+ confidence REAL,
630
+ derivation_version TEXT NOT NULL,
631
+ CHECK (resolution IN ('exact', 'contextual', 'ambiguous', 'unresolved')),
632
+ CHECK (confidence IS NULL OR (confidence >= 0 AND confidence <= 1))
633
+ );
634
+ INSERT INTO graph_mentions(
635
+ id, mention, normalized_mention, source_page, source_field, source_line, source_hash,
636
+ resolved_entity, resolution, signal, candidates, confidence, derivation_version
637
+ )
638
+ SELECT id, mention, normalized_mention, source_page, source_field, source_line, source_hash,
639
+ resolved_entity, resolution, signal, candidates,
640
+ CASE WHEN resolution = 'exact' THEN 1 ELSE NULL END,
641
+ derivation_version
642
+ FROM graph_mentions_v21;
643
+ DROP TABLE graph_mentions_v21;
644
+ CREATE INDEX graph_mentions_source ON graph_mentions(source_page, source_field);
645
+ CREATE INDEX graph_mentions_entity ON graph_mentions(resolved_entity);
646
+ CREATE INDEX graph_mentions_normalized ON graph_mentions(normalized_mention, resolution);
647
+
648
+ CREATE TABLE graph_fact_status (
649
+ fact_id TEXT PRIMARY KEY REFERENCES facts(id) ON DELETE CASCADE,
650
+ subject_entity TEXT REFERENCES graph_entities(id) ON DELETE SET NULL,
651
+ object_entity TEXT REFERENCES graph_entities(id) ON DELETE SET NULL,
652
+ subject_resolution TEXT NOT NULL,
653
+ subject_candidates TEXT NOT NULL DEFAULT '[]',
654
+ subject_resolution_fingerprint TEXT,
655
+ object_resolution TEXT NOT NULL,
656
+ object_candidates TEXT NOT NULL DEFAULT '[]',
657
+ object_resolution_fingerprint TEXT,
658
+ predicate TEXT,
659
+ eligibility TEXT NOT NULL,
660
+ traversable INTEGER NOT NULL DEFAULT 0,
661
+ conflict_fingerprint TEXT,
662
+ source_hash TEXT NOT NULL,
663
+ derivation_version TEXT NOT NULL,
664
+ CHECK (subject_resolution IN ('missing', 'exact', 'contextual', 'ambiguous', 'unresolved')),
665
+ CHECK (object_resolution IN ('scalar', 'exact', 'contextual', 'ambiguous')),
666
+ CHECK (eligibility IN (
667
+ 'eligible', 'superseded', 'low_confidence', 'conflict_unverified',
668
+ 'conflict_unresolved', 'conflict_qualified', 'conflict_superseded'
669
+ )),
670
+ CHECK (traversable IN (0, 1))
671
+ );
672
+ INSERT INTO graph_fact_status(
673
+ fact_id, subject_entity, object_entity, subject_resolution, subject_candidates,
674
+ object_resolution, object_candidates, predicate, eligibility, traversable,
675
+ conflict_fingerprint, source_hash, derivation_version
676
+ )
677
+ SELECT fact_id, subject_entity, object_entity, subject_resolution, subject_candidates,
678
+ object_resolution, object_candidates, predicate, eligibility, traversable,
679
+ conflict_fingerprint, source_hash, derivation_version
680
+ FROM graph_fact_status_v21;
681
+ DROP TABLE graph_fact_status_v21;
682
+ CREATE INDEX graph_fact_status_subject ON graph_fact_status(subject_entity, traversable);
683
+ CREATE INDEX graph_fact_status_object ON graph_fact_status(object_entity, traversable);
684
+ CREATE INDEX graph_fact_status_eligibility ON graph_fact_status(eligibility, traversable);
685
+
686
+ CREATE TABLE graph_resolution_verdicts (
687
+ fingerprint TEXT NOT NULL,
688
+ model_id TEXT NOT NULL,
689
+ prompt_version TEXT NOT NULL,
690
+ outcome TEXT NOT NULL,
691
+ selected_entity TEXT,
692
+ grades TEXT NOT NULL,
693
+ rationale TEXT NOT NULL,
694
+ source_hash TEXT NOT NULL,
695
+ candidate_fingerprint TEXT NOT NULL,
696
+ created_at TEXT NOT NULL,
697
+ PRIMARY KEY(fingerprint, model_id, prompt_version),
698
+ CHECK (outcome IN ('resolved', 'unresolved'))
699
+ );
700
+ CREATE INDEX graph_resolution_verdicts_model
701
+ ON graph_resolution_verdicts(model_id, prompt_version, created_at);
702
+ `,
703
+ // ── 23. Two-stage maintenance-plan retention ─────────────────────────────
704
+ // Terminal exact payloads can be stripped while compact decisions and receipts remain
705
+ // inspectable. The timestamp makes an empty operation list unambiguous to every caller.
706
+ `
707
+ ALTER TABLE maintenance_plans ADD COLUMN payload_pruned_at TEXT;
708
+ `,
709
+ // Component identity lives in private evidence, but its count is part of the compact receipt
710
+ // that survives payload pruning. Backfill it before any old evidence can expire.
711
+ `
712
+ ALTER TABLE maintenance_items ADD COLUMN component_count INTEGER NOT NULL DEFAULT 1;
713
+ UPDATE maintenance_items
714
+ SET component_count = max(1, (
715
+ SELECT count(*) FROM json_each(
716
+ CASE WHEN json_valid(maintenance_items.evidence) THEN maintenance_items.evidence ELSE '[]' END
717
+ )
718
+ WHERE json_extract(json_each.value, '$.type') = 'component'
719
+ ));
720
+ `,
721
+ // Model decisions are derived cache, not knowledge. Binding them to exact page hashes,
722
+ // endpoints, and prompt/signature versions prevents a stale rejection or acceptance from
723
+ // surviving any input or runtime-contract change. No page text or model rationale is stored.
724
+ `
725
+ CREATE TABLE semantic_merge_verdicts (
726
+ fingerprint TEXT PRIMARY KEY,
727
+ left_page TEXT NOT NULL REFERENCES pages(id) ON DELETE CASCADE,
728
+ right_page TEXT NOT NULL REFERENCES pages(id) ON DELETE CASCADE,
729
+ score REAL NOT NULL,
730
+ outcome TEXT NOT NULL,
731
+ embedding_endpoint TEXT NOT NULL,
732
+ classifier_endpoint TEXT NOT NULL,
733
+ prompt_version TEXT NOT NULL,
734
+ signature_version TEXT NOT NULL,
735
+ created_at TEXT NOT NULL,
736
+ CHECK (outcome IN ('same_subject', 'keep_separate')),
737
+ CHECK (left_page != right_page)
738
+ );
739
+ CREATE INDEX semantic_merge_verdicts_pages
740
+ ON semantic_merge_verdicts(left_page, right_page, created_at);
741
+ `,
742
+ // Complete-page embeddings are derived cache, not knowledge. The source hash binds the
743
+ // vector to the exact classifier input without retaining its text, and the endpoint/signature
744
+ // fields invalidate it when the model or input contract changes.
745
+ `
746
+ CREATE TABLE semantic_merge_embeddings (
747
+ fingerprint TEXT PRIMARY KEY,
748
+ page_id TEXT NOT NULL REFERENCES pages(id) ON DELETE CASCADE,
749
+ source_hash TEXT NOT NULL,
750
+ embedding_endpoint TEXT NOT NULL,
751
+ signature_version TEXT NOT NULL,
752
+ dimensions INTEGER NOT NULL,
753
+ embedding BLOB NOT NULL,
754
+ created_at TEXT NOT NULL,
755
+ CHECK (dimensions > 0)
756
+ );
757
+ CREATE INDEX semantic_merge_embeddings_page
758
+ ON semantic_merge_embeddings(page_id, created_at);
759
+ `,
760
+ // Managed-item placement is a semantic qualification over exact current page bytes. The
761
+ // verdict cache stores only item ids, outcomes, and opaque destination-heading fingerprints;
762
+ // page text, headings, and model rationale remain absent from derived state.
763
+ `
764
+ CREATE TABLE managed_item_placement_verdicts (
765
+ fingerprint TEXT PRIMARY KEY,
766
+ page_id TEXT NOT NULL REFERENCES pages(id) ON DELETE CASCADE,
767
+ source_hash TEXT NOT NULL,
768
+ classifier_endpoint TEXT NOT NULL,
769
+ prompt_version TEXT NOT NULL,
770
+ signature_version TEXT NOT NULL,
771
+ verdicts TEXT NOT NULL,
772
+ created_at TEXT NOT NULL
773
+ );
774
+ CREATE INDEX managed_item_placement_verdicts_page
775
+ ON managed_item_placement_verdicts(page_id, created_at);
776
+ `,
777
+ // A retained exact quote is the narrow durable evidence that permits later verification of
778
+ // model-phrased managed prose. The complete conversation is represented only by a hash. Source
779
+ // verdicts are derived cache and may retain a bounded proposed replacement, never a rationale.
780
+ `
781
+ CREATE TABLE managed_item_sources (
782
+ item_id TEXT PRIMARY KEY,
783
+ source_ref TEXT NOT NULL,
784
+ origin TEXT NOT NULL,
785
+ evidence TEXT NOT NULL,
786
+ evidence_hash TEXT NOT NULL,
787
+ input_hash TEXT NOT NULL,
788
+ created_at TEXT NOT NULL,
789
+ CHECK (origin IN ('user', 'assistant', 'unknown'))
790
+ );
791
+
792
+ CREATE TABLE managed_item_source_verdicts (
793
+ fingerprint TEXT PRIMARY KEY,
794
+ page_id TEXT NOT NULL REFERENCES pages(id) ON DELETE CASCADE,
795
+ source_hash TEXT NOT NULL,
796
+ classifier_endpoint TEXT NOT NULL,
797
+ prompt_version TEXT NOT NULL,
798
+ signature_version TEXT NOT NULL,
799
+ verdicts TEXT NOT NULL,
800
+ created_at TEXT NOT NULL
801
+ );
802
+ CREATE INDEX managed_item_source_verdicts_page
803
+ ON managed_item_source_verdicts(page_id, created_at);
804
+ `,
805
+ // Cross-page routing caches only identities, outcomes, and a destination-heading fingerprint.
806
+ // Exact candidate page bytes remain in the knowledge base and exact moves remain in private plans.
807
+ `
808
+ CREATE TABLE managed_item_routing_verdicts (
809
+ fingerprint TEXT PRIMARY KEY,
810
+ source_page TEXT NOT NULL REFERENCES pages(id) ON DELETE CASCADE,
811
+ item_id TEXT NOT NULL,
812
+ candidate_hash TEXT NOT NULL,
813
+ classifier_endpoint TEXT NOT NULL,
814
+ retrieval_signature TEXT NOT NULL,
815
+ prompt_version TEXT NOT NULL,
816
+ signature_version TEXT NOT NULL,
817
+ outcome TEXT NOT NULL,
818
+ target_page TEXT REFERENCES pages(id) ON DELETE CASCADE,
819
+ target_heading_key TEXT,
820
+ created_at TEXT NOT NULL,
821
+ CHECK (outcome IN ('keep', 'move', 'uncertain')),
822
+ CHECK ((outcome = 'move' AND target_page IS NOT NULL AND target_heading_key IS NOT NULL)
823
+ OR (outcome != 'move' AND target_page IS NULL AND target_heading_key IS NULL))
824
+ );
825
+ CREATE INDEX managed_item_routing_verdicts_source
826
+ ON managed_item_routing_verdicts(source_page, item_id, created_at);
827
+ `,
828
+ // Human corrections keep the old exact proposal and its decision immutable. The current
829
+ // maintenance_items row remains the apply head; every replaced head is sealed here first so
830
+ // review history survives restarts without making old revisions eligible for application.
831
+ `
832
+ CREATE TABLE maintenance_item_revisions (
833
+ item_id TEXT NOT NULL REFERENCES maintenance_items(id) ON DELETE CASCADE,
834
+ revision INTEGER NOT NULL,
835
+ status TEXT NOT NULL,
836
+ input_hash TEXT NOT NULL,
837
+ operations TEXT NOT NULL,
838
+ checks TEXT NOT NULL,
839
+ decision_actor TEXT,
840
+ decision_outcome TEXT,
841
+ decision_reason TEXT,
842
+ status_code TEXT,
843
+ decided_at TEXT,
844
+ revised_at TEXT NOT NULL,
845
+ revision_reason TEXT NOT NULL,
846
+ PRIMARY KEY(item_id, revision)
847
+ );
848
+ CREATE INDEX maintenance_item_revisions_item
849
+ ON maintenance_item_revisions(item_id, revision DESC);
850
+ `,
851
+ // The transition actor is distinct from the superseded proposal's decision actor: a human
852
+ // may revise an approved curator proposal, while an automatic revision records both as curator.
853
+ `
854
+ ALTER TABLE maintenance_item_revisions
855
+ ADD COLUMN revision_actor TEXT NOT NULL DEFAULT 'human';
856
+ `,
857
+ // An operator may lose a response after a decision or apply has already started. Bind an opaque
858
+ // retry key to the exact content-safe request fingerprint before replaying any effect. The plan
859
+ // and journal remain the result source of truth; duplicating private operations here would create
860
+ // a second retention surface.
861
+ `
862
+ CREATE TABLE maintenance_action_receipts (
863
+ idempotency_key TEXT PRIMARY KEY,
864
+ action TEXT NOT NULL,
865
+ request_hash TEXT NOT NULL,
866
+ plan_id TEXT NOT NULL REFERENCES maintenance_plans(id) ON DELETE CASCADE,
867
+ item_id TEXT,
868
+ started_at TEXT NOT NULL,
869
+ completed_at TEXT,
870
+ CHECK (action IN ('decide', 'apply')),
871
+ CHECK ((action = 'decide' AND item_id IS NOT NULL) OR (action = 'apply' AND item_id IS NULL))
872
+ );
873
+ CREATE INDEX maintenance_action_receipts_plan
874
+ ON maintenance_action_receipts(plan_id, action, started_at);
875
+ `,
876
+ // Persistent safety state is content-free and independent from the private plan payload. A
877
+ // terminal item is marked when its outcome contributes to the streak so a later run cannot
878
+ // count the same rollback again.
879
+ `
880
+ ALTER TABLE maintenance_items ADD COLUMN recovery_recorded_at TEXT;
881
+
882
+ CREATE TABLE maintenance_recovery_state (
883
+ scope_key TEXT PRIMARY KEY,
884
+ scope TEXT NOT NULL,
885
+ transform TEXT,
886
+ reason_code TEXT NOT NULL,
887
+ consecutive_failures INTEGER NOT NULL DEFAULT 0,
888
+ paused_at TEXT,
889
+ last_failure_at TEXT NOT NULL,
890
+ last_run_id TEXT NOT NULL,
891
+ updated_at TEXT NOT NULL,
892
+ CHECK (scope IN ('profile', 'transform')),
893
+ CHECK ((scope = 'profile' AND transform IS NULL) OR (scope = 'transform' AND transform IS NOT NULL)),
894
+ CHECK (consecutive_failures >= 0)
895
+ );
896
+ CREATE INDEX maintenance_recovery_state_paused
897
+ ON maintenance_recovery_state(scope, paused_at, updated_at);
898
+ `,
899
+ ];
900
+ /**
901
+ * The vector table is created separately: its dimension is fixed at creation
902
+ * and comes from the configured embedding model. Changing models triggers a
903
+ * re-embed rather than silently corrupting the index.
904
+ */
905
+ export function vectorTableDdl(dimensions) {
906
+ return `CREATE VIRTUAL TABLE vec_chunks USING vec0(
907
+ chunk_id INTEGER PRIMARY KEY,
908
+ embedding float[${dimensions}] distance_metric=cosine
909
+ )`;
910
+ }
911
+ /**
912
+ * Fallback when the sqlite-vec extension cannot be loaded on this platform.
913
+ * Cosine is computed in JS. Slower, but memory stays available: degrade,
914
+ * never fail.
915
+ */
916
+ export const VECTOR_FALLBACK_DDL = `
917
+ CREATE TABLE IF NOT EXISTS vec_fallback (
918
+ chunk_id INTEGER PRIMARY KEY REFERENCES chunks(id) ON DELETE CASCADE,
919
+ embedding BLOB NOT NULL,
920
+ norm REAL NOT NULL
921
+ )
922
+ `;
923
+ //# sourceMappingURL=migrations.js.map