@dxos/echo 0.8.4-main.d05673bc65 → 0.8.4-main.dfabb4ec29

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 (280) hide show
  1. package/README.md +2 -2
  2. package/dist/lib/neutral/Annotation.mjs +5 -3
  3. package/dist/lib/neutral/Database.mjs +8 -4
  4. package/dist/lib/neutral/Entity.mjs +16 -14
  5. package/dist/lib/neutral/Err.mjs +1 -1
  6. package/dist/lib/neutral/Extension.mjs +18 -0
  7. package/dist/lib/neutral/Extension.mjs.map +7 -0
  8. package/dist/lib/neutral/Feed.mjs +21 -17
  9. package/dist/lib/neutral/Filter.mjs +21 -13
  10. package/dist/lib/neutral/Format.mjs +3 -3
  11. package/dist/lib/neutral/JsonSchema.mjs +8 -8
  12. package/dist/lib/neutral/Key.mjs +1 -1
  13. package/dist/lib/neutral/Migration.mjs +17 -0
  14. package/dist/lib/neutral/Migration.mjs.map +7 -0
  15. package/dist/lib/neutral/Obj.mjs +16 -13
  16. package/dist/lib/neutral/Order.mjs +1 -1
  17. package/dist/lib/neutral/Query.mjs +19 -16
  18. package/dist/lib/neutral/QueryResult.mjs +1 -1
  19. package/dist/lib/neutral/Ref.mjs +7 -7
  20. package/dist/lib/neutral/Relation.mjs +15 -14
  21. package/dist/lib/neutral/SchemaRegistry.mjs +1 -1
  22. package/dist/lib/neutral/Tag.mjs +14 -13
  23. package/dist/lib/neutral/Type.mjs +10 -10
  24. package/dist/lib/neutral/{chunk-FZO7LQO7.mjs → chunk-44HT3MEC.mjs} +2 -2
  25. package/dist/lib/neutral/{chunk-OENWMTE6.mjs → chunk-5SL5LDLD.mjs} +4 -2
  26. package/dist/lib/neutral/chunk-5SL5LDLD.mjs.map +7 -0
  27. package/dist/lib/neutral/{chunk-YWXWXIE5.mjs → chunk-6VIJV543.mjs} +2 -2
  28. package/dist/lib/neutral/{chunk-YWXWXIE5.mjs.map → chunk-6VIJV543.mjs.map} +2 -2
  29. package/dist/lib/neutral/{chunk-ANHVGJI4.mjs → chunk-7RVZT53K.mjs} +1 -1
  30. package/dist/lib/neutral/{chunk-BNCCGLJN.mjs → chunk-BICZKPQG.mjs} +1 -1
  31. package/dist/lib/neutral/{chunk-NEGC54NE.mjs → chunk-FHYIM4RD.mjs} +17 -19
  32. package/dist/lib/neutral/chunk-FHYIM4RD.mjs.map +7 -0
  33. package/dist/lib/neutral/{chunk-RMLF7JOZ.mjs → chunk-FZHVQEHN.mjs} +6 -22
  34. package/dist/lib/neutral/{chunk-RMLF7JOZ.mjs.map → chunk-FZHVQEHN.mjs.map} +3 -3
  35. package/dist/lib/neutral/chunk-GWFFC34K.mjs +50 -0
  36. package/dist/lib/neutral/chunk-GWFFC34K.mjs.map +7 -0
  37. package/dist/lib/neutral/{chunk-724GQYEN.mjs → chunk-HPNQTEEQ.mjs} +4 -4
  38. package/dist/lib/neutral/{chunk-UFDK26FO.mjs → chunk-LVGOVFDV.mjs} +12 -8
  39. package/dist/lib/neutral/chunk-LVGOVFDV.mjs.map +7 -0
  40. package/dist/lib/neutral/{chunk-43Y5DOS6.mjs → chunk-MPAI2MHO.mjs} +16 -66
  41. package/dist/lib/neutral/chunk-MPAI2MHO.mjs.map +7 -0
  42. package/dist/lib/neutral/{chunk-WYOKA6AE.mjs → chunk-N4B7FHQT.mjs} +2 -2
  43. package/dist/lib/neutral/{chunk-WYOKA6AE.mjs.map → chunk-N4B7FHQT.mjs.map} +1 -1
  44. package/dist/lib/neutral/{chunk-BOZZPUXE.mjs → chunk-O5LRY6CO.mjs} +12 -65
  45. package/dist/lib/neutral/chunk-O5LRY6CO.mjs.map +7 -0
  46. package/dist/lib/neutral/{chunk-UTBRYVQC.mjs → chunk-QGMIH2SN.mjs} +2 -2
  47. package/dist/lib/neutral/{chunk-VA2F47ZC.mjs → chunk-QXIANHKU.mjs} +68 -14
  48. package/dist/lib/neutral/chunk-QXIANHKU.mjs.map +7 -0
  49. package/dist/lib/neutral/{chunk-NXMFBIT5.mjs → chunk-RF7ZBZ4A.mjs} +59 -4
  50. package/dist/lib/neutral/chunk-RF7ZBZ4A.mjs.map +7 -0
  51. package/dist/lib/neutral/{chunk-DYDJBZEG.mjs → chunk-S7IMFVTB.mjs} +51 -21
  52. package/dist/lib/neutral/chunk-S7IMFVTB.mjs.map +7 -0
  53. package/dist/lib/neutral/{chunk-TQQZLKB7.mjs → chunk-SJKBWMJY.mjs} +193 -469
  54. package/dist/lib/neutral/chunk-SJKBWMJY.mjs.map +7 -0
  55. package/dist/lib/neutral/chunk-SUZMWP3Y.mjs +36 -0
  56. package/dist/lib/neutral/chunk-SUZMWP3Y.mjs.map +7 -0
  57. package/dist/lib/neutral/{chunk-NQRLRYJM.mjs → chunk-SW5CUSBY.mjs} +119 -12
  58. package/dist/lib/neutral/chunk-SW5CUSBY.mjs.map +7 -0
  59. package/dist/lib/neutral/{chunk-SEMVAGBM.mjs → chunk-TNBK56IN.mjs} +19 -24
  60. package/dist/lib/neutral/chunk-TNBK56IN.mjs.map +7 -0
  61. package/dist/lib/neutral/{chunk-B5OXLWZL.mjs → chunk-TRPZU2HV.mjs} +2 -2
  62. package/dist/lib/neutral/{chunk-UI6MWK5W.mjs → chunk-TTCSATUD.mjs} +1 -1
  63. package/dist/lib/neutral/{chunk-OMUPQMLR.mjs → chunk-V72DY6LU.mjs} +1 -1
  64. package/dist/lib/neutral/{chunk-KTAWP7GI.mjs → chunk-VGKLHHRT.mjs} +42 -7
  65. package/dist/lib/neutral/chunk-VGKLHHRT.mjs.map +7 -0
  66. package/dist/lib/neutral/{chunk-FXEG7EOK.mjs → chunk-VYAGNFSJ.mjs} +3 -3
  67. package/dist/lib/neutral/{chunk-CIRHIEMW.mjs → chunk-WRVRDZDA.mjs} +18 -46
  68. package/dist/lib/neutral/chunk-WRVRDZDA.mjs.map +7 -0
  69. package/dist/lib/neutral/{chunk-UBEZSGXY.mjs → chunk-ZISMEVKD.mjs} +1 -1
  70. package/dist/lib/neutral/{chunk-UBEZSGXY.mjs.map → chunk-ZISMEVKD.mjs.map} +2 -2
  71. package/dist/lib/neutral/index.mjs +38 -28
  72. package/dist/lib/neutral/internal/index.mjs +15 -9
  73. package/dist/lib/neutral/meta.json +1 -1
  74. package/dist/lib/neutral/testing/index.mjs +185 -129
  75. package/dist/lib/neutral/testing/index.mjs.map +3 -3
  76. package/dist/types/src/Annotation.d.ts +1 -1
  77. package/dist/types/src/Annotation.d.ts.map +1 -1
  78. package/dist/types/src/Collection.d.ts.map +1 -1
  79. package/dist/types/src/Database.d.ts +13 -1
  80. package/dist/types/src/Database.d.ts.map +1 -1
  81. package/dist/types/src/Dataset.d.ts +2 -1
  82. package/dist/types/src/Dataset.d.ts.map +1 -1
  83. package/dist/types/src/Entity.d.ts +17 -11
  84. package/dist/types/src/Entity.d.ts.map +1 -1
  85. package/dist/types/src/Err.d.ts +18 -18
  86. package/dist/types/src/Err.d.ts.map +1 -1
  87. package/dist/types/src/Extension.d.ts +80 -0
  88. package/dist/types/src/Extension.d.ts.map +1 -0
  89. package/dist/types/src/Extension.test.d.ts +2 -0
  90. package/dist/types/src/Extension.test.d.ts.map +1 -0
  91. package/dist/types/src/Feed.d.ts +37 -20
  92. package/dist/types/src/Feed.d.ts.map +1 -1
  93. package/dist/types/src/Filter.d.ts +33 -4
  94. package/dist/types/src/Filter.d.ts.map +1 -1
  95. package/dist/types/src/Filter.test.d.ts +2 -0
  96. package/dist/types/src/Filter.test.d.ts.map +1 -0
  97. package/dist/types/src/Json.d.ts +33 -0
  98. package/dist/types/src/Json.d.ts.map +1 -0
  99. package/dist/types/src/Json.test.d.ts +2 -0
  100. package/dist/types/src/Json.test.d.ts.map +1 -0
  101. package/dist/types/src/JsonSchema.d.ts +1 -1
  102. package/dist/types/src/Migration.d.ts +57 -0
  103. package/dist/types/src/Migration.d.ts.map +1 -0
  104. package/dist/types/src/Obj.d.ts +41 -27
  105. package/dist/types/src/Obj.d.ts.map +1 -1
  106. package/dist/types/src/Order.d.ts.map +1 -1
  107. package/dist/types/src/Query.d.ts +13 -2
  108. package/dist/types/src/Query.d.ts.map +1 -1
  109. package/dist/types/src/Ref.d.ts.map +1 -1
  110. package/dist/types/src/Relation.d.ts +17 -18
  111. package/dist/types/src/Relation.d.ts.map +1 -1
  112. package/dist/types/src/Tag.d.ts +2 -2
  113. package/dist/types/src/Tag.d.ts.map +1 -1
  114. package/dist/types/src/Type.d.ts +3 -3
  115. package/dist/types/src/Type.d.ts.map +1 -1
  116. package/dist/types/src/View.d.ts +1 -1
  117. package/dist/types/src/View.d.ts.map +1 -1
  118. package/dist/types/src/exemplars.test.d.ts +2 -0
  119. package/dist/types/src/exemplars.test.d.ts.map +1 -0
  120. package/dist/types/src/index.d.ts +3 -0
  121. package/dist/types/src/index.d.ts.map +1 -1
  122. package/dist/types/src/internal/Annotation/annotations.d.ts +12 -2
  123. package/dist/types/src/internal/Annotation/annotations.d.ts.map +1 -1
  124. package/dist/types/src/internal/Annotation/sorting.d.ts.map +1 -1
  125. package/dist/types/src/internal/Annotation/util.d.ts +1 -1
  126. package/dist/types/src/internal/Annotation/util.d.ts.map +1 -1
  127. package/dist/types/src/internal/Entity/api.d.ts.map +1 -1
  128. package/dist/types/src/internal/Entity/object.d.ts.map +1 -1
  129. package/dist/types/src/internal/Entity/relation.d.ts.map +1 -1
  130. package/dist/types/src/internal/Entity/version.d.ts.map +1 -1
  131. package/dist/types/src/internal/Format/date.d.ts.map +1 -1
  132. package/dist/types/src/internal/Format/format.d.ts.map +1 -1
  133. package/dist/types/src/internal/Format/number.d.ts.map +1 -1
  134. package/dist/types/src/internal/Format/object.d.ts.map +1 -1
  135. package/dist/types/src/internal/Format/types.d.ts.map +1 -1
  136. package/dist/types/src/internal/JsonSchema/json-schema-normalize.d.ts.map +1 -1
  137. package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts +28 -28
  138. package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts.map +1 -1
  139. package/dist/types/src/internal/JsonSchema/json-schema.d.ts +1 -1
  140. package/dist/types/src/internal/JsonSchema/json-schema.d.ts.map +1 -1
  141. package/dist/types/src/internal/Obj/clone.d.ts.map +1 -1
  142. package/dist/types/src/internal/Obj/common.d.ts.map +1 -1
  143. package/dist/types/src/internal/Obj/create-object.d.ts.map +1 -1
  144. package/dist/types/src/internal/Obj/deleted.d.ts.map +1 -1
  145. package/dist/types/src/internal/Obj/ids.d.ts.map +1 -1
  146. package/dist/types/src/internal/Obj/json-serializer.d.ts +4 -3
  147. package/dist/types/src/internal/Obj/json-serializer.d.ts.map +1 -1
  148. package/dist/types/src/internal/Obj/set-value.d.ts +1 -1
  149. package/dist/types/src/internal/Obj/set-value.d.ts.map +1 -1
  150. package/dist/types/src/internal/Obj/snapshot.d.ts.map +1 -1
  151. package/dist/types/src/internal/Query.d.ts +10 -0
  152. package/dist/types/src/internal/Query.d.ts.map +1 -0
  153. package/dist/types/src/internal/Ref/ref-array.d.ts.map +1 -1
  154. package/dist/types/src/internal/Ref/ref.d.ts +14 -1
  155. package/dist/types/src/internal/Ref/ref.d.ts.map +1 -1
  156. package/dist/types/src/internal/Type/compose.d.ts.map +1 -1
  157. package/dist/types/src/internal/Type/echo-schema.d.ts +2 -2
  158. package/dist/types/src/internal/Type/echo-schema.d.ts.map +1 -1
  159. package/dist/types/src/internal/Type/manipulation.d.ts.map +1 -1
  160. package/dist/types/src/internal/common/api/meta.d.ts +3 -3
  161. package/dist/types/src/internal/common/api/meta.d.ts.map +1 -1
  162. package/dist/types/src/internal/common/proxy/change-context.d.ts +1 -1
  163. package/dist/types/src/internal/common/proxy/change-context.d.ts.map +1 -1
  164. package/dist/types/src/internal/common/proxy/define-hidden-property.d.ts.map +1 -1
  165. package/dist/types/src/internal/common/proxy/errors.d.ts +1 -1
  166. package/dist/types/src/internal/common/proxy/errors.d.ts.map +1 -1
  167. package/dist/types/src/internal/common/proxy/event-batch.d.ts.map +1 -1
  168. package/dist/types/src/internal/common/proxy/json-serializer.d.ts.map +1 -1
  169. package/dist/types/src/internal/common/proxy/make-object.d.ts.map +1 -1
  170. package/dist/types/src/internal/common/proxy/ownership.d.ts.map +1 -1
  171. package/dist/types/src/internal/common/proxy/proxy-utils.d.ts.map +1 -1
  172. package/dist/types/src/internal/common/proxy/reactive-array.d.ts +1 -1
  173. package/dist/types/src/internal/common/proxy/reactive.d.ts +1 -1
  174. package/dist/types/src/internal/common/proxy/reactive.d.ts.map +1 -1
  175. package/dist/types/src/internal/common/proxy/reactive.test.d.ts +2 -0
  176. package/dist/types/src/internal/common/proxy/reactive.test.d.ts.map +1 -0
  177. package/dist/types/src/internal/common/proxy/schema-validator.d.ts.map +1 -1
  178. package/dist/types/src/internal/common/proxy/typed-handler.d.ts.map +1 -1
  179. package/dist/types/src/internal/common/types/base.d.ts.map +1 -1
  180. package/dist/types/src/internal/common/types/entity.d.ts +4 -4
  181. package/dist/types/src/internal/common/types/entity.d.ts.map +1 -1
  182. package/dist/types/src/internal/common/types/meta.d.ts.map +1 -1
  183. package/dist/types/src/internal/common/types/version.d.ts +1 -1
  184. package/dist/types/src/internal/index.d.ts +1 -0
  185. package/dist/types/src/internal/index.d.ts.map +1 -1
  186. package/dist/types/src/testing/test-data.d.ts +8 -8
  187. package/dist/types/src/testing/test-data.d.ts.map +1 -1
  188. package/dist/types/src/testing/test-schema.d.ts +53 -53
  189. package/dist/types/src/testing/test-schema.d.ts.map +1 -1
  190. package/dist/types/src/testing/util.d.ts.map +1 -1
  191. package/dist/types/tsconfig.tsbuildinfo +1 -1
  192. package/package.json +24 -14
  193. package/src/Annotation.ts +1 -0
  194. package/src/Collection.ts +5 -0
  195. package/src/Database.ts +49 -14
  196. package/src/Entity.ts +18 -12
  197. package/src/Extension.test.ts +235 -0
  198. package/src/Extension.ts +122 -0
  199. package/src/Feed.ts +79 -32
  200. package/src/Filter.test.ts +90 -0
  201. package/src/Filter.ts +66 -3
  202. package/src/Json.test.ts +175 -0
  203. package/src/Json.ts +102 -0
  204. package/src/Migration.ts +94 -0
  205. package/src/Obj.test.ts +105 -13
  206. package/src/Obj.ts +153 -33
  207. package/src/Query.test.ts +198 -8
  208. package/src/Query.ts +46 -1
  209. package/src/Relation.ts +24 -20
  210. package/src/Type.ts +1 -1
  211. package/src/View.ts +5 -0
  212. package/src/exemplars.test.ts +21 -0
  213. package/src/index.ts +4 -0
  214. package/src/internal/Annotation/annotations.test.ts +51 -2
  215. package/src/internal/Annotation/annotations.ts +33 -14
  216. package/src/internal/Annotation/sorting.ts +0 -1
  217. package/src/internal/Entity/api.ts +0 -1
  218. package/src/internal/Entity/object.ts +0 -1
  219. package/src/internal/Entity/version.ts +0 -1
  220. package/src/internal/Format/date.test.ts +0 -1
  221. package/src/internal/Format/format.test.ts +0 -1
  222. package/src/internal/JsonSchema/json-schema-type.ts +1 -1
  223. package/src/internal/JsonSchema/json-schema.test.ts +1 -2
  224. package/src/internal/JsonSchema/json-schema.ts +1 -2
  225. package/src/internal/Obj/clone.ts +1 -1
  226. package/src/internal/Obj/create-object.test.ts +2 -4
  227. package/src/internal/Obj/create-object.ts +2 -3
  228. package/src/internal/Obj/deleted.ts +1 -1
  229. package/src/internal/Obj/json-serializer.test.ts +4 -5
  230. package/src/internal/Obj/json-serializer.ts +22 -15
  231. package/src/internal/Obj/set-value.test.ts +24 -24
  232. package/src/internal/Obj/set-value.ts +1 -1
  233. package/src/internal/Query.ts +137 -0
  234. package/src/internal/Ref/ref-array.ts +0 -1
  235. package/src/internal/Ref/ref.test.ts +0 -1
  236. package/src/internal/Ref/ref.ts +18 -1
  237. package/src/internal/Type/compose.test.ts +0 -1
  238. package/src/internal/Type/echo-schema.ts +3 -4
  239. package/src/internal/Type/persistent-schema.ts +2 -2
  240. package/src/internal/common/README.md +1 -1
  241. package/src/internal/common/api/meta.ts +3 -3
  242. package/src/internal/common/proxy/change-context.ts +1 -1
  243. package/src/internal/common/proxy/change.test.ts +94 -94
  244. package/src/internal/common/proxy/errors.ts +2 -2
  245. package/src/internal/common/proxy/handler.test.ts +0 -2
  246. package/src/internal/common/proxy/make-object.ts +0 -1
  247. package/src/internal/common/proxy/ownership.ts +0 -1
  248. package/src/internal/common/proxy/reactive-array.ts +1 -1
  249. package/src/internal/common/proxy/reactive.test.ts +54 -0
  250. package/src/internal/common/proxy/reactive.ts +11 -3
  251. package/src/internal/common/proxy/typed-handler.test.ts +0 -1
  252. package/src/internal/common/proxy/typed-handler.ts +8 -10
  253. package/src/internal/common/proxy/typed-object.test.ts +2 -3
  254. package/src/internal/common/types/entity.ts +1 -1
  255. package/src/internal/common/types/meta.ts +0 -1
  256. package/src/internal/index.ts +1 -0
  257. package/src/testing/api.test.ts +0 -1
  258. package/src/testing/test-data.ts +157 -98
  259. package/dist/lib/neutral/chunk-43Y5DOS6.mjs.map +0 -7
  260. package/dist/lib/neutral/chunk-BOZZPUXE.mjs.map +0 -7
  261. package/dist/lib/neutral/chunk-CIRHIEMW.mjs.map +0 -7
  262. package/dist/lib/neutral/chunk-DYDJBZEG.mjs.map +0 -7
  263. package/dist/lib/neutral/chunk-KTAWP7GI.mjs.map +0 -7
  264. package/dist/lib/neutral/chunk-NEGC54NE.mjs.map +0 -7
  265. package/dist/lib/neutral/chunk-NQRLRYJM.mjs.map +0 -7
  266. package/dist/lib/neutral/chunk-NXMFBIT5.mjs.map +0 -7
  267. package/dist/lib/neutral/chunk-OENWMTE6.mjs.map +0 -7
  268. package/dist/lib/neutral/chunk-SEMVAGBM.mjs.map +0 -7
  269. package/dist/lib/neutral/chunk-TQQZLKB7.mjs.map +0 -7
  270. package/dist/lib/neutral/chunk-UFDK26FO.mjs.map +0 -7
  271. package/dist/lib/neutral/chunk-VA2F47ZC.mjs.map +0 -7
  272. /package/dist/lib/neutral/{chunk-FZO7LQO7.mjs.map → chunk-44HT3MEC.mjs.map} +0 -0
  273. /package/dist/lib/neutral/{chunk-ANHVGJI4.mjs.map → chunk-7RVZT53K.mjs.map} +0 -0
  274. /package/dist/lib/neutral/{chunk-BNCCGLJN.mjs.map → chunk-BICZKPQG.mjs.map} +0 -0
  275. /package/dist/lib/neutral/{chunk-724GQYEN.mjs.map → chunk-HPNQTEEQ.mjs.map} +0 -0
  276. /package/dist/lib/neutral/{chunk-UTBRYVQC.mjs.map → chunk-QGMIH2SN.mjs.map} +0 -0
  277. /package/dist/lib/neutral/{chunk-B5OXLWZL.mjs.map → chunk-TRPZU2HV.mjs.map} +0 -0
  278. /package/dist/lib/neutral/{chunk-UI6MWK5W.mjs.map → chunk-TTCSATUD.mjs.map} +0 -0
  279. /package/dist/lib/neutral/{chunk-OMUPQMLR.mjs.map → chunk-V72DY6LU.mjs.map} +0 -0
  280. /package/dist/lib/neutral/{chunk-FXEG7EOK.mjs.map → chunk-VYAGNFSJ.mjs.map} +0 -0
@@ -10,16 +10,16 @@ import {
10
10
  isRelationSchema,
11
11
  object,
12
12
  relation
13
- } from "./chunk-RMLF7JOZ.mjs";
14
- import "./chunk-TQQZLKB7.mjs";
15
- import "./chunk-YWXWXIE5.mjs";
16
- import "./chunk-BOZZPUXE.mjs";
17
- import "./chunk-B5OXLWZL.mjs";
18
- import "./chunk-43Y5DOS6.mjs";
19
- import "./chunk-NEGC54NE.mjs";
20
- import "./chunk-SEMVAGBM.mjs";
21
- import "./chunk-WYOKA6AE.mjs";
22
- import "./chunk-UBEZSGXY.mjs";
13
+ } from "./chunk-FZHVQEHN.mjs";
14
+ import "./chunk-SJKBWMJY.mjs";
15
+ import "./chunk-6VIJV543.mjs";
16
+ import "./chunk-O5LRY6CO.mjs";
17
+ import "./chunk-TRPZU2HV.mjs";
18
+ import "./chunk-MPAI2MHO.mjs";
19
+ import "./chunk-FHYIM4RD.mjs";
20
+ import "./chunk-TNBK56IN.mjs";
21
+ import "./chunk-N4B7FHQT.mjs";
22
+ import "./chunk-ZISMEVKD.mjs";
23
23
  import "./chunk-J5LGTIGS.mjs";
24
24
  export {
25
25
  PersistentType,
@@ -28,7 +28,7 @@ import {
28
28
  getOptionsAnnotation,
29
29
  getTypeEnum,
30
30
  typeToFormat
31
- } from "./chunk-B5OXLWZL.mjs";
31
+ } from "./chunk-TRPZU2HV.mjs";
32
32
  import {
33
33
  __export
34
34
  } from "./chunk-J5LGTIGS.mjs";
@@ -70,4 +70,4 @@ __export(Format_exports, {
70
70
  export {
71
71
  Format_exports
72
72
  };
73
- //# sourceMappingURL=chunk-FZO7LQO7.mjs.map
73
+ //# sourceMappingURL=chunk-44HT3MEC.mjs.map
@@ -3,6 +3,7 @@ import {
3
3
  FormInputAnnotation,
4
4
  GeneratorAnnotation,
5
5
  IconAnnotation,
6
+ IconFromRefAnnotation,
6
7
  LabelAnnotation,
7
8
  ReferenceAnnotation,
8
9
  SystemTypeAnnotation,
@@ -13,7 +14,7 @@ import {
13
14
  makeUserAnnotation,
14
15
  setDescriptionWithSchema,
15
16
  setLabelWithSchema
16
- } from "./chunk-SEMVAGBM.mjs";
17
+ } from "./chunk-TNBK56IN.mjs";
17
18
  import {
18
19
  __export
19
20
  } from "./chunk-J5LGTIGS.mjs";
@@ -25,6 +26,7 @@ __export(Annotation_exports, {
25
26
  FormInputAnnotation: () => FormInputAnnotation,
26
27
  GeneratorAnnotation: () => GeneratorAnnotation,
27
28
  IconAnnotation: () => IconAnnotation,
29
+ IconFromRefAnnotation: () => IconFromRefAnnotation,
28
30
  LabelAnnotation: () => LabelAnnotation,
29
31
  ReferenceAnnotation: () => ReferenceAnnotation,
30
32
  SystemTypeAnnotation: () => SystemTypeAnnotation,
@@ -42,4 +44,4 @@ export {
42
44
  make,
43
45
  Annotation_exports
44
46
  };
45
- //# sourceMappingURL=chunk-OENWMTE6.mjs.map
47
+ //# sourceMappingURL=chunk-5SL5LDLD.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/Annotation.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\n// @import-as-namespace\n\nexport {\n DescriptionAnnotation,\n FormInputAnnotation,\n GeneratorAnnotation,\n LabelAnnotation,\n ReferenceAnnotation,\n SystemTypeAnnotation,\n TypeAnnotation,\n getDescriptionWithSchema,\n getLabelWithSchema,\n getTypeAnnotation,\n setDescriptionWithSchema,\n setLabelWithSchema,\n IconAnnotation,\n IconFromRefAnnotation,\n} from './internal/Annotation';\n\nimport type * as Schema from 'effect/Schema';\n\nimport * as internalAnnotations from './internal/Annotation';\n\ninterface MakeProps<T> {\n id: string;\n schema: Schema.Schema<T, any, never>;\n}\n\n/**\n * Create a new schema annotation.\n * Annotation can be assigned both to fields and to the schema itself.\n * Annotation is serialized with the schema.\n *\n * @example\n * ```ts\n * const ColorAnnotation = Annotation.make({\n * id: 'org.dxos.annotation.color',\n * schema: Schema.String,\n * });\n *\n * const schema = Schema.String.annotations(ColorAnnotation.set('red'));\n * ```\n */\nexport const make: <T>(props: MakeProps<T>) => internalAnnotations.AnnotationHelper<T> =\n internalAnnotations.makeUserAnnotation;\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;;;;;;;;AA+CO,IAAMA,OACSC;",
6
+ "names": ["make", "makeUserAnnotation"]
7
+ }
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Ref
3
- } from "./chunk-43Y5DOS6.mjs";
3
+ } from "./chunk-MPAI2MHO.mjs";
4
4
 
5
5
  // src/internal/Ref/ref-array.ts
6
6
  import { isNonNullable } from "@dxos/util";
@@ -31,4 +31,4 @@ var RefArray = Object.freeze({
31
31
  export {
32
32
  RefArray
33
33
  };
34
- //# sourceMappingURL=chunk-YWXWXIE5.mjs.map
34
+ //# sourceMappingURL=chunk-6VIJV543.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/internal/Ref/ref-array.ts"],
4
- "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { type ObjectId } from '@dxos/keys';\nimport { isNonNullable } from '@dxos/util';\n\nimport { type AnyEntity } from '../common/types';\n\nimport { Ref } from './ref';\n\n/**\n * Helper functions for working with arrays of refs.\n */\nexport const RefArray = Object.freeze({\n /**\n * @returns all resolved targets.\n */\n targets: <T extends AnyEntity>(refs: readonly Ref<T>[]): T[] => {\n return refs.map((ref) => ref.target).filter(isNonNullable);\n },\n\n /**\n * Load all referenced objects.\n */\n loadAll: <T extends AnyEntity>(refs: readonly Ref<T>[]): Promise<T[]> => {\n return Promise.all(refs.map((ref) => ref.load()));\n },\n\n /**\n * Removes the ref with the given id.\n */\n removeById: (refs: Ref<AnyEntity>[], id: ObjectId) => {\n const index = refs.findIndex(Ref.hasObjectId(id));\n if (index >= 0) {\n refs.splice(index, 1);\n }\n },\n});\n"],
5
- "mappings": ";;;;;AAKA,SAASA,qBAAqB;AASvB,IAAMC,WAAWC,OAAOC,OAAO;;;;EAIpCC,SAAS,CAAsBC,SAAAA;AAC7B,WAAOA,KAAKC,IAAI,CAACC,QAAQA,IAAIC,MAAM,EAAEC,OAAOC,aAAAA;EAC9C;;;;EAKAC,SAAS,CAAsBN,SAAAA;AAC7B,WAAOO,QAAQC,IAAIR,KAAKC,IAAI,CAACC,QAAQA,IAAIO,KAAI,CAAA,CAAA;EAC/C;;;;EAKAC,YAAY,CAACV,MAAwBW,OAAAA;AACnC,UAAMC,QAAQZ,KAAKa,UAAUC,IAAIC,YAAYJ,EAAAA,CAAAA;AAC7C,QAAIC,SAAS,GAAG;AACdZ,WAAKgB,OAAOJ,OAAO,CAAA;IACrB;EACF;AACF,CAAA;",
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { type ObjectId } from '@dxos/keys';\nimport { isNonNullable } from '@dxos/util';\n\nimport { type AnyEntity } from '../common/types';\nimport { Ref } from './ref';\n\n/**\n * Helper functions for working with arrays of refs.\n */\nexport const RefArray = Object.freeze({\n /**\n * @returns all resolved targets.\n */\n targets: <T extends AnyEntity>(refs: readonly Ref<T>[]): T[] => {\n return refs.map((ref) => ref.target).filter(isNonNullable);\n },\n\n /**\n * Load all referenced objects.\n */\n loadAll: <T extends AnyEntity>(refs: readonly Ref<T>[]): Promise<T[]> => {\n return Promise.all(refs.map((ref) => ref.load()));\n },\n\n /**\n * Removes the ref with the given id.\n */\n removeById: (refs: Ref<AnyEntity>[], id: ObjectId) => {\n const index = refs.findIndex(Ref.hasObjectId(id));\n if (index >= 0) {\n refs.splice(index, 1);\n }\n },\n});\n"],
5
+ "mappings": ";;;;;AAKA,SAASA,qBAAqB;AAQvB,IAAMC,WAAWC,OAAOC,OAAO;;;;EAIpCC,SAAS,CAAsBC,SAAAA;AAC7B,WAAOA,KAAKC,IAAI,CAACC,QAAQA,IAAIC,MAAM,EAAEC,OAAOC,aAAAA;EAC9C;;;;EAKAC,SAAS,CAAsBN,SAAAA;AAC7B,WAAOO,QAAQC,IAAIR,KAAKC,IAAI,CAACC,QAAQA,IAAIO,KAAI,CAAA,CAAA;EAC/C;;;;EAKAC,YAAY,CAACV,MAAwBW,OAAAA;AACnC,UAAMC,QAAQZ,KAAKa,UAAUC,IAAIC,YAAYJ,EAAAA,CAAAA;AAC7C,QAAIC,SAAS,GAAG;AACdZ,WAAKgB,OAAOJ,OAAO,CAAA;IACrB;EACF;AACF,CAAA;",
6
6
  "names": ["isNonNullable", "RefArray", "Object", "freeze", "targets", "refs", "map", "ref", "target", "filter", "isNonNullable", "loadAll", "Promise", "all", "load", "removeById", "id", "index", "findIndex", "Ref", "hasObjectId", "splice"]
7
7
  }
@@ -18,4 +18,4 @@ export {
18
18
  SpaceId,
19
19
  ObjectId
20
20
  };
21
- //# sourceMappingURL=chunk-ANHVGJI4.mjs.map
21
+ //# sourceMappingURL=chunk-7RVZT53K.mjs.map
@@ -4,4 +4,4 @@ var SchemaRegistry_exports = {};
4
4
  export {
5
5
  SchemaRegistry_exports
6
6
  };
7
- //# sourceMappingURL=chunk-BNCCGLJN.mjs.map
7
+ //# sourceMappingURL=chunk-BICZKPQG.mjs.map
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  isInstanceOf
3
- } from "./chunk-SEMVAGBM.mjs";
3
+ } from "./chunk-TNBK56IN.mjs";
4
4
  import {
5
5
  ObjectNotFoundError
6
- } from "./chunk-UBEZSGXY.mjs";
6
+ } from "./chunk-ZISMEVKD.mjs";
7
7
  import {
8
8
  __export
9
9
  } from "./chunk-J5LGTIGS.mjs";
@@ -23,9 +23,11 @@ __export(Database_exports, {
23
23
  makeService: () => makeService,
24
24
  notAvailable: () => notAvailable,
25
25
  query: () => query,
26
+ registerSchema: () => registerSchema,
26
27
  remove: () => remove,
27
28
  resolve: () => resolve,
28
29
  runQuery: () => runQuery,
30
+ runQueryFirst: () => runQueryFirst,
29
31
  runSchemaQuery: () => runSchemaQuery,
30
32
  schemaQuery: () => schemaQuery,
31
33
  spaceId: () => spaceId
@@ -76,33 +78,27 @@ var resolve = (ref, schema) => Effect.gen(function* () {
76
78
  if (!object) {
77
79
  return yield* Effect.fail(new ObjectNotFoundError(dxn));
78
80
  }
79
- invariant(!schema || isInstanceOf(schema, object), "Object type mismatch.", {
80
- F: __dxlog_file,
81
- L: 230,
82
- S: this,
83
- A: [
84
- "!schema || isInstanceOf(schema, object)",
85
- "'Object type mismatch.'"
86
- ]
87
- });
81
+ invariant(!schema || isInstanceOf(schema, object), "Object type mismatch.", { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 67, S: this, A: ["!schema || isInstanceOf(schema, object)", "'Object type mismatch.'"] });
88
82
  return object;
89
- });
90
- var load = Effect.fn(function* (ref) {
83
+ }).pipe(Effect.withSpan("Database.resolve"));
84
+ var load = Effect.fn("Database.load")(function* (ref) {
91
85
  const object = yield* promiseWithCauseCapture(() => ref.tryLoad());
92
86
  if (!object) {
93
87
  return yield* Effect.fail(new ObjectNotFoundError(ref.dxn));
94
88
  }
95
89
  return object;
96
90
  });
97
- var loadOption = Effect.fn(function* (ref) {
91
+ var loadOption = Effect.fn("Database.loadOption")(function* (ref) {
98
92
  const object = yield* load(ref).pipe(Effect.catchTag("ObjectNotFoundError", () => Effect.succeed(void 0)));
99
93
  return Option.fromNullable(object);
100
94
  });
101
- var add = (obj) => Service.pipe(Effect.map(({ db }) => db.add(obj)));
102
- var remove = (obj) => Service.pipe(Effect.map(({ db }) => db.remove(obj)));
103
- var flush = (opts) => Service.pipe(Effect.flatMap(({ db }) => promiseWithCauseCapture(() => db.flush(opts))));
95
+ var add = (obj) => Service.pipe(Effect.map(({ db }) => db.add(obj))).pipe(Effect.withSpan("Database.add"));
96
+ var remove = (obj) => Service.pipe(Effect.map(({ db }) => db.remove(obj))).pipe(Effect.withSpan("Database.remove"));
97
+ var flush = (opts) => Service.pipe(Effect.flatMap(({ db }) => promiseWithCauseCapture(() => db.flush(opts)))).pipe(Effect.withSpan("Database.flush"));
104
98
  var query = (queryOrFilter) => Service.pipe(Effect.map(({ db }) => db.query(queryOrFilter)), Effect.withSpan("Database.query"));
105
- var runQuery = (queryOrFilter) => query(queryOrFilter).pipe(Effect.flatMap((queryResult) => promiseWithCauseCapture(() => queryResult.run())));
99
+ var runQuery = (queryOrFilter) => query(queryOrFilter).pipe(Effect.flatMap((queryResult) => promiseWithCauseCapture(() => queryResult.run())), Effect.withSpan("Database.runQuery"));
100
+ var runQueryFirst = (queryOrFilter) => query(queryOrFilter).pipe(Effect.flatMap((queryResult) => promiseWithCauseCapture(async () => Option.fromNullable(await queryResult.firstOrUndefined()))), Effect.withSpan("Database.runQueryFirst"));
101
+ var registerSchema = (input) => Service.pipe(Effect.flatMap(({ db }) => promiseWithCauseCapture(() => db.schemaRegistry.register(input))), Effect.withSpan("Database.registerSchema"));
106
102
  var schemaQuery = (schemaQueryOptions) => Service.pipe(Effect.map(({ db }) => db.schemaRegistry.query(schemaQueryOptions)), Effect.withSpan("Database.schemaQuery"));
107
103
  var runSchemaQuery = (schemaQueryOptions) => schemaQuery(schemaQueryOptions).pipe(Effect.flatMap((queryResult) => promiseWithCauseCapture(() => queryResult.run())));
108
104
 
@@ -123,8 +119,10 @@ export {
123
119
  flush,
124
120
  query,
125
121
  runQuery,
122
+ runQueryFirst,
123
+ registerSchema,
126
124
  schemaQuery,
127
125
  runSchemaQuery,
128
126
  Database_exports
129
127
  };
130
- //# sourceMappingURL=chunk-NEGC54NE.mjs.map
128
+ //# sourceMappingURL=chunk-FHYIM4RD.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/Database.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Context from 'effect/Context';\nimport * as Effect from 'effect/Effect';\nimport * as Layer from 'effect/Layer';\nimport * as Option from 'effect/Option';\nimport * as Schema from 'effect/Schema';\nimport type * as Types from 'effect/Types';\n\nimport { promiseWithCauseCapture } from '@dxos/effect';\nimport { invariant } from '@dxos/invariant';\nimport { DXN, type SpaceId } from '@dxos/keys';\n\nimport type * as Entity from './Entity';\nimport * as Err from './Err';\nimport type * as Filter from './Filter';\nimport type * as Hypergraph from './Hypergraph';\nimport { isInstanceOf } from './internal/Annotation';\nimport { type AnyProperties } from './internal/common/types';\nimport type { Ref } from './internal/Ref/ref';\nimport type * as Obj from './Obj';\nimport type * as Query from './Query';\nimport type * as QueryResult from './QueryResult';\nimport type * as SchemaRegistry from './SchemaRegistry';\nimport type * as Type from './Type';\n\n/**\n * `query` API function declaration.\n */\n// TODO(burdon): Reconcile Query and Filter (should only have one root type).\nexport interface QueryFn {\n <Q extends Query.Any>(query: Q): QueryResult.QueryResult<Query.Type<Q>>;\n <F extends Filter.Any>(filter: F): QueryResult.QueryResult<Filter.Type<F>>;\n}\n\n/**\n * Common interface for Database and Queue.\n */\nexport interface Queryable {\n query: QueryFn;\n}\n\nexport type GetObjectByIdOptions = {\n deleted?: boolean;\n};\n\nexport type ObjectPlacement = 'root-doc' | 'linked-doc';\n\nexport type AddOptions = {\n /**\n * Where to place the object in the Automerge document tree.\n * Root document is always loaded with the space.\n * Linked documents are loaded lazily.\n * Placing large number of objects in the root document may slow down the initial load.\n *\n * @default 'linked-doc'\n */\n placeIn?: ObjectPlacement;\n};\n\nexport type FlushOptions = {\n /**\n * Write any pending changes to disk.\n * @default true\n */\n disk?: boolean;\n\n /**\n * Wait for pending index updates.\n * @default true\n */\n indexes?: boolean;\n\n /**\n * Flush pending updates to objects and queries.\n * @default false\n */\n updates?: boolean;\n};\n\n/**\n * Identifier denoting an ECHO Database.\n */\nexport const TypeId = Symbol.for('@dxos/echo/Database');\nexport type TypeId = typeof TypeId;\n\n/**\n * ECHO Database interface.\n */\nexport interface Database extends Queryable {\n readonly [TypeId]: TypeId;\n\n get spaceId(): SpaceId;\n\n // TODO(burdon): Can we move this into graph?\n get schemaRegistry(): SchemaRegistry.SchemaRegistry;\n\n get graph(): Hypergraph.Hypergraph;\n\n toJSON(): object;\n\n /**\n * Return object by local ID.\n */\n getObjectById<T extends Obj.Unknown = Obj.OfShape<AnyProperties>>(\n id: string,\n opts?: GetObjectByIdOptions,\n ): T | undefined;\n\n /**\n * Query objects.\n */\n query: QueryFn;\n\n /**\n * Creates a reference to an existing object in the database.\n *\n * NOTE: The reference may be dangling if the object is not present in the database.\n * NOTE: Difference from `Ref.fromDXN`\n * `Ref.fromDXN(dxn)` returns an unhydrated reference. The `.load` and `.target` APIs will not work.\n * `db.makeRef(dxn)` is preferable in cases with access to the database.\n */\n makeRef<T extends Entity.Unknown = Entity.Unknown>(dxn: DXN): Ref<T>;\n\n /**\n * Adds object to the database.\n */\n add<T extends Entity.Unknown = Entity.Unknown>(obj: T, opts?: AddOptions): T;\n\n /**\n * Removes object from the database.\n */\n // TODO(burdon): Return true if removed (currently throws if not present).\n remove(obj: Entity.Unknown): void;\n\n /**\n * Wait for all pending changes to be saved to disk.\n * Optionaly waits for changes to be propagated to indexes and event handlers.\n */\n flush(opts?: FlushOptions): Promise<void>;\n}\n\nexport const isDatabase = (obj: unknown): obj is Database => {\n return obj ? typeof obj === 'object' && TypeId in obj && obj[TypeId] === TypeId : false;\n};\n\nexport const Database: Schema.Schema<Database> = Schema.Any.pipe(Schema.filter((space) => isDatabase(space)));\n\n/**\n * Effect service tag for Database dependency injection.\n */\nexport class Service extends Context.Tag('@dxos/echo/Database/Service')<\n Service,\n {\n readonly db: Database;\n }\n>() {}\n\n/**\n * Layer that provides a Database service that throws when accessed.\n * Useful as a default layer when no database is available.\n */\nexport const notAvailable = Layer.succeed(Service, {\n get db(): Database {\n throw new Error('Database not available');\n },\n});\n\n/**\n * Creates a Database service instance from a Database.\n */\nexport const makeService = (db: Database): Context.Tag.Service<Service> => {\n return {\n get db() {\n return db;\n },\n };\n};\n\n/**\n * Creates a Layer that provides the Database service.\n */\nexport const layer = (db: Database): Layer.Layer<Service> => {\n return Layer.succeed(Service, makeService(db));\n};\n\n/**\n * Returns the space ID of the database.\n */\nexport const spaceId = Effect.gen(function* () {\n const { db } = yield* Service;\n return db.spaceId;\n});\n\n/**\n * Resolves an object by its DXN.\n */\nexport const resolve: {\n // No type check.\n (ref: DXN | Ref<any>): Effect.Effect<Entity.Unknown, never, Service>;\n // Check matches schema.\n <S extends Type.AnyEntity>(\n ref: DXN | Ref<any>,\n schema: S,\n ): Effect.Effect<Schema.Schema.Type<S>, Err.ObjectNotFoundError, Service>;\n} = (<S extends Type.AnyEntity>(\n ref: DXN | Ref<any>,\n schema?: S,\n): Effect.Effect<Schema.Schema.Type<S>, Err.ObjectNotFoundError, Service> =>\n Effect.gen(function* () {\n const { db } = yield* Service;\n const dxn = ref instanceof DXN ? ref : ref.dxn;\n const object = yield* promiseWithCauseCapture(() =>\n db.graph\n .createRefResolver({\n context: {\n space: db.spaceId,\n },\n })\n .resolve(dxn),\n );\n\n if (!object) {\n return yield* Effect.fail(new Err.ObjectNotFoundError(dxn));\n }\n invariant(!schema || isInstanceOf(schema, object), 'Object type mismatch.');\n return object as any;\n }).pipe(Effect.withSpan('Database.resolve'))) as any;\n\n/**\n * Loads an object reference.\n */\nexport const load: <T>(ref: Ref<T>) => Effect.Effect<T, Err.ObjectNotFoundError, never> = Effect.fn('Database.load')(\n function* (ref) {\n const object = yield* promiseWithCauseCapture(() => ref.tryLoad());\n if (!object) {\n return yield* Effect.fail(new Err.ObjectNotFoundError(ref.dxn));\n }\n return object;\n },\n);\n\n/**\n * Loads an object reference option.\n */\n// TODO(dmaretskyi): Do we need this -- you can just use `Effect.catchTag` in calling code instead.\nexport const loadOption: <T>(ref: Ref<T>) => Effect.Effect<Option.Option<T>, never, never> = Effect.fn(\n 'Database.loadOption',\n)(function* (ref) {\n const object = yield* load(ref).pipe(Effect.catchTag('ObjectNotFoundError', () => Effect.succeed(undefined)));\n\n return Option.fromNullable(object);\n});\n\n/**\n * Adds an object to the database.\n * @see {@link Database.add}\n */\nexport const add = <T extends Entity.Unknown>(obj: T): Effect.Effect<T, never, Service> =>\n Service.pipe(Effect.map(({ db }) => db.add(obj))).pipe(Effect.withSpan('Database.add'));\n\n/**\n * Removes an object from the database.\n * @see {@link Database.remove}\n */\nexport const remove = <T extends Entity.Unknown>(obj: T): Effect.Effect<void, never, Service> =>\n Service.pipe(Effect.map(({ db }) => db.remove(obj))).pipe(Effect.withSpan('Database.remove'));\n\n/**\n * Flushes pending changes to disk.\n * @see {@link Database.flush}\n */\nexport const flush = (opts?: FlushOptions) =>\n Service.pipe(Effect.flatMap(({ db }) => promiseWithCauseCapture(() => db.flush(opts)))).pipe(\n Effect.withSpan('Database.flush'),\n );\n\n/**\n * Creates a `QueryResult` object that can be subscribed to.\n */\nexport const query: {\n <Q extends Query.Any>(query: Q): Effect.Effect<QueryResult.QueryResult<Query.Type<Q>>, never, Service>;\n <F extends Filter.Any>(filter: F): Effect.Effect<QueryResult.QueryResult<Filter.Type<F>>, never, Service>;\n} = (queryOrFilter: Query.Any | Filter.Any) =>\n Service.pipe(\n Effect.map(({ db }) => db.query(queryOrFilter as any) as QueryResult.QueryResult<any>),\n Effect.withSpan('Database.query'),\n );\n\n/**\n * Executes the query once and returns the results.\n */\nexport const runQuery: {\n <Q extends Query.Any>(query: Q): Effect.Effect<Query.Type<Q>[], never, Service>;\n <F extends Filter.Any>(filter: F): Effect.Effect<Filter.Type<F>[], never, Service>;\n} = (queryOrFilter: Query.Any | Filter.Any) =>\n query(queryOrFilter as any).pipe(\n Effect.flatMap((queryResult) => promiseWithCauseCapture(() => queryResult.run())),\n Effect.withSpan('Database.runQuery'),\n );\n\n/**\n * Executes the query once and returns the first result as or None.\n */\nexport const runQueryFirst: {\n <Q extends Query.Any>(query: Q): Effect.Effect<Option.Option<Query.Type<Q>>, never, Service>;\n <F extends Filter.Any>(filter: F): Effect.Effect<Option.Option<Filter.Type<F>>, never, Service>;\n} = (queryOrFilter: Query.Any | Filter.Any) =>\n query(queryOrFilter as any).pipe(\n Effect.flatMap((queryResult) =>\n promiseWithCauseCapture(async () => Option.fromNullable(await queryResult.firstOrUndefined())),\n ),\n Effect.withSpan('Database.runQueryFirst'),\n );\n\n/**\n * Persists schemas in the database so they replicate to other clients.\n * @see {@link SchemaRegistry.SchemaRegistry.register}\n */\nexport const registerSchema = (\n input: SchemaRegistry.RegisterSchemaInput[],\n): Effect.Effect<Type.RuntimeType[], never, Service> =>\n Service.pipe(\n Effect.flatMap(({ db }) => promiseWithCauseCapture(() => db.schemaRegistry.register(input))),\n Effect.withSpan('Database.registerSchema'),\n );\n\n/**\n * Creates a schema query result that can be subscribed to.\n */\n// TODO(dmaretskyi): Change API to `yield* Database.querySchema(...).first` and `yield* Database.querySchema(...).schema`.\nexport const schemaQuery = <Q extends Types.NoExcessProperties<SchemaRegistry.Query, Q>>(\n schemaQueryOptions?: Q & SchemaRegistry.Query,\n): Effect.Effect<QueryResult.QueryResult<SchemaRegistry.ExtractQueryResult<Q>>, never, Service> =>\n Service.pipe(\n Effect.map(({ db }) => db.schemaRegistry.query(schemaQueryOptions)),\n Effect.withSpan('Database.schemaQuery'),\n );\n\n/**\n * Executes a schema query once and returns the results.\n */\nexport const runSchemaQuery = <Q extends Types.NoExcessProperties<SchemaRegistry.Query, Q>>(\n schemaQueryOptions?: Q & SchemaRegistry.Query,\n): Effect.Effect<SchemaRegistry.ExtractQueryResult<Q>[], never, Service> =>\n schemaQuery(schemaQueryOptions).pipe(\n Effect.flatMap((queryResult) => promiseWithCauseCapture(() => queryResult.run())),\n );\n"],
5
+ "mappings": ";;;;;;;;;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;AAMA,YAAYA,aAAa;AACzB,YAAYC,YAAY;AACxB,YAAYC,WAAW;AACvB,YAAYC,YAAY;AACxB,YAAYC,YAAY;AAGxB,SAASC,+BAA+B;AACxC,SAASC,iBAAiB;AAC1B,SAASC,WAAyB;AAqElC,IAAA,eAAA;AA+DSC,IAAM,SAAOA,uBAAQ,IAAA,qBAAsBA;AAClD,IAAA,aAAA,CAAA,QAAA;AAEF,SAAO,MAAMC,OAAoCC,QAAOC,YAASD,UAAc,OAACE,IAAUC,MAAAA,MAAWD,SAAS;AAE9G;;AAUA,IAAA,UAAA,cAAA,YAAA,6BAAA,EAAA,EAAA;;AAMI,IAAM,eAAU,cAAA,SAAA;EAClB,IAAA,KAAA;AACC,UAAA,IAAA,MAAA,wBAAA;EAEH;;AAKI,IAAIE,cAAK,CAAA,OAAA;;IAET,IAAA,KAAA;AACF,aAAA;IACA;EAEF;;AAKE,IAAA,QAAA,CAAA,OAAA;AAEF,SAAA,cAAA,SAAA,YAAA,EAAA,CAAA;;AAKSA,IAAGC,UAAO,WAAA,aAAA;AAChB,QAAA,EAAA,GAAA,IAAA,OAAA;AAEH,SAAA,GAAA;;AAiBI,IAAMC,UAAMC,CAAAA,KAAAA,WAA2BA,WAAID,aAAG;AAC9C,QAAME,EAAAA,GAAAA,IAAS,OAAOC;cAGhBC,eAAS,MAAA,MAAA,IAAA;iBACPR,OAAUG,wBAAO,MAAA,GAAA,MAAA,kBAAA;IACnB,SAAA;MAEDM,OAAQL,GAAAA;IAGRE;EACH,CAAA,EAAA,QAAO,GAAOI,CAAAA;AAChB,MAAA,CAAA,QAAA;AACAC,WAAWC,OAAUC,YAAAA,IAAaD,oBAAiB,GAAA,CAAA;EACnD;AACCE,YAAKJ,CAAOK,UAAS,aAAA,QAA6B,MAAA,GAAA,yBAAA,EAAA,YAAA,YAAA,GAAA,cAAA,GAAA,IAAA,GAAA,MAAA,GAAA,CAAA,2CAAA,yBAAA,EAAA,CAAA;AAEvD,SAAA;;AAMST,IAAQ,OAAA,UAAA,eAAA,EAAA,WAAA,KAAA;QACX,SAAO,OAAOI,wBAAoBM,MAAAA,IAAAA,QAAwBZ,CAAAA;AAC5D,MAAA,CAAA,QAAA;AACA,WAAOE,OAAAA,YAAAA,IAAAA,oBAAAA,IAAAA,GAAAA,CAAAA;EAET;AAEF,SAAA;;AASE,IAAOW,aAAoBX,UAAAA,qBAAAA,EAAAA,WAAAA,KAAAA;AAC1B,QAAA,SAAA,OAAA,KAAA,GAAA,EAAA,KAAA,gBAAA,uBAAA,MAAA,eAAA,MAAA,CAAA,CAAA;AAEH,SAAA,oBAAA,MAAA;;;;;;;;;;;",
6
+ "names": ["Context", "Effect", "Layer", "Option", "Schema", "promiseWithCauseCapture", "invariant", "DXN", "obj", "Database", "Schema", "Any", "space", "isDatabase", "db", "spaceId", "dxn", "ref", "object", "promiseWithCauseCapture", "context", "resolve", "Effect", "invariant", "schema", "isInstanceOf", "pipe", "withSpan", "ObjectNotFoundError", "Option"]
7
+ }
@@ -4,17 +4,17 @@ import {
4
4
  EchoSchema,
5
5
  PersistentSchema,
6
6
  isMutable
7
- } from "./chunk-TQQZLKB7.mjs";
7
+ } from "./chunk-SJKBWMJY.mjs";
8
8
  import {
9
9
  getSchemaDXN,
10
10
  getSchemaTypename,
11
11
  getSchemaVersion,
12
12
  getTypeAnnotation
13
- } from "./chunk-SEMVAGBM.mjs";
13
+ } from "./chunk-TNBK56IN.mjs";
14
14
  import {
15
15
  EntityKind,
16
16
  SchemaKindId
17
- } from "./chunk-WYOKA6AE.mjs";
17
+ } from "./chunk-N4B7FHQT.mjs";
18
18
  import {
19
19
  __export
20
20
  } from "./chunk-J5LGTIGS.mjs";
@@ -51,28 +51,12 @@ var getDXN = (schema) => {
51
51
  };
52
52
  var getTypename = (schema) => {
53
53
  const typename = getSchemaTypename(schema);
54
- invariant(typeof typename === "string" && !typename.startsWith("dxn:"), "Invalid typename", {
55
- F: __dxlog_file,
56
- L: 230,
57
- S: void 0,
58
- A: [
59
- "typeof typename === 'string' && !typename.startsWith('dxn:')",
60
- "'Invalid typename'"
61
- ]
62
- });
54
+ invariant(typeof typename === "string" && !typename.startsWith("dxn:"), "Invalid typename", { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 70, S: void 0, A: ["typeof typename === 'string' && !typename.startsWith('dxn:')", "'Invalid typename'"] });
63
55
  return typename;
64
56
  };
65
57
  var getVersion = (schema) => {
66
58
  const version = getSchemaVersion(schema);
67
- invariant(typeof version === "string" && version.match(/^\d+\.\d+\.\d+$/), "Invalid version", {
68
- F: __dxlog_file,
69
- L: 240,
70
- S: void 0,
71
- A: [
72
- "typeof version === 'string' && version.match(/^\\d+\\.\\d+\\.\\d+$/)",
73
- "'Invalid version'"
74
- ]
75
- });
59
+ invariant(typeof version === "string" && version.match(/^\d+\.\d+\.\d+$/), "Invalid version", { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 78, S: void 0, A: ["typeof version === 'string' && version.match(/^\\d+\\.\\d+\\.\\d+$/)", "'Invalid version'"] });
76
60
  return version;
77
61
  };
78
62
  var isMutable2 = isMutable;
@@ -94,4 +78,4 @@ export {
94
78
  getMeta,
95
79
  Type_exports
96
80
  };
97
- //# sourceMappingURL=chunk-RMLF7JOZ.mjs.map
81
+ //# sourceMappingURL=chunk-FZHVQEHN.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/Type.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\n// @import-as-namespace\n\nimport type * as Schema from 'effect/Schema';\n\nimport { type EncodedReference } from '@dxos/echo-protocol';\nimport { invariant } from '@dxos/invariant';\nimport { type DXN } from '@dxos/keys';\nimport { type ToMutable } from '@dxos/util';\n\nimport type * as Entity from './Entity';\nimport * as typeInternal from './internal/Type';\nimport * as internal from './internal';\nimport type * as ObjModule from './Obj';\nimport type * as RelationModule from './Relation';\n\n/**\n * Dynamic type that can be constructed, mutated, and persisted in the ECHO database.\n */\nexport const RuntimeType = typeInternal.EchoSchema;\n\n/**\n * Dynamic type that can be constructed, mutated, and persisted in the ECHO database.\n */\nexport type RuntimeType = typeInternal.EchoSchema;\n\n//\n// Internal types (not exported)\n//\n\n/**\n * Type that marks a schema as an ECHO schema.\n * The value indicates the entity kind (Object or Relation).\n */\ntype EchoSchemaKind<K extends internal.EntityKind = internal.EntityKind> = {\n readonly [internal.SchemaKindId]: K;\n};\n\n//\n// Obj - Runtime schema for any ECHO object\n//\n\n/**\n * TypeScript type for an ECHO object schema.\n * `T` is the instance type produced by the schema.\n * `Fields` is the optional struct fields type for introspection.\n *\n * @example\n * ```ts\n * const PersonSchema: Type.Obj<Person> = Schema.Struct({\n * name: Schema.String,\n * }).pipe(Type.object({ typename: 'Person', version: '0.1.0' }));\n *\n * // Access fields for introspection:\n * Object.keys(PersonSchema.fields); // ['name']\n * ```\n */\nexport interface Obj<T, Fields extends Schema.Struct.Fields = Schema.Struct.Fields>\n extends\n internal.TypeMeta,\n EchoSchemaKind<internal.EntityKind.Object>,\n Schema.AnnotableClass<\n Obj<T, Fields>,\n Entity.OfKind<typeof Entity.Kind.Object> & T,\n Schema.Simplify<ObjModule.BaseObjJson & ToMutable<T>>,\n never\n > {\n /**\n * The fields defined in the original struct schema.\n * Allows accessing field definitions for introspection.\n */\n readonly fields: Fields;\n}\n\n/**\n * Structural base type for any ECHO object schema.\n * Accepts both static schemas (created with Type.object()) and EchoSchema.\n * NOTE: Does not include the brand symbol to avoid TS4053 declaration portability issues.\n * Use Type.isObjectSchema() for runtime type guards.\n */\ntype ObjectSchemaBase = Schema.Schema.AnyNoContext & {\n readonly typename: string;\n readonly version: string;\n};\n\n/**\n * Type that represents any ECHO object schema.\n * Accepts both static schemas (Type.object()) and mutable schemas (EchoSchema).\n */\nexport type AnyObj = ObjectSchemaBase;\n\n/**\n * Factory function to create an ECHO object schema.\n * Adds object metadata annotations to an Effect schema.\n *\n * @example\n * ```ts\n * const Person = Schema.Struct({\n * name: Schema.String,\n * }).pipe(Type.object({ typename: 'com.example.type.person', version: '0.1.0' }));\n * ```\n */\nexport const object: {\n (opts: internal.TypeMeta): <Self extends Schema.Schema.Any>(self: Self) => Obj<Schema.Schema.Type<Self>>;\n} = internal.EchoObjectSchema as any;\n\n//\n// PersistentType (Schema stored in database)\n//\n\nexport const PersistentType: Obj<typeInternal.PersistentSchema> = typeInternal.PersistentSchema as any;\n\nexport interface PersistentType extends Schema.Schema.Type<typeof PersistentType> {}\n\n/**\n * TypeScript type for an ECHO relation schema.\n * `T` is the instance type produced by the schema (excluding source/target).\n * `Source` and `Target` are the endpoint types.\n * `Fields` is the optional struct fields type for introspection.\n */\nexport interface Relation<T, Source, Target, Fields extends Schema.Struct.Fields = Schema.Struct.Fields>\n extends\n internal.TypeMeta,\n EchoSchemaKind<internal.EntityKind.Relation>,\n Schema.AnnotableClass<\n Relation<T, Source, Target, Fields>,\n Entity.OfKind<typeof Entity.Kind.Relation> & RelationModule.Endpoints<Source, Target> & T,\n Schema.Simplify<RelationModule.BaseRelationJson & ToMutable<T>>,\n never\n > {\n /**\n * The fields defined in the original struct schema.\n * Allows accessing field definitions for introspection.\n */\n readonly fields: Fields;\n}\n\n/**\n * Structural base type for any ECHO relation schema.\n * Accepts static schemas (created with Type.relation()).\n * NOTE: Does not include the brand symbol to avoid TS4053 declaration portability issues.\n * Use Type.isRelationSchema() for runtime type guards.\n */\ntype RelationSchemaBase = Schema.Schema.AnyNoContext & {\n readonly typename: string;\n readonly version: string;\n};\n\n/**\n * Type that represents any ECHO relation schema.\n * Accepts static schemas (Type.relation()).\n */\nexport type AnyRelation = RelationSchemaBase;\n\n/**\n * Factory function to create an ECHO relation schema.\n * Adds relation metadata annotations to an Effect schema.\n *\n * @example\n * ```ts\n * const WorksFor = Schema.Struct({\n * role: Schema.String,\n * }).pipe(Type.relation({\n * typename: 'com.example.type.works-for',\n * version: '0.1.0',\n * source: Person,\n * target: Company,\n * }));\n * ```\n */\nexport const relation: {\n <SourceSchema extends Schema.Schema.AnyNoContext, TargetSchema extends Schema.Schema.AnyNoContext>(\n opts: internal.EchoRelationSchemaOptions<SourceSchema, TargetSchema>,\n ): <Self extends Schema.Schema.Any>(\n self: Self,\n ) => Relation<Schema.Schema.Type<Self>, Schema.Schema.Type<SourceSchema>, Schema.Schema.Type<TargetSchema>>;\n} = internal.EchoRelationSchema as any;\n\n/**\n * Type alias for any ECHO entity schema (object or relation).\n * Use this in type annotations for schema parameters.\n */\nexport type AnyEntity = AnyObj | AnyRelation;\n\n/**\n * Type guard to check if a schema is an object schema.\n * NOTE: This checks SCHEMAS, not instances. Use Obj.isObject for instances.\n */\nexport const isObjectSchema = (schema: AnyEntity): schema is AnyObj => {\n return (schema as any)[internal.SchemaKindId] === internal.EntityKind.Object;\n};\n\n/**\n * Type guard to check if a schema is a relation schema.\n * NOTE: This checks SCHEMAS, not instances. Use Relation.isRelation for instances.\n */\nexport const isRelationSchema = (schema: AnyEntity): schema is AnyRelation => {\n return (schema as any)[internal.SchemaKindId] === internal.EntityKind.Relation;\n};\n\n/**\n * Type that represents any Ref schema (with unknown target type).\n * This is a schema type, not an instance type.\n */\nexport type AnyRef = Schema.Schema<internal.Ref<any>, EncodedReference>;\n\n//\n// Schema utility functions\n//\n\n/**\n * Gets the full DXN of the schema.\n * Will include the version if it's a `type` DXN.\n * @example \"dxn:com.example.type.person:0.1.0\"\n * @example \"dxn:echo:SSSSSSSSSS:XXXXXXXXXXXXX\"\n */\nexport const getDXN = (schema: AnyEntity): DXN | undefined => {\n return internal.getSchemaDXN(schema);\n};\n\n/**\n * @param schema - Schema to get the typename from.\n * @returns The typename of the schema. Example: `com.example.type.person`.\n */\nexport const getTypename = (schema: AnyEntity): string => {\n const typename = internal.getSchemaTypename(schema);\n invariant(typeof typename === 'string' && !typename.startsWith('dxn:'), 'Invalid typename');\n return typename;\n};\n\n/**\n * Gets the version of the schema.\n * @example 0.1.0\n */\nexport const getVersion = (schema: AnyEntity): string => {\n const version = internal.getSchemaVersion(schema);\n invariant(typeof version === 'string' && version.match(/^\\d+\\.\\d+\\.\\d+$/), 'Invalid version');\n return version;\n};\n\n/**\n * @returns True if the schema is mutable.\n */\nexport const isMutable = typeInternal.isMutable;\n\n/**\n * ECHO type metadata.\n */\nexport type Meta = internal.TypeAnnotation;\n\n/**\n * Gets the meta data of the schema.\n */\nexport const getMeta = (schema: AnyEntity): Meta | undefined => {\n return internal.getTypeAnnotation(schema);\n};\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;mBAAAA;EAAA;;;;;AASA,SAASC,iBAAiB;;AAanB,IAAMC,cAA2BC;AAmFjC,IAAMC,SAEAC;AAMN,IAAMC,iBAAkEC;AA4DxE,IAAMC,WAMAC;AAYN,IAAMC,iBAAiB,CAACC,WAAAA;AAC7B,SAAQA,OAAwBC,YAAY,MAAeC,WAAWC;AACxE;AAMO,IAAMC,mBAAmB,CAACJ,WAAAA;AAC/B,SAAQA,OAAwBC,YAAY,MAAeC,WAAWG;AACxE;AAkBO,IAAMC,SAAS,CAACN,WAAAA;AACrB,SAAgBO,aAAaP,MAAAA;AAC/B;AAMO,IAAMQ,cAAc,CAACR,WAAAA;AAC1B,QAAMS,WAAoBC,kBAAkBV,MAAAA;AAC5CW,YAAU,OAAOF,aAAa,YAAY,CAACA,SAASG,WAAW,MAAA,GAAS,oBAAA;;;;;;;;;AACxE,SAAOH;AACT;AAMO,IAAMI,aAAa,CAACb,WAAAA;AACzB,QAAMc,UAAmBC,iBAAiBf,MAAAA;AAC1CW,YAAU,OAAOG,YAAY,YAAYA,QAAQE,MAAM,iBAAA,GAAoB,mBAAA;;;;;;;;;AAC3E,SAAOF;AACT;AAKO,IAAMG,aAAyBA;AAU/B,IAAMC,UAAU,CAAClB,WAAAA;AACtB,SAAgBmB,kBAAkBnB,MAAAA;AACpC;",
6
- "names": ["isMutable", "invariant", "RuntimeType", "EchoSchema", "object", "EchoObjectSchema", "PersistentType", "PersistentSchema", "relation", "EchoRelationSchema", "isObjectSchema", "schema", "SchemaKindId", "EntityKind", "Object", "isRelationSchema", "Relation", "getDXN", "getSchemaDXN", "getTypename", "typename", "getSchemaTypename", "invariant", "startsWith", "getVersion", "version", "getSchemaVersion", "match", "isMutable", "getMeta", "getTypeAnnotation"]
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\n// @import-as-namespace\n\nimport type * as Schema from 'effect/Schema';\n\nimport { type EncodedReference } from '@dxos/echo-protocol';\nimport { invariant } from '@dxos/invariant';\nimport { type DXN } from '@dxos/keys';\nimport { type ToMutable } from '@dxos/util';\n\nimport type * as Entity from './Entity';\nimport * as internal from './internal';\nimport * as typeInternal from './internal/Type';\nimport type * as ObjModule from './Obj';\nimport type * as RelationModule from './Relation';\n\n/**\n * Dynamic type that can be constructed, mutated, and persisted in the ECHO database.\n */\nexport const RuntimeType = typeInternal.EchoSchema;\n\n/**\n * Dynamic type that can be constructed, mutated, and persisted in the ECHO database.\n */\nexport type RuntimeType = typeInternal.EchoSchema;\n\n//\n// Internal types (not exported)\n//\n\n/**\n * Type that marks a schema as an ECHO schema.\n * The value indicates the entity kind (Object or Relation).\n */\ntype EchoSchemaKind<K extends internal.EntityKind = internal.EntityKind> = {\n readonly [internal.SchemaKindId]: K;\n};\n\n//\n// Obj - Runtime schema for any ECHO object\n//\n\n/**\n * TypeScript type for an ECHO object schema.\n * `T` is the instance type produced by the schema.\n * `Fields` is the optional struct fields type for introspection.\n *\n * @example\n * ```ts\n * const PersonSchema: Type.Obj<Person> = Schema.Struct({\n * name: Schema.String,\n * }).pipe(Type.object({ typename: 'Person', version: '0.1.0' }));\n *\n * // Access fields for introspection:\n * Object.keys(PersonSchema.fields); // ['name']\n * ```\n */\nexport interface Obj<T, Fields extends Schema.Struct.Fields = Schema.Struct.Fields>\n extends\n internal.TypeMeta,\n EchoSchemaKind<internal.EntityKind.Object>,\n Schema.AnnotableClass<\n Obj<T, Fields>,\n Entity.OfKind<typeof Entity.Kind.Object> & T,\n Schema.Simplify<ObjModule.BaseObjJson & ToMutable<T>>,\n never\n > {\n /**\n * The fields defined in the original struct schema.\n * Allows accessing field definitions for introspection.\n */\n readonly fields: Fields;\n}\n\n/**\n * Structural base type for any ECHO object schema.\n * Accepts both static schemas (created with Type.object()) and EchoSchema.\n * NOTE: Does not include the brand symbol to avoid TS4053 declaration portability issues.\n * Use Type.isObjectSchema() for runtime type guards.\n */\ntype ObjectSchemaBase = Schema.Schema.AnyNoContext & {\n readonly typename: string;\n readonly version: string;\n};\n\n/**\n * Type that represents any ECHO object schema.\n * Accepts both static schemas (Type.object()) and mutable schemas (EchoSchema).\n */\nexport type AnyObj = ObjectSchemaBase;\n\n/**\n * Factory function to create an ECHO object schema.\n * Adds object metadata annotations to an Effect schema.\n *\n * @example\n * ```ts\n * const Person = Schema.Struct({\n * name: Schema.String,\n * }).pipe(Type.object({ typename: 'com.example.type.person', version: '0.1.0' }));\n * ```\n */\nexport const object: {\n (opts: internal.TypeMeta): <Self extends Schema.Schema.Any>(self: Self) => Obj<Schema.Schema.Type<Self>>;\n} = internal.EchoObjectSchema as any;\n\n//\n// PersistentType (Schema stored in database)\n//\n\nexport const PersistentType: Obj<typeInternal.PersistentSchema> = typeInternal.PersistentSchema as any;\n\nexport interface PersistentType extends Schema.Schema.Type<typeof PersistentType> {}\n\n/**\n * TypeScript type for an ECHO relation schema.\n * `T` is the instance type produced by the schema (excluding source/target).\n * `Source` and `Target` are the endpoint types.\n * `Fields` is the optional struct fields type for introspection.\n */\nexport interface Relation<T, Source, Target, Fields extends Schema.Struct.Fields = Schema.Struct.Fields>\n extends\n internal.TypeMeta,\n EchoSchemaKind<internal.EntityKind.Relation>,\n Schema.AnnotableClass<\n Relation<T, Source, Target, Fields>,\n Entity.OfKind<typeof Entity.Kind.Relation> & RelationModule.Endpoints<Source, Target> & T,\n Schema.Simplify<RelationModule.BaseRelationJson & ToMutable<T>>,\n never\n > {\n /**\n * The fields defined in the original struct schema.\n * Allows accessing field definitions for introspection.\n */\n readonly fields: Fields;\n}\n\n/**\n * Structural base type for any ECHO relation schema.\n * Accepts static schemas (created with Type.relation()).\n * NOTE: Does not include the brand symbol to avoid TS4053 declaration portability issues.\n * Use Type.isRelationSchema() for runtime type guards.\n */\ntype RelationSchemaBase = Schema.Schema.AnyNoContext & {\n readonly typename: string;\n readonly version: string;\n};\n\n/**\n * Type that represents any ECHO relation schema.\n * Accepts static schemas (Type.relation()).\n */\nexport type AnyRelation = RelationSchemaBase;\n\n/**\n * Factory function to create an ECHO relation schema.\n * Adds relation metadata annotations to an Effect schema.\n *\n * @example\n * ```ts\n * const WorksFor = Schema.Struct({\n * role: Schema.String,\n * }).pipe(Type.relation({\n * typename: 'com.example.type.works-for',\n * version: '0.1.0',\n * source: Person,\n * target: Company,\n * }));\n * ```\n */\nexport const relation: {\n <SourceSchema extends Schema.Schema.AnyNoContext, TargetSchema extends Schema.Schema.AnyNoContext>(\n opts: internal.EchoRelationSchemaOptions<SourceSchema, TargetSchema>,\n ): <Self extends Schema.Schema.Any>(\n self: Self,\n ) => Relation<Schema.Schema.Type<Self>, Schema.Schema.Type<SourceSchema>, Schema.Schema.Type<TargetSchema>>;\n} = internal.EchoRelationSchema as any;\n\n/**\n * Type alias for any ECHO entity schema (object or relation).\n * Use this in type annotations for schema parameters.\n */\nexport type AnyEntity = AnyObj | AnyRelation;\n\n/**\n * Type guard to check if a schema is an object schema.\n * NOTE: This checks SCHEMAS, not instances. Use Obj.isObject for instances.\n */\nexport const isObjectSchema = (schema: AnyEntity): schema is AnyObj => {\n return (schema as any)[internal.SchemaKindId] === internal.EntityKind.Object;\n};\n\n/**\n * Type guard to check if a schema is a relation schema.\n * NOTE: This checks SCHEMAS, not instances. Use Relation.isRelation for instances.\n */\nexport const isRelationSchema = (schema: AnyEntity): schema is AnyRelation => {\n return (schema as any)[internal.SchemaKindId] === internal.EntityKind.Relation;\n};\n\n/**\n * Type that represents any Ref schema (with unknown target type).\n * This is a schema type, not an instance type.\n */\nexport type AnyRef = Schema.Schema<internal.Ref<any>, EncodedReference>;\n\n//\n// Schema utility functions\n//\n\n/**\n * Gets the full DXN of the schema.\n * Will include the version if it's a `type` DXN.\n * @example \"dxn:com.example.type.person:0.1.0\"\n * @example \"dxn:echo:SSSSSSSSSS:XXXXXXXXXXXXX\"\n */\nexport const getDXN = (schema: AnyEntity): DXN | undefined => {\n return internal.getSchemaDXN(schema);\n};\n\n/**\n * @param schema - Schema to get the typename from.\n * @returns The typename of the schema. Example: `com.example.type.person`.\n */\nexport const getTypename = (schema: AnyEntity): string => {\n const typename = internal.getSchemaTypename(schema);\n invariant(typeof typename === 'string' && !typename.startsWith('dxn:'), 'Invalid typename');\n return typename;\n};\n\n/**\n * Gets the version of the schema.\n * @example 0.1.0\n */\nexport const getVersion = (schema: AnyEntity): string => {\n const version = internal.getSchemaVersion(schema);\n invariant(typeof version === 'string' && version.match(/^\\d+\\.\\d+\\.\\d+$/), 'Invalid version');\n return version;\n};\n\n/**\n * @returns True if the schema is mutable.\n */\nexport const isMutable = typeInternal.isMutable;\n\n/**\n * ECHO type metadata.\n */\nexport type Meta = internal.TypeAnnotation;\n\n/**\n * Gets the meta data of the schema.\n */\nexport const getMeta = (schema: AnyEntity): Meta | undefined => {\n return internal.getTypeAnnotation(schema);\n};\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;mBAAAA;EAAA;;;;;AASA,SAASC,iBAAiB;AAU1B,IAAA,eAAA;;AA2FA,IAAA,SAAA;;;AAmFE,IAAA,iBAAA,CAAA,WAAA;AAEF,SAAA,OAAA,YAAA,MAAA,WAAA;;AAME,IAAA,mBAAA,CAAA,WAAA;AAQA,SAAA,OAAA,YAAA,MAAA,WAAA;AACF;AAWE,IAAA,SAAA,CAAA,WAAA;AAEF,SAAA,aAAA,MAAA;;AAMEC,IAAU,cAAOC,CAAAA,WAAa;AAC9B,QAAA,WAAOA,kBAAAA,MAAAA;AACP,YAAA,OAAA,aAAA,YAAA,CAAA,SAAA,WAAA,MAAA,GAAA,oBAAA,EAAA,YAAA,YAAA,GAAA,cAAA,GAAA,IAAA,GAAA,QAAA,GAAA,CAAA,gEAAA,oBAAA,EAAA,CAAA;AAEF,SAAA;;AAMED,IAAU,aAAOE,CAAAA,WAAY;AAC7B,QAAA,UAAOA,iBAAAA,MAAAA;AACP,YAAA,OAAA,YAAA,YAAA,QAAA,MAAA,iBAAA,GAAA,mBAAA,EAAA,YAAA,YAAA,GAAA,cAAA,GAAA,IAAA,GAAA,QAAA,GAAA,CAAA,wEAAA,mBAAA,EAAA,CAAA;AAEF,SAAA;;;AAeE,IAAA,UAAA,CAAA,WAAA;;;",
6
+ "names": ["isMutable", "invariant", "invariant", "typename", "version"]
7
7
  }
@@ -0,0 +1,50 @@
1
+ import {
2
+ __export
3
+ } from "./chunk-J5LGTIGS.mjs";
4
+
5
+ // src/Extension.ts
6
+ var Extension_exports = {};
7
+ __export(Extension_exports, {
8
+ Key: () => Key,
9
+ TypeId: () => TypeId,
10
+ Values: () => Values,
11
+ get: () => get,
12
+ make: () => make,
13
+ set: () => set
14
+ });
15
+ import * as Function from "effect/Function";
16
+ import * as Option from "effect/Option";
17
+ import * as Schema from "effect/Schema";
18
+ var TypeId = "~@dxos/echo/Extension";
19
+ var make = (key, valueSchema) => {
20
+ return {
21
+ [TypeId]: {},
22
+ key: Key.make(key),
23
+ valueSchema
24
+ };
25
+ };
26
+ var Key = Schema.String.pipe(Schema.brand("~@dxos/echo/ExtensionKey"));
27
+ var Values = Schema.Record({
28
+ key: Key,
29
+ value: Schema.Unknown
30
+ });
31
+ var get = Function.dual(2, (values, extension) => {
32
+ if (!(extension.key in values)) {
33
+ return Option.none();
34
+ }
35
+ return Function.pipe(values[extension.key], Schema.decodeUnknownSync(extension.valueSchema), Option.some);
36
+ });
37
+ var set = Function.dual(3, (values, extension, value) => {
38
+ values[extension.key] = Schema.encodeSync(extension.valueSchema)(value);
39
+ });
40
+
41
+ export {
42
+ TypeId,
43
+ make,
44
+ Key,
45
+ Values,
46
+ get,
47
+ set,
48
+ Extension_exports
49
+ };
50
+ //# sourceMappingURL=chunk-GWFFC34K.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/Extension.ts"],
4
+ "sourcesContent": ["// @import-as-namespace\n//\n// Copyright 2026 DXOS.org\n//\n\nimport * as Function from 'effect/Function';\nimport * as Option from 'effect/Option';\nimport * as Schema from 'effect/Schema';\nimport type * as Types from 'effect/Types';\n\n// @import-as-namespace\n\n/**\n * Extensions allow objects to contain typed properties that are not part of the schema.\n */\n\nexport const TypeId = '~@dxos/echo/Extension' as const;\nexport type TypeId = typeof TypeId;\n\nexport interface Extension<T> extends Record<\n TypeId,\n {\n _Type: T;\n }\n> {\n readonly [TypeId]: {\n _Type: T;\n };\n\n readonly key: Key;\n readonly valueSchema: Schema.Schema<T>;\n}\n\n/**\n * Create a new typed extension.\n *\n * ```ts\n * const ColorExtension = Extension.make('color', Schema.String);\n *\n * const obj = Obj.make(Person, {\n * [Obj.Meta]: { keys: [{ source: 'external', id: '123' }] },\n * name: 'John',\n * email: 'john@example.com',\n * });\n *\n * Obj.update(obj, (obj) => {\n * Extension.set(obj.extensions, ColorExtension, 'red');\n * });\n *\n * console.log(Extension.get(obj.extensions, ColorExtension)); // 'red'\n * ```\n */\nexport const make = <S extends Schema.Schema.AnyNoContext>(\n key: string,\n valueSchema: S,\n): Extension<Schema.Schema.Type<S>> => {\n return {\n [TypeId]: {} as any,\n key: Key.make(key),\n valueSchema,\n };\n};\n\n/**\n * Unique identifier for an extension.\n */\n// TODO(dmaretskyi): filter to be fully qualified: (e.g., org.dxos.extension.color)\nexport const Key = Schema.String.pipe(Schema.brand('~@dxos/echo/ExtensionKey'));\nexport type Key = Schema.Schema.Type<typeof Key>;\n\n/**\n * Set of extension values.\n *\n * Can be used inside an object/relation schema:\n *\n * ```ts\n * const Person = Schema.Struct({\n * name: Schema.String,\n * extensions: Extension.Values,\n * });\n * ```\n */\nexport const Values = Schema.Record({ key: Key, value: Schema.Unknown });\nexport interface Values extends Schema.Schema.Type<typeof Values> {}\n\n/**\n * Get the value of an extension from a set of values.\n */\nexport const get: {\n <T>(extension: Extension<T>): (values: Values) => Option.Option<T>;\n <T>(values: Values, extension: Extension<T>): Option.Option<T>;\n} = Function.dual<\n <T>(extension: Extension<T>) => (values: Values) => Option.Option<T>,\n <T>(values: Values, extension: Extension<T>) => Option.Option<T>\n>(2, (values, extension) => {\n if (!(extension.key in values)) {\n return Option.none();\n }\n\n return Function.pipe(values[extension.key], Schema.decodeUnknownSync(extension.valueSchema), Option.some);\n});\n\n/**\n * Set the value of an extension in a set of values.\n *\n * Can also be used within Obj.update callback:\n *\n * ```ts\n * Obj.update(obj, (obj) => {\n * Extension.set(obj.extensions, ColorExtension, 'red');\n * });\n * ```\n */\nexport const set: {\n <T>(extension: Extension<T>, value: T): (values: Values) => void;\n <T>(values: Types.Mutable<Values>, extension: Extension<T>, value: T): void;\n} = Function.dual<\n <T>(extension: Extension<T>, value: T) => (values: Values) => void,\n <T>(values: Types.Mutable<Values>, extension: Extension<T>, value: T) => void\n>(3, (values, extension, value) => {\n values[extension.key] = Schema.encodeSync(extension.valueSchema)(value);\n});\n"],
5
+ "mappings": ";;;;;AAAA;;;;;;;;;AAKA,YAAYA,cAAc;AAC1B,YAAYC,YAAY;AACxB,YAAYC,YAAY;AASjB,IAAMC,SAAS;AAoCf,IAAMC,OAAO,CAClBC,KACAC,gBAAAA;AAEA,SAAO;IACL,CAACH,MAAAA,GAAS,CAAC;IACXE,KAAKE,IAAIH,KAAKC,GAAAA;IACdC;EACF;AACF;AAMO,IAAMC,MAAaC,cAAOC,KAAYC,aAAM,0BAAA,CAAA;AAe5C,IAAMC,SAAgBC,cAAO;EAAEP,KAAKE;EAAKM,OAAcC;AAAQ,CAAA;AAM/D,IAAMC,MAGAC,cAGX,GAAG,CAACC,QAAQC,cAAAA;AACZ,MAAI,EAAEA,UAAUb,OAAOY,SAAS;AAC9B,WAAcE,YAAI;EACpB;AAEA,SAAgBV,cAAKQ,OAAOC,UAAUb,GAAG,GAAUe,yBAAkBF,UAAUZ,WAAW,GAAUe,WAAI;AAC1G,CAAA;AAaO,IAAMC,MAGAN,cAGX,GAAG,CAACC,QAAQC,WAAWL,UAAAA;AACvBI,SAAOC,UAAUb,GAAG,IAAWkB,kBAAWL,UAAUZ,WAAW,EAAEO,KAAAA;AACnE,CAAA;",
6
+ "names": ["Function", "Option", "Schema", "TypeId", "make", "key", "valueSchema", "Key", "String", "pipe", "brand", "Values", "Record", "value", "Unknown", "get", "dual", "values", "extension", "none", "decodeUnknownSync", "some", "set", "encodeSync"]
7
+ }
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  object
3
- } from "./chunk-RMLF7JOZ.mjs";
3
+ } from "./chunk-FZHVQEHN.mjs";
4
4
  import {
5
5
  make
6
- } from "./chunk-NQRLRYJM.mjs";
6
+ } from "./chunk-SW5CUSBY.mjs";
7
7
  import {
8
8
  LabelAnnotation,
9
9
  SystemTypeAnnotation
10
- } from "./chunk-SEMVAGBM.mjs";
10
+ } from "./chunk-TNBK56IN.mjs";
11
11
  import {
12
12
  __export
13
13
  } from "./chunk-J5LGTIGS.mjs";
@@ -53,4 +53,4 @@ export {
53
53
  findTagByLabel,
54
54
  Tag_exports
55
55
  };
56
- //# sourceMappingURL=chunk-724GQYEN.mjs.map
56
+ //# sourceMappingURL=chunk-HPNQTEEQ.mjs.map
@@ -10,20 +10,21 @@ import {
10
10
  objectToJSON,
11
11
  removeTag,
12
12
  subscribe
13
- } from "./chunk-TQQZLKB7.mjs";
13
+ } from "./chunk-SJKBWMJY.mjs";
14
14
  import {
15
15
  getDescription,
16
16
  getEntityKind,
17
17
  getLabel,
18
+ getSchema,
18
19
  getTypeDXN,
19
20
  getTypename
20
- } from "./chunk-SEMVAGBM.mjs";
21
+ } from "./chunk-TNBK56IN.mjs";
21
22
  import {
22
23
  EntityKind,
23
24
  EntityKindSchema,
24
25
  KindId,
25
26
  SnapshotKindId
26
- } from "./chunk-WYOKA6AE.mjs";
27
+ } from "./chunk-N4B7FHQT.mjs";
27
28
  import {
28
29
  __export
29
30
  } from "./chunk-J5LGTIGS.mjs";
@@ -37,7 +38,6 @@ __export(Entity_exports, {
37
38
  Meta: () => Meta,
38
39
  SnapshotKindId: () => SnapshotKindId2,
39
40
  addTag: () => addTag2,
40
- change: () => change2,
41
41
  getDXN: () => getDXN2,
42
42
  getDatabase: () => getDatabase2,
43
43
  getDescription: () => getDescription2,
@@ -45,6 +45,7 @@ __export(Entity_exports, {
45
45
  getKind: () => getKind,
46
46
  getLabel: () => getLabel2,
47
47
  getMeta: () => getMeta,
48
+ getSchema: () => getSchema2,
48
49
  getTypeDXN: () => getTypeDXN2,
49
50
  getTypename: () => getTypename2,
50
51
  isDeleted: () => isDeleted2,
@@ -52,7 +53,8 @@ __export(Entity_exports, {
52
53
  isSnapshot: () => isSnapshot,
53
54
  removeTag: () => removeTag2,
54
55
  subscribe: () => subscribe2,
55
- toJSON: () => toJSON
56
+ toJSON: () => toJSON,
57
+ update: () => update
56
58
  });
57
59
  var KindId2 = KindId;
58
60
  var SnapshotKindId2 = SnapshotKindId;
@@ -74,6 +76,7 @@ var getKind = getEntityKind;
74
76
  var Meta = MetaId;
75
77
  var getDXN2 = (entity) => getDXN(entity);
76
78
  var getTypeDXN2 = getTypeDXN;
79
+ var getSchema2 = getSchema;
77
80
  var getTypename2 = (entity) => getTypename(entity);
78
81
  var getDatabase2 = (entity) => getDatabase(entity);
79
82
  function getMeta(entity) {
@@ -87,7 +90,7 @@ var toJSON = (entity) => objectToJSON(entity);
87
90
  var subscribe2 = (entity, callback) => {
88
91
  return subscribe(entity, callback);
89
92
  };
90
- var change2 = (entity, callback) => {
93
+ var update = (entity, callback) => {
91
94
  change(entity, callback);
92
95
  };
93
96
  var addTag2 = (entity, tag) => addTag(entity, tag);
@@ -104,6 +107,7 @@ export {
104
107
  Meta,
105
108
  getDXN2 as getDXN,
106
109
  getTypeDXN2 as getTypeDXN,
110
+ getSchema2 as getSchema,
107
111
  getTypename2 as getTypename,
108
112
  getDatabase2 as getDatabase,
109
113
  getMeta,
@@ -113,9 +117,9 @@ export {
113
117
  getDescription2 as getDescription,
114
118
  toJSON,
115
119
  subscribe2 as subscribe,
116
- change2 as change,
120
+ update,
117
121
  addTag2 as addTag,
118
122
  removeTag2 as removeTag,
119
123
  Entity_exports
120
124
  };
121
- //# sourceMappingURL=chunk-UFDK26FO.mjs.map
125
+ //# sourceMappingURL=chunk-LVGOVFDV.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/Entity.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\n// @import-as-namespace\n\nimport type { ForeignKey } from '@dxos/echo-protocol';\nimport type { DXN, ObjectId } from '@dxos/keys';\n\nimport * as internal from './internal';\nimport type * as Relation from './Relation';\nimport type * as Type from './Type';\n\n// Re-export KindId and SnapshotKindId from internal.\nexport const KindId = internal.KindId;\nexport type KindId = typeof internal.KindId;\nexport const SnapshotKindId = internal.SnapshotKindId;\nexport type SnapshotKindId = typeof internal.SnapshotKindId;\n\n// NOTE: Relation does not extend Obj so that, for example, we can prevent Relations from being used as source and target objects.\n// However, we generally refer to Obj and Relation instances as \"objects\",\n// and many API methods accept both Obj.Unknown and Relation.Unknown (i.e., Entity.Unknown) instances.\n\nexport const Kind = internal.EntityKind;\nexport type Kind = internal.EntityKind;\nexport const KindSchema = internal.EntityKindSchema;\n\n/**\n * Assigns a kind to an Object or Relation instance.\n * NOTE: Needed to make `isRelation` and `isObject` checks work.\n */\nexport interface OfKind<K extends Kind> {\n readonly [KindId]: K;\n readonly id: ObjectId;\n}\n\n/**\n * Assigns a snapshot kind to an Object or Relation snapshot.\n */\nexport interface SnapshotOfKind<K extends Kind> {\n readonly [SnapshotKindId]: K;\n readonly id: ObjectId;\n}\n\n/**\n * Obj or Relation with a specific set of properties.\n */\nexport type Entity<Props> = OfKind<Kind> & Props;\n\n/**\n * Unknown Obj or Relation (reactive).\n */\nexport interface Unknown extends OfKind<Kind> {}\n\n/**\n * Snapshot of an Obj or Relation.\n * Branded with SnapshotKindId instead of KindId.\n */\nexport interface Snapshot extends SnapshotOfKind<Kind> {}\n\n/**\n * Object with arbitrary properties.\n *\n * NOTE: Due to how typescript works, this type is not assignable to a specific schema type.\n * In that case, use `Obj.instanceOf` to check if an object is of a specific type.\n *\n * This type is very permissive and allows accessing any property on the object.\n * We should move to Obj.Unknown that is not permissive and requires explicit instanceof checks..\n */\nexport interface Any extends OfKind<Kind> {\n [key: string]: unknown;\n}\n\n/**\n * Returns all properties of an object or relation except for the id and kind.\n */\nexport type Properties<T> = Omit<T, 'id' | KindId | Relation.Source | Relation.Target>;\n\n/**\n * Check if a value is an ECHO entity (object or relation).\n * Returns `false` for snapshots.\n */\nexport const isEntity = (value: unknown): value is Unknown => {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n return (value as any)[KindId] !== undefined;\n};\n\n/**\n * Check if a value is an ECHO entity snapshot.\n * Returns `false` for entities.\n */\nexport const isSnapshot = (value: unknown): value is Snapshot => {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n return (value as any)[SnapshotKindId] !== undefined;\n};\n\n// TODO(dmaretskyi): Type introspection -- move to kind.\nexport const getKind = internal.getEntityKind;\n\n/**\n * Property that accesses metadata for an entity.\n */\nexport const Meta: unique symbol = internal.MetaId as any;\n\n/**\n * Property that accesses metadata for an entity.\n */\nexport type Meta = typeof Meta;\n\n//\n// Entity-level functions that work on any entity (object or relation).\n// Use these when you don't know or care about the specific entity kind.\n// For kind-specific functions, use Obj.* or Relation.*.\n//\n\n/**\n * JSON representation of an entity.\n */\nexport type JSON = internal.ObjectJSON;\n\n/**\n * Get the DXN of an entity (object or relation).\n */\nexport const getDXN = (entity: Unknown | Snapshot): DXN => internal.getDXN(entity);\n\n/**\n * Get the DXN of an entity's type.\n */\nexport const getTypeDXN = internal.getTypeDXN;\n\n/**\n * Get the schema of an entity.\n * Returns the branded ECHO schema used to create the entity.\n */\nexport const getSchema: (entity: Unknown | Snapshot) => Type.AnyEntity | undefined = internal.getSchema as any;\n\n/**\n * Get the typename of an entity's type.\n */\nexport const getTypename = (entity: Unknown | Snapshot): string | undefined => internal.getTypename(entity);\n\n/**\n * Get the database an entity belongs to.\n */\nexport const getDatabase = (entity: Unknown | Snapshot): any | undefined => internal.getDatabase(entity);\n\n/**\n * Get the metadata for an entity.\n * Returns mutable meta when passed a mutable entity (inside change callback).\n * Returns read-only meta when passed a regular entity or snapshot.\n */\n// TODO(wittjosiah): When passed a Snapshot, should return a snapshot of meta, not the live meta proxy.\nexport function getMeta(entity: Mutable<Unknown>): internal.ObjectMeta;\nexport function getMeta(entity: Unknown | Snapshot): internal.ReadonlyMeta;\nexport function getMeta(entity: Unknown | Snapshot | Mutable<Unknown>): internal.ObjectMeta | internal.ReadonlyMeta {\n return internal.getMetaChecked(entity);\n}\n\n/**\n * Get foreign keys for an entity from the specified source.\n */\nexport const getKeys = (entity: Unknown | Snapshot, source: string): ForeignKey[] => internal.getKeys(entity, source);\n\n/**\n * Check if an entity is deleted.\n */\nexport const isDeleted = (entity: Unknown | Snapshot): boolean => internal.isDeleted(entity);\n\n/**\n * Get the label of an entity.\n */\nexport const getLabel = (entity: Unknown | Snapshot): string | undefined => internal.getLabel(entity);\n\n/**\n * Get the description of an entity.\n */\nexport const getDescription = (entity: Unknown | Snapshot): string | undefined => internal.getDescription(entity);\n\n/**\n * Convert an entity to its JSON representation.\n */\nexport const toJSON = (entity: Unknown | Snapshot): JSON => internal.objectToJSON(entity);\n\n/**\n * Subscribe to changes on an entity (object or relation).\n * @returns Unsubscribe function.\n */\nexport const subscribe = (entity: Unknown, callback: () => void): (() => void) => {\n return internal.subscribe(entity, callback);\n};\n\n//\n// Change\n//\n\n/**\n * Used to provide a mutable view of an entity within `Entity.update`.\n */\nexport type Mutable<T> = internal.Mutable<T>;\n\n/**\n * Perform mutations on an entity (object or relation) within a change context.\n *\n * Entities are read-only by default. Mutations are batched and notifications fire\n * when the callback completes. Direct mutations outside of `Entity.update` will throw\n * at runtime.\n *\n * @param entity - The echo entity (object or relation) to mutate.\n * @param callback - Receives a mutable view of the entity. All mutations must occur here.\n *\n * @example\n * ```typescript\n * // Mutate within Entity.update\n * Entity.update(entity, (obj) => {\n * obj.name = 'Updated';\n * obj.count = 42;\n * });\n *\n * // Direct mutation throws\n * entity.name = 'Bob'; // Error: Cannot modify outside Entity.update()\n * ```\n *\n * Note: For type-specific operations, prefer `Obj.update` or `Relation.update`.\n */\nexport const update = <T extends Unknown>(entity: T, callback: internal.ChangeCallback<T>): void => {\n internal.change(entity, callback);\n};\n\n/**\n * Add a tag to an entity.\n * Must be called within an `Entity.update`, `Obj.update`, or `Relation.update` callback.\n */\nexport const addTag = (entity: Mutable<Unknown>, tag: string): void => internal.addTag(entity, tag);\n\n/**\n * Remove a tag from an entity.\n * Must be called within an `Entity.update`, `Obj.update`, or `Relation.update` callback.\n */\nexport const removeTag = (entity: Mutable<Unknown>, tag: string): void => internal.removeTag(entity, tag);\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;gBAAAA;EAAA;;wBAAAC;EAAA,cAAAC;EAAA,cAAAC;EAAA,mBAAAC;EAAA,sBAAAC;EAAA,eAAAC;EAAA;kBAAAC;EAAA;mBAAAC;EAAA,kBAAAC;EAAA,mBAAAC;EAAA,iBAAAC;EAAA;;mBAAAC;EAAA,iBAAAC;EAAA;;;AAcO,IAAMC,UAAkBA;AAExB,IAAMC,kBAA0BA;AAOhC,IAAMC,OAAgBC;AAEtB,IAAMC,aAAsBC;AAyD5B,IAAMC,WAAW,CAACC,UAAAA;AACvB,MAAI,OAAOA,UAAU,YAAYA,UAAU,MAAM;AAC/C,WAAO;EACT;AACA,SAAQA,MAAcP,OAAAA,MAAYQ;AACpC;AAMO,IAAMC,aAAa,CAACF,UAAAA;AACzB,MAAI,OAAOA,UAAU,YAAYA,UAAU,MAAM;AAC/C,WAAO;EACT;AACA,SAAQA,MAAcN,eAAAA,MAAoBO;AAC5C;AAGO,IAAME,UAAmBC;AAKzB,IAAMC,OAA+BC;AAqBrC,IAAMC,UAAS,CAACC,WAA6CD,OAAOC,MAAAA;AAKpE,IAAMC,cAAsBA;AAM5B,IAAMC,aAAiFA;AAKvF,IAAMC,eAAc,CAACH,WAA4DG,YAAYH,MAAAA;AAK7F,IAAMI,eAAc,CAACJ,WAAyDI,YAAYJ,MAAAA;AAU1F,SAASK,QAAQL,QAA6C;AACnE,SAAgBM,eAAeN,MAAAA;AACjC;AAKO,IAAMO,WAAU,CAACP,QAA4BQ,WAA0CD,QAAQP,QAAQQ,MAAAA;AAKvG,IAAMC,aAAY,CAACT,WAAiDS,UAAUT,MAAAA;AAK9E,IAAMU,YAAW,CAACV,WAA4DU,SAASV,MAAAA;AAKvF,IAAMW,kBAAiB,CAACX,WAA4DW,eAAeX,MAAAA;AAKnG,IAAMY,SAAS,CAACZ,WAA8Ca,aAAab,MAAAA;AAM3E,IAAMc,aAAY,CAACd,QAAiBe,aAAAA;AACzC,SAAgBD,UAAUd,QAAQe,QAAAA;AACpC;AAmCO,IAAMC,SAAS,CAAoBhB,QAAWe,aAAAA;AACnDE,EAASC,OAAOlB,QAAQe,QAAAA;AAC1B;AAMO,IAAMI,UAAS,CAACnB,QAA0BoB,QAA+BD,OAAOnB,QAAQoB,GAAAA;AAMxF,IAAMC,aAAY,CAACrB,QAA0BoB,QAA+BC,UAAUrB,QAAQoB,GAAAA;",
6
+ "names": ["KindId", "SnapshotKindId", "addTag", "getDXN", "getDatabase", "getDescription", "getKeys", "getLabel", "getSchema", "getTypeDXN", "getTypename", "isDeleted", "removeTag", "subscribe", "KindId", "SnapshotKindId", "Kind", "EntityKind", "KindSchema", "EntityKindSchema", "isEntity", "value", "undefined", "isSnapshot", "getKind", "getEntityKind", "Meta", "MetaId", "getDXN", "entity", "getTypeDXN", "getSchema", "getTypename", "getDatabase", "getMeta", "getMetaChecked", "getKeys", "source", "isDeleted", "getLabel", "getDescription", "toJSON", "objectToJSON", "subscribe", "callback", "update", "internal", "change", "addTag", "tag", "removeTag"]
7
+ }