@vuer-ai/vuer-rtc 0.0.1

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 (169) hide show
  1. package/dist/client/EditBuffer.d.ts +43 -0
  2. package/dist/client/EditBuffer.d.ts.map +1 -0
  3. package/dist/client/EditBuffer.js +96 -0
  4. package/dist/client/EditBuffer.js.map +1 -0
  5. package/dist/client/actions.d.ts +66 -0
  6. package/dist/client/actions.d.ts.map +1 -0
  7. package/dist/client/actions.js +345 -0
  8. package/dist/client/actions.js.map +1 -0
  9. package/dist/client/createGraph.d.ts +30 -0
  10. package/dist/client/createGraph.d.ts.map +1 -0
  11. package/dist/client/createGraph.js +91 -0
  12. package/dist/client/createGraph.js.map +1 -0
  13. package/dist/client/hooks.d.ts +81 -0
  14. package/dist/client/hooks.d.ts.map +1 -0
  15. package/dist/client/hooks.js +161 -0
  16. package/dist/client/hooks.js.map +1 -0
  17. package/dist/client/index.d.ts +8 -0
  18. package/dist/client/index.d.ts.map +1 -0
  19. package/dist/client/index.js +10 -0
  20. package/dist/client/index.js.map +1 -0
  21. package/dist/client/types.d.ts +74 -0
  22. package/dist/client/types.d.ts.map +1 -0
  23. package/dist/client/types.js +11 -0
  24. package/dist/client/types.js.map +1 -0
  25. package/dist/hooks.d.ts +8 -0
  26. package/dist/hooks.d.ts.map +1 -0
  27. package/dist/hooks.js +7 -0
  28. package/dist/hooks.js.map +1 -0
  29. package/dist/index.d.ts +9 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +12 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/operations/OperationTypes.d.ts +239 -0
  34. package/dist/operations/OperationTypes.d.ts.map +1 -0
  35. package/dist/operations/OperationTypes.js +10 -0
  36. package/dist/operations/OperationTypes.js.map +1 -0
  37. package/dist/operations/OperationValidator.d.ts +32 -0
  38. package/dist/operations/OperationValidator.d.ts.map +1 -0
  39. package/dist/operations/OperationValidator.js +208 -0
  40. package/dist/operations/OperationValidator.js.map +1 -0
  41. package/dist/operations/apply/array.d.ts +22 -0
  42. package/dist/operations/apply/array.d.ts.map +1 -0
  43. package/dist/operations/apply/array.js +64 -0
  44. package/dist/operations/apply/array.js.map +1 -0
  45. package/dist/operations/apply/boolean.d.ts +18 -0
  46. package/dist/operations/apply/boolean.d.ts.map +1 -0
  47. package/dist/operations/apply/boolean.js +34 -0
  48. package/dist/operations/apply/boolean.js.map +1 -0
  49. package/dist/operations/apply/color.d.ts +14 -0
  50. package/dist/operations/apply/color.d.ts.map +1 -0
  51. package/dist/operations/apply/color.js +46 -0
  52. package/dist/operations/apply/color.js.map +1 -0
  53. package/dist/operations/apply/index.d.ts +18 -0
  54. package/dist/operations/apply/index.d.ts.map +1 -0
  55. package/dist/operations/apply/index.js +26 -0
  56. package/dist/operations/apply/index.js.map +1 -0
  57. package/dist/operations/apply/node.d.ts +24 -0
  58. package/dist/operations/apply/node.d.ts.map +1 -0
  59. package/dist/operations/apply/node.js +77 -0
  60. package/dist/operations/apply/node.js.map +1 -0
  61. package/dist/operations/apply/number.d.ts +26 -0
  62. package/dist/operations/apply/number.d.ts.map +1 -0
  63. package/dist/operations/apply/number.js +54 -0
  64. package/dist/operations/apply/number.js.map +1 -0
  65. package/dist/operations/apply/object.d.ts +14 -0
  66. package/dist/operations/apply/object.d.ts.map +1 -0
  67. package/dist/operations/apply/object.js +47 -0
  68. package/dist/operations/apply/object.js.map +1 -0
  69. package/dist/operations/apply/quaternion.d.ts +15 -0
  70. package/dist/operations/apply/quaternion.d.ts.map +1 -0
  71. package/dist/operations/apply/quaternion.js +33 -0
  72. package/dist/operations/apply/quaternion.js.map +1 -0
  73. package/dist/operations/apply/string.d.ts +14 -0
  74. package/dist/operations/apply/string.d.ts.map +1 -0
  75. package/dist/operations/apply/string.js +26 -0
  76. package/dist/operations/apply/string.js.map +1 -0
  77. package/dist/operations/apply/types.d.ts +34 -0
  78. package/dist/operations/apply/types.d.ts.map +1 -0
  79. package/dist/operations/apply/types.js +32 -0
  80. package/dist/operations/apply/types.js.map +1 -0
  81. package/dist/operations/apply/vector3.d.ts +18 -0
  82. package/dist/operations/apply/vector3.d.ts.map +1 -0
  83. package/dist/operations/apply/vector3.js +44 -0
  84. package/dist/operations/apply/vector3.js.map +1 -0
  85. package/dist/operations/dispatcher.d.ts +35 -0
  86. package/dist/operations/dispatcher.d.ts.map +1 -0
  87. package/dist/operations/dispatcher.js +107 -0
  88. package/dist/operations/dispatcher.js.map +1 -0
  89. package/dist/operations/index.d.ts +10 -0
  90. package/dist/operations/index.d.ts.map +1 -0
  91. package/dist/operations/index.js +17 -0
  92. package/dist/operations/index.js.map +1 -0
  93. package/dist/state/ConflictResolver.d.ts +36 -0
  94. package/dist/state/ConflictResolver.d.ts.map +1 -0
  95. package/dist/state/ConflictResolver.js +167 -0
  96. package/dist/state/ConflictResolver.js.map +1 -0
  97. package/dist/state/DType.d.ts +160 -0
  98. package/dist/state/DType.d.ts.map +1 -0
  99. package/dist/state/DType.js +282 -0
  100. package/dist/state/DType.js.map +1 -0
  101. package/dist/state/Schema.d.ts +32 -0
  102. package/dist/state/Schema.d.ts.map +1 -0
  103. package/dist/state/Schema.js +175 -0
  104. package/dist/state/Schema.js.map +1 -0
  105. package/dist/state/VectorClock.d.ts +42 -0
  106. package/dist/state/VectorClock.d.ts.map +1 -0
  107. package/dist/state/VectorClock.js +84 -0
  108. package/dist/state/VectorClock.js.map +1 -0
  109. package/dist/state/index.d.ts +11 -0
  110. package/dist/state/index.d.ts.map +1 -0
  111. package/dist/state/index.js +13 -0
  112. package/dist/state/index.js.map +1 -0
  113. package/docs/OPERATION_HINTS.md +222 -0
  114. package/docs/SCENE_GRAPH.md +373 -0
  115. package/docs/TYPE_BEHAVIORS.md +348 -0
  116. package/examples/01-basic-usage.ts +139 -0
  117. package/examples/02-concurrent-edits.ts +208 -0
  118. package/examples/03-scene-building.ts +258 -0
  119. package/examples/04-conflict-resolution.ts +339 -0
  120. package/examples/README.md +86 -0
  121. package/jest.config.js +19 -0
  122. package/package.json +57 -0
  123. package/src/client/EditBuffer.ts +105 -0
  124. package/src/client/actions.ts +397 -0
  125. package/src/client/createGraph.ts +132 -0
  126. package/src/client/hooks.tsx +249 -0
  127. package/src/client/index.ts +35 -0
  128. package/src/client/types.ts +94 -0
  129. package/src/hooks.ts +20 -0
  130. package/src/index.ts +14 -0
  131. package/src/operations/OperationTypes.ts +340 -0
  132. package/src/operations/OperationValidator.ts +260 -0
  133. package/src/operations/apply/array.ts +84 -0
  134. package/src/operations/apply/boolean.ts +48 -0
  135. package/src/operations/apply/color.ts +65 -0
  136. package/src/operations/apply/index.ts +37 -0
  137. package/src/operations/apply/node.ts +98 -0
  138. package/src/operations/apply/number.ts +76 -0
  139. package/src/operations/apply/object.ts +63 -0
  140. package/src/operations/apply/quaternion.ts +47 -0
  141. package/src/operations/apply/string.ts +36 -0
  142. package/src/operations/apply/types.ts +66 -0
  143. package/src/operations/apply/vector3.ts +60 -0
  144. package/src/operations/dispatcher.ts +127 -0
  145. package/src/operations/index.ts +80 -0
  146. package/src/state/ConflictResolver.ts +205 -0
  147. package/src/state/DType.ts +333 -0
  148. package/src/state/Schema.ts +236 -0
  149. package/src/state/VectorClock.ts +98 -0
  150. package/src/state/index.ts +14 -0
  151. package/tests/client/actions.test.ts +371 -0
  152. package/tests/client/edit-buffer.test.ts +117 -0
  153. package/tests/fixtures/array-ops.jsonl +6 -0
  154. package/tests/fixtures/boolean-ops.jsonl +6 -0
  155. package/tests/fixtures/color-ops.jsonl +4 -0
  156. package/tests/fixtures/edit-buffer.jsonl +3 -0
  157. package/tests/fixtures/node-ops.jsonl +6 -0
  158. package/tests/fixtures/number-ops.jsonl +7 -0
  159. package/tests/fixtures/object-ops.jsonl +4 -0
  160. package/tests/fixtures/operations.jsonl +7 -0
  161. package/tests/fixtures/string-ops.jsonl +4 -0
  162. package/tests/fixtures/undo-redo.jsonl +3 -0
  163. package/tests/fixtures/vector-ops.jsonl +9 -0
  164. package/tests/operations/collections.test.ts +193 -0
  165. package/tests/operations/nodes.test.ts +228 -0
  166. package/tests/operations/primitives.test.ts +222 -0
  167. package/tests/operations/vectors.test.ts +150 -0
  168. package/tsconfig.json +21 -0
  169. package/tsconfig.test.json +9 -0
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Boolean operations: set, or, and
3
+ */
4
+ import { getNodeProperty, setNodeProperty, setNodePropertyLWW } from './types.js';
5
+ /**
6
+ * boolean.set - Last-Write-Wins
7
+ */
8
+ export function BooleanSet(draft, op, meta) {
9
+ const node = draft.nodes[op.key];
10
+ if (!node || node.deletedAt)
11
+ return;
12
+ setNodePropertyLWW(node, op.path, op.value, meta);
13
+ }
14
+ /**
15
+ * boolean.or - Logical OR (enable wins)
16
+ */
17
+ export function BooleanOr(draft, op, meta) {
18
+ const node = draft.nodes[op.key];
19
+ if (!node || node.deletedAt)
20
+ return;
21
+ const current = getNodeProperty(node, op.path, false);
22
+ setNodeProperty(node, op.path, current || op.value, meta);
23
+ }
24
+ /**
25
+ * boolean.and - Logical AND (disable wins)
26
+ */
27
+ export function BooleanAnd(draft, op, meta) {
28
+ const node = draft.nodes[op.key];
29
+ if (!node || node.deletedAt)
30
+ return;
31
+ const current = getNodeProperty(node, op.path, true);
32
+ setNodeProperty(node, op.path, current && op.value, meta);
33
+ }
34
+ //# sourceMappingURL=boolean.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boolean.js","sourceRoot":"","sources":["../../../src/operations/apply/boolean.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAElF;;GAEG;AACH,MAAM,UAAU,UAAU,CACxB,KAAiB,EACjB,EAAgB,EAChB,IAAY;IAEZ,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS;QAAE,OAAO;IACpC,kBAAkB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AACpD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CACvB,KAAiB,EACjB,EAAe,EACf,IAAY;IAEZ,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS;QAAE,OAAO;IACpC,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACtD,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AAC5D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CACxB,KAAiB,EACjB,EAAgB,EAChB,IAAY;IAEZ,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS;QAAE,OAAO;IACpC,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACrD,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Color operations: set, blend
3
+ */
4
+ import type { SceneGraph, ColorSetOp, ColorBlendOp } from '../OperationTypes.js';
5
+ import type { OpMeta } from './types.js';
6
+ /**
7
+ * color.set - Last-Write-Wins
8
+ */
9
+ export declare function ColorSet(draft: SceneGraph, op: ColorSetOp, meta: OpMeta): void;
10
+ /**
11
+ * color.blend - Average/blend colors
12
+ */
13
+ export declare function ColorBlend(draft: SceneGraph, op: ColorBlendOp, meta: OpMeta): void;
14
+ //# sourceMappingURL=color.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"color.d.ts","sourceRoot":"","sources":["../../../src/operations/apply/color.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAGzC;;GAEG;AACH,wBAAgB,QAAQ,CACtB,KAAK,EAAE,UAAU,EACjB,EAAE,EAAE,UAAU,EACd,IAAI,EAAE,MAAM,GACX,IAAI,CAIN;AAsBD;;GAEG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,UAAU,EACjB,EAAE,EAAE,YAAY,EAChB,IAAI,EAAE,MAAM,GACX,IAAI,CAgBN"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Color operations: set, blend
3
+ */
4
+ import { getNodeProperty, setNodeProperty, setNodePropertyLWW } from './types.js';
5
+ /**
6
+ * color.set - Last-Write-Wins
7
+ */
8
+ export function ColorSet(draft, op, meta) {
9
+ const node = draft.nodes[op.key];
10
+ if (!node || node.deletedAt)
11
+ return;
12
+ setNodePropertyLWW(node, op.path, op.value, meta);
13
+ }
14
+ /**
15
+ * Parse hex color to RGB components
16
+ */
17
+ function hexToRgb(hex) {
18
+ const h = hex.replace('#', '');
19
+ return [
20
+ parseInt(h.substring(0, 2), 16),
21
+ parseInt(h.substring(2, 4), 16),
22
+ parseInt(h.substring(4, 6), 16),
23
+ ];
24
+ }
25
+ /**
26
+ * Convert RGB to hex color
27
+ */
28
+ function rgbToHex(r, g, b) {
29
+ const toHex = (n) => Math.round(Math.max(0, Math.min(255, n))).toString(16).padStart(2, '0');
30
+ return `#${toHex(r)}${toHex(g)}${toHex(b)}`;
31
+ }
32
+ /**
33
+ * color.blend - Average/blend colors
34
+ */
35
+ export function ColorBlend(draft, op, meta) {
36
+ const node = draft.nodes[op.key];
37
+ if (!node || node.deletedAt)
38
+ return;
39
+ const currentHex = getNodeProperty(node, op.path, '#000000');
40
+ const [r1, g1, b1] = hexToRgb(currentHex);
41
+ const [r2, g2, b2] = hexToRgb(op.value);
42
+ // Simple average blend
43
+ const result = rgbToHex((r1 + r2) / 2, (g1 + g2) / 2, (b1 + b2) / 2);
44
+ setNodeProperty(node, op.path, result, meta);
45
+ }
46
+ //# sourceMappingURL=color.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"color.js","sourceRoot":"","sources":["../../../src/operations/apply/color.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAElF;;GAEG;AACH,MAAM,UAAU,QAAQ,CACtB,KAAiB,EACjB,EAAc,EACd,IAAY;IAEZ,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS;QAAE,OAAO;IACpC,kBAAkB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AACpD,CAAC;AAED;;GAEG;AACH,SAAS,QAAQ,CAAC,GAAW;IAC3B,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC/B,OAAO;QACL,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;QAC/B,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;QAC/B,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;KAChC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,QAAQ,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS;IAC/C,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACrG,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CACxB,KAAiB,EACjB,EAAgB,EAChB,IAAY;IAEZ,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS;QAAE,OAAO;IAEpC,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC7D,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC1C,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;IAExC,uBAAuB;IACvB,MAAM,MAAM,GAAG,QAAQ,CACrB,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EACb,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EACb,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CACd,CAAC;IAEF,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Operation Apply Registry
3
+ *
4
+ * Exports all apply functions as a registry.
5
+ * Usage: import * as registry from './apply/index.js'
6
+ */
7
+ export type { OpMeta, ApplyFn } from './types.js';
8
+ export { getNodeProperty, setNodeProperty } from './types.js';
9
+ export { NumberSet, NumberAdd, NumberMultiply, NumberMin, NumberMax } from './number.js';
10
+ export { StringSet, StringConcat } from './string.js';
11
+ export { BooleanSet, BooleanOr, BooleanAnd } from './boolean.js';
12
+ export { Vector3Set, Vector3Add, Vector3Multiply } from './vector3.js';
13
+ export { QuaternionSet, QuaternionMultiply } from './quaternion.js';
14
+ export { ColorSet, ColorBlend } from './color.js';
15
+ export { ArraySet, ArrayPush, ArrayRemove, ArrayUnion } from './array.js';
16
+ export { ObjectSet, ObjectMerge } from './object.js';
17
+ export { NodeInsert, NodeRemove } from './node.js';
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/operations/apply/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAG9D,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGzF,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGtD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAGjE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAGvE,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAGpE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGlD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG1E,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAGrD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Operation Apply Registry
3
+ *
4
+ * Exports all apply functions as a registry.
5
+ * Usage: import * as registry from './apply/index.js'
6
+ */
7
+ export { getNodeProperty, setNodeProperty } from './types.js';
8
+ // Number operations
9
+ export { NumberSet, NumberAdd, NumberMultiply, NumberMin, NumberMax } from './number.js';
10
+ // String operations
11
+ export { StringSet, StringConcat } from './string.js';
12
+ // Boolean operations
13
+ export { BooleanSet, BooleanOr, BooleanAnd } from './boolean.js';
14
+ // Vector3 operations
15
+ export { Vector3Set, Vector3Add, Vector3Multiply } from './vector3.js';
16
+ // Quaternion operations
17
+ export { QuaternionSet, QuaternionMultiply } from './quaternion.js';
18
+ // Color operations
19
+ export { ColorSet, ColorBlend } from './color.js';
20
+ // Array operations
21
+ export { ArraySet, ArrayPush, ArrayRemove, ArrayUnion } from './array.js';
22
+ // Object operations
23
+ export { ObjectSet, ObjectMerge } from './object.js';
24
+ // Node operations
25
+ export { NodeInsert, NodeRemove } from './node.js';
26
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/operations/apply/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE9D,oBAAoB;AACpB,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAEzF,oBAAoB;AACpB,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEtD,qBAAqB;AACrB,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAEjE,qBAAqB;AACrB,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEvE,wBAAwB;AACxB,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAEpE,mBAAmB;AACnB,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAElD,mBAAmB;AACnB,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE1E,oBAAoB;AACpB,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAErD,kBAAkB;AAClB,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Node operations: insert, remove
3
+ */
4
+ import type { SceneGraph, NodeInsertOp, NodeRemoveOp } from '../OperationTypes.js';
5
+ import type { OpMeta } from './types.js';
6
+ /**
7
+ * node.insert - Create new node as child of parent
8
+ *
9
+ * op.key = parent node's key
10
+ * op.path = 'children'
11
+ * op.value.key = new node's key
12
+ *
13
+ * Idempotent: if node key exists, no-op
14
+ */
15
+ export declare function NodeInsert(draft: SceneGraph, op: NodeInsertOp, meta: OpMeta): void;
16
+ /**
17
+ * node.remove - Remove node from parent and soft delete (tombstone)
18
+ *
19
+ * op.key = parent node's key
20
+ * op.path = 'children'
21
+ * op.value = node key to remove
22
+ */
23
+ export declare function NodeRemove(draft: SceneGraph, op: NodeRemoveOp, meta: OpMeta): void;
24
+ //# sourceMappingURL=node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../src/operations/apply/node.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAa,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC9F,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,UAAU,EACjB,EAAE,EAAE,YAAY,EAChB,IAAI,EAAE,MAAM,GACX,IAAI,CA8CN;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,UAAU,EACjB,EAAE,EAAE,YAAY,EAChB,IAAI,EAAE,MAAM,GACX,IAAI,CAkBN"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Node operations: insert, remove
3
+ */
4
+ /**
5
+ * node.insert - Create new node as child of parent
6
+ *
7
+ * op.key = parent node's key
8
+ * op.path = 'children'
9
+ * op.value.key = new node's key
10
+ *
11
+ * Idempotent: if node key exists, no-op
12
+ */
13
+ export function NodeInsert(draft, op, meta) {
14
+ const nodeKey = op.value.key;
15
+ // Idempotent: skip if key already exists
16
+ if (draft.nodes[nodeKey]) {
17
+ return;
18
+ }
19
+ // Extract core fields from value
20
+ const { key, id, tag, name, ...properties } = op.value;
21
+ // Create new node
22
+ const newNode = {
23
+ id,
24
+ key: nodeKey,
25
+ tag,
26
+ name,
27
+ children: [],
28
+ clock: { ...meta.clock },
29
+ lamportTime: meta.lamportTime,
30
+ createdAt: meta.timestamp,
31
+ updatedAt: meta.timestamp,
32
+ };
33
+ // Copy all remaining properties (flat structure with dot-notation)
34
+ for (const [propKey, propValue] of Object.entries(properties)) {
35
+ if (propKey === 'children') {
36
+ newNode.children = Array.isArray(propValue) ? [...propValue] : [];
37
+ }
38
+ else {
39
+ newNode[propKey] = propValue;
40
+ }
41
+ }
42
+ // Add to graph
43
+ draft.nodes[nodeKey] = newNode;
44
+ // Set as root if first node
45
+ if (!draft.rootKey) {
46
+ draft.rootKey = nodeKey;
47
+ }
48
+ // Add to parent's children
49
+ const parentNode = draft.nodes[op.key];
50
+ if (parentNode && !parentNode.children.includes(nodeKey)) {
51
+ parentNode.children.push(nodeKey);
52
+ }
53
+ }
54
+ /**
55
+ * node.remove - Remove node from parent and soft delete (tombstone)
56
+ *
57
+ * op.key = parent node's key
58
+ * op.path = 'children'
59
+ * op.value = node key to remove
60
+ */
61
+ export function NodeRemove(draft, op, meta) {
62
+ const nodeKey = op.value;
63
+ const node = draft.nodes[nodeKey];
64
+ if (!node) {
65
+ return; // Node doesn't exist, ignore
66
+ }
67
+ // Tombstone: mark as deleted
68
+ node.deletedAt = meta.timestamp;
69
+ node.lamportTime = meta.lamportTime;
70
+ node.updatedAt = meta.timestamp;
71
+ // Remove from parent's children
72
+ const parentNode = draft.nodes[op.key];
73
+ if (parentNode) {
74
+ parentNode.children = parentNode.children.filter(childKey => childKey !== nodeKey);
75
+ }
76
+ }
77
+ //# sourceMappingURL=node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../../../src/operations/apply/node.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;;;;;;;GAQG;AACH,MAAM,UAAU,UAAU,CACxB,KAAiB,EACjB,EAAgB,EAChB,IAAY;IAEZ,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC;IAE7B,yCAAyC;IACzC,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,OAAO;IACT,CAAC;IAED,iCAAiC;IACjC,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,UAAU,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC;IAEvD,kBAAkB;IAClB,MAAM,OAAO,GAAc;QACzB,EAAE;QACF,GAAG,EAAE,OAAO;QACZ,GAAG;QACH,IAAI;QACJ,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE;QACxB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,SAAS,EAAE,IAAI,CAAC,SAAS;KAC1B,CAAC;IAEF,mEAAmE;IACnE,KAAK,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9D,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;YAC3B,OAAO,CAAC,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,eAAe;IACf,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IAE/B,4BAA4B;IAC5B,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QACnB,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;IAC1B,CAAC;IAED,2BAA2B;IAC3B,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,UAAU,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACzD,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CACxB,KAAiB,EACjB,EAAgB,EAChB,IAAY;IAEZ,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC;IACzB,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAElC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,6BAA6B;IACvC,CAAC;IAED,6BAA6B;IAC7B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;IAChC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;IACpC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;IAEhC,gCAAgC;IAChC,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,UAAU,EAAE,CAAC;QACf,UAAU,CAAC,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;IACrF,CAAC;AACH,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Number operations: set, add, multiply, min, max
3
+ */
4
+ import type { SceneGraph, NumberSetOp, NumberAddOp, NumberMultiplyOp, NumberMinOp, NumberMaxOp } from '../OperationTypes.js';
5
+ import type { OpMeta } from './types.js';
6
+ /**
7
+ * number.set - Last-Write-Wins
8
+ */
9
+ export declare function NumberSet(draft: SceneGraph, op: NumberSetOp, meta: OpMeta): void;
10
+ /**
11
+ * number.add - Additive (sum concurrent values)
12
+ */
13
+ export declare function NumberAdd(draft: SceneGraph, op: NumberAddOp, meta: OpMeta): void;
14
+ /**
15
+ * number.multiply - Multiplicative (product of concurrent values)
16
+ */
17
+ export declare function NumberMultiply(draft: SceneGraph, op: NumberMultiplyOp, meta: OpMeta): void;
18
+ /**
19
+ * number.min - Take minimum value
20
+ */
21
+ export declare function NumberMin(draft: SceneGraph, op: NumberMinOp, meta: OpMeta): void;
22
+ /**
23
+ * number.max - Take maximum value
24
+ */
25
+ export declare function NumberMax(draft: SceneGraph, op: NumberMaxOp, meta: OpMeta): void;
26
+ //# sourceMappingURL=number.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"number.d.ts","sourceRoot":"","sources":["../../../src/operations/apply/number.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,gBAAgB,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC7H,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAGzC;;GAEG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,UAAU,EACjB,EAAE,EAAE,WAAW,EACf,IAAI,EAAE,MAAM,GACX,IAAI,CAIN;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,UAAU,EACjB,EAAE,EAAE,WAAW,EACf,IAAI,EAAE,MAAM,GACX,IAAI,CAKN;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,UAAU,EACjB,EAAE,EAAE,gBAAgB,EACpB,IAAI,EAAE,MAAM,GACX,IAAI,CAKN;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,UAAU,EACjB,EAAE,EAAE,WAAW,EACf,IAAI,EAAE,MAAM,GACX,IAAI,CAKN;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,UAAU,EACjB,EAAE,EAAE,WAAW,EACf,IAAI,EAAE,MAAM,GACX,IAAI,CAKN"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Number operations: set, add, multiply, min, max
3
+ */
4
+ import { getNodeProperty, setNodeProperty, setNodePropertyLWW } from './types.js';
5
+ /**
6
+ * number.set - Last-Write-Wins
7
+ */
8
+ export function NumberSet(draft, op, meta) {
9
+ const node = draft.nodes[op.key];
10
+ if (!node || node.deletedAt)
11
+ return;
12
+ setNodePropertyLWW(node, op.path, op.value, meta);
13
+ }
14
+ /**
15
+ * number.add - Additive (sum concurrent values)
16
+ */
17
+ export function NumberAdd(draft, op, meta) {
18
+ const node = draft.nodes[op.key];
19
+ if (!node || node.deletedAt)
20
+ return;
21
+ const current = getNodeProperty(node, op.path, 0);
22
+ setNodeProperty(node, op.path, current + op.value, meta);
23
+ }
24
+ /**
25
+ * number.multiply - Multiplicative (product of concurrent values)
26
+ */
27
+ export function NumberMultiply(draft, op, meta) {
28
+ const node = draft.nodes[op.key];
29
+ if (!node || node.deletedAt)
30
+ return;
31
+ const current = getNodeProperty(node, op.path, 1);
32
+ setNodeProperty(node, op.path, current * op.value, meta);
33
+ }
34
+ /**
35
+ * number.min - Take minimum value
36
+ */
37
+ export function NumberMin(draft, op, meta) {
38
+ const node = draft.nodes[op.key];
39
+ if (!node || node.deletedAt)
40
+ return;
41
+ const current = getNodeProperty(node, op.path, Infinity);
42
+ setNodeProperty(node, op.path, Math.min(current, op.value), meta);
43
+ }
44
+ /**
45
+ * number.max - Take maximum value
46
+ */
47
+ export function NumberMax(draft, op, meta) {
48
+ const node = draft.nodes[op.key];
49
+ if (!node || node.deletedAt)
50
+ return;
51
+ const current = getNodeProperty(node, op.path, -Infinity);
52
+ setNodeProperty(node, op.path, Math.max(current, op.value), meta);
53
+ }
54
+ //# sourceMappingURL=number.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"number.js","sourceRoot":"","sources":["../../../src/operations/apply/number.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAElF;;GAEG;AACH,MAAM,UAAU,SAAS,CACvB,KAAiB,EACjB,EAAe,EACf,IAAY;IAEZ,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS;QAAE,OAAO;IACpC,kBAAkB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AACpD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CACvB,KAAiB,EACjB,EAAe,EACf,IAAY;IAEZ,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS;QAAE,OAAO;IACpC,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAClD,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,OAAO,GAAG,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,KAAiB,EACjB,EAAoB,EACpB,IAAY;IAEZ,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS;QAAE,OAAO;IACpC,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAClD,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,OAAO,GAAG,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CACvB,KAAiB,EACjB,EAAe,EACf,IAAY;IAEZ,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS;QAAE,OAAO;IACpC,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACzD,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;AACpE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CACvB,KAAiB,EACjB,EAAe,EACf,IAAY;IAEZ,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS;QAAE,OAAO;IACpC,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAC;IAC1D,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;AACpE,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Object operations: set, merge
3
+ */
4
+ import type { SceneGraph, ObjectSetOp, ObjectMergeOp } from '../OperationTypes.js';
5
+ import type { OpMeta } from './types.js';
6
+ /**
7
+ * object.set - Last-Write-Wins (replace entire object)
8
+ */
9
+ export declare function ObjectSet(draft: SceneGraph, op: ObjectSetOp, meta: OpMeta): void;
10
+ /**
11
+ * object.merge - Deep merge objects
12
+ */
13
+ export declare function ObjectMerge(draft: SceneGraph, op: ObjectMergeOp, meta: OpMeta): void;
14
+ //# sourceMappingURL=object.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../../../src/operations/apply/object.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACnF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAGzC;;GAEG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,UAAU,EACjB,EAAE,EAAE,WAAW,EACf,IAAI,EAAE,MAAM,GACX,IAAI,CAIN;AA8BD;;GAEG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,UAAU,EACjB,EAAE,EAAE,aAAa,EACjB,IAAI,EAAE,MAAM,GACX,IAAI,CAMN"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Object operations: set, merge
3
+ */
4
+ import { getNodeProperty, setNodeProperty, setNodePropertyLWW } from './types.js';
5
+ /**
6
+ * object.set - Last-Write-Wins (replace entire object)
7
+ */
8
+ export function ObjectSet(draft, op, meta) {
9
+ const node = draft.nodes[op.key];
10
+ if (!node || node.deletedAt)
11
+ return;
12
+ setNodePropertyLWW(node, op.path, { ...op.value }, meta);
13
+ }
14
+ /**
15
+ * Deep merge helper
16
+ */
17
+ function deepMerge(target, source) {
18
+ const result = { ...target };
19
+ for (const key of Object.keys(source)) {
20
+ const sourceVal = source[key];
21
+ const targetVal = result[key];
22
+ if (sourceVal !== null &&
23
+ typeof sourceVal === 'object' &&
24
+ !Array.isArray(sourceVal) &&
25
+ targetVal !== null &&
26
+ typeof targetVal === 'object' &&
27
+ !Array.isArray(targetVal)) {
28
+ result[key] = deepMerge(targetVal, sourceVal);
29
+ }
30
+ else {
31
+ result[key] = sourceVal;
32
+ }
33
+ }
34
+ return result;
35
+ }
36
+ /**
37
+ * object.merge - Deep merge objects
38
+ */
39
+ export function ObjectMerge(draft, op, meta) {
40
+ const node = draft.nodes[op.key];
41
+ if (!node || node.deletedAt)
42
+ return;
43
+ const current = getNodeProperty(node, op.path, {});
44
+ const merged = deepMerge(current, op.value);
45
+ setNodeProperty(node, op.path, merged, meta);
46
+ }
47
+ //# sourceMappingURL=object.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object.js","sourceRoot":"","sources":["../../../src/operations/apply/object.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAElF;;GAEG;AACH,MAAM,UAAU,SAAS,CACvB,KAAiB,EACjB,EAAe,EACf,IAAY;IAEZ,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS;QAAE,OAAO;IACpC,kBAAkB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,SAAS,SAAS,CAAC,MAA+B,EAAE,MAA+B;IACjF,MAAM,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;IAC7B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAE9B,IACE,SAAS,KAAK,IAAI;YAClB,OAAO,SAAS,KAAK,QAAQ;YAC7B,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC;YACzB,SAAS,KAAK,IAAI;YAClB,OAAO,SAAS,KAAK,QAAQ;YAC7B,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EACzB,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,CACrB,SAAoC,EACpC,SAAoC,CACrC,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;QAC1B,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CACzB,KAAiB,EACjB,EAAiB,EACjB,IAAY;IAEZ,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS;QAAE,OAAO;IACpC,MAAM,OAAO,GAAG,eAAe,CAA0B,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC5E,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;IAC5C,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Quaternion operations: set, multiply
3
+ */
4
+ import type { SceneGraph, QuaternionSetOp, QuaternionMultiplyOp } from '../OperationTypes.js';
5
+ import type { OpMeta } from './types.js';
6
+ /**
7
+ * quaternion.set - Last-Write-Wins
8
+ */
9
+ export declare function QuaternionSet(draft: SceneGraph, op: QuaternionSetOp, meta: OpMeta): void;
10
+ /**
11
+ * quaternion.multiply - Quaternion multiplication (composition)
12
+ * Result = current * op.value (Hamilton product)
13
+ */
14
+ export declare function QuaternionMultiply(draft: SceneGraph, op: QuaternionMultiplyOp, meta: OpMeta): void;
15
+ //# sourceMappingURL=quaternion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quaternion.d.ts","sourceRoot":"","sources":["../../../src/operations/apply/quaternion.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC9F,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAKzC;;GAEG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,UAAU,EACjB,EAAE,EAAE,eAAe,EACnB,IAAI,EAAE,MAAM,GACX,IAAI,CAIN;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,UAAU,EACjB,EAAE,EAAE,oBAAoB,EACxB,IAAI,EAAE,MAAM,GACX,IAAI,CAeN"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Quaternion operations: set, multiply
3
+ */
4
+ import { getNodeProperty, setNodeProperty, setNodePropertyLWW } from './types.js';
5
+ /**
6
+ * quaternion.set - Last-Write-Wins
7
+ */
8
+ export function QuaternionSet(draft, op, meta) {
9
+ const node = draft.nodes[op.key];
10
+ if (!node || node.deletedAt)
11
+ return;
12
+ setNodePropertyLWW(node, op.path, [...op.value], meta);
13
+ }
14
+ /**
15
+ * quaternion.multiply - Quaternion multiplication (composition)
16
+ * Result = current * op.value (Hamilton product)
17
+ */
18
+ export function QuaternionMultiply(draft, op, meta) {
19
+ const node = draft.nodes[op.key];
20
+ if (!node || node.deletedAt)
21
+ return;
22
+ const [ax, ay, az, aw] = getNodeProperty(node, op.path, [0, 0, 0, 1]);
23
+ const [bx, by, bz, bw] = op.value;
24
+ // Hamilton product: a * b
25
+ const result = [
26
+ aw * bx + ax * bw + ay * bz - az * by,
27
+ aw * by - ax * bz + ay * bw + az * bx,
28
+ aw * bz + ax * by - ay * bx + az * bw,
29
+ aw * bw - ax * bx - ay * by - az * bz,
30
+ ];
31
+ setNodeProperty(node, op.path, result, meta);
32
+ }
33
+ //# sourceMappingURL=quaternion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quaternion.js","sourceRoot":"","sources":["../../../src/operations/apply/quaternion.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAIlF;;GAEG;AACH,MAAM,UAAU,aAAa,CAC3B,KAAiB,EACjB,EAAmB,EACnB,IAAY;IAEZ,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS;QAAE,OAAO;IACpC,kBAAkB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAe,EAAE,IAAI,CAAC,CAAC;AACvE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAAiB,EACjB,EAAwB,EACxB,IAAY;IAEZ,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS;QAAE,OAAO;IACpC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,eAAe,CAAa,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAClF,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC;IAElC,0BAA0B;IAC1B,MAAM,MAAM,GAAe;QACzB,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;QACrC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;QACrC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;QACrC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;KACtC,CAAC;IAEF,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * String operations: set, concat
3
+ */
4
+ import type { SceneGraph, StringSetOp, StringConcatOp } from '../OperationTypes.js';
5
+ import type { OpMeta } from './types.js';
6
+ /**
7
+ * string.set - Last-Write-Wins
8
+ */
9
+ export declare function StringSet(draft: SceneGraph, op: StringSetOp, meta: OpMeta): void;
10
+ /**
11
+ * string.concat - Concatenate (append)
12
+ */
13
+ export declare function StringConcat(draft: SceneGraph, op: StringConcatOp, meta: OpMeta): void;
14
+ //# sourceMappingURL=string.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"string.d.ts","sourceRoot":"","sources":["../../../src/operations/apply/string.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACpF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAGzC;;GAEG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,UAAU,EACjB,EAAE,EAAE,WAAW,EACf,IAAI,EAAE,MAAM,GACX,IAAI,CAIN;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,UAAU,EACjB,EAAE,EAAE,cAAc,EAClB,IAAI,EAAE,MAAM,GACX,IAAI,CAON"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * String operations: set, concat
3
+ */
4
+ import { getNodeProperty, setNodeProperty, setNodePropertyLWW } from './types.js';
5
+ /**
6
+ * string.set - Last-Write-Wins
7
+ */
8
+ export function StringSet(draft, op, meta) {
9
+ const node = draft.nodes[op.key];
10
+ if (!node || node.deletedAt)
11
+ return;
12
+ setNodePropertyLWW(node, op.path, op.value, meta);
13
+ }
14
+ /**
15
+ * string.concat - Concatenate (append)
16
+ */
17
+ export function StringConcat(draft, op, meta) {
18
+ const node = draft.nodes[op.key];
19
+ if (!node || node.deletedAt)
20
+ return;
21
+ const current = getNodeProperty(node, op.path, '');
22
+ const separator = op.separator ?? '';
23
+ const newValue = current ? `${current}${separator}${op.value}` : op.value;
24
+ setNodeProperty(node, op.path, newValue, meta);
25
+ }
26
+ //# sourceMappingURL=string.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"string.js","sourceRoot":"","sources":["../../../src/operations/apply/string.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAElF;;GAEG;AACH,MAAM,UAAU,SAAS,CACvB,KAAiB,EACjB,EAAe,EACf,IAAY;IAEZ,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS;QAAE,OAAO;IACpC,kBAAkB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AACpD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,KAAiB,EACjB,EAAkB,EAClB,IAAY;IAEZ,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS;QAAE,OAAO;IACpC,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,EAAE,CAAC,SAAS,IAAI,EAAE,CAAC;IACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,SAAS,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;IAC1E,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;AACjD,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Shared types for apply functions
3
+ */
4
+ import type { VectorClock } from '../../state/VectorClock.js';
5
+ import type { SceneGraph, SceneNode } from '../OperationTypes.js';
6
+ /**
7
+ * Operation metadata from the CRDTMessage envelope
8
+ */
9
+ export interface OpMeta {
10
+ sessionId: string;
11
+ clock: VectorClock;
12
+ lamportTime: number;
13
+ timestamp: number;
14
+ }
15
+ /**
16
+ * Apply function signature - mutates draft in place (immer)
17
+ */
18
+ export type ApplyFn<TOp> = (draft: SceneGraph, op: TOp, meta: OpMeta) => void;
19
+ /**
20
+ * Helper to get or initialize a node property with a default value
21
+ */
22
+ export declare function getNodeProperty<T>(node: SceneNode, path: string, defaultValue: T): T;
23
+ /**
24
+ * Helper to set a node property (for additive operations)
25
+ * Does NOT update lamportTime - only LWW operations should do that
26
+ */
27
+ export declare function setNodeProperty(node: SceneNode, path: string, value: unknown, meta: OpMeta): void;
28
+ /**
29
+ * Helper to set a node property with LWW semantics
30
+ * Only updates if incoming lamportTime >= current lamportTime
31
+ * (>= allows multiple ops in the same message to apply)
32
+ */
33
+ export declare function setNodePropertyLWW(node: SceneNode, path: string, value: unknown, meta: OpMeta): void;
34
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/operations/apply/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAElE;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,WAAW,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,MAAM,OAAO,CAAC,GAAG,IAAI,CACzB,KAAK,EAAE,UAAU,EACjB,EAAE,EAAE,GAAG,EACP,IAAI,EAAE,MAAM,KACT,IAAI,CAAC;AAEV;;GAEG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,GAAG,CAAC,CAGpF;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,SAAS,EACf,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,MAAM,GACX,IAAI,CAGN;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,SAAS,EACf,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,MAAM,GACX,IAAI,CAON"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Shared types for apply functions
3
+ */
4
+ /**
5
+ * Helper to get or initialize a node property with a default value
6
+ */
7
+ export function getNodeProperty(node, path, defaultValue) {
8
+ const value = node[path];
9
+ return value !== undefined ? value : defaultValue;
10
+ }
11
+ /**
12
+ * Helper to set a node property (for additive operations)
13
+ * Does NOT update lamportTime - only LWW operations should do that
14
+ */
15
+ export function setNodeProperty(node, path, value, meta) {
16
+ node[path] = value;
17
+ node.updatedAt = meta.timestamp;
18
+ }
19
+ /**
20
+ * Helper to set a node property with LWW semantics
21
+ * Only updates if incoming lamportTime >= current lamportTime
22
+ * (>= allows multiple ops in the same message to apply)
23
+ */
24
+ export function setNodePropertyLWW(node, path, value, meta) {
25
+ // LWW: only update if incoming lamport time is higher or equal
26
+ if (meta.lamportTime >= node.lamportTime) {
27
+ node[path] = value;
28
+ node.lamportTime = meta.lamportTime;
29
+ node.updatedAt = meta.timestamp;
30
+ }
31
+ }
32
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/operations/apply/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAwBH;;GAEG;AACH,MAAM,UAAU,eAAe,CAAI,IAAe,EAAE,IAAY,EAAE,YAAe;IAC/E,MAAM,KAAK,GAAG,IAAI,CAAC,IAAuB,CAAC,CAAC;IAC5C,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAE,KAAW,CAAC,CAAC,CAAC,YAAY,CAAC;AAC3D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAC7B,IAAe,EACf,IAAY,EACZ,KAAc,EACd,IAAY;IAEZ,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;IACnB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;AAClC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAChC,IAAe,EACf,IAAY,EACZ,KAAc,EACd,IAAY;IAEZ,+DAA+D;IAC/D,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACzC,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACpC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;IAClC,CAAC;AACH,CAAC"}