@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
@@ -0,0 +1,29 @@
1
+ import { type PlanAabb } from './door-clearance.js';
2
+ import type { LevelTargetInput } from './level-target.js';
3
+ import type { AgentOperation } from './types.js';
4
+ export type ClearanceArea = PlanAabb & {
5
+ id: string;
6
+ };
7
+ export type PlaceInRoomInput = LevelTargetInput & {
8
+ assetId: string;
9
+ zoneId?: string;
10
+ polygon?: number[][];
11
+ edge?: number;
12
+ allowDuplicate?: boolean;
13
+ rotationDeg?: number;
14
+ facing?: 'in' | 'out';
15
+ align?: 'center' | 'start' | 'end';
16
+ offset?: number;
17
+ inset?: number;
18
+ clearanceAreas?: ClearanceArea[];
19
+ };
20
+ /**
21
+ * `place_in_room`: one floor-standing catalog item where it fits. A wall-bound piece (fridge, counter, bed, sofa,
22
+ * toilet) is set against a wall, centred in the widest free stretch of wall that clears every door
23
+ * and every other item, facing into the room, and is never set in the middle: when no wall has room
24
+ * the answer says how wide the widest stretch is. A free-standing piece (table, rug, plant) takes
25
+ * the middle of the room, or goes with what it belongs with and faces it (a coffee table and an
26
+ * armchair face the sofa). A chair is placed around its table facing it, and refused with no table.
27
+ */
28
+ export declare const placeInRoom: AgentOperation<PlaceInRoomInput>;
29
+ //# sourceMappingURL=place-in-room.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"place-in-room.d.ts","sourceRoot":"","sources":["../../src/agent-operations/place-in-room.ts"],"names":[],"mappings":"AAEA,OAAO,EAKL,KAAK,QAAQ,EACd,MAAM,kBAAkB,CAAA;AAIzB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAGtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAE7C,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,CAAA;AAErD,MAAM,MAAM,gBAAgB,GAAG,gBAAgB,GAAG;IAChD,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,EAAE,EAAE,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,CAAC,EAAE,IAAI,GAAG,KAAK,CAAA;IACrB,KAAK,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,KAAK,CAAA;IAClC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,cAAc,CAAC,EAAE,aAAa,EAAE,CAAA;CACjC,CAAA;AAqPD;;;;;;;GAOG;AACH,eAAO,MAAM,WAAW,EAAE,cAAc,CAAC,gBAAgB,CAwQxD,CAAA"}
@@ -0,0 +1,403 @@
1
+ import { refuse } from '../agent-tools/refusal.js';
2
+ import { ItemNode } from '../schema/index.js';
3
+ import { aabbsOverlap, collectDoorKeepouts, itemNodePlanCorners, itemPlanAabb, } from './door-clearance.js';
4
+ import { edgeFrame, roomToFurnish, WALL_GAP } from './furnish-room.js';
5
+ import { anchorOf, furnitureKind } from './furniture-kind.js';
6
+ import { classifyPlacement, collectOccupiedFootprints } from './layout-clearance.js';
7
+ import { pointInPolygon, polygonBounds } from './plan-geometry.js';
8
+ import { levelRole } from './scene-queries.js';
9
+ /** How far along a wall the sweep moves between the positions it tries. */
10
+ const STEP = 0.05;
11
+ /** A wall is sampled at no more than this many positions (30 m at STEP): a longer one gets a coarser step. */
12
+ const MAX_POSITIONS_PER_WALL = 600;
13
+ /** No room has more corners than this; the outline comes from the caller, and the search is cubic in it. */
14
+ const MAX_CORNERS = 128;
15
+ /** A chair sits this far off its table's edge: the clearance every item keeps (DEFAULT_ITEM_GAP) and a hair more. */
16
+ const CHAIR_GAP = 0.09;
17
+ const rad = (deg) => (deg / 180) * Math.PI;
18
+ const round = (value) => Math.round(value * 100) / 100;
19
+ const facingOf = (dx, dz) => (Math.atan2(dx, dz) * 180) / Math.PI;
20
+ /** Where a piece's front points: it is authored facing +Z, and turns counter-clockwise from above. */
21
+ const frontOf = (rotationDeg) => [
22
+ Math.sin(rad(rotationDeg)),
23
+ Math.cos(rad(rotationDeg)),
24
+ ];
25
+ /** The piece's four corners on the plan, for a room that is not a rectangle. */
26
+ function corners(pose, [width, , depth]) {
27
+ const front = frontOf(pose.rotationDeg);
28
+ const side = [front[1], -front[0]];
29
+ return [-1, 1].flatMap((s) => [-1, 1].map((f) => [
30
+ pose.x + side[0] * s * (width / 2) + front[0] * f * (depth / 2),
31
+ pose.z + side[1] * s * (width / 2) + front[1] * f * (depth / 2),
32
+ ]));
33
+ }
34
+ /** Whether the piece may stand there: inside the room, clear of every door and every other item. */
35
+ function fits(room, pose, dims, itemGap, occupied = room.occupied) {
36
+ const aabb = itemPlanAabb([pose.x, 0, pose.z], dims, rad(pose.rotationDeg));
37
+ const reason = classifyPlacement({
38
+ aabb,
39
+ doorKeepouts: room.doorKeepouts,
40
+ occupied,
41
+ roomBounds: {
42
+ maxX: room.bounds.maxX,
43
+ maxZ: room.bounds.maxZ,
44
+ minX: room.bounds.minX,
45
+ minZ: room.bounds.minZ,
46
+ },
47
+ ...(itemGap === undefined ? {} : { itemGap }),
48
+ ...(room.options.inset === undefined ? {} : { padding: 0 }),
49
+ });
50
+ if (reason !== 'ok')
51
+ return false;
52
+ if (!corners(pose, dims).every((corner) => pointInPolygon(corner, room.polygon, true)))
53
+ return false;
54
+ const blocked = (room.options.clearanceAreas ?? []).filter((area) => aabbsOverlap(aabb, area, 0));
55
+ for (const area of blocked)
56
+ room.blockedClearanceIds.add(area.id);
57
+ return blocked.length === 0;
58
+ }
59
+ const chosenYaw = (input, preferred) => (input.rotationDeg ?? preferred) + (input.facing === 'out' ? 180 : 0);
60
+ /** Project the rotated footprint onto the wall tangent and normal, not its authored axes. */
61
+ function wallGeometry(room, edge, dims) {
62
+ const frame = edgeFrame(room.polygon, edge, room.center);
63
+ const rotationDeg = chosenYaw(room.options, frame.facing);
64
+ const relative = rad(rotationDeg - frame.facing);
65
+ const half = (Math.abs(Math.cos(relative)) * dims[0] + Math.abs(Math.sin(relative)) * dims[2]) / 2;
66
+ const reach = (Math.abs(Math.sin(relative)) * dims[0] + Math.abs(Math.cos(relative)) * dims[2]) / 2 +
67
+ (room.options.inset ?? WALL_GAP);
68
+ return { frame, rotationDeg, half, reach };
69
+ }
70
+ function wallPoseAt(room, edge, dims, s) {
71
+ const { frame, rotationDeg, reach } = wallGeometry(room, edge, dims);
72
+ const start = room.polygon[edge % room.polygon.length];
73
+ return {
74
+ rotationDeg,
75
+ x: start[0] + frame.along.x * s + frame.inward.x * reach,
76
+ z: start[1] + frame.along.z * s + frame.inward.z * reach,
77
+ };
78
+ }
79
+ function desiredAlong(room, edge, dims) {
80
+ if (room.options.align === undefined && room.options.offset === undefined)
81
+ return undefined;
82
+ const { frame, half } = wallGeometry(room, edge, dims);
83
+ const base = room.options.align === 'start'
84
+ ? half
85
+ : room.options.align === 'end'
86
+ ? frame.length - half
87
+ : frame.length / 2;
88
+ return Math.max(half, Math.min(frame.length - half, base + (room.options.offset ?? 0)));
89
+ }
90
+ /** The free stretches of one wall for a piece: where its centre may stand along the edge, in runs. */
91
+ function runsAlong(room, edge, dims) {
92
+ const { frame, half } = wallGeometry(room, edge, dims);
93
+ const width = half * 2;
94
+ const runs = [];
95
+ let from = null;
96
+ let to = 0;
97
+ // Reserve two samples for the end and the caller's desired alignment.
98
+ const step = Math.max(STEP, (frame.length - width) / (MAX_POSITIONS_PER_WALL - 3));
99
+ if (half > frame.length - half)
100
+ return runs;
101
+ const positions = [];
102
+ for (let s = half; s <= frame.length - half + 1e-9 && positions.length < MAX_POSITIONS_PER_WALL - 2; s += step)
103
+ positions.push(s);
104
+ positions.push(frame.length - half);
105
+ const desired = desiredAlong(room, edge, dims);
106
+ if (desired !== undefined)
107
+ positions.push(desired);
108
+ for (const s of [...new Set(positions)].sort((a, b) => a - b)) {
109
+ const pose = wallPoseAt(room, edge, dims, s);
110
+ if (fits(room, pose, dims)) {
111
+ from ??= s;
112
+ to = s;
113
+ }
114
+ else if (from !== null) {
115
+ runs.push({ edge, frame, from, span: to - from + width, to });
116
+ from = null;
117
+ }
118
+ }
119
+ if (from !== null)
120
+ runs.push({ edge, frame, from, span: to - from + width, to });
121
+ return runs;
122
+ }
123
+ /** The desired alignment, clamped to a free run, or its centre when no alignment was requested. */
124
+ function poseInRun(room, run, dims) {
125
+ const desired = desiredAlong(room, run.edge, dims) ?? (run.from + run.to) / 2;
126
+ return wallPoseAt(room, run.edge, dims, Math.max(run.from, Math.min(run.to, desired)));
127
+ }
128
+ /** The widest free stretch of wall that any piece of this depth could use, for the refusal. */
129
+ function widestFree(room, dims, edges) {
130
+ const probe = [0.1, dims[1], dims[2]];
131
+ let widest = null;
132
+ for (const edge of edges)
133
+ for (const run of runsAlong(room, edge, probe))
134
+ if (!widest || run.span > widest.span)
135
+ widest = run;
136
+ return widest;
137
+ }
138
+ const nameOf = (node) => `${node.asset.id} ${node.name ?? node.asset.name ?? ''}`.toLowerCase();
139
+ function itemDims(node) {
140
+ const [w = 1, h = 1, d = 1] = node.asset.dimensions ?? [1, 1, 1];
141
+ return [w, h, d];
142
+ }
143
+ /** Slots around a table for chairs, best first: the middle of the long sides, then the ends, then beside. */
144
+ function chairSlots(table, chair, input) {
145
+ const tableDims = itemDims(table);
146
+ const tw = tableDims[0] * Math.abs(table.scale[0]);
147
+ const td = tableDims[2] * Math.abs(table.scale[2]);
148
+ const turn = table.rotation[1] ?? 0;
149
+ const [chairWidth] = chair;
150
+ const tableCorners = itemNodePlanCorners(table);
151
+ const center = [
152
+ tableCorners.reduce((sum, [x]) => sum + x, 0) / tableCorners.length,
153
+ tableCorners.reduce((sum, [, z]) => sum + z, 0) / tableCorners.length,
154
+ ];
155
+ /** A direction or a point in the table's own frame (x along its width, z along its front), on the plan. */
156
+ const world = (x, z) => [
157
+ x * Math.cos(turn) + z * Math.sin(turn),
158
+ -x * Math.sin(turn) + z * Math.cos(turn),
159
+ ];
160
+ const slots = [];
161
+ /** On the side whose outward normal is (nx, nz) in the table's frame, `lateral` along that side. */
162
+ const slot = (nx, nz, lateral = 0) => {
163
+ const [outX, outZ] = world(nx, nz);
164
+ const rotationDeg = chosenYaw(input, facingOf(-outX, -outZ));
165
+ // Separate the actual rectangles on this table-side normal, after the caller's yaw.
166
+ const tableReach = Math.max(...tableCorners.map(([x, z]) => (x - center[0]) * outX + (z - center[1]) * outZ));
167
+ const chairReach = -Math.min(...corners({ x: 0, z: 0, rotationDeg }, chair).map(([x, z]) => x * outX + z * outZ));
168
+ const reach = tableReach + chairReach + CHAIR_GAP;
169
+ const [x, z] = world(nx * reach + (nz !== 0 ? lateral : 0), nz * reach + (nz === 0 ? lateral : 0));
170
+ slots.push({
171
+ // Straight across its side, front to the table: facing the centre would turn a chair set beside the middle one.
172
+ rotationDeg,
173
+ x: center[0] + x,
174
+ z: center[1] + z,
175
+ });
176
+ };
177
+ const long = tw >= td
178
+ ? [
179
+ [0, 1],
180
+ [0, -1],
181
+ ]
182
+ : [
183
+ [1, 0],
184
+ [-1, 0],
185
+ ];
186
+ const ends = tw >= td
187
+ ? [
188
+ [1, 0],
189
+ [-1, 0],
190
+ ]
191
+ : [
192
+ [0, 1],
193
+ [0, -1],
194
+ ];
195
+ for (const [nx, nz] of long)
196
+ slot(nx, nz);
197
+ for (const [nx, nz] of ends)
198
+ slot(nx, nz);
199
+ const shift = chairWidth + 0.12;
200
+ for (const lateral of [shift, -shift, 2 * shift, -2 * shift])
201
+ for (const [nx, nz] of long)
202
+ slot(nx, nz, lateral);
203
+ return slots;
204
+ }
205
+ /**
206
+ * `place_in_room`: one floor-standing catalog item where it fits. A wall-bound piece (fridge, counter, bed, sofa,
207
+ * toilet) is set against a wall, centred in the widest free stretch of wall that clears every door
208
+ * and every other item, facing into the room, and is never set in the middle: when no wall has room
209
+ * the answer says how wide the widest stretch is. A free-standing piece (table, rug, plant) takes
210
+ * the middle of the room, or goes with what it belongs with and faces it (a coffee table and an
211
+ * armchair face the sofa). A chair is placed around its table facing it, and refused with no table.
212
+ */
213
+ export const placeInRoom = (nodes, input, context) => {
214
+ for (const key of ['rotationDeg', 'offset', 'inset'])
215
+ if (input[key] !== undefined && !Number.isFinite(input[key]))
216
+ refuse('invalid_placement_options', `${key} must be a finite number.`);
217
+ if ((input.facing !== undefined && !['in', 'out'].includes(input.facing)) ||
218
+ (input.align !== undefined && !['center', 'start', 'end'].includes(input.align)))
219
+ refuse('invalid_placement_options', 'Use facing in/out and align center/start/end.');
220
+ if (input.clearanceAreas !== undefined &&
221
+ (!Array.isArray(input.clearanceAreas) ||
222
+ input.clearanceAreas.length > 128 ||
223
+ !input.clearanceAreas.every((area) => area &&
224
+ typeof area.id === 'string' &&
225
+ area.id.length > 0 &&
226
+ [area.minX, area.maxX, area.minZ, area.maxZ].every(Number.isFinite) &&
227
+ area.minX <= area.maxX &&
228
+ area.minZ <= area.maxZ)))
229
+ refuse('invalid_clearance_areas', 'Supply at most 128 finite normalized clearance rectangles with ids.');
230
+ const catalog = context.catalog;
231
+ if (!catalog)
232
+ refuse('no_catalog', 'This host has no item catalog to place from.');
233
+ const asset = catalog.find((entry) => entry.id === input.assetId);
234
+ if (!asset)
235
+ refuse('asset_not_found', `${input.assetId} is not in the item catalog: use an id search_assets returned.`, { assetId: input.assetId });
236
+ if (asset.attachTo !== undefined)
237
+ refuse('unsupported_attachment', `${asset.id} attaches to a ${asset.attachTo === 'ceiling' ? 'ceiling' : 'wall'}, not the room floor. Use place_items with targetNodeId naming its host${asset.attachTo === 'ceiling' ? '' : ' and y giving its bottom height above the floor'}.`, { assetId: asset.id, attachTo: asset.attachTo });
238
+ const { levelId, polygon } = roomToFurnish(nodes, input, context);
239
+ if (polygon.length > MAX_CORNERS)
240
+ refuse('polygon_too_large', `A room outline has at most ${MAX_CORNERS} corners; this one has ${polygon.length}.`, { corners: polygon.length });
241
+ if (!polygon.every((corner) => corner.length === 2 && corner.every(Number.isFinite)))
242
+ refuse('polygon_invalid', 'Every corner of the room outline must be a pair of finite numbers.');
243
+ const level = nodes[levelId];
244
+ if (level && levelRole(nodes, level).role === 'roof')
245
+ refuse('roof_level', `${level.name || level.id} is a roof level, not a storey.`, { levelId });
246
+ if (input.edge !== undefined &&
247
+ (!Number.isInteger(input.edge) || input.edge < 0 || input.edge >= polygon.length))
248
+ refuse('edge_out_of_range', `The room has ${polygon.length} edges (0–${polygon.length - 1}); there is no edge ${input.edge}.`);
249
+ const all = Object.values(nodes);
250
+ const bounds = polygonBounds(polygon);
251
+ const room = {
252
+ bounds,
253
+ center: [bounds.centerX, bounds.centerZ],
254
+ doorKeepouts: collectDoorKeepouts(all, { levelId }).map((door) => door.aabb),
255
+ occupied: collectOccupiedFootprints(all, { floorOnly: true, levelId }).map((footprint) => footprint.aabb),
256
+ polygon,
257
+ options: input,
258
+ blockedClearanceIds: new Set(),
259
+ };
260
+ const inRoom = all.filter((node) => node.type === 'item' &&
261
+ node.parentId === levelId &&
262
+ pointInPolygon([node.position[0], node.position[2]], polygon, true));
263
+ const dims = itemDims({ asset });
264
+ const kind = furnitureKind(asset);
265
+ const wallTargeted = input.edge !== undefined ||
266
+ input.align !== undefined ||
267
+ input.offset !== undefined ||
268
+ input.inset !== undefined;
269
+ if (kind !== 'chair' &&
270
+ !input.allowDuplicate &&
271
+ inRoom.some((node) => node.asset.id === asset.id))
272
+ refuse('duplicate_item', `The room already has a ${asset.id}. Pass allowDuplicate to add another.`, { assetId: asset.id });
273
+ const named = (pattern) => new RegExp(pattern);
274
+ const refuseClearance = () => {
275
+ if (room.blockedClearanceIds.size)
276
+ refuse('stair_blocked', `No free spot for ${asset.id} clears the supplied clearance areas: ${[...room.blockedClearanceIds].join(', ')}.`, { assetId: asset.id, clearanceAreaIds: [...room.blockedClearanceIds] });
277
+ };
278
+ const place = (pose, where) => {
279
+ const node = ItemNode.parse({
280
+ asset,
281
+ name: asset.name,
282
+ parentId: levelId,
283
+ position: [pose.x, 0, pose.z],
284
+ rotation: [0, rad(pose.rotationDeg), 0],
285
+ });
286
+ return {
287
+ changes: { create: [{ node, parentId: levelId }] },
288
+ result: {
289
+ ok: true,
290
+ itemId: node.id,
291
+ kind,
292
+ placed: { position: [round(pose.x), round(pose.z)], rotationDeg: round(pose.rotationDeg) },
293
+ ...where,
294
+ message: `Placed ${asset.id} ${Object.keys(where).includes('around') ? 'around its table' : 'in the room'}.`,
295
+ },
296
+ };
297
+ };
298
+ // Without an explicit wall target, a chair goes around its table, or nowhere.
299
+ if (kind === 'chair' && !wallTargeted) {
300
+ const table = inRoom
301
+ .filter((node) => named('table|desk').test(nameOf(node)))
302
+ .sort((a, b) => Math.hypot(a.position[0] - room.center[0], a.position[2] - room.center[1]) -
303
+ Math.hypot(b.position[0] - room.center[0], b.position[2] - room.center[1]))[0];
304
+ if (!table)
305
+ refuse('no_table', `A ${asset.id} goes around a table, and this room has none: place the table first.`, { assetId: asset.id });
306
+ // The table is cleared by the oriented slot geometry; every other item still blocks.
307
+ const others = collectOccupiedFootprints(all, {
308
+ floorOnly: true,
309
+ levelId,
310
+ excludeIds: new Set([table.id]),
311
+ }).map((footprint) => footprint.aabb);
312
+ for (const slot of chairSlots(table, dims, input)) {
313
+ if (fits(room, slot, dims, undefined, others))
314
+ return place(slot, { around: table.id });
315
+ }
316
+ refuseClearance();
317
+ refuse('no_free_spot', `No free place is left around the table for another ${asset.id}: every side of ${table.id} that is clear of doors and walls is taken.`, { assetId: asset.id });
318
+ }
319
+ const edges = input.edge !== undefined ? [input.edge] : polygon.map((_, index) => index);
320
+ const wallPose = () => {
321
+ const runs = edges.flatMap((edge) => runsAlong(room, edge, dims));
322
+ const distance = (run) => {
323
+ const desired = desiredAlong(room, run.edge, dims);
324
+ return desired === undefined ? 0 : Math.max(run.from - desired, desired - run.to, 0);
325
+ };
326
+ runs.sort((a, b) => distance(a) - distance(b) || b.span - a.span);
327
+ for (const run of runs) {
328
+ const poses = [
329
+ poseInRun(room, run, dims),
330
+ wallPoseAt(room, run.edge, dims, run.from),
331
+ wallPoseAt(room, run.edge, dims, run.to),
332
+ ];
333
+ for (const pose of poses)
334
+ if (fits(room, pose, dims))
335
+ return { against: run.edge, pose };
336
+ }
337
+ return null;
338
+ };
339
+ if (kind === 'free' && !wallTargeted) {
340
+ const anchorPattern = anchorOf(asset);
341
+ const anchor = anchorPattern
342
+ ? inRoom
343
+ .filter((node) => named(anchorPattern).test(nameOf(node)))
344
+ .sort((a, b) => Math.hypot(a.position[0] - room.center[0], a.position[2] - room.center[1]) -
345
+ Math.hypot(b.position[0] - room.center[0], b.position[2] - room.center[1]))[0]
346
+ : undefined;
347
+ const candidates = [];
348
+ const faceToward = (x, z, target) => ({
349
+ rotationDeg: facingOf(target[0] - x, target[1] - z),
350
+ x,
351
+ z,
352
+ });
353
+ if (anchor) {
354
+ const [aw, , ad] = itemDims(anchor);
355
+ const front = frontOf(((anchor.rotation[1] ?? 0) * 180) / Math.PI);
356
+ const target = [anchor.position[0], anchor.position[2]];
357
+ const reach = ad / 2 + 0.4 + dims[2] / 2;
358
+ candidates.push(faceToward(target[0] + front[0] * reach, target[1] + front[1] * reach, target));
359
+ const side = [front[1], -front[0]];
360
+ for (const sign of [1, -1])
361
+ candidates.push(faceToward(target[0] +
362
+ front[0] * (ad / 2 + 0.5 + dims[2] / 2) +
363
+ side[0] * sign * (aw / 2 + dims[0] / 2 + 0.2), target[1] +
364
+ front[1] * (ad / 2 + 0.5 + dims[2] / 2) +
365
+ side[1] * sign * (aw / 2 + dims[0] / 2 + 0.2), target));
366
+ }
367
+ // The middle of the room: facing what it belongs with, else its width along the room's long
368
+ // axis; and when that does not fit (a door's clear zone, a counter), the other turns.
369
+ const preferred = anchor
370
+ ? facingOf(anchor.position[0] - room.center[0], anchor.position[2] - room.center[1])
371
+ : room.bounds.width >= room.bounds.depth
372
+ ? 0
373
+ : 90;
374
+ for (const turn of anchor ? [0] : [0, 90, 180, 270])
375
+ candidates.push({
376
+ rotationDeg: anchor ? preferred : (preferred + turn) % 360,
377
+ x: room.center[0],
378
+ z: room.center[1],
379
+ });
380
+ for (const candidate of candidates) {
381
+ const pose = { ...candidate, rotationDeg: chosenYaw(input, candidate.rotationDeg) };
382
+ if (fits(room, pose, dims))
383
+ return place(pose, anchor ? { facing: anchor.id } : {});
384
+ }
385
+ }
386
+ const found = wallPose();
387
+ if (found)
388
+ return place(found.pose, {
389
+ against: {
390
+ edge: found.against,
391
+ wall: `edge ${found.against} of ${polygon.length}`,
392
+ },
393
+ });
394
+ refuseClearance();
395
+ const widest = widestFree(room, dims, edges);
396
+ refuse('no_free_spot', `No wall has room for ${asset.id} (${round(dims[0])} × ${round(dims[2])} m)${widest
397
+ ? `: the widest free stretch of wall is ${round(widest.span)} m, on edge ${widest.edge}`
398
+ : ': no wall of the room is free'}. A smaller one, another room, or remove something.`, {
399
+ assetId: asset.id,
400
+ widestFreeRunM: widest ? round(widest.span) : 0,
401
+ ...(widest ? { edge: widest.edge } : {}),
402
+ });
403
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"place-items.d.ts","sourceRoot":"","sources":["../../src/agent-operations/place-items.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,KAAK,gBAAgB,EAAe,MAAM,gBAAgB,CAAA;AAOnE,OAAO,KAAK,EAAE,cAAc,EAA4B,MAAM,SAAS,CAAA;AAEvE,KAAK,KAAK,GAAG;IACX,OAAO,EAAE,MAAM,CAAA;IACf,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,CAAC,EAAE,MAAM,CAAA;IACV,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AACD,KAAK,eAAe,GAAG,gBAAgB,GAAG;IAAE,KAAK,EAAE,KAAK,EAAE,CAAA;CAAE,CAAA;AA6K5D;;;GAGG;AACH,eAAO,MAAM,UAAU,EAAE,cAAc,CAAC,eAAe,CAuHtD,CAAA"}
1
+ {"version":3,"file":"place-items.d.ts","sourceRoot":"","sources":["../../src/agent-operations/place-items.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,KAAK,gBAAgB,EAAe,MAAM,gBAAgB,CAAA;AAQnE,OAAO,KAAK,EAAE,cAAc,EAA4B,MAAM,SAAS,CAAA;AAEvE,KAAK,KAAK,GAAG;IACX,OAAO,EAAE,MAAM,CAAA;IACf,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,CAAC,EAAE,MAAM,CAAA;IACV,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AACD,KAAK,eAAe,GAAG,gBAAgB,GAAG;IAAE,KAAK,EAAE,KAAK,EAAE,CAAA;CAAE,CAAA;AA8K5D;;;GAGG;AACH,eAAO,MAAM,UAAU,EAAE,cAAc,CAAC,eAAe,CAkItD,CAAA"}
@@ -1,4 +1,5 @@
1
1
  import { refuse } from '../agent-tools/refusal.js';
2
+ import { OUTSIDE_SOURCES } from '../agent-tools/sources.js';
2
3
  import { floorItemFit } from '../building/floor-item-fit.js';
3
4
  import { flushMountRotation, geometrySurfaceAt, geometryUndersideAt, mountsFlush, } from '../lib/geometry-surfaces.js';
4
5
  import { ItemNode } from '../schema/index.js';
@@ -6,6 +7,7 @@ import { getWallLocalFaceZ } from '../systems/wall/wall-frame.js';
6
7
  import { collectDoorKeepouts } from './door-clearance.js';
7
8
  import { targetLevel } from './level-target.js';
8
9
  import { pointInPolygon, projectWorldPointToWallLocalX, wallLength, } from './plan-geometry.js';
10
+ import { roofLevelRefusal } from './roof-writes.js';
9
11
  /**
10
12
  * What belongs on the lot rather than in a room. Anything else placed outside every room of a
11
13
  * level that has rooms is refused: in production a model that had fallen back to raw place_items
@@ -71,7 +73,7 @@ function onWall(wall, entry, asset) {
71
73
  const left = -dz * (entry.x - wall.start[0]) + dx * (entry.z - wall.start[1]) >= 0;
72
74
  const side = left ? 'front' : 'back';
73
75
  const z = asset.attachTo === 'wall-side' ? getWallLocalFaceZ(wall, left ? 'a' : 'b') : 0;
74
- const turn = (left ? 0 : Math.PI) + ((entry.rotation ?? 0) * Math.PI) / 180;
76
+ const turn = left ? 0 : Math.PI;
75
77
  return {
76
78
  parentId: wall.id,
77
79
  position: [x, y, z],
@@ -176,6 +178,14 @@ export const placeItems = (nodes, input, context) => {
176
178
  hostId: host.id,
177
179
  ...(pose.side ? { side: pose.side } : {}),
178
180
  ...(pose.restingOn ? { restingOn: pose.restingOn } : {}),
181
+ ...(host.type === 'wall' && entry.rotation !== undefined
182
+ ? {
183
+ info: {
184
+ code: 'rotation_ignored',
185
+ message: 'Rotation is ignored on a wall host: the item faces its selected wall side in the wall’s local frame.',
186
+ },
187
+ }
188
+ : {}),
179
189
  };
180
190
  }
181
191
  // A floor: the level named, or the level holding the room or slab named.
@@ -188,10 +198,13 @@ export const placeItems = (nodes, input, context) => {
188
198
  : null;
189
199
  if (!floorId || nodes[floorId]?.type !== 'level')
190
200
  return refused(assetId, 'unsupported_host', `A ${host?.type} hosts no item: name a wall, a ceiling, an item standing on the floor, or a room, slab or level for its floor.`);
201
+ const onRoofLevel = roofLevelRefusal(nodes, floorId, `"${asset.name}"`);
202
+ if (onRoofLevel)
203
+ return refused(assetId, onRoofLevel.code, onRoofLevel.message);
191
204
  const rooms = roomsOn(nodes, floorId);
192
205
  const room = rooms.find((polygon) => pointInPolygon([x, z], polygon));
193
206
  if (rooms.length && !isOutdoor(asset) && !room)
194
- return refused(assetId, 'outside_rooms', `"${asset.name}" at (${x}, ${z}) is outside every room on this level: indoor items go inside a room (read the rooms with get_zones); trees and garden items may stand outside.`);
207
+ return refused(assetId, 'outside_rooms', `"${asset.name}" at (${x}, ${z}) is outside every room on this level: indoor items go inside a room (read the rooms with get_zones); trees and garden items may stand outside. Outside a room, ${OUTSIDE_SOURCES}`);
195
208
  doorsOn[floorId] ??= collectDoorKeepouts(Object.values(nodes), { levelId: floorId });
196
209
  const misfit = floorFit(nodes, floorId, entry, asset, doorsOn[floorId]);
197
210
  if (misfit)
@@ -1 +1 @@
1
- {"version":3,"file":"plan-geometry.d.ts","sourceRoot":"","sources":["../../src/agent-operations/plan-geometry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAEzC,MAAM,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AACnC,MAAM,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;AAE3C,wBAAgB,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,MAAM,CAInD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,KAAK,CAAC,GAAG,MAAM,CAExE;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAGrE;AAED,wBAAgB,eAAe,CAC7B,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,KAAK,CAAC,EACrC,CAAC,EAAE,MAAM,EACT,KAAK,EAAE,MAAM,GACZ,MAAM,CAGR;AAED,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,KAAK,CAAC,EACrC,QAAQ,EAAE,IAAI,GACb,MAAM,CAWR;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CASlD;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG;IAC7C,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;CAChB,CAiBA;AAED,wBAAgB,wBAAwB,CACtC,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,MAAM,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,EACxC,OAAO,EAAE,MAAM,GACd,OAAO,CAOT;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,SAAO,GAAG,OAAO,CAOvF;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,eAAe,UAAO,GAAG,OAAO,CAgB5F;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,CAE5E"}
1
+ {"version":3,"file":"plan-geometry.d.ts","sourceRoot":"","sources":["../../src/agent-operations/plan-geometry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAEzC,MAAM,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AACnC,MAAM,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;AAE3C,wBAAgB,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,MAAM,CAInD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,KAAK,CAAC,GAAG,MAAM,CAExE;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAGrE;AAED,wBAAgB,eAAe,CAC7B,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,KAAK,CAAC,EACrC,CAAC,EAAE,MAAM,EACT,KAAK,EAAE,MAAM,GACZ,MAAM,CAGR;AAED,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,KAAK,CAAC,EACrC,QAAQ,EAAE,IAAI,GACb,MAAM,CAWR;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CASlD;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG;IAC7C,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;CAChB,CAiBA;AAED,wBAAgB,wBAAwB,CACtC,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,MAAM,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,EACxC,OAAO,EAAE,MAAM,GACd,OAAO,CAOT;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,SAAO,GAAG,OAAO,CASvF;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,eAAe,UAAO,GAAG,OAAO,CAgB5F;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,CAE5E"}
@@ -64,6 +64,9 @@ export function pointInBoundsWithPadding(x, z, bounds, padding) {
64
64
  z <= bounds.maxZ - padding);
65
65
  }
66
66
  export function pointOnSegment(point, a, b, tolerance = 1e-6) {
67
+ // A segment of no length (an outline's repeated corner) is its one point, not every point.
68
+ if (a[0] === b[0] && a[1] === b[1])
69
+ return distance2D(point, a) <= tolerance;
67
70
  const cross = (point[1] - a[1]) * (b[0] - a[0]) - (point[0] - a[0]) * (b[1] - a[1]);
68
71
  if (Math.abs(cross) > tolerance)
69
72
  return false;
@@ -0,0 +1,139 @@
1
+ /**
2
+ * What a person pointed at in the scene, and from where: ids first, the picture as evidence.
3
+ *
4
+ * One shape for every surface that can carry it. The editor's Point and ask mode builds it; the
5
+ * chat sends it on the message (`metadata.pointContext`) and tells the agent to act on the ids; the
6
+ * hosted MCP can take the same object as a tool input later. `camera` is `view_scene`'s own
7
+ * `camera` input plus the projection, so the agent can look from the person's eye.
8
+ */
9
+ export type PointContext = {
10
+ kind: 'scene-point';
11
+ version: 1;
12
+ /** "ask_…", minted where the person pointed: the pin, the chat chip and the turn share it. */
13
+ askId: string;
14
+ /** ISO time of the moment of pointing (pointer-down), not of sending. */
15
+ capturedAt: string;
16
+ source: 'editor' | 'mcp';
17
+ gesture: 'click' | 'multi' | 'region';
18
+ /** The level in view. */
19
+ level: {
20
+ id: string;
21
+ name: string;
22
+ };
23
+ /** Every pointed element, with no cap: a preview limit is for display, not for the agent. */
24
+ targets: PointTarget[];
25
+ /** A region's visible elements, by screen area, top 12; `more` counts the rest. */
26
+ inRegion?: {
27
+ ids: string[];
28
+ more: number;
29
+ };
30
+ camera: PointCamera;
31
+ /** [left, top, right, bottom], each 0–1 of the full frame. */
32
+ region?: [number, number, number, number];
33
+ /** The crop. `marked`: the targets are outlined in it. */
34
+ image?: PointImage;
35
+ /** The id of the suggestion chip when one was sent as it is. */
36
+ suggestion?: string;
37
+ };
38
+ export type PointTarget = {
39
+ /** Authoritative: read it with `get_node` before changing it. */
40
+ id: string;
41
+ /** The node type: 'zone' | 'wall' | 'window' | 'door' | 'item' | … */
42
+ type: string;
43
+ /** "Kitchen", "Wall, north side of Kitchen", "Sofa, Oslo 3-seat". */
44
+ name: string;
45
+ levelId: string;
46
+ /** The room it is in or bounds. */
47
+ zoneId?: string;
48
+ /** The wall an opening is in, the item an item stands on. */
49
+ parentId?: string;
50
+ /** Where the finger landed, in world metres. */
51
+ hit?: {
52
+ point: [number, number, number];
53
+ normal: [number, number, number];
54
+ face?: 'interior' | 'exterior' | 'top' | 'bottom';
55
+ };
56
+ box: {
57
+ min: [number, number, number];
58
+ max: [number, number, number];
59
+ };
60
+ /** Metres: wall {length, height, thickness}; zone {area, width, depth}; opening {width, height, sill}; item {width, depth, height}. */
61
+ size: Record<string, number>;
62
+ };
63
+ export type PointCamera = {
64
+ position: [number, number, number];
65
+ target: [number, number, number];
66
+ fov: number;
67
+ aspect: number;
68
+ projection: 'perspective' | 'orthographic';
69
+ /** Orthographic only. */
70
+ viewWidth?: number;
71
+ };
72
+ export type PointImage = {
73
+ /** Where the crop is stored, once the chat has uploaded it. */
74
+ url?: string;
75
+ /** The crop as the editor captured it, before it is uploaded. */
76
+ dataUrl?: string;
77
+ width: number;
78
+ height: number;
79
+ marked: boolean;
80
+ };
81
+ /** What the editor hands the chat when the person sends an ask. */
82
+ export type PointAskSubmit = {
83
+ askId: string;
84
+ /** The person's words. */
85
+ text: string;
86
+ context: PointContext;
87
+ /** The bubble text's screen rect in CSS px, where the message's flight starts. */
88
+ from: {
89
+ x: number;
90
+ y: number;
91
+ width: number;
92
+ height: number;
93
+ };
94
+ };
95
+ /**
96
+ * The chat's answer to a submit. `busy`: Pascal is on a turn and the host does not queue asks, so
97
+ * the bubble keeps its words and says so.
98
+ */
99
+ export type PointAskSubmitResult = {
100
+ ok: true;
101
+ } | {
102
+ ok: false;
103
+ code: 'busy' | 'out_of_credits' | 'unavailable' | 'error';
104
+ message: string;
105
+ };
106
+ /** What the chat tells the pin about the ask's turn. */
107
+ export type PointAskStatus = {
108
+ askId: string;
109
+ turnId?: string;
110
+ } /** Pascal is on another turn: the ask waits as its own turn, never steered into it. */ & ({
111
+ status: 'queued';
112
+ }
113
+ /** The turn started or its live sentence changed. */
114
+ | {
115
+ status: 'working';
116
+ sentence?: string;
117
+ }
118
+ /** The turn is waiting for the person's answer to a question. */
119
+ | {
120
+ status: 'asking';
121
+ question: string;
122
+ } | {
123
+ status: 'ended';
124
+ outcome: 'completed' | 'cancelled' | 'errored';
125
+ /** The turn ended while still waiting on a question. */
126
+ asked: boolean;
127
+ /** The turn made at least one successful scene-writing tool call. */
128
+ wroteScene: boolean;
129
+ /** The final reply text. */
130
+ answer?: string;
131
+ /** What went wrong, in words. */
132
+ error?: string;
133
+ });
134
+ /** What the pin tells the chat: its turn lights on hover and opens on click. */
135
+ export type PointAskPin = {
136
+ askId: string;
137
+ action: 'hover' | 'leave' | 'open';
138
+ };
139
+ //# sourceMappingURL=point-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"point-context.d.ts","sourceRoot":"","sources":["../../src/agent-operations/point-context.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,aAAa,CAAA;IACnB,OAAO,EAAE,CAAC,CAAA;IACV,8FAA8F;IAC9F,KAAK,EAAE,MAAM,CAAA;IACb,yEAAyE;IACzE,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,QAAQ,GAAG,KAAK,CAAA;IACxB,OAAO,EAAE,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAA;IACrC,yBAAyB;IACzB,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;IACnC,6FAA6F;IAC7F,OAAO,EAAE,WAAW,EAAE,CAAA;IACtB,mFAAmF;IACnF,QAAQ,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,EAAE,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;IAC1C,MAAM,EAAE,WAAW,CAAA;IACnB,8DAA8D;IAC9D,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACzC,0DAA0D;IAC1D,KAAK,CAAC,EAAE,UAAU,CAAA;IAClB,gEAAgE;IAChE,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,iEAAiE;IACjE,EAAE,EAAE,MAAM,CAAA;IACV,sEAAsE;IACtE,IAAI,EAAE,MAAM,CAAA;IACZ,qEAAqE;IACrE,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,mCAAmC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,gDAAgD;IAChD,GAAG,CAAC,EAAE;QACJ,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QAC/B,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QAChC,IAAI,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,KAAK,GAAG,QAAQ,CAAA;KAClD,CAAA;IACD,GAAG,EAAE;QAAE,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAA;IACrE,uIAAuI;IACvI,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,aAAa,GAAG,cAAc,CAAA;IAC1C,yBAAyB;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,+DAA+D;IAC/D,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,iEAAiE;IACjE,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,OAAO,CAAA;CAChB,CAAA;AAED,mEAAmE;AACnE,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,YAAY,CAAA;IACrB,kFAAkF;IAClF,IAAI,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CAC9D,CAAA;AAED;;;GAGG;AACH,MAAM,MAAM,oBAAoB,GAC5B;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GACZ;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,aAAa,GAAG,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAA;AAE7F,wDAAwD;AACxD,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAC,uFAAuF,GAAG,CACxF;IAAE,MAAM,EAAE,QAAQ,CAAA;CAAE;AACtB,qDAAqD;GACnD;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE;AAC1C,iEAAiE;GAC/D;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACtC;IACE,MAAM,EAAE,OAAO,CAAA;IACf,OAAO,EAAE,WAAW,GAAG,WAAW,GAAG,SAAS,CAAA;IAC9C,wDAAwD;IACxD,KAAK,EAAE,OAAO,CAAA;IACd,qEAAqE;IACrE,UAAU,EAAE,OAAO,CAAA;IACnB,4BAA4B;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,iCAAiC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CACJ,CAAA;AAED,gFAAgF;AAChF,MAAM,MAAM,WAAW,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,GAAG,OAAO,GAAG,MAAM,CAAA;CAAE,CAAA"}
@@ -0,0 +1 @@
1
+ export {};