@dxos/echo 0.8.4-main.d05539e30a → 0.8.4-main.d9fc60f731

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 (378) hide show
  1. package/README.md +4 -4
  2. package/dist/lib/neutral/Annotation.mjs +27 -6
  3. package/dist/lib/neutral/Database.mjs +6 -11
  4. package/dist/lib/neutral/Entity.mjs +25 -16
  5. package/dist/lib/neutral/Err.mjs +3 -3
  6. package/dist/lib/neutral/Feed.mjs +19 -17
  7. package/dist/lib/neutral/Filter.mjs +13 -13
  8. package/dist/lib/neutral/Format.mjs +23 -3
  9. package/dist/lib/neutral/JsonSchema.mjs +7 -8
  10. package/dist/lib/neutral/Key.mjs +9 -5
  11. package/dist/lib/neutral/Migration.mjs +11 -10
  12. package/dist/lib/neutral/Obj.mjs +21 -18
  13. package/dist/lib/neutral/Query.mjs +17 -17
  14. package/dist/lib/neutral/QueryResult.mjs +1 -1
  15. package/dist/lib/neutral/Ref.mjs +10 -11
  16. package/dist/lib/neutral/Registry.mjs +14 -0
  17. package/dist/lib/neutral/Relation.mjs +24 -23
  18. package/dist/lib/neutral/Scope.mjs +12 -0
  19. package/dist/lib/neutral/Tag.mjs +17 -14
  20. package/dist/lib/neutral/Type.mjs +52 -26
  21. package/dist/lib/neutral/chunk-3DKP2EIN.mjs +31 -0
  22. package/dist/lib/neutral/chunk-3DKP2EIN.mjs.map +7 -0
  23. package/dist/lib/neutral/chunk-4BB4MFCN.mjs +154 -0
  24. package/dist/lib/neutral/chunk-4BB4MFCN.mjs.map +7 -0
  25. package/dist/lib/neutral/{chunk-PT37DG2F.mjs → chunk-4SFPZJVA.mjs} +82 -74
  26. package/dist/lib/neutral/chunk-4SFPZJVA.mjs.map +7 -0
  27. package/dist/lib/neutral/{chunk-APHSOTIX.mjs → chunk-4Z6GET2X.mjs} +3 -3
  28. package/dist/lib/neutral/{chunk-APHSOTIX.mjs.map → chunk-4Z6GET2X.mjs.map} +2 -2
  29. package/dist/lib/neutral/{chunk-7RVZT53K.mjs → chunk-7LOUAPYZ.mjs} +9 -5
  30. package/dist/lib/neutral/chunk-7LOUAPYZ.mjs.map +7 -0
  31. package/dist/lib/neutral/{chunk-BMB7IHGB.mjs → chunk-7OAFN3OX.mjs} +70 -57
  32. package/dist/lib/neutral/chunk-7OAFN3OX.mjs.map +7 -0
  33. package/dist/lib/neutral/{chunk-MLS7U7AT.mjs → chunk-7PRCIDHH.mjs} +41 -28
  34. package/dist/lib/neutral/chunk-7PRCIDHH.mjs.map +7 -0
  35. package/dist/lib/neutral/{chunk-ZISMEVKD.mjs → chunk-BBFJWWAV.mjs} +6 -6
  36. package/dist/lib/neutral/chunk-BBFJWWAV.mjs.map +7 -0
  37. package/dist/lib/neutral/{chunk-ZFACXBY6.mjs → chunk-BDQGMDIX.mjs} +30 -34
  38. package/dist/lib/neutral/chunk-BDQGMDIX.mjs.map +7 -0
  39. package/dist/lib/neutral/chunk-CGTI5MXO.mjs +36 -0
  40. package/dist/lib/neutral/chunk-CGTI5MXO.mjs.map +7 -0
  41. package/dist/lib/neutral/{chunk-V72DY6LU.mjs → chunk-DKLUHO4T.mjs} +1 -1
  42. package/dist/lib/neutral/chunk-DKLUHO4T.mjs.map +7 -0
  43. package/dist/lib/neutral/chunk-DMN2CKPX.mjs +93 -0
  44. package/dist/lib/neutral/chunk-DMN2CKPX.mjs.map +7 -0
  45. package/dist/lib/neutral/{chunk-QRZ2I3ZM.mjs → chunk-G6CFWUYH.mjs} +2 -2
  46. package/dist/lib/neutral/chunk-H26LSXVJ.mjs +653 -0
  47. package/dist/lib/neutral/chunk-H26LSXVJ.mjs.map +7 -0
  48. package/dist/lib/neutral/{chunk-N7VOEPSV.mjs → chunk-J3MNM65T.mjs} +9 -9
  49. package/dist/lib/neutral/chunk-J3MNM65T.mjs.map +7 -0
  50. package/dist/lib/neutral/chunk-JE7AOSWF.mjs +247 -0
  51. package/dist/lib/neutral/chunk-JE7AOSWF.mjs.map +7 -0
  52. package/dist/lib/neutral/chunk-LAF3LSWI.mjs +379 -0
  53. package/dist/lib/neutral/chunk-LAF3LSWI.mjs.map +7 -0
  54. package/dist/lib/neutral/chunk-LMNRFOVB.mjs +108 -0
  55. package/dist/lib/neutral/chunk-LMNRFOVB.mjs.map +7 -0
  56. package/dist/lib/neutral/{chunk-N4B7FHQT.mjs → chunk-O6BH7EPN.mjs} +30 -3
  57. package/dist/lib/neutral/chunk-O6BH7EPN.mjs.map +7 -0
  58. package/dist/lib/neutral/{chunk-Q7ZL2P5H.mjs → chunk-OIYW7R2G.mjs} +62 -46
  59. package/dist/lib/neutral/chunk-OIYW7R2G.mjs.map +7 -0
  60. package/dist/lib/neutral/{chunk-G54OX4IX.mjs → chunk-OYUG4FHF.mjs} +527 -847
  61. package/dist/lib/neutral/chunk-OYUG4FHF.mjs.map +7 -0
  62. package/dist/lib/neutral/{chunk-J54QMAKF.mjs → chunk-Q5FKCVBC.mjs} +64 -59
  63. package/dist/lib/neutral/chunk-Q5FKCVBC.mjs.map +7 -0
  64. package/dist/lib/neutral/{chunk-FIWO2FZK.mjs → chunk-Q62IHV2N.mjs} +12 -7
  65. package/dist/lib/neutral/chunk-Q62IHV2N.mjs.map +7 -0
  66. package/dist/lib/neutral/{chunk-SCPFDS2E.mjs → chunk-QVJDDG44.mjs} +65 -34
  67. package/dist/lib/neutral/chunk-QVJDDG44.mjs.map +7 -0
  68. package/dist/lib/neutral/{chunk-TRPZU2HV.mjs → chunk-TFEWTY5A.mjs} +155 -129
  69. package/dist/lib/neutral/chunk-TFEWTY5A.mjs.map +7 -0
  70. package/dist/lib/neutral/{chunk-44HT3MEC.mjs → chunk-VKWOFXT2.mjs} +22 -2
  71. package/dist/lib/neutral/{chunk-44HT3MEC.mjs.map → chunk-VKWOFXT2.mjs.map} +1 -1
  72. package/dist/lib/neutral/{chunk-APJKDGFL.mjs → chunk-ZACMEAYV.mjs} +24 -24
  73. package/dist/lib/neutral/chunk-ZACMEAYV.mjs.map +7 -0
  74. package/dist/lib/neutral/index.mjs +50 -40
  75. package/dist/lib/neutral/internal/index.mjs +125 -64
  76. package/dist/lib/neutral/meta.json +1 -1
  77. package/dist/lib/neutral/testing/index.mjs +88 -99
  78. package/dist/lib/neutral/testing/index.mjs.map +3 -3
  79. package/dist/types/src/Annotation.d.ts +108 -4
  80. package/dist/types/src/Annotation.d.ts.map +1 -1
  81. package/dist/types/src/Annotation.test.d.ts +2 -0
  82. package/dist/types/src/Annotation.test.d.ts.map +1 -0
  83. package/dist/types/src/Collection.d.ts +2 -3
  84. package/dist/types/src/Collection.d.ts.map +1 -1
  85. package/dist/types/src/Database.d.ts +50 -30
  86. package/dist/types/src/Database.d.ts.map +1 -1
  87. package/dist/types/src/Dataset.d.ts +16 -6
  88. package/dist/types/src/Dataset.d.ts.map +1 -1
  89. package/dist/types/src/Entity.d.ts +89 -19
  90. package/dist/types/src/Entity.d.ts.map +1 -1
  91. package/dist/types/src/Err.d.ts +9 -9
  92. package/dist/types/src/Err.d.ts.map +1 -1
  93. package/dist/types/src/Feed.d.ts +35 -12
  94. package/dist/types/src/Feed.d.ts.map +1 -1
  95. package/dist/types/src/Filter.d.ts +21 -8
  96. package/dist/types/src/Filter.d.ts.map +1 -1
  97. package/dist/types/src/Hypergraph.d.ts +13 -8
  98. package/dist/types/src/Hypergraph.d.ts.map +1 -1
  99. package/dist/types/src/Json.d.ts.map +1 -1
  100. package/dist/types/src/JsonSchema.d.ts +1 -1
  101. package/dist/types/src/JsonSchema.d.ts.map +1 -1
  102. package/dist/types/src/Key.d.ts +1 -1
  103. package/dist/types/src/Key.d.ts.map +1 -1
  104. package/dist/types/src/Migration.d.ts +15 -12
  105. package/dist/types/src/Migration.d.ts.map +1 -1
  106. package/dist/types/src/Obj.d.ts +69 -40
  107. package/dist/types/src/Obj.d.ts.map +1 -1
  108. package/dist/types/src/Query.d.ts +24 -10
  109. package/dist/types/src/Query.d.ts.map +1 -1
  110. package/dist/types/src/QueryResult.d.ts +9 -0
  111. package/dist/types/src/QueryResult.d.ts.map +1 -1
  112. package/dist/types/src/Ref.d.ts +15 -8
  113. package/dist/types/src/Ref.d.ts.map +1 -1
  114. package/dist/types/src/Registry.d.ts +131 -0
  115. package/dist/types/src/Registry.d.ts.map +1 -0
  116. package/dist/types/src/Relation.d.ts +55 -26
  117. package/dist/types/src/Relation.d.ts.map +1 -1
  118. package/dist/types/src/Scope.d.ts +34 -0
  119. package/dist/types/src/Scope.d.ts.map +1 -0
  120. package/dist/types/src/StateMap.d.ts +32 -0
  121. package/dist/types/src/StateMap.d.ts.map +1 -0
  122. package/dist/types/src/StateMap.test.d.ts +2 -0
  123. package/dist/types/src/StateMap.test.d.ts.map +1 -0
  124. package/dist/types/src/Tag.d.ts +19 -3
  125. package/dist/types/src/Tag.d.ts.map +1 -1
  126. package/dist/types/src/TagIndex.d.ts +36 -0
  127. package/dist/types/src/TagIndex.d.ts.map +1 -0
  128. package/dist/types/src/TagIndex.test.d.ts +2 -0
  129. package/dist/types/src/TagIndex.test.d.ts.map +1 -0
  130. package/dist/types/src/Tagging.d.ts +31 -0
  131. package/dist/types/src/Tagging.d.ts.map +1 -0
  132. package/dist/types/src/Type.d.ts +356 -95
  133. package/dist/types/src/Type.d.ts.map +1 -1
  134. package/dist/types/src/View.d.ts +1 -4
  135. package/dist/types/src/View.d.ts.map +1 -1
  136. package/dist/types/src/index.d.ts +6 -3
  137. package/dist/types/src/index.d.ts.map +1 -1
  138. package/dist/types/src/internal/Annotation/annotations.d.ts +68 -36
  139. package/dist/types/src/internal/Annotation/annotations.d.ts.map +1 -1
  140. package/dist/types/src/internal/Annotation/dictionary.d.ts +24 -0
  141. package/dist/types/src/internal/Annotation/dictionary.d.ts.map +1 -0
  142. package/dist/types/src/internal/Annotation/entity-dictionary.d.ts +14 -0
  143. package/dist/types/src/internal/Annotation/entity-dictionary.d.ts.map +1 -0
  144. package/dist/types/src/internal/Annotation/index.d.ts +4 -2
  145. package/dist/types/src/internal/Annotation/index.d.ts.map +1 -1
  146. package/dist/types/src/internal/Annotation/util.d.ts +13 -4
  147. package/dist/types/src/internal/Annotation/util.d.ts.map +1 -1
  148. package/dist/types/src/internal/Entity/api.d.ts +3 -3
  149. package/dist/types/src/internal/Entity/api.d.ts.map +1 -1
  150. package/dist/types/src/internal/Entity/entity.d.ts +72 -8
  151. package/dist/types/src/internal/Entity/entity.d.ts.map +1 -1
  152. package/dist/types/src/internal/Entity/guard.d.ts +10 -0
  153. package/dist/types/src/internal/Entity/guard.d.ts.map +1 -0
  154. package/dist/types/src/internal/Entity/index.d.ts +2 -0
  155. package/dist/types/src/internal/Entity/index.d.ts.map +1 -1
  156. package/dist/types/src/internal/Entity/model.d.ts +18 -17
  157. package/dist/types/src/internal/Entity/model.d.ts.map +1 -1
  158. package/dist/types/src/internal/Entity/object.d.ts +3 -3
  159. package/dist/types/src/internal/Entity/object.d.ts.map +1 -1
  160. package/dist/types/src/internal/Entity/relation.d.ts +30 -7
  161. package/dist/types/src/internal/Entity/relation.d.ts.map +1 -1
  162. package/dist/types/src/internal/Entity/type-kind.d.ts +24 -0
  163. package/dist/types/src/internal/Entity/type-kind.d.ts.map +1 -0
  164. package/dist/types/src/internal/Entity/type-uri.d.ts +25 -0
  165. package/dist/types/src/internal/Entity/type-uri.d.ts.map +1 -0
  166. package/dist/types/src/internal/Format/date.d.ts.map +1 -1
  167. package/dist/types/src/internal/Format/format.d.ts +3 -2
  168. package/dist/types/src/internal/Format/format.d.ts.map +1 -1
  169. package/dist/types/src/internal/Format/index.d.ts +2 -2
  170. package/dist/types/src/internal/Format/index.d.ts.map +1 -1
  171. package/dist/types/src/internal/Format/object.d.ts +3 -1
  172. package/dist/types/src/internal/Format/object.d.ts.map +1 -1
  173. package/dist/types/src/internal/JsonSchema/json-schema.d.ts +2 -1
  174. package/dist/types/src/internal/JsonSchema/json-schema.d.ts.map +1 -1
  175. package/dist/types/src/internal/Obj/clone.d.ts.map +1 -1
  176. package/dist/types/src/internal/Obj/create-object.d.ts +11 -12
  177. package/dist/types/src/internal/Obj/create-object.d.ts.map +1 -1
  178. package/dist/types/src/internal/Obj/index.d.ts +0 -1
  179. package/dist/types/src/internal/Obj/index.d.ts.map +1 -1
  180. package/dist/types/src/internal/Obj/json-serializer.d.ts +8 -8
  181. package/dist/types/src/internal/Obj/json-serializer.d.ts.map +1 -1
  182. package/dist/types/src/internal/Obj/snapshot.d.ts.map +1 -1
  183. package/dist/types/src/internal/Obj/typed-object.d.ts +1 -1
  184. package/dist/types/src/internal/Query.d.ts.map +1 -1
  185. package/dist/types/src/internal/Ref/ref-array.d.ts +2 -2
  186. package/dist/types/src/internal/Ref/ref.d.ts +29 -19
  187. package/dist/types/src/internal/Ref/ref.d.ts.map +1 -1
  188. package/dist/types/src/internal/Type/index.d.ts +1 -2
  189. package/dist/types/src/internal/Type/index.d.ts.map +1 -1
  190. package/dist/types/src/internal/Type/manipulation.d.ts +0 -1
  191. package/dist/types/src/internal/Type/manipulation.d.ts.map +1 -1
  192. package/dist/types/src/internal/Type/type-schema.d.ts +52 -0
  193. package/dist/types/src/internal/Type/type-schema.d.ts.map +1 -0
  194. package/dist/types/src/internal/common/api/meta.d.ts +11 -8
  195. package/dist/types/src/internal/common/api/meta.d.ts.map +1 -1
  196. package/dist/types/src/internal/common/proxy/json-serializer.d.ts.map +1 -1
  197. package/dist/types/src/internal/common/proxy/make-object.d.ts +11 -5
  198. package/dist/types/src/internal/common/proxy/make-object.d.ts.map +1 -1
  199. package/dist/types/src/internal/common/proxy/typed-handler.d.ts +18 -2
  200. package/dist/types/src/internal/common/proxy/typed-handler.d.ts.map +1 -1
  201. package/dist/types/src/internal/common/types/base.d.ts +4 -4
  202. package/dist/types/src/internal/common/types/entity.d.ts +59 -2
  203. package/dist/types/src/internal/common/types/entity.d.ts.map +1 -1
  204. package/dist/types/src/internal/common/types/index.d.ts +1 -1
  205. package/dist/types/src/internal/common/types/index.d.ts.map +1 -1
  206. package/dist/types/src/internal/common/types/meta.d.ts +13 -7
  207. package/dist/types/src/internal/common/types/meta.d.ts.map +1 -1
  208. package/dist/types/src/internal/common/types/model-symbols.d.ts +8 -4
  209. package/dist/types/src/internal/common/types/model-symbols.d.ts.map +1 -1
  210. package/dist/types/src/internal/common/types/typename.d.ts +7 -0
  211. package/dist/types/src/internal/common/types/typename.d.ts.map +1 -1
  212. package/dist/types/src/internal/common/types/well-known-types.d.ts +11 -0
  213. package/dist/types/src/internal/common/types/well-known-types.d.ts.map +1 -0
  214. package/dist/types/src/internal/index.d.ts +1 -0
  215. package/dist/types/src/internal/index.d.ts.map +1 -1
  216. package/dist/types/src/testing/test-schema.d.ts +32 -38
  217. package/dist/types/src/testing/test-schema.d.ts.map +1 -1
  218. package/dist/types/src/testing/util.d.ts +5 -3
  219. package/dist/types/src/testing/util.d.ts.map +1 -1
  220. package/dist/types/tsconfig.tsbuildinfo +1 -1
  221. package/package.json +21 -23
  222. package/src/Annotation.test.ts +439 -0
  223. package/src/Annotation.ts +151 -4
  224. package/src/Collection.ts +5 -9
  225. package/src/Database.ts +86 -61
  226. package/src/Dataset.ts +10 -2
  227. package/src/Entity.test.ts +116 -6
  228. package/src/Entity.ts +116 -23
  229. package/src/Err.ts +4 -4
  230. package/src/Feed.ts +57 -40
  231. package/src/Filter.ts +49 -27
  232. package/src/Hypergraph.ts +13 -8
  233. package/src/Json.test.ts +4 -4
  234. package/src/Json.ts +7 -6
  235. package/src/Key.ts +1 -1
  236. package/src/Migration.ts +27 -19
  237. package/src/Obj.test.ts +19 -8
  238. package/src/Obj.ts +131 -70
  239. package/src/Query.test.ts +147 -151
  240. package/src/Query.ts +133 -75
  241. package/src/QueryResult.ts +11 -0
  242. package/src/Ref.ts +21 -5
  243. package/src/Registry.ts +155 -0
  244. package/src/Relation.test.ts +10 -10
  245. package/src/Relation.ts +89 -52
  246. package/src/Scope.ts +50 -0
  247. package/src/StateMap.test.ts +56 -0
  248. package/src/StateMap.ts +99 -0
  249. package/src/Tag.md +88 -0
  250. package/src/Tag.ts +49 -6
  251. package/src/TagIndex.test.ts +57 -0
  252. package/src/TagIndex.ts +110 -0
  253. package/src/Tagging.ts +83 -0
  254. package/src/Type.test.ts +223 -18
  255. package/src/Type.ts +601 -131
  256. package/src/View.ts +10 -19
  257. package/src/index.ts +6 -4
  258. package/src/internal/Annotation/annotations.test.ts +31 -11
  259. package/src/internal/Annotation/annotations.ts +122 -103
  260. package/src/internal/Annotation/dictionary.ts +47 -0
  261. package/src/internal/Annotation/entity-dictionary.ts +40 -0
  262. package/src/internal/Annotation/index.ts +4 -2
  263. package/src/internal/Annotation/util.ts +17 -8
  264. package/src/internal/Entity/api.ts +7 -7
  265. package/src/internal/Entity/entity.ts +196 -47
  266. package/src/internal/Entity/guard.ts +26 -0
  267. package/src/internal/Entity/index.ts +2 -0
  268. package/src/internal/Entity/model.ts +35 -28
  269. package/src/internal/Entity/object.ts +21 -5
  270. package/src/internal/Entity/relation.ts +68 -34
  271. package/src/internal/Entity/type-kind.ts +75 -0
  272. package/src/internal/Entity/type-uri.ts +87 -0
  273. package/src/internal/Entity/util.ts +10 -9
  274. package/src/internal/Format/date.ts +0 -4
  275. package/src/internal/Format/format.test.ts +21 -0
  276. package/src/internal/Format/index.ts +2 -3
  277. package/src/internal/Format/object.ts +21 -4
  278. package/src/internal/Format/types.ts +1 -1
  279. package/src/internal/JsonSchema/annotations.ts +1 -1
  280. package/src/internal/JsonSchema/json-schema.test.ts +54 -140
  281. package/src/internal/JsonSchema/json-schema.ts +44 -30
  282. package/src/internal/Obj/clone.ts +9 -4
  283. package/src/internal/Obj/create-object.test.ts +12 -10
  284. package/src/internal/Obj/create-object.ts +67 -22
  285. package/src/internal/Obj/index.ts +0 -1
  286. package/src/internal/Obj/inspect.ts +4 -3
  287. package/src/internal/Obj/json-serializer.test.ts +100 -21
  288. package/src/internal/Obj/json-serializer.ts +93 -38
  289. package/src/internal/Obj/set-value.test.ts +7 -30
  290. package/src/internal/Obj/snapshot.ts +11 -4
  291. package/src/internal/Obj/typed-object.test.ts +9 -11
  292. package/src/internal/Obj/typed-object.ts +1 -1
  293. package/src/internal/Query.ts +14 -11
  294. package/src/internal/Ref/ref-array.ts +3 -3
  295. package/src/internal/Ref/ref.test.ts +17 -26
  296. package/src/internal/Ref/ref.ts +107 -59
  297. package/src/internal/Type/compose.test.ts +3 -1
  298. package/src/internal/Type/index.ts +1 -2
  299. package/src/internal/Type/manipulation.ts +0 -25
  300. package/src/internal/Type/type-schema.ts +60 -0
  301. package/src/internal/common/README.md +1 -1
  302. package/src/internal/common/api/meta.ts +16 -14
  303. package/src/internal/common/proxy/change.test.ts +35 -27
  304. package/src/internal/common/proxy/handler.test.ts +1 -1
  305. package/src/internal/common/proxy/json-serializer.ts +26 -16
  306. package/src/internal/common/proxy/make-object.ts +43 -20
  307. package/src/internal/common/proxy/ownership.ts +2 -2
  308. package/src/internal/common/proxy/schema.test.ts +48 -86
  309. package/src/internal/common/proxy/typed-handler.test.ts +12 -11
  310. package/src/internal/common/proxy/typed-handler.ts +71 -9
  311. package/src/internal/common/proxy/typed-object.test.ts +15 -27
  312. package/src/internal/common/types/base.ts +4 -4
  313. package/src/internal/common/types/entity.ts +80 -1
  314. package/src/internal/common/types/index.ts +6 -1
  315. package/src/internal/common/types/meta.ts +37 -14
  316. package/src/internal/common/types/model-symbols.ts +16 -4
  317. package/src/internal/common/types/typename.ts +39 -3
  318. package/src/internal/common/types/well-known-types.ts +15 -0
  319. package/src/internal/index.ts +5 -0
  320. package/src/testing/api.test.ts +15 -9
  321. package/src/testing/test-data.ts +24 -24
  322. package/src/testing/test-schema.ts +22 -58
  323. package/src/testing/util.ts +14 -11
  324. package/dist/lib/neutral/Extension.mjs +0 -18
  325. package/dist/lib/neutral/SchemaRegistry.mjs +0 -2
  326. package/dist/lib/neutral/chunk-5SL5LDLD.mjs +0 -47
  327. package/dist/lib/neutral/chunk-5SL5LDLD.mjs.map +0 -7
  328. package/dist/lib/neutral/chunk-7RVZT53K.mjs.map +0 -7
  329. package/dist/lib/neutral/chunk-APJKDGFL.mjs.map +0 -7
  330. package/dist/lib/neutral/chunk-BICZKPQG.mjs +0 -7
  331. package/dist/lib/neutral/chunk-BICZKPQG.mjs.map +0 -7
  332. package/dist/lib/neutral/chunk-BMB7IHGB.mjs.map +0 -7
  333. package/dist/lib/neutral/chunk-FIWO2FZK.mjs.map +0 -7
  334. package/dist/lib/neutral/chunk-G54OX4IX.mjs.map +0 -7
  335. package/dist/lib/neutral/chunk-GWFFC34K.mjs +0 -50
  336. package/dist/lib/neutral/chunk-GWFFC34K.mjs.map +0 -7
  337. package/dist/lib/neutral/chunk-I2DARWPX.mjs +0 -128
  338. package/dist/lib/neutral/chunk-I2DARWPX.mjs.map +0 -7
  339. package/dist/lib/neutral/chunk-J54QMAKF.mjs.map +0 -7
  340. package/dist/lib/neutral/chunk-MGSQGHOD.mjs +0 -206
  341. package/dist/lib/neutral/chunk-MGSQGHOD.mjs.map +0 -7
  342. package/dist/lib/neutral/chunk-MLS7U7AT.mjs.map +0 -7
  343. package/dist/lib/neutral/chunk-N4B7FHQT.mjs.map +0 -7
  344. package/dist/lib/neutral/chunk-N7VOEPSV.mjs.map +0 -7
  345. package/dist/lib/neutral/chunk-PSZBLH53.mjs +0 -81
  346. package/dist/lib/neutral/chunk-PSZBLH53.mjs.map +0 -7
  347. package/dist/lib/neutral/chunk-PT37DG2F.mjs.map +0 -7
  348. package/dist/lib/neutral/chunk-Q2KKKJSV.mjs +0 -56
  349. package/dist/lib/neutral/chunk-Q2KKKJSV.mjs.map +0 -7
  350. package/dist/lib/neutral/chunk-Q7ZL2P5H.mjs.map +0 -7
  351. package/dist/lib/neutral/chunk-SCPFDS2E.mjs.map +0 -7
  352. package/dist/lib/neutral/chunk-TNBK56IN.mjs +0 -350
  353. package/dist/lib/neutral/chunk-TNBK56IN.mjs.map +0 -7
  354. package/dist/lib/neutral/chunk-TRPZU2HV.mjs.map +0 -7
  355. package/dist/lib/neutral/chunk-V72DY6LU.mjs.map +0 -7
  356. package/dist/lib/neutral/chunk-ZFACXBY6.mjs.map +0 -7
  357. package/dist/lib/neutral/chunk-ZISMEVKD.mjs.map +0 -7
  358. package/dist/types/src/Extension.d.ts +0 -80
  359. package/dist/types/src/Extension.d.ts.map +0 -1
  360. package/dist/types/src/Extension.test.d.ts +0 -2
  361. package/dist/types/src/Extension.test.d.ts.map +0 -1
  362. package/dist/types/src/SchemaRegistry.d.ts +0 -84
  363. package/dist/types/src/SchemaRegistry.d.ts.map +0 -1
  364. package/dist/types/src/internal/Obj/ids.d.ts +0 -6
  365. package/dist/types/src/internal/Obj/ids.d.ts.map +0 -1
  366. package/dist/types/src/internal/Type/echo-schema.d.ts +0 -181
  367. package/dist/types/src/internal/Type/echo-schema.d.ts.map +0 -1
  368. package/dist/types/src/internal/Type/persistent-schema.d.ts +0 -20
  369. package/dist/types/src/internal/Type/persistent-schema.d.ts.map +0 -1
  370. package/src/Extension.test.ts +0 -235
  371. package/src/Extension.ts +0 -122
  372. package/src/SchemaRegistry.ts +0 -106
  373. package/src/internal/Obj/ids.ts +0 -12
  374. package/src/internal/Type/echo-schema.ts +0 -423
  375. package/src/internal/Type/persistent-schema.ts +0 -33
  376. /package/dist/lib/neutral/{Extension.mjs.map → Registry.mjs.map} +0 -0
  377. /package/dist/lib/neutral/{SchemaRegistry.mjs.map → Scope.mjs.map} +0 -0
  378. /package/dist/lib/neutral/{chunk-QRZ2I3ZM.mjs.map → chunk-G6CFWUYH.mjs.map} +0 -0
@@ -8,10 +8,11 @@ import { type InspectOptionsStylized } from 'node:util';
8
8
 
9
9
  import { Event } from '@dxos/async';
10
10
  import { inspectCustom } from '@dxos/debug';
11
- import { invariant } from '@dxos/invariant';
11
+ import { assertArgument, invariant } from '@dxos/invariant';
12
12
 
13
- import { getSchemaDXN } from '../../Annotation';
14
- import { ObjectDeletedId, ParentId, SchemaId, TypeId } from '../types';
13
+ import { getSchemaURI } from '../../Annotation/annotations';
14
+ import { toEffectSchema } from '../../JsonSchema/json-schema';
15
+ import { ObjectDeletedId, ParentId, SchemaId, StaticTypeSchemaSlot, TypeEntityId, TypeId } from '../types';
15
16
  import { executeChange, isInChangeContext, queueNotification } from './change-context';
16
17
  import { defineHiddenProperty } from './define-hidden-property';
17
18
  import { createPropertyDeleteError } from './errors';
@@ -142,7 +143,7 @@ export class TypedReactiveHandler implements ReactiveHandler<ProxyTarget> {
142
143
  private constructor() {}
143
144
 
144
145
  init(target: ProxyTarget): void {
145
- invariant(typeof target === 'object' && target !== null);
146
+ assertArgument(typeof target === 'object' && target !== null, 'target');
146
147
  invariant(SchemaId in target, 'Schema is not defined for the target');
147
148
 
148
149
  // Only set EventId on root objects (those without an owner).
@@ -208,6 +209,27 @@ export class TypedReactiveHandler implements ReactiveHandler<ProxyTarget> {
208
209
  // Uses target as both the context key and event target for non-database objects.
209
210
  return (callback: (obj: any) => void) => executeChange(target, target, receiver, callback);
210
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
+ }
211
233
  }
212
234
 
213
235
  // Handle getter properties.
@@ -245,6 +267,11 @@ export class TypedReactiveHandler implements ReactiveHandler<ProxyTarget> {
245
267
  batchEvents(() => {
246
268
  const { echoRoot: _, preparedValue } = this._prepareValueForAssignment(target, prop, value);
247
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
+ }
248
275
  // Queue notification instead of emitting immediately (batched).
249
276
  if (isInitialized) {
250
277
  queueNotification(echoRoot);
@@ -400,16 +427,49 @@ const toJSON = (target: ProxyTarget): any => {
400
427
  return { '@type': 'TypedReactiveObject', ...target };
401
428
  };
402
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
+
403
445
  /**
404
446
  * Recursively set AST on all potential proxy targets.
405
447
  */
406
- const setSchemaProperties = (obj: any, schema: Schema.Schema.AnyNoContext) => {
407
- const schemaType = getSchemaDXN(schema);
448
+ const setSchemaProperties = (obj: any, schema: Schema.Schema.AnyNoContext, typeSource?: TypeSource) => {
449
+ const schemaType = getSchemaURI(schema);
408
450
  if (schemaType != null) {
409
451
  defineHiddenProperty(obj, TypeId, schemaType);
410
452
  }
411
453
 
412
- 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
+ }
413
473
  for (const key in obj) {
414
474
  if (isValidProxyTarget(obj[key])) {
415
475
  const elementSchema = SchemaValidator.getTargetPropertySchema(obj, key);
@@ -420,7 +480,9 @@ const setSchemaProperties = (obj: any, schema: Schema.Schema.AnyNoContext) => {
420
480
  }
421
481
  };
422
482
 
423
- 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) => {
424
486
  // log.info('prepareTypedTarget', { target, schema });
425
487
  if (!SchemaAST.isTypeLiteral(schema.ast)) {
426
488
  throw new Error('schema has to describe an object type');
@@ -429,7 +491,7 @@ export const prepareTypedTarget = <T>(target: T, schema: Schema.Schema<T>) => {
429
491
  SchemaValidator.validateSchema(schema);
430
492
  const _ = Schema.asserts(schema)(target);
431
493
  makeArraysReactive(target);
432
- setSchemaProperties(target, schema);
494
+ setSchemaProperties(target, schema, typeSource);
433
495
  };
434
496
 
435
497
  const makeArraysReactive = (target: any) => {
@@ -6,6 +6,10 @@ 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
15
  import { makeObject } from './make-object';
@@ -13,14 +17,9 @@ import { change } from './reactive';
13
17
 
14
18
  const Organization = Schema.Struct({
15
19
  name: Schema.String,
16
- }).pipe(
17
- EchoObjectSchema({
18
- typename: 'com.example.type.organization',
19
- version: '0.1.0',
20
- }),
21
- );
20
+ }).pipe(EchoObjectSchema(DXN.make('com.example.type.organization', '0.1.0')));
22
21
 
23
- interface Organization extends Schema.Schema.Type<typeof Organization> {}
22
+ type Organization = Type.InstanceType<typeof Organization>;
24
23
 
25
24
  const Contact = Schema.Struct(
26
25
  {
@@ -30,27 +29,21 @@ const Contact = Schema.Struct(
30
29
  key: Schema.String,
31
30
  value: Schema.Any,
32
31
  },
33
- ).pipe(
34
- Schema.partial,
35
- EchoObjectSchema({
36
- typename: 'com.example.type.person',
37
- version: '0.1.0',
38
- }),
39
- );
32
+ ).pipe(Schema.partial, EchoObjectSchema(DXN.make('com.example.type.person', '0.1.0')));
40
33
 
41
- interface Contact extends Schema.Schema.Type<typeof Contact> {}
34
+ type Contact = Type.InstanceType<typeof Contact>;
42
35
 
43
- const TEST_ORG: Omit<Organization, 'id'> = { name: 'Test' };
36
+ const TEST_ORG = { name: 'Test' } satisfies Pick<Organization, 'name'>;
44
37
 
45
38
  describe('EchoObjectSchema class DSL', () => {
46
39
  test('can get object schema', async () => {
47
- const obj = makeObject(Organization, TEST_ORG);
48
- 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));
49
42
  });
50
43
 
51
44
  describe('class options', () => {
52
45
  test('can assign undefined to partial fields', async () => {
53
- const person = makeObject(Contact, { name: 'John' });
46
+ const person = Obj.make(Contact, { name: 'John' });
54
47
  change(person, (p) => {
55
48
  p.name = undefined;
56
49
  p.recordField = 'hello';
@@ -98,14 +91,9 @@ describe('EchoObjectSchema class DSL', () => {
98
91
  {
99
92
  const Test2 = Schema.Struct({
100
93
  meta: Schema.optional(Schema.Record({ key: Schema.String, value: Schema.Any })),
101
- }).pipe(
102
- EchoObjectSchema({
103
- typename: 'org.dxos.type.functionTrigger',
104
- version: '0.1.0',
105
- }),
106
- );
107
-
108
- const object = makeObject(Test2, {});
94
+ }).pipe(EchoObjectSchema(DXN.make('org.dxos.type.functionTrigger', '0.1.0')));
95
+
96
+ const object = Obj.make(Test2, {});
109
97
  change(object, (o) => {
110
98
  (o.meta ??= {}).test = 100;
111
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);
@@ -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,12 +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';
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';
12
18
  import { type AnyProperties } from './base';
19
+ import { TagTypeDXN } from './well-known-types';
13
20
 
14
21
  /**
15
22
  * Property name for meta when object is serialized to JSON.
@@ -22,22 +29,33 @@ export const ATTR_META = '@meta';
22
29
  export const MetaId: Entity.Meta = Symbol.for('@dxos/echo/Meta') as any;
23
30
 
24
31
  //
25
- // ObjectMeta
32
+ // EntityMeta
26
33
  //
27
34
 
28
- // TODO(dmaretskyi): Rename to ObjectMeta
29
- 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({
30
53
  keys: Schema.Array(ForeignKey),
31
54
 
32
55
  /**
33
- * A set of tags.
34
- * Tags are arbitrary application-defined strings.
35
- * ECHO makes no assumptions about the tag structure.
56
+ * Tags applied to this entity, as references to {@link Tag} objects.
36
57
  */
37
- // TODO(dmaretskyi): Has to be optional for compatibility with old data.
38
- // Defaulting to an empty array is possible but requires a bit more work.
39
- // TODO(dmaretskyi): In automerge this should be a map of { [tag]: boolean } for uniqueness and conflict resolution.
40
- tags: Schema.optional(Schema.Array(Schema.String)),
58
+ tags: Schema.Array(TagRefSchema),
41
59
 
42
60
  /**
43
61
  * Fully-qualified registry key for the object (FQN format, e.g. `org.example.type.foo`).
@@ -50,9 +68,14 @@ export const ObjectMetaSchema = Schema.Struct({
50
68
  * Must be a valid semver string (e.g. `1.2.3`).
51
69
  */
52
70
  version: Schema.optional(Schema.String),
71
+
72
+ /**
73
+ * Dictionary of annotations to this entity.
74
+ */
75
+ annotations: Dictionary,
53
76
  });
54
77
 
55
- export type ObjectMeta = Schema.Schema.Type<typeof ObjectMetaSchema>;
78
+ export type EntityMeta = Schema.Schema.Type<typeof EntityMetaSchema>;
56
79
 
57
80
  /*
58
81
  * Get metadata from object.
@@ -61,9 +84,9 @@ export type ObjectMeta = Schema.Schema.Type<typeof ObjectMetaSchema>;
61
84
  * @internal (use Obj.getMeta or Relation.getMeta)
62
85
  */
63
86
  // TODO(burdon): Refine type to BaseObj.
64
- export const getMeta = (obj: AnyProperties): ObjectMeta => {
87
+ export const getMeta = (obj: AnyProperties): EntityMeta => {
65
88
  const metadata = (obj as any)[MetaId];
66
- invariant(metadata, 'ObjectMeta not found.');
89
+ invariant(metadata, 'EntityMeta not found.');
67
90
  return metadata;
68
91
  };
69
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');
@@ -15,3 +15,8 @@ export * from './Obj';
15
15
  export * from './Query';
16
16
  export * from './Ref';
17
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';
@@ -13,16 +13,22 @@ import { TestSchema } from './test-schema';
13
13
  describe('Experimental API review', () => {
14
14
  test('type checks', ({ expect }) => {
15
15
  const contact = Obj.make(TestSchema.Person, { name: 'Test' });
16
- const schema = Obj.getSchema(contact) ?? raise(new Error('No schema found'));
17
-
18
- expect(Type.getDXN(schema)?.typename).to.eq(TestSchema.Person.typename);
19
- expect(Type.getTypename(schema)).to.eq('com.example.type.person');
20
- expect(Type.getVersion(schema)).to.eq('0.1.0');
21
- expect(Type.getMeta(schema)).to.deep.eq({
22
- kind: Entity.Kind.Object,
23
- typename: 'com.example.type.person',
16
+ const type = Obj.getType(contact) ?? raise(new Error('No type found'));
17
+
18
+ expect(Type.getTypename(type)).to.eq(Type.getTypename(TestSchema.Person));
19
+ expect(Type.getTypename(type)).to.eq('com.example.type.person');
20
+ expect(Type.getVersion(type)).to.eq('0.1.0');
21
+ // `Type.getMeta` returns `EntityMeta` (`{ keys, tags?, key?, version? }`)
22
+ // the same shape `Obj.getMeta` and `Relation.getMeta` return. The
23
+ // schema-kind brand lives on `[SchemaKindId]`, not in meta.
24
+ expect(Type.getMeta(type)).to.deep.eq({
25
+ keys: [],
26
+ tags: [],
27
+ annotations: {},
28
+ key: 'com.example.type.person',
24
29
  version: '0.1.0',
25
30
  });
31
+ expect(Type.isObject(type)).to.be.true;
26
32
  });
27
33
 
28
34
  test('instance checks', ({ expect }) => {
@@ -32,7 +38,7 @@ describe('Experimental API review', () => {
32
38
  employer: Ref.make(organization),
33
39
  });
34
40
 
35
- expect(Schema.is(TestSchema.Person)(contact)).to.be.true;
41
+ expect(Schema.is(Type.getSchema(TestSchema.Person))(contact)).to.be.true;
36
42
  expect(Obj.instanceOf(TestSchema.Person, contact)).to.be.true;
37
43
  expect(Obj.instanceOf(TestSchema.Organization, organization)).to.be.true;
38
44