@aglyn/plugins-ai 1.0.0-beta.270 → 1.0.0-beta.272

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 (281) hide show
  1. package/package.json +17 -17
  2. package/src/lib/activity/ai-activity-actions.d.ts +4 -3
  3. package/src/lib/activity/ai-activity-actions.js +4 -0
  4. package/src/lib/activity/ai-activity-actions.js.map +1 -1
  5. package/src/lib/assets/site-styles/beauty.webp +0 -0
  6. package/src/lib/assets/site-styles/blog.webp +0 -0
  7. package/src/lib/assets/site-styles/business.webp +0 -0
  8. package/src/lib/assets/site-styles/coming-soon.webp +0 -0
  9. package/src/lib/assets/site-styles/education.webp +0 -0
  10. package/src/lib/assets/site-styles/events.webp +0 -0
  11. package/src/lib/assets/site-styles/fitness.webp +0 -0
  12. package/src/lib/assets/site-styles/landing.webp +0 -0
  13. package/src/lib/assets/site-styles/music.webp +0 -0
  14. package/src/lib/assets/site-styles/nonprofit.webp +0 -0
  15. package/src/lib/assets/site-styles/personal.webp +0 -0
  16. package/src/lib/assets/site-styles/photography.webp +0 -0
  17. package/src/lib/assets/site-styles/portfolio.webp +0 -0
  18. package/src/lib/assets/site-styles/professional.webp +0 -0
  19. package/src/lib/assets/site-styles/realestate.webp +0 -0
  20. package/src/lib/assets/site-styles/restaurant.webp +0 -0
  21. package/src/lib/assets/site-styles/store.webp +0 -0
  22. package/src/lib/assets/site-styles/studio.webp +0 -0
  23. package/src/lib/assets/site-styles/trades.webp +0 -0
  24. package/src/lib/assets/site-styles/wellness.webp +0 -0
  25. package/src/lib/assets/site-styles/yoga.webp +0 -0
  26. package/src/lib/components/ai-credits-card.component.d.ts +4 -3
  27. package/src/lib/components/ai-credits-card.component.js +15 -15
  28. package/src/lib/components/ai-credits-card.component.js.map +1 -1
  29. package/src/lib/components/ai-job-input-form.component.d.ts +36 -0
  30. package/src/lib/components/ai-job-input-form.component.js +100 -0
  31. package/src/lib/components/ai-job-input-form.component.js.map +1 -0
  32. package/src/lib/components/ai-job-requests.d.ts +4 -0
  33. package/src/lib/components/ai-job-requests.js +4 -0
  34. package/src/lib/components/ai-job-requests.js.map +1 -1
  35. package/src/lib/components/ai-site-build-page.component.js +18 -0
  36. package/src/lib/components/ai-site-build-page.component.js.map +1 -1
  37. package/src/lib/components/ai-site-import-job.component.d.ts +41 -0
  38. package/src/lib/components/ai-site-import-job.component.js +707 -0
  39. package/src/lib/components/ai-site-import-job.component.js.map +1 -0
  40. package/src/lib/components/ai-site-import-start.component.d.ts +64 -0
  41. package/src/lib/components/ai-site-import-start.component.js +335 -0
  42. package/src/lib/components/ai-site-import-start.component.js.map +1 -0
  43. package/src/lib/components/ai-site-ownership-proof.component.d.ts +42 -0
  44. package/src/lib/components/ai-site-ownership-proof.component.js +353 -0
  45. package/src/lib/components/ai-site-ownership-proof.component.js.map +1 -0
  46. package/src/lib/components/ai-site-start-card.component.d.ts +1 -1
  47. package/src/lib/components/ai-site-start-card.component.js +261 -119
  48. package/src/lib/components/ai-site-start-card.component.js.map +1 -1
  49. package/src/lib/components/ai-site-start-steps.component.d.ts +43 -2
  50. package/src/lib/components/ai-site-start-steps.component.js +651 -15
  51. package/src/lib/components/ai-site-start-steps.component.js.map +1 -1
  52. package/src/lib/components/ai-site-start-tracking.d.ts +10 -0
  53. package/src/lib/components/ai-site-start-tracking.js +14 -0
  54. package/src/lib/components/ai-site-start-tracking.js.map +1 -1
  55. package/src/lib/components/ai-site-style-previews.js +26 -22
  56. package/src/lib/components/ai-site-style-previews.js.map +1 -1
  57. package/src/lib/components/ai-upsell-dialog.component.d.ts +7 -5
  58. package/src/lib/components/ai-upsell-dialog.component.js +8 -6
  59. package/src/lib/components/ai-upsell-dialog.component.js.map +1 -1
  60. package/src/lib/components/assist-build-card.component.js +11 -1
  61. package/src/lib/components/assist-build-card.component.js.map +1 -1
  62. package/src/lib/components/assist-jobs-drawer.component.js +9 -1
  63. package/src/lib/components/assist-jobs-drawer.component.js.map +1 -1
  64. package/src/lib/components/assist-panel.component.js +8 -4
  65. package/src/lib/components/assist-panel.component.js.map +1 -1
  66. package/src/lib/components/staff-org-ai-card.component.js +4 -7
  67. package/src/lib/components/staff-org-ai-card.component.js.map +1 -1
  68. package/src/lib/declarations.d.ts +2 -2
  69. package/src/lib/declarations.js +9 -5
  70. package/src/lib/declarations.js.map +1 -1
  71. package/src/lib/jobs/ai-build-capabilities.js +3 -1
  72. package/src/lib/jobs/ai-build-capabilities.js.map +1 -1
  73. package/src/lib/jobs/ai-business-profile-prefill.d.ts +1 -1
  74. package/src/lib/jobs/ai-business-profile-prefill.js +14 -3
  75. package/src/lib/jobs/ai-business-profile-prefill.js.map +1 -1
  76. package/src/lib/jobs/ai-job-build-step.js +5 -3
  77. package/src/lib/jobs/ai-job-build-step.js.map +1 -1
  78. package/src/lib/jobs/ai-job-drafts.d.ts +14 -0
  79. package/src/lib/jobs/ai-job-drafts.js +24 -0
  80. package/src/lib/jobs/ai-job-drafts.js.map +1 -1
  81. package/src/lib/jobs/ai-job-form-step.d.ts +15 -1
  82. package/src/lib/jobs/ai-job-form-step.js +75 -8
  83. package/src/lib/jobs/ai-job-form-step.js.map +1 -1
  84. package/src/lib/jobs/ai-job-import-step.d.ts +136 -0
  85. package/src/lib/jobs/ai-job-import-step.js +809 -0
  86. package/src/lib/jobs/ai-job-import-step.js.map +1 -0
  87. package/src/lib/jobs/ai-job-page-language.d.ts +52 -1
  88. package/src/lib/jobs/ai-job-page-language.js +99 -5
  89. package/src/lib/jobs/ai-job-page-language.js.map +1 -1
  90. package/src/lib/jobs/ai-job-page-step.d.ts +19 -2
  91. package/src/lib/jobs/ai-job-page-step.js +42 -18
  92. package/src/lib/jobs/ai-job-page-step.js.map +1 -1
  93. package/src/lib/jobs/ai-job-plan-step.d.ts +25 -2
  94. package/src/lib/jobs/ai-job-plan-step.js +103 -29
  95. package/src/lib/jobs/ai-job-plan-step.js.map +1 -1
  96. package/src/lib/jobs/ai-job-settings-step.js +4 -3
  97. package/src/lib/jobs/ai-job-settings-step.js.map +1 -1
  98. package/src/lib/jobs/ai-job-site-datasets.d.ts +27 -0
  99. package/src/lib/jobs/ai-job-site-datasets.js +140 -14
  100. package/src/lib/jobs/ai-job-site-datasets.js.map +1 -1
  101. package/src/lib/jobs/ai-job-site-look.js +18 -5
  102. package/src/lib/jobs/ai-job-site-look.js.map +1 -1
  103. package/src/lib/jobs/ai-job-site-step.d.ts +16 -1
  104. package/src/lib/jobs/ai-job-site-step.js +95 -22
  105. package/src/lib/jobs/ai-job-site-step.js.map +1 -1
  106. package/src/lib/jobs/ai-job-text-step.d.ts +15 -1
  107. package/src/lib/jobs/ai-job-text-step.js.map +1 -1
  108. package/src/lib/jobs/ai-job-tracking-step.d.ts +14 -3
  109. package/src/lib/jobs/ai-job-tracking-step.js +28 -5
  110. package/src/lib/jobs/ai-job-tracking-step.js.map +1 -1
  111. package/src/lib/jobs/ai-jobs.d.ts +13 -1
  112. package/src/lib/jobs/ai-jobs.js +77 -10
  113. package/src/lib/jobs/ai-jobs.js.map +1 -1
  114. package/src/lib/jobs/ai-layout-owner-photos.d.ts +16 -1
  115. package/src/lib/jobs/ai-layout-owner-photos.js +47 -0
  116. package/src/lib/jobs/ai-layout-owner-photos.js.map +1 -1
  117. package/src/lib/jobs/ai-layout-stock-photos.d.ts +27 -2
  118. package/src/lib/jobs/ai-layout-stock-photos.js +190 -19
  119. package/src/lib/jobs/ai-layout-stock-photos.js.map +1 -1
  120. package/src/lib/jobs/ai-site-inspiration-signals.d.ts +98 -0
  121. package/src/lib/jobs/ai-site-inspiration-signals.js +585 -0
  122. package/src/lib/jobs/ai-site-inspiration-signals.js.map +1 -0
  123. package/src/lib/jobs/ai-site-inspiration.d.ts +157 -0
  124. package/src/lib/jobs/ai-site-inspiration.js +346 -0
  125. package/src/lib/jobs/ai-site-inspiration.js.map +1 -0
  126. package/src/lib/jobs/ai-site-publish.d.ts +26 -1
  127. package/src/lib/jobs/ai-site-publish.js +162 -13
  128. package/src/lib/jobs/ai-site-publish.js.map +1 -1
  129. package/src/lib/jobs/ai-theme-brand-inputs.d.ts +77 -3
  130. package/src/lib/jobs/ai-theme-brand-inputs.js +135 -31
  131. package/src/lib/jobs/ai-theme-brand-inputs.js.map +1 -1
  132. package/src/lib/jobs/fixtures/ai-candle-shop-free-plan-recording.d.ts +97 -0
  133. package/src/lib/jobs/fixtures/ai-candle-shop-free-plan-recording.js +137 -0
  134. package/src/lib/jobs/fixtures/ai-candle-shop-free-plan-recording.js.map +1 -0
  135. package/src/lib/jobs/fixtures/ai-site-inspiration-pages.d.ts +38 -0
  136. package/src/lib/jobs/fixtures/ai-site-inspiration-pages.js +103 -0
  137. package/src/lib/jobs/fixtures/ai-site-inspiration-pages.js.map +1 -0
  138. package/src/lib/jobs/fixtures/ai-stock-photo-agl3988-recordings.d.ts +25 -0
  139. package/src/lib/jobs/fixtures/ai-stock-photo-agl3988-recordings.js +174 -0
  140. package/src/lib/jobs/fixtures/ai-stock-photo-agl3988-recordings.js.map +1 -0
  141. package/src/lib/layout-language/ai-layout-compiler.d.ts +1 -1
  142. package/src/lib/layout-language/ai-layout-compiler.js +438 -25
  143. package/src/lib/layout-language/ai-layout-compiler.js.map +1 -1
  144. package/src/lib/layout-language/ai-layout-contact.d.ts +57 -0
  145. package/src/lib/layout-language/ai-layout-contact.js +137 -0
  146. package/src/lib/layout-language/ai-layout-contact.js.map +1 -0
  147. package/src/lib/layout-language/ai-layout-copy.d.ts +12 -0
  148. package/src/lib/layout-language/ai-layout-copy.js +34 -2
  149. package/src/lib/layout-language/ai-layout-copy.js.map +1 -1
  150. package/src/lib/layout-language/ai-layout-design.d.ts +65 -8
  151. package/src/lib/layout-language/ai-layout-design.js +411 -97
  152. package/src/lib/layout-language/ai-layout-design.js.map +1 -1
  153. package/src/lib/layout-language/ai-layout-frame.js +23 -0
  154. package/src/lib/layout-language/ai-layout-frame.js.map +1 -1
  155. package/src/lib/layout-language/ai-layout-labels.d.ts +2 -0
  156. package/src/lib/layout-language/ai-layout-labels.js +12 -6
  157. package/src/lib/layout-language/ai-layout-labels.js.map +1 -1
  158. package/src/lib/layout-language/ai-layout-language.d.ts +3 -2
  159. package/src/lib/layout-language/ai-layout-language.js +4 -3
  160. package/src/lib/layout-language/ai-layout-language.js.map +1 -1
  161. package/src/lib/layout-language/ai-layout-links.d.ts +13 -0
  162. package/src/lib/layout-language/ai-layout-links.js +30 -0
  163. package/src/lib/layout-language/ai-layout-links.js.map +1 -1
  164. package/src/lib/layout-language/ai-layout-pictures.d.ts +49 -6
  165. package/src/lib/layout-language/ai-layout-pictures.js +145 -22
  166. package/src/lib/layout-language/ai-layout-pictures.js.map +1 -1
  167. package/src/lib/model/ai-build-job.d.ts +16 -1
  168. package/src/lib/model/ai-build-job.js +40 -0
  169. package/src/lib/model/ai-build-job.js.map +1 -1
  170. package/src/lib/model/ai-credit-estimate.d.ts +20 -0
  171. package/src/lib/model/ai-credit-estimate.js +13 -0
  172. package/src/lib/model/ai-credit-estimate.js.map +1 -1
  173. package/src/lib/model/ai-job-activity.d.ts +2 -2
  174. package/src/lib/model/ai-job-activity.js +6 -4
  175. package/src/lib/model/ai-job-activity.js.map +1 -1
  176. package/src/lib/model/ai-job-input.d.ts +33 -0
  177. package/src/lib/model/ai-job-input.js +59 -0
  178. package/src/lib/model/ai-job-input.js.map +1 -0
  179. package/src/lib/model/ai-job-notice.d.ts +4 -0
  180. package/src/lib/model/ai-job-notice.js +28 -4
  181. package/src/lib/model/ai-job-notice.js.map +1 -1
  182. package/src/lib/model/ai-jobs.types.d.ts +69 -3
  183. package/src/lib/model/ai-jobs.types.js +2 -1
  184. package/src/lib/model/ai-jobs.types.js.map +1 -1
  185. package/src/lib/model/ai-site-details.d.ts +122 -0
  186. package/src/lib/model/ai-site-details.js +300 -0
  187. package/src/lib/model/ai-site-details.js.map +1 -0
  188. package/src/lib/model/ai-site-entity.d.ts +181 -0
  189. package/src/lib/model/ai-site-entity.js +390 -0
  190. package/src/lib/model/ai-site-entity.js.map +1 -0
  191. package/src/lib/model/ai-site-import-view.d.ts +130 -0
  192. package/src/lib/model/ai-site-import-view.js +182 -0
  193. package/src/lib/model/ai-site-import-view.js.map +1 -0
  194. package/src/lib/model/ai-site-import.d.ts +302 -0
  195. package/src/lib/model/ai-site-import.js +526 -0
  196. package/src/lib/model/ai-site-import.js.map +1 -0
  197. package/src/lib/model/ai-site-inspiration.d.ts +72 -0
  198. package/src/lib/model/ai-site-inspiration.js +109 -0
  199. package/src/lib/model/ai-site-inspiration.js.map +1 -0
  200. package/src/lib/model/ai-site-job.d.ts +13 -1
  201. package/src/lib/model/ai-site-job.js +15 -2
  202. package/src/lib/model/ai-site-job.js.map +1 -1
  203. package/src/lib/model/ai-site-kinds.js +109 -21
  204. package/src/lib/model/ai-site-kinds.js.map +1 -1
  205. package/src/lib/model/ai-site-look.d.ts +10 -0
  206. package/src/lib/model/ai-site-look.js +24 -0
  207. package/src/lib/model/ai-site-look.js.map +1 -1
  208. package/src/lib/model/ai-site-start-seo.d.ts +19 -5
  209. package/src/lib/model/ai-site-start-seo.js +25 -7
  210. package/src/lib/model/ai-site-start-seo.js.map +1 -1
  211. package/src/lib/model/ai-site-start-steps.d.ts +9 -3
  212. package/src/lib/model/ai-site-start-steps.js +67 -5
  213. package/src/lib/model/ai-site-start-steps.js.map +1 -1
  214. package/src/lib/model/ai-site-start.d.ts +81 -4
  215. package/src/lib/model/ai-site-start.js +207 -13
  216. package/src/lib/model/ai-site-start.js.map +1 -1
  217. package/src/lib/model/ai-upsell-copy.js +4 -1
  218. package/src/lib/model/ai-upsell-copy.js.map +1 -1
  219. package/src/lib/plan-entitlements.d.ts +4 -3
  220. package/src/lib/plan-entitlements.js +3 -8
  221. package/src/lib/plan-entitlements.js.map +1 -1
  222. package/src/lib/runtime/ai-dataset-generation.d.ts +8 -1
  223. package/src/lib/runtime/ai-dataset-generation.js +12 -2
  224. package/src/lib/runtime/ai-dataset-generation.js.map +1 -1
  225. package/src/lib/runtime/ai-doctrine-validators.d.ts +26 -33
  226. package/src/lib/runtime/ai-doctrine-validators.js +54 -44
  227. package/src/lib/runtime/ai-doctrine-validators.js.map +1 -1
  228. package/src/lib/runtime/ai-doctrine.js +1 -1
  229. package/src/lib/runtime/ai-doctrine.js.map +1 -1
  230. package/src/lib/runtime/ai-node-tree.d.ts +7 -0
  231. package/src/lib/runtime/ai-node-tree.js +9 -1
  232. package/src/lib/runtime/ai-node-tree.js.map +1 -1
  233. package/src/lib/server/ai-create-route.d.ts +1 -1
  234. package/src/lib/server/ai-create-route.js +3 -4
  235. package/src/lib/server/ai-create-route.js.map +1 -1
  236. package/src/lib/server/ai-jobs-resume.js +27 -3
  237. package/src/lib/server/ai-jobs-resume.js.map +1 -1
  238. package/src/lib/server/ai-jobs-route.js +18 -0
  239. package/src/lib/server/ai-jobs-route.js.map +1 -1
  240. package/src/lib/server/ai-site-import-route.d.ts +89 -0
  241. package/src/lib/server/ai-site-import-route.js +356 -0
  242. package/src/lib/server/ai-site-import-route.js.map +1 -0
  243. package/src/lib/server.js +14 -0
  244. package/src/lib/server.js.map +1 -1
  245. package/src/lib/site-import/fixtures/site-import-crawl-recordings.d.ts +45 -0
  246. package/src/lib/site-import/fixtures/site-import-crawl-recordings.js +313 -0
  247. package/src/lib/site-import/fixtures/site-import-crawl-recordings.js.map +1 -0
  248. package/src/lib/site-import/fixtures/site-import-wave-recordings.d.ts +50 -0
  249. package/src/lib/site-import/fixtures/site-import-wave-recordings.js +217 -0
  250. package/src/lib/site-import/fixtures/site-import-wave-recordings.js.map +1 -0
  251. package/src/lib/site-import/site-import-crawl.d.ts +163 -0
  252. package/src/lib/site-import/site-import-crawl.js +467 -0
  253. package/src/lib/site-import/site-import-crawl.js.map +1 -0
  254. package/src/lib/site-import/site-import-flag.d.ts +23 -0
  255. package/src/lib/site-import/site-import-flag.js +23 -0
  256. package/src/lib/site-import/site-import-flag.js.map +1 -0
  257. package/src/lib/site-import/site-import-html.d.ts +94 -0
  258. package/src/lib/site-import/site-import-html.js +462 -0
  259. package/src/lib/site-import/site-import-html.js.map +1 -0
  260. package/src/lib/site-import/site-import-images.d.ts +54 -0
  261. package/src/lib/site-import/site-import-images.js +204 -0
  262. package/src/lib/site-import/site-import-images.js.map +1 -0
  263. package/src/lib/site-import/site-import-page.d.ts +48 -0
  264. package/src/lib/site-import/site-import-page.js +150 -0
  265. package/src/lib/site-import/site-import-page.js.map +1 -0
  266. package/src/lib/site-import/site-import-review.d.ts +40 -0
  267. package/src/lib/site-import/site-import-review.js +149 -0
  268. package/src/lib/site-import/site-import-review.js.map +1 -0
  269. package/src/lib/site-import/site-import-robots.d.ts +52 -0
  270. package/src/lib/site-import/site-import-robots.js +126 -0
  271. package/src/lib/site-import/site-import-robots.js.map +1 -0
  272. package/src/lib/usage/assist-credits.d.ts +4 -4
  273. package/src/lib/usage/assist-credits.js +4 -4
  274. package/src/lib/usage/assist-credits.js.map +1 -1
  275. package/src/lib/usage/staff-org-ai-view.js +6 -3
  276. package/src/lib/usage/staff-org-ai-view.js.map +1 -1
  277. package/src/lib/usage/staff-org-ai.d.ts +4 -2
  278. package/src/lib/usage/staff-org-ai.js +7 -7
  279. package/src/lib/usage/staff-org-ai.js.map +1 -1
  280. package/src/lib/usage/staff-org-usage-ai.js +2 -2
  281. package/src/lib/usage/staff-org-usage-ai.js.map +1 -1
@@ -24,6 +24,7 @@ import { createResourceUid } from "@aglyn/aglyn/app-utils/create-resource-uid";
24
24
  import { checkEntitlement } from "@aglyn/aglyn/server";
25
25
  import { assistCreditsFromUsd, assistFreeTasteRefusalText, assistHardCapRefusalText, assistRefusedByHardCap } from "../usage/assist-credits.js";
26
26
  import { AI_JOB_PLAN_STEP, AI_JOB_TERMINAL_STATUSES } from "../model/ai-jobs.types.js";
27
+ import { aiJobInputProblems, aiPlanWithInput } from "../model/ai-job-input.js";
27
28
  import { resolveEffectivePlan } from "@aglyn/aglyn/app-utils/plan-entitlements";
28
29
  import { aiOverageReservationRefusal } from "../billing/ai-overage-gate.js";
29
30
  import { aiAllotmentRefusalText } from "../model/ai-allotments.js";
@@ -45,6 +46,7 @@ import { freeAssistAccount } from "../usage/assist-free-taste.js";
45
46
  import { aiJobAutoConfirms } from "./ai-job-auto-confirm.js";
46
47
  import { AI_SITE_GUIDED_BUILD_FAILED_COPY, aiCustomerSafeCopy, aiCustomerSafeItem, aiCustomerSafeReview } from "../model/ai-job-failure-copy.js";
47
48
  import { aiSiteStartInputsOf } from "../model/ai-site-start.js";
49
+ import { aiSiteImportWire } from "../model/ai-site-import.js";
48
50
  import { addAdminAudit } from "@aglyn/tenant-data-admin/server/admin-audit-write";
49
51
  import { AI_JOB_CANCELED_ITEM_NOTE, aiJobCancelPending, isAiJobCanceledError, watchAiJobCancel } from "./ai-job-cancel.js";
50
52
  import { clearAiEmptySiteSweep, scheduleAiEmptySiteSweep } from "./ai-empty-site-sweep.js";
@@ -478,7 +480,7 @@ export async function getAiJob(firestore, orgId, jobId) {
478
480
  }
479
481
  /** The wire form. `running` is the lease, read against `now`. */ export function aiJobSummary(job, now = new Date()) {
480
482
  var _job_hostId, _job_steps, _job_outputs, _job_creditsReserved, _job_creditsSpent, _job_refundedCredits, _toIso, _toIso1, _job_error, _job_plan_labels, _job_plan_confirmedBy, _job_applied_versions, _job_applied_staged;
481
- var _job_lease, _job_inputs, _job_items, _job_inputs1;
483
+ var _job_lease, _job_inputs, _job_input_fields, _job_input, _job_items, _job_inputs1;
482
484
  const leaseUntil = toMillis((_job_lease = job.lease) == null ? void 0 : _job_lease.until);
483
485
  return _extends({
484
486
  id: job.$id,
@@ -519,7 +521,10 @@ export async function getAiJob(firestore, orgId, jobId) {
519
521
  }) : null,
520
522
  review: job.review ? aiCustomerSafeReview(job.review, {
521
523
  page: job.kind === 'page'
522
- }) : null,
524
+ }) : null
525
+ }, job.status === 'needs_input' && ((_job_input = job.input) == null ? void 0 : (_job_input_fields = _job_input.fields) == null ? void 0 : _job_input_fields.length) ? {
526
+ input: job.input
527
+ } : {}, {
523
528
  applied: job.applied ? {
524
529
  at: toIso(job.applied.at),
525
530
  by: job.applied.by,
@@ -542,6 +547,8 @@ export async function getAiJob(firestore, orgId, jobId) {
542
547
  cancelRequested: true
543
548
  } : {}, job.siteRemoved ? {
544
549
  siteRemoved: true
550
+ } : {}, job.siteImport ? {
551
+ siteImport: aiSiteImportWire(job.siteImport)
545
552
  } : {});
546
553
  }
547
554
  function leaseIsLive(job, owner, nowMs) {
@@ -830,7 +837,7 @@ function nextStepIndex(job) {
830
837
  */ export async function recordStep(firestore, orgId, jobId, owner, stepIndex, input, now = new Date()) {
831
838
  const ref = jobsCollection(firestore, orgId).doc(jobId);
832
839
  const recorded = await firestore.runTransaction(async (tx)=>{
833
- var _ref, _input_items, _job_outputs, _input_outputs, _job_creditsSpent, _job_creditsReserved, _job_creditsReserved1, _job_refundedCredits, _ref1;
840
+ var _ref, _input_items, _job_outputs, _input_outputs, _job_creditsSpent, _job_creditsReserved, _job_creditsReserved1, _job_refundedCredits, _input_input, _ref1;
834
841
  var _job_lease, _input_item, _this;
835
842
  const job = jobFrom(await tx.get(ref));
836
843
  if (!job) throw new Error(`ai job ${orgId}/${jobId} vanished`);
@@ -858,7 +865,9 @@ function nextStepIndex(job) {
858
865
  // write that records what the step cost and built: nothing after it runs.
859
866
  const canceling = aiJobCancelPending(job);
860
867
  const parksForReview = Boolean(input.review) && !isAiJobTerminal(job.status) && !canceling;
861
- const status = isAiJobTerminal(job.status) ? job.status : canceling ? 'canceled' : job.status === 'needs_input' ? job.status : parksForReview ? 'needs_review' : input.status === 'failed' ? 'running' : remaining > 0 ? 'queued' : 'running';
868
+ // A plan only the person can complete waits for their answer (AGL-3978).
869
+ const parkedAs = input.input ? 'needs_input' : 'needs_review';
870
+ const status = isAiJobTerminal(job.status) ? job.status : canceling ? 'canceled' : job.status === 'needs_input' ? job.status : parksForReview ? parkedAs : input.status === 'failed' ? 'running' : remaining > 0 ? 'queued' : 'running';
862
871
  const patch = _extends({
863
872
  status,
864
873
  steps,
@@ -877,13 +886,18 @@ function nextStepIndex(job) {
877
886
  plan: input.plan
878
887
  } : {}, input.sitePublish ? {
879
888
  sitePublish: input.sitePublish
889
+ } : {}, input.siteImport ? {
890
+ siteImport: input.siteImport
880
891
  } : {}, items ? {
881
892
  items
882
893
  } : {}, ((_input_item = input.item) == null ? void 0 : _input_item.creditsRefunded) ? {
883
894
  refundedCredits: ((_job_refundedCredits = job.refundedCredits) != null ? _job_refundedCredits : 0) + input.item.creditsRefunded
884
895
  } : {}, parksForReview && input.review ? {
885
896
  review: input.review,
886
- error: input.review.reason === 'plan' ? null : input.review.message
897
+ // A plan to confirm and a site import's wave to review (AGL-3976)
898
+ // are decisions waiting, not errors.
899
+ error: input.input ? input.input.message : input.review.reason === 'plan' || input.review.reason === 'wave' ? null : input.review.message,
900
+ input: (_input_input = input.input) != null ? _input_input : null
887
901
  } : {}, canceling ? _extends({
888
902
  creditsReserved: 0,
889
903
  lease: null,
@@ -900,8 +914,8 @@ function nextStepIndex(job) {
900
914
  return {
901
915
  job: _extends({}, job, patch),
902
916
  remaining,
903
- // Entered `needs_review` in this write, rather than parked again.
904
- parked: parksForReview && job.status !== 'needs_review',
917
+ // Entered `needs_review` (or `needs_input` for an answer) in this write, rather than parked again.
918
+ parked: parksForReview && job.status !== parkedAs,
905
919
  // Ended `canceled` in this write (AGL-3936).
906
920
  ended: canceling && !isAiJobTerminal(job.status)
907
921
  };
@@ -1156,7 +1170,9 @@ async function transition(firestore, orgId, jobId, apply) {
1156
1170
  * which is the build's preset. Their step writes an item ledger; a failed
1157
1171
  * item gives back its own spend and the rest goes on.
1158
1172
  */ export function aiJobSettlesByItem(kind) {
1159
- return kind === 'build' || kind === 'site';
1173
+ // A site import's pages are its items too (AGL-3976): one that fails on
1174
+ // our side gives back its own spend, and its wave goes on.
1175
+ return kind === 'build' || kind === 'site' || kind === 'import';
1160
1176
  }
1161
1177
  /**
1162
1178
  * Whether Try again may run a job's failed items: a finished build, done or
@@ -1167,6 +1183,7 @@ async function transition(firestore, orgId, jobId, apply) {
1167
1183
  return job.kind === 'site' && job.status === 'done';
1168
1184
  }
1169
1185
  /** What a build that delivered nothing says; its planning was given back too. */ export const AI_BUILD_NOTHING_BUILT_COPY = 'Nothing in this request could be built. Try again, or ask for less at once.';
1186
+ /** What a site import that brought no page in says (AGL-3976); every page's spend was given back. */ export const AI_SITE_IMPORT_NOTHING_BUILT_COPY = 'No page of your site could be brought in. Nothing was charged for the pages that failed; try again later.';
1170
1187
  /** What an item the build never reached says when the build stopped early. */ export const AI_BUILD_NOT_REACHED_COPY = 'Not built: the build stopped before it reached this.';
1171
1188
  /**
1172
1189
  * Gives back one build item's spend, or its planning's (`slot: 'plan'`),
@@ -1357,7 +1374,7 @@ async function transition(firestore, orgId, jobId, apply) {
1357
1374
  updatedAt: now
1358
1375
  });
1359
1376
  });
1360
- const nothing = job.kind === 'site' ? AI_SITE_GUIDED_BUILD_FAILED_COPY : AI_BUILD_NOTHING_BUILT_COPY;
1377
+ const nothing = job.kind === 'site' ? AI_SITE_GUIDED_BUILD_FAILED_COPY : job.kind === 'import' ? AI_SITE_IMPORT_NOTHING_BUILT_COPY : AI_BUILD_NOTHING_BUILT_COPY;
1361
1378
  return failAiJob(firestore, orgId, jobId, (_ref1 = stopped == null ? void 0 : stopped.message) != null ? _ref1 : nothing, {
1362
1379
  error: 'build delivered nothing',
1363
1380
  // Ours unless every item that failed was the model declining (AGL-3616).
@@ -1426,11 +1443,27 @@ async function transition(firestore, orgId, jobId, apply) {
1426
1443
  */ export async function resumeAiJob(firestore, orgId, jobId, actor, now = new Date(), options = {}) {
1427
1444
  const resumed = await transition(firestore, orgId, jobId, (current)=>{
1428
1445
  var _options_reducePlan;
1429
- var _current_review, _current_inputs;
1446
+ var _current_input_fields, _current_input, _current_review, _current_inputs;
1430
1447
  // A job the meter paused (AGL-3660) carries on from the step it paused
1431
1448
  // on: that step is already pending, so it is queued again with nothing
1432
1449
  // else changed. Whether the credits are there now is the reservation's
1433
1450
  // to say, at the door and again at the step.
1451
+ // A job waiting for a person's answer (AGL-3978) takes it only once every
1452
+ // field reads (`aiJobInputProblems`, which the door asks first): the
1453
+ // answer is written to the plan's item and the job returns to its plan
1454
+ // card, where Confirm builds it as any plan.
1455
+ if (current.status === 'needs_input' && ((_current_input = current.input) == null ? void 0 : (_current_input_fields = _current_input.fields) == null ? void 0 : _current_input_fields.length)) {
1456
+ const values = options.input;
1457
+ if (!values || !current.plan || Object.keys(aiJobInputProblems(current.input, values)).length) return null;
1458
+ return {
1459
+ status: 'needs_review',
1460
+ plan: aiPlanWithInput(current.plan, current.input, values),
1461
+ input: null,
1462
+ error: null,
1463
+ lease: null,
1464
+ updatedAt: now
1465
+ };
1466
+ }
1434
1467
  if (current.status === 'needs_input') {
1435
1468
  return {
1436
1469
  status: 'queued',
@@ -2004,8 +2037,12 @@ async function transition(firestore, orgId, jobId, apply) {
2004
2037
  plan: outcome.plan
2005
2038
  } : {}, review ? {
2006
2039
  review
2040
+ } : {}, review && outcome.input ? {
2041
+ input: outcome.input
2007
2042
  } : {}, outcome.sitePublish ? {
2008
2043
  sitePublish: outcome.sitePublish
2044
+ } : {}, job.kind === 'import' && outcome.siteImport ? {
2045
+ siteImport: outcome.siteImport
2009
2046
  } : {}, aiJobSettlesByItem(job.kind) && outcome.items ? {
2010
2047
  items: outcome.items
2011
2048
  } : {}, itemRecord ? {
@@ -2072,6 +2109,22 @@ async function transition(firestore, orgId, jobId, apply) {
2072
2109
  job: resumed.job
2073
2110
  };
2074
2111
  }
2112
+ // A plan waiting for an answer only the person can give (AGL-3978): kept,
2113
+ // charged as any plan is, and asked of them; nothing about it failed.
2114
+ if (review && outcome.input && recorded.job.status === 'needs_input') {
2115
+ await logAiJobNeedsInput(orgId, {
2116
+ uid: null
2117
+ }, {
2118
+ jobId,
2119
+ kind: job.kind,
2120
+ reason: 'input'
2121
+ });
2122
+ if (recorded.parked) await announceAiJobTransition(recorded.job, 'needs-review');
2123
+ return {
2124
+ outcome: 'needs_input',
2125
+ job: recorded.job
2126
+ };
2127
+ }
2075
2128
  if (review && recorded.job.status === 'needs_review') {
2076
2129
  var _reservation_free6;
2077
2130
  // Nobody parked the job but its own step, so the row names no actor, as
@@ -2199,6 +2252,7 @@ async function transition(firestore, orgId, jobId, apply) {
2199
2252
  const attempt = async (candidate, left, first)=>{
2200
2253
  const { orgId, jobId } = candidate;
2201
2254
  try {
2255
+ var _current_input_fields, _current_input;
2202
2256
  const current = await getAiJob(options.firestore, orgId, jobId);
2203
2257
  // A step that needs more time than is left is not started (AGL-2907): a
2204
2258
  // provider call the abort cuts off is billed upstream and metered
@@ -2209,6 +2263,19 @@ async function transition(firestore, orgId, jobId, apply) {
2209
2263
  if (first) result.remaining += 1;
2210
2264
  return;
2211
2265
  }
2266
+ // A job waiting for a person's answer (AGL-3978) is theirs to resume:
2267
+ // it rests again, at the back of the parked queue, so it never holds a
2268
+ // place a meter park could use.
2269
+ if ((current == null ? void 0 : current.status) === 'needs_input' && ((_current_input = current.input) == null ? void 0 : (_current_input_fields = _current_input.fields) == null ? void 0 : _current_input_fields.length)) {
2270
+ await transition(options.firestore, orgId, jobId, (job)=>{
2271
+ var _job_input_fields, _job_input;
2272
+ return job.status === 'needs_input' && ((_job_input = job.input) == null ? void 0 : (_job_input_fields = _job_input.fields) == null ? void 0 : _job_input_fields.length) ? {
2273
+ updatedAt: new Date(now())
2274
+ } : null;
2275
+ });
2276
+ if (first) result.skipped += 1;
2277
+ return;
2278
+ }
2212
2279
  if ((current == null ? void 0 : current.status) === 'needs_input') {
2213
2280
  await transition(options.firestore, orgId, jobId, (job)=>job.status === 'needs_input' ? {
2214
2281
  status: 'queued',