@aglyn/plugins-ai 1.0.0-beta.229 → 1.0.0-beta.231

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 (340) hide show
  1. package/README.md +3 -3
  2. package/package.json +17 -17
  3. package/src/lib/activity/ai-activity-actions.js +7 -1
  4. package/src/lib/activity/ai-activity-actions.js.map +1 -1
  5. package/src/lib/components/ai-assist-provider-on-host.component.d.ts +66 -0
  6. package/src/lib/components/ai-assist-provider-on-host.component.js +78 -0
  7. package/src/lib/components/ai-assist-provider-on-host.component.js.map +1 -0
  8. package/src/lib/components/ai-assist-provider.component.js +9 -10
  9. package/src/lib/components/ai-assist-provider.component.js.map +1 -1
  10. package/src/lib/components/ai-automation-zones.d.ts +38 -0
  11. package/src/lib/components/ai-automation-zones.js +5 -1
  12. package/src/lib/components/ai-automation-zones.js.map +1 -1
  13. package/src/lib/components/ai-brief-dialog.component.d.ts +20 -2
  14. package/src/lib/components/ai-brief-dialog.component.js +87 -8
  15. package/src/lib/components/ai-brief-dialog.component.js.map +1 -1
  16. package/src/lib/components/ai-campaign-create.component.d.ts +54 -0
  17. package/src/lib/components/ai-campaign-create.component.js +270 -0
  18. package/src/lib/components/ai-campaign-create.component.js.map +1 -0
  19. package/src/lib/components/ai-describe-automation.component.d.ts +8 -3
  20. package/src/lib/components/ai-describe-automation.component.js +15 -6
  21. package/src/lib/components/ai-describe-automation.component.js.map +1 -1
  22. package/src/lib/components/ai-describe-button.component.d.ts +20 -8
  23. package/src/lib/components/ai-describe-button.component.js +19 -36
  24. package/src/lib/components/ai-describe-button.component.js.map +1 -1
  25. package/src/lib/components/ai-describe-email.component.d.ts +31 -0
  26. package/src/lib/components/ai-describe-email.component.js +22 -0
  27. package/src/lib/components/ai-describe-email.component.js.map +1 -0
  28. package/src/lib/components/ai-describe-org-automation.component.d.ts +36 -0
  29. package/src/lib/components/ai-describe-org-automation.component.js +238 -0
  30. package/src/lib/components/ai-describe-org-automation.component.js.map +1 -0
  31. package/src/lib/components/ai-experiment-cards.component.d.ts +9 -1
  32. package/src/lib/components/ai-experiment-cards.component.js +104 -18
  33. package/src/lib/components/ai-experiment-cards.component.js.map +1 -1
  34. package/src/lib/components/ai-explain-automation.component.js +1 -5
  35. package/src/lib/components/ai-explain-automation.component.js.map +1 -1
  36. package/src/lib/components/ai-funnel-zones.component.d.ts +61 -0
  37. package/src/lib/components/ai-funnel-zones.component.js +178 -0
  38. package/src/lib/components/ai-funnel-zones.component.js.map +1 -0
  39. package/src/lib/components/ai-insight-card.component.d.ts +42 -0
  40. package/src/lib/components/ai-insight-card.component.js +137 -0
  41. package/src/lib/components/ai-insight-card.component.js.map +1 -0
  42. package/src/lib/components/ai-insight-dialog.component.d.ts +6 -0
  43. package/src/lib/components/ai-insight-dialog.component.js +9 -3
  44. package/src/lib/components/ai-insight-dialog.component.js.map +1 -1
  45. package/src/lib/components/ai-job-plan.component.d.ts +7 -2
  46. package/src/lib/components/ai-job-plan.component.js +38 -6
  47. package/src/lib/components/ai-job-plan.component.js.map +1 -1
  48. package/src/lib/components/ai-job-requests.d.ts +17 -1
  49. package/src/lib/components/ai-job-requests.js +39 -3
  50. package/src/lib/components/ai-job-requests.js.map +1 -1
  51. package/src/lib/components/ai-logic-zones.d.ts +64 -0
  52. package/src/lib/components/ai-logic-zones.js +18 -0
  53. package/src/lib/components/ai-logic-zones.js.map +1 -0
  54. package/src/lib/components/ai-logic.component.d.ts +77 -0
  55. package/src/lib/components/ai-logic.component.js +553 -0
  56. package/src/lib/components/ai-logic.component.js.map +1 -0
  57. package/src/lib/components/ai-marketing-insight.component.d.ts +30 -0
  58. package/src/lib/components/ai-marketing-insight.component.js +80 -0
  59. package/src/lib/components/ai-marketing-insight.component.js.map +1 -0
  60. package/src/lib/components/ai-media-create.component.d.ts +55 -0
  61. package/src/lib/components/ai-media-create.component.js +433 -0
  62. package/src/lib/components/ai-media-create.component.js.map +1 -0
  63. package/src/lib/components/ai-overlay-cards.component.d.ts +83 -0
  64. package/src/lib/components/ai-overlay-cards.component.js +505 -0
  65. package/src/lib/components/ai-overlay-cards.component.js.map +1 -0
  66. package/src/lib/components/ai-permissions-on-host.component.d.ts +3 -46
  67. package/src/lib/components/ai-permissions-on-host.component.js +5 -53
  68. package/src/lib/components/ai-permissions-on-host.component.js.map +1 -1
  69. package/src/lib/components/ai-product-zones.d.ts +5 -0
  70. package/src/lib/components/ai-product-zones.js +1 -1
  71. package/src/lib/components/ai-product-zones.js.map +1 -1
  72. package/src/lib/components/ai-products-create-button.component.d.ts +42 -0
  73. package/src/lib/components/ai-products-create-button.component.js +67 -0
  74. package/src/lib/components/ai-products-create-button.component.js.map +1 -0
  75. package/src/lib/components/ai-products-hub-card.component.js +100 -81
  76. package/src/lib/components/ai-products-hub-card.component.js.map +1 -1
  77. package/src/lib/components/ai-revise-automation.component.d.ts +16 -0
  78. package/src/lib/components/ai-revise-automation.component.js +207 -0
  79. package/src/lib/components/ai-revise-automation.component.js.map +1 -0
  80. package/src/lib/components/ai-site-build-page.component.js +160 -24
  81. package/src/lib/components/ai-site-build-page.component.js.map +1 -1
  82. package/src/lib/components/ai-upsell-dialog.component.d.ts +53 -0
  83. package/src/lib/components/ai-upsell-dialog.component.js +177 -0
  84. package/src/lib/components/ai-upsell-dialog.component.js.map +1 -0
  85. package/src/lib/components/assist-build-card.component.d.ts +42 -0
  86. package/src/lib/components/assist-build-card.component.js +183 -0
  87. package/src/lib/components/assist-build-card.component.js.map +1 -0
  88. package/src/lib/components/assist-edit-canvas.d.ts +2 -0
  89. package/src/lib/components/assist-edit-canvas.js +56 -1
  90. package/src/lib/components/assist-edit-canvas.js.map +1 -1
  91. package/src/lib/components/assist-jobs-drawer.component.js +48 -3
  92. package/src/lib/components/assist-jobs-drawer.component.js.map +1 -1
  93. package/src/lib/components/assist-panel.component.js +51 -2
  94. package/src/lib/components/assist-panel.component.js.map +1 -1
  95. package/src/lib/components/use-ai-job-run.d.ts +3 -14
  96. package/src/lib/components/use-ai-job-run.js +0 -50
  97. package/src/lib/components/use-ai-job-run.js.map +1 -1
  98. package/src/lib/jobs/ai-build-capabilities.d.ts +58 -0
  99. package/src/lib/jobs/ai-build-capabilities.js +256 -0
  100. package/src/lib/jobs/ai-build-capabilities.js.map +1 -0
  101. package/src/lib/jobs/ai-build-unit-outcome.d.ts +52 -0
  102. package/src/lib/jobs/ai-build-unit-outcome.js +140 -0
  103. package/src/lib/jobs/ai-build-unit-outcome.js.map +1 -0
  104. package/src/lib/jobs/ai-job-auto-confirm.d.ts +8 -0
  105. package/src/lib/jobs/ai-job-auto-confirm.js +30 -6
  106. package/src/lib/jobs/ai-job-auto-confirm.js.map +1 -1
  107. package/src/lib/jobs/ai-job-build-step.d.ts +144 -0
  108. package/src/lib/jobs/ai-job-build-step.js +668 -0
  109. package/src/lib/jobs/ai-job-build-step.js.map +1 -0
  110. package/src/lib/jobs/ai-job-draft-ids.js +9 -1
  111. package/src/lib/jobs/ai-job-draft-ids.js.map +1 -1
  112. package/src/lib/jobs/ai-job-drafts.d.ts +14 -4
  113. package/src/lib/jobs/ai-job-drafts.js +25 -4
  114. package/src/lib/jobs/ai-job-drafts.js.map +1 -1
  115. package/src/lib/jobs/ai-job-generation.d.ts +8 -0
  116. package/src/lib/jobs/ai-job-generation.js +13 -2
  117. package/src/lib/jobs/ai-job-generation.js.map +1 -1
  118. package/src/lib/jobs/ai-job-insight-step.js +8 -1
  119. package/src/lib/jobs/ai-job-insight-step.js.map +1 -1
  120. package/src/lib/jobs/ai-job-layout-language.d.ts +73 -0
  121. package/src/lib/jobs/ai-job-layout-language.js +194 -0
  122. package/src/lib/jobs/ai-job-layout-language.js.map +1 -0
  123. package/src/lib/jobs/ai-job-layout-site-pages.d.ts +13 -2
  124. package/src/lib/jobs/ai-job-layout-site-pages.js +18 -2
  125. package/src/lib/jobs/ai-job-layout-site-pages.js.map +1 -1
  126. package/src/lib/jobs/ai-job-layout-step.d.ts +5 -0
  127. package/src/lib/jobs/ai-job-layout-step.js +105 -5
  128. package/src/lib/jobs/ai-job-layout-step.js.map +1 -1
  129. package/src/lib/jobs/ai-job-logic-step.d.ts +107 -0
  130. package/src/lib/jobs/ai-job-logic-step.js +395 -0
  131. package/src/lib/jobs/ai-job-logic-step.js.map +1 -0
  132. package/src/lib/jobs/ai-job-overlay-copy.d.ts +70 -0
  133. package/src/lib/jobs/ai-job-overlay-copy.js +178 -0
  134. package/src/lib/jobs/ai-job-overlay-copy.js.map +1 -0
  135. package/src/lib/jobs/ai-job-page-language.d.ts +149 -0
  136. package/src/lib/jobs/ai-job-page-language.js +355 -0
  137. package/src/lib/jobs/ai-job-page-language.js.map +1 -0
  138. package/src/lib/jobs/ai-job-page-sections.d.ts +37 -1
  139. package/src/lib/jobs/ai-job-page-sections.js +93 -11
  140. package/src/lib/jobs/ai-job-page-sections.js.map +1 -1
  141. package/src/lib/jobs/ai-job-page-step.d.ts +4 -4
  142. package/src/lib/jobs/ai-job-page-step.js +111 -20
  143. package/src/lib/jobs/ai-job-page-step.js.map +1 -1
  144. package/src/lib/jobs/ai-job-plan-step.d.ts +27 -2
  145. package/src/lib/jobs/ai-job-plan-step.js +87 -13
  146. package/src/lib/jobs/ai-job-plan-step.js.map +1 -1
  147. package/src/lib/jobs/ai-job-site-step.d.ts +19 -1
  148. package/src/lib/jobs/ai-job-site-step.js +220 -61
  149. package/src/lib/jobs/ai-job-site-step.js.map +1 -1
  150. package/src/lib/jobs/ai-job-text-step.d.ts +22 -1
  151. package/src/lib/jobs/ai-job-text-step.js +12 -0
  152. package/src/lib/jobs/ai-job-text-step.js.map +1 -1
  153. package/src/lib/jobs/ai-job-workflow-step.d.ts +54 -4
  154. package/src/lib/jobs/ai-job-workflow-step.js +320 -15
  155. package/src/lib/jobs/ai-job-workflow-step.js.map +1 -1
  156. package/src/lib/jobs/ai-jobs.d.ts +80 -2
  157. package/src/lib/jobs/ai-jobs.js +391 -18
  158. package/src/lib/jobs/ai-jobs.js.map +1 -1
  159. package/src/lib/jobs/ai-layout-full-height.d.ts +40 -0
  160. package/src/lib/jobs/ai-layout-full-height.js +82 -0
  161. package/src/lib/jobs/ai-layout-full-height.js.map +1 -0
  162. package/src/lib/jobs/ai-layout-site-facts.d.ts +54 -0
  163. package/src/lib/jobs/ai-layout-site-facts.js +153 -0
  164. package/src/lib/jobs/ai-layout-site-facts.js.map +1 -0
  165. package/src/lib/jobs/ai-logic-records.d.ts +40 -0
  166. package/src/lib/jobs/ai-logic-records.js +55 -0
  167. package/src/lib/jobs/ai-logic-records.js.map +1 -0
  168. package/src/lib/jobs/ai-site-publish.d.ts +7 -0
  169. package/src/lib/jobs/ai-site-publish.js +9 -0
  170. package/src/lib/jobs/ai-site-publish.js.map +1 -1
  171. package/src/lib/jobs/ai-workflow-records.d.ts +4 -0
  172. package/src/lib/jobs/ai-workflow-records.js +40 -1
  173. package/src/lib/jobs/ai-workflow-records.js.map +1 -1
  174. package/src/lib/layout-language/ai-layout-compiler.d.ts +145 -0
  175. package/src/lib/layout-language/ai-layout-compiler.js +1148 -0
  176. package/src/lib/layout-language/ai-layout-compiler.js.map +1 -0
  177. package/src/lib/layout-language/ai-layout-copy.d.ts +73 -0
  178. package/src/lib/layout-language/ai-layout-copy.js +137 -0
  179. package/src/lib/layout-language/ai-layout-copy.js.map +1 -0
  180. package/src/lib/layout-language/ai-layout-frame.d.ts +52 -0
  181. package/src/lib/layout-language/ai-layout-frame.js +457 -0
  182. package/src/lib/layout-language/ai-layout-frame.js.map +1 -0
  183. package/src/lib/layout-language/ai-layout-gaps.d.ts +63 -0
  184. package/src/lib/layout-language/ai-layout-gaps.js +345 -0
  185. package/src/lib/layout-language/ai-layout-gaps.js.map +1 -0
  186. package/src/lib/layout-language/ai-layout-language.d.ts +161 -0
  187. package/src/lib/layout-language/ai-layout-language.js +446 -0
  188. package/src/lib/layout-language/ai-layout-language.js.map +1 -0
  189. package/src/lib/layout-language/ai-layout-links.d.ts +80 -0
  190. package/src/lib/layout-language/ai-layout-links.js +109 -0
  191. package/src/lib/layout-language/ai-layout-links.js.map +1 -0
  192. package/src/lib/layout-language/ai-layout-store.d.ts +39 -0
  193. package/src/lib/layout-language/ai-layout-store.js +69 -0
  194. package/src/lib/layout-language/ai-layout-store.js.map +1 -0
  195. package/src/lib/layout-language/ai-layout-tree.d.ts +59 -0
  196. package/src/lib/layout-language/ai-layout-tree.js +84 -0
  197. package/src/lib/layout-language/ai-layout-tree.js.map +1 -0
  198. package/src/lib/lazy-widget.d.ts +45 -0
  199. package/src/lib/lazy-widget.js +53 -0
  200. package/src/lib/lazy-widget.js.map +1 -0
  201. package/src/lib/model/ai-automation-draft.d.ts +18 -0
  202. package/src/lib/model/ai-automation-draft.js +86 -0
  203. package/src/lib/model/ai-automation-draft.js.map +1 -1
  204. package/src/lib/model/ai-build-job.d.ts +201 -0
  205. package/src/lib/model/ai-build-job.js +472 -0
  206. package/src/lib/model/ai-build-job.js.map +1 -0
  207. package/src/lib/model/ai-build-plan.d.ts +61 -0
  208. package/src/lib/model/ai-build-plan.js +154 -9
  209. package/src/lib/model/ai-build-plan.js.map +1 -1
  210. package/src/lib/model/ai-build-progress.d.ts +73 -0
  211. package/src/lib/model/ai-build-progress.js +170 -0
  212. package/src/lib/model/ai-build-progress.js.map +1 -0
  213. package/src/lib/model/ai-host-publish-context.d.ts +51 -0
  214. package/src/lib/model/ai-host-publish-context.js +104 -0
  215. package/src/lib/model/ai-host-publish-context.js.map +1 -0
  216. package/src/lib/model/ai-insight.d.ts +20 -10
  217. package/src/lib/model/ai-insight.js +72 -9
  218. package/src/lib/model/ai-insight.js.map +1 -1
  219. package/src/lib/model/ai-job-activity.d.ts +22 -0
  220. package/src/lib/model/ai-job-activity.js +25 -2
  221. package/src/lib/model/ai-job-activity.js.map +1 -1
  222. package/src/lib/model/ai-job-failure-copy.d.ts +38 -1
  223. package/src/lib/model/ai-job-failure-copy.js +56 -1
  224. package/src/lib/model/ai-job-failure-copy.js.map +1 -1
  225. package/src/lib/model/ai-job-notice.d.ts +3 -1
  226. package/src/lib/model/ai-job-notice.js +31 -9
  227. package/src/lib/model/ai-job-notice.js.map +1 -1
  228. package/src/lib/model/ai-jobs.types.d.ts +99 -2
  229. package/src/lib/model/ai-jobs.types.js +3 -1
  230. package/src/lib/model/ai-jobs.types.js.map +1 -1
  231. package/src/lib/model/ai-logic-job.d.ts +108 -0
  232. package/src/lib/model/ai-logic-job.js +327 -0
  233. package/src/lib/model/ai-logic-job.js.map +1 -0
  234. package/src/lib/model/ai-media-credits.d.ts +52 -0
  235. package/src/lib/model/ai-media-credits.js +61 -0
  236. package/src/lib/model/ai-media-credits.js.map +1 -0
  237. package/src/lib/model/ai-overlay-copy.d.ts +114 -0
  238. package/src/lib/model/ai-overlay-copy.js +175 -0
  239. package/src/lib/model/ai-overlay-copy.js.map +1 -0
  240. package/src/lib/model/ai-site-build-progress.d.ts +25 -4
  241. package/src/lib/model/ai-site-build-progress.js +194 -11
  242. package/src/lib/model/ai-site-build-progress.js.map +1 -1
  243. package/src/lib/model/ai-site-job.d.ts +8 -0
  244. package/src/lib/model/ai-site-job.js +9 -0
  245. package/src/lib/model/ai-site-job.js.map +1 -1
  246. package/src/lib/model/ai-site-start-seo.d.ts +1 -1
  247. package/src/lib/model/ai-site-start.d.ts +5 -2
  248. package/src/lib/model/ai-site-start.js +5 -2
  249. package/src/lib/model/ai-site-start.js.map +1 -1
  250. package/src/lib/model/ai-svg.d.ts +69 -0
  251. package/src/lib/model/ai-svg.js +265 -0
  252. package/src/lib/model/ai-svg.js.map +1 -0
  253. package/src/lib/model/ai-usage-by-user.d.ts +3 -2
  254. package/src/lib/model/ai-usage-by-user.js.map +1 -1
  255. package/src/lib/model/ai-workflow-job.d.ts +92 -4
  256. package/src/lib/model/ai-workflow-job.js +124 -7
  257. package/src/lib/model/ai-workflow-job.js.map +1 -1
  258. package/src/lib/model/assist-build.d.ts +58 -0
  259. package/src/lib/model/assist-build.js +52 -0
  260. package/src/lib/model/assist-build.js.map +1 -0
  261. package/src/lib/model/assist-edit.d.ts +48 -3
  262. package/src/lib/model/assist-edit.js +48 -4
  263. package/src/lib/model/assist-edit.js.map +1 -1
  264. package/src/lib/plugin-config.js +2 -0
  265. package/src/lib/plugin-config.js.map +1 -1
  266. package/src/lib/plugin.js +308 -47
  267. package/src/lib/plugin.js.map +1 -1
  268. package/src/lib/providers/catalog.d.ts +82 -5
  269. package/src/lib/providers/catalog.js +83 -12
  270. package/src/lib/providers/catalog.js.map +1 -1
  271. package/src/lib/providers/image-contract.d.ts +116 -0
  272. package/src/lib/providers/image-contract.js +74 -0
  273. package/src/lib/providers/image-contract.js.map +1 -0
  274. package/src/lib/providers/model-choice.js +11 -0
  275. package/src/lib/providers/model-choice.js.map +1 -1
  276. package/src/lib/providers/routing.js +18 -0
  277. package/src/lib/providers/routing.js.map +1 -1
  278. package/src/lib/providers/vertex-image.d.ts +121 -0
  279. package/src/lib/providers/vertex-image.js +312 -0
  280. package/src/lib/providers/vertex-image.js.map +1 -0
  281. package/src/lib/runtime/ai-doctrine-validators.d.ts +101 -0
  282. package/src/lib/runtime/ai-doctrine-validators.js +525 -4
  283. package/src/lib/runtime/ai-doctrine-validators.js.map +1 -1
  284. package/src/lib/runtime/ai-doctrine.js +21 -6
  285. package/src/lib/runtime/ai-doctrine.js.map +1 -1
  286. package/src/lib/runtime/ai-eval-live.js +4 -0
  287. package/src/lib/runtime/ai-eval-live.js.map +1 -1
  288. package/src/lib/runtime/ai-eval.d.ts +15 -1
  289. package/src/lib/runtime/ai-eval.js +52 -1
  290. package/src/lib/runtime/ai-eval.js.map +1 -1
  291. package/src/lib/runtime/ai-icon-library.d.ts +257 -0
  292. package/src/lib/runtime/ai-icon-library.js +254 -0
  293. package/src/lib/runtime/ai-icon-library.js.map +1 -0
  294. package/src/lib/runtime/ai-node-tree.d.ts +9 -0
  295. package/src/lib/runtime/ai-node-tree.js +30 -4
  296. package/src/lib/runtime/ai-node-tree.js.map +1 -1
  297. package/src/lib/runtime/ai-palette.d.ts +6 -0
  298. package/src/lib/runtime/ai-palette.generated.js +70 -0
  299. package/src/lib/runtime/ai-palette.generated.js.map +1 -1
  300. package/src/lib/runtime/ai-palette.js.map +1 -1
  301. package/src/lib/runtime/experiment-variant-copy.d.ts +34 -0
  302. package/src/lib/runtime/experiment-variant-copy.js +102 -0
  303. package/src/lib/runtime/experiment-variant-copy.js.map +1 -0
  304. package/src/lib/server/ai-experiment-versions.d.ts +51 -0
  305. package/src/lib/server/ai-experiment-versions.js +270 -0
  306. package/src/lib/server/ai-experiment-versions.js.map +1 -0
  307. package/src/lib/server/ai-jobs-resume.js +74 -4
  308. package/src/lib/server/ai-jobs-resume.js.map +1 -1
  309. package/src/lib/server/ai-media-image.d.ts +66 -0
  310. package/src/lib/server/ai-media-image.js +521 -0
  311. package/src/lib/server/ai-media-image.js.map +1 -0
  312. package/src/lib/server/ai-media-svg.d.ts +91 -0
  313. package/src/lib/server/ai-media-svg.js +186 -0
  314. package/src/lib/server/ai-media-svg.js.map +1 -0
  315. package/src/lib/server/assist-build.d.ts +54 -0
  316. package/src/lib/server/assist-build.js +121 -0
  317. package/src/lib/server/assist-build.js.map +1 -0
  318. package/src/lib/server/assist-chat.js +108 -12
  319. package/src/lib/server/assist-chat.js.map +1 -1
  320. package/src/lib/server/assist-edit.js +213 -3
  321. package/src/lib/server/assist-edit.js.map +1 -1
  322. package/src/lib/server/assist-view-context.js +242 -4
  323. package/src/lib/server/assist-view-context.js.map +1 -1
  324. package/src/lib/server.js +26 -0
  325. package/src/lib/server.js.map +1 -1
  326. package/src/lib/tools/ai-logic-tool.d.ts +27 -0
  327. package/src/lib/tools/ai-logic-tool.js +207 -0
  328. package/src/lib/tools/ai-logic-tool.js.map +1 -0
  329. package/src/lib/tools/ai-overlay-tool.d.ts +35 -0
  330. package/src/lib/tools/ai-overlay-tool.js +107 -0
  331. package/src/lib/tools/ai-overlay-tool.js.map +1 -0
  332. package/src/lib/tools/ai-workflow-tool.d.ts +17 -2
  333. package/src/lib/tools/ai-workflow-tool.js +47 -14
  334. package/src/lib/tools/ai-workflow-tool.js.map +1 -1
  335. package/src/lib/usage/assist-job-refund.d.ts +28 -1
  336. package/src/lib/usage/assist-job-refund.js +44 -9
  337. package/src/lib/usage/assist-job-refund.js.map +1 -1
  338. package/src/lib/usage/assist-usage.d.ts +5 -0
  339. package/src/lib/usage/assist-usage.js +2 -0
  340. package/src/lib/usage/assist-usage.js.map +1 -1
@@ -0,0 +1,457 @@
1
+ import { _ as _extends } from "@swc/helpers/_/_extends";
2
+ /**
3
+ * @license
4
+ * Copyright 2026 Aglyn LLC
5
+ *
6
+ * Licensed under the Apache License, Version 2.0 (the "License");
7
+ * you may not use this file except in compliance with the License.
8
+ * You may obtain a copy of the License at
9
+ *
10
+ * http://www.apache.org/licenses/LICENSE-2.0
11
+ *
12
+ * Unless required by applicable law or agreed to in writing, software
13
+ * distributed under the License is distributed on an "AS IS" BASIS,
14
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ * See the License for the specific language governing permissions and
16
+ * limitations under the License.
17
+ */ import { AI_ICON_LIBRARY } from "../runtime/ai-icon-library.js";
18
+ import { AI_LAYOUT_MAX_IMAGES, bandSx, compileFlow, compileRow, destinationProps } from "./ai-layout-compiler.js";
19
+ import { aiLayoutFitText } from "./ai-layout-copy.js";
20
+ import { AI_LAYOUT_MAX_ITEMS } from "./ai-layout-language.js";
21
+ import { aiLayoutResolveLink } from "./ai-layout-links.js";
22
+ import { AiLayoutTreeBuilder } from "./ai-layout-tree.js";
23
+ /** The header's colors by band, as palette roles. */ function headerLook(band) {
24
+ if (band === 'brand') return {
25
+ props: {
26
+ color: 'primary'
27
+ },
28
+ sx: {
29
+ boxShadow: 'none'
30
+ }
31
+ };
32
+ if (band === 'dark') {
33
+ return {
34
+ props: {
35
+ color: 'primary'
36
+ },
37
+ sx: {
38
+ boxShadow: 'none',
39
+ bgcolor: 'primary.dark',
40
+ color: 'primary.contrastText'
41
+ }
42
+ };
43
+ }
44
+ return {
45
+ props: {
46
+ color: 'inherit'
47
+ },
48
+ sx: {
49
+ bgcolor: 'background.paper',
50
+ boxShadow: 'none',
51
+ borderBottom: 1,
52
+ borderColor: 'divider'
53
+ }
54
+ };
55
+ }
56
+ /** A line that reads as a copyright notice: "© 2026 …", "Copyright …", "All rights reserved." */ export function aiLayoutIsCopyright(text) {
57
+ return typeof text === 'string' && /^\s*(?:©|\(c\)|copyright\b)|all rights reserved/i.test(text);
58
+ }
59
+ /** What a footer leaves out: a picture slot, and the page sections a footer is no place for. */ const FOOTER_LEAVES_OUT = new Set([
60
+ 'image',
61
+ 'faq',
62
+ 'quotes',
63
+ 'cards',
64
+ 'steps',
65
+ 'stats',
66
+ 'form',
67
+ 'component'
68
+ ]);
69
+ /** A frame scope: no headings of its own (a layout carries no outline), no pictures. */ function frameScope(page, at, band, centered) {
70
+ return {
71
+ page,
72
+ index: at === 'header' ? 0 : 1,
73
+ at,
74
+ band,
75
+ centered,
76
+ level: 2,
77
+ headed: true,
78
+ itemsLeft: AI_LAYOUT_MAX_ITEMS,
79
+ frame: true,
80
+ link: {
81
+ sections: [],
82
+ from: -1,
83
+ formSection: null
84
+ }
85
+ };
86
+ }
87
+ /** Compiles a site's header and footer, designed in the layout language, into its layout. */ export function aiCompileLayoutFrame(frame, plan, targets) {
88
+ var _frame_header, _header_band;
89
+ const tree = new AiLayoutTreeBuilder('lf');
90
+ const page = {
91
+ tree,
92
+ plan: {
93
+ title: plan.siteName,
94
+ sections: []
95
+ },
96
+ targets: _extends({}, targets, {
97
+ pageId: null
98
+ }),
99
+ // A footer is drawn compact: its lines are lines, never blocks rule 1 would ask to share.
100
+ options: {
101
+ reusableComponents: true
102
+ },
103
+ settled: [],
104
+ scrollTo: {},
105
+ // A frame shows no picture slot: a header and a footer are the same on every page.
106
+ images: AI_LAYOUT_MAX_IMAGES,
107
+ strong: {
108
+ brand: 0,
109
+ dark: 0
110
+ },
111
+ formSection: null,
112
+ pageIcon: AI_ICON_LIBRARY.sparkle,
113
+ formsPlaced: new Set()
114
+ };
115
+ const name = aiLayoutFitText(plan.siteName, 'heading') || 'Home';
116
+ const header = (_frame_header = frame.header) != null ? _frame_header : {
117
+ blocks: []
118
+ };
119
+ const band = (_header_band = header.band) != null ? _header_band : 'plain';
120
+ const look = headerLook(band);
121
+ const scope = frameScope(page, 'header', band === 'brand' || band === 'dark' ? 'brand' : 'plain', false);
122
+ const navLink = (entry, role, interactions)=>{
123
+ const id = tree.add('muiScreenLink', {
124
+ children: aiLayoutFitText(entry.label, 'label') || entry.label.slice(0, 28),
125
+ screenId: entry.id,
126
+ renderAs: 'link',
127
+ color: 'inherit'
128
+ }, {
129
+ textDecoration: 'none'
130
+ }, null, role);
131
+ if (interactions) tree.nodes[id].interactions = interactions;
132
+ return id;
133
+ };
134
+ const pages = plan.navPages.filter((entry)=>entry.label.trim());
135
+ const centeredNav = header.align === 'center' && pages.length > 0;
136
+ // The brand takes the room the navigation does not, and gives way before
137
+ // it does: a long name ends in an ellipsis rather than pushing into the links.
138
+ const brandSx = _extends({
139
+ typography: 'h6',
140
+ fontWeight: 800,
141
+ textDecoration: 'none',
142
+ whiteSpace: 'nowrap',
143
+ overflow: 'hidden',
144
+ textOverflow: 'ellipsis',
145
+ minWidth: 0
146
+ }, centeredNav ? {} : {
147
+ flexGrow: 1
148
+ });
149
+ const brand = plan.homeId ? tree.add('muiScreenLink', {
150
+ children: name.slice(0, 40),
151
+ screenId: plan.homeId,
152
+ renderAs: 'link',
153
+ color: 'inherit'
154
+ }, brandSx, null, 'brand') : tree.add('muiTypography', {
155
+ children: name,
156
+ variant: 'h6',
157
+ component: 'p'
158
+ }, brandSx, null, 'brand');
159
+ const nav = pages.length ? tree.add('muiStack', {
160
+ component: 'nav',
161
+ ariaLabel: 'Main',
162
+ direction: 'row',
163
+ spacing: '3',
164
+ alignItems: 'center'
165
+ }, {
166
+ display: {
167
+ xs: 'none',
168
+ md: 'flex'
169
+ }
170
+ }, pages.map((entry)=>navLink(entry, 'navLink')), 'nav') : null;
171
+ // The design's call to action: its first button, where it goes somewhere.
172
+ const ctaBlock = header.blocks.find((block)=>block.kind === 'button');
173
+ for (const block of header.blocks){
174
+ if (block !== ctaBlock) page.settled.push({
175
+ at: 'header',
176
+ what: `a ${block.kind} in the header; left out`
177
+ });
178
+ }
179
+ const ctaLabel = ctaBlock ? aiLayoutFitText(ctaBlock.text, 'label') : '';
180
+ const ctaTo = ctaBlock && ctaLabel ? aiLayoutResolveLink(ctaBlock.to, ctaLabel, scope.link, page.targets) : null;
181
+ if (ctaBlock && !ctaTo) page.settled.push({
182
+ at: 'header',
183
+ what: `the button "${ctaLabel}" has nowhere to go; left out`
184
+ });
185
+ const ctaProps = ctaTo ? _extends({
186
+ children: ctaLabel,
187
+ variant: 'contained',
188
+ color: scope.band === 'brand' ? 'secondary' : 'primary'
189
+ }, destinationProps(ctaTo)) : null;
190
+ // On the smallest phones the call to action moves into the menu.
191
+ const cta = ctaProps ? tree.add('muiButton', ctaProps, {
192
+ display: {
193
+ xs: 'none',
194
+ sm: 'inline-flex'
195
+ },
196
+ whiteSpace: 'nowrap',
197
+ flexShrink: 0
198
+ }, null, 'cta') : null;
199
+ // A phone's menu: the platform's Drawer, opened by its Menu Button; a link
200
+ // followed from it closes it.
201
+ const close = [
202
+ AI_LAYOUT_CLOSE_DRAWER
203
+ ];
204
+ const drawer = pages.length ? tree.add('muiDrawer', {
205
+ anchor: 'right'
206
+ }, null, [
207
+ tree.add('muiStack', {
208
+ component: 'nav',
209
+ ariaLabel: 'Menu'
210
+ }, {
211
+ display: 'flex',
212
+ flexDirection: 'column',
213
+ gap: 2,
214
+ p: 3,
215
+ typography: 'h6'
216
+ }, [
217
+ ...pages.map((entry)=>navLink(entry, 'menuLink', close)),
218
+ ctaProps ? tree.add('muiButton', _extends({}, ctaProps, {
219
+ fullWidth: true
220
+ }), {
221
+ mt: 2
222
+ }, null, 'menuCta') : null
223
+ ], 'menu')
224
+ ], 'drawer') : null;
225
+ const toggle = drawer ? tree.add('muiDrawerToggle', {
226
+ ariaLabel: 'Open the menu'
227
+ }, {
228
+ display: {
229
+ xs: 'inline-flex',
230
+ md: 'none'
231
+ },
232
+ flexShrink: 0
233
+ }, null, 'menuButton') : null;
234
+ const middle = nav && centeredNav ? tree.add('muiBox', null, {
235
+ flexGrow: 1,
236
+ display: 'flex',
237
+ justifyContent: 'center'
238
+ }, [
239
+ nav
240
+ ], 'navRoom') : nav;
241
+ // The row lives in a Container inside the Toolbar Content, which may only sit in an App Bar.
242
+ const row = tree.add('muiContainer', {
243
+ maxWidth: 'lg'
244
+ }, {
245
+ display: 'flex',
246
+ alignItems: 'center',
247
+ columnGap: 3
248
+ }, [
249
+ brand,
250
+ middle,
251
+ cta,
252
+ toggle,
253
+ drawer
254
+ ], 'headerRow');
255
+ const toolbar = tree.add('muiToolbar', {
256
+ disableGutters: true
257
+ }, {
258
+ minHeight: {
259
+ xs: 64,
260
+ md: 76
261
+ }
262
+ }, [
263
+ row
264
+ ], 'toolbar');
265
+ const bar = tree.add('muiAppBar', _extends({}, look.props, {
266
+ position: 'sticky',
267
+ component: 'header',
268
+ ariaLabel: 'Site header'
269
+ }), look.sx, [
270
+ toolbar
271
+ ], 'header');
272
+ // The page grows into the room the window leaves, so a short page keeps
273
+ // its footer at the bottom.
274
+ const slot = tree.add('layoutSlot', {
275
+ component: 'main'
276
+ }, {
277
+ flexGrow: 1
278
+ }, null, 'slot');
279
+ const footer = compileFooter(page, frame.footer, plan, name);
280
+ const column = tree.add('muiStack', null, {
281
+ minHeight: '100vh'
282
+ }, [
283
+ bar,
284
+ slot,
285
+ footer
286
+ ], 'frame');
287
+ tree.prune(column, new Set([
288
+ slot
289
+ ]));
290
+ const rootId = tree.add('div', null, null, [
291
+ column
292
+ ], 'layout');
293
+ return {
294
+ tree: {
295
+ rootId,
296
+ nodes: tree.nodes
297
+ },
298
+ settled: page.settled
299
+ };
300
+ }
301
+ /** A link followed from the phone menu closes it. */ const AI_LAYOUT_CLOSE_DRAWER = {
302
+ id: 'ai-close-menu',
303
+ name: 'Close the menu',
304
+ enabled: true,
305
+ trigger: {
306
+ event: 'elementClick',
307
+ everyTime: true
308
+ },
309
+ steps: [
310
+ {
311
+ type: 'closeDrawer'
312
+ }
313
+ ]
314
+ };
315
+ /**
316
+ * The footer the design describes, with what every footer owes a visitor
317
+ * written by code: the site's pages, where the design links none of them,
318
+ * and the site's name under a rule.
319
+ */ function compileFooter(page, footer, plan, name) {
320
+ var _ref, _ref1;
321
+ const tree = page.tree;
322
+ const band = (_ref = footer == null ? void 0 : footer.band) != null ? _ref : 'soft';
323
+ const scope = frameScope(page, 'footer', band, (footer == null ? void 0 : footer.align) === 'center');
324
+ // The footer's page links are the site's pages, every one, as the header's
325
+ // are (AGL-3660): a list the model wrote of page links is drawn with them
326
+ // in its place, and a footer with none gets one. The model places the list;
327
+ // it never chooses which pages it holds.
328
+ const navItems = plan.navPages.map((entry)=>({
329
+ title: entry.label,
330
+ text: '',
331
+ to: `page:${entry.id}`
332
+ }));
333
+ let linksPages = false;
334
+ const blocks = ((_ref1 = footer == null ? void 0 : footer.blocks) != null ? _ref1 : []).flatMap((given)=>{
335
+ var _block_items;
336
+ var _given_items;
337
+ // The bottom bar carries the frame's one copyright line; a line of the
338
+ // answer's own that reads as one would print it twice.
339
+ if (aiLayoutIsCopyright(given.text)) {
340
+ page.settled.push({
341
+ at: 'footer',
342
+ what: 'a copyright line; the footer writes its own'
343
+ });
344
+ return [];
345
+ }
346
+ const notice = (item)=>aiLayoutIsCopyright(item.title) || aiLayoutIsCopyright(item.text);
347
+ const block = ((_given_items = given.items) == null ? void 0 : _given_items.some(notice)) ? _extends({}, given, {
348
+ items: given.items.filter((item)=>!notice(item))
349
+ }) : given;
350
+ if (block !== given) page.settled.push({
351
+ at: 'footer',
352
+ what: 'a copyright line in a list; the footer writes its own'
353
+ });
354
+ if (FOOTER_LEAVES_OUT.has(block.kind)) {
355
+ page.settled.push({
356
+ at: 'footer',
357
+ what: `a ${block.kind} in the footer; left out`
358
+ });
359
+ return [];
360
+ }
361
+ const pageLinks = block.kind === 'list' && ((_block_items = block.items) != null ? _block_items : []).some((item)=>{
362
+ var _item_to;
363
+ return /^page:/.test((_item_to = item.to) != null ? _item_to : '');
364
+ });
365
+ if (!pageLinks) return [
366
+ block
367
+ ];
368
+ if (linksPages || !navItems.length) {
369
+ page.settled.push({
370
+ at: 'footer',
371
+ what: 'a second list of page links; left out'
372
+ });
373
+ return [];
374
+ }
375
+ linksPages = true;
376
+ return [
377
+ _extends({}, block, {
378
+ items: navItems
379
+ })
380
+ ];
381
+ });
382
+ const cols = (footer == null ? void 0 : footer.cols) && footer.cols.length >= 2 ? footer.cols : null;
383
+ const columns = cols ? cols.map(()=>[]) : [
384
+ []
385
+ ];
386
+ for (const block of blocks)columns[cols && block.col !== undefined ? Math.min(block.col, cols.length - 1) : 0].push(block);
387
+ const weights = cols ? [
388
+ ...cols
389
+ ] : [
390
+ 2
391
+ ];
392
+ if (!linksPages && plan.navPages.length) {
393
+ columns.push([
394
+ {
395
+ kind: 'list',
396
+ items: plan.navPages.map((entry)=>({
397
+ title: entry.label,
398
+ text: '',
399
+ to: `page:${entry.id}`
400
+ }))
401
+ }
402
+ ]);
403
+ weights.push(1);
404
+ }
405
+ const filled = columns.map((column, position)=>{
406
+ var _weights_position;
407
+ return {
408
+ column,
409
+ weight: (_weights_position = weights[position]) != null ? _weights_position : 1
410
+ };
411
+ }).filter((entry)=>entry.column.length);
412
+ const top = filled.length > 1 ? compileRow(scope, filled) : filled.length === 1 ? compileFlow(scope, filled[0].column, 'full') : null;
413
+ const copyright = tree.add('muiTypography', {
414
+ children: `© ${name}`,
415
+ variant: 'body2',
416
+ component: 'p'
417
+ }, scope.band === 'brand' ? null : {
418
+ color: 'text.secondary'
419
+ }, null, 'copyright');
420
+ const bottom = tree.add('muiBox', null, {
421
+ pt: 3,
422
+ borderTop: 1,
423
+ borderColor: 'divider'
424
+ }, [
425
+ copyright
426
+ ], 'footerBottom');
427
+ const stack = tree.add('muiStack', {
428
+ spacing: '6'
429
+ }, null, [
430
+ top,
431
+ bottom
432
+ ], 'footerStack');
433
+ const container = tree.add('muiContainer', {
434
+ maxWidth: 'lg'
435
+ }, {
436
+ py: {
437
+ xs: 6,
438
+ md: 8
439
+ }
440
+ }, [
441
+ stack
442
+ ], 'footerInner');
443
+ return tree.add('section', _extends({
444
+ element: 'footer',
445
+ ariaLabel: 'Site footer'
446
+ }, scope.band === 'dark' ? {
447
+ colorScheme: 'dark'
448
+ } : {}), scope.band === 'soft' ? {
449
+ bgcolor: 'background.paper',
450
+ borderTop: 1,
451
+ borderColor: 'divider'
452
+ } : bandSx(scope.band), [
453
+ container
454
+ ], 'footer');
455
+ }
456
+
457
+ //# sourceMappingURL=ai-layout-frame.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/ai/src/lib/layout-language/ai-layout-frame.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AI_ICON_LIBRARY } from '../runtime/ai-icon-library'\nimport {\n AI_LAYOUT_MAX_IMAGES,\n bandSx,\n compileFlow,\n compileRow,\n destinationProps,\n type PageScope,\n type SectionScope,\n} from './ai-layout-compiler'\nimport { aiLayoutFitText } from './ai-layout-copy'\nimport {\n AI_LAYOUT_MAX_ITEMS,\n type AiLayoutBand,\n type AiLayoutBlock,\n type AiLayoutSection,\n type AiLayoutSettlement,\n} from './ai-layout-language'\nimport {\n aiLayoutResolveLink,\n type AiLayoutPage,\n type AiLayoutTargets,\n} from './ai-layout-links'\nimport { AiLayoutTreeBuilder, type AiLayoutRawTree } from './ai-layout-tree'\n\n/**\n * A site's frame — the header and the footer every page renders between —\n * compiled from the layout language (AGL-3660), the same language a page is\n * designed in.\n *\n * The design is the model's: the header's band and alignment and its one\n * call to action, and the footer's columns and every word in them. What a\n * frame owes the site is the platform's, written here, so it is never wrong\n * and never invented: the site's name as the brand, linking home; its pages\n * as the navigation, a row on a wide screen and the platform's Drawer behind\n * its Menu Button on a phone; the Layout Slot, the page's one main landmark,\n * held tall enough that the footer sits at the bottom of a short page; and\n * the site's pages and name in the footer, where the design gave neither.\n */\n\nexport interface AiLayoutFramePlan {\n /** The site's name, which the header and the footer carry as its brand. */\n siteName: string\n /** The site's home page, which the brand links; none where the site has none yet. */\n homeId: string | null\n /** The pages the navigation links, in order. */\n navPages: readonly AiLayoutPage[]\n}\n\nexport interface AiLayoutCompiledFrame {\n tree: AiLayoutRawTree\n settled: AiLayoutSettlement[]\n}\n\n/** The header's colors by band, as palette roles. */\nfunction headerLook(band: AiLayoutBand): {\n props: Record<string, unknown>\n sx: Record<string, unknown>\n} {\n if (band === 'brand')\n return { props: { color: 'primary' }, sx: { boxShadow: 'none' } }\n if (band === 'dark') {\n return {\n props: { color: 'primary' },\n sx: {\n boxShadow: 'none',\n bgcolor: 'primary.dark',\n color: 'primary.contrastText',\n },\n }\n }\n return {\n props: { color: 'inherit' },\n sx: {\n bgcolor: 'background.paper',\n boxShadow: 'none',\n borderBottom: 1,\n borderColor: 'divider',\n },\n }\n}\n\n/** A line that reads as a copyright notice: \"© 2026 …\", \"Copyright …\", \"All rights reserved.\" */\nexport function aiLayoutIsCopyright(text: unknown): boolean {\n return typeof text === 'string' && /^\\s*(?:©|\\(c\\)|copyright\\b)|all rights reserved/i.test(text)\n}\n\n/** What a footer leaves out: a picture slot, and the page sections a footer is no place for. */\nconst FOOTER_LEAVES_OUT: ReadonlySet<AiLayoutBlock['kind']> = new Set([\n 'image',\n 'faq',\n 'quotes',\n 'cards',\n 'steps',\n 'stats',\n 'form',\n 'component',\n])\n\n/** A frame scope: no headings of its own (a layout carries no outline), no pictures. */\nfunction frameScope(\n page: PageScope,\n at: string,\n band: AiLayoutBand,\n centered: boolean,\n): SectionScope {\n return {\n page,\n index: at === 'header' ? 0 : 1,\n at,\n band,\n centered,\n level: 2,\n headed: true,\n itemsLeft: AI_LAYOUT_MAX_ITEMS,\n frame: true,\n link: { sections: [], from: -1, formSection: null },\n }\n}\n\n/** Compiles a site's header and footer, designed in the layout language, into its layout. */\nexport function aiCompileLayoutFrame(\n frame: { header: AiLayoutSection | null; footer: AiLayoutSection | null },\n plan: AiLayoutFramePlan,\n targets: AiLayoutTargets,\n): AiLayoutCompiledFrame {\n const tree = new AiLayoutTreeBuilder('lf')\n const page: PageScope = {\n tree,\n plan: { title: plan.siteName, sections: [] },\n targets: { ...targets, pageId: null },\n // A footer is drawn compact: its lines are lines, never blocks rule 1 would ask to share.\n options: { reusableComponents: true },\n settled: [],\n scrollTo: {},\n // A frame shows no picture slot: a header and a footer are the same on every page.\n images: AI_LAYOUT_MAX_IMAGES,\n strong: { brand: 0, dark: 0 },\n formSection: null,\n pageIcon: AI_ICON_LIBRARY.sparkle,\n formsPlaced: new Set(),\n }\n const name = aiLayoutFitText(plan.siteName, 'heading') || 'Home'\n const header = frame.header ?? { blocks: [] }\n const band = header.band ?? 'plain'\n const look = headerLook(band)\n const scope = frameScope(\n page,\n 'header',\n band === 'brand' || band === 'dark' ? 'brand' : 'plain',\n false,\n )\n const navLink = (\n entry: AiLayoutPage,\n role: string,\n interactions?: unknown[],\n ) => {\n const id = tree.add(\n 'muiScreenLink',\n {\n children:\n aiLayoutFitText(entry.label, 'label') || entry.label.slice(0, 28),\n screenId: entry.id,\n renderAs: 'link',\n color: 'inherit',\n },\n { textDecoration: 'none' },\n null,\n role,\n )\n if (interactions) tree.nodes[id].interactions = interactions\n return id\n }\n const pages = plan.navPages.filter((entry) => entry.label.trim())\n const centeredNav = header.align === 'center' && pages.length > 0\n // The brand takes the room the navigation does not, and gives way before\n // it does: a long name ends in an ellipsis rather than pushing into the links.\n const brandSx = {\n typography: 'h6',\n fontWeight: 800,\n textDecoration: 'none',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n minWidth: 0,\n ...(centeredNav ? {} : { flexGrow: 1 }),\n }\n const brand = plan.homeId\n ? tree.add(\n 'muiScreenLink',\n {\n children: name.slice(0, 40),\n screenId: plan.homeId,\n renderAs: 'link',\n color: 'inherit',\n },\n brandSx,\n null,\n 'brand',\n )\n : tree.add(\n 'muiTypography',\n { children: name, variant: 'h6', component: 'p' },\n brandSx,\n null,\n 'brand',\n )\n const nav = pages.length\n ? tree.add(\n 'muiStack',\n {\n component: 'nav',\n ariaLabel: 'Main',\n direction: 'row',\n spacing: '3',\n alignItems: 'center',\n },\n { display: { xs: 'none', md: 'flex' } },\n pages.map((entry) => navLink(entry, 'navLink')),\n 'nav',\n )\n : null\n // The design's call to action: its first button, where it goes somewhere.\n const ctaBlock = header.blocks.find((block) => block.kind === 'button')\n for (const block of header.blocks) {\n if (block !== ctaBlock)\n page.settled.push({\n at: 'header',\n what: `a ${block.kind} in the header; left out`,\n })\n }\n const ctaLabel = ctaBlock ? aiLayoutFitText(ctaBlock.text, 'label') : ''\n const ctaTo =\n ctaBlock && ctaLabel\n ? aiLayoutResolveLink(ctaBlock.to, ctaLabel, scope.link, page.targets)\n : null\n if (ctaBlock && !ctaTo)\n page.settled.push({\n at: 'header',\n what: `the button \"${ctaLabel}\" has nowhere to go; left out`,\n })\n const ctaProps = ctaTo\n ? {\n children: ctaLabel,\n variant: 'contained',\n color: scope.band === 'brand' ? 'secondary' : 'primary',\n ...destinationProps(ctaTo),\n }\n : null\n // On the smallest phones the call to action moves into the menu.\n const cta = ctaProps\n ? tree.add(\n 'muiButton',\n ctaProps,\n {\n display: { xs: 'none', sm: 'inline-flex' },\n whiteSpace: 'nowrap',\n flexShrink: 0,\n },\n null,\n 'cta',\n )\n : null\n // A phone's menu: the platform's Drawer, opened by its Menu Button; a link\n // followed from it closes it.\n const close = [AI_LAYOUT_CLOSE_DRAWER]\n const drawer = pages.length\n ? tree.add(\n 'muiDrawer',\n { anchor: 'right' },\n null,\n [\n tree.add(\n 'muiStack',\n { component: 'nav', ariaLabel: 'Menu' },\n {\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n p: 3,\n typography: 'h6',\n },\n [\n ...pages.map((entry) => navLink(entry, 'menuLink', close)),\n ctaProps\n ? tree.add(\n 'muiButton',\n { ...ctaProps, fullWidth: true },\n { mt: 2 },\n null,\n 'menuCta',\n )\n : null,\n ],\n 'menu',\n ),\n ],\n 'drawer',\n )\n : null\n const toggle = drawer\n ? tree.add(\n 'muiDrawerToggle',\n { ariaLabel: 'Open the menu' },\n { display: { xs: 'inline-flex', md: 'none' }, flexShrink: 0 },\n null,\n 'menuButton',\n )\n : null\n const middle =\n nav && centeredNav\n ? tree.add(\n 'muiBox',\n null,\n { flexGrow: 1, display: 'flex', justifyContent: 'center' },\n [nav],\n 'navRoom',\n )\n : nav\n // The row lives in a Container inside the Toolbar Content, which may only sit in an App Bar.\n const row = tree.add(\n 'muiContainer',\n { maxWidth: 'lg' },\n { display: 'flex', alignItems: 'center', columnGap: 3 },\n [brand, middle, cta, toggle, drawer],\n 'headerRow',\n )\n const toolbar = tree.add(\n 'muiToolbar',\n { disableGutters: true },\n { minHeight: { xs: 64, md: 76 } },\n [row],\n 'toolbar',\n )\n const bar = tree.add(\n 'muiAppBar',\n {\n ...look.props,\n position: 'sticky',\n component: 'header',\n ariaLabel: 'Site header',\n },\n look.sx,\n [toolbar],\n 'header',\n )\n // The page grows into the room the window leaves, so a short page keeps\n // its footer at the bottom.\n const slot = tree.add(\n 'layoutSlot',\n { component: 'main' },\n { flexGrow: 1 },\n null,\n 'slot',\n )\n const footer = compileFooter(page, frame.footer, plan, name)\n const column = tree.add(\n 'muiStack',\n null,\n { minHeight: '100vh' },\n [bar, slot, footer],\n 'frame',\n )\n tree.prune(column, new Set([slot]))\n const rootId = tree.add('div', null, null, [column], 'layout')\n return { tree: { rootId, nodes: tree.nodes }, settled: page.settled }\n}\n\n/** A link followed from the phone menu closes it. */\nconst AI_LAYOUT_CLOSE_DRAWER = {\n id: 'ai-close-menu',\n name: 'Close the menu',\n enabled: true,\n trigger: { event: 'elementClick', everyTime: true },\n steps: [{ type: 'closeDrawer' }],\n}\n\n/**\n * The footer the design describes, with what every footer owes a visitor\n * written by code: the site's pages, where the design links none of them,\n * and the site's name under a rule.\n */\nfunction compileFooter(\n page: PageScope,\n footer: AiLayoutSection | null,\n plan: AiLayoutFramePlan,\n name: string,\n): string {\n const tree = page.tree\n const band = footer?.band ?? 'soft'\n const scope = frameScope(page, 'footer', band, footer?.align === 'center')\n // The footer's page links are the site's pages, every one, as the header's\n // are (AGL-3660): a list the model wrote of page links is drawn with them\n // in its place, and a footer with none gets one. The model places the list;\n // it never chooses which pages it holds.\n const navItems = plan.navPages.map((entry) => ({\n title: entry.label,\n text: '',\n to: `page:${entry.id}`,\n }))\n let linksPages = false\n const blocks = (footer?.blocks ?? []).flatMap((given): AiLayoutBlock[] => {\n // The bottom bar carries the frame's one copyright line; a line of the\n // answer's own that reads as one would print it twice.\n if (aiLayoutIsCopyright(given.text)) {\n page.settled.push({ at: 'footer', what: 'a copyright line; the footer writes its own' })\n return []\n }\n const notice = (item: { title: string; text: string }) => aiLayoutIsCopyright(item.title) || aiLayoutIsCopyright(item.text)\n const block = given.items?.some(notice) ? { ...given, items: given.items.filter((item) => !notice(item)) } : given\n if (block !== given) page.settled.push({ at: 'footer', what: 'a copyright line in a list; the footer writes its own' })\n if (FOOTER_LEAVES_OUT.has(block.kind)) {\n page.settled.push({\n at: 'footer',\n what: `a ${block.kind} in the footer; left out`,\n })\n return []\n }\n const pageLinks =\n block.kind === 'list' &&\n (block.items ?? []).some((item) => /^page:/.test(item.to ?? ''))\n if (!pageLinks) return [block]\n if (linksPages || !navItems.length) {\n page.settled.push({ at: 'footer', what: 'a second list of page links; left out' })\n return []\n }\n linksPages = true\n return [{ ...block, items: navItems }]\n })\n const cols = footer?.cols && footer.cols.length >= 2 ? footer.cols : null\n const columns: AiLayoutBlock[][] = cols ? cols.map(() => []) : [[]]\n for (const block of blocks)\n columns[\n cols && block.col !== undefined ? Math.min(block.col, cols.length - 1) : 0\n ].push(block)\n const weights = cols ? [...cols] : [2]\n if (!linksPages && plan.navPages.length) {\n columns.push([\n {\n kind: 'list',\n items: plan.navPages.map((entry) => ({\n title: entry.label,\n text: '',\n to: `page:${entry.id}`,\n })),\n },\n ])\n weights.push(1)\n }\n const filled = columns\n .map((column, position) => ({ column, weight: weights[position] ?? 1 }))\n .filter((entry) => entry.column.length)\n const top =\n filled.length > 1\n ? compileRow(scope, filled)\n : filled.length === 1\n ? compileFlow(scope, filled[0].column, 'full')\n : null\n const copyright = tree.add(\n 'muiTypography',\n { children: `© ${name}`, variant: 'body2', component: 'p' },\n scope.band === 'brand' ? null : { color: 'text.secondary' },\n null,\n 'copyright',\n )\n const bottom = tree.add(\n 'muiBox',\n null,\n { pt: 3, borderTop: 1, borderColor: 'divider' },\n [copyright],\n 'footerBottom',\n )\n const stack = tree.add(\n 'muiStack',\n { spacing: '6' },\n null,\n [top, bottom],\n 'footerStack',\n )\n const container = tree.add(\n 'muiContainer',\n { maxWidth: 'lg' },\n { py: { xs: 6, md: 8 } },\n [stack],\n 'footerInner',\n )\n return tree.add(\n 'section',\n {\n element: 'footer',\n ariaLabel: 'Site footer',\n ...(scope.band === 'dark' ? { colorScheme: 'dark' } : {}),\n },\n scope.band === 'soft'\n ? { bgcolor: 'background.paper', borderTop: 1, borderColor: 'divider' }\n : bandSx(scope.band),\n [container],\n 'footer',\n )\n}\n"],"names":["AI_ICON_LIBRARY","AI_LAYOUT_MAX_IMAGES","bandSx","compileFlow","compileRow","destinationProps","aiLayoutFitText","AI_LAYOUT_MAX_ITEMS","aiLayoutResolveLink","AiLayoutTreeBuilder","headerLook","band","props","color","sx","boxShadow","bgcolor","borderBottom","borderColor","aiLayoutIsCopyright","text","test","FOOTER_LEAVES_OUT","Set","frameScope","page","at","centered","index","level","headed","itemsLeft","frame","link","sections","from","formSection","aiCompileLayoutFrame","plan","targets","header","tree","title","siteName","pageId","options","reusableComponents","settled","scrollTo","images","strong","brand","dark","pageIcon","sparkle","formsPlaced","name","blocks","look","scope","navLink","entry","role","interactions","id","add","children","label","slice","screenId","renderAs","textDecoration","nodes","pages","navPages","filter","trim","centeredNav","align","length","brandSx","typography","fontWeight","whiteSpace","overflow","textOverflow","minWidth","flexGrow","homeId","variant","component","nav","ariaLabel","direction","spacing","alignItems","display","xs","md","map","ctaBlock","find","block","kind","push","what","ctaLabel","ctaTo","to","ctaProps","cta","sm","flexShrink","close","AI_LAYOUT_CLOSE_DRAWER","drawer","anchor","flexDirection","gap","p","fullWidth","mt","toggle","middle","justifyContent","row","maxWidth","columnGap","toolbar","disableGutters","minHeight","bar","position","slot","footer","compileFooter","column","prune","rootId","enabled","trigger","event","everyTime","steps","type","navItems","linksPages","flatMap","given","notice","item","items","some","has","pageLinks","cols","columns","col","undefined","Math","min","weights","filled","weight","top","copyright","bottom","pt","borderTop","stack","container","py","element","colorScheme"],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ import type { NodesMap } from '@aglyn/aglyn/types/nodes';
18
+ import { type AiDoctrineViolation } from '../runtime/ai-doctrine-validators';
19
+ /** The violation code a gap is named by. */
20
+ export declare const AI_LAYOUT_GAP_CODE = "layout-gap";
21
+ /** The gaps a language-built page or frame carries, as the violation that asks again. */
22
+ export declare function aiLayoutGapViolations(nodes: NodesMap): AiDoctrineViolation[];
23
+ /** The page or frame with every gap taken out, and what was taken. */
24
+ export declare function aiLayoutWithoutGaps(input: NodesMap, rootId: string): {
25
+ nodes: NodesMap;
26
+ dropped: string[];
27
+ };
28
+ /**
29
+ * What a link may name, which never belongs in words a visitor reads: the
30
+ * site's pages, with the title a reference to one is written as, and every
31
+ * other id the page or frame was built against (its forms, components and
32
+ * sections).
33
+ */
34
+ export interface AiLayoutRefNames {
35
+ pages: ReadonlyArray<{
36
+ id: string;
37
+ label: string;
38
+ }>;
39
+ ids: readonly string[];
40
+ }
41
+ /** The violation code an internal reference in copy is named by. */
42
+ export declare const AI_LAYOUT_REF_CODE = "layout-internal-ref";
43
+ /** Internal references in a language-built page's or frame's words, as the violation that asks again. */
44
+ export declare function aiLayoutRefViolations(nodes: NodesMap, names: AiLayoutRefNames): AiDoctrineViolation[];
45
+ /**
46
+ * The page or frame with no internal reference in its words: a page's
47
+ * reference is written as that page's title, and a line that still names a
48
+ * reference is taken out, as a gap is. Returns what was rewritten and taken.
49
+ */
50
+ export declare function aiLayoutWithoutRefs(input: NodesMap, rootId: string, names: AiLayoutRefNames): {
51
+ nodes: NodesMap;
52
+ dropped: string[];
53
+ };
54
+ /**
55
+ * A language-built page's or frame's words held to both (AGL-3660): before
56
+ * the last answer, each gap and each internal reference is a violation that
57
+ * asks again; in the last, they are taken out and the rest is kept.
58
+ */
59
+ export declare function aiLayoutCopyCheck(input: NodesMap, rootId: string, names: AiLayoutRefNames, last: boolean): {
60
+ nodes: NodesMap;
61
+ dropped: string[];
62
+ violations: AiDoctrineViolation[];
63
+ };