@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
package/src/Json.ts CHANGED
@@ -2,7 +2,7 @@
2
2
  // Copyright 2026 DXOS.org
3
3
  //
4
4
 
5
- import { DXN } from '@dxos/keys';
5
+ import { EID } from '@dxos/keys';
6
6
 
7
7
  import * as Database from './Database';
8
8
  import * as Obj from './Obj';
@@ -64,21 +64,22 @@ export const createRefReplacer = ({ db, depth = 1 }: CreateRefReplacerOptions):
64
64
  // an unparseable string would otherwise crash the whole `JSON.stringify`.
65
65
  // Treat any parse miss as "leave as-is" rather than propagating.
66
66
  const dxnString = value['/'];
67
- if (!dxnString.startsWith('dxn:')) {
67
+ if (!dxnString.startsWith('dxn:') && !dxnString.startsWith('echo:')) {
68
68
  return value;
69
69
  }
70
70
 
71
- let echoId: string | undefined;
71
+ let echoUri: string | undefined;
72
72
  try {
73
- echoId = DXN.parse(dxnString).asEchoDXN()?.echoId;
73
+ const parsed = EID.tryParse(dxnString);
74
+ echoUri = parsed ? EID.getEntityId(parsed) : undefined;
74
75
  } catch {
75
76
  return value;
76
77
  }
77
78
 
78
- if (!echoId) {
79
+ if (!echoUri) {
79
80
  return value;
80
81
  }
81
- const target = db.getObjectById(echoId);
82
+ const target = db.getObjectById(echoUri);
82
83
  if (!target) {
83
84
  return value;
84
85
  }
package/src/Key.ts CHANGED
@@ -5,4 +5,4 @@
5
5
  // TODO(wittjosiah): Should this be a subset of Type?
6
6
 
7
7
  export { ForeignKey } from '@dxos/echo-protocol';
8
- export { SpaceId, ObjectId } from '@dxos/keys';
8
+ export { EID, EntityId, SpaceId, URI } from '@dxos/keys';
package/src/Migration.ts CHANGED
@@ -6,25 +6,31 @@
6
6
 
7
7
  import type * as Schema from 'effect/Schema';
8
8
 
9
- import { type DXN } from '@dxos/keys';
9
+ import { type URI } from '@dxos/keys';
10
10
 
11
11
  import type * as Database from './Database';
12
12
  import type * as Entity from './Entity';
13
- import { MetaId, type ObjectMeta, getSchemaDXN } from './internal';
13
+ import { MetaId, type EntityMeta, getSchemaURI } from './internal';
14
+ import * as Type from './Type';
14
15
 
15
16
  /**
16
17
  * Result returned by a migration's `transform` callback.
17
18
  * The data shape matches the target schema; the optional `[Obj.Meta]` symbol key lets the
18
19
  * transform update the object's meta (e.g. `key` / `version`) atomically with the data swap.
19
20
  */
20
- export type TransformResult<To extends Schema.Schema.AnyNoContext> = Omit<
21
- Schema.Schema.Type<To>,
22
- 'id' | Entity.KindId
23
- > & {
24
- [MetaId]?: Partial<ObjectMeta>;
21
+ type MigrationSchemaInput = Type.AnyEntity;
22
+
23
+ type MigrationInstanceType<S> = S extends Type.AnyEntity
24
+ ? Type.InstanceType<S>
25
+ : S extends Schema.Schema.AnyNoContext
26
+ ? Schema.Schema.Type<S>
27
+ : never;
28
+
29
+ export type TransformResult<To> = Omit<MigrationInstanceType<To>, 'id' | Entity.KindId> & {
30
+ [MetaId]?: Partial<EntityMeta>;
25
31
  };
26
32
 
27
- type DefineObjectMigrationOptions<From extends Schema.Schema.AnyNoContext, To extends Schema.Schema.AnyNoContext> = {
33
+ type DefineObjectMigrationOptions<From extends MigrationSchemaInput, To extends MigrationSchemaInput> = {
28
34
  from: From;
29
35
  to: To;
30
36
  /**
@@ -34,7 +40,7 @@ type DefineObjectMigrationOptions<From extends Schema.Schema.AnyNoContext, To ex
34
40
  * (e.g. registry `key` / `version`) atomically with the data swap.
35
41
  */
36
42
  // TODO(dmaretskyi): `id` should not be a part of the schema.
37
- transform: (from: Schema.Schema.Type<From>, context: ObjectMigrationContext) => Promise<TransformResult<To>>;
43
+ transform: (from: MigrationInstanceType<From>, context: ObjectMigrationContext) => Promise<TransformResult<To>>;
38
44
 
39
45
  /**
40
46
  * Callback that is called after the object is migrated. Called for every object that is migrated.
@@ -52,9 +58,9 @@ export type ObjectMigrationContext = {
52
58
  db: Database.Database;
53
59
  };
54
60
 
55
- type OnMigrateProps<From extends Schema.Schema.AnyNoContext, To extends Schema.Schema.AnyNoContext> = {
56
- before: Schema.Schema.Type<From>;
57
- object: Schema.Schema.Type<To>;
61
+ type OnMigrateProps<From, To> = {
62
+ before: MigrationInstanceType<From>;
63
+ object: MigrationInstanceType<To>;
58
64
  db: Database.Database;
59
65
  };
60
66
 
@@ -62,8 +68,8 @@ type OnMigrateProps<From extends Schema.Schema.AnyNoContext, To extends Schema.S
62
68
  * Definition of a migration from one object schema version to another.
63
69
  */
64
70
  export type ObjectMigration = {
65
- fromType: DXN;
66
- toType: DXN;
71
+ fromType: URI.URI;
72
+ toType: URI.URI;
67
73
  fromSchema: Schema.Schema.AnyNoContext;
68
74
  toSchema: Schema.Schema.AnyNoContext;
69
75
  transform: (from: unknown, context: ObjectMigrationContext) => Promise<unknown>;
@@ -83,14 +89,16 @@ export type ObjectMigration = {
83
89
  * });
84
90
  * ```
85
91
  */
86
- export const define = <From extends Schema.Schema.AnyNoContext, To extends Schema.Schema.AnyNoContext>(
92
+ export const define = <From extends MigrationSchemaInput, To extends MigrationSchemaInput>(
87
93
  options: DefineObjectMigrationOptions<From, To>,
88
94
  ): ObjectMigration => {
89
- const fromType = getSchemaDXN(options.from);
95
+ const fromSchema = Type.getSchema(options.from);
96
+ const toSchema = Type.getSchema(options.to);
97
+ const fromType = getSchemaURI(fromSchema);
90
98
  if (!fromType) {
91
99
  throw new Error('Invalid from schema');
92
100
  }
93
- const toType = getSchemaDXN(options.to);
101
+ const toType = getSchemaURI(toSchema);
94
102
  if (!toType) {
95
103
  throw new Error('Invalid to schema');
96
104
  }
@@ -98,8 +106,8 @@ export const define = <From extends Schema.Schema.AnyNoContext, To extends Schem
98
106
  return {
99
107
  fromType,
100
108
  toType,
101
- fromSchema: options.from,
102
- toSchema: options.to,
109
+ fromSchema,
110
+ toSchema,
103
111
  transform: options.transform as any,
104
112
  onMigration: options.onMigration as any,
105
113
  };
package/src/Obj.test.ts CHANGED
@@ -42,8 +42,8 @@ describe('Obj', () => {
42
42
  const snapshot = Obj.getSnapshot(obj);
43
43
 
44
44
  // getDXN - works with both.
45
- expect(Obj.getDXN(obj)).toBeDefined();
46
- expect(Obj.getDXN(snapshot)).toBeDefined();
45
+ expect(Obj.getURI(obj)).toBeDefined();
46
+ expect(Obj.getURI(snapshot)).toBeDefined();
47
47
 
48
48
  // getTypename - works with both.
49
49
  expect(Obj.getTypename(obj)).toBe('com.example.type.person');
@@ -80,6 +80,17 @@ describe('Obj', () => {
80
80
  expect(SnapshotKindId in snapshot).toBe(true);
81
81
  expect(Entity.KindId in snapshot).toBe(false);
82
82
  });
83
+
84
+ test('getSnapshot preserves parent', ({ expect }) => {
85
+ const parent = Obj.make(TestSchema.Organization, { name: 'parent' });
86
+ const child = Obj.make(TestSchema.Person, { name: 'child' });
87
+ Obj.setParent(child, parent);
88
+
89
+ const snapshot = Obj.getSnapshot(child);
90
+
91
+ expect(Obj.getParent(child)).toBe(parent);
92
+ expect(Obj.getParent(snapshot)).toBe(parent);
93
+ });
83
94
  });
84
95
 
85
96
  describe('snapshotOf', () => {
@@ -134,7 +145,7 @@ describe('Obj', () => {
134
145
 
135
146
  test('throws for plain object without metadata', ({ expect }) => {
136
147
  const plain = { id: 'plain-1', name: 'Plain' };
137
- expect(() => Obj.getKeys(plain as any, SOURCE)).toThrow(/ObjectMeta not found/);
148
+ expect(() => Obj.getKeys(plain as any, SOURCE)).toThrow(/EntityMeta not found/);
138
149
  });
139
150
  });
140
151
 
@@ -329,8 +340,8 @@ describe('Obj', () => {
329
340
  expect(cloned.address?.city).toBe('San Francisco');
330
341
  expect(cloned.address?.state).toBe('CA');
331
342
  expect(cloned.address?.zip).toBe('94102');
332
- expect(cloned.address?.coordinates.lat).toBe(37.7749);
333
- expect(cloned.address?.coordinates.lng).toBe(-122.4194);
343
+ expect(cloned.address?.coordinates?.lat).toBe(37.7749);
344
+ expect(cloned.address?.coordinates?.lng).toBe(-122.4194);
334
345
 
335
346
  // Modifying nested properties should be independent
336
347
  Obj.update(person, (person) => {
@@ -405,7 +416,7 @@ describe('Obj', () => {
405
416
  const cloned = Obj.clone(person);
406
417
 
407
418
  expect(Obj.instanceOf(TestSchema.Person, cloned)).toBe(true);
408
- expect(Obj.getSchema(cloned)).toBe(Obj.getSchema(person));
419
+ expect(Obj.getType(cloned)).toBe(Obj.getType(person));
409
420
  });
410
421
  });
411
422
 
@@ -490,7 +501,7 @@ describe('Obj', () => {
490
501
  Obj.update(target, (target) => {
491
502
  expect(Obj.updateFrom(target, source)).toBe(true);
492
503
  });
493
- expect(target.employer?.dxn.toString()).toBe(Ref.make(orgB).dxn.toString());
504
+ expect(target.employer?.uri.toString()).toBe(Ref.make(orgB).uri.toString());
494
505
  expect(target.address?.city).toBe('Portland');
495
506
  });
496
507
 
@@ -513,7 +524,7 @@ describe('Obj', () => {
513
524
  Obj.update(target, (target) => {
514
525
  expect(Obj.updateFrom(target, source)).toBe(true);
515
526
  });
516
- expect(target.tasks?.map((r) => r.dxn.toString())).toEqual(source.tasks?.map((r) => r.dxn.toString()));
527
+ expect(target.tasks?.map((r) => r.uri)).toEqual(source.tasks?.map((r) => r.uri));
517
528
  });
518
529
 
519
530
  test('respects include option', () => {
package/src/Obj.ts CHANGED
@@ -14,7 +14,7 @@ import * as Utils from 'effect/Utils';
14
14
  import type { ForeignKey } from '@dxos/echo-protocol';
15
15
  import { createJsonPath } from '@dxos/effect';
16
16
  import { assertArgument, invariant } from '@dxos/invariant';
17
- import { type DXN, ObjectId } from '@dxos/keys';
17
+ import { DXN, EntityId, type URI } from '@dxos/keys';
18
18
  import { assumeType, deepMapValues } from '@dxos/util';
19
19
 
20
20
  import type * as Database from './Database';
@@ -24,7 +24,8 @@ import * as internal from './internal';
24
24
  import { getProxyTarget, isProxy } from './internal/common/proxy/proxy-utils';
25
25
  import * as objInternal from './internal/Obj';
26
26
  import * as Ref from './Ref';
27
- import type * as Type from './Type';
27
+ import type * as Tag from './Tag';
28
+ import * as Type from './Type';
28
29
 
29
30
  /**
30
31
  * Base type for all ECHO objects.
@@ -64,25 +65,24 @@ export interface Unknown extends BaseObj {}
64
65
  * // Reference to any object type
65
66
  * const Collection = Schema.Struct({
66
67
  * objects: Schema.Array(Ref.Ref(Obj.Unknown)),
67
- * }).pipe(Type.object({ typename: 'Collection', version: '0.1.0' }));
68
+ * }).pipe(Type.makeObject(DXN.make('com.example.type.collection', '0.1.0')));
68
69
  * ```
69
70
  */
70
71
  // TODO(wittjosiah): Investigate if Schema.filter can validate KindId on ECHO instances.
71
72
  // Effect Schema normalizes proxy objects to plain objects before calling filter predicates.
72
73
  // Possible approaches: custom Schema.declare, AST manipulation, or upstream contribution.
73
- export const Unknown: Type.Obj<Unknown> = Schema.Struct({
74
+ export const Unknown: internal.UnknownTypeSchema<Unknown, typeof Entity.Kind.Object> = Schema.Struct({
74
75
  id: Schema.String,
75
76
  }).pipe(
76
77
  Schema.extend(Schema.Record({ key: Schema.String, value: Schema.Unknown })),
77
- // TODO(dmaretskyi): Clean this up.
78
- // NOTE: The EchoObjectSchema annotation is required for Ref.Ref(Obj.Unknown) to work.
79
- // The typename/version only satisfy ECHO schema machinery for reference targets.
80
- internal.EchoObjectSchema({ typename: internal.ANY_OBJECT_TYPENAME, version: internal.ANY_OBJECT_VERSION }),
81
- (schema) =>
82
- Object.assign(schema, {
83
- [internal.SchemaKindId]: (schema as any)[internal.SchemaKindId],
84
- }) as unknown as Type.Obj<Unknown>,
85
- );
78
+ Schema.annotations({
79
+ [internal.TypeAnnotationId]: {
80
+ kind: Entity.Kind.Object,
81
+ typename: internal.ANY_OBJECT_TYPENAME,
82
+ version: internal.ANY_OBJECT_VERSION,
83
+ },
84
+ }),
85
+ ) as unknown as internal.UnknownTypeSchema<Unknown, typeof Entity.Kind.Object>;
86
86
 
87
87
  /**
88
88
  * Object with arbitrary properties.
@@ -99,7 +99,7 @@ export interface Any extends BaseObj, internal.AnyProperties {}
99
99
  */
100
100
  interface BaseSnapshot extends internal.AnyEntity {
101
101
  readonly [Entity.SnapshotKindId]: typeof Entity.Kind.Object;
102
- readonly id: ObjectId;
102
+ readonly id: EntityId;
103
103
  }
104
104
 
105
105
  /**
@@ -120,30 +120,44 @@ export interface BaseObjJson {
120
120
  id: string;
121
121
  }
122
122
 
123
- const defaultMeta: internal.ObjectMeta = {
123
+ // Factory (not a shared const): each object must get its own `keys`/`tags`/`annotations` containers,
124
+ // otherwise mutating one object's meta would leak into every other object via the shared references.
125
+ const defaultMeta = (): internal.EntityMeta => ({
124
126
  keys: [],
125
- };
126
-
127
- type MakePropsInternal<T extends Unknown> = {
128
- id?: ObjectId;
129
- [Meta]?: Partial<internal.ObjectMeta>;
130
- } & Entity.Properties<T>;
127
+ tags: [],
128
+ annotations: {},
129
+ });
131
130
 
132
131
  // TODO(burdon): Should we allow the caller to set the id?
133
132
  /**
134
- * Props type for object creation with a given schema.
133
+ * Props type for object creation with a given type. Accepts a `Type.AnyObj`
134
+ * entity and derives the instance shape via `Type.InstanceType`. Relation-kind
135
+ * entities are rejected at the type level — use `Relation.MakeProps` for those.
136
+ *
137
+ * When the schema is the unconstrained `Type.AnyObj` (`Obj<unknown>` — e.g. a
138
+ * dynamic type from `schemaRegistry.register`), the instance shape is not
139
+ * statically known, so data props widen to `Record<string, unknown>` and the
140
+ * caller can pass arbitrary fields without a cast.
135
141
  */
136
- export type MakeProps<S extends Schema.Schema.AnyNoContext> = {
137
- id?: ObjectId;
138
- [Meta]?: Partial<internal.ObjectMeta>;
142
+ export type MakeProps<S extends Type.AnyObj> = {
143
+ id?: EntityId;
144
+ [Meta]?: Partial<internal.EntityMeta>;
139
145
  [Parent]?: Unknown;
140
- } & MakePropsInternal<Schema.Schema.Type<S>>;
146
+ // When the resolved instance has no known data keys, widen to a permissive
147
+ // record (the `Obj<unknown>` case); otherwise use the precise property shape.
148
+ // `[keyof …] extends [never]` is wrapped in tuples so the check is
149
+ // non-distributive — a `never` instance type (e.g. when narrowing collapses
150
+ // the schema) stays a single branch instead of distributing to `never`.
151
+ } & ([keyof Entity.Properties<Type.InstanceType<S>>] extends [never]
152
+ ? Record<string, unknown>
153
+ : Entity.Properties<Type.InstanceType<S>>);
141
154
 
142
155
  /**
143
- * Creates a new echo object of the given schema.
144
- * @param schema - Object schema.
156
+ * Creates a new echo object of the given schema or `Type.Type`.
157
+ *
158
+ * @param typeOrSchema - A static object schema (`Type.makeObject(...)`) or a
159
+ * `Type.Type` entity (e.g. one returned by `db.addType(schemaEntity)`).
145
160
  * @param props - Object properties.
146
- * @param meta - Object metadata (deprecated) -- pass with Obj.Meta.
147
161
  *
148
162
  * Meta can be passed as a symbol in `props`.
149
163
  *
@@ -152,23 +166,26 @@ export type MakeProps<S extends Schema.Schema.AnyNoContext> = {
152
166
  * const obj = Obj.make(Person, { [Obj.Meta]: { keys: [...] }, name: 'John' });
153
167
  * ```
154
168
  *
155
- * Note: Only accepts object schemas, not relation schemas. Use `Relation.make` for relations.
169
+ * Note: Only accepts object schemas / object-kind types, not relation schemas.
170
+ * Use `Relation.make` for relations.
156
171
  */
157
- export const make = <S extends Type.AnyObj>(
158
- schema: S,
159
- props: NoInfer<MakeProps<S>>,
160
- ): OfShape<Schema.Schema.Type<S>> => {
172
+ export function make<T extends Type.AnyObj>(type: T, props: NoInfer<MakeProps<T>>): OfShape<Type.InstanceType<T>>;
173
+ export function make(input: Type.AnyObj, props: any): OfShape<any> {
174
+ // `Type.Type` entities aren't `Schema.Schema` themselves; derive the Effect
175
+ // Schema via `Type.getSchema(...)`. Pass the entity through to `makeObject`
176
+ // so subsequent schema mutations (`Type.addFields`, etc.) propagate.
177
+ const schema = Type.getSchema(input);
161
178
  assertArgument(
162
179
  internal.getTypeAnnotation(schema)?.kind === Entity.Kind.Object,
163
180
  'schema',
164
181
  'Expected an object schema',
165
182
  );
166
183
 
167
- let meta: internal.ObjectMeta | undefined = undefined;
184
+ let meta: internal.EntityMeta | undefined = undefined;
168
185
 
169
186
  // Set default fields on meta on creation.
170
187
  if (props[internal.MetaId] != null) {
171
- meta = { ...structuredClone(defaultMeta), ...props[internal.MetaId] };
188
+ meta = { ...defaultMeta(), ...props[internal.MetaId] };
172
189
  delete props[internal.MetaId];
173
190
  }
174
191
 
@@ -183,11 +200,16 @@ export const make = <S extends Type.AnyObj>(
183
200
  }
184
201
  }
185
202
 
186
- return internal.makeObject<Schema.Schema.Type<S>>(schema, filterUndefined as any, {
187
- ...defaultMeta,
188
- ...meta,
189
- });
190
- };
203
+ return internal.makeObject(
204
+ schema,
205
+ filterUndefined,
206
+ {
207
+ ...defaultMeta(),
208
+ ...meta,
209
+ },
210
+ input,
211
+ );
212
+ }
191
213
 
192
214
  /**
193
215
  * Determine if object is an ECHO object.
@@ -401,12 +423,12 @@ export const setValue: (obj: Mutable<Unknown>, path: readonly (string | number)[
401
423
  // Type
402
424
  //
403
425
 
404
- // TODO(burdon): To discuss: prefer over ObjectId or Key.ObjectId or Type.ID?
405
- export const ID = ObjectId;
406
- export type ID = ObjectId;
426
+ export const ID = EntityId;
427
+ export type ID = EntityId;
407
428
 
408
429
  /**
409
- * Test if object or relation is an instance of a schema.
430
+ * Test if an object is an instance of a given object type.
431
+ *
410
432
  * @example
411
433
  * ```ts
412
434
  * const john = Obj.make(Person, { name: 'John' });
@@ -415,11 +437,29 @@ export type ID = ObjectId;
415
437
  * // john is Person
416
438
  * }
417
439
  * ```
440
+ *
441
+ * Only accepts `Type.AnyObj` — use `Relation.instanceOf` for relations and
442
+ * `Type.isType(value)` to test for `Type.Type` meta-schema entities.
418
443
  */
419
444
  export const instanceOf: {
420
- <S extends Type.AnyEntity>(schema: S): (value: unknown) => value is Schema.Schema.Type<S>;
421
- <S extends Type.AnyEntity>(schema: S, value: unknown): value is Schema.Schema.Type<S>;
422
- } = ((...args: [schema: Type.AnyEntity, value: unknown] | [schema: Type.AnyEntity]) => {
445
+ // Reject `Type.Type` at the type level — those are meta-schema entities, not
446
+ // object instances. Use `Type.isType(value)` instead.
447
+ <T extends Type.Type>(
448
+ type: T,
449
+ _hint?: never,
450
+ // eslint-disable-next-line @typescript-eslint/unified-signatures
451
+ ..._error: ['ERROR: Obj.instanceOf does not accept Type.Type; use Type.isType(value) instead']
452
+ ): never;
453
+ // Reject relation types — use `Relation.instanceOf` instead.
454
+ <R extends Type.AnyRelation>(
455
+ type: R,
456
+ _hint?: never,
457
+ // eslint-disable-next-line @typescript-eslint/unified-signatures
458
+ ..._error: ['ERROR: Obj.instanceOf does not accept relation types; use Relation.instanceOf instead']
459
+ ): never;
460
+ <S extends Type.AnyObj>(schema: S): (value: unknown) => value is Type.InstanceType<S>;
461
+ <S extends Type.AnyObj>(schema: S, value: unknown): value is Type.InstanceType<S>;
462
+ } = ((...args: [schema: Type.AnyEntity, value?: unknown]) => {
423
463
  if (args.length === 1) {
424
464
  return (entity: unknown) => internal.isInstanceOf(args[0], entity);
425
465
  }
@@ -441,9 +481,9 @@ export const instanceOf: {
441
481
  * ```
442
482
  */
443
483
  export const snapshotOf: {
444
- <S extends Type.AnyEntity>(schema: S): (value: unknown) => value is Snapshot<Schema.Schema.Type<S>>;
445
- <S extends Type.AnyEntity>(schema: S, value: unknown): value is Snapshot<Schema.Schema.Type<S>>;
446
- } = ((...args: [schema: Type.AnyEntity, value: unknown] | [schema: Type.AnyEntity]) => {
484
+ <S extends Type.AnyObj>(schema: S): (value: unknown) => value is Snapshot<Type.InstanceType<S>>;
485
+ <S extends Type.AnyObj>(schema: S, value: unknown): value is Snapshot<Type.InstanceType<S>>;
486
+ } = ((...args: [schema: Type.AnyObj, value: unknown] | [schema: Type.AnyObj]) => {
447
487
  const check = (entity: unknown) =>
448
488
  entity != null &&
449
489
  typeof entity === 'object' &&
@@ -459,12 +499,14 @@ export const snapshotOf: {
459
499
 
460
500
  // TODO(dmaretskyi): Allow returning undefined.
461
501
  /**
462
- * Get the DXN of the object.
502
+ * Get the canonical URI of the object. Returns `URI.URI` (today always an EID,
503
+ * but future entity kinds may surface other URI schemes — narrow with
504
+ * `EID.parse(uri)` or `DXN.tryMake(uri)` at the point of use).
463
505
  * Accepts both reactive objects and snapshots.
464
506
  */
465
- export const getDXN = (entity: Unknown | Snapshot): DXN => {
507
+ export const getURI = (entity: Unknown | Snapshot): URI.URI => {
466
508
  assertArgument(!Schema.isSchema(entity), 'obj', 'Object should not be a schema.');
467
- return internal.getDXN(entity);
509
+ return internal.getUri(entity);
468
510
  };
469
511
 
470
512
  /**
@@ -472,17 +514,22 @@ export const getDXN = (entity: Unknown | Snapshot): DXN => {
472
514
  * @example dxn:com.example.type.person:1.0.0
473
515
  * @throws If the object is missing its type (corrupted object).
474
516
  */
475
- export const getTypeDXN = (obj: Unknown | Snapshot): DXN => {
476
- const type = internal.getTypeDXN(obj);
517
+ export const getTypeURI = (obj: Unknown | Snapshot): URI.URI => {
518
+ const type = internal.getTypeURI(obj);
477
519
  invariant(type != null, 'Corrupted object: missing type.');
478
520
  return type;
479
521
  };
480
522
 
481
523
  /**
482
- * Get the schema of the object.
483
- * Returns the branded ECHO schema used to create the object.
524
+ * Get the type entity (`Type.AnyObj`) the object was created from.
525
+ *
526
+ * Returns `undefined` when the object's type isn't registered in this runtime
527
+ * (e.g. a freshly deserialized snapshot whose type entity hasn't been wired
528
+ * up yet, or an object loaded from storage before its schema is known). To
529
+ * get the Effect Schema from the returned entity, use `Type.getSchema(...)`.
484
530
  */
485
- export const getSchema: (obj: Unknown | Snapshot) => Type.AnyEntity | undefined = internal.getSchema as any;
531
+ export const getType = (obj: Unknown | Snapshot): Type.AnyObj | undefined =>
532
+ internal.getType(obj) as Type.AnyObj | undefined;
486
533
 
487
534
  /**
488
535
  * @returns The typename of the object's type.
@@ -514,7 +561,7 @@ export const getDatabase = (entity: Entity.Unknown | Entity.Snapshot): Database.
514
561
  export const Meta = internal.MetaId;
515
562
 
516
563
  /**
517
- * Deeply read-only version of ObjectMeta.
564
+ * Deeply read-only version of EntityMeta.
518
565
  * Prevents mutation at all nesting levels (e.g., `meta.keys.push()` is a TypeScript error).
519
566
  */
520
567
  export type ReadonlyMeta = internal.ReadonlyMeta;
@@ -538,9 +585,8 @@ export type Meta = internal.Meta;
538
585
  *
539
586
  * // Mutable access inside change callback
540
587
  * Obj.update(person, (obj) => {
541
- * const meta = Obj.getMeta(obj); // ObjectMeta (mutable)
542
- * meta.tags ??= [];
543
- * meta.tags.push('important');
588
+ * const meta = Obj.getMeta(obj); // EntityMeta (mutable)
589
+ * meta.tags.push(Ref.make(tag)); // tags are refs to Tag objects
544
590
  * });
545
591
  * ```
546
592
  */
@@ -576,7 +622,7 @@ export const deleteKeys = (entity: Mutable<Unknown>, source: string): void => in
576
622
  * NOTE: TypeScript's structural typing allows readonly objects to be passed to `Mutable<T>`
577
623
  * parameters, so there is no compile-time error. Enforcement is runtime-only.
578
624
  */
579
- export const addTag = (entity: Mutable<Unknown>, tag: string): void => internal.addTag(entity, tag);
625
+ export const addTag = (entity: Mutable<Unknown>, tag: Ref.Ref<Tag.Tag>): void => internal.addTag(entity, tag);
580
626
 
581
627
  /**
582
628
  * Remove a tag from the object.
@@ -585,7 +631,7 @@ export const addTag = (entity: Mutable<Unknown>, tag: string): void => internal.
585
631
  * NOTE: TypeScript's structural typing allows readonly objects to be passed to `Mutable<T>`
586
632
  * parameters, so there is no compile-time error. Enforcement is runtime-only.
587
633
  */
588
- export const removeTag = (entity: Mutable<Unknown>, tag: string): void => internal.removeTag(entity, tag);
634
+ export const removeTag = (entity: Mutable<Unknown>, tag: Ref.Ref<Tag.Tag>): void => internal.removeTag(entity, tag);
589
635
 
590
636
  /**
591
637
  * Check if the object is deleted.
@@ -601,8 +647,12 @@ export const isDeleted = (entity: Unknown | Snapshot): boolean => objInternal.is
601
647
  /**
602
648
  * Get the label of the object.
603
649
  * Accepts both reactive objects and snapshots.
650
+ *
651
+ * @param options.fallback `'typename'` returns the object's typename when no
652
+ * label is set (e.g. `org.dxos.type.table`).
604
653
  */
605
- export const getLabel = (entity: Unknown | Snapshot): string | undefined => internal.getLabel(entity);
654
+ export const getLabel = (entity: Unknown | Snapshot, options?: internal.GetLabelOptions): string | undefined =>
655
+ internal.getLabel(entity, options);
606
656
 
607
657
  /**
608
658
  * Set the label of the object.
@@ -619,6 +669,17 @@ export const setLabel = (entity: Mutable<Unknown>, label: string): void => inter
619
669
  */
620
670
  export const getDescription = (entity: Unknown | Snapshot): string | undefined => internal.getDescription(entity);
621
671
 
672
+ /**
673
+ * Get the icon annotation for the object (or any entity), resolved via its type-level
674
+ * `IconAnnotation`. Accepts both reactive entities and snapshots, and either Objects or
675
+ * Relations — the underlying schema-based lookup works for both.
676
+ *
677
+ * Returns the full `{ icon, hue }` annotation; callers wanting just the icon name typically
678
+ * write `Obj.getIcon(obj)?.icon ?? 'ph--cube--regular'`.
679
+ */
680
+ export const getIcon = (entity: Entity.Unknown | Entity.Snapshot): internal.IconAnnotation | undefined =>
681
+ internal.getIcon(entity);
682
+
622
683
  /**
623
684
  * Set the description of the object.
624
685
  * Must be called within an `Obj.update` callback.
@@ -648,7 +709,7 @@ export const Parent: unique symbol = internal.ParentId as any;
648
709
  * @returns The parent object, or undefined if the object has no parent.
649
710
  */
650
711
  export const getParent = (entity: Unknown | Snapshot): Unknown | undefined => {
651
- assertArgument(isObject(entity), 'Expected an object');
712
+ assertArgument(isObject(entity) || isSnapshot(entity), 'Expected an object');
652
713
  assumeType<internal.InternalObjectProps>(entity);
653
714
  return entity[internal.ParentId] as Unknown | undefined;
654
715
  };
@@ -683,7 +744,7 @@ const valuesEqual = (left: unknown, right: unknown): boolean => {
683
744
  return Utils.structuralRegion(() => Equal.equals(left, right));
684
745
  }
685
746
  if (Ref.isRef(left) && Ref.isRef(right)) {
686
- return left.dxn.toString() === right.dxn.toString();
747
+ return left.uri === right.uri;
687
748
  }
688
749
  if (Ref.isRef(left) || Ref.isRef(right)) {
689
750
  return false;
@@ -807,12 +868,12 @@ export const toJSON = (entity: Unknown | Snapshot): JSON => objInternal.objectTo
807
868
  * The function must be async to support resolving the schema as well as the relation endpoints.
808
869
  *
809
870
  * @param options.refResolver - Resolver for references. Produces hydrated references that can be resolved.
810
- * @param options.dxn - Override object DXN. Changes the result of `Obj.getDXN`.
871
+ * @param options.uri - Override object URI. Changes the result of `Obj.getURI`.
811
872
  * @param options.database - Database to associate with the object.
812
873
  */
813
874
  export const fromJSON: (
814
875
  json: unknown,
815
- options?: { refResolver?: Ref.Resolver; dxn?: DXN; database?: Database.Database; parent?: Unknown },
876
+ options?: { refResolver?: Ref.Resolver; uri?: URI.URI; database?: Database.Database; parent?: Unknown },
816
877
  ) => Promise<Unknown> = objInternal.objectFromJSON as any;
817
878
 
818
879
  /**