@ifc-lite/collab 0.2.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 (219) hide show
  1. package/LICENSE +373 -0
  2. package/README.md +92 -0
  3. package/dist/awareness/agent.d.ts +36 -0
  4. package/dist/awareness/agent.d.ts.map +1 -0
  5. package/dist/awareness/agent.js +39 -0
  6. package/dist/awareness/agent.js.map +1 -0
  7. package/dist/awareness/color.d.ts +31 -0
  8. package/dist/awareness/color.d.ts.map +1 -0
  9. package/dist/awareness/color.js +61 -0
  10. package/dist/awareness/color.js.map +1 -0
  11. package/dist/awareness/index.d.ts +6 -0
  12. package/dist/awareness/index.d.ts.map +1 -0
  13. package/dist/awareness/index.js +9 -0
  14. package/dist/awareness/index.js.map +1 -0
  15. package/dist/awareness/overlay.d.ts +59 -0
  16. package/dist/awareness/overlay.d.ts.map +1 -0
  17. package/dist/awareness/overlay.js +110 -0
  18. package/dist/awareness/overlay.js.map +1 -0
  19. package/dist/awareness/presence.d.ts +95 -0
  20. package/dist/awareness/presence.d.ts.map +1 -0
  21. package/dist/awareness/presence.js +114 -0
  22. package/dist/awareness/presence.js.map +1 -0
  23. package/dist/awareness/render.d.ts +58 -0
  24. package/dist/awareness/render.d.ts.map +1 -0
  25. package/dist/awareness/render.js +66 -0
  26. package/dist/awareness/render.js.map +1 -0
  27. package/dist/branch/branch-tree.d.ts +40 -0
  28. package/dist/branch/branch-tree.d.ts.map +1 -0
  29. package/dist/branch/branch-tree.js +66 -0
  30. package/dist/branch/branch-tree.js.map +1 -0
  31. package/dist/branch/branch.d.ts +44 -0
  32. package/dist/branch/branch.d.ts.map +1 -0
  33. package/dist/branch/branch.js +109 -0
  34. package/dist/branch/branch.js.map +1 -0
  35. package/dist/branch/history-automerge.d.ts +31 -0
  36. package/dist/branch/history-automerge.d.ts.map +1 -0
  37. package/dist/branch/history-automerge.js +237 -0
  38. package/dist/branch/history-automerge.js.map +1 -0
  39. package/dist/branch/history.d.ts +147 -0
  40. package/dist/branch/history.d.ts.map +1 -0
  41. package/dist/branch/history.js +223 -0
  42. package/dist/branch/history.js.map +1 -0
  43. package/dist/branch/index.d.ts +5 -0
  44. package/dist/branch/index.d.ts.map +1 -0
  45. package/dist/branch/index.js +8 -0
  46. package/dist/branch/index.js.map +1 -0
  47. package/dist/conflicts/detector.d.ts +52 -0
  48. package/dist/conflicts/detector.d.ts.map +1 -0
  49. package/dist/conflicts/detector.js +226 -0
  50. package/dist/conflicts/detector.js.map +1 -0
  51. package/dist/conflicts/index.d.ts +3 -0
  52. package/dist/conflicts/index.d.ts.map +1 -0
  53. package/dist/conflicts/index.js +6 -0
  54. package/dist/conflicts/index.js.map +1 -0
  55. package/dist/conflicts/ui-bridge.d.ts +80 -0
  56. package/dist/conflicts/ui-bridge.d.ts.map +1 -0
  57. package/dist/conflicts/ui-bridge.js +126 -0
  58. package/dist/conflicts/ui-bridge.js.map +1 -0
  59. package/dist/doc/entity.d.ts +84 -0
  60. package/dist/doc/entity.d.ts.map +1 -0
  61. package/dist/doc/entity.js +345 -0
  62. package/dist/doc/entity.js.map +1 -0
  63. package/dist/doc/geometry.d.ts +39 -0
  64. package/dist/doc/geometry.d.ts.map +1 -0
  65. package/dist/doc/geometry.js +99 -0
  66. package/dist/doc/geometry.js.map +1 -0
  67. package/dist/doc/index.d.ts +8 -0
  68. package/dist/doc/index.d.ts.map +1 -0
  69. package/dist/doc/index.js +11 -0
  70. package/dist/doc/index.js.map +1 -0
  71. package/dist/doc/migration-ifc4-to-ifc4x3.d.ts +21 -0
  72. package/dist/doc/migration-ifc4-to-ifc4x3.d.ts.map +1 -0
  73. package/dist/doc/migration-ifc4-to-ifc4x3.js +55 -0
  74. package/dist/doc/migration-ifc4-to-ifc4x3.js.map +1 -0
  75. package/dist/doc/relationship.d.ts +27 -0
  76. package/dist/doc/relationship.d.ts.map +1 -0
  77. package/dist/doc/relationship.js +110 -0
  78. package/dist/doc/relationship.js.map +1 -0
  79. package/dist/doc/schema-version.d.ts +47 -0
  80. package/dist/doc/schema-version.d.ts.map +1 -0
  81. package/dist/doc/schema-version.js +41 -0
  82. package/dist/doc/schema-version.js.map +1 -0
  83. package/dist/doc/schema.d.ts +131 -0
  84. package/dist/doc/schema.d.ts.map +1 -0
  85. package/dist/doc/schema.js +117 -0
  86. package/dist/doc/schema.js.map +1 -0
  87. package/dist/doc/units.d.ts +45 -0
  88. package/dist/doc/units.d.ts.map +1 -0
  89. package/dist/doc/units.js +120 -0
  90. package/dist/doc/units.js.map +1 -0
  91. package/dist/federation/bridge.d.ts +34 -0
  92. package/dist/federation/bridge.d.ts.map +1 -0
  93. package/dist/federation/bridge.js +52 -0
  94. package/dist/federation/bridge.js.map +1 -0
  95. package/dist/federation/index.d.ts +4 -0
  96. package/dist/federation/index.d.ts.map +1 -0
  97. package/dist/federation/index.js +7 -0
  98. package/dist/federation/index.js.map +1 -0
  99. package/dist/federation/resolver.d.ts +58 -0
  100. package/dist/federation/resolver.d.ts.map +1 -0
  101. package/dist/federation/resolver.js +43 -0
  102. package/dist/federation/resolver.js.map +1 -0
  103. package/dist/federation/session.d.ts +79 -0
  104. package/dist/federation/session.d.ts.map +1 -0
  105. package/dist/federation/session.js +126 -0
  106. package/dist/federation/session.js.map +1 -0
  107. package/dist/geometry/blob-store.d.ts +106 -0
  108. package/dist/geometry/blob-store.d.ts.map +1 -0
  109. package/dist/geometry/blob-store.js +266 -0
  110. package/dist/geometry/blob-store.js.map +1 -0
  111. package/dist/geometry/csg.d.ts +63 -0
  112. package/dist/geometry/csg.d.ts.map +1 -0
  113. package/dist/geometry/csg.js +101 -0
  114. package/dist/geometry/csg.js.map +1 -0
  115. package/dist/geometry/determinism.d.ts +45 -0
  116. package/dist/geometry/determinism.d.ts.map +1 -0
  117. package/dist/geometry/determinism.js +92 -0
  118. package/dist/geometry/determinism.js.map +1 -0
  119. package/dist/geometry/gc.d.ts +63 -0
  120. package/dist/geometry/gc.d.ts.map +1 -0
  121. package/dist/geometry/gc.js +109 -0
  122. package/dist/geometry/gc.js.map +1 -0
  123. package/dist/geometry/index.d.ts +6 -0
  124. package/dist/geometry/index.d.ts.map +1 -0
  125. package/dist/geometry/index.js +9 -0
  126. package/dist/geometry/index.js.map +1 -0
  127. package/dist/geometry/parametric.d.ts +92 -0
  128. package/dist/geometry/parametric.d.ts.map +1 -0
  129. package/dist/geometry/parametric.js +200 -0
  130. package/dist/geometry/parametric.js.map +1 -0
  131. package/dist/index.d.ts +27 -0
  132. package/dist/index.d.ts.map +1 -0
  133. package/dist/index.js +46 -0
  134. package/dist/index.js.map +1 -0
  135. package/dist/mutations/bind.d.ts +56 -0
  136. package/dist/mutations/bind.d.ts.map +1 -0
  137. package/dist/mutations/bind.js +68 -0
  138. package/dist/mutations/bind.js.map +1 -0
  139. package/dist/mutations/index.d.ts +2 -0
  140. package/dist/mutations/index.d.ts.map +1 -0
  141. package/dist/mutations/index.js +5 -0
  142. package/dist/mutations/index.js.map +1 -0
  143. package/dist/perf/benchmark.d.ts +25 -0
  144. package/dist/perf/benchmark.d.ts.map +1 -0
  145. package/dist/perf/benchmark.js +97 -0
  146. package/dist/perf/benchmark.js.map +1 -0
  147. package/dist/perf/index.d.ts +3 -0
  148. package/dist/perf/index.d.ts.map +1 -0
  149. package/dist/perf/index.js +6 -0
  150. package/dist/perf/index.js.map +1 -0
  151. package/dist/perf/latency.d.ts +39 -0
  152. package/dist/perf/latency.d.ts.map +1 -0
  153. package/dist/perf/latency.js +79 -0
  154. package/dist/perf/latency.js.map +1 -0
  155. package/dist/privacy.d.ts +45 -0
  156. package/dist/privacy.d.ts.map +1 -0
  157. package/dist/privacy.js +66 -0
  158. package/dist/privacy.js.map +1 -0
  159. package/dist/providers/indexeddb.d.ts +37 -0
  160. package/dist/providers/indexeddb.d.ts.map +1 -0
  161. package/dist/providers/indexeddb.js +45 -0
  162. package/dist/providers/indexeddb.js.map +1 -0
  163. package/dist/providers/webrtc.d.ts +40 -0
  164. package/dist/providers/webrtc.d.ts.map +1 -0
  165. package/dist/providers/webrtc.js +81 -0
  166. package/dist/providers/webrtc.js.map +1 -0
  167. package/dist/providers/websocket.d.ts +45 -0
  168. package/dist/providers/websocket.d.ts.map +1 -0
  169. package/dist/providers/websocket.js +56 -0
  170. package/dist/providers/websocket.js.map +1 -0
  171. package/dist/security/e2e.d.ts +54 -0
  172. package/dist/security/e2e.d.ts.map +1 -0
  173. package/dist/security/e2e.js +147 -0
  174. package/dist/security/e2e.js.map +1 -0
  175. package/dist/security/index.d.ts +2 -0
  176. package/dist/security/index.d.ts.map +1 -0
  177. package/dist/security/index.js +5 -0
  178. package/dist/security/index.js.map +1 -0
  179. package/dist/session.d.ts +79 -0
  180. package/dist/session.d.ts.map +1 -0
  181. package/dist/session.js +112 -0
  182. package/dist/session.js.map +1 -0
  183. package/dist/snapshot/from-ifcx.d.ts +24 -0
  184. package/dist/snapshot/from-ifcx.d.ts.map +1 -0
  185. package/dist/snapshot/from-ifcx.js +93 -0
  186. package/dist/snapshot/from-ifcx.js.map +1 -0
  187. package/dist/snapshot/index.d.ts +6 -0
  188. package/dist/snapshot/index.d.ts.map +1 -0
  189. package/dist/snapshot/index.js +9 -0
  190. package/dist/snapshot/index.js.map +1 -0
  191. package/dist/snapshot/layers.d.ts +56 -0
  192. package/dist/snapshot/layers.d.ts.map +1 -0
  193. package/dist/snapshot/layers.js +82 -0
  194. package/dist/snapshot/layers.js.map +1 -0
  195. package/dist/snapshot/minimal-layer.d.ts +40 -0
  196. package/dist/snapshot/minimal-layer.d.ts.map +1 -0
  197. package/dist/snapshot/minimal-layer.js +123 -0
  198. package/dist/snapshot/minimal-layer.js.map +1 -0
  199. package/dist/snapshot/to-ifcx.d.ts +26 -0
  200. package/dist/snapshot/to-ifcx.d.ts.map +1 -0
  201. package/dist/snapshot/to-ifcx.js +54 -0
  202. package/dist/snapshot/to-ifcx.js.map +1 -0
  203. package/dist/snapshot/worker.d.ts +45 -0
  204. package/dist/snapshot/worker.d.ts.map +1 -0
  205. package/dist/snapshot/worker.js +73 -0
  206. package/dist/snapshot/worker.js.map +1 -0
  207. package/dist/sync/room.d.ts +15 -0
  208. package/dist/sync/room.d.ts.map +1 -0
  209. package/dist/sync/room.js +20 -0
  210. package/dist/sync/room.js.map +1 -0
  211. package/dist/undo.d.ts +25 -0
  212. package/dist/undo.d.ts.map +1 -0
  213. package/dist/undo.js +37 -0
  214. package/dist/undo.js.map +1 -0
  215. package/dist/viewer-bridge.d.ts +27 -0
  216. package/dist/viewer-bridge.d.ts.map +1 -0
  217. package/dist/viewer-bridge.js +82 -0
  218. package/dist/viewer-bridge.js.map +1 -0
  219. package/package.json +83 -0
@@ -0,0 +1,99 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ /**
5
+ * Geometry-reference operations on the Y.Doc.
6
+ *
7
+ * The Y.Doc only ever holds *references* to geometry (parametric params or
8
+ * mesh blob hashes), never raw mesh bytes. This keeps Y.Doc memory small
9
+ * and bounded — see spec §11 and §15.
10
+ */
11
+ import * as Y from 'yjs';
12
+ import { GEOMETRY_KEY, geometryMap } from './schema.js';
13
+ export function getGeometry(doc, geomId) {
14
+ return geometryMap(doc).get(geomId);
15
+ }
16
+ export function createGeometry(doc, geomId, opts) {
17
+ const geom = geometryMap(doc);
18
+ const existing = geom.get(geomId);
19
+ if (existing)
20
+ return existing;
21
+ const node = new Y.Map();
22
+ node.set(GEOMETRY_KEY.TYPE, opts.type);
23
+ node.set(GEOMETRY_KEY.SOURCE, opts.source);
24
+ if (opts.blobHash)
25
+ node.set(GEOMETRY_KEY.BLOB_HASH, opts.blobHash);
26
+ const params = new Y.Map();
27
+ if (opts.params) {
28
+ for (const [k, v] of Object.entries(opts.params)) {
29
+ params.set(k, v);
30
+ }
31
+ }
32
+ node.set(GEOMETRY_KEY.PARAMS, params);
33
+ if (opts.bbox)
34
+ node.set(GEOMETRY_KEY.BBOX, opts.bbox);
35
+ // The version vector is a Y.Map<peerId, counter> so concurrent replaces
36
+ // become detectable conflicts (§9.4).
37
+ node.set(GEOMETRY_KEY.VERSION_VECTOR, new Y.Map());
38
+ geom.set(geomId, node);
39
+ return node;
40
+ }
41
+ export function setGeometryParam(doc, geomId, paramName, value) {
42
+ const node = getGeometry(doc, geomId);
43
+ if (!node)
44
+ throw new Error(`@ifc-lite/collab: geometry "${geomId}" not found`);
45
+ const params = node.get(GEOMETRY_KEY.PARAMS);
46
+ if (!params)
47
+ throw new Error(`@ifc-lite/collab: geometry "${geomId}" missing params map`);
48
+ params.set(paramName, value);
49
+ }
50
+ export function setGeometryBlobHash(doc, geomId, blobHash) {
51
+ const node = getGeometry(doc, geomId);
52
+ if (!node)
53
+ throw new Error(`@ifc-lite/collab: geometry "${geomId}" not found`);
54
+ node.set(GEOMETRY_KEY.BLOB_HASH, blobHash);
55
+ }
56
+ /**
57
+ * Bump the version vector for a peer when this peer replaces geometry. The
58
+ * conflict detector (`conflicts/detector.ts`) uses these vectors to
59
+ * identify concurrent replacements.
60
+ */
61
+ export function bumpGeometryVersion(doc, geomId, peerId) {
62
+ const node = getGeometry(doc, geomId);
63
+ if (!node)
64
+ throw new Error(`@ifc-lite/collab: geometry "${geomId}" not found`);
65
+ const vv = node.get(GEOMETRY_KEY.VERSION_VECTOR);
66
+ if (!vv)
67
+ throw new Error(`@ifc-lite/collab: geometry "${geomId}" missing version vector`);
68
+ const key = String(peerId);
69
+ vv.set(key, (vv.get(key) ?? 0) + 1);
70
+ }
71
+ export function deleteGeometry(doc, geomId) {
72
+ const geom = geometryMap(doc);
73
+ if (!geom.has(geomId))
74
+ return false;
75
+ geom.delete(geomId);
76
+ return true;
77
+ }
78
+ /** Plain JSON snapshot of a geometry node (used by the IFCX writer). */
79
+ export function geometryToJSON(node) {
80
+ const params = node.get(GEOMETRY_KEY.PARAMS);
81
+ const vv = node.get(GEOMETRY_KEY.VERSION_VECTOR);
82
+ const paramsJson = {};
83
+ if (params)
84
+ for (const [k, v] of params.entries())
85
+ paramsJson[k] = v;
86
+ const vvJson = {};
87
+ if (vv)
88
+ for (const [k, v] of vv.entries())
89
+ vvJson[k] = v;
90
+ return {
91
+ type: node.get(GEOMETRY_KEY.TYPE),
92
+ source: node.get(GEOMETRY_KEY.SOURCE),
93
+ params: paramsJson,
94
+ blobHash: node.get(GEOMETRY_KEY.BLOB_HASH),
95
+ bbox: node.get(GEOMETRY_KEY.BBOX),
96
+ versionVector: vvJson,
97
+ };
98
+ }
99
+ //# sourceMappingURL=geometry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geometry.js","sourceRoot":"","sources":["../../src/doc/geometry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export * from './schema.js';
2
+ export * from './schema-version.js';
3
+ export * from './migration-ifc4-to-ifc4x3.js';
4
+ export * from './entity.js';
5
+ export * from './relationship.js';
6
+ export * from './geometry.js';
7
+ export * from './units.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/doc/index.ts"],"names":[],"mappings":"AAIA,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,11 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ export * from './schema.js';
5
+ export * from './schema-version.js';
6
+ export * from './migration-ifc4-to-ifc4x3.js';
7
+ export * from './entity.js';
8
+ export * from './relationship.js';
9
+ export * from './geometry.js';
10
+ export * from './units.js';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/doc/index.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Sample IFC4 → IFC4X3 schema migration (spec open #2).
3
+ *
4
+ * Demonstrates the migration plumb in `schema-version.ts`. Apps can
5
+ * register this directly via `installIfc4ToIfc4x3Migration()` or
6
+ * write their own equivalent.
7
+ *
8
+ * The transformation here is intentionally narrow:
9
+ * - rename common Pset attribute prefixes from `Pset_<…>::` to
10
+ * `bsi::ifc::v5a::Pset_<…>::` so they line up with IFCX namespacing.
11
+ *
12
+ * Real schema migrations are far more involved (entity-class renames,
13
+ * attribute splits, unit changes). This sample shows the shape; the
14
+ * full IFC4 → IFC4X3 migration registry is a v1.0+ task.
15
+ */
16
+ import { type SchemaMigration } from '../doc/schema-version.js';
17
+ declare const ifc4ToIfc4x3: SchemaMigration;
18
+ /** Register the IFC4 → IFC4X3 migration. Idempotent within a process. */
19
+ export declare function installIfc4ToIfc4x3Migration(): SchemaMigration;
20
+ export { ifc4ToIfc4x3 };
21
+ //# sourceMappingURL=migration-ifc4-to-ifc4x3.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration-ifc4-to-ifc4x3.d.ts","sourceRoot":"","sources":["../../src/doc/migration-ifc4-to-ifc4x3.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,0BAA0B,CAAC;AAKlC,QAAA,MAAM,YAAY,EAAE,eAyBnB,CAAC;AAEF,yEAAyE;AACzE,wBAAgB,4BAA4B,IAAI,eAAe,CAG9D;AAED,OAAO,EAAE,YAAY,EAAE,CAAC"}
@@ -0,0 +1,55 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ /**
5
+ * Sample IFC4 → IFC4X3 schema migration (spec open #2).
6
+ *
7
+ * Demonstrates the migration plumb in `schema-version.ts`. Apps can
8
+ * register this directly via `installIfc4ToIfc4x3Migration()` or
9
+ * write their own equivalent.
10
+ *
11
+ * The transformation here is intentionally narrow:
12
+ * - rename common Pset attribute prefixes from `Pset_<…>::` to
13
+ * `bsi::ifc::v5a::Pset_<…>::` so they line up with IFCX namespacing.
14
+ *
15
+ * Real schema migrations are far more involved (entity-class renames,
16
+ * attribute splits, unit changes). This sample shows the shape; the
17
+ * full IFC4 → IFC4X3 migration registry is a v1.0+ task.
18
+ */
19
+ import { registerSchemaMigration, } from '../doc/schema-version.js';
20
+ const PREFIX_FROM = /^Pset_([A-Za-z0-9_]+)::(.+)$/;
21
+ const ifc4ToIfc4x3 = {
22
+ from: 'ifc4',
23
+ to: 'ifc4x3',
24
+ apply(doc) {
25
+ const ents = doc.getMap('entities');
26
+ ents.forEach((entUntyped) => {
27
+ const entity = entUntyped;
28
+ const attrs = entity.get('attributes');
29
+ if (!attrs)
30
+ return;
31
+ const renames = [];
32
+ attrs.forEach((value, key) => {
33
+ const match = PREFIX_FROM.exec(key);
34
+ if (!match)
35
+ return;
36
+ renames.push({
37
+ from: key,
38
+ to: `bsi::ifc::v5a::Pset_${match[1]}::${match[2]}`,
39
+ value,
40
+ });
41
+ });
42
+ for (const r of renames) {
43
+ attrs.set(r.to, r.value);
44
+ attrs.delete(r.from);
45
+ }
46
+ });
47
+ },
48
+ };
49
+ /** Register the IFC4 → IFC4X3 migration. Idempotent within a process. */
50
+ export function installIfc4ToIfc4x3Migration() {
51
+ registerSchemaMigration(ifc4ToIfc4x3);
52
+ return ifc4ToIfc4x3;
53
+ }
54
+ export { ifc4ToIfc4x3 };
55
+ //# sourceMappingURL=migration-ifc4-to-ifc4x3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration-ifc4-to-ifc4x3.js","sourceRoot":"","sources":["../../src/doc/migration-ifc4-to-ifc4x3.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EACL,uBAAuB,GAExB,MAAM,0BAA0B,CAAC;AAGlC,MAAM,WAAW,GAAG,8BAA8B,CAAC;AAEnD,MAAM,YAAY,GAAoB;IACpC,IAAI,EAAE,MAAM;IACZ,EAAE,EAAE,QAAQ;IACZ,KAAK,CAAC,GAAU;QACd,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,EAAE;YAC1B,MAAM,MAAM,GAAG,UAA4B,CAAC;YAC5C,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,YAAY,CAA+B,CAAC;YACrE,IAAI,CAAC,KAAK;gBAAE,OAAO;YACnB,MAAM,OAAO,GAAwD,EAAE,CAAC;YACxE,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;gBAC3B,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACpC,IAAI,CAAC,KAAK;oBAAE,OAAO;gBACnB,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,GAAG;oBACT,EAAE,EAAE,uBAAuB,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE;oBAClD,KAAK;iBACN,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YACH,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;gBACzB,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACvB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;CACF,CAAC;AAEF,yEAAyE;AACzE,MAAM,UAAU,4BAA4B;IAC1C,uBAAuB,CAAC,YAAY,CAAC,CAAC;IACtC,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,OAAO,EAAE,YAAY,EAAE,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Relationship-level operations on the Y.Doc.
3
+ *
4
+ * Relationships are stored in their own top-level Y.Map so concurrent edits
5
+ * to the source/target lists don't collide with edits on the entities they
6
+ * reference (spec §5.2).
7
+ */
8
+ import * as Y from 'yjs';
9
+ export interface CreateRelationshipOptions {
10
+ ifcClass: string;
11
+ source: string;
12
+ targets?: string[];
13
+ attributes?: Record<string, unknown>;
14
+ }
15
+ export declare function getRelationship(doc: Y.Doc, path: string): Y.Map<unknown> | undefined;
16
+ export declare function createRelationship(doc: Y.Doc, path: string, options: CreateRelationshipOptions): Y.Map<unknown>;
17
+ export declare function deleteRelationship(doc: Y.Doc, path: string): boolean;
18
+ export declare function addTarget(doc: Y.Doc, path: string, targetPath: string): void;
19
+ export declare function removeTarget(doc: Y.Doc, path: string, targetPath: string): boolean;
20
+ export declare function getTargets(doc: Y.Doc, path: string): string[];
21
+ /**
22
+ * Cascade relationship cleanup when an entity is deleted. Removes the
23
+ * entity from any relationship's targets and deletes relationships that
24
+ * had it as their source.
25
+ */
26
+ export declare function cascadeDeleteRelationships(doc: Y.Doc, entityPath: string): void;
27
+ //# sourceMappingURL=relationship.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relationship.d.ts","sourceRoot":"","sources":["../../src/doc/relationship.ts"],"names":[],"mappings":"AAIA;;;;;;GAMG;AAEH,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAGzB,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,SAAS,CAEpF;AAED,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,CAAC,CAAC,GAAG,EACV,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,yBAAyB,GACjC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAyBhB;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAKpE;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAQ5E;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAclF;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAK7D;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAoB/E"}
@@ -0,0 +1,110 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ /**
5
+ * Relationship-level operations on the Y.Doc.
6
+ *
7
+ * Relationships are stored in their own top-level Y.Map so concurrent edits
8
+ * to the source/target lists don't collide with edits on the entities they
9
+ * reference (spec §5.2).
10
+ */
11
+ import * as Y from 'yjs';
12
+ import { RELATIONSHIP_KEY, relationshipsMap } from './schema.js';
13
+ export function getRelationship(doc, path) {
14
+ return relationshipsMap(doc).get(path);
15
+ }
16
+ export function createRelationship(doc, path, options) {
17
+ const rels = relationshipsMap(doc);
18
+ const existing = rels.get(path);
19
+ if (existing)
20
+ return existing;
21
+ const rel = new Y.Map();
22
+ rel.set(RELATIONSHIP_KEY.IFC_CLASS, options.ifcClass);
23
+ rel.set(RELATIONSHIP_KEY.SOURCE, options.source);
24
+ const targets = new Y.Array();
25
+ if (options.targets && options.targets.length > 0) {
26
+ targets.push(options.targets);
27
+ }
28
+ rel.set(RELATIONSHIP_KEY.TARGETS, targets);
29
+ const attrs = new Y.Map();
30
+ if (options.attributes) {
31
+ for (const [k, v] of Object.entries(options.attributes)) {
32
+ attrs.set(k, v);
33
+ }
34
+ }
35
+ rel.set(RELATIONSHIP_KEY.ATTRIBUTES, attrs);
36
+ rels.set(path, rel);
37
+ return rel;
38
+ }
39
+ export function deleteRelationship(doc, path) {
40
+ const rels = relationshipsMap(doc);
41
+ if (!rels.has(path))
42
+ return false;
43
+ rels.delete(path);
44
+ return true;
45
+ }
46
+ export function addTarget(doc, path, targetPath) {
47
+ const rel = getRelationship(doc, path);
48
+ if (!rel)
49
+ throw new Error(`@ifc-lite/collab: relationship "${path}" not found`);
50
+ const targets = rel.get(RELATIONSHIP_KEY.TARGETS);
51
+ if (!targets)
52
+ throw new Error(`@ifc-lite/collab: relationship "${path}" missing targets`);
53
+ // Push preserves concurrent additions per CRDT semantics; dedupe is left
54
+ // to the caller because IFC relationships occasionally allow duplicates.
55
+ targets.push([targetPath]);
56
+ }
57
+ export function removeTarget(doc, path, targetPath) {
58
+ const rel = getRelationship(doc, path);
59
+ if (!rel)
60
+ return false;
61
+ const targets = rel.get(RELATIONSHIP_KEY.TARGETS);
62
+ if (!targets)
63
+ return false;
64
+ const arr = targets.toArray();
65
+ let removed = false;
66
+ for (let i = arr.length - 1; i >= 0; i--) {
67
+ if (arr[i] === targetPath) {
68
+ targets.delete(i, 1);
69
+ removed = true;
70
+ }
71
+ }
72
+ return removed;
73
+ }
74
+ export function getTargets(doc, path) {
75
+ const rel = getRelationship(doc, path);
76
+ if (!rel)
77
+ return [];
78
+ const targets = rel.get(RELATIONSHIP_KEY.TARGETS);
79
+ return targets ? targets.toArray() : [];
80
+ }
81
+ /**
82
+ * Cascade relationship cleanup when an entity is deleted. Removes the
83
+ * entity from any relationship's targets and deletes relationships that
84
+ * had it as their source.
85
+ */
86
+ export function cascadeDeleteRelationships(doc, entityPath) {
87
+ const rels = relationshipsMap(doc);
88
+ const toDelete = [];
89
+ doc.transact(() => {
90
+ for (const [relPath, relUntyped] of rels.entries()) {
91
+ const rel = relUntyped;
92
+ const source = rel.get(RELATIONSHIP_KEY.SOURCE);
93
+ if (source === entityPath) {
94
+ toDelete.push(relPath);
95
+ continue;
96
+ }
97
+ const targets = rel.get(RELATIONSHIP_KEY.TARGETS);
98
+ if (!targets)
99
+ continue;
100
+ const arr = targets.toArray();
101
+ for (let i = arr.length - 1; i >= 0; i--) {
102
+ if (arr[i] === entityPath)
103
+ targets.delete(i, 1);
104
+ }
105
+ }
106
+ for (const path of toDelete)
107
+ rels.delete(path);
108
+ });
109
+ }
110
+ //# sourceMappingURL=relationship.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relationship.js","sourceRoot":"","sources":["../../src/doc/relationship.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Schema-version helpers (open problem #2 — v1.0 prep).
3
+ *
4
+ * The current IFCX schema version of a Y.Doc lives in the top-level
5
+ * `meta` Y.Map under `schemaVersion`. This module gives that field a
6
+ * typed accessor + a tiny migration registry so v1.0 can ship the
7
+ * server-mediated migration flow without a bigger refactor.
8
+ *
9
+ * The actual structural migrations (e.g. attribute renames between
10
+ * IFC4 → IFC4X3) are out of scope for v0.x — this is the wiring.
11
+ */
12
+ import * as Y from 'yjs';
13
+ /**
14
+ * Schema versions we recognize.
15
+ *
16
+ * `unknown` is what older docs (or hand-built ones) report when no
17
+ * version was ever set. We treat it as IFC5 for collab purposes since
18
+ * that's what IFCX targets.
19
+ */
20
+ export type SchemaVersion = 'ifc4' | 'ifc4x3' | 'ifc5' | 'unknown';
21
+ export declare function getSchemaVersion(doc: Y.Doc): SchemaVersion;
22
+ export declare function setSchemaVersion(doc: Y.Doc, version: SchemaVersion): void;
23
+ /**
24
+ * Migration registry: each entry transforms `(doc) => doc'` in-place
25
+ * inside a single transaction. Migrations are looked up by
26
+ * `(from, to)` pair.
27
+ *
28
+ * v0.x ships an empty registry intentionally — registering one is the
29
+ * v1.0 task. The shape is stable so consumers can author migrations
30
+ * without further API churn.
31
+ */
32
+ export interface SchemaMigration {
33
+ from: SchemaVersion;
34
+ to: SchemaVersion;
35
+ apply: (doc: Y.Doc) => void;
36
+ }
37
+ export declare function registerSchemaMigration(migration: SchemaMigration): void;
38
+ export declare function listSchemaMigrations(): readonly SchemaMigration[];
39
+ /**
40
+ * Run a single migration in a transaction tagged with our migration
41
+ * origin. Returns true when applied, false if the doc isn't at `from`
42
+ * or no migration is registered.
43
+ */
44
+ export declare function migrateSchema(doc: Y.Doc, from: SchemaVersion, to: SchemaVersion): boolean;
45
+ /** Origin tag used by migration transactions so observers can filter them. */
46
+ export declare const MIGRATION_ORIGIN: unique symbol;
47
+ //# sourceMappingURL=schema-version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-version.d.ts","sourceRoot":"","sources":["../../src/doc/schema-version.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAGzB;;;;;;GAMG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;AAInE,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,GAAG,aAAa,CAI1D;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAEzE;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,aAAa,CAAC;IACpB,EAAE,EAAE,aAAa,CAAC;IAClB,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC;CAC7B;AAID,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,eAAe,GAAG,IAAI,CAExE;AAED,wBAAgB,oBAAoB,IAAI,SAAS,eAAe,EAAE,CAEjE;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,aAAa,GAAG,OAAO,CASzF;AAED,8EAA8E;AAC9E,eAAO,MAAM,gBAAgB,eAAkD,CAAC"}
@@ -0,0 +1,41 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ import { metaMap } from './schema.js';
5
+ const KEY = 'schemaVersion';
6
+ export function getSchemaVersion(doc) {
7
+ const v = metaMap(doc).get(KEY);
8
+ if (v === 'ifc4' || v === 'ifc4x3' || v === 'ifc5')
9
+ return v;
10
+ return 'unknown';
11
+ }
12
+ export function setSchemaVersion(doc, version) {
13
+ metaMap(doc).set(KEY, version);
14
+ }
15
+ const REGISTRY = [];
16
+ export function registerSchemaMigration(migration) {
17
+ REGISTRY.push(migration);
18
+ }
19
+ export function listSchemaMigrations() {
20
+ return REGISTRY;
21
+ }
22
+ /**
23
+ * Run a single migration in a transaction tagged with our migration
24
+ * origin. Returns true when applied, false if the doc isn't at `from`
25
+ * or no migration is registered.
26
+ */
27
+ export function migrateSchema(doc, from, to) {
28
+ if (getSchemaVersion(doc) !== from)
29
+ return false;
30
+ const migration = REGISTRY.find((m) => m.from === from && m.to === to);
31
+ if (!migration)
32
+ return false;
33
+ doc.transact(() => {
34
+ migration.apply(doc);
35
+ setSchemaVersion(doc, to);
36
+ }, MIGRATION_ORIGIN);
37
+ return true;
38
+ }
39
+ /** Origin tag used by migration transactions so observers can filter them. */
40
+ export const MIGRATION_ORIGIN = Symbol.for('@ifc-lite/collab/schema-migration');
41
+ //# sourceMappingURL=schema-version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-version.js","sourceRoot":"","sources":["../../src/doc/schema-version.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAe/D,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAWtC,MAAM,GAAG,GAAG,eAAe,CAAC;AAE5B,MAAM,UAAU,gBAAgB,CAAC,GAAU;IACzC,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,MAAM;QAAE,OAAO,CAAC,CAAC;IAC7D,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAU,EAAE,OAAsB;IACjE,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AACjC,CAAC;AAiBD,MAAM,QAAQ,GAAsB,EAAE,CAAC;AAEvC,MAAM,UAAU,uBAAuB,CAAC,SAA0B;IAChE,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,GAAU,EAAE,IAAmB,EAAE,EAAiB;IAC9E,IAAI,gBAAgB,CAAC,GAAG,CAAC,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACjD,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACvE,IAAI,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IAC7B,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE;QAChB,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACrB,gBAAgB,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC5B,CAAC,EAAE,gBAAgB,CAAC,CAAC;IACrB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,8EAA8E;AAC9E,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC"}
@@ -0,0 +1,131 @@
1
+ /**
2
+ * Y.Doc schema for the collaborative BIM runtime.
3
+ *
4
+ * Mirrors the spec §5 data model, adapted to the actual IFCX wire shape
5
+ * (path + flat namespaced attributes + role→path children).
6
+ */
7
+ import * as Y from 'yjs';
8
+ /** Top-level shared-type names. */
9
+ export declare const TOP: {
10
+ readonly ENTITIES: "entities";
11
+ readonly RELATIONSHIPS: "relationships";
12
+ readonly GEOMETRY: "geometry";
13
+ readonly META: "meta";
14
+ };
15
+ /** Origin tag used for transactions originated by the local CollabSession. */
16
+ export declare const LOCAL_ORIGIN: unique symbol;
17
+ /** Origin tag for transactions originated by snapshot seeding. */
18
+ export declare const SEED_ORIGIN: unique symbol;
19
+ /** Origin tag for transactions originated by undo/redo. */
20
+ export declare const UNDO_ORIGIN: unique symbol;
21
+ /**
22
+ * Per-entity Y.Map keys.
23
+ *
24
+ * Each entity is a Y.Map with these well-known sub-maps. Sub-maps are
25
+ * themselves Y.Maps so concurrent edits to different sub-maps never
26
+ * conflict.
27
+ */
28
+ export declare const ENTITY_KEY: {
29
+ /** IFCX `attributes` — flat record keyed by namespaced names. */
30
+ readonly ATTRIBUTES: "attributes";
31
+ /** IFCX `children` — role → path. */
32
+ readonly CHILDREN: "children";
33
+ /** IFCX `inherits` — role → path. */
34
+ readonly INHERITS: "inherits";
35
+ /** Property sets, grouped: psetName → propName → PropertyValue. */
36
+ readonly PSETS: "psets";
37
+ /** Quantity sets: qsetName → quantityName → number. */
38
+ readonly QUANTITIES: "quantities";
39
+ /** Classification refs (Y.Array). */
40
+ readonly CLASSIFICATIONS: "classifications";
41
+ /** Material assignments (Y.Array). */
42
+ readonly MATERIALS: "materials";
43
+ /** Reference into the `geometry` top-level map. */
44
+ readonly GEOMETRY_REF: "geometryRef";
45
+ /** Provenance metadata: createdBy, createdAt, lastEditedBy, etc. */
46
+ readonly META: "meta";
47
+ };
48
+ /** Per-relationship Y.Map keys. */
49
+ export declare const RELATIONSHIP_KEY: {
50
+ readonly IFC_CLASS: "ifcClass";
51
+ readonly SOURCE: "source";
52
+ readonly TARGETS: "targets";
53
+ readonly ATTRIBUTES: "attributes";
54
+ };
55
+ /** Per-geometry Y.Map keys. */
56
+ export declare const GEOMETRY_KEY: {
57
+ readonly TYPE: "type";
58
+ readonly SOURCE: "source";
59
+ readonly PARAMS: "params";
60
+ readonly BLOB_HASH: "blobHash";
61
+ readonly BBOX: "bbox";
62
+ readonly VERSION_VECTOR: "versionVector";
63
+ };
64
+ /**
65
+ * A typed property value as stored in a Pset Y.Map.
66
+ *
67
+ * We store these as plain JSON values (not Y.Maps) because the property
68
+ * value is replaced atomically; partial updates to the typed shape are not
69
+ * meaningful at the IFC level.
70
+ */
71
+ export interface PropertyValue {
72
+ type: 'IfcLabel' | 'IfcText' | 'IfcReal' | 'IfcInteger' | 'IfcBoolean' | 'IfcLogical' | 'IfcIdentifier' | string;
73
+ value: string | number | boolean | null;
74
+ unit?: string;
75
+ /** Provenance: 'manual' | 'bsdd:<uri>' | 'derived' | 'ifcx:<layer>'. */
76
+ source?: string;
77
+ }
78
+ /** Classification reference. */
79
+ export interface ClassificationRef {
80
+ system: string;
81
+ code: string;
82
+ uri?: string;
83
+ description?: string;
84
+ }
85
+ /** Material assignment record. */
86
+ export interface MaterialAssignment {
87
+ materialId: string;
88
+ layerName?: string;
89
+ thickness?: number;
90
+ fraction?: number;
91
+ }
92
+ /** Geometry reference stored on each entity. */
93
+ export interface GeometryRefRecord {
94
+ /** Pointer into the `geometry` top-level map (== that entry's geomId). */
95
+ geomId: string;
96
+ }
97
+ /** Entity metadata. */
98
+ export interface EntityMeta {
99
+ ifcClass?: string;
100
+ schemaVersion?: 'ifc4' | 'ifc4x3' | 'ifc5';
101
+ createdBy?: string;
102
+ createdAt?: string;
103
+ lastEditedBy?: string;
104
+ lastEditedAt?: string;
105
+ /** For type promotion: previous path before delete+create. */
106
+ previousPath?: string;
107
+ /** Free-form per-entity metadata. */
108
+ [key: string]: unknown;
109
+ }
110
+ /**
111
+ * Create a fresh, empty Y.Doc with the spec's top-level shared types.
112
+ *
113
+ * Idempotent: calling `getMap` twice returns the same shared type, so this
114
+ * is safe to call on an already-populated doc as well.
115
+ */
116
+ export declare function createCollabDoc(opts?: {
117
+ gc?: boolean;
118
+ }): Y.Doc;
119
+ /** Top-level accessors. Centralized so refactors stay safe. */
120
+ export declare function entitiesMap(doc: Y.Doc): Y.Map<Y.Map<unknown>>;
121
+ export declare function relationshipsMap(doc: Y.Doc): Y.Map<Y.Map<unknown>>;
122
+ export declare function geometryMap(doc: Y.Doc): Y.Map<Y.Map<unknown>>;
123
+ export declare function metaMap(doc: Y.Doc): Y.Map<unknown>;
124
+ /**
125
+ * Runtime invariant check used by tests and seeding.
126
+ *
127
+ * Throws if the Y.Doc does not have the expected shape. We check structural
128
+ * presence and type shape, not content, so an empty fresh doc passes.
129
+ */
130
+ export declare function assertSchemaInvariants(doc: Y.Doc): void;
131
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/doc/schema.ts"],"names":[],"mappings":"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"}