@dxos/echo 0.10.0 → 0.11.0

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 (274) hide show
  1. package/dist/lib/Annotation.mjs +3 -0
  2. package/dist/lib/Blob.mjs +160 -0
  3. package/dist/lib/Blob.mjs.map +1 -0
  4. package/dist/lib/Database.mjs +2 -0
  5. package/dist/lib/Entity.mjs +231 -0
  6. package/dist/lib/Entity.mjs.map +1 -0
  7. package/dist/lib/Err.mjs +105 -0
  8. package/dist/lib/Err.mjs.map +1 -0
  9. package/dist/lib/Feed.mjs +338 -0
  10. package/dist/lib/Feed.mjs.map +1 -0
  11. package/dist/lib/Filter.mjs +380 -0
  12. package/dist/lib/Filter.mjs.map +1 -0
  13. package/dist/lib/Format.mjs +47 -0
  14. package/dist/lib/Format.mjs.map +1 -0
  15. package/dist/lib/JsonSchema.mjs +21 -0
  16. package/dist/lib/JsonSchema.mjs.map +1 -0
  17. package/dist/lib/Key.mjs +15 -0
  18. package/dist/lib/Key.mjs.map +1 -0
  19. package/dist/lib/Migration.mjs +38 -0
  20. package/dist/lib/Migration.mjs.map +1 -0
  21. package/dist/lib/Obj.mjs +660 -0
  22. package/dist/lib/Obj.mjs.map +1 -0
  23. package/dist/lib/Order.mjs +65 -0
  24. package/dist/lib/Order.mjs.map +1 -0
  25. package/dist/lib/Query.mjs +336 -0
  26. package/dist/lib/Query.mjs.map +1 -0
  27. package/dist/lib/QueryResult.mjs +7 -0
  28. package/dist/lib/QueryResult.mjs.map +1 -0
  29. package/dist/lib/Ref.mjs +44 -0
  30. package/dist/lib/Ref.mjs.map +1 -0
  31. package/dist/lib/Registry.mjs +35 -0
  32. package/dist/lib/Registry.mjs.map +1 -0
  33. package/dist/lib/Relation.mjs +397 -0
  34. package/dist/lib/Relation.mjs.map +1 -0
  35. package/dist/lib/Scope.mjs +51 -0
  36. package/dist/lib/Scope.mjs.map +1 -0
  37. package/dist/lib/Tag.mjs +70 -0
  38. package/dist/lib/Tag.mjs.map +1 -0
  39. package/dist/lib/Text.mjs +82 -0
  40. package/dist/lib/Text.mjs.map +1 -0
  41. package/dist/lib/Type.mjs +371 -0
  42. package/dist/lib/Type.mjs.map +1 -0
  43. package/dist/lib/chunk-Annotation.mjs +221 -0
  44. package/dist/lib/chunk-Annotation.mjs.map +1 -0
  45. package/dist/lib/chunk-Database.mjs +918 -0
  46. package/dist/lib/chunk-Database.mjs.map +1 -0
  47. package/dist/lib/chunk-atom-snapshot.mjs +249 -0
  48. package/dist/lib/chunk-atom-snapshot.mjs.map +1 -0
  49. package/dist/lib/chunk-internal.mjs +2775 -0
  50. package/dist/lib/chunk-internal.mjs.map +1 -0
  51. package/dist/lib/chunk-json-schema.mjs +660 -0
  52. package/dist/lib/chunk-json-schema.mjs.map +1 -0
  53. package/dist/lib/chunk-number.mjs +164 -0
  54. package/dist/lib/chunk-number.mjs.map +1 -0
  55. package/dist/lib/chunk-ref-array.mjs +31 -0
  56. package/dist/lib/chunk-ref-array.mjs.map +1 -0
  57. package/dist/lib/chunk-ref.mjs +590 -0
  58. package/dist/lib/chunk-ref.mjs.map +1 -0
  59. package/dist/lib/chunk-rolldown-runtime.mjs +13 -0
  60. package/dist/lib/chunk-select.mjs +186 -0
  61. package/dist/lib/chunk-select.mjs.map +1 -0
  62. package/dist/lib/chunk-src.mjs +234 -0
  63. package/dist/lib/chunk-src.mjs.map +1 -0
  64. package/dist/lib/chunk-util.mjs +140 -0
  65. package/dist/lib/chunk-util.mjs.map +1 -0
  66. package/dist/lib/index.mjs +24 -0
  67. package/dist/lib/internal.mjs +10 -0
  68. package/dist/lib/testing.mjs +346 -0
  69. package/dist/lib/testing.mjs.map +1 -0
  70. package/dist/types/src/Aggregate.d.ts +86 -0
  71. package/dist/types/src/Aggregate.d.ts.map +1 -0
  72. package/dist/types/src/Blob.d.ts +153 -0
  73. package/dist/types/src/Blob.d.ts.map +1 -0
  74. package/dist/types/src/Blob.test.d.ts +2 -0
  75. package/dist/types/src/Blob.test.d.ts.map +1 -0
  76. package/dist/types/src/Database.d.ts +153 -4
  77. package/dist/types/src/Database.d.ts.map +1 -1
  78. package/dist/types/src/Err.d.ts +116 -0
  79. package/dist/types/src/Err.d.ts.map +1 -1
  80. package/dist/types/src/Feed.d.ts +116 -28
  81. package/dist/types/src/Feed.d.ts.map +1 -1
  82. package/dist/types/src/Feed.test.d.ts +2 -0
  83. package/dist/types/src/Feed.test.d.ts.map +1 -0
  84. package/dist/types/src/Filter.d.ts +14 -6
  85. package/dist/types/src/Filter.d.ts.map +1 -1
  86. package/dist/types/src/Hypergraph.d.ts +18 -0
  87. package/dist/types/src/Hypergraph.d.ts.map +1 -1
  88. package/dist/types/src/Json.d.ts.map +1 -1
  89. package/dist/types/src/Obj.d.ts +14 -1
  90. package/dist/types/src/Obj.d.ts.map +1 -1
  91. package/dist/types/src/Order.d.ts +9 -3
  92. package/dist/types/src/Order.d.ts.map +1 -1
  93. package/dist/types/src/Query.d.ts +107 -26
  94. package/dist/types/src/Query.d.ts.map +1 -1
  95. package/dist/types/src/Relation.d.ts +6 -0
  96. package/dist/types/src/Relation.d.ts.map +1 -1
  97. package/dist/types/src/Type.d.ts.map +1 -1
  98. package/dist/types/src/View.d.ts +1 -1
  99. package/dist/types/src/index.d.ts +2 -0
  100. package/dist/types/src/index.d.ts.map +1 -1
  101. package/dist/types/src/internal/Entity/api.d.ts +6 -0
  102. package/dist/types/src/internal/Entity/api.d.ts.map +1 -1
  103. package/dist/types/src/internal/Entity/model.d.ts +3 -2
  104. package/dist/types/src/internal/Entity/model.d.ts.map +1 -1
  105. package/dist/types/src/internal/Filter/match.d.ts.map +1 -1
  106. package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts +34 -8
  107. package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts.map +1 -1
  108. package/dist/types/src/internal/JsonSchema/json-schema.d.ts.map +1 -1
  109. package/dist/types/src/internal/Obj/atoms.d.ts.map +1 -1
  110. package/dist/types/src/internal/Obj/json-serializer.d.ts.map +1 -1
  111. package/dist/types/src/internal/Query/pretty.d.ts.map +1 -1
  112. package/dist/types/src/internal/Query/query-result-effect.d.ts.map +1 -1
  113. package/dist/types/src/internal/common/proxy/make-object.d.ts +13 -0
  114. package/dist/types/src/internal/common/proxy/make-object.d.ts.map +1 -1
  115. package/dist/types/src/internal/common/proxy/reactive.d.ts.map +1 -1
  116. package/dist/types/src/internal/common/proxy/symbols.d.ts.map +1 -1
  117. package/dist/types/src/internal/common/proxy/typed-handler.d.ts +12 -0
  118. package/dist/types/src/internal/common/proxy/typed-handler.d.ts.map +1 -1
  119. package/dist/types/src/internal/common/types/index.d.ts +1 -0
  120. package/dist/types/src/internal/common/types/index.d.ts.map +1 -1
  121. package/dist/types/src/internal/common/types/model-symbols.d.ts +5 -0
  122. package/dist/types/src/internal/common/types/model-symbols.d.ts.map +1 -1
  123. package/dist/types/src/internal/common/types/projection.d.ts +32 -0
  124. package/dist/types/src/internal/common/types/projection.d.ts.map +1 -0
  125. package/dist/types/tsconfig.tsbuildinfo +1 -1
  126. package/package.json +40 -35
  127. package/src/Aggregate.ts +105 -0
  128. package/src/Blob.test.ts +45 -0
  129. package/src/Blob.ts +205 -0
  130. package/src/Database.ts +207 -17
  131. package/src/Err.ts +36 -0
  132. package/src/Feed.test.ts +188 -0
  133. package/src/Feed.ts +238 -62
  134. package/src/Filter.ts +28 -10
  135. package/src/Hypergraph.ts +18 -0
  136. package/src/Json.ts +1 -0
  137. package/src/Obj.test.ts +2 -2
  138. package/src/Obj.ts +21 -1
  139. package/src/Order.ts +16 -9
  140. package/src/Query.test.ts +319 -2
  141. package/src/Query.ts +165 -51
  142. package/src/Relation.ts +14 -0
  143. package/src/Type.ts +5 -6
  144. package/src/index.ts +2 -0
  145. package/src/internal/Entity/api.ts +11 -1
  146. package/src/internal/Entity/model.ts +3 -0
  147. package/src/internal/Filter/match.ts +30 -1
  148. package/src/internal/JsonSchema/json-schema-type.ts +14 -2
  149. package/src/internal/JsonSchema/json-schema.test.ts +28 -1
  150. package/src/internal/JsonSchema/json-schema.ts +33 -6
  151. package/src/internal/Obj/atoms.ts +4 -2
  152. package/src/internal/Obj/json-serializer.test.ts +162 -2
  153. package/src/internal/Obj/json-serializer.ts +6 -0
  154. package/src/internal/Query/pretty.ts +19 -1
  155. package/src/internal/Query/query-result-effect.ts +2 -4
  156. package/src/internal/Ref/atoms.ts +1 -1
  157. package/src/internal/common/proxy/change-context.ts +1 -1
  158. package/src/internal/common/proxy/make-object.ts +42 -3
  159. package/src/internal/common/proxy/reactive.ts +5 -0
  160. package/src/internal/common/proxy/symbols.ts +1 -0
  161. package/src/internal/common/proxy/typed-handler.ts +71 -29
  162. package/src/internal/common/types/index.ts +1 -0
  163. package/src/internal/common/types/model-symbols.ts +6 -0
  164. package/src/internal/common/types/projection.ts +45 -0
  165. package/src/testing/test-data.ts +14 -14
  166. package/dist/lib/neutral/Annotation.mjs +0 -90
  167. package/dist/lib/neutral/Annotation.mjs.map +0 -7
  168. package/dist/lib/neutral/Database.mjs +0 -42
  169. package/dist/lib/neutral/Database.mjs.map +0 -7
  170. package/dist/lib/neutral/Entity.mjs +0 -76
  171. package/dist/lib/neutral/Entity.mjs.map +0 -7
  172. package/dist/lib/neutral/Err.mjs +0 -16
  173. package/dist/lib/neutral/Err.mjs.map +0 -7
  174. package/dist/lib/neutral/Feed.mjs +0 -50
  175. package/dist/lib/neutral/Feed.mjs.map +0 -7
  176. package/dist/lib/neutral/Filter.mjs +0 -72
  177. package/dist/lib/neutral/Filter.mjs.map +0 -7
  178. package/dist/lib/neutral/Format.mjs +0 -82
  179. package/dist/lib/neutral/Format.mjs.map +0 -7
  180. package/dist/lib/neutral/JsonSchema.mjs +0 -18
  181. package/dist/lib/neutral/JsonSchema.mjs.map +0 -7
  182. package/dist/lib/neutral/Key.mjs +0 -16
  183. package/dist/lib/neutral/Key.mjs.map +0 -7
  184. package/dist/lib/neutral/Migration.mjs +0 -18
  185. package/dist/lib/neutral/Migration.mjs.map +0 -7
  186. package/dist/lib/neutral/Obj.mjs +0 -128
  187. package/dist/lib/neutral/Obj.mjs.map +0 -7
  188. package/dist/lib/neutral/Order.mjs +0 -16
  189. package/dist/lib/neutral/Order.mjs.map +0 -7
  190. package/dist/lib/neutral/Query.mjs +0 -38
  191. package/dist/lib/neutral/Query.mjs.map +0 -7
  192. package/dist/lib/neutral/QueryResult.mjs +0 -2
  193. package/dist/lib/neutral/QueryResult.mjs.map +0 -7
  194. package/dist/lib/neutral/Ref.mjs +0 -25
  195. package/dist/lib/neutral/Ref.mjs.map +0 -7
  196. package/dist/lib/neutral/Registry.mjs +0 -14
  197. package/dist/lib/neutral/Registry.mjs.map +0 -7
  198. package/dist/lib/neutral/Relation.mjs +0 -97
  199. package/dist/lib/neutral/Relation.mjs.map +0 -7
  200. package/dist/lib/neutral/Scope.mjs +0 -12
  201. package/dist/lib/neutral/Scope.mjs.map +0 -7
  202. package/dist/lib/neutral/Tag.mjs +0 -32
  203. package/dist/lib/neutral/Tag.mjs.map +0 -7
  204. package/dist/lib/neutral/Text.mjs +0 -25
  205. package/dist/lib/neutral/Text.mjs.map +0 -7
  206. package/dist/lib/neutral/Type.mjs +0 -65
  207. package/dist/lib/neutral/Type.mjs.map +0 -7
  208. package/dist/lib/neutral/chunk-2HKGAQM4.mjs +0 -1394
  209. package/dist/lib/neutral/chunk-2HKGAQM4.mjs.map +0 -7
  210. package/dist/lib/neutral/chunk-2ZHECXUR.mjs +0 -95
  211. package/dist/lib/neutral/chunk-2ZHECXUR.mjs.map +0 -7
  212. package/dist/lib/neutral/chunk-3KTE2Y7Q.mjs +0 -336
  213. package/dist/lib/neutral/chunk-3KTE2Y7Q.mjs.map +0 -7
  214. package/dist/lib/neutral/chunk-3TN2VMI4.mjs +0 -714
  215. package/dist/lib/neutral/chunk-3TN2VMI4.mjs.map +0 -7
  216. package/dist/lib/neutral/chunk-42L4HJ3Z.mjs +0 -104
  217. package/dist/lib/neutral/chunk-42L4HJ3Z.mjs.map +0 -7
  218. package/dist/lib/neutral/chunk-4A2NWKRJ.mjs +0 -747
  219. package/dist/lib/neutral/chunk-4A2NWKRJ.mjs.map +0 -7
  220. package/dist/lib/neutral/chunk-7LOUAPYZ.mjs +0 -25
  221. package/dist/lib/neutral/chunk-7LOUAPYZ.mjs.map +0 -7
  222. package/dist/lib/neutral/chunk-ACFAOTKJ.mjs +0 -1531
  223. package/dist/lib/neutral/chunk-ACFAOTKJ.mjs.map +0 -7
  224. package/dist/lib/neutral/chunk-BEFR7LEA.mjs +0 -170
  225. package/dist/lib/neutral/chunk-BEFR7LEA.mjs.map +0 -7
  226. package/dist/lib/neutral/chunk-BXIKXT7Q.mjs +0 -89
  227. package/dist/lib/neutral/chunk-BXIKXT7Q.mjs.map +0 -7
  228. package/dist/lib/neutral/chunk-C57XMMBY.mjs +0 -206
  229. package/dist/lib/neutral/chunk-C57XMMBY.mjs.map +0 -7
  230. package/dist/lib/neutral/chunk-C62JYFAD.mjs +0 -183
  231. package/dist/lib/neutral/chunk-C62JYFAD.mjs.map +0 -7
  232. package/dist/lib/neutral/chunk-FSGX2R62.mjs +0 -48
  233. package/dist/lib/neutral/chunk-FSGX2R62.mjs.map +0 -7
  234. package/dist/lib/neutral/chunk-HBXT3GSB.mjs +0 -459
  235. package/dist/lib/neutral/chunk-HBXT3GSB.mjs.map +0 -7
  236. package/dist/lib/neutral/chunk-IQR45HAD.mjs +0 -31
  237. package/dist/lib/neutral/chunk-IQR45HAD.mjs.map +0 -7
  238. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +0 -10
  239. package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +0 -7
  240. package/dist/lib/neutral/chunk-KCBW4BR6.mjs +0 -424
  241. package/dist/lib/neutral/chunk-KCBW4BR6.mjs.map +0 -7
  242. package/dist/lib/neutral/chunk-L3E5IXAE.mjs +0 -575
  243. package/dist/lib/neutral/chunk-L3E5IXAE.mjs.map +0 -7
  244. package/dist/lib/neutral/chunk-PRC4FEKJ.mjs +0 -56
  245. package/dist/lib/neutral/chunk-PRC4FEKJ.mjs.map +0 -7
  246. package/dist/lib/neutral/chunk-SCT6FFCR.mjs +0 -351
  247. package/dist/lib/neutral/chunk-SCT6FFCR.mjs.map +0 -7
  248. package/dist/lib/neutral/chunk-TOCVVFK2.mjs +0 -75
  249. package/dist/lib/neutral/chunk-TOCVVFK2.mjs.map +0 -7
  250. package/dist/lib/neutral/chunk-U53LSQQA.mjs +0 -41
  251. package/dist/lib/neutral/chunk-U53LSQQA.mjs.map +0 -7
  252. package/dist/lib/neutral/chunk-UGFFV2FR.mjs +0 -27
  253. package/dist/lib/neutral/chunk-UGFFV2FR.mjs.map +0 -7
  254. package/dist/lib/neutral/chunk-UWLP4RFM.mjs +0 -7
  255. package/dist/lib/neutral/chunk-UWLP4RFM.mjs.map +0 -7
  256. package/dist/lib/neutral/chunk-UZHCQ6NI.mjs +0 -283
  257. package/dist/lib/neutral/chunk-UZHCQ6NI.mjs.map +0 -7
  258. package/dist/lib/neutral/chunk-WISOH2XH.mjs +0 -36
  259. package/dist/lib/neutral/chunk-WISOH2XH.mjs.map +0 -7
  260. package/dist/lib/neutral/chunk-WKIT2YY5.mjs +0 -34
  261. package/dist/lib/neutral/chunk-WKIT2YY5.mjs.map +0 -7
  262. package/dist/lib/neutral/chunk-XB6ISRAO.mjs +0 -271
  263. package/dist/lib/neutral/chunk-XB6ISRAO.mjs.map +0 -7
  264. package/dist/lib/neutral/chunk-XXL42WCB.mjs +0 -84
  265. package/dist/lib/neutral/chunk-XXL42WCB.mjs.map +0 -7
  266. package/dist/lib/neutral/chunk-XXWK4J53.mjs +0 -117
  267. package/dist/lib/neutral/chunk-XXWK4J53.mjs.map +0 -7
  268. package/dist/lib/neutral/index.mjs +0 -115
  269. package/dist/lib/neutral/index.mjs.map +0 -7
  270. package/dist/lib/neutral/internal/index.mjs +0 -581
  271. package/dist/lib/neutral/internal/index.mjs.map +0 -7
  272. package/dist/lib/neutral/meta.json +0 -1
  273. package/dist/lib/neutral/testing/index.mjs +0 -477
  274. package/dist/lib/neutral/testing/index.mjs.map +0 -7
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-internal.mjs","names":[],"sources":["../../src/internal/common/types/base.ts","../../src/internal/common/types/projection.ts","../../src/internal/common/types/version.ts","../../src/internal/Annotation/sorting.ts","../../src/internal/Entity/model.ts","../../src/internal/Query/pretty.ts","../../src/internal/common/proxy/define-hidden-property.ts","../../src/internal/Ref/strong-deps.ts","../../src/internal/common/proxy/json-serializer.ts","../../src/internal/common/proxy/event-batch.ts","../../src/internal/common/proxy/change-context.ts","../../src/internal/common/proxy/errors.ts","../../src/internal/common/proxy/ownership.ts","../../src/internal/common/proxy/proxy-types.ts","../../src/internal/common/proxy/reactive-array.ts","../../src/internal/common/proxy/schema-validator.ts","../../src/internal/common/proxy/typed-handler.ts","../../src/internal/common/proxy/make-object.ts","../../src/internal/Entity/entity.ts","../../src/internal/JsonSchema/json-schema-normalize.ts","../../src/internal/Entity/object.ts","../../src/internal/Entity/relation.ts","../../src/internal/Entity/type-kind.ts","../../src/internal/Entity/version.ts","../../src/internal/Obj/json-serializer.ts","../../src/internal/Filter/match.ts","../../src/internal/Obj/common.ts","../../src/internal/Obj/inspect.ts","../../src/internal/Obj/create-object.ts","../../src/internal/Obj/deleted.ts","../../src/internal/Obj/set-value.ts","../../src/internal/Obj/snapshot.ts","../../src/internal/Obj/atoms.ts","../../src/internal/Obj/clone.ts","../../src/internal/Type/manipulation.ts","../../src/internal/Type/type-schema.ts"],"sourcesContent":["//\n// Copyright 2024 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\nimport * as SchemaAST from 'effect/SchemaAST';\n\nimport { type EntityId } from '@dxos/keys';\n\nimport { type ATTR_META, type EntityMeta } from './meta';\n\n/**\n * Base type for all data objects (reactive, ECHO, and other raw objects).\n * NOTE: This describes the base type for all database objects.\n * It is stricter than `T extends {}` or `T extends object`.\n */\n// TODO(burdon): Prefer Record<string, unknown>.\nexport type AnyProperties = Record<string, any>;\n\n/**\n * Canonical type for all ECHO entities (objects and relations).\n * @depreacted Remove, use Entity.Unknown instead.\n */\n// TODO(wittjosiah): Remove. Prefer higher level types (e.g. Entity.Unknown).\nexport interface AnyEntity {\n readonly id: EntityId;\n}\n\nexport type ExcludeId<T extends AnyProperties> = Omit<T, 'id'>;\n\nexport type PropertyKey<T extends AnyProperties> = Extract<keyof ExcludeId<T>, string>;\n\n// TODO(dmaretskyi): Remove. This should be using the symbol type.\ntype WithMeta = { [ATTR_META]?: EntityMeta };\n\n/**\n * The raw object should not include the ECHO id, but may include metadata.\n */\nexport const RawObject = <S extends Schema.Schema.AnyNoContext>(\n schema: S,\n): Schema.Schema<ExcludeId<Schema.Schema.Type<S>> & WithMeta, Schema.Schema.Encoded<S>> => {\n return Schema.make(SchemaAST.omit(schema.ast, ['id']));\n};\n","//\n// Copyright 2026 DXOS.org\n//\n\nimport type * as Types from 'effect/Types';\n\nimport { type QueryAST } from '@dxos/echo-protocol';\n\n/**\n * Brand for a query projected to a single scalar property (`Query.project`), consumed by\n * `Filter.in` to build a subquery-membership predicate — an uncorrelated\n * `col IN (SELECT property FROM ...)` semi-join. Defined in common/ (not in Query/) so\n * Filter.ts can recognize the brand without importing Query.ts as a value: Query.ts already\n * imports Filter.ts as a value, so a reverse value import would create a cycle. Both\n * Filter.ts and Query.ts import this shared leaf module instead.\n *\n * A string-literal id (not a `Symbol.for`), matching `FilterTypeId`/`QueryTypeId`/`OrderTypeId` —\n * this lets the sandboxed `query-lite` mirror (which cannot import `@dxos/echo`'s runtime) declare\n * its own local constant with the same literal and construct structurally-compatible objects,\n * the same way it already does for those brands.\n */\nexport const ProjectionTypeId = '~@dxos/echo/Query.Projection' as const;\nexport type ProjectionTypeId = typeof ProjectionTypeId;\n\n/**\n * `V` is the projected property's value type — carried only as a phantom brand (like\n * `Filter<T>`'s `[FilterTypeId]: { value: Types.Covariant<T> }`) so `Filter.in(query.project(k))`\n * infers its own type parameter from the projected property instead of defaulting to `unknown`.\n */\nexport interface Projection<V = unknown> {\n readonly [ProjectionTypeId]: { value: Types.Covariant<V> };\n readonly query: QueryAST.Query;\n readonly property: string;\n}\n\nexport const isProjection = (value: unknown): value is Projection =>\n typeof value === 'object' && value !== null && ProjectionTypeId in value;\n\nconst variance: Projection<any>[ProjectionTypeId] = {} as Projection<any>[ProjectionTypeId];\n\nexport const makeProjection = <V>(query: QueryAST.Query, property: string): Projection<V> => ({\n [ProjectionTypeId]: variance,\n query,\n property,\n});\n","//\n// Copyright 2025 DXOS.org\n//\n\n/**\n * Version type identifier.\n */\nexport const VersionTypeId = '~@dxos/echo/VersionTypeId' as const;\nexport type VersionTypeId = typeof VersionTypeId;\n\n/**\n * Represents the object version.\n * May be backed by Automerge.\n * Objects with no history are not versioned.\n */\nexport interface Version {\n [VersionTypeId]: {};\n automergeHeads?: string[];\n}\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport type { AnyEntity } from '../common/types';\nimport { getLabel, getTypename } from './annotations';\n\n/**\n * String comparison helper for sorting.\n */\nexport const compare = (a?: string, b?: string): number => {\n if (a == null) {\n return b == null ? 0 : 1;\n }\n if (b == null) {\n return -1;\n }\n return a.localeCompare(b);\n};\n\n/**\n * Comparator function type for sorting entities.\n * Accepts both reactive entities and snapshots.\n */\nexport type Comparator<T extends AnyEntity = AnyEntity> = (a: T, b: T) => number;\n\n/**\n * Sort entities by label.\n */\nexport const sortByLabel: Comparator = (a: AnyEntity, b: AnyEntity) => compare(getLabel(a), getLabel(b));\n\n/**\n * Sort entities by typename.\n */\nexport const sortByTypename: Comparator = (a: AnyEntity, b: AnyEntity) => compare(getTypename(a), getTypename(b));\n\n/**\n * Compose multiple comparators into one.\n * Applies comparators in order until one returns non-zero.\n */\nexport const sort = <T extends AnyEntity>(...comparators: Comparator<T>[]): Comparator<T> => {\n return (a: T, b: T) => {\n for (const comparator of comparators) {\n const result = comparator(a, b);\n if (result !== 0) {\n return result;\n }\n }\n return 0;\n };\n};\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport type * as Schema from 'effect/Schema';\n\nimport { type ForeignKey } from '@dxos/echo-protocol';\nimport { invariant } from '@dxos/invariant';\nimport { EID, EntityId, type URI } from '@dxos/keys';\nimport { assumeType } from '@dxos/util';\n\nimport type * as Database from '../../Database';\nimport {\n ATTR_DELETED,\n type ATTR_PARENT,\n ATTR_RELATION_SOURCE,\n ATTR_RELATION_TARGET,\n ATTR_SELF_URI,\n ATTR_SELF_URI_LEGACY,\n type ATTR_TYPE,\n EntityKind,\n KindId,\n ObjectBranchId,\n ObjectDatabaseId,\n ObjectDeletedId,\n ObjectVersionId,\n type ParentId,\n RelationSourceDXNId,\n RelationSourceId,\n RelationTargetDXNId,\n RelationTargetId,\n type SchemaId,\n SelfURIId,\n TypeId,\n type Version,\n} from '../common/types';\nimport { type ATTR_META, type EntityMeta } from '../common/types/meta';\nimport { type MetaId } from '../common/types/model-symbols';\n\nexport {\n ATTR_DELETED,\n ATTR_SELF_URI,\n ATTR_SELF_URI_LEGACY,\n ObjectBranchId,\n ObjectDatabaseId,\n ObjectDeletedId,\n ObjectVersionId,\n SelfURIId,\n};\n\n/**\n * Internal runtime representation of an object.\n * The fields are accessed through getter functions.\n */\n// NOTE: Each symbol has a jsdoc describing its purpose.\nexport interface InternalObjectProps {\n readonly id: EntityId;\n readonly [SelfURIId]: EID.EID;\n readonly [KindId]: EntityKind;\n readonly [SchemaId]: Schema.Schema.AnyNoContext;\n readonly [TypeId]: URI.URI;\n readonly [MetaId]?: EntityMeta;\n [ParentId]?: InternalObjectProps;\n readonly [ObjectDatabaseId]?: Database.Database;\n readonly [ObjectBranchId]?: string;\n readonly [ObjectDeletedId]?: boolean;\n readonly [ObjectVersionId]?: Version;\n readonly [RelationSourceDXNId]?: EID.EID;\n readonly [RelationTargetDXNId]?: EID.EID;\n readonly [RelationSourceId]?: InternalObjectProps;\n readonly [RelationTargetId]?: InternalObjectProps;\n}\n\n/**\n * Entity metadata.\n */\nexport interface EntityMetaJSON {\n keys: ForeignKey[];\n tags?: string[];\n key?: string;\n version?: string;\n}\n\n/**\n * JSON representation of an object or relation metadata.\n */\nexport interface ObjectJSON {\n id: EntityId;\n [ATTR_TYPE]?: URI.URI;\n [ATTR_SELF_URI]?: EID.EID;\n [ATTR_PARENT]?: EID.EID; // Encoded reference\n [ATTR_DELETED]?: boolean;\n [ATTR_META]?: EntityMetaJSON;\n [ATTR_RELATION_SOURCE]?: EID.EID;\n [ATTR_RELATION_TARGET]?: EID.EID;\n\n /**\n * Application-specific properties.\n */\n [key: string]: unknown;\n}\n\n/**\n * NOTE: Keep as `function` to avoid type inference issues.\n */\nexport function assertObjectModel(obj: unknown): asserts obj is InternalObjectProps {\n invariant(typeof obj === 'object' && obj !== null, 'Invalid object model: not an object');\n assumeType<InternalObjectProps>(obj);\n invariant(EntityId.isValid(obj.id), 'Invalid object model: invalid id');\n invariant(obj[TypeId] === undefined || typeof obj[TypeId] === 'string', 'Invalid object model: invalid type');\n invariant(\n obj[KindId] === EntityKind.Object || obj[KindId] === EntityKind.Relation || obj[KindId] === EntityKind.Type,\n 'Invalid object model: invalid entity kind',\n );\n\n if (obj[KindId] === EntityKind.Relation) {\n invariant(EID.isEID(obj[RelationSourceDXNId]), 'Invalid object model: invalid relation source');\n invariant(EID.isEID(obj[RelationTargetDXNId]), 'Invalid object model: invalid relation target');\n invariant(!EID.isEID(obj[RelationSourceId]), 'Invalid object model: source pointer is a DXN');\n invariant(!EID.isEID(obj[RelationTargetId]), 'Invalid object model: target pointer is a DXN');\n }\n}\n","//\n// Copyright 2024 DXOS.org\n//\n\nimport { type QueryAST } from '@dxos/echo-protocol';\n\n/**\n * Returns a human-readable string representation of a Filter AST.\n */\nexport const prettyFilter = (filter: QueryAST.Filter): string => {\n switch (filter.type) {\n case 'object': {\n // A type-less object filter with only a meta-key constraint is `Filter.key(...)`.\n if (\n filter.typename === null &&\n (filter.id === undefined || filter.id.length === 0) &&\n Object.keys(filter.props).length === 0 &&\n (filter.foreignKeys === undefined || filter.foreignKeys.length === 0) &&\n filter.metaKey !== undefined\n ) {\n return filter.metaVersion !== undefined\n ? `Filter.key(${JSON.stringify(filter.metaKey)}, { version: ${JSON.stringify(filter.metaVersion)} })`\n : `Filter.key(${JSON.stringify(filter.metaKey)})`;\n }\n const parts: string[] = [];\n if (filter.typename !== null) {\n parts.push(String(filter.typename));\n }\n if (filter.id !== undefined && filter.id.length > 0) {\n parts.push(`id: [${filter.id.join(', ')}]`);\n }\n const propEntries = Object.entries(filter.props);\n if (propEntries.length > 0) {\n const propsStr = propEntries.map(([k, v]) => `${k}: ${prettyFilter(v)}`).join(', ');\n parts.push(`{ ${propsStr} }`);\n }\n if (filter.foreignKeys !== undefined && filter.foreignKeys.length > 0) {\n parts.push(`foreignKeys: [${filter.foreignKeys.map((fk) => JSON.stringify(fk)).join(', ')}]`);\n }\n if (filter.metaKey !== undefined) {\n parts.push(\n filter.metaVersion !== undefined\n ? `metaKey: ${JSON.stringify(filter.metaKey)} (${filter.metaVersion})`\n : `metaKey: ${JSON.stringify(filter.metaKey)}`,\n );\n }\n return parts.length > 0 ? `Filter.type(${parts.join(', ')})` : 'Filter.everything()';\n }\n case 'compare':\n return `Filter.${filter.operator}(${JSON.stringify(filter.value)})`;\n case 'in':\n return `Filter.in([${filter.values.map((v) => JSON.stringify(v)).join(', ')}])`;\n case 'in-query':\n return `Filter.in(${prettyQuery(filter.subquery)}.project(${JSON.stringify(filter.property)}))`;\n case 'contains':\n return `Filter.contains(${JSON.stringify(filter.value)})`;\n case 'tag':\n return `Filter.tag(${JSON.stringify(filter.tag)})`;\n case 'range':\n return `Filter.range(${JSON.stringify(filter.from)}, ${JSON.stringify(filter.to)})`;\n case 'text-search':\n return filter.searchKind\n ? `Filter.textSearch(${JSON.stringify(filter.text)}, ${JSON.stringify(filter.searchKind)})`\n : `Filter.textSearch(${JSON.stringify(filter.text)})`;\n case 'timestamp':\n return `Filter.${filter.field}.${filter.operator}(${filter.value})`;\n case 'child-of':\n return `Filter.childOf([${filter.parents.map((p) => JSON.stringify(p)).join(', ')}], { transitive: ${filter.transitive} })`;\n case 'not':\n return `Filter.not(${prettyFilter(filter.filter)})`;\n case 'and':\n return `Filter.and(${filter.filters.map(prettyFilter).join(', ')})`;\n case 'or':\n return `Filter.or(${filter.filters.map(prettyFilter).join(', ')})`;\n }\n};\n\n/**\n * Returns a human-readable string representation of a Query AST.\n */\nexport const prettyQuery = (query: QueryAST.Query): string => {\n switch (query.type) {\n case 'select':\n return `Query.select(${prettyFilter(query.filter)})`;\n case 'filter':\n return `${prettyQuery(query.selection)}.select(${prettyFilter(query.filter)})`;\n case 'reference-traversal':\n return `${prettyQuery(query.anchor)}.reference(${JSON.stringify(query.property)})`;\n case 'incoming-references': {\n const args: string[] = [];\n if (query.typename !== null) {\n args.push(String(query.typename));\n }\n if (query.property !== null) {\n args.push(JSON.stringify(query.property));\n }\n return `${prettyQuery(query.anchor)}.referencedBy(${args.join(', ')})`;\n }\n case 'relation': {\n const method =\n query.direction === 'outgoing' ? 'sourceOf' : query.direction === 'incoming' ? 'targetOf' : 'relationOf';\n const filterStr = query.filter !== undefined ? prettyFilter(query.filter) : '';\n return `${prettyQuery(query.anchor)}.${method}(${filterStr})`;\n }\n case 'relation-traversal':\n return `${prettyQuery(query.anchor)}.${query.direction}()`;\n case 'hierarchy-traversal':\n return query.direction === 'to-parent'\n ? `${prettyQuery(query.anchor)}.parent()`\n : `${prettyQuery(query.anchor)}.children()`;\n case 'union':\n return `Query.all(${query.queries.map(prettyQuery).join(', ')})`;\n case 'set-difference':\n return `Query.without(${prettyQuery(query.source)}, ${prettyQuery(query.exclude)})`;\n case 'order': {\n const orders = query.order.map((o) => {\n if (o.kind === 'natural') {\n return `Order.natural(${JSON.stringify(o.direction)})`;\n } else if (o.kind === 'rank') {\n return `Order.rank(${JSON.stringify(o.direction)})`;\n } else if (o.kind === 'timestamp') {\n const fn = o.field === 'updatedAt' ? 'updated' : 'created';\n return `Order.${fn}(${JSON.stringify(o.direction)})`;\n } else {\n return `Order.property(${JSON.stringify(o.property)}, ${JSON.stringify(o.direction)})`;\n }\n });\n return `${prettyQuery(query.query)}.orderBy(${orders.join(', ')})`;\n }\n case 'options': {\n const opts = query.options;\n const parts: string[] = [];\n if (opts.deleted !== undefined) {\n parts.push(`deleted: ${JSON.stringify(opts.deleted)}`);\n }\n if (opts.debugLabel !== undefined) {\n parts.push(`debugLabel: ${JSON.stringify(opts.debugLabel)}`);\n }\n return `${prettyQuery(query.query)}.options({ ${parts.join(', ')} })`;\n }\n case 'from': {\n if (query.from._tag === 'scope') {\n if (query.from.scopes.length === 0) {\n return `${prettyQuery(query.query)}.from('all-accessible-spaces')`;\n }\n const scopeStrs = query.from.scopes.map((scope) => {\n if (scope._tag === 'space') {\n return scope.includeAllFeeds\n ? `{ space: ${JSON.stringify(scope.spaceId)}, includeAllFeeds: true }`\n : `{ space: ${JSON.stringify(scope.spaceId)} }`;\n }\n if (scope._tag === 'feed') {\n return `{ feed: ${JSON.stringify(String(scope.feedUri))} }`;\n }\n return `{ registry: ${JSON.stringify(scope.location)} }`;\n });\n return `${prettyQuery(query.query)}.from([${scopeStrs.join(', ')}])`;\n }\n return `${prettyQuery(query.query)}.from(${prettyQuery(query.from.query)})`;\n }\n case 'limit':\n return `${prettyQuery(query.query)}.limit(${query.limit})`;\n case 'skip':\n return `${prettyQuery(query.query)}.skip(${query.skip})`;\n case 'aggregate': {\n const aggregates = query.aggregates.map((aggregate) => {\n const arg =\n aggregate.kind === 'items'\n ? aggregate.limit !== undefined\n ? `{ limit: ${aggregate.limit} }`\n : ''\n : aggregate.kind === 'count'\n ? ''\n : JSON.stringify(aggregate.property);\n return `${JSON.stringify(aggregate.name)}: Aggregate.${aggregate.kind}(${arg})`;\n });\n return `${prettyQuery(query.query)}.aggregate({ ${aggregates.join(', ')} })`;\n }\n }\n};\n","//\n// Copyright 2024 DXOS.org\n//\n\n/**\n * Define a non-enumerable property on an object.\n */\nexport const defineHiddenProperty = (object: any, key: string | symbol, value: any) => {\n Object.defineProperty(object, key, {\n enumerable: false,\n configurable: true,\n value,\n });\n};\n","//\n// Copyright 2026 DXOS.org\n//\n\nimport { EID, type SpaceId, type URI } from '@dxos/keys';\n\nimport { EntityKind } from '../common/types/entity';\nimport { RelationSourceDXNId, RelationTargetDXNId } from '../common/types/model-symbols';\nimport { ParentId, TypeId } from '../common/types/typename';\nimport { getObjectEchoUri } from '../Entity/util';\n\n/**\n * Normalized view of the references that make up an entity's strong-dependency set, store-agnostic\n * so it can be filled from an {@link ObjectCore} (db) or a decoded entity (queue item / snapshot).\n */\nexport interface StrongDepRefs {\n /** Entity kind — relations additionally depend on their source/target. */\n kind: EntityKind;\n /** Type reference URI (`echo:` for a persisted stored schema, `dxn:` for a static/registry type). */\n type?: URI.URI;\n /** Relation source reference URI. */\n source?: URI.URI;\n /** Relation target reference URI. */\n target?: URI.URI;\n /** Parent reference URI. */\n parent?: URI.URI;\n}\n\n/**\n * Direct strong-dependency URIs of an entity: the schema (only when stored as an object), the\n * relation source/target, and the parent. Returns URIs (cross-space `echo:` EIDs and queue-item\n * EIDs included); a persisted schema is an `echo:` URI, a static/registry type is a `dxn:` URI.\n *\n * A static/registry type (`dxn:`) is intentionally NOT a strong dep: it is always synchronously\n * available through the registry, so gating on it would needlessly delay surfacing. Only a\n * persisted (db-backed) schema, addressed by an `echo:` URI, must load before its instances.\n */\nexport const getStrongDependencyUris = (refs: StrongDepRefs, owningSpaceId?: SpaceId): URI.URI[] => {\n const res: URI.URI[] = [];\n\n if (refs.type != null && EID.tryParse(refs.type) != null) {\n res.push(qualifyToSpace(refs.type, owningSpaceId));\n }\n\n if (refs.kind === EntityKind.Relation) {\n if (refs.source != null) {\n res.push(qualifyToSpace(refs.source, owningSpaceId));\n }\n if (refs.target != null) {\n res.push(qualifyToSpace(refs.target, owningSpaceId));\n }\n }\n\n if (refs.parent != null) {\n res.push(qualifyToSpace(refs.parent, owningSpaceId));\n }\n\n return res;\n};\n\n/**\n * Qualifies a space-less (relative) `echo:` dependency URI with the space of the entity that owns it.\n * Same-space references are persisted relative; resolution needs them absolute to route to a single\n * space. Already-qualified URIs (cross-space) and non-`echo:` URIs (registry `dxn:`) pass through.\n */\nconst qualifyToSpace = (uri: URI.URI, owningSpaceId: SpaceId | undefined): URI.URI => {\n if (owningSpaceId == null) {\n return uri;\n }\n const eid = EID.tryParse(uri);\n if (eid == null || !EID.isLocal(eid)) {\n return uri;\n }\n const entityId = EID.getEntityId(eid);\n return entityId != null ? EID.make({ spaceId: owningSpaceId, entityId }) : uri;\n};\n\n/**\n * Direct strong-dependency URIs of a live (decoded) entity — a queue item, cross-space proxy, or\n * snapshot. Reads the reference URIs off the entity's hidden model symbols. ECHO db cores compute\n * the same set from their raw encoded references via {@link getStrongDependencyUris}.\n */\nexport const getStrongDependencies = (entity: unknown): URI.URI[] => {\n if (entity == null || typeof entity !== 'object') {\n return [];\n }\n const props = entity as Record<symbol, unknown>;\n const kind =\n props[RelationSourceDXNId] != null || props[RelationTargetDXNId] != null ? EntityKind.Relation : EntityKind.Object;\n const parent = props[ParentId];\n\n // The entity's own space qualifies any relative dependency URIs it carries.\n const selfUri = getObjectEchoUri(entity);\n const owningSpaceId = selfUri != null ? EID.getSpaceId(selfUri) : undefined;\n\n return getStrongDependencyUris(\n {\n kind,\n type: typeof props[TypeId] === 'string' ? (props[TypeId] as URI.URI) : undefined,\n source: props[RelationSourceDXNId] as URI.URI | undefined,\n target: props[RelationTargetDXNId] as URI.URI | undefined,\n // A parent is held as the resolved entity; derive its absolute URI for the dependency edge.\n parent: parent != null ? getObjectEchoUri(parent) : undefined,\n },\n owningSpaceId,\n );\n};\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport { invariant } from '@dxos/invariant';\nimport { EID } from '@dxos/keys';\nimport { deepMapValues, encodeUint8ArrayToJson } from '@dxos/util';\n\nimport { Ref } from '../../Ref';\nimport {\n ATTR_RELATION_SOURCE,\n ATTR_RELATION_TARGET,\n ATTR_SELF_URI,\n ATTR_TYPE,\n RelationSourceDXNId,\n RelationTargetDXNId,\n SelfURIId,\n TypeId,\n} from '../types';\nimport { ATTR_META, type EntityMeta } from '../types/meta';\nimport { MetaId } from '../types/model-symbols';\n\n/**\n * Attaches a toJSON method to the object for typed serialization.\n */\nexport const attachTypedJsonSerializer = (obj: any) => {\n const descriptor = Object.getOwnPropertyDescriptor(obj, 'toJSON');\n if (descriptor) {\n return;\n }\n\n Object.defineProperty(obj, 'toJSON', {\n value: typedJsonSerializer,\n writable: false,\n enumerable: false,\n // Setting `configurable` to false breaks proxy invariants, should be fixable.\n configurable: true,\n });\n};\n\n// NOTE: KEEP as function.\n// Exported for use in objectToJSON.\nexport const typedJsonSerializer = function (this: any) {\n const { id, ...rest } = this;\n const result: any = {\n id,\n };\n\n if (this[TypeId]) {\n result[ATTR_TYPE] = this[TypeId];\n }\n\n if (this[MetaId]) {\n result[ATTR_META] = serializeMeta(this[MetaId]);\n }\n\n if (this[SelfURIId]) {\n result[ATTR_SELF_URI] = this[SelfURIId];\n }\n\n if (this[RelationSourceDXNId]) {\n const sourceDXN = this[RelationSourceDXNId];\n invariant(EID.isEID(sourceDXN));\n result[ATTR_RELATION_SOURCE] = sourceDXN;\n }\n if (this[RelationTargetDXNId]) {\n const targetDXN = this[RelationTargetDXNId];\n invariant(EID.isEID(targetDXN));\n result[ATTR_RELATION_TARGET] = targetDXN;\n }\n\n Object.assign(result, serializeData(rest));\n return result;\n};\n\nconst serializeData = (data: unknown) => {\n return deepMapValues(data, (value, recurse) => {\n if (Ref.isRef(value)) {\n // TODO(dmaretskyi): Should this be configurable?\n return value.noInline().encode();\n }\n if (value instanceof Uint8Array) {\n return encodeUint8ArrayToJson(value);\n }\n\n return recurse(value);\n });\n};\n\nconst serializeMeta = (meta: EntityMeta) => {\n // Omit empty `tags`/`annotations` to keep serialized output minimal; `objectFromJSON` backfills\n // the required defaults on read.\n const { tags, annotations, ...rest } = meta;\n const compact = {\n ...rest,\n ...(tags != null && tags.length > 0 ? { tags } : {}),\n ...(annotations != null && Object.keys(annotations).length > 0 ? { annotations } : {}),\n };\n // Use `serializeData` so `meta.tags` `Ref<Tag>` values encode to the on-wire reference form.\n return serializeData(compact);\n};\n","//\n// Copyright 2024 DXOS.org\n//\n\nimport { EventId } from './symbols';\n\n/**\n * Simple batching mechanism for EventId emissions.\n * When batch depth > 0, events are collected instead of emitted immediately.\n * When batch depth returns to 0, pending events are emitted.\n */\nlet eventBatchDepth = 0;\nconst pendingEventTargets = new Set<object>();\n\n/**\n * Run a callback in a batched context for EventId emissions.\n * Multiple mutations within the batch will only emit one event per target.\n */\nexport const batchEvents = (callback: () => void): void => {\n eventBatchDepth++;\n try {\n callback();\n } finally {\n eventBatchDepth--;\n if (eventBatchDepth === 0) {\n // Emit pending events.\n for (const target of pendingEventTargets) {\n (target as any)[EventId]?.emit();\n }\n pendingEventTargets.clear();\n }\n }\n};\n\n/**\n * Emit an event on a target, respecting batching.\n */\nexport const emitEvent = (target: object): void => {\n if (eventBatchDepth > 0) {\n pendingEventTargets.add(target);\n } else {\n (target as any)[EventId]?.emit();\n }\n};\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport { batchEvents } from './event-batch';\nimport { EventId } from './symbols';\n\n/**\n * Generic change context tracking.\n * Only one object can be in a change context at a time (synchronous changes).\n *\n * This module provides a unified change context mechanism used by both:\n * - TypedReactiveHandler (for non-database objects, using target as key)\n * - EchoReactiveHandler (for database objects, using ObjectCore as key)\n */\n\n/**\n * The object currently in a change context.\n * Can be a target object (for typed reactive) or ObjectCore (for database objects).\n */\nlet currentChangeContext: object | null = null;\n\n/**\n * The primary object that has pending notifications, if any.\n * This uses the contextKey (target or ObjectCore).\n */\nlet pendingNotificationKey: object | null = null;\n\n/**\n * Additional objects (owner chain) that need notifications.\n * These are separate from the primary notification because they use EventId directly.\n */\nconst pendingOwnerNotifications = new Set<object>();\n\n/**\n * Enter a change context for the given key.\n * While in a change context, mutations are allowed on the associated object.\n * Nested Obj.update calls are not supported.\n *\n * @param key - The key to enter the change context for (target object or ObjectCore).\n * @returns A cleanup function that exits the change context.\n */\nexport const enterChangeContext = (key: object): (() => void) => {\n currentChangeContext = key;\n return () => {\n currentChangeContext = null;\n };\n};\n\n/**\n * Check if the given key is currently in a change context.\n *\n * @param key - The key to check (target object or ObjectCore).\n * @returns True if the key is in a change context, false otherwise.\n */\nexport const isInChangeContext = (key: object): boolean => {\n return currentChangeContext === key;\n};\n\n/**\n * Queue a notification for the given key to be fired when the change context exits.\n *\n * @param key - The key to queue a notification for.\n */\nexport const queueNotification = (key: object): void => {\n if (currentChangeContext === key) {\n pendingNotificationKey = key;\n }\n};\n\n/**\n * Queue an owner notification. Owner notifications are for objects in the ownership\n * chain that should be notified when a nested object changes.\n * These objects have EventId and emit directly.\n * Skip if the target is already the current change context (to avoid duplicate notifications).\n *\n * @param target - The owner target that has EventId.\n */\nexport const queueOwnerNotification = (target: object): void => {\n // Skip if this is the object already being changed (primary notification handles it).\n if (currentChangeContext !== null && target !== currentChangeContext) {\n pendingOwnerNotifications.add(target);\n }\n};\n\n/**\n * Check if there are any pending notifications for the given key.\n *\n * @param key - The key to check.\n * @returns True if there are pending notifications, false otherwise.\n */\nexport const hasPendingNotifications = (key: object): boolean => {\n return pendingNotificationKey === key;\n};\n\n/**\n * Clear any pending notifications for the given key.\n *\n * @param key - The key to clear notifications for.\n */\nexport const clearPendingNotifications = (key: object): void => {\n if (pendingNotificationKey === key) {\n pendingNotificationKey = null;\n }\n};\n\n/**\n * Execute a callback within a change context.\n * This is the shared implementation used by both TypedReactiveHandler and EchoReactiveHandler.\n *\n * @param contextKey - The key for the change context (target for typed, ObjectCore for db).\n * @param eventTarget - The object that has the EventId for notifications.\n * @param proxy - The proxy object to pass to the callback.\n * @param callback - The callback to execute with mutations allowed.\n */\nexport const executeChange = (\n contextKey: object,\n eventTarget: object,\n proxy: any,\n callback: (proxy: any) => void,\n): void => {\n const exitContext = enterChangeContext(contextKey);\n try {\n batchEvents(() => callback(proxy));\n } finally {\n exitContext();\n // Fire the primary notification (a real change).\n if (hasPendingNotifications(contextKey)) {\n clearPendingNotifications(contextKey);\n (eventTarget as any)[EventId]?.emit();\n }\n // Fire owner chain notifications.\n for (const ownerTarget of pendingOwnerNotifications) {\n (ownerTarget as any)[EventId]?.emit();\n }\n pendingOwnerNotifications.clear();\n }\n};\n","//\n// Copyright 2025 DXOS.org\n//\n\n/**\n * Error thrown when attempting to mutate an object outside of an Obj.update() context.\n */\nexport class MutationOutsideChangeContextError extends Error {\n constructor(operation: string, suggestion: string) {\n super(\n `Cannot ${operation} outside of Obj.update(). Use Obj.update(obj, (mutableObj) => { ${suggestion} }) instead.`,\n );\n this.name = 'MutationOutsideChangeContextError';\n }\n}\n\n/**\n * Create an error for attempting to set a property outside of a change context.\n */\nexport const createPropertySetError = (prop: string | symbol): MutationOutsideChangeContextError => {\n return new MutationOutsideChangeContextError(\n `modify object property \"${String(prop)}\"`,\n `mutableObj.${String(prop)} = value;`,\n );\n};\n\n/**\n * Create an error for attempting to delete a property outside of a change context.\n */\nexport const createPropertyDeleteError = (prop: string | symbol): MutationOutsideChangeContextError => {\n return new MutationOutsideChangeContextError(\n `delete object property \"${String(prop)}\"`,\n `delete mutableObj.${String(prop)};`,\n );\n};\n\n/**\n * Create an error for attempting to call an array method outside of a change context.\n */\nexport const createArrayMethodError = (method: string): MutationOutsideChangeContextError => {\n return new MutationOutsideChangeContextError(`call array.${method}()`, `mutableObj.array.${method}(...);`);\n};\n","//\n// Copyright 2024 DXOS.org\n//\n\nimport { invariant } from '@dxos/invariant';\n\nimport { KindId } from '../types';\nimport { queueOwnerNotification } from './change-context';\nimport { defineHiddenProperty } from './define-hidden-property';\nimport { getProxyTarget, isProxy, isValidProxyTarget } from './proxy-utils';\nimport { EventId } from './symbols';\n\n/**\n * Symbol to store the owning ECHO object reference on nested JS objects (records).\n * Every nested record is attributed to exactly one ECHO object.\n * This achieves:\n * - No cycles in the object graph (cyclical Refs are still allowed).\n * - No multiple inbound pointers to one record.\n * - Centralized reactivity for entire ECHO object.\n */\nconst EchoOwner = Symbol.for('@dxos/echo/Owner');\n\n/**\n * Get the raw target from a value, unwrapping proxy if needed.\n */\nexport const getRawTarget = (value: any): any => {\n return isProxy(value) ? getProxyTarget(value) : value;\n};\n\n/**\n * Get the ECHO object that owns this nested record.\n *\n * The owner is always the raw target object (not a proxy) of the root ECHO object.\n * For example, if you have `echoObject.nested.deep`, both `nested` and `deep`\n * will have their owner set to the raw target of `echoObject`.\n *\n * @param value - The nested record to check (can be a proxy or raw target).\n * @returns The raw target of the owning root ECHO object, or undefined if not owned.\n */\nexport const getOwner = (value: object | null | undefined): object | undefined => {\n return (value as any)?.[EchoOwner];\n};\n\n/**\n * Set the owner of a meta object to its parent.\n * This allows meta mutations to respect the parent's change context.\n * @internal\n */\nexport const setMetaOwner = (metaTarget: object, parent: object): void => {\n defineHiddenProperty(metaTarget, EchoOwner, parent);\n};\n\n/**\n * Set the ECHO object owner on a value and all its nested records.\n * All nested JS objects point directly to the root ECHO object.\n *\n * @param value - The value to set ownership on (can be a proxy or raw target).\n * @param owner - The raw target of the root ECHO object that will own this value.\n * @param options.visited - Set of already-visited objects to avoid infinite loops.\n * @param options.depth - Current recursion depth (unused, kept for debugging).\n * @param options.allowedPreviousOwner - When reassigning a root ECHO object, its nested structures\n * are allowed to have this as their previous owner without triggering the invariant.\n */\nexport const setOwnerRecursive = (\n value: any,\n owner: object,\n options: {\n visited?: Set<object>;\n depth?: number;\n allowedPreviousOwner?: object;\n } = {},\n): void => {\n const { visited = new Set<object>(), depth = 0, allowedPreviousOwner } = options;\n if (value == null || typeof value !== 'object') {\n return;\n }\n\n const actualValue = getRawTarget(value);\n if (visited.has(actualValue)) {\n return;\n }\n visited.add(actualValue);\n\n // Check that we're not stealing a nested record owned by a different ECHO object.\n // Root ECHO objects (those with EventId) can be reassigned - they maintain their own\n // identity and choosing to embed them in another object is a valid operation.\n // When reassigning a root, its nested records (owned by that root) are also allowed.\n const existingOwner = getOwner(actualValue);\n const isRootEchoObject = EventId in actualValue;\n\n // Track if this is a root being assigned - its nested structures are allowed to transfer.\n let newAllowedPreviousOwner = allowedPreviousOwner;\n if (isRootEchoObject && depth === 0) {\n // This is the top-level root being assigned; allow its nested structures to transfer.\n newAllowedPreviousOwner = actualValue;\n }\n\n if (!isRootEchoObject) {\n const ownershipAllowed =\n existingOwner == null || existingOwner === owner || existingOwner === newAllowedPreviousOwner;\n invariant(\n ownershipAllowed,\n 'Cannot reassign ownership of a nested record to a different ECHO object. Use deep copy first.',\n );\n }\n\n // Set owner directly to the root ECHO object.\n defineHiddenProperty(actualValue, EchoOwner, owner);\n\n // Recursively set owner on nested objects and array elements.\n const recursiveOptions = {\n visited,\n depth: depth + 1,\n allowedPreviousOwner: newAllowedPreviousOwner,\n };\n if (Array.isArray(actualValue)) {\n for (const item of actualValue) {\n if (isValidProxyTarget(item) || isProxy(item)) {\n setOwnerRecursive(item, owner, recursiveOptions);\n }\n }\n } else {\n for (const key in actualValue) {\n if (Object.prototype.hasOwnProperty.call(actualValue, key)) {\n const nested = actualValue[key];\n if (isValidProxyTarget(nested) || isProxy(nested)) {\n setOwnerRecursive(nested, owner, recursiveOptions);\n }\n }\n }\n }\n};\n\n/**\n * Traverse an object graph, calling the visitor on each object.\n * Handles proxy unwrapping and cycle detection.\n *\n * @param value - The value to traverse (can be a proxy or raw target).\n * @param visitor - Called for each object. Return true to stop traversal (early exit).\n * @returns true if the visitor returns true for any object.\n */\nexport const traverseObjectGraph = (\n value: any,\n visitor: (actualValue: any) => boolean,\n visited = new Set<object>(),\n): boolean => {\n if (value == null || typeof value !== 'object') {\n return false;\n }\n\n const actualValue = getRawTarget(value);\n\n if (visited.has(actualValue)) {\n return false;\n }\n visited.add(actualValue);\n\n if (visitor(actualValue)) {\n return true;\n }\n\n if (Array.isArray(actualValue)) {\n for (const item of actualValue) {\n if (traverseObjectGraph(item, visitor, visited)) {\n return true;\n }\n }\n } else {\n for (const key in actualValue) {\n if (Object.prototype.hasOwnProperty.call(actualValue, key)) {\n if (traverseObjectGraph(actualValue[key], visitor, visited)) {\n return true;\n }\n }\n }\n }\n\n return false;\n};\n\n/**\n * Check if a value would create a cycle when assigned to a target ECHO object.\n * Returns true if the value (or any nested object) IS the target root.\n */\nexport const wouldCreateCycle = (targetRoot: object, value: any): boolean =>\n traverseObjectGraph(value, (v) => v === targetRoot);\n\n/**\n * Check if a value or any of its nested objects has an owner different from the target.\n * Used to determine if deep copy is needed during init.\n */\nexport const hasForeignOwner = (value: any, target: object): boolean =>\n traverseObjectGraph(value, (v) => {\n const owner = getOwner(v);\n if (owner != null && owner !== target) {\n return true;\n }\n // Root ECHO objects (with EventId) have their nested structures owned by them.\n if (EventId in v && v !== target) {\n return true;\n }\n return false;\n });\n\n/**\n * Maximum depth for owner chain traversal.\n * This is a defensive measure against malformed circular ownership.\n * Primary cycle detection is handled by wouldCreateCycle() before assignment.\n */\nconst MAX_OWNER_DEPTH = 100;\n\n/**\n * Get the root ECHO object for a target.\n * Follows the owner chain to find the ultimate root.\n * An object may have EventId (from being created standalone) but if it now\n * has an owner, it's nested and we should use its owner's root instead.\n * @internal\n */\nexport const getEchoRoot = (target: object, depth = 0): object => {\n invariant(depth < MAX_OWNER_DEPTH, 'Owner chain too deep - possible circular ownership');\n\n // Root ECHO objects (those created with Obj.make or Relation.make) have KindId set.\n // They maintain their own change context identity even when nested inside another object.\n // Nested helper objects like EntityMeta don't have KindId and should follow their owner.\n if (KindId in target) {\n return target;\n }\n\n // For non-root objects (nested records, EntityMeta, etc.), follow the owner chain.\n const owner = getOwner(target);\n if (owner) {\n return getEchoRoot(owner, depth + 1);\n }\n\n // No owner means this is an unowned object (e.g., during initialization).\n return target;\n};\n\n/**\n * Notify all owners in the ownership chain.\n * When a nested object changes, its parent should also be notified.\n * This handles the case where a root ECHO object is nested inside another object.\n */\nexport const notifyOwnerChain = (target: object): void => {\n const owner = getOwner(target);\n if (owner) {\n // Queue notification for the owner's root (which has EventId).\n queueOwnerNotification(getEchoRoot(owner));\n // Continue up the chain (owner might also be nested).\n notifyOwnerChain(owner);\n }\n};\n","//\n// Copyright 2024 DXOS.org\n//\n\n/**\n * Reactive object proxy.\n */\nexport interface ReactiveHandler<T extends object> extends ProxyHandler<T> {\n /**\n * Target to Proxy mapping.\n */\n readonly _proxyMap: WeakMap<object, any>;\n\n /**\n * Called when a proxy is created for this target.\n */\n init(target: T): void;\n\n /**\n * Replace the string CRDT value at `path` with `newText`, applying a minimal diff so cursors and\n * concurrent edits are preserved. Implemented by handlers that back string fields; `Text.update`\n * dispatches here. Must run inside a change context (`Obj.update`).\n */\n textUpdate?(target: T, path: readonly (string | number)[], newText: string): void;\n\n /**\n * Splice the string CRDT value at `path` (character indices, mirroring `Array.splice`): remove\n * `deleteCount` characters at `start` and insert `insert`. Returns the removed substring. `Text.splice`\n * dispatches here. Must run inside a change context (`Obj.update`).\n */\n textSplice?(\n target: T,\n path: readonly (string | number)[],\n start: number,\n deleteCount: number,\n insert: string,\n ): string;\n}\n\n/**\n * For debug-dumping the data of the object.\n */\nexport const objectData = Symbol.for('@dxos/live-object/objectData');\n","//\n// Copyright 2024 DXOS.org\n//\n\nimport { isInChangeContext } from './change-context';\nimport { createArrayMethodError } from './errors';\nimport { batchEvents } from './event-batch';\nimport { getEchoRoot } from './ownership';\nimport { getProxyTarget, isProxy } from './proxy-utils';\nimport { EventId } from './symbols';\n\n/**\n * Check if array mutation is allowed (inside a change context).\n * Throws a descriptive error if not.\n */\nconst checkArrayMutationAllowed = (arr: any, method: string): void => {\n // Get the raw target - if arr is a proxy, get its underlying target.\n const target = isProxy(arr) ? getProxyTarget(arr) : arr;\n\n // Find the root ECHO object.\n const echoRoot = getEchoRoot(target);\n\n // A root object owns an `EventId` once initialized; before that, mutations are allowed.\n const isInitialized = EventId in echoRoot;\n if (!isInitialized) {\n // Array is still being initialized, allow mutations.\n return;\n }\n\n if (!isInChangeContext(echoRoot)) {\n throw createArrayMethodError(method);\n }\n};\n\n/**\n * Extends the native array to make sure that arrays methods are correctly reactive.\n * Enforces that mutations only happen within Obj.update() context.\n */\nexport class ReactiveArray<T> extends Array<T> {\n static override get [Symbol.species]() {\n return Array;\n }\n\n static {\n /**\n * These methods will trigger proxy traps like `set` and `defineProperty` and emit event notifications.\n * We wrap them in a batch to avoid unnecessary event notifications.\n * Change context is checked before allowing mutations.\n *\n * Note: When called on a proxy, `this` will be the proxy, so array mutations\n * go through the proxy's set trap which handles event emission.\n */\n const BATCHED_METHODS = ['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse'] as const;\n\n for (const method of BATCHED_METHODS) {\n Object.defineProperty(this.prototype, method, {\n enumerable: false,\n value: function (this: ReactiveArray<any>, ...args: any[]) {\n // Check change context before allowing mutation.\n checkArrayMutationAllowed(this, method);\n\n let result!: any;\n batchEvents(() => {\n result = Array.prototype[method].apply(this, args);\n });\n return result;\n },\n });\n }\n }\n}\n","//\n// Copyright 2024 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\nimport * as SchemaAST from 'effect/SchemaAST';\n\nimport { invariant } from '@dxos/invariant';\n\nimport { SchemaId } from '../types';\n\n// TODO(burdon): Reconcile with @dxos/effect visit().\n\nexport class SchemaValidator {\n /**\n * Recursively check that schema specifies constructions we can handle.\n * Validates there are no ambiguous discriminated union types.\n */\n public static validateSchema(schema: Schema.Schema.AnyNoContext): void {\n const visitAll = (nodes: SchemaAST.AST[]) => nodes.forEach((node) => this.validateSchema(Schema.make(node)));\n if (SchemaAST.isUnion(schema.ast)) {\n const typeAstList = schema.ast.types.filter((type) => SchemaAST.isTypeLiteral(type)) as SchemaAST.TypeLiteral[];\n // Check we can handle a discriminated union.\n if (typeAstList.length > 1) {\n getTypeDiscriminators(typeAstList);\n }\n visitAll(typeAstList);\n } else if (SchemaAST.isTupleType(schema.ast)) {\n const positionalTypes = schema.ast.elements.map((t) => t.type);\n const allTypes = positionalTypes.concat(schema.ast.rest.map((t) => t.type));\n visitAll(allTypes);\n } else if (SchemaAST.isTypeLiteral(schema.ast)) {\n visitAll(SchemaAST.getPropertySignatures(schema.ast).map((p) => p.type));\n }\n }\n\n public static hasTypeAnnotation(\n rootObjectSchema: Schema.Schema.AnyNoContext,\n property: string,\n annotation: symbol,\n ): boolean {\n try {\n let type = this.getPropertySchema(rootObjectSchema, [property]);\n if (SchemaAST.isTupleType(type.ast)) {\n type = this.getPropertySchema(rootObjectSchema, [property, '0']);\n }\n\n return type.ast.annotations[annotation] != null;\n } catch {\n return false;\n }\n }\n\n public static getPropertySchema(\n rootObjectSchema: Schema.Schema.AnyNoContext,\n propertyPath: KeyPath,\n getProperty: (path: KeyPath) => any = () => null,\n ): Schema.Schema.AnyNoContext {\n let schema: Schema.Schema.AnyNoContext = rootObjectSchema;\n for (let i = 0; i < propertyPath.length; i++) {\n const propertyName = propertyPath[i];\n const tupleAst = unwrapArray(schema.ast);\n if (tupleAst != null) {\n schema = getArrayElementSchema(tupleAst, propertyName);\n } else {\n const propertyType = getPropertyType(schema.ast, propertyName.toString(), (propertyName) =>\n getProperty([...propertyPath.slice(0, i), propertyName]),\n );\n if (propertyType == null) {\n const indexSignatureType = getIndexSignatureValueType(schema.ast);\n if (indexSignatureType != null) {\n schema = Schema.make(indexSignatureType).annotations(indexSignatureType.annotations);\n continue;\n }\n\n throw new TypeError(`Unknown property: ${formatPropertyPath([...propertyPath.slice(0, i), propertyName])}`);\n }\n\n schema = Schema.make(propertyType).annotations(propertyType.annotations);\n }\n }\n\n return schema;\n }\n\n /**\n * Rejects properties not declared on the schema. Types with index signatures allow extra keys.\n */\n public static assertExactProperties(\n schema: Schema.Schema.AnyNoContext,\n value: unknown,\n getProperty: (path: KeyPath) => unknown = () => undefined,\n path: KeyPath = [],\n ): void {\n if (!isPlainRecord(value)) {\n return;\n }\n\n const typeLiteral = resolveTypeLiteral(schema.ast, (propertyName) => getProperty([...path, propertyName]));\n if (typeLiteral == null) {\n return;\n }\n\n const propertySignatures = SchemaAST.getPropertySignatures(typeLiteral);\n const allowedKeys = new Set(propertySignatures.map((property) => String(property.name)));\n const indexSignatureType = typeLiteral.indexSignatures[0]?.type;\n\n for (const key of Object.keys(value)) {\n const propertyPath = [...path, key];\n if (!allowedKeys.has(key)) {\n if (indexSignatureType == null) {\n throw new TypeError(`Unknown property: ${formatPropertyPath(propertyPath)}`);\n }\n\n const indexSchema = Schema.make(indexSignatureType).annotations(indexSignatureType.annotations);\n this.assertExactProperties(indexSchema, value[key], getProperty, propertyPath);\n continue;\n }\n\n const propertySignature = propertySignatures.find((property) => String(property.name) === key);\n invariant(propertySignature, 'Property signature must exist.');\n const propertySchema = Schema.make(propertySignature.type).annotations(propertySignature.type.annotations);\n this.assertExactProperties(propertySchema, value[key], getProperty, propertyPath);\n }\n }\n\n public static getIndexedElementSchema(\n schema: Schema.Schema.AnyNoContext,\n index: number | string,\n ): Schema.Schema.AnyNoContext | null {\n const arrayAst = unwrapArray(schema.ast);\n if (arrayAst != null) {\n return getArrayElementSchema(arrayAst, index);\n }\n\n const unionAst = unwrapAst(\n schema.ast,\n (candidate) => SchemaAST.isUnion(candidate) && candidate.types.some((member) => unwrapArray(member) != null),\n );\n if (unionAst != null && SchemaAST.isUnion(unionAst)) {\n for (const member of unionAst.types) {\n const memberArrayAst = unwrapArray(member);\n if (memberArrayAst != null) {\n return getArrayElementSchema(memberArrayAst, index);\n }\n }\n }\n\n return null;\n }\n\n public static getTargetPropertySchema(target: any, prop: string | symbol): Schema.Schema.AnyNoContext {\n const schema: Schema.Schema.AnyNoContext | undefined = (target as any)[SchemaId];\n invariant(schema, 'target has no schema');\n\n if (Array.isArray(target)) {\n if (prop === 'length') {\n return Schema.Number;\n }\n\n if (typeof prop !== 'symbol') {\n const indexedSchema = this.getIndexedElementSchema(schema, prop);\n if (indexedSchema != null) {\n return indexedSchema;\n }\n }\n\n // Arrays sometimes carry the element struct as their stamped schema.\n if (SchemaAST.isTypeLiteral(schema.ast)) {\n return schema;\n }\n }\n\n if (typeof prop === 'number' || (typeof prop === 'string' && /^\\d+$/.test(prop))) {\n const indexedSchema = this.getIndexedElementSchema(schema, prop);\n if (indexedSchema != null) {\n return indexedSchema;\n }\n }\n\n const arrayAst = unwrapArray(schema.ast);\n if (arrayAst != null) {\n return getArrayElementSchema(arrayAst, prop);\n }\n\n const propertyType = getPropertyType(schema.ast, prop.toString(), (prop) => target[prop]);\n if (propertyType == null) {\n const indexSignatureType = getIndexSignatureValueType(schema.ast);\n if (indexSignatureType != null) {\n return Schema.make(indexSignatureType).annotations(indexSignatureType.annotations);\n }\n\n throw new TypeError(`Unknown property: ${String(prop)}`);\n }\n\n return Schema.make(propertyType).annotations(propertyType.annotations);\n }\n}\n\n/**\n * Tuple AST is used both for:\n * fixed-length tuples ([string, number]) in which case AST will be { elements: [Schema.String, Schema.Number] }\n * variable-length arrays (Array<string | number>) in which case AST will be { rest: [Schema.Union(Schema.String, Schema.Number)] }\n */\nconst getArrayElementSchema = (\n tupleAst: SchemaAST.TupleType,\n property: string | symbol | number,\n): Schema.Schema.AnyNoContext => {\n const elementIndex =\n typeof property === 'number' ? property : typeof property === 'string' ? parseInt(property, 10) : Number.NaN;\n if (Number.isNaN(elementIndex)) {\n invariant(property === 'length', `invalid array property: ${String(property)}`);\n return Schema.Number;\n }\n if (elementIndex < tupleAst.elements.length) {\n const elementType = tupleAst.elements[elementIndex].type;\n return Schema.make(elementType).annotations(elementType.annotations);\n }\n\n const restType = tupleAst.rest;\n return Schema.make(restType[0].type).annotations(restType[0].annotations);\n};\n\nconst flattenUnion = (typeAst: SchemaAST.AST): SchemaAST.AST[] =>\n SchemaAST.isUnion(typeAst) ? typeAst.types.flatMap(flattenUnion) : [typeAst];\n\nconst getProperties = (\n typeAst: SchemaAST.AST,\n getTargetPropertyFn: (propertyName: string) => any,\n): SchemaAST.PropertySignature[] => {\n const astCandidates = flattenUnion(typeAst);\n const typeAstList = astCandidates.filter((type) => SchemaAST.isTypeLiteral(type)) as SchemaAST.TypeLiteral[];\n if (typeAstList.length === 0) {\n return [];\n }\n if (typeAstList.length === 1) {\n return SchemaAST.getPropertySignatures(typeAstList[0]);\n }\n\n const typeDiscriminators = getTypeDiscriminators(typeAstList);\n const targetPropertyValue = getTargetPropertyFn(String(typeDiscriminators[0].name));\n const typeIndex = typeDiscriminators.findIndex((p) => targetPropertyValue === (p.type as SchemaAST.Literal).literal);\n invariant(typeIndex !== -1, 'discriminator field not set on target');\n return SchemaAST.getPropertySignatures(typeAstList[typeIndex]);\n};\n\nconst getPropertyType = (\n ast: SchemaAST.AST,\n propertyName: string,\n getTargetPropertyFn: (propertyName: string) => any,\n): SchemaAST.AST | null => {\n const anyOrObject = unwrapAst(\n ast,\n (candidate) =>\n SchemaAST.isAnyKeyword(candidate) ||\n SchemaAST.isUnknownKeyword(candidate) ||\n SchemaAST.isObjectKeyword(candidate),\n );\n if (anyOrObject != null) {\n return ast;\n }\n\n const typeOrDiscriminatedUnion = unwrapAst(ast, (t) => {\n return SchemaAST.isTypeLiteral(t) || (SchemaAST.isUnion(t) && t.types.some((t) => SchemaAST.isTypeLiteral(t)));\n });\n if (typeOrDiscriminatedUnion == null) {\n return null;\n }\n\n const targetProperty = getProperties(typeOrDiscriminatedUnion, getTargetPropertyFn).find(\n (p) => p.name === propertyName,\n );\n if (targetProperty != null) {\n return unwrapAst(targetProperty.type);\n }\n\n const indexSignatureType = unwrapAst(ast, SchemaAST.isTypeLiteral);\n if (\n indexSignatureType &&\n SchemaAST.isTypeLiteral(indexSignatureType) &&\n indexSignatureType.indexSignatures.length > 0\n ) {\n return unwrapAst(indexSignatureType.indexSignatures[0].type);\n }\n\n return null;\n};\n\nconst getTypeDiscriminators = (typeAstList: SchemaAST.TypeLiteral[]): SchemaAST.PropertySignature[] => {\n const discriminatorPropCandidates = typeAstList\n .flatMap(SchemaAST.getPropertySignatures)\n .filter((p) => SchemaAST.isLiteral(p.type));\n const propertyName = discriminatorPropCandidates[0].name;\n const isValidDiscriminator = discriminatorPropCandidates.every((p) => p.name === propertyName && !p.isOptional);\n const everyTypeHasDiscriminator = discriminatorPropCandidates.length === typeAstList.length;\n const isDiscriminatedUnion = isValidDiscriminator && everyTypeHasDiscriminator;\n invariant(isDiscriminatedUnion, 'type ambiguity: every type in a union must have a single unique-literal field');\n return discriminatorPropCandidates;\n};\n\n/**\n * Used to check that rootAst is for a type matching the provided predicate.\n * That's not always straightforward because types of optionality and recursive types.\n * const Task = Schema.Struct({\n * ...,\n * previous?: Schema.optional(Schema.suspend(() => Task)),\n * });\n * Here the AST for `previous` field is going to be Union(Suspend(Type), Undefined).\n * SchemaAST.isTypeLiteral(field) will return false, but unwrapAst(field, (ast) => SchemaAST.isTypeLiteral(ast))\n * will return true.\n */\nconst unwrapAst = (rootAst: SchemaAST.AST, predicate?: (ast: SchemaAST.AST) => boolean): SchemaAST.AST | null => {\n let ast: SchemaAST.AST | undefined = rootAst;\n while (ast != null) {\n if (predicate?.(ast)) {\n return ast;\n }\n\n if (SchemaAST.isUnion(ast)) {\n const next: any = ast.types.find((t) => (predicate != null && predicate(t)) || SchemaAST.isSuspend(t));\n if (next != null) {\n ast = next;\n continue;\n }\n }\n\n if (SchemaAST.isSuspend(ast)) {\n ast = ast.f();\n } else {\n return predicate == null ? ast : null;\n }\n }\n\n return null;\n};\n\nconst unwrapArray = (ast: SchemaAST.AST) => unwrapAst(ast, SchemaAST.isTupleType) as SchemaAST.TupleType | null;\n\nconst getIndexSignatureValueType = (ast: SchemaAST.AST): SchemaAST.AST | null => {\n const typeLiteral = unwrapAst(ast, SchemaAST.isTypeLiteral);\n if (typeLiteral == null || !SchemaAST.isTypeLiteral(typeLiteral) || typeLiteral.indexSignatures.length === 0) {\n return null;\n }\n\n return unwrapAst(typeLiteral.indexSignatures[0].type);\n};\n\nconst resolveTypeLiteral = (\n ast: SchemaAST.AST,\n getTargetPropertyFn: (propertyName: string) => unknown,\n): SchemaAST.TypeLiteral | null => {\n const anyOrObject = unwrapAst(\n ast,\n (candidate) =>\n SchemaAST.isAnyKeyword(candidate) ||\n SchemaAST.isUnknownKeyword(candidate) ||\n SchemaAST.isObjectKeyword(candidate),\n );\n if (anyOrObject != null) {\n return null;\n }\n\n const typeOrDiscriminatedUnion = unwrapAst(ast, (type) => {\n return (\n SchemaAST.isTypeLiteral(type) ||\n (SchemaAST.isUnion(type) && type.types.some((member) => SchemaAST.isTypeLiteral(member)))\n );\n });\n if (typeOrDiscriminatedUnion == null) {\n return null;\n }\n\n if (SchemaAST.isTypeLiteral(typeOrDiscriminatedUnion)) {\n return typeOrDiscriminatedUnion;\n }\n\n if (!SchemaAST.isUnion(typeOrDiscriminatedUnion)) {\n return null;\n }\n\n const typeAstList = typeOrDiscriminatedUnion.types.filter((type) =>\n SchemaAST.isTypeLiteral(type),\n ) as SchemaAST.TypeLiteral[];\n if (typeAstList.length === 1) {\n return typeAstList[0];\n }\n\n const typeDiscriminators = getTypeDiscriminators(typeAstList);\n const targetPropertyValue = getTargetPropertyFn(String(typeDiscriminators[0].name));\n const typeIndex = typeDiscriminators.findIndex(\n (property) => targetPropertyValue === (property.type as SchemaAST.Literal).literal,\n );\n invariant(typeIndex !== -1, 'discriminator field not set on target');\n return typeAstList[typeIndex];\n};\n\nconst isPlainRecord = (value: unknown): value is Record<string, unknown> => {\n if (typeof value !== 'object' || value === null || Array.isArray(value) || value instanceof Uint8Array) {\n return false;\n }\n\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n};\n\nconst formatPropertyPath = (path: KeyPath): string => path.map(String).join('.');\n\nexport const checkIdNotPresentOnSchema = (schema: Schema.Schema<any, any, any>) => {\n invariant(SchemaAST.isTypeLiteral(schema.ast));\n const idProperty = SchemaAST.getPropertySignatures(schema.ast).find((prop) => prop.name === 'id');\n if (idProperty != null) {\n throw new Error('\"id\" property name is reserved');\n }\n};\n\n// TODO(burdon): Reconcile with JsonPath.\ntype KeyPath = readonly (string | number)[];\n","//\n// Copyright 2024 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\nimport * as SchemaAST from 'effect/SchemaAST';\nimport { type InspectOptionsStylized } from 'node:util';\n\nimport { Event } from '@dxos/async';\nimport { inspectCustom } from '@dxos/debug';\nimport { assertArgument, invariant } from '@dxos/invariant';\nimport { getDeep, setDeep } from '@dxos/util';\n\nimport { getSchemaURI } from '../../Annotation/annotations';\nimport { toEffectSchema } from '../../JsonSchema/json-schema';\nimport { ObjectDeletedId, ParentId, SchemaId, StaticTypeSchemaSlot, TypeEntityId, TypeId } from '../types';\nimport { executeChange, isInChangeContext, queueNotification } from './change-context';\nimport { defineHiddenProperty } from './define-hidden-property';\nimport { createPropertyDeleteError } from './errors';\nimport { batchEvents } from './event-batch';\nimport {\n getEchoRoot,\n getOwner,\n getRawTarget,\n hasForeignOwner,\n notifyOwnerChain,\n setOwnerRecursive,\n wouldCreateCycle,\n} from './ownership';\nimport { type ReactiveHandler, objectData } from './proxy-types';\nimport {\n createProxy,\n isProxy,\n isReactiveRecord,\n isValidProxyTarget,\n normalizeSpliceRange,\n symbolIsProxy,\n symbolReactivePrototype,\n} from './proxy-utils';\nimport { ReactiveArray } from './reactive-array';\nimport { SchemaValidator } from './schema-validator';\nimport { ChangeId, EventId } from './symbols';\n\n// Re-export for external consumers.\nexport { getEchoRoot, setMetaOwner } from './ownership';\n\ntype ProxyTarget = {\n /**\n * Typename or type DXN.\n */\n [TypeId]: string;\n\n /**\n * Schema for the root.\n */\n [SchemaId]: Schema.Schema.AnyNoContext;\n [ParentId]?: any;\n\n /**\n * For modifications.\n */\n [EventId]: Event<void>;\n} & ({ [key: keyof any]: any } | any[]);\n\n/**\n * Deep copy a value, handling arrays and nested objects.\n * Preserves ReactiveArray type and hidden properties (SchemaId, TypeId).\n * Does not copy class instances or functions (except ReactiveArray).\n *\n * Note: Cannot use structuredClone because we need to:\n * - Unwrap proxies\n * - Preserve ReactiveArray instances\n * - Copy Symbol-keyed hidden properties (SchemaId, TypeId)\n * - Convert plain arrays to ReactiveArray\n *\n * Performance: O(n) where n is the total number of nested objects/arrays.\n * For large structures, consider using Refs for frequently reassigned subtrees.\n */\nconst deepCopy = <T>(value: T, visited = new Map<object, object>()): T => {\n if (value == null || typeof value !== 'object') {\n return value;\n }\n\n // Handle proxies - get the underlying target.\n const actualValue = getRawTarget(value);\n\n // Check for circular references in the copy.\n if (visited.has(actualValue)) {\n return visited.get(actualValue) as T;\n }\n\n // Handle ReactiveArray specially to preserve reactivity.\n if (actualValue instanceof ReactiveArray) {\n const copy = new ReactiveArray<any>();\n visited.set(actualValue, copy);\n for (const item of actualValue) {\n copy.push(deepCopy(item, visited));\n }\n // Copy hidden properties.\n copyHiddenProperties(actualValue, copy);\n return copy as T;\n }\n\n // Don't copy other class instances (objects with non-Object prototype). A reactive record\n // (its metadata moved onto a behaviour prototype) still counts as a plain data record here.\n const proto = Object.getPrototypeOf(actualValue);\n if (proto !== Array.prototype && proto !== null && !isReactiveRecord(actualValue)) {\n return value; // Return as-is, don't copy class instances.\n }\n\n if (Array.isArray(actualValue)) {\n // Plain arrays become ReactiveArrays.\n const copy = new ReactiveArray<any>();\n visited.set(actualValue, copy);\n for (const item of actualValue) {\n copy.push(deepCopy(item, visited));\n }\n return copy as T;\n }\n\n const copy: Record<string, any> = {};\n visited.set(actualValue, copy);\n for (const key of Object.keys(actualValue)) {\n copy[key] = deepCopy((actualValue as any)[key], visited);\n }\n // Copy hidden properties (SchemaId, TypeId).\n copyHiddenProperties(actualValue, copy);\n return copy as T;\n};\n\n/**\n * Copy hidden properties (SchemaId, TypeId) from source to target.\n */\nconst copyHiddenProperties = (source: any, target: any): void => {\n if (SchemaId in source) {\n defineHiddenProperty(target, SchemaId, source[SchemaId]);\n }\n if (TypeId in source) {\n defineHiddenProperty(target, TypeId, source[TypeId]);\n }\n};\n\n//\n// Object layering for an in-memory typed reactive object (`TypedReactiveHandler`).\n//\n// Unlike the database-backed handler (echo-client/echo-prototypes.ts), here USER DATA lives as\n// real OWN properties on the target — there is no document behind it. Only the per-object metadata\n// is relocated onto a prototype, so swapping handlers doesn't disturb the data shape:\n//\n// proxy ──Proxy(target, ProxyHandlerSlot → TypedReactiveHandler)\n// │ get/set/has/... traps run here\n// ▼\n// target the user's object. OWN enumerable props = user data ({ name, age, ... });\n// │ [[Prototype]] OWN symbol props are removed by `compactMetadataToInstanceState` after init.\n// ▼\n// instanceState `Object.create(TypedObjectPrototype)`. Holds the relocated symbol-keyed\n// │ [[Prototype]] metadata as hidden props: [EventId] (root only), [ObjectDeletedId], [SchemaId],\n// │ [TypeId], [TypeEntityId], cached [StaticTypeSchemaSlot], ... (Arrays are\n// │ exempt — they keep their ReactiveArray chain and are never compacted.)\n// ▼\n// TypedObjectPrototype shared behaviour. Carries [symbolReactivePrototype]=true (so the\n// │ [[Prototype]] \"plain object\" gates still treat the record as data) plus the system\n// │ accessors [objectData], [ChangeId], [StaticTypeSchemaSlot]; the get trap\n// │ delegates to these via `isBehaviourAccessor` instead of switching.\n// ▼\n// Object.prototype ──▶ null a `getPrototypeOf` trap reports `Object.prototype` so consumers\n// see a plain object; the real instanceState prototype stays hidden.\n//\n// Root vs nested: a root object owns an `[EventId]`; nested records share their root's reactivity\n// and have none. That presence is the \"is this an initialized root\" signal (it replaced an earlier\n// `[ChangeId] === true` marker).\n//\n// `this` in the accessors below: the get trap calls `Reflect.get(target, prop, receiver)`, so\n// `this` is the PROXY (receiver) on the common path, or the raw target when read directly.\n// `getRawTarget(this)` normalizes to the underlying target — needed here because user data and the\n// metadata chain both hang off the raw target, and `executeChange` keys the change context by it.\n//\n/**\n * Behaviour prototype for typed reactive records. A record's per-object metadata is moved onto an\n * intermediate instance-state object whose prototype is this, so that swapping the handler that\n * backs an object (e.g. an in-memory object becoming database-backed) is a prototype re-point that\n * doesn't perturb the target's own-property shape. Marked as a reactive prototype so the \"plain\n * object\" gates (`isValidProxyTarget` / `deepCopy`) still treat such targets as data records.\n */\nconst TypedObjectPrototype: object = Object.create(Object.prototype);\ndefineHiddenProperty(TypedObjectPrototype, symbolReactivePrototype, true);\n\n// The ECHO system surface is exposed as accessors on the behaviour prototype rather than as\n// branches in the `get` trap. `this` is the proxy receiver (or the raw target when read directly);\n// `getRawTarget` resolves either to the underlying target.\nObject.defineProperties(TypedObjectPrototype, {\n // TODO(burdon): Remove?\n [objectData]: {\n get(this: ProxyTarget) {\n return toJSON(getRawTarget(this));\n },\n },\n [ChangeId]: {\n // A function that runs a mutation inside a controlled change context. Only root objects (which\n // own an `EventId`) expose one; nested records share their root's reactivity and return undefined.\n get(this: ProxyTarget) {\n const target = getRawTarget(this);\n if (!(EventId in target)) {\n return undefined;\n }\n return (callback: (obj: any) => void) => executeChange(target, target, this, callback);\n },\n },\n [StaticTypeSchemaSlot]: {\n // Lazily rebuild the source Effect Schema from `jsonSchema` and cache it as an own (hidden)\n // property so subsequent reads short-circuit this accessor; the set-trap deletes the cache when\n // `jsonSchema` is mutated.\n get(this: ProxyTarget) {\n const target = getRawTarget(this);\n const jsonSchema = (target as any).jsonSchema;\n if (jsonSchema == null) {\n return undefined;\n }\n const rebuilt = toEffectSchema(jsonSchema);\n defineHiddenProperty(target, StaticTypeSchemaSlot, rebuilt);\n return rebuilt;\n },\n },\n});\n\n/** True if `prop` resolves to an accessor on the behaviour-prototype chain (not an own property). */\nconst isBehaviourAccessor = (target: object, prop: symbol): boolean => {\n let proto = Object.getPrototypeOf(target);\n while (proto != null && proto !== Object.prototype) {\n const descriptor = Object.getOwnPropertyDescriptor(proto, prop);\n if (descriptor != null) {\n return descriptor.get != null;\n }\n proto = Object.getPrototypeOf(proto);\n }\n return false;\n};\n\n/**\n * Enforce that user-data mutations only happen inside `Obj.update()`. A root object owns an\n * `EventId` once initialized; before that (and for non-root records or symbol-keyed system\n * properties) mutations pass through. Returns whether the root is initialized so callers can gate\n * change notifications.\n */\nconst assertMutableWithinChange = (echoRoot: object, prop: string | symbol): boolean => {\n const isInitialized = EventId in echoRoot;\n if (isInitialized && typeof prop !== 'symbol' && !isInChangeContext(echoRoot)) {\n throw new Error(\n `Cannot modify object property \"${String(prop)}\" outside of Obj.update(). ` +\n 'Use Obj.update(obj, (mutableObj) => { mutableObj.property = value; }) instead.',\n );\n }\n return isInitialized;\n};\n\n/**\n * Move a record's per-object metadata (symbol-keyed hidden properties) onto a fresh instance-state\n * object inserted between the target and {@link TypedObjectPrototype}. The target keeps only its\n * user data as own properties. Arrays are exempt — they keep their own (ReactiveArray) prototype chain.\n */\nconst compactMetadataToInstanceState = (target: ProxyTarget): void => {\n if (Array.isArray(target) || Object.getPrototypeOf(target) !== Object.prototype) {\n return;\n }\n const state = Object.create(TypedObjectPrototype);\n for (const symbol of Object.getOwnPropertySymbols(target)) {\n const descriptor = Object.getOwnPropertyDescriptor(target, symbol)!;\n Object.defineProperty(state, symbol, descriptor);\n // Non-configurable symbols (e.g. `SchemaId`/`TypeId`, locked by `setSchema`/`setTypename` on\n // objects decoded from JSON) cannot be deleted — leave them as an own property on the target,\n // shadowing the copy on `state`; reads still resolve correctly since own properties take\n // precedence over the prototype chain.\n if (descriptor.configurable) {\n // Dynamic delete over arbitrary symbol keys: `ProxyTarget` declares these as required, so the\n // statically-typed view cannot express deleting them; the symbol set is only known at runtime.\n delete (target as any)[symbol];\n }\n }\n Object.setPrototypeOf(target, state);\n};\n\n/**\n * Typed in-memory reactive store (with Schema).\n * Reactivity is based on Event subscriptions, not signals.\n */\nexport class TypedReactiveHandler implements ReactiveHandler<ProxyTarget> {\n public static readonly instance: ReactiveHandler<any> = new TypedReactiveHandler();\n\n readonly _proxyMap = new WeakMap<object, any>();\n private _inSet = false;\n\n private constructor() {}\n\n init(target: ProxyTarget): void {\n assertArgument(typeof target === 'object' && target !== null, 'target');\n invariant(SchemaId in target, 'Schema is not defined for the target');\n\n // Only set EventId on root objects (those without an owner).\n // Nested objects share their root's EventId for centralized reactivity.\n const hasOwner = !!getOwner(target);\n if (!(EventId in target) && !hasOwner) {\n defineHiddenProperty(target, EventId, new Event());\n }\n\n // Default to not-deleted, but preserve a deletion marker already stamped on the target (e.g. by\n // `objectFromJSON` when hydrating a tombstone snapshot).\n if (!(ObjectDeletedId in target)) {\n defineHiddenProperty(target, ObjectDeletedId, false);\n }\n\n // Only set owners if this is a root object (no existing owner).\n // Nested objects already have owners set by their root's initialization.\n // If we re-set owners here for nested objects, we'd incorrectly point\n // array elements to the array instead of the true root ECHO object.\n if (!hasOwner) {\n // Set owner on all nested objects to this root ECHO object.\n // All nested records point directly to this root for centralized reactivity.\n for (const key in target) {\n if ((target as any)[symbolIsProxy]) {\n continue;\n }\n let value = (target as any)[key];\n if (isValidProxyTarget(value) || isProxy(value)) {\n // Deep copy values that have foreign owners (owned by a different object,\n // or are root ECHO objects whose nested structures would be owned by them).\n // This recursively checks all nested objects.\n if (hasForeignOwner(value, target)) {\n value = deepCopy(value);\n (target as any)[key] = value;\n }\n setOwnerRecursive(value, target);\n }\n }\n }\n\n // Maybe have been set by `create`.\n Object.defineProperty(target, inspectCustom, {\n enumerable: false,\n configurable: true,\n value: this._inspect.bind(target),\n });\n\n // Relocate per-object metadata onto an instance-state prototype, leaving only user data as own\n // properties on the target. Done last so all metadata set above (and by `prepareTypedTarget`) moves.\n compactMetadataToInstanceState(target);\n }\n\n /**\n * Hide the internal instance-state prototype so consumers see a plain object; arrays keep their\n * real (ReactiveArray) prototype.\n */\n getPrototypeOf(target: ProxyTarget): object | null {\n return Array.isArray(target) ? Reflect.getPrototypeOf(target) : Object.prototype;\n }\n\n get(target: ProxyTarget, prop: string | symbol, receiver: any): any {\n // The ECHO system surface (objectData, ChangeId, StaticTypeSchemaSlot, ...) lives as accessors\n // on the behaviour prototype; resolve them via Reflect.get and return as-is — these are not user\n // data and must never be proxy-wrapped.\n if (typeof prop === 'symbol' && isBehaviourAccessor(target, prop)) {\n return Reflect.get(target, prop, receiver);\n }\n\n // The back-reference to the type entity is own metadata — return the raw value so we don't\n // re-wrap an already-reactive `Type.Type` entity in another proxy (which would fail the\n // SchemaId-in-target invariant).\n if (prop === TypeEntityId) {\n return Reflect.get(target, prop, receiver);\n }\n\n // Own getter properties (e.g. the `SchemaId` slot installed by `setSchemaProperties`).\n if (Object.getOwnPropertyDescriptor(target, prop)?.get) {\n return Reflect.get(target, prop, receiver);\n }\n\n const value = Reflect.get(target, prop, receiver);\n if (isValidProxyTarget(value)) {\n return createProxy(value, this);\n }\n\n return value;\n }\n\n set(target: ProxyTarget, prop: string | symbol, value: any, receiver: any): boolean {\n const echoRoot = getEchoRoot(target);\n const isInitialized = assertMutableWithinChange(echoRoot, prop);\n\n let result: boolean = false;\n this._inSet = true;\n try {\n batchEvents(() => {\n const { echoRoot: _, preparedValue } = this._prepareValueForAssignment(target, prop, value);\n result = Reflect.set(target, prop, preparedValue, receiver);\n // Invalidate the cached source Effect Schema when `jsonSchema` changes\n // (e.g. `Type.addFields`) so `Type.getSchema` rebuilds from the new shape.\n if (prop === 'jsonSchema') {\n Reflect.deleteProperty(target, StaticTypeSchemaSlot);\n }\n // Queue notification instead of emitting immediately (batched).\n if (isInitialized) {\n queueNotification(echoRoot);\n // Also notify the owner chain so parent objects are updated when nested objects change.\n notifyOwnerChain(target);\n }\n });\n } finally {\n this._inSet = false;\n }\n return result;\n }\n\n ownKeys(target: ProxyTarget): ArrayLike<string | symbol> {\n return Reflect.ownKeys(target);\n }\n\n deleteProperty(target: ProxyTarget, property: string | symbol): boolean {\n const echoRoot = getEchoRoot(target);\n\n // Check readonly enforcement - mutations only allowed within Obj.update().\n // Skip for symbol properties (internal infrastructure, not user data).\n const isInitialized = EventId in echoRoot;\n const isSymbolProp = typeof property === 'symbol';\n if (isInitialized && !isSymbolProp && !isInChangeContext(echoRoot)) {\n throw createPropertyDeleteError(property);\n }\n\n const result = Reflect.deleteProperty(target, property);\n if (isInitialized) {\n queueNotification(echoRoot);\n }\n return result;\n }\n\n defineProperty(target: ProxyTarget, property: string | symbol, attributes: PropertyDescriptor): boolean {\n const echoRoot = getEchoRoot(target);\n const isInitialized = assertMutableWithinChange(echoRoot, property);\n\n const { echoRoot: _, preparedValue } = this._prepareValueForAssignment(target, property, attributes.value);\n const result = Reflect.defineProperty(target, property, {\n ...attributes,\n value: preparedValue,\n });\n if (!this._inSet && isInitialized) {\n // Queue notification instead of emitting immediately (batched).\n queueNotification(echoRoot);\n }\n return result;\n }\n\n textUpdate(target: ProxyTarget, path: readonly (string | number)[], newText: string): void {\n this._applyTextMutation(target, path, () => newText);\n }\n\n textSplice(\n target: ProxyTarget,\n path: readonly (string | number)[],\n start: number,\n deleteCount: number,\n insert: string,\n ): string {\n let removed = '';\n this._applyTextMutation(target, path, (current) => {\n const range = normalizeSpliceRange(current.length, start, deleteCount);\n removed = current.slice(range.start, range.start + range.deleteCount);\n return current.slice(0, range.start) + insert + current.slice(range.start + range.deleteCount);\n });\n return removed;\n }\n\n /**\n * Shared read-modify-write for the in-memory string CRDT path. Mirrors the `set` trap: enforce the\n * change context, then mutate and notify through the same batched notification path so reactivity fires.\n *\n * Writes via `setDeep` on the raw target, intentionally bypassing `_prepareValueForAssignment` /\n * `_validateValue`: a string CRDT delta produces a string, and per-delta schema checks (pattern,\n * maxLength) would reject valid intermediate states during incremental edits. Such constraints are\n * enforced at the initial assignment or as application-level invariants, mirroring the Automerge path.\n */\n private _applyTextMutation(\n target: ProxyTarget,\n path: readonly (string | number)[],\n compute: (current: string) => string,\n ): void {\n const echoRoot = getEchoRoot(target);\n if (!isInChangeContext(echoRoot)) {\n throw new Error(\n `Cannot modify text at \"${path.join('.')}\" outside of Obj.update(). ` +\n 'Use Obj.update(obj, () => { Text.splice(obj, path, ...); }) instead.',\n );\n }\n\n const keyPath = [...path];\n invariant(keyPath.length > 0, 'Text path must be non-empty');\n const current = getDeep(target, keyPath);\n if (typeof current !== 'string') {\n throw new TypeError(`Text mutation target at \"${keyPath.join('.')}\" is not a string.`);\n }\n\n const next = compute(current);\n batchEvents(() => {\n // Write directly on the raw target (not the proxy) and notify through the same batched path\n // the `set` trap uses, so subscribers fire once per `Obj.update`.\n setDeep(target, keyPath, next);\n queueNotification(echoRoot);\n notifyOwnerChain(target);\n });\n }\n\n /**\n * Prepare a value for assignment to a typed object property.\n * Handles cycle detection, copy-on-assign, array conversion, validation, and ownership.\n */\n private _prepareValueForAssignment(\n target: ProxyTarget,\n prop: string | symbol,\n value: any,\n ): { echoRoot: object; preparedValue: any } {\n const echoRoot = getEchoRoot(target);\n\n if (typeof prop === 'symbol') {\n return { echoRoot, preparedValue: value };\n }\n\n // Check for cycles before assignment.\n if (isValidProxyTarget(value) || isProxy(value)) {\n if (wouldCreateCycle(echoRoot, value)) {\n throw new Error('Cannot create cycles in typed object graph. Consider using Ref for circular references.');\n }\n }\n\n // Prevent direct assignment of root ECHO objects (those created with Obj.make/Relation.make).\n // These must be wrapped with Ref.make for proper reference handling.\n // This matches database object behavior for consistency.\n if (isValidProxyTarget(value) || isProxy(value)) {\n const actualValue = getRawTarget(value);\n const isRootEchoObject = EventId in actualValue;\n if (isRootEchoObject) {\n throw new Error('Object references must be wrapped with `Ref.make`');\n }\n }\n\n // Copy-on-assign: If the value is a nested record owned by a different ECHO object, deep copy it.\n if (isValidProxyTarget(value) || isProxy(value)) {\n const actualValue = getRawTarget(value);\n const existingOwner = getOwner(actualValue);\n if (existingOwner != null && existingOwner !== echoRoot) {\n value = deepCopy(value);\n }\n }\n\n // Convert arrays to reactive arrays.\n if (Array.isArray(value) && !(value instanceof ReactiveArray)) {\n value = ReactiveArray.from(value);\n }\n\n const validatedValue = this._validateValue(target, prop, value);\n\n // Set owner on new value to the root ECHO object.\n if (isValidProxyTarget(validatedValue) || isProxy(validatedValue)) {\n setOwnerRecursive(validatedValue, echoRoot);\n }\n\n return { echoRoot, preparedValue: validatedValue };\n }\n\n private _validateValue(target: any, prop: string | symbol, value: any) {\n if (prop === ParentId) {\n return value;\n }\n const schema = SchemaValidator.getTargetPropertySchema(target, prop);\n const _ = Schema.asserts(schema)(value);\n SchemaValidator.assertExactProperties(schema, value, (path) => getDeep(value, path));\n if (isValidProxyTarget(value)) {\n setSchemaProperties(value, schema);\n }\n\n return value;\n }\n\n private _inspect(\n _: number,\n options: InspectOptionsStylized,\n inspectFn: (value: any, options?: InspectOptionsStylized) => string,\n ): string {\n const inspected = inspectFn(this, {\n ...options,\n showHidden: false,\n customInspect: false,\n });\n\n return `Typed ${inspected}`;\n }\n}\n\n/**\n * @deprecated Use `Obj.toJSON` instead.\n */\n// TODO(burdon): Remove?\nconst toJSON = (target: ProxyTarget): any => {\n return { '@type': 'TypedReactiveObject', ...target };\n};\n\n/**\n * Pointer to a `Type.Type` entity, stamped as the back-reference (`TypeEntityId`)\n * on instances and read by the `SchemaId` getter installed below.\n *\n * Structural shape (not `Type.AnyEntity`) because `internal/common/proxy/`\n * can't import the top-level `Type` module without a cycle. Every kind of\n * `Type.Type` entity satisfies this shape:\n * - Static (`Type.makeObject(dxn)` pipe) — slot set directly on the object.\n * - Persisted (echo-handler-wrapped) — slot exposed via that handler's\n * `get` trap (rebuilds from `data.jsonSchema`).\n * - In-memory pre-persist (`Type.makeObjectFromJsonSchema`) — slot exposed\n * via the `case StaticTypeSchemaSlot:` arm in this file's `get` trap.\n */\nexport type TypeSource = { readonly [StaticTypeSchemaSlot]?: Schema.Schema.AnyNoContext };\n\n/**\n * Recursively set AST on all potential proxy targets.\n *\n * @param skipOwnStamp Skip stamping `TypeId`/`SchemaId` on `obj` itself (still recurses into\n * children, which always get stamped). Used for objects decoded from JSON, whose own `TypeId`/\n * `SchemaId` are already set by `setTypename`/`setSchema` as `configurable: false` — redefining\n * them here (with `configurable: true`) would throw.\n */\nconst setSchemaProperties = (\n obj: any,\n schema: Schema.Schema.AnyNoContext,\n typeSource?: TypeSource,\n skipOwnStamp = false,\n) => {\n if (!skipOwnStamp) {\n const schemaType = getSchemaURI(schema);\n if (schemaType != null) {\n defineHiddenProperty(obj, TypeId, schemaType);\n }\n\n if (typeSource != null) {\n // Keep a back-reference to the type entity so `Obj.getType` /\n // `Relation.getType` / `Entity.getType` can return it.\n defineHiddenProperty(obj, TypeEntityId, typeSource);\n\n // Install `SchemaId` as a getter that reads through the entity's static\n // schema slot. The three entity shapes (static / persisted / in-memory\n // pre-persist) each populate the slot via their own get-trap path, so\n // `Type.update` / `Type.addFields` mutations propagate into validation\n // for objects created via `Obj.make(typeEntity, ...)` without this file\n // having to rebuild from `jsonSchema` itself.\n Object.defineProperty(obj, SchemaId, {\n get: () => typeSource[StaticTypeSchemaSlot] ?? schema,\n enumerable: false,\n configurable: true,\n });\n } else {\n defineHiddenProperty(obj, SchemaId, schema);\n }\n }\n\n if (Array.isArray(obj)) {\n for (let index = 0; index < obj.length; index++) {\n if (isValidProxyTarget(obj[index])) {\n const elementSchema = SchemaValidator.getIndexedElementSchema(schema, index) ?? Schema.Any;\n setSchemaProperties(obj[index], elementSchema);\n }\n }\n return;\n }\n\n for (const key in obj) {\n if (isValidProxyTarget(obj[key])) {\n let elementSchema: Schema.Schema<any>;\n try {\n elementSchema = SchemaValidator.getTargetPropertySchema(obj, key);\n } catch {\n // Property not in schema — treat as untyped so the proxy can still wrap it.\n elementSchema = Schema.Any;\n }\n setSchemaProperties(obj[key], elementSchema);\n }\n }\n};\n\n// Accepts any encoded type: the typed handler operates on the decoded representation, so schemas\n// whose encoded form differs (e.g. refs encode as `{ '/': uri }`) are valid here.\nexport const prepareTypedTarget = <T>(target: T, schema: Schema.Schema<T, any>, typeSource?: TypeSource) => {\n // log.info('prepareTypedTarget', { target, schema });\n validateAndReactifyTarget(target, schema);\n setSchemaProperties(target, schema, typeSource);\n};\n\n/**\n * Validate a target against its schema and convert nested arrays to `ReactiveArray`. Shared by\n * {@link prepareTypedTarget} and {@link prepareDecodedTypedTarget}.\n */\nexport const validateAndReactifyTarget = <T>(target: T, schema: Schema.Schema<T, any>) => {\n if (!SchemaAST.isTypeLiteral(schema.ast)) {\n throw new Error('schema has to describe an object type');\n }\n\n SchemaValidator.validateSchema(schema);\n const _ = Schema.asserts(schema)(target);\n SchemaValidator.assertExactProperties(schema, target, (path) => getDeep(target, path));\n makeArraysReactive(target);\n};\n\n/**\n * Like {@link prepareTypedTarget}, for a target whose own `SchemaId`/`TypeId` are already stamped\n * and locked `configurable: false` — e.g. an object decoded from JSON via `setSchema`/`setTypename`\n * (see `objectFromJSON`). Validates and reactifies as usual, then stamps `SchemaId`/`TypeId` on\n * nested records/arrays only, leaving the target's own (locked) stamps untouched.\n */\nexport const prepareDecodedTypedTarget = <T>(target: T, schema: Schema.Schema<T, any>) => {\n validateAndReactifyTarget(target, schema);\n setSchemaProperties(target, schema, undefined, true);\n};\n\nconst makeArraysReactive = (target: any) => {\n for (const key in target) {\n if (target[symbolIsProxy]) {\n continue;\n }\n if (Array.isArray(target[key])) {\n target[key] = ReactiveArray.from(target[key]);\n }\n if (typeof target[key] === 'object') {\n makeArraysReactive(target[key]);\n }\n }\n};\n","//\n// Copyright 2024 DXOS.org\n//\n\nimport type * as Schema from 'effect/Schema';\n\nimport { EntityId } from '@dxos/keys';\n\nimport { getTypeAnnotation } from '../../Annotation/annotations';\nimport { type AnyProperties, KindId, ParentId, SchemaId, SchemaKindId, StaticTypeSchemaSlot } from '../types';\nimport { type EntityMeta, EntityMetaSchema } from '../types/meta';\nimport { MetaId } from '../types/model-symbols';\nimport { defineHiddenProperty } from './define-hidden-property';\nimport { attachTypedJsonSerializer } from './json-serializer';\nimport { createProxy, getProxyTarget, isProxy, isValidProxyTarget } from './proxy-utils';\nimport {\n TypedReactiveHandler,\n TypeSource,\n prepareDecodedTypedTarget,\n prepareTypedTarget,\n setMetaOwner,\n} from './typed-handler';\n\n/**\n *\n */\n// TODO(burdon): Make internal\n// Omits the brand slots — those get stamped on the instance by the entity\n// handler (KindId via setKind, SchemaKindId derived in the proxy `get` trap\n// from kind + jsonSchema.entityKind, StaticTypeSchemaSlot lazily via the\n// proxy), not supplied by the caller.\nexport type MakeObjectProps<T extends AnyProperties> = Omit<T, 'id' | KindId | SchemaKindId | StaticTypeSchemaSlot>;\n\n/**\n * Creates a reactive object from a plain Javascript object.\n * Requires a TS-effect schema.\n *\n * Callers that have a `Type.Type` entity (not a raw schema) must unwrap it\n * themselves — `Obj.make` / `Relation.make` do this via `Type.getSchema(...)`\n * and pass the entity through as `typeSource` so the instance carries a\n * back-reference for `Obj.getType` and resolves the live source schema\n * uniformly via the entity's `[StaticTypeSchemaSlot]`.\n */\n// TODO(burdon): Make internal\n// TODO(dmaretskyi): Deep mutability.\n// TODO(dmaretskyi): Invert generics (generic over schema) to have better error messages.\n// TODO(dmaretskyi): Could mutate original object making it unusable.\nexport const makeObject = <T extends AnyProperties>(\n schema: Schema.Schema<T, any, never>,\n obj: NoInfer<MakeObjectProps<T>>,\n meta?: Partial<EntityMeta>,\n typeSource?: TypeSource,\n): T => {\n // Use Object.assign to copy symbol properties (like ParentId) that spread operator doesn't copy.\n return createReactiveObject<T>(Object.assign({}, obj) as T, meta, schema as Schema.Schema<T, any>, typeSource);\n};\n\nconst createReactiveObject = <T extends AnyProperties>(\n obj: T,\n meta?: Partial<EntityMeta>,\n schema?: Schema.Schema<T>,\n typeSource?: TypeSource,\n): T => {\n if (!isValidProxyTarget(obj)) {\n throw new Error('Value cannot be made into a reactive object.');\n }\n\n if (!schema) {\n throw new Error('Schema is required for reactive objects. Use Atom for untyped reactive state.');\n }\n\n // Extract parent from props (can be set via [Obj.Parent]).\n const parent = (obj as any)[ParentId];\n if (parent !== undefined) {\n delete (obj as any)[ParentId];\n }\n\n const annotation = getTypeAnnotation(schema);\n if (annotation) {\n setIdOnTarget(obj);\n defineHiddenProperty(obj, KindId, annotation.kind);\n }\n initMeta(obj, meta);\n if (parent !== undefined) {\n defineHiddenProperty(obj, ParentId, parent);\n }\n prepareTypedTarget(obj, schema, typeSource);\n attachTypedJsonSerializer(obj);\n const proxy = createProxy<T>(obj, TypedReactiveHandler.instance);\n\n // Set meta's owner to the main object so meta mutations respect the parent's change context.\n // For non-database objects using TypedReactiveHandler, this links the meta to the main object's\n // change context. For database objects, meta is handled by EchoReactiveHandler.getMeta().\n const metaProxy = (obj as any)[MetaId];\n if (metaProxy) {\n const metaTarget = getProxyTarget(metaProxy);\n if (metaTarget) {\n setMetaOwner(metaTarget, obj);\n }\n }\n\n return proxy;\n};\n\n/**\n * Rewrap an object decoded from JSON (via `objectFromJSON`) into a live reactive proxy, so that\n * `Obj.update` synchronously mutates it and `Obj.subscribe`/atoms fire — the same contract as\n * automerge-backed objects. Unlike {@link makeObject}, the target already carries `SchemaId`/\n * `TypeId` stamped by `setSchema`/`setTypename` (both `configurable: false`), so this does not\n * re-derive or re-stamp them — it only validates against the schema, reactifies nested arrays,\n * rewraps `[MetaId]` as a live nested proxy, and wraps the whole object in a proxy.\n *\n * Objects whose type could not be resolved at decode time (no `SchemaId`) are returned unchanged —\n * they remain plain snapshots and `Obj.update` on them stays a no-op, since there is no schema to\n * validate mutations against.\n */\nexport const makeDecodedEntityLive = <T extends AnyProperties>(obj: T): T => {\n const schema = (obj as any)[SchemaId] as Schema.Schema<T, any> | undefined;\n if (!schema) {\n return obj;\n }\n\n prepareDecodedTypedTarget(obj, schema);\n\n const meta = (obj as any)[MetaId];\n if (meta != null && typeof meta === 'object' && !isProxy(meta)) {\n prepareTypedTarget(meta, EntityMetaSchema);\n const metaProxy = createProxy(meta, TypedReactiveHandler.instance);\n defineHiddenProperty(obj, MetaId, metaProxy);\n const metaTarget = getProxyTarget(metaProxy);\n setMetaOwner(metaTarget, obj);\n }\n\n attachTypedJsonSerializer(obj);\n return createProxy(obj, TypedReactiveHandler.instance);\n};\n\n/**\n * Set ID on ECHO object targets during creation.\n * Used for objects with schema and the ones explicitly marked as Expando.\n */\nconst setIdOnTarget = (target: any) => {\n // invariant(!('id' in target), 'Object already has an `id` field, which is reserved.');\n if ('id' in target && target.id !== undefined && target.id !== null) {\n if (!EntityId.isValid(target.id)) {\n throw new Error('Invalid object id format.');\n }\n } else {\n target.id = EntityId.random();\n }\n};\n\n/**\n * Set metadata on object.\n */\n// TODO(dmaretskyi): Move to echo-schema.\nconst initMeta = <T>(obj: T, meta?: Partial<EntityMeta>) => {\n // Backfill required fields so callers may pass a partial meta, or one whose `keys`/`tags`/\n // `annotations` are explicitly `undefined` (coalesce, don't let a spread reintroduce undefined).\n const fullMeta: EntityMeta = {\n ...meta,\n keys: meta?.keys ?? [],\n tags: meta?.tags ?? [],\n annotations: meta?.annotations ?? {},\n };\n prepareTypedTarget(fullMeta, EntityMetaSchema);\n defineHiddenProperty(obj, MetaId, createProxy(fullMeta, TypedReactiveHandler.instance as any));\n};\n","//\n// Copyright 2024 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\nimport * as SchemaAST from 'effect/SchemaAST';\nimport type * as Types from 'effect/Types';\n\nimport { DXN, EntityId } from '@dxos/keys';\nimport { type ToMutable } from '@dxos/util';\n\nimport { type TypeAnnotation, TypeAnnotationId } from '../Annotation/annotations';\nimport { makeTypeJsonSchemaAnnotation } from '../Annotation/util';\nimport { defineHiddenProperty } from '../common/proxy/define-hidden-property';\nimport { makeObject } from '../common/proxy/make-object';\nimport { getProxyTarget } from '../common/proxy/proxy-utils';\nimport {\n type AnyEntity,\n EntityKind,\n InstancePhantomId,\n KindId,\n SchemaKindId,\n StaticTypeSchemaSlot,\n} from '../common/types';\nimport { type EntityMeta } from '../common/types/meta';\nimport { JsonSchemaType } from '../JsonSchema/json-schema-type';\n\n// TODO(burdon): Define Schema type for `typename` and use consistently for all DXN-like properties.\n\n// type RequiredKeys<T> = { [K in keyof T]-?: {} extends Pick<T, K> ? never : K }[keyof T];\nexport type EchoTypeSchemaProps<T, ExtraFields = {}> = Types.Simplify<AnyEntity & ToMutable<T> & ExtraFields>;\n\n/**\n * Options accepted by every `Type.makeObject` / `Type.makeRelation` / type-kind\n * factory. Defaults are derived from `(typename, version)` so callers normally\n * pass nothing.\n */\nexport type EchoTypeOptions = {\n /**\n * Override the entity id stamped on the in-memory `Type.Type` value.\n *\n * Defaults to `EntityId.deterministic(typename, version)` — stable across processes\n * and workerd-safe (no `crypto.getRandomValues()` at module-evaluation time).\n * Pass an explicit id (typically `EntityId.random()`) to opt out of the\n * deterministic default.\n */\n id?: EntityId;\n};\n\n/**\n * In-memory `Type.Type` entity shape produced by `Type.makeObject(dxn)` /\n * `Type.makeRelation({...})`. A live reactive `TypeSchema` instance —\n * identical to a persisted `Type.Type` except for database attachment.\n *\n * NOT a `Schema.Schema`. The underlying Effect Schema is cached on the hidden\n * `StaticTypeSchemaSlot` slot — retrieve it via `Type.getSchema(...)`.\n */\n// TODO(burdon): Rename EchoEntitySchema.\nexport interface EchoTypeSchema<\n Self extends Schema.Schema.Any,\n ExtraFields = {},\n K extends EntityKind = EntityKind,\n Fields extends Schema.Struct.Fields = Schema.Struct.Fields,\n> {\n /**\n * Entity-kind brand. Type entities are their own kind (`Type`) regardless of\n * the kind of instance they describe — `[SchemaKindId]` carries the latter.\n * This lets predicates like `Obj.isObject` / `Relation.isRelation` cleanly\n * reject type entities without also having to inspect `[SchemaKindId]`.\n */\n readonly [KindId]: EntityKind.Type;\n\n /** Schema-kind brand indicating what kind of instance this type describes. */\n readonly [SchemaKindId]: K;\n\n /**\n * Entity id. Always present — stamped at construction — but NOT the type's\n * identity while in-memory: an unattached type resolves its URI to the typename\n * DXN, switching to `echo:/<id>` only once attached to a database (see\n * `getTypeURIFromSpecifier`, which discriminates by database attachment).\n */\n readonly id: EntityId;\n\n /** Source Effect Schema (kept on a hidden slot for `Type.getSchema`). */\n readonly [StaticTypeSchemaSlot]: Schema.Schema.AnyNoContext;\n\n // NOTE: `typename` / `version` are intentionally NOT fields. They live in\n // `EntityMeta` (`key` / `version`); read via `Type.getTypename(self)` /\n // `Type.getVersion(self)`.\n readonly jsonSchema: JsonSchemaType;\n\n /** Struct fields for introspection. */\n readonly fields: Fields;\n\n /** Phantom — instance type produced by `Obj.make(self, ...)`. */\n readonly _instance?: EchoTypeSchemaProps<Schema.Schema.Type<Self>, ExtraFields>;\n\n /**\n * Phantom slot mirroring `Type<A>` so internal helpers (`makeObject`,\n * `createObject`, `Ref.make`) infer the instance type uniformly whether\n * the caller passes an `EchoTypeSchema` or a top-level `Type.Type` entity.\n *\n * Includes the instance-kind brand (`[KindId]`) so the phantom is assignable\n * to the matching public-side interface in `Type.ts` (`Type.Obj` /\n * `Type.Relation` / `Type.Type`). Each kind projects identity: instances of\n * an object-kind schema are object-kind entities, type-kind schemas produce\n * type-kind (persisted Type.Type) entities — the latter additionally carry\n * the `[SchemaKindId]` / `[StaticTypeSchemaSlot]` brands the echo-handler\n * proxy exposes on persisted Type entities.\n */\n readonly [InstancePhantomId]?: EchoTypeSchemaProps<Schema.Schema.Type<Self>, ExtraFields> & {\n readonly [KindId]: K;\n } & (K extends EntityKind.Type\n ? {\n readonly [SchemaKindId]: EntityKind.Type;\n readonly [StaticTypeSchemaSlot]: Schema.Schema.AnyNoContext;\n }\n : {});\n}\n\n// type MakeProps =\n// | boolean\n// | {\n// readonly disableValidation?: boolean;\n// };\n\n// NOTE: Utils copied from Effect `Schema.ts`.\n// const _ownKeys = (o: object): Array<PropertyKey> =>\n// (Object.keys(o) as Array<PropertyKey>).concat(Object.getOwnPropertySymbols(o));\n\n// const _lazilyMergeDefaults = (\n// fields: Schema.Struct.Fields,\n// out: Record<PropertyKey, unknown>,\n// ): { [x: string | symbol]: unknown } => {\n// const ownKeys = _ownKeys(fields);\n// for (const key of ownKeys) {\n// const field = fields[key];\n// if (out[key] === undefined && Schema.isPropertySignature(field)) {\n// const ast = field.ast;\n// const defaultValue = ast._tag === 'PropertySignatureDeclaration' ? ast.defaultValue : ast.to.defaultValue;\n// if (defaultValue !== undefined) {\n// out[key] = defaultValue();\n// }\n// }\n// }\n// return out;\n// };\n\n// const _getDisableValidationMakeOption = (options: MakeProps | undefined): boolean =>\n// Predicate.isBoolean(options) ? options : options?.disableValidation ?? false;\n\n/**\n * Identity (typename + version) of the type meta-schema — the `Type.Type` that\n * every ECHO type entity is itself an instance of. Shared by the materialisation\n * vehicle ({@link persistentEntitySchema}) and `TypeSchema` so the two cannot\n * drift on identity.\n */\nexport const TypeMetaSchemaDXN = DXN.make('org.dxos.type.schema', '0.1.0');\n\n/**\n * Effect Schema that every `Type.Type` entity is an instance of: the meta-schema\n * struct `{ name?, jsonSchema, id }` branded as a type-kind ECHO entity. This is\n * the materialisation vehicle for `makeObject` below — the canonical user-facing\n * entity is `Type/type-schema.ts`'s `TypeSchema`, which carries the same shape\n * plus UI annotations.\n *\n * Kept self-contained (no import of `TypeSchema`) to avoid a bootstrap cycle:\n * `TypeSchema` is itself produced via `makeEchoTypeSchema`, so this builder must\n * not depend on it. `jsonSchema` is declared optional here (only on the\n * materialisation vehicle — the canonical `TypeSchema` keeps it required) so the\n * construction-time `Schema.asserts` does not force the field before it is\n * attached; it is populated immediately after via a lazy accessor (see\n * `makeEchoTypeSchema`).\n */\n// TODO(wittjosiah): Reconcile with `TypeSchema` (`Type/type-schema.ts`).\n// Both describe the same `org.dxos.type.schema` shape.\nconst persistentEntitySchema: Schema.Schema.AnyNoContext = (() => {\n const typename = DXN.getName(TypeMetaSchemaDXN);\n const version = DXN.getVersion(TypeMetaSchemaDXN)!;\n const struct = Schema.Struct({\n name: Schema.optional(Schema.String),\n jsonSchema: JsonSchemaType.pipe(Schema.optional),\n id: EntityId,\n });\n const ast = SchemaAST.annotations(struct.ast, {\n [TypeAnnotationId]: { kind: EntityKind.Type, typename, version } satisfies TypeAnnotation,\n [SchemaAST.JSONSchemaAnnotationId]: makeTypeJsonSchemaAnnotation({ kind: EntityKind.Type, typename, version }),\n });\n return Schema.make(ast);\n})();\n\n/**\n * @internal\n *\n * Build an in-memory `Type.Type` entity (the value returned by `Type.makeObject`\n * / `Type.makeRelation`). The result is a LIVE reactive `TypeSchema`\n * instance — identical in every respect to a persisted `Type.Type` except that\n * it is not yet attached to a database. It is mutable via `Type.update`, can be\n * passed to `db.add(...)` (which keeps the same proxy and swaps the handler),\n * and round-trips through `jsonSchema`.\n *\n * The source Effect Schema describing the user's type is cached on\n * `[StaticTypeSchemaSlot]` so `Type.getSchema(...)` returns it without a\n * jsonSchema round-trip; the cache is invalidated by the proxy set-trap when\n * `jsonSchema` is mutated (see `typed-handler.ts`).\n */\nexport const makeEchoTypeSchema = <\n Self extends Schema.Schema.Any,\n K extends EntityKind = EntityKind,\n // TODO(wittjosiah): Can this be inferred from the schema?\n Fields extends Schema.Struct.Fields = Schema.Struct.Fields,\n>(\n fields: Fields,\n ast: SchemaAST.AST,\n typename: string,\n version: string,\n kind: K,\n computeJsonSchema: () => JsonSchemaType,\n explicitId?: EntityId,\n): EchoTypeSchema<Self, {}, K, Fields> => {\n // Source Effect Schema describing the user's type — cached for `Type.getSchema`.\n const sourceSchema = Schema.make<\n EchoTypeSchemaProps<Schema.Schema.Type<Self>>,\n EchoTypeSchemaProps<Schema.Schema.Encoded<Self>>,\n Schema.Schema.Context<Self>\n >(ast);\n\n // `typename` / `version` route through `EntityMeta` (`key` / `version`) — the\n // canonical registry-provenance pair — not data fields. `keys` is empty for\n // in-memory declarations until persisted.\n const meta: Partial<EntityMeta> = { keys: [], key: typename, version };\n\n // Default to a deterministic id derived from `(typename, version)` so that\n // constructing a `Type.Type` entity never reaches `crypto.getRandomValues()`.\n // Cloudflare workerd forbids RNG calls in global scope, and the ~hundreds of\n // `Type.makeObject(...)` call sites across the monorepo execute at module top.\n // `setIdOnTarget` (see `proxy/make-object.ts`) short-circuits on a pre-supplied\n // valid id, so this also bypasses the `EntityId.random()` path inside `makeObject`.\n // Callers can override via `Type.makeObject(dxn, { id })` when they want a fresh\n // random id (e.g. inside a request handler where workerd does allow RNG).\n const id = explicitId ?? EntityId.deterministic(typename, version);\n\n // Materialise as a live reactive meta-schema instance. `jsonSchema` is attached\n // below as a getter (not passed here as data) for two reasons; see that accessor.\n const entity = makeObject(persistentEntitySchema, { id } as any, meta);\n\n const target = getProxyTarget(entity)!;\n // `jsonSchema` is always available, but computed once on first read rather than at\n // construction: serializing the AST walks `Schema.suspend(...)` thunks, and for a\n // self-referential type (`Schema.suspend(() => Self)`) that thunk hits `Self`'s TDZ\n // while we're still inside its `const` initializer. A getter also lets reads return\n // the raw object instead of a child reactive proxy.\n let memoizedJsonSchema: JsonSchemaType | undefined;\n Object.defineProperty(target, 'jsonSchema', {\n configurable: true,\n enumerable: true,\n get() {\n return (memoizedJsonSchema ??= computeJsonSchema());\n },\n set(value: JsonSchemaType) {\n memoizedJsonSchema = value;\n },\n });\n // Cache the source Effect Schema (read by `Type.getSchema` via the proxy's\n // `[StaticTypeSchemaSlot]` get-trap; invalidated on `jsonSchema` mutation).\n defineHiddenProperty(target, StaticTypeSchemaSlot, sourceSchema);\n // Schema-kind brand: what kind of instance this type describes. There is no\n // database handler to derive it for in-memory entities, so stamp it directly.\n defineHiddenProperty(target, SchemaKindId, kind);\n // Struct fields for introspection. A getter (not a data property) so reads return\n // the raw fields object rather than a child reactive proxy.\n Object.defineProperty(target, 'fields', { configurable: true, enumerable: false, get: () => fields });\n\n return entity as unknown as EchoTypeSchema<Self, {}, K, Fields>;\n};\n\nexport { isEntity } from './guard';\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport type * as Types from 'effect/Types';\n\nimport { JsonSchemaFields, type JsonSchemaType } from './json-schema-type';\n\n/**\n * Normalize schema to to draft-07 format.\n * Note: the input type does not necessarily match the {@link JsonSchemaType} type.\n */\nexport const normalizeSchema = (schema: JsonSchemaType): JsonSchemaType => {\n const copy = structuredClone(schema) as Types.DeepMutable<JsonSchemaType>;\n go(copy);\n return copy;\n};\n\nconst go = (schema: Types.DeepMutable<JsonSchemaType>) => {\n if (typeof schema !== 'object' || schema === null) {\n return;\n }\n\n if ((schema as any).exclusiveMaximum === true) {\n schema.exclusiveMaximum = schema.maximum;\n delete (schema as any).exclusiveMaximum;\n } else if ((schema as any).exclusiveMaximum === false) {\n delete (schema as any).exclusiveMaximum;\n }\n\n if ((schema as any).exclusiveMinimum === true) {\n schema.exclusiveMinimum = schema.minimum;\n delete (schema as any).exclusiveMinimum;\n } else if ((schema as any).exclusiveMinimum === false) {\n delete (schema as any).exclusiveMinimum;\n }\n\n // Delete all properties that are not in the JsonSchemaFields.\n for (const key of Object.keys(schema)) {\n if (!JsonSchemaFields.includes(key)) {\n delete (schema as any)[key];\n }\n }\n\n // Recursively normalize the schema.\n // Recursively normalize the schema.\n if (schema.properties) {\n goOnRecord(schema.properties);\n }\n if (schema.patternProperties) {\n goOnRecord(schema.patternProperties);\n }\n if (schema.propertyNames) {\n go(schema.propertyNames);\n }\n if (schema.definitions) {\n goOnRecord(schema.definitions);\n }\n if (schema.items) {\n maybeGoOnArray(schema.items);\n }\n if (schema.additionalItems) {\n maybeGoOnArray(schema.additionalItems);\n }\n if (schema.contains) {\n go(schema.contains);\n }\n if (schema.if) {\n go(schema.if);\n }\n if (schema.then) {\n go(schema.then);\n }\n if (schema.else) {\n go(schema.else);\n }\n if (schema.allOf) {\n maybeGoOnArray(schema.allOf);\n }\n if (schema.anyOf) {\n maybeGoOnArray(schema.anyOf);\n }\n if (schema.oneOf) {\n maybeGoOnArray(schema.oneOf);\n }\n if (schema.not) {\n go(schema.not);\n }\n if (schema.$defs) {\n goOnRecord(schema.$defs);\n }\n if (schema.reference) {\n go(schema.reference.schema);\n }\n};\n\nconst maybeGoOnArray = (value: any) => {\n if (Array.isArray(value)) {\n for (const item of value) {\n go(item);\n }\n } else if (typeof value === 'object' && value !== null) {\n go(value);\n }\n};\n\nconst goOnRecord = (record: Record<string, any>) => {\n for (const key of Object.keys(record)) {\n go(record[key]);\n }\n};\n","//\n// Copyright 2024 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\nimport * as SchemaAST from 'effect/SchemaAST';\n\nimport { invariant } from '@dxos/invariant';\nimport { DXN, type EntityId } from '@dxos/keys';\n\nimport type * as Type from '../../Type';\nimport { type TypeAnnotation, TypeAnnotationId } from '../Annotation/annotations';\nimport { makeTypeJsonSchemaAnnotation } from '../Annotation/util';\nimport { EntityKind } from '../common/types';\nimport { toJsonSchema } from '../JsonSchema';\nimport { type EchoTypeOptions, type EchoTypeSchema, makeEchoTypeSchema } from './entity';\n\n/**\n * Object schema type with kind marker.\n */\nexport type EchoObjectSchema<\n Self extends Schema.Schema.Any,\n Fields extends Schema.Struct.Fields = Schema.Struct.Fields,\n> = EchoTypeSchema<Self, {}, EntityKind.Object, Fields>;\n\n/**\n * Schema for Obj entity types.\n * Pipeable function to add ECHO object annotations to a schema.\n */\nexport const EchoObjectSchema: {\n (\n dxn: DXN.DXN,\n options?: EchoTypeOptions,\n ): <Self extends Schema.Schema.Any, Fields extends Schema.Struct.Fields = Schema.Struct.Fields>(\n self: Self & { fields?: Fields },\n ) => EchoObjectSchema<Self, Fields>;\n} = (dxn, options) => {\n const typename = DXN.getName(dxn);\n const version = DXN.getVersion(dxn);\n invariant(version, `Type.makeObject requires a versioned DXN: ${dxn}`);\n\n return <Self extends Schema.Schema.Any, Fields extends Schema.Struct.Fields = Schema.Struct.Fields>(\n self: Self & { fields?: Fields },\n ): EchoObjectSchema<Self, Fields> => {\n invariant(typeof TypeAnnotationId === 'symbol', 'Sanity.');\n invariant(SchemaAST.isTypeLiteral(self.ast), 'Schema must be a TypeLiteral.');\n\n // Extract fields from the schema if available (Struct schemas have .fields).\n const fields = ((self as any).fields ?? {}) as Fields;\n\n const schemaWithId = Schema.extend(self, Schema.Struct({ id: Schema.String }));\n const ast = SchemaAST.annotations(schemaWithId.ast, {\n // TODO(dmaretskyi): `extend` kills the annotations.\n ...self.ast.annotations,\n [TypeAnnotationId]: { kind: EntityKind.Object, typename, version } satisfies TypeAnnotation,\n // TODO(dmaretskyi): TypeIdentifierAnnotationId?\n [SchemaAST.JSONSchemaAnnotationId]: makeTypeJsonSchemaAnnotation({\n kind: EntityKind.Object,\n typename,\n version,\n }),\n });\n\n return makeEchoTypeSchema<Self, EntityKind.Object, Fields>(\n fields,\n ast,\n typename,\n version,\n EntityKind.Object,\n () => toJsonSchema(Schema.make(ast)),\n options?.id,\n );\n };\n};\n\nexport const makeObjectType = <Self, _Schema extends Schema.Schema.Any>(\n dxn: DXN.DXN,\n schema: _Schema,\n options?: { id?: EntityId },\n): Type.ObjClass<Self, Schema.Schema.Type<_Schema>, {}> => {\n const type = EchoObjectSchema(dxn, options)(schema);\n const constructor = function ObjectType() {};\n Object.setPrototypeOf(constructor, type);\n // Boundary cast: constructor/prototype wiring cannot be expressed in TypeScript's type system.\n return constructor as unknown as Type.ObjClass<Self, Schema.Schema.Type<_Schema>, {}>;\n};\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\nimport * as SchemaAST from 'effect/SchemaAST';\n\nimport { raise } from '@dxos/debug';\nimport { assertArgument, invariant } from '@dxos/invariant';\nimport { DXN, type EntityId } from '@dxos/keys';\n\n// Type-only imports (erased at runtime — no import cycle); `internal` may depend\n// on the top-level `Obj` / `Type` API at the type level only.\nimport type * as Obj from '../../Obj';\nimport type * as Type from '../../Type';\nimport {\n type TypeAnnotation,\n TypeAnnotationId,\n getEntityKind,\n getSchemaTypename,\n getTypeIdentifierAnnotation,\n} from '../Annotation/annotations';\nimport { makeTypeJsonSchemaAnnotation } from '../Annotation/util';\nimport {\n ATTR_RELATION_SOURCE,\n ATTR_RELATION_TARGET,\n EntityKind,\n RelationSourceDXNId,\n RelationSourceId,\n RelationTargetDXNId,\n RelationTargetId,\n type UnknownTypeSchema,\n getStaticTypeSchema,\n} from '../common/types';\n\nexport {\n ATTR_RELATION_SOURCE,\n ATTR_RELATION_TARGET,\n RelationSourceDXNId,\n RelationSourceId,\n RelationTargetDXNId,\n RelationTargetId,\n};\n\nimport { toJsonSchema } from '../JsonSchema';\nimport { type EchoTypeSchema, makeEchoTypeSchema } from './entity';\n\n/**\n * Source and target props on relations.\n */\n// TODO(burdon): any?\nexport type RelationSourceTargetRefs<Source = any, Target = any> = {\n /**\n * Source ECHO live object.\n */\n [RelationSourceId]: Source;\n\n /**\n * Target ECHO live object.\n */\n [RelationTargetId]: Target;\n};\n\nexport type RelationSource<R> = R extends RelationSourceTargetRefs<infer Source, infer _Target> ? Source : never;\nexport type RelationTarget<R> = R extends RelationSourceTargetRefs<infer _Source, infer Target> ? Target : never;\n\n/**\n * Accepted relation endpoint: an object-kind `Type.Type` entity (slot-backed)\n * or the branded `Obj.Unknown` schema. Source/target are constrained to these\n * — relations only connect object-kind entities.\n */\nexport type RelationEndpoint = Type.AnyObj | UnknownTypeSchema<any, EntityKind.Object>;\n\n/**\n * Resolves a relation endpoint to the instance type it describes — the source /\n * target instance recorded on the relation's `RelationSourceTargetRefs`.\n */\nexport type RelationEndpointInstance<S> =\n S extends UnknownTypeSchema<infer A, any> ? A : S extends Type.AnyObj ? Type.InstanceType<S> : unknown;\n\nexport type EchoRelationSchemaOptions<TSource extends RelationEndpoint, TTarget extends RelationEndpoint> = {\n dxn: DXN.DXN;\n source: TSource;\n target: TTarget;\n /**\n * Override the entity id stamped on the in-memory `Type.Type` value.\n *\n * Defaults to `EntityId.deterministic(typename, version)` — stable across processes\n * and workerd-safe (no `crypto.getRandomValues()` at module-evaluation time).\n */\n id?: EntityId;\n};\n\n/**\n * Relation schema type with kind marker. `SourceInstance` / `TargetInstance`\n * are the resolved endpoint instance types (see {@link RelationEndpointInstance}).\n */\nexport type EchoRelationSchema<\n Self extends Schema.Schema.Any,\n SourceInstance extends Obj.Unknown,\n TargetInstance extends Obj.Unknown,\n Fields extends Schema.Struct.Fields = Schema.Struct.Fields,\n> = EchoTypeSchema<Self, RelationSourceTargetRefs<SourceInstance, TargetInstance>, EntityKind.Relation, Fields>;\n\n/**\n * Schema for Relation entity types.\n */\nexport const EchoRelationSchema = <Source extends RelationEndpoint, Target extends RelationEndpoint>({\n dxn,\n source,\n target,\n id: explicitId,\n}: EchoRelationSchemaOptions<Source, Target>) => {\n // `source` / `target` are `Type.Type` entities (slot-backed) or the branded\n // `Obj.Unknown` schema (used directly); resolve each to its Effect Schema for\n // the schema-side machinery (DXN ref + entity-kind checks).\n const sourceSchema = source != null ? (getStaticTypeSchema(source) ?? source) : source;\n const targetSchema = target != null ? (getStaticTypeSchema(target) ?? target) : target;\n assertArgument(Schema.isSchema(sourceSchema), 'source');\n assertArgument(Schema.isSchema(targetSchema), 'target');\n const typename = DXN.getName(dxn);\n const version = DXN.getVersion(dxn);\n invariant(version, `Type.makeRelation requires a versioned DXN: ${dxn}`);\n const sourceDXN = getDXNForRelationSchemaRef(sourceSchema);\n const targetDXN = getDXNForRelationSchemaRef(targetSchema);\n if (getEntityKind(sourceSchema) !== EntityKind.Object) {\n raise(new Error('Source schema must be an echo object schema.'));\n }\n if (getEntityKind(targetSchema) !== EntityKind.Object) {\n raise(new Error('Target schema must be an echo object schema.'));\n }\n\n return <Self extends Schema.Schema.Any, Fields extends Schema.Struct.Fields = Schema.Struct.Fields>(\n self: Self & { fields?: Fields },\n ): EchoRelationSchema<Self, RelationEndpointInstance<Source>, RelationEndpointInstance<Target>, Fields> => {\n invariant(SchemaAST.isTypeLiteral(self.ast), 'Schema must be a TypeLiteral.');\n\n // Extract fields from the schema if available (Struct schemas have .fields).\n const fields = ((self as any).fields ?? {}) as Fields;\n\n const schemaWithId = Schema.extend(self, Schema.Struct({ id: Schema.String }));\n const ast = SchemaAST.annotations(schemaWithId.ast, {\n // TODO(dmaretskyi): `extend` kills the annotations.\n ...self.ast.annotations,\n [TypeAnnotationId]: {\n kind: EntityKind.Relation,\n typename,\n version,\n sourceSchema: sourceDXN,\n targetSchema: targetDXN,\n } satisfies TypeAnnotation,\n // TODO(dmaretskyi): TypeIdentifierAnnotationId?\n\n [SchemaAST.JSONSchemaAnnotationId]: makeTypeJsonSchemaAnnotation({\n kind: EntityKind.Relation,\n typename,\n version,\n relationSource: sourceDXN,\n relationTarget: targetDXN,\n }),\n });\n\n return makeEchoTypeSchema<Self, EntityKind.Relation, Fields>(\n fields,\n ast,\n typename,\n version,\n EntityKind.Relation,\n () => toJsonSchema(Schema.make(ast)),\n explicitId,\n );\n };\n};\n\nexport const getDXNForRelationSchemaRef = (schema: Schema.Schema.Any): DXN.DXN => {\n assertArgument(Schema.isSchema(schema), 'schema');\n const identifier = getTypeIdentifierAnnotation(schema);\n if (identifier) {\n return DXN.tryMake(identifier) ?? raise(new Error(`Invalid schema identifier: ${identifier}`));\n }\n\n const typename = getSchemaTypename(schema);\n if (!typename) {\n throw new Error('Schema must have a typename');\n }\n\n return DXN.make(typename);\n};\n\nexport const makeRelationType = (options: {\n dxn: DXN.DXN;\n source: RelationEndpoint;\n target: RelationEndpoint;\n schema: Schema.Schema.Any;\n id?: EntityId;\n}): Type.RelationClass<unknown, unknown, unknown, unknown, {}> => {\n const type = EchoRelationSchema({\n dxn: options.dxn,\n source: options.source,\n target: options.target,\n id: options.id,\n })(options.schema);\n const constructor = function RelationType() {};\n Object.setPrototypeOf(constructor, type);\n // Boundary cast: constructor/prototype wiring cannot be expressed in TypeScript's type system.\n return constructor as unknown as Type.RelationClass<unknown, unknown, unknown, unknown, {}>;\n};\n","//\n// Copyright 2026 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\nimport * as SchemaAST from 'effect/SchemaAST';\n\nimport { invariant } from '@dxos/invariant';\nimport { DXN } from '@dxos/keys';\n\nimport { type TypeAnnotation, TypeAnnotationId } from '../Annotation/annotations';\nimport { makeTypeJsonSchemaAnnotation } from '../Annotation/util';\nimport { EntityKind } from '../common/types';\nimport { toJsonSchema } from '../JsonSchema';\nimport { type EchoTypeOptions, type EchoTypeSchema, makeEchoTypeSchema } from './entity';\n\n/**\n * Type-kind schema marker — produced by {@link EchoTypeKindSchema}.\n *\n * Distinguishes meta-schemas (entities of `EntityKind.Type`, such as the\n * built-in `Type.Type` TypeSchema) from object and relation types.\n */\nexport type EchoTypeKindSchema<\n Self extends Schema.Schema.Any,\n Fields extends Schema.Struct.Fields = Schema.Struct.Fields,\n> = EchoTypeSchema<Self, {}, EntityKind.Type, Fields>;\n\n/**\n * Pipeable that brands a schema as a type-kind ECHO entity. Mirrors\n * {@link EchoObjectSchema} / {@link EchoRelationSchema}, but stamps the\n * resulting entity with `[SchemaKindId]: EntityKind.Type` and a matching\n * `TypeAnnotation.kind = 'type'` so meta-schemas surface uniformly through\n * `Type.isTypeKind`, `Filter.type`, etc.\n */\nexport const EchoTypeKindSchema: {\n (\n dxn: DXN.DXN,\n options?: EchoTypeOptions,\n ): <Self extends Schema.Schema.Any, Fields extends Schema.Struct.Fields = Schema.Struct.Fields>(\n self: Self & { fields?: Fields },\n ) => EchoTypeKindSchema<Self, Fields>;\n} = (dxn, options) => {\n const typename = DXN.getName(dxn);\n const version = DXN.getVersion(dxn);\n invariant(version, `Type-kind schemas require a versioned DXN: ${dxn}`);\n\n return <Self extends Schema.Schema.Any, Fields extends Schema.Struct.Fields = Schema.Struct.Fields>(\n self: Self & { fields?: Fields },\n ): EchoTypeKindSchema<Self, Fields> => {\n invariant(SchemaAST.isTypeLiteral(self.ast), 'Schema must be a TypeLiteral.');\n\n const fields = ((self as any).fields ?? {}) as Fields;\n\n const schemaWithId = Schema.extend(self, Schema.Struct({ id: Schema.String }));\n const ast = SchemaAST.annotations(schemaWithId.ast, {\n ...self.ast.annotations,\n [TypeAnnotationId]: { kind: EntityKind.Type, typename, version } satisfies TypeAnnotation,\n [SchemaAST.JSONSchemaAnnotationId]: makeTypeJsonSchemaAnnotation({\n kind: EntityKind.Type,\n typename,\n version,\n }),\n });\n\n return makeEchoTypeSchema<Self, EntityKind.Type, Fields>(\n fields,\n ast,\n typename,\n version,\n EntityKind.Type,\n () => toJsonSchema(Schema.make(ast)),\n options?.id,\n );\n };\n};\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport { assertArgument } from '@dxos/invariant';\n\nimport { type AnyEntity, VersionTypeId } from '../common/types';\nimport { ObjectVersionId } from './model';\n\n/**\n * Represent entity version.\n * May be backed by Automerge.\n * Entities with no history are not versioned.\n * Named EntityVersion to avoid conflict with types/version.ts.\n */\nexport interface EntityVersion {\n [VersionTypeId]: {};\n\n /**\n * Whether the entity is versioned.\n */\n versioned: boolean;\n\n /**\n * Automerge heads.\n */\n automergeHeads?: string[];\n}\n\nconst unversioned: EntityVersion = {\n [VersionTypeId]: {},\n versioned: false,\n};\n\n/**\n * Checks that `obj` is a version object.\n */\nexport const isVersion = (entity: unknown): entity is EntityVersion => {\n return entity != null && typeof entity === 'object' && VersionTypeId in entity;\n};\n\n/**\n * Returns the version of an entity.\n * Accepts both reactive entities and snapshots.\n */\nexport const version = (entity: AnyEntity): EntityVersion => {\n const ver = (entity as any)[ObjectVersionId];\n if (ver === undefined) {\n return unversioned;\n }\n return ver;\n};\n\n/**\n * Checks that `version` is a valid version object.\n */\nexport const versionValid = (ver: EntityVersion): boolean => {\n assertArgument(isVersion(ver), 'version', 'Invalid version object');\n return !!ver.versioned;\n};\n\nexport type VersionCompareResult = 'unversioned' | 'equal' | 'different';\n\n/**\n * Compares two versions.\n * @param version1\n * @param version2\n * @returns 'unversioned' if either entity is unversioned, 'equal' if the versions are equal, 'different' if the versions are different.\n */\nexport const compareVersions = (version1: EntityVersion, version2: EntityVersion): VersionCompareResult => {\n assertArgument(isVersion(version1), 'version1', 'Invalid version object');\n assertArgument(isVersion(version2), 'version2', 'Invalid version object');\n\n if (!versionValid(version1) || !versionValid(version2)) {\n return 'unversioned';\n }\n\n if (version1.automergeHeads?.length !== version2.automergeHeads?.length) {\n return 'different';\n }\n if (version1.automergeHeads?.some((head) => !version2.automergeHeads?.includes(head))) {\n return 'different';\n }\n\n return 'equal';\n};\n\nexport const encodeVersion = (ver: EntityVersion): string => {\n return JSON.stringify(ver);\n};\n\nexport const decodeVersion = (ver: string): EntityVersion => {\n const parsed = JSON.parse(ver);\n parsed[VersionTypeId] = {};\n return parsed;\n};\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\n\nimport { raise } from '@dxos/debug';\nimport { type EncodedReference, EntityStructure, isEncodedReference } from '@dxos/echo-protocol';\nimport { assertArgument, invariant } from '@dxos/invariant';\nimport { EID, EntityId, URI } from '@dxos/keys';\nimport { assumeType, decodeUint8ArrayFromJson, deepMapValues, isEncodedUint8Array, visitValues } from '@dxos/util';\n\nimport type * as Database from '../../Database';\nimport type * as Obj from '../../Obj';\nimport { getTypeAnnotation, getTypeURI, setTypename } from '../Annotation';\nimport { attachTypedJsonSerializer, defineHiddenProperty, typedJsonSerializer } from '../common/proxy';\nimport {\n type AnyEntity,\n ATTR_PARENT,\n ATTR_TYPE,\n EntityKind,\n KindId,\n ParentId,\n setSchema,\n setType,\n} from '../common/types';\nimport { ATTR_META, EntityMetaSchema } from '../common/types/meta';\nimport { MetaId } from '../common/types/model-symbols';\nimport {\n ATTR_DELETED,\n ATTR_RELATION_SOURCE,\n ATTR_RELATION_TARGET,\n ATTR_SELF_URI,\n ATTR_SELF_URI_LEGACY,\n ObjectDatabaseId,\n ObjectDeletedId,\n type ObjectJSON,\n RelationSourceDXNId,\n RelationSourceId,\n RelationTargetDXNId,\n RelationTargetId,\n SelfURIId,\n assertObjectModel,\n} from '../Entity';\nimport { Ref, type RefResolver, refFromEncodedReference, setRefResolver } from '../Ref';\n\n// Re-export for backward compatibility.\nexport { attachTypedJsonSerializer };\n\ntype DeepReplaceRef<T> =\n T extends Ref<any>\n ? EncodedReference\n : T extends object\n ? {\n [K in keyof T]: DeepReplaceRef<T[K]>;\n }\n : T;\n\ntype SerializedObject<T extends { id: string }> = {\n [K in keyof T]: DeepReplaceRef<T[K]>;\n} & ObjectJSON;\n\n/**\n * Converts object to it's JSON representation.\n */\nexport const objectToJSON = <T extends AnyEntity>(obj: T): SerializedObject<T> => {\n const typename = getTypeURI(obj);\n invariant(typename && typeof typename === 'string');\n return typedJsonSerializer.call(obj);\n};\n\n/**\n * Creates an object from it's json representation.\n * Performs schema validation.\n * References and schema will be resolvable if the `refResolver` is provided.\n * The function need to be async to support resolving the schema as well as the relation endpoints.\n *\n * @param jsonData - JSON representation of the object.\n * @param options.refResolver - Resolver for references.\n * @param options.uri - Override object URI.\n * @param options.database - Database to associate with the object.\n */\nexport const objectFromJSON = async (\n jsonData: unknown,\n {\n refResolver,\n uri,\n database,\n parent,\n }: { refResolver?: RefResolver; uri?: URI.URI; database?: Database.Database; parent?: Obj.Unknown } = {},\n): Promise<AnyEntity> => {\n assumeType<ObjectJSON>(jsonData);\n assertArgument(typeof jsonData === 'object' && jsonData !== null, 'jsonData', 'expect object');\n assertArgument(typeof jsonData[ATTR_TYPE] === 'string', 'jsonData[ATTR_TYPE]', 'expected object to have a type');\n assertArgument(typeof jsonData.id === 'string', 'jsonData.id', 'expected object to have an id');\n\n const type = URI.make(jsonData[ATTR_TYPE]);\n const schema = await refResolver?.resolveSchema(type);\n invariant(schema === undefined || Schema.isSchema(schema));\n const decodedInput = restoreUint8Arrays(stripInternalJsonKeys(jsonData));\n\n let obj: any;\n if (schema != null) {\n obj = await schema.pipe(Schema.decodeUnknownPromise)(decodedInput);\n if (refResolver) {\n setRefResolverOnData(obj, refResolver);\n }\n } else {\n obj = decodeGeneric(decodedInput, { refResolver });\n }\n\n invariant(EntityId.isValid(obj.id), 'Invalid object id');\n setTypename(obj, type);\n if (schema) {\n setSchema(obj, schema);\n }\n // Resolve and stamp the source type entity, if the resolver provides one.\n // Lets `Obj.getType` / `Entity.getType` return a stable entity for objects\n // loaded via `Obj.fromJSON` (serializer / queue paths).\n if (refResolver?.resolveType) {\n const typeEntity = await refResolver.resolveType(type);\n if (typeEntity != null) {\n setType(obj, typeEntity);\n }\n }\n\n const isRelation =\n typeof jsonData[ATTR_RELATION_SOURCE] === 'string' || typeof jsonData[ATTR_RELATION_TARGET] === 'string';\n if (isRelation) {\n const sourceDxn = jsonData[ATTR_RELATION_SOURCE] ?? raise(new TypeError('Missing relation source'));\n const targetDxn = jsonData[ATTR_RELATION_TARGET] ?? raise(new TypeError('Missing relation target'));\n\n const source = (await refResolver?.resolveLegacy(sourceDxn)) as AnyEntity | undefined;\n const target = (await refResolver?.resolveLegacy(targetDxn)) as AnyEntity | undefined;\n\n defineHiddenProperty(obj, KindId, EntityKind.Relation);\n defineHiddenProperty(obj, RelationSourceDXNId, sourceDxn);\n defineHiddenProperty(obj, RelationTargetDXNId, targetDxn);\n defineHiddenProperty(obj, RelationSourceId, source);\n defineHiddenProperty(obj, RelationTargetId, target);\n } else {\n // Honour the schema's TypeAnnotation kind — persisted `Type.Type` entities\n // (e.g. dynamic schemas loaded from a snapshot import) must brand as\n // `KindId = Type`, not Object, otherwise `Filter.type(Type.Type)` /\n // `Type.isType` skip them and the schema registry never picks them up.\n // Mirrors the kind resolution in `createObject` (the in-memory path).\n const annotationKind = schema != null ? getTypeAnnotation(schema)?.kind : undefined;\n defineHiddenProperty(obj, KindId, annotationKind === EntityKind.Type ? EntityKind.Type : EntityKind.Object);\n }\n\n if (typeof jsonData[ATTR_META] === 'object') {\n const meta = await EntityMetaSchema.pipe(Schema.decodeUnknownPromise)(normalizeMeta(jsonData[ATTR_META]));\n invariant(Array.isArray(meta.keys));\n defineHiddenProperty(obj, MetaId, meta);\n } else {\n defineHiddenProperty(obj, MetaId, {\n keys: [],\n tags: [],\n annotations: {},\n });\n }\n\n if (jsonData[ATTR_PARENT]) {\n const parentDxn = jsonData[ATTR_PARENT];\n const resolvedParent = (await refResolver?.resolveLegacy(parentDxn)) as Obj.Unknown | undefined;\n defineHiddenProperty(obj, ParentId, resolvedParent);\n } else if (parent) {\n defineHiddenProperty(obj, ParentId, parent);\n }\n\n if (uri) {\n defineHiddenProperty(obj, SelfURIId, uri);\n }\n\n if (database) {\n defineHiddenProperty(obj, ObjectDatabaseId, database);\n }\n\n // Carry the deletion marker so a tombstone snapshot (e.g. a feed item removed via `Feed.remove`)\n // hydrates with `Obj.isDeleted === true` rather than as a live object.\n defineHiddenProperty(obj, ObjectDeletedId, jsonData[ATTR_DELETED] === true);\n\n assertObjectModel(obj);\n invariant((obj as any)[ATTR_TYPE] === undefined, 'Invalid object model');\n invariant((obj as any)[ATTR_META] === undefined, 'Invalid object model');\n invariant((obj as any)[ATTR_DELETED] === undefined, 'Invalid object model');\n invariant((obj as any)[ATTR_SELF_URI] === undefined, 'Invalid object model');\n invariant((obj as any)[ATTR_SELF_URI_LEGACY] === undefined, 'Invalid object model');\n invariant((obj as any)[ATTR_RELATION_SOURCE] === undefined, 'Invalid object model');\n invariant((obj as any)[ATTR_RELATION_TARGET] === undefined, 'Invalid object model');\n\n return obj;\n};\n\n/**\n * Backfills required meta fields and upgrades legacy `tags` (bare URI strings) to encoded references\n * so serialized data produced before the tags-as-refs migration still decodes.\n */\nconst normalizeMeta = (meta: any): any => {\n const tags = Array.isArray(meta?.tags)\n ? meta.tags.map((tag: unknown) => (typeof tag === 'string' ? { '/': URI.make(tag) } : tag))\n : [];\n // Coalesce required fields so explicit `undefined` in legacy input doesn't override the defaults.\n return {\n ...meta,\n keys: Array.isArray(meta?.keys) ? meta.keys : [],\n tags,\n annotations: meta?.annotations ?? {},\n };\n};\n\nconst decodeGeneric = (jsonData: unknown, options: { refResolver?: RefResolver }) => {\n const props = stripInternalJsonKeys(jsonData);\n\n return deepMapValues(props, (value, visitor) => {\n if (isEncodedReference(value)) {\n return refFromEncodedReference(value, options.refResolver);\n }\n if (isEncodedUint8Array(value)) {\n return decodeUint8ArrayFromJson(value);\n }\n\n return visitor(value);\n });\n};\n\n/**\n * Recursively replaces encoded `Uint8Array` JSON markers with actual `Uint8Array` instances.\n * Runs before schema decoding so `Schema.Uint8ArrayFromSelf` sees real bytes.\n */\nconst restoreUint8Arrays = (data: unknown): any =>\n deepMapValues(data, (value, recurse) => {\n if (isEncodedUint8Array(value)) {\n return decodeUint8ArrayFromJson(value);\n }\n return recurse(value);\n });\n\nconst stripInternalJsonKeys = (jsonData: unknown) => {\n const {\n [ATTR_TYPE]: _type,\n [ATTR_META]: _meta,\n [ATTR_DELETED]: _deleted,\n [ATTR_SELF_URI]: _selfUri,\n [ATTR_SELF_URI_LEGACY]: _legacySelfUri,\n [ATTR_RELATION_SOURCE]: _relationSource,\n [ATTR_RELATION_TARGET]: _relationTarget,\n ...props\n } = jsonData as any;\n\n return props;\n};\n\nexport const setRefResolverOnData = (obj: AnyEntity, refResolver: RefResolver) => {\n const visitor = (value: unknown) => {\n if (Ref.isRef(value)) {\n setRefResolver(value, refResolver);\n } else {\n visitValues(value, visitor);\n }\n };\n\n visitor(obj);\n};\n\n/**\n * Convert EntityStructure to JSON data for indexing.\n * Different from {@link objectToJSON} as it takes the internal {@link EntityStructure} representation directly\n */\nexport const objectStructureToJson = (objectId: EntityId, structure: EntityStructure): Obj.JSON => {\n const typeRef = EntityStructure.getTypeReference(structure)?.['/'];\n const parent = EntityStructure.getParent(structure)?.['/'];\n const source = EntityStructure.getRelationSource(structure)?.['/'];\n const target = EntityStructure.getRelationTarget(structure)?.['/'];\n return {\n ...structure.data,\n id: objectId,\n [ATTR_TYPE]: typeRef ? URI.make(typeRef) : undefined,\n [ATTR_DELETED]: EntityStructure.isDeleted(structure),\n [ATTR_PARENT]: parent !== undefined ? EID.tryParse(parent) : undefined,\n [ATTR_RELATION_SOURCE]: source !== undefined ? EID.tryParse(source) : undefined,\n [ATTR_RELATION_TARGET]: target !== undefined ? EID.tryParse(target) : undefined,\n };\n};\n","//\n// Copyright 2026 DXOS.org\n//\n\nimport * as semver from 'semver';\n\nimport { EncodedReference, type QueryAST, isEncodedReference } from '@dxos/echo-protocol';\nimport { DXN, EID } from '@dxos/keys';\n\nimport { getTypeURI } from '../Annotation/annotations';\nimport { getMetaChecked } from '../common/api/meta';\nimport { type AnyEntity } from '../common/types';\nimport { objectToJSON } from '../Obj/json-serializer';\n\n/**\n * Matches a tag filter against an object's stored tags. Tags may be stored as encoded references or\n * (in legacy data) bare URI strings, and those URIs may be in legacy DXN form. Both sides are\n * normalized to the canonical EID before comparing.\n */\nexport const matchesTag = (tags: readonly unknown[], filterTag: string): boolean => {\n const canonical = (uri: string): string => {\n const eid = EID.tryParse(uri);\n return (eid && EID.getEntityId(eid)) || uri;\n };\n const normalize = (tag: unknown): string =>\n canonical(isEncodedReference(tag) ? EncodedReference.toURI(tag) : (tag as string));\n const target = canonical(filterTag);\n return tags.some((tag) => normalize(tag) === target);\n};\n\n/**\n * Matches a meta `key` / `version` constraint against an object's meta `key` and `version`.\n */\nexport const matchMetaKey = (\n key: string,\n versionRange: string | undefined,\n objKey: string | undefined,\n objVersion: string | undefined,\n): boolean => {\n if (objKey !== key) {\n return false;\n }\n if (versionRange === undefined) {\n return true;\n }\n if (objVersion === undefined || semver.valid(objVersion) === null) {\n return false;\n }\n if (semver.validRange(versionRange) === null) {\n return false;\n }\n return semver.satisfies(objVersion, versionRange, { includePrerelease: true });\n};\n\n/**\n * Compares a filter's type discriminator against the value stored on an object's `system.type`.\n */\nexport const compareTypenameStrings = (expectedStr: string, actualStr: string): boolean => {\n const expectedEid = EID.tryParse(expectedStr);\n if (expectedEid) {\n const actualEid = EID.tryParse(actualStr);\n if (!actualEid) {\n return false;\n }\n if (EID.getEntityId(expectedEid) !== EID.getEntityId(actualEid)) {\n return false;\n }\n const expectedSpaceId = EID.getSpaceId(expectedEid);\n const actualSpaceId = EID.getSpaceId(actualEid);\n return expectedSpaceId === undefined || actualSpaceId === undefined || expectedSpaceId === actualSpaceId;\n }\n\n const expectedDxn = DXN.tryMake(expectedStr);\n if (expectedDxn) {\n const actualDxn = DXN.tryMake(actualStr);\n if (!actualDxn) {\n return false;\n }\n if (DXN.getName(expectedDxn) !== DXN.getName(actualDxn)) {\n return false;\n }\n const expectedVersion = DXN.getVersion(expectedDxn);\n const actualVersion = DXN.getVersion(actualDxn);\n return expectedVersion === undefined || actualVersion === undefined || expectedVersion === actualVersion;\n }\n\n return expectedStr === actualStr;\n};\n\nconst structuralMatch = (filterObj: any, targetObj: any, strict = true): boolean => {\n if (typeof filterObj !== 'object' || filterObj === null) {\n return filterObj === targetObj;\n }\n\n if (typeof targetObj !== 'object' || targetObj === null) {\n return false;\n }\n\n const filterKeys = Object.keys(filterObj);\n const targetKeys = Object.keys(targetObj);\n if (strict && filterKeys.length !== targetKeys.length) {\n return false;\n }\n\n return filterKeys.every((key) => {\n if (!(key in targetObj)) {\n return false;\n }\n const filterValue = filterObj[key];\n const targetValue = targetObj[key];\n\n if (typeof filterValue === 'object' && filterValue !== null) {\n return structuralMatch(filterValue, targetValue);\n }\n\n return filterValue === targetValue;\n });\n};\n\n/** Normalizes an encoded reference to its URI string so ref-valued properties compare by identity. */\nconst _normalizeInValue = (value: unknown): unknown =>\n isEncodedReference(value) ? EncodedReference.toURI(value) : value;\n\n/**\n * Memoizes a `Set` per `values` array so `Filter.in` membership is O(1) rather than\n * `Array.includes`'s O(n) — this matters most for large sets projected from a subquery\n * (`Filter.in(query.project(...))`, resolved to a literal `in` by the query executor), but\n * also speeds up ordinary literal-list `Filter.in`. Keyed by array identity: the planner and\n * executor never mutate a filter's `values` array in place, so the cache stays valid for the\n * array's lifetime.\n */\nconst _inSetCache = new WeakMap<readonly unknown[], Set<unknown>>();\nconst _getInSet = (values: readonly unknown[]): Set<unknown> => {\n let set = _inSetCache.get(values);\n if (!set) {\n set = new Set(values.map(_normalizeInValue));\n _inSetCache.set(values, set);\n }\n return set;\n};\n\nexport const filterMatchValue = (filter: QueryAST.Filter, value: unknown): boolean => {\n switch (filter.type) {\n case 'compare': {\n const compareValue = filter.value as any;\n switch (filter.operator) {\n case 'eq':\n if (isEncodedReference(compareValue)) {\n if (!isEncodedReference(value)) {\n return false;\n }\n return EncodedReference.toURI(value) === EncodedReference.toURI(compareValue);\n }\n return value === compareValue;\n case 'neq':\n return value !== compareValue;\n case 'gt':\n return (value as any) > compareValue;\n case 'gte':\n return (value as any) >= compareValue;\n case 'lt':\n return (value as any) < compareValue;\n case 'lte':\n return (value as any) <= compareValue;\n default:\n return false;\n }\n }\n case 'object': {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n\n if (filter.props) {\n for (const [key, valueFilter] of Object.entries(filter.props)) {\n const nestedValue = (value as any)[key];\n if (!filterMatchValue(valueFilter, nestedValue)) {\n return false;\n }\n }\n }\n\n return true;\n }\n case 'in': {\n return _getInSet(filter.values).has(_normalizeInValue(value));\n }\n case 'in-query': {\n throw new Error('in-query filters must be resolved to a literal `in` by the query executor before matching.');\n }\n case 'contains': {\n if (!Array.isArray(value)) {\n return false;\n }\n\n return value.some((element) => {\n if (typeof filter.value === 'object' && filter.value !== null && !Array.isArray(filter.value)) {\n return structuralMatch(filter.value, element);\n }\n\n return element === filter.value;\n });\n }\n case 'range': {\n return (value as any) >= filter.from && (value as any) <= filter.to;\n }\n case 'not': {\n return !filterMatchValue(filter.filter, value);\n }\n case 'and': {\n return filter.filters.every((f) => filterMatchValue(f, value));\n }\n case 'or': {\n return filter.filters.some((f) => filterMatchValue(f, value));\n }\n default:\n return false;\n }\n};\n\n/**\n * Matches a filter against an entity proxy without full JSON serialization when possible.\n */\nexport const filterMatchEntity = (filter: QueryAST.Filter, entity: AnyEntity): boolean => {\n switch (filter.type) {\n case 'object': {\n if (filter.typename !== null) {\n const typeURI = getTypeURI(entity);\n if (!typeURI || !compareTypenameStrings(filter.typename, typeURI)) {\n return false;\n }\n }\n\n if (filter.id && filter.id.length > 0 && !filter.id.includes(entity.id)) {\n return false;\n }\n\n if (filter.props) {\n let json: ReturnType<typeof objectToJSON> | null = null;\n try {\n json = objectToJSON(entity);\n } catch {\n // Serialization of complex static-type entities may throw.\n }\n if (json === null) {\n return false;\n }\n for (const [key, valueFilter] of Object.entries(filter.props)) {\n if (key.startsWith('@')) {\n continue;\n }\n if (!filterMatchValue(valueFilter, (json as any)[key])) {\n return false;\n }\n }\n }\n\n const meta = getMetaChecked(entity);\n\n if (filter.foreignKeys && filter.foreignKeys.length > 0) {\n const hasKey = filter.foreignKeys.some((fk) => meta.keys.some((k) => k.source === fk.source && k.id === fk.id));\n if (!hasKey) {\n return false;\n }\n }\n\n if (filter.metaKey !== undefined) {\n if (!matchMetaKey(filter.metaKey, filter.metaVersion, meta.key, meta.version)) {\n return false;\n }\n }\n\n return true;\n }\n\n case 'tag': {\n const rawTags = getMetaChecked(entity).tags;\n const tags = rawTags.map((tag: any) => (typeof tag?.encode === 'function' ? tag.encode() : tag));\n return matchesTag(tags, filter.tag);\n }\n\n case 'text-search': {\n return false;\n }\n\n case 'timestamp': {\n throw new Error('Timestamp filters must be handled at the index level, not in-memory matching.');\n }\n\n case 'child-of': {\n throw new Error('child-of filters must be handled at the executor level, not in-memory matching.');\n }\n\n case 'in-query': {\n throw new Error('in-query filters must be resolved to a literal `in` by the query executor before matching.');\n }\n\n case 'not': {\n return !filterMatchEntity(filter.filter, entity);\n }\n\n case 'and': {\n return filter.filters.every((f) => filterMatchEntity(f, entity));\n }\n\n case 'or': {\n return filter.filters.some((f) => filterMatchEntity(f, entity));\n }\n\n default:\n return false;\n }\n};\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\n\nimport { getTypename } from '../Annotation';\nimport { type AnyProperties } from '../common/types';\n\n// TODO(dmaretskyi): Rename to represent commonality between objects and relations (e.g. `entity`).\nexport type TypedObjectOptions = {\n // TODO(burdon): Document.\n partial?: true;\n // TODO(burdon): Document.\n record?: true;\n};\n\n/**\n *\n */\n// TODO(burdon): Comment required.\n// TODO(dmaretskyi): Rename to represent commonality between objects and relations (e.g. `entity`).\ntype SimplifiedSchemaFields<\n SchemaFields extends Schema.Struct.Fields,\n Options extends TypedObjectOptions,\n> = Options['partial'] extends boolean\n ? Schema.SimplifyMutable<Partial<Schema.Struct.Type<SchemaFields>>>\n : Schema.SimplifyMutable<Schema.Struct.Type<SchemaFields>>;\n\n/**\n *\n */\n// TODO(burdon): Comment required.\n// TODO(dmaretskyi): Rename to represent commonality between objects and relations (e.g. `entity`).\nexport type TypedObjectFields<\n SchemaFields extends Schema.Struct.Fields,\n Options extends TypedObjectOptions,\n> = SimplifiedSchemaFields<SchemaFields, Options> & { id: string } & (Options['record'] extends boolean\n ? Schema.SimplifyMutable<Schema.IndexSignature.Type<Schema.IndexSignature.Records>>\n : {});\n\nexport const makeTypedEntityClass = (\n typename: string,\n version: string,\n baseSchema: Schema.Schema.AnyNoContext,\n): Schema.SchemaClass<any> => {\n return class {\n // Implement TypedObject properties.\n static readonly typename = typename;\n static readonly version = version;\n\n // Implement Schema.Schema properties.\n // TODO(burdon): Comment required.\n static readonly [Schema.TypeId] = schemaVariance;\n static readonly ast = baseSchema.ast;\n static readonly annotations = baseSchema.annotations.bind(baseSchema);\n static readonly pipe = baseSchema.pipe.bind(baseSchema);\n\n // TODO(burdon): Comment required.\n static [Symbol.hasInstance](obj: AnyProperties) {\n return obj != null && getTypename(obj) === typename;\n }\n\n // TODO(burdon): Throw APIError.\n private constructor() {\n throw new Error('Use live(Typename, { ...fields }) to instantiate an object.');\n }\n } as any;\n};\n\nconst schemaVariance = {\n _A: (_: any) => _,\n _I: (_: any) => _,\n _R: (_: never) => _,\n};\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport type { InspectOptionsStylized, inspect as inspectFn } from 'node:util';\n\nimport { type CustomInspectFunction, inspectCustom } from '@dxos/debug';\n\nimport { getTypeURI } from '../Annotation';\nimport { type AnyEntity, ATTR_TYPE } from '../common/types';\nimport { ATTR_META } from '../common/types/meta';\nimport { MetaId } from '../common/types/model-symbols';\n\n/*\n * @internal\n */\nexport const attachedTypedObjectInspector = (obj: any) => {\n const descriptor = Object.getOwnPropertyDescriptor(obj, inspectCustom);\n if (descriptor) {\n return;\n }\n\n Object.defineProperty(obj, inspectCustom, {\n value: typedObjectInspectFunction,\n writable: false,\n enumerable: false,\n configurable: true,\n });\n};\n\n// NOTE: KEEP as function.\nconst typedObjectInspectFunction: CustomInspectFunction<AnyEntity> = function (\n this: AnyEntity,\n depth: number,\n options: InspectOptionsStylized,\n inspect: typeof inspectFn,\n) {\n const { id, ...props } = this;\n return inspect(\n {\n id,\n [ATTR_TYPE]: getTypeURI(this),\n ...props,\n [ATTR_META]: (this as any)[MetaId], // TODO(dmaretskyi): Couldn't use getMeta since that throw's if the object has no meta.\n },\n options,\n );\n};\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport { raise } from '@dxos/debug';\nimport { assertArgument, failedInvariant } from '@dxos/invariant';\nimport { EntityId } from '@dxos/keys';\n\nimport type * as Type from '../../Type';\nimport { getSchemaURI, getTypeAnnotation, setTypename } from '../Annotation';\nimport { defineHiddenProperty } from '../common/proxy';\nimport {\n EntityKind,\n KindId,\n SchemaKindId,\n StaticTypeSchemaSlot,\n getStaticTypeSchema,\n setSchema,\n setType,\n} from '../common/types';\nimport { type EntityMeta } from '../common/types/meta';\nimport { MetaId } from '../common/types/model-symbols';\nimport {\n RelationSourceDXNId,\n RelationSourceId,\n RelationTargetDXNId,\n RelationTargetId,\n assertObjectModel,\n getObjectEchoUri,\n} from '../Entity';\nimport { attachedTypedObjectInspector } from './inspect';\nimport { attachTypedJsonSerializer } from './json-serializer';\n\n// Omits the brand slots — those get stamped on the instance by the entity\n// handler (KindId via setKind, SchemaKindId derived in the proxy `get` trap\n// from kind + jsonSchema.entityKind, StaticTypeSchemaSlot lazily via the\n// proxy), not supplied by the caller. Allows `[Obj.Meta]` (MetaId symbol) for\n// seeding registry-provenance meta at construction (mirrors `Obj.make`).\nexport type CreateObjectProps<T> = (T extends { id: string }\n ? Omit<T, 'id' | KindId | SchemaKindId | StaticTypeSchemaSlot> & { id?: string }\n : Omit<T, KindId | SchemaKindId | StaticTypeSchemaSlot>) & {\n readonly [MetaId]?: Partial<EntityMeta>;\n};\n\n/**\n * Creates a new object instance from a schema and data, without signal reactivity.\n * This static version creates plain JavaScript objects that are not reactive/observable.\n * For reactive objects that automatically update UI when changed, use the regular live() function.\n *\n * @param schema - The Effect schema that defines the object's structure and type, piped into EchoObjectSchema\n * @param data - The data to initialize the object with. The id and @type fields are handled automatically.\n * @returns A new non-reactive object instance conforming to the schema\n * @throws {Error} If the schema is not an object schema\n * @throws {TypeError} If data contains an @type field\n *\n * @example\n * ```ts\n * class Contact extends Type.makeObject<Contact>(DXN.make('com.example.type.person', '0.1.0'))(\n * Schema.Struct({ name: Schema.String, email: Schema.String }),\n * ) {}\n *\n * const contact = createObject(Contact, {\n * name: \"John\",\n * email: \"john@example.com\",\n * })\n * ```\n */\n// TODO(burdon): Make internal.\nexport const createObject: {\n <T extends Type.AnyEntity>(input: T, props: NoInfer<CreateObjectProps<Type.InstanceType<T>>>): Type.InstanceType<T>;\n} = (input: any, props: any): any => {\n // `Type.Type` entities aren't `Schema.Schema` themselves; read the source\n // schema off the hidden slot (persisted entities synthesize it lazily via\n // the proxy `get` trap).\n const schema = getStaticTypeSchema(input) ?? failedInvariant('Type entity is missing its source schema');\n const annotation = getTypeAnnotation(schema);\n if (!annotation) {\n throw new Error('Schema is not an ECHO schema');\n }\n assertArgument(!('@type' in props), 'data', '@type is not allowed');\n assertArgument(!(RelationSourceDXNId in props), 'data', 'Relation source DXN is not allowed in the constructor');\n assertArgument(!(RelationTargetDXNId in props), 'data', 'Relation target DXN is not allowed in the constructor');\n assertArgument(\n RelationSourceId in props === RelationTargetId in props,\n 'data',\n 'Relation source and target must be provided together',\n );\n\n // Pull `[Obj.Meta]` (MetaId-symbol) off props before spreading so it doesn't\n // leak into data. Callers use this to seed registry-provenance meta fields\n // (`key`, `version`) and foreign keys / tags at construction time, mirroring\n // `Obj.make`'s symbol-keyed meta convention.\n const metaOverride = props[MetaId];\n if (metaOverride !== undefined) {\n delete props[MetaId];\n }\n\n // Raw object.\n const obj = { ...props, id: props.id ?? EntityId.random() };\n\n // Metadata. Instance-kind is read from the schema's TypeAnnotation (set by\n // EchoObjectSchema / EchoRelationSchema / EchoTypeKindSchema): instances of\n // a type-kind meta-schema are themselves type-kind entities, etc. The\n // RelationSourceId-in-props check covers the legacy path where the schema\n // annotation isn't authoritative.\n const kind =\n annotation.kind === EntityKind.Type\n ? EntityKind.Type\n : annotation.kind === EntityKind.Relation || RelationSourceId in props\n ? EntityKind.Relation\n : EntityKind.Object;\n defineHiddenProperty(obj, KindId, kind);\n defineHiddenProperty(obj, MetaId, {\n ...metaOverride,\n keys: metaOverride?.keys ?? [],\n tags: metaOverride?.tags ?? [],\n annotations: metaOverride?.annotations ?? {},\n });\n setSchema(obj, schema);\n // If the caller passed a type entity (recognised via the schema slot), keep\n // a reference to it on the instance for `Obj.getType` / `Relation.getType`.\n if (input !== schema) {\n setType(obj, input);\n }\n setTypename(obj, getSchemaURI(schema) ?? failedInvariant('Missing schema URI'));\n attachTypedJsonSerializer(obj);\n attachedTypedObjectInspector(obj);\n\n // Relation.\n if (kind === EntityKind.Relation) {\n const sourceDXN = getObjectEchoUri(props[RelationSourceId]) ?? raise(new Error('Unresolved relation source'));\n const targetDXN = getObjectEchoUri(props[RelationTargetId]) ?? raise(new Error('Unresolved relation target'));\n defineHiddenProperty(obj, RelationSourceDXNId, sourceDXN);\n defineHiddenProperty(obj, RelationTargetDXNId, targetDXN);\n }\n\n assertObjectModel(obj);\n return obj;\n};\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport { type AnyProperties } from '../common/types';\nimport { ObjectDeletedId } from '../Entity';\n\n/**\n * @returns `true` if the object has been marked as deleted.\n */\nexport const isDeleted = (obj: AnyProperties): boolean => {\n if ((obj as any)[ObjectDeletedId] === undefined) {\n // TODO(dmaretskyi): Return to prior behavior of throwing.\n // throw new Error('Object does not support deletion marker');\n return false;\n }\n\n return (obj as any)[ObjectDeletedId] ?? false;\n};\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Match from 'effect/Match';\nimport * as Option from 'effect/Option';\nimport * as SchemaAST from 'effect/SchemaAST';\n\nimport { SchemaEx } from '@dxos/effect';\nimport { invariant } from '@dxos/invariant';\n\nimport { type Mutable } from '../common/proxy';\nimport { getSchema } from '../common/types';\n\n/**\n * Set a deeply nested property on an object.\n * Must be called within an Obj.update or Relation.update callback.\n */\nexport const setValue = (obj: Mutable<any>, path: readonly (string | number)[], value: any): void => {\n invariant(path.length > 0, 'Path must not be empty');\n\n const schema = getSchema(obj);\n invariant(schema != null, 'Object must have a schema');\n\n let parent = obj;\n let currentAST: SchemaAST.AST | undefined = schema.ast;\n\n // Navigate to the parent of the target property.\n for (let i = 0; i < path.length - 1; i++) {\n const part = path[i];\n const key = typeof part === 'number' ? part : String(part);\n if (parent[key] === undefined) {\n const propertyAST = getPropertyAST(currentAST, String(part));\n const shouldBeArray = propertyAST ? SchemaEx.isArrayType(propertyAST) : false;\n\n if (shouldBeArray) {\n // Create array.\n parent[key] = [];\n } else {\n // TODO(wittjosiah): Is there a better way to handle this than creating an object with defaults?\n // Perhaps properties on objects should be optional by default?\n // Create object with defaults for required fields.\n const objWithDefaults = createObjectWithDefaults(propertyAST);\n parent[key] = objWithDefaults;\n }\n }\n\n parent = parent[key];\n currentAST = getPropertyAST(currentAST, String(part));\n }\n\n const finalKey = path[path.length - 1];\n parent[finalKey] = value;\n\n return value;\n};\n\n/**\n * Helper to get the AST of a nested property.\n * @param ast - Current schema AST.\n * @param propertyName - Name of the property to get.\n * @returns The AST of the nested property, or undefined if not found.\n */\nconst getPropertyAST = (ast: SchemaAST.AST | undefined, propertyName: string): SchemaAST.AST | undefined => {\n if (!ast) {\n return undefined;\n }\n\n if (SchemaEx.isNestedType(ast)) {\n const properties = SchemaEx.getProperties(ast);\n const property = properties.find((p) => p.name.toString() === propertyName);\n if (property) {\n return SchemaEx.getBaseType(property).type;\n }\n }\n\n if (SchemaEx.isArrayType(ast)) {\n const elementType = SchemaEx.getArrayElementType(ast);\n return elementType;\n }\n\n return undefined;\n};\n\n/**\n * Get all required properties from a schema AST.\n * A property is required if it's not optional.\n *\n * @param ast - Schema AST to inspect.\n * @returns Array of required properties with their types.\n */\nconst getRequiredProperties = (ast: SchemaAST.AST | undefined): SchemaEx.SchemaProperty[] => {\n if (!ast) {\n return [];\n }\n\n // Only objects/structs have properties with optional/required distinction.\n if (!SchemaEx.isNestedType(ast)) {\n return [];\n }\n\n const properties = SchemaEx.getProperties(ast);\n\n // Filter to only required properties (where isOptional === false).\n return properties.filter((p) => !p.isOptional);\n};\n\n/**\n * Get the default value for a primitive type.\n * Returns undefined for non-primitive or unsupported types.\n *\n * @param ast - Type AST.\n * @returns Default value for the type, or undefined.\n */\nconst getDefaultValueForType = (ast: SchemaAST.AST | undefined): any => {\n if (!ast) {\n return undefined;\n }\n\n const defaultValue = SchemaAST.getDefaultAnnotation(ast);\n if (Option.isSome(defaultValue)) {\n return defaultValue.value;\n }\n\n return Match.value(ast).pipe(\n Match.when({ _tag: 'StringKeyword' }, () => ''),\n Match.when({ _tag: 'NumberKeyword' }, () => 0),\n Match.when({ _tag: 'BooleanKeyword' }, () => false),\n Match.orElse(() => undefined),\n );\n};\n\n/**\n * Create an object with default values for all required properties.\n * Handles primitive types (String, Number, Boolean) and recursively initializes required nested objects.\n *\n * @param ast - Schema AST describing the object structure.\n * @returns Object with required fields populated with defaults.\n */\nconst createObjectWithDefaults = (ast: SchemaAST.AST | undefined): any => {\n if (!ast) {\n return {};\n }\n\n const requiredProps = getRequiredProperties(ast);\n const obj: any = {};\n\n for (const prop of requiredProps) {\n const defaultValue = getDefaultValueForType(prop.type);\n if (defaultValue !== undefined) {\n obj[prop.name] = defaultValue;\n } else if (SchemaEx.isNestedType(prop.type)) {\n obj[prop.name] = createObjectWithDefaults(prop.type);\n }\n }\n\n return obj;\n};\n","//\n// Copyright 2024 DXOS.org\n//\n\nimport { assertArgument } from '@dxos/invariant';\nimport { deepMapValues } from '@dxos/util';\n\nimport {\n KindId,\n ObjectDatabaseId,\n ObjectDeletedId,\n ParentId,\n RelationSourceDXNId,\n RelationSourceId,\n RelationTargetDXNId,\n RelationTargetId,\n SchemaId,\n SelfURIId,\n SnapshotKindId,\n TypeEntityId,\n TypeId,\n} from '../common/types';\nimport { MetaId } from '../common/types/model-symbols';\n\n/**\n * Copy a Symbol-keyed property from source to target if it has a defined value.\n * Handles both plain objects (symbol in source) and proxies where get returns a value\n * but has/in returns false (e.g. ObjectDatabaseId on echo-db proxies).\n * Optional transform clones or mutates the value before assignment (e.g. for MetaId).\n */\nconst copySymbolProperty = (\n source: any,\n target: any,\n symbol: symbol,\n transform?: (value: unknown) => unknown,\n): void => {\n let value: unknown;\n // Echo-db proxy getters (e.g. RelationSourceId, RelationTargetId) can throw in certain states.\n try {\n value = source[symbol];\n } catch {\n return;\n }\n if (value !== undefined) {\n const finalValue = transform ? transform(value) : value;\n Object.defineProperty(target, symbol, {\n value: finalValue,\n writable: false,\n enumerable: false,\n configurable: false,\n });\n }\n};\n\n/**\n * Returns an immutable snapshot of the reactive object.\n * The snapshot is branded with SnapshotKindId (not KindId).\n */\nexport const getSnapshot = <T extends object>(obj: T): T => {\n assertArgument(typeof obj === 'object' && obj !== null && KindId in obj, 'obj', 'must be an entity');\n\n const snapshot = deepMapValues(obj, (value, recurse) => {\n // Do not recurse on references (but do recurse on arrays).\n if (\n typeof value === 'object' &&\n value !== null &&\n Object.getPrototypeOf(value) !== Object.prototype &&\n !Array.isArray(value)\n ) {\n return value;\n }\n\n return recurse(value);\n }) as any;\n\n // Add SnapshotKindId brand based on original KindId.\n if (obj != null && typeof obj === 'object' && KindId in obj) {\n snapshot[SnapshotKindId] = (obj as any)[KindId];\n }\n\n // Preserve Symbol-keyed properties that are important for type introspection.\n // These are not copied by deepMapValues since Object.keys() doesn't include symbols.\n const source = obj as any;\n\n // Type introspection symbols.\n copySymbolProperty(source, snapshot, TypeId);\n copySymbolProperty(source, snapshot, SchemaId);\n copySymbolProperty(source, snapshot, TypeEntityId);\n copySymbolProperty(source, snapshot, SelfURIId);\n\n // Database reference (required for Obj.getDatabase to work on snapshots).\n copySymbolProperty(source, snapshot, ObjectDatabaseId);\n copySymbolProperty(source, snapshot, ObjectDeletedId);\n\n // Parent reference (required for Obj.getParent to work on snapshots).\n copySymbolProperty(source, snapshot, ParentId);\n\n // Metadata symbol. Copy arrays/objects so the snapshot is not affected by mutations to the live meta.\n copySymbolProperty(source, snapshot, MetaId, (meta: any) => ({\n keys: [...(meta?.keys ?? [])],\n tags: [...(meta?.tags ?? [])],\n ...(meta?.key != null ? { key: meta.key } : {}),\n ...(meta?.version != null ? { version: meta.version } : {}),\n ...(meta?.annotations ? { annotations: { ...meta.annotations } } : {}),\n }));\n\n // Relation endpoint symbols.\n copySymbolProperty(source, snapshot, RelationSourceDXNId);\n copySymbolProperty(source, snapshot, RelationTargetDXNId);\n copySymbolProperty(source, snapshot, RelationSourceId);\n copySymbolProperty(source, snapshot, RelationTargetId);\n\n return Object.freeze(snapshot) as T;\n};\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Atom from '@effect-atom/atom/Atom';\nimport * as Result from '@effect-atom/atom/Result';\nimport * as Effect from 'effect/Effect';\nimport * as Function from 'effect/Function';\nimport * as Option from 'effect/Option';\n\nimport { assertArgument } from '@dxos/invariant';\n\nimport type * as Entity from '../../Entity';\nimport type * as Obj from '../../Obj';\nimport type * as Ref from '../../Ref';\nimport type * as Relation from '../../Relation';\nimport { getLabel } from '../Annotation';\nimport { snapshotForComparison } from '../common/atom-snapshot';\nimport { subscribe } from '../common/proxy/reactive';\nimport { getDatabase, isEntity } from '../Entity';\nimport { RefTypeId } from '../Ref/ref';\nimport { loadRefTarget } from '../Ref/utils';\nimport { isDeleted } from './deleted';\nimport { getSnapshot } from './snapshot';\n\nconst isRef = (obj: unknown): obj is Ref.Ref<any> =>\n obj != null && typeof obj === 'object' && RefTypeId in (obj as object);\n\nconst getReactiveOption = <T extends Obj.Unknown>(snapshot: Obj.Snapshot<T>): Effect.Effect<Option.Option<T>, never> =>\n Effect.gen(function* () {\n const db = getDatabase(snapshot as any);\n if (!db) {\n return Option.none();\n }\n const obj = db.getObjectById((snapshot as any).id);\n return obj ? Option.some(obj as T) : Option.none();\n });\n\n/**\n * Atom family for ECHO objects.\n * Uses object reference as key — same object returns same atom.\n */\nconst objectFamily = Atom.family(<T extends Obj.Unknown>(obj: T): Atom.Atom<Obj.Snapshot<T>> => {\n return Atom.make<Obj.Snapshot<T>>((get) => {\n const unsubscribe = subscribe(obj, () => {\n // getSnapshot adds SnapshotKindId brand at runtime; cast bridges static types.\n get.setSelf(getSnapshot(obj) as unknown as Obj.Snapshot<T>);\n });\n\n get.addFinalizer(() => unsubscribe());\n\n return getSnapshot(obj) as unknown as Obj.Snapshot<T>;\n }).pipe(Atom.keepAlive);\n});\n\n/**\n * Atom family for ECHO refs (snapshot version).\n * Uses ref as key — same ref returns same atom.\n * Subscribes to target object changes after loading.\n */\nconst refFamily = Atom.family(<T extends Obj.Unknown>(ref: Ref.Ref<T>): Atom.Atom<Obj.Snapshot<T> | undefined> => {\n return Atom.make<Obj.Snapshot<T> | undefined>((get) => {\n let unsubscribeTarget: (() => void) | undefined;\n\n const setupTargetSubscription = (target: T): Obj.Snapshot<T> | undefined => {\n unsubscribeTarget?.();\n unsubscribeTarget = subscribe(target, () => {\n // Deleted objects resolve to undefined so callers don't need to inspect isDeleted.\n // getSnapshot adds SnapshotKindId brand at runtime; cast bridges static types.\n get.setSelf(isDeleted(target) ? undefined : (getSnapshot(target) as unknown as Obj.Snapshot<T>));\n });\n // Guard the initial value too: an already-deleted target must resolve to undefined, not leak a\n // snapshot until the next update.\n return isDeleted(target) ? undefined : (getSnapshot(target) as unknown as Obj.Snapshot<T>);\n };\n\n get.addFinalizer(() => {\n unsubscribeTarget?.();\n });\n\n return loadRefTarget(ref, get, setupTargetSubscription);\n }).pipe(Atom.keepAlive);\n});\n\n/**\n * Atom family for ECHO object properties.\n * Uses nested families: outer keyed by object, inner keyed by property key.\n */\nconst propertyFamily = Atom.family(<T extends Obj.Unknown>(obj: T) =>\n Atom.family(<K extends keyof T>(key: K): Atom.Atom<T[K]> => {\n return Atom.make<T[K]>((get) => {\n let previousSnapshot = snapshotForComparison(obj[key]);\n\n const unsubscribe2 = subscribe(obj, () => {\n const newValue = obj[key];\n const newSnapshot = snapshotForComparison(newValue);\n if (newSnapshot !== previousSnapshot) {\n previousSnapshot = newSnapshot;\n get.setSelf(newSnapshot);\n }\n });\n\n get.addFinalizer(() => unsubscribe2());\n\n return snapshotForComparison(obj[key]);\n }).pipe(Atom.keepAlive);\n }),\n);\n\n/**\n * Atom family for ECHO objects — returns the live object, not a snapshot.\n */\nconst objectWithReactiveFamily = Atom.family(<T extends Obj.Unknown>(obj: T): Atom.Atom<T> => {\n return Atom.make<T>((get) => {\n const unsubscribe = subscribe(obj, () => {\n get.setSelf(obj);\n });\n\n get.addFinalizer(() => unsubscribe());\n\n return obj;\n }).pipe(Atom.keepAlive);\n});\n\n/**\n * Atom family for ECHO refs — returns the live reactive object, not a snapshot.\n */\nconst refWithReactiveFamily = Atom.family(<T extends Obj.Unknown>(ref: Ref.Ref<T>): Atom.Atom<T | undefined> => {\n const effect = (get: Atom.Context) =>\n Effect.gen(function* () {\n const snapshot = get(makeAtom(ref));\n if (snapshot == null) {\n return undefined;\n }\n const option = yield* getReactiveOption(snapshot);\n return Option.getOrElse(option, () => undefined);\n });\n\n return Function.pipe(\n Atom.make(effect),\n Atom.map((result) => Result.getOrElse(result, () => undefined)),\n );\n});\n\n/**\n * Atom family for a property of a ref's target object.\n * Resolves the ref (reactively) then projects the property atom, so it fires when the ref resolves or when\n * that property changes. Yields `undefined` while the target is unresolved.\n */\nconst refPropertyFamily = Atom.family(<T extends Obj.Unknown>(ref: Ref.Ref<T>) =>\n Atom.family(<K extends keyof T>(key: K): Atom.Atom<T[K] | undefined> => {\n return Atom.make<T[K] | undefined>((get) => {\n const target = get(refWithReactiveFamily(ref));\n return target ? get(propertyFamily(target)(key)) : undefined;\n }).pipe(Atom.keepAlive);\n }),\n);\n\n/**\n * Atom family for any ECHO entity (obj or relation) — returns a snapshot.\n */\nconst entityFamily = Atom.family(<T extends Entity.Unknown>(entity: T): Atom.Atom<Entity.Snapshot> => {\n return Atom.make<Entity.Snapshot>((get) => {\n const unsubscribe = subscribe(entity, () => {\n // getSnapshot adds SnapshotKindId brand at runtime; cast bridges static types.\n get.setSelf(getSnapshot(entity) as unknown as Entity.Snapshot);\n });\n\n get.addFinalizer(() => unsubscribe());\n\n return getSnapshot(entity) as unknown as Entity.Snapshot;\n }).pipe(Atom.keepAlive);\n});\n\n/**\n * Atom family for ECHO relations — returns a typed relation snapshot.\n */\nconst relationFamily = Atom.family(<T extends Relation.Unknown>(relation: T): Atom.Atom<Relation.Snapshot<T>> => {\n return Atom.make<Relation.Snapshot<T>>((get) => {\n const unsubscribe = subscribe(relation, () => {\n // getSnapshot adds SnapshotKindId brand at runtime; cast bridges static types.\n get.setSelf(getSnapshot(relation) as unknown as Relation.Snapshot<T>);\n });\n\n get.addFinalizer(() => unsubscribe());\n\n return getSnapshot(relation) as unknown as Relation.Snapshot<T>;\n }).pipe(Atom.keepAlive);\n});\n\n/**\n * Create a read-only snapshot atom for a reactive object or ref.\n * Updates automatically when the object is mutated.\n * For refs, subscribes to target object changes after loading.\n */\nexport const makeAtom: {\n <T extends Obj.Unknown>(obj: T): Atom.Atom<Obj.Snapshot<T>>;\n <T extends Obj.Unknown>(ref: Ref.Ref<T>): Atom.Atom<Obj.Snapshot<T> | undefined>;\n} = (objOrRef: Obj.Unknown | Ref.Ref<any>): Atom.Atom<any> => {\n if (isRef(objOrRef)) {\n return refFamily(objOrRef as any);\n }\n\n const obj = objOrRef as Obj.Unknown;\n assertArgument(isEntity(obj), 'obj', 'Object must be a reactive object');\n return objectFamily(obj as any);\n};\n\n/**\n * Create a read-only atom for a specific property of a reactive object, or of a ref's target.\n * Only fires updates when the property value actually changes. Given a ref, the atom resolves the target\n * first and yields `undefined` until it loads.\n */\nexport const makeProperty: {\n <T extends Obj.Unknown, K extends keyof T>(obj: T, key: K): Atom.Atom<T[K]>;\n <T extends Obj.Unknown, K extends keyof T>(ref: Ref.Ref<T>, key: K): Atom.Atom<T[K] | undefined>;\n} = (objOrRef: Obj.Unknown | Ref.Ref<any>, key: any): Atom.Atom<any> => {\n if (isRef(objOrRef)) {\n return refPropertyFamily(objOrRef as Ref.Ref<any>)(key);\n }\n\n const obj = objOrRef as Obj.Unknown;\n assertArgument(isEntity(obj), 'obj', 'Object must be a reactive object');\n return propertyFamily(obj)(key);\n};\n\n/**\n * Like `makeAtom` but returns the live reactive object instead of a snapshot.\n * Prefer `makeAtom` (snapshot) unless you need the live Obj for generic mutations.\n */\nexport const makeWithReactive: {\n <T extends Obj.Unknown>(obj: T): Atom.Atom<T>;\n <T extends Obj.Unknown>(ref: Ref.Ref<T>): Atom.Atom<T | undefined>;\n} = (objOrRef: Obj.Unknown | Ref.Ref<any>): Atom.Atom<any> => {\n if (isRef(objOrRef)) {\n return refWithReactiveFamily(objOrRef as Ref.Ref<any>);\n }\n\n const obj = objOrRef as Obj.Unknown;\n assertArgument(isEntity(obj), 'obj', 'Object must be a reactive object');\n return objectWithReactiveFamily(obj);\n};\n\n/**\n * Create a read-only snapshot atom for any ECHO entity (obj or relation).\n * Updates automatically when the entity is mutated.\n */\nexport const makeEntity = <T extends Entity.Unknown>(entity: T): Atom.Atom<Entity.Snapshot> => {\n assertArgument(isEntity(entity), 'entity', 'Must be a reactive ECHO entity');\n return entityFamily(entity);\n};\n\n/**\n * Create a read-only snapshot atom for a reactive relation.\n * Updates automatically when the relation is mutated.\n */\nexport const makeRelation = <T extends Relation.Unknown>(relation: T): Atom.Atom<Relation.Snapshot<T>> => {\n assertArgument(isEntity(relation), 'relation', 'Must be a reactive ECHO relation');\n return relationFamily(relation);\n};\n\n/**\n * Atom family for an entity's label string.\n * Fires only when the computed label actually changes, not on every entity mutation.\n */\nconst labelAtomFamily = Atom.family(<T extends Entity.Unknown>(entity: T): Atom.Atom<string | undefined> => {\n return Atom.make<string | undefined>((get) => {\n let previous = getLabel(entity);\n\n const unsubscribe = subscribe(entity, () => {\n const next = getLabel(entity);\n if (next !== previous) {\n previous = next;\n get.setSelf(next);\n }\n });\n\n get.addFinalizer(() => unsubscribe());\n return previous;\n }).pipe(Atom.keepAlive);\n});\n\n/**\n * Create a read-only atom for the label of a reactive ECHO entity.\n * Re-evaluates on entity mutation; only propagates when the label string changes.\n */\nexport const makeLabelAtom = <T extends Entity.Unknown>(entity: T): Atom.Atom<string | undefined> => {\n assertArgument(isEntity(entity), 'entity', 'Must be a reactive ECHO entity');\n return labelAtomFamily(entity);\n};\n","//\n// Copyright 2026 DXOS.org\n//\n\nimport { invariant } from '@dxos/invariant';\nimport { assumeType, deepMapValues } from '@dxos/util';\n\nimport type * as Obj from '../../Obj';\nimport { makeObject } from '../common/proxy';\nimport { ParentId, getSchema, getStaticTypeSchema, getType } from '../common/types';\nimport { getMeta } from '../common/types/meta';\nimport { type InternalObjectProps } from '../Entity/model';\nimport { Ref } from '../Ref';\n\n/**\n * Clones an object or relation.\n * By default this does not clone referenced objects, only the properties in the object; pass `opts.deep`\n * to recurse into refs (see {@link Obj.CloneOptions}).\n * @returns A new object with the same schema and properties.\n */\nexport const clone = <T extends Obj.Any>(obj: T, opts?: Obj.CloneOptions): T =>\n cloneInner(obj, opts, obj, new Map(), new Set());\n\n/**\n * Recursive clone worker threaded with two cycle-guard structures:\n * - `cache`: id → already-finished clone; reused when the same object appears more than once in a DAG.\n * - `inProgress`: ids of objects whose clone is currently being computed; a ref back into this set means\n * a true cycle — the original ref is kept rather than recursing forever.\n */\nconst cloneInner = <T extends Obj.Any>(\n obj: T,\n opts: Obj.CloneOptions | undefined,\n root: Obj.Any,\n cache: Map<string, Obj.Any>,\n inProgress: Set<string>,\n): T => {\n if (cache.has(obj.id)) {\n return cache.get(obj.id) as T;\n }\n inProgress.add(obj.id);\n\n const { id, ...data } = obj;\n // Prefer cloning through the type entity so the cloned instance preserves\n // `Obj.getType` identity. Falls back to the raw schema for older instances\n // that don't have a type-entity back-reference set (e.g. deserialized).\n const typeEntity = getType(obj);\n const schema = typeEntity != null ? getStaticTypeSchema(typeEntity) : getSchema(obj);\n invariant(schema != null, 'Object should have a type or schema');\n\n const mapRef = (value: unknown, recurse: (value: unknown) => unknown): unknown => {\n if (Ref.isRef(value)) {\n const target = value.target;\n // A ref back to an in-progress object means a cycle — keep the original ref to break it.\n if (\n target != null &&\n !inProgress.has(target.id) &&\n (opts?.deep === 'all' || (opts?.deep === 'parent' && isChildOf(target, root)))\n ) {\n return Ref.make(cloneInner(target, opts, root, cache, inProgress));\n }\n return value;\n }\n return recurse(value);\n };\n\n const props: any = deepMapValues(data, mapRef);\n if (opts?.retainId) {\n props.id = id;\n }\n const meta = deepMapValues(getMeta(obj), mapRef);\n const result = makeObject(schema, props, meta, typeEntity as object | undefined);\n\n inProgress.delete(obj.id);\n cache.set(obj.id, result);\n return result;\n};\n\n/**\n * Whether `entity`'s parent chain reaches `root` — i.e. it is an owned descendant that cascade-deletes with\n * the root. Walks the `ParentId` back-links (a finite tree); guarded against cycles defensively.\n */\nconst isChildOf = (entity: unknown, root: Obj.Any): boolean => {\n const seen = new Set<InternalObjectProps>();\n assumeType<InternalObjectProps>(entity);\n let parent = entity[ParentId];\n while (parent != null && !seen.has(parent)) {\n if (parent.id === root.id) {\n return true;\n }\n seen.add(parent);\n parent = parent[ParentId];\n }\n return false;\n};\n","//\n// Copyright 2024 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\nimport * as SchemaAST from 'effect/SchemaAST';\n\nimport { invariant } from '@dxos/invariant';\n\n// TODO(ZaymonFC): Do this one at a time. This might be dangerous.\nexport const addFieldsToSchema = (\n schema: Schema.Schema.AnyNoContext,\n fields: Schema.Struct.Fields,\n): Schema.Schema.AnyNoContext => {\n const schemaExtension = Schema.partial(Schema.Struct(fields));\n return Schema.extend(schema, schemaExtension).annotations(\n schema.ast.annotations,\n ) as any as Schema.Schema.AnyNoContext;\n};\n\nexport const updateFieldsInSchema = (\n schema: Schema.Schema.AnyNoContext,\n fields: Schema.Struct.Fields,\n): Schema.Schema.AnyNoContext => {\n const ast = schema.ast as SchemaAST.TypeLiteral;\n invariant(SchemaAST.isTypeLiteral(ast));\n\n const updatedProperties = [...ast.propertySignatures];\n const propertiesToUpdate = (Schema.partial(Schema.Struct(fields)).ast as SchemaAST.TypeLiteral).propertySignatures;\n for (const property of propertiesToUpdate) {\n const index = updatedProperties.findIndex((p) => p.name === property.name);\n if (index !== -1) {\n updatedProperties[index] = property;\n } else {\n updatedProperties.push(property);\n }\n }\n\n return Schema.make(new SchemaAST.TypeLiteral(updatedProperties, ast.indexSignatures, ast.annotations));\n};\n\nexport const removeFieldsFromSchema = (\n schema: Schema.Schema.AnyNoContext,\n fieldNames: string[],\n): Schema.Schema.AnyNoContext => {\n return Schema.make(SchemaAST.omit(schema.ast, fieldNames)).annotations(schema.ast.annotations);\n};\n\nexport const updateFieldNameInSchema = (\n schema: Schema.Schema.AnyNoContext,\n { before, after }: { before: PropertyKey; after: PropertyKey },\n): Schema.Schema.AnyNoContext => {\n const ast = schema.ast as SchemaAST.TypeLiteral;\n invariant(SchemaAST.isTypeLiteral(ast));\n\n return Schema.make(\n new SchemaAST.TypeLiteral(\n ast.propertySignatures.map((p) =>\n p.name === before\n ? new SchemaAST.PropertySignature(after, p.type, p.isOptional, p.isReadonly, p.annotations)\n : p,\n ),\n ast.indexSignatures,\n ast.annotations,\n ),\n );\n};\n","//\n// Copyright 2024 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\n\nimport { IconAnnotation, LabelAnnotation } from '../Annotation';\nimport { EntityKind, KindId, SchemaKindId, StaticTypeSchemaSlot } from '../common/types';\nimport { EchoTypeKindSchema, TypeMetaSchemaDXN } from '../Entity';\nimport { JsonSchemaType } from '../JsonSchema';\n\n/**\n * Raw struct backing {@link TypeSchema}. Exposed only so `TypeSchema`\n * (the TS type) can derive its data fields via `Schema.Schema.Type<typeof ...>`;\n * runtime callers should use {@link TypeSchema} (the piped, branded entity).\n *\n * `typename` and `version` are NOT data fields — they live in `EntityMeta.key` /\n * `EntityMeta.version` (the canonical registry-provenance pair, queryable via\n * `Filter.key(...)`). The same `jsonSchema` payload also embeds them so a\n * standalone JSON-Schema export remains self-describing, but the schema-registry\n * reads/writes them through meta.\n */\nconst TypeSchemaStruct = Schema.Struct({\n name: Schema.optional(Schema.String),\n jsonSchema: JsonSchemaType,\n});\n\n/**\n * Persistent representation of a schema.\n */\nexport const TypeSchema = TypeSchemaStruct.pipe(\n LabelAnnotation.set(['name']),\n IconAnnotation.set({\n icon: 'ph--database--regular',\n hue: 'green',\n }),\n EchoTypeKindSchema(TypeMetaSchemaDXN),\n);\n\n/**\n * Persistent representation of a schema — the runtime shape that\n * `db.addType(Type.makeObjectFromJsonSchema(...))` produces\n * and `Filter.type(Type.Type).run()` returns.\n *\n * Structurally identical to a static `Type.Type` entity: the entity-handler's\n * `get` trap exposes `[SchemaKindId]` (derived from `system.kind` and\n * `data.jsonSchema.entityKind`) and rebuilds `[StaticTypeSchemaSlot]` lazily\n * from `jsonSchema`, so a persisted instance satisfies the public `Type<A>`\n * interface without casting.\n */\nexport type TypeSchema = Schema.Schema.Type<typeof TypeSchemaStruct> & {\n /** Object identifier — injected by `EchoTypeKindSchema` and stamped at construction. */\n readonly id: string;\n /** Entity-kind discriminator (object/relation/type) carried on every entity instance. */\n readonly [KindId]: EntityKind.Type;\n /** Kind of schema described by this meta-instance — always `EntityKind.Type` for `Type.Type` itself. */\n readonly [SchemaKindId]: EntityKind.Type;\n /** Effect Schema rebuilt lazily from `jsonSchema`; satisfies `Type.getSchema(...)` without an extra cast. */\n readonly [StaticTypeSchemaSlot]: Schema.Schema.AnyNoContext;\n};\n"],"mappings":"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"}