@hatiolab/things-scene 10.0.0-beta.91 → 10.0.0-beta.93

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 (125) hide show
  1. package/dist-types/animation/animate.d.ts.map +1 -1
  2. package/dist-types/animation/animations/animation.d.ts +5 -3
  3. package/dist-types/animation/animations/animation.d.ts.map +1 -1
  4. package/dist-types/clock/frame-clock.d.ts +119 -0
  5. package/dist-types/clock/frame-clock.d.ts.map +1 -0
  6. package/dist-types/clock/index.d.ts +3 -0
  7. package/dist-types/clock/index.d.ts.map +1 -0
  8. package/dist-types/components/audio.d.ts +7 -3
  9. package/dist-types/components/audio.d.ts.map +1 -1
  10. package/dist-types/components/component.d.ts +9 -4
  11. package/dist-types/components/component.d.ts.map +1 -1
  12. package/dist-types/components/container-abstract.d.ts +14 -6
  13. package/dist-types/components/container-abstract.d.ts.map +1 -1
  14. package/dist-types/components/container.d.ts +6 -2
  15. package/dist-types/components/container.d.ts.map +1 -1
  16. package/dist-types/components/ellipse.d.ts +7 -3
  17. package/dist-types/components/ellipse.d.ts.map +1 -1
  18. package/dist-types/components/generic-placeholders.d.ts +7 -3
  19. package/dist-types/components/generic-placeholders.d.ts.map +1 -1
  20. package/dist-types/components/html-overlay-container.d.ts +6 -2
  21. package/dist-types/components/html-overlay-container.d.ts.map +1 -1
  22. package/dist-types/components/html-overlay-element.d.ts +13 -5
  23. package/dist-types/components/html-overlay-element.d.ts.map +1 -1
  24. package/dist-types/components/image-view.d.ts +7 -3
  25. package/dist-types/components/image-view.d.ts.map +1 -1
  26. package/dist-types/components/info-window.d.ts +7 -3
  27. package/dist-types/components/info-window.d.ts.map +1 -1
  28. package/dist-types/components/local-ref.d.ts +7 -3
  29. package/dist-types/components/local-ref.d.ts.map +1 -1
  30. package/dist-types/components/mixins/connectable.d.ts +7 -3
  31. package/dist-types/components/mixins/connectable.d.ts.map +1 -1
  32. package/dist-types/components/mixins/data-source.d.ts +7 -3
  33. package/dist-types/components/mixins/data-source.d.ts.map +1 -1
  34. package/dist-types/components/mixins/gltf-component.d.ts +6 -2
  35. package/dist-types/components/mixins/gltf-component.d.ts.map +1 -1
  36. package/dist-types/components/mixins/html-element.d.ts +6 -2
  37. package/dist-types/components/mixins/html-element.d.ts.map +1 -1
  38. package/dist-types/components/mixins/move-handle.d.ts +7 -3
  39. package/dist-types/components/mixins/move-handle.d.ts.map +1 -1
  40. package/dist-types/components/mixins/rect-path.d.ts +7 -3
  41. package/dist-types/components/mixins/rect-path.d.ts.map +1 -1
  42. package/dist-types/components/mixins/three-d-only.d.ts +7 -3
  43. package/dist-types/components/mixins/three-d-only.d.ts.map +1 -1
  44. package/dist-types/components/mixins/value-holder.d.ts +7 -3
  45. package/dist-types/components/mixins/value-holder.d.ts.map +1 -1
  46. package/dist-types/components/node.d.ts +7 -3
  47. package/dist-types/components/node.d.ts.map +1 -1
  48. package/dist-types/components/popup.d.ts +7 -3
  49. package/dist-types/components/popup.d.ts.map +1 -1
  50. package/dist-types/components/rect.d.ts +14 -6
  51. package/dist-types/components/rect.d.ts.map +1 -1
  52. package/dist-types/components/ruler.d.ts +7 -3
  53. package/dist-types/components/ruler.d.ts.map +1 -1
  54. package/dist-types/components/service-component.d.ts +7 -3
  55. package/dist-types/components/service-component.d.ts.map +1 -1
  56. package/dist-types/components/text.d.ts +7 -3
  57. package/dist-types/components/text.d.ts.map +1 -1
  58. package/dist-types/diagnostics/contract-inspector.d.ts +103 -0
  59. package/dist-types/diagnostics/contract-inspector.d.ts.map +1 -0
  60. package/dist-types/diagnostics/inspector.d.ts +44 -0
  61. package/dist-types/diagnostics/inspector.d.ts.map +1 -1
  62. package/dist-types/interfaces/real-object.d.ts +8 -1
  63. package/dist-types/interfaces/real-object.d.ts.map +1 -1
  64. package/dist-types/interfaces/types.d.ts +20 -1
  65. package/dist-types/interfaces/types.d.ts.map +1 -1
  66. package/dist-types/math/component-pose.d.ts +51 -0
  67. package/dist-types/math/component-pose.d.ts.map +1 -0
  68. package/dist-types/math/index.d.ts +3 -0
  69. package/dist-types/math/index.d.ts.map +1 -0
  70. package/dist-types/math/pose6dof.d.ts +93 -0
  71. package/dist-types/math/pose6dof.d.ts.map +1 -0
  72. package/dist-types/navigation/index.d.ts +7 -0
  73. package/dist-types/navigation/index.d.ts.map +1 -0
  74. package/dist-types/navigation/nav-graph.d.ts +55 -0
  75. package/dist-types/navigation/nav-graph.d.ts.map +1 -0
  76. package/dist-types/navigation/path-planner.d.ts +29 -0
  77. package/dist-types/navigation/path-planner.d.ts.map +1 -0
  78. package/dist-types/navigation/reservation-table.d.ts +103 -0
  79. package/dist-types/navigation/reservation-table.d.ts.map +1 -0
  80. package/dist-types/navigation/types.d.ts +145 -0
  81. package/dist-types/navigation/types.d.ts.map +1 -0
  82. package/dist-types/placement/index.d.ts +3 -0
  83. package/dist-types/placement/index.d.ts.map +1 -0
  84. package/dist-types/placement/placement.d.ts +53 -0
  85. package/dist-types/placement/placement.d.ts.map +1 -0
  86. package/dist-types/things-scene/index.d.ts +12 -2
  87. package/dist-types/things-scene/index.d.ts.map +1 -1
  88. package/dist-types/threed/factories/backdrop.d.ts +14 -6
  89. package/dist-types/threed/factories/backdrop.d.ts.map +1 -1
  90. package/dist-types/threed/factories/banner.d.ts +7 -3
  91. package/dist-types/threed/factories/banner.d.ts.map +1 -1
  92. package/dist-types/threed/factories/camera.d.ts +7 -3
  93. package/dist-types/threed/factories/camera.d.ts.map +1 -1
  94. package/dist-types/threed/factories/cube.d.ts +7 -3
  95. package/dist-types/threed/factories/cube.d.ts.map +1 -1
  96. package/dist-types/threed/factories/decal.d.ts +14 -6
  97. package/dist-types/threed/factories/decal.d.ts.map +1 -1
  98. package/dist-types/threed/factories/gltf-object.d.ts +13 -5
  99. package/dist-types/threed/factories/gltf-object.d.ts.map +1 -1
  100. package/dist-types/threed/factories/sprite.d.ts +7 -3
  101. package/dist-types/threed/factories/sprite.d.ts.map +1 -1
  102. package/dist-types/threed/factories/wall.d.ts +7 -3
  103. package/dist-types/threed/factories/wall.d.ts.map +1 -1
  104. package/dist-types/threed/real-object.d.ts +29 -1
  105. package/dist-types/threed/real-object.d.ts.map +1 -1
  106. package/dist-types/transfer/container-capacity.d.ts +301 -1
  107. package/dist-types/transfer/container-capacity.d.ts.map +1 -1
  108. package/dist-types/transfer/index.d.ts +7 -1
  109. package/dist-types/transfer/index.d.ts.map +1 -1
  110. package/dist-types/transfer/pickup-helpers.d.ts +65 -0
  111. package/dist-types/transfer/pickup-helpers.d.ts.map +1 -0
  112. package/dist-types/transfer/transfer.d.ts +168 -0
  113. package/dist-types/transfer/transfer.d.ts.map +1 -0
  114. package/dist-types/transfer/types.d.ts +104 -0
  115. package/dist-types/transfer/types.d.ts.map +1 -1
  116. package/dist-types/transition/transition-effect.d.ts +7 -1
  117. package/dist-types/transition/transition-effect.d.ts.map +1 -1
  118. package/dist-types/types/event.d.ts +57 -0
  119. package/dist-types/types/event.d.ts.map +1 -1
  120. package/package.json +1 -1
  121. package/things-scene-min.js +11 -11
  122. package/things-scene-min.js.map +1 -1
  123. package/things-scene-transfer.mjs +6 -1
  124. package/things-scene.mjs +3 -3
  125. package/things-scene.mjs.map +1 -1
@@ -0,0 +1,93 @@
1
+ import * as THREE from 'three';
2
+ export interface PoseLike {
3
+ position: {
4
+ x: number;
5
+ y: number;
6
+ z: number;
7
+ };
8
+ rotation: {
9
+ x: number;
10
+ y: number;
11
+ z: number;
12
+ w: number;
13
+ };
14
+ }
15
+ export declare class Pose6DOF {
16
+ /**
17
+ * Position in the implied coordinate system. World, parent-local, etc — Pose6DOF
18
+ * 자체는 좌표계를 알지 않는다. 호출자가 어떤 frame 의 값인지 명시할 책임.
19
+ */
20
+ readonly position: THREE.Vector3;
21
+ /**
22
+ * Orientation as unit quaternion in the implied coordinate system.
23
+ */
24
+ readonly rotation: THREE.Quaternion;
25
+ constructor(position?: THREE.Vector3 | {
26
+ x: number;
27
+ y: number;
28
+ z: number;
29
+ }, rotation?: THREE.Quaternion | {
30
+ x: number;
31
+ y: number;
32
+ z: number;
33
+ w: number;
34
+ });
35
+ /**
36
+ * Compose: this 의 frame "안" 에서 child 를 적용. 합성된 결과는 부모(this)의
37
+ * 좌표계 기준이다.
38
+ *
39
+ * result.position = this.position + this.rotation × child.position
40
+ * result.rotation = this.rotation × child.rotation
41
+ *
42
+ * 예: holder.worldPose.compose(carrier.localPose) = carrier.worldPose
43
+ */
44
+ compose(child: Pose6DOF): Pose6DOF;
45
+ /**
46
+ * Inverse: this 가 적용 전으로 되돌리는 변환.
47
+ *
48
+ * inv.rotation = this.rotation⁻¹
49
+ * inv.position = -inv.rotation × this.position
50
+ *
51
+ * 항등식: this.compose(this.inverse()) = identity = this.inverse().compose(this).
52
+ */
53
+ inverse(): Pose6DOF;
54
+ /**
55
+ * Transform a point: p' = this.rotation × p + this.position.
56
+ * 입력은 변경하지 않는다 — 새 Vector3 반환.
57
+ */
58
+ transformPoint(p: THREE.Vector3): THREE.Vector3;
59
+ /**
60
+ * Transform a pose. compose 의 의미상 동치.
61
+ * parent.transformPose(child_local) = child_world
62
+ */
63
+ transformPose(child: Pose6DOF): Pose6DOF;
64
+ toMatrix4(out?: THREE.Matrix4): THREE.Matrix4;
65
+ /**
66
+ * Matrix4 의 translation + rotation 만 추출. scale 은 무시 (rigid).
67
+ * scale 이 1 이 아닌 행렬을 넣으면 scale 분해 후 폐기.
68
+ */
69
+ static fromMatrix4(m: THREE.Matrix4): Pose6DOF;
70
+ /**
71
+ * Object3D 의 pose 를 캡처. world=true 이면 world matrix (부모 chain 통과)
72
+ * 를, 아니면 local position/quaternion 을 사용.
73
+ *
74
+ * world=true 호출 전에 객체의 worldMatrix 가 최신이어야 한다 (호출자가
75
+ * `obj.updateWorldMatrix(true, false)` 보장).
76
+ */
77
+ static fromObject3D(obj: THREE.Object3D, world?: boolean): Pose6DOF;
78
+ /**
79
+ * Object3D 의 local position/quaternion 에 이 pose 를 적용. scale 은 건드리지
80
+ * 않는다.
81
+ */
82
+ applyToObject3D(obj: THREE.Object3D): void;
83
+ static identity(): Pose6DOF;
84
+ /**
85
+ * Numerical equality 검사. position 은 component-wise abs diff, rotation 은
86
+ * dot product (둘은 sign 다른 같은 회전 — abs(dot) ≈ 1).
87
+ */
88
+ equals(other: Pose6DOF, tol?: number): boolean;
89
+ clone(): Pose6DOF;
90
+ toJSON(): PoseLike;
91
+ static fromJSON(j: PoseLike): Pose6DOF;
92
+ }
93
+ //# sourceMappingURL=pose6dof.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pose6dof.d.ts","sourceRoot":"","sources":["../../src/math/pose6dof.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAQ9B,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAC7C,QAAQ,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CACzD;AAED,qBAAa,QAAQ;IACnB;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAA;IAEhC;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAA;gBAEvB,QAAQ,CAAC,EAAE,KAAK,CAAC,OAAO,GAAG;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,QAAQ,CAAC,EAAE,KAAK,CAAC,UAAU,GAAG;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE;IAkBxJ;;;;;;;;OAQG;IACH,OAAO,CAAC,KAAK,EAAE,QAAQ,GAAG,QAAQ;IAMlC;;;;;;;OAOG;IACH,OAAO,IAAI,QAAQ;IAMnB;;;OAGG;IACH,cAAc,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO;IAI/C;;;OAGG;IACH,aAAa,CAAC,KAAK,EAAE,QAAQ,GAAG,QAAQ;IAIxC,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO;IAM7C;;;OAGG;IACH,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,GAAG,QAAQ;IAQ9C;;;;;;OAMG;IACH,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,GAAE,OAAe,GAAG,QAAQ;IAW1E;;;OAGG;IACH,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC,QAAQ,GAAG,IAAI;IAK1C,MAAM,CAAC,QAAQ,IAAI,QAAQ;IAI3B;;;OAGG;IACH,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,GAAE,MAAa,GAAG,OAAO;IAapD,KAAK,IAAI,QAAQ;IAIjB,MAAM,IAAI,QAAQ;IAOlB,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,GAAG,QAAQ;CAGvC"}
@@ -0,0 +1,7 @@
1
+ export type { LaneGeometry, Lane, ConflictPair, Intersection, NavPolygon, OpenZone, TimeWindow, Reservation, SpeedProfile, PathSegment, PathPlan, PathPlanOptions, Navigable, YieldDecision, YieldPolicy } from './types.js';
2
+ export { ReservationTable, reservationTable, standardYieldPolicy } from './reservation-table.js';
3
+ export type { ReservationEvent, AddResult, Conflict, ConflictRecord } from './reservation-table.js';
4
+ export { NavGraph, buildNavGraph } from './nav-graph.js';
5
+ export type { NavNode, NavEdge, BuildNavGraphOptions } from './nav-graph.js';
6
+ export { planPathAStar, planToReservations } from './path-planner.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/navigation/index.ts"],"names":[],"mappings":"AAaA,YAAY,EACV,YAAY,EACZ,IAAI,EACJ,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,UAAU,EACV,WAAW,EACX,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,eAAe,EACf,SAAS,EACT,aAAa,EACb,WAAW,EACZ,MAAM,YAAY,CAAA;AAEnB,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,EACpB,MAAM,wBAAwB,CAAA;AAC/B,YAAY,EAAE,gBAAgB,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAEnG,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AACxD,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AAE5E,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA"}
@@ -0,0 +1,55 @@
1
+ import type { Lane, Intersection } from './types.js';
2
+ import type { Vec3 } from '../transfer/types.js';
3
+ export interface NavNode {
4
+ id: string;
5
+ position: Vec3;
6
+ /** 'lane-start' | 'lane-end' | 'intersection' | 'goal' (planner 가 임시 추가). */
7
+ type: string;
8
+ }
9
+ export interface NavEdge {
10
+ fromNode: string;
11
+ toNode: string;
12
+ /** 통과하는 resource id (충돌 검사용). lane id 또는 intersection id. */
13
+ resource: string;
14
+ /** 거리 (scene unit). cost 의 기본 단위. */
15
+ distance: number;
16
+ /** 통과 sim time (ms). speed 가 결정. lane.speedLimit 또는 vehicle.maxSpeed 기준. */
17
+ durationMs: number;
18
+ /** 이 edge 의 통과 방향이 lane 의 정방향과 같으면 true. twoway 의 역방향이면 false. */
19
+ forward: boolean;
20
+ }
21
+ export declare class NavGraph {
22
+ readonly nodes: Map<string, NavNode>;
23
+ /** adjacency list — fromNode → outgoing edges. */
24
+ readonly edges: Map<string, NavEdge[]>;
25
+ /** Lane 별 endpoint node id 매핑. graph augmentation (start/goal 추가) 시 유용. */
26
+ readonly laneEndpoints: Map<string, {
27
+ startNodeId: string;
28
+ endNodeId: string;
29
+ }>;
30
+ addNode(node: NavNode): void;
31
+ addEdge(edge: NavEdge): void;
32
+ edgesFrom(nodeId: string): NavEdge[];
33
+ /** 가장 가까운 node 찾기 (start/goal 진입용). bruteforce — 큰 그래프엔 spatial index 권장. */
34
+ findNearestNode(pos: Vec3): NavNode | null;
35
+ }
36
+ export interface BuildNavGraphOptions {
37
+ /** Lane 별 default speed (없으면 lane.speedLimit, 그것도 없으면 fallback 100). */
38
+ defaultSpeed?: number;
39
+ }
40
+ /**
41
+ * Lane / Intersection 으로부터 NavGraph 를 빌드.
42
+ *
43
+ * 노드 명명 규약:
44
+ * - lane endpoint: `${lane.id}:start`, `${lane.id}:end`
45
+ * - intersection: `${intersection.id}` (intersection 자체가 단일 노드 — 통과 cost 는
46
+ * intersection.crossingTimeMs 로 모델링)
47
+ *
48
+ * Edge 종류:
49
+ * - lane traversal: lane.id 가 resource. oneway 면 start→end 만, twoway 면
50
+ * 양방향 두 edge. distance = lane.geometry.centerPoints 누적.
51
+ * - intersection crossing: intersection.id 가 resource. 만나는 lane 들의
52
+ * endpoint 간 edge (직선 거리 + crossingTimeMs).
53
+ */
54
+ export declare function buildNavGraph(lanes: Lane[], intersections: Intersection[], options?: BuildNavGraphOptions): NavGraph;
55
+ //# sourceMappingURL=nav-graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nav-graph.d.ts","sourceRoot":"","sources":["../../src/navigation/nav-graph.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACpD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;AAEhD,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,IAAI,CAAA;IACd,6EAA6E;IAC7E,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,OAAO;IACtB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,CAAA;IAChB,qCAAqC;IACrC,QAAQ,EAAE,MAAM,CAAA;IAChB,4EAA4E;IAC5E,UAAU,EAAE,MAAM,CAAA;IAClB,kEAAkE;IAClE,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,qBAAa,QAAQ;IACnB,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAY;IAChD,kDAAkD;IAClD,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAY;IAElD,2EAA2E;IAC3E,QAAQ,CAAC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAY;IAE3F,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAO5B,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAW5B,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,EAAE;IAIpC,6EAA6E;IAC7E,eAAe,CAAC,GAAG,EAAE,IAAI,GAAG,OAAO,GAAG,IAAI;CAY3C;AAaD,MAAM,WAAW,oBAAoB;IACnC,wEAAwE;IACxE,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,IAAI,EAAE,EACb,aAAa,EAAE,YAAY,EAAE,EAC7B,OAAO,GAAE,oBAAyB,GACjC,QAAQ,CA0GV"}
@@ -0,0 +1,29 @@
1
+ import type { NavGraph } from './nav-graph.js';
2
+ import type { PathPlan, PathPlanOptions } from './types.js';
3
+ /**
4
+ * A* 경로 계획.
5
+ *
6
+ * @param graph navigation graph
7
+ * @param startNodeId 출발 node id
8
+ * @param goalNodeId 도착 node id
9
+ * @param options vehicle 의 speed / priority / startSimMs / deadline
10
+ * @returns PathPlan 또는 null (도달 불가 / deadline 초과)
11
+ */
12
+ export declare function planPathAStar(graph: NavGraph, startNodeId: string, goalNodeId: string, options?: PathPlanOptions): PathPlan | null;
13
+ /**
14
+ * PathPlan 의 segments 를 ReservationTable 의 add 입력 형태로 변환.
15
+ *
16
+ * 호출자가 ReservationTable.add 를 segment 별로 시도하고, 실패 시 rollback
17
+ * (이미 add 된 것들 release) 책임. helper 는 단순 매핑.
18
+ */
19
+ export declare function planToReservations(plan: PathPlan, reserverId: string, priority?: number, metadata?: Record<string, any>): Array<{
20
+ resource: string;
21
+ timeWindow: {
22
+ startSimMs: number;
23
+ endSimMs: number;
24
+ };
25
+ reserverId: string;
26
+ priority: number;
27
+ metadata?: Record<string, any>;
28
+ }>;
29
+ //# sourceMappingURL=path-planner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-planner.d.ts","sourceRoot":"","sources":["../../src/navigation/path-planner.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,KAAK,EAAE,QAAQ,EAAe,eAAe,EAAE,MAAM,YAAY,CAAA;AA+BxE;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,QAAQ,EACf,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,eAAoB,GAC5B,QAAQ,GAAG,IAAI,CAqGjB;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,QAAQ,EACd,UAAU,EAAE,MAAM,EAClB,QAAQ,GAAE,MAAU,EACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC7B,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CAAE,CAAC,CAQzJ"}
@@ -0,0 +1,103 @@
1
+ import type { Reservation, TimeWindow, YieldDecision, YieldPolicy } from './types.js';
2
+ /** 기본 yield policy: priority 낮은(수치 높은) 쪽이 양보, 같으면 fifo. */
3
+ export declare const standardYieldPolicy: YieldPolicy;
4
+ /**
5
+ * Conflict — 두 reservation 의 충돌 정보. yield policy 가 어느 쪽이 양보할지 결정.
6
+ */
7
+ export interface Conflict {
8
+ a: Reservation;
9
+ b: Reservation;
10
+ decision: YieldDecision;
11
+ }
12
+ /**
13
+ * Phase K — 충돌 발생 기록. observability 의 입력 — Atlas 의 Conflicts mode 가
14
+ * 활용. 시간순 누적 (ring buffer 로 maxEntries 제한).
15
+ */
16
+ export interface ConflictRecord {
17
+ /** 충돌 발생 sim time (proposed reservation 의 시작 시간으로 추정). */
18
+ simTime: number;
19
+ resource: string;
20
+ /** 시도된 reservation (table 에 안 들어감). */
21
+ proposed: Omit<Reservation, 'id'>;
22
+ /** 충돌한 기존 reservations. */
23
+ existing: Reservation[];
24
+ /** 결과 — 'rejected' (proposed 가 양보) | 'preempted' (기존이 evict 됨). */
25
+ outcome: 'rejected' | 'preempted';
26
+ }
27
+ export declare class ReservationTable {
28
+ private readonly _byResource;
29
+ private readonly _byReserver;
30
+ private readonly _yieldPolicy;
31
+ private readonly _listeners;
32
+ private readonly _conflictLog;
33
+ private _maxConflictLog;
34
+ constructor(yieldPolicy?: YieldPolicy);
35
+ /**
36
+ * Reservation 을 추가. 같은 resource + 겹치는 window 에 다른 reservation 이
37
+ * 있으면 yield policy 가 어느 쪽이 양보할지 결정.
38
+ *
39
+ * 반환:
40
+ * - { ok: true, reservation } 충돌 없음
41
+ * - { ok: false, conflicts } 이 reservation 이 양보 (추가 안 됨)
42
+ * - { ok: 'preempted', reservation, evicted } 기존 reservation 들이 양보 (제거됨)
43
+ *
44
+ * preempted 케이스는 호출자가 evicted reservation 의 reserver 들에게
45
+ * notification 하고 reroute 하도록 함.
46
+ */
47
+ add(input: Omit<Reservation, 'id'>): AddResult;
48
+ /** Phase K — 충돌 로그 (rejected / preempted). 시간순 누적. */
49
+ conflictLog(): readonly ConflictRecord[];
50
+ /** maxEntries 설정 (테스트용). */
51
+ setMaxConflictLog(n: number): void;
52
+ private _appendConflictLog;
53
+ /**
54
+ * 미리 충돌 가능성 검사 (add 안 함). plan 단계에서 reservation 을 사전 검증할 때.
55
+ */
56
+ conflicts(resource: string, window: TimeWindow): Reservation[];
57
+ /** 한 reservation 회수. 도착 완료 또는 cancel 시. */
58
+ release(reservation: Reservation): void;
59
+ /** 같은 reserver 의 모든 reservation 일괄 해제. */
60
+ releaseAllOf(reserverId: string): Reservation[];
61
+ /** 특정 resource 의 모든 reservation (read-only 사본). */
62
+ forResource(resource: string): readonly Reservation[];
63
+ /** 특정 reserver 의 모든 reservation. */
64
+ forReserver(reserverId: string): readonly Reservation[];
65
+ /** 모든 reservation. */
66
+ all(): readonly Reservation[];
67
+ /** 청소 (테스트용). */
68
+ clear(): void;
69
+ /**
70
+ * Listener 등록. observability (Atlas extension 등) 를 위함.
71
+ */
72
+ subscribe(listener: (event: ReservationEvent) => void): () => void;
73
+ private _insert;
74
+ private _remove;
75
+ private _emit;
76
+ }
77
+ export type ReservationEvent = {
78
+ kind: 'added';
79
+ reservation: Reservation;
80
+ } | {
81
+ kind: 'released';
82
+ reservation: Reservation;
83
+ } | {
84
+ kind: 'evicted';
85
+ reservation: Reservation;
86
+ by: Reservation;
87
+ };
88
+ export type AddResult = {
89
+ ok: true;
90
+ reservation: Reservation;
91
+ } | {
92
+ ok: 'preempted';
93
+ reservation: Reservation;
94
+ evicted: Reservation[];
95
+ } | {
96
+ ok: false;
97
+ conflicts: Conflict[];
98
+ };
99
+ /**
100
+ * Singleton — 단일 시뮬레이션 instance 내 공유. 테스트는 자체 인스턴스 만드는 걸 권장.
101
+ */
102
+ export declare const reservationTable: ReservationTable;
103
+ //# sourceMappingURL=reservation-table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reservation-table.d.ts","sourceRoot":"","sources":["../../src/navigation/reservation-table.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,145 @@
1
+ import type { Vec3 } from '../transfer/types.js';
2
+ export interface LaneGeometry {
3
+ /** 중앙선의 점들 (시작 → 끝). */
4
+ centerPoints: Vec3[];
5
+ /** lane 의 폭 (vehicle 이 이 안에 들어가야 함). */
6
+ width: number;
7
+ }
8
+ export interface Lane {
9
+ id: string;
10
+ geometry: LaneGeometry;
11
+ /** oneway 면 centerPoints 의 시작→끝 방향만, twoway 면 양방향 허용. */
12
+ direction: 'oneway' | 'twoway';
13
+ /** 속도 제한 (scene units / sim sec). undefined = 무제한. */
14
+ speedLimit?: number;
15
+ /** 통과 가능한 도구 type (Pickable.toolType 과 같은 축). 빈 배열 = 모두 허용. */
16
+ allowedToolTypes?: string[];
17
+ /** 동시에 들어갈 수 있는 vehicle 수. 1 = 단독 점유 (1차원 큐). */
18
+ capacity: number;
19
+ }
20
+ /**
21
+ * 두 lane 의 진입쌍이 충돌하는지 표현. e.g. north→south 와 east→west 는 직각
22
+ * 교차로에서 충돌하지만 north→east 와 south→east 는 충돌 안 함 (병행).
23
+ */
24
+ export interface ConflictPair {
25
+ fromLane: string;
26
+ toLane: string;
27
+ /** 어떤 우선순위 정책을 적용할지. */
28
+ resolveBy: 'fifo' | 'priority' | 'roundrobin';
29
+ }
30
+ export interface Intersection {
31
+ id: string;
32
+ lanes: string[];
33
+ conflicts: ConflictPair[];
34
+ /** 통과 시간 (vehicle 이 교차로 안에 머무는 sim ms). 보수적으로 추정. */
35
+ crossingTimeMs: number;
36
+ }
37
+ export interface NavPolygon {
38
+ vertices: Vec3[];
39
+ }
40
+ /**
41
+ * lane 으로 표현하기 어려운 넓은 영역 (open warehouse floor, dock plaza 등).
42
+ * 시공간 격자로 점유권을 관리.
43
+ */
44
+ export interface OpenZone {
45
+ id: string;
46
+ boundary: NavPolygon;
47
+ /** 점유 격자의 cell 한 변 크기 (scene unit). 작을수록 정확하지만 reservation 많아짐. */
48
+ cellSize: number;
49
+ }
50
+ export interface TimeWindow {
51
+ /** sim time milliseconds. */
52
+ startSimMs: number;
53
+ endSimMs: number;
54
+ }
55
+ /**
56
+ * 어떤 resource 를 어떤 시간 window 동안 누가 점유하는가.
57
+ *
58
+ * resource 는 lane id / intersection id / open-zone cell key 등 resource 의
59
+ * 단일 식별자. cell 의 경우 e.g. `${zoneId}:cell:${i},${j}`.
60
+ */
61
+ export interface Reservation {
62
+ id: string;
63
+ resource: string;
64
+ timeWindow: TimeWindow;
65
+ reserverId: string;
66
+ /** 낮을수록 우선. emergency = -1, task-bound = 0, idle = 10 등. */
67
+ priority: number;
68
+ /** 부수 메타 (어떤 task 의 일부인지, 어떤 carrier 를 운반 중인지 등). */
69
+ metadata?: Record<string, any>;
70
+ }
71
+ export interface SpeedProfile {
72
+ /** 최대 속도 (scene units / sim sec). */
73
+ max: number;
74
+ /** 가속도 (scene units / sim sec²). */
75
+ accel: number;
76
+ /** 감속도 (scene units / sim sec²). */
77
+ decel: number;
78
+ }
79
+ export interface PathSegment {
80
+ resource: string;
81
+ /** 이 segment 를 통과하는 sim time. */
82
+ timeWindow: TimeWindow;
83
+ /** segment 시작 / 끝 좌표 (시각화용). */
84
+ fromPos: Vec3;
85
+ toPos: Vec3;
86
+ }
87
+ export interface PathPlan {
88
+ segments: PathSegment[];
89
+ /** 전체 경로의 sim time 길이. */
90
+ totalDurationMs: number;
91
+ /** 전체 경로 길이 (scene unit). */
92
+ totalDistance: number;
93
+ }
94
+ export interface PathPlanOptions {
95
+ /** sim time 시작점. 미지정 시 현재 globalSimClock.now. */
96
+ startSimMs?: number;
97
+ /** vehicle 의 toolType — lane.allowedToolTypes 검사용. */
98
+ toolType?: string;
99
+ /** vehicle 의 speed profile. */
100
+ speed?: SpeedProfile;
101
+ /** 우선순위 (충돌 시 양보 결정용). */
102
+ priority?: number;
103
+ /** deadline (sim ms) — 이 시간 안에 도착 못 하면 null 반환. */
104
+ deadlineSimMs?: number;
105
+ }
106
+ /**
107
+ * Vehicle 이 navigation 능력을 노출하는 인터페이스. Mover 의 sub-trait.
108
+ *
109
+ * lifecycle:
110
+ * 1. planPath(target) → PathPlan | null (lookup, 부수효과 없음)
111
+ * 2. reservePath(plan) → Reservation[] | null (table 에 add, 충돌 시 null)
112
+ * 3. followReservation(rs) → Promise<void> (sim time 진행)
113
+ * 4. releaseReservation(rs) (도착 후 또는 cancel)
114
+ *
115
+ * 단계 분리로 충돌 감지가 commit 직전, replay 가 결정적, 디버깅이 가능.
116
+ */
117
+ export interface Navigable {
118
+ toolType: string;
119
+ speedProfile: SpeedProfile;
120
+ /**
121
+ * 경로 계획. 시간-공간 reservation 가능성 검증 포함 (단, table 에 commit 안 함).
122
+ * null 반환 = 도달 가능 경로 없음 (deadline 초과 / 모든 lane 점유 등).
123
+ */
124
+ planPath(target: Vec3, options?: PathPlanOptions): PathPlan | null;
125
+ /**
126
+ * 계획된 경로를 reservation table 에 commit. 다른 vehicle 이 이미 점유한
127
+ * window 와 충돌 시 null — 호출자가 reroute 하든 대기하든 결정.
128
+ */
129
+ reservePath(plan: PathPlan, priority?: number): Reservation[] | null;
130
+ /**
131
+ * commit 된 reservation 따라 sim time 진행. resolve = 마지막 segment 도착.
132
+ */
133
+ followReservation(reservations: Reservation[]): Promise<void>;
134
+ /** 점유 해제. 도착 완료 또는 cancel 시 호출. */
135
+ releaseReservation(reservations: Reservation[]): void;
136
+ }
137
+ export type YieldDecision = 'a-yields' | 'b-yields' | 'replan-both';
138
+ export interface YieldPolicy {
139
+ /**
140
+ * 두 reservation 이 시간-공간 충돌할 때 누가 양보하는가.
141
+ * 기본: priority 낮은 (수치 높은) 쪽이 양보. 같으면 fifo (먼저 만든 게 우선).
142
+ */
143
+ resolveConflict(a: Reservation, b: Reservation): YieldDecision;
144
+ }
145
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/navigation/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export type { Placement, PlacementPolicy } from './placement.js';
2
+ export { DEFAULT_PLACEMENT, isStateDriven } from './placement.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/placement/index.ts"],"names":[],"mappings":"AAMA,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAChE,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * 컴포넌트의 placement 결정 정책.
3
+ *
4
+ * - **state-driven** (default): state.left/top/zPos/rotation/... 이 obj3d 에 반영.
5
+ * 현재 things-scene 의 모든 컴포넌트가 묵시적으로 따르는 정책.
6
+ *
7
+ * - **carried**: 다른 holder 의 attach frame 에 부착. holder 의 movement 를
8
+ * scene-graph 통해 자동 추종. carrier policy (world-preserve / belt-aligned /
9
+ * world-fixed 등) 는 holder 가 결정. 예: AGV 위 박스, sorter carrier 위 파레트.
10
+ *
11
+ * - **animated**: animation system 이 일시적으로 obj3d 를 override. animation
12
+ * 종료 시 다른 정책으로 복귀.
13
+ *
14
+ * - **fixed**: world 좌표 고정 (parent 변경 무관). HUD / screenFixed 컴포넌트.
15
+ *
16
+ * - **transitioning**: reparent 중 TransitionEffect 가 보간 제어. transition
17
+ * 완료 시 keepSuppressed 면 carried 또는 manual, 아니면 state-driven 으로 복귀.
18
+ *
19
+ * - **manual**: 컴포넌트 코드가 직접 obj3d.position/quaternion 을 매 frame
20
+ * 조작. framework 는 개입 안 함. 예: cross-belt-line 의 _tickSim, IK
21
+ * smoothing, URDF physics.
22
+ */
23
+ export type PlacementPolicy = 'state-driven' | 'carried' | 'animated' | 'fixed' | 'transitioning' | 'manual';
24
+ /**
25
+ * Placement 선언. 컴포넌트의 RealObject 가 이 객체를 반환하면 framework 가
26
+ * 정책에 따라 동작.
27
+ *
28
+ * Step 1 에선 policy 만 정의. 후속 step 에서 정책별 metadata (예: carried 의
29
+ * carryPolicy 'world-preserve' / 'belt-aligned', transitioning 의 transition 객체)
30
+ * 를 추가.
31
+ */
32
+ export interface Placement {
33
+ policy: PlacementPolicy;
34
+ /**
35
+ * 정책별 metadata. 선언 시점에 정책에 따라 추가 정보를 담음.
36
+ * Step 1 에선 미사용. 향후 정책 별로 타입 좁히기 (discriminated union) 적용.
37
+ */
38
+ meta?: Record<string, unknown>;
39
+ }
40
+ /** 기본 placement = 현재 동작 = state pipeline 이 obj3d 를 결정. */
41
+ export declare const DEFAULT_PLACEMENT: Placement;
42
+ /**
43
+ * Placement 정책이 state pipeline 적용을 허용하는가.
44
+ *
45
+ * - state-driven: ✓ 적용
46
+ * - 그 외: framework 가 obj3d 를 건드리지 않음 (다른 시스템 또는 컴포넌트가 책임).
47
+ *
48
+ * 현재 RealObject 의 `suppressTransform` 플래그와 의미가 겹침. 마이그레이션
49
+ * 단계 (Step 2~7) 에서 suppressTransform 이 점진적으로 `placement.policy !==
50
+ * 'state-driven'` 으로 흡수됨. 호환성 위해 두 메커니즘 일정 기간 병존.
51
+ */
52
+ export declare function isStateDriven(placement: Placement): boolean;
53
+ //# sourceMappingURL=placement.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"placement.d.ts","sourceRoot":"","sources":["../../src/placement/placement.ts"],"names":[],"mappings":"AAkBA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,MAAM,eAAe,GACvB,cAAc,GACd,SAAS,GACT,UAAU,GACV,OAAO,GACP,eAAe,GACf,QAAQ,CAAA;AAEZ;;;;;;;GAOG;AACH,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,eAAe,CAAA;IACvB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B;AAED,0DAA0D;AAC1D,eAAO,MAAM,iBAAiB,EAAE,SAAsC,CAAA;AAEtE;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAE3D"}
@@ -16,6 +16,7 @@ export declare namespace Model {
16
16
  }
17
17
  export { default as Layer } from '../layer/layer.js';
18
18
  export { default as EventMap } from '../event-map/event-map.js';
19
+ export type { ComponentEventMap } from '../types/event.js';
19
20
  export * from '../const.js';
20
21
  export * from '../animation/index.js';
21
22
  export * from '../components/index.js';
@@ -27,8 +28,16 @@ export type { SceneRenderContext, DrawOptions, StyleOptions, FillStyle, StrokeSt
27
28
  export type { LinkEnd } from '../decorator/decorators/link-decorator.js';
28
29
  export type { LAYOUT, LayoutRegistry } from '../interfaces/layout.js';
29
30
  export type { IRealObject } from '../interfaces/real-object.js';
30
- export type { Vec3, Size3, Bounds3, SlotArrangement, GridShape, SlotDef, SlotAssignment, TransferOptions, StaticPolicy, DynamicPolicy, PendingPolicy, ConnectionPolicy, Port, TransferEventType, TransferEvent, CarrierAttachPoint, ArrangementStrategy, Transferable, NavigationTarget, NavigationOptions, Movable, ArticulatedCapability, MissionStatus, VehicleMission, MissionExecutor, SensorPoint, SpawnPoint, SinkPoint, SimulationClock } from '../transfer/index.js';
31
- export { FixedSlotStrategy, CenteringSlotStrategy, ContainerCapacity, TRANSFER_SLOT_KEY, globalSimClock } from '../transfer/index.js';
31
+ export type { Vec3, Size3, Bounds3, SlotArrangement, GridShape, SlotDef, SlotAssignment, TransferOptions, StaticPolicy, DynamicPolicy, PendingPolicy, ConnectionPolicy, Port, TransferEventType, TransferEvent, CarrierAttachPoint, ArrangementStrategy, Transferable, NavigationTarget, NavigationOptions, Movable, ArticulatedCapability, MissionStatus, VehicleMission, MissionExecutor, SensorPoint, SpawnPoint, SinkPoint, SimulationClock, TransferPhase, TransferTimeline, TransferReceipt, TransferReceiptJSON, TransferLogStats, PhysicalRunner, TransferInit, QuatLike, PoseSerialized, PickupFrame, PickupRequester, Pickable, RectangularFootprintOptions, TopApproachOptions } from '../transfer/index.js';
32
+ export { FixedSlotStrategy, CenteringSlotStrategy, ContainerCapacity, TRANSFER_SLOT_KEY, globalSimClock, Transfer, transferLog, receiptToJSON, quatFromYaw, rectangularFootprintFrames, topApproachFrame, filterByToolType, chooseNearestPickupFrame } from '../transfer/index.js';
33
+ export { Pose6DOF, getPose, getWorldPose, setPose, setWorldPose } from '../math/index.js';
34
+ export type { PoseLike } from '../math/index.js';
35
+ export { ReservationTable, reservationTable, standardYieldPolicy, NavGraph, buildNavGraph, planPathAStar, planToReservations } from '../navigation/index.js';
36
+ export type { LaneGeometry, Lane, ConflictPair, Intersection, NavPolygon, OpenZone, TimeWindow, Reservation, SpeedProfile, PathSegment, PathPlan, PathPlanOptions, Navigable, YieldDecision, YieldPolicy, ReservationEvent, AddResult, Conflict, ConflictRecord, NavNode, NavEdge, BuildNavGraphOptions } from '../navigation/index.js';
37
+ export { buildContractInspector, installContractInspector } from '../diagnostics/contract-inspector.js';
38
+ export type { ContractInspector, InspectorComponentSummary, InspectorSimStatus } from '../diagnostics/contract-inspector.js';
39
+ export { frameClock } from '../clock/index.js';
40
+ export type { FrameClock, TickHandler, Unsubscribe, SubscribeOptions, SubscriptionInfo, FrameClockSnapshot, ExternalAnimationInfo, ExternalAnimationHandle } from '../clock/index.js';
32
41
  export { default as ReferenceMap } from '../core/reference-map.js';
33
42
  export { default as ScriptLoader } from '../core/script-loader.js';
34
43
  export * from '../core/logger.js';
@@ -44,6 +53,7 @@ export type { LagMonitorConfig, LagTrend, LagLevel, LagStats } from '../diagnost
44
53
  export { LoadingOverlay } from '../diagnostics/loading-overlay.js';
45
54
  export { default as ScenePopup } from '../layer/action/popup.js';
46
55
  export { default as TransitionEffect } from '../transition/transition-effect.js';
56
+ export * from '../placement/index.js';
47
57
  export * from '../search/index.js';
48
58
  export * from '../threed/index.js';
49
59
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/things-scene/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/things-scene/index.ts"],"names":[],"mappings":"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"}