@pascal-app/core 1.0.4 → 1.0.5

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 (866) hide show
  1. package/dist/agent-operations/__fixtures__/add-object-cases.d.ts +102 -90
  2. package/dist/agent-operations/__fixtures__/add-object-cases.d.ts.map +1 -1
  3. package/dist/agent-operations/__fixtures__/add-object-cases.js +301 -1
  4. package/dist/agent-operations/__fixtures__/add-stair-cases.d.ts +3 -0
  5. package/dist/agent-operations/__fixtures__/add-stair-cases.d.ts.map +1 -0
  6. package/dist/agent-operations/__fixtures__/add-stair-cases.js +176 -0
  7. package/dist/agent-operations/__fixtures__/build-room-cases.d.ts.map +1 -1
  8. package/dist/agent-operations/__fixtures__/build-room-cases.js +410 -40
  9. package/dist/agent-operations/__fixtures__/cases.d.ts +18 -3
  10. package/dist/agent-operations/__fixtures__/cases.d.ts.map +1 -1
  11. package/dist/agent-operations/__fixtures__/cases.js +183 -4
  12. package/dist/agent-operations/__fixtures__/corner-window-cases.d.ts +3 -0
  13. package/dist/agent-operations/__fixtures__/corner-window-cases.d.ts.map +1 -0
  14. package/dist/agent-operations/__fixtures__/corner-window-cases.js +155 -0
  15. package/dist/agent-operations/__fixtures__/design-brief-cases.d.ts +14 -0
  16. package/dist/agent-operations/__fixtures__/design-brief-cases.d.ts.map +1 -0
  17. package/dist/agent-operations/__fixtures__/design-brief-cases.js +709 -0
  18. package/dist/agent-operations/__fixtures__/finish-cases.d.ts +7 -0
  19. package/dist/agent-operations/__fixtures__/finish-cases.d.ts.map +1 -0
  20. package/dist/agent-operations/__fixtures__/finish-cases.js +758 -0
  21. package/dist/agent-operations/__fixtures__/lot-info-cases.d.ts +3 -0
  22. package/dist/agent-operations/__fixtures__/lot-info-cases.d.ts.map +1 -0
  23. package/dist/agent-operations/__fixtures__/lot-info-cases.js +370 -0
  24. package/dist/agent-operations/__fixtures__/merge-windows-cases.d.ts +3 -0
  25. package/dist/agent-operations/__fixtures__/merge-windows-cases.d.ts.map +1 -0
  26. package/dist/agent-operations/__fixtures__/merge-windows-cases.js +321 -0
  27. package/dist/agent-operations/__fixtures__/native-materials.d.ts +2237 -0
  28. package/dist/agent-operations/__fixtures__/native-materials.d.ts.map +1 -0
  29. package/dist/agent-operations/__fixtures__/native-materials.js +82 -0
  30. package/dist/agent-operations/__fixtures__/node-read-cases.d.ts +4 -0
  31. package/dist/agent-operations/__fixtures__/node-read-cases.d.ts.map +1 -0
  32. package/dist/agent-operations/__fixtures__/node-read-cases.js +639 -0
  33. package/dist/agent-operations/__fixtures__/notation-cases.d.ts +24 -0
  34. package/dist/agent-operations/__fixtures__/notation-cases.d.ts.map +1 -0
  35. package/dist/agent-operations/__fixtures__/notation-cases.js +356 -0
  36. package/dist/agent-operations/__fixtures__/place-items-cases.d.ts.map +1 -1
  37. package/dist/agent-operations/__fixtures__/place-items-cases.js +80 -2
  38. package/dist/agent-operations/__fixtures__/roof-bearing-cases.d.ts +19726 -0
  39. package/dist/agent-operations/__fixtures__/roof-bearing-cases.d.ts.map +1 -0
  40. package/dist/agent-operations/__fixtures__/roof-bearing-cases.js +106 -0
  41. package/dist/agent-operations/__fixtures__/roof-cases.d.ts +9 -0
  42. package/dist/agent-operations/__fixtures__/roof-cases.d.ts.map +1 -0
  43. package/dist/agent-operations/__fixtures__/roof-cases.js +382 -0
  44. package/dist/agent-operations/__fixtures__/room-cases.d.ts +2 -1
  45. package/dist/agent-operations/__fixtures__/room-cases.d.ts.map +1 -1
  46. package/dist/agent-operations/__fixtures__/room-cases.js +136 -1
  47. package/dist/agent-operations/__fixtures__/scene-check-cases.d.ts +4 -0
  48. package/dist/agent-operations/__fixtures__/scene-check-cases.d.ts.map +1 -0
  49. package/dist/agent-operations/__fixtures__/scene-check-cases.js +417 -0
  50. package/dist/agent-operations/__fixtures__/search-assets-cases.d.ts.map +1 -1
  51. package/dist/agent-operations/__fixtures__/search-assets-cases.js +15 -3
  52. package/dist/agent-operations/__fixtures__/site-cases.d.ts +290 -0
  53. package/dist/agent-operations/__fixtures__/site-cases.d.ts.map +1 -0
  54. package/dist/agent-operations/__fixtures__/site-cases.js +780 -0
  55. package/dist/agent-operations/__fixtures__/structure-cases.d.ts +1 -0
  56. package/dist/agent-operations/__fixtures__/structure-cases.d.ts.map +1 -1
  57. package/dist/agent-operations/__fixtures__/structure-cases.js +630 -3
  58. package/dist/agent-operations/__fixtures__/verify-scene-cases.d.ts +311 -1
  59. package/dist/agent-operations/__fixtures__/verify-scene-cases.d.ts.map +1 -1
  60. package/dist/agent-operations/__fixtures__/verify-scene-cases.js +59 -11
  61. package/dist/agent-operations/__fixtures__/view-assets-cases.d.ts +3 -0
  62. package/dist/agent-operations/__fixtures__/view-assets-cases.d.ts.map +1 -0
  63. package/dist/agent-operations/__fixtures__/view-assets-cases.js +155 -0
  64. package/dist/agent-operations/__fixtures__/view-scene-cases.d.ts +50 -0
  65. package/dist/agent-operations/__fixtures__/view-scene-cases.d.ts.map +1 -0
  66. package/dist/agent-operations/__fixtures__/view-scene-cases.js +425 -0
  67. package/dist/agent-operations/achieved.d.ts +5 -0
  68. package/dist/agent-operations/achieved.d.ts.map +1 -1
  69. package/dist/agent-operations/achieved.js +21 -1
  70. package/dist/agent-operations/add-column.d.ts.map +1 -1
  71. package/dist/agent-operations/add-column.js +3 -1
  72. package/dist/agent-operations/add-fence.d.ts +18 -0
  73. package/dist/agent-operations/add-fence.d.ts.map +1 -0
  74. package/dist/agent-operations/add-fence.js +48 -0
  75. package/dist/agent-operations/add-level.d.ts +4 -1
  76. package/dist/agent-operations/add-level.d.ts.map +1 -1
  77. package/dist/agent-operations/add-level.js +48 -12
  78. package/dist/agent-operations/add-object.d.ts +38 -9
  79. package/dist/agent-operations/add-object.d.ts.map +1 -1
  80. package/dist/agent-operations/add-object.js +172 -11
  81. package/dist/agent-operations/add-wall.d.ts +1 -3
  82. package/dist/agent-operations/add-wall.d.ts.map +1 -1
  83. package/dist/agent-operations/add-wall.js +35 -9
  84. package/dist/agent-operations/apply-changes.d.ts +7 -1
  85. package/dist/agent-operations/apply-changes.d.ts.map +1 -1
  86. package/dist/agent-operations/apply-changes.js +54 -22
  87. package/dist/agent-operations/apply-outcome.d.ts +6 -0
  88. package/dist/agent-operations/apply-outcome.d.ts.map +1 -1
  89. package/dist/agent-operations/apply-outcome.js +23 -8
  90. package/dist/agent-operations/asset-views.d.ts +75 -0
  91. package/dist/agent-operations/asset-views.d.ts.map +1 -0
  92. package/dist/agent-operations/asset-views.js +234 -0
  93. package/dist/agent-operations/author-scene.d.ts +157 -0
  94. package/dist/agent-operations/author-scene.d.ts.map +1 -0
  95. package/dist/agent-operations/author-scene.js +1076 -0
  96. package/dist/agent-operations/authored-scene-merge.d.ts +4 -0
  97. package/dist/agent-operations/authored-scene-merge.d.ts.map +1 -0
  98. package/dist/agent-operations/authored-scene-merge.js +96 -0
  99. package/dist/agent-operations/batch.d.ts +22 -0
  100. package/dist/agent-operations/batch.d.ts.map +1 -0
  101. package/dist/agent-operations/batch.js +104 -0
  102. package/dist/agent-operations/ceiling-object-observations.d.ts +31 -0
  103. package/dist/agent-operations/ceiling-object-observations.d.ts.map +1 -0
  104. package/dist/agent-operations/ceiling-object-observations.js +111 -0
  105. package/dist/agent-operations/corner-window.d.ts +19 -0
  106. package/dist/agent-operations/corner-window.d.ts.map +1 -0
  107. package/dist/agent-operations/corner-window.js +84 -0
  108. package/dist/agent-operations/create-roof.d.ts +32 -0
  109. package/dist/agent-operations/create-roof.d.ts.map +1 -0
  110. package/dist/agent-operations/create-roof.js +304 -0
  111. package/dist/agent-operations/create-room.d.ts +2 -0
  112. package/dist/agent-operations/create-room.d.ts.map +1 -1
  113. package/dist/agent-operations/create-room.js +73 -5
  114. package/dist/agent-operations/create-stair.d.ts +6 -28
  115. package/dist/agent-operations/create-stair.d.ts.map +1 -1
  116. package/dist/agent-operations/create-stair.js +187 -104
  117. package/dist/agent-operations/design-brief.d.ts +38 -0
  118. package/dist/agent-operations/design-brief.d.ts.map +1 -0
  119. package/dist/agent-operations/design-brief.js +300 -0
  120. package/dist/agent-operations/designs.d.ts +24 -0
  121. package/dist/agent-operations/designs.d.ts.map +1 -0
  122. package/dist/agent-operations/designs.js +48 -0
  123. package/dist/agent-operations/door-clearance.d.ts +16 -1
  124. package/dist/agent-operations/door-clearance.d.ts.map +1 -1
  125. package/dist/agent-operations/door-clearance.js +61 -4
  126. package/dist/agent-operations/duplicate-level.d.ts.map +1 -1
  127. package/dist/agent-operations/duplicate-level.js +2 -1
  128. package/dist/agent-operations/find-by-type.d.ts +14 -7
  129. package/dist/agent-operations/find-by-type.d.ts.map +1 -1
  130. package/dist/agent-operations/find-by-type.js +266 -43
  131. package/dist/agent-operations/furnish-room.d.ts +22 -1
  132. package/dist/agent-operations/furnish-room.d.ts.map +1 -1
  133. package/dist/agent-operations/furnish-room.js +66 -19
  134. package/dist/agent-operations/furniture-kind.d.ts +22 -0
  135. package/dist/agent-operations/furniture-kind.d.ts.map +1 -0
  136. package/dist/agent-operations/furniture-kind.js +69 -0
  137. package/dist/agent-operations/get-node.d.ts +5 -2
  138. package/dist/agent-operations/get-node.d.ts.map +1 -1
  139. package/dist/agent-operations/get-node.js +82 -10
  140. package/dist/agent-operations/hosted-services.d.ts +2 -1
  141. package/dist/agent-operations/hosted-services.d.ts.map +1 -1
  142. package/dist/agent-operations/index.d.ts +281 -69
  143. package/dist/agent-operations/index.d.ts.map +1 -1
  144. package/dist/agent-operations/index.js +66 -5
  145. package/dist/agent-operations/item-space.d.ts +22 -0
  146. package/dist/agent-operations/item-space.d.ts.map +1 -0
  147. package/dist/agent-operations/item-space.js +69 -0
  148. package/dist/agent-operations/layout-clearance.d.ts +52 -3
  149. package/dist/agent-operations/layout-clearance.d.ts.map +1 -1
  150. package/dist/agent-operations/layout-clearance.js +340 -30
  151. package/dist/agent-operations/level-height-fill.d.ts +12 -0
  152. package/dist/agent-operations/level-height-fill.d.ts.map +1 -0
  153. package/dist/agent-operations/level-height-fill.js +59 -0
  154. package/dist/agent-operations/level-reads.d.ts +5 -1
  155. package/dist/agent-operations/level-reads.d.ts.map +1 -1
  156. package/dist/agent-operations/level-reads.js +10 -3
  157. package/dist/agent-operations/list-levels.d.ts.map +1 -1
  158. package/dist/agent-operations/list-levels.js +23 -0
  159. package/dist/agent-operations/material-preset.d.ts.map +1 -1
  160. package/dist/agent-operations/material-preset.js +3 -9
  161. package/dist/agent-operations/material-refs.d.ts +7 -1
  162. package/dist/agent-operations/material-refs.d.ts.map +1 -1
  163. package/dist/agent-operations/material-refs.js +10 -5
  164. package/dist/agent-operations/merge-windows.d.ts +6 -0
  165. package/dist/agent-operations/merge-windows.d.ts.map +1 -0
  166. package/dist/agent-operations/merge-windows.js +27 -0
  167. package/dist/agent-operations/move-roofs.d.ts +9 -0
  168. package/dist/agent-operations/move-roofs.d.ts.map +1 -0
  169. package/dist/agent-operations/move-roofs.js +29 -0
  170. package/dist/agent-operations/paint.d.ts +2 -1
  171. package/dist/agent-operations/paint.d.ts.map +1 -1
  172. package/dist/agent-operations/paint.js +163 -53
  173. package/dist/agent-operations/photo-elevation.d.ts +155 -0
  174. package/dist/agent-operations/photo-elevation.d.ts.map +1 -0
  175. package/dist/agent-operations/photo-elevation.js +761 -0
  176. package/dist/agent-operations/place-in-room.d.ts +29 -0
  177. package/dist/agent-operations/place-in-room.d.ts.map +1 -0
  178. package/dist/agent-operations/place-in-room.js +403 -0
  179. package/dist/agent-operations/place-items.d.ts.map +1 -1
  180. package/dist/agent-operations/place-items.js +15 -2
  181. package/dist/agent-operations/plan-geometry.d.ts.map +1 -1
  182. package/dist/agent-operations/plan-geometry.js +3 -0
  183. package/dist/agent-operations/point-context.d.ts +139 -0
  184. package/dist/agent-operations/point-context.d.ts.map +1 -0
  185. package/dist/agent-operations/point-context.js +1 -0
  186. package/dist/agent-operations/project-files.d.ts +9 -0
  187. package/dist/agent-operations/project-files.d.ts.map +1 -0
  188. package/dist/agent-operations/project-files.js +25 -0
  189. package/dist/agent-operations/record-made.d.ts +18 -0
  190. package/dist/agent-operations/record-made.d.ts.map +1 -0
  191. package/dist/agent-operations/record-made.js +28 -0
  192. package/dist/agent-operations/roof-footprint.d.ts +24 -0
  193. package/dist/agent-operations/roof-footprint.d.ts.map +1 -0
  194. package/dist/agent-operations/roof-footprint.js +242 -0
  195. package/dist/agent-operations/roof-writes.d.ts +20 -0
  196. package/dist/agent-operations/roof-writes.d.ts.map +1 -0
  197. package/dist/agent-operations/roof-writes.js +165 -0
  198. package/dist/agent-operations/room-findings.d.ts +54 -0
  199. package/dist/agent-operations/room-findings.d.ts.map +1 -0
  200. package/dist/agent-operations/room-findings.js +143 -0
  201. package/dist/agent-operations/room-floor-script.d.ts +23 -0
  202. package/dist/agent-operations/room-floor-script.d.ts.map +1 -0
  203. package/dist/agent-operations/room-floor-script.js +54 -0
  204. package/dist/agent-operations/room-structure.d.ts +2 -2
  205. package/dist/agent-operations/room-structure.d.ts.map +1 -1
  206. package/dist/agent-operations/scene-checkpoint.d.ts +94 -0
  207. package/dist/agent-operations/scene-checkpoint.d.ts.map +1 -0
  208. package/dist/agent-operations/scene-checkpoint.js +176 -0
  209. package/dist/agent-operations/scene-queries.d.ts +3750 -3319
  210. package/dist/agent-operations/scene-queries.d.ts.map +1 -1
  211. package/dist/agent-operations/scene-queries.js +13 -23
  212. package/dist/agent-operations/scene-review.d.ts +52 -0
  213. package/dist/agent-operations/scene-review.d.ts.map +1 -0
  214. package/dist/agent-operations/scene-review.js +106 -0
  215. package/dist/agent-operations/scene-view.d.ts +82 -15
  216. package/dist/agent-operations/scene-view.d.ts.map +1 -1
  217. package/dist/agent-operations/scene-view.js +408 -51
  218. package/dist/agent-operations/search-assets.d.ts +2 -2
  219. package/dist/agent-operations/search-assets.d.ts.map +1 -1
  220. package/dist/agent-operations/search-assets.js +4 -3
  221. package/dist/agent-operations/search-materials.d.ts +9 -3
  222. package/dist/agent-operations/search-materials.d.ts.map +1 -1
  223. package/dist/agent-operations/search-materials.js +83 -29
  224. package/dist/agent-operations/set-checkpoint.d.ts +9 -0
  225. package/dist/agent-operations/set-checkpoint.d.ts.map +1 -0
  226. package/dist/agent-operations/set-checkpoint.js +31 -0
  227. package/dist/agent-operations/set-ground-level.d.ts +12 -0
  228. package/dist/agent-operations/set-ground-level.d.ts.map +1 -0
  229. package/dist/agent-operations/set-ground-level.js +61 -0
  230. package/dist/agent-operations/site.d.ts +21 -0
  231. package/dist/agent-operations/site.d.ts.map +1 -0
  232. package/dist/agent-operations/site.js +123 -0
  233. package/dist/agent-operations/types.d.ts +66 -7
  234. package/dist/agent-operations/types.d.ts.map +1 -1
  235. package/dist/agent-operations/verify-scene.d.ts +39 -5
  236. package/dist/agent-operations/verify-scene.d.ts.map +1 -1
  237. package/dist/agent-operations/verify-scene.js +223 -44
  238. package/dist/agent-operations/wall-face-script.d.ts +28 -0
  239. package/dist/agent-operations/wall-face-script.d.ts.map +1 -0
  240. package/dist/agent-operations/wall-face-script.js +62 -0
  241. package/dist/agent-operations/wall-object-observations.d.ts +41 -0
  242. package/dist/agent-operations/wall-object-observations.d.ts.map +1 -0
  243. package/dist/agent-operations/wall-object-observations.js +249 -0
  244. package/dist/agent-operations/wall-opening.d.ts +23 -23
  245. package/dist/agent-operations/wall-opening.d.ts.map +1 -1
  246. package/dist/agent-operations/wall-skirting.d.ts +24 -0
  247. package/dist/agent-operations/wall-skirting.d.ts.map +1 -0
  248. package/dist/agent-operations/wall-skirting.js +85 -0
  249. package/dist/agent-tools/add-object.d.ts +11 -7
  250. package/dist/agent-tools/add-object.d.ts.map +1 -1
  251. package/dist/agent-tools/add-object.js +17 -11
  252. package/dist/agent-tools/assets.d.ts +8 -0
  253. package/dist/agent-tools/assets.d.ts.map +1 -1
  254. package/dist/agent-tools/assets.js +13 -1
  255. package/dist/agent-tools/author-scene.d.ts +651 -0
  256. package/dist/agent-tools/author-scene.d.ts.map +1 -0
  257. package/dist/agent-tools/author-scene.js +252 -0
  258. package/dist/agent-tools/batch.d.ts +25 -0
  259. package/dist/agent-tools/batch.d.ts.map +1 -0
  260. package/dist/agent-tools/batch.js +61 -0
  261. package/dist/agent-tools/checkpoints.d.ts +13 -0
  262. package/dist/agent-tools/checkpoints.d.ts.map +1 -0
  263. package/dist/agent-tools/checkpoints.js +16 -0
  264. package/dist/agent-tools/clear-scene.d.ts.map +1 -1
  265. package/dist/agent-tools/collections.d.ts +6 -6
  266. package/dist/agent-tools/collections.d.ts.map +1 -1
  267. package/dist/agent-tools/columns.d.ts +18 -18
  268. package/dist/agent-tools/columns.js +2 -2
  269. package/dist/agent-tools/corner-window.d.ts +46 -0
  270. package/dist/agent-tools/corner-window.d.ts.map +1 -0
  271. package/dist/agent-tools/corner-window.js +47 -0
  272. package/dist/agent-tools/create-room.d.ts +26 -25
  273. package/dist/agent-tools/create-room.d.ts.map +1 -1
  274. package/dist/agent-tools/create-room.js +11 -4
  275. package/dist/agent-tools/design-brief.d.ts +408 -0
  276. package/dist/agent-tools/design-brief.d.ts.map +1 -0
  277. package/dist/agent-tools/design-brief.js +149 -0
  278. package/dist/agent-tools/designs.d.ts +34 -0
  279. package/dist/agent-tools/designs.d.ts.map +1 -0
  280. package/dist/agent-tools/designs.js +50 -0
  281. package/dist/agent-tools/fences.d.ts +28 -0
  282. package/dist/agent-tools/fences.d.ts.map +1 -0
  283. package/dist/agent-tools/fences.js +31 -0
  284. package/dist/agent-tools/find-by-type.d.ts +8 -1
  285. package/dist/agent-tools/find-by-type.d.ts.map +1 -1
  286. package/dist/agent-tools/find-by-type.js +23 -2
  287. package/dist/agent-tools/furnish-room.d.ts +10 -8
  288. package/dist/agent-tools/furnish-room.d.ts.map +1 -1
  289. package/dist/agent-tools/furnish-room.js +3 -1
  290. package/dist/agent-tools/hosted-services.d.ts +177 -141
  291. package/dist/agent-tools/hosted-services.d.ts.map +1 -1
  292. package/dist/agent-tools/hosted-services.js +47 -14
  293. package/dist/agent-tools/index.d.ts +894 -215
  294. package/dist/agent-tools/index.d.ts.map +1 -1
  295. package/dist/agent-tools/index.js +47 -3
  296. package/dist/agent-tools/levels.d.ts +11 -3
  297. package/dist/agent-tools/levels.d.ts.map +1 -1
  298. package/dist/agent-tools/levels.js +16 -5
  299. package/dist/agent-tools/measurement.d.ts +38 -20
  300. package/dist/agent-tools/measurement.d.ts.map +1 -1
  301. package/dist/agent-tools/measurement.js +117 -67
  302. package/dist/agent-tools/merge-windows.d.ts +10 -0
  303. package/dist/agent-tools/merge-windows.d.ts.map +1 -0
  304. package/dist/agent-tools/merge-windows.js +12 -0
  305. package/dist/agent-tools/nodes.d.ts.map +1 -1
  306. package/dist/agent-tools/nodes.js +1 -1
  307. package/dist/agent-tools/notation-inventory.d.ts +16 -0
  308. package/dist/agent-tools/notation-inventory.d.ts.map +1 -0
  309. package/dist/agent-tools/notation-inventory.js +105 -0
  310. package/dist/agent-tools/paint.d.ts +5 -5
  311. package/dist/agent-tools/paint.d.ts.map +1 -1
  312. package/dist/agent-tools/paint.js +1 -1
  313. package/dist/agent-tools/photo-elevation.d.ts +32 -0
  314. package/dist/agent-tools/photo-elevation.d.ts.map +1 -0
  315. package/dist/agent-tools/photo-elevation.js +73 -0
  316. package/dist/agent-tools/place-in-room.d.ts +35 -0
  317. package/dist/agent-tools/place-in-room.d.ts.map +1 -0
  318. package/dist/agent-tools/place-in-room.js +61 -0
  319. package/dist/agent-tools/place-items.d.ts +1 -1
  320. package/dist/agent-tools/place-items.js +2 -2
  321. package/dist/agent-tools/project-files.d.ts +189 -0
  322. package/dist/agent-tools/project-files.d.ts.map +1 -0
  323. package/dist/agent-tools/project-files.js +99 -0
  324. package/dist/agent-tools/refusal.d.ts.map +1 -1
  325. package/dist/agent-tools/retired.d.ts +21 -0
  326. package/dist/agent-tools/retired.d.ts.map +1 -0
  327. package/dist/agent-tools/retired.js +29 -0
  328. package/dist/agent-tools/roofs.d.ts +100 -0
  329. package/dist/agent-tools/roofs.d.ts.map +1 -0
  330. package/dist/agent-tools/roofs.js +96 -0
  331. package/dist/agent-tools/room-structure.d.ts +46 -38
  332. package/dist/agent-tools/room-structure.d.ts.map +1 -1
  333. package/dist/agent-tools/room-structure.js +30 -27
  334. package/dist/agent-tools/search-materials.d.ts +22 -3
  335. package/dist/agent-tools/search-materials.d.ts.map +1 -1
  336. package/dist/agent-tools/search-materials.js +13 -14
  337. package/dist/agent-tools/site.d.ts +27 -0
  338. package/dist/agent-tools/site.d.ts.map +1 -0
  339. package/dist/agent-tools/site.js +40 -0
  340. package/dist/agent-tools/sources.d.ts +12 -0
  341. package/dist/agent-tools/sources.d.ts.map +1 -0
  342. package/dist/agent-tools/sources.js +11 -0
  343. package/dist/agent-tools/stairs.d.ts +48 -28
  344. package/dist/agent-tools/stairs.d.ts.map +1 -1
  345. package/dist/agent-tools/stairs.js +65 -22
  346. package/dist/agent-tools/verify-scene.d.ts.map +1 -1
  347. package/dist/agent-tools/verify-scene.js +1 -1
  348. package/dist/agent-tools/view-scene.d.ts +50 -12
  349. package/dist/agent-tools/view-scene.d.ts.map +1 -1
  350. package/dist/agent-tools/view-scene.js +74 -31
  351. package/dist/agent-tools/wall-openings.d.ts +77 -73
  352. package/dist/agent-tools/wall-openings.d.ts.map +1 -1
  353. package/dist/agent-tools/wall-openings.js +9 -5
  354. package/dist/agent-tools/walls.d.ts +4 -4
  355. package/dist/agent-tools/walls.d.ts.map +1 -1
  356. package/dist/agent-tools/walls.js +7 -2
  357. package/dist/building/__fixtures__/wall-opening-cases.d.ts +454 -250
  358. package/dist/building/__fixtures__/wall-opening-cases.d.ts.map +1 -1
  359. package/dist/building/__fixtures__/wall-opening-cases.js +62 -2
  360. package/dist/building/corner-window.d.ts +56 -0
  361. package/dist/building/corner-window.d.ts.map +1 -0
  362. package/dist/building/corner-window.js +179 -0
  363. package/dist/building/ground-level.d.ts +26 -0
  364. package/dist/building/ground-level.d.ts.map +1 -0
  365. package/dist/building/ground-level.js +58 -0
  366. package/dist/building/index.d.ts +5 -0
  367. package/dist/building/index.d.ts.map +1 -1
  368. package/dist/building/index.js +5 -0
  369. package/dist/building/level-duplication.d.ts +7472 -6613
  370. package/dist/building/level-duplication.d.ts.map +1 -1
  371. package/dist/building/level-duplication.js +18 -4
  372. package/dist/building/level-insertion.d.ts +55 -0
  373. package/dist/building/level-insertion.d.ts.map +1 -0
  374. package/dist/building/level-insertion.js +35 -0
  375. package/dist/building/merge-windows.d.ts +58 -0
  376. package/dist/building/merge-windows.d.ts.map +1 -0
  377. package/dist/building/merge-windows.js +189 -0
  378. package/dist/building/opening-style-presets.d.ts +2 -2
  379. package/dist/building/opening-style-presets.d.ts.map +1 -1
  380. package/dist/building/photo-elevation.d.ts +125 -0
  381. package/dist/building/photo-elevation.d.ts.map +1 -0
  382. package/dist/building/photo-elevation.js +404 -0
  383. package/dist/building/wall-gaps.d.ts +13 -0
  384. package/dist/building/wall-gaps.d.ts.map +1 -0
  385. package/dist/building/wall-gaps.js +158 -0
  386. package/dist/building/wall-openings.d.ts +154 -119
  387. package/dist/building/wall-openings.d.ts.map +1 -1
  388. package/dist/building/wall-openings.js +37 -9
  389. package/dist/capture/schema.d.ts +22 -22
  390. package/dist/capture/source.d.ts.map +1 -1
  391. package/dist/capture/source.js +1 -1
  392. package/dist/commands/structure/create-zone.d.ts +12 -1
  393. package/dist/commands/structure/create-zone.d.ts.map +1 -1
  394. package/dist/commands/structure/create-zone.js +49 -0
  395. package/dist/commands/structure/divide-zone.d.ts +3 -3
  396. package/dist/commands/structure/index.d.ts +1 -1
  397. package/dist/commands/structure/index.d.ts.map +1 -1
  398. package/dist/commands/structure/index.js +1 -1
  399. package/dist/commands/structure/set-floor-foundation.d.ts +6 -6
  400. package/dist/commands/structure/set-zone-intent.d.ts +4 -0
  401. package/dist/commands/structure/set-zone-intent.d.ts.map +1 -1
  402. package/dist/commands/structure/set-zone-intent.js +19 -0
  403. package/dist/commands/structure/shared.d.ts +3642 -3213
  404. package/dist/commands/structure/shared.d.ts.map +1 -1
  405. package/dist/commands/structure/zone-wall-merge.d.ts +4149 -3334
  406. package/dist/commands/structure/zone-wall-merge.d.ts.map +1 -1
  407. package/dist/contracts/reference-inventory.d.ts.map +1 -1
  408. package/dist/contracts/reference-inventory.js +106 -26
  409. package/dist/events/bus.d.ts +22 -3
  410. package/dist/events/bus.d.ts.map +1 -1
  411. package/dist/events/capture-sessions.d.ts +5 -0
  412. package/dist/events/capture-sessions.d.ts.map +1 -0
  413. package/dist/events/capture-sessions.js +31 -0
  414. package/dist/hooks/scene-registry/scene-registry.d.ts.map +1 -1
  415. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts +1 -2
  416. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts.map +1 -1
  417. package/dist/hooks/spatial-grid/spatial-grid-manager.js +4 -6
  418. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts +3608 -3179
  419. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts.map +1 -1
  420. package/dist/hooks/spatial-grid/spatial-grid.d.ts.map +1 -1
  421. package/dist/hooks/spatial-grid/support-host-patch.d.ts.map +1 -1
  422. package/dist/hooks/spatial-grid/support-host-patch.js +11 -2
  423. package/dist/hooks/spatial-grid/use-spatial-query.d.ts +3 -3
  424. package/dist/hooks/spatial-grid/wall-spatial-grid.d.ts.map +1 -1
  425. package/dist/index.d.ts +37 -9
  426. package/dist/index.d.ts.map +1 -1
  427. package/dist/index.js +36 -9
  428. package/dist/lib/__fixtures__/mezzanine.d.ts +11800 -10132
  429. package/dist/lib/__fixtures__/mezzanine.d.ts.map +1 -1
  430. package/dist/lib/absorb-wall-separators.d.ts +3642 -3213
  431. package/dist/lib/absorb-wall-separators.d.ts.map +1 -1
  432. package/dist/lib/angle-accumulator.d.ts.map +1 -1
  433. package/dist/lib/artifact-store.d.ts.map +1 -1
  434. package/dist/lib/below-grade-footprints.d.ts +65 -0
  435. package/dist/lib/below-grade-footprints.d.ts.map +1 -0
  436. package/dist/lib/below-grade-footprints.js +181 -0
  437. package/dist/lib/building-footprint.d.ts +33 -0
  438. package/dist/lib/building-footprint.d.ts.map +1 -0
  439. package/dist/lib/building-footprint.js +89 -0
  440. package/dist/lib/corner-pair.d.ts +1129 -0
  441. package/dist/lib/corner-pair.d.ts.map +1 -0
  442. package/dist/lib/corner-pair.js +130 -0
  443. package/dist/lib/corner-snap.d.ts +54 -0
  444. package/dist/lib/corner-snap.d.ts.map +1 -0
  445. package/dist/lib/corner-snap.js +125 -0
  446. package/dist/lib/critically-damped.d.ts +11 -0
  447. package/dist/lib/critically-damped.d.ts.map +1 -0
  448. package/dist/lib/critically-damped.js +14 -0
  449. package/dist/lib/deepest-drawn.d.ts +18 -0
  450. package/dist/lib/deepest-drawn.d.ts.map +1 -0
  451. package/dist/lib/deepest-drawn.js +65 -0
  452. package/dist/lib/door-operation.d.ts +1 -1
  453. package/dist/lib/exterior-wall-loops.d.ts +17 -0
  454. package/dist/lib/exterior-wall-loops.d.ts.map +1 -0
  455. package/dist/lib/exterior-wall-loops.js +334 -0
  456. package/dist/lib/finish-script.d.ts +61 -0
  457. package/dist/lib/finish-script.d.ts.map +1 -0
  458. package/dist/lib/finish-script.js +86 -0
  459. package/dist/lib/floor-intent-changes.d.ts.map +1 -1
  460. package/dist/lib/floor-intent-changes.js +4 -4
  461. package/dist/lib/floor-plate-paint.d.ts +3 -1
  462. package/dist/lib/floor-plate-paint.d.ts.map +1 -1
  463. package/dist/lib/floor-plate-paint.js +24 -4
  464. package/dist/lib/floor-plates.d.ts +50 -50
  465. package/dist/lib/floor-script.d.ts +24 -0
  466. package/dist/lib/floor-script.d.ts.map +1 -0
  467. package/dist/lib/floor-script.js +51 -0
  468. package/dist/lib/foundation-construction.d.ts +73 -0
  469. package/dist/lib/foundation-construction.d.ts.map +1 -0
  470. package/dist/lib/foundation-construction.js +242 -0
  471. package/dist/lib/foundation-standard.d.ts +30 -0
  472. package/dist/lib/foundation-standard.d.ts.map +1 -0
  473. package/dist/lib/foundation-standard.js +30 -0
  474. package/dist/lib/foundation-wall.d.ts +36 -0
  475. package/dist/lib/foundation-wall.d.ts.map +1 -0
  476. package/dist/lib/foundation-wall.js +66 -0
  477. package/dist/lib/generic-foundation.d.ts +40 -0
  478. package/dist/lib/generic-foundation.d.ts.map +1 -0
  479. package/dist/lib/generic-foundation.js +200 -0
  480. package/dist/lib/geometry-script-node.d.ts +32 -3
  481. package/dist/lib/geometry-script-node.d.ts.map +1 -1
  482. package/dist/lib/geometry-script-node.js +26 -0
  483. package/dist/lib/grade-standing.d.ts +38 -0
  484. package/dist/lib/grade-standing.d.ts.map +1 -0
  485. package/dist/lib/grade-standing.js +137 -0
  486. package/dist/lib/ground-level.d.ts +20 -0
  487. package/dist/lib/ground-level.d.ts.map +1 -0
  488. package/dist/lib/ground-level.js +49 -0
  489. package/dist/lib/ground-over-part.d.ts +13 -0
  490. package/dist/lib/ground-over-part.d.ts.map +1 -0
  491. package/dist/lib/ground-over-part.js +94 -0
  492. package/dist/lib/ground-seat.d.ts +47 -0
  493. package/dist/lib/ground-seat.d.ts.map +1 -0
  494. package/dist/lib/ground-seat.js +61 -0
  495. package/dist/lib/ground-window.d.ts +39 -0
  496. package/dist/lib/ground-window.d.ts.map +1 -0
  497. package/dist/lib/ground-window.js +147 -0
  498. package/dist/lib/opening-floor-datum.d.ts.map +1 -1
  499. package/dist/lib/opening-floor-datum.js +2 -3
  500. package/dist/lib/own-floor-intent.d.ts.map +1 -1
  501. package/dist/lib/own-floor-intent.js +4 -4
  502. package/dist/lib/plate-surface.d.ts.map +1 -1
  503. package/dist/lib/plate-surface.js +3 -1
  504. package/dist/lib/point-ask.d.ts +9 -0
  505. package/dist/lib/point-ask.d.ts.map +1 -0
  506. package/dist/lib/point-ask.js +36 -0
  507. package/dist/lib/room-drawn-floor.d.ts +1 -1
  508. package/dist/lib/room-drawn-floor.d.ts.map +1 -1
  509. package/dist/lib/room-floor-feasibility.d.ts.map +1 -1
  510. package/dist/lib/room-floor-feasibility.js +3 -3
  511. package/dist/lib/room-graph.d.ts.map +1 -1
  512. package/dist/lib/room-graph.js +2 -0
  513. package/dist/lib/room-name.d.ts +2 -0
  514. package/dist/lib/room-name.d.ts.map +1 -1
  515. package/dist/lib/room-name.js +2 -0
  516. package/dist/lib/room-topology-index.d.ts.map +1 -1
  517. package/dist/lib/room-topology-index.js +1 -1
  518. package/dist/lib/room-zone-adoption.d.ts.map +1 -1
  519. package/dist/lib/script-inputs-key.d.ts +3 -0
  520. package/dist/lib/script-inputs-key.d.ts.map +1 -0
  521. package/dist/lib/script-inputs-key.js +13 -0
  522. package/dist/lib/setback-envelope.d.ts +95 -5
  523. package/dist/lib/setback-envelope.d.ts.map +1 -1
  524. package/dist/lib/setback-envelope.js +351 -35
  525. package/dist/lib/site-flatwork.d.ts +11 -0
  526. package/dist/lib/site-flatwork.d.ts.map +1 -0
  527. package/dist/lib/site-flatwork.js +11 -0
  528. package/dist/lib/site-ground-height.d.ts +13 -0
  529. package/dist/lib/site-ground-height.d.ts.map +1 -0
  530. package/dist/lib/site-ground-height.js +16 -0
  531. package/dist/lib/site-placement.d.ts +362 -0
  532. package/dist/lib/site-placement.d.ts.map +1 -0
  533. package/dist/lib/site-placement.js +942 -0
  534. package/dist/lib/snap-ease.d.ts +20 -0
  535. package/dist/lib/snap-ease.d.ts.map +1 -0
  536. package/dist/lib/snap-ease.js +50 -0
  537. package/dist/lib/structure-kernel.d.ts +1 -1
  538. package/dist/lib/structure-kernel.d.ts.map +1 -1
  539. package/dist/lib/structure-kernel.js +2 -0
  540. package/dist/lib/surface-support-references.d.ts +4 -0
  541. package/dist/lib/surface-support-references.d.ts.map +1 -0
  542. package/dist/lib/surface-support-references.js +19 -0
  543. package/dist/lib/terrain-support-query.d.ts +10 -0
  544. package/dist/lib/terrain-support-query.d.ts.map +1 -1
  545. package/dist/lib/terrain-support-query.js +1 -1
  546. package/dist/lib/wall-face-script.d.ts +66 -0
  547. package/dist/lib/wall-face-script.d.ts.map +1 -0
  548. package/dist/lib/wall-face-script.js +235 -0
  549. package/dist/lib/zone-colors.d.ts +1 -1
  550. package/dist/lib/zone-colors.d.ts.map +1 -1
  551. package/dist/lib/zone-quantities.d.ts.map +1 -1
  552. package/dist/lib/zone-quantities.js +4 -5
  553. package/dist/material-kinds.d.ts +9 -0
  554. package/dist/material-kinds.d.ts.map +1 -0
  555. package/dist/material-kinds.js +30 -0
  556. package/dist/material-library.d.ts +4 -4
  557. package/dist/material-library.d.ts.map +1 -1
  558. package/dist/material-library.js +72 -26
  559. package/dist/node-slots/index.d.ts +1 -0
  560. package/dist/node-slots/index.d.ts.map +1 -1
  561. package/dist/node-slots/index.js +7 -1
  562. package/dist/node-slots/roof.d.ts +5 -0
  563. package/dist/node-slots/roof.d.ts.map +1 -0
  564. package/dist/node-slots/roof.js +12 -0
  565. package/dist/node-slots/stair.d.ts +2 -0
  566. package/dist/node-slots/stair.d.ts.map +1 -1
  567. package/dist/node-slots/stair.js +6 -2
  568. package/dist/procedural-items/design-placement.d.ts.map +1 -1
  569. package/dist/procedural-items/design.d.ts +19 -19
  570. package/dist/procedural-items/fixtures.d.ts +297 -297
  571. package/dist/procedural-items/fixtures.d.ts.map +1 -1
  572. package/dist/procedural-items/integration.d.ts +106 -106
  573. package/dist/procedural-items/joints.d.ts +4 -4
  574. package/dist/procedural-items/library-colors.d.ts +22 -22
  575. package/dist/procedural-items/library-colors.d.ts.map +1 -1
  576. package/dist/procedural-items/motion-controller.d.ts.map +1 -1
  577. package/dist/procedural-items/node.d.ts +291 -291
  578. package/dist/procedural-items/query.d.ts +1 -1
  579. package/dist/procedural-items/query.d.ts.map +1 -1
  580. package/dist/procedural-items/recipe.d.ts +11 -11
  581. package/dist/procedural-items/recipe.d.ts.map +1 -1
  582. package/dist/procedural-items/section.d.ts.map +1 -1
  583. package/dist/registry/index.d.ts +1 -1
  584. package/dist/registry/index.d.ts.map +1 -1
  585. package/dist/registry/scene-api.d.ts +1 -0
  586. package/dist/registry/scene-api.d.ts.map +1 -1
  587. package/dist/registry/scene-api.js +3 -0
  588. package/dist/registry/subtree.d.ts.map +1 -1
  589. package/dist/registry/subtree.js +2 -0
  590. package/dist/registry/types.d.ts +120 -1
  591. package/dist/registry/types.d.ts.map +1 -1
  592. package/dist/schema/assembly.d.ts +41 -41
  593. package/dist/schema/asset-url.d.ts +1 -1
  594. package/dist/schema/asset-url.d.ts.map +1 -1
  595. package/dist/schema/base.d.ts +9 -9
  596. package/dist/schema/base.d.ts.map +1 -1
  597. package/dist/schema/camera.d.ts +1 -1
  598. package/dist/schema/collection-templates.d.ts +20 -20
  599. package/dist/schema/collection-templates.d.ts.map +1 -1
  600. package/dist/schema/geometry-metadata.d.ts +7 -7
  601. package/dist/schema/geometry-metadata.d.ts.map +1 -1
  602. package/dist/schema/geometry-source.d.ts +26 -16
  603. package/dist/schema/geometry-source.d.ts.map +1 -1
  604. package/dist/schema/geometry-source.js +14 -0
  605. package/dist/schema/index.d.ts +10 -7
  606. package/dist/schema/index.d.ts.map +1 -1
  607. package/dist/schema/index.js +10 -7
  608. package/dist/schema/material.d.ts +33 -33
  609. package/dist/schema/nodes/barrel-roof.d.ts +3 -0
  610. package/dist/schema/nodes/barrel-roof.d.ts.map +1 -0
  611. package/dist/schema/nodes/barrel-roof.js +11 -0
  612. package/dist/schema/nodes/block.d.ts +8 -8
  613. package/dist/schema/nodes/box-vent.d.ts +13 -13
  614. package/dist/schema/nodes/building.d.ts +9 -8
  615. package/dist/schema/nodes/building.d.ts.map +1 -1
  616. package/dist/schema/nodes/building.js +2 -0
  617. package/dist/schema/nodes/cabinet.d.ts +130 -129
  618. package/dist/schema/nodes/cabinet.d.ts.map +1 -1
  619. package/dist/schema/nodes/cabinet.js +1 -1
  620. package/dist/schema/nodes/ceiling.d.ts +15 -15
  621. package/dist/schema/nodes/chimney.d.ts +23 -23
  622. package/dist/schema/nodes/column.d.ts +207 -199
  623. package/dist/schema/nodes/column.d.ts.map +1 -1
  624. package/dist/schema/nodes/column.js +2 -0
  625. package/dist/schema/nodes/construction-dimension.d.ts +34 -34
  626. package/dist/schema/nodes/cupola.d.ts +15 -15
  627. package/dist/schema/nodes/curtain-wall.d.ts +21 -20
  628. package/dist/schema/nodes/curtain-wall.d.ts.map +1 -1
  629. package/dist/schema/nodes/curtain-wall.js +23 -0
  630. package/dist/schema/nodes/door.d.ts +50 -43
  631. package/dist/schema/nodes/door.d.ts.map +1 -1
  632. package/dist/schema/nodes/door.js +19 -0
  633. package/dist/schema/nodes/dormer.d.ts +37 -36
  634. package/dist/schema/nodes/dormer.d.ts.map +1 -1
  635. package/dist/schema/nodes/downspout.d.ts +17 -17
  636. package/dist/schema/nodes/duct-fitting.d.ts +24 -24
  637. package/dist/schema/nodes/duct-segment.d.ts +14 -14
  638. package/dist/schema/nodes/duct-terminal.d.ts +12 -12
  639. package/dist/schema/nodes/elevator.d.ts +15 -15
  640. package/dist/schema/nodes/eyebrow-vent.d.ts +13 -13
  641. package/dist/schema/nodes/fence-feature.d.ts +37 -37
  642. package/dist/schema/nodes/fence-types.d.ts +32 -0
  643. package/dist/schema/nodes/fence-types.d.ts.map +1 -0
  644. package/dist/schema/nodes/fence-types.js +22 -0
  645. package/dist/schema/nodes/fence.d.ts +43 -72
  646. package/dist/schema/nodes/fence.d.ts.map +1 -1
  647. package/dist/schema/nodes/fence.js +4 -20
  648. package/dist/schema/nodes/floor-opening.d.ts +8 -8
  649. package/dist/schema/nodes/guide.d.ts +8 -8
  650. package/dist/schema/nodes/gutter.d.ts +14 -14
  651. package/dist/schema/nodes/gutter.d.ts.map +1 -1
  652. package/dist/schema/nodes/gutter.js +6 -5
  653. package/dist/schema/nodes/hvac-equipment.d.ts +13 -13
  654. package/dist/schema/nodes/imported-mesh.d.ts +8 -8
  655. package/dist/schema/nodes/item.d.ts +30 -25
  656. package/dist/schema/nodes/item.d.ts.map +1 -1
  657. package/dist/schema/nodes/lean-to-extension.d.ts +36 -36
  658. package/dist/schema/nodes/level.d.ts +9 -9
  659. package/dist/schema/nodes/lineset.d.ts +8 -8
  660. package/dist/schema/nodes/liquid-line.d.ts +8 -8
  661. package/dist/schema/nodes/measurement.d.ts +8 -8
  662. package/dist/schema/nodes/opening-types.d.ts +13 -13
  663. package/dist/schema/nodes/opening-types.d.ts.map +1 -1
  664. package/dist/schema/nodes/pipe-fitting.d.ts +15 -15
  665. package/dist/schema/nodes/pipe-segment.d.ts +11 -11
  666. package/dist/schema/nodes/pipe-trap.d.ts +9 -9
  667. package/dist/schema/nodes/ridge-vent.d.ts +14 -14
  668. package/dist/schema/nodes/ridge-vent.d.ts.map +1 -1
  669. package/dist/schema/nodes/ridge-vent.js +3 -1
  670. package/dist/schema/nodes/roof-glazing-config.d.ts +90 -0
  671. package/dist/schema/nodes/roof-glazing-config.d.ts.map +1 -0
  672. package/dist/schema/nodes/roof-glazing-config.js +34 -0
  673. package/dist/schema/nodes/roof-glazing.d.ts +57 -0
  674. package/dist/schema/nodes/roof-glazing.d.ts.map +1 -0
  675. package/dist/schema/nodes/roof-glazing.js +514 -0
  676. package/dist/schema/nodes/roof-segment-resize.d.ts +4 -0
  677. package/dist/schema/nodes/roof-segment-resize.d.ts.map +1 -0
  678. package/dist/schema/nodes/roof-segment-resize.js +21 -0
  679. package/dist/schema/nodes/roof-segment-shape.d.ts +5 -0
  680. package/dist/schema/nodes/roof-segment-shape.d.ts.map +1 -1
  681. package/dist/schema/nodes/roof-segment-shape.js +44 -0
  682. package/dist/schema/nodes/roof-segment-walls.d.ts +1 -1
  683. package/dist/schema/nodes/roof-segment-walls.d.ts.map +1 -1
  684. package/dist/schema/nodes/roof-segment-walls.js +24 -0
  685. package/dist/schema/nodes/roof-segment.d.ts +153 -46
  686. package/dist/schema/nodes/roof-segment.d.ts.map +1 -1
  687. package/dist/schema/nodes/roof-segment.js +91 -20
  688. package/dist/schema/nodes/roof-types.d.ts +14 -0
  689. package/dist/schema/nodes/roof-types.d.ts.map +1 -0
  690. package/dist/schema/nodes/roof-types.js +14 -0
  691. package/dist/schema/nodes/roof.d.ts +49 -49
  692. package/dist/schema/nodes/scan.d.ts +8 -8
  693. package/dist/schema/nodes/separator.d.ts +8 -8
  694. package/dist/schema/nodes/shelf.d.ts +16 -16
  695. package/dist/schema/nodes/site-facts.d.ts +64 -0
  696. package/dist/schema/nodes/site-facts.d.ts.map +1 -0
  697. package/dist/schema/nodes/site-facts.js +73 -0
  698. package/dist/schema/nodes/site.d.ts +105 -63
  699. package/dist/schema/nodes/site.d.ts.map +1 -1
  700. package/dist/schema/nodes/site.js +7 -70
  701. package/dist/schema/nodes/skylight.d.ts +41 -41
  702. package/dist/schema/nodes/skylight.d.ts.map +1 -1
  703. package/dist/schema/nodes/slab.d.ts +21 -21
  704. package/dist/schema/nodes/solar-panel.d.ts +21 -21
  705. package/dist/schema/nodes/spawn.d.ts +8 -8
  706. package/dist/schema/nodes/stair-construction.d.ts +3 -3
  707. package/dist/schema/nodes/stair-defaults.d.ts +16 -0
  708. package/dist/schema/nodes/stair-defaults.d.ts.map +1 -0
  709. package/dist/schema/nodes/stair-defaults.js +15 -0
  710. package/dist/schema/nodes/stair-segment.d.ts +22 -22
  711. package/dist/schema/nodes/stair-types.d.ts +29 -0
  712. package/dist/schema/nodes/stair-types.d.ts.map +1 -0
  713. package/dist/schema/nodes/stair-types.js +23 -0
  714. package/dist/schema/nodes/stair.d.ts +51 -75
  715. package/dist/schema/nodes/stair.d.ts.map +1 -1
  716. package/dist/schema/nodes/stair.js +6 -20
  717. package/dist/schema/nodes/structural-grid.d.ts +8 -8
  718. package/dist/schema/nodes/surface-hole-metadata.d.ts +2 -2
  719. package/dist/schema/nodes/turbine-vent.d.ts +13 -13
  720. package/dist/schema/nodes/unit.d.ts +10 -10
  721. package/dist/schema/nodes/unit.d.ts.map +1 -1
  722. package/dist/schema/nodes/wall.d.ts +479 -146
  723. package/dist/schema/nodes/wall.d.ts.map +1 -1
  724. package/dist/schema/nodes/wall.js +19 -0
  725. package/dist/schema/nodes/window.d.ts +55 -39
  726. package/dist/schema/nodes/window.d.ts.map +1 -1
  727. package/dist/schema/nodes/window.js +10 -0
  728. package/dist/schema/nodes/zone.d.ts +231 -12
  729. package/dist/schema/nodes/zone.d.ts.map +1 -1
  730. package/dist/schema/nodes/zone.js +10 -0
  731. package/dist/schema/provenance.d.ts +21 -21
  732. package/dist/schema/scene-material.d.ts +5 -5
  733. package/dist/schema/site-presentation.d.ts +100 -0
  734. package/dist/schema/site-presentation.d.ts.map +1 -0
  735. package/dist/schema/site-presentation.js +83 -0
  736. package/dist/schema/types.d.ts +1954 -1414
  737. package/dist/schema/types.d.ts.map +1 -1
  738. package/dist/services/__fixtures__/wall-plane-top-boundary-repro.d.ts.map +1 -1
  739. package/dist/services/index.d.ts +5 -1
  740. package/dist/services/index.d.ts.map +1 -1
  741. package/dist/services/index.js +5 -1
  742. package/dist/services/level-height.d.ts.map +1 -1
  743. package/dist/services/level-height.js +7 -3
  744. package/dist/services/port-connectivity.d.ts +4 -0
  745. package/dist/services/port-connectivity.d.ts.map +1 -1
  746. package/dist/services/port-connectivity.js +35 -0
  747. package/dist/services/project-file-sink.d.ts +9 -0
  748. package/dist/services/project-file-sink.d.ts.map +1 -0
  749. package/dist/services/project-file-sink.js +13 -0
  750. package/dist/services/roof-bearing.d.ts +62 -0
  751. package/dist/services/roof-bearing.d.ts.map +1 -0
  752. package/dist/services/roof-bearing.js +234 -0
  753. package/dist/services/roof-level.d.ts +121 -0
  754. package/dist/services/roof-level.d.ts.map +1 -0
  755. package/dist/services/roof-level.js +280 -0
  756. package/dist/services/roof-move.d.ts +83 -0
  757. package/dist/services/roof-move.d.ts.map +1 -0
  758. package/dist/services/roof-move.js +316 -0
  759. package/dist/services/stair-surface-snap.d.ts +14 -0
  760. package/dist/services/stair-surface-snap.d.ts.map +1 -0
  761. package/dist/services/stair-surface-snap.js +116 -0
  762. package/dist/services/storey-datum.d.ts +12 -0
  763. package/dist/services/storey-datum.d.ts.map +1 -0
  764. package/dist/services/storey-datum.js +18 -0
  765. package/dist/services/storey.d.ts +51 -5
  766. package/dist/services/storey.d.ts.map +1 -1
  767. package/dist/services/storey.js +125 -8
  768. package/dist/solar-panel-presets.d.ts +2 -2
  769. package/dist/store/actions/node-actions.d.ts +3613 -3182
  770. package/dist/store/actions/node-actions.d.ts.map +1 -1
  771. package/dist/store/actions/node-actions.js +46 -1
  772. package/dist/store/derived-node-guard.d.ts.map +1 -1
  773. package/dist/store/history-control.d.ts +39 -0
  774. package/dist/store/history-control.d.ts.map +1 -1
  775. package/dist/store/history-control.js +84 -4
  776. package/dist/store/scene-annotations.d.ts +7267 -6409
  777. package/dist/store/scene-annotations.d.ts.map +1 -1
  778. package/dist/store/scene-preview.d.ts +16 -0
  779. package/dist/store/scene-preview.d.ts.map +1 -0
  780. package/dist/store/scene-preview.js +144 -0
  781. package/dist/store/use-live-node-overrides.d.ts.map +1 -1
  782. package/dist/store/use-live-terrain.d.ts.map +1 -1
  783. package/dist/store/use-live-transforms.d.ts.map +1 -1
  784. package/dist/store/use-scene.d.ts.map +1 -1
  785. package/dist/store/use-scene.js +37 -4
  786. package/dist/systems/elevator/elevator-dispatch.js +1 -1
  787. package/dist/systems/fence/fence-features.d.ts.map +1 -1
  788. package/dist/systems/owned-floor-openings.d.ts.map +1 -1
  789. package/dist/systems/owned-floor-openings.js +24 -3
  790. package/dist/systems/roof/roof-elevation-system.d.ts.map +1 -1
  791. package/dist/systems/roof/roof-elevation-system.js +9 -3
  792. package/dist/systems/roof/roof-elevation.d.ts +5 -0
  793. package/dist/systems/roof/roof-elevation.d.ts.map +1 -1
  794. package/dist/systems/roof/roof-elevation.js +91 -62
  795. package/dist/systems/slab/__fixtures__/floor-step.d.ts +4623 -3516
  796. package/dist/systems/slab/__fixtures__/floor-step.d.ts.map +1 -1
  797. package/dist/systems/slab/__fixtures__/raised-room.d.ts +5149 -4076
  798. package/dist/systems/slab/__fixtures__/raised-room.d.ts.map +1 -1
  799. package/dist/systems/slab/slab-support.d.ts +6 -3
  800. package/dist/systems/slab/slab-support.d.ts.map +1 -1
  801. package/dist/systems/slab/slab-support.js +78 -10
  802. package/dist/systems/stair/stair-detail-budget.d.ts +2 -2
  803. package/dist/systems/stair/stair-detail-budget.d.ts.map +1 -1
  804. package/dist/systems/stair/stair-footprint.d.ts +6 -0
  805. package/dist/systems/stair/stair-footprint.d.ts.map +1 -1
  806. package/dist/systems/stair/stair-footprint.js +27 -14
  807. package/dist/systems/stair/stair-layout.d.ts +2 -2
  808. package/dist/systems/stair/stair-opening-preview.d.ts +3643 -3214
  809. package/dist/systems/stair/stair-opening-preview.d.ts.map +1 -1
  810. package/dist/systems/stair/stair-presets.d.ts +73 -65
  811. package/dist/systems/stair/stair-presets.d.ts.map +1 -1
  812. package/dist/systems/stair/stair-presets.js +16 -9
  813. package/dist/systems/stair/stair-rail-path.d.ts +1 -1
  814. package/dist/systems/stair/stair-rise-query.d.ts +16 -0
  815. package/dist/systems/stair/stair-rise-query.d.ts.map +1 -1
  816. package/dist/systems/stair/stair-rise-query.js +57 -7
  817. package/dist/systems/stair/stair-sizing.d.ts +101 -99
  818. package/dist/systems/stair/stair-sizing.d.ts.map +1 -1
  819. package/dist/systems/wall/wall-assembly.d.ts +11 -0
  820. package/dist/systems/wall/wall-assembly.d.ts.map +1 -1
  821. package/dist/systems/wall/wall-assembly.js +21 -0
  822. package/dist/systems/wall/wall-curve.d.ts +5 -0
  823. package/dist/systems/wall/wall-curve.d.ts.map +1 -1
  824. package/dist/systems/wall/wall-curve.js +13 -0
  825. package/dist/systems/wall/wall-frame.d.ts.map +1 -1
  826. package/dist/systems/wall/wall-frame.js +8 -0
  827. package/dist/systems/wall/wall-room-sides.d.ts +8 -0
  828. package/dist/systems/wall/wall-room-sides.d.ts.map +1 -1
  829. package/dist/systems/wall/wall-room-sides.js +60 -7
  830. package/dist/systems/wall/wall-top.d.ts +7 -4
  831. package/dist/systems/wall/wall-top.d.ts.map +1 -1
  832. package/dist/systems/wall/wall-top.js +14 -6
  833. package/dist/systems/wall/wall-topology.d.ts +4 -0
  834. package/dist/systems/wall/wall-topology.d.ts.map +1 -1
  835. package/dist/systems/wall/wall-topology.js +4 -2
  836. package/dist/systems/wall/wall-trim.d.ts +7 -0
  837. package/dist/systems/wall/wall-trim.d.ts.map +1 -0
  838. package/dist/systems/wall/wall-trim.js +10 -0
  839. package/dist/utils/clone-scene-graph.d.ts.map +1 -1
  840. package/dist/utils/clone-scene-graph.js +8 -0
  841. package/dist/utils/ensure-scene-openings.d.ts +7420 -6562
  842. package/dist/utils/ensure-scene-openings.d.ts.map +1 -1
  843. package/dist/utils/floor-piece-adoption.d.ts +2 -2
  844. package/dist/utils/floor-plate-migration.d.ts +3746 -3317
  845. package/dist/utils/floor-plate-migration.d.ts.map +1 -1
  846. package/dist/utils/floor-plate-migration.js +2 -2
  847. package/dist/utils/heal-scene-graph.d.ts +12 -0
  848. package/dist/utils/heal-scene-graph.d.ts.map +1 -1
  849. package/dist/utils/heal-scene-graph.js +40 -23
  850. package/dist/utils/legacy-wall-datums.d.ts.map +1 -1
  851. package/dist/utils/legacy-wall-datums.js +2 -2
  852. package/dist/utils/owned-floor-opening-migration.d.ts +3642 -3213
  853. package/dist/utils/owned-floor-opening-migration.d.ts.map +1 -1
  854. package/dist/utils/reconcile-structure-on-load.d.ts +3730 -7777
  855. package/dist/utils/reconcile-structure-on-load.d.ts.map +1 -1
  856. package/dist/utils/scene-migrations.d.ts +1 -1
  857. package/dist/utils/scene-migrations.d.ts.map +1 -1
  858. package/dist/utils/scene-migrations.js +1 -1
  859. package/dist/utils/semantic-equal.d.ts +3 -0
  860. package/dist/utils/semantic-equal.d.ts.map +1 -0
  861. package/dist/utils/semantic-equal.js +26 -0
  862. package/dist/utils/structure-id.d.ts.map +1 -1
  863. package/dist/utils/types.d.ts.map +1 -1
  864. package/dist/utils/wall-face-migration.d.ts +1 -1
  865. package/dist/utils/wall-face-migration.d.ts.map +1 -1
  866. package/package.json +36 -10
@@ -7,7 +7,18 @@
7
7
  *
8
8
  * See packages/mcp/docs/layout-clearance-error-log.md for regression checklist.
9
9
  */
10
+ import { floorConstructionLift, liftedManualSlab } from '../lib/floor-construction-lift.js';
11
+ import { selectSlabSupportForItem } from '../lib/item-slab-support.js';
12
+ import { getRenderableSlabPolygon } from '../lib/slab-polygon.js';
13
+ import { levelBaseElevationAt } from '../lib/terrain-support-query.js';
14
+ import { boundsOf, boxCorners, frame, rotateVector, transformPoint, } from '../procedural-items/spatial.js';
15
+ import { getScaledDimensions } from '../schema/index.js';
16
+ import { resolveCeilingHeight } from '../services/level-height.js';
17
+ import { CEILING_DRAW_OFFSET } from '../services/storey.js';
10
18
  import { aabbsOverlap, findBlockedDoors, itemNodePlanAabb, itemPlanAabb, resolveNodeLevelId, } from './door-clearance.js';
19
+ import { furnitureKind, isFloorUnderlay } from './furniture-kind.js';
20
+ import { itemHosts, itemLevelHeightRange, itemPlanAabbInLevel } from './item-space.js';
21
+ import { pointInPolygon } from './plan-geometry.js';
11
22
  export { aabbsOverlap, collectDoorKeepouts, findBlockedDoors, itemNodePlanAabb, itemPlanAabb, resolveNodeLevelId, } from './door-clearance.js';
12
23
  /** Minimum free space (m) required between item footprints. */
13
24
  export const DEFAULT_ITEM_GAP = 0.08;
@@ -31,15 +42,17 @@ export function collectOccupiedFootprints(nodes, options) {
31
42
  const levelId = resolveNodeLevelId(node.id, byId);
32
43
  if (options?.levelId && levelId !== options.levelId)
33
44
  continue;
34
- // Floor packing: prefer level-parented items (not wall-hosted children).
45
+ if (levelId && node.parentId === levelId && isFloorUnderlay(node))
46
+ continue;
47
+ // A wall's children keep wall-local coordinates and are read by the wall observations.
48
+ if (node.parentId && byId.get(node.parentId)?.type === 'wall')
49
+ continue;
50
+ // Floor packing: prefer level-parented items (not ceiling-hosted children).
35
51
  if (options?.floorOnly && node.parentId && levelId && node.parentId !== levelId) {
36
52
  if (attach === 'wall' || attach === 'wall-side' || attach === 'ceiling')
37
53
  continue;
38
- // Wall-parented items without attachTo still skipped for floor packing.
39
- if (byId.get(node.parentId)?.type === 'wall')
40
- continue;
41
54
  }
42
- const aabb = nodeItemAabb(node);
55
+ const aabb = itemPlanAabbInLevel(node, byId);
43
56
  if (!aabb)
44
57
  continue;
45
58
  const name = node.name ?? node.asset?.name;
@@ -52,9 +65,146 @@ export function collectOccupiedFootprints(nodes, options) {
52
65
  }
53
66
  return out;
54
67
  }
68
+ function finiteVec3(value) {
69
+ return (Array.isArray(value) &&
70
+ value.length === 3 &&
71
+ [value[0], value[1], value[2]].every(Number.isFinite));
72
+ }
73
+ function planarRotation(value) {
74
+ return finiteVec3(value) && value[0] === 0 && value[2] === 0;
75
+ }
76
+ function finiteNumbers(value) {
77
+ if (typeof value === 'number')
78
+ return Number.isFinite(value);
79
+ if (Array.isArray(value))
80
+ return value.every(finiteNumbers);
81
+ if (value && typeof value === 'object')
82
+ return Object.values(value).every(finiteNumbers);
83
+ return true;
84
+ }
85
+ /** Snapshot counterpart of the item floorPlaced support election; never reads the live grid. */
86
+ function itemFloorLift(node, nodes) {
87
+ // The renderer's item floorPlaced.applies skips corrective surface attachments.
88
+ if (node.asset.attachTo)
89
+ return 0;
90
+ const levelId = node.parentId;
91
+ const ground = () => levelBaseElevationAt(nodes, levelId, node.position[0], node.position[2]) +
92
+ floorConstructionLift(nodes, node);
93
+ if (node.supportSlabId === 'ground')
94
+ return ground();
95
+ const list = Object.values(nodes);
96
+ const slabs = list
97
+ .filter((other) => other.type === 'slab' && other.parentId === levelId)
98
+ .map((slab) => liftedManualSlab(nodes, slab));
99
+ const walls = list.filter((other) => {
100
+ if (other.type !== 'wall')
101
+ return false;
102
+ let parent = other.parentId ? nodes[other.parentId] : undefined;
103
+ for (let depth = 0; parent && parent.type !== 'level' && depth < 16; depth++) {
104
+ parent = parent.parentId ? nodes[parent.parentId] : undefined;
105
+ }
106
+ return parent?.type === 'level' && parent.id === levelId;
107
+ });
108
+ const support = selectSlabSupportForItem(slabs, { position: node.position, dimensions: getScaledDimensions(node), rotation: node.rotation }, (slab) => getRenderableSlabPolygon(slab, {
109
+ walls,
110
+ siblingSlabs: slabs.filter((other) => other.id !== slab.id),
111
+ }), { preferredSlabId: node.supportSlabId });
112
+ return support ? support.elevation : ground();
113
+ }
114
+ /**
115
+ * Only script manifests supply raw bounds for the renderer's corrective asset pose.
116
+ * Catalog dimensions describe a plan box, not proof of the raw model's Y origin.
117
+ */
118
+ export function scriptItemBoundsInLevel(node, nodes) {
119
+ if (node?.type !== 'item' || node.roofSegmentId || node.blockFaceId)
120
+ return;
121
+ const bounds = node.source?.manifest?.bounds;
122
+ const assetScale = node.asset.scale ?? [1, 1, 1];
123
+ if (!bounds ||
124
+ node.source?.manifest?.animations?.length ||
125
+ !finiteVec3(bounds.min) ||
126
+ !finiteVec3(bounds.max) ||
127
+ bounds.min.some((min, axis) => min > bounds.max[axis]) ||
128
+ !finiteVec3(node.position) ||
129
+ !finiteVec3(node.rotation) ||
130
+ !finiteVec3(node.scale) ||
131
+ node.scale.some((scale) => scale <= 0) ||
132
+ !finiteVec3(node.asset.offset) ||
133
+ !finiteVec3(node.asset.rotation) ||
134
+ !finiteVec3(assetScale) ||
135
+ assetScale.some((scale) => scale <= 0) ||
136
+ !finiteVec3(node.asset.dimensions) ||
137
+ node.asset.dimensions.some((size) => size <= 0))
138
+ return;
139
+ const parent = node.parentId ? nodes[node.parentId] : undefined;
140
+ const level = parent?.type === 'level'
141
+ ? parent
142
+ : parent?.type === 'ceiling' && parent.parentId
143
+ ? nodes[parent.parentId]
144
+ : undefined;
145
+ if (level?.type !== 'level' || !finiteNumbers(level) || !finiteNumbers(parent))
146
+ return;
147
+ try {
148
+ const hostY = parent?.type === 'ceiling'
149
+ ? resolveCeilingHeight(parent, nodes) - CEILING_DRAW_OFFSET
150
+ : itemFloorLift(node, nodes);
151
+ const pose = frame([node.position[0], hostY + node.position[1], node.position[2]], node.rotation);
152
+ // Match the model groups: corrective asset pose is inside the node-scale group.
153
+ const corners = boxCorners(bounds.min, bounds.max).map((point) => {
154
+ const rotated = rotateVector(point.map((value, axis) => value * assetScale[axis]), node.asset.rotation);
155
+ return transformPoint(pose, rotated.map((value, axis) => (value + node.asset.offset[axis]) * node.scale[axis]));
156
+ });
157
+ if (corners.every(finiteVec3))
158
+ return { levelId: level.id, bounds: boundsOf(corners), corners };
159
+ }
160
+ catch {
161
+ // Malformed or unsupported support geometry is not evidence of separation.
162
+ }
163
+ }
164
+ function itemVerticalInterval(node, nodes) {
165
+ // Keep the existing plan-layout evidence limited to yaw-only model poses.
166
+ if (node?.type !== 'item' ||
167
+ !planarRotation(node.rotation) ||
168
+ !planarRotation(node.asset.rotation))
169
+ return;
170
+ const resolved = scriptItemBoundsInLevel(node, nodes);
171
+ if (resolved)
172
+ return {
173
+ levelId: resolved.levelId,
174
+ min: resolved.bounds.min[1],
175
+ max: resolved.bounds.max[1],
176
+ };
177
+ }
55
178
  export function findItemItemCollisions(args) {
56
179
  const gap = args.gap ?? DEFAULT_ITEM_GAP;
57
- const footprints = collectOccupiedFootprints(args.nodes, { levelId: args.levelId });
180
+ const list = [...args.nodes];
181
+ const nodes = Object.fromEntries(list.map((node) => [node.id, node]));
182
+ const footprints = collectOccupiedFootprints(list, { levelId: args.levelId });
183
+ // Drawing fallbacks on invalid support heights cannot prove collision separation.
184
+ const finiteContext = list.every((node) => node.type === 'item' || finiteNumbers(node));
185
+ const byId = new Map(list.map((node) => [node.id, node]));
186
+ // The measured interval when the model's bounds allow it, else the node's own height above its
187
+ // floor. A measured contact stays a collision (roundoff); a lamp standing on a table top by its
188
+ // own height is stacked.
189
+ const intervals = new Map(footprints.map(({ id }) => {
190
+ const node = nodes[id];
191
+ const measured = finiteContext ? itemVerticalInterval(node, nodes) : undefined;
192
+ if (measured)
193
+ return [id, { ...measured, measured: true }];
194
+ const range = itemLevelHeightRange(node, byId);
195
+ return [
196
+ id,
197
+ range
198
+ ? {
199
+ levelId: resolveNodeLevelId(id, byId) ?? '',
200
+ min: range.min,
201
+ max: range.max,
202
+ measured: false,
203
+ }
204
+ : undefined,
205
+ ];
206
+ }));
207
+ const hosts = new Map(footprints.map(({ id }) => [id, itemHosts(nodes[id], byId)]));
58
208
  const collisions = [];
59
209
  for (let i = 0; i < footprints.length; i++) {
60
210
  for (let j = i + 1; j < footprints.length; j++) {
@@ -62,8 +212,29 @@ export function findItemItemCollisions(args) {
62
212
  const b = footprints[j];
63
213
  if (a.levelId && b.levelId && a.levelId !== b.levelId)
64
214
  continue;
215
+ // A thing resting on top of its host is stacked by design: its bottom at the host's top. A
216
+ // child sunk into its host, or one whose height is unknown, is still a collision.
217
+ const [child, host] = hosts.get(a.id)?.has(b.id)
218
+ ? [a, b]
219
+ : hosts.get(b.id)?.has(a.id)
220
+ ? [b, a]
221
+ : [];
222
+ if (child && host) {
223
+ const cY = intervals.get(child.id);
224
+ const hY = intervals.get(host.id);
225
+ if (cY && hY && cY.min >= hY.max - 0.02)
226
+ continue;
227
+ }
65
228
  if (!aabbsOverlap(a.aabb, b.aabb, gap))
66
229
  continue;
230
+ const aY = intervals.get(a.id);
231
+ const bY = intervals.get(b.id);
232
+ // Contact and sub-micrometre separation remain conservative against roundoff.
233
+ if (aY && bY && aY.levelId === bY.levelId) {
234
+ const touch = aY.measured && bY.measured ? 1e-6 : -1e-6;
235
+ if (bY.min - aY.max > touch || aY.min - bY.max > touch)
236
+ continue;
237
+ }
67
238
  collisions.push({
68
239
  aId: a.id,
69
240
  bId: b.id,
@@ -102,9 +273,69 @@ export function classifyPlacement(args) {
102
273
  }
103
274
  return 'ok';
104
275
  }
276
+ /** How far a placement may step a piece off its spot, into the room, to clear doors and other pieces. */
277
+ export const PLACEMENT_INSETS_M = [0, 0.25, 0.5, 0.75];
278
+ /**
279
+ * Slides along a wall between `min` and `max`, nearest first: the nearest to none at all, then
280
+ * every 0.4 m (0, -0.4, 0.4, … when the range holds 0).
281
+ */
282
+ export function lateralSteps(min, max) {
283
+ const nearest = Math.min(Math.max(0, min), max);
284
+ const steps = [nearest];
285
+ for (let k = Math.ceil(min / 0.4 - 1e-9); k * 0.4 <= max + 1e-9; k++)
286
+ if (Math.abs(k * 0.4 - nearest) > 1e-9)
287
+ steps.push(k * 0.4);
288
+ return steps.sort((a, b) => Math.abs(a) - Math.abs(b) || a - b);
289
+ }
290
+ /** Whether segment a–b passes through the open box |u| < halfU, |v| < halfV (Liang–Barsky). */
291
+ function segmentEntersBox(a, b, halfU, halfV) {
292
+ const [du, dv] = [b[0] - a[0], b[1] - a[1]];
293
+ let [enter, exit] = [0, 1];
294
+ for (const [p, q] of [
295
+ [-du, a[0] + halfU],
296
+ [du, halfU - a[0]],
297
+ [-dv, a[1] + halfV],
298
+ [dv, halfV - a[1]],
299
+ ]) {
300
+ if (p === 0) {
301
+ if (q <= 0)
302
+ return false;
303
+ continue;
304
+ }
305
+ const t = q / p;
306
+ if (p < 0)
307
+ enter = Math.max(enter, t);
308
+ else
309
+ exit = Math.min(exit, t);
310
+ if (enter >= exit)
311
+ return false;
312
+ }
313
+ return true;
314
+ }
315
+ /**
316
+ * Whether a piece's turned footprint stands inside a room's outline, a notch or an L's missing
317
+ * corner included: its middle is inside and no edge of the outline passes through it. A piece may
318
+ * touch the outline, and overlap it by up to {@link OUTLINE_CONTACT_M}.
319
+ */
320
+ function insideOutline({ x, z, rotationDeg }, dimensions, outline) {
321
+ if (!pointInPolygon([x, z], outline, false))
322
+ return false;
323
+ const [width = 1, , depth = 1] = dimensions ?? [1, 1, 1];
324
+ const yaw = (rotationDeg * Math.PI) / 180;
325
+ const [cos, sin] = [Math.cos(yaw), Math.sin(yaw)];
326
+ // In the piece's own frame (the inverse of itemNodePlanCorners' turn): u across, v deep.
327
+ const local = ([px, pz]) => [
328
+ (px - x) * cos - (pz - z) * sin,
329
+ (px - x) * sin + (pz - z) * cos,
330
+ ];
331
+ // A piece a few millimetres thin keeps half its own thickness, so its box is never empty.
332
+ const inset = (half) => Math.max(half - OUTLINE_CONTACT_M, half / 2);
333
+ const [halfU, halfV] = [inset(width / 2), inset(depth / 2)];
334
+ return !outline.some((point, i) => segmentEntersBox(local(point), local(outline[(i + 1) % outline.length]), halfU, halfV));
335
+ }
105
336
  export function generatePlacementCandidates(primary, options) {
106
- const laterals = options?.lateralsM ?? [0, -0.4, 0.4, -0.8, 0.8, -1.2, 1.2];
107
- const insets = options?.insetsM ?? [0, 0.25, 0.5, 0.75];
337
+ const laterals = options?.lateralsM ?? lateralSteps(-1.2, 1.2);
338
+ const insets = options?.insetsM ?? PLACEMENT_INSETS_M;
108
339
  const along = options?.along ?? { x: 1, z: 0 };
109
340
  const inward = options?.inward ?? { x: 0, z: 1 };
110
341
  const out = [];
@@ -126,37 +357,113 @@ export function findValidPlacement(args) {
126
357
  const candidates = generatePlacementCandidates(args.primary, {
127
358
  along: args.along,
128
359
  inward: args.inward,
360
+ lateralsM: args.lateralsM,
361
+ insetsM: args.insetsM,
129
362
  });
130
- // Prefer reporting why the **primary** pose failed (door/overlap), not the
131
- // last lateral/inset candidate (often outside_bounds after large nudges).
132
- let primaryReason = null;
133
- const reasonPriority = [
134
- 'blocks_door_clearance',
135
- 'overlaps_item',
136
- 'outside_bounds',
137
- ];
138
- let bestFailReason = 'overlaps_item';
139
- for (let i = 0; i < candidates.length; i++) {
140
- const c = candidates[i];
141
- const rot = (c.rotationDeg * Math.PI) / 180;
142
- const aabb = itemPlanAabb([c.x, 0, c.z], args.dimensions, rot);
143
- const reason = classifyPlacement({
363
+ // Why the first spot that stands against a wall failed (a door, a piece), not the last nudge
364
+ // tried (often outside the room after large ones); off_wall when no spot had a wall.
365
+ let refused = null;
366
+ for (const c of candidates) {
367
+ const aabb = itemPlanAabb([c.x, 0, c.z], args.dimensions, (c.rotationDeg * Math.PI) / 180);
368
+ if (args.againstWalls && gapToWalls(aabb, args.againstWalls) > MID_ROOM_DISTANCE_M)
369
+ continue;
370
+ let reason = classifyPlacement({
144
371
  aabb,
145
372
  doorKeepouts: args.doorKeepouts,
146
373
  occupied: args.occupied,
147
374
  roomBounds: args.roomBounds,
148
375
  });
376
+ if (reason === 'ok' && args.roomOutline && !insideOutline(c, args.dimensions, args.roomOutline))
377
+ reason = 'outside_bounds';
149
378
  if (reason === 'ok')
150
379
  return { candidate: c, reason };
151
- if (i === 0)
152
- primaryReason = reason;
153
- const prevRank = reasonPriority.indexOf(bestFailReason);
154
- const nextRank = reasonPriority.indexOf(reason);
155
- if (nextRank >= 0 && (prevRank < 0 || nextRank < prevRank)) {
156
- bestFailReason = reason;
157
- }
380
+ refused ??= { at: c, reason };
381
+ }
382
+ return { candidate: null, reason: refused?.reason ?? 'off_wall', refused: refused?.at ?? null };
383
+ }
384
+ /** A wall-bound piece whose nearest edge is further than this from every wall face is not against a wall. */
385
+ export const MID_ROOM_DISTANCE_M = 0.4;
386
+ /** How far a piece may overlap a room's outline (m): touching it, give or take a millimetre. */
387
+ const OUTLINE_CONTACT_M = 1e-3;
388
+ const DEFAULT_WALL_THICKNESS_M = 0.1;
389
+ const cross = (o, p, q) => (p[0] - o[0]) * (q[1] - o[1]) - (p[1] - o[1]) * (q[0] - o[0]);
390
+ function distanceToSegment(point, a, b) {
391
+ const dx = b[0] - a[0];
392
+ const dz = b[1] - a[1];
393
+ const length2 = dx * dx + dz * dz;
394
+ const t = length2 === 0
395
+ ? 0
396
+ : Math.max(0, Math.min(1, ((point[0] - a[0]) * dx + (point[1] - a[1]) * dz) / length2));
397
+ return Math.hypot(point[0] - (a[0] + t * dx), point[1] - (a[1] + t * dz));
398
+ }
399
+ /** The shortest distance from a footprint box to a wall's centre line (0 when the line passes through it). */
400
+ function boxToSegment(box, a, b) {
401
+ const corners = [
402
+ [box.minX, box.minZ],
403
+ [box.maxX, box.minZ],
404
+ [box.maxX, box.maxZ],
405
+ [box.minX, box.maxZ],
406
+ ];
407
+ let nearest = Number.POSITIVE_INFINITY;
408
+ for (let i = 0; i < 4; i++) {
409
+ const c = corners[i];
410
+ const d = corners[(i + 1) % 4];
411
+ if (cross(a, b, c) * cross(a, b, d) < 0 && cross(c, d, a) * cross(c, d, b) < 0)
412
+ return 0;
413
+ nearest = Math.min(nearest, distanceToSegment(a, c, d), distanceToSegment(b, c, d), distanceToSegment(c, a, b), distanceToSegment(d, a, b));
414
+ }
415
+ return nearest;
416
+ }
417
+ /** The walls of a level (resolved through `byId`), as the mid-room check reads them. */
418
+ export function wallFacesOn(nodes, levelId, byId = new Map([...nodes].map((node) => [node.id, node]))) {
419
+ const walls = [];
420
+ for (const node of nodes) {
421
+ if (node.type !== 'wall' || resolveNodeLevelId(node.id, byId) !== levelId)
422
+ continue;
423
+ walls.push({
424
+ a: [node.start[0], node.start[1]],
425
+ b: [node.end[0], node.end[1]],
426
+ halfThickness: (node.thickness ?? DEFAULT_WALL_THICKNESS_M) / 2,
427
+ });
428
+ }
429
+ return walls;
430
+ }
431
+ /** How far a footprint stands from the nearest wall's face (m); Infinity with no wall. */
432
+ export function gapToWalls(box, walls) {
433
+ return Math.min(Number.POSITIVE_INFINITY, ...walls.map((wall) => Math.max(0, boxToSegment(box, wall.a, wall.b) - wall.halfThickness)));
434
+ }
435
+ /**
436
+ * Wall-bound pieces (a fridge, a counter, a bed, a sofa) that stand in a room but away from every
437
+ * wall: further than {@link MID_ROOM_DISTANCE_M} from the face of each wall of their level. Pieces
438
+ * outside every room, free-standing kinds, and levels with no walls are not judged.
439
+ */
440
+ export function findItemsMidRoom(args) {
441
+ const list = [...args.nodes];
442
+ const byId = new Map(list.map((node) => [node.id, node]));
443
+ const walls = wallFacesOn(list, args.levelId, byId);
444
+ const zones = list.filter((node) => node.type === 'zone' && resolveNodeLevelId(node.id, byId) === args.levelId);
445
+ if (walls.length === 0 || zones.length === 0)
446
+ return [];
447
+ const found = [];
448
+ for (const footprint of collectOccupiedFootprints(list, {
449
+ floorOnly: true,
450
+ ...(args.levelId === undefined ? {} : { levelId: args.levelId }),
451
+ })) {
452
+ const node = byId.get(footprint.id);
453
+ if (node?.type !== 'item' || furnitureKind(node.asset) !== 'wall')
454
+ continue;
455
+ const room = zones.find((zone) => pointInPolygon([node.position[0], node.position[2]], zone.polygon, true));
456
+ if (!room)
457
+ continue;
458
+ const gap = gapToWalls(footprint.aabb, walls);
459
+ if (gap <= MID_ROOM_DISTANCE_M)
460
+ continue;
461
+ found.push({
462
+ id: node.id,
463
+ message: `${footprint.name ?? node.asset.id} (${node.id}) stands in the middle of ${room.name || room.id}, ${gap.toFixed(1)} m from the nearest wall: a ${node.asset.id} belongs against a wall (place_in_room puts it there).`,
464
+ });
158
465
  }
159
- return { candidate: null, reason: primaryReason ?? bestFailReason };
466
+ return found;
160
467
  }
161
468
  /**
162
469
  * Collect layout issues, scoped per level so stacked floors do not false-positive.
@@ -184,6 +491,9 @@ export function layoutIssuesFromScene(nodes) {
184
491
  for (const c of findItemItemCollisions({ nodes: list, levelId })) {
185
492
  issues.set(c.message, c.violation === 'overlap' ? 'item_overlap' : 'item_too_close');
186
493
  }
494
+ for (const m of findItemsMidRoom({ nodes: list, levelId })) {
495
+ issues.set(m.message, 'item_mid_room');
496
+ }
187
497
  }
188
498
  // Deduplicate (node may appear under multiple walks)
189
499
  return [...issues].map(([message, type]) => ({ type, message }));
@@ -0,0 +1,12 @@
1
+ import type { AnyNode } from '../schema/index.js';
2
+ import type { NodeWrite } from './types.js';
3
+ /**
4
+ * A level written without a height reads as legacy data: the editor's load derives its storey plane
5
+ * from what it holds and rewrites its walls, stairs and ceilings to match, while a session that
6
+ * wrote it reads 2.5 m. A write that creates a level without one, or clears it, gets the height the
7
+ * editor would derive, from what the level holds once the whole write lands (an empty level: the
8
+ * default storey height), so every reader agrees. Fills the operations in place and returns a note
9
+ * per level filled, for the write's answer.
10
+ */
11
+ export declare function fillLevelHeights(ops: NodeWrite[], scene: Readonly<Record<string, AnyNode>>): string[];
12
+ //# sourceMappingURL=level-height-fill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"level-height-fill.d.ts","sourceRoot":"","sources":["../../src/agent-operations/level-height-fill.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAa,MAAM,WAAW,CAAA;AAEnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAIxC;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,SAAS,EAAE,EAChB,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GACvC,MAAM,EAAE,CA4CV"}
@@ -0,0 +1,59 @@
1
+ import { deriveLegacyLevelHeight } from '../services/level-height.js';
2
+ const round = (value) => Math.round(value * 100) / 100;
3
+ /**
4
+ * A level written without a height reads as legacy data: the editor's load derives its storey plane
5
+ * from what it holds and rewrites its walls, stairs and ceilings to match, while a session that
6
+ * wrote it reads 2.5 m. A write that creates a level without one, or clears it, gets the height the
7
+ * editor would derive, from what the level holds once the whole write lands (an empty level: the
8
+ * default storey height), so every reader agrees. Fills the operations in place and returns a note
9
+ * per level filled, for the write's answer.
10
+ */
11
+ export function fillLevelHeights(ops, scene) {
12
+ const after = { ...scene };
13
+ for (const op of ops) {
14
+ // A create's own parentId wins over its node's, as the write applies it.
15
+ if (op.op === 'create')
16
+ after[op.node.id] = op.parentId ? { ...op.node, parentId: op.parentId } : op.node;
17
+ else if (op.op === 'delete')
18
+ delete after[op.id];
19
+ else if (after[op.id])
20
+ after[op.id] = { ...after[op.id], ...op.data };
21
+ }
22
+ const notes = [];
23
+ const derive = (levelId) => {
24
+ const level = after[levelId];
25
+ if (level?.type !== 'level')
26
+ return null;
27
+ // The level's own list, and what names it as parent: a create lists no children yet.
28
+ const held = Object.values(after)
29
+ .filter((node) => node.parentId === levelId)
30
+ .map((node) => node.id);
31
+ const children = [...new Set([...(level.children ?? []), ...held])].filter((id) => after[id]);
32
+ const height = deriveLegacyLevelHeight(levelId, {
33
+ ...after,
34
+ [levelId]: { ...level, children },
35
+ });
36
+ const holds = children.some((id) => after[id]?.type === 'wall' || after[id]?.type === 'ceiling');
37
+ notes.push(holds
38
+ ? `level ${levelId}: height ${round(height)} m derived from its walls and ceilings, as the editor reads a level written without one`
39
+ : `level ${levelId}: height ${round(height)} m, the default storey height, as nothing on it gives one`);
40
+ return height;
41
+ };
42
+ for (const op of ops) {
43
+ if (op.op === 'create') {
44
+ if (op.node.type !== 'level' || op.node.height != null)
45
+ continue;
46
+ const height = derive(op.node.id);
47
+ if (height !== null)
48
+ op.node.height = height;
49
+ }
50
+ else if (op.op === 'update' && 'height' in op.data && op.data.height == null) {
51
+ if (after[op.id]?.type !== 'level')
52
+ continue;
53
+ const height = derive(op.id);
54
+ if (height !== null)
55
+ op.data.height = height;
56
+ }
57
+ }
58
+ return notes;
59
+ }
@@ -16,8 +16,12 @@ export declare function wallSummary(nodes: SceneNodes, wall: WallNode): {
16
16
  resolvedHeight: number;
17
17
  heightIsExplicit: boolean;
18
18
  thickness: number | undefined;
19
+ wallFaceChains: {
20
+ a: import("../index.js").WallFaceChainFinish;
21
+ b: import("../index.js").WallFaceChainFinish;
22
+ };
19
23
  openings: {
20
- id: `item_${string}` | `procedural-item_${string}` | `door_${string}` | `window_${string}` | `leanto_${string}`;
24
+ id: `door_${string}` | `item_${string}` | `leanto_${string}` | `procedural-item_${string}` | `window_${string}`;
21
25
  type: "door" | "window";
22
26
  position: [number, number, number];
23
27
  width: number;
@@ -1 +1 @@
1
- {"version":3,"file":"level-reads.d.ts","sourceRoot":"","sources":["../../src/agent-operations/level-reads.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAA2C,QAAQ,EAAY,MAAM,WAAW,CAAA;AAK5F,OAAO,EAAE,KAAK,gBAAgB,EAAe,MAAM,gBAAgB,CAAA;AAEnE,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAQzD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,GAAG,MAAM,CAe5E;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ;;;;;;;;;;;;;;;;;EAkB5D;AA2GD,2BAA2B;AAC3B,eAAO,MAAM,eAAe,EAAE,cAAc,CAAC,gBAAgB,CAE3D,CAAA;AAEF,mBAAmB;AACnB,eAAO,MAAM,QAAQ,EAAE,cAAc,CAAC,gBAAgB,CAIrD,CAAA;AAED,mBAAmB;AACnB,eAAO,MAAM,QAAQ,EAAE,cAAc,CAAC,gBAAgB,CAIrD,CAAA"}
1
+ {"version":3,"file":"level-reads.d.ts","sourceRoot":"","sources":["../../src/agent-operations/level-reads.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAA2C,QAAQ,EAAY,MAAM,WAAW,CAAA;AAM5F,OAAO,EAAE,KAAK,gBAAgB,EAAe,MAAM,gBAAgB,CAAA;AAEnE,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAQzD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,GAAG,MAAM,CAiB5E;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ;IAEzD,EAAE;IACF,IAAI;IACJ,KAAK;IACL,GAAG;IACH,MAAM;IACN,MAAM;IACN,cAAc;IACd,gBAAgB;IAChB,SAAS;IACT,cAAc;QACZ,CAAC;QACD,CAAC;;IAEH,QAAQ;;;;;;;EAOX;AA6GD,2BAA2B;AAC3B,eAAO,MAAM,eAAe,EAAE,cAAc,CAAC,gBAAgB,CAE3D,CAAA;AAEF,mBAAmB;AACnB,eAAO,MAAM,QAAQ,EAAE,cAAc,CAAC,gBAAgB,CAIrD,CAAA;AAED,mBAAmB;AACnB,eAAO,MAAM,QAAQ,EAAE,cAAc,CAAC,gBAAgB,CAIrD,CAAA"}
@@ -1,8 +1,9 @@
1
1
  import { area } from '../lib/polygon-boolean.js';
2
2
  import { roomFloorChoices } from '../lib/room-floor-choices.js';
3
3
  import { DEFAULT_LEVEL_HEIGHT } from '../services/level-height.js';
4
- import { getWallPlaneTop } from '../services/storey.js';
4
+ import { getWallTop } from '../services/storey.js';
5
5
  import { computeWallSlabSupport } from '../systems/slab/slab-support.js';
6
+ import { resolveWallFaceChain } from '../systems/wall/wall-finish.js';
6
7
  import { resolveWallEffectiveHeight } from '../systems/wall/wall-top.js';
7
8
  import { targetLevel } from './level-target.js';
8
9
  import { contentCounts, levelIdOf, levelRole, nodesOnLevel } from './scene-queries.js';
@@ -20,8 +21,8 @@ export function wallResolvedHeight(nodes, wall) {
20
21
  return resolveWallEffectiveHeight(wall, DEFAULT_LEVEL_HEIGHT, 0);
21
22
  const onLevel = nodesOnLevel(nodes, levelId);
22
23
  const support = computeWallSlabSupport(wall, ofType(onLevel, 'slab'), ofType(onLevel, 'wall'), wall.supportSlabId, undefined, 0, nodes);
23
- const planeTop = getWallPlaneTop(wall, levelId, nodes);
24
- return resolveWallEffectiveHeight(wall, planeTop, support.elevation);
24
+ return (getWallTop(wall, levelId, nodes, support.elevation) -
25
+ support.elevation);
25
26
  }
26
27
  export function wallSummary(nodes, wall) {
27
28
  return {
@@ -34,6 +35,10 @@ export function wallSummary(nodes, wall) {
34
35
  resolvedHeight: wallResolvedHeight(nodes, wall),
35
36
  heightIsExplicit: wall.height !== undefined,
36
37
  thickness: wall.thickness,
38
+ wallFaceChains: {
39
+ a: resolveWallFaceChain(wall, 'a'),
40
+ b: resolveWallFaceChain(wall, 'b'),
41
+ },
37
42
  openings: wall.children.flatMap((id) => {
38
43
  const child = nodes[id];
39
44
  if (child?.type !== 'door' && child?.type !== 'window')
@@ -60,6 +65,8 @@ const zoneSummary = (nodes, zone) => ({
60
65
  color: zone.color,
61
66
  polygon: zone.polygon,
62
67
  holes: zone.holes ?? [],
68
+ wallMaterial: zone.wallMaterial ?? null,
69
+ wallOverrides: zone.wallOverrides ?? [],
63
70
  ...zoneSize(zone),
64
71
  floor_choices: roomFloorChoices(nodes, zone.id),
65
72
  });
@@ -1 +1 @@
1
- {"version":3,"file":"list-levels.d.ts","sourceRoot":"","sources":["../../src/agent-operations/list-levels.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAE7C,mFAAmF;AACnF,eAAO,MAAM,UAAU,EAAE,cA4BxB,CAAA"}
1
+ {"version":3,"file":"list-levels.d.ts","sourceRoot":"","sources":["../../src/agent-operations/list-levels.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAE7C,mFAAmF;AACnF,eAAO,MAAM,UAAU,EAAE,cAiDxB,CAAA"}
@@ -1,6 +1,26 @@
1
+ import { levelGradeStanding } from '../lib/grade-standing.js';
2
+ import { groundSeat } from '../lib/ground-seat.js';
1
3
  import { levelRole, levelsOf } from './scene-queries.js';
2
4
  /** `list_levels`: every level of every building, in floor order, with its role. */
3
5
  export const listLevels = (nodes, _input, context) => {
6
+ const groundLevels = Object.values(nodes)
7
+ .filter((node) => node.type === 'building')
8
+ .flatMap((building) => {
9
+ const seat = groundSeat(nodes, building.id);
10
+ return seat
11
+ ? [
12
+ {
13
+ buildingId: building.id,
14
+ levelId: seat.levelId,
15
+ named: seat.explicit,
16
+ floorElevation: seat.floorElevation,
17
+ gradeElevation: seat.gradeElevation,
18
+ floorOverGrade: Math.round(seat.offset * 1000) / 1000,
19
+ seated: seat.seated,
20
+ },
21
+ ]
22
+ : [];
23
+ });
4
24
  const levels = levelsOf(nodes).map((level) => {
5
25
  const { role, metadataRole, referenceLevelId } = levelRole(nodes, level);
6
26
  return {
@@ -14,6 +34,8 @@ export const listLevels = (nodes, _input, context) => {
14
34
  isSupportLevel: role !== 'occupied',
15
35
  referenceLevelId,
16
36
  childCount: Array.isArray(level.children) ? level.children.length : 0,
37
+ gradeStanding: levelGradeStanding(nodes, level.id),
38
+ isGroundLevel: groundLevels.some((ground) => ground.levelId === level.id),
17
39
  isActive: level.id === context.activeLevelId,
18
40
  };
19
41
  });
@@ -21,6 +43,7 @@ export const listLevels = (nodes, _input, context) => {
21
43
  return {
22
44
  result: {
23
45
  activeLevelId: context.activeLevelId,
46
+ groundLevels,
24
47
  levelCount: levels.length,
25
48
  occupiedStoryCount,
26
49
  supportLevelCount: levels.length - occupiedStoryCount,
@@ -1 +1 @@
1
- {"version":3,"file":"material-preset.d.ts","sourceRoot":"","sources":["../../src/agent-operations/material-preset.ts"],"names":[],"mappings":"AA6CA;;;;;;;;GAQG;AACH,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,MAAM,GAAG,IAAI,CAkCf"}
1
+ {"version":3,"file":"material-preset.d.ts","sourceRoot":"","sources":["../../src/agent-operations/material-preset.ts"],"names":[],"mappings":"AAuCA;;;;;;;;GAQG;AACH,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,MAAM,GAAG,IAAI,CAkCf"}
@@ -1,17 +1,11 @@
1
- import { getCatalogMaterialById, LIBRARY_MATERIAL_REF_PREFIX, MATERIAL_CATALOG, parseMaterialColor, parseMaterialRef, } from '../material-library.js';
1
+ import { LIBRARY_MATERIAL_REF_PREFIX, MATERIAL_CATALOG, parseMaterialColor, parseMaterialRef, } from '../material-library.js';
2
2
  import { nodeSlotDeclarations } from '../node-slots/index.js';
3
3
  import { AnyNode } from '../schema/index.js';
4
+ import { isLibraryMaterialId } from './material-refs.js';
4
5
  const isPresetField = (key) => key === 'materialPreset' || key.endsWith('MaterialPreset');
5
- // Community-library ids (`library:mtl_…`): the host checks them against its
6
- // material catalog; without one they pass.
7
- const COMMUNITY_MATERIAL_ID_PREFIX = 'mtl_';
8
6
  function isKnownMaterialRef(value) {
9
7
  const ref = parseMaterialRef(value);
10
- if (!ref)
11
- return false;
12
- if (ref.kind === 'scene' || ref.id.startsWith(COMMUNITY_MATERIAL_ID_PREFIX))
13
- return true;
14
- return !!getCatalogMaterialById(ref.id);
8
+ return !!ref && (ref.kind === 'scene' || isLibraryMaterialId(ref.id));
15
9
  }
16
10
  function presetCatalogLine() {
17
11
  const byCategory = new Map();