@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
@@ -17,7 +17,9 @@ import { _ as _extends } from "@swc/helpers/_/_extends";
17
17
  */ import { resolveEffectivePlan } from "@aglyn/aglyn/app-utils/plan-entitlements";
18
18
  import { resolveOrgIdForHost } from "@aglyn/tenant-data-admin/server/organizations";
19
19
  import { isAiPlanNewRef } from "../model/ai-build-plan.js";
20
- import { AI_SITE_EMAIL_TYPE, AI_SITE_MAX_SECTIONS, AI_SITE_PAGES, aiSitePagesRefusal, aiSitePlanRefusal, aiSiteSubmissions, aiSiteWords, parseAiSiteJobInputs } from "../model/ai-site-job.js";
20
+ import { aiBuildDegradation, aiBuildInitialLedger, aiBuildItemDelivered, aiBuildItemOpen, aiBuildNextUnit } from "../model/ai-build-job.js";
21
+ import { aiBuildBuiltRefs, aiUnitErrorRetryable, aiUnitFailure, aiUnitSpend } from "./ai-build-unit-outcome.js";
22
+ import { AI_SITE_EMAIL_TYPE, AI_SITE_MAX_SECTIONS, AI_SITE_PAGES, aiSiteNameSentence, aiSitePagesRefusal, aiSitePlanRefusal, aiSiteSubmissions, aiSiteWords, parseAiSiteJobInputs } from "../model/ai-site-job.js";
21
23
  import { AI_SITE_SEO_OUTPUT_ID, aiSiteSeoProposalForInputs } from "../model/ai-site-start-seo.js";
22
24
  import { aiModelForStep } from "../providers/routing.js";
23
25
  import { registerAiJobAdmission } from "./ai-job-admission.js";
@@ -25,6 +27,7 @@ import { aiOriginJobId, aiRecordedJobDraftId } from "./ai-job-draft-ids.js";
25
27
  import { readAiDraftNodes } from "./ai-job-drafts.js";
26
28
  import { AI_LAYOUT_SITE_PAGES_INPUT, aiLayoutSitePagesOfPlan } from "./ai-job-layout-site-pages.js";
27
29
  import { aiPageSectionNodeId } from "./ai-job-page-sections.js";
30
+ import { AI_LAYOUT_FORM_PAGE_INPUT, AI_LAYOUT_LANGUAGE_INPUT, aiLayoutFormPageOfPlan } from "./ai-job-page-language.js";
28
31
  import { aiJobPublishesSite, aiPublishGuidedSite } from "./ai-site-publish.js";
29
32
  import { aiConfirmedPlan, aiUnspentOutcome } from "./ai-job-generation.js";
30
33
  import { AI_JOB_BRIEF_MAX_CHARS } from "./ai-job-text-step.js";
@@ -232,6 +235,10 @@ export const AI_SITE_NO_PLAN_COPY = 'This site job has no confirmed plan to buil
232
235
  * guided start writes it into the brief itself, but an agency batch's brief
233
236
  * is a member's own sentence and may never mention it, and a theme, a layout
234
237
  * or a form asked to serve nobody in particular serves nobody in particular.
238
+ *
239
+ * The name is said twice (AGL-3596): as a field, and as the instruction to use
240
+ * it as written. A layout told only "a dog groomer in Austin" put a business
241
+ * name of its own in the header and the footer.
235
242
  */ export function aiSiteBriefLines(brief, inputs) {
236
243
  const lines = [
237
244
  brief.trim()
@@ -244,6 +251,7 @@ export const AI_SITE_NO_PLAN_COPY = 'This site job has no confirmed plan to buil
244
251
  inputs.brand ? `brand: ${inputs.brand}` : ''
245
252
  ].filter(Boolean);
246
253
  lines.push(`Site — ${site.join('; ')}.`);
254
+ if (inputs.businessName) lines.push(aiSiteNameSentence(inputs.businessName));
247
255
  return lines;
248
256
  }
249
257
  /**
@@ -373,10 +381,21 @@ export const AI_SITE_NO_PLAN_COPY = 'This site job has no confirmed plan to buil
373
381
  });
374
382
  // The layout is built before the pages, so it is told them (AGL-3596): their
375
383
  // ids are minted on the plan, and the platform writes the header's links.
376
- if (job.kind === 'site' && unit.kind === 'layout') {
377
- const pages = aiLayoutSitePagesOfPlan(plan.screens);
384
+ // A page is told them too, so its buttons may go to a page built after it.
385
+ if (job.kind === 'site' && (unit.kind === 'layout' || unit.kind === 'page')) {
386
+ // A guided start links every page the person asked for (AGL-3660).
387
+ const pages = aiLayoutSitePagesOfPlan(plan.screens, {
388
+ guided: true
389
+ });
378
390
  if (pages.length) unitInputs[AI_LAYOUT_SITE_PAGES_INPUT] = pages;
379
391
  }
392
+ // A site's pages and its layout are designed in the layout language and
393
+ // compiled (AGL-3660), and a page is told which page places the site's form.
394
+ if (unit.kind === 'layout' || unit.kind === 'page') {
395
+ unitInputs[AI_LAYOUT_LANGUAGE_INPUT] = true;
396
+ const formPage = aiLayoutFormPageOfPlan(plan);
397
+ if (formPage) unitInputs[AI_LAYOUT_FORM_PAGE_INPUT] = formPage;
398
+ }
380
399
  return _extends({}, job, {
381
400
  $id: aiSiteUnitJobId(job, unit),
382
401
  kind: unit.jobKind,
@@ -518,37 +537,63 @@ export const AI_SITE_NO_PLAN_COPY = 'This site job has no confirmed plan to buil
518
537
  if (!stored) return false;
519
538
  return input.screen.sections.every((_, index)=>aiPageSectionNodeId(input.unitJobId, index) in stored.nodes);
520
539
  }
540
+ /**
541
+ * A scaffold's units as a build's (AGL-3616): the same slots, each unit's
542
+ * kind as its operation, and every page built after the layout and the form
543
+ * it renders inside and places. What the build's ledger, degradation and
544
+ * Try again read, so a site is settled item by item exactly as a build is.
545
+ */ export function aiSiteLedgerUnits(units) {
546
+ const creations = units.filter((unit)=>unit.kind === 'layout' || unit.kind === 'form').map((unit)=>unit.slot);
547
+ return units.map((unit)=>_extends({
548
+ slot: unit.slot,
549
+ op: unit.kind === 'theme' ? 'theme' : unit.jobKind,
550
+ label: unit.label
551
+ }, unit.creation ? {
552
+ creation: unit.creation
553
+ } : {}, unit.screen ? {
554
+ screen: unit.screen
555
+ } : {}, {
556
+ deps: unit.kind === 'page' ? creations : []
557
+ }));
558
+ }
559
+ /**
560
+ * A scaffold's ledger to start from (AGL-3616): every unit pending, except
561
+ * the units a job already running when the ledger arrived had built, read
562
+ * off its outputs as the scaffold always read them, which stand as built.
563
+ */ export function aiSiteInitialLedger(units, outputs) {
564
+ var _byResource_get;
565
+ const pending = new Set(aiSitePendingUnits(units, outputs).map((unit)=>unit.slot));
566
+ const byResource = new Map();
567
+ for (const output of outputs)byResource.set(output.resource, [
568
+ ...(_byResource_get = byResource.get(output.resource)) != null ? _byResource_get : [],
569
+ output.id
570
+ ]);
571
+ return aiBuildInitialLedger(aiSiteLedgerUnits(units)).map((row, index)=>{
572
+ var _byResource_get;
573
+ const unit = units[index];
574
+ if (pending.has(unit.slot)) return row;
575
+ const id = (_byResource_get = byResource.get(unit.resource)) == null ? void 0 : _byResource_get.shift();
576
+ return _extends({}, row, {
577
+ status: 'succeeded',
578
+ outputs: id ? [
579
+ id
580
+ ] : []
581
+ });
582
+ });
583
+ }
584
+ /** The units a scaffold owes on this job: what its plan implies that this deployment can build. */ function aiSiteOwedUnits(job, plan, inputs, freeTaste, runnerFor) {
585
+ return aiSiteJobUnits(plan, {
586
+ welcomeEmail: aiSiteWelcomeEmail(inputs, freeTaste)
587
+ }).filter((unit)=>runnerFor(unit.jobKind));
588
+ }
521
589
  export function createAiJobSiteStep(deps = {}) {
522
590
  var _deps_runnerFor, _deps_readNodes, _deps_publish;
523
591
  const runnerFor = (_deps_runnerFor = deps.runnerFor) != null ? _deps_runnerFor : aiJobStepRunnerFor;
524
592
  const readNodes = (_deps_readNodes = deps.readNodes) != null ? _deps_readNodes : readAiDraftNodes;
525
593
  const publish = (_deps_publish = deps.publish) != null ? _deps_publish : aiPublishGuidedSite;
526
- /** A guided start's last pass puts what it built on the site, once (AGL-3596). */ const published = async (context, outcome)=>{
527
- var _job_outputs;
528
- const { job } = context;
529
- if (!aiJobPublishesSite(job) || job.sitePublish || !job.hostId) return outcome;
530
- const sitePublish = await publish(context.firestore, {
531
- job,
532
- outputs: [
533
- ...(_job_outputs = job.outputs) != null ? _job_outputs : [],
534
- ...outcome.outputs
535
- ],
536
- now: context.now
537
- }).catch((error)=>{
538
- // The site is built either way; the pages stay drafts and say so.
539
- console.error('ai site publish threw', {
540
- orgId: job.orgId,
541
- jobId: job.$id,
542
- error
543
- });
544
- return null;
545
- });
546
- return sitePublish ? _extends({}, outcome, {
547
- sitePublish
548
- }) : outcome;
549
- };
550
594
  return async (context)=>{
551
- var _ref, _job_outputs;
595
+ var _ref, _job_outputs, _job_outputs1;
596
+ var _job_items;
552
597
  const { job } = context;
553
598
  // The scaffold asks no model of its own. What it names where it spends
554
599
  // nothing is the model its plan ran on, which is the one exchange this
@@ -573,35 +618,131 @@ export function createAiJobSiteStep(deps = {}) {
573
618
  });
574
619
  // A kind this deployment has not loaded is not among the units at all, so
575
620
  // a scaffold owes only what something can build.
576
- const units = aiSiteJobUnits(plan, {
577
- welcomeEmail: aiSiteWelcomeEmail(inputs, freeTaste)
578
- }).filter((unit)=>runnerFor(unit.jobKind));
579
- const outputs = (_job_outputs = job.outputs) != null ? _job_outputs : [];
580
- const pending = aiSitePendingUnits(units, outputs);
581
- if (!pending.length) return published(context, aiUnspentOutcome(model));
582
- const unit = pending[0];
621
+ const units = aiSiteOwedUnits(job, plan, inputs, freeTaste, runnerFor);
622
+ const ledgerUnits = aiSiteLedgerUnits(units);
623
+ // Settled item by item, like a build (AGL-3616): the ledger, not the
624
+ // outputs, says where the scaffold stands once it has one.
625
+ const starting = !((_job_items = job.items) == null ? void 0 : _job_items.length);
626
+ const ledger = starting ? aiSiteInitialLedger(units, (_job_outputs = job.outputs) != null ? _job_outputs : []) : job.items;
627
+ const init = starting ? {
628
+ items: ledger
629
+ } : {};
630
+ const rows = new Map(ledger.map((row)=>[
631
+ row.slot,
632
+ row
633
+ ]));
634
+ const next = aiBuildNextUnit(ledgerUnits, ledger);
635
+ /** A guided start's last pass puts what it built on the site, once (AGL-3596): only its pages that were built. */ const finish = async (outcome, pages)=>{
636
+ if (!aiJobPublishesSite(job) || job.sitePublish || !job.hostId || !pages.length) return outcome;
637
+ const sitePublish = await publish(context.firestore, {
638
+ job,
639
+ outputs: pages,
640
+ now: context.now
641
+ }).catch((error)=>{
642
+ // The site is built either way; the pages stay drafts and say so.
643
+ console.error('ai site publish threw', {
644
+ orgId: job.orgId,
645
+ jobId: job.$id,
646
+ error
647
+ });
648
+ return null;
649
+ });
650
+ return sitePublish ? _extends({}, outcome, {
651
+ sitePublish
652
+ }) : outcome;
653
+ };
654
+ /** The pages built so far, as the job reported them. */ const builtPages = (extra = [])=>{
655
+ var _job_outputs;
656
+ const ids = new Set(units.filter((unit)=>{
657
+ var _rows_get;
658
+ return unit.kind === 'page' && aiBuildItemDelivered((_rows_get = rows.get(unit.slot)) != null ? _rows_get : {
659
+ status: 'pending'
660
+ });
661
+ }).flatMap((unit)=>{
662
+ var _ref;
663
+ var _rows_get;
664
+ return (_ref = (_rows_get = rows.get(unit.slot)) == null ? void 0 : _rows_get.outputs) != null ? _ref : [];
665
+ }));
666
+ return [
667
+ ...((_job_outputs = job.outputs) != null ? _job_outputs : []).filter((output)=>output.resource === 'screen' && ids.has(output.id)),
668
+ ...extra
669
+ ];
670
+ };
671
+ if (!next) return finish(_extends({}, aiUnspentOutcome(model), init), builtPages());
672
+ const unit = units.find((one)=>one.slot === next.slot);
583
673
  const runner = runnerFor(unit.jobKind);
584
- if (!runner) return aiUnspentOutcome(model);
585
- const pass = await aiRunJobUnit(context, {
586
- unit,
587
- units,
588
- runner,
589
- emptyCopy: AI_SITE_UNIT_EMPTY_COPY
674
+ if (!runner) return _extends({}, aiUnspentOutcome(model), init);
675
+ const othersOpen = ledgerUnits.some((one)=>{
676
+ var _rows_get;
677
+ return one.slot !== unit.slot && aiBuildItemOpen((_rows_get = rows.get(one.slot)) != null ? _rows_get : {
678
+ status: 'pending'
679
+ });
590
680
  });
591
681
  // The site's own listing rides out beside the first unit's output, once
592
682
  // (AGL-2918): it is derived from the answers rather than generated, so it
593
683
  // is ready before anything is built and costs the pass nothing.
594
- const outcome = _extends({}, pass.outcome, {
595
- outputs: [
596
- ...aiSiteSeoOutputs(job),
597
- ...pass.outcome.outputs
598
- ]
684
+ const listing = aiSiteSeoOutputs(job);
685
+ const settle = (item, spent = aiUnspentOutcome(model))=>_extends({}, spent, {
686
+ outputs: [
687
+ ...listing,
688
+ ...spent.outputs
689
+ ]
690
+ }, init, {
691
+ item
692
+ }, item.status === 'running' || othersOpen ? {
693
+ continue: true
694
+ } : {});
695
+ // A page whose layout or form failed is built without it, and says so.
696
+ const degradation = aiBuildDegradation(next, {
697
+ units: ledgerUnits,
698
+ ledger
599
699
  });
700
+ const degraded = degradation.degradedBy.length > 0;
701
+ const note = degradation.notes.length ? degradation.notes.join(' ') : null;
702
+ const built = aiBuildBuiltRefs(ledgerUnits, ledger, (_job_outputs1 = job.outputs) != null ? _job_outputs1 : []);
703
+ const derived = aiSiteUnitJob(job, unit, built);
704
+ const handed = degradation.briefLines.length ? _extends({}, derived, {
705
+ brief: [
706
+ derived.brief,
707
+ ...degradation.briefLines
708
+ ].join('\n').slice(0, AI_JOB_BRIEF_MAX_CHARS)
709
+ }) : derived;
710
+ let outcome;
711
+ try {
712
+ outcome = await runner(_extends({}, context, {
713
+ job: handed
714
+ }));
715
+ } catch (error) {
716
+ if (aiUnitErrorRetryable(error)) throw error;
717
+ console.error('ai site unit threw', {
718
+ orgId: job.orgId,
719
+ jobId: job.$id,
720
+ slot: unit.slot,
721
+ error
722
+ });
723
+ return settle({
724
+ slot: unit.slot,
725
+ status: 'failed',
726
+ failure: {
727
+ ours: true,
728
+ reason: 'provider',
729
+ message: AI_SITE_UNIT_EMPTY_COPY
730
+ }
731
+ });
732
+ }
733
+ const spent = aiUnitSpend(outcome);
734
+ const stopped = aiUnitFailure(unit.slot, outcome);
735
+ if (stopped) {
736
+ return settle(stopped.status === 'failed' && stopped.failure && !outcome.failure && !outcome.refused && !outcome.review ? _extends({}, stopped, {
737
+ failure: _extends({}, stopped.failure, {
738
+ message: AI_SITE_UNIT_EMPTY_COPY
739
+ })
740
+ }) : stopped, spent);
741
+ }
600
742
  // A page counts as built only when its plan's sections are in it
601
- // (AGL-3596): otherwise the pass fails, which is our failure and gives
602
- // the job's credits back, and the page it reported is not reported.
603
- if (pass.built && unit.kind === 'page' && unit.screen && job.hostId) {
604
- const page = pass.outcome.outputs.find((output)=>output.resource === 'screen');
743
+ // (AGL-3596): otherwise the page fails, on our side, and is not reported.
744
+ if (unit.kind === 'page' && unit.screen && job.hostId) {
745
+ const page = outcome.outputs.find((output)=>output.resource === 'screen');
605
746
  const written = page !== undefined && await aiSitePageWritten(context.firestore, {
606
747
  hostId: job.hostId,
607
748
  unitJobId: aiSiteUnitJobId(job, unit),
@@ -609,17 +750,32 @@ export function createAiJobSiteStep(deps = {}) {
609
750
  draftId: page.id
610
751
  }, readNodes);
611
752
  if (!written) {
612
- return _extends({}, outcome, {
613
- outputs: outcome.outputs.filter((output)=>output.resource !== 'screen'),
614
- failure: AI_SITE_PAGE_NOT_WRITTEN_COPY
615
- });
753
+ return settle({
754
+ slot: unit.slot,
755
+ status: 'failed',
756
+ failure: {
757
+ ours: true,
758
+ reason: 'step-failure',
759
+ message: AI_SITE_PAGE_NOT_WRITTEN_COPY
760
+ }
761
+ }, _extends({}, spent, {
762
+ outputs: spent.outputs.filter((output)=>output.resource !== 'screen')
763
+ }));
616
764
  }
617
765
  }
618
- // A built unit continues the scaffold while units remain after it.
619
- if (pass.built && pending.length > 1) return _extends({}, outcome, {
620
- continue: true
621
- });
622
- return pass.built ? published(context, outcome) : outcome;
766
+ const done = settle(_extends({
767
+ slot: unit.slot,
768
+ status: degraded ? 'degraded' : 'succeeded',
769
+ outputs: outcome.outputs.map((output)=>output.id),
770
+ note
771
+ }, degraded ? {
772
+ degradedBy: degradation.degradedBy
773
+ } : {}), spent);
774
+ if (done.continue) return done;
775
+ rows.set(unit.slot, _extends({}, rows.get(unit.slot), {
776
+ status: degraded ? 'degraded' : 'succeeded'
777
+ }));
778
+ return finish(done, builtPages(unit.kind === 'page' ? outcome.outputs.filter((output)=>output.resource === 'screen') : []));
623
779
  };
624
780
  }
625
781
  export const runAiJobSiteStep = createAiJobSiteStep();
@@ -632,6 +788,7 @@ export const runAiJobSiteStep = createAiJobSiteStep();
632
788
  * build, spends nothing, and a page pass's time covers it.
633
789
  */ export function aiSiteJobRunMinimumMs(job) {
634
790
  var _job_outputs;
791
+ var _job_items;
635
792
  const plan = aiConfirmedPlan(job);
636
793
  const inputs = parseAiSiteJobInputs(job.inputs);
637
794
  if (!plan || typeof inputs === 'string') return AI_JOB_PAGE_STEP_MINIMUM_MS;
@@ -639,9 +796,11 @@ export const runAiJobSiteStep = createAiJobSiteStep();
639
796
  welcomeEmail: inputs.welcomeEmail
640
797
  }).filter((unit)=>aiJobStepRunnerFor(unit.jobKind));
641
798
  const outputs = (_job_outputs = job.outputs) != null ? _job_outputs : [];
642
- const [unit] = aiSitePendingUnits(units, outputs);
799
+ const ledger = ((_job_items = job.items) == null ? void 0 : _job_items.length) ? job.items : aiSiteInitialLedger(units, outputs);
800
+ const next = aiBuildNextUnit(aiSiteLedgerUnits(units), ledger);
801
+ const unit = next ? units.find((one)=>one.slot === next.slot) : undefined;
643
802
  if (!unit) return AI_JOB_PAGE_STEP_MINIMUM_MS;
644
- return aiJobStepRunMinimumMs(aiSiteUnitJob(job, unit, aiSiteBuiltRefs(units, outputs)));
803
+ return aiJobStepRunMinimumMs(aiSiteUnitJob(job, unit, aiBuildBuiltRefs(aiSiteLedgerUnits(units), ledger, outputs)));
645
804
  }
646
805
  /**
647
806
  * Registers the site scaffold with the least time a pass needs — every