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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (444) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +7 -7
  3. package/dist/lib/neutral/Annotation.mjs +45 -6
  4. package/dist/lib/neutral/Database.mjs +10 -17
  5. package/dist/lib/neutral/Entity.mjs +35 -20
  6. package/dist/lib/neutral/Err.mjs +3 -3
  7. package/dist/lib/neutral/Feed.mjs +23 -19
  8. package/dist/lib/neutral/Filter.mjs +13 -15
  9. package/dist/lib/neutral/Format.mjs +23 -3
  10. package/dist/lib/neutral/JsonSchema.mjs +7 -8
  11. package/dist/lib/neutral/Key.mjs +9 -5
  12. package/dist/lib/neutral/Migration.mjs +11 -10
  13. package/dist/lib/neutral/Obj.mjs +33 -20
  14. package/dist/lib/neutral/Order.mjs +7 -3
  15. package/dist/lib/neutral/Query.mjs +17 -17
  16. package/dist/lib/neutral/QueryResult.mjs +1 -1
  17. package/dist/lib/neutral/Ref.mjs +10 -9
  18. package/dist/lib/neutral/Registry.mjs +14 -0
  19. package/dist/lib/neutral/Relation.mjs +28 -25
  20. package/dist/lib/neutral/Scope.mjs +12 -0
  21. package/dist/lib/neutral/Tag.mjs +17 -14
  22. package/dist/lib/neutral/Type.mjs +54 -26
  23. package/dist/lib/neutral/{chunk-OMUPQMLR.mjs → chunk-35INCYOE.mjs} +1 -1
  24. package/dist/lib/neutral/chunk-35INCYOE.mjs.map +7 -0
  25. package/dist/lib/neutral/{chunk-4OIBYSXE.mjs → chunk-3JXQUMUI.mjs} +78 -32
  26. package/dist/lib/neutral/chunk-3JXQUMUI.mjs.map +7 -0
  27. package/dist/lib/neutral/{chunk-G3IQMKF7.mjs → chunk-4TPQZPLY.mjs} +130 -119
  28. package/dist/lib/neutral/chunk-4TPQZPLY.mjs.map +7 -0
  29. package/dist/lib/neutral/{chunk-TU3GW67D.mjs → chunk-5GAIWRQB.mjs} +40 -40
  30. package/dist/lib/neutral/chunk-5GAIWRQB.mjs.map +7 -0
  31. package/dist/lib/neutral/{chunk-B4BASU6W.mjs → chunk-6CEISA3V.mjs} +93 -76
  32. package/dist/lib/neutral/chunk-6CEISA3V.mjs.map +7 -0
  33. package/dist/lib/neutral/{chunk-GZQTCRJB.mjs → chunk-6M2Z6WBH.mjs} +22 -2
  34. package/dist/lib/neutral/chunk-6M2Z6WBH.mjs.map +7 -0
  35. package/dist/lib/neutral/{chunk-ANHVGJI4.mjs → chunk-7LOUAPYZ.mjs} +9 -5
  36. package/dist/lib/neutral/chunk-7LOUAPYZ.mjs.map +7 -0
  37. package/dist/lib/neutral/{chunk-WAK4DMFV.mjs → chunk-A53NTBHE.mjs} +12 -7
  38. package/dist/lib/neutral/chunk-A53NTBHE.mjs.map +7 -0
  39. package/dist/lib/neutral/{chunk-EAMSSLZC.mjs → chunk-AFANXSGV.mjs} +83 -46
  40. package/dist/lib/neutral/chunk-AFANXSGV.mjs.map +7 -0
  41. package/dist/lib/neutral/{chunk-UBEZSGXY.mjs → chunk-BBFJWWAV.mjs} +6 -6
  42. package/dist/lib/neutral/chunk-BBFJWWAV.mjs.map +7 -0
  43. package/dist/lib/neutral/chunk-E7IOTOZD.mjs +108 -0
  44. package/dist/lib/neutral/chunk-E7IOTOZD.mjs.map +7 -0
  45. package/dist/lib/neutral/{chunk-UI6MWK5W.mjs → chunk-EVK6XBXO.mjs} +16 -2
  46. package/dist/lib/neutral/chunk-EVK6XBXO.mjs.map +7 -0
  47. package/dist/lib/neutral/chunk-HGWQR5KH.mjs +259 -0
  48. package/dist/lib/neutral/chunk-HGWQR5KH.mjs.map +7 -0
  49. package/dist/lib/neutral/chunk-JZ6LFQU5.mjs +109 -0
  50. package/dist/lib/neutral/chunk-JZ6LFQU5.mjs.map +7 -0
  51. package/dist/lib/neutral/{chunk-JUXPFOEI.mjs → chunk-K3S7D5PR.mjs} +48 -88
  52. package/dist/lib/neutral/chunk-K3S7D5PR.mjs.map +7 -0
  53. package/dist/lib/neutral/{chunk-OS35K56T.mjs → chunk-L3OBWBV2.mjs} +3 -3
  54. package/dist/lib/neutral/{chunk-OS35K56T.mjs.map → chunk-L3OBWBV2.mjs.map} +2 -2
  55. package/dist/lib/neutral/{chunk-V36VO5SS.mjs → chunk-NOL7O3BL.mjs} +32 -40
  56. package/dist/lib/neutral/chunk-NOL7O3BL.mjs.map +7 -0
  57. package/dist/lib/neutral/{chunk-TBKX6JQO.mjs → chunk-O6BH7EPN.mjs} +30 -3
  58. package/dist/lib/neutral/chunk-O6BH7EPN.mjs.map +7 -0
  59. package/dist/lib/neutral/{chunk-7RO7CPBZ.mjs → chunk-PLDMJJJC.mjs} +2 -2
  60. package/dist/lib/neutral/{chunk-HBUZJNZO.mjs → chunk-SZ5WB6HF.mjs} +94 -99
  61. package/dist/lib/neutral/chunk-SZ5WB6HF.mjs.map +7 -0
  62. package/dist/lib/neutral/{chunk-BVOFLCVF.mjs → chunk-TF5BSLF6.mjs} +9 -6
  63. package/dist/lib/neutral/chunk-TF5BSLF6.mjs.map +7 -0
  64. package/dist/lib/neutral/{chunk-DQYLD2RB.mjs → chunk-TFEWTY5A.mjs} +155 -129
  65. package/dist/lib/neutral/chunk-TFEWTY5A.mjs.map +7 -0
  66. package/dist/lib/neutral/{chunk-MOR5ERFM.mjs → chunk-VQYL2OQF.mjs} +771 -1252
  67. package/dist/lib/neutral/chunk-VQYL2OQF.mjs.map +7 -0
  68. package/dist/lib/neutral/chunk-WISOH2XH.mjs +36 -0
  69. package/dist/lib/neutral/chunk-WISOH2XH.mjs.map +7 -0
  70. package/dist/lib/neutral/chunk-WU3GIANS.mjs +31 -0
  71. package/dist/lib/neutral/chunk-WU3GIANS.mjs.map +7 -0
  72. package/dist/lib/neutral/chunk-WZ32BF53.mjs +702 -0
  73. package/dist/lib/neutral/chunk-WZ32BF53.mjs.map +7 -0
  74. package/dist/lib/neutral/chunk-X3NUUON4.mjs +184 -0
  75. package/dist/lib/neutral/chunk-X3NUUON4.mjs.map +7 -0
  76. package/dist/lib/neutral/chunk-Z3WMRRAZ.mjs +168 -0
  77. package/dist/lib/neutral/chunk-Z3WMRRAZ.mjs.map +7 -0
  78. package/dist/lib/neutral/index.mjs +47 -41
  79. package/dist/lib/neutral/internal/index.mjs +157 -72
  80. package/dist/lib/neutral/meta.json +1 -1
  81. package/dist/lib/neutral/testing/index.mjs +261 -178
  82. package/dist/lib/neutral/testing/index.mjs.map +4 -4
  83. package/dist/types/src/Annotation.d.ts +108 -4
  84. package/dist/types/src/Annotation.d.ts.map +1 -1
  85. package/dist/types/src/Annotation.test.d.ts +2 -0
  86. package/dist/types/src/Annotation.test.d.ts.map +1 -0
  87. package/dist/types/src/Collection.d.ts +2 -3
  88. package/dist/types/src/Collection.d.ts.map +1 -1
  89. package/dist/types/src/Database.d.ts +78 -49
  90. package/dist/types/src/Database.d.ts.map +1 -1
  91. package/dist/types/src/Dataset.d.ts +16 -6
  92. package/dist/types/src/Dataset.d.ts.map +1 -1
  93. package/dist/types/src/Entity.d.ts +103 -28
  94. package/dist/types/src/Entity.d.ts.map +1 -1
  95. package/dist/types/src/Err.d.ts +27 -27
  96. package/dist/types/src/Err.d.ts.map +1 -1
  97. package/dist/types/src/Feed.d.ts +69 -19
  98. package/dist/types/src/Feed.d.ts.map +1 -1
  99. package/dist/types/src/Filter.d.ts +38 -12
  100. package/dist/types/src/Filter.d.ts.map +1 -1
  101. package/dist/types/src/Format.d.ts +0 -2
  102. package/dist/types/src/Format.d.ts.map +1 -1
  103. package/dist/types/src/Hypergraph.d.ts +14 -9
  104. package/dist/types/src/Hypergraph.d.ts.map +1 -1
  105. package/dist/types/src/Json.d.ts +33 -0
  106. package/dist/types/src/Json.d.ts.map +1 -0
  107. package/dist/types/src/Json.test.d.ts +2 -0
  108. package/dist/types/src/Json.test.d.ts.map +1 -0
  109. package/dist/types/src/JsonSchema.d.ts +2 -2
  110. package/dist/types/src/JsonSchema.d.ts.map +1 -1
  111. package/dist/types/src/Key.d.ts +1 -1
  112. package/dist/types/src/Key.d.ts.map +1 -1
  113. package/dist/types/src/Migration.d.ts +26 -11
  114. package/dist/types/src/Migration.d.ts.map +1 -1
  115. package/dist/types/src/Obj.d.ts +106 -61
  116. package/dist/types/src/Obj.d.ts.map +1 -1
  117. package/dist/types/src/Order.d.ts +10 -0
  118. package/dist/types/src/Order.d.ts.map +1 -1
  119. package/dist/types/src/Query.d.ts +34 -12
  120. package/dist/types/src/Query.d.ts.map +1 -1
  121. package/dist/types/src/QueryResult.d.ts +21 -0
  122. package/dist/types/src/QueryResult.d.ts.map +1 -1
  123. package/dist/types/src/Ref.d.ts +15 -7
  124. package/dist/types/src/Ref.d.ts.map +1 -1
  125. package/dist/types/src/Registry.d.ts +131 -0
  126. package/dist/types/src/Registry.d.ts.map +1 -0
  127. package/dist/types/src/Relation.d.ts +73 -41
  128. package/dist/types/src/Relation.d.ts.map +1 -1
  129. package/dist/types/src/Scope.d.ts +35 -0
  130. package/dist/types/src/Scope.d.ts.map +1 -0
  131. package/dist/types/src/Tag.d.ts +21 -5
  132. package/dist/types/src/Tag.d.ts.map +1 -1
  133. package/dist/types/src/Type.d.ts +366 -95
  134. package/dist/types/src/Type.d.ts.map +1 -1
  135. package/dist/types/src/View.d.ts +9 -12
  136. package/dist/types/src/View.d.ts.map +1 -1
  137. package/dist/types/src/exemplars.test.d.ts +2 -0
  138. package/dist/types/src/exemplars.test.d.ts.map +1 -0
  139. package/dist/types/src/index.d.ts +4 -3
  140. package/dist/types/src/index.d.ts.map +1 -1
  141. package/dist/types/src/internal/Annotation/annotations.d.ts +120 -38
  142. package/dist/types/src/internal/Annotation/annotations.d.ts.map +1 -1
  143. package/dist/types/src/internal/Annotation/dictionary.d.ts +24 -0
  144. package/dist/types/src/internal/Annotation/dictionary.d.ts.map +1 -0
  145. package/dist/types/src/internal/Annotation/entity-dictionary.d.ts +14 -0
  146. package/dist/types/src/internal/Annotation/entity-dictionary.d.ts.map +1 -0
  147. package/dist/types/src/internal/Annotation/index.d.ts +4 -2
  148. package/dist/types/src/internal/Annotation/index.d.ts.map +1 -1
  149. package/dist/types/src/internal/Annotation/sorting.d.ts.map +1 -1
  150. package/dist/types/src/internal/Annotation/util.d.ts +14 -5
  151. package/dist/types/src/internal/Annotation/util.d.ts.map +1 -1
  152. package/dist/types/src/internal/Entity/api.d.ts +17 -3
  153. package/dist/types/src/internal/Entity/api.d.ts.map +1 -1
  154. package/dist/types/src/internal/Entity/entity.d.ts +72 -8
  155. package/dist/types/src/internal/Entity/entity.d.ts.map +1 -1
  156. package/dist/types/src/internal/Entity/guard.d.ts +10 -0
  157. package/dist/types/src/internal/Entity/guard.d.ts.map +1 -0
  158. package/dist/types/src/internal/Entity/index.d.ts +2 -0
  159. package/dist/types/src/internal/Entity/index.d.ts.map +1 -1
  160. package/dist/types/src/internal/Entity/model.d.ts +21 -17
  161. package/dist/types/src/internal/Entity/model.d.ts.map +1 -1
  162. package/dist/types/src/internal/Entity/object.d.ts +3 -3
  163. package/dist/types/src/internal/Entity/object.d.ts.map +1 -1
  164. package/dist/types/src/internal/Entity/relation.d.ts +30 -7
  165. package/dist/types/src/internal/Entity/relation.d.ts.map +1 -1
  166. package/dist/types/src/internal/Entity/type-kind.d.ts +24 -0
  167. package/dist/types/src/internal/Entity/type-kind.d.ts.map +1 -0
  168. package/dist/types/src/internal/Entity/type-uri.d.ts +24 -0
  169. package/dist/types/src/internal/Entity/type-uri.d.ts.map +1 -0
  170. package/dist/types/src/internal/Entity/version.d.ts.map +1 -1
  171. package/dist/types/src/internal/Format/date.d.ts.map +1 -1
  172. package/dist/types/src/internal/Format/format.d.ts +3 -2
  173. package/dist/types/src/internal/Format/format.d.ts.map +1 -1
  174. package/dist/types/src/internal/Format/index.d.ts +2 -2
  175. package/dist/types/src/internal/Format/index.d.ts.map +1 -1
  176. package/dist/types/src/internal/Format/number.d.ts.map +1 -1
  177. package/dist/types/src/internal/Format/object.d.ts +3 -1
  178. package/dist/types/src/internal/Format/object.d.ts.map +1 -1
  179. package/dist/types/src/internal/Format/types.d.ts.map +1 -1
  180. package/dist/types/src/internal/JsonSchema/json-schema-normalize.d.ts.map +1 -1
  181. package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts +34 -34
  182. package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts.map +1 -1
  183. package/dist/types/src/internal/JsonSchema/json-schema.d.ts +3 -2
  184. package/dist/types/src/internal/JsonSchema/json-schema.d.ts.map +1 -1
  185. package/dist/types/src/internal/Obj/atoms.d.ts +43 -0
  186. package/dist/types/src/internal/Obj/atoms.d.ts.map +1 -0
  187. package/dist/types/src/internal/Obj/clone.d.ts.map +1 -1
  188. package/dist/types/src/internal/Obj/common.d.ts.map +1 -1
  189. package/dist/types/src/internal/Obj/create-object.d.ts +12 -12
  190. package/dist/types/src/internal/Obj/create-object.d.ts.map +1 -1
  191. package/dist/types/src/internal/Obj/deleted.d.ts.map +1 -1
  192. package/dist/types/src/internal/Obj/index.d.ts +1 -1
  193. package/dist/types/src/internal/Obj/index.d.ts.map +1 -1
  194. package/dist/types/src/internal/Obj/json-serializer.d.ts +8 -8
  195. package/dist/types/src/internal/Obj/json-serializer.d.ts.map +1 -1
  196. package/dist/types/src/internal/Obj/set-value.d.ts +1 -1
  197. package/dist/types/src/internal/Obj/set-value.d.ts.map +1 -1
  198. package/dist/types/src/internal/Obj/snapshot.d.ts.map +1 -1
  199. package/dist/types/src/internal/Obj/typed-object.d.ts +1 -1
  200. package/dist/types/src/internal/Query/index.d.ts +2 -0
  201. package/dist/types/src/internal/Query/index.d.ts.map +1 -0
  202. package/dist/types/src/internal/{Query.d.ts → Query/pretty.d.ts} +1 -1
  203. package/dist/types/src/internal/Query/pretty.d.ts.map +1 -0
  204. package/dist/types/src/internal/Ref/atoms.d.ts +10 -0
  205. package/dist/types/src/internal/Ref/atoms.d.ts.map +1 -0
  206. package/dist/types/src/internal/Ref/index.d.ts +1 -0
  207. package/dist/types/src/internal/Ref/index.d.ts.map +1 -1
  208. package/dist/types/src/internal/Ref/ref-array.d.ts +2 -2
  209. package/dist/types/src/internal/Ref/ref.d.ts +114 -19
  210. package/dist/types/src/internal/Ref/ref.d.ts.map +1 -1
  211. package/dist/types/src/internal/Ref/strong-deps.d.ts +35 -0
  212. package/dist/types/src/internal/Ref/strong-deps.d.ts.map +1 -0
  213. package/dist/types/src/internal/Ref/utils.d.ts +8 -0
  214. package/dist/types/src/internal/Ref/utils.d.ts.map +1 -0
  215. package/dist/types/src/internal/Type/compose.d.ts.map +1 -1
  216. package/dist/types/src/internal/Type/index.d.ts +1 -2
  217. package/dist/types/src/internal/Type/index.d.ts.map +1 -1
  218. package/dist/types/src/internal/Type/manipulation.d.ts +0 -1
  219. package/dist/types/src/internal/Type/manipulation.d.ts.map +1 -1
  220. package/dist/types/src/internal/Type/type-schema.d.ts +52 -0
  221. package/dist/types/src/internal/Type/type-schema.d.ts.map +1 -0
  222. package/dist/types/src/internal/common/api/meta.d.ts +14 -11
  223. package/dist/types/src/internal/common/api/meta.d.ts.map +1 -1
  224. package/dist/types/src/internal/common/proxy/change-context.d.ts +1 -1
  225. package/dist/types/src/internal/common/proxy/change-context.d.ts.map +1 -1
  226. package/dist/types/src/internal/common/proxy/define-hidden-property.d.ts.map +1 -1
  227. package/dist/types/src/internal/common/proxy/errors.d.ts +1 -1
  228. package/dist/types/src/internal/common/proxy/errors.d.ts.map +1 -1
  229. package/dist/types/src/internal/common/proxy/event-batch.d.ts.map +1 -1
  230. package/dist/types/src/internal/common/proxy/json-serializer.d.ts.map +1 -1
  231. package/dist/types/src/internal/common/proxy/make-object.d.ts +11 -5
  232. package/dist/types/src/internal/common/proxy/make-object.d.ts.map +1 -1
  233. package/dist/types/src/internal/common/proxy/ownership.d.ts.map +1 -1
  234. package/dist/types/src/internal/common/proxy/proxy-utils.d.ts.map +1 -1
  235. package/dist/types/src/internal/common/proxy/reactive-array.d.ts +1 -1
  236. package/dist/types/src/internal/common/proxy/reactive.d.ts +1 -1
  237. package/dist/types/src/internal/common/proxy/reactive.d.ts.map +1 -1
  238. package/dist/types/src/internal/common/proxy/reactive.test.d.ts +2 -0
  239. package/dist/types/src/internal/common/proxy/reactive.test.d.ts.map +1 -0
  240. package/dist/types/src/internal/common/proxy/schema-validator.d.ts.map +1 -1
  241. package/dist/types/src/internal/common/proxy/typed-handler.d.ts +18 -2
  242. package/dist/types/src/internal/common/proxy/typed-handler.d.ts.map +1 -1
  243. package/dist/types/src/internal/common/types/base.d.ts +4 -4
  244. package/dist/types/src/internal/common/types/base.d.ts.map +1 -1
  245. package/dist/types/src/internal/common/types/entity.d.ts +62 -5
  246. package/dist/types/src/internal/common/types/entity.d.ts.map +1 -1
  247. package/dist/types/src/internal/common/types/index.d.ts +1 -1
  248. package/dist/types/src/internal/common/types/index.d.ts.map +1 -1
  249. package/dist/types/src/internal/common/types/meta.d.ts +33 -12
  250. package/dist/types/src/internal/common/types/meta.d.ts.map +1 -1
  251. package/dist/types/src/internal/common/types/model-symbols.d.ts +15 -4
  252. package/dist/types/src/internal/common/types/model-symbols.d.ts.map +1 -1
  253. package/dist/types/src/internal/common/types/typename.d.ts +7 -0
  254. package/dist/types/src/internal/common/types/typename.d.ts.map +1 -1
  255. package/dist/types/src/internal/common/types/version.d.ts +1 -1
  256. package/dist/types/src/internal/common/types/well-known-types.d.ts +11 -0
  257. package/dist/types/src/internal/common/types/well-known-types.d.ts.map +1 -0
  258. package/dist/types/src/internal/index.d.ts +2 -2
  259. package/dist/types/src/internal/index.d.ts.map +1 -1
  260. package/dist/types/src/testing/index.d.ts +1 -0
  261. package/dist/types/src/testing/index.d.ts.map +1 -1
  262. package/dist/types/src/testing/registry.d.ts +9 -0
  263. package/dist/types/src/testing/registry.d.ts.map +1 -0
  264. package/dist/types/src/testing/test-data.d.ts +8 -8
  265. package/dist/types/src/testing/test-data.d.ts.map +1 -1
  266. package/dist/types/src/testing/test-schema.d.ts +83 -89
  267. package/dist/types/src/testing/test-schema.d.ts.map +1 -1
  268. package/dist/types/src/testing/util.d.ts +5 -3
  269. package/dist/types/src/testing/util.d.ts.map +1 -1
  270. package/dist/types/tsconfig.tsbuildinfo +1 -1
  271. package/package.json +26 -24
  272. package/src/Annotation.test.ts +439 -0
  273. package/src/Annotation.ts +163 -4
  274. package/src/Collection.ts +5 -9
  275. package/src/Database.ts +126 -101
  276. package/src/Dataset.ts +10 -2
  277. package/src/Entity.test.ts +116 -6
  278. package/src/Entity.ts +136 -32
  279. package/src/Err.ts +4 -4
  280. package/src/Feed.ts +95 -44
  281. package/src/Filter.ts +70 -40
  282. package/src/Format.ts +0 -4
  283. package/src/Hypergraph.ts +14 -9
  284. package/src/Json.test.ts +175 -0
  285. package/src/Json.ts +103 -0
  286. package/src/Key.ts +1 -1
  287. package/src/Migration.ts +39 -19
  288. package/src/Obj.test.ts +122 -20
  289. package/src/Obj.ts +170 -91
  290. package/src/Order.ts +22 -0
  291. package/src/Query.test.ts +183 -154
  292. package/src/Query.ts +172 -85
  293. package/src/QueryResult.ts +26 -0
  294. package/src/Ref.ts +22 -4
  295. package/src/Registry.ts +155 -0
  296. package/src/Relation.test.ts +10 -10
  297. package/src/Relation.ts +116 -69
  298. package/src/Scope.ts +50 -0
  299. package/src/Tag.md +88 -0
  300. package/src/Tag.ts +50 -6
  301. package/src/Type.test.ts +223 -18
  302. package/src/Type.ts +623 -131
  303. package/src/View.ts +14 -23
  304. package/src/exemplars.test.ts +21 -0
  305. package/src/index.ts +4 -4
  306. package/src/internal/Annotation/annotations.test.ts +31 -11
  307. package/src/internal/Annotation/annotations.ts +199 -111
  308. package/src/internal/Annotation/dictionary.ts +47 -0
  309. package/src/internal/Annotation/entity-dictionary.ts +74 -0
  310. package/src/internal/Annotation/index.ts +4 -2
  311. package/src/internal/Annotation/util.ts +17 -8
  312. package/src/internal/Entity/api.ts +54 -7
  313. package/src/internal/Entity/entity.ts +196 -47
  314. package/src/internal/Entity/guard.ts +26 -0
  315. package/src/internal/Entity/index.ts +2 -0
  316. package/src/internal/Entity/model.ts +38 -28
  317. package/src/internal/Entity/object.ts +21 -5
  318. package/src/internal/Entity/relation.ts +68 -34
  319. package/src/internal/Entity/type-kind.ts +75 -0
  320. package/src/internal/Entity/type-uri.ts +92 -0
  321. package/src/internal/Entity/util.ts +9 -9
  322. package/src/internal/Format/date.ts +0 -4
  323. package/src/internal/Format/format.test.ts +21 -0
  324. package/src/internal/Format/index.ts +2 -3
  325. package/src/internal/Format/object.ts +21 -4
  326. package/src/internal/Format/types.ts +1 -1
  327. package/src/internal/JsonSchema/annotations.ts +1 -1
  328. package/src/internal/JsonSchema/json-schema-type.ts +4 -4
  329. package/src/internal/JsonSchema/json-schema.test.ts +71 -145
  330. package/src/internal/JsonSchema/json-schema.ts +49 -35
  331. package/src/internal/Obj/atoms.ts +275 -0
  332. package/src/internal/Obj/clone.ts +9 -4
  333. package/src/internal/Obj/create-object.test.ts +12 -10
  334. package/src/internal/Obj/create-object.ts +68 -22
  335. package/src/internal/Obj/index.ts +1 -1
  336. package/src/internal/Obj/inspect.ts +5 -3
  337. package/src/internal/Obj/json-serializer.test.ts +101 -22
  338. package/src/internal/Obj/json-serializer.ts +92 -36
  339. package/src/internal/Obj/set-value.test.ts +22 -45
  340. package/src/internal/Obj/set-value.ts +12 -19
  341. package/src/internal/Obj/snapshot.ts +13 -4
  342. package/src/internal/Obj/typed-object.test.ts +9 -11
  343. package/src/internal/Obj/typed-object.ts +1 -1
  344. package/src/internal/Query/index.ts +5 -0
  345. package/src/internal/{Query.ts → Query/pretty.ts} +40 -12
  346. package/src/internal/Ref/atoms.ts +20 -0
  347. package/src/internal/Ref/index.ts +1 -0
  348. package/src/internal/Ref/ref-array.ts +3 -3
  349. package/src/internal/Ref/ref.test.ts +18 -27
  350. package/src/internal/Ref/ref.ts +224 -69
  351. package/src/internal/Ref/strong-deps.ts +107 -0
  352. package/src/internal/Ref/utils.ts +45 -0
  353. package/src/internal/Type/compose.test.ts +3 -1
  354. package/src/internal/Type/index.ts +1 -2
  355. package/src/internal/Type/manipulation.ts +0 -25
  356. package/src/internal/Type/type-schema.ts +60 -0
  357. package/src/internal/common/README.md +2 -2
  358. package/src/internal/common/api/meta.ts +19 -17
  359. package/src/internal/common/proxy/change-context.ts +1 -1
  360. package/src/internal/common/proxy/change.test.ts +91 -83
  361. package/src/internal/common/proxy/errors.ts +2 -2
  362. package/src/internal/common/proxy/handler.test.ts +1 -1
  363. package/src/internal/common/proxy/json-serializer.ts +27 -16
  364. package/src/internal/common/proxy/make-object.ts +44 -20
  365. package/src/internal/common/proxy/ownership.ts +2 -2
  366. package/src/internal/common/proxy/reactive-array.ts +1 -1
  367. package/src/internal/common/proxy/reactive.test.ts +54 -0
  368. package/src/internal/common/proxy/reactive.ts +11 -2
  369. package/src/internal/common/proxy/schema.test.ts +48 -86
  370. package/src/internal/common/proxy/typed-handler.test.ts +12 -11
  371. package/src/internal/common/proxy/typed-handler.ts +78 -16
  372. package/src/internal/common/proxy/typed-object.test.ts +16 -28
  373. package/src/internal/common/types/base.ts +4 -4
  374. package/src/internal/common/types/entity.ts +80 -1
  375. package/src/internal/common/types/index.ts +6 -1
  376. package/src/internal/common/types/meta.ts +62 -20
  377. package/src/internal/common/types/model-symbols.ts +24 -4
  378. package/src/internal/common/types/typename.ts +39 -3
  379. package/src/internal/common/types/well-known-types.ts +15 -0
  380. package/src/internal/index.ts +6 -4
  381. package/src/testing/api.test.ts +15 -9
  382. package/src/testing/index.ts +1 -0
  383. package/src/testing/registry.ts +44 -0
  384. package/src/testing/test-data.ts +159 -99
  385. package/src/testing/test-schema.ts +22 -58
  386. package/src/testing/util.ts +14 -11
  387. package/dist/lib/neutral/Extension.mjs +0 -18
  388. package/dist/lib/neutral/SchemaRegistry.mjs +0 -2
  389. package/dist/lib/neutral/chunk-2KHZ36F5.mjs +0 -361
  390. package/dist/lib/neutral/chunk-2KHZ36F5.mjs.map +0 -7
  391. package/dist/lib/neutral/chunk-4OIBYSXE.mjs.map +0 -7
  392. package/dist/lib/neutral/chunk-4P3IXBLT.mjs +0 -45
  393. package/dist/lib/neutral/chunk-4P3IXBLT.mjs.map +0 -7
  394. package/dist/lib/neutral/chunk-ANHVGJI4.mjs.map +0 -7
  395. package/dist/lib/neutral/chunk-B4BASU6W.mjs.map +0 -7
  396. package/dist/lib/neutral/chunk-BNCCGLJN.mjs +0 -7
  397. package/dist/lib/neutral/chunk-BNCCGLJN.mjs.map +0 -7
  398. package/dist/lib/neutral/chunk-BVOFLCVF.mjs.map +0 -7
  399. package/dist/lib/neutral/chunk-DQYLD2RB.mjs.map +0 -7
  400. package/dist/lib/neutral/chunk-EAMSSLZC.mjs.map +0 -7
  401. package/dist/lib/neutral/chunk-G3IQMKF7.mjs.map +0 -7
  402. package/dist/lib/neutral/chunk-GZQTCRJB.mjs.map +0 -7
  403. package/dist/lib/neutral/chunk-HBUZJNZO.mjs.map +0 -7
  404. package/dist/lib/neutral/chunk-JUXPFOEI.mjs.map +0 -7
  405. package/dist/lib/neutral/chunk-MOR5ERFM.mjs.map +0 -7
  406. package/dist/lib/neutral/chunk-OMUPQMLR.mjs.map +0 -7
  407. package/dist/lib/neutral/chunk-PHU22NLC.mjs +0 -136
  408. package/dist/lib/neutral/chunk-PHU22NLC.mjs.map +0 -7
  409. package/dist/lib/neutral/chunk-ROG4RXXL.mjs +0 -97
  410. package/dist/lib/neutral/chunk-ROG4RXXL.mjs.map +0 -7
  411. package/dist/lib/neutral/chunk-T6W2LEZU.mjs +0 -125
  412. package/dist/lib/neutral/chunk-T6W2LEZU.mjs.map +0 -7
  413. package/dist/lib/neutral/chunk-TBKX6JQO.mjs.map +0 -7
  414. package/dist/lib/neutral/chunk-TU3GW67D.mjs.map +0 -7
  415. package/dist/lib/neutral/chunk-UBEZSGXY.mjs.map +0 -7
  416. package/dist/lib/neutral/chunk-UI6MWK5W.mjs.map +0 -7
  417. package/dist/lib/neutral/chunk-V36VO5SS.mjs.map +0 -7
  418. package/dist/lib/neutral/chunk-WAK4DMFV.mjs.map +0 -7
  419. package/dist/lib/neutral/chunk-YAHXAYOW.mjs +0 -56
  420. package/dist/lib/neutral/chunk-YAHXAYOW.mjs.map +0 -7
  421. package/dist/lib/neutral/chunk-YS6Q3XAD.mjs +0 -50
  422. package/dist/lib/neutral/chunk-YS6Q3XAD.mjs.map +0 -7
  423. package/dist/types/src/Extension.d.ts +0 -80
  424. package/dist/types/src/Extension.d.ts.map +0 -1
  425. package/dist/types/src/Extension.test.d.ts +0 -2
  426. package/dist/types/src/Extension.test.d.ts.map +0 -1
  427. package/dist/types/src/SchemaRegistry.d.ts +0 -84
  428. package/dist/types/src/SchemaRegistry.d.ts.map +0 -1
  429. package/dist/types/src/internal/Obj/ids.d.ts +0 -6
  430. package/dist/types/src/internal/Obj/ids.d.ts.map +0 -1
  431. package/dist/types/src/internal/Query.d.ts.map +0 -1
  432. package/dist/types/src/internal/Type/echo-schema.d.ts +0 -181
  433. package/dist/types/src/internal/Type/echo-schema.d.ts.map +0 -1
  434. package/dist/types/src/internal/Type/persistent-schema.d.ts +0 -20
  435. package/dist/types/src/internal/Type/persistent-schema.d.ts.map +0 -1
  436. package/src/Extension.test.ts +0 -235
  437. package/src/Extension.ts +0 -122
  438. package/src/SchemaRegistry.ts +0 -106
  439. package/src/internal/Obj/ids.ts +0 -12
  440. package/src/internal/Type/echo-schema.ts +0 -423
  441. package/src/internal/Type/persistent-schema.ts +0 -33
  442. /package/dist/lib/neutral/{Extension.mjs.map → Registry.mjs.map} +0 -0
  443. /package/dist/lib/neutral/{SchemaRegistry.mjs.map → Scope.mjs.map} +0 -0
  444. /package/dist/lib/neutral/{chunk-7RO7CPBZ.mjs.map → chunk-PLDMJJJC.mjs.map} +0 -0
@@ -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';
@@ -86,7 +79,7 @@ describe('EchoObjectSchema class DSL', () => {
86
79
  }
87
80
 
88
81
  {
89
- // Plain object (not a reactive proxy) - doesn't need Obj.change.
82
+ // Plain object (not a reactive proxy) - doesn't need Obj.update.
90
83
  // Note: Schema.Schema.Type generates readonly types, so we cast to mutable for plain objects.
91
84
  type Test1 = Types.Mutable<Schema.Schema.Type<typeof schema>>;
92
85
 
@@ -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,43 +4,85 @@
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
- import type * as Entity from '../../../Entity';
12
+ import type * as Tag from '../../../Tag';
13
+ import { Dictionary } from '../../Annotation/dictionary';
14
+ // `meta` is no longer re-exported from the `common/types` barrel (see ./index.ts), so importing the
15
+ // Ref schema builder here no longer forms an eval-order cycle with `Annotation`/`Database`.
16
+ import { type Ref, createEchoReferenceSchema } from '../../Ref/ref';
12
17
  import { type AnyProperties } from './base';
18
+ import { MetaId } from './model-symbols';
19
+ import { TagTypeDXN } from './well-known-types';
13
20
 
14
21
  /**
15
22
  * Property name for meta when object is serialized to JSON.
16
23
  */
17
24
  export const ATTR_META = '@meta';
18
25
 
19
- /**
20
- * Metadata section.
21
- */
22
- export const MetaId: Entity.Meta = Symbol.for('@dxos/echo/Meta') as any;
23
-
24
26
  //
25
- // ObjectMeta
27
+ // EntityMeta
26
28
  //
27
29
 
28
- // TODO(dmaretskyi): Rename to ObjectMeta
29
- export const ObjectMetaSchema = Schema.Struct({
30
+ /**
31
+ * Schema for references to {@link Tag} objects stored in {@link EntityMetaSchema.tags}.
32
+ *
33
+ * Built from the shared {@link createEchoReferenceSchema} (the same builder `Ref.Ref` uses) via
34
+ * `Schema.suspend`, so it reuses the canonical ref codec rather than duplicating it. The Tag type
35
+ * identity comes from the shared {@link TagTypeDXN} constant; `suspend` defers construction until
36
+ * first use, and `Tag` is referenced type-only, so no `Tag` value import is needed.
37
+ */
38
+ const TagRefSchema = Schema.suspend(
39
+ (): Schema.Schema<Ref<Tag.Tag>, EncodedReference> =>
40
+ // The factory yields a loosely-typed `Ref<any>` schema; narrow it to the Tag-typed ref.
41
+ createEchoReferenceSchema(undefined, DXN.getName(TagTypeDXN), DXN.getVersion(TagTypeDXN)) as Schema.Schema<
42
+ Ref<Tag.Tag>,
43
+ EncodedReference
44
+ >,
45
+ );
46
+
47
+ export const EntityMetaSchema = Schema.Struct({
30
48
  keys: Schema.Array(ForeignKey),
31
49
 
32
50
  /**
33
- * A set of tags.
34
- * Tags are arbitrary application-defined strings.
35
- * ECHO makes no assumptions about the tag structure.
51
+ * Tags applied to this entity, as references to {@link Tag} objects.
52
+ */
53
+ tags: Schema.Array(TagRefSchema),
54
+
55
+ /**
56
+ * Fully-qualified registry key for the object (FQN format, e.g. `org.example.type.foo`).
57
+ * Identifies the canonical registry entry the object instance was created from.
58
+ */
59
+ key: Schema.optional(Schema.String),
60
+
61
+ /**
62
+ * Semantic version of the registry entry the object was created from.
63
+ * Must be a valid semver string (e.g. `1.2.3`).
64
+ */
65
+ version: Schema.optional(Schema.String),
66
+
67
+ /**
68
+ * Dictionary of annotations to this entity.
69
+ */
70
+ annotations: Dictionary,
71
+
72
+ /**
73
+ * Unix ms timestamp when this entity was created.
74
+ * Read-only; sourced from the system section of the automerge document — not stored in meta.
75
+ */
76
+ createdAt: Schema.optional(Schema.Number),
77
+
78
+ /**
79
+ * Unix ms timestamp of the last automerge change on this entity's document.
80
+ * Read-only; derived from the automerge change graph — not stored in meta.
36
81
  */
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)),
82
+ updatedAt: Schema.optional(Schema.Number),
41
83
  });
42
84
 
43
- export type ObjectMeta = Schema.Schema.Type<typeof ObjectMetaSchema>;
85
+ export type EntityMeta = Schema.Schema.Type<typeof EntityMetaSchema>;
44
86
 
45
87
  /*
46
88
  * Get metadata from object.
@@ -49,9 +91,9 @@ export type ObjectMeta = Schema.Schema.Type<typeof ObjectMetaSchema>;
49
91
  * @internal (use Obj.getMeta or Relation.getMeta)
50
92
  */
51
93
  // TODO(burdon): Refine type to BaseObj.
52
- export const getMeta = (obj: AnyProperties): ObjectMeta => {
94
+ export const getMeta = (obj: AnyProperties): EntityMeta => {
53
95
  const metadata = (obj as any)[MetaId];
54
- invariant(metadata, 'ObjectMeta not found.');
96
+ invariant(metadata, 'EntityMeta not found.');
55
97
  return metadata;
56
98
  };
57
99
 
@@ -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.
@@ -67,3 +79,11 @@ export const RelationTargetId: unique symbol = Symbol.for('@dxos/echo/RelationTa
67
79
  * Used to access relation target DXN on live ECHO objects.
68
80
  */
69
81
  export const RelationTargetDXNId: unique symbol = Symbol.for('@dxos/echo/RelationTargetDXN');
82
+
83
+ /**
84
+ * Symbol carrying the entity metadata (EntityMeta) on live ECHO entities.
85
+ * Must be importable by both meta.ts (which depends on the Ref schema) and
86
+ * Entity/api.ts (which is transitively imported by the Ref schema), so it
87
+ * cannot live in either of those files without creating an import cycle.
88
+ */
89
+ export const MetaId = Symbol.for('@dxos/echo/Meta');
@@ -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');
@@ -2,9 +2,6 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- // TODO(burdon): Import directly (not part of ECHO API).
6
- export { JsonPath, JsonProp, getValue, splitJsonPath } from '@dxos/effect';
7
-
8
5
  export * from './Annotation';
9
6
  export * from './common';
10
7
  export * from './Entity';
@@ -12,6 +9,11 @@ export * from './Format';
12
9
  export * from './JsonSchema';
13
10
  // TODO(wittjosiah): Required to ensure types are portable (need to export all types required for downstream inference).
14
11
  export * from './Obj';
15
- export * from './Query';
12
+ export { prettyFilter, prettyQuery } from './Query/pretty';
16
13
  export * from './Ref';
17
14
  export * from './Type';
15
+
16
+ // Re-exported here (not from the low-level `common/types` barrel) so consumers keep importing meta
17
+ // from `@dxos/echo/internal`, while that barrel stays free of the Ref/Annotation eval cycle. Placed
18
+ // after `./Ref` so the ref schema `meta` depends on is initialized first.
19
+ 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
 
@@ -2,6 +2,7 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
+ export * from './registry';
5
6
  export * from './test-data';
6
7
  export * from './test-schema';
7
8
  export * from './util';
@@ -0,0 +1,44 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import * as Atom from '@effect-atom/atom/Atom';
6
+ import * as Layer from 'effect/Layer';
7
+
8
+ import { Event } from '@dxos/async';
9
+
10
+ import * as Registry from '../Registry';
11
+
12
+ /**
13
+ * Noop `Registry.Service` layer for testing — always returns empty query results.
14
+ * Use this in test layer stacks that require `Registry.Service` but don't need
15
+ * actual registry contents.
16
+ */
17
+ export const registryLayerNoop: Layer.Layer<Registry.Service> = Layer.succeed(Registry.Service, {
18
+ [Registry.TypeId]: Registry.TypeId,
19
+ id: 'noop-registry',
20
+ changed: new Event<void>(),
21
+ local: [],
22
+ add: () => {},
23
+ remove: () => false,
24
+ clear: () => {},
25
+ get: () => undefined,
26
+ getByURI: () => undefined,
27
+ list: () => [],
28
+ // QueryFn is an overloaded interface — a single generic function cannot satisfy both overload
29
+ // signatures without a cast. This is the intentional type-system boundary.
30
+ query: ((_queryOrFilter: unknown) => ({
31
+ results: [],
32
+ entries: [],
33
+ run: async () => [],
34
+ runEntries: async () => [],
35
+ runSync: () => [],
36
+ runSyncEntries: () => [],
37
+ first: async (): Promise<never> => {
38
+ throw new Error('registryLayerNoop: registry is empty');
39
+ },
40
+ firstOrUndefined: async () => undefined,
41
+ subscribe: () => () => {},
42
+ atom: Atom.make((): never[] => []),
43
+ })) as Registry.Registry['query'],
44
+ } satisfies Registry.Registry);