@happyvertical/smrt-core 0.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (631) hide show
  1. package/AGENTS.md +124 -0
  2. package/CLAUDE.md +1 -0
  3. package/LICENSE +7 -0
  4. package/README.md +265 -0
  5. package/bin/smrt-prebuild.js +26 -0
  6. package/dist/__tests__/fixtures/advisor-test-classes.d.ts +28 -0
  7. package/dist/__tests__/fixtures/advisor-test-classes.d.ts.map +1 -0
  8. package/dist/__tests__/fixtures/collection-coverage-fixtures.d.ts +12 -0
  9. package/dist/__tests__/fixtures/collection-coverage-fixtures.d.ts.map +1 -0
  10. package/dist/__tests__/fixtures/inheritance-resolver-fixtures.d.ts +28 -0
  11. package/dist/__tests__/fixtures/inheritance-resolver-fixtures.d.ts.map +1 -0
  12. package/dist/__tests__/fixtures/inheritance-test-classes.d.ts +43 -0
  13. package/dist/__tests__/fixtures/inheritance-test-classes.d.ts.map +1 -0
  14. package/dist/__tests__/fixtures/mcp-integration-test-classes.d.ts +18 -0
  15. package/dist/__tests__/fixtures/mcp-integration-test-classes.d.ts.map +1 -0
  16. package/dist/__tests__/fixtures/object-ai-memory-fixtures.d.ts +15 -0
  17. package/dist/__tests__/fixtures/object-ai-memory-fixtures.d.ts.map +1 -0
  18. package/dist/__tests__/fixtures/object-spec-test-classes.d.ts +13 -0
  19. package/dist/__tests__/fixtures/object-spec-test-classes.d.ts.map +1 -0
  20. package/dist/__tests__/fixtures/registry-test-classes.d.ts +23 -0
  21. package/dist/__tests__/fixtures/registry-test-classes.d.ts.map +1 -0
  22. package/dist/adapters/ai-usage.d.ts +23 -0
  23. package/dist/adapters/ai-usage.d.ts.map +1 -0
  24. package/dist/adapters/ai-usage.js +105 -0
  25. package/dist/adapters/ai-usage.js.map +1 -0
  26. package/dist/adapters/cost-rates.d.ts +20 -0
  27. package/dist/adapters/cost-rates.d.ts.map +1 -0
  28. package/dist/adapters/cost-rates.js +40 -0
  29. package/dist/adapters/cost-rates.js.map +1 -0
  30. package/dist/adapters/index.d.ts +19 -0
  31. package/dist/adapters/index.d.ts.map +1 -0
  32. package/dist/adapters/metrics.d.ts +111 -0
  33. package/dist/adapters/metrics.d.ts.map +1 -0
  34. package/dist/adapters/metrics.js +169 -0
  35. package/dist/adapters/metrics.js.map +1 -0
  36. package/dist/adapters/pubsub.d.ts +124 -0
  37. package/dist/adapters/pubsub.d.ts.map +1 -0
  38. package/dist/adapters/pubsub.js +121 -0
  39. package/dist/adapters/pubsub.js.map +1 -0
  40. package/dist/browser.d.ts +32 -0
  41. package/dist/browser.d.ts.map +1 -0
  42. package/dist/browser.js +68 -0
  43. package/dist/browser.js.map +1 -0
  44. package/dist/child-accessors.d.ts +27 -0
  45. package/dist/child-accessors.d.ts.map +1 -0
  46. package/dist/child-accessors.js +35 -0
  47. package/dist/child-accessors.js.map +1 -0
  48. package/dist/class.d.ts +313 -0
  49. package/dist/class.d.ts.map +1 -0
  50. package/dist/class.js +896 -0
  51. package/dist/class.js.map +1 -0
  52. package/dist/collection-cache.d.ts +110 -0
  53. package/dist/collection-cache.d.ts.map +1 -0
  54. package/dist/collection-cache.js +187 -0
  55. package/dist/collection-cache.js.map +1 -0
  56. package/dist/collection.d.ts +894 -0
  57. package/dist/collection.d.ts.map +1 -0
  58. package/dist/collection.js +1987 -0
  59. package/dist/collection.js.map +1 -0
  60. package/dist/config/global-config.d.ts +3 -0
  61. package/dist/config/global-config.d.ts.map +1 -0
  62. package/dist/config/global-config.js +19 -0
  63. package/dist/config/global-config.js.map +1 -0
  64. package/dist/config.d.ts +145 -0
  65. package/dist/config.d.ts.map +1 -0
  66. package/dist/config.js +57 -0
  67. package/dist/config.js.map +1 -0
  68. package/dist/consumer-plugin/index.d.ts +22 -0
  69. package/dist/consumer-plugin/index.d.ts.map +1 -0
  70. package/dist/consumer-plugin/index.js +452 -0
  71. package/dist/consumer-plugin/index.js.map +1 -0
  72. package/dist/consumer-plugin.d.ts +8 -0
  73. package/dist/consumer-plugin.d.ts.map +1 -0
  74. package/dist/consumer-plugin.js +5 -0
  75. package/dist/consumer-plugin.js.map +1 -0
  76. package/dist/database.d.ts +95 -0
  77. package/dist/database.d.ts.map +1 -0
  78. package/dist/database.js +32 -0
  79. package/dist/database.js.map +1 -0
  80. package/dist/decorators/compatibility.d.ts +14 -0
  81. package/dist/decorators/compatibility.d.ts.map +1 -0
  82. package/dist/decorators/compatibility.js +111 -0
  83. package/dist/decorators/compatibility.js.map +1 -0
  84. package/dist/decorators/index.d.ts +381 -0
  85. package/dist/decorators/index.d.ts.map +1 -0
  86. package/dist/decorators/index.js +104 -0
  87. package/dist/decorators/index.js.map +1 -0
  88. package/dist/dispatch/bus.d.ts +306 -0
  89. package/dist/dispatch/bus.d.ts.map +1 -0
  90. package/dist/dispatch/bus.js +583 -0
  91. package/dist/dispatch/bus.js.map +1 -0
  92. package/dist/dispatch/collections/DispatchSubscriptions.d.ts +79 -0
  93. package/dist/dispatch/collections/DispatchSubscriptions.d.ts.map +1 -0
  94. package/dist/dispatch/collections/DispatchSubscriptions.js +243 -0
  95. package/dist/dispatch/collections/DispatchSubscriptions.js.map +1 -0
  96. package/dist/dispatch/collections/Dispatches.d.ts +98 -0
  97. package/dist/dispatch/collections/Dispatches.d.ts.map +1 -0
  98. package/dist/dispatch/collections/Dispatches.js +358 -0
  99. package/dist/dispatch/collections/Dispatches.js.map +1 -0
  100. package/dist/dispatch/index.d.ts +47 -0
  101. package/dist/dispatch/index.d.ts.map +1 -0
  102. package/dist/dispatch/models/Dispatch.d.ts +101 -0
  103. package/dist/dispatch/models/Dispatch.d.ts.map +1 -0
  104. package/dist/dispatch/models/Dispatch.js +162 -0
  105. package/dist/dispatch/models/Dispatch.js.map +1 -0
  106. package/dist/dispatch/models/DispatchSubscription.d.ts +83 -0
  107. package/dist/dispatch/models/DispatchSubscription.d.ts.map +1 -0
  108. package/dist/dispatch/models/DispatchSubscription.js +112 -0
  109. package/dist/dispatch/models/DispatchSubscription.js.map +1 -0
  110. package/dist/dispatch/tenant-resolver.d.ts +98 -0
  111. package/dist/dispatch/tenant-resolver.d.ts.map +1 -0
  112. package/dist/dispatch/tenant-resolver.js +32 -0
  113. package/dist/dispatch/tenant-resolver.js.map +1 -0
  114. package/dist/dispatch/types.d.ts +149 -0
  115. package/dist/dispatch/types.d.ts.map +1 -0
  116. package/dist/embeddings/hash.d.ts +33 -0
  117. package/dist/embeddings/hash.d.ts.map +1 -0
  118. package/dist/embeddings/hash.js +37 -0
  119. package/dist/embeddings/hash.js.map +1 -0
  120. package/dist/embeddings/index.d.ts +36 -0
  121. package/dist/embeddings/index.d.ts.map +1 -0
  122. package/dist/embeddings/provider.d.ts +75 -0
  123. package/dist/embeddings/provider.d.ts.map +1 -0
  124. package/dist/embeddings/provider.js +170 -0
  125. package/dist/embeddings/provider.js.map +1 -0
  126. package/dist/embeddings/similarity.d.ts +47 -0
  127. package/dist/embeddings/similarity.d.ts.map +1 -0
  128. package/dist/embeddings/similarity.js +64 -0
  129. package/dist/embeddings/similarity.js.map +1 -0
  130. package/dist/embeddings/storage.d.ts +125 -0
  131. package/dist/embeddings/storage.d.ts.map +1 -0
  132. package/dist/embeddings/storage.js +283 -0
  133. package/dist/embeddings/storage.js.map +1 -0
  134. package/dist/embeddings/types.d.ts +250 -0
  135. package/dist/embeddings/types.d.ts.map +1 -0
  136. package/dist/errors.d.ts +363 -0
  137. package/dist/errors.d.ts.map +1 -0
  138. package/dist/errors.js +669 -0
  139. package/dist/errors.js.map +1 -0
  140. package/dist/generators/cli.d.ts +162 -0
  141. package/dist/generators/cli.d.ts.map +1 -0
  142. package/dist/generators/cli.js +462 -0
  143. package/dist/generators/cli.js.map +1 -0
  144. package/dist/generators/index.d.ts +13 -0
  145. package/dist/generators/index.d.ts.map +1 -0
  146. package/dist/generators/mcp-runtime-template.d.ts +60 -0
  147. package/dist/generators/mcp-runtime-template.d.ts.map +1 -0
  148. package/dist/generators/mcp-runtime-template.js +509 -0
  149. package/dist/generators/mcp-runtime-template.js.map +1 -0
  150. package/dist/generators/mcp.d.ts +231 -0
  151. package/dist/generators/mcp.d.ts.map +1 -0
  152. package/dist/generators/mcp.js +1220 -0
  153. package/dist/generators/mcp.js.map +1 -0
  154. package/dist/generators/rest.d.ts +171 -0
  155. package/dist/generators/rest.d.ts.map +1 -0
  156. package/dist/generators/rest.js +591 -0
  157. package/dist/generators/rest.js.map +1 -0
  158. package/dist/generators/swagger.d.ts +21 -0
  159. package/dist/generators/swagger.d.ts.map +1 -0
  160. package/dist/generators/swagger.js +307 -0
  161. package/dist/generators/swagger.js.map +1 -0
  162. package/dist/generators/tenant-gate.d.ts +74 -0
  163. package/dist/generators/tenant-gate.d.ts.map +1 -0
  164. package/dist/generators/tenant-gate.js +15 -0
  165. package/dist/generators/tenant-gate.js.map +1 -0
  166. package/dist/generators.d.ts +8 -0
  167. package/dist/generators.d.ts.map +1 -0
  168. package/dist/generators.js +19 -0
  169. package/dist/generators.js.map +1 -0
  170. package/dist/hierarchical.d.ts +103 -0
  171. package/dist/hierarchical.d.ts.map +1 -0
  172. package/dist/hierarchical.js +184 -0
  173. package/dist/hierarchical.js.map +1 -0
  174. package/dist/index.d.ts +57 -0
  175. package/dist/index.d.ts.map +1 -0
  176. package/dist/index.js +202 -0
  177. package/dist/index.js.map +1 -0
  178. package/dist/interceptors.d.ts +251 -0
  179. package/dist/interceptors.d.ts.map +1 -0
  180. package/dist/interceptors.js +259 -0
  181. package/dist/interceptors.js.map +1 -0
  182. package/dist/junction.d.ts +99 -0
  183. package/dist/junction.d.ts.map +1 -0
  184. package/dist/junction.js +136 -0
  185. package/dist/junction.js.map +1 -0
  186. package/dist/knowledge.d.ts +11 -0
  187. package/dist/knowledge.d.ts.map +1 -0
  188. package/dist/knowledge.js +310 -0
  189. package/dist/knowledge.js.map +1 -0
  190. package/dist/lazy-config.d.ts +160 -0
  191. package/dist/lazy-config.d.ts.map +1 -0
  192. package/dist/lazy-config.js +146 -0
  193. package/dist/lazy-config.js.map +1 -0
  194. package/dist/manifest/discover-base-classes.d.ts +78 -0
  195. package/dist/manifest/discover-base-classes.d.ts.map +1 -0
  196. package/dist/manifest/discover-base-classes.js +85 -0
  197. package/dist/manifest/discover-base-classes.js.map +1 -0
  198. package/dist/manifest/discover-smrt-packages.d.ts +48 -0
  199. package/dist/manifest/discover-smrt-packages.d.ts.map +1 -0
  200. package/dist/manifest/discover-smrt-packages.js +361 -0
  201. package/dist/manifest/discover-smrt-packages.js.map +1 -0
  202. package/dist/manifest/generator.d.ts +93 -0
  203. package/dist/manifest/generator.d.ts.map +1 -0
  204. package/dist/manifest/generator.js +380 -0
  205. package/dist/manifest/generator.js.map +1 -0
  206. package/dist/manifest/index.d.ts +16 -0
  207. package/dist/manifest/index.d.ts.map +1 -0
  208. package/dist/manifest/index.js +51 -0
  209. package/dist/manifest/index.js.map +1 -0
  210. package/dist/manifest/manager.d.ts +51 -0
  211. package/dist/manifest/manager.d.ts.map +1 -0
  212. package/dist/manifest/manager.js +89 -0
  213. package/dist/manifest/manager.js.map +1 -0
  214. package/dist/manifest/manifest-loader.d.ts +187 -0
  215. package/dist/manifest/manifest-loader.d.ts.map +1 -0
  216. package/dist/manifest/manifest-loader.js +847 -0
  217. package/dist/manifest/manifest-loader.js.map +1 -0
  218. package/dist/manifest/sources/composite.d.ts +22 -0
  219. package/dist/manifest/sources/composite.d.ts.map +1 -0
  220. package/dist/manifest/sources/composite.js +60 -0
  221. package/dist/manifest/sources/composite.js.map +1 -0
  222. package/dist/manifest/sources/embedded.d.ts +7 -0
  223. package/dist/manifest/sources/embedded.d.ts.map +1 -0
  224. package/dist/manifest/sources/embedded.js +30 -0
  225. package/dist/manifest/sources/embedded.js.map +1 -0
  226. package/dist/manifest/sources/explicit-paths.d.ts +17 -0
  227. package/dist/manifest/sources/explicit-paths.d.ts.map +1 -0
  228. package/dist/manifest/sources/explicit-paths.js +35 -0
  229. package/dist/manifest/sources/explicit-paths.js.map +1 -0
  230. package/dist/manifest/sources/fallback.d.ts +25 -0
  231. package/dist/manifest/sources/fallback.d.ts.map +1 -0
  232. package/dist/manifest/sources/fallback.js +63 -0
  233. package/dist/manifest/sources/fallback.js.map +1 -0
  234. package/dist/manifest/sources/index.d.ts +17 -0
  235. package/dist/manifest/sources/index.d.ts.map +1 -0
  236. package/dist/manifest/sources/local-test.d.ts +7 -0
  237. package/dist/manifest/sources/local-test.d.ts.map +1 -0
  238. package/dist/manifest/sources/local-test.js +21 -0
  239. package/dist/manifest/sources/local-test.js.map +1 -0
  240. package/dist/manifest/sources/static.d.ts +7 -0
  241. package/dist/manifest/sources/static.d.ts.map +1 -0
  242. package/dist/manifest/sources/static.js +19 -0
  243. package/dist/manifest/sources/static.js.map +1 -0
  244. package/dist/manifest/sources/test.d.ts +7 -0
  245. package/dist/manifest/sources/test.d.ts.map +1 -0
  246. package/dist/manifest/sources/test.js +21 -0
  247. package/dist/manifest/sources/test.js.map +1 -0
  248. package/dist/manifest/sources/types.d.ts +79 -0
  249. package/dist/manifest/sources/types.d.ts.map +1 -0
  250. package/dist/manifest/sources/types.js +61 -0
  251. package/dist/manifest/sources/types.js.map +1 -0
  252. package/dist/manifest/static-manifest.d.ts +4 -0
  253. package/dist/manifest/static-manifest.d.ts.map +1 -0
  254. package/dist/manifest/static-manifest.js +1535 -0
  255. package/dist/manifest/static-manifest.js.map +1 -0
  256. package/dist/manifest/store.d.ts +111 -0
  257. package/dist/manifest/store.d.ts.map +1 -0
  258. package/dist/manifest/store.js +431 -0
  259. package/dist/manifest/store.js.map +1 -0
  260. package/dist/manifest/test-manifest-loader.d.ts +3 -0
  261. package/dist/manifest/test-manifest-loader.d.ts.map +1 -0
  262. package/dist/manifest/test-manifest-stub.d.ts +4 -0
  263. package/dist/manifest/test-manifest-stub.d.ts.map +1 -0
  264. package/dist/manifest/test-manifest-stub.js +80013 -0
  265. package/dist/manifest/test-manifest-stub.js.map +1 -0
  266. package/dist/manifest.d.ts +8 -0
  267. package/dist/manifest.d.ts.map +1 -0
  268. package/dist/manifest.js +20 -0
  269. package/dist/manifest.js.map +1 -0
  270. package/dist/manifest.json +1489 -0
  271. package/dist/mcp-advisor/index.d.ts +499 -0
  272. package/dist/mcp-advisor/index.d.ts.map +1 -0
  273. package/dist/mcp-advisor/tools/add-ai-methods.d.ts +6 -0
  274. package/dist/mcp-advisor/tools/add-ai-methods.d.ts.map +1 -0
  275. package/dist/mcp-advisor/tools/configure-decorators.d.ts +6 -0
  276. package/dist/mcp-advisor/tools/configure-decorators.d.ts.map +1 -0
  277. package/dist/mcp-advisor/tools/generate-collection.d.ts +6 -0
  278. package/dist/mcp-advisor/tools/generate-collection.d.ts.map +1 -0
  279. package/dist/mcp-advisor/tools/generate-field-definitions.d.ts +6 -0
  280. package/dist/mcp-advisor/tools/generate-field-definitions.d.ts.map +1 -0
  281. package/dist/mcp-advisor/tools/generate-smrt-class.d.ts +6 -0
  282. package/dist/mcp-advisor/tools/generate-smrt-class.d.ts.map +1 -0
  283. package/dist/mcp-advisor/tools/get-object-config.d.ts +6 -0
  284. package/dist/mcp-advisor/tools/get-object-config.d.ts.map +1 -0
  285. package/dist/mcp-advisor/tools/get-object-schema.d.ts +10 -0
  286. package/dist/mcp-advisor/tools/get-object-schema.d.ts.map +1 -0
  287. package/dist/mcp-advisor/tools/list-registered-objects.d.ts +9 -0
  288. package/dist/mcp-advisor/tools/list-registered-objects.d.ts.map +1 -0
  289. package/dist/mcp-advisor/tools/preview-api-endpoints.d.ts +9 -0
  290. package/dist/mcp-advisor/tools/preview-api-endpoints.d.ts.map +1 -0
  291. package/dist/mcp-advisor/tools/preview-mcp-tools.d.ts +9 -0
  292. package/dist/mcp-advisor/tools/preview-mcp-tools.d.ts.map +1 -0
  293. package/dist/mcp-advisor/tools/validate-smrt-object.d.ts +6 -0
  294. package/dist/mcp-advisor/tools/validate-smrt-object.d.ts.map +1 -0
  295. package/dist/mcp-advisor/types.d.ts +209 -0
  296. package/dist/mcp-advisor/types.d.ts.map +1 -0
  297. package/dist/migrations/backfill-tracker.d.ts +84 -0
  298. package/dist/migrations/backfill-tracker.d.ts.map +1 -0
  299. package/dist/migrations/backfill-tracker.js +118 -0
  300. package/dist/migrations/backfill-tracker.js.map +1 -0
  301. package/dist/migrations/checksum.d.ts +43 -0
  302. package/dist/migrations/checksum.d.ts.map +1 -0
  303. package/dist/migrations/checksum.js +32 -0
  304. package/dist/migrations/checksum.js.map +1 -0
  305. package/dist/migrations/differ.d.ts +186 -0
  306. package/dist/migrations/differ.d.ts.map +1 -0
  307. package/dist/migrations/differ.js +601 -0
  308. package/dist/migrations/differ.js.map +1 -0
  309. package/dist/migrations/generator.d.ts +133 -0
  310. package/dist/migrations/generator.d.ts.map +1 -0
  311. package/dist/migrations/generator.js +328 -0
  312. package/dist/migrations/generator.js.map +1 -0
  313. package/dist/migrations/index.d.ts +20 -0
  314. package/dist/migrations/index.d.ts.map +1 -0
  315. package/dist/migrations/orchestrate.d.ts +148 -0
  316. package/dist/migrations/orchestrate.d.ts.map +1 -0
  317. package/dist/migrations/orchestrate.js +118 -0
  318. package/dist/migrations/orchestrate.js.map +1 -0
  319. package/dist/migrations/tracker.d.ts +134 -0
  320. package/dist/migrations/tracker.d.ts.map +1 -0
  321. package/dist/migrations/tracker.js +624 -0
  322. package/dist/migrations/tracker.js.map +1 -0
  323. package/dist/migrations/types.d.ts +221 -0
  324. package/dist/migrations/types.d.ts.map +1 -0
  325. package/dist/migrations.d.ts +7 -0
  326. package/dist/migrations.d.ts.map +1 -0
  327. package/dist/migrations.js +26 -0
  328. package/dist/migrations.js.map +1 -0
  329. package/dist/node_modules/.pnpm/balanced-match@4.0.4/node_modules/balanced-match/dist/esm/index.js +56 -0
  330. package/dist/node_modules/.pnpm/balanced-match@4.0.4/node_modules/balanced-match/dist/esm/index.js.map +1 -0
  331. package/dist/node_modules/.pnpm/brace-expansion@5.0.5/node_modules/brace-expansion/dist/esm/index.js +163 -0
  332. package/dist/node_modules/.pnpm/brace-expansion@5.0.5/node_modules/brace-expansion/dist/esm/index.js.map +1 -0
  333. package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/assert-valid-pattern.js +13 -0
  334. package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/assert-valid-pattern.js.map +1 -0
  335. package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/ast.js +654 -0
  336. package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/ast.js.map +1 -0
  337. package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/brace-expressions.js +111 -0
  338. package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/brace-expressions.js.map +1 -0
  339. package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/escape.js +10 -0
  340. package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/escape.js.map +1 -0
  341. package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/index.js +824 -0
  342. package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/index.js.map +1 -0
  343. package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/unescape.js +10 -0
  344. package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/unescape.js.map +1 -0
  345. package/dist/object.d.ts +1202 -0
  346. package/dist/object.d.ts.map +1 -0
  347. package/dist/object.js +2731 -0
  348. package/dist/object.js.map +1 -0
  349. package/dist/polymorphic-association.d.ts +69 -0
  350. package/dist/polymorphic-association.d.ts.map +1 -0
  351. package/dist/polymorphic-association.js +96 -0
  352. package/dist/polymorphic-association.js.map +1 -0
  353. package/dist/prebuild/cli.d.ts +7 -0
  354. package/dist/prebuild/cli.d.ts.map +1 -0
  355. package/dist/prebuild/cli.js +29 -0
  356. package/dist/prebuild/cli.js.map +1 -0
  357. package/dist/prebuild/index.d.ts +22 -0
  358. package/dist/prebuild/index.d.ts.map +1 -0
  359. package/dist/prebuild/index.js +239 -0
  360. package/dist/prebuild/index.js.map +1 -0
  361. package/dist/prebuild.d.ts +8 -0
  362. package/dist/prebuild.d.ts.map +1 -0
  363. package/dist/prebuild.js +6 -0
  364. package/dist/prebuild.js.map +1 -0
  365. package/dist/registry/cache-config.d.ts +13 -0
  366. package/dist/registry/cache-config.d.ts.map +1 -0
  367. package/dist/registry/cache-config.js +17 -0
  368. package/dist/registry/cache-config.js.map +1 -0
  369. package/dist/registry/class-registration.d.ts +31 -0
  370. package/dist/registry/class-registration.d.ts.map +1 -0
  371. package/dist/registry/class-registration.js +1074 -0
  372. package/dist/registry/class-registration.js.map +1 -0
  373. package/dist/registry/collection-resolution.d.ts +45 -0
  374. package/dist/registry/collection-resolution.d.ts.map +1 -0
  375. package/dist/registry/collection-resolution.js +121 -0
  376. package/dist/registry/collection-resolution.js.map +1 -0
  377. package/dist/registry/collision-policy.d.ts +179 -0
  378. package/dist/registry/collision-policy.d.ts.map +1 -0
  379. package/dist/registry/collision-policy.js +153 -0
  380. package/dist/registry/collision-policy.js.map +1 -0
  381. package/dist/registry/diagnostics.d.ts +58 -0
  382. package/dist/registry/diagnostics.d.ts.map +1 -0
  383. package/dist/registry/diagnostics.js +54 -0
  384. package/dist/registry/diagnostics.js.map +1 -0
  385. package/dist/registry/embedding-manager.d.ts +23 -0
  386. package/dist/registry/embedding-manager.d.ts.map +1 -0
  387. package/dist/registry/embedding-manager.js +62 -0
  388. package/dist/registry/embedding-manager.js.map +1 -0
  389. package/dist/registry/index.d.ts +13 -0
  390. package/dist/registry/index.d.ts.map +1 -0
  391. package/dist/registry/inheritance-resolver.d.ts +13 -0
  392. package/dist/registry/inheritance-resolver.d.ts.map +1 -0
  393. package/dist/registry/inheritance-resolver.js +244 -0
  394. package/dist/registry/inheritance-resolver.js.map +1 -0
  395. package/dist/registry/manifest-field-merge.d.ts +4 -0
  396. package/dist/registry/manifest-field-merge.d.ts.map +1 -0
  397. package/dist/registry/manifest-field-merge.js +82 -0
  398. package/dist/registry/manifest-field-merge.js.map +1 -0
  399. package/dist/registry/name-resolver.d.ts +102 -0
  400. package/dist/registry/name-resolver.d.ts.map +1 -0
  401. package/dist/registry/name-resolver.js +241 -0
  402. package/dist/registry/name-resolver.js.map +1 -0
  403. package/dist/registry/relationship-graph.d.ts +16 -0
  404. package/dist/registry/relationship-graph.d.ts.map +1 -0
  405. package/dist/registry/relationship-graph.js +79 -0
  406. package/dist/registry/relationship-graph.js.map +1 -0
  407. package/dist/registry/schema-builder.d.ts +113 -0
  408. package/dist/registry/schema-builder.d.ts.map +1 -0
  409. package/dist/registry/schema-builder.js +474 -0
  410. package/dist/registry/schema-builder.js.map +1 -0
  411. package/dist/registry/shared-state.d.ts +62 -0
  412. package/dist/registry/shared-state.d.ts.map +1 -0
  413. package/dist/registry/shared-state.js +135 -0
  414. package/dist/registry/shared-state.js.map +1 -0
  415. package/dist/registry/types.d.ts +667 -0
  416. package/dist/registry/types.d.ts.map +1 -0
  417. package/dist/registry/validator.d.ts +13 -0
  418. package/dist/registry/validator.d.ts.map +1 -0
  419. package/dist/registry/validator.js +138 -0
  420. package/dist/registry/validator.js.map +1 -0
  421. package/dist/registry.d.ts +1358 -0
  422. package/dist/registry.d.ts.map +1 -0
  423. package/dist/registry.js +2301 -0
  424. package/dist/registry.js.map +1 -0
  425. package/dist/runtime/client.d.ts +34 -0
  426. package/dist/runtime/client.d.ts.map +1 -0
  427. package/dist/runtime/client.js +104 -0
  428. package/dist/runtime/client.js.map +1 -0
  429. package/dist/runtime/index.d.ts +10 -0
  430. package/dist/runtime/index.d.ts.map +1 -0
  431. package/dist/runtime/mcp.d.ts +47 -0
  432. package/dist/runtime/mcp.d.ts.map +1 -0
  433. package/dist/runtime/mcp.js +72 -0
  434. package/dist/runtime/mcp.js.map +1 -0
  435. package/dist/runtime/server.d.ts +92 -0
  436. package/dist/runtime/server.d.ts.map +1 -0
  437. package/dist/runtime/server.js +390 -0
  438. package/dist/runtime/server.js.map +1 -0
  439. package/dist/runtime/types.d.ts +58 -0
  440. package/dist/runtime/types.d.ts.map +1 -0
  441. package/dist/runtime.d.ts +8 -0
  442. package/dist/runtime.d.ts.map +1 -0
  443. package/dist/runtime.js +10 -0
  444. package/dist/runtime.js.map +1 -0
  445. package/dist/scanner/import-scanner.d.ts +7 -0
  446. package/dist/scanner/import-scanner.d.ts.map +1 -0
  447. package/dist/scanner/index.d.ts +12 -0
  448. package/dist/scanner/index.d.ts.map +1 -0
  449. package/dist/scanner/manifest-generator.d.ts +304 -0
  450. package/dist/scanner/manifest-generator.d.ts.map +1 -0
  451. package/dist/scanner/manifest-generator.js +1707 -0
  452. package/dist/scanner/manifest-generator.js.map +1 -0
  453. package/dist/scanner/test-file-patterns.d.ts +18 -0
  454. package/dist/scanner/test-file-patterns.d.ts.map +1 -0
  455. package/dist/scanner/test-file-patterns.js +16 -0
  456. package/dist/scanner/test-file-patterns.js.map +1 -0
  457. package/dist/scanner/types.d.ts +313 -0
  458. package/dist/scanner/types.d.ts.map +1 -0
  459. package/dist/scanner/types.js +2 -0
  460. package/dist/scanner/types.js.map +1 -0
  461. package/dist/scanner.d.ts +6 -0
  462. package/dist/scanner.d.ts.map +1 -0
  463. package/dist/scanner.js +6 -0
  464. package/dist/scanner.js.map +1 -0
  465. package/dist/schema/code-generator.d.ts +53 -0
  466. package/dist/schema/code-generator.d.ts.map +1 -0
  467. package/dist/schema/ddl/base-strategy.d.ts +80 -0
  468. package/dist/schema/ddl/base-strategy.d.ts.map +1 -0
  469. package/dist/schema/ddl/base-strategy.js +240 -0
  470. package/dist/schema/ddl/base-strategy.js.map +1 -0
  471. package/dist/schema/ddl/duckdb-strategy.d.ts +33 -0
  472. package/dist/schema/ddl/duckdb-strategy.d.ts.map +1 -0
  473. package/dist/schema/ddl/duckdb-strategy.js +74 -0
  474. package/dist/schema/ddl/duckdb-strategy.js.map +1 -0
  475. package/dist/schema/ddl/index.d.ts +53 -0
  476. package/dist/schema/ddl/index.d.ts.map +1 -0
  477. package/dist/schema/ddl/index.js +80 -0
  478. package/dist/schema/ddl/index.js.map +1 -0
  479. package/dist/schema/ddl/json-duckdb-strategy.d.ts +8 -0
  480. package/dist/schema/ddl/json-duckdb-strategy.d.ts.map +1 -0
  481. package/dist/schema/ddl/json-duckdb-strategy.js +14 -0
  482. package/dist/schema/ddl/json-duckdb-strategy.js.map +1 -0
  483. package/dist/schema/ddl/postgres-strategy.d.ts +29 -0
  484. package/dist/schema/ddl/postgres-strategy.d.ts.map +1 -0
  485. package/dist/schema/ddl/postgres-strategy.js +102 -0
  486. package/dist/schema/ddl/postgres-strategy.js.map +1 -0
  487. package/dist/schema/ddl/sqlite-strategy.d.ts +38 -0
  488. package/dist/schema/ddl/sqlite-strategy.d.ts.map +1 -0
  489. package/dist/schema/ddl/sqlite-strategy.js +74 -0
  490. package/dist/schema/ddl/sqlite-strategy.js.map +1 -0
  491. package/dist/schema/ddl/types.d.ts +114 -0
  492. package/dist/schema/ddl/types.d.ts.map +1 -0
  493. package/dist/schema/generator.d.ts +176 -0
  494. package/dist/schema/generator.d.ts.map +1 -0
  495. package/dist/schema/generator.js +1076 -0
  496. package/dist/schema/generator.js.map +1 -0
  497. package/dist/schema/index-utils.d.ts +19 -0
  498. package/dist/schema/index-utils.d.ts.map +1 -0
  499. package/dist/schema/index-utils.js +32 -0
  500. package/dist/schema/index-utils.js.map +1 -0
  501. package/dist/schema/index.d.ts +13 -0
  502. package/dist/schema/index.d.ts.map +1 -0
  503. package/dist/schema/override-system.d.ts +43 -0
  504. package/dist/schema/override-system.d.ts.map +1 -0
  505. package/dist/schema/schema-aggregator.d.ts +112 -0
  506. package/dist/schema/schema-aggregator.d.ts.map +1 -0
  507. package/dist/schema/schema-manager.d.ts +95 -0
  508. package/dist/schema/schema-manager.d.ts.map +1 -0
  509. package/dist/schema/schema-manager.js +283 -0
  510. package/dist/schema/schema-manager.js.map +1 -0
  511. package/dist/schema/sql-identifiers.d.ts +107 -0
  512. package/dist/schema/sql-identifiers.d.ts.map +1 -0
  513. package/dist/schema/sql-identifiers.js +190 -0
  514. package/dist/schema/sql-identifiers.js.map +1 -0
  515. package/dist/schema/table-verifier.d.ts +10 -0
  516. package/dist/schema/table-verifier.d.ts.map +1 -0
  517. package/dist/schema/table-verifier.js +37 -0
  518. package/dist/schema/table-verifier.js.map +1 -0
  519. package/dist/schema/types.d.ts +241 -0
  520. package/dist/schema/types.d.ts.map +1 -0
  521. package/dist/schema/utils.d.ts +32 -0
  522. package/dist/schema/utils.d.ts.map +1 -0
  523. package/dist/schema/utils.js +134 -0
  524. package/dist/schema/utils.js.map +1 -0
  525. package/dist/scripts/create-wrappers.js +89 -0
  526. package/dist/scripts/generate-manifest.js +155 -0
  527. package/dist/scripts/generate-test-manifest.js +77 -0
  528. package/dist/scripts/migrate-datetime-to-timestamp.ts +310 -0
  529. package/dist/scripts/prepack.js +49 -0
  530. package/dist/signals/bus.d.ts +64 -0
  531. package/dist/signals/bus.d.ts.map +1 -0
  532. package/dist/signals/bus.js +102 -0
  533. package/dist/signals/bus.js.map +1 -0
  534. package/dist/signals/index.d.ts +11 -0
  535. package/dist/signals/index.d.ts.map +1 -0
  536. package/dist/signals/sanitizer.d.ts +54 -0
  537. package/dist/signals/sanitizer.d.ts.map +1 -0
  538. package/dist/signals/sanitizer.js +111 -0
  539. package/dist/signals/sanitizer.js.map +1 -0
  540. package/dist/smrt-knowledge.json +335 -0
  541. package/dist/system/compatibility.d.ts +8 -0
  542. package/dist/system/compatibility.d.ts.map +1 -0
  543. package/dist/system/compatibility.js +409 -0
  544. package/dist/system/compatibility.js.map +1 -0
  545. package/dist/system/index.d.ts +9 -0
  546. package/dist/system/index.d.ts.map +1 -0
  547. package/dist/system/schema.d.ts +69 -0
  548. package/dist/system/schema.d.ts.map +1 -0
  549. package/dist/system/schema.js +271 -0
  550. package/dist/system/schema.js.map +1 -0
  551. package/dist/system/types.d.ts +135 -0
  552. package/dist/system/types.d.ts.map +1 -0
  553. package/dist/system-fields.d.ts +44 -0
  554. package/dist/system-fields.d.ts.map +1 -0
  555. package/dist/system-fields.js +55 -0
  556. package/dist/system-fields.js.map +1 -0
  557. package/dist/table-cache.d.ts +28 -0
  558. package/dist/table-cache.d.ts.map +1 -0
  559. package/dist/table-cache.js +21 -0
  560. package/dist/table-cache.js.map +1 -0
  561. package/dist/test-utils.d.ts +140 -0
  562. package/dist/test-utils.d.ts.map +1 -0
  563. package/dist/testing/database.d.ts +73 -0
  564. package/dist/testing/database.d.ts.map +1 -0
  565. package/dist/testing/database.js +204 -0
  566. package/dist/testing/database.js.map +1 -0
  567. package/dist/testing/index.d.ts +21 -0
  568. package/dist/testing/index.d.ts.map +1 -0
  569. package/dist/testing.d.ts +6 -0
  570. package/dist/testing.d.ts.map +1 -0
  571. package/dist/testing.js +5 -0
  572. package/dist/testing.js.map +1 -0
  573. package/dist/tools/index.d.ts +8 -0
  574. package/dist/tools/index.d.ts.map +1 -0
  575. package/dist/tools/tool-executor.d.ts +101 -0
  576. package/dist/tools/tool-executor.d.ts.map +1 -0
  577. package/dist/tools/tool-executor.js +142 -0
  578. package/dist/tools/tool-executor.js.map +1 -0
  579. package/dist/tools/tool-generator.d.ts +54 -0
  580. package/dist/tools/tool-generator.d.ts.map +1 -0
  581. package/dist/tools/tool-generator.js +121 -0
  582. package/dist/tools/tool-generator.js.map +1 -0
  583. package/dist/utils/chunk.d.ts +32 -0
  584. package/dist/utils/chunk.d.ts.map +1 -0
  585. package/dist/utils/chunk.js +14 -0
  586. package/dist/utils/chunk.js.map +1 -0
  587. package/dist/utils/import-workspace-module.d.ts +8 -0
  588. package/dist/utils/import-workspace-module.d.ts.map +1 -0
  589. package/dist/utils/import-workspace-module.js +81 -0
  590. package/dist/utils/import-workspace-module.js.map +1 -0
  591. package/dist/utils/json.d.ts +102 -0
  592. package/dist/utils/json.d.ts.map +1 -0
  593. package/dist/utils/json.js +43 -0
  594. package/dist/utils/json.js.map +1 -0
  595. package/dist/utils/lru-cache.d.ts +69 -0
  596. package/dist/utils/lru-cache.d.ts.map +1 -0
  597. package/dist/utils/lru-cache.js +100 -0
  598. package/dist/utils/lru-cache.js.map +1 -0
  599. package/dist/utils/naming.d.ts +16 -0
  600. package/dist/utils/naming.d.ts.map +1 -0
  601. package/dist/utils/naming.js +23 -0
  602. package/dist/utils/naming.js.map +1 -0
  603. package/dist/utils/qualified-names.d.ts +122 -0
  604. package/dist/utils/qualified-names.d.ts.map +1 -0
  605. package/dist/utils/qualified-names.js +82 -0
  606. package/dist/utils/qualified-names.js.map +1 -0
  607. package/dist/utils/scanner-module.d.ts +37 -0
  608. package/dist/utils/scanner-module.d.ts.map +1 -0
  609. package/dist/utils.d.ts +177 -0
  610. package/dist/utils.d.ts.map +1 -0
  611. package/dist/utils.js +185 -0
  612. package/dist/utils.js.map +1 -0
  613. package/dist/vite-plugin/import-build-aware.d.ts +68 -0
  614. package/dist/vite-plugin/import-build-aware.d.ts.map +1 -0
  615. package/dist/vite-plugin/import-build-aware.js +72 -0
  616. package/dist/vite-plugin/import-build-aware.js.map +1 -0
  617. package/dist/vite-plugin/index.d.ts +59 -0
  618. package/dist/vite-plugin/index.d.ts.map +1 -0
  619. package/dist/vite-plugin/index.js +1400 -0
  620. package/dist/vite-plugin/index.js.map +1 -0
  621. package/dist/vite-plugin/sveltekit-generator.d.ts +66 -0
  622. package/dist/vite-plugin/sveltekit-generator.d.ts.map +1 -0
  623. package/dist/vite-plugin/sveltekit-generator.js +1375 -0
  624. package/dist/vite-plugin/sveltekit-generator.js.map +1 -0
  625. package/dist/vite-plugin/templates/default-ui.ts +432 -0
  626. package/dist/vite-plugin/templates/default.html +206 -0
  627. package/dist/vite-plugin.d.ts +8 -0
  628. package/dist/vite-plugin.d.ts.map +1 -0
  629. package/dist/vite-plugin.js +11 -0
  630. package/dist/vite-plugin.js.map +1 -0
  631. package/package.json +208 -0
@@ -0,0 +1,624 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { hostname } from "node:os";
3
+ import { createLogger } from "@happyvertical/logger";
4
+ import { detectEngine } from "../schema/ddl/index.js";
5
+ import { CREATE_SMRT_SCHEMA_MIGRATIONS_TABLE } from "../system/schema.js";
6
+ import { computeChecksum, verifyChecksum } from "./checksum.js";
7
+ const logger = createLogger({ level: "info" });
8
+ const DEFAULT_OPTIONS = {
9
+ lockTimeout: 3e4,
10
+ statementTimeout: 6e4,
11
+ useConcurrentIndexes: true
12
+ };
13
+ class AtomicMigrationRollback extends Error {
14
+ constructor(results, failed) {
15
+ super(`Atomic migration batch failed at ${failed.name}`);
16
+ this.results = results;
17
+ this.failed = failed;
18
+ }
19
+ results;
20
+ failed;
21
+ }
22
+ const CONCURRENT_INDEX_STATEMENT_RE = /(?:(?:CREATE\s+(?:UNIQUE\s+)?INDEX|DROP\s+INDEX)\s+CONCURRENTLY|REINDEX(?:\s*\([^)]*\))?\s+(?:INDEX|TABLE|SCHEMA|DATABASE|SYSTEM)\s+CONCURRENTLY)/i;
23
+ function findConcurrentIndexStatement(definitions) {
24
+ for (const definition of definitions) {
25
+ const statement = definition.up.find(
26
+ (sql) => CONCURRENT_INDEX_STATEMENT_RE.test(sql)
27
+ );
28
+ if (statement) {
29
+ return {
30
+ migrationName: definition.id,
31
+ statement
32
+ };
33
+ }
34
+ }
35
+ return null;
36
+ }
37
+ class MigrationTracker {
38
+ db;
39
+ options;
40
+ engineHint;
41
+ dbEngine;
42
+ /**
43
+ * Memoized initialization promise. Storing the in-flight promise (rather
44
+ * than a `boolean` flag set after the DDL completes) makes `initialize()`
45
+ * safe under concurrency: multiple parallel callers all `await` the same
46
+ * promise instead of independently re-running the DDL. On error the slot
47
+ * is cleared so the next caller retries — a transient failure doesn't
48
+ * permanently poison the instance.
49
+ */
50
+ initializePromise = null;
51
+ currentBatch = null;
52
+ constructor(options) {
53
+ this.db = options.db;
54
+ this.options = {
55
+ lockTimeout: options.lockTimeout ?? DEFAULT_OPTIONS.lockTimeout,
56
+ statementTimeout: options.statementTimeout ?? DEFAULT_OPTIONS.statementTimeout,
57
+ useConcurrentIndexes: options.useConcurrentIndexes ?? DEFAULT_OPTIONS.useConcurrentIndexes
58
+ };
59
+ this.engineHint = options.engineHint;
60
+ this.dbEngine = this.detectDbEngine();
61
+ }
62
+ /**
63
+ * Detect the database engine. Honors an explicit `engineHint` (passed via
64
+ * `MigrationTrackerOptions`) before falling back to URL parsing — this is
65
+ * the same `detectEngine` contract used by `SchemaComparer` and the rest
66
+ * of the migration stack, so the tracker stays consistent with the DDL
67
+ * the orchestrator generated.
68
+ */
69
+ detectDbEngine() {
70
+ const dbWithConfig = this.db;
71
+ const url = this.db.url || dbWithConfig.config?.url || "";
72
+ return detectEngine(url, this.engineHint);
73
+ }
74
+ /**
75
+ * Get the current database engine
76
+ */
77
+ getEngine() {
78
+ return this.dbEngine;
79
+ }
80
+ /**
81
+ * Initialize the migrations tracking table
82
+ */
83
+ async initialize() {
84
+ if (!this.initializePromise) {
85
+ this.initializePromise = this.runInitializeDdl().catch((error) => {
86
+ this.initializePromise = null;
87
+ throw error;
88
+ });
89
+ }
90
+ return this.initializePromise;
91
+ }
92
+ async runInitializeDdl() {
93
+ const statements = CREATE_SMRT_SCHEMA_MIGRATIONS_TABLE.split(";").map((s) => s.trim()).filter((s) => s.length > 0);
94
+ for (const statement of statements) {
95
+ await this.db.query(statement);
96
+ }
97
+ }
98
+ /**
99
+ * Get all applied migrations ordered by applied_at
100
+ */
101
+ async getAppliedMigrations() {
102
+ await this.initialize();
103
+ const result = await this.db.query(
104
+ `SELECT * FROM _smrt_schema_migrations WHERE status = 'completed' ORDER BY applied_at ASC`
105
+ );
106
+ return result.rows.map((row) => ({
107
+ ...row,
108
+ applied_at: new Date(row.applied_at),
109
+ rolled_back_at: row.rolled_back_at ? new Date(row.rolled_back_at) : null,
110
+ is_reversible: Boolean(row.is_reversible)
111
+ }));
112
+ }
113
+ /**
114
+ * Get pending migrations (defined but not applied)
115
+ */
116
+ async getPendingMigrations(definitions) {
117
+ const applied = await this.getAppliedMigrations();
118
+ const appliedNames = new Set(applied.map((m) => m.name));
119
+ return definitions.filter((d) => !appliedNames.has(d.id));
120
+ }
121
+ /**
122
+ * Check if a migration has been applied
123
+ */
124
+ async isApplied(migrationId) {
125
+ await this.initialize();
126
+ const result = await this.db.query(
127
+ `SELECT 1 FROM _smrt_schema_migrations WHERE name = ? AND status = 'completed' LIMIT 1`,
128
+ migrationId
129
+ );
130
+ return result.rows.length > 0;
131
+ }
132
+ /**
133
+ * Get a single migration record by name
134
+ */
135
+ async getMigration(name) {
136
+ await this.initialize();
137
+ const result = await this.db.query(
138
+ `SELECT * FROM _smrt_schema_migrations WHERE name = ? LIMIT 1`,
139
+ name
140
+ );
141
+ if (result.rows.length === 0) return null;
142
+ const row = result.rows[0];
143
+ return {
144
+ ...row,
145
+ applied_at: new Date(row.applied_at),
146
+ rolled_back_at: row.rolled_back_at ? new Date(row.rolled_back_at) : null,
147
+ is_reversible: Boolean(row.is_reversible)
148
+ };
149
+ }
150
+ /**
151
+ * Get the next batch number
152
+ */
153
+ async getNextBatch() {
154
+ await this.initialize();
155
+ const result = await this.db.query(
156
+ `SELECT MAX(batch) as max_batch FROM _smrt_schema_migrations`
157
+ );
158
+ const row = result.rows[0];
159
+ return (row?.max_batch ?? 0) + 1;
160
+ }
161
+ /**
162
+ * Detect drift between migration definitions and applied migrations
163
+ */
164
+ async detectDrift(definitions) {
165
+ const applied = await this.getAppliedMigrations();
166
+ const reports = [];
167
+ new Map(applied.map((m) => [m.name, m]));
168
+ const definitionMap = new Map(definitions.map((d) => [d.id, d]));
169
+ for (const record of applied) {
170
+ const definition = definitionMap.get(record.name);
171
+ if (!definition) {
172
+ reports.push({
173
+ migration_name: record.name,
174
+ expected_checksum: "N/A",
175
+ actual_checksum: record.checksum,
176
+ drift_type: "unknown_in_db",
177
+ recommendation: "Migration exists in database but definition is missing. Manual cleanup may be required."
178
+ });
179
+ continue;
180
+ }
181
+ const currentChecksum = computeChecksum(definition.up);
182
+ const verification = verifyChecksum(
183
+ currentChecksum,
184
+ record.checksum,
185
+ record.applied_checksum
186
+ );
187
+ if (!verification.valid) {
188
+ const driftType = verification.drift ?? "db_modified";
189
+ reports.push({
190
+ migration_name: record.name,
191
+ expected_checksum: record.checksum,
192
+ actual_checksum: currentChecksum,
193
+ drift_type: driftType,
194
+ recommendation: driftType === "file_modified" ? "Migration file was modified after application. Create a new migration instead." : "Database schema was modified outside of migrations. Review and reconcile manually."
195
+ });
196
+ }
197
+ }
198
+ return reports;
199
+ }
200
+ /**
201
+ * Apply a single migration
202
+ */
203
+ async apply(definition, options = {}) {
204
+ await this.initialize();
205
+ const startTime = Date.now();
206
+ const checksum = computeChecksum(definition.up);
207
+ const existing = await this.getMigration(definition.id);
208
+ if (existing) {
209
+ switch (existing.status) {
210
+ case "completed":
211
+ if (!options.force && existing.checksum !== checksum) {
212
+ return {
213
+ success: false,
214
+ applied: false,
215
+ skipped: false,
216
+ name: definition.id,
217
+ checksum,
218
+ execution_time_ms: 0,
219
+ error: `Migration ${definition.id} checksum mismatch. Was already applied with different checksum. Use --force to override.`
220
+ };
221
+ }
222
+ if (!options.force && !options.reconcile) {
223
+ return {
224
+ success: true,
225
+ applied: false,
226
+ skipped: true,
227
+ name: definition.id,
228
+ checksum,
229
+ execution_time_ms: 0
230
+ };
231
+ }
232
+ break;
233
+ case "failed":
234
+ if (!options.force && !options.reconcile) {
235
+ return {
236
+ success: false,
237
+ applied: false,
238
+ skipped: false,
239
+ name: definition.id,
240
+ checksum,
241
+ execution_time_ms: 0,
242
+ error: `Migration ${definition.id} previously failed: ${existing.error_message || "Unknown error"}. Use --force to retry.`
243
+ };
244
+ }
245
+ break;
246
+ case "running":
247
+ if (!options.force) {
248
+ return {
249
+ success: false,
250
+ applied: false,
251
+ skipped: false,
252
+ name: definition.id,
253
+ checksum,
254
+ execution_time_ms: 0,
255
+ error: `Migration ${definition.id} is currently running or was interrupted. Use --force to retry if the previous run crashed.`
256
+ };
257
+ }
258
+ break;
259
+ }
260
+ }
261
+ if (options.dryRun) {
262
+ return {
263
+ success: true,
264
+ applied: false,
265
+ skipped: false,
266
+ name: definition.id,
267
+ checksum,
268
+ execution_time_ms: Date.now() - startTime
269
+ };
270
+ }
271
+ if (this.currentBatch === null) {
272
+ this.currentBatch = await this.getNextBatch();
273
+ }
274
+ const id = existing?.id || randomUUID();
275
+ const attempts = (existing?.attempts || 0) + 1;
276
+ if (existing) {
277
+ await this.db.query(
278
+ `UPDATE _smrt_schema_migrations
279
+ SET status = 'running', checksum = ?, attempts = ?, error_message = NULL, batch = ?, applied_by = ?, applied_at = CURRENT_TIMESTAMP
280
+ WHERE id = ?`,
281
+ checksum,
282
+ attempts,
283
+ this.currentBatch,
284
+ hostname(),
285
+ id
286
+ );
287
+ } else {
288
+ await this.db.query(
289
+ `INSERT INTO _smrt_schema_migrations
290
+ (id, name, version, checksum, status, attempts, is_reversible, package_name, source_file, applied_by, batch)
291
+ VALUES (?, ?, ?, ?, 'running', 1, ?, ?, ?, ?, ?)`,
292
+ id,
293
+ definition.id,
294
+ definition.version,
295
+ checksum,
296
+ definition.is_reversible ?? definition.down.length > 0 ? 1 : 0,
297
+ definition.package_name ?? null,
298
+ definition.source_file ?? null,
299
+ hostname(),
300
+ this.currentBatch
301
+ );
302
+ }
303
+ try {
304
+ await this.executeStatements(definition.up, options);
305
+ const executionTime = Date.now() - startTime;
306
+ await this.db.query(
307
+ `UPDATE _smrt_schema_migrations
308
+ SET status = 'completed', execution_time_ms = ?, applied_checksum = ?, applied_at = CURRENT_TIMESTAMP
309
+ WHERE id = ?`,
310
+ executionTime,
311
+ checksum,
312
+ id
313
+ );
314
+ return {
315
+ success: true,
316
+ applied: true,
317
+ skipped: false,
318
+ name: definition.id,
319
+ checksum,
320
+ execution_time_ms: executionTime
321
+ };
322
+ } catch (error) {
323
+ const migrationError = error instanceof Error ? error : new Error(String(error));
324
+ try {
325
+ await this.db.query(
326
+ `UPDATE _smrt_schema_migrations
327
+ SET status = 'failed', error_message = ?
328
+ WHERE id = ?`,
329
+ migrationError.message,
330
+ id
331
+ );
332
+ } catch (persistError) {
333
+ const persistMessage = persistError instanceof Error ? persistError.message : String(persistError);
334
+ logger.error(
335
+ `Failed to persist failed status for migration ${definition.id}: ${persistMessage}`
336
+ );
337
+ }
338
+ return {
339
+ success: false,
340
+ applied: false,
341
+ skipped: false,
342
+ name: definition.id,
343
+ checksum,
344
+ execution_time_ms: Date.now() - startTime,
345
+ error: migrationError
346
+ };
347
+ }
348
+ }
349
+ /**
350
+ * Apply multiple migrations in order
351
+ */
352
+ async applyAll(definitions, options = {}) {
353
+ if (options.atomic && !options.dryRun) {
354
+ if (!this.db.transaction) {
355
+ throw new Error(
356
+ "Atomic migration batches require a database adapter with transaction support."
357
+ );
358
+ }
359
+ if (this.dbEngine === "postgres") {
360
+ const concurrentStatement = findConcurrentIndexStatement(definitions);
361
+ if (concurrentStatement) {
362
+ throw new Error(
363
+ `Atomic migration batch cannot include CONCURRENTLY index DDL in ${concurrentStatement.migrationName}; PostgreSQL forbids CONCURRENTLY inside a transaction.`
364
+ );
365
+ }
366
+ }
367
+ try {
368
+ return await this.db.transaction(async (tx) => {
369
+ const txDb = {
370
+ ...tx,
371
+ transaction: async (callback) => callback(tx)
372
+ };
373
+ const txTracker = new MigrationTracker({
374
+ db: txDb,
375
+ lockTimeout: this.options.lockTimeout,
376
+ statementTimeout: this.options.statementTimeout,
377
+ useConcurrentIndexes: false
378
+ });
379
+ const results2 = await txTracker.applyAll(definitions, {
380
+ ...options,
381
+ atomic: false,
382
+ continueOnError: false,
383
+ postgresSafe: false
384
+ });
385
+ const failed = results2.find((result) => !result.success);
386
+ if (failed) {
387
+ throw new AtomicMigrationRollback(results2, failed);
388
+ }
389
+ return results2;
390
+ });
391
+ } catch (error) {
392
+ if (error instanceof AtomicMigrationRollback) {
393
+ return error.results.map((result) => {
394
+ if (!result.success || !result.applied) {
395
+ return result;
396
+ }
397
+ return {
398
+ ...result,
399
+ success: false,
400
+ applied: false,
401
+ skipped: false,
402
+ rolled_back: true,
403
+ error: new Error(
404
+ `Rolled back because migration ${error.failed.name} failed`
405
+ )
406
+ };
407
+ });
408
+ }
409
+ throw error;
410
+ }
411
+ }
412
+ const results = [];
413
+ this.currentBatch = await this.getNextBatch();
414
+ for (const definition of definitions) {
415
+ const result = await this.apply(definition, options);
416
+ results.push(result);
417
+ options.onProgress?.(result);
418
+ if (!result.success && !options.continueOnError) {
419
+ break;
420
+ }
421
+ }
422
+ this.currentBatch = null;
423
+ return results;
424
+ }
425
+ /**
426
+ * Rollback a migration
427
+ */
428
+ async rollback(name, definition, options = {}) {
429
+ await this.initialize();
430
+ const startTime = Date.now();
431
+ const checksum = computeChecksum(definition.down);
432
+ const record = await this.getMigration(name);
433
+ if (!record) {
434
+ return {
435
+ success: false,
436
+ name,
437
+ checksum,
438
+ execution_time_ms: 0,
439
+ error: new Error(`Migration ${name} not found in database`)
440
+ };
441
+ }
442
+ if (record.status !== "completed") {
443
+ return {
444
+ success: false,
445
+ name,
446
+ checksum,
447
+ execution_time_ms: 0,
448
+ error: new Error(
449
+ `Migration ${name} is not in completed state (current: ${record.status})`
450
+ )
451
+ };
452
+ }
453
+ if (!definition.down.length) {
454
+ return {
455
+ success: false,
456
+ name,
457
+ checksum,
458
+ execution_time_ms: 0,
459
+ error: new Error(
460
+ `Migration ${name} is not reversible (no down statements)`
461
+ )
462
+ };
463
+ }
464
+ if (options.dryRun) {
465
+ return {
466
+ success: true,
467
+ name,
468
+ checksum,
469
+ execution_time_ms: Date.now() - startTime,
470
+ rolled_back: true
471
+ };
472
+ }
473
+ try {
474
+ await this.executeStatements(definition.down, {});
475
+ await this.db.query(
476
+ `UPDATE _smrt_schema_migrations
477
+ SET status = 'rolled_back', rolled_back_at = CURRENT_TIMESTAMP
478
+ WHERE name = ?`,
479
+ name
480
+ );
481
+ return {
482
+ success: true,
483
+ name,
484
+ checksum,
485
+ execution_time_ms: Date.now() - startTime,
486
+ rolled_back: true
487
+ };
488
+ } catch (error) {
489
+ return {
490
+ success: false,
491
+ name,
492
+ checksum,
493
+ execution_time_ms: Date.now() - startTime,
494
+ error: error instanceof Error ? error : new Error(String(error)),
495
+ rolled_back: false
496
+ };
497
+ }
498
+ }
499
+ /**
500
+ * Get migration history with optional filtering
501
+ */
502
+ async getHistory(options = {}) {
503
+ await this.initialize();
504
+ let sql = `SELECT * FROM _smrt_schema_migrations WHERE 1=1`;
505
+ const params = [];
506
+ if (options.status) {
507
+ sql += ` AND status = ?`;
508
+ params.push(options.status);
509
+ }
510
+ if (options.since) {
511
+ sql += ` AND applied_at >= ?`;
512
+ params.push(options.since.toISOString());
513
+ }
514
+ sql += ` ORDER BY applied_at DESC`;
515
+ if (options.limit) {
516
+ sql += ` LIMIT ?`;
517
+ params.push(options.limit);
518
+ }
519
+ const result = await this.db.query(sql, ...params);
520
+ return result.rows.map((row) => ({
521
+ ...row,
522
+ applied_at: new Date(row.applied_at),
523
+ rolled_back_at: row.rolled_back_at ? new Date(row.rolled_back_at) : null,
524
+ is_reversible: Boolean(row.is_reversible)
525
+ }));
526
+ }
527
+ /**
528
+ * Execute SQL statements with appropriate transaction handling
529
+ */
530
+ async executeStatements(statements, options) {
531
+ if (this.dbEngine === "postgres" && options.postgresSafe) {
532
+ await this.executePostgresStatements(statements);
533
+ } else {
534
+ await this.executeWithTransaction(statements);
535
+ }
536
+ }
537
+ /**
538
+ * Execute statements within a transaction (SQLite/DuckDB)
539
+ */
540
+ async executeWithTransaction(statements) {
541
+ if (this.db.transaction) {
542
+ await this.db.transaction(async (tx) => {
543
+ for (const sql of statements) {
544
+ await tx.query(sql);
545
+ }
546
+ });
547
+ } else {
548
+ for (const sql of statements) {
549
+ await this.db.query(sql);
550
+ }
551
+ }
552
+ }
553
+ /**
554
+ * Execute statements with PostgreSQL-specific handling
555
+ *
556
+ * - CONCURRENTLY statements run outside transaction
557
+ * - Regular statements run in transaction with lock_timeout
558
+ *
559
+ * Both CREATE and DROP variants of CONCURRENTLY must be detected — Postgres
560
+ * forbids `DROP INDEX CONCURRENTLY` inside a transaction block, just like
561
+ * the create variant. Issue #1165: the migration generator emits
562
+ * `DROP INDEX CONCURRENTLY` for shape-drift recreates and orphan-index
563
+ * cleanups, so the regex needs to cover both keywords.
564
+ */
565
+ async executePostgresStatements(statements) {
566
+ const { concurrent: finalConcurrent, regular: finalRegular } = planPostgresStatements(statements, !!this.options.useConcurrentIndexes);
567
+ if (finalRegular.length > 0 && this.db.transaction) {
568
+ await this.db.transaction(async (tx) => {
569
+ await tx.query(
570
+ `SET LOCAL lock_timeout = '${this.options.lockTimeout}ms'`
571
+ );
572
+ await tx.query(
573
+ `SET LOCAL statement_timeout = '${this.options.statementTimeout}ms'`
574
+ );
575
+ for (const sql of finalRegular) {
576
+ await tx.query(sql);
577
+ }
578
+ });
579
+ } else if (finalRegular.length > 0) {
580
+ for (const sql of finalRegular) {
581
+ await this.db.query(sql);
582
+ }
583
+ }
584
+ for (const sql of finalConcurrent) {
585
+ await this.db.query(`SET lock_timeout = '${this.options.lockTimeout}ms'`);
586
+ await this.db.query(sql);
587
+ }
588
+ }
589
+ }
590
+ function planPostgresStatements(statements, useConcurrentIndexes) {
591
+ const concurrentRegex = CONCURRENT_INDEX_STATEMENT_RE;
592
+ const concurrent = [];
593
+ const regular = [];
594
+ for (const sql of statements) {
595
+ if (concurrentRegex.test(sql)) {
596
+ concurrent.push(sql);
597
+ continue;
598
+ }
599
+ if (useConcurrentIndexes) {
600
+ if (/CREATE\s+(UNIQUE\s+)?INDEX\s+(?!CONCURRENTLY)/i.test(sql)) {
601
+ concurrent.push(
602
+ sql.replace(
603
+ /CREATE\s+(UNIQUE\s+)?INDEX\s+/i,
604
+ "CREATE $1INDEX CONCURRENTLY "
605
+ )
606
+ );
607
+ continue;
608
+ }
609
+ if (/DROP\s+INDEX\s+(?!CONCURRENTLY)/i.test(sql)) {
610
+ concurrent.push(
611
+ sql.replace(/DROP\s+INDEX\s+/i, "DROP INDEX CONCURRENTLY ")
612
+ );
613
+ continue;
614
+ }
615
+ }
616
+ regular.push(sql);
617
+ }
618
+ return { concurrent, regular };
619
+ }
620
+ export {
621
+ MigrationTracker,
622
+ planPostgresStatements
623
+ };
624
+ //# sourceMappingURL=tracker.js.map