@dxos/echo 0.8.4-main.40e3dcdf1b → 0.8.4-main.43cb759274

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 (428) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +7 -7
  3. package/dist/lib/neutral/Annotation.mjs +29 -6
  4. package/dist/lib/neutral/Database.mjs +8 -9
  5. package/dist/lib/neutral/Entity.mjs +29 -18
  6. package/dist/lib/neutral/Err.mjs +3 -3
  7. package/dist/lib/neutral/Feed.mjs +27 -19
  8. package/dist/lib/neutral/Filter.mjs +25 -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 +18 -0
  13. package/dist/lib/neutral/Obj.mjs +25 -19
  14. package/dist/lib/neutral/Order.mjs +1 -1
  15. package/dist/lib/neutral/Query.mjs +19 -16
  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/Registry.mjs.map +7 -0
  20. package/dist/lib/neutral/Relation.mjs +26 -24
  21. package/dist/lib/neutral/Scope.mjs +12 -0
  22. package/dist/lib/neutral/Scope.mjs.map +7 -0
  23. package/dist/lib/neutral/Tag.mjs +17 -13
  24. package/dist/lib/neutral/Type.mjs +52 -26
  25. package/dist/lib/neutral/chunk-3DKP2EIN.mjs +31 -0
  26. package/dist/lib/neutral/chunk-3DKP2EIN.mjs.map +7 -0
  27. package/dist/lib/neutral/chunk-4BB4MFCN.mjs +154 -0
  28. package/dist/lib/neutral/chunk-4BB4MFCN.mjs.map +7 -0
  29. package/dist/lib/neutral/{chunk-CIRHIEMW.mjs → chunk-4SFPZJVA.mjs} +92 -112
  30. package/dist/lib/neutral/chunk-4SFPZJVA.mjs.map +7 -0
  31. package/dist/lib/neutral/{chunk-YWXWXIE5.mjs → chunk-4Z6GET2X.mjs} +3 -3
  32. package/dist/lib/neutral/chunk-4Z6GET2X.mjs.map +7 -0
  33. package/dist/lib/neutral/{chunk-ANHVGJI4.mjs → chunk-7LOUAPYZ.mjs} +9 -5
  34. package/dist/lib/neutral/chunk-7LOUAPYZ.mjs.map +7 -0
  35. package/dist/lib/neutral/{chunk-43Y5DOS6.mjs → chunk-7OAFN3OX.mjs} +75 -112
  36. package/dist/lib/neutral/chunk-7OAFN3OX.mjs.map +7 -0
  37. package/dist/lib/neutral/{chunk-BOZZPUXE.mjs → chunk-7PRCIDHH.mjs} +41 -81
  38. package/dist/lib/neutral/chunk-7PRCIDHH.mjs.map +7 -0
  39. package/dist/lib/neutral/{chunk-UBEZSGXY.mjs → chunk-BBFJWWAV.mjs} +6 -6
  40. package/dist/lib/neutral/chunk-BBFJWWAV.mjs.map +7 -0
  41. package/dist/lib/neutral/chunk-BDQGMDIX.mjs +132 -0
  42. package/dist/lib/neutral/chunk-BDQGMDIX.mjs.map +7 -0
  43. package/dist/lib/neutral/chunk-CGTI5MXO.mjs +36 -0
  44. package/dist/lib/neutral/chunk-CGTI5MXO.mjs.map +7 -0
  45. package/dist/lib/neutral/{chunk-OMUPQMLR.mjs → chunk-DKLUHO4T.mjs} +1 -1
  46. package/dist/lib/neutral/chunk-DKLUHO4T.mjs.map +7 -0
  47. package/dist/lib/neutral/chunk-DMN2CKPX.mjs +93 -0
  48. package/dist/lib/neutral/chunk-DMN2CKPX.mjs.map +7 -0
  49. package/dist/lib/neutral/{chunk-UTBRYVQC.mjs → chunk-G6CFWUYH.mjs} +2 -2
  50. package/dist/lib/neutral/chunk-H26LSXVJ.mjs +653 -0
  51. package/dist/lib/neutral/chunk-H26LSXVJ.mjs.map +7 -0
  52. package/dist/lib/neutral/{chunk-FXEG7EOK.mjs → chunk-J3MNM65T.mjs} +9 -6
  53. package/dist/lib/neutral/chunk-J3MNM65T.mjs.map +7 -0
  54. package/dist/lib/neutral/chunk-JE7AOSWF.mjs +247 -0
  55. package/dist/lib/neutral/chunk-JE7AOSWF.mjs.map +7 -0
  56. package/dist/lib/neutral/chunk-LAF3LSWI.mjs +379 -0
  57. package/dist/lib/neutral/chunk-LAF3LSWI.mjs.map +7 -0
  58. package/dist/lib/neutral/chunk-LMNRFOVB.mjs +108 -0
  59. package/dist/lib/neutral/chunk-LMNRFOVB.mjs.map +7 -0
  60. package/dist/lib/neutral/{chunk-WYOKA6AE.mjs → chunk-O6BH7EPN.mjs} +31 -4
  61. package/dist/lib/neutral/chunk-O6BH7EPN.mjs.map +7 -0
  62. package/dist/lib/neutral/{chunk-KTAWP7GI.mjs → chunk-OIYW7R2G.mjs} +99 -46
  63. package/dist/lib/neutral/chunk-OIYW7R2G.mjs.map +7 -0
  64. package/dist/lib/neutral/{chunk-TQQZLKB7.mjs → chunk-OYUG4FHF.mjs} +648 -1228
  65. package/dist/lib/neutral/chunk-OYUG4FHF.mjs.map +7 -0
  66. package/dist/lib/neutral/{chunk-NQRLRYJM.mjs → chunk-Q5FKCVBC.mjs} +173 -60
  67. package/dist/lib/neutral/chunk-Q5FKCVBC.mjs.map +7 -0
  68. package/dist/lib/neutral/chunk-Q62IHV2N.mjs +41 -0
  69. package/dist/lib/neutral/chunk-Q62IHV2N.mjs.map +7 -0
  70. package/dist/lib/neutral/{chunk-UFDK26FO.mjs → chunk-QVJDDG44.mjs} +69 -34
  71. package/dist/lib/neutral/chunk-QVJDDG44.mjs.map +7 -0
  72. package/dist/lib/neutral/{chunk-B5OXLWZL.mjs → chunk-TFEWTY5A.mjs} +155 -129
  73. package/dist/lib/neutral/chunk-TFEWTY5A.mjs.map +7 -0
  74. package/dist/lib/neutral/{chunk-UI6MWK5W.mjs → chunk-TTCSATUD.mjs} +1 -1
  75. package/dist/lib/neutral/{chunk-FZO7LQO7.mjs → chunk-VKWOFXT2.mjs} +22 -2
  76. package/dist/lib/neutral/{chunk-FZO7LQO7.mjs.map → chunk-VKWOFXT2.mjs.map} +1 -1
  77. package/dist/lib/neutral/{chunk-NXMFBIT5.mjs → chunk-ZACMEAYV.mjs} +89 -23
  78. package/dist/lib/neutral/chunk-ZACMEAYV.mjs.map +7 -0
  79. package/dist/lib/neutral/index.mjs +58 -38
  80. package/dist/lib/neutral/internal/index.mjs +131 -64
  81. package/dist/lib/neutral/meta.json +1 -1
  82. package/dist/lib/neutral/testing/index.mjs +222 -177
  83. package/dist/lib/neutral/testing/index.mjs.map +3 -3
  84. package/dist/types/src/Annotation.d.ts +108 -4
  85. package/dist/types/src/Annotation.d.ts.map +1 -1
  86. package/dist/types/src/Annotation.test.d.ts +2 -0
  87. package/dist/types/src/Annotation.test.d.ts.map +1 -0
  88. package/dist/types/src/Collection.d.ts +2 -3
  89. package/dist/types/src/Collection.d.ts.map +1 -1
  90. package/dist/types/src/Database.d.ts +56 -24
  91. package/dist/types/src/Database.d.ts.map +1 -1
  92. package/dist/types/src/Dataset.d.ts +17 -6
  93. package/dist/types/src/Dataset.d.ts.map +1 -1
  94. package/dist/types/src/Entity.d.ts +102 -26
  95. package/dist/types/src/Entity.d.ts.map +1 -1
  96. package/dist/types/src/Err.d.ts +27 -27
  97. package/dist/types/src/Err.d.ts.map +1 -1
  98. package/dist/types/src/Feed.d.ts +89 -25
  99. package/dist/types/src/Feed.d.ts.map +1 -1
  100. package/dist/types/src/Filter.d.ts +74 -11
  101. package/dist/types/src/Filter.d.ts.map +1 -1
  102. package/dist/types/src/Filter.test.d.ts +2 -0
  103. package/dist/types/src/Filter.test.d.ts.map +1 -0
  104. package/dist/types/src/Hypergraph.d.ts +14 -9
  105. package/dist/types/src/Hypergraph.d.ts.map +1 -1
  106. package/dist/types/src/Json.d.ts +33 -0
  107. package/dist/types/src/Json.d.ts.map +1 -0
  108. package/dist/types/src/Json.test.d.ts +2 -0
  109. package/dist/types/src/Json.test.d.ts.map +1 -0
  110. package/dist/types/src/JsonSchema.d.ts +2 -2
  111. package/dist/types/src/JsonSchema.d.ts.map +1 -1
  112. package/dist/types/src/Key.d.ts +1 -1
  113. package/dist/types/src/Key.d.ts.map +1 -1
  114. package/dist/types/src/Migration.d.ts +72 -0
  115. package/dist/types/src/Migration.d.ts.map +1 -0
  116. package/dist/types/src/Obj.d.ts +108 -65
  117. package/dist/types/src/Obj.d.ts.map +1 -1
  118. package/dist/types/src/Order.d.ts.map +1 -1
  119. package/dist/types/src/Query.d.ts +35 -10
  120. package/dist/types/src/Query.d.ts.map +1 -1
  121. package/dist/types/src/QueryResult.d.ts +9 -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 +72 -44
  128. package/dist/types/src/Relation.d.ts.map +1 -1
  129. package/dist/types/src/Scope.d.ts +34 -0
  130. package/dist/types/src/Scope.d.ts.map +1 -0
  131. package/dist/types/src/StateMap.d.ts +32 -0
  132. package/dist/types/src/StateMap.d.ts.map +1 -0
  133. package/dist/types/src/StateMap.test.d.ts +2 -0
  134. package/dist/types/src/StateMap.test.d.ts.map +1 -0
  135. package/dist/types/src/Tag.d.ts +21 -5
  136. package/dist/types/src/Tag.d.ts.map +1 -1
  137. package/dist/types/src/TagIndex.d.ts +36 -0
  138. package/dist/types/src/TagIndex.d.ts.map +1 -0
  139. package/dist/types/src/TagIndex.test.d.ts +2 -0
  140. package/dist/types/src/TagIndex.test.d.ts.map +1 -0
  141. package/dist/types/src/Tagging.d.ts +31 -0
  142. package/dist/types/src/Tagging.d.ts.map +1 -0
  143. package/dist/types/src/Type.d.ts +357 -96
  144. package/dist/types/src/Type.d.ts.map +1 -1
  145. package/dist/types/src/View.d.ts +2 -5
  146. package/dist/types/src/View.d.ts.map +1 -1
  147. package/dist/types/src/exemplars.test.d.ts +2 -0
  148. package/dist/types/src/exemplars.test.d.ts.map +1 -0
  149. package/dist/types/src/index.d.ts +8 -2
  150. package/dist/types/src/index.d.ts.map +1 -1
  151. package/dist/types/src/internal/Annotation/annotations.d.ts +79 -37
  152. package/dist/types/src/internal/Annotation/annotations.d.ts.map +1 -1
  153. package/dist/types/src/internal/Annotation/dictionary.d.ts +24 -0
  154. package/dist/types/src/internal/Annotation/dictionary.d.ts.map +1 -0
  155. package/dist/types/src/internal/Annotation/entity-dictionary.d.ts +14 -0
  156. package/dist/types/src/internal/Annotation/entity-dictionary.d.ts.map +1 -0
  157. package/dist/types/src/internal/Annotation/index.d.ts +4 -2
  158. package/dist/types/src/internal/Annotation/index.d.ts.map +1 -1
  159. package/dist/types/src/internal/Annotation/sorting.d.ts.map +1 -1
  160. package/dist/types/src/internal/Annotation/util.d.ts +14 -5
  161. package/dist/types/src/internal/Annotation/util.d.ts.map +1 -1
  162. package/dist/types/src/internal/Entity/api.d.ts +3 -3
  163. package/dist/types/src/internal/Entity/api.d.ts.map +1 -1
  164. package/dist/types/src/internal/Entity/entity.d.ts +72 -8
  165. package/dist/types/src/internal/Entity/entity.d.ts.map +1 -1
  166. package/dist/types/src/internal/Entity/guard.d.ts +10 -0
  167. package/dist/types/src/internal/Entity/guard.d.ts.map +1 -0
  168. package/dist/types/src/internal/Entity/index.d.ts +2 -0
  169. package/dist/types/src/internal/Entity/index.d.ts.map +1 -1
  170. package/dist/types/src/internal/Entity/model.d.ts +20 -17
  171. package/dist/types/src/internal/Entity/model.d.ts.map +1 -1
  172. package/dist/types/src/internal/Entity/object.d.ts +3 -3
  173. package/dist/types/src/internal/Entity/object.d.ts.map +1 -1
  174. package/dist/types/src/internal/Entity/relation.d.ts +30 -7
  175. package/dist/types/src/internal/Entity/relation.d.ts.map +1 -1
  176. package/dist/types/src/internal/Entity/type-kind.d.ts +24 -0
  177. package/dist/types/src/internal/Entity/type-kind.d.ts.map +1 -0
  178. package/dist/types/src/internal/Entity/type-uri.d.ts +25 -0
  179. package/dist/types/src/internal/Entity/type-uri.d.ts.map +1 -0
  180. package/dist/types/src/internal/Entity/version.d.ts.map +1 -1
  181. package/dist/types/src/internal/Format/date.d.ts.map +1 -1
  182. package/dist/types/src/internal/Format/format.d.ts +3 -2
  183. package/dist/types/src/internal/Format/format.d.ts.map +1 -1
  184. package/dist/types/src/internal/Format/index.d.ts +2 -2
  185. package/dist/types/src/internal/Format/index.d.ts.map +1 -1
  186. package/dist/types/src/internal/Format/number.d.ts.map +1 -1
  187. package/dist/types/src/internal/Format/object.d.ts +3 -1
  188. package/dist/types/src/internal/Format/object.d.ts.map +1 -1
  189. package/dist/types/src/internal/Format/types.d.ts.map +1 -1
  190. package/dist/types/src/internal/JsonSchema/json-schema-normalize.d.ts.map +1 -1
  191. package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts +28 -28
  192. package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts.map +1 -1
  193. package/dist/types/src/internal/JsonSchema/json-schema.d.ts +3 -2
  194. package/dist/types/src/internal/JsonSchema/json-schema.d.ts.map +1 -1
  195. package/dist/types/src/internal/Obj/clone.d.ts.map +1 -1
  196. package/dist/types/src/internal/Obj/common.d.ts.map +1 -1
  197. package/dist/types/src/internal/Obj/create-object.d.ts +11 -12
  198. package/dist/types/src/internal/Obj/create-object.d.ts.map +1 -1
  199. package/dist/types/src/internal/Obj/deleted.d.ts.map +1 -1
  200. package/dist/types/src/internal/Obj/index.d.ts +0 -1
  201. package/dist/types/src/internal/Obj/index.d.ts.map +1 -1
  202. package/dist/types/src/internal/Obj/json-serializer.d.ts +11 -10
  203. package/dist/types/src/internal/Obj/json-serializer.d.ts.map +1 -1
  204. package/dist/types/src/internal/Obj/set-value.d.ts +1 -1
  205. package/dist/types/src/internal/Obj/set-value.d.ts.map +1 -1
  206. package/dist/types/src/internal/Obj/snapshot.d.ts.map +1 -1
  207. package/dist/types/src/internal/Obj/typed-object.d.ts +1 -1
  208. package/dist/types/src/internal/Query.d.ts +10 -0
  209. package/dist/types/src/internal/Query.d.ts.map +1 -0
  210. package/dist/types/src/internal/Ref/ref-array.d.ts +2 -2
  211. package/dist/types/src/internal/Ref/ref-array.d.ts.map +1 -1
  212. package/dist/types/src/internal/Ref/ref.d.ts +42 -19
  213. package/dist/types/src/internal/Ref/ref.d.ts.map +1 -1
  214. package/dist/types/src/internal/Type/compose.d.ts.map +1 -1
  215. package/dist/types/src/internal/Type/index.d.ts +1 -2
  216. package/dist/types/src/internal/Type/index.d.ts.map +1 -1
  217. package/dist/types/src/internal/Type/manipulation.d.ts +0 -1
  218. package/dist/types/src/internal/Type/manipulation.d.ts.map +1 -1
  219. package/dist/types/src/internal/Type/type-schema.d.ts +52 -0
  220. package/dist/types/src/internal/Type/type-schema.d.ts.map +1 -0
  221. package/dist/types/src/internal/common/api/meta.d.ts +14 -11
  222. package/dist/types/src/internal/common/api/meta.d.ts.map +1 -1
  223. package/dist/types/src/internal/common/proxy/change-context.d.ts +1 -1
  224. package/dist/types/src/internal/common/proxy/change-context.d.ts.map +1 -1
  225. package/dist/types/src/internal/common/proxy/define-hidden-property.d.ts.map +1 -1
  226. package/dist/types/src/internal/common/proxy/errors.d.ts +1 -1
  227. package/dist/types/src/internal/common/proxy/errors.d.ts.map +1 -1
  228. package/dist/types/src/internal/common/proxy/event-batch.d.ts.map +1 -1
  229. package/dist/types/src/internal/common/proxy/json-serializer.d.ts.map +1 -1
  230. package/dist/types/src/internal/common/proxy/make-object.d.ts +11 -5
  231. package/dist/types/src/internal/common/proxy/make-object.d.ts.map +1 -1
  232. package/dist/types/src/internal/common/proxy/ownership.d.ts.map +1 -1
  233. package/dist/types/src/internal/common/proxy/proxy-utils.d.ts.map +1 -1
  234. package/dist/types/src/internal/common/proxy/reactive-array.d.ts +1 -1
  235. package/dist/types/src/internal/common/proxy/reactive.d.ts +1 -1
  236. package/dist/types/src/internal/common/proxy/reactive.d.ts.map +1 -1
  237. package/dist/types/src/internal/common/proxy/reactive.test.d.ts +2 -0
  238. package/dist/types/src/internal/common/proxy/reactive.test.d.ts.map +1 -0
  239. package/dist/types/src/internal/common/proxy/schema-validator.d.ts.map +1 -1
  240. package/dist/types/src/internal/common/proxy/typed-handler.d.ts +18 -2
  241. package/dist/types/src/internal/common/proxy/typed-handler.d.ts.map +1 -1
  242. package/dist/types/src/internal/common/types/base.d.ts +4 -4
  243. package/dist/types/src/internal/common/types/base.d.ts.map +1 -1
  244. package/dist/types/src/internal/common/types/entity.d.ts +63 -6
  245. package/dist/types/src/internal/common/types/entity.d.ts.map +1 -1
  246. package/dist/types/src/internal/common/types/index.d.ts +1 -1
  247. package/dist/types/src/internal/common/types/index.d.ts.map +1 -1
  248. package/dist/types/src/internal/common/types/meta.d.ts +23 -7
  249. package/dist/types/src/internal/common/types/meta.d.ts.map +1 -1
  250. package/dist/types/src/internal/common/types/model-symbols.d.ts +8 -4
  251. package/dist/types/src/internal/common/types/model-symbols.d.ts.map +1 -1
  252. package/dist/types/src/internal/common/types/typename.d.ts +7 -0
  253. package/dist/types/src/internal/common/types/typename.d.ts.map +1 -1
  254. package/dist/types/src/internal/common/types/version.d.ts +1 -1
  255. package/dist/types/src/internal/common/types/well-known-types.d.ts +11 -0
  256. package/dist/types/src/internal/common/types/well-known-types.d.ts.map +1 -0
  257. package/dist/types/src/internal/index.d.ts +2 -0
  258. package/dist/types/src/internal/index.d.ts.map +1 -1
  259. package/dist/types/src/testing/test-data.d.ts +8 -8
  260. package/dist/types/src/testing/test-data.d.ts.map +1 -1
  261. package/dist/types/src/testing/test-schema.d.ts +83 -89
  262. package/dist/types/src/testing/test-schema.d.ts.map +1 -1
  263. package/dist/types/src/testing/util.d.ts +5 -3
  264. package/dist/types/src/testing/util.d.ts.map +1 -1
  265. package/dist/types/tsconfig.tsbuildinfo +1 -1
  266. package/package.json +27 -19
  267. package/src/Annotation.test.ts +439 -0
  268. package/src/Annotation.ts +152 -4
  269. package/src/Collection.ts +6 -5
  270. package/src/Database.ts +117 -57
  271. package/src/Dataset.ts +10 -2
  272. package/src/Entity.test.ts +116 -6
  273. package/src/Entity.ts +130 -31
  274. package/src/Err.ts +4 -4
  275. package/src/Feed.ts +138 -43
  276. package/src/Filter.test.ts +90 -0
  277. package/src/Filter.ts +143 -27
  278. package/src/Hypergraph.ts +14 -9
  279. package/src/Json.test.ts +175 -0
  280. package/src/Json.ts +103 -0
  281. package/src/Key.ts +1 -1
  282. package/src/Migration.ts +114 -0
  283. package/src/Obj.test.ts +122 -19
  284. package/src/Obj.ts +279 -97
  285. package/src/Query.test.ts +317 -131
  286. package/src/Query.ts +181 -73
  287. package/src/QueryResult.ts +11 -0
  288. package/src/Ref.ts +22 -4
  289. package/src/Registry.ts +155 -0
  290. package/src/Relation.test.ts +10 -10
  291. package/src/Relation.ts +112 -71
  292. package/src/Scope.ts +50 -0
  293. package/src/StateMap.test.ts +56 -0
  294. package/src/StateMap.ts +99 -0
  295. package/src/Tag.md +88 -0
  296. package/src/Tag.ts +49 -6
  297. package/src/TagIndex.test.ts +57 -0
  298. package/src/TagIndex.ts +110 -0
  299. package/src/Tagging.ts +83 -0
  300. package/src/Type.test.ts +223 -18
  301. package/src/Type.ts +602 -132
  302. package/src/View.ts +11 -15
  303. package/src/exemplars.test.ts +21 -0
  304. package/src/index.ts +9 -3
  305. package/src/internal/Annotation/annotations.test.ts +82 -13
  306. package/src/internal/Annotation/annotations.ts +153 -115
  307. package/src/internal/Annotation/dictionary.ts +47 -0
  308. package/src/internal/Annotation/entity-dictionary.ts +40 -0
  309. package/src/internal/Annotation/index.ts +4 -2
  310. package/src/internal/Annotation/sorting.ts +0 -1
  311. package/src/internal/Annotation/util.ts +17 -8
  312. package/src/internal/Entity/api.ts +7 -8
  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 +37 -28
  317. package/src/internal/Entity/object.ts +21 -6
  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 +87 -0
  321. package/src/internal/Entity/util.ts +10 -9
  322. package/src/internal/Entity/version.ts +0 -1
  323. package/src/internal/Format/date.test.ts +0 -1
  324. package/src/internal/Format/date.ts +0 -4
  325. package/src/internal/Format/format.test.ts +21 -1
  326. package/src/internal/Format/index.ts +2 -3
  327. package/src/internal/Format/object.ts +21 -4
  328. package/src/internal/Format/types.ts +1 -1
  329. package/src/internal/JsonSchema/annotations.ts +1 -1
  330. package/src/internal/JsonSchema/json-schema-type.ts +1 -1
  331. package/src/internal/JsonSchema/json-schema.test.ts +55 -142
  332. package/src/internal/JsonSchema/json-schema.ts +44 -31
  333. package/src/internal/Obj/clone.ts +9 -4
  334. package/src/internal/Obj/create-object.test.ts +13 -13
  335. package/src/internal/Obj/create-object.ts +68 -24
  336. package/src/internal/Obj/deleted.ts +1 -1
  337. package/src/internal/Obj/index.ts +0 -1
  338. package/src/internal/Obj/inspect.ts +4 -3
  339. package/src/internal/Obj/json-serializer.test.ts +102 -24
  340. package/src/internal/Obj/json-serializer.ts +105 -43
  341. package/src/internal/Obj/set-value.test.ts +31 -54
  342. package/src/internal/Obj/set-value.ts +1 -1
  343. package/src/internal/Obj/snapshot.ts +11 -4
  344. package/src/internal/Obj/typed-object.test.ts +9 -11
  345. package/src/internal/Obj/typed-object.ts +1 -1
  346. package/src/internal/Query.ts +159 -0
  347. package/src/internal/Ref/ref-array.ts +3 -4
  348. package/src/internal/Ref/ref.test.ts +17 -27
  349. package/src/internal/Ref/ref.ts +124 -59
  350. package/src/internal/Type/compose.test.ts +3 -2
  351. package/src/internal/Type/index.ts +1 -2
  352. package/src/internal/Type/manipulation.ts +0 -25
  353. package/src/internal/Type/type-schema.ts +60 -0
  354. package/src/internal/common/README.md +2 -2
  355. package/src/internal/common/api/meta.ts +19 -17
  356. package/src/internal/common/proxy/change-context.ts +1 -1
  357. package/src/internal/common/proxy/change.test.ts +118 -110
  358. package/src/internal/common/proxy/errors.ts +2 -2
  359. package/src/internal/common/proxy/handler.test.ts +1 -3
  360. package/src/internal/common/proxy/json-serializer.ts +26 -16
  361. package/src/internal/common/proxy/make-object.ts +43 -21
  362. package/src/internal/common/proxy/ownership.ts +2 -3
  363. package/src/internal/common/proxy/reactive-array.ts +1 -1
  364. package/src/internal/common/proxy/reactive.test.ts +54 -0
  365. package/src/internal/common/proxy/reactive.ts +11 -3
  366. package/src/internal/common/proxy/schema.test.ts +48 -86
  367. package/src/internal/common/proxy/typed-handler.test.ts +12 -12
  368. package/src/internal/common/proxy/typed-handler.ts +79 -19
  369. package/src/internal/common/proxy/typed-object.test.ts +16 -29
  370. package/src/internal/common/types/base.ts +4 -4
  371. package/src/internal/common/types/entity.ts +81 -2
  372. package/src/internal/common/types/index.ts +6 -1
  373. package/src/internal/common/types/meta.ts +49 -15
  374. package/src/internal/common/types/model-symbols.ts +16 -4
  375. package/src/internal/common/types/typename.ts +39 -3
  376. package/src/internal/common/types/well-known-types.ts +15 -0
  377. package/src/internal/index.ts +6 -0
  378. package/src/testing/api.test.ts +15 -10
  379. package/src/testing/test-data.ts +159 -100
  380. package/src/testing/test-schema.ts +22 -58
  381. package/src/testing/util.ts +14 -11
  382. package/dist/lib/neutral/SchemaRegistry.mjs +0 -2
  383. package/dist/lib/neutral/chunk-43Y5DOS6.mjs.map +0 -7
  384. package/dist/lib/neutral/chunk-724GQYEN.mjs +0 -56
  385. package/dist/lib/neutral/chunk-724GQYEN.mjs.map +0 -7
  386. package/dist/lib/neutral/chunk-ANHVGJI4.mjs.map +0 -7
  387. package/dist/lib/neutral/chunk-B5OXLWZL.mjs.map +0 -7
  388. package/dist/lib/neutral/chunk-BNCCGLJN.mjs +0 -7
  389. package/dist/lib/neutral/chunk-BNCCGLJN.mjs.map +0 -7
  390. package/dist/lib/neutral/chunk-BOZZPUXE.mjs.map +0 -7
  391. package/dist/lib/neutral/chunk-CIRHIEMW.mjs.map +0 -7
  392. package/dist/lib/neutral/chunk-DYDJBZEG.mjs +0 -102
  393. package/dist/lib/neutral/chunk-DYDJBZEG.mjs.map +0 -7
  394. package/dist/lib/neutral/chunk-FXEG7EOK.mjs.map +0 -7
  395. package/dist/lib/neutral/chunk-KTAWP7GI.mjs.map +0 -7
  396. package/dist/lib/neutral/chunk-NEGC54NE.mjs +0 -130
  397. package/dist/lib/neutral/chunk-NEGC54NE.mjs.map +0 -7
  398. package/dist/lib/neutral/chunk-NQRLRYJM.mjs.map +0 -7
  399. package/dist/lib/neutral/chunk-NXMFBIT5.mjs.map +0 -7
  400. package/dist/lib/neutral/chunk-OENWMTE6.mjs +0 -45
  401. package/dist/lib/neutral/chunk-OENWMTE6.mjs.map +0 -7
  402. package/dist/lib/neutral/chunk-OMUPQMLR.mjs.map +0 -7
  403. package/dist/lib/neutral/chunk-RMLF7JOZ.mjs +0 -97
  404. package/dist/lib/neutral/chunk-RMLF7JOZ.mjs.map +0 -7
  405. package/dist/lib/neutral/chunk-SEMVAGBM.mjs +0 -355
  406. package/dist/lib/neutral/chunk-SEMVAGBM.mjs.map +0 -7
  407. package/dist/lib/neutral/chunk-TQQZLKB7.mjs.map +0 -7
  408. package/dist/lib/neutral/chunk-UBEZSGXY.mjs.map +0 -7
  409. package/dist/lib/neutral/chunk-UFDK26FO.mjs.map +0 -7
  410. package/dist/lib/neutral/chunk-VA2F47ZC.mjs +0 -152
  411. package/dist/lib/neutral/chunk-VA2F47ZC.mjs.map +0 -7
  412. package/dist/lib/neutral/chunk-WYOKA6AE.mjs.map +0 -7
  413. package/dist/lib/neutral/chunk-YWXWXIE5.mjs.map +0 -7
  414. package/dist/types/src/SchemaRegistry.d.ts +0 -84
  415. package/dist/types/src/SchemaRegistry.d.ts.map +0 -1
  416. package/dist/types/src/internal/Obj/ids.d.ts +0 -6
  417. package/dist/types/src/internal/Obj/ids.d.ts.map +0 -1
  418. package/dist/types/src/internal/Type/echo-schema.d.ts +0 -181
  419. package/dist/types/src/internal/Type/echo-schema.d.ts.map +0 -1
  420. package/dist/types/src/internal/Type/persistent-schema.d.ts +0 -20
  421. package/dist/types/src/internal/Type/persistent-schema.d.ts.map +0 -1
  422. package/src/SchemaRegistry.ts +0 -106
  423. package/src/internal/Obj/ids.ts +0 -12
  424. package/src/internal/Type/echo-schema.ts +0 -424
  425. package/src/internal/Type/persistent-schema.ts +0 -33
  426. /package/dist/lib/neutral/{SchemaRegistry.mjs.map → Migration.mjs.map} +0 -0
  427. /package/dist/lib/neutral/{chunk-UTBRYVQC.mjs.map → chunk-G6CFWUYH.mjs.map} +0 -0
  428. /package/dist/lib/neutral/{chunk-UI6MWK5W.mjs.map → chunk-TTCSATUD.mjs.map} +0 -0
@@ -2,18 +2,17 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import { type InspectOptionsStylized } from 'node:util';
6
-
7
5
  import * as Schema from 'effect/Schema';
8
6
  import * as SchemaAST from 'effect/SchemaAST';
7
+ import { type InspectOptionsStylized } from 'node:util';
9
8
 
10
9
  import { Event } from '@dxos/async';
11
10
  import { inspectCustom } from '@dxos/debug';
12
- import { invariant } from '@dxos/invariant';
13
-
14
- import { getSchemaDXN } from '../../Annotation';
15
- import { ObjectDeletedId, ParentId, SchemaId, TypeId } from '../types';
11
+ import { assertArgument, invariant } from '@dxos/invariant';
16
12
 
13
+ import { getSchemaURI } from '../../Annotation/annotations';
14
+ import { toEffectSchema } from '../../JsonSchema/json-schema';
15
+ import { ObjectDeletedId, ParentId, SchemaId, StaticTypeSchemaSlot, TypeEntityId, TypeId } from '../types';
17
16
  import { executeChange, isInChangeContext, queueNotification } from './change-context';
18
17
  import { defineHiddenProperty } from './define-hidden-property';
19
18
  import { createPropertyDeleteError } from './errors';
@@ -144,7 +143,7 @@ export class TypedReactiveHandler implements ReactiveHandler<ProxyTarget> {
144
143
  private constructor() {}
145
144
 
146
145
  init(target: ProxyTarget): void {
147
- invariant(typeof target === 'object' && target !== null);
146
+ assertArgument(typeof target === 'object' && target !== null, 'target');
148
147
  invariant(SchemaId in target, 'Schema is not defined for the target');
149
148
 
150
149
  // Only set EventId on root objects (those without an owner).
@@ -210,6 +209,27 @@ export class TypedReactiveHandler implements ReactiveHandler<ProxyTarget> {
210
209
  // Uses target as both the context key and event target for non-database objects.
211
210
  return (callback: (obj: any) => void) => executeChange(target, target, receiver, callback);
212
211
  }
212
+ case TypeEntityId: {
213
+ // The back-reference to the type entity is metadata — return the raw
214
+ // value so we don't re-wrap an already-reactive `Type.Type` entity in
215
+ // another proxy (which would fail the SchemaId-in-target invariant).
216
+ return Reflect.get(target, prop, receiver);
217
+ }
218
+ case StaticTypeSchemaSlot: {
219
+ // Lazily rebuild the source Effect Schema from `jsonSchema` and cache it on
220
+ // the slot; the set-trap invalidates the cache when `jsonSchema` is mutated.
221
+ const existing = Reflect.get(target, prop, receiver);
222
+ if (existing !== undefined) {
223
+ return existing;
224
+ }
225
+ const jsonSchema = (target as any).jsonSchema;
226
+ if (jsonSchema == null) {
227
+ return undefined;
228
+ }
229
+ const rebuilt = toEffectSchema(jsonSchema);
230
+ defineHiddenProperty(target, StaticTypeSchemaSlot, rebuilt);
231
+ return rebuilt;
232
+ }
213
233
  }
214
234
 
215
235
  // Handle getter properties.
@@ -228,7 +248,7 @@ export class TypedReactiveHandler implements ReactiveHandler<ProxyTarget> {
228
248
  set(target: ProxyTarget, prop: string | symbol, value: any, receiver: any): boolean {
229
249
  const echoRoot = getEchoRoot(target);
230
250
 
231
- // Check readonly enforcement - mutations only allowed within Obj.change().
251
+ // Check readonly enforcement - mutations only allowed within Obj.update().
232
252
  // Skip check if the object is still being initialized (no ChangeId handler yet).
233
253
  // Also skip for non-initialized root objects (those without EventId).
234
254
  // Skip for symbol properties (internal infrastructure, not user data).
@@ -236,8 +256,8 @@ export class TypedReactiveHandler implements ReactiveHandler<ProxyTarget> {
236
256
  const isSymbolProp = typeof prop === 'symbol';
237
257
  if (isInitialized && !isSymbolProp && !isInChangeContext(echoRoot)) {
238
258
  throw new Error(
239
- `Cannot modify object property "${String(prop)}" outside of Obj.change(). ` +
240
- 'Use Obj.change(obj, (mutableObj) => { mutableObj.property = value; }) instead.',
259
+ `Cannot modify object property "${String(prop)}" outside of Obj.update(). ` +
260
+ 'Use Obj.update(obj, (mutableObj) => { mutableObj.property = value; }) instead.',
241
261
  );
242
262
  }
243
263
 
@@ -247,6 +267,11 @@ export class TypedReactiveHandler implements ReactiveHandler<ProxyTarget> {
247
267
  batchEvents(() => {
248
268
  const { echoRoot: _, preparedValue } = this._prepareValueForAssignment(target, prop, value);
249
269
  result = Reflect.set(target, prop, preparedValue, receiver);
270
+ // Invalidate the cached source Effect Schema when `jsonSchema` changes
271
+ // (e.g. `Type.addFields`) so `Type.getSchema` rebuilds from the new shape.
272
+ if (prop === 'jsonSchema') {
273
+ Reflect.deleteProperty(target, StaticTypeSchemaSlot);
274
+ }
250
275
  // Queue notification instead of emitting immediately (batched).
251
276
  if (isInitialized) {
252
277
  queueNotification(echoRoot);
@@ -267,7 +292,7 @@ export class TypedReactiveHandler implements ReactiveHandler<ProxyTarget> {
267
292
  deleteProperty(target: ProxyTarget, property: string | symbol): boolean {
268
293
  const echoRoot = getEchoRoot(target);
269
294
 
270
- // Check readonly enforcement - mutations only allowed within Obj.change().
295
+ // Check readonly enforcement - mutations only allowed within Obj.update().
271
296
  // Skip for symbol properties (internal infrastructure, not user data).
272
297
  const isInitialized = (echoRoot as any)[ChangeId] === true || EventId in echoRoot;
273
298
  const isSymbolProp = typeof property === 'symbol';
@@ -285,15 +310,15 @@ export class TypedReactiveHandler implements ReactiveHandler<ProxyTarget> {
285
310
  defineProperty(target: ProxyTarget, property: string | symbol, attributes: PropertyDescriptor): boolean {
286
311
  const echoRoot = getEchoRoot(target);
287
312
 
288
- // Check readonly enforcement - mutations only allowed within Obj.change().
313
+ // Check readonly enforcement - mutations only allowed within Obj.update().
289
314
  // Skip check if the object is still being initialized (no ChangeId handler yet).
290
315
  // Skip for symbol properties (internal infrastructure, not user data).
291
316
  const isInitialized = ChangeId in echoRoot || EventId in echoRoot;
292
317
  const isSymbolProp = typeof property === 'symbol';
293
318
  if (isInitialized && !isSymbolProp && !isInChangeContext(echoRoot)) {
294
319
  throw new Error(
295
- `Cannot modify object property "${String(property)}" outside of Obj.change(). ` +
296
- 'Use Obj.change(obj, (mutableObj) => { mutableObj.property = value; }) instead.',
320
+ `Cannot modify object property "${String(property)}" outside of Obj.update(). ` +
321
+ 'Use Obj.update(obj, (mutableObj) => { mutableObj.property = value; }) instead.',
297
322
  );
298
323
  }
299
324
 
@@ -402,16 +427,49 @@ const toJSON = (target: ProxyTarget): any => {
402
427
  return { '@type': 'TypedReactiveObject', ...target };
403
428
  };
404
429
 
430
+ /**
431
+ * Pointer to a `Type.Type` entity, stamped as the back-reference (`TypeEntityId`)
432
+ * on instances and read by the `SchemaId` getter installed below.
433
+ *
434
+ * Structural shape (not `Type.AnyEntity`) because `internal/common/proxy/`
435
+ * can't import the top-level `Type` module without a cycle. Every kind of
436
+ * `Type.Type` entity satisfies this shape:
437
+ * - Static (`Type.makeObject(dxn)` pipe) — slot set directly on the object.
438
+ * - Persisted (echo-handler-wrapped) — slot exposed via that handler's
439
+ * `get` trap (rebuilds from `data.jsonSchema`).
440
+ * - In-memory pre-persist (`Type.makeObjectFromJsonSchema`) — slot exposed
441
+ * via the `case StaticTypeSchemaSlot:` arm in this file's `get` trap.
442
+ */
443
+ export type TypeSource = { readonly [StaticTypeSchemaSlot]?: Schema.Schema.AnyNoContext };
444
+
405
445
  /**
406
446
  * Recursively set AST on all potential proxy targets.
407
447
  */
408
- const setSchemaProperties = (obj: any, schema: Schema.Schema.AnyNoContext) => {
409
- const schemaType = getSchemaDXN(schema);
448
+ const setSchemaProperties = (obj: any, schema: Schema.Schema.AnyNoContext, typeSource?: TypeSource) => {
449
+ const schemaType = getSchemaURI(schema);
410
450
  if (schemaType != null) {
411
451
  defineHiddenProperty(obj, TypeId, schemaType);
412
452
  }
413
453
 
414
- defineHiddenProperty(obj, SchemaId, schema);
454
+ if (typeSource != null) {
455
+ // Keep a back-reference to the type entity so `Obj.getType` /
456
+ // `Relation.getType` / `Entity.getType` can return it.
457
+ defineHiddenProperty(obj, TypeEntityId, typeSource);
458
+
459
+ // Install `SchemaId` as a getter that reads through the entity's static
460
+ // schema slot. The three entity shapes (static / persisted / in-memory
461
+ // pre-persist) each populate the slot via their own get-trap path, so
462
+ // `Type.update` / `Type.addFields` mutations propagate into validation
463
+ // for objects created via `Obj.make(typeEntity, ...)` without this file
464
+ // having to rebuild from `jsonSchema` itself.
465
+ Object.defineProperty(obj, SchemaId, {
466
+ get: () => typeSource[StaticTypeSchemaSlot] ?? schema,
467
+ enumerable: false,
468
+ configurable: true,
469
+ });
470
+ } else {
471
+ defineHiddenProperty(obj, SchemaId, schema);
472
+ }
415
473
  for (const key in obj) {
416
474
  if (isValidProxyTarget(obj[key])) {
417
475
  const elementSchema = SchemaValidator.getTargetPropertySchema(obj, key);
@@ -422,7 +480,9 @@ const setSchemaProperties = (obj: any, schema: Schema.Schema.AnyNoContext) => {
422
480
  }
423
481
  };
424
482
 
425
- export const prepareTypedTarget = <T>(target: T, schema: Schema.Schema<T>) => {
483
+ // Accepts any encoded type: the typed handler operates on the decoded representation, so schemas
484
+ // whose encoded form differs (e.g. refs encode as `{ '/': uri }`) are valid here.
485
+ export const prepareTypedTarget = <T>(target: T, schema: Schema.Schema<T, any>, typeSource?: TypeSource) => {
426
486
  // log.info('prepareTypedTarget', { target, schema });
427
487
  if (!SchemaAST.isTypeLiteral(schema.ast)) {
428
488
  throw new Error('schema has to describe an object type');
@@ -431,7 +491,7 @@ export const prepareTypedTarget = <T>(target: T, schema: Schema.Schema<T>) => {
431
491
  SchemaValidator.validateSchema(schema);
432
492
  const _ = Schema.asserts(schema)(target);
433
493
  makeArraysReactive(target);
434
- setSchemaProperties(target, schema);
494
+ setSchemaProperties(target, schema, typeSource);
435
495
  };
436
496
 
437
497
  const makeArraysReactive = (target: any) => {
@@ -6,22 +6,20 @@ import * as Schema from 'effect/Schema';
6
6
  import type * as Types from 'effect/Types';
7
7
  import { describe, expect, test } from 'vitest';
8
8
 
9
+ import { DXN } from '@dxos/keys';
10
+
11
+ import * as Obj from '../../../Obj';
12
+ import * as Type from '../../../Type';
9
13
  import { EchoObjectSchema } from '../../Entity';
10
14
  import { getSchema } from '../types';
11
-
12
15
  import { makeObject } from './make-object';
13
16
  import { change } from './reactive';
14
17
 
15
18
  const Organization = Schema.Struct({
16
19
  name: Schema.String,
17
- }).pipe(
18
- EchoObjectSchema({
19
- typename: 'com.example.type.organization',
20
- version: '0.1.0',
21
- }),
22
- );
20
+ }).pipe(EchoObjectSchema(DXN.make('com.example.type.organization', '0.1.0')));
23
21
 
24
- interface Organization extends Schema.Schema.Type<typeof Organization> {}
22
+ type Organization = Type.InstanceType<typeof Organization>;
25
23
 
26
24
  const Contact = Schema.Struct(
27
25
  {
@@ -31,27 +29,21 @@ const Contact = Schema.Struct(
31
29
  key: Schema.String,
32
30
  value: Schema.Any,
33
31
  },
34
- ).pipe(
35
- Schema.partial,
36
- EchoObjectSchema({
37
- typename: 'com.example.type.person',
38
- version: '0.1.0',
39
- }),
40
- );
32
+ ).pipe(Schema.partial, EchoObjectSchema(DXN.make('com.example.type.person', '0.1.0')));
41
33
 
42
- interface Contact extends Schema.Schema.Type<typeof Contact> {}
34
+ type Contact = Type.InstanceType<typeof Contact>;
43
35
 
44
- const TEST_ORG: Omit<Organization, 'id'> = { name: 'Test' };
36
+ const TEST_ORG = { name: 'Test' } satisfies Pick<Organization, 'name'>;
45
37
 
46
38
  describe('EchoObjectSchema class DSL', () => {
47
39
  test('can get object schema', async () => {
48
- const obj = makeObject(Organization, TEST_ORG);
49
- expect(getSchema(obj)).to.deep.eq(Organization);
40
+ const obj = Obj.make(Organization, TEST_ORG);
41
+ expect(getSchema(obj)).to.deep.eq(Type.getSchema(Organization));
50
42
  });
51
43
 
52
44
  describe('class options', () => {
53
45
  test('can assign undefined to partial fields', async () => {
54
- const person = makeObject(Contact, { name: 'John' });
46
+ const person = Obj.make(Contact, { name: 'John' });
55
47
  change(person, (p) => {
56
48
  p.name = undefined;
57
49
  p.recordField = 'hello';
@@ -87,7 +79,7 @@ describe('EchoObjectSchema class DSL', () => {
87
79
  }
88
80
 
89
81
  {
90
- // Plain object (not a reactive proxy) - doesn't need Obj.change.
82
+ // Plain object (not a reactive proxy) - doesn't need Obj.update.
91
83
  // Note: Schema.Schema.Type generates readonly types, so we cast to mutable for plain objects.
92
84
  type Test1 = Types.Mutable<Schema.Schema.Type<typeof schema>>;
93
85
 
@@ -99,14 +91,9 @@ describe('EchoObjectSchema class DSL', () => {
99
91
  {
100
92
  const Test2 = Schema.Struct({
101
93
  meta: Schema.optional(Schema.Record({ key: Schema.String, value: Schema.Any })),
102
- }).pipe(
103
- EchoObjectSchema({
104
- typename: 'org.dxos.type.function-trigger',
105
- version: '0.1.0',
106
- }),
107
- );
108
-
109
- const object = makeObject(Test2, {});
94
+ }).pipe(EchoObjectSchema(DXN.make('org.dxos.type.functionTrigger', '0.1.0')));
95
+
96
+ const object = Obj.make(Test2, {});
110
97
  change(object, (o) => {
111
98
  (o.meta ??= {}).test = 100;
112
99
  });
@@ -5,9 +5,9 @@
5
5
  import * as Schema from 'effect/Schema';
6
6
  import * as SchemaAST from 'effect/SchemaAST';
7
7
 
8
- import { type ObjectId } from '@dxos/keys';
8
+ import { type EntityId } from '@dxos/keys';
9
9
 
10
- import { type ATTR_META, type ObjectMeta } from './meta';
10
+ import { type ATTR_META, type EntityMeta } from './meta';
11
11
 
12
12
  /**
13
13
  * Base type for all data objects (reactive, ECHO, and other raw objects).
@@ -23,7 +23,7 @@ export type AnyProperties = Record<string, any>;
23
23
  */
24
24
  // TODO(wittjosiah): Remove. Prefer higher level types (e.g. Entity.Unknown).
25
25
  export interface AnyEntity {
26
- readonly id: ObjectId;
26
+ readonly id: EntityId;
27
27
  }
28
28
 
29
29
  export type ExcludeId<T extends AnyProperties> = Omit<T, 'id'>;
@@ -31,7 +31,7 @@ export type ExcludeId<T extends AnyProperties> = Omit<T, 'id'>;
31
31
  export type PropertyKey<T extends AnyProperties> = Extract<keyof ExcludeId<T>, string>;
32
32
 
33
33
  // TODO(dmaretskyi): Remove. This should be using the symbol type.
34
- type WithMeta = { [ATTR_META]?: ObjectMeta };
34
+ type WithMeta = { [ATTR_META]?: EntityMeta };
35
35
 
36
36
  /**
37
37
  * The raw object should not include the ECHO id, but may include metadata.
@@ -33,11 +33,90 @@ export const SnapshotKindId = '~@dxos/echo/SnapshotKind' as const;
33
33
  export type SnapshotKindId = typeof SnapshotKindId;
34
34
 
35
35
  /**
36
- * Kinds of entities stored in ECHO: objects and relations.
36
+ * Hidden slot on a static `Type.Type` entity that holds the source Effect
37
+ * Schema. `Type.getSchema(...)` reads this for static types; persisted types
38
+ * rebuild from `jsonSchema` instead. Stored as a string key for declaration
39
+ * portability (see KindId comment above).
40
+ */
41
+ export const StaticTypeSchemaSlot = '~@dxos/echo/Type.StaticSchema' as const;
42
+ export type StaticTypeSchemaSlot = typeof StaticTypeSchemaSlot;
43
+
44
+ /**
45
+ * Read the hidden `StaticTypeSchemaSlot` off any value that may carry one.
46
+ * Returns `undefined` for raw schemas (no slot) and non-object inputs.
47
+ * Single point-of-cast for the slot lookup.
48
+ */
49
+ export const getStaticTypeSchema = (value: unknown): Schema.Schema.AnyNoContext | undefined => {
50
+ if (value == null || typeof value !== 'object') {
51
+ return undefined;
52
+ }
53
+ return (value as { [StaticTypeSchemaSlot]?: Schema.Schema.AnyNoContext })[StaticTypeSchemaSlot];
54
+ };
55
+
56
+ /**
57
+ * Read the `[SchemaKindId]` brand off a value. Returns `undefined` for raw
58
+ * schemas (which don't carry the brand on their static type) and non-object
59
+ * inputs. Single point-of-cast for the brand lookup.
60
+ */
61
+ export const getSchemaKind = (value: unknown): EntityKind | undefined => {
62
+ if (value == null || typeof value !== 'object') {
63
+ return undefined;
64
+ }
65
+ return (value as { [SchemaKindId]?: EntityKind })[SchemaKindId];
66
+ };
67
+
68
+ /**
69
+ * Read the `[KindId]` brand off a value. Returns `undefined` for raw schemas
70
+ * and non-object inputs. Companion to {@link getSchemaKind}.
71
+ */
72
+ export const getEntityKindBrand = (value: unknown): EntityKind | undefined => {
73
+ if (value == null || typeof value !== 'object') {
74
+ return undefined;
75
+ }
76
+ return (value as { [KindId]?: EntityKind })[KindId];
77
+ };
78
+
79
+ /**
80
+ * Phantom string key on `Type<A>` entities that carries the instance type `A`.
81
+ * Lets internal helpers (`makeObject`, `createObject`, etc.) pattern-match the
82
+ * instance type from an entity input without importing from the top-level
83
+ * `Type` module. Mirrors `Type.InstancePhantomId` (declared in `Type.ts`).
84
+ *
85
+ * Stored as a string key so declarations remain portable across packages
86
+ * (see KindId comment above).
87
+ */
88
+ export const InstancePhantomId = '~@dxos/echo/Type.Instance' as const;
89
+ export type InstancePhantomId = typeof InstancePhantomId;
90
+
91
+ /**
92
+ * Nominal brand carried by the well-known "any object" / "any relation"
93
+ * schemas (`Obj.Unknown`, `Relation.Unknown`). The brand lets `Ref.Ref`,
94
+ * `Filter.type`, and `Query.type` accept these schemas in addition to
95
+ * `Type.Type` entities, without opening the door to arbitrary raw schemas.
96
+ *
97
+ * Stored as a string key so declarations remain portable across packages
98
+ * (see KindId comment above).
99
+ */
100
+ export const UnknownTypeSchemaBrandId = '~@dxos/echo/UnknownTypeSchemaBrand' as const;
101
+ export type UnknownTypeSchemaBrandId = typeof UnknownTypeSchemaBrandId;
102
+
103
+ /**
104
+ * Schema-side companion to `Type.Type` entities for the "any object" /
105
+ * "any relation" cases. Branded so `Ref.Ref` / `Filter.type` / `Query.type`
106
+ * can pattern-match on it; arbitrary `Schema.Schema` values do not satisfy
107
+ * this shape.
108
+ */
109
+ export interface UnknownTypeSchema<A, K extends EntityKind> extends Schema.Schema<A, any, never> {
110
+ readonly [UnknownTypeSchemaBrandId]: K;
111
+ }
112
+
113
+ /**
114
+ * Kinds of entities stored in ECHO: objects, relations, and types.
37
115
  */
38
116
  export enum EntityKind {
39
117
  Object = 'object',
40
118
  Relation = 'relation',
119
+ Type = 'type',
41
120
  }
42
121
 
43
122
  export const EntityKindSchema = Schema.Enums(EntityKind);
@@ -46,7 +125,7 @@ export const EntityKindSchema = Schema.Enums(EntityKind);
46
125
  * Typename for generic object references (Type.Obj / Ref.Ref(Obj.Unknown)).
47
126
  * Used when referencing any object without a specific schema.
48
127
  */
49
- export const ANY_OBJECT_TYPENAME = 'org.dxos.schema.any-object';
128
+ export const ANY_OBJECT_TYPENAME = 'org.dxos.schema.anyObject';
50
129
 
51
130
  /**
52
131
  * Version for generic object references.
@@ -4,7 +4,12 @@
4
4
 
5
5
  export * from './base';
6
6
  export * from './entity';
7
- export * from './meta';
7
+ // NOTE: `./meta` is intentionally NOT re-exported here. It depends on the Ref schema (`Ref/ref`),
8
+ // which transitively pulls in `Annotation` + `Database`; re-exporting it from this low-level barrel
9
+ // — imported by `Annotation/util`, `Annotation/annotations`, `Entity/type-uri`, and `Ref/ref` —
10
+ // would create an eval-order cycle (TDZ on `createAnnotationHelper`). Import meta from `./meta`
11
+ // directly, or from the top-level `@dxos/echo/internal` barrel (re-exported there after Ref loads).
8
12
  export * from './model-symbols';
9
13
  export * from './typename';
10
14
  export * from './version';
15
+ export * from './well-known-types';
@@ -4,13 +4,19 @@
4
4
 
5
5
  import * as Schema from 'effect/Schema';
6
6
 
7
- import { ForeignKey } from '@dxos/echo-protocol';
7
+ import { type EncodedReference, ForeignKey } from '@dxos/echo-protocol';
8
8
  import { invariant } from '@dxos/invariant';
9
+ import { DXN } from '@dxos/keys';
9
10
  import { type Comparator, intersection } from '@dxos/util';
10
11
 
11
12
  import type * as Entity from '../../../Entity';
12
-
13
+ import type * as Tag from '../../../Tag';
14
+ import { Dictionary } from '../../Annotation/dictionary';
15
+ // `meta` is no longer re-exported from the `common/types` barrel (see ./index.ts), so importing the
16
+ // Ref schema builder here no longer forms an eval-order cycle with `Annotation`/`Database`.
17
+ import { type Ref, createEchoReferenceSchema } from '../../Ref/ref';
13
18
  import { type AnyProperties } from './base';
19
+ import { TagTypeDXN } from './well-known-types';
14
20
 
15
21
  /**
16
22
  * Property name for meta when object is serialized to JSON.
@@ -23,25 +29,53 @@ export const ATTR_META = '@meta';
23
29
  export const MetaId: Entity.Meta = Symbol.for('@dxos/echo/Meta') as any;
24
30
 
25
31
  //
26
- // ObjectMeta
32
+ // EntityMeta
27
33
  //
28
34
 
29
- // TODO(dmaretskyi): Rename to ObjectMeta
30
- export const ObjectMetaSchema = Schema.Struct({
35
+ /**
36
+ * Schema for references to {@link Tag} objects stored in {@link EntityMetaSchema.tags}.
37
+ *
38
+ * Built from the shared {@link createEchoReferenceSchema} (the same builder `Ref.Ref` uses) via
39
+ * `Schema.suspend`, so it reuses the canonical ref codec rather than duplicating it. The Tag type
40
+ * identity comes from the shared {@link TagTypeDXN} constant; `suspend` defers construction until
41
+ * first use, and `Tag` is referenced type-only, so no `Tag` value import is needed.
42
+ */
43
+ const TagRefSchema = Schema.suspend(
44
+ (): Schema.Schema<Ref<Tag.Tag>, EncodedReference> =>
45
+ // The factory yields a loosely-typed `Ref<any>` schema; narrow it to the Tag-typed ref.
46
+ createEchoReferenceSchema(undefined, DXN.getName(TagTypeDXN), DXN.getVersion(TagTypeDXN)) as Schema.Schema<
47
+ Ref<Tag.Tag>,
48
+ EncodedReference
49
+ >,
50
+ );
51
+
52
+ export const EntityMetaSchema = Schema.Struct({
31
53
  keys: Schema.Array(ForeignKey),
32
54
 
33
55
  /**
34
- * A set of tags.
35
- * Tags are arbitrary application-defined strings.
36
- * ECHO makes no assumptions about the tag structure.
56
+ * Tags applied to this entity, as references to {@link Tag} objects.
57
+ */
58
+ tags: Schema.Array(TagRefSchema),
59
+
60
+ /**
61
+ * Fully-qualified registry key for the object (FQN format, e.g. `org.example.type.foo`).
62
+ * Identifies the canonical registry entry the object instance was created from.
63
+ */
64
+ key: Schema.optional(Schema.String),
65
+
66
+ /**
67
+ * Semantic version of the registry entry the object was created from.
68
+ * Must be a valid semver string (e.g. `1.2.3`).
69
+ */
70
+ version: Schema.optional(Schema.String),
71
+
72
+ /**
73
+ * Dictionary of annotations to this entity.
37
74
  */
38
- // TODO(dmaretskyi): Has to be optional for compatibility with old data.
39
- // Defaulting to an empty array is possible but requires a bit more work.
40
- // TODO(dmaretskyi): In automerge this should be a map of { [tag]: boolean } for uniqueness and conflict resolution.
41
- tags: Schema.optional(Schema.Array(Schema.String)),
75
+ annotations: Dictionary,
42
76
  });
43
77
 
44
- export type ObjectMeta = Schema.Schema.Type<typeof ObjectMetaSchema>;
78
+ export type EntityMeta = Schema.Schema.Type<typeof EntityMetaSchema>;
45
79
 
46
80
  /*
47
81
  * Get metadata from object.
@@ -50,9 +84,9 @@ export type ObjectMeta = Schema.Schema.Type<typeof ObjectMetaSchema>;
50
84
  * @internal (use Obj.getMeta or Relation.getMeta)
51
85
  */
52
86
  // TODO(burdon): Refine type to BaseObj.
53
- export const getMeta = (obj: AnyProperties): ObjectMeta => {
87
+ export const getMeta = (obj: AnyProperties): EntityMeta => {
54
88
  const metadata = (obj as any)[MetaId];
55
- invariant(metadata, 'ObjectMeta not found.');
89
+ invariant(metadata, 'EntityMeta not found.');
56
90
  return metadata;
57
91
  };
58
92
 
@@ -2,6 +2,13 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
+ // TODO(rename): These internal entity-wide symbols/types still use the `Object*` prefix but apply
6
+ // to all entities (objects AND relations). Rename to `Entity*` in a follow-up pass (deferred from the
7
+ // EchoURI→EID / ObjectId→EntityId / ObjectMeta→EntityMeta rename, which covered only public SDK API):
8
+ // ObjectCore, ObjectInternals, ObjectVersion, ObjectVersionId, ObjectDeletedId, ObjectDatabaseId,
9
+ // ObjectLoader, ObjectDocumentLoaded, ObjectUnavailable.
10
+ // (ObjectMigration / ObjectMigrationContext intentionally excluded — object-only, not entity-wide.)
11
+
5
12
  /**
6
13
  * Internal symbol/string constants for the echo object model.
7
14
  * Defined in common/ so proxy/ can use them without importing from Entity/.
@@ -9,14 +16,19 @@
9
16
  */
10
17
 
11
18
  /**
12
- * Property name for self DXN when object is serialized to JSON.
19
+ * Property name for the object's own URI when serialized to JSON.
20
+ */
21
+ export const ATTR_SELF_URI = '@uri';
22
+
23
+ /**
24
+ * @deprecated Legacy JSON property name accepted on read for backward compat.
13
25
  */
14
- export const ATTR_SELF_DXN = '@dxn';
26
+ export const ATTR_SELF_URI_LEGACY = '@dxn';
15
27
 
16
28
  /**
17
- * DXN to the object itself.
29
+ * Symbol carrying the object's own URI on live entities.
18
30
  */
19
- export const SelfDXNId = Symbol.for('@dxos/echo/DXN');
31
+ export const SelfURIId = Symbol.for('@dxos/echo/URI');
20
32
 
21
33
  /**
22
34
  * Property name for deleted when object is serialized to JSON.
@@ -30,11 +30,20 @@ export const ATTR_PARENT = '@parent';
30
30
  export const ParentId = Symbol.for('@dxos/echo/Parent');
31
31
 
32
32
  /**
33
- * Returns the schema for the given object if one is defined.
33
+ * Reference to the object's type entity (`Type.Obj`, `Type.Relation`, or
34
+ * `Type.Type`). Set at instance creation by `createObject` / `makeObject`
35
+ * when the entity is known. Public read-back via `Obj.getType` / `Relation.getType`
36
+ * / `Entity.getType`.
37
+ */
38
+ export const TypeEntityId = Symbol.for('@dxos/echo/TypeEntity');
39
+
40
+ /**
41
+ * Returns the Effect Schema for the given object if one is defined.
34
42
  *
35
- * @internal (Use Obj.getSchema)
43
+ * @internal
44
+ * Internal callers needing schema-side validation read from `SchemaId`.
45
+ * Public callers should use `Type.getSchema(Obj.getType(obj))` instead.
36
46
  */
37
- // TODO(burdon): Narrow type.
38
47
  // TODO(dmaretskyi): For echo objects, this always returns the root schema.
39
48
  export const getSchema = (obj: unknown | undefined): Schema.Schema.AnyNoContext | undefined => {
40
49
  if (obj) {
@@ -53,3 +62,30 @@ export const setSchema = (obj: any, schema: Schema.Schema.AnyNoContext): void =>
53
62
  configurable: false,
54
63
  });
55
64
  };
65
+
66
+ /**
67
+ * Returns the type entity (`Type.AnyEntity`) for the given instance.
68
+ * Set at instance creation; every entity has a type. Defensive: returns
69
+ * undefined for null/undefined input so callers can safely probe arbitrary
70
+ * values via this helper.
71
+ *
72
+ * @internal Re-exported via `Obj.getType` / `Relation.getType` / `Entity.getType`.
73
+ */
74
+ export const getType = (obj: unknown): unknown => {
75
+ if (obj == null) {
76
+ return undefined;
77
+ }
78
+ return (obj as any)[TypeEntityId];
79
+ };
80
+
81
+ /**
82
+ * @internal
83
+ */
84
+ export const setType = (obj: any, type: unknown): void => {
85
+ Object.defineProperty(obj, TypeEntityId, {
86
+ value: type,
87
+ writable: false,
88
+ enumerable: false,
89
+ configurable: true,
90
+ });
91
+ };
@@ -0,0 +1,15 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { DXN } from '@dxos/keys';
6
+
7
+ /**
8
+ * DXN identity of the system {@link Tag} type.
9
+ *
10
+ * Defined in this low-level leaf so it can be shared by the public `Tag` type (which brands the
11
+ * schema with this DXN) and by `EntityMetaSchema.tags` (which builds a `Ref<Tag>` schema from it)
12
+ * without either importing the other — `Tag` is top-level and `meta` is deep-internal, so a direct
13
+ * dependency between them would form an eval-order cycle.
14
+ */
15
+ export const TagTypeDXN = DXN.make('org.dxos.type.tag', '0.1.0');
@@ -12,5 +12,11 @@ export * from './Format';
12
12
  export * from './JsonSchema';
13
13
  // TODO(wittjosiah): Required to ensure types are portable (need to export all types required for downstream inference).
14
14
  export * from './Obj';
15
+ export * from './Query';
15
16
  export * from './Ref';
16
17
  export * from './Type';
18
+
19
+ // Re-exported here (not from the low-level `common/types` barrel) so consumers keep importing meta
20
+ // from `@dxos/echo/internal`, while that barrel stays free of the Ref/Annotation eval cycle. Placed
21
+ // after `./Ref` so the ref schema `meta` depends on is initialized first.
22
+ export * from './common/types/meta';