@lix-js/sdk 0.5.0-preview.0 → 0.5.0-preview.1

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 (1378) hide show
  1. package/dist/account/create-account.d.ts +5 -5
  2. package/dist/account/create-account.d.ts.map +1 -1
  3. package/dist/account/create-account.js +2 -2
  4. package/dist/account/create-account.js.map +1 -1
  5. package/dist/account/index.d.ts +1 -1
  6. package/dist/account/index.d.ts.map +1 -1
  7. package/dist/account/schema.d.ts +23 -7
  8. package/dist/account/schema.d.ts.map +1 -1
  9. package/dist/account/schema.js +84 -27
  10. package/dist/account/schema.js.map +1 -1
  11. package/dist/account/schema.test.js +87 -83
  12. package/dist/account/schema.test.js.map +1 -1
  13. package/dist/account/switch-account.d.ts +2 -2
  14. package/dist/account/switch-account.d.ts.map +1 -1
  15. package/dist/account/switch-account.js +3 -4
  16. package/dist/account/switch-account.js.map +1 -1
  17. package/dist/account/switch-account.test.js +4 -4
  18. package/dist/account/switch-account.test.js.map +1 -1
  19. package/dist/change/apply-changes.d.ts +13 -0
  20. package/dist/change/apply-changes.d.ts.map +1 -1
  21. package/dist/change/apply-changes.js +14 -4
  22. package/dist/change/apply-changes.js.map +1 -1
  23. package/dist/change/apply-changes.test.js +91 -1
  24. package/dist/change/apply-changes.test.js.map +1 -1
  25. package/dist/change/create-change-v2.d.ts +11 -0
  26. package/dist/change/create-change-v2.d.ts.map +1 -0
  27. package/dist/change/create-change-v2.js +31 -0
  28. package/dist/change/create-change-v2.js.map +1 -0
  29. package/dist/change/create-change-v2.test.d.ts +2 -0
  30. package/dist/change/create-change-v2.test.d.ts.map +1 -0
  31. package/dist/change/create-change-v2.test.js +39 -0
  32. package/dist/change/create-change-v2.test.js.map +1 -0
  33. package/dist/change/create-change.d.ts +2 -2
  34. package/dist/change/create-change.d.ts.map +1 -1
  35. package/dist/change/create-change.js +3 -1
  36. package/dist/change/create-change.js.map +1 -1
  37. package/dist/change/create-change.test.js +4 -6
  38. package/dist/change/create-change.test.js.map +1 -1
  39. package/dist/change/index.d.ts +1 -1
  40. package/dist/change/index.d.ts.map +1 -1
  41. package/dist/change/index.js.map +1 -1
  42. package/dist/change/schema.d.ts +40 -2
  43. package/dist/change/schema.d.ts.map +1 -1
  44. package/dist/change/schema.js +50 -9
  45. package/dist/change/schema.js.map +1 -1
  46. package/dist/change/schema.test.js +33 -0
  47. package/dist/change/schema.test.js.map +1 -1
  48. package/dist/change-author/index.d.ts +1 -1
  49. package/dist/change-author/index.d.ts.map +1 -1
  50. package/dist/change-author/index.js +1 -1
  51. package/dist/change-author/index.js.map +1 -1
  52. package/dist/change-author/schema.d.ts +12 -9
  53. package/dist/change-author/schema.d.ts.map +1 -1
  54. package/dist/change-author/schema.js +16 -10
  55. package/dist/change-author/schema.js.map +1 -1
  56. package/dist/change-author/schema.test.js +283 -229
  57. package/dist/change-author/schema.test.js.map +1 -1
  58. package/dist/change-proposal/create-change-proposal.d.ts +3 -3
  59. package/dist/change-proposal/create-change-proposal.d.ts.map +1 -1
  60. package/dist/change-proposal/database-schema.js +1 -1
  61. package/dist/change-set/apply-change-set.d.ts +2 -2
  62. package/dist/change-set/apply-change-set.d.ts.map +1 -1
  63. package/dist/change-set/apply-change-set.js +40 -51
  64. package/dist/change-set/apply-change-set.js.map +1 -1
  65. package/dist/change-set/apply-change-set.test.js +6 -3
  66. package/dist/change-set/apply-change-set.test.js.map +1 -1
  67. package/dist/change-set/before-after-of-file.d.ts +31 -0
  68. package/dist/change-set/before-after-of-file.d.ts.map +1 -0
  69. package/dist/change-set/before-after-of-file.js +191 -0
  70. package/dist/change-set/before-after-of-file.js.map +1 -0
  71. package/dist/change-set/before-after-of-file.test.d.ts +2 -0
  72. package/dist/change-set/before-after-of-file.test.d.ts.map +1 -0
  73. package/dist/change-set/before-after-of-file.test.js +221 -0
  74. package/dist/change-set/before-after-of-file.test.js.map +1 -0
  75. package/dist/change-set/change-set-element-in-symmetric-difference.d.ts +2 -1
  76. package/dist/change-set/change-set-element-in-symmetric-difference.d.ts.map +1 -1
  77. package/dist/change-set/change-set-element-in-symmetric-difference.js.map +1 -1
  78. package/dist/change-set/change-set-element-in-symmetric-difference.test.js +204 -34
  79. package/dist/change-set/change-set-element-in-symmetric-difference.test.js.map +1 -1
  80. package/dist/change-set/checkout-change-set.d.ts +15 -0
  81. package/dist/change-set/checkout-change-set.d.ts.map +1 -0
  82. package/dist/change-set/checkout-change-set.js +64 -0
  83. package/dist/change-set/checkout-change-set.js.map +1 -0
  84. package/dist/change-set/checkout-change-set.test.d.ts +2 -0
  85. package/dist/change-set/checkout-change-set.test.d.ts.map +1 -0
  86. package/dist/change-set/checkout-change-set.test.js +127 -0
  87. package/dist/change-set/checkout-change-set.test.js.map +1 -0
  88. package/dist/change-set/create-change-set.d.ts +7 -9
  89. package/dist/change-set/create-change-set.d.ts.map +1 -1
  90. package/dist/change-set/create-change-set.js +3 -25
  91. package/dist/change-set/create-change-set.js.map +1 -1
  92. package/dist/change-set/create-change-set.test.js +0 -31
  93. package/dist/change-set/create-change-set.test.js.map +1 -1
  94. package/dist/change-set/create-checkpoint.d.ts.map +1 -1
  95. package/dist/change-set/create-checkpoint.js +11 -2
  96. package/dist/change-set/create-checkpoint.js.map +1 -1
  97. package/dist/change-set/create-checkpoint.test.js +53 -0
  98. package/dist/change-set/create-checkpoint.test.js.map +1 -1
  99. package/dist/change-set/create-merge-change-set.d.ts +4 -4
  100. package/dist/change-set/create-merge-change-set.d.ts.map +1 -1
  101. package/dist/change-set/create-transition-change-set.d.ts +4 -4
  102. package/dist/change-set/create-transition-change-set.d.ts.map +1 -1
  103. package/dist/change-set/create-undo-change-set.d.ts +5 -5
  104. package/dist/change-set/create-undo-change-set.d.ts.map +1 -1
  105. package/dist/change-set/create-undo-change-set.js +4 -3
  106. package/dist/change-set/create-undo-change-set.js.map +1 -1
  107. package/dist/change-set/database-schema.d.ts +39 -0
  108. package/dist/change-set/database-schema.d.ts.map +1 -0
  109. package/dist/change-set/database-schema.js +86 -0
  110. package/dist/change-set/database-schema.js.map +1 -0
  111. package/dist/change-set/database-schema.test.d.ts +2 -0
  112. package/dist/change-set/database-schema.test.d.ts.map +1 -0
  113. package/dist/change-set/database-schema.test.js +547 -0
  114. package/dist/change-set/database-schema.test.js.map +1 -0
  115. package/dist/change-set/diff-for-file.d.ts +29 -0
  116. package/dist/change-set/diff-for-file.d.ts.map +1 -0
  117. package/dist/change-set/diff-for-file.js +19 -0
  118. package/dist/change-set/diff-for-file.js.map +1 -0
  119. package/dist/change-set/get-before-after-of-file.d.ts +31 -0
  120. package/dist/change-set/get-before-after-of-file.d.ts.map +1 -0
  121. package/dist/change-set/get-before-after-of-file.js +189 -0
  122. package/dist/change-set/get-before-after-of-file.js.map +1 -0
  123. package/dist/change-set/get-before-after-of-file.test.d.ts +2 -0
  124. package/dist/change-set/get-before-after-of-file.test.d.ts.map +1 -0
  125. package/dist/change-set/get-before-after-of-file.test.js +220 -0
  126. package/dist/change-set/get-before-after-of-file.test.js.map +1 -0
  127. package/dist/change-set/index.d.ts +1 -5
  128. package/dist/change-set/index.d.ts.map +1 -1
  129. package/dist/change-set/index.js +1 -5
  130. package/dist/change-set/index.js.map +1 -1
  131. package/dist/change-set/merge-change-sets.d.ts +23 -0
  132. package/dist/change-set/merge-change-sets.d.ts.map +1 -0
  133. package/dist/change-set/merge-change-sets.js +69 -0
  134. package/dist/change-set/merge-change-sets.js.map +1 -0
  135. package/dist/change-set/merge-change-sets.test.d.ts +2 -0
  136. package/dist/change-set/merge-change-sets.test.d.ts.map +1 -0
  137. package/dist/change-set/merge-change-sets.test.js +184 -0
  138. package/dist/change-set/merge-change-sets.test.js.map +1 -0
  139. package/dist/change-set/restore-change-set.d.ts +14 -0
  140. package/dist/change-set/restore-change-set.d.ts.map +1 -0
  141. package/dist/change-set/restore-change-set.js +98 -0
  142. package/dist/change-set/restore-change-set.js.map +1 -0
  143. package/dist/change-set/restore-change-set.test.d.ts +2 -0
  144. package/dist/change-set/restore-change-set.test.d.ts.map +1 -0
  145. package/dist/change-set/restore-change-set.test.js +238 -0
  146. package/dist/change-set/restore-change-set.test.js.map +1 -0
  147. package/dist/change-set/schema.d.ts +28 -72
  148. package/dist/change-set/schema.d.ts.map +1 -1
  149. package/dist/change-set/schema.js +37 -84
  150. package/dist/change-set/schema.js.map +1 -1
  151. package/dist/change-set/schema.test.js +0 -247
  152. package/dist/change-set/schema.test.js.map +1 -1
  153. package/dist/change-set-edge/database-schema.d.ts +11 -0
  154. package/dist/change-set-edge/database-schema.d.ts.map +1 -0
  155. package/dist/change-set-edge/database-schema.js +29 -0
  156. package/dist/change-set-edge/database-schema.js.map +1 -0
  157. package/dist/change-set-edge/database-schema.test.d.ts +2 -0
  158. package/dist/change-set-edge/database-schema.test.d.ts.map +1 -0
  159. package/dist/change-set-edge/database-schema.test.js +166 -0
  160. package/dist/change-set-edge/database-schema.test.js.map +1 -0
  161. package/dist/change-set-edge/index.d.ts +2 -0
  162. package/dist/change-set-edge/index.d.ts.map +1 -0
  163. package/dist/change-set-edge/index.js +2 -0
  164. package/dist/change-set-edge/index.js.map +1 -0
  165. package/dist/change-set-v2/apply-change-set.d.ts +10 -0
  166. package/dist/change-set-v2/apply-change-set.d.ts.map +1 -0
  167. package/dist/change-set-v2/apply-change-set.js +147 -0
  168. package/dist/change-set-v2/apply-change-set.js.map +1 -0
  169. package/dist/change-set-v2/apply-change-set.test.d.ts +2 -0
  170. package/dist/change-set-v2/apply-change-set.test.d.ts.map +1 -0
  171. package/dist/change-set-v2/apply-change-set.test.js +270 -0
  172. package/dist/change-set-v2/apply-change-set.test.js.map +1 -0
  173. package/dist/change-set-v2/create-change-set.d.ts +10 -0
  174. package/dist/change-set-v2/create-change-set.d.ts.map +1 -0
  175. package/dist/change-set-v2/create-change-set.js +57 -0
  176. package/dist/change-set-v2/create-change-set.js.map +1 -0
  177. package/dist/change-set-v2/create-change-set.test.d.ts +2 -0
  178. package/dist/change-set-v2/create-change-set.test.d.ts.map +1 -0
  179. package/dist/change-set-v2/create-change-set.test.js +59 -0
  180. package/dist/change-set-v2/create-change-set.test.js.map +1 -0
  181. package/dist/change-set-v2/create-checkpoint.d.ts +7 -0
  182. package/dist/change-set-v2/create-checkpoint.d.ts.map +1 -0
  183. package/dist/change-set-v2/create-checkpoint.js +79 -0
  184. package/dist/change-set-v2/create-checkpoint.js.map +1 -0
  185. package/dist/change-set-v2/create-checkpoint.test.d.ts +2 -0
  186. package/dist/change-set-v2/create-checkpoint.test.d.ts.map +1 -0
  187. package/dist/change-set-v2/create-checkpoint.test.js +289 -0
  188. package/dist/change-set-v2/create-checkpoint.test.js.map +1 -0
  189. package/dist/change-set-v2/create-merge-change-set.d.ts +23 -0
  190. package/dist/change-set-v2/create-merge-change-set.d.ts.map +1 -0
  191. package/dist/change-set-v2/create-merge-change-set.js +68 -0
  192. package/dist/change-set-v2/create-merge-change-set.js.map +1 -0
  193. package/dist/change-set-v2/create-merge-change-set.test.d.ts +2 -0
  194. package/dist/change-set-v2/create-merge-change-set.test.d.ts.map +1 -0
  195. package/dist/change-set-v2/create-merge-change-set.test.js +223 -0
  196. package/dist/change-set-v2/create-merge-change-set.test.js.map +1 -0
  197. package/dist/change-set-v2/index.d.ts +5 -0
  198. package/dist/change-set-v2/index.d.ts.map +1 -0
  199. package/dist/change-set-v2/index.js +5 -0
  200. package/dist/change-set-v2/index.js.map +1 -0
  201. package/dist/change-set-v2/schema.d.ts +50 -0
  202. package/dist/change-set-v2/schema.d.ts.map +1 -0
  203. package/dist/change-set-v2/schema.js +347 -0
  204. package/dist/change-set-v2/schema.js.map +1 -0
  205. package/dist/change-set-v2/schema.test.d.ts +2 -0
  206. package/dist/change-set-v2/schema.test.d.ts.map +1 -0
  207. package/dist/change-set-v2/schema.test.js +713 -0
  208. package/dist/change-set-v2/schema.test.js.map +1 -0
  209. package/dist/commit/apply-commit.d.ts +32 -0
  210. package/dist/commit/apply-commit.d.ts.map +1 -0
  211. package/dist/commit/apply-commit.js +63 -0
  212. package/dist/commit/apply-commit.js.map +1 -0
  213. package/dist/commit/apply-commit.test.d.ts +2 -0
  214. package/dist/commit/apply-commit.test.d.ts.map +1 -0
  215. package/dist/commit/apply-commit.test.js +367 -0
  216. package/dist/commit/apply-commit.test.js.map +1 -0
  217. package/dist/commit/create-checkpoint.d.ts +19 -0
  218. package/dist/commit/create-checkpoint.d.ts.map +1 -0
  219. package/dist/commit/create-checkpoint.js +118 -0
  220. package/dist/commit/create-checkpoint.js.map +1 -0
  221. package/dist/commit/create-checkpoint.test.d.ts +2 -0
  222. package/dist/commit/create-checkpoint.test.d.ts.map +1 -0
  223. package/dist/commit/create-checkpoint.test.js +472 -0
  224. package/dist/commit/create-checkpoint.test.js.map +1 -0
  225. package/dist/commit/create-commit.d.ts +38 -0
  226. package/dist/commit/create-commit.d.ts.map +1 -0
  227. package/dist/commit/create-commit.js +68 -0
  228. package/dist/commit/create-commit.js.map +1 -0
  229. package/dist/commit/create-merge-commit.d.ts +24 -0
  230. package/dist/commit/create-merge-commit.d.ts.map +1 -0
  231. package/dist/commit/create-merge-commit.js +103 -0
  232. package/dist/commit/create-merge-commit.js.map +1 -0
  233. package/dist/commit/create-merge-commit.test.d.ts +2 -0
  234. package/dist/commit/create-merge-commit.test.d.ts.map +1 -0
  235. package/dist/commit/create-merge-commit.test.js +242 -0
  236. package/dist/commit/create-merge-commit.test.js.map +1 -0
  237. package/dist/commit/create-transition-commit.d.ts +18 -0
  238. package/dist/commit/create-transition-commit.d.ts.map +1 -0
  239. package/dist/commit/create-transition-commit.js +136 -0
  240. package/dist/commit/create-transition-commit.js.map +1 -0
  241. package/dist/commit/create-transition-commit.test.d.ts +2 -0
  242. package/dist/commit/create-transition-commit.test.d.ts.map +1 -0
  243. package/dist/commit/create-transition-commit.test.js +221 -0
  244. package/dist/commit/create-transition-commit.test.js.map +1 -0
  245. package/dist/commit/create-undo-commit.d.ts +27 -0
  246. package/dist/commit/create-undo-commit.d.ts.map +1 -0
  247. package/dist/commit/create-undo-commit.js +143 -0
  248. package/dist/commit/create-undo-commit.js.map +1 -0
  249. package/dist/commit/create-undo-commit.test.d.ts +2 -0
  250. package/dist/commit/create-undo-commit.test.d.ts.map +1 -0
  251. package/dist/commit/create-undo-commit.test.js +298 -0
  252. package/dist/commit/create-undo-commit.test.js.map +1 -0
  253. package/dist/commit/index.d.ts +6 -0
  254. package/dist/commit/index.d.ts.map +1 -0
  255. package/dist/commit/index.js +6 -0
  256. package/dist/commit/index.js.map +1 -0
  257. package/dist/commit/schema.d.ts +73 -0
  258. package/dist/commit/schema.d.ts.map +1 -0
  259. package/dist/commit/schema.js +90 -0
  260. package/dist/commit/schema.js.map +1 -0
  261. package/dist/commit/schema.test.d.ts +2 -0
  262. package/dist/commit/schema.test.d.ts.map +1 -0
  263. package/dist/commit/schema.test.js +216 -0
  264. package/dist/commit/schema.test.js.map +1 -0
  265. package/dist/database/apply-schema.d.ts +3 -0
  266. package/dist/database/apply-schema.d.ts.map +1 -1
  267. package/dist/database/apply-schema.js +91 -258
  268. package/dist/database/apply-schema.js.map +1 -1
  269. package/dist/database/index.d.ts +0 -2
  270. package/dist/database/index.d.ts.map +1 -1
  271. package/dist/database/index.js +0 -2
  272. package/dist/database/index.js.map +1 -1
  273. package/dist/database/init-db.d.ts.map +1 -1
  274. package/dist/database/init-db.js +83 -44
  275. package/dist/database/init-db.js.map +1 -1
  276. package/dist/database/init-db.test.js +2 -480
  277. package/dist/database/init-db.test.js.map +1 -1
  278. package/dist/database/kysely-plugin/json-column-plugin.d.ts +5 -1
  279. package/dist/database/kysely-plugin/json-column-plugin.d.ts.map +1 -1
  280. package/dist/database/kysely-plugin/json-column-plugin.js +52 -10
  281. package/dist/database/kysely-plugin/json-column-plugin.js.map +1 -1
  282. package/dist/database/kysely-plugin/json-column-plugin.test.d.ts +2 -0
  283. package/dist/database/kysely-plugin/json-column-plugin.test.d.ts.map +1 -0
  284. package/dist/database/kysely-plugin/json-column-plugin.test.js +329 -0
  285. package/dist/database/kysely-plugin/json-column-plugin.test.js.map +1 -0
  286. package/dist/database/mutation-log/database-schema.d.ts.map +1 -1
  287. package/dist/database/mutation-log/database-schema.js +0 -4
  288. package/dist/database/mutation-log/database-schema.js.map +1 -1
  289. package/dist/database/nano-id.d.ts +4 -1
  290. package/dist/database/nano-id.d.ts.map +1 -1
  291. package/dist/database/nano-id.js +4 -1
  292. package/dist/database/nano-id.js.map +1 -1
  293. package/dist/database/nano-id.test.js +3 -3
  294. package/dist/database/nano-id.test.js.map +1 -1
  295. package/dist/database/schema.d.ts +21 -14
  296. package/dist/database/schema.d.ts.map +1 -1
  297. package/dist/database/schema.js +9 -5
  298. package/dist/database/schema.js.map +1 -1
  299. package/dist/deterministic/generate-human-id.d.ts +20 -0
  300. package/dist/deterministic/generate-human-id.d.ts.map +1 -0
  301. package/dist/deterministic/generate-human-id.js +86 -0
  302. package/dist/deterministic/generate-human-id.js.map +1 -0
  303. package/dist/deterministic/generate-human-id.test.d.ts +2 -0
  304. package/dist/deterministic/generate-human-id.test.d.ts.map +1 -0
  305. package/dist/deterministic/generate-human-id.test.js +123 -0
  306. package/dist/deterministic/generate-human-id.test.js.map +1 -0
  307. package/dist/deterministic/index.d.ts +8 -0
  308. package/dist/deterministic/index.d.ts.map +1 -0
  309. package/dist/deterministic/index.js +8 -0
  310. package/dist/deterministic/index.js.map +1 -0
  311. package/dist/deterministic/is-deterministic-mode.d.ts +14 -0
  312. package/dist/deterministic/is-deterministic-mode.d.ts.map +1 -0
  313. package/dist/deterministic/is-deterministic-mode.js +25 -0
  314. package/dist/deterministic/is-deterministic-mode.js.map +1 -0
  315. package/dist/deterministic/is-deterministic-mode.test.d.ts +2 -0
  316. package/dist/deterministic/is-deterministic-mode.test.d.ts.map +1 -0
  317. package/dist/deterministic/is-deterministic-mode.test.js +103 -0
  318. package/dist/deterministic/is-deterministic-mode.test.js.map +1 -0
  319. package/dist/deterministic/nano-id.d.ts +61 -0
  320. package/dist/deterministic/nano-id.d.ts.map +1 -0
  321. package/dist/deterministic/nano-id.js +161 -0
  322. package/dist/deterministic/nano-id.js.map +1 -0
  323. package/dist/deterministic/nano-id.test.d.ts +2 -0
  324. package/dist/deterministic/nano-id.test.d.ts.map +1 -0
  325. package/dist/deterministic/nano-id.test.js +163 -0
  326. package/dist/deterministic/nano-id.test.js.map +1 -0
  327. package/dist/deterministic/options.d.ts +53 -0
  328. package/dist/deterministic/options.d.ts.map +1 -0
  329. package/dist/deterministic/options.js +52 -0
  330. package/dist/deterministic/options.js.map +1 -0
  331. package/dist/deterministic/options.test.d.ts +2 -0
  332. package/dist/deterministic/options.test.d.ts.map +1 -0
  333. package/dist/deterministic/options.test.js +111 -0
  334. package/dist/deterministic/options.test.js.map +1 -0
  335. package/dist/deterministic/random.d.ts +68 -0
  336. package/dist/deterministic/random.d.ts.map +1 -0
  337. package/dist/deterministic/random.js +225 -0
  338. package/dist/deterministic/random.js.map +1 -0
  339. package/dist/deterministic/random.test.d.ts +2 -0
  340. package/dist/deterministic/random.test.d.ts.map +1 -0
  341. package/dist/deterministic/random.test.js +244 -0
  342. package/dist/deterministic/random.test.js.map +1 -0
  343. package/dist/deterministic/sequence.d.ts +56 -0
  344. package/dist/deterministic/sequence.d.ts.map +1 -0
  345. package/dist/deterministic/sequence.js +107 -0
  346. package/dist/deterministic/sequence.js.map +1 -0
  347. package/dist/deterministic/sequence.test.d.ts +2 -0
  348. package/dist/deterministic/sequence.test.d.ts.map +1 -0
  349. package/dist/deterministic/sequence.test.js +71 -0
  350. package/dist/deterministic/sequence.test.js.map +1 -0
  351. package/dist/deterministic/timestamp.d.ts +47 -0
  352. package/dist/deterministic/timestamp.d.ts.map +1 -0
  353. package/dist/deterministic/timestamp.js +74 -0
  354. package/dist/deterministic/timestamp.js.map +1 -0
  355. package/dist/deterministic/timestamp.test.d.ts +2 -0
  356. package/dist/deterministic/timestamp.test.d.ts.map +1 -0
  357. package/dist/deterministic/timestamp.test.js +145 -0
  358. package/dist/deterministic/timestamp.test.js.map +1 -0
  359. package/dist/deterministic/uuid-v7.d.ts +49 -0
  360. package/dist/deterministic/uuid-v7.d.ts.map +1 -0
  361. package/dist/deterministic/uuid-v7.js +75 -0
  362. package/dist/deterministic/uuid-v7.js.map +1 -0
  363. package/dist/deterministic/uuid-v7.test.d.ts +2 -0
  364. package/dist/deterministic/uuid-v7.test.d.ts.map +1 -0
  365. package/dist/deterministic/uuid-v7.test.js +114 -0
  366. package/dist/deterministic/uuid-v7.test.js.map +1 -0
  367. package/dist/discussion/create-discussion.d.ts +2 -1
  368. package/dist/discussion/create-discussion.d.ts.map +1 -1
  369. package/dist/discussion/create-discussion.js.map +1 -1
  370. package/dist/discussion/create-discussion.test.js +13 -2
  371. package/dist/discussion/create-discussion.test.js.map +1 -1
  372. package/dist/entity/eb-entity.d.ts +76 -0
  373. package/dist/entity/eb-entity.d.ts.map +1 -0
  374. package/dist/entity/eb-entity.js +156 -0
  375. package/dist/entity/eb-entity.js.map +1 -0
  376. package/dist/entity/eb-entity.test.d.ts +2 -0
  377. package/dist/entity/eb-entity.test.d.ts.map +1 -0
  378. package/dist/entity/eb-entity.test.js +573 -0
  379. package/dist/entity/eb-entity.test.js.map +1 -0
  380. package/dist/entity/index.d.ts +7 -0
  381. package/dist/entity/index.d.ts.map +1 -0
  382. package/dist/entity/index.js +4 -0
  383. package/dist/entity/index.js.map +1 -0
  384. package/dist/entity/label/create-entity-label.d.ts +61 -0
  385. package/dist/entity/label/create-entity-label.d.ts.map +1 -0
  386. package/dist/entity/label/create-entity-label.js +92 -0
  387. package/dist/entity/label/create-entity-label.js.map +1 -0
  388. package/dist/entity/label/create-entity-label.test.d.ts +2 -0
  389. package/dist/entity/label/create-entity-label.test.d.ts.map +1 -0
  390. package/dist/entity/label/create-entity-label.test.js +261 -0
  391. package/dist/entity/label/create-entity-label.test.js.map +1 -0
  392. package/dist/entity/label/schema.d.ts +40 -0
  393. package/dist/entity/label/schema.d.ts.map +1 -0
  394. package/dist/entity/label/schema.js +42 -0
  395. package/dist/entity/label/schema.js.map +1 -0
  396. package/dist/entity/label/schema.test.d.ts +2 -0
  397. package/dist/entity/label/schema.test.d.ts.map +1 -0
  398. package/dist/entity/label/schema.test.js +596 -0
  399. package/dist/entity/label/schema.test.js.map +1 -0
  400. package/dist/entity/schema.d.ts +13 -0
  401. package/dist/entity/schema.d.ts.map +1 -0
  402. package/dist/entity/schema.js +5 -0
  403. package/dist/entity/schema.js.map +1 -0
  404. package/dist/entity/thread/create-entity-thread.d.ts +75 -0
  405. package/dist/entity/thread/create-entity-thread.d.ts.map +1 -0
  406. package/dist/entity/thread/create-entity-thread.js +109 -0
  407. package/dist/entity/thread/create-entity-thread.js.map +1 -0
  408. package/dist/entity/thread/create-entity-thread.test.d.ts +2 -0
  409. package/dist/entity/thread/create-entity-thread.test.d.ts.map +1 -0
  410. package/dist/entity/thread/create-entity-thread.test.js +240 -0
  411. package/dist/entity/thread/create-entity-thread.test.js.map +1 -0
  412. package/dist/entity/thread/query-threads.test.d.ts +2 -0
  413. package/dist/entity/thread/query-threads.test.d.ts.map +1 -0
  414. package/dist/entity/thread/query-threads.test.js +330 -0
  415. package/dist/entity/thread/query-threads.test.js.map +1 -0
  416. package/dist/entity/thread/schema.d.ts +40 -0
  417. package/dist/entity/thread/schema.d.ts.map +1 -0
  418. package/dist/entity/thread/schema.js +42 -0
  419. package/dist/entity/thread/schema.js.map +1 -0
  420. package/dist/entity/thread/schema.test.d.ts +2 -0
  421. package/dist/entity/thread/schema.test.d.ts.map +1 -0
  422. package/dist/entity/thread/schema.test.js +144 -0
  423. package/dist/entity/thread/schema.test.js.map +1 -0
  424. package/dist/entity-views/entity-state-all.d.ts +52 -0
  425. package/dist/entity-views/entity-state-all.d.ts.map +1 -1
  426. package/dist/entity-views/entity-state-all.js +19 -11
  427. package/dist/entity-views/entity-state-all.js.map +1 -1
  428. package/dist/entity-views/entity-state-all.test.js +173 -0
  429. package/dist/entity-views/entity-state-all.test.js.map +1 -1
  430. package/dist/entity-views/entity-state-history.d.ts +55 -15
  431. package/dist/entity-views/entity-state-history.d.ts.map +1 -1
  432. package/dist/entity-views/entity-state-history.js +7 -4
  433. package/dist/entity-views/entity-state-history.js.map +1 -1
  434. package/dist/entity-views/entity-state-history.test.js +70 -15
  435. package/dist/entity-views/entity-state-history.test.js.map +1 -1
  436. package/dist/entity-views/entity-state.d.ts +52 -0
  437. package/dist/entity-views/entity-state.d.ts.map +1 -1
  438. package/dist/entity-views/entity-state.js +18 -10
  439. package/dist/entity-views/entity-state.js.map +1 -1
  440. package/dist/entity-views/entity-state.test.js +120 -1
  441. package/dist/entity-views/entity-state.test.js.map +1 -1
  442. package/dist/entity-views/entity-view-builder.test.js +6 -6
  443. package/dist/entity-views/entity-view-builder.test.js.map +1 -1
  444. package/dist/entity-views/types.d.ts +2 -2
  445. package/dist/file/database-schema.d.ts +25 -0
  446. package/dist/file/database-schema.d.ts.map +1 -0
  447. package/dist/file/database-schema.js +26 -0
  448. package/dist/file/database-schema.js.map +1 -0
  449. package/dist/file/database-schema.test.d.ts +2 -0
  450. package/dist/file/database-schema.test.d.ts.map +1 -0
  451. package/dist/file/database-schema.test.js +60 -0
  452. package/dist/file/database-schema.test.js.map +1 -0
  453. package/dist/file/file-handlers.d.ts.map +1 -1
  454. package/dist/file/file-handlers.js +36 -0
  455. package/dist/file/file-handlers.js.map +1 -1
  456. package/dist/file/file-handlers.test.js +4 -4
  457. package/dist/file/file-handlers.test.js.map +1 -1
  458. package/dist/file/materialize-file-data-at-changeset.d.ts +1 -1
  459. package/dist/file/materialize-file-data-at-changeset.d.ts.map +1 -1
  460. package/dist/file/materialize-file-data-at-changeset.js +55 -29
  461. package/dist/file/materialize-file-data-at-changeset.js.map +1 -1
  462. package/dist/file/materialize-file-data-at-commit.d.ts +9 -0
  463. package/dist/file/materialize-file-data-at-commit.d.ts.map +1 -0
  464. package/dist/file/materialize-file-data-at-commit.js +119 -0
  465. package/dist/file/materialize-file-data-at-commit.js.map +1 -0
  466. package/dist/file/schema.d.ts +68 -5
  467. package/dist/file/schema.d.ts.map +1 -1
  468. package/dist/file/schema.js +118 -50
  469. package/dist/file/schema.js.map +1 -1
  470. package/dist/file/schema.test.js +543 -35
  471. package/dist/file/schema.test.js.map +1 -1
  472. package/dist/file-queue/database-schema.d.ts +17 -0
  473. package/dist/file-queue/database-schema.d.ts.map +1 -0
  474. package/dist/file-queue/database-schema.js +53 -0
  475. package/dist/file-queue/database-schema.js.map +1 -0
  476. package/dist/file-queue/file-handlers.d.ts +1 -1
  477. package/dist/file-queue/file-handlers.d.ts.map +1 -1
  478. package/dist/file-queue/file-handlers.js +60 -29
  479. package/dist/file-queue/file-handlers.js.map +1 -1
  480. package/dist/file-queue/file-queue-process.d.ts.map +1 -1
  481. package/dist/file-queue/file-queue-process.js +26 -17
  482. package/dist/file-queue/file-queue-process.js.map +1 -1
  483. package/dist/file-queue/file-queue-process.test.js +133 -43
  484. package/dist/file-queue/file-queue-process.test.js.map +1 -1
  485. package/dist/file-queue/with-skip-file-queue.d.ts +18 -0
  486. package/dist/file-queue/with-skip-file-queue.d.ts.map +1 -1
  487. package/dist/file-queue/with-skip-file-queue.js +56 -10
  488. package/dist/file-queue/with-skip-file-queue.js.map +1 -1
  489. package/dist/file-queue/with-skip-file-queue.test.js +28 -12
  490. package/dist/file-queue/with-skip-file-queue.test.js.map +1 -1
  491. package/dist/hooks/create-hooks.d.ts +4 -26
  492. package/dist/hooks/create-hooks.d.ts.map +1 -1
  493. package/dist/hooks/create-hooks.js +3 -7
  494. package/dist/hooks/create-hooks.js.map +1 -1
  495. package/dist/index.d.ts +3 -0
  496. package/dist/index.d.ts.map +1 -1
  497. package/dist/index.js +3 -0
  498. package/dist/index.js.map +1 -1
  499. package/dist/key-value/database-schema.d.ts +3 -2
  500. package/dist/key-value/database-schema.d.ts.map +1 -1
  501. package/dist/key-value/database-schema.js +3 -3
  502. package/dist/key-value/database-schema.test.js +13 -4
  503. package/dist/key-value/database-schema.test.js.map +1 -1
  504. package/dist/key-value/index.d.ts +1 -1
  505. package/dist/key-value/index.d.ts.map +1 -1
  506. package/dist/key-value/index.js.map +1 -1
  507. package/dist/key-value/schema.d.ts +63 -3
  508. package/dist/key-value/schema.d.ts.map +1 -1
  509. package/dist/key-value/schema.js +8 -2
  510. package/dist/key-value/schema.js.map +1 -1
  511. package/dist/key-value/schema.test.js +91 -2
  512. package/dist/key-value/schema.test.js.map +1 -1
  513. package/dist/key-value-v2/schema.d.ts +27 -0
  514. package/dist/key-value-v2/schema.d.ts.map +1 -0
  515. package/dist/key-value-v2/schema.js +73 -0
  516. package/dist/key-value-v2/schema.js.map +1 -0
  517. package/dist/key-value-v2/schema.test.d.ts +2 -0
  518. package/dist/key-value-v2/schema.test.d.ts.map +1 -0
  519. package/dist/key-value-v2/schema.test.js +144 -0
  520. package/dist/key-value-v2/schema.test.js.map +1 -0
  521. package/dist/label/create-label.d.ts +5 -5
  522. package/dist/label/create-label.d.ts.map +1 -1
  523. package/dist/label/create-label.js +2 -2
  524. package/dist/label/create-label.js.map +1 -1
  525. package/dist/label/index.d.ts +1 -1
  526. package/dist/label/index.d.ts.map +1 -1
  527. package/dist/label/index.js.map +1 -1
  528. package/dist/label/schema.d.ts +3 -3
  529. package/dist/label/schema.d.ts.map +1 -1
  530. package/dist/label/schema.js +4 -6
  531. package/dist/label/schema.js.map +1 -1
  532. package/dist/lix/close-lix.d.ts +1 -10
  533. package/dist/lix/close-lix.d.ts.map +1 -1
  534. package/dist/lix/close-lix.js +1 -10
  535. package/dist/lix/close-lix.js.map +1 -1
  536. package/dist/lix/merge.test.js +4 -1
  537. package/dist/lix/merge.test.js.map +1 -1
  538. package/dist/lix/new-lix.d.ts +4 -2
  539. package/dist/lix/new-lix.d.ts.map +1 -1
  540. package/dist/lix/new-lix.js +244 -60
  541. package/dist/lix/new-lix.js.map +1 -1
  542. package/dist/lix/new-lix.test.js +175 -1
  543. package/dist/lix/new-lix.test.js.map +1 -1
  544. package/dist/lix/open-lix-in-memory.d.ts +1 -9
  545. package/dist/lix/open-lix-in-memory.d.ts.map +1 -1
  546. package/dist/lix/open-lix-in-memory.js +7 -15
  547. package/dist/lix/open-lix-in-memory.js.map +1 -1
  548. package/dist/lix/open-lix-in-memory.test.js +2 -1
  549. package/dist/lix/open-lix-in-memory.test.js.map +1 -1
  550. package/dist/lix/open-lix.d.ts +12 -13
  551. package/dist/lix/open-lix.d.ts.map +1 -1
  552. package/dist/lix/open-lix.js +147 -55
  553. package/dist/lix/open-lix.js.map +1 -1
  554. package/dist/lix/open-lix.test.js +242 -3
  555. package/dist/lix/open-lix.test.js.map +1 -1
  556. package/dist/lix/storage/in-memory.d.ts +7 -6
  557. package/dist/lix/storage/in-memory.d.ts.map +1 -1
  558. package/dist/lix/storage/in-memory.js +10 -17
  559. package/dist/lix/storage/in-memory.js.map +1 -1
  560. package/dist/lix/storage/in-memory.test.js +7 -68
  561. package/dist/lix/storage/in-memory.test.js.map +1 -1
  562. package/dist/lix/storage/lix-storage-adapter.d.ts +35 -5
  563. package/dist/lix/storage/lix-storage-adapter.d.ts.map +1 -1
  564. package/dist/lix/storage/opfs.d.ts +39 -10
  565. package/dist/lix/storage/opfs.d.ts.map +1 -1
  566. package/dist/lix/storage/opfs.js +148 -37
  567. package/dist/lix/storage/opfs.js.map +1 -1
  568. package/dist/lix/storage/opfs.test.js +203 -24
  569. package/dist/lix/storage/opfs.test.js.map +1 -1
  570. package/dist/lix/to-blob.d.ts +2 -9
  571. package/dist/lix/to-blob.d.ts.map +1 -1
  572. package/dist/lix/to-blob.js +2 -9
  573. package/dist/lix/to-blob.js.map +1 -1
  574. package/dist/log/create-lix-own-log.d.ts +9 -1
  575. package/dist/log/create-lix-own-log.d.ts.map +1 -1
  576. package/dist/log/create-lix-own-log.js +14 -25
  577. package/dist/log/create-lix-own-log.js.map +1 -1
  578. package/dist/log/create-lix-own-log.test.js +9 -5
  579. package/dist/log/create-lix-own-log.test.js.map +1 -1
  580. package/dist/log/create-log.d.ts +2 -2
  581. package/dist/log/create-log.d.ts.map +1 -1
  582. package/dist/log/create-log.js +2 -2
  583. package/dist/log/create-log.js.map +1 -1
  584. package/dist/log/database-schema.d.ts +33 -0
  585. package/dist/log/database-schema.d.ts.map +1 -0
  586. package/dist/log/database-schema.js +14 -0
  587. package/dist/log/database-schema.js.map +1 -0
  588. package/dist/log/database-schema.test.d.ts +2 -0
  589. package/dist/log/database-schema.test.d.ts.map +1 -0
  590. package/dist/log/database-schema.test.js +22 -0
  591. package/dist/log/database-schema.test.js.map +1 -0
  592. package/dist/log/index.d.ts +1 -1
  593. package/dist/log/index.d.ts.map +1 -1
  594. package/dist/log/index.js.map +1 -1
  595. package/dist/log/schema.d.ts +3 -3
  596. package/dist/log/schema.d.ts.map +1 -1
  597. package/dist/log/schema.js +4 -5
  598. package/dist/log/schema.js.map +1 -1
  599. package/dist/observe/create-observe.d.ts.map +1 -1
  600. package/dist/observe/create-observe.js +32 -3
  601. package/dist/observe/create-observe.js.map +1 -1
  602. package/dist/observe/create-observe.test.js +298 -44
  603. package/dist/observe/create-observe.test.js.map +1 -1
  604. package/dist/observe/determine-schema-keys.d.ts +6 -0
  605. package/dist/observe/determine-schema-keys.d.ts.map +1 -0
  606. package/dist/observe/determine-schema-keys.js +145 -0
  607. package/dist/observe/determine-schema-keys.js.map +1 -0
  608. package/dist/observe/determine-schema-keys.test.d.ts +2 -0
  609. package/dist/observe/determine-schema-keys.test.d.ts.map +1 -0
  610. package/dist/observe/determine-schema-keys.test.js +266 -0
  611. package/dist/observe/determine-schema-keys.test.js.map +1 -0
  612. package/dist/own-change-control/apply-own-change.d.ts +5 -1
  613. package/dist/own-change-control/apply-own-change.d.ts.map +1 -1
  614. package/dist/own-change-control/apply-own-change.js +26 -12
  615. package/dist/own-change-control/apply-own-change.js.map +1 -1
  616. package/dist/own-change-control/apply-own-change.test.js +86 -48
  617. package/dist/own-change-control/apply-own-change.test.js.map +1 -1
  618. package/dist/own-change-control/change-controlled-tables.d.ts +5 -7
  619. package/dist/own-change-control/change-controlled-tables.d.ts.map +1 -1
  620. package/dist/own-change-control/change-controlled-tables.js +27 -21
  621. package/dist/own-change-control/change-controlled-tables.js.map +1 -1
  622. package/dist/own-change-control/change-controlled-tables.test.js +35 -5
  623. package/dist/own-change-control/change-controlled-tables.test.js.map +1 -1
  624. package/dist/own-change-control/database-triggers.d.ts +2 -1
  625. package/dist/own-change-control/database-triggers.d.ts.map +1 -1
  626. package/dist/own-change-control/database-triggers.js +209 -67
  627. package/dist/own-change-control/database-triggers.js.map +1 -1
  628. package/dist/own-change-control/database-triggers.test.js +139 -8
  629. package/dist/own-change-control/database-triggers.test.js.map +1 -1
  630. package/dist/own-change-control/with-skip-own-change-control.d.ts.map +1 -1
  631. package/dist/own-change-control/with-skip-own-change-control.js +28 -6
  632. package/dist/own-change-control/with-skip-own-change-control.js.map +1 -1
  633. package/dist/own-change-control/with-skip-own-change-control.test.js +38 -1
  634. package/dist/own-change-control/with-skip-own-change-control.test.js.map +1 -1
  635. package/dist/plugin/lix-plugin.d.ts +3 -3
  636. package/dist/plugin/lix-plugin.d.ts.map +1 -1
  637. package/dist/plugin/load-plugin.d.ts.map +1 -1
  638. package/dist/plugin/load-plugin.js.map +1 -1
  639. package/dist/prototype/database-schema.d.ts +43 -0
  640. package/dist/prototype/database-schema.d.ts.map +1 -0
  641. package/dist/prototype/database-schema.js +72 -0
  642. package/dist/prototype/database-schema.js.map +1 -0
  643. package/dist/prototype/file-handlers.d.ts +24 -0
  644. package/dist/prototype/file-handlers.d.ts.map +1 -0
  645. package/dist/prototype/file-handlers.js +129 -0
  646. package/dist/prototype/file-handlers.js.map +1 -0
  647. package/dist/prototype/file-schema.d.ts +47 -0
  648. package/dist/prototype/file-schema.d.ts.map +1 -0
  649. package/dist/prototype/file-schema.js +135 -0
  650. package/dist/prototype/file-schema.js.map +1 -0
  651. package/dist/prototype/file-schema.test.d.ts +2 -0
  652. package/dist/prototype/file-schema.test.d.ts.map +1 -0
  653. package/dist/prototype/file-schema.test.js +146 -0
  654. package/dist/prototype/file-schema.test.js.map +1 -0
  655. package/dist/prototype/get-and-materialize-row.d.ts +5 -0
  656. package/dist/prototype/get-and-materialize-row.d.ts.map +1 -0
  657. package/dist/prototype/get-and-materialize-row.js +99 -0
  658. package/dist/prototype/get-and-materialize-row.js.map +1 -0
  659. package/dist/prototype/json-plugin.d.ts +49 -0
  660. package/dist/prototype/json-plugin.d.ts.map +1 -0
  661. package/dist/prototype/json-plugin.js +104 -0
  662. package/dist/prototype/json-plugin.js.map +1 -0
  663. package/dist/prototype/validate-file-path.d.ts +16 -0
  664. package/dist/prototype/validate-file-path.d.ts.map +1 -0
  665. package/dist/prototype/validate-file-path.js +44 -0
  666. package/dist/prototype/validate-file-path.js.map +1 -0
  667. package/dist/prototype/validate-file-path.test.d.ts +2 -0
  668. package/dist/prototype/validate-file-path.test.d.ts.map +1 -0
  669. package/dist/prototype/validate-file-path.test.js +36 -0
  670. package/dist/prototype/validate-file-path.test.js.map +1 -0
  671. package/dist/prototype/version-schema.d.ts +34 -0
  672. package/dist/prototype/version-schema.d.ts.map +1 -0
  673. package/dist/prototype/version-schema.js +86 -0
  674. package/dist/prototype/version-schema.js.map +1 -0
  675. package/dist/prototype/version-schema.test.d.ts +2 -0
  676. package/dist/prototype/version-schema.test.d.ts.map +1 -0
  677. package/dist/prototype/version-schema.test.js +114 -0
  678. package/dist/prototype/version-schema.test.js.map +1 -0
  679. package/dist/query-filter/change-conflict-in-version.d.ts +2 -0
  680. package/dist/query-filter/change-conflict-in-version.d.ts.map +1 -1
  681. package/dist/query-filter/change-conflict-in-version.js +2 -0
  682. package/dist/query-filter/change-conflict-in-version.js.map +1 -1
  683. package/dist/query-filter/change-in-version.d.ts +2 -0
  684. package/dist/query-filter/change-in-version.d.ts.map +1 -1
  685. package/dist/query-filter/change-in-version.js +2 -0
  686. package/dist/query-filter/change-in-version.js.map +1 -1
  687. package/dist/query-filter/change-is-leaf-in-version.d.ts +1 -0
  688. package/dist/query-filter/change-is-leaf-in-version.d.ts.map +1 -1
  689. package/dist/query-filter/change-is-leaf-in-version.js +1 -0
  690. package/dist/query-filter/change-is-leaf-in-version.js.map +1 -1
  691. package/dist/query-filter/change-is-leaf-of.d.ts +2 -0
  692. package/dist/query-filter/change-is-leaf-of.d.ts.map +1 -1
  693. package/dist/query-filter/change-is-leaf-of.js +2 -0
  694. package/dist/query-filter/change-is-leaf-of.js.map +1 -1
  695. package/dist/query-filter/change-is-leaf-v2.d.ts +69 -0
  696. package/dist/query-filter/change-is-leaf-v2.d.ts.map +1 -0
  697. package/dist/query-filter/change-is-leaf-v2.js +116 -0
  698. package/dist/query-filter/change-is-leaf-v2.js.map +1 -0
  699. package/dist/query-filter/change-is-leaf-v2.test.d.ts +2 -0
  700. package/dist/query-filter/change-is-leaf-v2.test.d.ts.map +1 -0
  701. package/dist/query-filter/change-is-leaf-v2.test.js +237 -0
  702. package/dist/query-filter/change-is-leaf-v2.test.js.map +1 -0
  703. package/dist/query-filter/change-is-leaf.d.ts +2 -0
  704. package/dist/query-filter/change-is-leaf.d.ts.map +1 -1
  705. package/dist/query-filter/change-is-leaf.js +2 -0
  706. package/dist/query-filter/change-is-leaf.js.map +1 -1
  707. package/dist/query-filter/change-is-lowest-common-ancestor-of.d.ts +2 -0
  708. package/dist/query-filter/change-is-lowest-common-ancestor-of.d.ts.map +1 -1
  709. package/dist/query-filter/change-is-lowest-common-ancestor-of.js +4 -0
  710. package/dist/query-filter/change-is-lowest-common-ancestor-of.js.map +1 -1
  711. package/dist/query-filter/change-is-lowest-common-ancestor-of.test.js +5 -3
  712. package/dist/query-filter/change-is-lowest-common-ancestor-of.test.js.map +1 -1
  713. package/dist/query-filter/change-set-element-in-ancestry-of.d.ts +10 -10
  714. package/dist/query-filter/change-set-element-in-ancestry-of.d.ts.map +1 -1
  715. package/dist/query-filter/change-set-element-in-ancestry-of.js +22 -17
  716. package/dist/query-filter/change-set-element-in-ancestry-of.js.map +1 -1
  717. package/dist/query-filter/change-set-element-in-ancestry-of.test.js +99 -26
  718. package/dist/query-filter/change-set-element-in-ancestry-of.test.js.map +1 -1
  719. package/dist/query-filter/change-set-element-in-symmetric-difference-of.d.ts +21 -0
  720. package/dist/query-filter/change-set-element-in-symmetric-difference-of.d.ts.map +1 -0
  721. package/dist/query-filter/change-set-element-in-symmetric-difference-of.js +37 -0
  722. package/dist/query-filter/change-set-element-in-symmetric-difference-of.js.map +1 -0
  723. package/dist/query-filter/change-set-element-in-symmetric-difference-of.test.d.ts +2 -0
  724. package/dist/query-filter/change-set-element-in-symmetric-difference-of.test.d.ts.map +1 -0
  725. package/dist/query-filter/change-set-element-in-symmetric-difference-of.test.js +276 -0
  726. package/dist/query-filter/change-set-element-in-symmetric-difference-of.test.js.map +1 -0
  727. package/dist/query-filter/change-set-element-in-symmetric-difference.d.ts +2 -2
  728. package/dist/query-filter/change-set-element-in-symmetric-difference.d.ts.map +1 -1
  729. package/dist/query-filter/change-set-element-in-symmetric-difference.js.map +1 -1
  730. package/dist/query-filter/change-set-element-in-symmetric-difference.test.js.map +1 -1
  731. package/dist/query-filter/change-set-element-is-leaf-of.d.ts +11 -11
  732. package/dist/query-filter/change-set-element-is-leaf-of.d.ts.map +1 -1
  733. package/dist/query-filter/change-set-element-is-leaf-of.js +58 -36
  734. package/dist/query-filter/change-set-element-is-leaf-of.js.map +1 -1
  735. package/dist/query-filter/change-set-element-is-leaf-of.test.js +83 -24
  736. package/dist/query-filter/change-set-element-is-leaf-of.test.js.map +1 -1
  737. package/dist/query-filter/change-set-is-ancestor-of.d.ts +2 -2
  738. package/dist/query-filter/change-set-is-ancestor-of.d.ts.map +1 -1
  739. package/dist/query-filter/change-set-is-ancestor-of.js.map +1 -1
  740. package/dist/query-filter/change-set-is-descendant-of.d.ts +2 -2
  741. package/dist/query-filter/change-set-is-descendant-of.d.ts.map +1 -1
  742. package/dist/query-filter/change-set-is-descendant-of.js.map +1 -1
  743. package/dist/query-filter/commit-is-ancestor-of.d.ts +51 -0
  744. package/dist/query-filter/commit-is-ancestor-of.d.ts.map +1 -0
  745. package/dist/query-filter/commit-is-ancestor-of.js +63 -0
  746. package/dist/query-filter/commit-is-ancestor-of.js.map +1 -0
  747. package/dist/query-filter/commit-is-ancestor-of.test.d.ts +2 -0
  748. package/dist/query-filter/commit-is-ancestor-of.test.d.ts.map +1 -0
  749. package/dist/query-filter/commit-is-ancestor-of.test.js +292 -0
  750. package/dist/query-filter/commit-is-ancestor-of.test.js.map +1 -0
  751. package/dist/query-filter/commit-is-descendant-of.d.ts +44 -0
  752. package/dist/query-filter/commit-is-descendant-of.d.ts.map +1 -0
  753. package/dist/query-filter/commit-is-descendant-of.js +56 -0
  754. package/dist/query-filter/commit-is-descendant-of.js.map +1 -0
  755. package/dist/query-filter/commit-is-descendant-of.test.d.ts +2 -0
  756. package/dist/query-filter/commit-is-descendant-of.test.d.ts.map +1 -0
  757. package/dist/query-filter/commit-is-descendant-of.test.js +325 -0
  758. package/dist/query-filter/commit-is-descendant-of.test.js.map +1 -0
  759. package/dist/query-filter/index.d.ts +2 -4
  760. package/dist/query-filter/index.d.ts.map +1 -1
  761. package/dist/query-filter/index.js +2 -4
  762. package/dist/query-filter/index.js.map +1 -1
  763. package/dist/query-filter/version-change-in-difference.d.ts +2 -0
  764. package/dist/query-filter/version-change-in-difference.d.ts.map +1 -1
  765. package/dist/query-filter/version-change-in-difference.js +2 -0
  766. package/dist/query-filter/version-change-in-difference.js.map +1 -1
  767. package/dist/query-filter/version-change-in-symmetric-difference.d.ts +2 -0
  768. package/dist/query-filter/version-change-in-symmetric-difference.d.ts.map +1 -1
  769. package/dist/query-filter/version-change-in-symmetric-difference.js +2 -0
  770. package/dist/query-filter/version-change-in-symmetric-difference.js.map +1 -1
  771. package/dist/schema-definition/definition.d.ts +73 -30
  772. package/dist/schema-definition/definition.d.ts.map +1 -1
  773. package/dist/schema-definition/definition.js +38 -14
  774. package/dist/schema-definition/definition.js.map +1 -1
  775. package/dist/schema-definition/definition.test.js +70 -25
  776. package/dist/schema-definition/definition.test.js.map +1 -1
  777. package/dist/schema-definition/validate-lix-schema.d.ts.map +1 -1
  778. package/dist/schema-definition/validate-lix-schema.js.map +1 -1
  779. package/dist/schema-definition/validate-lix-schema.test.js +1 -1
  780. package/dist/schema-definition/validate-lix-schema.test.js.map +1 -1
  781. package/dist/server-protocol-handler/environment/create-in-memory-environment.test.js +2 -2
  782. package/dist/server-protocol-handler/environment/create-in-memory-environment.test.js.map +1 -1
  783. package/dist/server-protocol-handler/routes/push-v1.test.js +1 -1
  784. package/dist/server-protocol-handler/routes/push-v1.test.js.map +1 -1
  785. package/dist/services/env-variables/index.js +1 -1
  786. package/dist/services/env-variables/index.js.map +1 -1
  787. package/dist/snapshot/create-snapshot.d.ts +2 -2
  788. package/dist/snapshot/create-snapshot.d.ts.map +1 -1
  789. package/dist/snapshot/create-snapshot.test.js +3 -3
  790. package/dist/snapshot/create-snapshot.test.js.map +1 -1
  791. package/dist/snapshot/database-schema.d.ts +19 -0
  792. package/dist/snapshot/database-schema.d.ts.map +1 -0
  793. package/dist/snapshot/database-schema.js +33 -0
  794. package/dist/snapshot/database-schema.js.map +1 -0
  795. package/dist/snapshot/database-schema.test.d.ts +2 -0
  796. package/dist/snapshot/database-schema.test.d.ts.map +1 -0
  797. package/dist/snapshot/database-schema.test.js +58 -0
  798. package/dist/snapshot/database-schema.test.js.map +1 -0
  799. package/dist/snapshot/schema.d.ts.map +1 -1
  800. package/dist/snapshot/schema.js +10 -2
  801. package/dist/snapshot/schema.js.map +1 -1
  802. package/dist/snapshot/schema.test.js +86 -0
  803. package/dist/snapshot/schema.test.js.map +1 -1
  804. package/dist/state/cache/clear-state-cache.d.ts +8 -0
  805. package/dist/state/cache/clear-state-cache.d.ts.map +1 -0
  806. package/dist/state/cache/clear-state-cache.js +14 -0
  807. package/dist/state/cache/clear-state-cache.js.map +1 -0
  808. package/dist/state/cache/clear-state-cache.test.d.ts +2 -0
  809. package/dist/state/cache/clear-state-cache.test.d.ts.map +1 -0
  810. package/dist/state/cache/clear-state-cache.test.js +34 -0
  811. package/dist/state/cache/clear-state-cache.test.js.map +1 -0
  812. package/dist/state/cache/is-stale-state-cache.d.ts +5 -0
  813. package/dist/state/cache/is-stale-state-cache.d.ts.map +1 -0
  814. package/dist/state/cache/is-stale-state-cache.js +22 -0
  815. package/dist/state/cache/is-stale-state-cache.js.map +1 -0
  816. package/dist/state/cache/is-stale-state-cache.test.d.ts +2 -0
  817. package/dist/state/cache/is-stale-state-cache.test.d.ts.map +1 -0
  818. package/dist/state/cache/is-stale-state-cache.test.js +27 -0
  819. package/dist/state/cache/is-stale-state-cache.test.js.map +1 -0
  820. package/dist/state/cache/mark-state-cache-as-stale.d.ts +10 -0
  821. package/dist/state/cache/mark-state-cache-as-stale.d.ts.map +1 -0
  822. package/dist/state/cache/mark-state-cache-as-stale.js +42 -0
  823. package/dist/state/cache/mark-state-cache-as-stale.js.map +1 -0
  824. package/dist/state/cache/populate-state-cache.d.ts +9 -0
  825. package/dist/state/cache/populate-state-cache.d.ts.map +1 -0
  826. package/dist/state/cache/populate-state-cache.js +106 -0
  827. package/dist/state/cache/populate-state-cache.js.map +1 -0
  828. package/dist/state/cache/populate-state-cache.test.d.ts +2 -0
  829. package/dist/state/cache/populate-state-cache.test.d.ts.map +1 -0
  830. package/dist/state/cache/populate-state-cache.test.js +204 -0
  831. package/dist/state/cache/populate-state-cache.test.js.map +1 -0
  832. package/dist/state/cache/schema.d.ts +20 -0
  833. package/dist/state/cache/schema.d.ts.map +1 -0
  834. package/dist/state/cache/schema.js +21 -0
  835. package/dist/state/cache/schema.js.map +1 -0
  836. package/dist/state/cache/update-state-cache.d.ts +21 -0
  837. package/dist/state/cache/update-state-cache.d.ts.map +1 -0
  838. package/dist/state/cache/update-state-cache.js +294 -0
  839. package/dist/state/cache/update-state-cache.js.map +1 -0
  840. package/dist/state/cache/update-state-cache.test.d.ts +2 -0
  841. package/dist/state/cache/update-state-cache.test.d.ts.map +1 -0
  842. package/dist/state/cache/update-state-cache.test.js +440 -0
  843. package/dist/state/cache/update-state-cache.test.js.map +1 -0
  844. package/dist/state/commit.d.ts +18 -0
  845. package/dist/state/commit.d.ts.map +1 -0
  846. package/dist/state/commit.js +457 -0
  847. package/dist/state/commit.js.map +1 -0
  848. package/dist/state/commit.test.d.ts +2 -0
  849. package/dist/state/commit.test.d.ts.map +1 -0
  850. package/dist/state/commit.test.js +1173 -0
  851. package/dist/state/commit.test.js.map +1 -0
  852. package/dist/state/get-version-record-by-id-or-throw.d.ts +2 -2
  853. package/dist/state/get-version-record-by-id-or-throw.d.ts.map +1 -1
  854. package/dist/state/get-version-record-by-id-or-throw.js.map +1 -1
  855. package/dist/state/handle-state-mutation.d.ts +0 -12
  856. package/dist/state/handle-state-mutation.d.ts.map +1 -1
  857. package/dist/state/handle-state-mutation.js +11 -206
  858. package/dist/state/handle-state-mutation.js.map +1 -1
  859. package/dist/state/handle-state-mutation.test.js +213 -159
  860. package/dist/state/handle-state-mutation.test.js.map +1 -1
  861. package/dist/state/insert-transaction-state.d.ts +71 -0
  862. package/dist/state/insert-transaction-state.d.ts.map +1 -0
  863. package/dist/state/insert-transaction-state.js +272 -0
  864. package/dist/state/insert-transaction-state.js.map +1 -0
  865. package/dist/state/insert-transaction-state.test.d.ts +2 -0
  866. package/dist/state/insert-transaction-state.test.d.ts.map +1 -0
  867. package/dist/state/insert-transaction-state.test.js +789 -0
  868. package/dist/state/insert-transaction-state.test.js.map +1 -0
  869. package/dist/state/materialize-state.d.ts +3 -0
  870. package/dist/state/materialize-state.d.ts.map +1 -0
  871. package/dist/state/materialize-state.js +230 -0
  872. package/dist/state/materialize-state.js.map +1 -0
  873. package/dist/state/materialize-state.test.d.ts +2 -0
  874. package/dist/state/materialize-state.test.d.ts.map +1 -0
  875. package/dist/state/materialize-state.test.js +1934 -0
  876. package/dist/state/materialize-state.test.js.map +1 -0
  877. package/dist/state/primary-key.d.ts +39 -0
  878. package/dist/state/primary-key.d.ts.map +1 -0
  879. package/dist/state/primary-key.js +62 -0
  880. package/dist/state/primary-key.js.map +1 -0
  881. package/dist/state/primary-key.test.d.ts +2 -0
  882. package/dist/state/primary-key.test.d.ts.map +1 -0
  883. package/dist/state/primary-key.test.js +114 -0
  884. package/dist/state/primary-key.test.js.map +1 -0
  885. package/dist/state/resolved-state-view.d.ts +33 -0
  886. package/dist/state/resolved-state-view.d.ts.map +1 -0
  887. package/dist/state/resolved-state-view.js +182 -0
  888. package/dist/state/resolved-state-view.js.map +1 -0
  889. package/dist/state/resolved-state-view.test.d.ts +2 -0
  890. package/dist/state/resolved-state-view.test.d.ts.map +1 -0
  891. package/dist/state/resolved-state-view.test.js +433 -0
  892. package/dist/state/resolved-state-view.test.js.map +1 -0
  893. package/dist/state/schema.d.ts +6 -19
  894. package/dist/state/schema.d.ts.map +1 -1
  895. package/dist/state/schema.js +533 -796
  896. package/dist/state/schema.js.map +1 -1
  897. package/dist/state/schema.test.js +1684 -1013
  898. package/dist/state/schema.test.js.map +1 -1
  899. package/dist/state/untracked/schema.d.ts +25 -0
  900. package/dist/state/untracked/schema.d.ts.map +1 -0
  901. package/dist/state/untracked/schema.js +38 -0
  902. package/dist/state/untracked/schema.js.map +1 -0
  903. package/dist/state/untracked/schema.test.d.ts +2 -0
  904. package/dist/state/untracked/schema.test.d.ts.map +1 -0
  905. package/dist/state/untracked/schema.test.js +275 -0
  906. package/dist/state/untracked/schema.test.js.map +1 -0
  907. package/dist/state/untracked/update-untracked-state.d.ts +36 -0
  908. package/dist/state/untracked/update-untracked-state.d.ts.map +1 -0
  909. package/dist/state/untracked/update-untracked-state.js +113 -0
  910. package/dist/state/untracked/update-untracked-state.js.map +1 -0
  911. package/dist/state/untracked/update-untracked-state.test.d.ts +2 -0
  912. package/dist/state/untracked/update-untracked-state.test.d.ts.map +1 -0
  913. package/dist/state/untracked/update-untracked-state.test.js +417 -0
  914. package/dist/state/untracked/update-untracked-state.test.js.map +1 -0
  915. package/dist/state/validate-snapshot-content.d.ts +9 -0
  916. package/dist/state/validate-snapshot-content.d.ts.map +1 -0
  917. package/dist/state/validate-snapshot-content.js +42 -0
  918. package/dist/state/validate-snapshot-content.js.map +1 -0
  919. package/dist/state/validate-snapshot-content.test.d.ts +2 -0
  920. package/dist/state/validate-snapshot-content.test.d.ts.map +1 -0
  921. package/dist/state/validate-snapshot-content.test.js +67 -0
  922. package/dist/state/validate-snapshot-content.test.js.map +1 -0
  923. package/dist/state/validate-state-mutation.d.ts +2 -2
  924. package/dist/state/validate-state-mutation.d.ts.map +1 -1
  925. package/dist/state/validate-state-mutation.js +211 -51
  926. package/dist/state/validate-state-mutation.js.map +1 -1
  927. package/dist/state/validate-state-mutation.test.js +910 -75
  928. package/dist/state/validate-state-mutation.test.js.map +1 -1
  929. package/dist/state-history/schema.d.ts +29 -19
  930. package/dist/state-history/schema.d.ts.map +1 -1
  931. package/dist/state-history/schema.js +49 -37
  932. package/dist/state-history/schema.js.map +1 -1
  933. package/dist/state-history/schema.test.js +221 -67
  934. package/dist/state-history/schema.test.js.map +1 -1
  935. package/dist/stored-schema/index.d.ts +1 -1
  936. package/dist/stored-schema/index.d.ts.map +1 -1
  937. package/dist/stored-schema/index.js +1 -1
  938. package/dist/stored-schema/index.js.map +1 -1
  939. package/dist/stored-schema/schema.d.ts +1 -1
  940. package/dist/stored-schema/schema.d.ts.map +1 -1
  941. package/dist/stored-schema/schema.test.js.map +1 -1
  942. package/dist/sync/push-to-server.test.js.map +1 -1
  943. package/dist/test-utilities/simulation-test/cache-miss-simulation.d.ts +8 -0
  944. package/dist/test-utilities/simulation-test/cache-miss-simulation.d.ts.map +1 -0
  945. package/dist/test-utilities/simulation-test/cache-miss-simulation.js +79 -0
  946. package/dist/test-utilities/simulation-test/cache-miss-simulation.js.map +1 -0
  947. package/dist/test-utilities/simulation-test/cache-miss-simulation.test.d.ts +2 -0
  948. package/dist/test-utilities/simulation-test/cache-miss-simulation.test.d.ts.map +1 -0
  949. package/dist/test-utilities/simulation-test/cache-miss-simulation.test.js +127 -0
  950. package/dist/test-utilities/simulation-test/cache-miss-simulation.test.js.map +1 -0
  951. package/dist/test-utilities/simulation-test/chaotic-timestamp-simulation.d.ts +2 -0
  952. package/dist/test-utilities/simulation-test/chaotic-timestamp-simulation.d.ts.map +1 -0
  953. package/dist/test-utilities/simulation-test/chaotic-timestamp-simulation.js +2 -0
  954. package/dist/test-utilities/simulation-test/chaotic-timestamp-simulation.js.map +1 -0
  955. package/dist/test-utilities/simulation-test/out-of-order-sequence-simulation.d.ts +10 -0
  956. package/dist/test-utilities/simulation-test/out-of-order-sequence-simulation.d.ts.map +1 -0
  957. package/dist/test-utilities/simulation-test/out-of-order-sequence-simulation.js +52 -0
  958. package/dist/test-utilities/simulation-test/out-of-order-sequence-simulation.js.map +1 -0
  959. package/dist/test-utilities/simulation-test/out-of-order-sequence-simulation.test.d.ts +2 -0
  960. package/dist/test-utilities/simulation-test/out-of-order-sequence-simulation.test.d.ts.map +1 -0
  961. package/dist/test-utilities/simulation-test/out-of-order-sequence-simulation.test.js +71 -0
  962. package/dist/test-utilities/simulation-test/out-of-order-sequence-simulation.test.js.map +1 -0
  963. package/dist/test-utilities/simulation-test/simulation-test.d.ts +82 -0
  964. package/dist/test-utilities/simulation-test/simulation-test.d.ts.map +1 -0
  965. package/dist/test-utilities/simulation-test/simulation-test.js +85 -0
  966. package/dist/test-utilities/simulation-test/simulation-test.js.map +1 -0
  967. package/dist/test-utilities/simulation-test/simulation-test.test.d.ts +2 -0
  968. package/dist/test-utilities/simulation-test/simulation-test.test.d.ts.map +1 -0
  969. package/dist/test-utilities/simulation-test/simulation-test.test.js +310 -0
  970. package/dist/test-utilities/simulation-test/simulation-test.test.js.map +1 -0
  971. package/dist/thread/comment-utils.d.ts +2 -0
  972. package/dist/thread/comment-utils.d.ts.map +1 -0
  973. package/dist/thread/comment-utils.js +2 -0
  974. package/dist/thread/comment-utils.js.map +1 -0
  975. package/dist/thread/comment.d.ts +24 -0
  976. package/dist/thread/comment.d.ts.map +1 -0
  977. package/dist/thread/comment.js +43 -0
  978. package/dist/thread/comment.js.map +1 -0
  979. package/dist/thread/create-thread-comment.d.ts +2 -2
  980. package/dist/thread/create-thread-comment.d.ts.map +1 -1
  981. package/dist/thread/create-thread-comment.js +20 -3
  982. package/dist/thread/create-thread-comment.js.map +1 -1
  983. package/dist/thread/create-thread-comment.test.js +49 -3
  984. package/dist/thread/create-thread-comment.test.js.map +1 -1
  985. package/dist/thread/create-thread.d.ts +18 -4
  986. package/dist/thread/create-thread.d.ts.map +1 -1
  987. package/dist/thread/create-thread.js +24 -3
  988. package/dist/thread/create-thread.js.map +1 -1
  989. package/dist/thread/create-thread.test.js +149 -0
  990. package/dist/thread/create-thread.test.js.map +1 -1
  991. package/dist/thread/database-schema.d.ts +20 -0
  992. package/dist/thread/database-schema.d.ts.map +1 -0
  993. package/dist/thread/database-schema.js +57 -0
  994. package/dist/thread/database-schema.js.map +1 -0
  995. package/dist/thread/database-schema.test.d.ts +2 -0
  996. package/dist/thread/database-schema.test.d.ts.map +1 -0
  997. package/dist/thread/database-schema.test.js +59 -0
  998. package/dist/thread/database-schema.test.js.map +1 -0
  999. package/dist/thread/index.d.ts +2 -1
  1000. package/dist/thread/index.d.ts.map +1 -1
  1001. package/dist/thread/schema.d.ts +13 -10
  1002. package/dist/thread/schema.d.ts.map +1 -1
  1003. package/dist/thread/schema.js +20 -14
  1004. package/dist/thread/schema.js.map +1 -1
  1005. package/dist/thread/schema.test.js +65 -0
  1006. package/dist/thread/schema.test.js.map +1 -1
  1007. package/dist/version/create-version.d.ts +14 -9
  1008. package/dist/version/create-version.d.ts.map +1 -1
  1009. package/dist/version/create-version.js +40 -12
  1010. package/dist/version/create-version.js.map +1 -1
  1011. package/dist/version/create-version.test.js +80 -25
  1012. package/dist/version/create-version.test.js.map +1 -1
  1013. package/dist/version/database-schema.d.ts +21 -0
  1014. package/dist/version/database-schema.d.ts.map +1 -0
  1015. package/dist/version/database-schema.js +169 -0
  1016. package/dist/version/database-schema.js.map +1 -0
  1017. package/dist/version/database-schema.test.d.ts +2 -0
  1018. package/dist/version/database-schema.test.d.ts.map +1 -0
  1019. package/dist/version/database-schema.test.js +625 -0
  1020. package/dist/version/database-schema.test.js.map +1 -0
  1021. package/dist/version/index.d.ts +1 -1
  1022. package/dist/version/index.d.ts.map +1 -1
  1023. package/dist/version/merge-version.d.ts +3 -0
  1024. package/dist/version/merge-version.d.ts.map +1 -1
  1025. package/dist/version/merge-version.js +3 -0
  1026. package/dist/version/merge-version.js.map +1 -1
  1027. package/dist/version/merge-version.test.js +10 -5
  1028. package/dist/version/merge-version.test.js.map +1 -1
  1029. package/dist/version/schema.d.ts +28 -23
  1030. package/dist/version/schema.d.ts.map +1 -1
  1031. package/dist/version/schema.js +42 -30
  1032. package/dist/version/schema.js.map +1 -1
  1033. package/dist/version/schema.test.js +311 -88
  1034. package/dist/version/schema.test.js.map +1 -1
  1035. package/dist/version/select-active-version.d.ts +7 -0
  1036. package/dist/version/select-active-version.d.ts.map +1 -0
  1037. package/dist/version/select-active-version.js +7 -0
  1038. package/dist/version/select-active-version.js.map +1 -0
  1039. package/dist/version/switch-version.d.ts +3 -3
  1040. package/dist/version/switch-version.d.ts.map +1 -1
  1041. package/dist/version/switch-version.js +1 -1
  1042. package/dist/version/switch-version.test.js +1 -1
  1043. package/dist/version/switch-version.test.js.map +1 -1
  1044. package/dist/version/update-changes-in-version.d.ts +2 -0
  1045. package/dist/version/update-changes-in-version.d.ts.map +1 -1
  1046. package/dist/version/update-changes-in-version.js +2 -0
  1047. package/dist/version/update-changes-in-version.js.map +1 -1
  1048. package/dist/version-v2/create-version.d.ts +18 -0
  1049. package/dist/version-v2/create-version.d.ts.map +1 -0
  1050. package/dist/version-v2/create-version.js +35 -0
  1051. package/dist/version-v2/create-version.js.map +1 -0
  1052. package/dist/version-v2/create-version.test.d.ts +2 -0
  1053. package/dist/version-v2/create-version.test.d.ts.map +1 -0
  1054. package/dist/version-v2/create-version.test.js +88 -0
  1055. package/dist/version-v2/create-version.test.js.map +1 -0
  1056. package/dist/version-v2/database-schema.d.ts +21 -0
  1057. package/dist/version-v2/database-schema.d.ts.map +1 -0
  1058. package/dist/version-v2/database-schema.js +169 -0
  1059. package/dist/version-v2/database-schema.js.map +1 -0
  1060. package/dist/version-v2/database-schema.test.d.ts +2 -0
  1061. package/dist/version-v2/database-schema.test.d.ts.map +1 -0
  1062. package/dist/version-v2/database-schema.test.js +625 -0
  1063. package/dist/version-v2/database-schema.test.js.map +1 -0
  1064. package/dist/version-v2/index.d.ts +2 -0
  1065. package/dist/version-v2/index.d.ts.map +1 -0
  1066. package/dist/version-v2/index.js +2 -0
  1067. package/dist/version-v2/index.js.map +1 -0
  1068. package/dist/version-v2/swich-version.d.ts +27 -0
  1069. package/dist/version-v2/swich-version.d.ts.map +1 -0
  1070. package/dist/version-v2/swich-version.js +46 -0
  1071. package/dist/version-v2/swich-version.js.map +1 -0
  1072. package/dist/version-v2/switch-version.d.ts +27 -0
  1073. package/dist/version-v2/switch-version.d.ts.map +1 -0
  1074. package/dist/version-v2/switch-version.js +91 -0
  1075. package/dist/version-v2/switch-version.js.map +1 -0
  1076. package/dist/version-v2/switch-version.test.d.ts +2 -0
  1077. package/dist/version-v2/switch-version.test.d.ts.map +1 -0
  1078. package/dist/version-v2/switch-version.test.js +110 -0
  1079. package/dist/version-v2/switch-version.test.js.map +1 -0
  1080. package/dist/version-v2/with-skip-update-working-change-set.d.ts +3 -0
  1081. package/dist/version-v2/with-skip-update-working-change-set.d.ts.map +1 -0
  1082. package/dist/version-v2/with-skip-update-working-change-set.js +50 -0
  1083. package/dist/version-v2/with-skip-update-working-change-set.js.map +1 -0
  1084. package/dist/version-v2/with-skip-update-working-change-set.test.d.ts +2 -0
  1085. package/dist/version-v2/with-skip-update-working-change-set.test.d.ts.map +1 -0
  1086. package/dist/version-v2/with-skip-update-working-change-set.test.js +49 -0
  1087. package/dist/version-v2/with-skip-update-working-change-set.test.js.map +1 -0
  1088. package/package.json +3 -3
  1089. package/src/account/create-account.ts +7 -7
  1090. package/src/account/index.ts +2 -2
  1091. package/src/account/schema.test.ts +99 -99
  1092. package/src/account/schema.ts +91 -35
  1093. package/src/account/switch-account.test.ts +4 -4
  1094. package/src/account/switch-account.ts +6 -6
  1095. package/src/change/index.ts +4 -1
  1096. package/src/change/schema.test.ts +38 -0
  1097. package/src/change/schema.ts +91 -11
  1098. package/src/change-author/index.ts +4 -1
  1099. package/src/change-author/schema.test.ts +306 -242
  1100. package/src/change-author/schema.ts +18 -12
  1101. package/src/change-proposal/create-change-proposal.ts +3 -3
  1102. package/src/change-proposal/database-schema.ts +1 -1
  1103. package/src/change-set/apply-change-set.test.ts +10 -7
  1104. package/src/change-set/apply-change-set.ts +44 -56
  1105. package/src/change-set/create-change-set.test.ts +0 -39
  1106. package/src/change-set/create-change-set.ts +9 -33
  1107. package/src/change-set/index.ts +3 -11
  1108. package/src/change-set/schema.test.ts +0 -310
  1109. package/src/change-set/schema.ts +43 -100
  1110. package/src/commit/apply-commit.test.ts +426 -0
  1111. package/src/commit/apply-commit.ts +74 -0
  1112. package/src/{change-set → commit}/create-checkpoint.test.ts +244 -26
  1113. package/src/commit/create-checkpoint.ts +140 -0
  1114. package/src/commit/create-commit.ts +80 -0
  1115. package/src/{change-set/create-merge-change-set.test.ts → commit/create-merge-commit.test.ts} +50 -19
  1116. package/src/{change-set/create-merge-change-set.ts → commit/create-merge-commit.ts} +55 -16
  1117. package/src/{change-set/create-transition-change-set.test.ts → commit/create-transition-commit.test.ts} +43 -32
  1118. package/src/{change-set/create-transition-change-set.ts → commit/create-transition-commit.ts} +60 -22
  1119. package/src/{change-set/create-undo-change-set.test.ts → commit/create-undo-commit.test.ts} +52 -23
  1120. package/src/{change-set/create-undo-change-set.ts → commit/create-undo-commit.ts} +59 -26
  1121. package/src/commit/index.ts +11 -0
  1122. package/src/commit/schema.test.ts +257 -0
  1123. package/src/commit/schema.ts +104 -0
  1124. package/src/database/index.ts +0 -2
  1125. package/src/database/init-db.ts +113 -45
  1126. package/src/database/kysely-plugin/json-column-plugin.test.ts +404 -0
  1127. package/src/database/kysely-plugin/json-column-plugin.ts +80 -15
  1128. package/src/database/nano-id.test.ts +3 -3
  1129. package/src/database/nano-id.ts +4 -1
  1130. package/src/database/schema.ts +26 -24
  1131. package/src/deterministic/generate-human-id.test.ts +154 -0
  1132. package/src/deterministic/generate-human-id.ts +94 -0
  1133. package/src/deterministic/index.ts +7 -0
  1134. package/src/deterministic/is-deterministic-mode.test.ts +133 -0
  1135. package/src/deterministic/is-deterministic-mode.ts +32 -0
  1136. package/src/deterministic/nano-id.test.ts +200 -0
  1137. package/src/deterministic/nano-id.ts +188 -0
  1138. package/src/deterministic/options.test.ts +157 -0
  1139. package/src/deterministic/options.ts +62 -0
  1140. package/src/deterministic/random.test.ts +293 -0
  1141. package/src/deterministic/random.ts +261 -0
  1142. package/src/deterministic/sequence.test.ts +93 -0
  1143. package/src/deterministic/sequence.ts +132 -0
  1144. package/src/deterministic/timestamp.test.ts +170 -0
  1145. package/src/deterministic/timestamp.ts +83 -0
  1146. package/src/deterministic/uuid-v7.test.ts +144 -0
  1147. package/src/deterministic/uuid-v7.ts +82 -0
  1148. package/src/entity/eb-entity.test.ts +687 -0
  1149. package/src/entity/eb-entity.ts +203 -0
  1150. package/src/entity/index.ts +12 -0
  1151. package/src/entity/label/create-entity-label.test.ts +316 -0
  1152. package/src/entity/label/create-entity-label.ts +113 -0
  1153. package/src/entity/label/schema.test.ts +692 -0
  1154. package/src/entity/label/schema.ts +55 -0
  1155. package/src/entity/schema.ts +22 -0
  1156. package/src/entity/thread/create-entity-thread.test.ts +282 -0
  1157. package/src/entity/thread/create-entity-thread.ts +134 -0
  1158. package/src/entity/thread/query-threads.test.ts +394 -0
  1159. package/src/entity/thread/schema.test.ts +170 -0
  1160. package/src/entity/thread/schema.ts +55 -0
  1161. package/src/entity-views/README.md +214 -0
  1162. package/src/entity-views/entity-state-all.test.ts +202 -0
  1163. package/src/entity-views/entity-state-all.ts +80 -11
  1164. package/src/entity-views/entity-state-history.test.ts +78 -16
  1165. package/src/entity-views/entity-state-history.ts +68 -19
  1166. package/src/entity-views/entity-state.test.ts +141 -1
  1167. package/src/entity-views/entity-state.ts +79 -10
  1168. package/src/entity-views/entity-view-builder.test.ts +6 -6
  1169. package/src/entity-views/types.ts +2 -2
  1170. package/src/file/file-handlers.test.ts +4 -4
  1171. package/src/file/file-handlers.ts +40 -0
  1172. package/src/file/materialize-file-data-at-commit.ts +157 -0
  1173. package/src/file/schema.test.ts +693 -37
  1174. package/src/file/schema.ts +183 -56
  1175. package/src/hooks/create-hooks.ts +7 -40
  1176. package/src/index.ts +3 -0
  1177. package/src/key-value/index.ts +1 -1
  1178. package/src/key-value/schema.test.ts +103 -2
  1179. package/src/key-value/schema.ts +66 -5
  1180. package/src/label/create-label.ts +7 -7
  1181. package/src/label/index.ts +1 -1
  1182. package/src/label/schema.ts +7 -10
  1183. package/src/lix/new-lix.test.ts +202 -2
  1184. package/src/lix/new-lix.ts +305 -81
  1185. package/src/lix/open-lix.test.ts +308 -5
  1186. package/src/lix/open-lix.ts +169 -68
  1187. package/src/lix/storage/in-memory.test.ts +9 -83
  1188. package/src/lix/storage/in-memory.ts +13 -18
  1189. package/src/lix/storage/lix-storage-adapter.ts +41 -5
  1190. package/src/lix/storage/opfs.test.ts +254 -31
  1191. package/src/lix/storage/opfs.ts +178 -40
  1192. package/src/log/create-lix-own-log.test.ts +11 -7
  1193. package/src/log/create-lix-own-log.ts +21 -32
  1194. package/src/log/create-log.ts +4 -4
  1195. package/src/log/index.ts +1 -1
  1196. package/src/log/schema.ts +6 -10
  1197. package/src/observe/create-observe.test.ts +395 -60
  1198. package/src/observe/create-observe.ts +41 -3
  1199. package/src/observe/determine-schema-keys.test.ts +371 -0
  1200. package/src/observe/determine-schema-keys.ts +165 -0
  1201. package/src/plugin/lix-plugin.ts +3 -3
  1202. package/src/query-filter/change-set-element-in-ancestry-of.test.ts +112 -26
  1203. package/src/query-filter/change-set-element-in-ancestry-of.ts +25 -20
  1204. package/src/query-filter/change-set-element-in-symmetric-difference.test.ts +6 -6
  1205. package/src/query-filter/change-set-element-in-symmetric-difference.ts +3 -3
  1206. package/src/query-filter/change-set-element-is-leaf-of.test.ts +83 -24
  1207. package/src/query-filter/change-set-element-is-leaf-of.ts +61 -39
  1208. package/src/query-filter/commit-is-ancestor-of.test.ts +333 -0
  1209. package/src/query-filter/commit-is-ancestor-of.ts +77 -0
  1210. package/src/query-filter/commit-is-descendant-of.test.ts +365 -0
  1211. package/src/query-filter/commit-is-descendant-of.ts +70 -0
  1212. package/src/query-filter/index.ts +2 -4
  1213. package/src/schema-definition/definition.test.ts +73 -25
  1214. package/src/schema-definition/definition.ts +87 -30
  1215. package/src/schema-definition/index.ts +1 -1
  1216. package/src/schema-definition/validate-lix-schema.test.ts +14 -5
  1217. package/src/schema-definition/validate-lix-schema.ts +9 -13
  1218. package/src/server-protocol-handler/environment/create-in-memory-environment.test.ts +2 -2
  1219. package/src/server-protocol-handler/routes/push-v1.test.ts +1 -1
  1220. package/src/snapshot/schema.test.ts +113 -0
  1221. package/src/snapshot/schema.ts +10 -2
  1222. package/src/state/README.md +95 -0
  1223. package/src/state/cache/clear-state-cache.test.ts +43 -0
  1224. package/src/state/cache/clear-state-cache.ts +16 -0
  1225. package/src/state/cache/is-stale-state-cache.test.ts +35 -0
  1226. package/src/state/cache/is-stale-state-cache.ts +29 -0
  1227. package/src/state/cache/mark-state-cache-as-stale.ts +53 -0
  1228. package/src/state/cache/populate-state-cache.test.ts +259 -0
  1229. package/src/state/cache/populate-state-cache.ts +124 -0
  1230. package/src/state/cache/schema.ts +41 -0
  1231. package/src/state/cache/update-state-cache.test.ts +510 -0
  1232. package/src/state/cache/update-state-cache.ts +317 -0
  1233. package/src/state/commit.test.ts +1402 -0
  1234. package/src/state/commit.ts +587 -0
  1235. package/src/state/insert-transaction-state.test.ts +928 -0
  1236. package/src/state/insert-transaction-state.ts +306 -0
  1237. package/src/state/materialize-state.test.ts +2358 -0
  1238. package/src/state/materialize-state.ts +235 -0
  1239. package/src/state/primary-key.test.ts +158 -0
  1240. package/src/state/primary-key.ts +80 -0
  1241. package/src/state/resolved-state-view.test.ts +521 -0
  1242. package/src/state/resolved-state-view.ts +202 -0
  1243. package/src/state/schema.test.ts +3116 -2272
  1244. package/src/state/schema.ts +614 -910
  1245. package/src/state/untracked/schema.test.ts +301 -0
  1246. package/src/state/untracked/schema.ts +55 -0
  1247. package/src/state/untracked/update-untracked-state.test.ts +466 -0
  1248. package/src/state/untracked/update-untracked-state.ts +133 -0
  1249. package/src/state/validate-state-mutation.test.ts +1032 -77
  1250. package/src/state/validate-state-mutation.ts +270 -68
  1251. package/src/state-history/schema.test.ts +246 -71
  1252. package/src/state-history/schema.ts +78 -55
  1253. package/src/stored-schema/index.ts +4 -1
  1254. package/src/stored-schema/schema.test.ts +7 -7
  1255. package/src/stored-schema/schema.ts +1 -1
  1256. package/src/sync/push-to-server.test.ts +6 -6
  1257. package/src/test-utilities/simulation-test/cache-miss-simulation.test.ts +162 -0
  1258. package/src/test-utilities/simulation-test/cache-miss-simulation.ts +99 -0
  1259. package/src/test-utilities/simulation-test/chaotic-timestamp-simulation.ts +0 -0
  1260. package/src/test-utilities/simulation-test/out-of-order-sequence-simulation.test.ts +88 -0
  1261. package/src/test-utilities/simulation-test/out-of-order-sequence-simulation.ts +69 -0
  1262. package/src/test-utilities/simulation-test/simulation-test.test.ts +400 -0
  1263. package/src/test-utilities/simulation-test/simulation-test.ts +176 -0
  1264. package/src/thread/create-thread-comment.test.ts +62 -3
  1265. package/src/thread/create-thread-comment.ts +34 -6
  1266. package/src/thread/create-thread.test.ts +180 -0
  1267. package/src/thread/create-thread.ts +32 -7
  1268. package/src/thread/index.ts +3 -2
  1269. package/src/thread/schema.test.ts +81 -0
  1270. package/src/thread/schema.ts +24 -19
  1271. package/src/version/create-version.test.ts +92 -26
  1272. package/src/version/create-version.ts +49 -19
  1273. package/src/version/index.ts +2 -2
  1274. package/src/version/schema.test.ts +328 -92
  1275. package/src/version/schema.ts +47 -33
  1276. package/src/version/select-active-version.ts +18 -0
  1277. package/src/version/switch-version.test.ts +1 -1
  1278. package/src/version/switch-version.ts +3 -3
  1279. package/dist/entity-views/entity-state_history.d.ts +0 -67
  1280. package/dist/entity-views/entity-state_history.d.ts.map +0 -1
  1281. package/dist/entity-views/entity-state_history.js +0 -58
  1282. package/dist/entity-views/entity-state_history.js.map +0 -1
  1283. package/dist/entity-views/generic-types.d.ts +0 -128
  1284. package/dist/entity-views/generic-types.d.ts.map +0 -1
  1285. package/dist/entity-views/generic-types.js +0 -2
  1286. package/dist/entity-views/generic-types.js.map +0 -1
  1287. package/dist/entity-views/generic-types.test.d.ts +0 -2
  1288. package/dist/entity-views/generic-types.test.d.ts.map +0 -1
  1289. package/dist/entity-views/generic-types.test.js +0 -99
  1290. package/dist/entity-views/generic-types.test.js.map +0 -1
  1291. package/dist/lix/to-blob.test.d.ts +0 -2
  1292. package/dist/lix/to-blob.test.d.ts.map +0 -1
  1293. package/dist/lix/to-blob.test.js +0 -18
  1294. package/dist/lix/to-blob.test.js.map +0 -1
  1295. package/dist/repository/comparison-example.js +0 -173
  1296. package/dist/repository/comparison-example.js.map +0 -1
  1297. package/dist/repository/entity-repository.d.ts +0 -53
  1298. package/dist/repository/entity-repository.d.ts.map +0 -1
  1299. package/dist/repository/entity-repository.js +0 -187
  1300. package/dist/repository/entity-repository.js.map +0 -1
  1301. package/dist/repository/entity-repository.test.d.ts +0 -2
  1302. package/dist/repository/entity-repository.test.d.ts.map +0 -1
  1303. package/dist/repository/entity-repository.test.js +0 -94
  1304. package/dist/repository/entity-repository.test.js.map +0 -1
  1305. package/dist/repository/example.d.ts +0 -6
  1306. package/dist/repository/example.d.ts.map +0 -1
  1307. package/dist/repository/example.js +0 -87
  1308. package/dist/repository/example.js.map +0 -1
  1309. package/dist/repository/file-repository.d.ts +0 -39
  1310. package/dist/repository/file-repository.d.ts.map +0 -1
  1311. package/dist/repository/file-repository.js +0 -93
  1312. package/dist/repository/file-repository.js.map +0 -1
  1313. package/dist/repository/file-repository.test.d.ts +0 -2
  1314. package/dist/repository/file-repository.test.d.ts.map +0 -1
  1315. package/dist/repository/file-repository.test.js +0 -165
  1316. package/dist/repository/file-repository.test.js.map +0 -1
  1317. package/dist/repository/index.d.ts +0 -6
  1318. package/dist/repository/index.d.ts.map +0 -1
  1319. package/dist/repository/index.js +0 -6
  1320. package/dist/repository/index.js.map +0 -1
  1321. package/dist/repository/integration.test.d.ts +0 -2
  1322. package/dist/repository/integration.test.d.ts.map +0 -1
  1323. package/dist/repository/integration.test.js +0 -136
  1324. package/dist/repository/integration.test.js.map +0 -1
  1325. package/dist/repository/key-value-repository.d.ts +0 -30
  1326. package/dist/repository/key-value-repository.d.ts.map +0 -1
  1327. package/dist/repository/key-value-repository.js +0 -60
  1328. package/dist/repository/key-value-repository.js.map +0 -1
  1329. package/dist/repository/key-value-repository.test.d.ts +0 -2
  1330. package/dist/repository/key-value-repository.test.d.ts.map +0 -1
  1331. package/dist/repository/key-value-repository.test.js +0 -122
  1332. package/dist/repository/key-value-repository.test.js.map +0 -1
  1333. package/dist/repository/markdown-plugin-example.js +0 -118
  1334. package/dist/repository/markdown-plugin-example.js.map +0 -1
  1335. package/dist/repository/query-builder.d.ts +0 -69
  1336. package/dist/repository/query-builder.d.ts.map +0 -1
  1337. package/dist/repository/query-builder.js +0 -155
  1338. package/dist/repository/query-builder.js.map +0 -1
  1339. package/dist/repository/query-builder.test.d.ts +0 -2
  1340. package/dist/repository/query-builder.test.d.ts.map +0 -1
  1341. package/dist/repository/query-builder.test.js +0 -244
  1342. package/dist/repository/query-builder.test.js.map +0 -1
  1343. package/dist/repository/repository-manager.d.ts +0 -27
  1344. package/dist/repository/repository-manager.d.ts.map +0 -1
  1345. package/dist/repository/repository-manager.js +0 -19
  1346. package/dist/repository/repository-manager.js.map +0 -1
  1347. package/dist/repository/repository-manager.test.d.ts +0 -2
  1348. package/dist/repository/repository-manager.test.d.ts.map +0 -1
  1349. package/dist/repository/repository-manager.test.js +0 -65
  1350. package/dist/repository/repository-manager.test.js.map +0 -1
  1351. package/dist/repository/test-helpers.js +0 -402
  1352. package/dist/repository/test-helpers.js.map +0 -1
  1353. package/dist/schema-definition/lix-generated.test.d.ts +0 -2
  1354. package/dist/schema-definition/lix-generated.test.d.ts.map +0 -1
  1355. package/dist/schema-definition/lix-generated.test.js +0 -127
  1356. package/dist/schema-definition/lix-generated.test.js.map +0 -1
  1357. package/dist/state/entity-view-builder.d.ts +0 -145
  1358. package/dist/state/entity-view-builder.d.ts.map +0 -1
  1359. package/dist/state/entity-view-builder.js +0 -280
  1360. package/dist/state/entity-view-builder.js.map +0 -1
  1361. package/dist/state/entity-view-builder.test.d.ts +0 -2
  1362. package/dist/state/entity-view-builder.test.d.ts.map +0 -1
  1363. package/dist/state/entity-view-builder.test.js +0 -523
  1364. package/dist/state/entity-view-builder.test.js.map +0 -1
  1365. package/src/change-set/create-checkpoint.ts +0 -101
  1366. package/src/file/materialize-file-data-at-changeset.ts +0 -123
  1367. package/src/query-filter/change-has-label.test.ts +0 -79
  1368. package/src/query-filter/change-has-label.ts +0 -45
  1369. package/src/query-filter/change-set-has-label.test.ts +0 -42
  1370. package/src/query-filter/change-set-has-label.ts +0 -50
  1371. package/src/query-filter/change-set-is-ancestor-of.test.ts +0 -178
  1372. package/src/query-filter/change-set-is-ancestor-of.ts +0 -77
  1373. package/src/query-filter/change-set-is-descendant-of.test.ts +0 -169
  1374. package/src/query-filter/change-set-is-descendant-of.ts +0 -70
  1375. package/src/state/create-changeset-for-transaction.ts +0 -321
  1376. package/src/state/get-version-record-by-id-or-throw.ts +0 -51
  1377. package/src/state/handle-state-mutation.test.ts +0 -761
  1378. package/src/state/handle-state-mutation.ts +0 -418
@@ -3,16 +3,52 @@ import type { SqliteWasmDatabase } from "sqlite-wasm-kysely";
3
3
  import { validateStateMutation } from "./validate-state-mutation.js";
4
4
  import type { LixInternalDatabaseSchema } from "../database/schema.js";
5
5
  import type { Kysely } from "kysely";
6
- import { handleStateMutation } from "./handle-state-mutation.js";
7
- import { createLixOwnLogSync } from "../log/create-lix-own-log.js";
8
- import { createChangesetForTransaction } from "./create-changeset-for-transaction.js";
6
+ import { sql } from "kysely";
7
+ import { insertTransactionState } from "./insert-transaction-state.js";
9
8
  import type { LixHooks } from "../hooks/create-hooks.js";
9
+ import { executeSync } from "../database/execute-sync.js";
10
+ import { applyMaterializeStateSchema } from "./materialize-state.js";
11
+ import { applyResolvedStateView } from "./resolved-state-view.js";
12
+ import { applyStateCacheSchema } from "./cache/schema.js";
13
+ import { isStaleStateCache } from "./cache/is-stale-state-cache.js";
14
+ import { markStateCacheAsFresh } from "./cache/mark-state-cache-as-stale.js";
15
+ import { applyUntrackedStateSchema } from "./untracked/schema.js";
16
+ import { commit } from "./commit.js";
17
+ import { parseStatePk, serializeStatePk } from "./primary-key.js";
18
+ import { uuidV7 } from "../deterministic/uuid-v7.js";
19
+ import { LixLogSchema } from "../log/schema.js";
20
+ import { shouldLog } from "../log/create-lix-own-log.js";
21
+ import { populateStateCache } from "./cache/populate-state-cache.js";
22
+ // import { createLixOwnLogSync } from "../log/create-lix-own-log.js";
23
+
24
+ // Virtual table schema definition
25
+ const VTAB_CREATE_SQL = `CREATE TABLE x(
26
+ _pk HIDDEN TEXT NOT NULL PRIMARY KEY,
27
+ entity_id TEXT,
28
+ schema_key TEXT,
29
+ file_id TEXT,
30
+ version_id TEXT,
31
+ plugin_key TEXT,
32
+ snapshot_content TEXT,
33
+ schema_version TEXT,
34
+ created_at TEXT,
35
+ updated_at TEXT,
36
+ inherited_from_version_id TEXT,
37
+ change_id TEXT,
38
+ untracked INTEGER,
39
+ commit_id TEXT
40
+ ) WITHOUT ROWID;`;
10
41
 
11
42
  export function applyStateDatabaseSchema(
12
43
  sqlite: SqliteWasmDatabase,
13
44
  db: Kysely<LixInternalDatabaseSchema>,
14
45
  hooks: LixHooks
15
- ): SqliteWasmDatabase {
46
+ ): void {
47
+ applyMaterializeStateSchema(sqlite);
48
+ applyStateCacheSchema({ sqlite });
49
+ applyUntrackedStateSchema({ sqlite });
50
+ applyResolvedStateView({ sqlite, db });
51
+
16
52
  sqlite.createFunction({
17
53
  name: "validate_snapshot_content",
18
54
  deterministic: true,
@@ -37,63 +73,33 @@ export function applyStateDatabaseSchema(
37
73
  // Store cursor state
38
74
  const cursorStates = new Map();
39
75
 
40
- // Cache initialization state to avoid repeated table existence checks
41
- let loggingInitialized: boolean | null = null;
42
-
43
- const canLog = () => {
44
- if (loggingInitialized === null) {
45
- try {
46
- const tableExists = sqlite.exec({
47
- sql: "SELECT 1 FROM sqlite_master WHERE type='table' AND name='key_value'",
48
- returnValue: "resultRows",
49
- });
50
- loggingInitialized = tableExists && tableExists.length > 0;
51
- } catch {
52
- loggingInitialized = false;
53
- }
54
- }
55
- return loggingInitialized;
56
- };
57
-
58
- const create_temp_change_table_sql = `
59
- -- add a table we use within the transaction
60
- CREATE TEMP TABLE IF NOT EXISTS internal_change_in_transaction (
61
- id TEXT PRIMARY KEY DEFAULT (uuid_v7()),
62
- entity_id TEXT NOT NULL,
63
- schema_key TEXT NOT NULL,
64
- schema_version TEXT NOT NULL,
65
- file_id TEXT NOT NULL,
66
- plugin_key TEXT NOT NULL,
67
- version_id TEXT NOT NULL,
68
- snapshot_content BLOB,
69
- created_at TEXT DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')) NOT NULL CHECK (created_at LIKE '%Z'),
70
- --- NOTE schena_key must be unique per entity_id and file_id
71
- UNIQUE(entity_id, file_id, schema_key, version_id)
72
- ) STRICT;
73
-
74
- `;
75
-
76
- sqlite.exec(create_temp_change_table_sql);
76
+ // Guard flag to prevent recursion when logging
77
+ let loggingIsInProgress = false;
78
+
79
+ /**
80
+ * Flag to prevent recursion when updating cache state.
81
+ *
82
+ * The guard ensures that while we're marking cache as fresh, any nested state queries
83
+ * bypass the cache and use materialized state directly, preventing recursion.
84
+ *
85
+ * Why is this needed is unclear. Queries are executed in sync. Why concurrent
86
+ * reads simultaneously update the cache is not clear. Given that state
87
+ * materialization is rare, this workaround has been deemed sufficient.
88
+ *
89
+ * This is a temporary fix and should be revisited in the future.
90
+ */
91
+ let isUpdatingCacheState = false;
77
92
 
78
93
  module.installMethods(
79
94
  {
80
- xCreate: (db: any, _pAux: any, _argc: number, _argv: any, pVTab: any) => {
81
- const sql = `CREATE TABLE x(
82
- entity_id TEXT,
83
- schema_key TEXT,
84
- file_id TEXT,
85
- version_id TEXT,
86
- plugin_key TEXT,
87
- snapshot_content TEXT,
88
- schema_version TEXT,
89
- created_at TEXT,
90
- updated_at TEXT,
91
- inherited_from_version_id TEXT,
92
- change_id TEXT,
93
- untracked INTEGER
94
- )`;
95
-
96
- const result = capi.sqlite3_declare_vtab(db, sql);
95
+ xCreate: (
96
+ dbHandle: any,
97
+ _pAux: any,
98
+ _argc: number,
99
+ _argv: any,
100
+ pVTab: any
101
+ ) => {
102
+ const result = capi.sqlite3_declare_vtab(dbHandle, VTAB_CREATE_SQL);
97
103
  if (result !== capi.SQLITE_OK) {
98
104
  return result;
99
105
  }
@@ -103,187 +109,57 @@ export function applyStateDatabaseSchema(
103
109
  },
104
110
 
105
111
  xConnect: (
106
- db: any,
112
+ dbHandle: any,
107
113
  _pAux: any,
108
114
  _argc: number,
109
115
  _argv: any,
110
116
  pVTab: any
111
117
  ) => {
112
- const sql = `CREATE TABLE x(
113
- entity_id TEXT,
114
- schema_key TEXT,
115
- file_id TEXT,
116
- version_id TEXT,
117
- plugin_key TEXT,
118
- snapshot_content TEXT,
119
- schema_version TEXT,
120
- created_at TEXT,
121
- updated_at TEXT,
122
- inherited_from_version_id TEXT,
123
- change_id TEXT,
124
- untracked INTEGER
125
- )`;
126
-
127
- const result = capi.sqlite3_declare_vtab(db, sql);
118
+ const result = capi.sqlite3_declare_vtab(dbHandle, VTAB_CREATE_SQL);
128
119
  if (result !== capi.SQLITE_OK) {
129
120
  return result;
130
121
  }
131
122
 
123
+ // wiping all rows on connect simulates a temp table for internal_change_in_transaction.
124
+ // we need to clear any existing changes on connect in case a transaction remained open.
125
+ // otherwise, the lix can't boot up properly and will throw an error.
126
+ //
127
+ // an open transaction can happen if the storage layer crashes or is not properly shut down.
128
+ //
129
+ // PS internal_change_in_transaction is not a temp table because sqlite
130
+ // prohibits access to temp tables from virtual tables
131
+ executeSync({
132
+ lix: { sqlite },
133
+ query: db.deleteFrom("internal_change_in_transaction"),
134
+ });
135
+
132
136
  sqlite.sqlite3.vtab.xVtab.create(pVTab);
133
137
  return capi.SQLITE_OK;
134
138
  },
135
139
 
136
140
  xBegin: () => {
137
- // assert that we are not already in a transaction (the internal_change_in_transaction table is empty)
138
- if (
139
- sqlite.exec({
140
- sql: "SELECT * FROM internal_change_in_transaction",
141
- returnValue: "resultRows",
142
- }).length > 0
143
- ) {
144
- const errorMessage = "Transaction already in progress";
145
- if (canLog()) {
146
- createLixOwnLogSync({
147
- lix: { sqlite, db: db as any },
148
- key: "lix_state_xbegin_error",
149
- level: "error",
150
- message: `xBegin error: ${errorMessage}`,
151
- });
152
- }
153
- throw new Error(errorMessage);
154
- }
141
+ // TODO comment in after all internal v-table logic uses underlying state view
142
+ // // assert that we are not already in a transaction (the internal_change_in_transaction table is empty)
143
+ // const existingChangesInTransaction = executeSync({
144
+ // lix: { sqlite },
145
+ // query: db.selectFrom("internal_change_in_transaction").selectAll(),
146
+ // });
147
+ // if (existingChangesInTransaction.length > 0) {
148
+ // const errorMessage = "Transaction already in progress";
149
+ // if (canLog()) {
150
+ // createLixOwnLogSync({
151
+ // lix: { sqlite, db: db as any },
152
+ // key: "lix_state_xbegin_error",
153
+ // level: "error",
154
+ // message: `xBegin error: ${errorMessage}`,
155
+ // });
156
+ // }
157
+ // throw new Error(errorMessage);
158
+ // }
155
159
  },
156
160
 
157
161
  xCommit: () => {
158
- const currentTime = new Date().toISOString();
159
-
160
- // Insert each row from internal_change_in_transaction into internal_snapshot and internal_change,
161
- // using the same id for snapshot_id in internal_change as in internal_snapshot.
162
- const changesWithoutChangeSets = sqlite.exec({
163
- sql: `
164
- SELECT
165
- id,
166
- entity_id,
167
- schema_key,
168
- schema_version,
169
- file_id,
170
- plugin_key,
171
- version_id,
172
- CASE
173
- WHEN snapshot_content IS NOT NULL THEN json(snapshot_content)
174
- ELSE NULL
175
- END as snapshot_content,
176
- created_at
177
- FROM internal_change_in_transaction
178
- ORDER BY version_id
179
- `,
180
- returnValue: "resultRows",
181
- });
182
-
183
- // Group changes by version_id
184
- const changesByVersion = new Map<
185
- string,
186
- {
187
- id: string;
188
- entity_id: string;
189
- schema_key: string;
190
- schema_version: string;
191
- file_id: string;
192
- plugin_key: string;
193
- created_at: string;
194
- snapshot_content: string | null;
195
- }[]
196
- >();
197
- for (const changeWithoutChangeset of changesWithoutChangeSets) {
198
- const version_id = changeWithoutChangeset[6] as string;
199
- if (!changesByVersion.has(version_id)) {
200
- changesByVersion.set(version_id, []);
201
- }
202
- changesByVersion.get(version_id)!.push({
203
- id: changeWithoutChangeset[0] as string,
204
- entity_id: changeWithoutChangeset[1] as string,
205
- schema_key: changeWithoutChangeset[2] as string,
206
- schema_version: changeWithoutChangeset[3] as string,
207
- file_id: changeWithoutChangeset[4] as string,
208
- plugin_key: changeWithoutChangeset[5] as string,
209
- snapshot_content: changeWithoutChangeset[7] as string,
210
- created_at: changeWithoutChangeset[8] as string,
211
- });
212
- }
213
-
214
- // Process each version's changes to create changesets
215
- for (const [version_id, versionChanges] of changesByVersion) {
216
- // Create changeset and edges for this version's transaction
217
- createChangesetForTransaction(
218
- sqlite,
219
- db as any,
220
- currentTime,
221
- version_id,
222
- versionChanges
223
- );
224
- }
225
-
226
- const changesToRealize = sqlite.exec({
227
- sql: "SELECT id, entity_id, schema_key, schema_version, file_id, plugin_key, version_id, snapshot_content, created_at FROM internal_change_in_transaction ORDER BY version_id",
228
- returnValue: "resultRows",
229
- });
230
-
231
- for (const changeToRealize of changesToRealize) {
232
- const [
233
- id,
234
- entity_id,
235
- schema_key,
236
- schema_version,
237
- file_id,
238
- plugin_key,
239
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
240
- version_id,
241
- snapshot_content,
242
- created_at,
243
- ] = changeToRealize;
244
-
245
- let snapshot_id = "no-content";
246
-
247
- if (snapshot_content) {
248
- // Insert into internal_snapshot
249
- const result = sqlite.exec({
250
- sql: `INSERT OR IGNORE INTO internal_snapshot (content) VALUES (?) RETURNING id`,
251
- bind: [snapshot_content],
252
- returnValue: "resultRows",
253
- });
254
- // Get the 'id' column of the newly created row
255
- if (result && result.length > 0) {
256
- snapshot_id = result[0]![0] as string; // assuming 'id' is the first column
257
- }
258
- }
259
-
260
- // Insert into internal_change
261
- sqlite.exec({
262
- sql: `INSERT INTO internal_change (id, entity_id, schema_key, schema_version, file_id, plugin_key, snapshot_id, created_at)
263
- VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,
264
- bind: [
265
- id,
266
- entity_id,
267
- schema_key,
268
- schema_version,
269
- file_id,
270
- plugin_key,
271
- snapshot_id,
272
- created_at,
273
- ],
274
- returnValue: "resultRows",
275
- });
276
- }
277
-
278
- sqlite.exec({
279
- sql: "DELETE FROM internal_change_in_transaction",
280
- returnValue: "resultRows",
281
- });
282
-
283
- // Emit state commit hook after transaction is successfully committed
284
- hooks._emit("state_commit");
285
-
286
- return capi.SQLITE_OK;
162
+ return commit({ lix: { sqlite, db: db as any, hooks } });
287
163
  },
288
164
 
289
165
  xRollback: () => {
@@ -293,7 +169,83 @@ export function applyStateDatabaseSchema(
293
169
  });
294
170
  },
295
171
 
296
- xBestIndex: () => {
172
+ xBestIndex: (pVTab: any, pIdxInfo: any) => {
173
+ const idxInfo = sqlite.sqlite3.vtab.xIndexInfo(pIdxInfo);
174
+
175
+ // Track which columns have equality constraints
176
+ const usableConstraints: string[] = [];
177
+ let argIndex = 0;
178
+
179
+ // Column mapping (matching the CREATE TABLE order in xCreate/xConnect)
180
+ const columnMap = [
181
+ "_pk", // 0 (HIDDEN column)
182
+ "entity_id", // 1
183
+ "schema_key", // 2
184
+ "file_id", // 3
185
+ "version_id", // 4
186
+ "plugin_key", // 5
187
+ "snapshot_content", // 6
188
+ "schema_version", // 7
189
+ "created_at", // 8
190
+ "updated_at", // 9
191
+ "inherited_from_version_id", // 10
192
+ "change_id", // 11
193
+ "untracked", // 12
194
+ "commit_id", // 13
195
+ ];
196
+
197
+ // Process constraints
198
+ // @ts-expect-error - idxInfo.$nConstraint is not defined in the type
199
+ for (let i = 0; i < idxInfo.$nConstraint; i++) {
200
+ // @ts-expect-error - idxInfo.nthConstraint is not defined in the type
201
+ const constraint = idxInfo.nthConstraint(i);
202
+
203
+ // Only handle equality constraints that are usable
204
+ if (
205
+ constraint.$op === capi.SQLITE_INDEX_CONSTRAINT_EQ &&
206
+ constraint.$usable
207
+ ) {
208
+ const columnName = columnMap[constraint.$iColumn];
209
+ if (columnName) {
210
+ usableConstraints.push(columnName);
211
+
212
+ // Mark this constraint as used
213
+ // @ts-expect-error - idxInfo.nthConstraintUsage is not defined in the type
214
+ idxInfo.nthConstraintUsage(i).$argvIndex = ++argIndex;
215
+ }
216
+ }
217
+ }
218
+
219
+ const fullTableCost = 1000000; // Default cost for full table scan
220
+ const fullTableRows = 10000000;
221
+
222
+ // Set the index string to pass column names to xFilter
223
+ if (usableConstraints.length > 0) {
224
+ const idxStr = usableConstraints.join(",");
225
+ // @ts-expect-error - idxInfo.$idxStr is not defined in the type
226
+ idxInfo.$idxStr = sqlite.sqlite3.wasm.allocCString(idxStr, false);
227
+ // @ts-expect-error - idxInfo.$needToFreeIdxStr is not defined in the type
228
+ idxInfo.$needToFreeIdxStr = 1; // We don't need SQLite to free this string
229
+
230
+ // Lower cost when we can use filters (more selective)
231
+ // @ts-expect-error - idxInfo.$estimatedCost is not defined in the type
232
+ idxInfo.$estimatedCost =
233
+ fullTableCost / (usableConstraints.length + 1);
234
+ // @ts-expect-error - idxInfo.$estimatedRows is not defined in the type
235
+ idxInfo.$estimatedRows = Math.ceil(
236
+ fullTableRows / (usableConstraints.length + 1)
237
+ );
238
+ } else {
239
+ // @ts-expect-error - idxInfo.$needToFreeIdxStr is not defined in the type
240
+ idxInfo.$needToFreeIdxStr = 0;
241
+
242
+ // Higher cost for full table scan
243
+ // @ts-expect-error - idxInfo.$estimatedCost is not defined in the type
244
+ idxInfo.$estimatedCost = fullTableCost;
245
+ // @ts-expect-error - idxInfo.$estimatedRows is not defined in the type
246
+ idxInfo.$estimatedRows = fullTableRows;
247
+ }
248
+
297
249
  return capi.SQLITE_OK;
298
250
  },
299
251
 
@@ -319,248 +271,140 @@ export function applyStateDatabaseSchema(
319
271
  return capi.SQLITE_OK;
320
272
  },
321
273
 
322
- xFilter: (pCursor: any) => {
274
+ xFilter: (
275
+ pCursor: any,
276
+ idxNum: number,
277
+ idxStrPtr: number,
278
+ argc: number,
279
+ argv: any
280
+ ) => {
323
281
  const cursorState = cursorStates.get(pCursor);
282
+ const idxStr = sqlite.sqlite3.wasm.cstrToJs(idxStrPtr);
283
+
284
+ // Debug: Track recursion depth
285
+ const recursionKey = "_vtab_recursion_depth";
286
+ // @ts-expect-error - using global for debugging
287
+ const currentDepth = (globalThis[recursionKey] || 0) + 1;
288
+ // @ts-expect-error - using global for debugging
289
+ globalThis[recursionKey] = currentDepth;
290
+
291
+ if (currentDepth > 10) {
292
+ // @ts-expect-error - using global for debugging
293
+ globalThis[recursionKey] = 0; // Reset
294
+ throw new Error(
295
+ `Virtual table recursion depth exceeded: ${currentDepth}`
296
+ );
297
+ }
324
298
 
325
- // Try cache first - UNION with priority: untracked > tracked > inherited
326
- const cacheResults = sqlite.exec({
327
- sql: `
328
- -- 1. Untracked state (highest priority)
329
- SELECT entity_id, schema_key, file_id, version_id, plugin_key,
330
- snapshot_content, schema_version, created_at, updated_at,
331
- NULL as inherited_from_version_id, 'untracked' as change_id, 1 as untracked
332
- FROM internal_state_all_untracked
333
-
334
- UNION ALL
335
-
336
- -- 2. Tracked state (second priority) - only if no untracked exists
337
- SELECT entity_id, schema_key, file_id, version_id, plugin_key,
338
- snapshot_content, schema_version, created_at, updated_at,
339
- inherited_from_version_id, change_id, 0 as untracked
340
- FROM internal_state_cache
341
- WHERE inheritance_delete_marker = 0 -- Hide copy-on-write deletions
342
- AND NOT EXISTS (
343
- SELECT 1 FROM internal_state_all_untracked unt
344
- WHERE unt.entity_id = internal_state_cache.entity_id
345
- AND unt.schema_key = internal_state_cache.schema_key
346
- AND unt.file_id = internal_state_cache.file_id
347
- AND unt.version_id = internal_state_cache.version_id
348
- )
349
-
350
- UNION ALL
351
-
352
- -- 3. Inherited state (lowest priority) - only if no untracked or tracked exists
353
- SELECT isc.entity_id, isc.schema_key, isc.file_id,
354
- vi.version_id, -- Return child version_id
355
- isc.plugin_key, isc.snapshot_content, isc.schema_version,
356
- isc.created_at, isc.updated_at,
357
- vi.parent_version_id as inherited_from_version_id, isc.change_id, 0 as untracked
358
- FROM (
359
- -- Get version inheritance relationships from cache
360
- SELECT
361
- json_extract(isc_v.snapshot_content, '$.id') AS version_id,
362
- json_extract(isc_v.snapshot_content, '$.inherits_from_version_id') AS parent_version_id
363
- FROM internal_state_cache isc_v
364
- WHERE isc_v.schema_key = 'lix_version'
365
- ) vi
366
- JOIN internal_state_cache isc ON isc.version_id = vi.parent_version_id
367
- WHERE vi.parent_version_id IS NOT NULL
368
- -- Only inherit entities that exist (not deleted) in parent
369
- AND isc.inheritance_delete_marker = 0
370
- -- Don't inherit if child has tracked state
371
- AND NOT EXISTS (
372
- SELECT 1 FROM internal_state_cache child_isc
373
- WHERE child_isc.version_id = vi.version_id
374
- AND child_isc.entity_id = isc.entity_id
375
- AND child_isc.schema_key = isc.schema_key
376
- AND child_isc.file_id = isc.file_id
377
- )
378
- -- Don't inherit if child has untracked state
379
- AND NOT EXISTS (
380
- SELECT 1 FROM internal_state_all_untracked unt
381
- WHERE unt.version_id = vi.version_id
382
- AND unt.entity_id = isc.entity_id
383
- AND unt.schema_key = isc.schema_key
384
- AND unt.file_id = isc.file_id
385
- )
386
- `,
387
- returnValue: "resultRows",
388
- });
299
+ try {
300
+ // Extract filter arguments if provided
301
+ const filters: Record<string, any> = {};
302
+ if (argc > 0 && argv) {
303
+ const args = sqlite.sqlite3.capi.sqlite3_values_to_js(argc, argv);
304
+ // Parse idxStr to understand which columns are being filtered
305
+ // idxStr format: "column1,column2,..."
306
+ if (idxStr) {
307
+ const columns = idxStr.split(",").filter((c) => c.length > 0);
308
+ for (let i = 0; i < Math.min(columns.length, args.length); i++) {
309
+ if (args[i] !== null) {
310
+ filters[columns[i]!] = args[i]; // Keep original type
311
+ }
312
+ }
313
+ }
314
+ }
389
315
 
390
- cursorState.results = cacheResults || [];
391
- cursorState.rowIndex = 0;
316
+ // If we're updating cache state, we must use resolved state view directly to avoid recursion
317
+ if (isUpdatingCacheState) {
318
+ // Query directly from resolved state view which handles inheritance correctly
319
+ let query = db
320
+ .selectFrom("internal_resolved_state_all")
321
+ .selectAll();
392
322
 
393
- // Cache miss - populate cache with actual recursive state query
394
- if (cursorState.results.length === 0) {
395
- if (canLog()) {
396
- createLixOwnLogSync({
397
- lix: { sqlite, db: db as any },
398
- key: "lix_state_cache_miss",
399
- level: "debug",
400
- message: `Cache miss detected - materializing state from CTE`,
323
+ // Apply filters
324
+ for (const [column, value] of Object.entries(filters)) {
325
+ query = query.where(column as any, "=", value);
326
+ }
327
+
328
+ const stateResults = executeSync({
329
+ lix: { sqlite },
330
+ query,
401
331
  });
332
+
333
+ cursorState.results = stateResults || [];
334
+ cursorState.rowIndex = 0;
335
+ return capi.SQLITE_OK;
402
336
  }
403
337
 
404
- // Run the expensive recursive CTE to materialize state
405
- // Include deletions when populating cache so inheritance blocking works
406
- const stateResults = selectStateViaCTE(sqlite, {}, true);
407
-
408
- // Populate cache with materialized state results
409
- if (stateResults && stateResults.length > 0) {
410
- let cachePopulated = false;
411
- for (const row of stateResults) {
412
- // CTE returns rows as arrays, so access by index
413
- const entity_id = Array.isArray(row) ? row[0] : row.entity_id;
414
- const schema_key = Array.isArray(row) ? row[1] : row.schema_key;
415
- const file_id = Array.isArray(row) ? row[2] : row.file_id;
416
- const plugin_key = Array.isArray(row) ? row[3] : row.plugin_key;
417
- const snapshot_content = Array.isArray(row)
418
- ? row[4]
419
- : row.snapshot_content;
420
- const schema_version = Array.isArray(row)
421
- ? row[5]
422
- : row.schema_version;
423
- const version_id = Array.isArray(row) ? row[6] : row.version_id;
424
- const created_at = Array.isArray(row) ? row[7] : row.created_at;
425
- const updated_at = Array.isArray(row) ? row[8] : row.updated_at;
426
- const inherited_from_version_id = Array.isArray(row)
427
- ? row[9]
428
- : row.inherited_from_version_id;
429
- const change_id = Array.isArray(row) ? row[10] : row.change_id;
430
-
431
- // Skip rows with null entity_id (no actual state data found)
432
- if (!entity_id) {
433
- continue;
434
- }
338
+ // Normal path: check cache staleness
339
+ const cacheIsStale = isStaleStateCache({
340
+ lix: { sqlite, db: db as any },
341
+ });
435
342
 
436
- const isDeletion = snapshot_content === null;
343
+ // Try cache first - but only if it's not stale
344
+ let cacheResults: any[] | null = null;
345
+ if (!cacheIsStale) {
346
+ // Select directly from resolved state view using Kysely
347
+ let query = db
348
+ .selectFrom("internal_resolved_state_all")
349
+ .selectAll();
350
+
351
+ // Apply filters
352
+ for (const [column, value] of Object.entries(filters)) {
353
+ query = query.where(column as any, "=", value);
354
+ }
437
355
 
438
- // TODO the CTE should not return inherited entities (optimization for later)
439
- // Skip inherited entities - they should be resolved via inheritance logic, not stored as duplicates
440
- if (
441
- inherited_from_version_id !== null &&
442
- inherited_from_version_id !== undefined
443
- ) {
444
- continue;
445
- }
356
+ cacheResults = executeSync({
357
+ lix: { sqlite },
358
+ query,
359
+ });
360
+ }
446
361
 
447
- sqlite.exec({
448
- sql: `INSERT OR REPLACE INTO internal_state_cache
449
- (entity_id, schema_key, file_id, version_id, plugin_key, snapshot_content, schema_version, created_at, updated_at, inherited_from_version_id, inheritance_delete_marker, change_id)
450
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
451
- bind: [
452
- entity_id,
453
- schema_key,
454
- file_id,
455
- version_id,
456
- plugin_key,
457
- isDeletion
458
- ? null
459
- : typeof snapshot_content === "string"
460
- ? snapshot_content
461
- : JSON.stringify(snapshot_content),
462
- schema_version,
463
- created_at,
464
- updated_at,
465
- inherited_from_version_id === null ||
466
- inherited_from_version_id === undefined
467
- ? null
468
- : inherited_from_version_id,
469
- isDeletion ? 1 : 0,
470
- change_id || "unknown-change-id",
471
- ],
472
- });
473
- cachePopulated = true;
362
+ cursorState.results = cacheResults || [];
363
+ cursorState.rowIndex = 0;
364
+
365
+ if (cacheIsStale) {
366
+ // Populate cache directly with materialized state
367
+ populateStateCache(sqlite);
368
+
369
+ // Log the cache miss
370
+ insertVTableLog({
371
+ sqlite,
372
+ db: db as any,
373
+ key: "lix_state_cache_miss",
374
+ level: "debug",
375
+ message: `Cache miss detected - materialized state`,
376
+ });
377
+
378
+ // Mark cache as fresh after population
379
+ isUpdatingCacheState = true;
380
+ try {
381
+ markStateCacheAsFresh({ lix: { sqlite, db: db as any } });
382
+ } finally {
383
+ isUpdatingCacheState = false;
474
384
  }
475
- if (cachePopulated && canLog()) {
476
- createLixOwnLogSync({
477
- lix: { sqlite, db: db as any },
478
- key: "lix_state_cache_populated",
479
- level: "debug",
480
- message: `Cache populated with ${stateResults?.length || 0} rows from CTE`,
481
- });
385
+
386
+ let query = db
387
+ .selectFrom("internal_resolved_state_all")
388
+ .selectAll();
389
+
390
+ // Apply filters
391
+ for (const [column, value] of Object.entries(filters)) {
392
+ query = query.where(column as any, "=", value);
482
393
  }
483
- }
484
394
 
485
- // Re-query cache after population
486
-
487
- // Re-query after population with priority: untracked > tracked > inherited
488
- const newResults = sqlite.exec({
489
- sql: `
490
- -- 1. Untracked state (highest priority)
491
- SELECT entity_id, schema_key, file_id, version_id, plugin_key,
492
- snapshot_content, schema_version, created_at, updated_at,
493
- NULL as inherited_from_version_id, 'untracked' as change_id, 1 as untracked
494
- FROM internal_state_all_untracked
495
-
496
- UNION ALL
497
-
498
- -- 2. Tracked state (second priority) - only if no untracked exists
499
- SELECT entity_id, schema_key, file_id, version_id, plugin_key,
500
- snapshot_content, schema_version, created_at, updated_at,
501
- inherited_from_version_id, change_id, 0 as untracked
502
- FROM internal_state_cache
503
- WHERE inheritance_delete_marker = 0 -- Hide copy-on-write deletions
504
- AND NOT EXISTS (
505
- SELECT 1 FROM internal_state_all_untracked unt
506
- WHERE unt.entity_id = internal_state_cache.entity_id
507
- AND unt.schema_key = internal_state_cache.schema_key
508
- AND unt.file_id = internal_state_cache.file_id
509
- AND unt.version_id = internal_state_cache.version_id
510
- )
511
-
512
- UNION ALL
513
-
514
- -- 3. Inherited state (lowest priority) - only if no untracked or tracked exists
515
- SELECT isc.entity_id, isc.schema_key, isc.file_id,
516
- vi.version_id, -- Return child version_id
517
- isc.plugin_key, isc.snapshot_content, isc.schema_version,
518
- isc.created_at, isc.updated_at,
519
- vi.parent_version_id as inherited_from_version_id, isc.change_id, 0 as untracked
520
- FROM (
521
- -- Get version inheritance relationships from cache
522
- SELECT
523
- json_extract(isc_v.snapshot_content, '$.id') AS version_id,
524
- json_extract(isc_v.snapshot_content, '$.inherits_from_version_id') AS parent_version_id
525
- FROM internal_state_cache isc_v
526
- WHERE isc_v.schema_key = 'lix_version'
527
- ) vi
528
- JOIN internal_state_cache isc ON isc.version_id = vi.parent_version_id
529
- WHERE vi.parent_version_id IS NOT NULL
530
- -- Only inherit entities that exist (not deleted) in parent
531
- AND isc.inheritance_delete_marker = 0
532
- -- Don't inherit if child has tracked state
533
- AND NOT EXISTS (
534
- SELECT 1 FROM internal_state_cache child_isc
535
- WHERE child_isc.version_id = vi.version_id
536
- AND child_isc.entity_id = isc.entity_id
537
- AND child_isc.schema_key = isc.schema_key
538
- AND child_isc.file_id = isc.file_id
539
- )
540
- -- Don't inherit if child has untracked state
541
- AND NOT EXISTS (
542
- SELECT 1 FROM internal_state_all_untracked unt
543
- WHERE unt.version_id = vi.version_id
544
- AND unt.entity_id = isc.entity_id
545
- AND unt.schema_key = isc.schema_key
546
- AND unt.file_id = isc.file_id
547
- )
548
- `,
549
- returnValue: "resultRows",
550
- });
551
- cursorState.results = newResults || [];
552
- } else {
553
- if (canLog()) {
554
- createLixOwnLogSync({
555
- lix: { sqlite, db: db as any },
556
- key: "lix_state_cache_hit",
557
- level: "debug",
558
- message: `Cache hit - returning ${cursorState.results.length} cached rows`,
395
+ const newResults = executeSync({
396
+ lix: { sqlite },
397
+ query,
559
398
  });
399
+ cursorState.results = newResults || [];
560
400
  }
561
- }
562
401
 
563
- return capi.SQLITE_OK;
402
+ return capi.SQLITE_OK;
403
+ } finally {
404
+ // Always decrement recursion depth
405
+ // @ts-expect-error - using global for debugging
406
+ globalThis[recursionKey] = currentDepth - 1;
407
+ }
564
408
  },
565
409
 
566
410
  xNext: (pCursor: any) => {
@@ -583,9 +427,32 @@ export function applyStateDatabaseSchema(
583
427
  return capi.SQLITE_OK;
584
428
  }
585
429
 
430
+ // Handle primary key column (_pk)
431
+ if (iCol === 0) {
432
+ if (Array.isArray(row)) {
433
+ // For array results, _pk is at index 0
434
+ capi.sqlite3_result_js(pContext, row[0]);
435
+ } else if (row._pk) {
436
+ // If row already has _pk, use it
437
+ capi.sqlite3_result_js(pContext, row._pk);
438
+ } else {
439
+ // Generate primary key from row data
440
+ const tag = row.untracked ? "U" : "C";
441
+ const primaryKey = serializeStatePk(
442
+ tag,
443
+ row.file_id,
444
+ row.entity_id,
445
+ row.version_id
446
+ );
447
+ capi.sqlite3_result_js(pContext, primaryKey);
448
+ }
449
+ return capi.SQLITE_OK;
450
+ }
451
+
586
452
  // Handle array-style results from SQLite exec
587
453
  let value;
588
454
  if (Array.isArray(row)) {
455
+ // For array results, composite_key is at index 0, so we use iCol directly
589
456
  value = row[iCol];
590
457
  } else {
591
458
  const columnName = getColumnName(iCol);
@@ -601,10 +468,8 @@ export function applyStateDatabaseSchema(
601
468
  return capi.SQLITE_OK;
602
469
  }
603
470
 
604
- if (value === null || value === undefined) {
471
+ if (value === null) {
605
472
  capi.sqlite3_result_null(pContext);
606
- } else if (typeof value === "object") {
607
- capi.sqlite3_result_js(pContext, JSON.stringify(value));
608
473
  } else {
609
474
  capi.sqlite3_result_js(pContext, value);
610
475
  }
@@ -612,10 +477,10 @@ export function applyStateDatabaseSchema(
612
477
  return capi.SQLITE_OK;
613
478
  },
614
479
 
615
- xRowid: (pCursor: any, pRowid: any) => {
616
- const cursorState = cursorStates.get(pCursor);
617
- sqlite.sqlite3.vtab.xRowid(pRowid, cursorState.rowIndex);
618
- return capi.SQLITE_OK;
480
+ xRowid: () => {
481
+ // For WITHOUT ROWID tables, xRowid should not be called
482
+ // But if it is, we return an error
483
+ return capi.SQLITE_ERROR;
619
484
  },
620
485
 
621
486
  xUpdate: (_pVTab: number, nArg: number, ppArgv: any) => {
@@ -623,39 +488,42 @@ export function applyStateDatabaseSchema(
623
488
  // Extract arguments using the proper SQLite WASM API
624
489
  const args = sqlite.sqlite3.capi.sqlite3_values_to_js(nArg, ppArgv);
625
490
 
626
- // DELETE operation: nArg = 1, args[0] = old rowid
491
+ // DELETE operation: nArg = 1, args[0] = old primary key
627
492
  if (nArg === 1) {
628
- // For DELETE, we need the old row data to pass to handleStateMutation
629
- // We can't get this from the virtual table directly, so we'll need to
630
- // handle DELETE differently:
631
- // we query the row by rowid and pass it to handleStateMutation
493
+ const oldPk = args[0] as string;
494
+ if (!oldPk) {
495
+ throw new Error("Missing primary key for DELETE operation");
496
+ }
632
497
 
633
- handleStateDelete(sqlite, args[0]! as number, db);
498
+ // Use handleStateDelete for all cases - it handles both tracked and untracked
499
+ handleStateDelete(sqlite, oldPk, db);
634
500
 
635
501
  return capi.SQLITE_OK;
636
502
  }
637
503
 
638
- // INSERT operation: nArg = N+2, args[0] = NULL, args[1] = new rowid
639
- // UPDATE operation: nArg = N+2, args[0] = old rowid, args[1] = new rowid
640
- const isInsert = args[0] === null || args[0] === undefined;
641
- const isUpdate = args[0] !== null && args[0] !== undefined;
504
+ // INSERT operation: nArg = N+2, args[0] = NULL, args[1] = new primary key
505
+ // UPDATE operation: nArg = N+2, args[0] = old primary key, args[1] = new primary key
506
+ const isInsert = args[0] === null;
507
+ const isUpdate = args[0] !== null;
642
508
 
643
509
  if (!isInsert && !isUpdate) {
644
510
  throw new Error("Invalid xUpdate operation");
645
511
  }
646
512
 
647
513
  // Extract column values (args[2] through args[N+1])
648
- // Column order: entity_id, schema_key, file_id, version_id, plugin_key,
514
+ // Column order: _pk, entity_id, schema_key, file_id, version_id, plugin_key,
649
515
  // snapshot_content, schema_version, created_at, updated_at, inherited_from_version_id, change_id, untracked
650
- const entity_id = args[2];
651
- const schema_key = args[3];
652
- const file_id = args[4];
653
- const version_id = args[5];
654
- const plugin_key = args[6];
655
- const snapshot_content = args[7];
656
- const schema_version = args[8];
657
- // Skip created_at (args[9]), updated_at (args[10]), inherited_from_version_id (args[11]), change_id (args[12])
658
- const untracked = args[13] ?? false;
516
+ const entity_id = args[3];
517
+ const schema_key = args[4];
518
+ const file_id = args[5];
519
+ const version_id = args[6];
520
+ const plugin_key = args[7];
521
+ // this is an update where we have a snapshot_content
522
+ // the snapshot_content is a JSON string as returned by SQlite
523
+ const snapshot_content = args[8] as string;
524
+ const schema_version = args[9];
525
+ // Skip created_at (args[10]), updated_at (args[11]), inherited_from_version_id (args[12]), change_id (args[13])
526
+ const untracked = args[14] ?? false;
659
527
 
660
528
  // assert required fields
661
529
  if (!entity_id || !schema_key || !file_id || !plugin_key) {
@@ -666,122 +534,83 @@ export function applyStateDatabaseSchema(
666
534
  throw new Error("version_id is required for state mutation");
667
535
  }
668
536
 
669
- // Ensure snapshot_content is a string
670
- const snapshotStr =
671
- typeof snapshot_content === "string"
672
- ? snapshot_content
673
- : JSON.stringify(snapshot_content);
674
-
675
537
  // Call validation function (same logic as triggers)
676
- const storedSchemaResult = sqlite.exec({
677
- sql: "SELECT value FROM stored_schema WHERE key = ?",
678
- bind: [String(schema_key)],
679
- returnValue: "resultRows",
680
- });
681
-
682
- const storedSchema =
683
- storedSchemaResult && storedSchemaResult.length > 0
684
- ? storedSchemaResult[0]![0]
685
- : null;
538
+ const storedSchema = getStoredSchema(sqlite, db, schema_key);
686
539
 
687
540
  validateStateMutation({
688
541
  lix: { sqlite, db: db as any },
689
- schema: storedSchema ? JSON.parse(storedSchema as string) : null,
690
- snapshot_content: JSON.parse(snapshotStr),
542
+ schema: storedSchema ? JSON.parse(storedSchema) : null,
543
+ snapshot_content: JSON.parse(snapshot_content),
691
544
  operation: isInsert ? "insert" : "update",
692
545
  entity_id: String(entity_id),
693
546
  version_id: String(version_id),
694
547
  untracked: Boolean(untracked),
695
548
  });
696
549
 
697
- // Route based on untracked flag
698
- if (untracked) {
699
- // Handle untracked mutation - write directly to untracked table
700
- sqlite.exec({
701
- sql: `INSERT OR REPLACE INTO internal_state_all_untracked
702
- (entity_id, schema_key, file_id, version_id, plugin_key, snapshot_content, schema_version)
703
- VALUES (?, ?, ?, ?, ?, ?, ?)`,
704
- bind: [
705
- String(entity_id),
706
- String(schema_key),
707
- String(file_id),
708
- String(version_id),
709
- String(plugin_key),
710
- snapshotStr,
711
- String(schema_version),
712
- ],
713
- });
714
- } else {
715
- // Handle tracked mutation - normal change control
716
- // If there's existing untracked state, delete it first (tracked overrides untracked)
717
- sqlite.exec({
718
- sql: `DELETE FROM internal_state_all_untracked
719
- WHERE entity_id = ? AND schema_key = ? AND file_id = ? AND version_id = ?`,
720
- bind: [
721
- String(entity_id),
722
- String(schema_key),
723
- String(file_id),
724
- String(version_id),
725
- ],
726
- });
727
-
728
- // Call handleStateMutation (same logic as triggers)
729
- handleStateMutation(
730
- sqlite,
731
- db,
732
- String(entity_id),
733
- String(schema_key),
734
- String(file_id),
735
- String(plugin_key),
736
- snapshotStr,
737
- String(version_id),
738
- String(schema_version)
739
- );
740
- }
550
+ // Use insertTransactionState which handles both tracked and untracked entities
551
+ insertTransactionState({
552
+ lix: { sqlite, db },
553
+ data: {
554
+ entity_id: String(entity_id),
555
+ schema_key: String(schema_key),
556
+ file_id: String(file_id),
557
+ plugin_key: String(plugin_key),
558
+ snapshot_content,
559
+ schema_version: String(schema_version),
560
+ version_id: String(version_id),
561
+ untracked: Boolean(untracked),
562
+ },
563
+ });
741
564
 
742
- // TODO: This cache copying logic is a temporary workaround for shared change sets.
743
- // The proper solution requires improving cache miss logic to handle change set sharing
565
+ // TODO: This cache copying logic is a temporary workaround for shared commits.
566
+ // The proper solution requires improving cache miss logic to handle commit sharing
744
567
  // without duplicating entries. See: https://github.com/opral/lix-sdk/issues/309
745
568
  //
746
- // Handle cache copying for new versions that share change sets
569
+ // Handle cache copying for new versions that share commits
747
570
  if (isInsert && String(schema_key) === "lix_version") {
748
- const versionData = JSON.parse(snapshotStr);
571
+ const versionData = JSON.parse(snapshot_content);
749
572
  const newVersionId = versionData.id;
750
- const changeSetId = versionData.change_set_id;
573
+ const commitId = versionData.commit_id;
751
574
 
752
- if (newVersionId && changeSetId) {
753
- // Find other versions that already use this change set
754
- const existingVersionsWithSameChangeSet = sqlite.exec({
575
+ if (newVersionId && commitId) {
576
+ // Find other versions that point to the same commit
577
+ const existingVersionsWithSameCommit = sqlite.exec({
755
578
  sql: `
756
579
  SELECT json_extract(snapshot_content, '$.id') as version_id
757
580
  FROM internal_state_cache
758
581
  WHERE schema_key = 'lix_version'
759
- AND json_extract(snapshot_content, '$.change_set_id') = ?
582
+ AND json_extract(snapshot_content, '$.commit_id') = ?
760
583
  AND json_extract(snapshot_content, '$.id') != ?
761
584
  `,
762
- bind: [changeSetId, newVersionId],
585
+ bind: [commitId, newVersionId],
763
586
  returnValue: "resultRows",
764
587
  });
765
588
 
766
- // If there are existing versions with the same change set, copy their cache entries
589
+ // If there are existing versions with the same commit, copy their cache entries
767
590
  if (
768
- existingVersionsWithSameChangeSet &&
769
- existingVersionsWithSameChangeSet.length > 0
591
+ existingVersionsWithSameCommit &&
592
+ existingVersionsWithSameCommit.length > 0
770
593
  ) {
771
- const sourceVersionId =
772
- existingVersionsWithSameChangeSet[0]![0]; // Take first existing version
594
+ const sourceVersionId = existingVersionsWithSameCommit[0]![0]; // Take first existing version
773
595
 
774
596
  // Copy cache entries from source version to new version
597
+ // IMPORTANT: When copying cache entries, we need to mark them as inherited
598
+ // if they don't have an inherited_from_version_id already
775
599
  sqlite.exec({
776
600
  sql: `
777
601
  INSERT OR IGNORE INTO internal_state_cache
778
- (entity_id, schema_key, file_id, version_id, plugin_key, snapshot_content, schema_version, created_at, updated_at, inherited_from_version_id, inheritance_delete_marker, change_id)
602
+ (entity_id, schema_key, file_id, version_id, plugin_key, snapshot_content, schema_version, created_at, updated_at, inherited_from_version_id, inheritance_delete_marker, change_id, commit_id)
779
603
  SELECT
780
- entity_id, schema_key, file_id, ?, plugin_key, snapshot_content, schema_version, created_at, updated_at, inherited_from_version_id, inheritance_delete_marker, change_id
604
+ entity_id, schema_key, file_id, ?, plugin_key, snapshot_content, schema_version, created_at, updated_at,
605
+ CASE
606
+ WHEN inherited_from_version_id IS NULL THEN ?
607
+ ELSE inherited_from_version_id
608
+ END as inherited_from_version_id,
609
+ inheritance_delete_marker, change_id, commit_id
781
610
  FROM internal_state_cache
782
611
  WHERE version_id = ? AND schema_key != 'lix_version'
783
612
  `,
784
- bind: [newVersionId, sourceVersionId],
613
+ bind: [newVersionId, sourceVersionId, sourceVersionId],
785
614
  });
786
615
  }
787
616
  }
@@ -793,35 +622,15 @@ export function applyStateDatabaseSchema(
793
622
  error instanceof Error ? error.message : String(error);
794
623
 
795
624
  // Log error for debugging
796
- if (canLog()) {
797
- createLixOwnLogSync({
798
- lix: { sqlite, db: db as any },
799
- key: "lix_state_xupdate_error",
800
- level: "error",
801
- message: `xUpdate error: ${errorMessage}`,
802
- });
803
- }
625
+ insertVTableLog({
626
+ sqlite,
627
+ db: db as any,
628
+ key: "lix_state_xupdate_error",
629
+ level: "error",
630
+ message: `xUpdate error: ${errorMessage}`,
631
+ });
804
632
 
805
- throw error; //new Error("test");
806
-
807
- // const vtab = sqlite.sqlite3.vtab.xVtab.get(_pVTab);
808
-
809
- // // Set proper error message on the virtual table
810
- // if (vtab) {
811
- // // Free any existing error message first
812
- // if (vtab.zErrMsg) {
813
- // capi.sqlite3_free(vtab.zErrMsg);
814
- // }
815
- // // Allocate new error message using sqlite3_malloc
816
- // const errorBytes = new TextEncoder().encode(errorMessage + "\0");
817
- // const errorPtr = capi.sqlite3_malloc(errorBytes.length);
818
- // if (errorPtr) {
819
- // sqlite.sqlite3.wasm.heap8u().set(errorBytes, errorPtr);
820
- // vtab.zErrMsg = errorPtr;
821
- // }
822
- // }
823
-
824
- // return capi.SQLITE_ERROR;
633
+ throw error; // Re-throw to propagate error
825
634
  }
826
635
  },
827
636
  },
@@ -838,7 +647,19 @@ export function applyStateDatabaseSchema(
838
647
  // Create state view that filters to active version only
839
648
  sqlite.exec(`
840
649
  CREATE VIEW IF NOT EXISTS state AS
841
- SELECT *
650
+ SELECT
651
+ entity_id,
652
+ schema_key,
653
+ file_id,
654
+ plugin_key,
655
+ snapshot_content,
656
+ schema_version,
657
+ created_at,
658
+ updated_at,
659
+ inherited_from_version_id,
660
+ change_id,
661
+ untracked,
662
+ commit_id
842
663
  FROM state_all
843
664
  WHERE version_id IN (SELECT version_id FROM active_version);
844
665
 
@@ -847,11 +668,33 @@ export function applyStateDatabaseSchema(
847
668
  INSTEAD OF INSERT ON state
848
669
  BEGIN
849
670
  INSERT INTO state_all (
850
- entity_id, schema_key, file_id, version_id, plugin_key,
851
- snapshot_content, schema_version, created_at, updated_at, inherited_from_version_id, change_id, untracked
671
+ entity_id,
672
+ schema_key,
673
+ file_id,
674
+ version_id,
675
+ plugin_key,
676
+ snapshot_content,
677
+ schema_version,
678
+ created_at,
679
+ updated_at,
680
+ inherited_from_version_id,
681
+ change_id,
682
+ untracked,
683
+ commit_id
852
684
  ) VALUES (
853
- NEW.entity_id, NEW.schema_key, NEW.file_id, NEW.version_id, NEW.plugin_key,
854
- NEW.snapshot_content, NEW.schema_version, NEW.created_at, NEW.updated_at, NEW.inherited_from_version_id, NEW.change_id, NEW.untracked
685
+ NEW.entity_id,
686
+ NEW.schema_key,
687
+ NEW.file_id,
688
+ (SELECT version_id FROM active_version),
689
+ NEW.plugin_key,
690
+ NEW.snapshot_content,
691
+ NEW.schema_version,
692
+ NEW.created_at,
693
+ NEW.updated_at,
694
+ NEW.inherited_from_version_id,
695
+ NEW.change_id,
696
+ NEW.untracked,
697
+ NEW.commit_id
855
698
  );
856
699
  END;
857
700
 
@@ -863,7 +706,7 @@ export function applyStateDatabaseSchema(
863
706
  entity_id = NEW.entity_id,
864
707
  schema_key = NEW.schema_key,
865
708
  file_id = NEW.file_id,
866
- version_id = NEW.version_id,
709
+ version_id = (SELECT version_id FROM active_version),
867
710
  plugin_key = NEW.plugin_key,
868
711
  snapshot_content = NEW.snapshot_content,
869
712
  schema_version = NEW.schema_version,
@@ -871,147 +714,222 @@ export function applyStateDatabaseSchema(
871
714
  updated_at = NEW.updated_at,
872
715
  inherited_from_version_id = NEW.inherited_from_version_id,
873
716
  change_id = NEW.change_id,
874
- untracked = NEW.untracked
717
+ untracked = NEW.untracked,
718
+ commit_id = NEW.commit_id
875
719
  WHERE
876
720
  entity_id = OLD.entity_id
877
721
  AND schema_key = OLD.schema_key
878
722
  AND file_id = OLD.file_id
879
- AND version_id = OLD.version_id;
723
+ AND version_id = (SELECT version_id FROM active_version);
880
724
  END;
881
725
 
882
726
  CREATE TRIGGER IF NOT EXISTS state_delete
883
727
  INSTEAD OF DELETE ON state
884
728
  BEGIN
729
+ -- Delete from state_all (handles both tracked and untracked entities)
885
730
  DELETE FROM state_all
886
- WHERE entity_id = OLD.entity_id
731
+ WHERE
732
+ entity_id = OLD.entity_id
887
733
  AND schema_key = OLD.schema_key
888
734
  AND file_id = OLD.file_id
889
- AND version_id = OLD.version_id;
735
+ AND version_id = (SELECT version_id FROM active_version);
890
736
  END;
891
737
  `);
892
738
 
893
- // Create the cache table for performance optimization and the untracked state table
894
- const sql = `
895
- CREATE TABLE IF NOT EXISTS internal_state_cache (
896
- entity_id TEXT NOT NULL,
897
- schema_key TEXT NOT NULL,
898
- file_id TEXT NOT NULL,
899
- version_id TEXT NOT NULL,
900
- plugin_key TEXT NOT NULL,
901
- snapshot_content TEXT, -- Allow NULL for deletions
902
- schema_version TEXT NOT NULL,
903
- created_at TEXT NOT NULL,
904
- updated_at TEXT NOT NULL,
905
- inherited_from_version_id TEXT,
906
- inheritance_delete_marker INTEGER DEFAULT 0, -- Flag for copy-on-write deletion markers
907
- change_id TEXT, -- Allow NULL during migration and for deletion markers
908
- PRIMARY KEY (entity_id, schema_key, file_id, version_id)
909
- );
910
-
911
- -- Table for untracked state that bypasses change control
912
- CREATE TABLE IF NOT EXISTS internal_state_all_untracked (
913
- entity_id TEXT NOT NULL,
914
- schema_key TEXT NOT NULL,
915
- file_id TEXT NOT NULL,
916
- version_id TEXT NOT NULL,
917
- plugin_key TEXT NOT NULL,
918
- snapshot_content TEXT NOT NULL, -- JSON content
919
- schema_version TEXT NOT NULL,
920
- created_at TEXT DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')) NOT NULL CHECK (created_at LIKE '%Z'),
921
- updated_at TEXT DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')) NOT NULL CHECK (updated_at LIKE '%Z'),
922
- PRIMARY KEY (entity_id, schema_key, file_id, version_id)
923
- ) STRICT;
924
-
925
- -- Trigger to update updated_at on untracked state changes
926
- CREATE TRIGGER IF NOT EXISTS internal_state_all_untracked_update_timestamp
927
- AFTER UPDATE ON internal_state_all_untracked
928
- BEGIN
929
- UPDATE internal_state_all_untracked
930
- SET updated_at = strftime('%Y-%m-%dT%H:%M:%fZ', 'now')
931
- WHERE entity_id = NEW.entity_id
932
- AND schema_key = NEW.schema_key
933
- AND file_id = NEW.file_id
934
- AND version_id = NEW.version_id;
935
- END;
936
- `;
937
-
938
- return sqlite.exec(sql);
739
+ /**
740
+ * Insert a log entry directly using insertTransactionState to avoid recursion
741
+ * when logging from within the virtual table methods.
742
+ */
743
+ function insertVTableLog(args: {
744
+ sqlite: SqliteWasmDatabase;
745
+ db: Kysely<LixInternalDatabaseSchema>;
746
+ key: string;
747
+ message: string;
748
+ level: string;
749
+ }): void {
750
+ if (loggingIsInProgress) {
751
+ return;
752
+ }
753
+ // preventing recursivly logging that we inserted a log entry
754
+ // with this flag
755
+ loggingIsInProgress = true;
756
+ // Check log levels directly from internal state tables to avoid recursion
757
+ const logLevelsResult = executeSync({
758
+ lix: { sqlite: args.sqlite },
759
+ query: args.db
760
+ .selectFrom("internal_resolved_state_all")
761
+ .select(sql`json_extract(snapshot_content, '$.value')`.as("value"))
762
+ .where("schema_key", "=", "lix_key_value")
763
+ .where(
764
+ sql`json_extract(snapshot_content, '$.key')`,
765
+ "=",
766
+ "lix_log_levels"
767
+ )
768
+ .limit(1),
769
+ });
770
+
771
+ const logLevelsValue = logLevelsResult[0]?.value;
772
+
773
+ // Check if the level is allowed
774
+ if (!shouldLog(logLevelsValue as string[] | undefined, args.level)) {
775
+ return;
776
+ }
777
+
778
+ // Create log entry data
779
+ const lix = { sqlite: args.sqlite, db: args.db } as any;
780
+ const logData = {
781
+ id: uuidV7({ lix }),
782
+ key: args.key,
783
+ message: args.message,
784
+ level: args.level,
785
+ };
786
+
787
+ // Insert log using insertTransactionState
788
+ insertTransactionState({
789
+ lix,
790
+ data: {
791
+ entity_id: logData.id,
792
+ schema_key: LixLogSchema["x-lix-key"],
793
+ file_id: "lix",
794
+ plugin_key: "lix_own_entity",
795
+ snapshot_content: JSON.stringify(logData),
796
+ schema_version: LixLogSchema["x-lix-version"],
797
+ // Using global and untracked for vtable logs.
798
+ // if we need to track them, we can change this later
799
+ version_id: "global",
800
+ untracked: true,
801
+ },
802
+ });
803
+ loggingIsInProgress = false;
804
+ }
939
805
  }
940
806
 
941
807
  export function handleStateDelete(
942
808
  sqlite: SqliteWasmDatabase,
943
- rowId: number,
809
+ primaryKey: string,
944
810
  db: Kysely<LixInternalDatabaseSchema>
945
811
  ): void {
946
- const rowToDelete = sqlite.exec({
947
- sql: "SELECT * FROM state_all WHERE rowid = ?",
948
- bind: [rowId],
949
- returnValue: "resultRows",
950
- })[0]!;
951
-
952
- const entity_id = rowToDelete[0];
953
- const schema_key = rowToDelete[1];
954
- const file_id = rowToDelete[2];
955
- const version_id = rowToDelete[3];
956
- const plugin_key = rowToDelete[4];
957
- const snapshot_content = rowToDelete[5];
958
- const schema_version = rowToDelete[6];
959
- // Column indices: created_at[7], updated_at[8], inherited_from_version_id[9], change_id[10], untracked[11]
960
- const untracked = rowToDelete[11];
961
-
962
- // If entity is untracked, just delete it without creating changes
812
+ // Query the row to delete using the resolved state view with Kysely
813
+ const rowToDelete = executeSync({
814
+ lix: { sqlite },
815
+ query: db
816
+ .selectFrom("internal_resolved_state_all")
817
+ .select([
818
+ "entity_id",
819
+ "schema_key",
820
+ "file_id",
821
+ "version_id",
822
+ "plugin_key",
823
+ "snapshot_content",
824
+ "schema_version",
825
+ "untracked",
826
+ "inherited_from_version_id",
827
+ ])
828
+ .where("_pk", "=", primaryKey),
829
+ })[0];
830
+
831
+ if (!rowToDelete) {
832
+ throw new Error(`Row not found for primary key: ${primaryKey}`);
833
+ }
834
+
835
+ const entity_id = rowToDelete.entity_id;
836
+ const schema_key = rowToDelete.schema_key;
837
+ const file_id = rowToDelete.file_id;
838
+ const version_id = rowToDelete.version_id;
839
+ const plugin_key = rowToDelete.plugin_key;
840
+ const snapshot_content = rowToDelete.snapshot_content;
841
+ const schema_version = rowToDelete.schema_version;
842
+ const untracked = rowToDelete.untracked;
843
+
844
+ // If entity is untracked, handle differently based on whether it's inherited
963
845
  if (untracked) {
964
- // Delete from untracked table
965
- sqlite.exec({
966
- sql: `DELETE FROM internal_state_all_untracked
967
- WHERE entity_id = ? AND schema_key = ? AND file_id = ? AND version_id = ?`,
968
- bind: [
969
- String(entity_id),
970
- String(schema_key),
971
- String(file_id),
972
- String(version_id),
973
- ],
974
- });
846
+ // Parse the primary key to check if it's inherited untracked (UI tag)
847
+ const parsed = parseStatePk(primaryKey);
848
+
849
+ if (parsed.tag === "UI") {
850
+ // For inherited untracked, create a tombstone to block inheritance
851
+ insertTransactionState({
852
+ lix: { sqlite, db },
853
+ data: {
854
+ entity_id: String(entity_id),
855
+ schema_key: String(schema_key),
856
+ file_id: String(file_id),
857
+ plugin_key: String(plugin_key),
858
+ snapshot_content: null, // Deletion tombstone
859
+ schema_version: String(schema_version),
860
+ version_id: String(version_id),
861
+ untracked: true,
862
+ },
863
+ });
864
+ } else {
865
+ // For direct untracked (U tag), just delete from untracked table
866
+ executeSync({
867
+ lix: { sqlite },
868
+ query: db
869
+ .deleteFrom("internal_state_all_untracked")
870
+ .where("entity_id", "=", String(entity_id))
871
+ .where("schema_key", "=", String(schema_key))
872
+ .where("file_id", "=", String(file_id))
873
+ .where("version_id", "=", String(version_id)),
874
+ });
875
+ }
975
876
  return;
976
877
  }
977
878
 
978
- const storedSchemaResult = sqlite.exec({
979
- sql: "SELECT value FROM stored_schema WHERE key = ?",
980
- bind: [String(schema_key)],
981
- returnValue: "resultRows",
982
- });
983
-
984
- const storedSchema =
985
- storedSchemaResult && storedSchemaResult.length > 0
986
- ? storedSchemaResult[0]![0]
987
- : null;
879
+ const storedSchema = getStoredSchema(sqlite, db, schema_key);
988
880
 
989
881
  validateStateMutation({
990
882
  lix: { sqlite, db: db as any },
991
- schema: storedSchema ? JSON.parse(storedSchema as string) : null,
883
+ schema: storedSchema ? JSON.parse(storedSchema) : null,
992
884
  snapshot_content: JSON.parse(snapshot_content as string),
993
885
  operation: "delete",
994
886
  entity_id: String(entity_id),
995
887
  version_id: String(version_id),
996
888
  });
997
889
 
998
- handleStateMutation(
999
- sqlite,
1000
- db,
1001
- String(entity_id),
1002
- String(schema_key),
1003
- String(file_id),
1004
- String(plugin_key),
1005
- null, // No snapshot content for DELETE
1006
- String(version_id),
1007
- String(schema_version)
1008
- );
890
+ insertTransactionState({
891
+ lix: { sqlite, db },
892
+ data: {
893
+ entity_id: String(entity_id),
894
+ schema_key: String(schema_key),
895
+ file_id: String(file_id),
896
+ plugin_key: String(plugin_key),
897
+ snapshot_content: null, // No snapshot content for DELETE
898
+ schema_version: String(schema_version),
899
+ version_id: String(version_id),
900
+ untracked: false, // tracked entity
901
+ },
902
+ });
1009
903
  }
1010
904
 
1011
905
  // Helper functions for the virtual table
1012
906
 
907
+ function getStoredSchema(
908
+ sqlite: SqliteWasmDatabase,
909
+ db: Kysely<LixInternalDatabaseSchema>,
910
+ schemaKey: any
911
+ ): string | null {
912
+ // Query directly from internal_resolved_state_all to avoid vtable recursion
913
+ const result = executeSync({
914
+ lix: { sqlite },
915
+ query: db
916
+ .selectFrom("internal_resolved_state_all")
917
+ .select(sql`json_extract(snapshot_content, '$.value')`.as("value"))
918
+ .where("schema_key", "=", "lix_stored_schema")
919
+ .where(
920
+ sql`json_extract(snapshot_content, '$.key')`,
921
+ "=",
922
+ String(schemaKey)
923
+ )
924
+ .limit(1),
925
+ });
926
+
927
+ return result && result.length > 0 ? result[0]!.value : null;
928
+ }
929
+
1013
930
  function getColumnName(columnIndex: number): string {
1014
931
  const columns = [
932
+ "_pk",
1015
933
  "entity_id",
1016
934
  "schema_key",
1017
935
  "file_id",
@@ -1024,210 +942,11 @@ function getColumnName(columnIndex: number): string {
1024
942
  "inherited_from_version_id",
1025
943
  "change_id",
1026
944
  "untracked",
945
+ "commit_id",
1027
946
  ];
1028
947
  return columns[columnIndex] || "unknown";
1029
948
  }
1030
949
 
1031
- function selectStateViaCTE(
1032
- sqlite: SqliteWasmDatabase,
1033
- filters: Record<string, string>,
1034
- includeDeletions: boolean = false
1035
- ): any[] {
1036
- let sql = `
1037
- WITH
1038
- all_changes_with_snapshots AS (
1039
- -- Include committed changes
1040
- SELECT ic.id, ic.entity_id, ic.schema_key, ic.file_id, ic.plugin_key,
1041
- ic.schema_version,
1042
- CASE
1043
- WHEN ic.snapshot_id = 'no-content' THEN NULL
1044
- ELSE json(s.content)
1045
- END AS snapshot_content
1046
- FROM internal_change ic
1047
- LEFT JOIN internal_snapshot s ON ic.snapshot_id = s.id
1048
-
1049
- UNION ALL
1050
-
1051
- -- Include changes from current transaction
1052
- SELECT ict.id, ict.entity_id, ict.schema_key, ict.file_id, ict.plugin_key,
1053
- ict.schema_version, ict.snapshot_content
1054
- FROM internal_change_in_transaction ict
1055
-
1056
- UNION ALL
1057
-
1058
- -- Include untracked state (pseudo-changes with special change_id)
1059
- SELECT 'untracked-' || unt.entity_id || '-' || unt.schema_key AS id,
1060
- unt.entity_id, unt.schema_key, unt.file_id, unt.plugin_key,
1061
- unt.schema_version, json(unt.snapshot_content) AS snapshot_content
1062
- FROM internal_state_all_untracked unt
1063
- ),
1064
- root_cs_of_all_versions AS (
1065
- SELECT json_extract(v.snapshot_content, '$.change_set_id') AS version_change_set_id,
1066
- v.entity_id AS version_id
1067
- FROM all_changes_with_snapshots v
1068
- WHERE v.schema_key = 'lix_version'
1069
- ),
1070
- reachable_cs_from_roots(id, version_id) AS (
1071
- SELECT version_change_set_id, version_id FROM root_cs_of_all_versions
1072
- UNION
1073
- SELECT json_extract(e.snapshot_content, '$.parent_id'), r.version_id
1074
- FROM all_changes_with_snapshots e
1075
- JOIN reachable_cs_from_roots r ON json_extract(e.snapshot_content, '$.child_id') = r.id
1076
- WHERE e.schema_key = 'lix_change_set_edge'
1077
- ),
1078
- cse_in_reachable_cs AS (
1079
- SELECT json_extract(ias.snapshot_content, '$.entity_id') AS target_entity_id,
1080
- json_extract(ias.snapshot_content, '$.file_id') AS target_file_id,
1081
- json_extract(ias.snapshot_content, '$.schema_key') AS target_schema_key,
1082
- json_extract(ias.snapshot_content, '$.change_id') AS target_change_id,
1083
- json_extract(ias.snapshot_content, '$.change_set_id') AS cse_origin_change_set_id,
1084
- rcs.version_id
1085
- FROM all_changes_with_snapshots ias
1086
- JOIN reachable_cs_from_roots rcs ON json_extract(ias.snapshot_content, '$.change_set_id') = rcs.id
1087
- WHERE ias.schema_key = 'lix_change_set_element'
1088
- ),
1089
- leaf_target_snapshots AS (
1090
- SELECT target_change.entity_id, target_change.schema_key, target_change.file_id,
1091
- target_change.plugin_key, target_change.snapshot_content AS snapshot_content,
1092
- target_change.schema_version, r.version_id, target_change.id as change_id
1093
- FROM cse_in_reachable_cs r
1094
- INNER JOIN all_changes_with_snapshots target_change ON r.target_change_id = target_change.id
1095
- WHERE NOT EXISTS (
1096
- WITH RECURSIVE descendants_of_current_cs(id) AS (
1097
- SELECT r.cse_origin_change_set_id
1098
- UNION
1099
- SELECT json_extract(edge.snapshot_content, '$.child_id')
1100
- FROM all_changes_with_snapshots edge
1101
- JOIN descendants_of_current_cs d ON json_extract(edge.snapshot_content, '$.parent_id') = d.id
1102
- WHERE edge.schema_key = 'lix_change_set_edge'
1103
- AND json_extract(edge.snapshot_content, '$.child_id') IN (
1104
- SELECT id FROM reachable_cs_from_roots WHERE version_id = r.version_id
1105
- )
1106
- )
1107
- SELECT 1 FROM cse_in_reachable_cs newer_r
1108
- WHERE newer_r.target_entity_id = r.target_entity_id
1109
- AND newer_r.target_file_id = r.target_file_id
1110
- AND newer_r.target_schema_key = r.target_schema_key
1111
- AND newer_r.version_id = r.version_id
1112
- AND (newer_r.cse_origin_change_set_id != r.cse_origin_change_set_id OR newer_r.target_change_id != r.target_change_id)
1113
- AND newer_r.cse_origin_change_set_id IN descendants_of_current_cs
1114
- )
1115
- ),
1116
- -- Get version inheritance relationships
1117
- version_inheritance AS (
1118
- SELECT DISTINCT
1119
- v.entity_id AS version_id,
1120
- json_extract(v.snapshot_content, '$.inherits_from_version_id') AS parent_version_id
1121
- FROM all_changes_with_snapshots v
1122
- WHERE v.schema_key = 'lix_version'
1123
- ),
1124
- -- Combine direct entities with inherited entities
1125
- all_entities AS (
1126
- -- Direct entities from leaf_target_snapshots
1127
- SELECT
1128
- entity_id, schema_key, file_id, plugin_key, snapshot_content, schema_version,
1129
- version_id, version_id as visible_in_version, NULL as inherited_from_version_id, change_id
1130
- FROM leaf_target_snapshots
1131
-
1132
- UNION ALL
1133
-
1134
- -- Inherited entities from parent versions
1135
- SELECT
1136
- ls.entity_id, ls.schema_key, ls.file_id, ls.plugin_key, ls.snapshot_content, ls.schema_version,
1137
- vi.version_id, -- Use child version_id for testing
1138
- vi.version_id as visible_in_version, -- Make visible in child version
1139
- vi.parent_version_id as inherited_from_version_id, ls.change_id
1140
- FROM version_inheritance vi
1141
- JOIN leaf_target_snapshots ls ON ls.version_id = vi.parent_version_id
1142
- WHERE vi.parent_version_id IS NOT NULL
1143
- AND ls.snapshot_content IS NOT NULL -- Don't inherit deleted entities
1144
- -- Don't inherit if child already has this entity (including deletion markers)
1145
- -- Use a more comprehensive check that includes both leaf snapshots and direct inheritance blocking
1146
- AND NOT EXISTS (
1147
- -- Check if there's ANY change for this entity in the child version
1148
- -- This includes creation, update, AND deletion changes
1149
- SELECT 1 FROM leaf_target_snapshots child_ls
1150
- WHERE child_ls.version_id = vi.version_id
1151
- AND child_ls.entity_id = ls.entity_id
1152
- AND child_ls.schema_key = ls.schema_key
1153
- AND child_ls.file_id = ls.file_id
1154
- )
1155
- -- Additional safeguard: check that no change set element exists for this entity in child
1156
- AND NOT EXISTS (
1157
- SELECT 1 FROM cse_in_reachable_cs cse
1158
- JOIN all_changes_with_snapshots target_change ON cse.target_change_id = target_change.id
1159
- WHERE cse.version_id = vi.version_id
1160
- AND target_change.entity_id = ls.entity_id
1161
- AND target_change.schema_key = ls.schema_key
1162
- AND target_change.file_id = ls.file_id
1163
- )
1164
- ),
1165
- -- Prioritize direct entities over inherited ones, then deduplicate
1166
- prioritized_entities AS (
1167
- SELECT *,
1168
- -- Priority: direct entities (inherited_from_version_id IS NULL) over inherited
1169
- CASE WHEN inherited_from_version_id IS NULL THEN 1 ELSE 2 END as priority,
1170
- -- Row number for deduplication within same priority
1171
- ROW_NUMBER() OVER (
1172
- PARTITION BY entity_id, schema_key, file_id, visible_in_version
1173
- ORDER BY CASE WHEN inherited_from_version_id IS NULL THEN 1 ELSE 2 END,
1174
- -- Among inherited entities, prefer those with earlier timestamps
1175
- version_id
1176
- ) as rn
1177
- FROM all_entities ae
1178
- -- Don't filter out entities with null snapshot_content here
1179
- -- We need deletion markers to be included for proper inheritance blocking
1180
- )
1181
- SELECT DISTINCT
1182
- pe.entity_id,
1183
- pe.schema_key,
1184
- pe.file_id,
1185
- pe.plugin_key,
1186
- pe.snapshot_content,
1187
- pe.schema_version,
1188
- pe.version_id,
1189
- (SELECT MIN(ic.created_at) FROM internal_change ic
1190
- WHERE ic.entity_id = pe.entity_id AND ic.schema_key = pe.schema_key AND ic.file_id = pe.file_id) AS created_at,
1191
- COALESCE(
1192
- (SELECT MAX(ic.created_at) FROM internal_change ic
1193
- WHERE ic.entity_id = pe.entity_id AND ic.schema_key = pe.schema_key AND ic.file_id = pe.file_id
1194
- AND ic.id IN (SELECT cse.target_change_id FROM cse_in_reachable_cs cse WHERE cse.version_id = pe.version_id)),
1195
- (SELECT MIN(ic.created_at) FROM internal_change ic
1196
- WHERE ic.entity_id = pe.entity_id AND ic.schema_key = pe.schema_key AND ic.file_id = pe.file_id)
1197
- ) AS updated_at,
1198
- pe.inherited_from_version_id,
1199
- pe.change_id
1200
- FROM prioritized_entities pe
1201
- WHERE pe.rn = 1
1202
- ${includeDeletions ? "" : "-- Filter out deletion markers from final results\n AND pe.snapshot_content IS NOT NULL"}
1203
- `;
1204
-
1205
- const bindings: string[] = [];
1206
- const conditions: string[] = [];
1207
-
1208
- Object.entries(filters).forEach(([key, value]) => {
1209
- if (key === "version_id") {
1210
- // For version_id filter, use visible_in_version
1211
- conditions.push(`ae.visible_in_version = ?`);
1212
- } else {
1213
- conditions.push(`ae.${key} = ?`);
1214
- }
1215
- bindings.push(value);
1216
- });
1217
-
1218
- if (conditions.length > 0) {
1219
- sql += " AND " + conditions.join(" AND ");
1220
- }
1221
-
1222
- const result = sqlite.exec({
1223
- sql,
1224
- bind: bindings,
1225
- returnValue: "resultRows",
1226
- });
1227
-
1228
- return result || [];
1229
- }
1230
-
1231
950
  export type StateView = Omit<StateAllView, "version_id">;
1232
951
 
1233
952
  export type StateAllView = {
@@ -1243,22 +962,7 @@ export type StateAllView = {
1243
962
  inherited_from_version_id: string | null;
1244
963
  change_id: Generated<string>;
1245
964
  untracked: Generated<boolean>;
1246
- };
1247
-
1248
- // Cache table type (internal table for state materialization)
1249
- export type InternalStateCacheTable = {
1250
- entity_id: string;
1251
- schema_key: string;
1252
- file_id: string;
1253
- version_id: string;
1254
- plugin_key: string;
1255
- snapshot_content: string | null; // JSON string, NULL for deletions
1256
- schema_version: string;
1257
- created_at: string;
1258
- updated_at: string;
1259
- inherited_from_version_id: string | null;
1260
- inheritance_delete_marker: number; // 1 for copy-on-write deletion markers, 0 otherwise
1261
- change_id: string;
965
+ commit_id: Generated<string>;
1262
966
  };
1263
967
 
1264
968
  // Kysely operation types
@@ -1266,9 +970,9 @@ export type StateRow = Selectable<StateView>;
1266
970
  export type NewStateRow = Insertable<StateView>;
1267
971
  export type StateRowUpdate = Updateable<StateView>;
1268
972
 
1269
- export type StateCacheRow = Selectable<InternalStateCacheTable>;
1270
- export type NewStateCacheRow = Insertable<InternalStateCacheTable>;
1271
- export type StateCacheRowUpdate = Updateable<InternalStateCacheTable>;
973
+ export type StateAllRow = Selectable<StateAllView>;
974
+ export type NewStateAllRow = Insertable<StateAllView>;
975
+ export type StateAllRowUpdate = Updateable<StateAllView>;
1272
976
 
1273
977
  // Types for the internal_change TABLE
1274
978
  export type InternalChangeInTransaction =