@pascal-app/core 1.0.4 → 1.0.6

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
@@ -0,0 +1,639 @@
1
+ import { BlockNode, BuildingNode, CeilingNode, ColumnNode, DoorNode, ImportedMeshNode, ItemNode, LevelNode, SiteNode, SlabNode, WallNode, WindowNode, ZoneNode, } from '../../schema/index.js';
2
+ import { authoredItem } from './add-object-cases.js';
3
+ const rect = (x0, z0, x1, z1) => [
4
+ [x0, z0],
5
+ [x1, z0],
6
+ [x1, z1],
7
+ [x0, z1],
8
+ ];
9
+ /** A site, its building and two storeys, the ground one unnamed, with what each case adds. */
10
+ function scene(...nodes) {
11
+ const site = SiteNode.parse({ id: 'site_lot' });
12
+ const building = BuildingNode.parse({ id: 'building_main', parentId: site.id });
13
+ const ground = LevelNode.parse({ id: 'level_0', parentId: building.id, level: 0, height: 2.8 });
14
+ const upper = LevelNode.parse({
15
+ id: 'level_1',
16
+ parentId: building.id,
17
+ level: 1,
18
+ name: 'Upper',
19
+ height: 2.8,
20
+ });
21
+ const all = [site, building, ground, upper, ...nodes];
22
+ const byId = Object.fromEntries(all.map((node) => [node.id, { ...node }]));
23
+ for (const node of Object.values(byId)) {
24
+ const parent = node.parentId ? byId[node.parentId] : undefined;
25
+ if (parent && Array.isArray(parent.children) && !parent.children.includes(node.id))
26
+ parent.children = [...parent.children, node.id];
27
+ }
28
+ return { nodes: byId, rootNodeIds: [site.id] };
29
+ }
30
+ const pluginNode = (id, type) => ({
31
+ object: 'node',
32
+ id,
33
+ type,
34
+ parentId: 'level_0',
35
+ visible: true,
36
+ metadata: {},
37
+ position: [0, 0, 0],
38
+ });
39
+ const wall = (id, start, end, extra = {}) => WallNode.parse({ id, parentId: 'level_0', start, end, ...extra });
40
+ const kitchen = (levelId = 'level_0') => ZoneNode.parse({
41
+ id: 'zone_kitchen',
42
+ parentId: levelId,
43
+ name: 'Kitchen',
44
+ polygon: rect(-5, -5, 5, 5),
45
+ });
46
+ /** The ids of the whole nodes found, sorted, against the ones expected. */
47
+ const finds = (...expected) => (result) => {
48
+ const found = result.results
49
+ .filter((entry) => !entry.part)
50
+ .map((entry) => entry.id)
51
+ .sort();
52
+ const want = [...expected].sort();
53
+ return JSON.stringify(found) === JSON.stringify(want)
54
+ ? []
55
+ : [`found ${found.join(', ') || 'nothing'}, expected ${want.join(', ') || 'nothing'}`];
56
+ };
57
+ const find = (name, build, input, expected, extra = {}) => ({
58
+ name,
59
+ tool: 'find_by_type',
60
+ scene: build,
61
+ input,
62
+ ...(extra.surfaces && { surfaces: extra.surfaces }),
63
+ expect: {
64
+ result: { count: expected.length, ...extra.result },
65
+ ...(extra.contains && { contains: { results: extra.contains } }),
66
+ check: finds(...expected),
67
+ },
68
+ });
69
+ // ─── Source ids: a slice of the converted /next house, as find_nodes' own tests seeded it ─────────
70
+ function sourceScene() {
71
+ const tagged = wall('wall_ground-exterior-01', [0, 0], [6, 0], {
72
+ metadata: { sourceIds: ['ground/exterior-01'] },
73
+ });
74
+ const window = WindowNode.parse({
75
+ id: 'window_primary-rear-window-1',
76
+ parentId: tagged.id,
77
+ wallId: tagged.id,
78
+ position: [1, 1.2, 0],
79
+ metadata: { sourceIds: ['ground/exterior-01/window-1', 'sketchup:641553'] },
80
+ });
81
+ const block = BlockNode.parse({
82
+ id: 'block_screen-roof-gutter',
83
+ parentId: 'level_0',
84
+ metadata: { sourceIds: ['screen/roof-gutter'] },
85
+ });
86
+ const column = ColumnNode.parse({
87
+ id: 'column_screen-native-640313-1259',
88
+ parentId: 'level_0',
89
+ metadata: { sourceIds: ['screen/post-640313'] },
90
+ });
91
+ // A legacy converter id kept raw, one written as typed provenance requires (printable ASCII,
92
+ // the rest percent-encoded), and typed provenance refs with an alias.
93
+ const legacy = wall('wall_legacy', [0, 2], [1, 2], {
94
+ metadata: { sourceIds: ['Küche/Fenster-1'] },
95
+ });
96
+ const encoded = wall('wall_encoded', [0, 3], [1, 3], {
97
+ metadata: { sourceIds: ['K%C3%BCche/Fenster-2'] },
98
+ });
99
+ const typed = wall('wall_typed', [0, 4], [1, 4], {
100
+ provenance: {
101
+ refs: [
102
+ { ns: 'sketchup', id: 'K%C3%BCche/Fenster-3', role: 'primary' },
103
+ { id: 'kitchen/alias-3', role: 'alias' },
104
+ ],
105
+ },
106
+ });
107
+ const untagged = wall('wall_untagged', [0, 5], [6, 5]);
108
+ return scene(tagged, window, block, column, legacy, encoded, typed, untagged);
109
+ }
110
+ // ─── Zones: what stands in one, by its plan point on the zone's level ──────────────────────────────
111
+ function zoneScene() {
112
+ const near = wall('wall_near', [-2, 0], [2, 0]);
113
+ // Wall-local x = 1 on a wall starting at x = 20: the window stands at x = 21, outside.
114
+ const far = wall('wall_far', [20, 0], [26, 0]);
115
+ return scene(kitchen(), wall('wall_in', [-2, -2], [2, 2]), wall('wall_out', [50, 50], [60, 60]), near, far, WindowNode.parse({
116
+ id: 'window_near',
117
+ parentId: near.id,
118
+ wallId: near.id,
119
+ position: [1, 1.2, 0],
120
+ }), WindowNode.parse({ id: 'window_far', parentId: far.id, wallId: far.id, position: [1, 1.2, 0] }), WallNode.parse({ id: 'wall_upper', parentId: 'level_1', start: [-2, 0], end: [2, 0] }), ColumnNode.parse({ id: 'column_in', parentId: 'level_0', position: [1, 0, 1] }), ColumnNode.parse({ id: 'column_out', parentId: 'level_0', position: [20, 0, 20] }),
121
+ // A block's topology is centred on its origin.
122
+ BlockNode.parse({ id: 'block_in', parentId: 'level_0', position: [2, 0, 2] }),
123
+ // Converter meshes keep their origin at zero and their geometry in the vertices.
124
+ ImportedMeshNode.parse({
125
+ id: 'imesh_in',
126
+ parentId: 'level_0',
127
+ primitives: [{ positions: [2, 0, 2, 4, 0, 2, 4, 0, 4] }],
128
+ }), ImportedMeshNode.parse({
129
+ id: 'imesh_far',
130
+ parentId: 'level_0',
131
+ primitives: [{ positions: [30, 0, 30, 32, 0, 30, 32, 0, 32] }],
132
+ }),
133
+ // Geometry around local y = 10: a quarter turn about X swings it to plan z = 10, outside.
134
+ ImportedMeshNode.parse({
135
+ id: 'imesh_tilted',
136
+ parentId: 'level_0',
137
+ rotation: [Math.PI / 2, 0, 0],
138
+ primitives: [{ positions: [-1, 9, -1, 1, 11, -1, 1, 11, 1] }],
139
+ }), ImportedMeshNode.parse({
140
+ id: 'imesh_upright',
141
+ parentId: 'level_0',
142
+ primitives: [{ positions: [-1, 9, -1, 1, 11, -1, 1, 11, 1] }],
143
+ }));
144
+ }
145
+ // ─── Kinds, parents and the driveway Architect's method looks for ──────────────────────────────────
146
+ function kindsScene() {
147
+ const host = wall('wall_host', [0, 0], [4, 0], { height: 2.5 });
148
+ return scene(host, DoorNode.parse({ id: 'door_host', parentId: host.id, wallId: host.id, position: [1, 1.05, 0] }), WindowNode.parse({
149
+ id: 'window_host',
150
+ parentId: host.id,
151
+ wallId: host.id,
152
+ position: [3, 1.5, 0],
153
+ }), wall('wall_side', [0, 0], [0, 3]), WallNode.parse({ id: 'wall_upper', parentId: 'level_1', start: [0, 0], end: [4, 0] }), SlabNode.parse({ id: 'slab_floor', parentId: 'level_0', polygon: rect(0, 0, 4, 3) }), SlabNode.parse({
154
+ id: 'slab_drive',
155
+ parentId: 'level_0',
156
+ polygon: rect(4, -6, 7, 0),
157
+ metadata: { flatwork: 'driveway' },
158
+ }), BlockNode.parse({ id: 'block_bench', parentId: 'level_0' }), pluginNode('bench_plugin-1', 'fixture:bench'), pluginNode('studs_plugin-1', 'bones:studs'));
159
+ }
160
+ const KIND_IDS = [
161
+ 'site_lot',
162
+ 'building_main',
163
+ 'level_0',
164
+ 'level_1',
165
+ 'wall_host',
166
+ 'door_host',
167
+ 'window_host',
168
+ 'wall_side',
169
+ 'wall_upper',
170
+ 'slab_floor',
171
+ 'slab_drive',
172
+ 'block_bench',
173
+ 'bench_plugin-1',
174
+ 'studs_plugin-1',
175
+ ];
176
+ /** A zone drawn closed (its first corner repeated last), a column inside it and one far off. */
177
+ function closedZoneScene() {
178
+ return scene(ZoneNode.parse({
179
+ id: 'zone_closed',
180
+ parentId: 'level_0',
181
+ name: 'Closed',
182
+ polygon: [...rect(-5, -5, 5, 5), [-5, -5]],
183
+ }), ColumnNode.parse({ id: 'column_inside', parentId: 'level_0', position: [1, 0, 1] }), ColumnNode.parse({ id: 'column_far', parentId: 'level_0', position: [100, 0, 100] }));
184
+ }
185
+ /** A lamp that emits light, and a fan whose stored interactive part lists no effects. */
186
+ function lightsScene() {
187
+ const item = (id, name, interactive) => ItemNode.parse({
188
+ id,
189
+ parentId: 'level_0',
190
+ position: [1, 0, 1],
191
+ asset: {
192
+ id,
193
+ name,
194
+ category: 'furniture',
195
+ thumbnail: '',
196
+ src: `/items/${id}/model.glb`,
197
+ dimensions: [0.5, 0.5, 0.5],
198
+ interactive,
199
+ },
200
+ });
201
+ const lamp = item('item_lamp', 'Lamp', {
202
+ effects: [{ kind: 'light', intensityRange: [0, 2] }],
203
+ });
204
+ const fan = item('item_fan', 'Fan', { controls: [] });
205
+ const asset = fan.asset;
206
+ const { effects: _effects, ...interactive } = asset.interactive;
207
+ return scene(lamp, { ...fan, asset: { ...fan.asset, interactive } });
208
+ }
209
+ /** A plugin's kind in the singular alone. */
210
+ function singularKindScene() {
211
+ return scene(pluginNode('stud_plugin-1', 'bones:stud'));
212
+ }
213
+ /** A kind and its singular, both a plugin's, and one written with a capital. */
214
+ function pluralKindsScene() {
215
+ return scene(pluginNode('studs_plugin-1', 'bones:studs'), pluginNode('stud_plugin-1', 'bones:stud'), pluginNode('bench_plugin-2', 'fixture:Bench'));
216
+ }
217
+ /** A wall a level lists that does not name the level back, as a scene assembled whole stores it. */
218
+ function unlinkedScene() {
219
+ const { nodes, rootNodeIds } = kindsScene();
220
+ nodes.wall_side = { ...nodes.wall_side, parentId: null };
221
+ return { nodes, rootNodeIds };
222
+ }
223
+ /** A block stored without its topology beside a wall in the kitchen. */
224
+ function malformedBlockScene() {
225
+ const { nodes, rootNodeIds } = scene(kitchen(), wall('wall_in', [-2, -2], [2, 2]), BlockNode.parse({ id: 'block_broken', parentId: 'level_0', position: [1, 0, 1] }));
226
+ const { topology: _topology, ...broken } = nodes.block_broken;
227
+ nodes.block_broken = broken;
228
+ return { nodes, rootNodeIds };
229
+ }
230
+ /** An authored lantern with a glass pane, one whose manifest lists no parts, and a wall. */
231
+ function authoredScene() {
232
+ const lantern = authoredItem('item_lantern', 'level_0', {
233
+ name: 'Lantern',
234
+ category: 'lighting',
235
+ size: [0.3, 0.5, 0.3],
236
+ });
237
+ lantern.source.manifest.parts = [
238
+ { id: 'pane', type: 'glass' },
239
+ { id: 'cage', type: 'frame' },
240
+ ];
241
+ const bare = authoredItem('item_bare', 'level_0', {
242
+ name: 'Plinth',
243
+ category: 'decor',
244
+ size: [1, 0.4, 1],
245
+ });
246
+ const { parts: _parts, ...manifest } = bare.source.manifest;
247
+ return scene(lantern, { ...bare, source: { ...bare.source, manifest } }, wall('wall_a', [0, 0], [4, 0]));
248
+ }
249
+ /** A wall an IFC import tagged with a large property set, and one with a small mark. */
250
+ function recordsScene() {
251
+ const psets = Object.fromEntries(Array.from({ length: 40 }, (_, i) => [`Pset_WallCommon.Prop${i}`, `value ${i} `.repeat(4)]));
252
+ return scene(wall('wall_ifc', [0, 0], [4, 0], { metadata: { ifc: psets } }), wall('wall_marked', [0, 1], [4, 1], { metadata: { flatwork: 'walk' } }));
253
+ }
254
+ /** 250 columns on the ground storey: more than find_by_type lists unless asked. */
255
+ function crowdedScene() {
256
+ return scene(...Array.from({ length: 250 }, (_, i) => ColumnNode.parse({
257
+ id: `column_${String(i).padStart(3, '0')}`,
258
+ parentId: 'level_0',
259
+ position: [i, 0, 0],
260
+ })));
261
+ }
262
+ /**
263
+ * A porch across the kitchen's edge, its column in the zone, one 20 m off and a beam between, and a
264
+ * column post in the kitchen.
265
+ */
266
+ function porchScene() {
267
+ const porch = authoredItem('item_porch', 'level_0', {
268
+ name: 'Porch',
269
+ category: 'porch',
270
+ size: [21, 3, 1],
271
+ });
272
+ porch.source.manifest.parts = [
273
+ { id: 'near', type: 'column', bounds: { min: [-0.2, 0, -0.2], max: [0.2, 3, 0.2] } },
274
+ { id: 'far', type: 'column', bounds: { min: [19.8, 0, -0.2], max: [20.2, 3, 0.2] } },
275
+ { id: 'beam', type: 'beam', bounds: { min: [0, 2.8, 0], max: [20, 3, 0.2] } },
276
+ ];
277
+ return scene(kitchen(), porch, ColumnNode.parse({ id: 'column_post', parentId: 'level_0', position: [1, 0, 1] }));
278
+ }
279
+ /**
280
+ * A porch tipped a quarter turn about X, 3 m up: a column whose model middle is 8 m along its z
281
+ * stands half a metre from the kitchen's middle, one 20 m along x stays off.
282
+ */
283
+ function pitchedPorchScene() {
284
+ const porch = authoredItem('item_pitched', 'level_0', {
285
+ name: 'Pitched porch',
286
+ category: 'porch',
287
+ size: [21, 3, 9],
288
+ });
289
+ porch.source.manifest.parts = [
290
+ { id: 'near', type: 'column', bounds: { min: [-0.2, 0, 7.8], max: [0.2, 1, 8.2] } },
291
+ { id: 'far', type: 'column', bounds: { min: [19.8, 0, -0.2], max: [20.2, 1, 0.2] } },
292
+ { id: 'beam', type: 'beam', bounds: { min: [0, 0, 0], max: [20, 0.2, 0.2] } },
293
+ ];
294
+ return scene(kitchen(), { ...porch, position: [0, 3, 0], rotation: [Math.PI / 2, 0, 0] });
295
+ }
296
+ /** A room zone with a courtyard cut out of it, a wall in the courtyard and one in the room. */
297
+ function courtyardScene() {
298
+ return scene(ZoneNode.parse({
299
+ id: 'zone_ring',
300
+ parentId: 'level_0',
301
+ name: 'Cloister',
302
+ polygon: rect(-5, -5, 5, 5),
303
+ holes: [rect(-1, -1, 1, 1)],
304
+ }), wall('wall_courtyard', [-0.5, 0], [0.5, 0]), wall('wall_cloister', [-4, 3], [-2, 3]));
305
+ }
306
+ /** A wall whose stored children name a door that is not in the scene. */
307
+ function danglingChildScene() {
308
+ const { nodes, rootNodeIds } = describedScene();
309
+ nodes.wall_tall = { ...nodes.wall_tall, children: ['door_gone'] };
310
+ return { nodes, rootNodeIds };
311
+ }
312
+ /** How many results are listed, against the count. */
313
+ const lists = (listed) => (result) => result.results.length === listed
314
+ ? []
315
+ : [`listed ${result.results.length}, expected ${listed}`];
316
+ export const FIND_NODES_CASES = [
317
+ find('find_nodes { type: level } (every level, whole): every level, its id, kind and parent', kindsScene, { type: 'level' }, ['level_0', 'level_1'], {
318
+ contains: [
319
+ { id: 'level_0', nodeType: 'level', levelId: 'level_0', parentId: 'building_main' },
320
+ ],
321
+ }),
322
+ find('find_nodes { type: roof } on a scene with no roof ([]): nothing found', kindsScene, { type: 'roof' }, [], {
323
+ result: { type: 'roof', count: 0 },
324
+ }),
325
+ find('find_nodes { type: wall, levelId } (the walls of one storey): the same, the upper storey left out', kindsScene, { type: 'wall', levelId: 'level_0' }, ['wall_host', 'wall_side']),
326
+ find("find_nodes { parentId } (a wall's doors and windows): the same", kindsScene, { parentId: 'wall_host' }, ['door_host', 'window_host']),
327
+ find('find_nodes {} (every node): every node', kindsScene, {}, KIND_IDS),
328
+ find('find_nodes { type: block } (a kind the first enum lacked): the block', kindsScene, { type: 'block' }, ['block_bench']),
329
+ find('find_nodes { type: fixture:bench } (a plugin kind in the scene): the plugin node', kindsScene, { type: 'fixture:bench' }, ['bench_plugin-1']),
330
+ find('find_nodes { type: bones:studs } (a plugin kind ending in s): the kind as written, not a singular of it', kindsScene, { type: 'bones:studs' }, ['studs_plugin-1']),
331
+ find("find_nodes { type: slab }, then metadata.flatwork read off each (Architect's driveway check): each slab with its metadata", kindsScene, { type: 'slab' }, ['slab_floor', 'slab_drive'], { contains: [{ id: 'slab_drive', metadata: { flatwork: 'driveway' } }] }),
332
+ find('find_nodes { type: wall, zoneId } (walls whose midpoint is in the zone): the same', zoneScene, { type: 'wall', zoneId: 'zone_kitchen' }, ['wall_in', 'wall_near']),
333
+ find("find_nodes { type: wall, zoneId } with a wall on the storey above (only the zone's level): the same", zoneScene, { zoneId: 'zone_kitchen', type: 'wall', levelId: 'level_0' }, ['wall_in', 'wall_near']),
334
+ find('find_nodes { type: window, zoneId } (a window where its wall puts it): the near one', zoneScene, { type: 'window', zoneId: 'zone_kitchen' }, ['window_near']),
335
+ find('find_nodes { type: column, zoneId } (a positioned node by its origin): the one inside', zoneScene, { type: 'column', zoneId: 'zone_kitchen' }, ['column_in']),
336
+ find('find_nodes { type: block, zoneId } (a block by the middle of its topology): the block', zoneScene, { type: 'block', zoneId: 'zone_kitchen' }, ['block_in']),
337
+ find('find_nodes { type: imported-mesh, zoneId } (a mesh by its vertex bounds, turned in 3D first): the near and the upright one', zoneScene, { type: 'imported-mesh', zoneId: 'zone_kitchen' }, ['imesh_in', 'imesh_upright']),
338
+ find('find_nodes { zoneId } (everything in the zone): the zone, its walls, window, column, block and meshes', zoneScene, { zoneId: 'zone_kitchen' }, [
339
+ 'zone_kitchen',
340
+ 'wall_in',
341
+ 'wall_near',
342
+ 'window_near',
343
+ 'column_in',
344
+ 'block_in',
345
+ 'imesh_in',
346
+ 'imesh_upright',
347
+ ]),
348
+ {
349
+ name: 'find_nodes { zoneId } of no zone ([]): refused zone_not_found, with the id',
350
+ tool: 'find_by_type',
351
+ scene: zoneScene,
352
+ input: { type: 'wall', zoneId: 'zone_missing' },
353
+ expect: { refusal: 'zone_not_found', mentions: ['zone_missing'] },
354
+ },
355
+ {
356
+ name: 'find_nodes { zoneId } naming a wall ([]): refused not_a_zone',
357
+ tool: 'find_by_type',
358
+ scene: zoneScene,
359
+ input: { zoneId: 'wall_in' },
360
+ expect: { refusal: 'not_a_zone', mentions: ['wall_in'] },
361
+ },
362
+ {
363
+ name: 'find_nodes { parentId } of no node ([]): refused node_not_found, with the id',
364
+ tool: 'find_by_type',
365
+ scene: kindsScene,
366
+ input: { parentId: 'wall_missing' },
367
+ expect: { refusal: 'node_not_found', mentions: ['wall_missing'] },
368
+ },
369
+ find('find_nodes { sourceId } (any entry of metadata.sourceIds, exactly): the window, by either of its ids', sourceScene, { sourceId: 'sketchup:641553' }, ['window_primary-rear-window-1'], {
370
+ contains: [
371
+ {
372
+ id: 'window_primary-rear-window-1',
373
+ metadata: { sourceIds: ['ground/exterior-01/window-1', 'sketchup:641553'] },
374
+ },
375
+ ],
376
+ }),
377
+ find('find_nodes { sourceId } with the second id: the window', sourceScene, { sourceId: 'ground/exterior-01/window-1' }, ['window_primary-rear-window-1']),
378
+ find('find_nodes { sourceId } of a prefix only ([]): nothing found', sourceScene, { sourceId: 'ground/exterior' }, []),
379
+ find('find_nodes { sourceIdPrefix } (every node with an id starting with it, any kind): the wall and its window', sourceScene, { sourceIdPrefix: 'ground/exterior-01' }, ['wall_ground-exterior-01', 'window_primary-rear-window-1']),
380
+ find('find_nodes { sourceIdPrefix: screen/ }: the block and the column', sourceScene, { sourceIdPrefix: 'screen/' }, ['block_screen-roof-gutter', 'column_screen-native-640313-1259']),
381
+ find('find_nodes { sourceIdPrefix } outside printable ASCII (raw and percent-encoded entries): the legacy, the encoded and the typed walls', sourceScene, { sourceIdPrefix: 'Küche/' }, ['wall_legacy', 'wall_encoded', 'wall_typed']),
382
+ find('find_nodes { sourceId } outside printable ASCII, stored percent-encoded: that wall', sourceScene, { sourceId: 'Küche/Fenster-2' }, ['wall_encoded']),
383
+ find('find_nodes { sourceId } of a typed provenance ref: that wall, with its provenance', sourceScene, { sourceId: 'Küche/Fenster-3' }, ['wall_typed'], { contains: [{ id: 'wall_typed', provenance: { refs: expectRefs() } }] }),
384
+ find("find_nodes { sourceId } of a typed provenance ref's alias: that wall", sourceScene, { sourceId: 'kitchen/alias-3' }, ['wall_typed']),
385
+ find('find_nodes { sourceIdPrefix, type } (the filters combine): the window alone', sourceScene, { sourceIdPrefix: 'ground/', type: 'window' }, ['window_primary-rear-window-1']),
386
+ find('find_nodes { sourceIdPrefix, parentId }: the window alone', sourceScene, { sourceIdPrefix: 'ground/', parentId: 'wall_ground-exterior-01' }, ['window_primary-rear-window-1']),
387
+ find('find_nodes { sourceIdPrefix: screen/, type: wall } ([]): nothing found', sourceScene, { sourceIdPrefix: 'screen/', type: 'wall' }, []),
388
+ {
389
+ name: 'find_nodes { type: not-a-type } (refused: no such kind): refused unknown_type, with the kinds the scene holds',
390
+ tool: 'find_by_type',
391
+ scene: kindsScene,
392
+ input: { type: 'not-a-type' },
393
+ expect: { refusal: 'unknown_type', mentions: ['not-a-type', 'wall', 'fixture:bench'] },
394
+ },
395
+ {
396
+ name: 'find_nodes { type: windw } (a typo, refused): refused unknown_type',
397
+ tool: 'find_by_type',
398
+ scene: kindsScene,
399
+ input: { type: 'windw', levelId: 'level_0' },
400
+ expect: { refusal: 'unknown_type', mentions: ['windw'] },
401
+ },
402
+ find('find_nodes { type: window } on a storey with none (a real kind, filtered out): nothing found, count 0', kindsScene, { type: 'window', levelId: 'level_1' }, [], { result: { type: 'window', count: 0 } }),
403
+ find('find_nodes { type: glass } on a level with no lantern (a part type the scene holds elsewhere): nothing found, count 0', authoredScene, { type: 'glass', levelId: 'level_1' }, [], { result: { type: 'glass', count: 0 } }),
404
+ {
405
+ name: 'find_nodes {} on a scene of 254 nodes (every node, unbounded): count says all, the first 200 listed, truncated with a hint',
406
+ tool: 'find_by_type',
407
+ scene: crowdedScene,
408
+ input: {},
409
+ expect: {
410
+ result: { count: 254, nodes: 254, truncated: true },
411
+ mentions: ['200 of 254 listed', 'limit'],
412
+ check: lists(200),
413
+ },
414
+ },
415
+ {
416
+ name: 'find_nodes { type: column } on a scene of 250 columns (all 250): all of them with limit 250, not truncated',
417
+ tool: 'find_by_type',
418
+ scene: crowdedScene,
419
+ input: { type: 'column', limit: 250 },
420
+ expect: {
421
+ result: { count: 250 },
422
+ check: (result) => [...lists(250)(result), ...(result.truncated ? ['truncated'] : [])],
423
+ },
424
+ },
425
+ {
426
+ name: 'find_by_type { type: column, limit: 3 } (new, no find_nodes case): three listed, the count of all, truncated',
427
+ tool: 'find_by_type',
428
+ scene: crowdedScene,
429
+ input: { type: 'column', limit: 3 },
430
+ expect: { result: { count: 250, truncated: true }, check: lists(3) },
431
+ },
432
+ find("find_by_type { type: column, zoneId } on a porch across the zone's edge (new, find_nodes found no parts): the post and the porch's column in the zone, by the part's own bounds, not the one 20 m off", porchScene, { type: 'column', zoneId: 'zone_kitchen' }, ['column_post'], {
433
+ result: { count: 2, nodes: 1, parts: 1 },
434
+ contains: [{ id: 'item_porch', part: 'near', partType: 'column' }],
435
+ }),
436
+ find('find_by_type { type: column, zoneId } on a porch tipped about X (new): its column where the tilt puts it, not the one 20 m off', pitchedPorchScene, { type: 'column', zoneId: 'zone_kitchen' }, [], {
437
+ result: { count: 1, parts: 1 },
438
+ contains: [{ id: 'item_pitched', part: 'near', partType: 'column' }],
439
+ }),
440
+ {
441
+ name: 'find_by_type { type: column, limit: 2 } on the porch and the post (new): two listed, the count of the node and both parts, truncated',
442
+ tool: 'find_by_type',
443
+ scene: porchScene,
444
+ input: { type: 'column', limit: 2 },
445
+ expect: { result: { count: 3, nodes: 1, parts: 2, truncated: true }, check: lists(2) },
446
+ },
447
+ find('find_nodes { type: wall, zoneId } of a zone with a hole (a wall in the courtyard): the wall in the room alone', courtyardScene, { type: 'wall', zoneId: 'zone_ring' }, ['wall_cloister']),
448
+ find('find_nodes { type: column, zoneId } on a zone drawn closed (its first corner repeated): the column inside, not the one far off', closedZoneScene, { type: 'column', zoneId: 'zone_closed' }, ['column_inside']),
449
+ find('find_nodes { type: bones:studs } beside a bones:stud: the studs alone, under their own kind', pluralKindsScene, { type: 'bones:studs' }, ['studs_plugin-1'], { result: { type: 'bones:studs' } }),
450
+ {
451
+ name: 'find_nodes { type: bones:studs } with only a bones:stud in the scene (refused: no such kind): refused unknown_type, a plugin kind is never read as its singular',
452
+ tool: 'find_by_type',
453
+ scene: singularKindScene,
454
+ input: { type: 'bones:studs' },
455
+ expect: { refusal: 'unknown_type', mentions: ['bones:studs', 'bones:stud'] },
456
+ },
457
+ find("find_nodes { type: glass } (no node kind; a part type ending in s): the lantern's glass pane, under type glass", authoredScene, { type: 'glass' }, [], {
458
+ result: { type: 'glass', count: 1, parts: 1 },
459
+ contains: [{ id: 'item_lantern', part: 'pane', partType: 'glass' }],
460
+ }),
461
+ find('find_nodes { type: lights } beside an item whose stored interactive part lists no effects: the lamp', lightsScene, { type: 'lights' }, ['item_lamp']),
462
+ find('find_nodes { type: wall } beside an authored item whose manifest lists no parts: the wall', authoredScene, { type: 'wall' }, ['wall_a']),
463
+ find('find_nodes { type: fixture:Bench } (a kind written with a capital): that node, in any case', pluralKindsScene, { type: 'fixture:bench' }, ['bench_plugin-2']),
464
+ // Both stores link a node's parentId from its parent's children when they load a scene; the
465
+ // core operation reads parentId, so this graph is the MCP's and the chat's.
466
+ find("find_nodes { type: wall, levelId } with a wall its level lists but that names no parent (the bridge's ancestry by children): the wall, on the stores' load", unlinkedScene, { type: 'wall', levelId: 'level_0' }, ['wall_host', 'wall_side'], { surfaces: ['mcp', 'chat'] }),
467
+ find('find_nodes { type: wall, zoneId } beside a block stored without its topology (find_nodes read kinds first): the wall', malformedBlockScene, { type: 'wall', zoneId: 'zone_kitchen' }, ['wall_in']),
468
+ find('find_nodes { zoneId } beside a block stored without its topology: the zone, the wall and the block by its origin', malformedBlockScene, { zoneId: 'zone_kitchen' }, ['zone_kitchen', 'wall_in', 'block_broken']),
469
+ find('find_nodes { type: wall } (whole nodes, metadata and all): a small mark comes with its node, a large property set is named in omitted for get_node', recordsScene, { type: 'wall' }, ['wall_ifc', 'wall_marked'], {
470
+ contains: [
471
+ { id: 'wall_marked', metadata: { flatwork: 'walk' } },
472
+ { id: 'wall_ifc', omitted: ['metadata'] },
473
+ ],
474
+ }),
475
+ ];
476
+ function expectRefs() {
477
+ return [
478
+ { ns: 'sketchup', id: 'K%C3%BCche/Fenster-3', role: 'primary' },
479
+ { id: 'kitchen/alias-3', role: 'alias' },
480
+ ];
481
+ }
482
+ // ─── describe_node: its ancestry, children, properties and sentence, from get_node ────────────────
483
+ function describedScene() {
484
+ const host = wall('wall_host', [0, 0], [5, 0]);
485
+ const kitchenZone = ZoneNode.parse({
486
+ id: 'zone_kitchen',
487
+ parentId: 'level_0',
488
+ name: 'Kitchen',
489
+ spaceRole: 'room',
490
+ polygon: rect(0, 0, 5, 4),
491
+ });
492
+ return scene(host, DoorNode.parse({ id: 'door_host', parentId: host.id, wallId: host.id, position: [1, 1.05, 0] }), WindowNode.parse({
493
+ id: 'window_host',
494
+ parentId: host.id,
495
+ wallId: host.id,
496
+ position: [3.5, 1.5, 0],
497
+ }), wall('wall_tall', [0, 4], [5, 4], { height: 3.1 }), kitchenZone, SlabNode.parse({
498
+ id: 'slab_plate',
499
+ parentId: 'level_0',
500
+ plateRole: 'base',
501
+ polygon: rect(0, 0, 5, 4),
502
+ zoneIds: [kitchenZone.id],
503
+ }), CeilingNode.parse({ id: 'ceiling_auto', parentId: 'level_0', polygon: rect(0, 0, 5, 4) }), CeilingNode.parse({
504
+ id: 'ceiling_low',
505
+ parentId: 'level_0',
506
+ polygon: rect(0, 0, 2, 2),
507
+ height: 2.4,
508
+ }), ItemNode.parse({
509
+ id: 'item_sofa',
510
+ parentId: 'level_0',
511
+ position: [2, 0, 2],
512
+ asset: {
513
+ id: 'sofa',
514
+ name: 'Sofa',
515
+ category: 'furniture',
516
+ thumbnail: '/items/sofa/thumbnail.webp',
517
+ src: '/items/sofa/model.glb',
518
+ dimensions: [2, 0.8, 0.9],
519
+ },
520
+ }), pluginNode('bench_plugin-1', 'fixture:bench'));
521
+ }
522
+ /** The default tree assembled whole, as `loadScene()` writes it: no `parentId` above the walls. */
523
+ function assembledScene() {
524
+ const { nodes, rootNodeIds } = describedScene();
525
+ for (const id of ['site_lot', 'building_main', 'level_0', 'level_1'])
526
+ nodes[id] = { ...nodes[id], parentId: null };
527
+ return { nodes, rootNodeIds };
528
+ }
529
+ /** A wall whose stored children list its window but not its door. */
530
+ function unlistedChildScene() {
531
+ const { nodes, rootNodeIds } = describedScene();
532
+ nodes.wall_host = { ...nodes.wall_host, children: ['window_host'] };
533
+ return { nodes, rootNodeIds };
534
+ }
535
+ /** A wall stored without its start. */
536
+ function brokenWallScene() {
537
+ const { nodes, rootNodeIds } = describedScene();
538
+ const { start: _start, ...broken } = WallNode.parse({
539
+ id: 'wall_broken',
540
+ parentId: 'level_0',
541
+ start: [0, 0],
542
+ end: [4, 0],
543
+ });
544
+ nodes.wall_broken = broken;
545
+ nodes.level_0 = {
546
+ ...nodes.level_0,
547
+ children: [...nodes.level_0.children, 'wall_broken'],
548
+ };
549
+ return { nodes, rootNodeIds };
550
+ }
551
+ /** A door stored without its position, which its schema defaults. */
552
+ function bareDoorScene() {
553
+ const { nodes, rootNodeIds } = describedScene();
554
+ const { position: _position, ...door } = DoorNode.parse({
555
+ id: 'door_bare',
556
+ parentId: 'wall_host',
557
+ wallId: 'wall_host',
558
+ });
559
+ nodes.door_bare = door;
560
+ nodes.wall_host = {
561
+ ...nodes.wall_host,
562
+ children: [...nodes.wall_host.children, 'door_bare'],
563
+ };
564
+ return { nodes, rootNodeIds };
565
+ }
566
+ /** A slab stored without its polygon on the walls' level. */
567
+ function brokenSlabScene() {
568
+ const { nodes, rootNodeIds } = describedScene();
569
+ const { polygon: _polygon, ...slab } = SlabNode.parse({
570
+ id: 'slab_broken',
571
+ parentId: 'level_0',
572
+ polygon: rect(0, 0, 1, 1),
573
+ });
574
+ nodes.slab_broken = slab;
575
+ nodes.level_0 = {
576
+ ...nodes.level_0,
577
+ children: [...nodes.level_0.children, 'slab_broken'],
578
+ };
579
+ return { nodes, rootNodeIds };
580
+ }
581
+ const get = (name, id, result, build = describedScene, surfaces, mentions) => ({
582
+ name,
583
+ tool: 'get_node',
584
+ scene: build,
585
+ input: { id },
586
+ ...(surfaces && { surfaces }),
587
+ expect: { result, ...(mentions && { mentions }) },
588
+ });
589
+ export const DESCRIBE_NODE_CASES = [
590
+ get('describe_node on a wall (type, parentId, properties): node.type, node.parentId and its fields', 'wall_host', { node: { id: 'wall_host', type: 'wall', parentId: 'level_0', start: [0, 0], end: [5, 0] } }),
591
+ get('describe_node on a wall stored with no thickness ("thickness 0.10m"): node.resolvedThickness', 'wall_host', { node: { resolvedThickness: 0.1 } }),
592
+ get("describe_node on a wall with no height of its own (properties' resolvedHeight 2.75, under the storey's 2.8, heightIsExplicit false): the same on node", 'wall_host', { node: { resolvedHeight: 2.75, heightIsExplicit: false } }),
593
+ get('describe_node on a wall with its own height (resolvedHeight 3.1, heightIsExplicit true): the same', 'wall_tall', { node: { height: 3.1, resolvedHeight: 3.1, heightIsExplicit: true } }),
594
+ get('describe_node ancestryIds (the level and the building above a wall): ancestorIds, parent first, to the site', 'wall_host', { ancestorIds: ['level_0', 'building_main', 'site_lot'] }),
595
+ get('describe_node ancestryIds of a window (its wall, the level, …): ancestorIds from its wall', 'window_host', { ancestorIds: ['wall_host', 'level_0', 'building_main', 'site_lot'] }),
596
+ get("describe_node ancestryIds in a tree assembled whole (no parentId above the walls, the bridge's ancestry by children): the same, on the stores' load", 'wall_host', { ancestorIds: ['level_0', 'building_main', 'site_lot'] }, assembledScene, ['mcp', 'chat']),
597
+ get("describe_node childrenIds of a wall whose stored children omit its door (the bridge's children by parentId): node.children with the door after the window, on the stores' load", 'wall_host', { node: { children: ['window_host', 'door_host'] } }, unlistedChildScene, ['mcp', 'chat']),
598
+ get('describe_node on a wall stored without its start (its properties as stored): the node as stored, unresolved says why', 'wall_broken', {
599
+ node: { id: 'wall_broken', type: 'wall', end: [4, 0] },
600
+ ancestorIds: ['level_0', 'building_main', 'site_lot'],
601
+ }, brokenWallScene, undefined, ['schema rejects']),
602
+ get('describe_node on a door stored without its position (its schema fills it): the node as stored, with resolvedOpening', 'door_bare', { node: { id: 'door_bare', type: 'door', resolvedOpening: { anchor: 'floor' } } }, bareDoorScene),
603
+ get('describe_node on a wall beside a slab stored without its polygon: the wall as stored, unresolved names what does not read', 'wall_tall', { node: { id: 'wall_tall', height: 3.1 } }, brokenSlabScene, undefined, ['does not read']),
604
+ {
605
+ name: 'describe_node childrenIds of a wall (its door and window): node.children, and no missingChildIds',
606
+ tool: 'get_node',
607
+ scene: describedScene,
608
+ input: { id: 'wall_host' },
609
+ expect: {
610
+ result: { node: { children: ['door_host', 'window_host'] } },
611
+ check: (result) => ('missingChildIds' in result ? ['missingChildIds on a whole wall'] : []),
612
+ },
613
+ },
614
+ get('describe_node on a wall whose stored children name a door not in the scene (childrenIds [], properties.children as stored): node.children as stored, missingChildIds names it', 'wall_tall', { node: { children: ['door_gone'] }, missingChildIds: ['door_gone'] }, danglingChildScene),
615
+ get('describe_node on an unnamed ground storey ("Ground floor"): node.displayName', 'level_0', {
616
+ node: { id: 'level_0', displayName: 'Ground floor' },
617
+ ancestorIds: ['building_main', 'site_lot'],
618
+ }),
619
+ get('describe_node on a named storey ("Upper"): node.displayName', 'level_1', {
620
+ node: { name: 'Upper', displayName: 'Upper' },
621
+ }),
622
+ get('describe_node on a floor plate (its footprint name, "Kitchen floor"): node.displayName', 'slab_plate', { node: { plateRole: 'base', displayName: 'Kitchen floor' } }),
623
+ get('describe_node on a ceiling that follows its storey ("height 2.79m", under the 2.8 m storey): node.resolvedHeight, heightIsExplicit false', 'ceiling_auto', { node: { resolvedHeight: 2.79, heightIsExplicit: false } }),
624
+ get('describe_node on a ceiling with its own height (2.4 m): node.resolvedHeight 2.4, heightIsExplicit true', 'ceiling_low', { node: { height: 2.4, resolvedHeight: 2.4, heightIsExplicit: true } }),
625
+ get('describe_node on a door ("Door (0.90m x 2.10m)"): node.width and node.height, with resolvedOpening', 'door_host', { node: { type: 'door', width: 0.9, height: 2.1, resolvedOpening: { anchor: 'floor' } } }),
626
+ get('describe_node on a zone ("Zone "Kitchen" with 4 vertices"): node.name and node.polygon', 'zone_kitchen', { node: { name: 'Kitchen', polygon: rect(0, 0, 5, 4) } }),
627
+ get('describe_node on an item ("Item "Sofa" at (2,0,2)"): node.asset.name and node.position', 'item_sofa', { node: { asset: { name: 'Sofa' }, position: [2, 0, 2] } }),
628
+ get('describe_node on a plugin node ("fixture:bench node", its properties): the node as stored', 'bench_plugin-1', {
629
+ node: { type: 'fixture:bench', position: [0, 0, 0] },
630
+ ancestorIds: ['level_0', 'building_main', 'site_lot'],
631
+ }),
632
+ {
633
+ name: 'describe_node on an unknown id (an error): refused node_not_found, with the id',
634
+ tool: 'get_node',
635
+ scene: describedScene,
636
+ input: { id: 'wall_nope' },
637
+ expect: { refusal: 'node_not_found', mentions: ['wall_nope'] },
638
+ },
639
+ ];