@dxos/echo 0.8.4-staging.ac66bdf99f → 0.9.1-main.c7dcc2e112

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 (444) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +7 -7
  3. package/dist/lib/neutral/Annotation.mjs +45 -6
  4. package/dist/lib/neutral/Database.mjs +10 -17
  5. package/dist/lib/neutral/Entity.mjs +35 -20
  6. package/dist/lib/neutral/Err.mjs +3 -3
  7. package/dist/lib/neutral/Feed.mjs +23 -19
  8. package/dist/lib/neutral/Filter.mjs +13 -15
  9. package/dist/lib/neutral/Format.mjs +23 -3
  10. package/dist/lib/neutral/JsonSchema.mjs +7 -8
  11. package/dist/lib/neutral/Key.mjs +9 -5
  12. package/dist/lib/neutral/Migration.mjs +11 -10
  13. package/dist/lib/neutral/Obj.mjs +33 -20
  14. package/dist/lib/neutral/Order.mjs +7 -3
  15. package/dist/lib/neutral/Query.mjs +17 -17
  16. package/dist/lib/neutral/QueryResult.mjs +1 -1
  17. package/dist/lib/neutral/Ref.mjs +10 -9
  18. package/dist/lib/neutral/Registry.mjs +14 -0
  19. package/dist/lib/neutral/Relation.mjs +28 -25
  20. package/dist/lib/neutral/Scope.mjs +12 -0
  21. package/dist/lib/neutral/Tag.mjs +17 -14
  22. package/dist/lib/neutral/Type.mjs +54 -26
  23. package/dist/lib/neutral/{chunk-OMUPQMLR.mjs → chunk-35INCYOE.mjs} +1 -1
  24. package/dist/lib/neutral/chunk-35INCYOE.mjs.map +7 -0
  25. package/dist/lib/neutral/{chunk-4OIBYSXE.mjs → chunk-3JXQUMUI.mjs} +78 -32
  26. package/dist/lib/neutral/chunk-3JXQUMUI.mjs.map +7 -0
  27. package/dist/lib/neutral/{chunk-G3IQMKF7.mjs → chunk-4TPQZPLY.mjs} +130 -119
  28. package/dist/lib/neutral/chunk-4TPQZPLY.mjs.map +7 -0
  29. package/dist/lib/neutral/{chunk-TU3GW67D.mjs → chunk-5GAIWRQB.mjs} +40 -40
  30. package/dist/lib/neutral/chunk-5GAIWRQB.mjs.map +7 -0
  31. package/dist/lib/neutral/{chunk-B4BASU6W.mjs → chunk-6CEISA3V.mjs} +93 -76
  32. package/dist/lib/neutral/chunk-6CEISA3V.mjs.map +7 -0
  33. package/dist/lib/neutral/{chunk-GZQTCRJB.mjs → chunk-6M2Z6WBH.mjs} +22 -2
  34. package/dist/lib/neutral/chunk-6M2Z6WBH.mjs.map +7 -0
  35. package/dist/lib/neutral/{chunk-ANHVGJI4.mjs → chunk-7LOUAPYZ.mjs} +9 -5
  36. package/dist/lib/neutral/chunk-7LOUAPYZ.mjs.map +7 -0
  37. package/dist/lib/neutral/{chunk-WAK4DMFV.mjs → chunk-A53NTBHE.mjs} +12 -7
  38. package/dist/lib/neutral/chunk-A53NTBHE.mjs.map +7 -0
  39. package/dist/lib/neutral/{chunk-EAMSSLZC.mjs → chunk-AFANXSGV.mjs} +83 -46
  40. package/dist/lib/neutral/chunk-AFANXSGV.mjs.map +7 -0
  41. package/dist/lib/neutral/{chunk-UBEZSGXY.mjs → chunk-BBFJWWAV.mjs} +6 -6
  42. package/dist/lib/neutral/chunk-BBFJWWAV.mjs.map +7 -0
  43. package/dist/lib/neutral/chunk-E7IOTOZD.mjs +108 -0
  44. package/dist/lib/neutral/chunk-E7IOTOZD.mjs.map +7 -0
  45. package/dist/lib/neutral/{chunk-UI6MWK5W.mjs → chunk-EVK6XBXO.mjs} +16 -2
  46. package/dist/lib/neutral/chunk-EVK6XBXO.mjs.map +7 -0
  47. package/dist/lib/neutral/chunk-HGWQR5KH.mjs +259 -0
  48. package/dist/lib/neutral/chunk-HGWQR5KH.mjs.map +7 -0
  49. package/dist/lib/neutral/chunk-JZ6LFQU5.mjs +109 -0
  50. package/dist/lib/neutral/chunk-JZ6LFQU5.mjs.map +7 -0
  51. package/dist/lib/neutral/{chunk-JUXPFOEI.mjs → chunk-K3S7D5PR.mjs} +48 -88
  52. package/dist/lib/neutral/chunk-K3S7D5PR.mjs.map +7 -0
  53. package/dist/lib/neutral/{chunk-OS35K56T.mjs → chunk-L3OBWBV2.mjs} +3 -3
  54. package/dist/lib/neutral/{chunk-OS35K56T.mjs.map → chunk-L3OBWBV2.mjs.map} +2 -2
  55. package/dist/lib/neutral/{chunk-V36VO5SS.mjs → chunk-NOL7O3BL.mjs} +32 -40
  56. package/dist/lib/neutral/chunk-NOL7O3BL.mjs.map +7 -0
  57. package/dist/lib/neutral/{chunk-TBKX6JQO.mjs → chunk-O6BH7EPN.mjs} +30 -3
  58. package/dist/lib/neutral/chunk-O6BH7EPN.mjs.map +7 -0
  59. package/dist/lib/neutral/{chunk-7RO7CPBZ.mjs → chunk-PLDMJJJC.mjs} +2 -2
  60. package/dist/lib/neutral/{chunk-HBUZJNZO.mjs → chunk-SZ5WB6HF.mjs} +94 -99
  61. package/dist/lib/neutral/chunk-SZ5WB6HF.mjs.map +7 -0
  62. package/dist/lib/neutral/{chunk-BVOFLCVF.mjs → chunk-TF5BSLF6.mjs} +9 -6
  63. package/dist/lib/neutral/chunk-TF5BSLF6.mjs.map +7 -0
  64. package/dist/lib/neutral/{chunk-DQYLD2RB.mjs → chunk-TFEWTY5A.mjs} +155 -129
  65. package/dist/lib/neutral/chunk-TFEWTY5A.mjs.map +7 -0
  66. package/dist/lib/neutral/{chunk-MOR5ERFM.mjs → chunk-VQYL2OQF.mjs} +771 -1252
  67. package/dist/lib/neutral/chunk-VQYL2OQF.mjs.map +7 -0
  68. package/dist/lib/neutral/chunk-WISOH2XH.mjs +36 -0
  69. package/dist/lib/neutral/chunk-WISOH2XH.mjs.map +7 -0
  70. package/dist/lib/neutral/chunk-WU3GIANS.mjs +31 -0
  71. package/dist/lib/neutral/chunk-WU3GIANS.mjs.map +7 -0
  72. package/dist/lib/neutral/chunk-WZ32BF53.mjs +702 -0
  73. package/dist/lib/neutral/chunk-WZ32BF53.mjs.map +7 -0
  74. package/dist/lib/neutral/chunk-X3NUUON4.mjs +184 -0
  75. package/dist/lib/neutral/chunk-X3NUUON4.mjs.map +7 -0
  76. package/dist/lib/neutral/chunk-Z3WMRRAZ.mjs +168 -0
  77. package/dist/lib/neutral/chunk-Z3WMRRAZ.mjs.map +7 -0
  78. package/dist/lib/neutral/index.mjs +47 -41
  79. package/dist/lib/neutral/internal/index.mjs +157 -72
  80. package/dist/lib/neutral/meta.json +1 -1
  81. package/dist/lib/neutral/testing/index.mjs +261 -178
  82. package/dist/lib/neutral/testing/index.mjs.map +4 -4
  83. package/dist/types/src/Annotation.d.ts +108 -4
  84. package/dist/types/src/Annotation.d.ts.map +1 -1
  85. package/dist/types/src/Annotation.test.d.ts +2 -0
  86. package/dist/types/src/Annotation.test.d.ts.map +1 -0
  87. package/dist/types/src/Collection.d.ts +2 -3
  88. package/dist/types/src/Collection.d.ts.map +1 -1
  89. package/dist/types/src/Database.d.ts +78 -49
  90. package/dist/types/src/Database.d.ts.map +1 -1
  91. package/dist/types/src/Dataset.d.ts +16 -6
  92. package/dist/types/src/Dataset.d.ts.map +1 -1
  93. package/dist/types/src/Entity.d.ts +103 -28
  94. package/dist/types/src/Entity.d.ts.map +1 -1
  95. package/dist/types/src/Err.d.ts +27 -27
  96. package/dist/types/src/Err.d.ts.map +1 -1
  97. package/dist/types/src/Feed.d.ts +69 -19
  98. package/dist/types/src/Feed.d.ts.map +1 -1
  99. package/dist/types/src/Filter.d.ts +38 -12
  100. package/dist/types/src/Filter.d.ts.map +1 -1
  101. package/dist/types/src/Format.d.ts +0 -2
  102. package/dist/types/src/Format.d.ts.map +1 -1
  103. package/dist/types/src/Hypergraph.d.ts +14 -9
  104. package/dist/types/src/Hypergraph.d.ts.map +1 -1
  105. package/dist/types/src/Json.d.ts +33 -0
  106. package/dist/types/src/Json.d.ts.map +1 -0
  107. package/dist/types/src/Json.test.d.ts +2 -0
  108. package/dist/types/src/Json.test.d.ts.map +1 -0
  109. package/dist/types/src/JsonSchema.d.ts +2 -2
  110. package/dist/types/src/JsonSchema.d.ts.map +1 -1
  111. package/dist/types/src/Key.d.ts +1 -1
  112. package/dist/types/src/Key.d.ts.map +1 -1
  113. package/dist/types/src/Migration.d.ts +26 -11
  114. package/dist/types/src/Migration.d.ts.map +1 -1
  115. package/dist/types/src/Obj.d.ts +106 -61
  116. package/dist/types/src/Obj.d.ts.map +1 -1
  117. package/dist/types/src/Order.d.ts +10 -0
  118. package/dist/types/src/Order.d.ts.map +1 -1
  119. package/dist/types/src/Query.d.ts +34 -12
  120. package/dist/types/src/Query.d.ts.map +1 -1
  121. package/dist/types/src/QueryResult.d.ts +21 -0
  122. package/dist/types/src/QueryResult.d.ts.map +1 -1
  123. package/dist/types/src/Ref.d.ts +15 -7
  124. package/dist/types/src/Ref.d.ts.map +1 -1
  125. package/dist/types/src/Registry.d.ts +131 -0
  126. package/dist/types/src/Registry.d.ts.map +1 -0
  127. package/dist/types/src/Relation.d.ts +73 -41
  128. package/dist/types/src/Relation.d.ts.map +1 -1
  129. package/dist/types/src/Scope.d.ts +35 -0
  130. package/dist/types/src/Scope.d.ts.map +1 -0
  131. package/dist/types/src/Tag.d.ts +21 -5
  132. package/dist/types/src/Tag.d.ts.map +1 -1
  133. package/dist/types/src/Type.d.ts +366 -95
  134. package/dist/types/src/Type.d.ts.map +1 -1
  135. package/dist/types/src/View.d.ts +9 -12
  136. package/dist/types/src/View.d.ts.map +1 -1
  137. package/dist/types/src/exemplars.test.d.ts +2 -0
  138. package/dist/types/src/exemplars.test.d.ts.map +1 -0
  139. package/dist/types/src/index.d.ts +4 -3
  140. package/dist/types/src/index.d.ts.map +1 -1
  141. package/dist/types/src/internal/Annotation/annotations.d.ts +120 -38
  142. package/dist/types/src/internal/Annotation/annotations.d.ts.map +1 -1
  143. package/dist/types/src/internal/Annotation/dictionary.d.ts +24 -0
  144. package/dist/types/src/internal/Annotation/dictionary.d.ts.map +1 -0
  145. package/dist/types/src/internal/Annotation/entity-dictionary.d.ts +14 -0
  146. package/dist/types/src/internal/Annotation/entity-dictionary.d.ts.map +1 -0
  147. package/dist/types/src/internal/Annotation/index.d.ts +4 -2
  148. package/dist/types/src/internal/Annotation/index.d.ts.map +1 -1
  149. package/dist/types/src/internal/Annotation/sorting.d.ts.map +1 -1
  150. package/dist/types/src/internal/Annotation/util.d.ts +14 -5
  151. package/dist/types/src/internal/Annotation/util.d.ts.map +1 -1
  152. package/dist/types/src/internal/Entity/api.d.ts +17 -3
  153. package/dist/types/src/internal/Entity/api.d.ts.map +1 -1
  154. package/dist/types/src/internal/Entity/entity.d.ts +72 -8
  155. package/dist/types/src/internal/Entity/entity.d.ts.map +1 -1
  156. package/dist/types/src/internal/Entity/guard.d.ts +10 -0
  157. package/dist/types/src/internal/Entity/guard.d.ts.map +1 -0
  158. package/dist/types/src/internal/Entity/index.d.ts +2 -0
  159. package/dist/types/src/internal/Entity/index.d.ts.map +1 -1
  160. package/dist/types/src/internal/Entity/model.d.ts +21 -17
  161. package/dist/types/src/internal/Entity/model.d.ts.map +1 -1
  162. package/dist/types/src/internal/Entity/object.d.ts +3 -3
  163. package/dist/types/src/internal/Entity/object.d.ts.map +1 -1
  164. package/dist/types/src/internal/Entity/relation.d.ts +30 -7
  165. package/dist/types/src/internal/Entity/relation.d.ts.map +1 -1
  166. package/dist/types/src/internal/Entity/type-kind.d.ts +24 -0
  167. package/dist/types/src/internal/Entity/type-kind.d.ts.map +1 -0
  168. package/dist/types/src/internal/Entity/type-uri.d.ts +24 -0
  169. package/dist/types/src/internal/Entity/type-uri.d.ts.map +1 -0
  170. package/dist/types/src/internal/Entity/version.d.ts.map +1 -1
  171. package/dist/types/src/internal/Format/date.d.ts.map +1 -1
  172. package/dist/types/src/internal/Format/format.d.ts +3 -2
  173. package/dist/types/src/internal/Format/format.d.ts.map +1 -1
  174. package/dist/types/src/internal/Format/index.d.ts +2 -2
  175. package/dist/types/src/internal/Format/index.d.ts.map +1 -1
  176. package/dist/types/src/internal/Format/number.d.ts.map +1 -1
  177. package/dist/types/src/internal/Format/object.d.ts +3 -1
  178. package/dist/types/src/internal/Format/object.d.ts.map +1 -1
  179. package/dist/types/src/internal/Format/types.d.ts.map +1 -1
  180. package/dist/types/src/internal/JsonSchema/json-schema-normalize.d.ts.map +1 -1
  181. package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts +34 -34
  182. package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts.map +1 -1
  183. package/dist/types/src/internal/JsonSchema/json-schema.d.ts +3 -2
  184. package/dist/types/src/internal/JsonSchema/json-schema.d.ts.map +1 -1
  185. package/dist/types/src/internal/Obj/atoms.d.ts +43 -0
  186. package/dist/types/src/internal/Obj/atoms.d.ts.map +1 -0
  187. package/dist/types/src/internal/Obj/clone.d.ts.map +1 -1
  188. package/dist/types/src/internal/Obj/common.d.ts.map +1 -1
  189. package/dist/types/src/internal/Obj/create-object.d.ts +12 -12
  190. package/dist/types/src/internal/Obj/create-object.d.ts.map +1 -1
  191. package/dist/types/src/internal/Obj/deleted.d.ts.map +1 -1
  192. package/dist/types/src/internal/Obj/index.d.ts +1 -1
  193. package/dist/types/src/internal/Obj/index.d.ts.map +1 -1
  194. package/dist/types/src/internal/Obj/json-serializer.d.ts +8 -8
  195. package/dist/types/src/internal/Obj/json-serializer.d.ts.map +1 -1
  196. package/dist/types/src/internal/Obj/set-value.d.ts +1 -1
  197. package/dist/types/src/internal/Obj/set-value.d.ts.map +1 -1
  198. package/dist/types/src/internal/Obj/snapshot.d.ts.map +1 -1
  199. package/dist/types/src/internal/Obj/typed-object.d.ts +1 -1
  200. package/dist/types/src/internal/Query/index.d.ts +2 -0
  201. package/dist/types/src/internal/Query/index.d.ts.map +1 -0
  202. package/dist/types/src/internal/{Query.d.ts → Query/pretty.d.ts} +1 -1
  203. package/dist/types/src/internal/Query/pretty.d.ts.map +1 -0
  204. package/dist/types/src/internal/Ref/atoms.d.ts +10 -0
  205. package/dist/types/src/internal/Ref/atoms.d.ts.map +1 -0
  206. package/dist/types/src/internal/Ref/index.d.ts +1 -0
  207. package/dist/types/src/internal/Ref/index.d.ts.map +1 -1
  208. package/dist/types/src/internal/Ref/ref-array.d.ts +2 -2
  209. package/dist/types/src/internal/Ref/ref.d.ts +114 -19
  210. package/dist/types/src/internal/Ref/ref.d.ts.map +1 -1
  211. package/dist/types/src/internal/Ref/strong-deps.d.ts +35 -0
  212. package/dist/types/src/internal/Ref/strong-deps.d.ts.map +1 -0
  213. package/dist/types/src/internal/Ref/utils.d.ts +8 -0
  214. package/dist/types/src/internal/Ref/utils.d.ts.map +1 -0
  215. package/dist/types/src/internal/Type/compose.d.ts.map +1 -1
  216. package/dist/types/src/internal/Type/index.d.ts +1 -2
  217. package/dist/types/src/internal/Type/index.d.ts.map +1 -1
  218. package/dist/types/src/internal/Type/manipulation.d.ts +0 -1
  219. package/dist/types/src/internal/Type/manipulation.d.ts.map +1 -1
  220. package/dist/types/src/internal/Type/type-schema.d.ts +52 -0
  221. package/dist/types/src/internal/Type/type-schema.d.ts.map +1 -0
  222. package/dist/types/src/internal/common/api/meta.d.ts +14 -11
  223. package/dist/types/src/internal/common/api/meta.d.ts.map +1 -1
  224. package/dist/types/src/internal/common/proxy/change-context.d.ts +1 -1
  225. package/dist/types/src/internal/common/proxy/change-context.d.ts.map +1 -1
  226. package/dist/types/src/internal/common/proxy/define-hidden-property.d.ts.map +1 -1
  227. package/dist/types/src/internal/common/proxy/errors.d.ts +1 -1
  228. package/dist/types/src/internal/common/proxy/errors.d.ts.map +1 -1
  229. package/dist/types/src/internal/common/proxy/event-batch.d.ts.map +1 -1
  230. package/dist/types/src/internal/common/proxy/json-serializer.d.ts.map +1 -1
  231. package/dist/types/src/internal/common/proxy/make-object.d.ts +11 -5
  232. package/dist/types/src/internal/common/proxy/make-object.d.ts.map +1 -1
  233. package/dist/types/src/internal/common/proxy/ownership.d.ts.map +1 -1
  234. package/dist/types/src/internal/common/proxy/proxy-utils.d.ts.map +1 -1
  235. package/dist/types/src/internal/common/proxy/reactive-array.d.ts +1 -1
  236. package/dist/types/src/internal/common/proxy/reactive.d.ts +1 -1
  237. package/dist/types/src/internal/common/proxy/reactive.d.ts.map +1 -1
  238. package/dist/types/src/internal/common/proxy/reactive.test.d.ts +2 -0
  239. package/dist/types/src/internal/common/proxy/reactive.test.d.ts.map +1 -0
  240. package/dist/types/src/internal/common/proxy/schema-validator.d.ts.map +1 -1
  241. package/dist/types/src/internal/common/proxy/typed-handler.d.ts +18 -2
  242. package/dist/types/src/internal/common/proxy/typed-handler.d.ts.map +1 -1
  243. package/dist/types/src/internal/common/types/base.d.ts +4 -4
  244. package/dist/types/src/internal/common/types/base.d.ts.map +1 -1
  245. package/dist/types/src/internal/common/types/entity.d.ts +62 -5
  246. package/dist/types/src/internal/common/types/entity.d.ts.map +1 -1
  247. package/dist/types/src/internal/common/types/index.d.ts +1 -1
  248. package/dist/types/src/internal/common/types/index.d.ts.map +1 -1
  249. package/dist/types/src/internal/common/types/meta.d.ts +33 -12
  250. package/dist/types/src/internal/common/types/meta.d.ts.map +1 -1
  251. package/dist/types/src/internal/common/types/model-symbols.d.ts +15 -4
  252. package/dist/types/src/internal/common/types/model-symbols.d.ts.map +1 -1
  253. package/dist/types/src/internal/common/types/typename.d.ts +7 -0
  254. package/dist/types/src/internal/common/types/typename.d.ts.map +1 -1
  255. package/dist/types/src/internal/common/types/version.d.ts +1 -1
  256. package/dist/types/src/internal/common/types/well-known-types.d.ts +11 -0
  257. package/dist/types/src/internal/common/types/well-known-types.d.ts.map +1 -0
  258. package/dist/types/src/internal/index.d.ts +2 -2
  259. package/dist/types/src/internal/index.d.ts.map +1 -1
  260. package/dist/types/src/testing/index.d.ts +1 -0
  261. package/dist/types/src/testing/index.d.ts.map +1 -1
  262. package/dist/types/src/testing/registry.d.ts +9 -0
  263. package/dist/types/src/testing/registry.d.ts.map +1 -0
  264. package/dist/types/src/testing/test-data.d.ts +8 -8
  265. package/dist/types/src/testing/test-data.d.ts.map +1 -1
  266. package/dist/types/src/testing/test-schema.d.ts +83 -89
  267. package/dist/types/src/testing/test-schema.d.ts.map +1 -1
  268. package/dist/types/src/testing/util.d.ts +5 -3
  269. package/dist/types/src/testing/util.d.ts.map +1 -1
  270. package/dist/types/tsconfig.tsbuildinfo +1 -1
  271. package/package.json +26 -24
  272. package/src/Annotation.test.ts +439 -0
  273. package/src/Annotation.ts +163 -4
  274. package/src/Collection.ts +5 -9
  275. package/src/Database.ts +126 -101
  276. package/src/Dataset.ts +10 -2
  277. package/src/Entity.test.ts +116 -6
  278. package/src/Entity.ts +136 -32
  279. package/src/Err.ts +4 -4
  280. package/src/Feed.ts +95 -44
  281. package/src/Filter.ts +70 -40
  282. package/src/Format.ts +0 -4
  283. package/src/Hypergraph.ts +14 -9
  284. package/src/Json.test.ts +175 -0
  285. package/src/Json.ts +103 -0
  286. package/src/Key.ts +1 -1
  287. package/src/Migration.ts +39 -19
  288. package/src/Obj.test.ts +122 -20
  289. package/src/Obj.ts +170 -91
  290. package/src/Order.ts +22 -0
  291. package/src/Query.test.ts +183 -154
  292. package/src/Query.ts +172 -85
  293. package/src/QueryResult.ts +26 -0
  294. package/src/Ref.ts +22 -4
  295. package/src/Registry.ts +155 -0
  296. package/src/Relation.test.ts +10 -10
  297. package/src/Relation.ts +116 -69
  298. package/src/Scope.ts +50 -0
  299. package/src/Tag.md +88 -0
  300. package/src/Tag.ts +50 -6
  301. package/src/Type.test.ts +223 -18
  302. package/src/Type.ts +623 -131
  303. package/src/View.ts +14 -23
  304. package/src/exemplars.test.ts +21 -0
  305. package/src/index.ts +4 -4
  306. package/src/internal/Annotation/annotations.test.ts +31 -11
  307. package/src/internal/Annotation/annotations.ts +199 -111
  308. package/src/internal/Annotation/dictionary.ts +47 -0
  309. package/src/internal/Annotation/entity-dictionary.ts +74 -0
  310. package/src/internal/Annotation/index.ts +4 -2
  311. package/src/internal/Annotation/util.ts +17 -8
  312. package/src/internal/Entity/api.ts +54 -7
  313. package/src/internal/Entity/entity.ts +196 -47
  314. package/src/internal/Entity/guard.ts +26 -0
  315. package/src/internal/Entity/index.ts +2 -0
  316. package/src/internal/Entity/model.ts +38 -28
  317. package/src/internal/Entity/object.ts +21 -5
  318. package/src/internal/Entity/relation.ts +68 -34
  319. package/src/internal/Entity/type-kind.ts +75 -0
  320. package/src/internal/Entity/type-uri.ts +92 -0
  321. package/src/internal/Entity/util.ts +9 -9
  322. package/src/internal/Format/date.ts +0 -4
  323. package/src/internal/Format/format.test.ts +21 -0
  324. package/src/internal/Format/index.ts +2 -3
  325. package/src/internal/Format/object.ts +21 -4
  326. package/src/internal/Format/types.ts +1 -1
  327. package/src/internal/JsonSchema/annotations.ts +1 -1
  328. package/src/internal/JsonSchema/json-schema-type.ts +4 -4
  329. package/src/internal/JsonSchema/json-schema.test.ts +71 -145
  330. package/src/internal/JsonSchema/json-schema.ts +49 -35
  331. package/src/internal/Obj/atoms.ts +275 -0
  332. package/src/internal/Obj/clone.ts +9 -4
  333. package/src/internal/Obj/create-object.test.ts +12 -10
  334. package/src/internal/Obj/create-object.ts +68 -22
  335. package/src/internal/Obj/index.ts +1 -1
  336. package/src/internal/Obj/inspect.ts +5 -3
  337. package/src/internal/Obj/json-serializer.test.ts +101 -22
  338. package/src/internal/Obj/json-serializer.ts +92 -36
  339. package/src/internal/Obj/set-value.test.ts +22 -45
  340. package/src/internal/Obj/set-value.ts +12 -19
  341. package/src/internal/Obj/snapshot.ts +13 -4
  342. package/src/internal/Obj/typed-object.test.ts +9 -11
  343. package/src/internal/Obj/typed-object.ts +1 -1
  344. package/src/internal/Query/index.ts +5 -0
  345. package/src/internal/{Query.ts → Query/pretty.ts} +40 -12
  346. package/src/internal/Ref/atoms.ts +20 -0
  347. package/src/internal/Ref/index.ts +1 -0
  348. package/src/internal/Ref/ref-array.ts +3 -3
  349. package/src/internal/Ref/ref.test.ts +18 -27
  350. package/src/internal/Ref/ref.ts +224 -69
  351. package/src/internal/Ref/strong-deps.ts +107 -0
  352. package/src/internal/Ref/utils.ts +45 -0
  353. package/src/internal/Type/compose.test.ts +3 -1
  354. package/src/internal/Type/index.ts +1 -2
  355. package/src/internal/Type/manipulation.ts +0 -25
  356. package/src/internal/Type/type-schema.ts +60 -0
  357. package/src/internal/common/README.md +2 -2
  358. package/src/internal/common/api/meta.ts +19 -17
  359. package/src/internal/common/proxy/change-context.ts +1 -1
  360. package/src/internal/common/proxy/change.test.ts +91 -83
  361. package/src/internal/common/proxy/errors.ts +2 -2
  362. package/src/internal/common/proxy/handler.test.ts +1 -1
  363. package/src/internal/common/proxy/json-serializer.ts +27 -16
  364. package/src/internal/common/proxy/make-object.ts +44 -20
  365. package/src/internal/common/proxy/ownership.ts +2 -2
  366. package/src/internal/common/proxy/reactive-array.ts +1 -1
  367. package/src/internal/common/proxy/reactive.test.ts +54 -0
  368. package/src/internal/common/proxy/reactive.ts +11 -2
  369. package/src/internal/common/proxy/schema.test.ts +48 -86
  370. package/src/internal/common/proxy/typed-handler.test.ts +12 -11
  371. package/src/internal/common/proxy/typed-handler.ts +78 -16
  372. package/src/internal/common/proxy/typed-object.test.ts +16 -28
  373. package/src/internal/common/types/base.ts +4 -4
  374. package/src/internal/common/types/entity.ts +80 -1
  375. package/src/internal/common/types/index.ts +6 -1
  376. package/src/internal/common/types/meta.ts +62 -20
  377. package/src/internal/common/types/model-symbols.ts +24 -4
  378. package/src/internal/common/types/typename.ts +39 -3
  379. package/src/internal/common/types/well-known-types.ts +15 -0
  380. package/src/internal/index.ts +6 -4
  381. package/src/testing/api.test.ts +15 -9
  382. package/src/testing/index.ts +1 -0
  383. package/src/testing/registry.ts +44 -0
  384. package/src/testing/test-data.ts +159 -99
  385. package/src/testing/test-schema.ts +22 -58
  386. package/src/testing/util.ts +14 -11
  387. package/dist/lib/neutral/Extension.mjs +0 -18
  388. package/dist/lib/neutral/SchemaRegistry.mjs +0 -2
  389. package/dist/lib/neutral/chunk-2KHZ36F5.mjs +0 -361
  390. package/dist/lib/neutral/chunk-2KHZ36F5.mjs.map +0 -7
  391. package/dist/lib/neutral/chunk-4OIBYSXE.mjs.map +0 -7
  392. package/dist/lib/neutral/chunk-4P3IXBLT.mjs +0 -45
  393. package/dist/lib/neutral/chunk-4P3IXBLT.mjs.map +0 -7
  394. package/dist/lib/neutral/chunk-ANHVGJI4.mjs.map +0 -7
  395. package/dist/lib/neutral/chunk-B4BASU6W.mjs.map +0 -7
  396. package/dist/lib/neutral/chunk-BNCCGLJN.mjs +0 -7
  397. package/dist/lib/neutral/chunk-BNCCGLJN.mjs.map +0 -7
  398. package/dist/lib/neutral/chunk-BVOFLCVF.mjs.map +0 -7
  399. package/dist/lib/neutral/chunk-DQYLD2RB.mjs.map +0 -7
  400. package/dist/lib/neutral/chunk-EAMSSLZC.mjs.map +0 -7
  401. package/dist/lib/neutral/chunk-G3IQMKF7.mjs.map +0 -7
  402. package/dist/lib/neutral/chunk-GZQTCRJB.mjs.map +0 -7
  403. package/dist/lib/neutral/chunk-HBUZJNZO.mjs.map +0 -7
  404. package/dist/lib/neutral/chunk-JUXPFOEI.mjs.map +0 -7
  405. package/dist/lib/neutral/chunk-MOR5ERFM.mjs.map +0 -7
  406. package/dist/lib/neutral/chunk-OMUPQMLR.mjs.map +0 -7
  407. package/dist/lib/neutral/chunk-PHU22NLC.mjs +0 -136
  408. package/dist/lib/neutral/chunk-PHU22NLC.mjs.map +0 -7
  409. package/dist/lib/neutral/chunk-ROG4RXXL.mjs +0 -97
  410. package/dist/lib/neutral/chunk-ROG4RXXL.mjs.map +0 -7
  411. package/dist/lib/neutral/chunk-T6W2LEZU.mjs +0 -125
  412. package/dist/lib/neutral/chunk-T6W2LEZU.mjs.map +0 -7
  413. package/dist/lib/neutral/chunk-TBKX6JQO.mjs.map +0 -7
  414. package/dist/lib/neutral/chunk-TU3GW67D.mjs.map +0 -7
  415. package/dist/lib/neutral/chunk-UBEZSGXY.mjs.map +0 -7
  416. package/dist/lib/neutral/chunk-UI6MWK5W.mjs.map +0 -7
  417. package/dist/lib/neutral/chunk-V36VO5SS.mjs.map +0 -7
  418. package/dist/lib/neutral/chunk-WAK4DMFV.mjs.map +0 -7
  419. package/dist/lib/neutral/chunk-YAHXAYOW.mjs +0 -56
  420. package/dist/lib/neutral/chunk-YAHXAYOW.mjs.map +0 -7
  421. package/dist/lib/neutral/chunk-YS6Q3XAD.mjs +0 -50
  422. package/dist/lib/neutral/chunk-YS6Q3XAD.mjs.map +0 -7
  423. package/dist/types/src/Extension.d.ts +0 -80
  424. package/dist/types/src/Extension.d.ts.map +0 -1
  425. package/dist/types/src/Extension.test.d.ts +0 -2
  426. package/dist/types/src/Extension.test.d.ts.map +0 -1
  427. package/dist/types/src/SchemaRegistry.d.ts +0 -84
  428. package/dist/types/src/SchemaRegistry.d.ts.map +0 -1
  429. package/dist/types/src/internal/Obj/ids.d.ts +0 -6
  430. package/dist/types/src/internal/Obj/ids.d.ts.map +0 -1
  431. package/dist/types/src/internal/Query.d.ts.map +0 -1
  432. package/dist/types/src/internal/Type/echo-schema.d.ts +0 -181
  433. package/dist/types/src/internal/Type/echo-schema.d.ts.map +0 -1
  434. package/dist/types/src/internal/Type/persistent-schema.d.ts +0 -20
  435. package/dist/types/src/internal/Type/persistent-schema.d.ts.map +0 -1
  436. package/src/Extension.test.ts +0 -235
  437. package/src/Extension.ts +0 -122
  438. package/src/SchemaRegistry.ts +0 -106
  439. package/src/internal/Obj/ids.ts +0 -12
  440. package/src/internal/Type/echo-schema.ts +0 -423
  441. package/src/internal/Type/persistent-schema.ts +0 -33
  442. /package/dist/lib/neutral/{Extension.mjs.map → Registry.mjs.map} +0 -0
  443. /package/dist/lib/neutral/{SchemaRegistry.mjs.map → Scope.mjs.map} +0 -0
  444. /package/dist/lib/neutral/{chunk-7RO7CPBZ.mjs.map → chunk-PLDMJJJC.mjs.map} +0 -0
@@ -3,47 +3,70 @@ import {
3
3
  JsonSchemaType,
4
4
  toEffectSchema,
5
5
  toJsonSchema
6
- } from "./chunk-JUXPFOEI.mjs";
6
+ } from "./chunk-K3S7D5PR.mjs";
7
+ import {
8
+ ATTR_META,
9
+ EntityMetaSchema,
10
+ getMeta,
11
+ isEntity
12
+ } from "./chunk-X3NUUON4.mjs";
7
13
  import {
8
14
  Ref,
15
+ RefTypeId,
16
+ loadRefTarget,
9
17
  refFromEncodedReference,
10
18
  setRefResolver
11
- } from "./chunk-G3IQMKF7.mjs";
19
+ } from "./chunk-4TPQZPLY.mjs";
12
20
  import {
21
+ ATTR_DELETED,
13
22
  ATTR_PARENT,
23
+ ATTR_RELATION_SOURCE,
24
+ ATTR_RELATION_TARGET,
25
+ ATTR_SELF_URI,
26
+ ATTR_SELF_URI_LEGACY,
14
27
  ATTR_TYPE,
15
28
  IconAnnotation,
16
29
  LabelAnnotation,
30
+ MetaId,
31
+ ObjectDatabaseId,
32
+ ObjectDeletedId,
33
+ ObjectVersionId,
17
34
  ParentId,
35
+ RelationSourceDXNId,
36
+ RelationSourceId,
37
+ RelationTargetDXNId,
38
+ RelationTargetId,
18
39
  SchemaId,
19
- SchemaMetaSymbol,
40
+ SelfURIId,
20
41
  TypeAnnotationId,
42
+ TypeEntityId,
21
43
  TypeId,
22
- TypeIdentifierAnnotationId,
23
- TypenameSchema,
24
- VersionSchema,
44
+ assertObjectModel,
45
+ getDatabase,
25
46
  getEntityKind,
26
47
  getLabel,
48
+ getObjectEchoUri,
27
49
  getSchema,
28
- getSchemaDXN,
29
50
  getSchemaTypename,
51
+ getSchemaURI,
52
+ getType,
30
53
  getTypeAnnotation,
31
- getTypeDXN,
32
54
  getTypeIdentifierAnnotation,
55
+ getTypeURI,
33
56
  getTypename,
34
57
  setSchema,
58
+ setType,
35
59
  setTypename
36
- } from "./chunk-2KHZ36F5.mjs";
60
+ } from "./chunk-WZ32BF53.mjs";
37
61
  import {
38
62
  EntityKind,
39
63
  KindId,
40
64
  SchemaKindId,
41
65
  SnapshotKindId,
66
+ StaticTypeSchemaSlot,
67
+ getStaticTypeSchema,
42
68
  makeTypeJsonSchemaAnnotation
43
- } from "./chunk-TBKX6JQO.mjs";
44
-
45
- // src/internal/index.ts
46
- import { JsonPath, JsonProp, getValue, splitJsonPath } from "@dxos/effect";
69
+ } from "./chunk-O6BH7EPN.mjs";
47
70
 
48
71
  // src/internal/common/types/base.ts
49
72
  import * as Schema from "effect/Schema";
@@ -54,60 +77,6 @@ var RawObject = (schema) => {
54
77
  ]));
55
78
  };
56
79
 
57
- // src/internal/common/types/meta.ts
58
- import * as Schema2 from "effect/Schema";
59
- import { ForeignKey } from "@dxos/echo-protocol";
60
- import { invariant } from "@dxos/invariant";
61
- import { intersection } from "@dxos/util";
62
- var __dxlog_file = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/common/types/meta.ts";
63
- var ATTR_META = "@meta";
64
- var MetaId = /* @__PURE__ */ Symbol.for("@dxos/echo/Meta");
65
- var ObjectMetaSchema = Schema2.Struct({
66
- keys: Schema2.Array(ForeignKey),
67
- /**
68
- * A set of tags.
69
- * Tags are arbitrary application-defined strings.
70
- * ECHO makes no assumptions about the tag structure.
71
- */
72
- // TODO(dmaretskyi): Has to be optional for compatibility with old data.
73
- // Defaulting to an empty array is possible but requires a bit more work.
74
- // TODO(dmaretskyi): In automerge this should be a map of { [tag]: boolean } for uniqueness and conflict resolution.
75
- tags: Schema2.optional(Schema2.Array(Schema2.String))
76
- });
77
- var getMeta = (obj) => {
78
- const metadata = obj[MetaId];
79
- invariant(metadata, "ObjectMeta not found.", {
80
- F: __dxlog_file,
81
- L: 54,
82
- S: void 0,
83
- A: [
84
- "metadata",
85
- "'ObjectMeta not found.'"
86
- ]
87
- });
88
- return metadata;
89
- };
90
- var foreignKey = (source, id) => ({
91
- source,
92
- id
93
- });
94
- var foreignKeyEquals = (a, b) => a.source === b.source && a.id === b.id;
95
- var compareForeignKeys = (a, b) => intersection(getMeta(a).keys, getMeta(b).keys, foreignKeyEquals).length > 0;
96
-
97
- // src/internal/common/types/model-symbols.ts
98
- var ATTR_SELF_DXN = "@dxn";
99
- var SelfDXNId = /* @__PURE__ */ Symbol.for("@dxos/echo/DXN");
100
- var ATTR_DELETED = "@deleted";
101
- var ObjectDeletedId = /* @__PURE__ */ Symbol.for("@dxos/echo/Deleted");
102
- var ObjectVersionId = /* @__PURE__ */ Symbol.for("@dxos/echo/Version");
103
- var ObjectDatabaseId = /* @__PURE__ */ Symbol.for("@dxos/echo/Database");
104
- var ATTR_RELATION_SOURCE = "@relationSource";
105
- var RelationSourceId = /* @__PURE__ */ Symbol.for("@dxos/echo/RelationSource");
106
- var RelationSourceDXNId = /* @__PURE__ */ Symbol.for("@dxos/echo/RelationSourceDXN");
107
- var ATTR_RELATION_TARGET = "@relationTarget";
108
- var RelationTargetId = /* @__PURE__ */ Symbol.for("@dxos/echo/RelationTarget");
109
- var RelationTargetDXNId = /* @__PURE__ */ Symbol.for("@dxos/echo/RelationTargetDXN");
110
-
111
80
  // src/internal/common/types/version.ts
112
81
  var VersionTypeId = "~@dxos/echo/VersionTypeId";
113
82
 
@@ -135,62 +104,57 @@ var sort = (...comparators) => {
135
104
  };
136
105
  };
137
106
 
138
- // src/internal/common/api/meta.ts
139
- import { assertArgument, invariant as invariant2 } from "@dxos/invariant";
140
- var __dxlog_file2 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/common/api/meta.ts";
141
- function getMetaChecked(entity) {
142
- assertArgument(entity, "entity", "Should be an entity.");
143
- const meta = getMeta(entity);
144
- invariant2(meta != null, "Invalid entity.", {
145
- F: __dxlog_file2,
146
- L: 34,
147
- S: this,
148
- A: [
149
- "meta != null",
150
- "'Invalid entity.'"
151
- ]
152
- });
153
- return meta;
154
- }
155
- var getKeys = (entity, source) => {
156
- assertArgument(entity, "entity", "Should be an entity.");
157
- const meta = getMetaChecked(entity);
158
- invariant2(meta != null, "Invalid entity.", {
159
- F: __dxlog_file2,
160
- L: 45,
161
- S: void 0,
162
- A: [
163
- "meta != null",
164
- "'Invalid entity.'"
165
- ]
166
- });
167
- return meta.keys.filter((key) => key.source === source);
168
- };
169
- var deleteKeys = (entity, source) => {
170
- const meta = getMetaChecked(entity);
171
- for (let i = 0; i < meta.keys.length; i++) {
172
- if (meta.keys[i].source === source) {
173
- meta.keys.splice(i, 1);
174
- i--;
107
+ // src/internal/Ref/strong-deps.ts
108
+ import { EID } from "@dxos/keys";
109
+ var getStrongDependencyUris = (refs, owningSpaceId) => {
110
+ const res = [];
111
+ if (refs.type != null && EID.tryParse(refs.type) != null) {
112
+ res.push(qualifyToSpace(refs.type, owningSpaceId));
113
+ }
114
+ if (refs.kind === EntityKind.Relation) {
115
+ if (refs.source != null) {
116
+ res.push(qualifyToSpace(refs.source, owningSpaceId));
117
+ }
118
+ if (refs.target != null) {
119
+ res.push(qualifyToSpace(refs.target, owningSpaceId));
175
120
  }
176
121
  }
122
+ if (refs.parent != null) {
123
+ res.push(qualifyToSpace(refs.parent, owningSpaceId));
124
+ }
125
+ return res;
177
126
  };
178
- var addTag = (entity, tag) => {
179
- const meta = getMetaChecked(entity);
180
- meta.tags ??= [];
181
- meta.tags.push(tag);
182
- };
183
- var removeTag = (entity, tag) => {
184
- const meta = getMetaChecked(entity);
185
- if (!meta.tags) {
186
- return;
127
+ var qualifyToSpace = (uri, owningSpaceId) => {
128
+ if (owningSpaceId == null) {
129
+ return uri;
187
130
  }
188
- for (let i = 0; i < meta.tags.length; i++) {
189
- if (meta.tags[i] === tag) {
190
- meta.tags.splice(i, 1);
191
- i--;
192
- }
131
+ const eid = EID.tryParse(uri);
132
+ if (eid == null || !EID.isLocal(eid)) {
133
+ return uri;
193
134
  }
135
+ const entityId = EID.getEntityId(eid);
136
+ return entityId != null ? EID.make({
137
+ spaceId: owningSpaceId,
138
+ entityId
139
+ }) : uri;
140
+ };
141
+ var getStrongDependencies = (entity) => {
142
+ if (entity == null || typeof entity !== "object") {
143
+ return [];
144
+ }
145
+ const props = entity;
146
+ const kind = props[RelationSourceDXNId] != null || props[RelationTargetDXNId] != null ? EntityKind.Relation : EntityKind.Object;
147
+ const parent = props[ParentId];
148
+ const selfUri = getObjectEchoUri(entity);
149
+ const owningSpaceId = selfUri != null ? EID.getSpaceId(selfUri) : void 0;
150
+ return getStrongDependencyUris({
151
+ kind,
152
+ type: typeof props[TypeId] === "string" ? props[TypeId] : void 0,
153
+ source: props[RelationSourceDXNId],
154
+ target: props[RelationTargetDXNId],
155
+ // A parent is held as the resolved entity; derive its absolute URI for the dependency edge.
156
+ parent: parent != null ? getObjectEchoUri(parent) : void 0
157
+ }, owningSpaceId);
194
158
  };
195
159
 
196
160
  // src/internal/common/proxy/symbols.ts
@@ -282,7 +246,7 @@ var defineHiddenProperty = (object, key, value2) => {
282
246
  // src/internal/common/proxy/errors.ts
283
247
  var MutationOutsideChangeContextError = class extends Error {
284
248
  constructor(operation, suggestion) {
285
- super(`Cannot ${operation} outside of Obj.change(). Use Obj.change(obj, (mutableObj) => { ${suggestion} }) instead.`);
249
+ super(`Cannot ${operation} outside of Obj.update(). Use Obj.update(obj, (mutableObj) => { ${suggestion} }) instead.`);
286
250
  this.name = "MutationOutsideChangeContextError";
287
251
  }
288
252
  };
@@ -297,10 +261,10 @@ var createArrayMethodError = (method) => {
297
261
  };
298
262
 
299
263
  // src/internal/common/proxy/json-serializer.ts
300
- import { invariant as invariant3 } from "@dxos/invariant";
301
- import { DXN } from "@dxos/keys";
302
- import { deepMapValues } from "@dxos/util";
303
- var __dxlog_file3 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/common/proxy/json-serializer.ts";
264
+ import { invariant } from "@dxos/invariant";
265
+ import { EID as EID2 } from "@dxos/keys";
266
+ import { deepMapValues, encodeUint8ArrayToJson } from "@dxos/util";
267
+ var __dxlog_file = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/common/proxy/json-serializer.ts";
304
268
  var attachTypedJsonSerializer = (obj) => {
305
269
  const descriptor = Object.getOwnPropertyDescriptor(obj, "toJSON");
306
270
  if (descriptor) {
@@ -320,39 +284,23 @@ var typedJsonSerializer = function() {
320
284
  id
321
285
  };
322
286
  if (this[TypeId]) {
323
- result[ATTR_TYPE] = this[TypeId].toString();
287
+ result[ATTR_TYPE] = this[TypeId];
324
288
  }
325
289
  if (this[MetaId]) {
326
290
  result[ATTR_META] = serializeMeta(this[MetaId]);
327
291
  }
328
- if (this[SelfDXNId]) {
329
- result[ATTR_SELF_DXN] = this[SelfDXNId].toString();
292
+ if (this[SelfURIId]) {
293
+ result[ATTR_SELF_URI] = this[SelfURIId];
330
294
  }
331
295
  if (this[RelationSourceDXNId]) {
332
296
  const sourceDXN = this[RelationSourceDXNId];
333
- invariant3(sourceDXN instanceof DXN, void 0, {
334
- F: __dxlog_file3,
335
- L: 64,
336
- S: this,
337
- A: [
338
- "sourceDXN instanceof DXN",
339
- ""
340
- ]
341
- });
342
- result[ATTR_RELATION_SOURCE] = sourceDXN.toString();
297
+ invariant(EID2.isEID(sourceDXN), void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 44, S: this, A: ["EID.isEID(sourceDXN)", ""] });
298
+ result[ATTR_RELATION_SOURCE] = sourceDXN;
343
299
  }
344
300
  if (this[RelationTargetDXNId]) {
345
301
  const targetDXN = this[RelationTargetDXNId];
346
- invariant3(targetDXN instanceof DXN, void 0, {
347
- F: __dxlog_file3,
348
- L: 69,
349
- S: this,
350
- A: [
351
- "targetDXN instanceof DXN",
352
- ""
353
- ]
354
- });
355
- result[ATTR_RELATION_TARGET] = targetDXN.toString();
302
+ invariant(EID2.isEID(targetDXN), void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 49, S: this, A: ["EID.isEID(targetDXN)", ""] });
303
+ result[ATTR_RELATION_TARGET] = targetDXN;
356
304
  }
357
305
  Object.assign(result, serializeData(rest));
358
306
  return result;
@@ -362,19 +310,32 @@ var serializeData = (data) => {
362
310
  if (Ref.isRef(value2)) {
363
311
  return value2.noInline().encode();
364
312
  }
313
+ if (value2 instanceof Uint8Array) {
314
+ return encodeUint8ArrayToJson(value2);
315
+ }
365
316
  return recurse(value2);
366
317
  });
367
318
  };
368
319
  var serializeMeta = (meta) => {
369
- return deepMapValues(meta, (value2, recurse) => recurse(value2));
320
+ const { tags, annotations: annotations5, ...rest } = meta;
321
+ const compact = {
322
+ ...rest,
323
+ ...tags != null && tags.length > 0 ? {
324
+ tags
325
+ } : {},
326
+ ...annotations5 != null && Object.keys(annotations5).length > 0 ? {
327
+ annotations: annotations5
328
+ } : {}
329
+ };
330
+ return serializeData(compact);
370
331
  };
371
332
 
372
333
  // src/internal/common/proxy/make-object.ts
373
- import { ObjectId } from "@dxos/keys";
334
+ import { EntityId } from "@dxos/keys";
374
335
 
375
336
  // src/internal/common/proxy/proxy-utils.ts
376
- import { invariant as invariant4 } from "@dxos/invariant";
377
- var __dxlog_file4 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/common/proxy/proxy-utils.ts";
337
+ import { invariant as invariant2 } from "@dxos/invariant";
338
+ var __dxlog_file2 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/common/proxy/proxy-utils.ts";
378
339
  var symbolIsProxy = /* @__PURE__ */ Symbol.for("@dxos/schema/Proxy");
379
340
  var isProxy = (value2) => !!value2?.[symbolIsProxy];
380
341
  var isValidProxyTarget = (value2) => {
@@ -388,15 +349,7 @@ var isValidProxyTarget = (value2) => {
388
349
  };
389
350
  var getProxySlot = (proxy) => {
390
351
  const value2 = proxy[symbolIsProxy];
391
- invariant4(value2 instanceof ProxyHandlerSlot, void 0, {
392
- F: __dxlog_file4,
393
- L: 32,
394
- S: void 0,
395
- A: [
396
- "value instanceof ProxyHandlerSlot",
397
- ""
398
- ]
399
- });
352
+ invariant2(value2 instanceof ProxyHandlerSlot, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 22, S: void 0, A: ["value instanceof ProxyHandlerSlot", ""] });
400
353
  return value2;
401
354
  };
402
355
  var getProxyTarget = (proxy) => {
@@ -430,15 +383,7 @@ var ProxyHandlerSlot = class {
430
383
  this._handler = _handler;
431
384
  }
432
385
  get handler() {
433
- invariant4(this._handler, void 0, {
434
- F: __dxlog_file4,
435
- L: 91,
436
- S: this,
437
- A: [
438
- "this._handler",
439
- ""
440
- ]
441
- });
386
+ invariant2(this._handler, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 71, S: this, A: ["this._handler", ""] });
442
387
  return this._handler;
443
388
  }
444
389
  // TODO(burdon): Requires comment.
@@ -491,15 +436,15 @@ var ProxyHandlerSlot = class {
491
436
  };
492
437
 
493
438
  // src/internal/common/proxy/typed-handler.ts
494
- import * as Schema4 from "effect/Schema";
439
+ import * as Schema3 from "effect/Schema";
495
440
  import * as SchemaAST3 from "effect/SchemaAST";
496
441
  import { Event } from "@dxos/async";
497
442
  import { inspectCustom } from "@dxos/debug";
498
- import { invariant as invariant7 } from "@dxos/invariant";
443
+ import { assertArgument, invariant as invariant5 } from "@dxos/invariant";
499
444
 
500
445
  // src/internal/common/proxy/ownership.ts
501
- import { invariant as invariant5 } from "@dxos/invariant";
502
- var __dxlog_file5 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/common/proxy/ownership.ts";
446
+ import { invariant as invariant3 } from "@dxos/invariant";
447
+ var __dxlog_file3 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/common/proxy/ownership.ts";
503
448
  var EchoOwner = /* @__PURE__ */ Symbol.for("@dxos/echo/Owner");
504
449
  var getRawTarget = (value2) => {
505
450
  return isProxy(value2) ? getProxyTarget(value2) : value2;
@@ -528,15 +473,7 @@ var setOwnerRecursive = (value2, owner, options = {}) => {
528
473
  }
529
474
  if (!isRootEchoObject) {
530
475
  const ownershipAllowed = existingOwner == null || existingOwner === owner || existingOwner === newAllowedPreviousOwner;
531
- invariant5(ownershipAllowed, "Cannot reassign ownership of a nested record to a different ECHO object. Use deep copy first.", {
532
- F: __dxlog_file5,
533
- L: 101,
534
- S: void 0,
535
- A: [
536
- "ownershipAllowed",
537
- "'Cannot reassign ownership of a nested record to a different ECHO object. Use deep copy first.'"
538
- ]
539
- });
476
+ invariant3(ownershipAllowed, "Cannot reassign ownership of a nested record to a different ECHO object. Use deep copy first.", { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 76, S: void 0, A: ["ownershipAllowed", "'Cannot reassign ownership of a nested record to a different ECHO object. Use deep copy first.'"] });
540
477
  }
541
478
  defineHiddenProperty(actualValue, EchoOwner, owner);
542
479
  const recursiveOptions = {
@@ -603,15 +540,7 @@ var hasForeignOwner = (value2, target) => traverseObjectGraph(value2, (v) => {
603
540
  });
604
541
  var MAX_OWNER_DEPTH = 100;
605
542
  var getEchoRoot = (target, depth = 0) => {
606
- invariant5(depth < MAX_OWNER_DEPTH, "Owner chain too deep - possible circular ownership", {
607
- F: __dxlog_file5,
608
- L: 220,
609
- S: void 0,
610
- A: [
611
- "depth < MAX_OWNER_DEPTH",
612
- "'Owner chain too deep - possible circular ownership'"
613
- ]
614
- });
543
+ invariant3(depth < MAX_OWNER_DEPTH, "Owner chain too deep - possible circular ownership", { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 169, S: void 0, A: ["depth < MAX_OWNER_DEPTH", "'Owner chain too deep - possible circular ownership'"] });
615
544
  if (KindId in target) {
616
545
  return target;
617
546
  }
@@ -675,18 +604,18 @@ var ReactiveArray = class extends Array {
675
604
  };
676
605
 
677
606
  // src/internal/common/proxy/schema-validator.ts
678
- import * as Schema3 from "effect/Schema";
607
+ import * as Schema2 from "effect/Schema";
679
608
  import * as SchemaAST2 from "effect/SchemaAST";
680
- import { invariant as invariant6 } from "@dxos/invariant";
609
+ import { invariant as invariant4 } from "@dxos/invariant";
681
610
  import { log } from "@dxos/log";
682
- var __dxlog_file6 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/common/proxy/schema-validator.ts";
611
+ var __dxlog_file4 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/common/proxy/schema-validator.ts";
683
612
  var SchemaValidator = class {
684
613
  /**
685
614
  * Recursively check that schema specifies constructions we can handle.
686
615
  * Validates there are no ambiguous discriminated union types.
687
616
  */
688
617
  static validateSchema(schema) {
689
- const visitAll = (nodes) => nodes.forEach((node) => this.validateSchema(Schema3.make(node)));
618
+ const visitAll = (nodes) => nodes.forEach((node) => this.validateSchema(Schema2.make(node)));
690
619
  if (SchemaAST2.isUnion(schema.ast)) {
691
620
  const typeAstList = schema.ast.types.filter((type) => SchemaAST2.isTypeLiteral(type));
692
621
  if (typeAstList.length > 1) {
@@ -733,70 +662,41 @@ var SchemaValidator = class {
733
662
  log.warn("unknown property", {
734
663
  path: propertyPath,
735
664
  property: propertyName
736
- }, {
737
- F: __dxlog_file6,
738
- L: 71,
739
- S: this,
740
- C: (f, a) => f(...a)
741
- });
665
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 60, S: this });
742
666
  continue;
743
667
  }
744
- schema = Schema3.make(propertyType).annotations(propertyType.annotations);
668
+ schema = Schema2.make(propertyType).annotations(propertyType.annotations);
745
669
  }
746
670
  }
747
671
  return schema;
748
672
  }
749
673
  static getTargetPropertySchema(target, prop) {
750
674
  const schema = target[SchemaId];
751
- invariant6(schema, "target has no schema", {
752
- F: __dxlog_file6,
753
- L: 84,
754
- S: this,
755
- A: [
756
- "schema",
757
- "'target has no schema'"
758
- ]
759
- });
675
+ invariant4(schema, "target has no schema", { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 73, S: this, A: ["schema", "'target has no schema'"] });
760
676
  const arrayAst = unwrapArray(schema.ast);
761
677
  if (arrayAst != null) {
762
678
  return getArrayElementSchema(arrayAst, prop);
763
679
  }
764
680
  const propertyType = getPropertyType(schema.ast, prop.toString(), (prop2) => target[prop2]);
765
681
  if (propertyType == null) {
766
- return Schema3.Any;
767
- }
768
- invariant6(propertyType, `invalid property: ${prop.toString()}`, {
769
- F: __dxlog_file6,
770
- L: 95,
771
- S: this,
772
- A: [
773
- "propertyType",
774
- "`invalid property: ${prop.toString()}`"
775
- ]
776
- });
777
- return Schema3.make(propertyType);
682
+ return Schema2.Any;
683
+ }
684
+ invariant4(propertyType, `invalid property: ${prop.toString()}`, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 82, S: this, A: ["propertyType", "`invalid property: ${prop.toString()}`"] });
685
+ return Schema2.make(propertyType);
778
686
  }
779
687
  };
780
688
  var getArrayElementSchema = (tupleAst, property) => {
781
689
  const elementIndex = typeof property === "string" ? parseInt(property, 10) : Number.NaN;
782
690
  if (Number.isNaN(elementIndex)) {
783
- invariant6(property === "length", `invalid array property: ${String(property)}`, {
784
- F: __dxlog_file6,
785
- L: 111,
786
- S: void 0,
787
- A: [
788
- "property === 'length'",
789
- "`invalid array property: ${String(property)}`"
790
- ]
791
- });
792
- return Schema3.Number;
691
+ invariant4(property === "length", `invalid array property: ${String(property)}`, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 93, S: void 0, A: ["property === 'length'", "`invalid array property: ${String(property)}`"] });
692
+ return Schema2.Number;
793
693
  }
794
694
  if (elementIndex < tupleAst.elements.length) {
795
695
  const elementType = tupleAst.elements[elementIndex].type;
796
- return Schema3.make(elementType).annotations(elementType.annotations);
696
+ return Schema2.make(elementType).annotations(elementType.annotations);
797
697
  }
798
698
  const restType = tupleAst.rest;
799
- return Schema3.make(restType[0].type).annotations(restType[0].annotations);
699
+ return Schema2.make(restType[0].type).annotations(restType[0].annotations);
800
700
  };
801
701
  var flattenUnion = (typeAst) => SchemaAST2.isUnion(typeAst) ? typeAst.types.flatMap(flattenUnion) : [
802
702
  typeAst
@@ -813,15 +713,7 @@ var getProperties = (typeAst, getTargetPropertyFn) => {
813
713
  const typeDiscriminators = getTypeDiscriminators(typeAstList);
814
714
  const targetPropertyValue = getTargetPropertyFn(String(typeDiscriminators[0].name));
815
715
  const typeIndex = typeDiscriminators.findIndex((p) => targetPropertyValue === p.type.literal);
816
- invariant6(typeIndex !== -1, "discriminator field not set on target", {
817
- F: __dxlog_file6,
818
- L: 142,
819
- S: void 0,
820
- A: [
821
- "typeIndex !== -1",
822
- "'discriminator field not set on target'"
823
- ]
824
- });
716
+ invariant4(typeIndex !== -1, "discriminator field not set on target", { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 118, S: void 0, A: ["typeIndex !== -1", "'discriminator field not set on target'"] });
825
717
  return SchemaAST2.getPropertySignatures(typeAstList[typeIndex]);
826
718
  };
827
719
  var getPropertyType = (ast, propertyName, getTargetPropertyFn) => {
@@ -851,15 +743,7 @@ var getTypeDiscriminators = (typeAstList) => {
851
743
  const isValidDiscriminator = discriminatorPropCandidates.every((p) => p.name === propertyName && !p.isOptional);
852
744
  const everyTypeHasDiscriminator = discriminatorPropCandidates.length === typeAstList.length;
853
745
  const isDiscriminatedUnion = isValidDiscriminator && everyTypeHasDiscriminator;
854
- invariant6(isDiscriminatedUnion, "type ambiguity: every type in a union must have a single unique-literal field", {
855
- F: __dxlog_file6,
856
- L: 193,
857
- S: void 0,
858
- A: [
859
- "isDiscriminatedUnion",
860
- "'type ambiguity: every type in a union must have a single unique-literal field'"
861
- ]
862
- });
746
+ invariant4(isDiscriminatedUnion, "type ambiguity: every type in a union must have a single unique-literal field", { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 148, S: void 0, A: ["isDiscriminatedUnion", "'type ambiguity: every type in a union must have a single unique-literal field'"] });
863
747
  return discriminatorPropCandidates;
864
748
  };
865
749
  var unwrapAst = (rootAst, predicate) => {
@@ -885,15 +769,7 @@ var unwrapAst = (rootAst, predicate) => {
885
769
  };
886
770
  var unwrapArray = (ast) => unwrapAst(ast, SchemaAST2.isTupleType);
887
771
  var checkIdNotPresentOnSchema = (schema) => {
888
- invariant6(SchemaAST2.isTypeLiteral(schema.ast), void 0, {
889
- F: __dxlog_file6,
890
- L: 236,
891
- S: void 0,
892
- A: [
893
- "SchemaAST.isTypeLiteral(schema.ast)",
894
- ""
895
- ]
896
- });
772
+ invariant4(SchemaAST2.isTypeLiteral(schema.ast), void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 184, S: void 0, A: ["SchemaAST.isTypeLiteral(schema.ast)", ""] });
897
773
  const idProperty = SchemaAST2.getPropertySignatures(schema.ast).find((prop) => prop.name === "id");
898
774
  if (idProperty != null) {
899
775
  throw new Error('"id" property name is reserved');
@@ -901,7 +777,7 @@ var checkIdNotPresentOnSchema = (schema) => {
901
777
  };
902
778
 
903
779
  // src/internal/common/proxy/typed-handler.ts
904
- var __dxlog_file7 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/common/proxy/typed-handler.ts";
780
+ var __dxlog_file5 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/common/proxy/typed-handler.ts";
905
781
  var deepCopy = (value2, visited = /* @__PURE__ */ new Map()) => {
906
782
  if (value2 == null || typeof value2 !== "object") {
907
783
  return value2;
@@ -954,24 +830,8 @@ var TypedReactiveHandler = class _TypedReactiveHandler {
954
830
  constructor() {
955
831
  }
956
832
  init(target) {
957
- invariant7(typeof target === "object" && target !== null, void 0, {
958
- F: __dxlog_file7,
959
- L: 145,
960
- S: this,
961
- A: [
962
- "typeof target === 'object' && target !== null",
963
- ""
964
- ]
965
- });
966
- invariant7(SchemaId in target, "Schema is not defined for the target", {
967
- F: __dxlog_file7,
968
- L: 146,
969
- S: this,
970
- A: [
971
- "SchemaId in target",
972
- "'Schema is not defined for the target'"
973
- ]
974
- });
833
+ assertArgument(typeof target === "object" && target !== null, "target");
834
+ invariant5(SchemaId in target, "Schema is not defined for the target", { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 101, S: this, A: ["SchemaId in target", "'Schema is not defined for the target'"] });
975
835
  const hasOwner = !!getOwner(target);
976
836
  if (!(EventId in target) && !hasOwner) {
977
837
  defineHiddenProperty(target, EventId, new Event());
@@ -1013,6 +873,22 @@ var TypedReactiveHandler = class _TypedReactiveHandler {
1013
873
  }
1014
874
  return (callback) => executeChange(target, target, receiver, callback);
1015
875
  }
876
+ case TypeEntityId: {
877
+ return Reflect.get(target, prop, receiver);
878
+ }
879
+ case StaticTypeSchemaSlot: {
880
+ const existing = Reflect.get(target, prop, receiver);
881
+ if (existing !== void 0) {
882
+ return existing;
883
+ }
884
+ const jsonSchema = target.jsonSchema;
885
+ if (jsonSchema == null) {
886
+ return void 0;
887
+ }
888
+ const rebuilt = toEffectSchema(jsonSchema);
889
+ defineHiddenProperty(target, StaticTypeSchemaSlot, rebuilt);
890
+ return rebuilt;
891
+ }
1016
892
  }
1017
893
  if (Object.getOwnPropertyDescriptor(target, prop)?.get) {
1018
894
  return Reflect.get(target, prop, receiver);
@@ -1028,7 +904,7 @@ var TypedReactiveHandler = class _TypedReactiveHandler {
1028
904
  const isInitialized = ChangeId in echoRoot || EventId in echoRoot;
1029
905
  const isSymbolProp = typeof prop === "symbol";
1030
906
  if (isInitialized && !isSymbolProp && !isInChangeContext(echoRoot)) {
1031
- throw new Error(`Cannot modify object property "${String(prop)}" outside of Obj.change(). Use Obj.change(obj, (mutableObj) => { mutableObj.property = value; }) instead.`);
907
+ throw new Error(`Cannot modify object property "${String(prop)}" outside of Obj.update(). Use Obj.update(obj, (mutableObj) => { mutableObj.property = value; }) instead.`);
1032
908
  }
1033
909
  let result = false;
1034
910
  this._inSet = true;
@@ -1036,6 +912,9 @@ var TypedReactiveHandler = class _TypedReactiveHandler {
1036
912
  batchEvents(() => {
1037
913
  const { echoRoot: _, preparedValue } = this._prepareValueForAssignment(target, prop, value2);
1038
914
  result = Reflect.set(target, prop, preparedValue, receiver);
915
+ if (prop === "jsonSchema") {
916
+ Reflect.deleteProperty(target, StaticTypeSchemaSlot);
917
+ }
1039
918
  if (isInitialized) {
1040
919
  queueNotification(echoRoot);
1041
920
  notifyOwnerChain(target);
@@ -1067,7 +946,7 @@ var TypedReactiveHandler = class _TypedReactiveHandler {
1067
946
  const isInitialized = ChangeId in echoRoot || EventId in echoRoot;
1068
947
  const isSymbolProp = typeof property === "symbol";
1069
948
  if (isInitialized && !isSymbolProp && !isInChangeContext(echoRoot)) {
1070
- throw new Error(`Cannot modify object property "${String(property)}" outside of Obj.change(). Use Obj.change(obj, (mutableObj) => { mutableObj.property = value; }) instead.`);
949
+ throw new Error(`Cannot modify object property "${String(property)}" outside of Obj.update(). Use Obj.update(obj, (mutableObj) => { mutableObj.property = value; }) instead.`);
1071
950
  }
1072
951
  const { echoRoot: _, preparedValue } = this._prepareValueForAssignment(target, property, attributes.value);
1073
952
  const result = Reflect.defineProperty(target, property, {
@@ -1127,7 +1006,7 @@ var TypedReactiveHandler = class _TypedReactiveHandler {
1127
1006
  return value2;
1128
1007
  }
1129
1008
  const schema = SchemaValidator.getTargetPropertySchema(target, prop);
1130
- const _ = Schema4.asserts(schema)(value2);
1009
+ const _ = Schema3.asserts(schema)(value2);
1131
1010
  if (isValidProxyTarget(value2)) {
1132
1011
  setSchemaProperties(value2, schema);
1133
1012
  }
@@ -1148,12 +1027,21 @@ var toJSON = (target) => {
1148
1027
  ...target
1149
1028
  };
1150
1029
  };
1151
- var setSchemaProperties = (obj, schema) => {
1152
- const schemaType = getSchemaDXN(schema);
1030
+ var setSchemaProperties = (obj, schema, typeSource) => {
1031
+ const schemaType = getSchemaURI(schema);
1153
1032
  if (schemaType != null) {
1154
1033
  defineHiddenProperty(obj, TypeId, schemaType);
1155
1034
  }
1156
- defineHiddenProperty(obj, SchemaId, schema);
1035
+ if (typeSource != null) {
1036
+ defineHiddenProperty(obj, TypeEntityId, typeSource);
1037
+ Object.defineProperty(obj, SchemaId, {
1038
+ get: () => typeSource[StaticTypeSchemaSlot] ?? schema,
1039
+ enumerable: false,
1040
+ configurable: true
1041
+ });
1042
+ } else {
1043
+ defineHiddenProperty(obj, SchemaId, schema);
1044
+ }
1157
1045
  for (const key in obj) {
1158
1046
  if (isValidProxyTarget(obj[key])) {
1159
1047
  const elementSchema = SchemaValidator.getTargetPropertySchema(obj, key);
@@ -1163,14 +1051,14 @@ var setSchemaProperties = (obj, schema) => {
1163
1051
  }
1164
1052
  }
1165
1053
  };
1166
- var prepareTypedTarget = (target, schema) => {
1054
+ var prepareTypedTarget = (target, schema, typeSource) => {
1167
1055
  if (!SchemaAST3.isTypeLiteral(schema.ast)) {
1168
1056
  throw new Error("schema has to describe an object type");
1169
1057
  }
1170
1058
  SchemaValidator.validateSchema(schema);
1171
- const _ = Schema4.asserts(schema)(target);
1059
+ const _ = Schema3.asserts(schema)(target);
1172
1060
  makeArraysReactive(target);
1173
- setSchemaProperties(target, schema);
1061
+ setSchemaProperties(target, schema, typeSource);
1174
1062
  };
1175
1063
  var makeArraysReactive = (target) => {
1176
1064
  for (const key in target) {
@@ -1187,10 +1075,10 @@ var makeArraysReactive = (target) => {
1187
1075
  };
1188
1076
 
1189
1077
  // src/internal/common/proxy/make-object.ts
1190
- var makeObject = (schema, obj, meta) => {
1191
- return createReactiveObject(Object.assign({}, obj), meta, schema);
1078
+ var makeObject = (schema, obj, meta, typeSource) => {
1079
+ return createReactiveObject(Object.assign({}, obj), meta, schema, typeSource);
1192
1080
  };
1193
- var createReactiveObject = (obj, meta, schema) => {
1081
+ var createReactiveObject = (obj, meta, schema, typeSource) => {
1194
1082
  if (!isValidProxyTarget(obj)) {
1195
1083
  throw new Error("Value cannot be made into a reactive object.");
1196
1084
  }
@@ -1210,7 +1098,7 @@ var createReactiveObject = (obj, meta, schema) => {
1210
1098
  if (parent !== void 0) {
1211
1099
  defineHiddenProperty(obj, ParentId, parent);
1212
1100
  }
1213
- prepareTypedTarget(obj, schema);
1101
+ prepareTypedTarget(obj, schema, typeSource);
1214
1102
  attachTypedJsonSerializer(obj);
1215
1103
  const proxy = createProxy(obj, TypedReactiveHandler.instance);
1216
1104
  const metaProxy = obj[MetaId];
@@ -1224,22 +1112,30 @@ var createReactiveObject = (obj, meta, schema) => {
1224
1112
  };
1225
1113
  var setIdOnTarget = (target) => {
1226
1114
  if ("id" in target && target.id !== void 0 && target.id !== null) {
1227
- if (!ObjectId.isValid(target.id)) {
1115
+ if (!EntityId.isValid(target.id)) {
1228
1116
  throw new Error("Invalid object id format.");
1229
1117
  }
1230
1118
  } else {
1231
- target.id = ObjectId.random();
1119
+ target.id = EntityId.random();
1232
1120
  }
1233
1121
  };
1234
- var initMeta = (obj, meta = {
1235
- keys: []
1236
- }) => {
1237
- prepareTypedTarget(meta, ObjectMetaSchema);
1238
- defineHiddenProperty(obj, MetaId, createProxy(meta, TypedReactiveHandler.instance));
1122
+ var initMeta = (obj, meta) => {
1123
+ const fullMeta = {
1124
+ ...meta,
1125
+ keys: meta?.keys ?? [],
1126
+ tags: meta?.tags ?? [],
1127
+ annotations: meta?.annotations ?? {}
1128
+ };
1129
+ prepareTypedTarget(fullMeta, EntityMetaSchema);
1130
+ defineHiddenProperty(obj, MetaId, createProxy(fullMeta, TypedReactiveHandler.instance));
1239
1131
  };
1240
1132
 
1241
1133
  // src/internal/common/proxy/reactive.ts
1242
1134
  var subscribe = (obj, callback) => {
1135
+ if (!isProxy(obj)) {
1136
+ return () => {
1137
+ };
1138
+ }
1243
1139
  const target = getProxyTarget(obj);
1244
1140
  if (target && EventId in target) {
1245
1141
  return target[EventId].on(callback);
@@ -1256,208 +1152,177 @@ var change = (obj, callback) => {
1256
1152
  }
1257
1153
  };
1258
1154
 
1259
- // src/internal/Entity/api.ts
1260
- import { invariant as invariant10 } from "@dxos/invariant";
1261
- import { assumeType as assumeType3 } from "@dxos/util";
1262
-
1263
- // src/internal/Entity/model.ts
1264
- import { invariant as invariant8 } from "@dxos/invariant";
1265
- import { DXN as DXN2, ObjectId as ObjectId2 } from "@dxos/keys";
1266
- import { assumeType } from "@dxos/util";
1267
- var __dxlog_file8 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/Entity/model.ts";
1268
- function assertObjectModel(obj) {
1269
- invariant8(typeof obj === "object" && obj !== null, "Invalid object model: not an object", {
1270
- F: __dxlog_file8,
1271
- L: 94,
1272
- S: this,
1273
- A: [
1274
- "typeof obj === 'object' && obj !== null",
1275
- "'Invalid object model: not an object'"
1276
- ]
1155
+ // src/internal/Entity/entity.ts
1156
+ import * as Schema4 from "effect/Schema";
1157
+ import * as SchemaAST4 from "effect/SchemaAST";
1158
+ import { DXN, EntityId as EntityId2 } from "@dxos/keys";
1159
+ var TypeMetaSchemaDXN = DXN.make("org.dxos.type.schema", "0.1.0");
1160
+ var persistentEntitySchema = (() => {
1161
+ const typename = DXN.getName(TypeMetaSchemaDXN);
1162
+ const version2 = DXN.getVersion(TypeMetaSchemaDXN);
1163
+ const struct = Schema4.Struct({
1164
+ name: Schema4.optional(Schema4.String),
1165
+ jsonSchema: JsonSchemaType.pipe(Schema4.optional),
1166
+ id: EntityId2
1277
1167
  });
1278
- assumeType(obj);
1279
- invariant8(ObjectId2.isValid(obj.id), "Invalid object model: invalid id", {
1280
- F: __dxlog_file8,
1281
- L: 96,
1282
- S: this,
1283
- A: [
1284
- "ObjectId.isValid(obj.id)",
1285
- "'Invalid object model: invalid id'"
1286
- ]
1168
+ const ast = SchemaAST4.annotations(struct.ast, {
1169
+ [TypeAnnotationId]: {
1170
+ kind: EntityKind.Type,
1171
+ typename,
1172
+ version: version2
1173
+ },
1174
+ [SchemaAST4.JSONSchemaAnnotationId]: makeTypeJsonSchemaAnnotation({
1175
+ kind: EntityKind.Type,
1176
+ typename,
1177
+ version: version2
1178
+ })
1287
1179
  });
1288
- invariant8(obj[TypeId] === void 0 || obj[TypeId] instanceof DXN2, "Invalid object model: invalid type", {
1289
- F: __dxlog_file8,
1290
- L: 97,
1291
- S: this,
1292
- A: [
1293
- "obj[TypeId] === undefined || obj[TypeId] instanceof DXN",
1294
- "'Invalid object model: invalid type'"
1295
- ]
1180
+ return Schema4.make(ast);
1181
+ })();
1182
+ var makeEchoTypeSchema = (fields, ast, typename, version2, kind, computeJsonSchema, explicitId) => {
1183
+ const sourceSchema = Schema4.make(ast);
1184
+ const meta = {
1185
+ keys: [],
1186
+ key: typename,
1187
+ version: version2
1188
+ };
1189
+ const id = explicitId ?? EntityId2.deterministic(typename, version2);
1190
+ const entity = makeObject(persistentEntitySchema, {
1191
+ id
1192
+ }, meta);
1193
+ const target = getProxyTarget(entity);
1194
+ let memoizedJsonSchema;
1195
+ Object.defineProperty(target, "jsonSchema", {
1196
+ configurable: true,
1197
+ enumerable: true,
1198
+ get() {
1199
+ return memoizedJsonSchema ??= computeJsonSchema();
1200
+ },
1201
+ set(value2) {
1202
+ memoizedJsonSchema = value2;
1203
+ }
1296
1204
  });
1297
- invariant8(obj[KindId] === EntityKind.Object || obj[KindId] === EntityKind.Relation, "Invalid object model: invalid entity kind", {
1298
- F: __dxlog_file8,
1299
- L: 98,
1300
- S: this,
1301
- A: [
1302
- "obj[KindId] === EntityKind.Object || obj[KindId] === EntityKind.Relation",
1303
- "'Invalid object model: invalid entity kind'"
1304
- ]
1205
+ defineHiddenProperty(target, StaticTypeSchemaSlot, sourceSchema);
1206
+ defineHiddenProperty(target, SchemaKindId, kind);
1207
+ Object.defineProperty(target, "fields", {
1208
+ configurable: true,
1209
+ enumerable: false,
1210
+ get: () => fields
1305
1211
  });
1306
- if (obj[KindId] === EntityKind.Relation) {
1307
- invariant8(obj[RelationSourceDXNId] instanceof DXN2, "Invalid object model: invalid relation source", {
1308
- F: __dxlog_file8,
1309
- L: 104,
1310
- S: this,
1311
- A: [
1312
- "obj[RelationSourceDXNId] instanceof DXN",
1313
- "'Invalid object model: invalid relation source'"
1314
- ]
1315
- });
1316
- invariant8(obj[RelationTargetDXNId] instanceof DXN2, "Invalid object model: invalid relation target", {
1317
- F: __dxlog_file8,
1318
- L: 105,
1319
- S: this,
1320
- A: [
1321
- "obj[RelationTargetDXNId] instanceof DXN",
1322
- "'Invalid object model: invalid relation target'"
1323
- ]
1324
- });
1325
- invariant8(!(obj[RelationSourceId] instanceof DXN2), "Invalid object model: source pointer is a DXN", {
1326
- F: __dxlog_file8,
1327
- L: 106,
1328
- S: this,
1329
- A: [
1330
- "!(obj[RelationSourceId] instanceof DXN)",
1331
- "'Invalid object model: source pointer is a DXN'"
1332
- ]
1333
- });
1334
- invariant8(!(obj[RelationTargetId] instanceof DXN2), "Invalid object model: target pointer is a DXN", {
1335
- F: __dxlog_file8,
1336
- L: 107,
1337
- S: this,
1338
- A: [
1339
- "!(obj[RelationTargetId] instanceof DXN)",
1340
- "'Invalid object model: target pointer is a DXN'"
1341
- ]
1342
- });
1343
- }
1344
- }
1212
+ return entity;
1213
+ };
1345
1214
 
1346
- // src/internal/Entity/util.ts
1215
+ // src/internal/Entity/object.ts
1347
1216
  import * as Schema5 from "effect/Schema";
1348
- import { assertArgument as assertArgument2, invariant as invariant9 } from "@dxos/invariant";
1349
- import { DXN as DXN3, ObjectId as ObjectId3 } from "@dxos/keys";
1350
- import { assumeType as assumeType2 } from "@dxos/util";
1351
- var __dxlog_file9 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/Entity/util.ts";
1352
- var getObjectDXN = (object) => {
1353
- invariant9(!Schema5.isSchema(object), "schema not allowed in this function", {
1354
- F: __dxlog_file9,
1355
- L: 19,
1356
- S: void 0,
1357
- A: [
1358
- "!Schema.isSchema(object)",
1359
- "'schema not allowed in this function'"
1360
- ]
1361
- });
1362
- assertArgument2(typeof object === "object" && object != null, "object", "expected object");
1363
- assumeType2(object);
1364
- if (object[SelfDXNId]) {
1365
- invariant9(object[SelfDXNId] instanceof DXN3, "Invalid object model: invalid self dxn", {
1366
- F: __dxlog_file9,
1367
- L: 24,
1368
- S: void 0,
1369
- A: [
1370
- "object[SelfDXNId] instanceof DXN",
1371
- "'Invalid object model: invalid self dxn'"
1372
- ]
1373
- });
1374
- return object[SelfDXNId];
1375
- }
1376
- if (!ObjectId3.isValid(object.id)) {
1377
- throw new TypeError("Object id is not valid.");
1378
- }
1379
- return DXN3.fromLocalObjectId(object.id);
1380
- };
1217
+ import * as SchemaAST5 from "effect/SchemaAST";
1218
+ import { invariant as invariant6 } from "@dxos/invariant";
1219
+ import { DXN as DXN2 } from "@dxos/keys";
1381
1220
 
1382
- // src/internal/Entity/api.ts
1383
- var __dxlog_file10 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/Entity/api.ts";
1384
- var getDXN = (entity) => {
1385
- const dxn = getObjectDXN(entity);
1386
- invariant10(dxn != null, "Invalid entity.", {
1387
- F: __dxlog_file10,
1388
- L: 19,
1389
- S: void 0,
1390
- A: [
1391
- "dxn != null",
1392
- "'Invalid entity.'"
1393
- ]
1394
- });
1395
- return dxn;
1221
+ // src/internal/JsonSchema/json-schema-normalize.ts
1222
+ var normalizeSchema = (schema) => {
1223
+ const copy = structuredClone(schema);
1224
+ go(copy);
1225
+ return copy;
1396
1226
  };
1397
- var getDatabase = (entity) => {
1398
- assumeType3(entity);
1399
- return entity[ObjectDatabaseId];
1227
+ var go = (schema) => {
1228
+ if (typeof schema !== "object" || schema === null) {
1229
+ return;
1230
+ }
1231
+ if (schema.exclusiveMaximum === true) {
1232
+ schema.exclusiveMaximum = schema.maximum;
1233
+ delete schema.exclusiveMaximum;
1234
+ } else if (schema.exclusiveMaximum === false) {
1235
+ delete schema.exclusiveMaximum;
1236
+ }
1237
+ if (schema.exclusiveMinimum === true) {
1238
+ schema.exclusiveMinimum = schema.minimum;
1239
+ delete schema.exclusiveMinimum;
1240
+ } else if (schema.exclusiveMinimum === false) {
1241
+ delete schema.exclusiveMinimum;
1242
+ }
1243
+ for (const key of Object.keys(schema)) {
1244
+ if (!JsonSchemaFields.includes(key)) {
1245
+ delete schema[key];
1246
+ }
1247
+ }
1248
+ if (schema.properties) {
1249
+ goOnRecord(schema.properties);
1250
+ }
1251
+ if (schema.patternProperties) {
1252
+ goOnRecord(schema.patternProperties);
1253
+ }
1254
+ if (schema.propertyNames) {
1255
+ go(schema.propertyNames);
1256
+ }
1257
+ if (schema.definitions) {
1258
+ goOnRecord(schema.definitions);
1259
+ }
1260
+ if (schema.items) {
1261
+ maybeGoOnArray(schema.items);
1262
+ }
1263
+ if (schema.additionalItems) {
1264
+ maybeGoOnArray(schema.additionalItems);
1265
+ }
1266
+ if (schema.contains) {
1267
+ go(schema.contains);
1268
+ }
1269
+ if (schema.if) {
1270
+ go(schema.if);
1271
+ }
1272
+ if (schema.then) {
1273
+ go(schema.then);
1274
+ }
1275
+ if (schema.else) {
1276
+ go(schema.else);
1277
+ }
1278
+ if (schema.allOf) {
1279
+ maybeGoOnArray(schema.allOf);
1280
+ }
1281
+ if (schema.anyOf) {
1282
+ maybeGoOnArray(schema.anyOf);
1283
+ }
1284
+ if (schema.oneOf) {
1285
+ maybeGoOnArray(schema.oneOf);
1286
+ }
1287
+ if (schema.not) {
1288
+ go(schema.not);
1289
+ }
1290
+ if (schema.$defs) {
1291
+ goOnRecord(schema.$defs);
1292
+ }
1293
+ if (schema.reference) {
1294
+ go(schema.reference.schema);
1295
+ }
1400
1296
  };
1401
-
1402
- // src/internal/Entity/entity.ts
1403
- import * as Schema6 from "effect/Schema";
1404
- var makeEchoTypeSchema = (fields, ast, typename, version2, kind) => {
1405
- return class EchoObjectSchemaClass extends Schema6.make(ast) {
1406
- static typename = typename;
1407
- static version = version2;
1408
- static [SchemaKindId] = kind;
1409
- static fields = fields;
1410
- static annotations(annotations3) {
1411
- const schema = Schema6.make(ast).annotations(annotations3);
1412
- return makeEchoTypeSchema(fields, schema.ast, typename, version2, kind);
1413
- }
1414
- // static make(
1415
- // props: RequiredKeys<Schema.TypeLiteral.Constructor<Fields, []>> extends never
1416
- // ? void | Simplify<Schema.TypeLiteral.Constructor<Fields, []>>
1417
- // : Simplify<Schema.TypeLiteral.Constructor<Fields, []>>,
1418
- // options?: MakeProps,
1419
- // ): Simplify<Schema.TypeLiteral.Type<Fields, []>> {
1420
- // const propsWithDefaults: any = _lazilyMergeDefaults(fields, { ...(props as any) });
1421
- // return _getDisableValidationMakeOption(options)
1422
- // ? propsWithDefaults
1423
- // : ParseResult.validateSync(this)(propsWithDefaults);
1424
- // }
1425
- static instanceOf(value2) {
1426
- return Schema6.is(this)(value2);
1297
+ var maybeGoOnArray = (value2) => {
1298
+ if (Array.isArray(value2)) {
1299
+ for (const item of value2) {
1300
+ go(item);
1427
1301
  }
1428
- };
1302
+ } else if (typeof value2 === "object" && value2 !== null) {
1303
+ go(value2);
1304
+ }
1305
+ };
1306
+ var goOnRecord = (record) => {
1307
+ for (const key of Object.keys(record)) {
1308
+ go(record[key]);
1309
+ }
1429
1310
  };
1430
1311
 
1431
1312
  // src/internal/Entity/object.ts
1432
- import * as Schema7 from "effect/Schema";
1433
- import * as SchemaAST4 from "effect/SchemaAST";
1434
- import { invariant as invariant11 } from "@dxos/invariant";
1435
- var __dxlog_file11 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/Entity/object.ts";
1436
- var EchoObjectSchema = ({ typename, version: version2 }) => {
1313
+ var __dxlog_file6 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/Entity/object.ts";
1314
+ var EchoObjectSchema = (dxn, options) => {
1315
+ const typename = DXN2.getName(dxn);
1316
+ const version2 = DXN2.getVersion(dxn);
1317
+ invariant6(version2, `Type.makeObject requires a versioned DXN: ${dxn}`, { "~LogMeta": "~LogMeta", F: __dxlog_file6, L: 19, S: void 0, A: ["version", "`Type.makeObject requires a versioned DXN: ${dxn}`"] });
1437
1318
  return (self) => {
1438
- invariant11(typeof TypeAnnotationId === "symbol", "Sanity.", {
1439
- F: __dxlog_file11,
1440
- L: 36,
1441
- S: void 0,
1442
- A: [
1443
- "typeof TypeAnnotationId === 'symbol'",
1444
- "'Sanity.'"
1445
- ]
1446
- });
1447
- invariant11(SchemaAST4.isTypeLiteral(self.ast), "Schema must be a TypeLiteral.", {
1448
- F: __dxlog_file11,
1449
- L: 37,
1450
- S: void 0,
1451
- A: [
1452
- "SchemaAST.isTypeLiteral(self.ast)",
1453
- "'Schema must be a TypeLiteral.'"
1454
- ]
1455
- });
1319
+ invariant6(typeof TypeAnnotationId === "symbol", "Sanity.", { "~LogMeta": "~LogMeta", F: __dxlog_file6, L: 21, S: void 0, A: ["typeof TypeAnnotationId === 'symbol'", "'Sanity.'"] });
1320
+ invariant6(SchemaAST5.isTypeLiteral(self.ast), "Schema must be a TypeLiteral.", { "~LogMeta": "~LogMeta", F: __dxlog_file6, L: 22, S: void 0, A: ["SchemaAST.isTypeLiteral(self.ast)", "'Schema must be a TypeLiteral.'"] });
1456
1321
  const fields = self.fields ?? {};
1457
- const schemaWithId = Schema7.extend(self, Schema7.Struct({
1458
- id: Schema7.String
1322
+ const schemaWithId = Schema5.extend(self, Schema5.Struct({
1323
+ id: Schema5.String
1459
1324
  }));
1460
- const ast = SchemaAST4.annotations(schemaWithId.ast, {
1325
+ const ast = SchemaAST5.annotations(schemaWithId.ast, {
1461
1326
  // TODO(dmaretskyi): `extend` kills the annotations.
1462
1327
  ...self.ast.annotations,
1463
1328
  [TypeAnnotationId]: {
@@ -1466,49 +1331,46 @@ var EchoObjectSchema = ({ typename, version: version2 }) => {
1466
1331
  version: version2
1467
1332
  },
1468
1333
  // TODO(dmaretskyi): TypeIdentifierAnnotationId?
1469
- [SchemaAST4.JSONSchemaAnnotationId]: makeTypeJsonSchemaAnnotation({
1334
+ [SchemaAST5.JSONSchemaAnnotationId]: makeTypeJsonSchemaAnnotation({
1470
1335
  kind: EntityKind.Object,
1471
1336
  typename,
1472
1337
  version: version2
1473
1338
  })
1474
1339
  });
1475
- return makeEchoTypeSchema(fields, ast, typename, version2, EntityKind.Object);
1340
+ return makeEchoTypeSchema(fields, ast, typename, version2, EntityKind.Object, () => toJsonSchema(Schema5.make(ast)), options?.id);
1476
1341
  };
1477
1342
  };
1478
1343
 
1479
1344
  // src/internal/Entity/relation.ts
1480
- import * as Schema8 from "effect/Schema";
1481
- import * as SchemaAST5 from "effect/SchemaAST";
1345
+ import * as Schema6 from "effect/Schema";
1346
+ import * as SchemaAST6 from "effect/SchemaAST";
1482
1347
  import { raise } from "@dxos/debug";
1483
- import { assertArgument as assertArgument3, invariant as invariant12 } from "@dxos/invariant";
1484
- import { DXN as DXN4 } from "@dxos/keys";
1485
- var __dxlog_file12 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/Entity/relation.ts";
1486
- var EchoRelationSchema = ({ source, target, typename, version: version2 }) => {
1487
- assertArgument3(Schema8.isSchema(source), "source");
1488
- assertArgument3(Schema8.isSchema(target), "target");
1489
- const sourceDXN = getDXNForRelationSchemaRef(source);
1490
- const targetDXN = getDXNForRelationSchemaRef(target);
1491
- if (getEntityKind(source) !== EntityKind.Object) {
1348
+ import { assertArgument as assertArgument2, invariant as invariant7 } from "@dxos/invariant";
1349
+ import { DXN as DXN3 } from "@dxos/keys";
1350
+ var __dxlog_file7 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/Entity/relation.ts";
1351
+ var EchoRelationSchema = ({ dxn, source, target, id: explicitId }) => {
1352
+ const sourceSchema = source != null ? getStaticTypeSchema(source) ?? source : source;
1353
+ const targetSchema = target != null ? getStaticTypeSchema(target) ?? target : target;
1354
+ assertArgument2(Schema6.isSchema(sourceSchema), "source");
1355
+ assertArgument2(Schema6.isSchema(targetSchema), "target");
1356
+ const typename = DXN3.getName(dxn);
1357
+ const version2 = DXN3.getVersion(dxn);
1358
+ invariant7(version2, `Type.makeRelation requires a versioned DXN: ${dxn}`, { "~LogMeta": "~LogMeta", F: __dxlog_file7, L: 27, S: void 0, A: ["version", "`Type.makeRelation requires a versioned DXN: ${dxn}`"] });
1359
+ const sourceDXN = getDXNForRelationSchemaRef(sourceSchema);
1360
+ const targetDXN = getDXNForRelationSchemaRef(targetSchema);
1361
+ if (getEntityKind(sourceSchema) !== EntityKind.Object) {
1492
1362
  raise(new Error("Source schema must be an echo object schema."));
1493
1363
  }
1494
- if (getEntityKind(target) !== EntityKind.Object) {
1364
+ if (getEntityKind(targetSchema) !== EntityKind.Object) {
1495
1365
  raise(new Error("Target schema must be an echo object schema."));
1496
1366
  }
1497
1367
  return (self) => {
1498
- invariant12(SchemaAST5.isTypeLiteral(self.ast), "Schema must be a TypeLiteral.", {
1499
- F: __dxlog_file12,
1500
- L: 110,
1501
- S: void 0,
1502
- A: [
1503
- "SchemaAST.isTypeLiteral(self.ast)",
1504
- "'Schema must be a TypeLiteral.'"
1505
- ]
1506
- });
1368
+ invariant7(SchemaAST6.isTypeLiteral(self.ast), "Schema must be a TypeLiteral.", { "~LogMeta": "~LogMeta", F: __dxlog_file7, L: 37, S: void 0, A: ["SchemaAST.isTypeLiteral(self.ast)", "'Schema must be a TypeLiteral.'"] });
1507
1369
  const fields = self.fields ?? {};
1508
- const schemaWithId = Schema8.extend(self, Schema8.Struct({
1509
- id: Schema8.String
1370
+ const schemaWithId = Schema6.extend(self, Schema6.Struct({
1371
+ id: Schema6.String
1510
1372
  }));
1511
- const ast = SchemaAST5.annotations(schemaWithId.ast, {
1373
+ const ast = SchemaAST6.annotations(schemaWithId.ast, {
1512
1374
  // TODO(dmaretskyi): `extend` kills the annotations.
1513
1375
  ...self.ast.annotations,
1514
1376
  [TypeAnnotationId]: {
@@ -1519,7 +1381,7 @@ var EchoRelationSchema = ({ source, target, typename, version: version2 }) => {
1519
1381
  targetSchema: targetDXN
1520
1382
  },
1521
1383
  // TODO(dmaretskyi): TypeIdentifierAnnotationId?
1522
- [SchemaAST5.JSONSchemaAnnotationId]: makeTypeJsonSchemaAnnotation({
1384
+ [SchemaAST6.JSONSchemaAnnotationId]: makeTypeJsonSchemaAnnotation({
1523
1385
  kind: EntityKind.Relation,
1524
1386
  typename,
1525
1387
  version: version2,
@@ -1527,24 +1389,57 @@ var EchoRelationSchema = ({ source, target, typename, version: version2 }) => {
1527
1389
  relationTarget: targetDXN
1528
1390
  })
1529
1391
  });
1530
- return makeEchoTypeSchema(fields, ast, typename, version2, EntityKind.Relation);
1392
+ return makeEchoTypeSchema(fields, ast, typename, version2, EntityKind.Relation, () => toJsonSchema(Schema6.make(ast)), explicitId);
1531
1393
  };
1532
1394
  };
1533
1395
  var getDXNForRelationSchemaRef = (schema) => {
1534
- assertArgument3(Schema8.isSchema(schema), "schema");
1396
+ assertArgument2(Schema6.isSchema(schema), "schema");
1535
1397
  const identifier = getTypeIdentifierAnnotation(schema);
1536
1398
  if (identifier) {
1537
- return identifier;
1399
+ return DXN3.tryMake(identifier) ?? raise(new Error(`Invalid schema identifier: ${identifier}`));
1538
1400
  }
1539
1401
  const typename = getSchemaTypename(schema);
1540
1402
  if (!typename) {
1541
1403
  throw new Error("Schema must have a typename");
1542
1404
  }
1543
- return DXN4.fromTypename(typename).toString();
1405
+ return DXN3.make(typename);
1406
+ };
1407
+
1408
+ // src/internal/Entity/type-kind.ts
1409
+ import * as Schema7 from "effect/Schema";
1410
+ import * as SchemaAST7 from "effect/SchemaAST";
1411
+ import { invariant as invariant8 } from "@dxos/invariant";
1412
+ import { DXN as DXN4 } from "@dxos/keys";
1413
+ var __dxlog_file8 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/Entity/type-kind.ts";
1414
+ var EchoTypeKindSchema = (dxn, options) => {
1415
+ const typename = DXN4.getName(dxn);
1416
+ const version2 = DXN4.getVersion(dxn);
1417
+ invariant8(version2, `Type-kind schemas require a versioned DXN: ${dxn}`, { "~LogMeta": "~LogMeta", F: __dxlog_file8, L: 22, S: void 0, A: ["version", "`Type-kind schemas require a versioned DXN: ${dxn}`"] });
1418
+ return (self) => {
1419
+ invariant8(SchemaAST7.isTypeLiteral(self.ast), "Schema must be a TypeLiteral.", { "~LogMeta": "~LogMeta", F: __dxlog_file8, L: 24, S: void 0, A: ["SchemaAST.isTypeLiteral(self.ast)", "'Schema must be a TypeLiteral.'"] });
1420
+ const fields = self.fields ?? {};
1421
+ const schemaWithId = Schema7.extend(self, Schema7.Struct({
1422
+ id: Schema7.String
1423
+ }));
1424
+ const ast = SchemaAST7.annotations(schemaWithId.ast, {
1425
+ ...self.ast.annotations,
1426
+ [TypeAnnotationId]: {
1427
+ kind: EntityKind.Type,
1428
+ typename,
1429
+ version: version2
1430
+ },
1431
+ [SchemaAST7.JSONSchemaAnnotationId]: makeTypeJsonSchemaAnnotation({
1432
+ kind: EntityKind.Type,
1433
+ typename,
1434
+ version: version2
1435
+ })
1436
+ });
1437
+ return makeEchoTypeSchema(fields, ast, typename, version2, EntityKind.Type, () => toJsonSchema(Schema7.make(ast)), options?.id);
1438
+ };
1544
1439
  };
1545
1440
 
1546
1441
  // src/internal/Entity/version.ts
1547
- import { assertArgument as assertArgument4 } from "@dxos/invariant";
1442
+ import { assertArgument as assertArgument3 } from "@dxos/invariant";
1548
1443
  var unversioned = {
1549
1444
  [VersionTypeId]: {},
1550
1445
  versioned: false
@@ -1560,12 +1455,12 @@ var version = (entity) => {
1560
1455
  return ver;
1561
1456
  };
1562
1457
  var versionValid = (ver) => {
1563
- assertArgument4(isVersion(ver), "version", "Invalid version object");
1458
+ assertArgument3(isVersion(ver), "version", "Invalid version object");
1564
1459
  return !!ver.versioned;
1565
1460
  };
1566
1461
  var compareVersions = (version1, version2) => {
1567
- assertArgument4(isVersion(version1), "version1", "Invalid version object");
1568
- assertArgument4(isVersion(version2), "version2", "Invalid version object");
1462
+ assertArgument3(isVersion(version1), "version1", "Invalid version object");
1463
+ assertArgument3(isVersion(version2), "version2", "Invalid version object");
1569
1464
  if (!versionValid(version1) || !versionValid(version2)) {
1570
1465
  return "unversioned";
1571
1466
  }
@@ -1586,99 +1481,8 @@ var decodeVersion = (ver) => {
1586
1481
  return parsed;
1587
1482
  };
1588
1483
 
1589
- // src/internal/JsonSchema/json-schema-normalize.ts
1590
- var normalizeSchema = (schema) => {
1591
- const copy = structuredClone(schema);
1592
- go(copy);
1593
- return copy;
1594
- };
1595
- var go = (schema) => {
1596
- if (typeof schema !== "object" || schema === null) {
1597
- return;
1598
- }
1599
- if (schema.exclusiveMaximum === true) {
1600
- schema.exclusiveMaximum = schema.maximum;
1601
- delete schema.exclusiveMaximum;
1602
- } else if (schema.exclusiveMaximum === false) {
1603
- delete schema.exclusiveMaximum;
1604
- }
1605
- if (schema.exclusiveMinimum === true) {
1606
- schema.exclusiveMinimum = schema.minimum;
1607
- delete schema.exclusiveMinimum;
1608
- } else if (schema.exclusiveMinimum === false) {
1609
- delete schema.exclusiveMinimum;
1610
- }
1611
- for (const key of Object.keys(schema)) {
1612
- if (!JsonSchemaFields.includes(key)) {
1613
- delete schema[key];
1614
- }
1615
- }
1616
- if (schema.properties) {
1617
- goOnRecord(schema.properties);
1618
- }
1619
- if (schema.patternProperties) {
1620
- goOnRecord(schema.patternProperties);
1621
- }
1622
- if (schema.propertyNames) {
1623
- go(schema.propertyNames);
1624
- }
1625
- if (schema.definitions) {
1626
- goOnRecord(schema.definitions);
1627
- }
1628
- if (schema.items) {
1629
- maybeGoOnArray(schema.items);
1630
- }
1631
- if (schema.additionalItems) {
1632
- maybeGoOnArray(schema.additionalItems);
1633
- }
1634
- if (schema.contains) {
1635
- go(schema.contains);
1636
- }
1637
- if (schema.if) {
1638
- go(schema.if);
1639
- }
1640
- if (schema.then) {
1641
- go(schema.then);
1642
- }
1643
- if (schema.else) {
1644
- go(schema.else);
1645
- }
1646
- if (schema.allOf) {
1647
- maybeGoOnArray(schema.allOf);
1648
- }
1649
- if (schema.anyOf) {
1650
- maybeGoOnArray(schema.anyOf);
1651
- }
1652
- if (schema.oneOf) {
1653
- maybeGoOnArray(schema.oneOf);
1654
- }
1655
- if (schema.not) {
1656
- go(schema.not);
1657
- }
1658
- if (schema.$defs) {
1659
- goOnRecord(schema.$defs);
1660
- }
1661
- if (schema.reference) {
1662
- go(schema.reference.schema);
1663
- }
1664
- };
1665
- var maybeGoOnArray = (value2) => {
1666
- if (Array.isArray(value2)) {
1667
- for (const item of value2) {
1668
- go(item);
1669
- }
1670
- } else if (typeof value2 === "object" && value2 !== null) {
1671
- go(value2);
1672
- }
1673
- };
1674
- var goOnRecord = (record) => {
1675
- for (const key of Object.keys(record)) {
1676
- go(record[key]);
1677
- }
1678
- };
1679
-
1680
1484
  // src/internal/Obj/common.ts
1681
- import * as Schema9 from "effect/Schema";
1485
+ import * as Schema8 from "effect/Schema";
1682
1486
  var makeTypedEntityClass = (typename, version2, baseSchema) => {
1683
1487
  return class {
1684
1488
  // Implement TypedObject properties.
@@ -1686,7 +1490,7 @@ var makeTypedEntityClass = (typename, version2, baseSchema) => {
1686
1490
  static version = version2;
1687
1491
  // Implement Schema.Schema properties.
1688
1492
  // TODO(burdon): Comment required.
1689
- static [Schema9.TypeId] = schemaVariance;
1493
+ static [Schema8.TypeId] = schemaVariance;
1690
1494
  static ast = baseSchema.ast;
1691
1495
  static annotations = baseSchema.annotations.bind(baseSchema);
1692
1496
  static pipe = baseSchema.pipe.bind(baseSchema);
@@ -1708,8 +1512,8 @@ var schemaVariance = {
1708
1512
 
1709
1513
  // src/internal/Obj/create-object.ts
1710
1514
  import { raise as raise3 } from "@dxos/debug";
1711
- import { assertArgument as assertArgument6, failedInvariant } from "@dxos/invariant";
1712
- import { ObjectId as ObjectId5 } from "@dxos/keys";
1515
+ import { assertArgument as assertArgument5, failedInvariant } from "@dxos/invariant";
1516
+ import { EntityId as EntityId4 } from "@dxos/keys";
1713
1517
 
1714
1518
  // src/internal/Obj/inspect.ts
1715
1519
  import { inspectCustom as inspectCustom2 } from "@dxos/debug";
@@ -1729,53 +1533,37 @@ var typedObjectInspectFunction = function(depth, options, inspect) {
1729
1533
  const { id, ...props } = this;
1730
1534
  return inspect({
1731
1535
  id,
1732
- [ATTR_TYPE]: getTypeDXN(this),
1536
+ [ATTR_TYPE]: getTypeURI(this),
1733
1537
  ...props,
1734
1538
  [ATTR_META]: this[MetaId]
1735
1539
  }, options);
1736
1540
  };
1737
1541
 
1738
1542
  // src/internal/Obj/json-serializer.ts
1739
- import * as Schema10 from "effect/Schema";
1543
+ import * as Schema9 from "effect/Schema";
1740
1544
  import { raise as raise2 } from "@dxos/debug";
1741
- import { ObjectStructure, isEncodedReference } from "@dxos/echo-protocol";
1742
- import { assertArgument as assertArgument5, invariant as invariant13 } from "@dxos/invariant";
1743
- import { DXN as DXN5, ObjectId as ObjectId4 } from "@dxos/keys";
1744
- import { assumeType as assumeType4, deepMapValues as deepMapValues2, visitValues } from "@dxos/util";
1745
- var __dxlog_file13 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/Obj/json-serializer.ts";
1545
+ import { EntityStructure, isEncodedReference } from "@dxos/echo-protocol";
1546
+ import { assertArgument as assertArgument4, invariant as invariant9 } from "@dxos/invariant";
1547
+ import { EID as EID3, EntityId as EntityId3, URI } from "@dxos/keys";
1548
+ import { assumeType, decodeUint8ArrayFromJson, deepMapValues as deepMapValues2, isEncodedUint8Array, visitValues } from "@dxos/util";
1549
+ var __dxlog_file9 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/Obj/json-serializer.ts";
1746
1550
  var objectToJSON = (obj) => {
1747
- const typename = getTypeDXN(obj)?.toString();
1748
- invariant13(typename && typeof typename === "string", void 0, {
1749
- F: __dxlog_file13,
1750
- L: 66,
1751
- S: void 0,
1752
- A: [
1753
- "typename && typeof typename === 'string'",
1754
- ""
1755
- ]
1756
- });
1551
+ const typename = getTypeURI(obj);
1552
+ invariant9(typename && typeof typename === "string", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file9, L: 23, S: void 0, A: ["typename && typeof typename === 'string'", ""] });
1757
1553
  return typedJsonSerializer.call(obj);
1758
1554
  };
1759
- var objectFromJSON = async (jsonData, { refResolver, dxn, database, parent } = {}) => {
1760
- assumeType4(jsonData);
1761
- assertArgument5(typeof jsonData === "object" && jsonData !== null, "jsonData", "expect object");
1762
- assertArgument5(typeof jsonData[ATTR_TYPE] === "string", "jsonData[ATTR_TYPE]", "expected object to have a type");
1763
- assertArgument5(typeof jsonData.id === "string", "jsonData.id", "expected object to have an id");
1764
- const type = DXN5.parse(jsonData[ATTR_TYPE]);
1555
+ var objectFromJSON = async (jsonData, { refResolver, uri, database, parent } = {}) => {
1556
+ assumeType(jsonData);
1557
+ assertArgument4(typeof jsonData === "object" && jsonData !== null, "jsonData", "expect object");
1558
+ assertArgument4(typeof jsonData[ATTR_TYPE] === "string", "jsonData[ATTR_TYPE]", "expected object to have a type");
1559
+ assertArgument4(typeof jsonData.id === "string", "jsonData.id", "expected object to have an id");
1560
+ const type = URI.make(jsonData[ATTR_TYPE]);
1765
1561
  const schema = await refResolver?.resolveSchema(type);
1766
- invariant13(schema === void 0 || Schema10.isSchema(schema), void 0, {
1767
- F: __dxlog_file13,
1768
- L: 97,
1769
- S: void 0,
1770
- A: [
1771
- "schema === undefined || Schema.isSchema(schema)",
1772
- ""
1773
- ]
1774
- });
1775
- const decodedInput = stripInternalJsonKeys(jsonData);
1562
+ invariant9(schema === void 0 || Schema9.isSchema(schema), void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file9, L: 43, S: void 0, A: ["schema === undefined || Schema.isSchema(schema)", ""] });
1563
+ const decodedInput = restoreUint8Arrays(stripInternalJsonKeys(jsonData));
1776
1564
  let obj;
1777
1565
  if (schema != null) {
1778
- obj = await schema.pipe(Schema10.decodeUnknownPromise)(decodedInput);
1566
+ obj = await schema.pipe(Schema9.decodeUnknownPromise)(decodedInput);
1779
1567
  if (refResolver) {
1780
1568
  setRefResolverOnData(obj, refResolver);
1781
1569
  }
@@ -1784,131 +1572,97 @@ var objectFromJSON = async (jsonData, { refResolver, dxn, database, parent } = {
1784
1572
  refResolver
1785
1573
  });
1786
1574
  }
1787
- invariant13(ObjectId4.isValid(obj.id), "Invalid object id", {
1788
- F: __dxlog_file13,
1789
- L: 110,
1790
- S: void 0,
1791
- A: [
1792
- "ObjectId.isValid(obj.id)",
1793
- "'Invalid object id'"
1794
- ]
1795
- });
1575
+ invariant9(EntityId3.isValid(obj.id), "Invalid object id", { "~LogMeta": "~LogMeta", F: __dxlog_file9, L: 56, S: void 0, A: ["EntityId.isValid(obj.id)", "'Invalid object id'"] });
1796
1576
  setTypename(obj, type);
1797
1577
  if (schema) {
1798
1578
  setSchema(obj, schema);
1799
1579
  }
1580
+ if (refResolver?.resolveType) {
1581
+ const typeEntity = await refResolver.resolveType(type);
1582
+ if (typeEntity != null) {
1583
+ setType(obj, typeEntity);
1584
+ }
1585
+ }
1800
1586
  const isRelation = typeof jsonData[ATTR_RELATION_SOURCE] === "string" || typeof jsonData[ATTR_RELATION_TARGET] === "string";
1801
1587
  if (isRelation) {
1802
- const sourceDxn = DXN5.parse(jsonData[ATTR_RELATION_SOURCE] ?? raise2(new TypeError("Missing relation source")));
1803
- const targetDxn = DXN5.parse(jsonData[ATTR_RELATION_TARGET] ?? raise2(new TypeError("Missing relation target")));
1804
- const source = await refResolver?.resolve(sourceDxn);
1805
- const target = await refResolver?.resolve(targetDxn);
1588
+ const sourceDxn = jsonData[ATTR_RELATION_SOURCE] ?? raise2(new TypeError("Missing relation source"));
1589
+ const targetDxn = jsonData[ATTR_RELATION_TARGET] ?? raise2(new TypeError("Missing relation target"));
1590
+ const source = await refResolver?.resolveLegacy(sourceDxn);
1591
+ const target = await refResolver?.resolveLegacy(targetDxn);
1806
1592
  defineHiddenProperty(obj, KindId, EntityKind.Relation);
1807
1593
  defineHiddenProperty(obj, RelationSourceDXNId, sourceDxn);
1808
1594
  defineHiddenProperty(obj, RelationTargetDXNId, targetDxn);
1809
1595
  defineHiddenProperty(obj, RelationSourceId, source);
1810
1596
  defineHiddenProperty(obj, RelationTargetId, target);
1811
1597
  } else {
1812
- defineHiddenProperty(obj, KindId, EntityKind.Object);
1598
+ const annotationKind = schema != null ? getTypeAnnotation(schema)?.kind : void 0;
1599
+ defineHiddenProperty(obj, KindId, annotationKind === EntityKind.Type ? EntityKind.Type : EntityKind.Object);
1813
1600
  }
1814
1601
  if (typeof jsonData[ATTR_META] === "object") {
1815
- const meta = await ObjectMetaSchema.pipe(Schema10.decodeUnknownPromise)(jsonData[ATTR_META]);
1816
- invariant13(Array.isArray(meta.keys), void 0, {
1817
- F: __dxlog_file13,
1818
- L: 136,
1819
- S: void 0,
1820
- A: [
1821
- "Array.isArray(meta.keys)",
1822
- ""
1823
- ]
1824
- });
1602
+ const meta = await EntityMetaSchema.pipe(Schema9.decodeUnknownPromise)(normalizeMeta(jsonData[ATTR_META]));
1603
+ invariant9(Array.isArray(meta.keys), void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file9, L: 92, S: void 0, A: ["Array.isArray(meta.keys)", ""] });
1825
1604
  defineHiddenProperty(obj, MetaId, meta);
1826
1605
  } else {
1827
1606
  defineHiddenProperty(obj, MetaId, {
1828
- keys: []
1607
+ keys: [],
1608
+ tags: [],
1609
+ annotations: {}
1829
1610
  });
1830
1611
  }
1831
1612
  if (jsonData[ATTR_PARENT]) {
1832
- const parentDxn = DXN5.parse(jsonData[ATTR_PARENT]);
1833
- const resolvedParent = await refResolver?.resolve(parentDxn);
1613
+ const parentDxn = jsonData[ATTR_PARENT];
1614
+ const resolvedParent = await refResolver?.resolveLegacy(parentDxn);
1834
1615
  defineHiddenProperty(obj, ParentId, resolvedParent);
1835
1616
  } else if (parent) {
1836
1617
  defineHiddenProperty(obj, ParentId, parent);
1837
1618
  }
1838
- if (dxn) {
1839
- defineHiddenProperty(obj, SelfDXNId, dxn);
1619
+ if (uri) {
1620
+ defineHiddenProperty(obj, SelfURIId, uri);
1840
1621
  }
1841
1622
  if (database) {
1842
1623
  defineHiddenProperty(obj, ObjectDatabaseId, database);
1843
1624
  }
1844
1625
  assertObjectModel(obj);
1845
- invariant13(obj[ATTR_TYPE] === void 0, "Invalid object model", {
1846
- F: __dxlog_file13,
1847
- L: 161,
1848
- S: void 0,
1849
- A: [
1850
- "(obj as any)[ATTR_TYPE] === undefined",
1851
- "'Invalid object model'"
1852
- ]
1853
- });
1854
- invariant13(obj[ATTR_META] === void 0, "Invalid object model", {
1855
- F: __dxlog_file13,
1856
- L: 162,
1857
- S: void 0,
1858
- A: [
1859
- "(obj as any)[ATTR_META] === undefined",
1860
- "'Invalid object model'"
1861
- ]
1862
- });
1863
- invariant13(obj[ATTR_DELETED] === void 0, "Invalid object model", {
1864
- F: __dxlog_file13,
1865
- L: 163,
1866
- S: void 0,
1867
- A: [
1868
- "(obj as any)[ATTR_DELETED] === undefined",
1869
- "'Invalid object model'"
1870
- ]
1871
- });
1872
- invariant13(obj[ATTR_SELF_DXN] === void 0, "Invalid object model", {
1873
- F: __dxlog_file13,
1874
- L: 164,
1875
- S: void 0,
1876
- A: [
1877
- "(obj as any)[ATTR_SELF_DXN] === undefined",
1878
- "'Invalid object model'"
1879
- ]
1880
- });
1881
- invariant13(obj[ATTR_RELATION_SOURCE] === void 0, "Invalid object model", {
1882
- F: __dxlog_file13,
1883
- L: 165,
1884
- S: void 0,
1885
- A: [
1886
- "(obj as any)[ATTR_RELATION_SOURCE] === undefined",
1887
- "'Invalid object model'"
1888
- ]
1889
- });
1890
- invariant13(obj[ATTR_RELATION_TARGET] === void 0, "Invalid object model", {
1891
- F: __dxlog_file13,
1892
- L: 166,
1893
- S: void 0,
1894
- A: [
1895
- "(obj as any)[ATTR_RELATION_TARGET] === undefined",
1896
- "'Invalid object model'"
1897
- ]
1898
- });
1626
+ invariant9(obj[ATTR_TYPE] === void 0, "Invalid object model", { "~LogMeta": "~LogMeta", F: __dxlog_file9, L: 115, S: void 0, A: ["obj[ATTR_TYPE] === undefined", "'Invalid object model'"] });
1627
+ invariant9(obj[ATTR_META] === void 0, "Invalid object model", { "~LogMeta": "~LogMeta", F: __dxlog_file9, L: 116, S: void 0, A: ["obj[ATTR_META] === undefined", "'Invalid object model'"] });
1628
+ invariant9(obj[ATTR_DELETED] === void 0, "Invalid object model", { "~LogMeta": "~LogMeta", F: __dxlog_file9, L: 117, S: void 0, A: ["obj[ATTR_DELETED] === undefined", "'Invalid object model'"] });
1629
+ invariant9(obj[ATTR_SELF_URI] === void 0, "Invalid object model", { "~LogMeta": "~LogMeta", F: __dxlog_file9, L: 118, S: void 0, A: ["obj[ATTR_SELF_URI] === undefined", "'Invalid object model'"] });
1630
+ invariant9(obj[ATTR_SELF_URI_LEGACY] === void 0, "Invalid object model", { "~LogMeta": "~LogMeta", F: __dxlog_file9, L: 119, S: void 0, A: ["obj[ATTR_SELF_URI_LEGACY] === undefined", "'Invalid object model'"] });
1631
+ invariant9(obj[ATTR_RELATION_SOURCE] === void 0, "Invalid object model", { "~LogMeta": "~LogMeta", F: __dxlog_file9, L: 120, S: void 0, A: ["obj[ATTR_RELATION_SOURCE] === undefined", "'Invalid object model'"] });
1632
+ invariant9(obj[ATTR_RELATION_TARGET] === void 0, "Invalid object model", { "~LogMeta": "~LogMeta", F: __dxlog_file9, L: 121, S: void 0, A: ["obj[ATTR_RELATION_TARGET] === undefined", "'Invalid object model'"] });
1899
1633
  return obj;
1900
1634
  };
1635
+ var normalizeMeta = (meta) => {
1636
+ const tags = Array.isArray(meta?.tags) ? meta.tags.map((tag) => typeof tag === "string" ? {
1637
+ "/": URI.make(tag)
1638
+ } : tag) : [];
1639
+ return {
1640
+ ...meta,
1641
+ keys: Array.isArray(meta?.keys) ? meta.keys : [],
1642
+ tags,
1643
+ annotations: meta?.annotations ?? {}
1644
+ };
1645
+ };
1901
1646
  var decodeGeneric = (jsonData, options) => {
1902
1647
  const props = stripInternalJsonKeys(jsonData);
1903
1648
  return deepMapValues2(props, (value2, visitor) => {
1904
1649
  if (isEncodedReference(value2)) {
1905
1650
  return refFromEncodedReference(value2, options.refResolver);
1906
1651
  }
1652
+ if (isEncodedUint8Array(value2)) {
1653
+ return decodeUint8ArrayFromJson(value2);
1654
+ }
1907
1655
  return visitor(value2);
1908
1656
  });
1909
1657
  };
1658
+ var restoreUint8Arrays = (data) => deepMapValues2(data, (value2, recurse) => {
1659
+ if (isEncodedUint8Array(value2)) {
1660
+ return decodeUint8ArrayFromJson(value2);
1661
+ }
1662
+ return recurse(value2);
1663
+ });
1910
1664
  var stripInternalJsonKeys = (jsonData) => {
1911
- const { [ATTR_TYPE]: _type, [ATTR_META]: _meta, [ATTR_DELETED]: _deleted, [ATTR_SELF_DXN]: _selfDxn, [ATTR_RELATION_SOURCE]: _relationSource, [ATTR_RELATION_TARGET]: _relationTarget, ...props } = jsonData;
1665
+ const { [ATTR_TYPE]: _type, [ATTR_META]: _meta, [ATTR_DELETED]: _deleted, [ATTR_SELF_URI]: _selfUri, [ATTR_SELF_URI_LEGACY]: _legacySelfUri, [ATTR_RELATION_SOURCE]: _relationSource, [ATTR_RELATION_TARGET]: _relationTarget, ...props } = jsonData;
1912
1666
  return props;
1913
1667
  };
1914
1668
  var setRefResolverOnData = (obj, refResolver) => {
@@ -1922,43 +1676,58 @@ var setRefResolverOnData = (obj, refResolver) => {
1922
1676
  visitor(obj);
1923
1677
  };
1924
1678
  var objectStructureToJson = (objectId, structure) => {
1679
+ const typeRef = EntityStructure.getTypeReference(structure)?.["/"];
1680
+ const parent = EntityStructure.getParent(structure)?.["/"];
1681
+ const source = EntityStructure.getRelationSource(structure)?.["/"];
1682
+ const target = EntityStructure.getRelationTarget(structure)?.["/"];
1925
1683
  return {
1926
1684
  ...structure.data,
1927
1685
  id: objectId,
1928
- [ATTR_TYPE]: ObjectStructure.getTypeReference(structure)?.["/"] ?? "",
1929
- [ATTR_DELETED]: ObjectStructure.isDeleted(structure),
1930
- [ATTR_PARENT]: ObjectStructure.getParent(structure)?.["/"],
1931
- [ATTR_RELATION_SOURCE]: ObjectStructure.getRelationSource(structure)?.["/"],
1932
- [ATTR_RELATION_TARGET]: ObjectStructure.getRelationTarget(structure)?.["/"]
1686
+ [ATTR_TYPE]: typeRef ? URI.make(typeRef) : void 0,
1687
+ [ATTR_DELETED]: EntityStructure.isDeleted(structure),
1688
+ [ATTR_PARENT]: parent !== void 0 ? EID3.tryParse(parent) : void 0,
1689
+ [ATTR_RELATION_SOURCE]: source !== void 0 ? EID3.tryParse(source) : void 0,
1690
+ [ATTR_RELATION_TARGET]: target !== void 0 ? EID3.tryParse(target) : void 0
1933
1691
  };
1934
1692
  };
1935
1693
 
1936
1694
  // src/internal/Obj/create-object.ts
1937
- var createObject = (schema, props) => {
1695
+ var createObject = (input, props) => {
1696
+ const schema = getStaticTypeSchema(input) ?? failedInvariant("Type entity is missing its source schema");
1938
1697
  const annotation = getTypeAnnotation(schema);
1939
1698
  if (!annotation) {
1940
1699
  throw new Error("Schema is not an ECHO schema");
1941
1700
  }
1942
- assertArgument6(!("@type" in props), "data", "@type is not allowed");
1943
- assertArgument6(!(RelationSourceDXNId in props), "data", "Relation source DXN is not allowed in the constructor");
1944
- assertArgument6(!(RelationTargetDXNId in props), "data", "Relation target DXN is not allowed in the constructor");
1945
- assertArgument6(RelationSourceId in props === RelationTargetId in props, "data", "Relation source and target must be provided together");
1701
+ assertArgument5(!("@type" in props), "data", "@type is not allowed");
1702
+ assertArgument5(!(RelationSourceDXNId in props), "data", "Relation source DXN is not allowed in the constructor");
1703
+ assertArgument5(!(RelationTargetDXNId in props), "data", "Relation target DXN is not allowed in the constructor");
1704
+ assertArgument5(RelationSourceId in props === RelationTargetId in props, "data", "Relation source and target must be provided together");
1705
+ const metaOverride = props[MetaId];
1706
+ if (metaOverride !== void 0) {
1707
+ delete props[MetaId];
1708
+ }
1946
1709
  const obj = {
1947
1710
  ...props,
1948
- id: props.id ?? ObjectId5.random()
1711
+ id: props.id ?? EntityId4.random()
1949
1712
  };
1950
- const kind = RelationSourceId in props ? EntityKind.Relation : EntityKind.Object;
1713
+ const kind = annotation.kind === EntityKind.Type ? EntityKind.Type : annotation.kind === EntityKind.Relation || RelationSourceId in props ? EntityKind.Relation : EntityKind.Object;
1951
1714
  defineHiddenProperty(obj, KindId, kind);
1952
1715
  defineHiddenProperty(obj, MetaId, {
1953
- keys: []
1716
+ ...metaOverride,
1717
+ keys: metaOverride?.keys ?? [],
1718
+ tags: metaOverride?.tags ?? [],
1719
+ annotations: metaOverride?.annotations ?? {}
1954
1720
  });
1955
1721
  setSchema(obj, schema);
1956
- setTypename(obj, getSchemaDXN(schema) ?? failedInvariant("Missing schema DXN"));
1722
+ if (input !== schema) {
1723
+ setType(obj, input);
1724
+ }
1725
+ setTypename(obj, getSchemaURI(schema) ?? failedInvariant("Missing schema URI"));
1957
1726
  attachTypedJsonSerializer(obj);
1958
1727
  attachedTypedObjectInspector(obj);
1959
1728
  if (kind === EntityKind.Relation) {
1960
- const sourceDXN = getObjectDXN(props[RelationSourceId]) ?? raise3(new Error("Unresolved relation source"));
1961
- const targetDXN = getObjectDXN(props[RelationTargetId]) ?? raise3(new Error("Unresolved relation target"));
1729
+ const sourceDXN = getObjectEchoUri(props[RelationSourceId]) ?? raise3(new Error("Unresolved relation source"));
1730
+ const targetDXN = getObjectEchoUri(props[RelationTargetId]) ?? raise3(new Error("Unresolved relation target"));
1962
1731
  defineHiddenProperty(obj, RelationSourceDXNId, sourceDXN);
1963
1732
  defineHiddenProperty(obj, RelationTargetDXNId, targetDXN);
1964
1733
  }
@@ -1974,41 +1743,17 @@ var isDeleted = (obj) => {
1974
1743
  return obj[ObjectDeletedId] ?? false;
1975
1744
  };
1976
1745
 
1977
- // src/internal/Obj/ids.ts
1978
- import { DXN as DXN6, ObjectId as ObjectId6, QueueSubspaceTags, SpaceId } from "@dxos/keys";
1979
- var createQueueDXN = (spaceId = SpaceId.random(), queueId = ObjectId6.random()) => new DXN6(DXN6.kind.QUEUE, [
1980
- QueueSubspaceTags.DATA,
1981
- spaceId,
1982
- queueId
1983
- ]);
1984
-
1985
1746
  // src/internal/Obj/set-value.ts
1986
1747
  import * as Match from "effect/Match";
1987
1748
  import * as Option from "effect/Option";
1988
- import * as SchemaAST6 from "effect/SchemaAST";
1989
- import { getArrayElementType, getBaseType, getProperties as getProperties2, isArrayType, isNestedType } from "@dxos/effect";
1990
- import { invariant as invariant14 } from "@dxos/invariant";
1991
- var __dxlog_file14 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/Obj/set-value.ts";
1749
+ import * as SchemaAST8 from "effect/SchemaAST";
1750
+ import { SchemaEx } from "@dxos/effect";
1751
+ import { invariant as invariant10 } from "@dxos/invariant";
1752
+ var __dxlog_file10 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/Obj/set-value.ts";
1992
1753
  var setValue = (obj, path, value2) => {
1993
- invariant14(path.length > 0, "Path must not be empty", {
1994
- F: __dxlog_file14,
1995
- L: 27,
1996
- S: void 0,
1997
- A: [
1998
- "path.length > 0",
1999
- "'Path must not be empty'"
2000
- ]
2001
- });
1754
+ invariant10(path.length > 0, "Path must not be empty", { "~LogMeta": "~LogMeta", F: __dxlog_file10, L: 14, S: void 0, A: ["path.length > 0", "'Path must not be empty'"] });
2002
1755
  const schema = getSchema(obj);
2003
- invariant14(schema != null, "Object must have a schema", {
2004
- F: __dxlog_file14,
2005
- L: 30,
2006
- S: void 0,
2007
- A: [
2008
- "schema != null",
2009
- "'Object must have a schema'"
2010
- ]
2011
- });
1756
+ invariant10(schema != null, "Object must have a schema", { "~LogMeta": "~LogMeta", F: __dxlog_file10, L: 16, S: void 0, A: ["schema != null", "'Object must have a schema'"] });
2012
1757
  let parent = obj;
2013
1758
  let currentAST = schema.ast;
2014
1759
  for (let i = 0; i < path.length - 1; i++) {
@@ -2016,7 +1761,7 @@ var setValue = (obj, path, value2) => {
2016
1761
  const key = typeof part === "number" ? part : String(part);
2017
1762
  if (parent[key] === void 0) {
2018
1763
  const propertyAST = getPropertyAST(currentAST, String(part));
2019
- const shouldBeArray = propertyAST ? isArrayType(propertyAST) : false;
1764
+ const shouldBeArray = propertyAST ? SchemaEx.isArrayType(propertyAST) : false;
2020
1765
  if (shouldBeArray) {
2021
1766
  parent[key] = [];
2022
1767
  } else {
@@ -2035,15 +1780,15 @@ var getPropertyAST = (ast, propertyName) => {
2035
1780
  if (!ast) {
2036
1781
  return void 0;
2037
1782
  }
2038
- if (isNestedType(ast)) {
2039
- const properties = getProperties2(ast);
1783
+ if (SchemaEx.isNestedType(ast)) {
1784
+ const properties = SchemaEx.getProperties(ast);
2040
1785
  const property = properties.find((p) => p.name.toString() === propertyName);
2041
1786
  if (property) {
2042
- return getBaseType(property).type;
1787
+ return SchemaEx.getBaseType(property).type;
2043
1788
  }
2044
1789
  }
2045
- if (isArrayType(ast)) {
2046
- const elementType = getArrayElementType(ast);
1790
+ if (SchemaEx.isArrayType(ast)) {
1791
+ const elementType = SchemaEx.getArrayElementType(ast);
2047
1792
  return elementType;
2048
1793
  }
2049
1794
  return void 0;
@@ -2052,17 +1797,17 @@ var getRequiredProperties = (ast) => {
2052
1797
  if (!ast) {
2053
1798
  return [];
2054
1799
  }
2055
- if (!isNestedType(ast)) {
1800
+ if (!SchemaEx.isNestedType(ast)) {
2056
1801
  return [];
2057
1802
  }
2058
- const properties = getProperties2(ast);
1803
+ const properties = SchemaEx.getProperties(ast);
2059
1804
  return properties.filter((p) => !p.isOptional);
2060
1805
  };
2061
1806
  var getDefaultValueForType = (ast) => {
2062
1807
  if (!ast) {
2063
1808
  return void 0;
2064
1809
  }
2065
- const defaultValue = SchemaAST6.getDefaultAnnotation(ast);
1810
+ const defaultValue = SchemaAST8.getDefaultAnnotation(ast);
2066
1811
  if (Option.isSome(defaultValue)) {
2067
1812
  return defaultValue.value;
2068
1813
  }
@@ -2084,7 +1829,7 @@ var createObjectWithDefaults = (ast) => {
2084
1829
  const defaultValue = getDefaultValueForType(prop.type);
2085
1830
  if (defaultValue !== void 0) {
2086
1831
  obj[prop.name] = defaultValue;
2087
- } else if (isNestedType(prop.type)) {
1832
+ } else if (SchemaEx.isNestedType(prop.type)) {
2088
1833
  obj[prop.name] = createObjectWithDefaults(prop.type);
2089
1834
  }
2090
1835
  }
@@ -2092,7 +1837,7 @@ var createObjectWithDefaults = (ast) => {
2092
1837
  };
2093
1838
 
2094
1839
  // src/internal/Obj/snapshot.ts
2095
- import { assertArgument as assertArgument7 } from "@dxos/invariant";
1840
+ import { assertArgument as assertArgument6 } from "@dxos/invariant";
2096
1841
  import { deepMapValues as deepMapValues3 } from "@dxos/util";
2097
1842
  var copySymbolProperty = (source, target, symbol, transform) => {
2098
1843
  let value2;
@@ -2112,7 +1857,7 @@ var copySymbolProperty = (source, target, symbol, transform) => {
2112
1857
  }
2113
1858
  };
2114
1859
  var getSnapshot = (obj) => {
2115
- assertArgument7(typeof obj === "object" && obj !== null && KindId in obj, "obj", "must be an entity");
1860
+ assertArgument6(typeof obj === "object" && obj !== null && KindId in obj, "obj", "must be an entity");
2116
1861
  const snapshot = deepMapValues3(obj, (value2, recurse) => {
2117
1862
  if (typeof value2 === "object" && value2 !== null && Object.getPrototypeOf(value2) !== Object.prototype && !Array.isArray(value2)) {
2118
1863
  return value2;
@@ -2125,16 +1870,29 @@ var getSnapshot = (obj) => {
2125
1870
  const source = obj;
2126
1871
  copySymbolProperty(source, snapshot, TypeId);
2127
1872
  copySymbolProperty(source, snapshot, SchemaId);
2128
- copySymbolProperty(source, snapshot, SelfDXNId);
1873
+ copySymbolProperty(source, snapshot, TypeEntityId);
1874
+ copySymbolProperty(source, snapshot, SelfURIId);
2129
1875
  copySymbolProperty(source, snapshot, ObjectDatabaseId);
2130
1876
  copySymbolProperty(source, snapshot, ObjectDeletedId);
1877
+ copySymbolProperty(source, snapshot, ParentId);
2131
1878
  copySymbolProperty(source, snapshot, MetaId, (meta) => ({
2132
1879
  keys: [
2133
1880
  ...meta?.keys ?? []
2134
1881
  ],
2135
1882
  tags: [
2136
1883
  ...meta?.tags ?? []
2137
- ]
1884
+ ],
1885
+ ...meta?.key != null ? {
1886
+ key: meta.key
1887
+ } : {},
1888
+ ...meta?.version != null ? {
1889
+ version: meta.version
1890
+ } : {},
1891
+ ...meta?.annotations ? {
1892
+ annotations: {
1893
+ ...meta.annotations
1894
+ }
1895
+ } : {}
2138
1896
  }));
2139
1897
  copySymbolProperty(source, snapshot, RelationSourceDXNId);
2140
1898
  copySymbolProperty(source, snapshot, RelationTargetDXNId);
@@ -2143,22 +1901,169 @@ var getSnapshot = (obj) => {
2143
1901
  return Object.freeze(snapshot);
2144
1902
  };
2145
1903
 
1904
+ // src/internal/Obj/atoms.ts
1905
+ import * as Atom from "@effect-atom/atom/Atom";
1906
+ import * as Result from "@effect-atom/atom/Result";
1907
+ import * as Effect from "effect/Effect";
1908
+ import * as Function from "effect/Function";
1909
+ import * as Option2 from "effect/Option";
1910
+ import { assertArgument as assertArgument7 } from "@dxos/invariant";
1911
+ var isRef = (obj) => obj != null && typeof obj === "object" && RefTypeId in obj;
1912
+ var getReactiveOption = (snapshot) => Effect.gen(function* () {
1913
+ const db = getDatabase(snapshot);
1914
+ if (!db) {
1915
+ return Option2.none();
1916
+ }
1917
+ const obj = db.getObjectById(snapshot.id);
1918
+ return obj ? Option2.some(obj) : Option2.none();
1919
+ });
1920
+ var objectFamily = Atom.family((obj) => {
1921
+ return Atom.make((get) => {
1922
+ const unsubscribe = subscribe(obj, () => {
1923
+ get.setSelf(getSnapshot(obj));
1924
+ });
1925
+ get.addFinalizer(() => unsubscribe());
1926
+ return getSnapshot(obj);
1927
+ }).pipe(Atom.keepAlive);
1928
+ });
1929
+ var refFamily = Atom.family((ref) => {
1930
+ return Atom.make((get) => {
1931
+ let unsubscribeTarget;
1932
+ const setupTargetSubscription = (target) => {
1933
+ unsubscribeTarget?.();
1934
+ unsubscribeTarget = subscribe(target, () => {
1935
+ get.setSelf(getSnapshot(target));
1936
+ });
1937
+ return getSnapshot(target);
1938
+ };
1939
+ get.addFinalizer(() => {
1940
+ unsubscribeTarget?.();
1941
+ });
1942
+ return loadRefTarget(ref, get, setupTargetSubscription);
1943
+ }).pipe(Atom.keepAlive);
1944
+ });
1945
+ var snapshotForComparison = (value2) => {
1946
+ if (Array.isArray(value2)) {
1947
+ return [
1948
+ ...value2
1949
+ ];
1950
+ }
1951
+ if (value2 !== null && typeof value2 === "object") {
1952
+ return {
1953
+ ...value2
1954
+ };
1955
+ }
1956
+ return value2;
1957
+ };
1958
+ var propertyFamily = Atom.family((obj) => Atom.family((key) => {
1959
+ return Atom.make((get) => {
1960
+ let previousSnapshot = snapshotForComparison(obj[key]);
1961
+ const unsubscribe2 = subscribe(obj, () => {
1962
+ const newValue = obj[key];
1963
+ const newSnapshot = snapshotForComparison(newValue);
1964
+ if (newSnapshot !== previousSnapshot) {
1965
+ previousSnapshot = newSnapshot;
1966
+ get.setSelf(newSnapshot);
1967
+ }
1968
+ });
1969
+ get.addFinalizer(() => unsubscribe2());
1970
+ return snapshotForComparison(obj[key]);
1971
+ }).pipe(Atom.keepAlive);
1972
+ }));
1973
+ var objectWithReactiveFamily = Atom.family((obj) => {
1974
+ return Atom.make((get) => {
1975
+ const unsubscribe = subscribe(obj, () => {
1976
+ get.setSelf(obj);
1977
+ });
1978
+ get.addFinalizer(() => unsubscribe());
1979
+ return obj;
1980
+ }).pipe(Atom.keepAlive);
1981
+ });
1982
+ var refWithReactiveFamily = Atom.family((ref) => {
1983
+ const effect = (get) => Effect.gen(function* () {
1984
+ const snapshot = get(makeAtom(ref));
1985
+ if (snapshot == null) {
1986
+ return void 0;
1987
+ }
1988
+ const option = yield* getReactiveOption(snapshot);
1989
+ return Option2.getOrElse(option, () => void 0);
1990
+ });
1991
+ return Function.pipe(Atom.make(effect), Atom.map((result) => Result.getOrElse(result, () => void 0)));
1992
+ });
1993
+ var entityFamily = Atom.family((entity) => {
1994
+ return Atom.make((get) => {
1995
+ const unsubscribe = subscribe(entity, () => {
1996
+ get.setSelf(getSnapshot(entity));
1997
+ });
1998
+ get.addFinalizer(() => unsubscribe());
1999
+ return getSnapshot(entity);
2000
+ }).pipe(Atom.keepAlive);
2001
+ });
2002
+ var relationFamily = Atom.family((relation) => {
2003
+ return Atom.make((get) => {
2004
+ const unsubscribe = subscribe(relation, () => {
2005
+ get.setSelf(getSnapshot(relation));
2006
+ });
2007
+ get.addFinalizer(() => unsubscribe());
2008
+ return getSnapshot(relation);
2009
+ }).pipe(Atom.keepAlive);
2010
+ });
2011
+ var makeAtom = (objOrRef) => {
2012
+ if (isRef(objOrRef)) {
2013
+ return refFamily(objOrRef);
2014
+ }
2015
+ const obj = objOrRef;
2016
+ assertArgument7(isEntity(obj), "obj", "Object must be a reactive object");
2017
+ return objectFamily(obj);
2018
+ };
2019
+ var makeProperty = (obj, key) => {
2020
+ assertArgument7(isEntity(obj), "obj", "Object must be a reactive object");
2021
+ return propertyFamily(obj)(key);
2022
+ };
2023
+ var makeWithReactive = (objOrRef) => {
2024
+ if (isRef(objOrRef)) {
2025
+ return refWithReactiveFamily(objOrRef);
2026
+ }
2027
+ const obj = objOrRef;
2028
+ assertArgument7(isEntity(obj), "obj", "Object must be a reactive object");
2029
+ return objectWithReactiveFamily(obj);
2030
+ };
2031
+ var makeEntity = (entity) => {
2032
+ assertArgument7(isEntity(entity), "entity", "Must be a reactive ECHO entity");
2033
+ return entityFamily(entity);
2034
+ };
2035
+ var makeRelation = (relation) => {
2036
+ assertArgument7(isEntity(relation), "relation", "Must be a reactive ECHO relation");
2037
+ return relationFamily(relation);
2038
+ };
2039
+ var labelAtomFamily = Atom.family((entity) => {
2040
+ return Atom.make((get) => {
2041
+ let previous = getLabel(entity);
2042
+ const unsubscribe = subscribe(entity, () => {
2043
+ const next = getLabel(entity);
2044
+ if (next !== previous) {
2045
+ previous = next;
2046
+ get.setSelf(next);
2047
+ }
2048
+ });
2049
+ get.addFinalizer(() => unsubscribe());
2050
+ return previous;
2051
+ }).pipe(Atom.keepAlive);
2052
+ });
2053
+ var makeLabelAtom = (entity) => {
2054
+ assertArgument7(isEntity(entity), "entity", "Must be a reactive ECHO entity");
2055
+ return labelAtomFamily(entity);
2056
+ };
2057
+
2146
2058
  // src/internal/Obj/clone.ts
2147
- import { invariant as invariant15 } from "@dxos/invariant";
2059
+ import { invariant as invariant11 } from "@dxos/invariant";
2148
2060
  import { deepMapValues as deepMapValues4 } from "@dxos/util";
2149
- var __dxlog_file15 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/Obj/clone.ts";
2061
+ var __dxlog_file11 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/Obj/clone.ts";
2150
2062
  var clone = (obj, opts) => {
2151
2063
  const { id, ...data } = obj;
2152
- const schema = getSchema(obj);
2153
- invariant15(schema != null, "Object should have a schema", {
2154
- F: __dxlog_file15,
2155
- L: 21,
2156
- S: void 0,
2157
- A: [
2158
- "schema != null",
2159
- "'Object should have a schema'"
2160
- ]
2161
- });
2064
+ const typeEntity = getType(obj);
2065
+ const schema = typeEntity != null ? getStaticTypeSchema(typeEntity) : getSchema(obj);
2066
+ invariant11(schema != null, "Object should have a type or schema", { "~LogMeta": "~LogMeta", F: __dxlog_file11, L: 21, S: void 0, A: ["schema != null", "'Object should have a type or schema'"] });
2162
2067
  const props = deepMapValues4(data, (value2, recurse) => {
2163
2068
  if (Ref.isRef(value2)) {
2164
2069
  if (opts?.deep) {
@@ -2180,13 +2085,16 @@ var clone = (obj, opts) => {
2180
2085
  }
2181
2086
  return recurse(value2);
2182
2087
  });
2183
- return makeObject(schema, props, meta);
2088
+ return makeObject(schema, props, meta, typeEntity);
2184
2089
  };
2185
2090
 
2186
- // src/internal/Query.ts
2091
+ // src/internal/Query/pretty.ts
2187
2092
  var prettyFilter = (filter) => {
2188
2093
  switch (filter.type) {
2189
2094
  case "object": {
2095
+ if (filter.typename === null && (filter.id === void 0 || filter.id.length === 0) && Object.keys(filter.props).length === 0 && (filter.foreignKeys === void 0 || filter.foreignKeys.length === 0) && filter.metaKey !== void 0) {
2096
+ return filter.metaVersion !== void 0 ? `Filter.key(${JSON.stringify(filter.metaKey)}, { version: ${JSON.stringify(filter.metaVersion)} })` : `Filter.key(${JSON.stringify(filter.metaKey)})`;
2097
+ }
2190
2098
  const parts = [];
2191
2099
  if (filter.typename !== null) {
2192
2100
  parts.push(String(filter.typename));
@@ -2202,6 +2110,9 @@ var prettyFilter = (filter) => {
2202
2110
  if (filter.foreignKeys !== void 0 && filter.foreignKeys.length > 0) {
2203
2111
  parts.push(`foreignKeys: [${filter.foreignKeys.map((fk) => JSON.stringify(fk)).join(", ")}]`);
2204
2112
  }
2113
+ if (filter.metaKey !== void 0) {
2114
+ parts.push(filter.metaVersion !== void 0 ? `metaKey: ${JSON.stringify(filter.metaKey)} (${filter.metaVersion})` : `metaKey: ${JSON.stringify(filter.metaKey)}`);
2115
+ }
2205
2116
  return parts.length > 0 ? `Filter.type(${parts.join(", ")})` : "Filter.everything()";
2206
2117
  }
2207
2118
  case "compare":
@@ -2265,6 +2176,9 @@ var prettyQuery = (query) => {
2265
2176
  return "Order.natural()";
2266
2177
  } else if (o.kind === "rank") {
2267
2178
  return `Order.rank(${JSON.stringify(o.direction)})`;
2179
+ } else if (o.kind === "timestamp") {
2180
+ const fn = o.field === "updatedAt" ? "updated" : "created";
2181
+ return `Order.${fn}(${JSON.stringify(o.direction)})`;
2268
2182
  } else {
2269
2183
  return `Order.property(${JSON.stringify(o.property)}, ${JSON.stringify(o.direction)})`;
2270
2184
  }
@@ -2277,22 +2191,26 @@ var prettyQuery = (query) => {
2277
2191
  if (opts.deleted !== void 0) {
2278
2192
  parts.push(`deleted: ${JSON.stringify(opts.deleted)}`);
2279
2193
  }
2194
+ if (opts.debugLabel !== void 0) {
2195
+ parts.push(`debugLabel: ${JSON.stringify(opts.debugLabel)}`);
2196
+ }
2280
2197
  return `${prettyQuery(query.query)}.options({ ${parts.join(", ")} })`;
2281
2198
  }
2282
2199
  case "from": {
2283
2200
  if (query.from._tag === "scope") {
2284
- const scope = query.from.scope;
2285
- const parts = [];
2286
- if (scope.spaceIds !== void 0) {
2287
- parts.push(`spaceIds: [${scope.spaceIds.map((s) => JSON.stringify(s)).join(", ")}]`);
2288
- }
2289
- if (scope.queues !== void 0) {
2290
- parts.push(`queues: [${scope.queues.map(String).join(", ")}]`);
2291
- }
2292
- if (scope.allQueuesFromSpaces !== void 0) {
2293
- parts.push(`allQueuesFromSpaces: ${scope.allQueuesFromSpaces}`);
2201
+ if (query.from.scopes.length === 0) {
2202
+ return `${prettyQuery(query.query)}.from('all-accessible-spaces')`;
2294
2203
  }
2295
- return `${prettyQuery(query.query)}.from({ ${parts.join(", ")} })`;
2204
+ const scopeStrs = query.from.scopes.map((scope) => {
2205
+ if (scope._tag === "space") {
2206
+ return scope.includeAllFeeds ? `{ space: ${JSON.stringify(scope.spaceId)}, includeAllFeeds: true }` : `{ space: ${JSON.stringify(scope.spaceId)} }`;
2207
+ }
2208
+ if (scope._tag === "feed") {
2209
+ return `{ feed: ${JSON.stringify(String(scope.feedUri))} }`;
2210
+ }
2211
+ return `{ registry: ${JSON.stringify(scope.location)} }`;
2212
+ });
2213
+ return `${prettyQuery(query.query)}.from([${scopeStrs.join(", ")}])`;
2296
2214
  }
2297
2215
  return `${prettyQuery(query.query)}.from(${prettyQuery(query.from.query)})`;
2298
2216
  }
@@ -2301,36 +2219,22 @@ var prettyQuery = (query) => {
2301
2219
  }
2302
2220
  };
2303
2221
 
2304
- // src/internal/Type/echo-schema.ts
2305
- import * as Schema13 from "effect/Schema";
2306
- import * as SchemaAST8 from "effect/SchemaAST";
2307
- import { invariant as invariant17 } from "@dxos/invariant";
2308
-
2309
2222
  // src/internal/Type/manipulation.ts
2310
- import * as Schema11 from "effect/Schema";
2311
- import * as SchemaAST7 from "effect/SchemaAST";
2312
- import { invariant as invariant16 } from "@dxos/invariant";
2313
- import { DXN as DXN7 } from "@dxos/keys";
2314
- var __dxlog_file16 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/Type/manipulation.ts";
2223
+ import * as Schema10 from "effect/Schema";
2224
+ import * as SchemaAST9 from "effect/SchemaAST";
2225
+ import { invariant as invariant12 } from "@dxos/invariant";
2226
+ var __dxlog_file12 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/Type/manipulation.ts";
2315
2227
  var addFieldsToSchema = (schema, fields) => {
2316
- const schemaExtension = Schema11.partial(Schema11.Struct(fields));
2317
- return Schema11.extend(schema, schemaExtension).annotations(schema.ast.annotations);
2228
+ const schemaExtension = Schema10.partial(Schema10.Struct(fields));
2229
+ return Schema10.extend(schema, schemaExtension).annotations(schema.ast.annotations);
2318
2230
  };
2319
2231
  var updateFieldsInSchema = (schema, fields) => {
2320
2232
  const ast = schema.ast;
2321
- invariant16(SchemaAST7.isTypeLiteral(ast), void 0, {
2322
- F: __dxlog_file16,
2323
- L: 29,
2324
- S: void 0,
2325
- A: [
2326
- "SchemaAST.isTypeLiteral(ast)",
2327
- ""
2328
- ]
2329
- });
2233
+ invariant12(SchemaAST9.isTypeLiteral(ast), void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file12, L: 14, S: void 0, A: ["SchemaAST.isTypeLiteral(ast)", ""] });
2330
2234
  const updatedProperties = [
2331
2235
  ...ast.propertySignatures
2332
2236
  ];
2333
- const propertiesToUpdate = Schema11.partial(Schema11.Struct(fields)).ast.propertySignatures;
2237
+ const propertiesToUpdate = Schema10.partial(Schema10.Struct(fields)).ast.propertySignatures;
2334
2238
  for (const property of propertiesToUpdate) {
2335
2239
  const index = updatedProperties.findIndex((p) => p.name === property.name);
2336
2240
  if (index !== -1) {
@@ -2339,420 +2243,39 @@ var updateFieldsInSchema = (schema, fields) => {
2339
2243
  updatedProperties.push(property);
2340
2244
  }
2341
2245
  }
2342
- return Schema11.make(new SchemaAST7.TypeLiteral(updatedProperties, ast.indexSignatures, ast.annotations));
2246
+ return Schema10.make(new SchemaAST9.TypeLiteral(updatedProperties, ast.indexSignatures, ast.annotations));
2343
2247
  };
2344
2248
  var removeFieldsFromSchema = (schema, fieldNames) => {
2345
- return Schema11.make(SchemaAST7.omit(schema.ast, fieldNames)).annotations(schema.ast.annotations);
2249
+ return Schema10.make(SchemaAST9.omit(schema.ast, fieldNames)).annotations(schema.ast.annotations);
2346
2250
  };
2347
2251
  var updateFieldNameInSchema = (schema, { before, after }) => {
2348
2252
  const ast = schema.ast;
2349
- invariant16(SchemaAST7.isTypeLiteral(ast), void 0, {
2350
- F: __dxlog_file16,
2351
- L: 57,
2352
- S: void 0,
2353
- A: [
2354
- "SchemaAST.isTypeLiteral(ast)",
2355
- ""
2356
- ]
2357
- });
2358
- return Schema11.make(new SchemaAST7.TypeLiteral(ast.propertySignatures.map((p) => p.name === before ? new SchemaAST7.PropertySignature(after, p.type, p.isOptional, p.isReadonly, p.annotations) : p), ast.indexSignatures, ast.annotations));
2359
- };
2360
- var setTypenameInSchema = (schema, typename) => {
2361
- const existingAnnotation = schema.ast.annotations[TypeAnnotationId];
2362
- invariant16(existingAnnotation, `Missing ${String(TypeAnnotationId)}`, {
2363
- F: __dxlog_file16,
2364
- L: 77,
2365
- S: void 0,
2366
- A: [
2367
- "existingAnnotation",
2368
- "`Missing ${String(TypeAnnotationId)}`"
2369
- ]
2370
- });
2371
- return schema.annotations({
2372
- ...schema.ast.annotations,
2373
- [TypeAnnotationId]: {
2374
- kind: existingAnnotation.kind,
2375
- typename,
2376
- version: existingAnnotation.version
2377
- },
2378
- [SchemaAST7.JSONSchemaAnnotationId]: {
2379
- ...schema.ast.annotations[SchemaAST7.JSONSchemaAnnotationId] ?? {},
2380
- $id: schema.ast.annotations[TypeIdentifierAnnotationId] ?? DXN7.fromTypename(typename).toString(),
2381
- typename
2382
- }
2383
- });
2253
+ invariant12(SchemaAST9.isTypeLiteral(ast), void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file12, L: 34, S: void 0, A: ["SchemaAST.isTypeLiteral(ast)", ""] });
2254
+ return Schema10.make(new SchemaAST9.TypeLiteral(ast.propertySignatures.map((p) => p.name === before ? new SchemaAST9.PropertySignature(after, p.type, p.isOptional, p.isReadonly, p.annotations) : p), ast.indexSignatures, ast.annotations));
2384
2255
  };
2385
2256
 
2386
- // src/internal/Type/persistent-schema.ts
2387
- import * as Schema12 from "effect/Schema";
2388
- var PersistentSchema = Schema12.Struct({
2389
- name: Schema12.optional(Schema12.String),
2390
- typename: TypenameSchema,
2391
- version: VersionSchema,
2257
+ // src/internal/Type/type-schema.ts
2258
+ import * as Schema11 from "effect/Schema";
2259
+ var TypeSchemaStruct = Schema11.Struct({
2260
+ name: Schema11.optional(Schema11.String),
2392
2261
  jsonSchema: JsonSchemaType
2393
- }).pipe(EchoObjectSchema({
2394
- typename: "org.dxos.type.schema",
2395
- version: "0.1.0"
2396
- }), LabelAnnotation.set([
2262
+ });
2263
+ var TypeSchema = TypeSchemaStruct.pipe(LabelAnnotation.set([
2397
2264
  "name"
2398
2265
  ]), IconAnnotation.set({
2399
2266
  icon: "ph--database--regular",
2400
2267
  hue: "green"
2401
- }));
2402
-
2403
- // src/internal/Type/echo-schema.ts
2404
- var __dxlog_file17 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/Type/echo-schema.ts";
2405
- var ImmutableSchema = class {
2406
- _schema;
2407
- _objectAnnotation;
2408
- constructor(_schema) {
2409
- this._schema = _schema;
2410
- this._objectAnnotation = getTypeAnnotation(this._schema);
2411
- invariant17(this._objectAnnotation, void 0, {
2412
- F: __dxlog_file17,
2413
- L: 48,
2414
- S: this,
2415
- A: [
2416
- "this._objectAnnotation",
2417
- ""
2418
- ]
2419
- });
2420
- }
2421
- //
2422
- // Effect Schema (push to abstract base class).
2423
- //
2424
- get [Schema13.TypeId]() {
2425
- return schemaVariance2;
2426
- }
2427
- get Type() {
2428
- return this._schema.Type;
2429
- }
2430
- get Encoded() {
2431
- return this._schema.Encoded;
2432
- }
2433
- get Context() {
2434
- return this._schema.Context;
2435
- }
2436
- get ast() {
2437
- return this._schema.ast;
2438
- }
2439
- get annotations() {
2440
- return this._schema.annotations;
2441
- }
2442
- get pipe() {
2443
- return this._schema.pipe;
2444
- }
2445
- //
2446
- // TypedObject
2447
- //
2448
- get kind() {
2449
- return this._objectAnnotation.kind;
2450
- }
2451
- get typename() {
2452
- return this._objectAnnotation.typename;
2453
- }
2454
- get version() {
2455
- return this._objectAnnotation.version;
2456
- }
2457
- //
2458
- // BaseSchema
2459
- //
2460
- get readonly() {
2461
- return true;
2462
- }
2463
- get snapshot() {
2464
- return this._schema;
2465
- }
2466
- // TODO(burdon): Change from getter since this is expensive.
2467
- get jsonSchema() {
2468
- return toJsonSchema(this._schema);
2469
- }
2470
- get mutable() {
2471
- throw new Error("Schema is readonly.");
2472
- }
2473
- };
2474
- var EchoSchemaConstructor = () => {
2475
- return class {
2476
- static get _schema() {
2477
- return Schema13.Union(PersistentSchema, Schema13.instanceOf(EchoSchema)).annotations(PersistentSchema.ast.annotations);
2478
- }
2479
- static [Schema13.TypeId] = schemaVariance2;
2480
- static get ast() {
2481
- const schema = this._schema;
2482
- return schema.ast;
2483
- }
2484
- static get annotations() {
2485
- const schema = this._schema;
2486
- return schema.annotations.bind(schema);
2487
- }
2488
- static get pipe() {
2489
- const schema = this._schema;
2490
- return schema.pipe.bind(schema);
2491
- }
2492
- };
2493
- };
2494
- var isMutable = (schema) => {
2495
- return schema instanceof EchoSchema;
2496
- };
2497
- var schemaVariance2 = {
2498
- _A: (_) => _,
2499
- _I: (_) => _,
2500
- _R: (_) => _
2501
- };
2502
- var EchoSchema = class extends EchoSchemaConstructor() {
2503
- _persistentSchema;
2504
- _schema;
2505
- _isDirty = true;
2506
- /**
2507
- * Schema kind key that marks this as an ECHO schema.
2508
- * Makes EchoSchema satisfy the Type.AnyObj type.
2509
- */
2510
- [SchemaKindId] = EntityKind.Object;
2511
- constructor(_persistentSchema) {
2512
- super(), this._persistentSchema = _persistentSchema;
2513
- }
2514
- //
2515
- // Effect Schema (push to abstract base class).
2516
- //
2517
- get [Schema13.TypeId]() {
2518
- return schemaVariance2;
2519
- }
2520
- get Type() {
2521
- return this._persistentSchema;
2522
- }
2523
- get Encoded() {
2524
- return this._persistentSchema;
2525
- }
2526
- get Context() {
2527
- const schema = this._getSchema();
2528
- return schema.Context;
2529
- }
2530
- get ast() {
2531
- const schema = this._getSchema();
2532
- return schema.ast;
2533
- }
2534
- get annotations() {
2535
- const schema = this._getSchema();
2536
- return schema.annotations.bind(schema);
2537
- }
2538
- get pipe() {
2539
- const schema = this._getSchema();
2540
- return schema.pipe.bind(schema);
2541
- }
2542
- //
2543
- // BaseSchema
2544
- //
2545
- get kind() {
2546
- return EntityKind.Object;
2547
- }
2548
- get typename() {
2549
- return this._persistentSchema.typename;
2550
- }
2551
- get version() {
2552
- return this._persistentSchema.version;
2553
- }
2554
- get readonly() {
2555
- return false;
2556
- }
2557
- /**
2558
- * Returns an immutable schema snapshot of the current state of the schema.
2559
- */
2560
- get snapshot() {
2561
- return this._getSchema();
2562
- }
2563
- /**
2564
- * Returns the JSON schema for the schema.
2565
- */
2566
- get jsonSchema() {
2567
- return this._persistentSchema.jsonSchema;
2568
- }
2569
- /**
2570
- * Returns a mutable schema.
2571
- */
2572
- get mutable() {
2573
- invariant17(!this.readonly, "Schema is not mutable", {
2574
- F: __dxlog_file17,
2575
- L: 278,
2576
- S: this,
2577
- A: [
2578
- "!this.readonly",
2579
- "'Schema is not mutable'"
2580
- ]
2581
- });
2582
- return this;
2583
- }
2584
- //
2585
- // Mutable Schema
2586
- //
2587
- /**
2588
- * Id of the ECHO object containing the schema.
2589
- */
2590
- get id() {
2591
- return this._persistentSchema.id;
2592
- }
2593
- /**
2594
- * Short name of the schema.
2595
- */
2596
- get name() {
2597
- return this._persistentSchema.name;
2598
- }
2599
- get [SchemaMetaSymbol]() {
2600
- return {
2601
- id: this.id,
2602
- typename: this.typename,
2603
- version: this._persistentSchema.version
2604
- };
2605
- }
2606
- /**
2607
- * Reference to the underlying persistent schema object.
2608
- */
2609
- get persistentSchema() {
2610
- return this._persistentSchema;
2611
- }
2612
- getProperties() {
2613
- const ast = this._getSchema().ast;
2614
- invariant17(SchemaAST8.isTypeLiteral(ast), void 0, {
2615
- F: __dxlog_file17,
2616
- L: 313,
2617
- S: this,
2618
- A: [
2619
- "SchemaAST.isTypeLiteral(ast)",
2620
- ""
2621
- ]
2622
- });
2623
- return [
2624
- ...ast.propertySignatures
2625
- ].filter((p) => p.name !== "id").map(unwrapOptionality);
2626
- }
2627
- //
2628
- // Mutation methods.
2629
- // TODO(burdon): Create separate interface for dynamic schema.
2630
- // TODO(burdon): Deprecate direct manipulation? Use JSONSchema directly.
2631
- //
2632
- /**
2633
- * @throws Error if the schema is readonly.
2634
- */
2635
- updateTypename(typename) {
2636
- const updated = setTypenameInSchema(this._getSchema(), typename);
2637
- this._change((schema) => {
2638
- schema.typename = typename;
2639
- schema.jsonSchema = toJsonSchema(updated);
2640
- });
2641
- }
2642
- /**
2643
- * @throws Error if the schema is readonly.
2644
- */
2645
- addFields(fields) {
2646
- const extended = addFieldsToSchema(this._getSchema(), fields);
2647
- this._change((schema) => {
2648
- schema.jsonSchema = toJsonSchema(extended);
2649
- });
2650
- }
2651
- /**
2652
- * @throws Error if the schema is readonly.
2653
- */
2654
- updateFields(fields) {
2655
- const updated = updateFieldsInSchema(this._getSchema(), fields);
2656
- this._change((schema) => {
2657
- schema.jsonSchema = toJsonSchema(updated);
2658
- });
2659
- }
2660
- /**
2661
- * @throws Error if the schema is readonly.
2662
- */
2663
- updateFieldPropertyName({ before, after }) {
2664
- const renamed = updateFieldNameInSchema(this._getSchema(), {
2665
- before,
2666
- after
2667
- });
2668
- this._change((schema) => {
2669
- schema.jsonSchema = toJsonSchema(renamed);
2670
- });
2671
- }
2672
- /**
2673
- * @throws Error if the schema is readonly.
2674
- */
2675
- removeFields(fieldNames) {
2676
- const removed = removeFieldsFromSchema(this._getSchema(), fieldNames);
2677
- this._change((schema) => {
2678
- schema.jsonSchema = toJsonSchema(removed);
2679
- });
2680
- }
2681
- /**
2682
- * Wrapper for Obj.change that handles the change context for the persistent schema.
2683
- */
2684
- _change(callback) {
2685
- const changeFn = this._persistentSchema[ChangeId];
2686
- if (changeFn) {
2687
- changeFn(callback);
2688
- } else {
2689
- callback(this._persistentSchema);
2690
- }
2691
- }
2692
- //
2693
- // Internals
2694
- //
2695
- /**
2696
- * Called by DatabaseSchemaRegistry on update.
2697
- */
2698
- _invalidate() {
2699
- this._isDirty = true;
2700
- }
2701
- /**
2702
- * Rebuilds this schema if it is dirty.
2703
- */
2704
- _rebuild() {
2705
- if (this._isDirty || this._schema == null) {
2706
- this._schema = toEffectSchema(getSnapshot(this._persistentSchema).jsonSchema);
2707
- this._isDirty = false;
2708
- }
2709
- }
2710
- _getSchema() {
2711
- this._rebuild();
2712
- return this._schema;
2713
- }
2714
- };
2715
- var unwrapOptionality = (property) => {
2716
- if (!SchemaAST8.isUnion(property.type)) {
2717
- return property;
2718
- }
2719
- return {
2720
- ...property,
2721
- type: property.type.types.find((type) => !SchemaAST8.isUndefinedKeyword(type))
2722
- };
2723
- };
2268
+ }), EchoTypeKindSchema(TypeMetaSchemaDXN));
2724
2269
 
2725
2270
  export {
2726
2271
  RawObject,
2727
- ATTR_META,
2728
- MetaId,
2729
- ObjectMetaSchema,
2730
- getMeta,
2731
- foreignKey,
2732
- foreignKeyEquals,
2733
- compareForeignKeys,
2734
- ATTR_SELF_DXN,
2735
- SelfDXNId,
2736
- ATTR_DELETED,
2737
- ObjectDeletedId,
2738
- ObjectVersionId,
2739
- ObjectDatabaseId,
2740
- ATTR_RELATION_SOURCE,
2741
- RelationSourceId,
2742
- RelationSourceDXNId,
2743
- ATTR_RELATION_TARGET,
2744
- RelationTargetId,
2745
- RelationTargetDXNId,
2746
2272
  VersionTypeId,
2747
2273
  compare,
2748
2274
  sortByLabel,
2749
2275
  sortByTypename,
2750
2276
  sort,
2751
- getMetaChecked,
2752
- getKeys,
2753
- deleteKeys,
2754
- addTag,
2755
- removeTag,
2277
+ getStrongDependencyUris,
2278
+ getStrongDependencies,
2756
2279
  EventId,
2757
2280
  ChangeId,
2758
2281
  batchEvents,
@@ -2790,20 +2313,19 @@ export {
2790
2313
  makeObject,
2791
2314
  subscribe,
2792
2315
  change,
2793
- assertObjectModel,
2794
- getObjectDXN,
2795
- getDXN,
2796
- getDatabase,
2316
+ TypeMetaSchemaDXN,
2797
2317
  makeEchoTypeSchema,
2318
+ normalizeSchema,
2798
2319
  EchoObjectSchema,
2799
2320
  EchoRelationSchema,
2321
+ getDXNForRelationSchemaRef,
2322
+ EchoTypeKindSchema,
2800
2323
  isVersion,
2801
2324
  version,
2802
2325
  versionValid,
2803
2326
  compareVersions,
2804
2327
  encodeVersion,
2805
2328
  decodeVersion,
2806
- normalizeSchema,
2807
2329
  makeTypedEntityClass,
2808
2330
  objectToJSON,
2809
2331
  objectFromJSON,
@@ -2811,9 +2333,14 @@ export {
2811
2333
  objectStructureToJson,
2812
2334
  createObject,
2813
2335
  isDeleted,
2814
- createQueueDXN,
2815
2336
  setValue,
2816
2337
  getSnapshot,
2338
+ makeAtom,
2339
+ makeProperty,
2340
+ makeWithReactive,
2341
+ makeEntity,
2342
+ makeRelation,
2343
+ makeLabelAtom,
2817
2344
  clone,
2818
2345
  prettyFilter,
2819
2346
  prettyQuery,
@@ -2821,14 +2348,6 @@ export {
2821
2348
  updateFieldsInSchema,
2822
2349
  removeFieldsFromSchema,
2823
2350
  updateFieldNameInSchema,
2824
- setTypenameInSchema,
2825
- PersistentSchema,
2826
- ImmutableSchema,
2827
- isMutable,
2828
- EchoSchema,
2829
- JsonPath,
2830
- JsonProp,
2831
- getValue,
2832
- splitJsonPath
2833
- };
2834
- //# sourceMappingURL=chunk-MOR5ERFM.mjs.map
2351
+ TypeSchema
2352
+ };
2353
+ //# sourceMappingURL=chunk-VQYL2OQF.mjs.map