@seedprotocol/sdk 0.6.10 → 0.7.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 (399) hide show
  1. package/dist/{BasePathResolver-B6CKqoKw.js → BasePathResolver-DRT09oVv.js} +36 -2
  2. package/dist/BasePathResolver-DRT09oVv.js.map +1 -0
  3. package/dist/ClientManager-DngaZdw6.js +4763 -0
  4. package/dist/ClientManager-DngaZdw6.js.map +1 -0
  5. package/dist/{ClientManager-ChcmUL47.js → Item-ZUAmf943.js} +1175 -5903
  6. package/dist/Item-ZUAmf943.js.map +1 -0
  7. package/dist/{ModelProperty-D79uV42p.js → ModelProperty-6llK4MTH.js} +326 -109
  8. package/dist/ModelProperty-6llK4MTH.js.map +1 -0
  9. package/dist/{Schema-a8uO-hIZ.js → Schema-D-Ud-XYw.js} +164 -885
  10. package/dist/Schema-D-Ud-XYw.js.map +1 -0
  11. package/dist/{SchemaValidationService-Y49vqast.js → SchemaValidationService-IoS7JquP.js} +26 -18
  12. package/dist/SchemaValidationService-IoS7JquP.js.map +1 -0
  13. package/dist/{backfillMetadataPropertyIds-CBsf7LnU.js → backfillMetadataPropertyIds-BlVeE7w7.js} +11 -6
  14. package/dist/backfillMetadataPropertyIds-BlVeE7w7.js.map +1 -0
  15. package/dist/cjs/{ModelProperty-D9FGaGuE.js → ModelProperty-Dv7AQfmQ.js} +297 -89
  16. package/dist/cjs/ModelProperty-Dv7AQfmQ.js.map +1 -0
  17. package/dist/cjs/{Schema-BiJIPLEL.js → Schema-BHVp1g-M.js} +136 -868
  18. package/dist/cjs/Schema-BHVp1g-M.js.map +1 -0
  19. package/dist/cjs/{SchemaValidationService-DtYs_CNY.js → SchemaValidationService-BSU9knjf.js} +18 -11
  20. package/dist/cjs/SchemaValidationService-BSU9knjf.js.map +1 -0
  21. package/dist/cjs/{backfillMetadataPropertyIds-2XaN3b9S.js → backfillMetadataPropertyIds-WIovQ_d8.js} +8 -3
  22. package/dist/cjs/backfillMetadataPropertyIds-WIovQ_d8.js.map +1 -0
  23. package/dist/cjs/{eas-CMNppmGE.js → eas-CUYXdr2t.js} +4 -4
  24. package/dist/cjs/{eas-CMNppmGE.js.map → eas-CUYXdr2t.js.map} +1 -1
  25. package/dist/cjs/{getItem-B6jEINjW.js → getItem-z1tHu0hu.js} +2 -2
  26. package/dist/cjs/{getItem-B6jEINjW.js.map → getItem-z1tHu0hu.js.map} +1 -1
  27. package/dist/cjs/getLatestVersionRow-CcaabxIW.js +59 -0
  28. package/dist/cjs/getLatestVersionRow-CcaabxIW.js.map +1 -0
  29. package/dist/cjs/{getPublishPayload-D5DhLGvN.js → getPublishPayload-CEP_e-Kv.js} +283 -138
  30. package/dist/cjs/getPublishPayload-CEP_e-Kv.js.map +1 -0
  31. package/dist/cjs/{getPublishUploads-DMhCCKYF.js → getPublishUploads-Ctn5k1k6.js} +65 -19
  32. package/dist/cjs/getPublishUploads-Ctn5k1k6.js.map +1 -0
  33. package/dist/cjs/{index-CSNtEnbF.js → index-Cvvt0-5B.js} +2698 -1725
  34. package/dist/cjs/index-Cvvt0-5B.js.map +1 -0
  35. package/dist/cjs/{index-DPp9rdRL.js → index-DfGhF1dc.js} +3 -3
  36. package/dist/cjs/index-DfGhF1dc.js.map +1 -0
  37. package/dist/cjs/{property-DlKiAWt4.js → property-DbEPQ1m9.js} +40 -35
  38. package/dist/cjs/property-DbEPQ1m9.js.map +1 -0
  39. package/dist/cjs/publishDraftGraph-C38gf302.js +403 -0
  40. package/dist/cjs/publishDraftGraph-C38gf302.js.map +1 -0
  41. package/dist/cjs/resetAmbiguousLegacyItemData-CfMhRHwK.js +116 -0
  42. package/dist/cjs/resetAmbiguousLegacyItemData-CfMhRHwK.js.map +1 -0
  43. package/dist/cjs/resolveModelForSyncedSeed-CNYaLOir.js +49 -0
  44. package/dist/cjs/resolveModelForSyncedSeed-CNYaLOir.js.map +1 -0
  45. package/dist/cjs/syncDbWithEas-d1iOdTTI.js +886 -0
  46. package/dist/cjs/syncDbWithEas-d1iOdTTI.js.map +1 -0
  47. package/dist/{configurePlatform-CE0Vew17.js → configurePlatform-CZpjyuCo.js} +4 -4
  48. package/dist/{configurePlatform-CE0Vew17.js.map → configurePlatform-CZpjyuCo.js.map} +1 -1
  49. package/dist/db/drizzle/0015_add_model_file_id_to_seeds.sql +11 -0
  50. package/dist/db/drizzle/0016_add_revoked_at_to_metadata.sql +1 -0
  51. package/dist/db/drizzle/0017_add_revoked_at_to_versions.sql +1 -0
  52. package/dist/db/drizzle/0018_add_storage_settings_to_properties.sql +53 -0
  53. package/dist/db/drizzle/0019_add_derived_from_uid_to_metadata.sql +35 -0
  54. package/dist/db/drizzle/meta/0011_snapshot.json +1182 -0
  55. package/dist/db/drizzle/meta/0012_snapshot.json +1244 -0
  56. package/dist/db/drizzle/meta/0013_snapshot.json +63 -1
  57. package/dist/db/drizzle/meta/0014_snapshot.json +62 -0
  58. package/dist/db/drizzle/meta/0015_snapshot.json +1338 -0
  59. package/dist/db/drizzle/meta/0016_snapshot.json +1345 -0
  60. package/dist/db/drizzle/meta/0017_snapshot.json +1352 -0
  61. package/dist/db/drizzle/meta/0018_snapshot.json +1373 -0
  62. package/dist/db/drizzle/meta/0019_snapshot.json +1380 -0
  63. package/dist/db/drizzle/meta/_journal.json +35 -0
  64. package/dist/{db-WbrzEf7c.js → db-Lw0KVZmc.js} +546 -106
  65. package/dist/db-Lw0KVZmc.js.map +1 -0
  66. package/dist/{eas-CfYCu4IX.js → eas-CQ-Smzk2.js} +7 -7
  67. package/dist/eas-CQ-Smzk2.js.map +1 -0
  68. package/dist/errors-CrBxGWah.js +17 -0
  69. package/dist/errors-CrBxGWah.js.map +1 -0
  70. package/dist/{getItem-Br-bGNFO.js → getItem-CSfSok9f.js} +8 -10
  71. package/dist/{getItem-Br-bGNFO.js.map → getItem-CSfSok9f.js.map} +1 -1
  72. package/dist/getLatestVersionRow-72Atl9vB.js +46 -0
  73. package/dist/getLatestVersionRow-72Atl9vB.js.map +1 -0
  74. package/dist/{getPublishPayload-BIrTVUxb.js → getPublishPayload-76_KfB5Y.js} +297 -154
  75. package/dist/getPublishPayload-76_KfB5Y.js.map +1 -0
  76. package/dist/{getPublishUploads-C6cDeZdz.js → getPublishUploads-CqgMBD8f.js} +68 -21
  77. package/dist/getPublishUploads-CqgMBD8f.js.map +1 -0
  78. package/dist/{index-Djd3667v.js → index-5b3JsS55.js} +2 -2
  79. package/dist/index-5b3JsS55.js.map +1 -0
  80. package/dist/{index-ClSv5pTA.js → index-BpgD305l.js} +12 -11
  81. package/dist/index-BpgD305l.js.map +1 -0
  82. package/dist/{index-HRHkbVQd.js → index-Y-yYyRBf.js} +530 -196
  83. package/dist/index-Y-yYyRBf.js.map +1 -0
  84. package/dist/index.browser-DaTzn79x.js +4139 -0
  85. package/dist/index.browser-DaTzn79x.js.map +1 -0
  86. package/dist/{index.node-DBtQkEfz.js → index.node-NYKqFOoe.js} +9 -4
  87. package/dist/index.node-NYKqFOoe.js.map +1 -0
  88. package/dist/main.cjs +1 -1
  89. package/dist/main.js +886 -560
  90. package/dist/main.js.map +1 -1
  91. package/dist/node.js +19 -15
  92. package/dist/node.js.map +1 -1
  93. package/dist/platform.browser.js +18 -3719
  94. package/dist/platform.browser.js.map +1 -1
  95. package/dist/platform.node.js +3 -3
  96. package/dist/{property-CQjuZ4JW.js → property-ByaiSyUK.js} +53 -48
  97. package/dist/property-ByaiSyUK.js.map +1 -0
  98. package/dist/publishDraftGraph-BRm6Pq3Q.js +405 -0
  99. package/dist/publishDraftGraph-BRm6Pq3Q.js.map +1 -0
  100. package/dist/resetAmbiguousLegacyItemData-B4dX6ZA1.js +88 -0
  101. package/dist/resetAmbiguousLegacyItemData-B4dX6ZA1.js.map +1 -0
  102. package/dist/resolveModelForSyncedSeed-B0tco3zG.js +46 -0
  103. package/dist/resolveModelForSyncedSeed-B0tco3zG.js.map +1 -0
  104. package/dist/seedSchema/MetadataSchema.ts +9 -0
  105. package/dist/seedSchema/ModelSchema.ts +5 -0
  106. package/dist/seedSchema/SeedSchema.ts +3 -0
  107. package/dist/seedSchema/VersionSchema.ts +5 -0
  108. package/dist/src/Item/Item.d.ts +21 -0
  109. package/dist/src/Item/Item.d.ts.map +1 -1
  110. package/dist/src/Item/service/actors/loadOrCreateItem.d.ts.map +1 -1
  111. package/dist/src/Item/service/actors/waitForDb.d.ts.map +1 -1
  112. package/dist/src/Item/service/itemMachineSingle.d.ts +3 -29
  113. package/dist/src/Item/service/itemMachineSingle.d.ts.map +1 -1
  114. package/dist/src/ItemProperty/ItemProperty.d.ts +13 -4
  115. package/dist/src/ItemProperty/ItemProperty.d.ts.map +1 -1
  116. package/dist/src/ItemProperty/service/actors/hydrateFromDb.d.ts.map +1 -1
  117. package/dist/src/ItemProperty/service/actors/loadOrCreateProperty.d.ts.map +1 -1
  118. package/dist/src/ItemProperty/service/actors/saveValueToDb/saveFile.d.ts.map +1 -1
  119. package/dist/src/ItemProperty/service/actors/saveValueToDb/saveHtml.d.ts.map +1 -1
  120. package/dist/src/ItemProperty/service/actors/saveValueToDb/saveImage.d.ts.map +1 -1
  121. package/dist/src/ItemProperty/service/actors/saveValueToDb/saveItemStorage.d.ts.map +1 -1
  122. package/dist/src/ItemProperty/service/propertyMachine.d.ts +4 -9
  123. package/dist/src/ItemProperty/service/propertyMachine.d.ts.map +1 -1
  124. package/dist/src/Model/Model.d.ts +52 -2
  125. package/dist/src/Model/Model.d.ts.map +1 -1
  126. package/dist/src/Model/errors.d.ts +10 -0
  127. package/dist/src/Model/errors.d.ts.map +1 -0
  128. package/dist/src/Model/service/actors/createModelProperties.d.ts.map +1 -1
  129. package/dist/src/Model/service/actors/loadOrCreateModel.d.ts.map +1 -1
  130. package/dist/src/Model/service/actors/validateModel.d.ts.map +1 -1
  131. package/dist/src/Model/service/modelMachine.d.ts +0 -8
  132. package/dist/src/Model/service/modelMachine.d.ts.map +1 -1
  133. package/dist/src/ModelProperty/ModelProperty.d.ts +42 -2
  134. package/dist/src/ModelProperty/ModelProperty.d.ts.map +1 -1
  135. package/dist/src/ModelProperty/service/actors/compareAndMarkDraft.d.ts.map +1 -1
  136. package/dist/src/ModelProperty/service/actors/saveToSchema.d.ts.map +1 -1
  137. package/dist/src/ModelProperty/service/actors/validateProperty.d.ts.map +1 -1
  138. package/dist/src/ModelProperty/service/modelPropertyMachine.d.ts +2 -9
  139. package/dist/src/ModelProperty/service/modelPropertyMachine.d.ts.map +1 -1
  140. package/dist/src/Schema/Schema.d.ts +8 -2
  141. package/dist/src/Schema/Schema.d.ts.map +1 -1
  142. package/dist/src/Schema/service/actors/checkExistingSchema.d.ts.map +1 -1
  143. package/dist/src/Schema/service/actors/createModelInstances.d.ts.map +1 -1
  144. package/dist/src/Schema/service/actors/loadOrCreateSchema.d.ts.map +1 -1
  145. package/dist/src/Schema/service/schemaMachine.d.ts +1 -217
  146. package/dist/src/Schema/service/schemaMachine.d.ts.map +1 -1
  147. package/dist/src/Schema/service/validation/SchemaValidationService.d.ts.map +1 -1
  148. package/dist/src/browser/db/Db.d.ts +3 -0
  149. package/dist/src/browser/db/Db.d.ts.map +1 -1
  150. package/dist/src/browser/db/drizzleFiles.d.ts +7 -2
  151. package/dist/src/browser/db/drizzleFiles.d.ts.map +1 -1
  152. package/dist/src/browser/db/embeddedMigrations.d.ts +11 -2
  153. package/dist/src/browser/db/embeddedMigrations.d.ts.map +1 -1
  154. package/dist/src/browser/db/sqliteBusyRetry.d.ts +14 -0
  155. package/dist/src/browser/db/sqliteBusyRetry.d.ts.map +1 -0
  156. package/dist/src/browser/helpers/FileManager.d.ts +1 -0
  157. package/dist/src/browser/helpers/FileManager.d.ts.map +1 -1
  158. package/dist/src/browser/helpers/QueryClient.d.ts +1 -0
  159. package/dist/src/browser/helpers/QueryClient.d.ts.map +1 -1
  160. package/dist/src/browser/helpers/opfsErrors.d.ts +2 -0
  161. package/dist/src/browser/helpers/opfsErrors.d.ts.map +1 -0
  162. package/dist/src/browser/helpers/tolerantWebAccess.d.ts +47 -0
  163. package/dist/src/browser/helpers/tolerantWebAccess.d.ts.map +1 -0
  164. package/dist/src/browser/workers/FileDownloader.d.ts.map +1 -1
  165. package/dist/src/browser/workers/ImageResizer.d.ts.map +1 -1
  166. package/dist/src/browser/workers/filesDownload.d.ts.map +1 -1
  167. package/dist/src/browser/workers/imageResize.d.ts.map +1 -1
  168. package/dist/src/client/ClientManager.d.ts.map +1 -1
  169. package/dist/src/client/actors/addModelsToDb.d.ts +14 -0
  170. package/dist/src/client/actors/addModelsToDb.d.ts.map +1 -1
  171. package/dist/src/client/actors/platformClassesInit.d.ts.map +1 -1
  172. package/dist/src/client/actors/processSchemaFiles.d.ts.map +1 -1
  173. package/dist/src/client/actors/saveConfig.d.ts +11 -0
  174. package/dist/src/client/actors/saveConfig.d.ts.map +1 -1
  175. package/dist/src/client/constants.d.ts +0 -8
  176. package/dist/src/client/constants.d.ts.map +1 -1
  177. package/dist/src/db/backfillMetadataPropertyIds.d.ts.map +1 -1
  178. package/dist/src/db/configs/{dev.schema.config.d.ts → migrations.config.d.ts} +1 -1
  179. package/dist/src/db/configs/migrations.config.d.ts.map +1 -0
  180. package/dist/src/db/read/batchLatestPublishedVersionBySeedLocalIds.d.ts +1 -1
  181. package/dist/src/db/read/batchLatestPublishedVersionBySeedLocalIds.d.ts.map +1 -1
  182. package/dist/src/db/read/getItemData.d.ts.map +1 -1
  183. package/dist/src/db/read/getItemProperties.d.ts.map +1 -1
  184. package/dist/src/db/read/getItems.d.ts +7 -2
  185. package/dist/src/db/read/getItems.d.ts.map +1 -1
  186. package/dist/src/db/read/getLatestPublishedVersionRow.d.ts +2 -1
  187. package/dist/src/db/read/getLatestPublishedVersionRow.d.ts.map +1 -1
  188. package/dist/src/db/read/getLatestVersionRow.d.ts +13 -0
  189. package/dist/src/db/read/getLatestVersionRow.d.ts.map +1 -0
  190. package/dist/src/db/read/getModelSchemas.d.ts.map +1 -1
  191. package/dist/src/db/read/getPropertyData.d.ts.map +1 -1
  192. package/dist/src/db/read/getPublishPayload.d.ts +18 -11
  193. package/dist/src/db/read/getPublishPayload.d.ts.map +1 -1
  194. package/dist/src/db/read/getPublishPendingDiff.d.ts +2 -1
  195. package/dist/src/db/read/getPublishPendingDiff.d.ts.map +1 -1
  196. package/dist/src/db/read/getPublishUploads.d.ts +5 -0
  197. package/dist/src/db/read/getPublishUploads.d.ts.map +1 -1
  198. package/dist/src/db/read/getSchemaUidForModel.d.ts.map +1 -1
  199. package/dist/src/db/read/getSeedPublishState.d.ts +8 -2
  200. package/dist/src/db/read/getSeedPublishState.d.ts.map +1 -1
  201. package/dist/src/db/read/isSeedRevoked.d.ts +7 -0
  202. package/dist/src/db/read/isSeedRevoked.d.ts.map +1 -0
  203. package/dist/src/db/read/publishDraftGraph.d.ts +57 -0
  204. package/dist/src/db/read/publishDraftGraph.d.ts.map +1 -0
  205. package/dist/src/db/read/publishErrors.d.ts +37 -0
  206. package/dist/src/db/read/publishErrors.d.ts.map +1 -0
  207. package/dist/src/db/read/resolveModelForSyncedSeed.d.ts +39 -0
  208. package/dist/src/db/read/resolveModelForSyncedSeed.d.ts.map +1 -0
  209. package/dist/src/db/read/resolveModelRecord.d.ts +69 -0
  210. package/dist/src/db/read/resolveModelRecord.d.ts.map +1 -0
  211. package/dist/src/db/read/resolveRelatedSeedRef.d.ts +34 -0
  212. package/dist/src/db/read/resolveRelatedSeedRef.d.ts.map +1 -0
  213. package/dist/src/db/read/subqueries/liveVersion.d.ts +12 -0
  214. package/dist/src/db/read/subqueries/liveVersion.d.ts.map +1 -0
  215. package/dist/src/db/read/subqueries/metadataLatest.d.ts +4 -0
  216. package/dist/src/db/read/subqueries/metadataLatest.d.ts.map +1 -1
  217. package/dist/src/db/read/subqueries/versionData.d.ts +7 -2
  218. package/dist/src/db/read/subqueries/versionData.d.ts.map +1 -1
  219. package/dist/src/db/read/summarizePublishWork.d.ts +10 -2
  220. package/dist/src/db/read/summarizePublishWork.d.ts.map +1 -1
  221. package/dist/src/db/resetAmbiguousLegacyItemData.d.ts +17 -0
  222. package/dist/src/db/resetAmbiguousLegacyItemData.d.ts.map +1 -0
  223. package/dist/src/db/sqlParamBatches.d.ts +27 -0
  224. package/dist/src/db/sqlParamBatches.d.ts.map +1 -0
  225. package/dist/src/db/write/addExcludedTransactions.d.ts +7 -0
  226. package/dist/src/db/write/addExcludedTransactions.d.ts.map +1 -0
  227. package/dist/src/db/write/applyPropertyAttestationUidsFromPublish.d.ts +6 -0
  228. package/dist/src/db/write/applyPropertyAttestationUidsFromPublish.d.ts.map +1 -1
  229. package/dist/src/db/write/createMetadata.d.ts +2 -0
  230. package/dist/src/db/write/createMetadata.d.ts.map +1 -1
  231. package/dist/src/db/write/createNewItem.d.ts +3 -1
  232. package/dist/src/db/write/createNewItem.d.ts.map +1 -1
  233. package/dist/src/db/write/createSeed.d.ts +2 -1
  234. package/dist/src/db/write/createSeed.d.ts.map +1 -1
  235. package/dist/src/db/write/createSeeds.d.ts +1 -1
  236. package/dist/src/db/write/createSeeds.d.ts.map +1 -1
  237. package/dist/src/db/write/linkModelToSchema.d.ts +12 -0
  238. package/dist/src/db/write/linkModelToSchema.d.ts.map +1 -0
  239. package/dist/src/db/write/updateItemPropertyValue.d.ts.map +1 -1
  240. package/dist/src/db/write/updateMetadata.d.ts.map +1 -1
  241. package/dist/src/db/write/updateSeedRevokedAt.d.ts +11 -1
  242. package/dist/src/db/write/updateSeedRevokedAt.d.ts.map +1 -1
  243. package/dist/src/db/write/updateSeedUid.d.ts.map +1 -1
  244. package/dist/src/db/write/updateVersionUid.d.ts +2 -1
  245. package/dist/src/db/write/updateVersionUid.d.ts.map +1 -1
  246. package/dist/src/events/files/download.d.ts.map +1 -1
  247. package/dist/src/events/item/easSyncManager.d.ts +2 -0
  248. package/dist/src/events/item/easSyncManager.d.ts.map +1 -1
  249. package/dist/src/events/item/index.d.ts.map +1 -1
  250. package/dist/src/events/item/syncDbWithEas.d.ts +16 -0
  251. package/dist/src/events/item/syncDbWithEas.d.ts.map +1 -1
  252. package/dist/src/helpers/FileManager/BaseFileManager.d.ts +1 -0
  253. package/dist/src/helpers/FileManager/BaseFileManager.d.ts.map +1 -1
  254. package/dist/src/helpers/FileManager/IFileManager.d.ts +5 -0
  255. package/dist/src/helpers/FileManager/IFileManager.d.ts.map +1 -1
  256. package/dist/src/helpers/FileManager/errors.d.ts +10 -0
  257. package/dist/src/helpers/FileManager/errors.d.ts.map +1 -0
  258. package/dist/src/helpers/compareMetadataRowsLatestFirst.d.ts +21 -3
  259. package/dist/src/helpers/compareMetadataRowsLatestFirst.d.ts.map +1 -1
  260. package/dist/src/helpers/constants.d.ts +9 -0
  261. package/dist/src/helpers/constants.d.ts.map +1 -1
  262. package/dist/src/helpers/crypto.d.ts +5 -0
  263. package/dist/src/helpers/crypto.d.ts.map +1 -1
  264. package/dist/src/helpers/db.d.ts +25 -5
  265. package/dist/src/helpers/db.d.ts.map +1 -1
  266. package/dist/src/helpers/easPropertyCanonical.d.ts +1 -1
  267. package/dist/src/helpers/easPropertyCanonical.d.ts.map +1 -1
  268. package/dist/src/helpers/entity/entityCommon.d.ts +10 -0
  269. package/dist/src/helpers/entity/entityCommon.d.ts.map +1 -1
  270. package/dist/src/helpers/entity/entityDestroy.d.ts +1 -1
  271. package/dist/src/helpers/entity/entityDestroy.d.ts.map +1 -1
  272. package/dist/src/helpers/entity/entityLiveQuery.d.ts +5 -0
  273. package/dist/src/helpers/entity/entityLiveQuery.d.ts.map +1 -1
  274. package/dist/src/helpers/entity/evictionEpoch.d.ts +18 -0
  275. package/dist/src/helpers/entity/evictionEpoch.d.ts.map +1 -0
  276. package/dist/src/helpers/file/fetchAll/actors.d.ts.map +1 -1
  277. package/dist/src/helpers/getSegmentedItemProperties.d.ts.map +1 -1
  278. package/dist/src/helpers/htmlEmbeddedDataUriPublish.d.ts +31 -3
  279. package/dist/src/helpers/htmlEmbeddedDataUriPublish.d.ts.map +1 -1
  280. package/dist/src/helpers/isPublishedMetadataRow.d.ts +10 -0
  281. package/dist/src/helpers/isPublishedMetadataRow.d.ts.map +1 -0
  282. package/dist/src/helpers/ownership.d.ts.map +1 -1
  283. package/dist/src/helpers/property.d.ts +6 -1
  284. package/dist/src/helpers/property.d.ts.map +1 -1
  285. package/dist/src/helpers/schema.d.ts +14 -4
  286. package/dist/src/helpers/schema.d.ts.map +1 -1
  287. package/dist/src/helpers/tabCoordinator.d.ts +45 -0
  288. package/dist/src/helpers/tabCoordinator.d.ts.map +1 -0
  289. package/dist/src/helpers/tabEvents.d.ts +27 -0
  290. package/dist/src/helpers/tabEvents.d.ts.map +1 -0
  291. package/dist/src/helpers/tabLocks.d.ts +28 -0
  292. package/dist/src/helpers/tabLocks.d.ts.map +1 -0
  293. package/dist/src/helpers/updateSchema.d.ts.map +1 -1
  294. package/dist/src/imports/json.d.ts.map +1 -1
  295. package/dist/src/imports/markdown.d.ts.map +1 -1
  296. package/dist/src/index.d.ts +13 -3
  297. package/dist/src/index.d.ts.map +1 -1
  298. package/dist/src/node/db/Db.d.ts.map +1 -1
  299. package/dist/src/node/helpers/FileManager.d.ts +2 -0
  300. package/dist/src/node/helpers/FileManager.d.ts.map +1 -1
  301. package/dist/src/query/createLocalQueryDataSource.d.ts +4 -0
  302. package/dist/src/query/createLocalQueryDataSource.d.ts.map +1 -1
  303. package/dist/src/seedSchema/MetadataSchema.d.ts +36 -0
  304. package/dist/src/seedSchema/MetadataSchema.d.ts.map +1 -1
  305. package/dist/src/seedSchema/ModelSchema.d.ts +57 -0
  306. package/dist/src/seedSchema/ModelSchema.d.ts.map +1 -1
  307. package/dist/src/seedSchema/SeedSchema.d.ts +19 -0
  308. package/dist/src/seedSchema/SeedSchema.d.ts.map +1 -1
  309. package/dist/src/seedSchema/VersionSchema.d.ts +17 -0
  310. package/dist/src/seedSchema/VersionSchema.d.ts.map +1 -1
  311. package/dist/src/services/write/actors/validateEntity.d.ts.map +1 -1
  312. package/dist/src/services/write/actors/writeToDatabase.d.ts +5 -0
  313. package/dist/src/services/write/actors/writeToDatabase.d.ts.map +1 -1
  314. package/dist/src/services/write/writeProcessMachine.d.ts.map +1 -1
  315. package/dist/src/stores/eas.d.ts +1 -1
  316. package/dist/src/stores/eas.d.ts.map +1 -1
  317. package/dist/src/types/index.d.ts +7 -0
  318. package/dist/src/types/index.d.ts.map +1 -1
  319. package/dist/src/types/item.d.ts +19 -11
  320. package/dist/src/types/item.d.ts.map +1 -1
  321. package/dist/src/types/property.d.ts +3 -2
  322. package/dist/src/types/property.d.ts.map +1 -1
  323. package/dist/syncDbWithEas-BPap9Sru.js +855 -0
  324. package/dist/syncDbWithEas-BPap9Sru.js.map +1 -0
  325. package/dist/{index-280bL-n4.js → tabEvents-C6NXS6Jl.js} +231 -68
  326. package/dist/tabEvents-C6NXS6Jl.js.map +1 -0
  327. package/dist/tolerantWebAccess-NBQ1NB4i.js +160 -0
  328. package/dist/tolerantWebAccess-NBQ1NB4i.js.map +1 -0
  329. package/dist/updateSeedRevokedAt-CYwgVNlM.js +32 -0
  330. package/dist/updateSeedRevokedAt-CYwgVNlM.js.map +1 -0
  331. package/package.json +8 -10
  332. package/dist/BasePathResolver-B6CKqoKw.js.map +0 -1
  333. package/dist/ClientManager-ChcmUL47.js.map +0 -1
  334. package/dist/ModelProperty-D79uV42p.js.map +0 -1
  335. package/dist/Schema-a8uO-hIZ.js.map +0 -1
  336. package/dist/SchemaValidationService-Y49vqast.js.map +0 -1
  337. package/dist/backfillMetadataPropertyIds-CBsf7LnU.js.map +0 -1
  338. package/dist/cjs/ModelProperty-D9FGaGuE.js.map +0 -1
  339. package/dist/cjs/Schema-BiJIPLEL.js.map +0 -1
  340. package/dist/cjs/SchemaValidationService-DtYs_CNY.js.map +0 -1
  341. package/dist/cjs/backfillMetadataPropertyIds-2XaN3b9S.js.map +0 -1
  342. package/dist/cjs/getPublishPayload-D5DhLGvN.js.map +0 -1
  343. package/dist/cjs/getPublishUploads-DMhCCKYF.js.map +0 -1
  344. package/dist/cjs/getSegmentedItemProperties-CU8rtBAo.js +0 -148
  345. package/dist/cjs/getSegmentedItemProperties-CU8rtBAo.js.map +0 -1
  346. package/dist/cjs/index-CSNtEnbF.js.map +0 -1
  347. package/dist/cjs/index-DPp9rdRL.js.map +0 -1
  348. package/dist/cjs/property-DlKiAWt4.js.map +0 -1
  349. package/dist/cjs/syncDbWithEas-C6n34o_Q.js +0 -606
  350. package/dist/cjs/syncDbWithEas-C6n34o_Q.js.map +0 -1
  351. package/dist/db-WbrzEf7c.js.map +0 -1
  352. package/dist/eas-CfYCu4IX.js.map +0 -1
  353. package/dist/getPublishPayload-BIrTVUxb.js.map +0 -1
  354. package/dist/getPublishUploads-C6cDeZdz.js.map +0 -1
  355. package/dist/getSegmentedItemProperties-BmKE71vU.js +0 -148
  356. package/dist/getSegmentedItemProperties-BmKE71vU.js.map +0 -1
  357. package/dist/index-280bL-n4.js.map +0 -1
  358. package/dist/index-ClSv5pTA.js.map +0 -1
  359. package/dist/index-Djd3667v.js.map +0 -1
  360. package/dist/index-HRHkbVQd.js.map +0 -1
  361. package/dist/index.node-DBtQkEfz.js.map +0 -1
  362. package/dist/property-CQjuZ4JW.js.map +0 -1
  363. package/dist/src/Item/service/actors/fetchDataFromEas.d.ts +0 -4
  364. package/dist/src/Item/service/actors/fetchDataFromEas.d.ts.map +0 -1
  365. package/dist/src/Item/service/actors/hydrateExistingItem.d.ts +0 -4
  366. package/dist/src/Item/service/actors/hydrateExistingItem.d.ts.map +0 -1
  367. package/dist/src/Item/service/actors/hydrateNewItem.d.ts +0 -4
  368. package/dist/src/Item/service/actors/hydrateNewItem.d.ts.map +0 -1
  369. package/dist/src/Item/service/actors/initialize.d.ts +0 -4
  370. package/dist/src/Item/service/actors/initialize.d.ts.map +0 -1
  371. package/dist/src/Item/service/actors/reload.d.ts +0 -5
  372. package/dist/src/Item/service/actors/reload.d.ts.map +0 -1
  373. package/dist/src/Item/service/actors/saveDataToDb.d.ts +0 -4
  374. package/dist/src/Item/service/actors/saveDataToDb.d.ts.map +0 -1
  375. package/dist/src/ItemProperty/service/actors/resolveRemoteStorage.d.ts +0 -5
  376. package/dist/src/ItemProperty/service/actors/resolveRemoteStorage.d.ts.map +0 -1
  377. package/dist/src/Schema/service/addModelsMachine.d.ts +0 -123
  378. package/dist/src/Schema/service/addModelsMachine.d.ts.map +0 -1
  379. package/dist/src/browser/helpers/index.d.ts +0 -4
  380. package/dist/src/browser/helpers/index.d.ts.map +0 -1
  381. package/dist/src/db/configs/dev.schema.config.d.ts.map +0 -1
  382. package/dist/src/helpers/file/download/actors.d.ts +0 -17
  383. package/dist/src/helpers/file/download/actors.d.ts.map +0 -1
  384. package/dist/src/helpers/file/download/index.d.ts +0 -70
  385. package/dist/src/helpers/file/download/index.d.ts.map +0 -1
  386. package/dist/src/services/publish/actors/createPublishAttempt.d.ts +0 -4
  387. package/dist/src/services/publish/actors/createPublishAttempt.d.ts.map +0 -1
  388. package/dist/src/services/publish/actors/preparePublishRequestData.d.ts +0 -4
  389. package/dist/src/services/publish/actors/preparePublishRequestData.d.ts.map +0 -1
  390. package/dist/src/services/publish/actors/upload.d.ts +0 -4
  391. package/dist/src/services/publish/actors/upload.d.ts.map +0 -1
  392. package/dist/src/services/publish/actors/validateItemData.d.ts +0 -4
  393. package/dist/src/services/publish/actors/validateItemData.d.ts.map +0 -1
  394. package/dist/src/services/publish/publishMachine.d.ts +0 -32
  395. package/dist/src/services/publish/publishMachine.d.ts.map +0 -1
  396. package/dist/syncDbWithEas-CuARXfyN.js +0 -598
  397. package/dist/syncDbWithEas-CuARXfyN.js.map +0 -1
  398. package/dist/updateSeedRevokedAt-CBcLfHWs.js +0 -22
  399. package/dist/updateSeedRevokedAt-CBcLfHWs.js.map +0 -1
@@ -1,11 +1,11 @@
1
1
  'use strict';
2
2
 
3
3
  var xstate = require('xstate');
4
- var main_cjs = require('./index-CSNtEnbF.js');
4
+ var main_cjs = require('./index-Cvvt0-5B.js');
5
5
  var drizzleOrm = require('drizzle-orm');
6
6
  var debug = require('debug');
7
7
  require('pluralize');
8
- var SchemaValidationService = require('./SchemaValidationService-DtYs_CNY.js');
8
+ var SchemaValidationService = require('./SchemaValidationService-BSU9knjf.js');
9
9
  require('immer');
10
10
  require('reflect-metadata');
11
11
  require('drizzle-orm/sqlite-core');
@@ -71,18 +71,19 @@ const getModelIdsForSchema$1 = async (schemaId) => {
71
71
  * This ensures that Model.getById() in Schema.getContext() will find the instances
72
72
  * @param modelIds - Array of model file IDs to create instances for
73
73
  */
74
- const createModelInstances$2 = async (modelIds) => {
74
+ const createModelInstances$2 = async (modelIds, evictionEpoch) => {
75
75
  if (modelIds.length === 0) {
76
76
  return;
77
77
  }
78
78
  try {
79
- const modelMod = await Promise.resolve().then(function () { return require('./index-CSNtEnbF.js'); }).then(function (n) { return n.Model$1; });
79
+ const modelMod = await Promise.resolve().then(function () { return require('./index-Cvvt0-5B.js'); }).then(function (n) { return n.Model$1; });
80
80
  const { Model } = modelMod;
81
81
  // Create instances for all model IDs in parallel
82
82
  // Model.createById() will check cache first, then query DB and create if needed
83
83
  const createPromises = modelIds.map(async (modelFileId) => {
84
84
  try {
85
- const model = await Model.createById(modelFileId);
85
+ // Not if the schema was evicted (Schema.destroy, test cleanup) since this load started
86
+ const model = await Model.createById(modelFileId, { evictionEpoch });
86
87
  if (model) {
87
88
  logger$d(`Created/cached Model instance for modelFileId "${modelFileId}"`);
88
89
  }
@@ -181,6 +182,7 @@ const getSchemaFilePath$2 = (name, version, schemaFileId) => {
181
182
  return path.join(workingDir, filename);
182
183
  };
183
184
  const loadOrCreateSchema = xstate.fromCallback(({ sendBack, input: { context } }) => {
185
+ const evictionEpoch = main_cjs.currentEvictionEpoch();
184
186
  const _loadOrCreateSchema = async () => {
185
187
  const { schemaName } = context;
186
188
  // Check if this is an internal SDK schema (should not create files in app directory) — use static import so consumer bundles resolve correctly
@@ -189,7 +191,7 @@ const loadOrCreateSchema = xstate.fromCallback(({ sendBack, input: { context } }
189
191
  // For Seed Protocol, always load from internal file, never create new
190
192
  logger$d(`Loading internal Seed Protocol schema from SDK`);
191
193
  try {
192
- const internalSchema = await Promise.resolve().then(function () { return require('./index-CSNtEnbF.js'); }).then(function (n) { return n.SEEDPROTOCOL_Seed_Protocol_v1; });
194
+ const internalSchema = await Promise.resolve().then(function () { return require('./index-Cvvt0-5B.js'); }).then(function (n) { return n.SEEDPROTOCOL_Seed_Protocol_v1; });
193
195
  const schemaFile = internalSchema.default;
194
196
  // Check if it exists in database, if not, add it
195
197
  const db = main_cjs.BaseDb.getAppDb();
@@ -497,7 +499,7 @@ const loadOrCreateSchema = xstate.fromCallback(({ sendBack, input: { context } }
497
499
  if (schemaRecord && schemaRecord.id) {
498
500
  modelIds = await getModelIdsForSchema$1(schemaRecord.id);
499
501
  // Create Model instances so they're cached before getContext runs
500
- await createModelInstances$2(modelIds);
502
+ await createModelInstances$2(modelIds, evictionEpoch);
501
503
  }
502
504
  sendBack({
503
505
  type: 'loadOrCreateSchemaSuccess',
@@ -682,7 +684,7 @@ const loadOrCreateSchema = xstate.fromCallback(({ sendBack, input: { context } }
682
684
  // Ensure models are populated (fallback for seed-protocol if missing)
683
685
  if ((!mergedModels || Object.keys(mergedModels).length === 0) && schemaName === 'Seed Protocol') {
684
686
  try {
685
- const internalSchema = await Promise.resolve().then(function () { return require('./index-CSNtEnbF.js'); }).then(function (n) { return n.SEEDPROTOCOL_Seed_Protocol_v1; });
687
+ const internalSchema = await Promise.resolve().then(function () { return require('./index-Cvvt0-5B.js'); }).then(function (n) { return n.SEEDPROTOCOL_Seed_Protocol_v1; });
686
688
  const internalSchemaFile = internalSchema.default;
687
689
  mergedModels = { ...(internalSchemaFile.models || {}) };
688
690
  logger$d(`Populated models for seed-protocol schema from internal file`);
@@ -744,7 +746,7 @@ const loadOrCreateSchema = xstate.fromCallback(({ sendBack, input: { context } }
744
746
  if (dbSchema.id) {
745
747
  modelIds = await getModelIdsForSchema$1(dbSchema.id);
746
748
  // Create Model instances so they're cached before getContext runs
747
- await createModelInstances$2(modelIds);
749
+ await createModelInstances$2(modelIds, evictionEpoch);
748
750
  }
749
751
  // Track conflict detection metadata
750
752
  const loadedAt = Date.now();
@@ -841,7 +843,7 @@ const loadOrCreateSchema = xstate.fromCallback(({ sendBack, input: { context } }
841
843
  if (draftsByFileId[0].id) {
842
844
  modelIds = await getModelIdsForSchema$1(draftsByFileId[0].id);
843
845
  // Create Model instances so they're cached before getContext runs
844
- await createModelInstances$2(modelIds);
846
+ await createModelInstances$2(modelIds, evictionEpoch);
845
847
  }
846
848
  // Track conflict detection metadata
847
849
  const loadedAt = Date.now();
@@ -909,7 +911,7 @@ const loadOrCreateSchema = xstate.fromCallback(({ sendBack, input: { context } }
909
911
  // Ensure models are populated (fallback for seed-protocol if missing)
910
912
  if ((!mergedModels || Object.keys(mergedModels).length === 0) && schemaName === 'Seed Protocol') {
911
913
  try {
912
- const internalSchema = await Promise.resolve().then(function () { return require('./index-CSNtEnbF.js'); }).then(function (n) { return n.SEEDPROTOCOL_Seed_Protocol_v1; });
914
+ const internalSchema = await Promise.resolve().then(function () { return require('./index-Cvvt0-5B.js'); }).then(function (n) { return n.SEEDPROTOCOL_Seed_Protocol_v1; });
913
915
  const internalSchemaFile = internalSchema.default;
914
916
  mergedModels = { ...(internalSchemaFile.models || {}) };
915
917
  logger$d(`Populated models for seed-protocol schema from internal file`);
@@ -972,7 +974,7 @@ const loadOrCreateSchema = xstate.fromCallback(({ sendBack, input: { context } }
972
974
  if (dbSchema.id) {
973
975
  modelIds = await getModelIdsForSchema$1(dbSchema.id);
974
976
  // Create Model instances so they're cached before getContext runs
975
- await createModelInstances$2(modelIds);
977
+ await createModelInstances$2(modelIds, evictionEpoch);
976
978
  }
977
979
  // Track conflict detection metadata from DB record
978
980
  const loadedAt = Date.now();
@@ -998,7 +1000,7 @@ const loadOrCreateSchema = xstate.fromCallback(({ sendBack, input: { context } }
998
1000
  // Ensure models are populated (fallback for seed-protocol if missing)
999
1001
  if ((!mergedModels || Object.keys(mergedModels).length === 0) && schemaName === 'Seed Protocol') {
1000
1002
  try {
1001
- const internalSchema = await Promise.resolve().then(function () { return require('./index-CSNtEnbF.js'); }).then(function (n) { return n.SEEDPROTOCOL_Seed_Protocol_v1; });
1003
+ const internalSchema = await Promise.resolve().then(function () { return require('./index-Cvvt0-5B.js'); }).then(function (n) { return n.SEEDPROTOCOL_Seed_Protocol_v1; });
1002
1004
  const internalSchemaFile = internalSchema.default;
1003
1005
  mergedModels = { ...(internalSchemaFile.models || {}) };
1004
1006
  logger$d(`Populated models for seed-protocol schema from internal file`);
@@ -1060,7 +1062,7 @@ const loadOrCreateSchema = xstate.fromCallback(({ sendBack, input: { context } }
1060
1062
  if (dbSchema.id) {
1061
1063
  modelIds = await getModelIdsForSchema$1(dbSchema.id);
1062
1064
  // Create Model instances so they're cached before getContext runs
1063
- await createModelInstances$2(modelIds);
1065
+ await createModelInstances$2(modelIds, evictionEpoch);
1064
1066
  }
1065
1067
  // Track conflict detection metadata
1066
1068
  const loadedAt = Date.now();
@@ -1084,7 +1086,7 @@ const loadOrCreateSchema = xstate.fromCallback(({ sendBack, input: { context } }
1084
1086
  // If schemaData is missing, try to load from internal schema file for seed-protocol
1085
1087
  if (!dbSchema.schemaData && schemaName === 'Seed Protocol') {
1086
1088
  try {
1087
- const internalSchema = await Promise.resolve().then(function () { return require('./index-CSNtEnbF.js'); }).then(function (n) { return n.SEEDPROTOCOL_Seed_Protocol_v1; });
1089
+ const internalSchema = await Promise.resolve().then(function () { return require('./index-Cvvt0-5B.js'); }).then(function (n) { return n.SEEDPROTOCOL_Seed_Protocol_v1; });
1088
1090
  const schemaFile = internalSchema.default;
1089
1091
  logger$d(`Found seed-protocol schema in internal file (schemaData missing, using internal schema)`);
1090
1092
  // Update database with schemaData for future loads
@@ -1100,7 +1102,7 @@ const loadOrCreateSchema = xstate.fromCallback(({ sendBack, input: { context } }
1100
1102
  if (dbSchema.id) {
1101
1103
  modelIds = await getModelIdsForSchema$1(dbSchema.id);
1102
1104
  // Create Model instances so they're cached before getContext runs
1103
- await createModelInstances$2(modelIds);
1105
+ await createModelInstances$2(modelIds, evictionEpoch);
1104
1106
  }
1105
1107
  sendBack({
1106
1108
  type: 'loadOrCreateSchemaSuccess',
@@ -1162,7 +1164,7 @@ const loadOrCreateSchema = xstate.fromCallback(({ sendBack, input: { context } }
1162
1164
  if (matchingDraft.id) {
1163
1165
  modelIds = await getModelIdsForSchema$1(matchingDraft.id);
1164
1166
  // Create Model instances so they're cached before getContext runs
1165
- await createModelInstances$2(modelIds);
1167
+ await createModelInstances$2(modelIds, evictionEpoch);
1166
1168
  }
1167
1169
  // Track conflict detection metadata
1168
1170
  const loadedAt = Date.now();
@@ -1193,7 +1195,7 @@ const loadOrCreateSchema = xstate.fromCallback(({ sendBack, input: { context } }
1193
1195
  // Ensure models are populated (fallback for seed-protocol if missing)
1194
1196
  if ((!mergedModels || Object.keys(mergedModels).length === 0) && schemaName === 'Seed Protocol') {
1195
1197
  try {
1196
- const internalSchema = await Promise.resolve().then(function () { return require('./index-CSNtEnbF.js'); }).then(function (n) { return n.SEEDPROTOCOL_Seed_Protocol_v1; });
1198
+ const internalSchema = await Promise.resolve().then(function () { return require('./index-Cvvt0-5B.js'); }).then(function (n) { return n.SEEDPROTOCOL_Seed_Protocol_v1; });
1197
1199
  const internalSchemaFile = internalSchema.default;
1198
1200
  mergedModels = { ...(internalSchemaFile.models || {}) };
1199
1201
  logger$d(`Populated models for seed-protocol schema from internal file`);
@@ -1216,7 +1218,7 @@ const loadOrCreateSchema = xstate.fromCallback(({ sendBack, input: { context } }
1216
1218
  if (schemaRecords.length > 0 && schemaRecords[0].id) {
1217
1219
  modelIds = await getModelIdsForSchema$1(schemaRecords[0].id);
1218
1220
  // Create Model instances so they're cached before getContext runs
1219
- await createModelInstances$2(modelIds);
1221
+ await createModelInstances$2(modelIds, evictionEpoch);
1220
1222
  }
1221
1223
  }
1222
1224
  }
@@ -1270,7 +1272,7 @@ const loadOrCreateSchema = xstate.fromCallback(({ sendBack, input: { context } }
1270
1272
  if (foundSchema.id) {
1271
1273
  modelIds = await getModelIdsForSchema$1(foundSchema.id);
1272
1274
  // Create Model instances so they're cached before getContext runs
1273
- await createModelInstances$2(modelIds);
1275
+ await createModelInstances$2(modelIds, evictionEpoch);
1274
1276
  }
1275
1277
  // Track conflict detection metadata
1276
1278
  const loadedAt = Date.now();
@@ -1302,7 +1304,7 @@ const loadOrCreateSchema = xstate.fromCallback(({ sendBack, input: { context } }
1302
1304
  if (foundSchema.id) {
1303
1305
  modelIds = await getModelIdsForSchema$1(foundSchema.id);
1304
1306
  // Create Model instances so they're cached before getContext runs
1305
- await createModelInstances$2(modelIds);
1307
+ await createModelInstances$2(modelIds, evictionEpoch);
1306
1308
  }
1307
1309
  // Track conflict detection metadata
1308
1310
  const loadedAt = Date.now();
@@ -1375,7 +1377,7 @@ const loadOrCreateSchema = xstate.fromCallback(({ sendBack, input: { context } }
1375
1377
  if (schemaRecords.length > 0 && schemaRecords[0].id) {
1376
1378
  modelIds = await getModelIdsForSchema$1(schemaRecords[0].id);
1377
1379
  // Create Model instances so they're cached before getContext runs
1378
- await createModelInstances$2(modelIds);
1380
+ await createModelInstances$2(modelIds, evictionEpoch);
1379
1381
  }
1380
1382
  }
1381
1383
  }
@@ -1464,582 +1466,6 @@ const validateSchema = xstate.fromCallback(({ sendBack, input: { context } }) =>
1464
1466
  };
1465
1467
  });
1466
1468
 
1467
- const addModelsMachine = xstate.setup({
1468
- types: {
1469
- context: {},
1470
- input: {},
1471
- events: {},
1472
- },
1473
- actors: {
1474
- validateModels: xstate.fromCallback(({ sendBack, input }) => {
1475
- const _validate = async () => {
1476
- // Check for duplicate model names
1477
- const newModelNames = Object.keys(input.newModels);
1478
- const existingModelNames = Object.keys(input.existingModels || {});
1479
- for (const modelName of newModelNames) {
1480
- if (existingModelNames.includes(modelName)) {
1481
- throw new Error(`Model "${modelName}" already exists in schema`);
1482
- }
1483
- }
1484
- // Check for duplicates within new models
1485
- const seenNames = new Set();
1486
- for (const modelName of newModelNames) {
1487
- if (seenNames.has(modelName)) {
1488
- throw new Error(`Duplicate model name detected: "${modelName}". Each model must have a unique name.`);
1489
- }
1490
- seenNames.add(modelName);
1491
- }
1492
- // Basic validation - ensure models have required structure
1493
- for (const [modelName, modelDef] of Object.entries(input.newModels)) {
1494
- if (!modelDef || typeof modelDef !== 'object') {
1495
- throw new Error(`Invalid model definition for "${modelName}": must be an object`);
1496
- }
1497
- if (!modelDef.properties || typeof modelDef.properties !== 'object') {
1498
- throw new Error(`Model "${modelName}" must have a "properties" object`);
1499
- }
1500
- }
1501
- sendBack({ type: 'done', output: { valid: true } });
1502
- };
1503
- _validate().catch((error) => {
1504
- sendBack({ type: 'error', error: error instanceof Error ? error : new Error(String(error)) });
1505
- });
1506
- return () => {
1507
- // Cleanup
1508
- };
1509
- }),
1510
- createModelInstances: xstate.fromCallback(({ sendBack, input }) => {
1511
- const _createInstances = async () => {
1512
- const debug = (await import('debug')).default;
1513
- const logger = debug('seedSdk:schema:addModels:createInstances');
1514
- const schemaMod = await Promise.resolve().then(function () { return Schema$1; });
1515
- const { Schema: SchemaClass, schemaInstanceState } = schemaMod;
1516
- const schemaName = input.schemaContext.metadata?.name || input.schemaContext.schemaName;
1517
- const schemaInstance = SchemaClass.create(schemaName, {
1518
- waitForReady: false,
1519
- });
1520
- const modelInstances = new Map();
1521
- // Get instance state to store model instances
1522
- const instanceState = schemaInstanceState.get(schemaInstance);
1523
- if (!instanceState) {
1524
- throw new Error('Schema instance state not found');
1525
- }
1526
- for (const [modelName, modelData] of Object.entries(input.models)) {
1527
- try {
1528
- logger(`Creating model instance for "${modelName}"`);
1529
- // Look up modelFileId from database BEFORE creating the Model instance
1530
- let modelFileId = undefined;
1531
- try {
1532
- const db = main_cjs.BaseDb.getAppDb();
1533
- if (db) {
1534
- const dbModels = await db
1535
- .select()
1536
- .from(main_cjs.models)
1537
- .where(drizzleOrm.eq(main_cjs.models.name, modelName))
1538
- .limit(1);
1539
- if (dbModels.length > 0 && dbModels[0].schemaFileId) {
1540
- modelFileId = dbModels[0].schemaFileId;
1541
- logger(`Found modelFileId "${modelFileId}" for model "${modelName}" from database`);
1542
- }
1543
- }
1544
- }
1545
- catch (error) {
1546
- logger(`Error looking up modelFileId from database: ${error}`);
1547
- }
1548
- // If not found in database, generate a new modelFileId for new models
1549
- if (!modelFileId) {
1550
- modelFileId = main_cjs.generateId();
1551
- logger(`Generated new modelFileId "${modelFileId}" for new model "${modelName}"`);
1552
- }
1553
- // Create new Model instance with modelFileId
1554
- // Model.create() will set _modelFileId in the context automatically
1555
- const modelInstance = main_cjs.Model.create(modelName, schemaName, {
1556
- modelFileId,
1557
- waitForReady: false,
1558
- });
1559
- const service = modelInstance.getService();
1560
- logger(`Created Model instance for "${modelName}" with modelFileId "${modelFileId}"`);
1561
- // Wait for the Model service to finish loading (loadOrCreateModel completes)
1562
- await new Promise((resolve) => {
1563
- let resolved = false;
1564
- let subscription = null;
1565
- // Check if already idle
1566
- const snapshot = service.getSnapshot();
1567
- if (snapshot.value === 'idle') {
1568
- const currentModelFileId = snapshot.context._modelFileId;
1569
- if (currentModelFileId === modelFileId) {
1570
- logger(`ModelFileId "${modelFileId}" correctly set for model "${modelName}"`);
1571
- }
1572
- else {
1573
- logger(`WARNING: ModelFileId not set for model "${modelName}" (expected: "${modelFileId}", got: "${currentModelFileId || 'undefined'}")`);
1574
- // Try to set it again
1575
- service.send({
1576
- type: 'updateContext',
1577
- _modelFileId: modelFileId,
1578
- });
1579
- }
1580
- resolved = true;
1581
- resolve();
1582
- return;
1583
- }
1584
- // Wait for service to become idle
1585
- subscription = service.subscribe((snapshot) => {
1586
- if (snapshot.value === 'idle') {
1587
- if (subscription) {
1588
- subscription.unsubscribe();
1589
- subscription = null;
1590
- }
1591
- const currentModelFileId = snapshot.context._modelFileId;
1592
- if (currentModelFileId === modelFileId) {
1593
- logger(`ModelFileId "${modelFileId}" correctly set for model "${modelName}"`);
1594
- }
1595
- else {
1596
- logger(`WARNING: ModelFileId not set for model "${modelName}" (expected: "${modelFileId}", got: "${currentModelFileId || 'undefined'}")`);
1597
- // Try to set it again - but only once to avoid infinite loop
1598
- if (!resolved) {
1599
- service.send({
1600
- type: 'updateContext',
1601
- _modelFileId: modelFileId,
1602
- });
1603
- }
1604
- }
1605
- if (!resolved) {
1606
- resolved = true;
1607
- resolve();
1608
- }
1609
- }
1610
- else if (snapshot.value === 'error') {
1611
- if (subscription) {
1612
- subscription.unsubscribe();
1613
- subscription = null;
1614
- }
1615
- if (!resolved) {
1616
- resolved = true;
1617
- resolve();
1618
- }
1619
- }
1620
- });
1621
- // Timeout after 2 seconds
1622
- setTimeout(() => {
1623
- if (subscription) {
1624
- subscription.unsubscribe();
1625
- subscription = null;
1626
- }
1627
- if (!resolved) {
1628
- resolved = true;
1629
- resolve();
1630
- }
1631
- }, 2000);
1632
- });
1633
- // Update the model instance with current data
1634
- modelInstance.getService().send({
1635
- type: 'updateContext',
1636
- properties: modelData.properties || {},
1637
- });
1638
- // Initialize original values
1639
- modelInstance.getService().send({
1640
- type: 'initializeOriginalValues',
1641
- originalValues: {
1642
- _originalValues: {
1643
- properties: modelData.properties ? JSON.parse(JSON.stringify(modelData.properties)) : {},
1644
- },
1645
- },
1646
- isEdited: false,
1647
- });
1648
- // Store in instance state
1649
- if (!instanceState.modelInstances) {
1650
- instanceState.modelInstances = new Map();
1651
- }
1652
- instanceState.modelInstances.set(modelName, modelInstance);
1653
- modelInstances.set(modelName, modelInstance);
1654
- logger(`Successfully created model instance for "${modelName}"`);
1655
- }
1656
- catch (error) {
1657
- logger(`Error creating model instance for "${modelName}": ${error}`);
1658
- throw error;
1659
- }
1660
- }
1661
- sendBack({
1662
- type: 'done',
1663
- output: { modelInstances }
1664
- });
1665
- };
1666
- _createInstances().catch((error) => {
1667
- sendBack({ type: 'error', error: error instanceof Error ? error : new Error(String(error)) });
1668
- });
1669
- return () => {
1670
- // Cleanup
1671
- };
1672
- }),
1673
- collectModelFileIds: xstate.fromCallback(({ sendBack, input }) => {
1674
- const _collectIds = async () => {
1675
- const debug = (await import('debug')).default;
1676
- const logger = debug('seedSdk:schema:addModels:collectIds');
1677
- const modelFileIds = new Map();
1678
- for (const [modelName, modelInstance] of input.modelInstances.entries()) {
1679
- try {
1680
- const service = modelInstance.getService();
1681
- let modelFileId = undefined;
1682
- // Check current snapshot first
1683
- const snapshot = service.getSnapshot();
1684
- if (snapshot.value === 'idle' && snapshot.context._modelFileId) {
1685
- modelFileId = snapshot.context._modelFileId;
1686
- }
1687
- else {
1688
- // If not ready, wait for it to become idle
1689
- await new Promise((resolve) => {
1690
- const subscription = service.subscribe((snapshot) => {
1691
- if (snapshot.value === 'idle') {
1692
- subscription.unsubscribe();
1693
- if (snapshot.context._modelFileId) {
1694
- modelFileId = snapshot.context._modelFileId;
1695
- }
1696
- resolve();
1697
- }
1698
- else if (snapshot.value === 'error') {
1699
- subscription.unsubscribe();
1700
- resolve();
1701
- }
1702
- });
1703
- // Timeout after 1 second
1704
- setTimeout(() => {
1705
- subscription.unsubscribe();
1706
- resolve();
1707
- }, 1000);
1708
- });
1709
- }
1710
- if (modelFileId) {
1711
- modelFileIds.set(modelName, modelFileId);
1712
- logger(`Collected modelFileId "${modelFileId}" for model "${modelName}"`);
1713
- }
1714
- else {
1715
- logger(`WARNING: modelFileId not found for model "${modelName}" after waiting`);
1716
- }
1717
- }
1718
- catch (error) {
1719
- logger(`Error collecting modelFileId for "${modelName}": ${error}`);
1720
- // Continue with other models even if one fails
1721
- }
1722
- }
1723
- sendBack({
1724
- type: 'done',
1725
- output: { modelFileIds }
1726
- });
1727
- };
1728
- _collectIds().catch((error) => {
1729
- sendBack({ type: 'error', error: error instanceof Error ? error : new Error(String(error)) });
1730
- });
1731
- return () => {
1732
- // Cleanup
1733
- };
1734
- }),
1735
- persistModelsToDb: xstate.fromCallback(({ sendBack, input }) => {
1736
- const _persist = async () => {
1737
- const debug = (await import('debug')).default;
1738
- const logger = debug('seedSdk:schema:addModels:persist');
1739
- // Only process in browser environment where store is available
1740
- if (typeof window === 'undefined') {
1741
- logger('Not in browser environment, skipping store update');
1742
- sendBack({
1743
- type: 'done',
1744
- output: { addedModels: input.models }
1745
- });
1746
- return;
1747
- }
1748
- const schemaName = input.schemaContext.metadata?.name || input.schemaContext.schemaName;
1749
- const schemaFileId = input.schemaContext.id; // id is the schemaFileId (string) in SchemaMachineContext
1750
- const db = main_cjs.BaseDb.getAppDb();
1751
- if (!db) {
1752
- logger('Database not found, skipping model store update');
1753
- sendBack({
1754
- type: 'done',
1755
- output: { addedModels: input.models }
1756
- });
1757
- return;
1758
- }
1759
- // Find schema record - prefer schemaFileId lookup (more reliable), then fall back to name
1760
- // Retry up to 3 times with a short delay in case schema is still being saved
1761
- let schemaRecord;
1762
- const maxRetries = 3;
1763
- const retryDelay = 100; // ms
1764
- for (let attempt = 0; attempt < maxRetries && !schemaRecord; attempt++) {
1765
- if (attempt > 0) {
1766
- logger(`Retry ${attempt}/${maxRetries - 1} to find schema, waiting ${retryDelay}ms...`);
1767
- await new Promise(resolve => setTimeout(resolve, retryDelay));
1768
- }
1769
- // PRIMARY: Look up by schemaFileId if available (most reliable, independent of name changes)
1770
- if (schemaFileId) {
1771
- logger(`Looking up schema by schemaFileId: ${schemaFileId} (attempt ${attempt + 1})`);
1772
- const schemasById = await db
1773
- .select()
1774
- .from(main_cjs.schemas)
1775
- .where(drizzleOrm.eq(main_cjs.schemas.schemaFileId, schemaFileId))
1776
- .limit(1);
1777
- if (schemasById.length > 0) {
1778
- schemaRecord = schemasById[0];
1779
- if (schemaRecord) {
1780
- logger(`Found schema by schemaFileId: ${schemaFileId} (id: ${schemaRecord.id}, name: ${schemaRecord.name}, isDraft: ${schemaRecord.isDraft})`);
1781
- }
1782
- break;
1783
- }
1784
- else {
1785
- logger(`No schema found by schemaFileId: ${schemaFileId}, will try by name`);
1786
- }
1787
- }
1788
- // FALLBACK: If not found by schemaFileId, try by name (prefer draft records)
1789
- if (!schemaRecord) {
1790
- logger(`Looking up schema by name: "${schemaName}" (attempt ${attempt + 1})`);
1791
- const schemasByName = await db
1792
- .select()
1793
- .from(main_cjs.schemas)
1794
- .where(drizzleOrm.eq(main_cjs.schemas.name, schemaName))
1795
- .orderBy(drizzleOrm.desc(main_cjs.schemas.isDraft), drizzleOrm.desc(main_cjs.schemas.version))
1796
- .limit(10); // Get multiple to find drafts
1797
- if (schemasByName.length > 0) {
1798
- // Prefer draft records
1799
- const draftRecord = schemasByName.find((s) => s.isDraft === true);
1800
- schemaRecord = draftRecord || schemasByName[0];
1801
- if (schemaRecord) {
1802
- logger(`Found schema by name "${schemaName}": selected ${draftRecord ? 'draft' : 'first'} record (id: ${schemaRecord.id}, isDraft: ${schemaRecord.isDraft})`);
1803
- }
1804
- break;
1805
- }
1806
- }
1807
- }
1808
- if (!schemaRecord) {
1809
- logger(`Schema "${schemaName}" (schemaFileId: ${schemaFileId || 'none'}) not found in database after ${maxRetries} attempts, skipping model store update`);
1810
- sendBack({
1811
- type: 'done',
1812
- output: { addedModels: input.models }
1813
- });
1814
- return;
1815
- }
1816
- // Convert schema model format to JSON import format for createModelFromJson
1817
- const modelDefinitions = {};
1818
- for (const [modelName, modelDef] of Object.entries(input.models)) {
1819
- // Convert properties from schema format to JSON import format
1820
- const convertedProperties = {};
1821
- if (modelDef.properties) {
1822
- for (const [propName, propDef] of Object.entries(modelDef.properties)) {
1823
- // Schema format: { dataType, ref, refValueType, storageType, localStorageDir, filenameSuffix }
1824
- // JSON import format: { type, model, items, storage: { type, path, extension } }
1825
- const schemaProp = propDef;
1826
- const jsonProp = {
1827
- type: schemaProp.dataType || schemaProp.type,
1828
- };
1829
- // Handle Relation type
1830
- if (schemaProp.ref || schemaProp.refModelName) {
1831
- jsonProp.model = schemaProp.refModelName || schemaProp.ref;
1832
- }
1833
- // Handle List type
1834
- if (main_cjs.isDataType(schemaProp.dataType, main_cjs.ModelPropertyDataTypes.List) && schemaProp.refValueType) {
1835
- jsonProp.refValueType = schemaProp.refValueType;
1836
- if (schemaProp.ref || schemaProp.refModelName) {
1837
- jsonProp.ref = schemaProp.refModelName || schemaProp.ref;
1838
- }
1839
- }
1840
- // Handle storage configuration
1841
- if (schemaProp.storageType || schemaProp.localStorageDir || schemaProp.filenameSuffix) {
1842
- jsonProp.storage = {
1843
- type: schemaProp.storageType === 'ItemStorage' ? 'ItemStorage' : 'PropertyStorage',
1844
- path: schemaProp.localStorageDir,
1845
- extension: schemaProp.filenameSuffix,
1846
- };
1847
- }
1848
- if (schemaProp.required !== undefined) {
1849
- jsonProp.required = schemaProp.required;
1850
- }
1851
- convertedProperties[propName] = jsonProp;
1852
- }
1853
- }
1854
- // Create model definition in JSON import format
1855
- // Note: description is not passed - JSON files can have it but we ignore it at runtime
1856
- const jsonModelDef = {
1857
- properties: convertedProperties,
1858
- };
1859
- // Create Model instance
1860
- const ModelClass = await main_cjs.createModelFromJson(modelName, jsonModelDef, schemaName);
1861
- modelDefinitions[modelName] = ModelClass;
1862
- // Model is now accessible via Model static methods, no registration needed
1863
- logger(`Created model "${modelName}"`);
1864
- }
1865
- // Add models to database with modelFileIds
1866
- if (Object.keys(modelDefinitions).length > 0) {
1867
- await main_cjs.addModelsToDb(modelDefinitions, schemaRecord, undefined, {
1868
- schemaFileId: input.schemaContext.id, // id is the schemaFileId (string) in SchemaMachineContext
1869
- modelFileIds: input.modelFileIds.size > 0 ? input.modelFileIds : undefined,
1870
- });
1871
- logger(`Added ${Object.keys(modelDefinitions).length} new models to database`);
1872
- }
1873
- sendBack({
1874
- type: 'done',
1875
- output: { addedModels: input.models }
1876
- });
1877
- };
1878
- _persist().catch((error) => {
1879
- sendBack({ type: 'error', error: error instanceof Error ? error : new Error(String(error)) });
1880
- });
1881
- return () => {
1882
- // Cleanup
1883
- };
1884
- }),
1885
- },
1886
- }).createMachine({
1887
- id: 'addModels',
1888
- initial: 'preparing',
1889
- context: ({ input }) => ({
1890
- schemaContext: input.schemaContext,
1891
- models: input.models,
1892
- existingModels: input.existingModels,
1893
- progress: {
1894
- stage: 'preparing',
1895
- totalModels: Object.keys(input.models).length,
1896
- completedModels: 0,
1897
- },
1898
- }),
1899
- states: {
1900
- preparing: {
1901
- invoke: {
1902
- src: 'validateModels',
1903
- input: ({ context }) => ({
1904
- newModels: context.models,
1905
- existingModels: context.existingModels,
1906
- }),
1907
- onDone: {
1908
- target: 'creatingInstances',
1909
- actions: xstate.assign({
1910
- progress: ({ context }) => ({
1911
- ...context.progress,
1912
- stage: 'creatingInstances',
1913
- }),
1914
- }),
1915
- },
1916
- onError: {
1917
- target: 'error',
1918
- actions: xstate.assign({
1919
- errors: ({ context, event }) => [
1920
- ...(context.errors || []),
1921
- {
1922
- modelName: 'validation',
1923
- error: event.error instanceof Error ? event.error : new Error(String(event.error))
1924
- },
1925
- ],
1926
- }),
1927
- },
1928
- },
1929
- },
1930
- creatingInstances: {
1931
- invoke: {
1932
- src: 'createModelInstances',
1933
- input: ({ context }) => ({
1934
- schemaContext: context.schemaContext,
1935
- models: context.models,
1936
- }),
1937
- onDone: {
1938
- target: 'collectingIds',
1939
- actions: xstate.assign({
1940
- modelInstances: ({ event }) => {
1941
- // Type assertion needed due to XState v5 type inference limitation
1942
- const doneEvent = event;
1943
- return doneEvent.output?.modelInstances;
1944
- },
1945
- progress: ({ context }) => ({
1946
- ...context.progress,
1947
- stage: 'collectingIds',
1948
- }),
1949
- }),
1950
- },
1951
- onError: {
1952
- target: 'error',
1953
- actions: xstate.assign({
1954
- errors: ({ context, event }) => [
1955
- ...(context.errors || []),
1956
- {
1957
- modelName: 'createInstances',
1958
- error: event.error instanceof Error ? event.error : new Error(String(event.error))
1959
- },
1960
- ],
1961
- }),
1962
- },
1963
- },
1964
- },
1965
- collectingIds: {
1966
- invoke: {
1967
- src: 'collectModelFileIds',
1968
- input: ({ context }) => ({
1969
- modelInstances: context.modelInstances,
1970
- }),
1971
- onDone: {
1972
- target: 'persisting',
1973
- actions: xstate.assign({
1974
- modelFileIds: ({ event }) => {
1975
- // Type assertion needed due to XState v5 type inference limitation
1976
- const doneEvent = event;
1977
- return doneEvent.output?.modelFileIds;
1978
- },
1979
- progress: ({ context }) => ({
1980
- ...context.progress,
1981
- stage: 'persisting',
1982
- }),
1983
- }),
1984
- },
1985
- onError: {
1986
- target: 'error',
1987
- actions: xstate.assign({
1988
- errors: ({ context, event }) => [
1989
- ...(context.errors || []),
1990
- {
1991
- modelName: 'collectIds',
1992
- error: event.error instanceof Error ? event.error : new Error(String(event.error))
1993
- },
1994
- ],
1995
- }),
1996
- },
1997
- },
1998
- },
1999
- persisting: {
2000
- invoke: {
2001
- src: 'persistModelsToDb',
2002
- input: ({ context }) => ({
2003
- schemaContext: context.schemaContext,
2004
- models: context.models,
2005
- modelFileIds: context.modelFileIds,
2006
- }),
2007
- onDone: {
2008
- target: '#addModels.success',
2009
- actions: xstate.assign({
2010
- addedModels: ({ event }) => {
2011
- // Type assertion needed due to XState v5 type inference limitation
2012
- // Convert through unknown first to avoid type overlap error
2013
- const doneEvent = event;
2014
- return { addedModels: doneEvent.output?.addedModels };
2015
- },
2016
- }),
2017
- },
2018
- onError: {
2019
- target: 'error',
2020
- actions: xstate.assign({
2021
- errors: ({ context, event }) => [
2022
- ...(context.errors || []),
2023
- { modelName: 'persist', error: event.error instanceof Error ? event.error : new Error(String(event.error)) },
2024
- ],
2025
- }),
2026
- },
2027
- },
2028
- },
2029
- success: {
2030
- id: 'success',
2031
- type: 'final',
2032
- output: ({ context }) => ({ addedModels: context.addedModels?.addedModels || [] }),
2033
- },
2034
- error: {
2035
- type: 'final',
2036
- output: ({ context }) => ({
2037
- errors: context.errors || [],
2038
- }),
2039
- },
2040
- },
2041
- });
2042
-
2043
1469
  const logger$c = debug('seedSdk:schema:actors:checkExistingSchema');
2044
1470
  /**
2045
1471
  * Query model IDs (schemaFileId) from database for a given schema
@@ -2089,12 +1515,12 @@ const getSchemaFilePath$1 = (name, version, schemaFileId) => {
2089
1515
  /**
2090
1516
  * Create Model instances for all model IDs to ensure they're cached
2091
1517
  */
2092
- const createModelInstances$1 = async (modelIds) => {
1518
+ const createModelInstances$1 = async (modelIds, evictionEpoch) => {
2093
1519
  if (modelIds.length === 0) {
2094
1520
  return;
2095
1521
  }
2096
1522
  try {
2097
- const mod = await Promise.resolve().then(function () { return require('./index-CSNtEnbF.js'); }).then(function (n) { return n.Model$1; });
1523
+ const mod = await Promise.resolve().then(function () { return require('./index-Cvvt0-5B.js'); }).then(function (n) { return n.Model$1; });
2098
1524
  const Model = mod?.Model ?? mod?.default;
2099
1525
  if (!Model) {
2100
1526
  logger$c('Model not available from dynamic import');
@@ -2102,7 +1528,8 @@ const createModelInstances$1 = async (modelIds) => {
2102
1528
  }
2103
1529
  const createPromises = modelIds.map(async (modelFileId) => {
2104
1530
  try {
2105
- const model = await Model.createById(modelFileId);
1531
+ // Not if the schema was evicted (Schema.destroy, test cleanup) since this check started
1532
+ const model = await Model.createById(modelFileId, { evictionEpoch });
2106
1533
  if (model) {
2107
1534
  logger$c(`Created/cached Model instance for modelFileId "${modelFileId}"`);
2108
1535
  }
@@ -2119,6 +1546,7 @@ const createModelInstances$1 = async (modelIds) => {
2119
1546
  }
2120
1547
  };
2121
1548
  const checkExistingSchema = xstate.fromCallback(({ sendBack, input: { context } }) => {
1549
+ const evictionEpoch = main_cjs.currentEvictionEpoch();
2122
1550
  const _check = async () => {
2123
1551
  const { schemaName } = context;
2124
1552
  if (!schemaName) {
@@ -2139,7 +1567,7 @@ const checkExistingSchema = xstate.fromCallback(({ sendBack, input: { context }
2139
1567
  if (isInternal && schemaName === main_cjs.SEED_PROTOCOL_SCHEMA_NAME) {
2140
1568
  // For Seed Protocol, check if it exists in database
2141
1569
  try {
2142
- const internalSchema = await Promise.resolve().then(function () { return require('./index-CSNtEnbF.js'); }).then(function (n) { return n.SEEDPROTOCOL_Seed_Protocol_v1; });
1570
+ const internalSchema = await Promise.resolve().then(function () { return require('./index-Cvvt0-5B.js'); }).then(function (n) { return n.SEEDPROTOCOL_Seed_Protocol_v1; });
2143
1571
  const schemaFile = internalSchema.default;
2144
1572
  if (db && schemaFile.id) {
2145
1573
  const existing = await db
@@ -2152,7 +1580,7 @@ const checkExistingSchema = xstate.fromCallback(({ sendBack, input: { context }
2152
1580
  let modelIds = [];
2153
1581
  if (schemaRecord.id) {
2154
1582
  modelIds = await getModelIdsForSchema(schemaRecord.id);
2155
- await createModelInstances$1(modelIds);
1583
+ await createModelInstances$1(modelIds, evictionEpoch);
2156
1584
  }
2157
1585
  sendBack({
2158
1586
  type: 'schemaFound',
@@ -2359,7 +1787,7 @@ const checkExistingSchema = xstate.fromCallback(({ sendBack, input: { context }
2359
1787
  let modelIds = [];
2360
1788
  if (dbSchema.id) {
2361
1789
  modelIds = await getModelIdsForSchema(dbSchema.id);
2362
- await createModelInstances$1(modelIds);
1790
+ await createModelInstances$1(modelIds, evictionEpoch);
2363
1791
  }
2364
1792
  const loadedAt = Date.now();
2365
1793
  const dbVersion = dbSchema.version || schemaFile.version;
@@ -2413,7 +1841,7 @@ const checkExistingSchema = xstate.fromCallback(({ sendBack, input: { context }
2413
1841
  let modelIds = [];
2414
1842
  if (matchingDraft.id) {
2415
1843
  modelIds = await getModelIdsForSchema(matchingDraft.id);
2416
- await createModelInstances$1(modelIds);
1844
+ await createModelInstances$1(modelIds, evictionEpoch);
2417
1845
  }
2418
1846
  const loadedAt = Date.now();
2419
1847
  const dbVersion = matchingDraft.version || schemaFile.version;
@@ -2448,7 +1876,7 @@ const checkExistingSchema = xstate.fromCallback(({ sendBack, input: { context }
2448
1876
  .limit(1);
2449
1877
  if (schemaRecords.length > 0 && schemaRecords[0].id) {
2450
1878
  modelIds = await getModelIdsForSchema(schemaRecords[0].id);
2451
- await createModelInstances$1(modelIds);
1879
+ await createModelInstances$1(modelIds, evictionEpoch);
2452
1880
  }
2453
1881
  }
2454
1882
  }
@@ -2497,7 +1925,7 @@ const writeSchemaToDb = xstate.fromCallback(({ sendBack, input }) => {
2497
1925
  if (isInternal && schemaName === main_cjs.SEED_PROTOCOL_SCHEMA_NAME) {
2498
1926
  // For Seed Protocol, load from internal file
2499
1927
  logger$b(`Loading internal Seed Protocol schema from SDK`);
2500
- const internalSchema = await Promise.resolve().then(function () { return require('./index-CSNtEnbF.js'); }).then(function (n) { return n.SEEDPROTOCOL_Seed_Protocol_v1; });
1928
+ const internalSchema = await Promise.resolve().then(function () { return require('./index-Cvvt0-5B.js'); }).then(function (n) { return n.SEEDPROTOCOL_Seed_Protocol_v1; });
2501
1929
  finalSchema = internalSchema.default;
2502
1930
  const db = main_cjs.BaseDb.getAppDb();
2503
1931
  if (db && finalSchema.id) {
@@ -2954,6 +2382,7 @@ const logger$7 = debug('seedSdk:schema:actors:createModelInstances');
2954
2382
  * This ensures that Model.getById() in Schema.getContext() will find the instances
2955
2383
  */
2956
2384
  const createModelInstances = xstate.fromCallback(({ sendBack, input }) => {
2385
+ const evictionEpoch = main_cjs.currentEvictionEpoch();
2957
2386
  const _create = async () => {
2958
2387
  const { modelIds, schemaName } = input;
2959
2388
  if (modelIds.length === 0) {
@@ -2965,13 +2394,14 @@ const createModelInstances = xstate.fromCallback(({ sendBack, input }) => {
2965
2394
  return;
2966
2395
  }
2967
2396
  try {
2968
- const modelMod = await Promise.resolve().then(function () { return require('./index-CSNtEnbF.js'); }).then(function (n) { return n.Model$1; });
2397
+ const modelMod = await Promise.resolve().then(function () { return require('./index-Cvvt0-5B.js'); }).then(function (n) { return n.Model$1; });
2969
2398
  const { Model } = modelMod;
2970
2399
  // Create instances for all model IDs in parallel
2971
2400
  // Model.createById() will check cache first, then query DB and create if needed
2972
2401
  const createPromises = modelIds.map(async (modelFileId) => {
2973
2402
  try {
2974
- const model = await Model.createById(modelFileId);
2403
+ // Not if the schema was evicted (Schema.destroy, test cleanup) since this started
2404
+ const model = await Model.createById(modelFileId, { evictionEpoch });
2975
2405
  if (model) {
2976
2406
  logger$7(`Created/cached Model instance for modelFileId "${modelFileId}"`);
2977
2407
  return true;
@@ -3051,7 +2481,7 @@ const verifyModelInstancesInCache = xstate.fromCallback(({ sendBack, input }) =>
3051
2481
  }
3052
2482
  try {
3053
2483
  const result = await verifyWithRetry$2(async () => {
3054
- const modelMod = await Promise.resolve().then(function () { return require('./index-CSNtEnbF.js'); }).then(function (n) { return n.Model$1; });
2484
+ const modelMod = await Promise.resolve().then(function () { return require('./index-Cvvt0-5B.js'); }).then(function (n) { return n.Model$1; });
3055
2485
  const { Model } = modelMod;
3056
2486
  // Check each model ID in the cache
3057
2487
  const verifiedInstances = [];
@@ -3108,7 +2538,7 @@ const writePropertiesToDb = xstate.fromCallback(({ sendBack, input }) => {
3108
2538
  const _write = async () => {
3109
2539
  const { modelIds } = input;
3110
2540
  try {
3111
- const modelSchemaMod = await Promise.resolve().then(function () { return require('./index-CSNtEnbF.js'); }).then(function (n) { return n.ModelSchema; });
2541
+ const modelSchemaMod = await Promise.resolve().then(function () { return require('./index-Cvvt0-5B.js'); }).then(function (n) { return n.ModelSchema; });
3112
2542
  const { models: modelsTable, properties: propertiesTable } = modelSchemaMod;
3113
2543
  const drizzleMod = await import('drizzle-orm');
3114
2544
  const { eq } = drizzleMod;
@@ -3296,9 +2726,9 @@ const createPropertyInstances = xstate.fromCallback(({ sendBack, input }) => {
3296
2726
  return;
3297
2727
  }
3298
2728
  try {
3299
- const modProp = await Promise.resolve().then(function () { return require('./ModelProperty-D9FGaGuE.js'); });
2729
+ const modProp = await Promise.resolve().then(function () { return require('./ModelProperty-Dv7AQfmQ.js'); });
3300
2730
  const ModelProperty = modProp?.ModelProperty ?? modProp?.default;
3301
- const modModel = await Promise.resolve().then(function () { return require('./index-CSNtEnbF.js'); }).then(function (n) { return n.Model$1; });
2731
+ const modModel = await Promise.resolve().then(function () { return require('./index-Cvvt0-5B.js'); }).then(function (n) { return n.Model$1; });
3302
2732
  const Model = modModel?.Model ?? modModel?.default;
3303
2733
  if (!ModelProperty || !Model) {
3304
2734
  logger$3('ModelProperty or Model not available from dynamic import');
@@ -3403,7 +2833,7 @@ const verifyPropertyInstancesInCache = xstate.fromCallback(({ sendBack, input })
3403
2833
  }
3404
2834
  try {
3405
2835
  const result = await verifyWithRetry(async () => {
3406
- const mod = await Promise.resolve().then(function () { return require('./ModelProperty-D9FGaGuE.js'); });
2836
+ const mod = await Promise.resolve().then(function () { return require('./ModelProperty-Dv7AQfmQ.js'); });
3407
2837
  const ModelProperty = mod?.ModelProperty ?? mod?.default;
3408
2838
  if (!ModelProperty) {
3409
2839
  throw new Error('ModelProperty not available from dynamic import');
@@ -3463,7 +2893,6 @@ const schemaMachine = xstate.setup({
3463
2893
  actors: {
3464
2894
  loadOrCreateSchema,
3465
2895
  validateSchema,
3466
- addModelsMachine,
3467
2896
  writeProcessMachine: main_cjs.writeProcessMachine,
3468
2897
  // Staged loading actors
3469
2898
  checkExistingSchema,
@@ -3482,9 +2911,6 @@ const schemaMachine = xstate.setup({
3482
2911
  isSchemaValid: ({ context }) => {
3483
2912
  return !context._validationErrors || context._validationErrors.length === 0;
3484
2913
  },
3485
- hasValidationErrors: ({ context }) => {
3486
- return !!context._validationErrors && context._validationErrors.length > 0;
3487
- },
3488
2914
  },
3489
2915
  }).createMachine({
3490
2916
  id: 'schema',
@@ -3568,22 +2994,15 @@ const schemaMachine = xstate.setup({
3568
2994
  }),
3569
2995
  },
3570
2996
  destroyStarted: {
3571
- actions: xstate.assign({ _destroyInProgress: true, _destroyError: null }),
3572
- },
3573
- destroyDone: {
3574
- actions: xstate.assign({ _destroyInProgress: false }),
2997
+ actions: xstate.assign({ _destroyError: null }),
3575
2998
  },
3576
2999
  destroyError: {
3577
3000
  actions: xstate.assign(({ event }) => ({
3578
- _destroyInProgress: false,
3579
3001
  _destroyError: event.error instanceof Error
3580
3002
  ? { message: event.error.message, name: event.error.name }
3581
3003
  : { message: String(event.error) },
3582
3004
  })),
3583
3005
  },
3584
- clearDestroyError: {
3585
- actions: xstate.assign({ _destroyError: null }),
3586
- },
3587
3006
  },
3588
3007
  states: {
3589
3008
  loading: {
@@ -3972,9 +3391,6 @@ const schemaMachine = xstate.setup({
3972
3391
  },
3973
3392
  }),
3974
3393
  on: {
3975
- addModels: {
3976
- target: 'addingModels',
3977
- },
3978
3394
  validateSchema: {
3979
3395
  target: 'validating',
3980
3396
  },
@@ -3992,122 +3408,27 @@ const schemaMachine = xstate.setup({
3992
3408
  },
3993
3409
  },
3994
3410
  },
3995
- always: {
3996
- guard: 'hasValidationErrors',
3997
- target: 'validating',
3998
- },
3999
- },
4000
- addingModels: {
4001
- entry: xstate.assign({
4002
- // Move first pending item to current if not already set
4003
- _pendingModelAdditions: ({ context, event }) => {
4004
- const pending = context._pendingModelAdditions || [];
4005
- // If event has models, it's a new request - add to queue if we're already processing
4006
- if (event.models) {
4007
- return [
4008
- ...pending,
4009
- {
4010
- models: event.models,
4011
- timestamp: Date.now(),
4012
- },
4013
- ];
4014
- }
4015
- return pending;
4016
- },
4017
- }),
4018
- invoke: {
4019
- src: 'addModelsMachine',
4020
- input: ({ context }) => {
4021
- // Get models from first item in pending queue, or from context if queue is empty
4022
- const pending = context._pendingModelAdditions || [];
4023
- const models = pending.length > 0 ? pending[0].models : {};
4024
- return {
4025
- schemaContext: context,
4026
- models,
4027
- existingModels: context.models || {},
4028
- };
4029
- },
4030
- onDone: {
4031
- actions: [
4032
- xstate.assign({
4033
- models: ({ context, event }) => {
4034
- const addedModels = event.output?.addedModels || {};
4035
- return {
4036
- ...(context.models || {}),
4037
- ...addedModels,
4038
- };
4039
- },
4040
- _pendingModelAdditions: ({ context }) => {
4041
- // Remove first item from queue (the one we just processed)
4042
- const pending = context._pendingModelAdditions || [];
4043
- return pending.length > 1 ? pending.slice(1) : undefined;
4044
- },
4045
- }),
4046
- // Trigger validation after models are added
4047
- ({ self }) => {
4048
- self.send({ type: 'validateSchema' });
4049
- },
4050
- ],
4051
- },
4052
- onError: {
4053
- actions: xstate.assign({
4054
- _modelAdditionErrors: ({ context, event }) => {
4055
- const existing = context._modelAdditionErrors || [];
4056
- return [
4057
- ...existing,
4058
- {
4059
- error: event.error instanceof Error ? event.error : new Error(String(event.error)),
4060
- timestamp: Date.now(),
4061
- },
4062
- ];
4063
- },
4064
- _pendingModelAdditions: ({ context }) => {
4065
- // Remove first item from queue even on error, so we can process next
4066
- const pending = context._pendingModelAdditions || [];
4067
- return pending.length > 1 ? pending.slice(1) : undefined;
4068
- },
4069
- }),
4070
- },
4071
- },
4072
- on: {
4073
- // Queue additional requests while processing
4074
- addModels: {
4075
- actions: xstate.assign({
4076
- _pendingModelAdditions: ({ context, event }) => {
4077
- const existing = context._pendingModelAdditions || [];
4078
- return [
4079
- ...existing,
4080
- {
4081
- models: event.models,
4082
- timestamp: Date.now(),
4083
- },
4084
- ];
4085
- },
4086
- }),
4087
- },
4088
- },
4089
- always: [
4090
- {
4091
- // If there are pending additions after processing, process next one
4092
- guard: ({ context }) => {
4093
- const pending = context._pendingModelAdditions || [];
4094
- return pending.length > 0;
4095
- },
4096
- target: 'addingModels',
4097
- },
4098
- {
4099
- // No more pending, return to idle
4100
- target: 'idle',
4101
- },
4102
- ],
3411
+ // No `always: hasValidationErrors -> validating` here: validation is re-run when the context changes
3412
+ // (updateContext) or on request (validateSchema). Re-entering while errors exist would loop
3413
+ // forever on a schema that is still invalid.
4103
3414
  },
4104
3415
  validating: {
4105
3416
  on: {
3417
+ // These state-level handlers take precedence over the root ones, so they must store the result
3418
+ // themselves.
4106
3419
  validationSuccess: {
4107
3420
  target: 'idle',
3421
+ actions: xstate.assign(({ context }) => ({
3422
+ ...context,
3423
+ _validationErrors: [],
3424
+ })),
4108
3425
  },
4109
3426
  validationError: {
4110
3427
  target: 'idle',
3428
+ actions: xstate.assign(({ context, event }) => ({
3429
+ ...context,
3430
+ _validationErrors: event.errors,
3431
+ })),
4111
3432
  },
4112
3433
  },
4113
3434
  invoke: {
@@ -4248,7 +3569,6 @@ class Schema {
4248
3569
  // Initialize instance state in WeakMap (only non-serializable resources)
4249
3570
  schemaInstanceState.set(this, {
4250
3571
  liveQuerySubscription: null,
4251
- modelInstances: new Map(),
4252
3572
  });
4253
3573
  // Set up liveQuery subscription for cross-instance model updates
4254
3574
  // This will be initialized once we have the schemaId
@@ -4458,118 +3778,10 @@ class Schema {
4458
3778
  }
4459
3779
  }
4460
3780
  else if (prop === 'models') {
4461
- // Models are read-only computed values from Model instances
4462
- // Cannot be set directly - models are managed via Model instances
4463
- throw new Error('Cannot set schema.models directly. Models are computed from Model instances.');
4464
- /* DISABLED CODE - See comment above
4465
- // Convert array of Model instances or plain objects back to object format
4466
- let modelsObject: { [key: string]: any }
4467
- if (Array.isArray(value)) {
4468
- modelsObject = {}
4469
- const seenNames = new Set<string>()
4470
-
4471
- // Check for duplicate model names
4472
- for (const model of value) {
4473
- // Handle Model instances
4474
- if (model instanceof Model) {
4475
- const modelName = model.modelName!
4476
- if (seenNames.has(modelName)) {
4477
- throw new Error(
4478
- `Duplicate model name detected: "${modelName}". Each model must have a unique name.`
4479
- )
4480
- }
4481
- seenNames.add(modelName)
4482
- modelsObject[modelName] = {
4483
- properties: model.properties || {},
4484
- }
4485
- } else if (model && typeof model === 'object' && 'name' in model) {
4486
- // Handle plain objects
4487
- const modelName = model.name as string
4488
- if (seenNames.has(modelName)) {
4489
- throw new Error(
4490
- `Duplicate model name detected: "${modelName}". Each model must have a unique name.`
4491
- )
4492
- }
4493
- seenNames.add(modelName)
4494
- const { name, ...modelData } = model
4495
- modelsObject[name] = modelData
4496
- }
4497
- }
4498
- } else {
4499
- modelsObject = value || {}
4500
- // Check for duplicates in object format too
4501
- const modelNames = Object.keys(modelsObject)
4502
- const seenNames = new Set<string>()
4503
- for (const modelName of modelNames) {
4504
- if (seenNames.has(modelName)) {
4505
- throw new Error(
4506
- `Duplicate model name detected: "${modelName}". Each model must have a unique name.`
4507
- )
4508
- }
4509
- seenNames.add(modelName)
4510
- }
4511
- }
4512
-
4513
- const context = newInstance._getSnapshotContext()
4514
-
4515
- // Check if service is still running before sending events
4516
- let snapshot = newInstance._service.getSnapshot()
4517
- const wasServiceStopped = snapshot.status === 'stopped'
4518
-
4519
- if (wasServiceStopped) {
4520
- logger(`Service is stopped, will restart before adding models`)
4521
- newInstance._service.start()
4522
- snapshot = newInstance._service.getSnapshot()
4523
- }
4524
-
4525
- // Check current state after potential restart
4526
- const currentState = snapshot.value
4527
- // Check if state is a loading state object (XState v5 nested states)
4528
- const isServiceLoading = typeof currentState === 'object' && 'loading' in currentState
4529
-
4530
- // If service is loading, wait for it to finish before adding models
4531
- if (isServiceLoading || wasServiceStopped) {
4532
- logger(`Service is ${isServiceLoading ? 'loading' : 'was stopped'}, will add models after loading completes`)
4533
-
4534
- const loadingSubscription = newInstance._service.subscribe((snapshot) => {
4535
- if (snapshot.value === 'idle') {
4536
- loadingSubscription.unsubscribe()
4537
- logger(`Service finished loading, sending addModels event`)
4538
- newInstance._service.send({
4539
- type: 'addModels',
4540
- models: modelsObject,
4541
- })
4542
- } else if (snapshot.value === 'error') {
4543
- loadingSubscription.unsubscribe()
4544
- logger(`Service failed to load, cannot add models`)
4545
- }
4546
- })
4547
- } else {
4548
- // Service is ready, send addModels event immediately
4549
- // The state machine will handle all the complexity (validation, instance creation, ID collection, persistence)
4550
- logger(`Service is ready, sending addModels event`)
4551
- newInstance._service.send({
4552
- type: 'addModels',
4553
- models: modelsObject,
4554
- })
4555
- }
4556
-
4557
- // Mark schema as draft when models change
4558
- newInstance._service.send({
4559
- type: 'markAsDraft',
4560
- propertyKey: 'schema:models',
4561
- })
4562
-
4563
- // Save draft to database immediately so changes persist
4564
- newInstance._saveDraftToDb().catch((error) => {
4565
- logger(`Failed to save draft to database: ${error instanceof Error ? error.message : String(error)}`)
4566
- })
4567
-
4568
- // Update client context so useSchema and useSchemas hooks reflect the change
4569
- newInstance._updateClientContext().catch(() => {
4570
- // Silently fail if not in browser environment
4571
- })
4572
- */
3781
+ // Models are read-only, computed from Model instances. Array assignment was removed because
3782
+ // the draft save could run before the new Model instances existed, losing them.
3783
+ throw new Error('Cannot set schema.models directly. Models are computed from Model instances; ' +
3784
+ 'use Model.create(modelName, schema, { properties }) to add one.');
4573
3785
  }
4574
3786
  else if (prop === 'createdAt' || prop === 'updatedAt') {
4575
3787
  // Update metadata object
@@ -4620,7 +3832,12 @@ class Schema {
4620
3832
  return schema;
4621
3833
  const readyPromise = main_cjs.waitForEntityIdle(schema, { timeout: readyTimeout }).then(() => schema);
4622
3834
  this.pendingSchemaByName.set(schemaName, readyPromise);
4623
- readyPromise.finally(() => this.pendingSchemaByName.delete(schemaName));
3835
+ // Clear on both outcomes without a .finally() chain: that derived promise would reject unhandled
3836
+ // whenever readyPromise does, even when the caller handles the rejection.
3837
+ const clearPending = () => {
3838
+ this.pendingSchemaByName.delete(schemaName);
3839
+ };
3840
+ readyPromise.then(clearPending, clearPending);
4624
3841
  return readyPromise;
4625
3842
  }
4626
3843
  /**
@@ -5181,13 +4398,19 @@ class Schema {
5181
4398
  _dbVersion: publishedSchema.version,
5182
4399
  });
5183
4400
  // Clear edited flags on all ModelProperty instances and in database
5184
- const modelPropertyMod = await Promise.resolve().then(function () { return require('./ModelProperty-D9FGaGuE.js'); });
4401
+ const modelPropertyMod = await Promise.resolve().then(function () { return require('./ModelProperty-Dv7AQfmQ.js'); });
5185
4402
  const { ModelProperty } = modelPropertyMod;
5186
4403
  for (const propertyKey of context._editedProperties) {
5187
4404
  const [modelName, propertyName] = propertyKey.split(':');
5188
- const cacheKey = `${modelName}:${propertyName}`;
5189
4405
  const ModelPropertyClass = ModelProperty;
5190
- const cachedInstance = ModelPropertyClass.instanceCache.get(cacheKey);
4406
+ // Model names are only unique per schema: pick this schema's instance, which may be keyed by id.
4407
+ const thisSchemaName = this.schemaName;
4408
+ const cachedInstance = [...ModelPropertyClass.instanceCache.values()].find(({ instance }) => {
4409
+ const ctx = instance.getService().getSnapshot().context;
4410
+ return (ctx.modelName === modelName &&
4411
+ ctx.name === propertyName &&
4412
+ (!ctx._schemaName || ctx._schemaName === thisSchemaName));
4413
+ });
5191
4414
  if (cachedInstance) {
5192
4415
  const modelProperty = cachedInstance.instance;
5193
4416
  modelProperty.getService().getSnapshot().context;
@@ -5198,12 +4421,10 @@ class Schema {
5198
4421
  // Clear isEdited flag in database
5199
4422
  try {
5200
4423
  if (db && modelName && propertyName) {
5201
- // Find model by name
5202
- const modelRecords = await db
5203
- .select({ id: main_cjs.models.id })
5204
- .from(main_cjs.models)
5205
- .where(drizzleOrm.eq(main_cjs.models.name, modelName))
5206
- .limit(1);
4424
+ // Find this schema's model by name
4425
+ const { resolveModelRecord } = await Promise.resolve().then(function () { return require('./index-Cvvt0-5B.js'); }).then(function (n) { return n.resolveModelRecord$1; });
4426
+ const modelRecord = await resolveModelRecord(modelName, { schemaName: thisSchemaName }, db);
4427
+ const modelRecords = modelRecord ? [modelRecord] : [];
5207
4428
  if (modelRecords.length > 0) {
5208
4429
  // Find property by name and modelId
5209
4430
  const propertyRecords = await db
@@ -5702,6 +4923,47 @@ class Schema {
5702
4923
  saveDraftLogger(`Removed schema from saving set (key: ${saveKey})`);
5703
4924
  }
5704
4925
  }
4926
+ /**
4927
+ * Force-evict the cached Schema instance(s) named `schemaName`, ignoring refCounts: stop their live
4928
+ * query and service. Schema.destroy does the same for itself. For code that deletes a schema's rows
4929
+ * without destroying it (test cleanup): a live Schema keeps re-creating its models from its live
4930
+ * query while their rows are being deleted.
4931
+ */
4932
+ static evict(schemaName) {
4933
+ const instances = new Set();
4934
+ for (const { instance } of Schema.instanceCacheById.values())
4935
+ instances.add(instance);
4936
+ for (const { instance } of Schema.instanceCacheByName.values())
4937
+ instances.add(instance);
4938
+ for (const instance of instances) {
4939
+ let context;
4940
+ try {
4941
+ context = instance._getSnapshotContext();
4942
+ }
4943
+ catch {
4944
+ continue;
4945
+ }
4946
+ if (context.schemaName !== schemaName)
4947
+ continue;
4948
+ main_cjs.clearDestroySubscriptions(instance, {
4949
+ instanceState: schemaInstanceState,
4950
+ onUnload: () => schemaInstanceState.delete(instance),
4951
+ });
4952
+ main_cjs.forceRemoveFromCaches(instance, {
4953
+ getCacheKeys: () => [context.id, context.schemaName].filter((k) => !!k),
4954
+ caches: [
4955
+ Schema.instanceCacheById,
4956
+ Schema.instanceCacheByName,
4957
+ ],
4958
+ });
4959
+ try {
4960
+ instance._service.stop();
4961
+ }
4962
+ catch {
4963
+ // Service might already be stopped
4964
+ }
4965
+ }
4966
+ }
5705
4967
  unload() {
5706
4968
  try {
5707
4969
  const context = this._getSnapshotContext();
@@ -5765,6 +5027,16 @@ class Schema {
5765
5027
  Schema.instanceCacheByName,
5766
5028
  ],
5767
5029
  });
5030
+ // The rows for this schema's models and properties are deleted below; evict their cached
5031
+ // instances too, or a re-import would get them back with dangling _dbIds.
5032
+ if (schemaName) {
5033
+ const evictedModelNames = main_cjs.Model.evictForSchema(schemaName);
5034
+ const { ModelProperty } = await Promise.resolve().then(function () { return require('./ModelProperty-Dv7AQfmQ.js'); });
5035
+ ModelProperty.evictForModels(evictedModelNames, schemaName);
5036
+ // Evicting stops new writes but not ones already running; let those land before deleting their rows
5037
+ const { waitForInFlightWrites } = await Promise.resolve().then(function () { return require('./index-Cvvt0-5B.js'); }).then(function (n) { return n.writeToDatabase; });
5038
+ await waitForInFlightWrites();
5039
+ }
5768
5040
  await main_cjs.runDestroyLifecycle(this, {
5769
5041
  getService: (instance) => instance._service,
5770
5042
  doDestroy: async () => {
@@ -5906,8 +5178,10 @@ class Schema {
5906
5178
  }
5907
5179
  },
5908
5180
  createChildInstances: async (ids) => {
5181
+ // One at a time: an eviction of this schema part way through stops the rest
5182
+ const evictionEpoch = main_cjs.currentEvictionEpoch();
5909
5183
  for (const id of ids) {
5910
- await main_cjs.Model.createById(id);
5184
+ await main_cjs.Model.createById(id, { evictionEpoch });
5911
5185
  }
5912
5186
  },
5913
5187
  queryInitialData: async (schemaId) => {
@@ -5977,12 +5251,6 @@ Schema.pendingSchemaByName = new Map();
5977
5251
  // Track which schemas are currently being saved to prevent concurrent saves
5978
5252
  Schema.savingSchemas = new Set();
5979
5253
 
5980
- var Schema$1 = /*#__PURE__*/Object.freeze({
5981
- __proto__: null,
5982
- Schema: Schema,
5983
- schemaInstanceState: schemaInstanceState
5984
- });
5985
-
5986
5254
  exports.Schema = Schema;
5987
5255
  exports.schemaInstanceState = schemaInstanceState;
5988
- //# sourceMappingURL=Schema-BiJIPLEL.js.map
5256
+ //# sourceMappingURL=Schema-BHVp1g-M.js.map