@viamrobotics/motion-tools 0.19.1 → 1.0.2

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 (137) hide show
  1. package/README.md +56 -26
  2. package/dist/FrameConfigUpdater.svelte.d.ts +11 -17
  3. package/dist/FrameConfigUpdater.svelte.js +109 -109
  4. package/dist/WorldObject.svelte.js +2 -15
  5. package/dist/common/v1/common_pb.d.ts +950 -0
  6. package/dist/common/v1/common_pb.js +1399 -0
  7. package/dist/components/App.svelte +37 -21
  8. package/dist/components/App.svelte.d.ts +1 -0
  9. package/dist/components/BatchedArrows.svelte +102 -0
  10. package/dist/components/BatchedArrows.svelte.d.ts +3 -0
  11. package/dist/components/CameraControls.svelte +2 -3
  12. package/dist/components/Details.svelte +364 -365
  13. package/dist/components/Entities.svelte +73 -0
  14. package/dist/components/{WorldObjects.svelte.d.ts → Entities.svelte.d.ts} +3 -3
  15. package/dist/components/FileDrop.svelte +9 -23
  16. package/dist/components/Focus.svelte +2 -3
  17. package/dist/components/Frame.svelte +41 -22
  18. package/dist/components/Frame.svelte.d.ts +4 -6
  19. package/dist/components/GLTF.svelte +36 -0
  20. package/dist/components/GLTF.svelte.d.ts +11 -0
  21. package/dist/components/Geometry2.svelte +201 -0
  22. package/dist/components/Geometry2.svelte.d.ts +18 -0
  23. package/dist/components/KeyboardControls.svelte +3 -3
  24. package/dist/components/Line.svelte +10 -13
  25. package/dist/components/Line.svelte.d.ts +2 -2
  26. package/dist/components/LiveUpdatesBanner.svelte +51 -15
  27. package/dist/components/MeasureTool.svelte +4 -5
  28. package/dist/components/Pointcloud.svelte +27 -14
  29. package/dist/components/Pointcloud.svelte.d.ts +2 -2
  30. package/dist/components/PointerMissBox.svelte +3 -3
  31. package/dist/components/Pose.svelte +31 -6
  32. package/dist/components/Pose.svelte.d.ts +2 -2
  33. package/dist/components/Scene.svelte +7 -6
  34. package/dist/components/SceneProviders.svelte +0 -6
  35. package/dist/components/Selected.svelte +22 -16
  36. package/dist/components/StaticGeometries.svelte +51 -27
  37. package/dist/components/Tree/Tree.svelte +28 -22
  38. package/dist/components/Tree/Tree.svelte.d.ts +2 -3
  39. package/dist/components/Tree/TreeContainer.svelte +72 -40
  40. package/dist/components/Tree/Widgets.svelte +2 -5
  41. package/dist/components/Tree/buildTree.d.ts +3 -6
  42. package/dist/components/Tree/buildTree.js +19 -39
  43. package/dist/components/__tests__/__fixtures__/entity.d.ts +2 -0
  44. package/dist/components/__tests__/__fixtures__/entity.js +20 -0
  45. package/dist/components/__tests__/__fixtures__/resource.d.ts +17 -0
  46. package/dist/components/__tests__/__fixtures__/resource.js +13 -0
  47. package/dist/components/dashboard/Dashboard.svelte +5 -3
  48. package/dist/components/dashboard/Dashboard.svelte.d.ts +7 -2
  49. package/dist/components/widgets/ArmPositions.svelte +19 -7
  50. package/dist/draw/v1/drawing_pb.d.ts +341 -0
  51. package/dist/draw/v1/drawing_pb.js +417 -0
  52. package/dist/draw/v1/metadata_pb.d.ts +23 -0
  53. package/dist/draw/v1/metadata_pb.js +39 -0
  54. package/dist/draw/v1/scene_pb.d.ts +230 -0
  55. package/dist/draw/v1/scene_pb.js +298 -0
  56. package/dist/draw/v1/snapshot_pb.d.ts +42 -0
  57. package/dist/draw/v1/snapshot_pb.js +61 -0
  58. package/dist/draw/v1/transforms_pb.d.ts +23 -0
  59. package/dist/draw/v1/transforms_pb.js +39 -0
  60. package/dist/ecs/index.d.ts +4 -0
  61. package/dist/ecs/index.js +4 -0
  62. package/dist/ecs/traits.d.ts +128 -0
  63. package/dist/ecs/traits.js +81 -0
  64. package/dist/ecs/useQuery.svelte.d.ts +4 -0
  65. package/dist/ecs/useQuery.svelte.js +49 -0
  66. package/dist/ecs/useTrait.svelte.d.ts +19 -0
  67. package/dist/ecs/useTrait.svelte.js +40 -0
  68. package/dist/ecs/useWorld.d.ts +4 -0
  69. package/dist/ecs/useWorld.js +10 -0
  70. package/dist/frame.d.ts +2 -0
  71. package/dist/frame.js +14 -0
  72. package/dist/geometry.js +6 -6
  73. package/dist/hooks/__tests__/fixtures/ResizableTestWrapper.svelte +41 -0
  74. package/dist/hooks/__tests__/fixtures/ResizableTestWrapper.svelte.d.ts +6 -0
  75. package/dist/hooks/use3DModels.svelte.js +6 -4
  76. package/dist/hooks/useDrawAPI.svelte.d.ts +0 -10
  77. package/dist/hooks/useDrawAPI.svelte.js +144 -267
  78. package/dist/hooks/useFramelessComponents.svelte.js +1 -1
  79. package/dist/hooks/useFrames.svelte.d.ts +6 -2
  80. package/dist/hooks/useFrames.svelte.js +144 -68
  81. package/dist/hooks/useGeometries.svelte.d.ts +0 -2
  82. package/dist/hooks/useGeometries.svelte.js +49 -25
  83. package/dist/hooks/useObjectEvents.svelte.d.ts +3 -2
  84. package/dist/hooks/useObjectEvents.svelte.js +11 -7
  85. package/dist/hooks/usePartConfig.svelte.d.ts +1 -1
  86. package/dist/hooks/usePartConfig.svelte.js +2 -1
  87. package/dist/hooks/usePointclouds.svelte.d.ts +0 -2
  88. package/dist/hooks/usePointclouds.svelte.js +52 -21
  89. package/dist/hooks/usePose.svelte.js +15 -7
  90. package/dist/hooks/useResizable.svelte.d.ts +12 -0
  91. package/dist/hooks/useResizable.svelte.js +45 -0
  92. package/dist/hooks/useResourceByName.svelte.js +8 -5
  93. package/dist/hooks/useSelection.svelte.d.ts +13 -23
  94. package/dist/hooks/useSelection.svelte.js +45 -65
  95. package/dist/hooks/useVisibility.svelte.d.ts +2 -1
  96. package/dist/hooks/useWeblabs.svelte.d.ts +0 -1
  97. package/dist/hooks/useWeblabs.svelte.js +0 -1
  98. package/dist/hooks/useWorldState.svelte.d.ts +9 -0
  99. package/dist/hooks/useWorldState.svelte.js +158 -107
  100. package/dist/lib.d.ts +1 -0
  101. package/dist/lib.js +2 -0
  102. package/dist/three/BatchedArrow.d.ts +2 -3
  103. package/dist/three/BatchedArrow.js +3 -11
  104. package/dist/three/CapsuleGeometry.d.ts +1 -1
  105. package/dist/three/CapsuleGeometry.js +3 -1
  106. package/dist/transform.js +0 -15
  107. package/package.json +12 -7
  108. package/dist/components/WorldObject.svelte +0 -28
  109. package/dist/components/WorldObject.svelte.d.ts +0 -11
  110. package/dist/components/WorldObjects.svelte +0 -159
  111. package/dist/components/WorldState.svelte +0 -92
  112. package/dist/components/WorldState.svelte.d.ts +0 -7
  113. package/dist/components/__tests__/__fixtures__/worldObject.svelte.d.ts +0 -2
  114. package/dist/components/__tests__/__fixtures__/worldObject.svelte.js +0 -35
  115. package/dist/components/portal/Portal.svelte +0 -25
  116. package/dist/components/portal/Portal.svelte.d.ts +0 -8
  117. package/dist/components/portal/PortalTarget.svelte +0 -18
  118. package/dist/components/portal/PortalTarget.svelte.d.ts +0 -6
  119. package/dist/components/portal/index.d.ts +0 -2
  120. package/dist/components/portal/index.js +0 -2
  121. package/dist/components/portal/usePortalContext.svelte.d.ts +0 -5
  122. package/dist/components/portal/usePortalContext.svelte.js +0 -5
  123. package/dist/hooks/useArrows.svelte.d.ts +0 -3
  124. package/dist/hooks/useArrows.svelte.js +0 -9
  125. package/dist/hooks/useDraggable.svelte.d.ts +0 -10
  126. package/dist/hooks/useDraggable.svelte.js +0 -36
  127. package/dist/hooks/useObjects.svelte.d.ts +0 -7
  128. package/dist/hooks/useObjects.svelte.js +0 -35
  129. package/dist/hooks/usePersistentUUIDs.svelte.d.ts +0 -5
  130. package/dist/hooks/usePersistentUUIDs.svelte.js +0 -13
  131. package/dist/hooks/useResourceByName.svelte.d.ts +0 -7
  132. package/dist/hooks/useStaticGeometries.svelte.d.ts +0 -9
  133. package/dist/hooks/useStaticGeometries.svelte.js +0 -47
  134. package/dist/workers/worldStateWorker.d.ts +0 -1
  135. package/dist/workers/worldStateWorker.js +0 -114
  136. package/dist/world-state-messages.d.ts +0 -23
  137. package/dist/world-state-messages.js +0 -1
@@ -1,6 +1,6 @@
1
1
  import { createResourceClient, createResourceQuery } from '@viamrobotics/svelte-sdk';
2
2
  import { usePartID } from './usePartID.svelte';
3
- import { MotionClient, Transform } from '@viamrobotics/sdk';
3
+ import { MotionClient, Pose, Transform } from '@viamrobotics/sdk';
4
4
  import { RefreshRates, useMachineSettings } from './useMachineSettings.svelte';
5
5
  import { useMotionClient } from './useMotionClient.svelte';
6
6
  import { useEnvironment } from './useEnvironment.svelte';
@@ -12,6 +12,7 @@ import { useLogs } from './useLogs.svelte';
12
12
  import { useResourceByName } from './useResourceByName.svelte';
13
13
  import { useRefetchPoses } from './useRefetchPoses';
14
14
  export const usePose = (name, parent) => {
15
+ const environment = useEnvironment();
15
16
  const logs = useLogs();
16
17
  const { refreshRates } = useMachineSettings();
17
18
  const partID = usePartID();
@@ -22,15 +23,22 @@ export const usePose = (name, parent) => {
22
23
  const { addQueryToRefetch } = useRefetchPoses();
23
24
  const resource = $derived(currentName ? resourceByName.current[currentName] : undefined);
24
25
  const parentResource = $derived(currentParent ? resourceByName.current[currentParent] : undefined);
25
- const environment = useEnvironment();
26
26
  const frames = useFrames();
27
+ let pose = $state(undefined);
27
28
  const client = createResourceClient(MotionClient, () => partID.current, () => motionClient.current ?? '');
28
29
  const interval = $derived(refreshRates.get(RefreshRates.poses));
29
- const resolvedParent = $derived(parentResource?.subtype === 'arm' ? `${parent()}_origin` : parent());
30
+ const resolvedParent = $derived(parentResource?.subtype === 'arm' || parentResource?.subtype === 'gantry'
31
+ ? `${parent()}_origin`
32
+ : parent());
30
33
  const query = createResourceQuery(client, 'getPose', () => [currentName, resolvedParent ?? 'world', []], () => ({
31
- enabled: interval !== RefetchRates.OFF,
34
+ enabled: interval !== RefetchRates.OFF && environment.current.viewerMode === 'monitor',
32
35
  refetchInterval: interval === RefetchRates.MANUAL ? false : interval,
33
36
  }));
37
+ $effect(() => {
38
+ if (environment.current.viewerMode === 'monitor') {
39
+ pose = query.data?.pose;
40
+ }
41
+ });
34
42
  $effect(() => addQueryToRefetch(query));
35
43
  $effect(() => {
36
44
  if (query.isFetching) {
@@ -48,13 +56,13 @@ export const usePose = (name, parent) => {
48
56
  return {
49
57
  get current() {
50
58
  /**
51
- * Do not return the pose of an arm because in this case the pose represents
59
+ * Do not return the pose of an arm or gantry because in this case the pose represents
52
60
  * the end effector frame and not the origin frame
53
61
  */
54
- if (resource?.subtype === 'arm') {
62
+ if (resource?.subtype === 'arm' || resource?.subtype === 'gantry') {
55
63
  return;
56
64
  }
57
- return query.data?.pose;
65
+ return pose;
58
66
  },
59
67
  };
60
68
  };
@@ -0,0 +1,12 @@
1
+ interface Dimensions {
2
+ width: number;
3
+ height: number;
4
+ }
5
+ interface Context {
6
+ readonly current: Dimensions;
7
+ readonly isLoaded: boolean;
8
+ observe: (target: HTMLElement) => void;
9
+ }
10
+ export declare const MIN_DIMENSIONS: Dimensions;
11
+ export declare const useResizable: (name: () => string) => Context;
12
+ export {};
@@ -0,0 +1,45 @@
1
+ import { get, set } from 'idb-keyval';
2
+ export const MIN_DIMENSIONS = { width: 240, height: 320 };
3
+ export const useResizable = (name) => {
4
+ const key = $derived(`${name()}-resizable`);
5
+ let dimensions = $state.raw(MIN_DIMENSIONS);
6
+ let loaded = $state(false);
7
+ let observer;
8
+ $effect(() => {
9
+ get(key).then((saved) => {
10
+ if (saved) {
11
+ dimensions = saved;
12
+ }
13
+ loaded = true;
14
+ });
15
+ });
16
+ const observe = (target) => {
17
+ // Disconnect previous observer if any
18
+ observer?.disconnect();
19
+ observer = new ResizeObserver((entries) => {
20
+ const entry = entries[0];
21
+ if (!entry)
22
+ return;
23
+ const next = {
24
+ width: Math.max(entry.contentRect.width, MIN_DIMENSIONS.width),
25
+ height: Math.max(entry.contentRect.height, MIN_DIMENSIONS.height),
26
+ };
27
+ set(key, next);
28
+ });
29
+ observer.observe(target);
30
+ };
31
+ $effect(() => {
32
+ return () => {
33
+ observer?.disconnect();
34
+ };
35
+ });
36
+ return {
37
+ get current() {
38
+ return dimensions;
39
+ },
40
+ get isLoaded() {
41
+ return loaded;
42
+ },
43
+ observe,
44
+ };
45
+ };
@@ -1,7 +1,7 @@
1
1
  import { useResourceNames } from '@viamrobotics/svelte-sdk';
2
2
  import { getContext, setContext } from 'svelte';
3
- const key = Symbol('resource-by-name-context');
4
- export const provideResourceByName = (partID) => {
3
+ export const RESOURCE_BY_NAME_CONTEXT_KEY = Symbol('resource-by-name-context');
4
+ export const createResourceByName = (partID) => {
5
5
  const resourceNames = useResourceNames(partID);
6
6
  const resourceByName = $derived.by(() => {
7
7
  const results = {};
@@ -10,12 +10,15 @@ export const provideResourceByName = (partID) => {
10
10
  }
11
11
  return results;
12
12
  });
13
- setContext(key, {
13
+ return {
14
14
  get current() {
15
15
  return resourceByName;
16
16
  },
17
- });
17
+ };
18
+ };
19
+ export const provideResourceByName = (partID) => {
20
+ setContext(RESOURCE_BY_NAME_CONTEXT_KEY, createResourceByName(partID));
18
21
  };
19
22
  export const useResourceByName = () => {
20
- return getContext(key);
23
+ return getContext(RESOURCE_BY_NAME_CONTEXT_KEY);
21
24
  };
@@ -1,35 +1,25 @@
1
1
  import { Object3D } from 'three';
2
- import type { WorldObject } from '../WorldObject.svelte';
3
- interface SelectionContext {
4
- readonly current: string | undefined;
5
- set(value?: string): void;
2
+ import type { Entity } from 'koota';
3
+ interface SelectedEntityContext {
4
+ readonly current: Entity | undefined;
5
+ set(entity?: Entity): void;
6
6
  }
7
- interface FocusContext {
8
- readonly current: string | undefined;
9
- set(value?: string): void;
7
+ interface FocusedEntityContext {
8
+ readonly current: Entity | undefined;
9
+ set(entity?: Entity): void;
10
10
  }
11
11
  export declare const provideSelection: () => {
12
12
  selection: {
13
- readonly current: string | undefined;
14
- set(value?: string): void;
13
+ readonly current: Entity | undefined;
14
+ set(entity: Entity): void;
15
15
  };
16
16
  focus: {
17
- readonly current: string | undefined;
18
- set(value?: string): void;
17
+ readonly current: Entity | undefined;
18
+ set(entity: Entity): void;
19
19
  };
20
- hover: {
21
- readonly current: string | undefined;
22
- set(value?: string): void;
23
- };
24
- };
25
- export declare const useSelected: () => SelectionContext;
26
- export declare const useFocused: () => FocusContext;
27
- export declare const useFocusedObject: () => {
28
- current: WorldObject | undefined;
29
- };
30
- export declare const useSelectedObject: () => {
31
- current: WorldObject | undefined;
32
20
  };
21
+ export declare const useFocusedEntity: () => FocusedEntityContext;
22
+ export declare const useSelectedEntity: () => SelectedEntityContext;
33
23
  export declare const useFocusedObject3d: () => {
34
24
  current: Object3D | undefined;
35
25
  };
@@ -1,65 +1,47 @@
1
1
  import { isInstanceOf, useThrelte } from '@threlte/core';
2
2
  import { getContext, setContext } from 'svelte';
3
- import { Matrix4, Object3D } from 'three';
4
- import { useObjects } from './useObjects.svelte';
5
- const hoverKey = Symbol('hover-context');
6
- const selectionKey = Symbol('selection-context');
7
- const focusKey = Symbol('focus-context');
8
- const selectedObjectKey = Symbol('selected-frame-context');
9
- const focusedObjectKey = Symbol('focused-frame-context');
3
+ import { BatchedMesh, Matrix4, Object3D } from 'three';
4
+ import { traits, useTrait, useWorld } from '../ecs';
5
+ const selectedKey = Symbol('selected-frame-context');
6
+ const focusedKey = Symbol('focused-frame-context');
10
7
  const focusedObject3dKey = Symbol('focused-object-3d-context');
11
8
  export const provideSelection = () => {
12
- let selected = $state();
13
- let focused = $state();
14
- let hovered = $state();
15
- const selectionContext = {
9
+ const world = useWorld();
10
+ const { scene } = useThrelte();
11
+ let selected = $state.raw();
12
+ let focused = $state.raw();
13
+ $effect(() => {
14
+ return world.onRemove(traits.Name, (entity) => {
15
+ if (entity === selected)
16
+ selected = undefined;
17
+ if (entity === focused)
18
+ focused = undefined;
19
+ });
20
+ });
21
+ const selectedEntityContext = {
16
22
  get current() {
17
23
  return selected;
18
24
  },
19
- set(value) {
20
- selected = value;
25
+ set(entity) {
26
+ selected = entity;
21
27
  },
22
28
  };
23
- setContext(selectionKey, selectionContext);
24
- const focusContext = {
29
+ setContext(selectedKey, selectedEntityContext);
30
+ const focusedEntityContext = {
25
31
  get current() {
26
32
  return focused;
27
33
  },
28
- set(value) {
29
- focused = value;
30
- },
31
- };
32
- setContext(focusKey, focusContext);
33
- const hoverContext = {
34
- get current() {
35
- return hovered;
36
- },
37
- set(value) {
38
- hovered = value;
39
- },
40
- };
41
- setContext(hoverKey, hoverContext);
42
- const objects = useObjects();
43
- const selectedObject = $derived(objects.current.find((object) => object.uuid === selected));
44
- const selectedObjectContext = {
45
- get current() {
46
- return selectedObject;
34
+ set(entity) {
35
+ focused = entity;
47
36
  },
48
37
  };
49
- setContext(selectedObjectKey, selectedObjectContext);
50
- const focusedObject = $derived(objects.current.find((object) => object.uuid === focused));
51
- const focusedObjectContext = {
52
- get current() {
53
- return focusedObject;
54
- },
55
- };
56
- setContext(focusedObjectKey, focusedObjectContext);
57
- const { scene } = useThrelte();
58
- const uuid = $derived(focusedObject?.uuid);
38
+ setContext(focusedKey, focusedEntityContext);
59
39
  const focusedObject3d = $derived.by(() => {
60
- if (!uuid)
40
+ const name = focused?.get(traits.Name);
41
+ if (!name) {
61
42
  return;
62
- const object = scene.getObjectByProperty('uuid', uuid)?.clone();
43
+ }
44
+ const object = scene.getObjectByName(name)?.clone();
63
45
  object?.traverse((child) => {
64
46
  if (isInstanceOf(child, 'LineSegments')) {
65
47
  child.raycast = () => null;
@@ -73,42 +55,40 @@ export const provideSelection = () => {
73
55
  },
74
56
  });
75
57
  return {
76
- selection: selectionContext,
77
- focus: focusContext,
78
- hover: hoverContext,
58
+ selection: selectedEntityContext,
59
+ focus: focusedEntityContext,
79
60
  };
80
61
  };
81
- export const useSelected = () => {
82
- return getContext(selectionKey);
62
+ export const useFocusedEntity = () => {
63
+ return getContext(focusedKey);
83
64
  };
84
- export const useFocused = () => {
85
- return getContext(focusKey);
86
- };
87
- export const useFocusedObject = () => {
88
- return getContext(focusedObjectKey);
89
- };
90
- export const useSelectedObject = () => {
91
- return getContext(selectedObjectKey);
65
+ export const useSelectedEntity = () => {
66
+ return getContext(selectedKey);
92
67
  };
93
68
  export const useFocusedObject3d = () => {
94
69
  return getContext(focusedObject3dKey);
95
70
  };
96
71
  const matrix = new Matrix4();
97
72
  export const useSelectedObject3d = () => {
98
- const selectedObject = useSelectedObject();
73
+ const selectedEntity = useSelectedEntity();
99
74
  const { scene } = useThrelte();
75
+ const name = useTrait(() => selectedEntity.current, traits.Name);
76
+ const instance = useTrait(() => selectedEntity.current, traits.Instance);
100
77
  const object = $derived.by(() => {
101
- if (!selectedObject.current) {
78
+ if (!selectedEntity.current) {
102
79
  return;
103
80
  }
104
- if (selectedObject.current.metadata.batched) {
81
+ if (instance.current) {
105
82
  const proxy = new Object3D();
106
- const { id, object } = selectedObject.current.metadata.batched;
107
- object.getMatrixAt(id, matrix);
83
+ const mesh = scene.getObjectById(instance.current.meshID);
84
+ mesh?.getMatrixAt(instance.current.instanceID, matrix);
108
85
  proxy.applyMatrix4(matrix);
109
86
  return proxy;
110
87
  }
111
- return scene.getObjectByProperty('uuid', selectedObject.current.uuid);
88
+ if (!name.current) {
89
+ return;
90
+ }
91
+ return scene.getObjectByName(name.current);
112
92
  });
113
93
  return {
114
94
  get current() {
@@ -1,5 +1,6 @@
1
+ import type { Entity } from 'koota';
1
2
  import { SvelteMap } from 'svelte/reactivity';
2
- type Context = SvelteMap<string, boolean>;
3
+ type Context = SvelteMap<Entity, boolean>;
3
4
  export declare const provideVisibility: () => void;
4
5
  export declare const useVisibility: () => Context;
5
6
  export {};
@@ -1,5 +1,4 @@
1
1
  export declare const WEBLABS_EXPERIMENTS: {
2
- readonly MOTION_TOOLS_EDIT_FRAME: "MOTION_TOOLS_EDIT_FRAME";
3
2
  readonly MOTION_TOOLS_RENDER_ARM_MODELS: "MOTION_TOOLS_RENDER_ARM_MODELS";
4
3
  };
5
4
  export declare const WEBLABS_CONTEXT_KEY: unique symbol;
@@ -1,7 +1,6 @@
1
1
  import { getContext, setContext } from 'svelte';
2
2
  import { SvelteSet } from 'svelte/reactivity';
3
3
  export const WEBLABS_EXPERIMENTS = {
4
- MOTION_TOOLS_EDIT_FRAME: 'MOTION_TOOLS_EDIT_FRAME',
5
4
  MOTION_TOOLS_RENDER_ARM_MODELS: 'MOTION_TOOLS_RENDER_ARM_MODELS',
6
5
  };
7
6
  export const WEBLABS_CONTEXT_KEY = Symbol('weblabs-context');
@@ -0,0 +1,9 @@
1
+ import { type TransformChangeEvent, type TransformWithUUID } from '@viamrobotics/sdk';
2
+ export type ChangeMessage = {
3
+ type: 'change';
4
+ events: TransformChangeEvent[];
5
+ };
6
+ export type TransformEvent = TransformChangeEvent & {
7
+ transform: TransformWithUUID;
8
+ };
9
+ export declare const provideWorldStates: () => void;