@hatiolab/things-scene 10.0.0-beta.99 → 10.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (278) hide show
  1. package/CHANGELOG.md +65 -0
  2. package/README.md +56 -53
  3. package/dist-types/clock/frame-clock.d.ts.map +1 -1
  4. package/dist-types/command/command-migrate.d.ts.map +1 -1
  5. package/dist-types/command/snapshot-commander.d.ts.map +1 -1
  6. package/dist-types/components/audio.d.ts +12 -9
  7. package/dist-types/components/audio.d.ts.map +1 -1
  8. package/dist-types/components/component-drawing.d.ts.map +1 -1
  9. package/dist-types/components/component-geometry.d.ts.map +1 -1
  10. package/dist-types/components/component-hierarchy.d.ts +1 -1
  11. package/dist-types/components/component-hierarchy.d.ts.map +1 -1
  12. package/dist-types/components/component.d.ts +109 -13
  13. package/dist-types/components/component.d.ts.map +1 -1
  14. package/dist-types/components/container-abstract.d.ts +26 -22
  15. package/dist-types/components/container-abstract.d.ts.map +1 -1
  16. package/dist-types/components/container.d.ts +13 -9
  17. package/dist-types/components/container.d.ts.map +1 -1
  18. package/dist-types/components/data/data.d.ts.map +1 -1
  19. package/dist-types/components/data/evaluator.d.ts +27 -0
  20. package/dist-types/components/data/evaluator.d.ts.map +1 -1
  21. package/dist-types/components/donut.d.ts.map +1 -1
  22. package/dist-types/components/ellipse.d.ts +12 -9
  23. package/dist-types/components/ellipse.d.ts.map +1 -1
  24. package/dist-types/components/generic-placeholders.d.ts +12 -9
  25. package/dist-types/components/generic-placeholders.d.ts.map +1 -1
  26. package/dist-types/components/group.d.ts +1 -0
  27. package/dist-types/components/group.d.ts.map +1 -1
  28. package/dist-types/components/html/reposition.d.ts.map +1 -1
  29. package/dist-types/components/html-overlay-container.d.ts +13 -9
  30. package/dist-types/components/html-overlay-container.d.ts.map +1 -1
  31. package/dist-types/components/html-overlay-element.d.ts +25 -18
  32. package/dist-types/components/html-overlay-element.d.ts.map +1 -1
  33. package/dist-types/components/image-view.d.ts +12 -9
  34. package/dist-types/components/image-view.d.ts.map +1 -1
  35. package/dist-types/components/index.d.ts +1 -0
  36. package/dist-types/components/index.d.ts.map +1 -1
  37. package/dist-types/components/info-window.d.ts +12 -9
  38. package/dist-types/components/info-window.d.ts.map +1 -1
  39. package/dist-types/components/line.d.ts.map +1 -1
  40. package/dist-types/components/local-ref.d.ts +12 -9
  41. package/dist-types/components/local-ref.d.ts.map +1 -1
  42. package/dist-types/components/mixins/connectable.d.ts +12 -9
  43. package/dist-types/components/mixins/connectable.d.ts.map +1 -1
  44. package/dist-types/components/mixins/data-source.d.ts +12 -9
  45. package/dist-types/components/mixins/data-source.d.ts.map +1 -1
  46. package/dist-types/components/mixins/gltf-component.d.ts +13 -11
  47. package/dist-types/components/mixins/gltf-component.d.ts.map +1 -1
  48. package/dist-types/components/mixins/holdable.d.ts +12 -0
  49. package/dist-types/components/mixins/holdable.d.ts.map +1 -0
  50. package/dist-types/components/mixins/html-element.d.ts +22 -9
  51. package/dist-types/components/mixins/html-element.d.ts.map +1 -1
  52. package/dist-types/components/mixins/move-handle.d.ts +21 -13
  53. package/dist-types/components/mixins/move-handle.d.ts.map +1 -1
  54. package/dist-types/components/mixins/rect-path.d.ts +12 -9
  55. package/dist-types/components/mixins/rect-path.d.ts.map +1 -1
  56. package/dist-types/components/mixins/three-d-only.d.ts +18 -9
  57. package/dist-types/components/mixins/three-d-only.d.ts.map +1 -1
  58. package/dist-types/components/mixins/value-holder.d.ts +12 -9
  59. package/dist-types/components/mixins/value-holder.d.ts.map +1 -1
  60. package/dist-types/components/modeling-faint.d.ts +14 -0
  61. package/dist-types/components/modeling-faint.d.ts.map +1 -0
  62. package/dist-types/components/mutater/path.d.ts.map +1 -1
  63. package/dist-types/components/node.d.ts +12 -9
  64. package/dist-types/components/node.d.ts.map +1 -1
  65. package/dist-types/components/polygon-container.d.ts +61 -0
  66. package/dist-types/components/polygon-container.d.ts.map +1 -0
  67. package/dist-types/components/polygon.d.ts.map +1 -1
  68. package/dist-types/components/polyline.d.ts +6 -0
  69. package/dist-types/components/polyline.d.ts.map +1 -1
  70. package/dist-types/components/popup.d.ts +12 -9
  71. package/dist-types/components/popup.d.ts.map +1 -1
  72. package/dist-types/components/rect.d.ts +24 -18
  73. package/dist-types/components/rect.d.ts.map +1 -1
  74. package/dist-types/components/retention/retention-manager.d.ts +9 -1
  75. package/dist-types/components/retention/retention-manager.d.ts.map +1 -1
  76. package/dist-types/components/root-container.d.ts +7 -0
  77. package/dist-types/components/root-container.d.ts.map +1 -1
  78. package/dist-types/components/ruler.d.ts +12 -9
  79. package/dist-types/components/ruler.d.ts.map +1 -1
  80. package/dist-types/components/service-component.d.ts +12 -9
  81. package/dist-types/components/service-component.d.ts.map +1 -1
  82. package/dist-types/components/star.d.ts.map +1 -1
  83. package/dist-types/components/text.d.ts +12 -9
  84. package/dist-types/components/text.d.ts.map +1 -1
  85. package/dist-types/core/dom-to-image.d.ts.map +1 -1
  86. package/dist-types/core/logger.d.ts.map +1 -1
  87. package/dist-types/core/memoize.d.ts.map +1 -1
  88. package/dist-types/decorator/decorator-registry.d.ts +10 -1
  89. package/dist-types/decorator/decorator-registry.d.ts.map +1 -1
  90. package/dist-types/decorator/decorators/border-highlighting-decorator.d.ts +0 -4
  91. package/dist-types/decorator/decorators/border-highlighting-decorator.d.ts.map +1 -1
  92. package/dist-types/decorator/decorators/bouncing-arrow-decorator.d.ts +0 -3
  93. package/dist-types/decorator/decorators/bouncing-arrow-decorator.d.ts.map +1 -1
  94. package/dist-types/diagnostics/contract-inspector.d.ts +9 -2
  95. package/dist-types/diagnostics/contract-inspector.d.ts.map +1 -1
  96. package/dist-types/diagnostics/data-lag-tracker.d.ts +31 -25
  97. package/dist-types/diagnostics/data-lag-tracker.d.ts.map +1 -1
  98. package/dist-types/diagnostics/inspector.d.ts +136 -3
  99. package/dist-types/diagnostics/inspector.d.ts.map +1 -1
  100. package/dist-types/diagnostics/loading-overlay.d.ts +67 -10
  101. package/dist-types/diagnostics/loading-overlay.d.ts.map +1 -1
  102. package/dist-types/diagnostics/metrics.d.ts +10 -0
  103. package/dist-types/diagnostics/metrics.d.ts.map +1 -1
  104. package/dist-types/flow/auto-route.d.ts +36 -0
  105. package/dist-types/flow/auto-route.d.ts.map +1 -0
  106. package/dist-types/flow/capability-inference.d.ts +19 -0
  107. package/dist-types/flow/capability-inference.d.ts.map +1 -0
  108. package/dist-types/flow/face-anchors.d.ts +26 -0
  109. package/dist-types/flow/face-anchors.d.ts.map +1 -0
  110. package/dist-types/flow/flow-engine.d.ts +122 -0
  111. package/dist-types/flow/flow-engine.d.ts.map +1 -0
  112. package/dist-types/flow/flow-graph-coordinator.d.ts +80 -0
  113. package/dist-types/flow/flow-graph-coordinator.d.ts.map +1 -0
  114. package/dist-types/flow/flow-graph-validator.d.ts +33 -0
  115. package/dist-types/flow/flow-graph-validator.d.ts.map +1 -0
  116. package/dist-types/flow/flow-graph.d.ts +76 -0
  117. package/dist-types/flow/flow-graph.d.ts.map +1 -0
  118. package/dist-types/flow/flow-introspection.d.ts +36 -0
  119. package/dist-types/flow/flow-introspection.d.ts.map +1 -0
  120. package/dist-types/flow/flow-node.d.ts +69 -0
  121. package/dist-types/flow/flow-node.d.ts.map +1 -0
  122. package/dist-types/flow/flow-orientation-coordinator.d.ts +13 -0
  123. package/dist-types/flow/flow-orientation-coordinator.d.ts.map +1 -0
  124. package/dist-types/flow/flow-orientation.d.ts +42 -0
  125. package/dist-types/flow/flow-orientation.d.ts.map +1 -0
  126. package/dist-types/flow/flow-trace.d.ts +5 -0
  127. package/dist-types/flow/flow-trace.d.ts.map +1 -0
  128. package/dist-types/flow/index.d.ts +16 -0
  129. package/dist-types/flow/index.d.ts.map +1 -0
  130. package/dist-types/flow/segment-topology.d.ts +225 -0
  131. package/dist-types/flow/segment-topology.d.ts.map +1 -0
  132. package/dist-types/interfaces/event-handler.d.ts +40 -0
  133. package/dist-types/interfaces/event-handler.d.ts.map +1 -0
  134. package/dist-types/interfaces/index.d.ts +2 -0
  135. package/dist-types/interfaces/index.d.ts.map +1 -1
  136. package/dist-types/interfaces/providers.d.ts +7 -0
  137. package/dist-types/interfaces/providers.d.ts.map +1 -1
  138. package/dist-types/items/arrangement/centering-queue-strategy.d.ts +10 -0
  139. package/dist-types/items/arrangement/centering-queue-strategy.d.ts.map +1 -0
  140. package/dist-types/items/arrangement/index.d.ts +2 -0
  141. package/dist-types/items/arrangement/index.d.ts.map +1 -0
  142. package/dist-types/{transfer/container-capacity.d.ts → items/capacity-mixin.d.ts} +39 -78
  143. package/dist-types/items/capacity-mixin.d.ts.map +1 -0
  144. package/dist-types/items/capacity.d.ts +53 -0
  145. package/dist-types/items/capacity.d.ts.map +1 -0
  146. package/dist-types/items/index.d.ts +7 -0
  147. package/dist-types/items/index.d.ts.map +1 -0
  148. package/dist-types/items/items-data-binding.d.ts +103 -0
  149. package/dist-types/items/items-data-binding.d.ts.map +1 -0
  150. package/dist-types/items/slot-record.d.ts +23 -0
  151. package/dist-types/items/slot-record.d.ts.map +1 -0
  152. package/dist-types/items/stacking/index.d.ts +3 -0
  153. package/dist-types/items/stacking/index.d.ts.map +1 -0
  154. package/dist-types/items/stacking/stack-layout.d.ts +33 -0
  155. package/dist-types/items/stacking/stack-layout.d.ts.map +1 -0
  156. package/dist-types/items/stacking/stacking-strategy.d.ts +114 -0
  157. package/dist-types/items/stacking/stacking-strategy.d.ts.map +1 -0
  158. package/dist-types/layer/layer.d.ts +1 -0
  159. package/dist-types/layer/layer.d.ts.map +1 -1
  160. package/dist-types/layer/model-layer.d.ts +25 -2
  161. package/dist-types/layer/model-layer.d.ts.map +1 -1
  162. package/dist-types/layer/modeler/index.d.ts +1 -0
  163. package/dist-types/layer/modeler/index.d.ts.map +1 -1
  164. package/dist-types/layer/modeler/move-handle-icon.d.ts +2 -0
  165. package/dist-types/layer/modeler/move-handle-icon.d.ts.map +1 -0
  166. package/dist-types/layer/modeler/move-handle-modeler.d.ts +18 -0
  167. package/dist-types/layer/modeler/move-handle-modeler.d.ts.map +1 -0
  168. package/dist-types/layer/modeler/path-handler.d.ts.map +1 -1
  169. package/dist-types/layer/modeler/rotator.d.ts.map +1 -1
  170. package/dist-types/layer/modeling-layer.d.ts +19 -0
  171. package/dist-types/layer/modeling-layer.d.ts.map +1 -1
  172. package/dist-types/layer/selection-layer.d.ts +7 -0
  173. package/dist-types/layer/selection-layer.d.ts.map +1 -1
  174. package/dist-types/layer/snap-guide-layer.d.ts.map +1 -1
  175. package/dist-types/license/license.d.ts.map +1 -1
  176. package/dist-types/search/scene-search-engine.d.ts +0 -1
  177. package/dist-types/search/scene-search-engine.d.ts.map +1 -1
  178. package/dist-types/search/search-overlay.d.ts +0 -1
  179. package/dist-types/search/search-overlay.d.ts.map +1 -1
  180. package/dist-types/things-scene/api/clipboard.d.ts +1 -1
  181. package/dist-types/things-scene/api/clipboard.d.ts.map +1 -1
  182. package/dist-types/things-scene/api/listener.d.ts +1 -1
  183. package/dist-types/things-scene/api/listener.d.ts.map +1 -1
  184. package/dist-types/things-scene/api/to-data-url.d.ts +1 -1
  185. package/dist-types/things-scene/api/to-data-url.d.ts.map +1 -1
  186. package/dist-types/things-scene/api/zorder.d.ts +1 -1
  187. package/dist-types/things-scene/api/zorder.d.ts.map +1 -1
  188. package/dist-types/things-scene/application-context.d.ts +15 -2
  189. package/dist-types/things-scene/application-context.d.ts.map +1 -1
  190. package/dist-types/things-scene/create.d.ts +24 -0
  191. package/dist-types/things-scene/create.d.ts.map +1 -1
  192. package/dist-types/things-scene/index.d.ts +11 -5
  193. package/dist-types/things-scene/index.d.ts.map +1 -1
  194. package/dist-types/things-scene/scene.d.ts +89 -20
  195. package/dist-types/things-scene/scene.d.ts.map +1 -1
  196. package/dist-types/threed/common.d.ts +6 -1
  197. package/dist-types/threed/common.d.ts.map +1 -1
  198. package/dist-types/threed/factories/backdrop.d.ts +25 -18
  199. package/dist-types/threed/factories/backdrop.d.ts.map +1 -1
  200. package/dist-types/threed/factories/banner.d.ts +14 -9
  201. package/dist-types/threed/factories/banner.d.ts.map +1 -1
  202. package/dist-types/threed/factories/camera.d.ts +13 -9
  203. package/dist-types/threed/factories/camera.d.ts.map +1 -1
  204. package/dist-types/threed/factories/cube.d.ts +12 -9
  205. package/dist-types/threed/factories/cube.d.ts.map +1 -1
  206. package/dist-types/threed/factories/decal.d.ts +25 -20
  207. package/dist-types/threed/factories/decal.d.ts.map +1 -1
  208. package/dist-types/threed/factories/floor-plate.d.ts +1 -0
  209. package/dist-types/threed/factories/floor-plate.d.ts.map +1 -1
  210. package/dist-types/threed/factories/gltf-object.d.ts +24 -18
  211. package/dist-types/threed/factories/gltf-object.d.ts.map +1 -1
  212. package/dist-types/threed/factories/polygon.d.ts.map +1 -1
  213. package/dist-types/threed/factories/sprite.d.ts +12 -9
  214. package/dist-types/threed/factories/sprite.d.ts.map +1 -1
  215. package/dist-types/threed/factories/wall.d.ts +12 -9
  216. package/dist-types/threed/factories/wall.d.ts.map +1 -1
  217. package/dist-types/threed/handle-3d.d.ts.map +1 -1
  218. package/dist-types/threed/index.d.ts +6 -0
  219. package/dist-types/threed/index.d.ts.map +1 -1
  220. package/dist-types/threed/managers/event-manager3d.d.ts +6 -0
  221. package/dist-types/threed/managers/event-manager3d.d.ts.map +1 -1
  222. package/dist-types/threed/managers/gizmo-operation-manager.d.ts +0 -1
  223. package/dist-types/threed/managers/gizmo-operation-manager.d.ts.map +1 -1
  224. package/dist-types/threed/managers/vertex-gizmo-manager.d.ts +0 -1
  225. package/dist-types/threed/managers/vertex-gizmo-manager.d.ts.map +1 -1
  226. package/dist-types/threed/material-bank.d.ts +42 -0
  227. package/dist-types/threed/material-bank.d.ts.map +1 -0
  228. package/dist-types/threed/material-variant.d.ts +43 -0
  229. package/dist-types/threed/material-variant.d.ts.map +1 -0
  230. package/dist-types/threed/real-object-dom-element.d.ts +8 -0
  231. package/dist-types/threed/real-object-dom-element.d.ts.map +1 -1
  232. package/dist-types/threed/real-object-dom-texture.d.ts +0 -1
  233. package/dist-types/threed/real-object-dom-texture.d.ts.map +1 -1
  234. package/dist-types/threed/real-object-mesh.d.ts +0 -1
  235. package/dist-types/threed/real-object-mesh.d.ts.map +1 -1
  236. package/dist-types/threed/real-object-plane-2d.d.ts +0 -1
  237. package/dist-types/threed/real-object-plane-2d.d.ts.map +1 -1
  238. package/dist-types/threed/real-object-sprite.d.ts +0 -1
  239. package/dist-types/threed/real-object-sprite.d.ts.map +1 -1
  240. package/dist-types/threed/real-object-text.d.ts.map +1 -1
  241. package/dist-types/threed/real-object.d.ts +104 -3
  242. package/dist-types/threed/real-object.d.ts.map +1 -1
  243. package/dist-types/threed/texture/fillstyle-texture.d.ts +13 -2
  244. package/dist-types/threed/texture/fillstyle-texture.d.ts.map +1 -1
  245. package/dist-types/threed/three-capability.d.ts +2 -0
  246. package/dist-types/threed/three-capability.d.ts.map +1 -1
  247. package/dist-types/threed/threed-enabled.d.ts +5 -0
  248. package/dist-types/threed/threed-enabled.d.ts.map +1 -0
  249. package/dist-types/threed/utils/dispose.d.ts.map +1 -1
  250. package/dist-types/threed/utils/polygon-shape.d.ts +21 -0
  251. package/dist-types/threed/utils/polygon-shape.d.ts.map +1 -0
  252. package/dist-types/transfer/carrier-line-capability.d.ts +95 -0
  253. package/dist-types/transfer/carrier-line-capability.d.ts.map +1 -0
  254. package/dist-types/transfer/index.d.ts +13 -3
  255. package/dist-types/transfer/index.d.ts.map +1 -1
  256. package/dist-types/transfer/pickup-helpers.d.ts +11 -1
  257. package/dist-types/transfer/pickup-helpers.d.ts.map +1 -1
  258. package/dist-types/transfer/tracer.d.ts +35 -0
  259. package/dist-types/transfer/tracer.d.ts.map +1 -0
  260. package/dist-types/transfer/transfer-helpers.d.ts +18 -0
  261. package/dist-types/transfer/transfer-helpers.d.ts.map +1 -0
  262. package/dist-types/transfer/transfer.d.ts +132 -43
  263. package/dist-types/transfer/transfer.d.ts.map +1 -1
  264. package/dist-types/transfer/transferable-mixin.d.ts +275 -0
  265. package/dist-types/transfer/transferable-mixin.d.ts.map +1 -0
  266. package/dist-types/transfer/types.d.ts +75 -2
  267. package/dist-types/transfer/types.d.ts.map +1 -1
  268. package/dist-types/transition/transition-effect.d.ts +21 -1
  269. package/dist-types/transition/transition-effect.d.ts.map +1 -1
  270. package/dist-types/types/capability.d.ts +65 -0
  271. package/dist-types/types/capability.d.ts.map +1 -0
  272. package/package.json +2 -2
  273. package/things-scene-min.js +11 -11
  274. package/things-scene-min.js.map +1 -1
  275. package/things-scene-transfer.mjs +3 -2
  276. package/things-scene.mjs +3 -3
  277. package/things-scene.mjs.map +1 -1
  278. package/dist-types/transfer/container-capacity.d.ts.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transfer-helpers.d.ts","sourceRoot":"","sources":["../../src/transfer/transfer-helpers.ts"],"names":[],"mappings":"AASA,wBAAgB,eAAe,CAAC,OAAO,EAAE,GAAG;;;EAK3C;AAKD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,CAAC,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAChD,IAAI,CAUN;AAED,0EAA0E;AAC1E,eAAO,MAAM,iBAAiB,oBAAoB,CAAA"}
@@ -9,6 +9,30 @@ export interface TransferTimeline {
9
9
  handoffAt?: number;
10
10
  committedAt?: number;
11
11
  }
12
+ /**
13
+ * Transfer 의 negotiation / interaction 세부 trace. 각 contract method 호출 시점에
14
+ * Transfer.execute 가 기록 — 어떤 컴포넌트의 어떤 contract 가 호출되었고 결과가
15
+ * 무엇이었는지 시각화.
16
+ *
17
+ * role : 'source' | 'target' | 'carrier' | 'transfer'
18
+ * contract : 호출한 contract 이름 (e.g. 'canAccept', 'findSlot', 'accept', 'physical')
19
+ * componentId: 호출 대상 컴포넌트의 id
20
+ * componentType: 컴포넌트의 type
21
+ * atSimMs : sim time 기준 호출 시점
22
+ * args : 인자의 *serializable summary* (carrier id, slot id 등)
23
+ * result : 반환값의 *serializable summary* (ok / reason / slotId 등)
24
+ * error : throw 시 메시지
25
+ */
26
+ export interface TransferTraceEvent {
27
+ role: 'source' | 'target' | 'carrier' | 'transfer';
28
+ contract: string;
29
+ componentId?: string;
30
+ componentType?: string;
31
+ atSimMs: number;
32
+ args?: any;
33
+ result?: any;
34
+ error?: string;
35
+ }
12
36
  export interface TransferReceipt {
13
37
  transferId: string;
14
38
  source: any;
@@ -22,6 +46,14 @@ export interface TransferReceipt {
22
46
  timeline: TransferTimeline;
23
47
  slotId?: string;
24
48
  rejectReason?: string;
49
+ /** Phase G10 — negotiation / interaction trace events. */
50
+ traceEvents?: TransferTraceEvent[];
51
+ /**
52
+ * Phase G11 — open-ended metadata. physical phase 가 *target-specific* 정보를
53
+ * 기록 (예: sorter 의 carrierId, cross-belt-line 의 carrier index). panel 의
54
+ * 컬럼 등 진단 시각화에서 사용.
55
+ */
56
+ meta?: Record<string, unknown>;
25
57
  }
26
58
  /**
27
59
  * TransferReceipt 의 직렬화 형태 — live ref 제외, ID 만. JSON.stringify 안전.
@@ -87,10 +119,52 @@ export declare class Transfer {
87
119
  private _phase;
88
120
  private _timeline;
89
121
  private _slot;
122
+ /** Phase 4c — 라이프사이클 예약(reserve→commit). null = 예약 미사용(capability-only/비-라이프사이클 target). */
123
+ private _reservation;
90
124
  private _rejectReason?;
125
+ private _traceEvents;
126
+ /**
127
+ * Phase G11 — target-specific metadata. physical phase 가 *sorter carrier
128
+ * index* 등 contract 외 진단 정보 기록. receipt 의 meta 로 시각화.
129
+ */
130
+ readonly meta: Record<string, unknown>;
91
131
  constructor(init: TransferInit);
132
+ /**
133
+ * Transfer trace 에 contract 호출 이벤트 push. Transfer.execute 가 명시 contract
134
+ * 호출 시 직접 사용 + FlowNode.receive 등 *내부 contract* 도 *current
135
+ * transfer* 의 trace 에 push 가능 (currentTransfer module-level singleton).
136
+ */
137
+ pushTrace(event: Omit<TransferTraceEvent, 'atSimMs'> & {
138
+ atSimMs?: number;
139
+ }): void;
92
140
  get phase(): TransferPhase;
93
141
  get timeline(): Readonly<TransferTimeline>;
142
+ /** rolled-back receipt 생성 (this._rejectReason 은 호출자가 먼저 설정). */
143
+ private _rollback;
144
+ /**
145
+ * planning(canAccept verdict → slot 결정) + reserve. 조기 거부 시 rolled-back
146
+ * receipt 를, 계속 진행이면 null 을 반환. this._slot / this._reservation 설정.
147
+ *
148
+ * 협상 분기는 "메서드 존재" 추측이 아니라 홀더가 선언한 slot 모델 유무(canAccept 의
149
+ * verdict)로 나뉜다. no-slots-defined = slot 식이 아님 → capability-only(handoff 의
150
+ * holder.receive 가 자체 게이트 책임). canReceive fallback 은 canAccept 미구현 최소 mock 용.
151
+ */
152
+ private _planAndReserve;
153
+ /** physical 실패 공통 처리 — 예약 롤백 + rolled-back receipt. */
154
+ private _physicalFailed;
155
+ /** handoff 실패 공통 처리 — rolled-back receipt 등록 후 throw(호출자 전파). */
156
+ private _handoffFailed;
157
+ /**
158
+ * handoff commit 분기 — 예약이 있으면 commit(원자 확정) 후 true. 예약 없으면 false
159
+ * (호출자가 receive fallback 담당). commit throw → 예약 롤백 + _handoffFailed(throw).
160
+ */
161
+ private _commitReserved;
162
+ /** committed receipt 생성. */
163
+ private _finishCommitted;
164
+ private _runPhysicalSync;
165
+ private _runPhysicalAsync;
166
+ private _runReceiveSync;
167
+ private _runReceiveAsync;
94
168
  /**
95
169
  * 5-phase 실행. 각 phase 진입 시 timeline 갱신, 완료 시 receipt 반환.
96
170
  *
@@ -99,6 +173,16 @@ export declare class Transfer {
99
173
  * Handoff 이후 throw 는 일관성 깨질 수 있으므로 그대로 propagate.
100
174
  */
101
175
  execute(): Promise<TransferReceipt>;
176
+ /**
177
+ * Sync 흐름 (= _tickLiveItems 매 frame iteration 안에서 dispatch) 전용 변형.
178
+ * physical / handoff 가 sync function 일 때만 동작 — async 면 *fire-and-forget*
179
+ * 으로 백그라운드 실행 (receipt 는 sync committed 표시).
180
+ *
181
+ * Async transfer 가 매 frame 동기 iteration 안에서 *sync 결과 필요* (= 박스 처리
182
+ * 끝 신호) 한 케이스. _tryDispatchToSorter / _ejectComponent 의 sync 흐름과 호환.
183
+ */
184
+ executeSync(): TransferReceipt;
185
+ private _executeImpl;
102
186
  /**
103
187
  * physical / planning 도중 외부 취소. handoff 이후엔 호출 금지 (이미 commit 됨).
104
188
  * 현재 구현은 phase 만 표시하고 carrier 의 상태는 건드리지 않음 — physical
@@ -112,56 +196,61 @@ export declare class Transfer {
112
196
  * Phase G7 — JSON snapshot/load 지원으로 외부 도구 (Chrome extension 등) 에서
113
197
  * 라이브 또는 저장된 로그를 동일하게 시각화할 수 있다.
114
198
  */
199
+ /**
200
+ * TransferLogImpl — Step 1 정공 (2026-06-20):
201
+ *
202
+ * Raw receipt 1000 보관 폐기 → aggregated O(1) maintain. 본체 runtime 은 raw 사용 0
203
+ * (모든 reader 는 diagnostics — extension/devtools RPC). 본체가 extension buffer 역할
204
+ * 하던 안티패턴 제거.
205
+ *
206
+ * raw 가 필요한 도구 (carrier 별 timeline 등) 는 `subscribe` 패턴으로 extension 측
207
+ * 자체 누적 (Step 7).
208
+ */
115
209
  declare class TransferLogImpl {
116
- private _entries;
117
- private _maxEntries;
210
+ private _flows;
211
+ private _targetCount;
212
+ private _byPhase;
213
+ private _byRejectReason;
214
+ private _total;
215
+ private _committedDurationSum;
216
+ private _committedCount;
118
217
  private _listeners;
119
218
  append(receipt: TransferReceipt): void;
120
- /** 모든 receipt 반환 (read-only 사본). */
121
- entries(): readonly TransferReceipt[];
122
- /** carrier transfer 이력. live ref 매칭 우선, fallback 으로 carrierId. */
123
- forCarrier(carrier: any): readonly TransferReceipt[];
124
- /** carrierId 직접 조회 (snapshot 복원 후 등 live ref 가 없을 때). */
125
- forCarrierId(carrierId: string): readonly TransferReceipt[];
126
- /** sourceId 로 조회 — 특정 vehicle / source 의 transfer 이력. */
127
- forSourceId(sourceId: string): readonly TransferReceipt[];
128
- /** targetId 로 조회 — 특정 holder 의 receive 이력. */
129
- forTargetId(targetId: string): readonly TransferReceipt[];
130
- /** phase 별 필터 (e.g. 'rolled-back' 만 — 실패 진단). */
131
- forPhase(phase: TransferPhase): readonly TransferReceipt[];
132
- /**
133
- * sim-time 범위로 필터. transfer 의 initiatedAt 이 [startSimMs, endSimMs] 안에 있는지.
134
- * 'overlap' 모드 — initiatedAt..committedAt 윈도우가 query 윈도우와 겹치면 포함.
135
- */
136
- inTimeRange(startSimMs: number, endSimMs: number, mode?: 'init' | 'overlap'): readonly TransferReceipt[];
137
- /** rejectReason 별 그룹화 — 실패 패턴 진단. */
138
- groupByRejectReason(): Map<string, readonly TransferReceipt[]>;
139
- /** 통계 — 전체 / phase 별 / 거부율 / 평균 transfer 시간 등. */
219
+ /** "src>tgt" committed transfer count. inspector.topologyStats 활용. */
220
+ flows(): ReadonlyMap<string, number>;
221
+ /** targetId 도착 count. distribution 계산 source. */
222
+ targetCounts(): ReadonlyMap<string, number>;
223
+ /** 통계 aggregated 기반 O(1). */
140
224
  stats(): TransferLogStats;
141
- /** receipt 마다 호출되는 listener 등록. */
225
+ /** rejectReason count aggregated O(1). */
226
+ rejectReasonCounts(): ReadonlyMap<string, number>;
227
+ /** 새 receipt 마다 호출되는 listener 등록. extension 측 raw 누적 path. */
142
228
  subscribe(listener: (receipt: TransferReceipt) => void): () => void;
143
229
  clear(): void;
144
- setMaxEntries(n: number): void;
145
- /**
146
- * 모든 receipt 를 JSON 안전한 plain object 배열로. live ref 제외, ID 만 포함.
147
- * JSON.stringify(transferLog.toJSON()) 안전.
148
- */
230
+ /** @deprecated raw entries 보관 폐기. extension 측 subscribe 패턴 사용. */
231
+ entries(): readonly TransferReceipt[];
232
+ /** @deprecated */
233
+ forCarrier(_carrier: any): readonly TransferReceipt[];
234
+ /** @deprecated */
235
+ forCarrierId(_carrierId: string): readonly TransferReceipt[];
236
+ /** @deprecated */
237
+ forSourceId(_sourceId: string): readonly TransferReceipt[];
238
+ /** @deprecated */
239
+ forTargetId(_targetId: string): readonly TransferReceipt[];
240
+ /** @deprecated */
241
+ forPhase(_phase: TransferPhase): readonly TransferReceipt[];
242
+ /** @deprecated */
243
+ inTimeRange(_startSimMs: number, _endSimMs: number, _mode?: 'init' | 'overlap'): readonly TransferReceipt[];
244
+ /** @deprecated raw entries 폐기. rejectReasonCounts() 사용. */
245
+ groupByRejectReason(): Map<string, readonly TransferReceipt[]>;
246
+ /** @deprecated raw 보관 폐기 — toJSON 빈 array. */
149
247
  toJSON(): TransferReceiptJSON[];
150
- /**
151
- * JSON 배열에서 entries 복원 (기존 entries 대체). 외부 viewer (extension) 가
152
- * 저장된 로그를 로드해서 시각화할 사용.
153
- *
154
- * 복원된 receipt source/target/carrier live ref 가 undefined — ID 만으로
155
- * 추적 (forCarrierId, sourceId, targetId 등). listener 에는 알림 안 함 (load
156
- * 는 silent).
157
- */
158
- fromJSON(json: TransferReceiptJSON[]): void;
159
- /**
160
- * 저장된 로그를 listener 에게 순서대로 다시 발화 — extension 이 세션 시작 시
161
- * 기존 entries 도 받고 싶을 때. listener 가 새 receipt 와 replayed receipt 를
162
- * 구분 못 하므로 호출자가 의도적으로 사용.
163
- */
164
- replayTo(listener: (receipt: TransferReceipt) => void): void;
248
+ /** @deprecated raw 보관 폐기 — fromJSON noop. */
249
+ fromJSON(_json: TransferReceiptJSON[]): void;
250
+ /** @deprecated raw 보관 폐기 replayTo noop. */
251
+ replayTo(_listener: (receipt: TransferReceipt) => void): void;
252
+ /** @deprecated raw 보관 폐기 setMaxEntries noop. */
253
+ setMaxEntries(_n: number): void;
165
254
  }
166
255
  export declare const transferLog: TransferLogImpl;
167
256
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"transfer.d.ts","sourceRoot":"","sources":["../../src/transfer/transfer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transfer.d.ts","sourceRoot":"","sources":["../../src/transfer/transfer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,275 @@
1
+ import type { SlotDef, TransferOptions, Transferable as ITransferable, Reservation, SlotReservation } from './types.js';
2
+ import type Component from '../components/component.js';
3
+ type Constructor<T = object> = new (...args: any[]) => T;
4
+ /**
5
+ * Transferable (move) 믹스인. Capacity 위에 합성되어 receive/dispatch 를 제공.
6
+ */
7
+ export declare function Transferable<TBase extends Constructor<Component>>(Base: TBase): {
8
+ new (...args: any[]): {
9
+ /**
10
+ * 자리 잠정 확보 (Phase 4c 라이프사이클) — slot 노드는 findSlot 이 곧 예약.
11
+ * 순수: 점유는 _items 에서 live 파생되므로 별도 마킹 불필요(마크 side-effect 없음).
12
+ * null = 지금 받을 수 없음.
13
+ */
14
+ reserve(component: any, _ctx?: any): SlotReservation | null;
15
+ /** 예약 취소 — slot 노드는 마크가 없어 noop (idempotent). */
16
+ release(_reservation: Reservation): void;
17
+ receive(component: any, options?: TransferOptions): Promise<void>;
18
+ /**
19
+ * 예약 확정 (Phase 4c) — attach + 안착을 단일 원자 setState 로 적용. Phase G 불변 보존.
20
+ * reserve 로 확보한 slot 에 carrier 를 reparent + 6DOF 안착.
21
+ */
22
+ commit(reservation: SlotReservation, component: any, options?: TransferOptions): void;
23
+ dispatch(component: any, target: ITransferable, options?: TransferOptions): Promise<void>;
24
+ route(_component: any): ITransferable | null | Promise<ITransferable | null>;
25
+ /** WCS resolves a pending route. Override in BeltContainer / WheelSorter. */
26
+ resolveRoute(_component: any, _target: ITransferable): void;
27
+ /** WCS rejects or times out a pending route. */
28
+ rejectRoute(component: any, reason?: string): void;
29
+ /**
30
+ * canReceive 의 풍부한 버전. ok 면 slot 동봉, 아니면 reason 명시 (drag-over UI 용).
31
+ */
32
+ canAccept(component: any): {
33
+ ok: true;
34
+ slot: SlotDef;
35
+ } | {
36
+ ok: false;
37
+ reason: string;
38
+ };
39
+ /** receive 의 alias — Phase G2 contract 의 명시적 이름. */
40
+ accept(component: any, options?: TransferOptions): Promise<void>;
41
+ _app: any;
42
+ _model: any;
43
+ _state: any;
44
+ _delta: any;
45
+ _animation: any;
46
+ _animate: any;
47
+ _parent: any;
48
+ _disposed: any;
49
+ _textHidden: any;
50
+ _text_substitutor: any;
51
+ _value_substitutor: any;
52
+ _mappings: any;
53
+ _realObject: import("../index.js").IRealObject | undefined;
54
+ _cachedState: any;
55
+ updatedAt: any;
56
+ fontSize: any;
57
+ __cache__: any;
58
+ created(): void;
59
+ added(parent: import("../types/component.js").Container): void;
60
+ removed(parent: import("../types/component.js").Container): void;
61
+ ready(): Promise<void>;
62
+ _readyInvoked: boolean;
63
+ invokeReady(): void | Promise<void>;
64
+ touch(): void;
65
+ clearCache(...attrs: string[]): void;
66
+ removeSelf(completely?: boolean): void;
67
+ resetAnimation(): void;
68
+ dispose(): void;
69
+ get nature(): import("../index.js").ComponentNature;
70
+ get disposed(): boolean;
71
+ isLayer(): boolean;
72
+ isGroup(): boolean;
73
+ isContainer(): this is import("../types/component.js").Container;
74
+ isLine(): boolean;
75
+ isRoot(): boolean;
76
+ isRootModel(): boolean;
77
+ is3dish(): boolean;
78
+ get is3dMode(): boolean;
79
+ isIn3DSpace(): boolean;
80
+ isTemplate(): boolean;
81
+ isHTMLElement(): boolean;
82
+ isConnectable(): boolean;
83
+ isIdentifiable(): boolean;
84
+ isPositionable(): boolean;
85
+ replaceRefids(replaceMap: Record<string, string>): void;
86
+ get(property: string): any;
87
+ set(props: any, propval?: any): any;
88
+ getState(property: string): any;
89
+ setState(props: Partial<import("../index.js").State> | string, propval?: any): any;
90
+ get model(): any;
91
+ get state(): import("../index.js").State;
92
+ get refid(): any;
93
+ get hierarchy(): any;
94
+ get volatile(): string[];
95
+ _applyProps(target: Record<string, any>, props: Record<string, any>, options: import("../components/component.js").ApplyPropsOptions): /*elided*/ any;
96
+ contains(x: number, y: number): boolean;
97
+ move(offset: {
98
+ x: number;
99
+ y: number;
100
+ }, ...args: boolean[]): void;
101
+ symmetryX(x?: number): void;
102
+ symmetryY(y: number): void;
103
+ adjustResize(bounds: import("../index.js").BOUNDS, origin_bounds: import("../index.js").BOUNDS, diagonal: boolean): {
104
+ left: any;
105
+ top: any;
106
+ width: any;
107
+ height: any;
108
+ };
109
+ adjustRotation(rotation: number, step: boolean): number;
110
+ outline(progress: number): any;
111
+ get bounds(): import("../index.js").BOUNDS;
112
+ set bounds(b: import("../index.js").BOUNDS);
113
+ get center(): import("../index.js").POINT;
114
+ set center(p: import("../index.js").POINT);
115
+ get location(): import("../index.js").POINT;
116
+ set location(l: import("../index.js").POINT);
117
+ get rotate(): import("../index.js").POINT;
118
+ set rotate(r: import("../index.js").POINT);
119
+ get dimension(): import("../index.js").DIMENSION;
120
+ set dimension(d: import("../index.js").DIMENSION);
121
+ get path(): import("../index.js").POINT[];
122
+ set path(p: import("../index.js").POINT[]);
123
+ get drawPath(): import("../index.js").POINT[];
124
+ get rotatePoint(): import("../index.js").POINT;
125
+ get mutable(): boolean;
126
+ get resizable(): boolean;
127
+ get rotatable(): boolean;
128
+ buildRealObject(): import("../index.js").IRealObject | undefined;
129
+ get realObject(): import("../index.js").IRealObject | undefined;
130
+ draw(context?: import("../index.js").SceneRenderContext): void;
131
+ prerender(context: import("../index.js").SceneRenderContext): void;
132
+ render(context: import("../index.js").SceneRenderContext): void;
133
+ postrender(context: import("../index.js").SceneRenderContext): void;
134
+ prepare(resolve: (component: Component) => void, reject: (reason: any) => void): void;
135
+ prepareIf(condition: boolean): void;
136
+ drawText(context: import("../index.js").SceneRenderContext): void;
137
+ drawStroke(context: import("../index.js").SceneRenderContext, override?: Record<string, unknown>): void;
138
+ drawFill(context: import("../index.js").SceneRenderContext, override?: Record<string, unknown>): void;
139
+ get strokeStyle(): any;
140
+ set strokeStyle(v: any);
141
+ get fillStyle(): any;
142
+ set fillStyle(v: any);
143
+ get fontColor(): string;
144
+ set fontColor(v: string);
145
+ get rotation(): number;
146
+ set rotation(v: number);
147
+ get decorators(): string[];
148
+ get decotag(): string;
149
+ get hidden(): boolean;
150
+ set hidden(v: boolean);
151
+ get tag(): string;
152
+ set tag(v: string);
153
+ get appendum(): any;
154
+ set appendum(v: any);
155
+ defaultTextSubstitutor(): string;
156
+ textLines(context?: import("../index.js").SceneRenderContext): any[][];
157
+ get font(): string;
158
+ get lineHeight(): number;
159
+ get textSubstitutor(): () => string;
160
+ get text(): string;
161
+ set text(v: string);
162
+ get textBounds(): import("../index.js").BOUNDS;
163
+ get textRotation(): number;
164
+ get textHidden(): boolean;
165
+ set textHidden(v: boolean);
166
+ get hasTextProperty(): boolean;
167
+ animate(opts: import("../index.js").AnimationConfig): any;
168
+ effect(context: import("../index.js").SceneRenderContext, model: any): void;
169
+ serialize(...others: any[]): string;
170
+ trim(): void;
171
+ closeScene(data: any): void;
172
+ delta(attr?: string | object, value?: any): any;
173
+ invalidate(): void;
174
+ get value(): any;
175
+ set value(v: any);
176
+ get data(): any;
177
+ set data(v: any);
178
+ set tap(v: any);
179
+ get mappings(): any[];
180
+ get retention(): number;
181
+ get animation(): import("../index.js").AnimationController | undefined;
182
+ get started(): boolean;
183
+ set started(v: boolean);
184
+ get controls(): import("../index.js").Control[] | undefined;
185
+ findFirst(finder: string | ((c: Component) => boolean), ...others: any[]): Component | undefined;
186
+ findAll(s: string | ((c: Component) => boolean), ...others: any[]): any[] | undefined;
187
+ capture(x: number, y: number, except?: (c: Component) => boolean): any;
188
+ findAnchor(name: string): any;
189
+ isDescendible(container: Component | any): boolean;
190
+ getContext(component?: unknown): any;
191
+ get root(): Component;
192
+ get rootModel(): Component;
193
+ get parent(): Component;
194
+ set parent(v: Component);
195
+ get anchors(): import("../index.js").Anchor[];
196
+ get scalable(): boolean;
197
+ get stuck(): boolean;
198
+ get capturable(): boolean;
199
+ get position(): string;
200
+ get origin(): string;
201
+ get offset(): import("../index.js").POINT;
202
+ get app(): import("../index.js").ApplicationContext;
203
+ drawEffect(context: import("../index.js").SceneRenderContext): void;
204
+ prepareFill(resolve: Function, reject: Function): void;
205
+ prepareFillIf(condition: boolean): void;
206
+ onchangeFill(after: Record<string, any>, before: Record<string, any>): void;
207
+ drawImage(context: import("../index.js").SceneRenderContext, image: HTMLImageElement, left: number, top: number, width: number, height: number): void;
208
+ mutateBounds(logic: ((bounds: import("../index.js").BOUNDS) => import("../index.js").BOUNDS | void) | null, context?: any): void;
209
+ mutatePath(beforeLogic: ((path: import("../index.js").POINT[]) => import("../index.js").POINT[] | void) | null, afterLogic: ((path: import("../index.js").POINT[]) => import("../index.js").POINT[] | void) | null, context?: any): void;
210
+ access(accessor: string): any;
211
+ substitute(template: string, data: any): string | undefined;
212
+ onchangeMappings(after: Record<string, any>, before: Record<string, any>): void;
213
+ onchangeData(after: Record<string, any>, before: Record<string, any>): void;
214
+ buildMappings(): void;
215
+ executeMappings(force?: boolean): void;
216
+ disposeMappings(): void;
217
+ ondropfile(transfered: FileList, files: string[]): void;
218
+ transcoordS2P(x: number, y: number, rp?: import("../index.js").POINT): import("../index.js").POINT;
219
+ transcoordP2S(x: number, y: number, rp?: import("../index.js").POINT): import("../index.js").POINT;
220
+ transcoordS2T(x: number, y: number, top?: Component): import("../index.js").POINT;
221
+ transcoordT2P(x: number, y: number, top?: Component): import("../index.js").POINT;
222
+ transcoordT2S(x: number, y: number, top?: Component): import("../index.js").POINT;
223
+ transcoordS2TR(x: number, y: number, top?: Component): import("../index.js").POINT;
224
+ transcoordS2O(x: number, y: number, target: Component): import("../index.js").POINT;
225
+ transcoordC2S(x: number, y: number, top?: Component): import("../index.js").POINT;
226
+ transcoordS2C(x: number, y: number, top?: Component): import("../index.js").POINT;
227
+ toParent(x: number, y: number, rp?: import("../index.js").POINT): import("../index.js").POINT;
228
+ fromParent(x: number, y: number, rp?: import("../index.js").POINT): import("../index.js").POINT;
229
+ toScene(x: number, y: number, top?: Component): import("../index.js").POINT;
230
+ fromScene(x: number, y: number, top?: Component): import("../index.js").POINT;
231
+ toLocal(x: number, y: number, top?: Component): import("../index.js").POINT;
232
+ toGlobal(x: number, y: number, top?: Component): import("../index.js").POINT;
233
+ toOther(x: number, y: number, target: Component): import("../index.js").POINT;
234
+ on<K extends keyof import("../index.js").ComponentEventMap>(name: K, callback: (...args: import("../index.js").ComponentEventMap[K]) => void, context?: any): /*elided*/ any;
235
+ on(name: string | object, callback: Function, context?: any): /*elided*/ any;
236
+ off<K extends keyof import("../index.js").ComponentEventMap>(name: K, callback?: ((...args: import("../index.js").ComponentEventMap[K]) => void) | undefined, context?: any): /*elided*/ any;
237
+ off(name?: string | object, callback?: Function, context?: any): /*elided*/ any;
238
+ once<K extends keyof import("../index.js").ComponentEventMap>(name: K, callback: (...args: import("../index.js").ComponentEventMap[K]) => void, context?: any): /*elided*/ any;
239
+ once(name: string | object, callback: Function, context?: any): /*elided*/ any;
240
+ trigger<K extends keyof import("../index.js").ComponentEventMap>(name: K, ...args: import("../index.js").ComponentEventMap[K]): /*elided*/ any;
241
+ trigger(name: string, ...args: any[]): /*elided*/ any;
242
+ delegate_on(delegator: any): /*elided*/ any;
243
+ delegate_off(delegator: any): /*elided*/ any;
244
+ onchange(after: Record<string, any>, before: Record<string, any>): void;
245
+ calculateBounds?(): void;
246
+ oncreate_element?(element: HTMLElement): void;
247
+ removeComponent(component: Component, ghost?: boolean): void;
248
+ addComponent(component: Component, ghost?: boolean): void;
249
+ insertComponentAt(component: Component, index: number, ghost?: boolean): void;
250
+ getOverlay(component: Component): HTMLElement | undefined;
251
+ findById(id: string): Component | undefined;
252
+ findByRefid(ref: string | number): Component | undefined;
253
+ findAllById(id: string): Component[];
254
+ resize(): void;
255
+ fit(type?: string): void;
256
+ get components(): Component[] | undefined;
257
+ get layout(): any;
258
+ get auxOverlay(): HTMLElement | undefined;
259
+ get isReady(): boolean;
260
+ get unitScale(): number;
261
+ get selected(): Component[];
262
+ set selected(_v: Component[]);
263
+ get focused(): Component | null;
264
+ set focused(_v: Component | null);
265
+ get hasSameParentForAllSelected(): boolean;
266
+ set hasSameParentForAllSelected(_v: boolean);
267
+ get fitMode(): string | undefined;
268
+ set fitMode(_v: string | undefined);
269
+ get element(): HTMLElement | null;
270
+ set element(_v: HTMLElement | null);
271
+ };
272
+ __hasTransferable: boolean;
273
+ } & TBase;
274
+ export {};
275
+ //# sourceMappingURL=transferable-mixin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transferable-mixin.d.ts","sourceRoot":"","sources":["../../src/transfer/transferable-mixin.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,YAAY,IAAI,aAAa,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AACvH,OAAO,KAAK,SAAS,MAAM,4BAA4B,CAAA;AAMvD,KAAK,WAAW,CAAC,CAAC,GAAG,MAAM,IAAI,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;AAExD;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,SAAS,WAAW,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,KAAK;kBALjC,GAAG,EAAE;QAU9C;;;;WAIG;2BACgB,GAAG,SAAS,GAAG,GAAG,eAAe,GAAG,IAAI;QAM3D,iDAAiD;8BAC3B,WAAW,GAAG,IAAI;2BAIf,GAAG,YAAW,eAAe,GAAQ,OAAO,CAAC,IAAI,CAAC;QAsB3E;;;WAGG;4BACiB,eAAe,aAAa,GAAG,YAAW,eAAe,GAAQ,IAAI;4BA8H/D,GAAG,UAAU,aAAa,YAAW,eAAe,GAAQ,OAAO,CAAC,IAAI,CAAC;0BAiCjF,GAAG,GAAG,aAAa,GAAG,IAAI,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;QAI5E,6EAA6E;iCACpD,GAAG,WAAW,aAAa,GAAG,IAAI;QAI3D,gDAAgD;+BACzB,GAAG,oBAAwB,IAAI;QAStD;;WAEG;6BACkB,GAAG,GAAG;YAAE,EAAE,EAAE,IAAI,CAAC;YAAC,IAAI,EAAE,OAAO,CAAA;SAAE,GAAG;YAAE,EAAE,EAAE,KAAK,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE;QAuBtF,oDAAoD;0BAClC,GAAG,YAAY,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAInE"}
@@ -133,8 +133,20 @@ export interface PoseSerialized {
133
133
  export interface PickupFrame {
134
134
  id: string;
135
135
  toolType: string;
136
+ /** 도구가 결합 직전 hover 하는 world 자세 (motion 목표). */
136
137
  approach: PoseSerialized;
138
+ /** 도구가 결합(grab)하는 world 자세 — carrier 에 닿는 지점 (fork 가 구멍 진입 등). */
137
139
  engage: PoseSerialized;
140
+ /**
141
+ * *운반 중* carrier 가 도구에 실리는 관계 (선택). approach/engage 가 *도구의 world
142
+ * 이동 목표* 인 반면, mount 는 *carrier-LOCAL* 자세 — carrier 의 어느 지점(하중면)이
143
+ * 도구의 carry attach point 에 오는지. grab(engage) 과 carried(mount) 는 다르다:
144
+ * fork 는 구멍(engage)으로 들어가 *상판 아래면*(mount)으로 실리고, deck 는 밑(engage)
145
+ * 에서 *바닥*(mount)으로, vacuum 은 상단으로 매달린다. 미지정 시 도구 default(carrier
146
+ * 바닥이 attach 에 = 얹기). **랙/평치 *보관* 은 이 mount 가 아니라 seating(placementFor)
147
+ * 이 담당 — mount 는 pickup 도구 운반 전용.**
148
+ */
149
+ mount?: PoseSerialized;
138
150
  tolerance?: {
139
151
  positionMm?: number;
140
152
  angleDeg?: number;
@@ -185,6 +197,45 @@ export interface ArrangementStrategy {
185
197
  /** Maximum number of items this strategy can hold in one slot. */
186
198
  capacity(slotDef: SlotDef): number;
187
199
  }
200
+ /** 안착 산술의 carrier 입력 — 치수만. width/height = 2D footprint, depth = 3D 높이. */
201
+ export interface CarrierDims {
202
+ width: number;
203
+ height: number;
204
+ depth: number;
205
+ }
206
+ /** placementFor 의 ctx — 모두 선택. 미지정 시 holder 가 현재 점유 기준 기본값 결정. */
207
+ export interface PlacementContext {
208
+ /** 대상 slot — 미지정 시 첫 가용 slot. */
209
+ slot?: SlotDef;
210
+ /** ArrangementStrategy 위임용 점유 index — 미지정 시 현재 점유 수. */
211
+ index?: number;
212
+ /** 점유 총원 — 미지정 시 index 와 동일 (receive 의 호출 형태 미러). */
213
+ occupantCount?: number;
214
+ /** line / slide 형 holder 의 경로 진행도 [0, 1]. */
215
+ t?: number;
216
+ }
217
+ /** 안착 pose — holder RealObject object3d local frame. */
218
+ export interface SeatingPose {
219
+ /** carrier *중심* 위치 (holder object3d local). */
220
+ position: Vec3;
221
+ /** holder-local 자세. undefined = carrier 의 들어오는 자세 보존. */
222
+ rotation?: QuatLike;
223
+ }
224
+ /**
225
+ * 수용 예약 — `reserve()` 가 발급, `commit()`/`release()` 가 소비하는 opaque token.
226
+ *
227
+ * 모든 핸드오버는 동일한 트랜잭션 라이프사이클(canReceive → reserve → commit → release)을
228
+ * 갖는다. slot 노드는 reserve/commit 이 원자로 붕괴한 degenerate 케이스(자리가 정지),
229
+ * CarrierLine 은 그 라이프사이클이 시간축으로 펼쳐진 원형(빈 캐리어가 움직임). 예약 자체는
230
+ * opaque — 발급한 구현만 내부 필드를 해석한다.
231
+ */
232
+ export interface Reservation {
233
+ readonly token: symbol;
234
+ }
235
+ /** slot 노드의 예약 — 확보된 slot 을 동봉. */
236
+ export interface SlotReservation extends Reservation {
237
+ readonly slot: SlotDef;
238
+ }
188
239
  /**
189
240
  * The central abstraction for anything that can receive and dispatch components.
190
241
  *
@@ -195,14 +246,25 @@ export interface ArrangementStrategy {
195
246
  */
196
247
  export interface Transferable {
197
248
  /**
198
- * Pure, synchronous capacity check.
249
+ * Pure, synchronous capacity check — "이 item 을 받을 수 있나?"
199
250
  * Must NOT mutate state — called on every drag-over frame.
251
+ *
252
+ * ctx.slotId 를 주면 *특정 slot* 에 받을 수 있는지, 없으면 *아무 slot이나* 가능한지.
253
+ * (위치는 이 보편 게이트의 매개변수 — 별도 canReceiveAt 방언을 두지 않는다. Phase 3 #4.)
200
254
  */
201
- canReceive(component: any): boolean;
255
+ canReceive(component: any, ctx?: {
256
+ slotId?: string;
257
+ }): boolean;
202
258
  /** Returns the best available SlotDef for `component`, or null if none. */
203
259
  findSlot(component: any): SlotDef | null;
204
260
  /** Reparent `component` into this container. Fires 'transfer-received'. */
205
261
  receive(component: any, options?: TransferOptions): Promise<void> | void;
262
+ /** 자리를 잠정 확보. null = 지금 받을 수 없음. 게이트 판정은 canReceive 가 담당(순수). */
263
+ reserve?(component: any, ctx?: any): Reservation | null;
264
+ /** 예약을 원자적으로 확정 — attach + 안착(단일 setState). 실패 시 throw. */
265
+ commit?(reservation: Reservation, component: any, options?: TransferOptions): void;
266
+ /** 예약 취소 — 마크 해제. idempotent. commit 후 호출 시 noop. */
267
+ release?(reservation: Reservation): void;
206
268
  /** Move `component` to `target.receive()`. Fires 'transfer-dispatched'. */
207
269
  dispatch(component: any, target: Transferable, options?: TransferOptions): Promise<void> | void;
208
270
  /**
@@ -223,6 +285,17 @@ export interface Transferable {
223
285
  rejectRoute(component: any, reason?: string): void;
224
286
  /** Returns the 3D attach frame for a payload held in this container. */
225
287
  attachPointFor(component: any): CarrierAttachPoint | null;
288
+ /**
289
+ * Phase PS — carrier 가 이 holder 의 ctx 지점에 안착할 때의 pose.
290
+ * holder RealObject object3d local frame, 순수 함수. null = 이 ctx 에 안착
291
+ * 정의 없음 (호출자가 현재 위치 보존 fallback).
292
+ *
293
+ * `carrier` 는 치수 객체 또는 component (state.width/height/depth 보유) —
294
+ * component 를 주면 dimension-aware ArrangementStrategy 가 그대로 활용.
295
+ * 기본 구현은 FlowNode 가 제공 (기존 receivingSurfaceY +
296
+ * ArrangementStrategy + acceptanceRotation 합성과 수치 동일 — I5).
297
+ */
298
+ placementFor?(carrier: CarrierDims | any, ctx?: PlacementContext): SeatingPose | null;
226
299
  /**
227
300
  * carrier 가 이 holder 안에서 가져야 할 회전 (parent-local quaternion).
228
301
  * 기본값 identity (carrier 의 들어오는 자세 보존).