@aglyn/plugins-ai 1.0.0-beta.288 → 1.0.0-beta.290

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 (92) hide show
  1. package/package.json +17 -17
  2. package/src/lib/activity/ai-activity-actions.d.ts +3 -2
  3. package/src/lib/activity/ai-activity-actions.js +3 -0
  4. package/src/lib/activity/ai-activity-actions.js.map +1 -1
  5. package/src/lib/components/ai-job-requests.d.ts +2 -0
  6. package/src/lib/components/ai-job-requests.js +2 -0
  7. package/src/lib/components/ai-job-requests.js.map +1 -1
  8. package/src/lib/components/ai-site-build-page.component.js +4 -0
  9. package/src/lib/components/ai-site-build-page.component.js.map +1 -1
  10. package/src/lib/components/ai-site-import-job.component.d.ts +6 -1
  11. package/src/lib/components/ai-site-import-job.component.js +124 -17
  12. package/src/lib/components/ai-site-import-job.component.js.map +1 -1
  13. package/src/lib/components/ai-site-import-start.component.d.ts +6 -0
  14. package/src/lib/components/ai-site-import-start.component.js +18 -4
  15. package/src/lib/components/ai-site-import-start.component.js.map +1 -1
  16. package/src/lib/components/ai-site-start-card.component.js +2 -1
  17. package/src/lib/components/ai-site-start-card.component.js.map +1 -1
  18. package/src/lib/jobs/ai-image-reads.d.ts +20 -2
  19. package/src/lib/jobs/ai-image-reads.js +47 -0
  20. package/src/lib/jobs/ai-image-reads.js.map +1 -1
  21. package/src/lib/jobs/ai-job-import-step.d.ts +53 -3
  22. package/src/lib/jobs/ai-job-import-step.js +386 -64
  23. package/src/lib/jobs/ai-job-import-step.js.map +1 -1
  24. package/src/lib/jobs/ai-job-layout-language.d.ts +33 -0
  25. package/src/lib/jobs/ai-job-layout-language.js +75 -1
  26. package/src/lib/jobs/ai-job-layout-language.js.map +1 -1
  27. package/src/lib/jobs/ai-job-layout-step.js +8 -3
  28. package/src/lib/jobs/ai-job-layout-step.js.map +1 -1
  29. package/src/lib/jobs/ai-job-page-language.d.ts +29 -0
  30. package/src/lib/jobs/ai-job-page-language.js +178 -2
  31. package/src/lib/jobs/ai-job-page-language.js.map +1 -1
  32. package/src/lib/jobs/ai-job-page-step.js +3 -0
  33. package/src/lib/jobs/ai-job-page-step.js.map +1 -1
  34. package/src/lib/jobs/ai-site-import-document.d.ts +117 -0
  35. package/src/lib/jobs/ai-site-import-document.js +710 -0
  36. package/src/lib/jobs/ai-site-import-document.js.map +1 -0
  37. package/src/lib/jobs/ai-site-import-look.d.ts +112 -0
  38. package/src/lib/jobs/ai-site-import-look.js +402 -0
  39. package/src/lib/jobs/ai-site-import-look.js.map +1 -0
  40. package/src/lib/jobs/ai-site-import-publish.d.ts +41 -0
  41. package/src/lib/jobs/ai-site-import-publish.js +92 -0
  42. package/src/lib/jobs/ai-site-import-publish.js.map +1 -0
  43. package/src/lib/jobs/ai-theme-brand-inputs.d.ts +27 -2
  44. package/src/lib/jobs/ai-theme-brand-inputs.js +37 -8
  45. package/src/lib/jobs/ai-theme-brand-inputs.js.map +1 -1
  46. package/src/lib/layout-language/ai-layout-frame.d.ts +17 -0
  47. package/src/lib/layout-language/ai-layout-frame.js +73 -2
  48. package/src/lib/layout-language/ai-layout-frame.js.map +1 -1
  49. package/src/lib/layout-language/ai-layout-language.d.ts +43 -0
  50. package/src/lib/layout-language/ai-layout-language.js +199 -0
  51. package/src/lib/layout-language/ai-layout-language.js.map +1 -1
  52. package/src/lib/model/ai-credit-estimate.d.ts +15 -0
  53. package/src/lib/model/ai-credit-estimate.js +14 -1
  54. package/src/lib/model/ai-credit-estimate.js.map +1 -1
  55. package/src/lib/model/ai-jobs.types.d.ts +13 -1
  56. package/src/lib/model/ai-jobs.types.js.map +1 -1
  57. package/src/lib/model/ai-site-import-view.d.ts +47 -3
  58. package/src/lib/model/ai-site-import-view.js +122 -20
  59. package/src/lib/model/ai-site-import-view.js.map +1 -1
  60. package/src/lib/model/ai-site-import.d.ts +232 -7
  61. package/src/lib/model/ai-site-import.js +365 -35
  62. package/src/lib/model/ai-site-import.js.map +1 -1
  63. package/src/lib/runtime/ai-doctrine-validators.d.ts +18 -0
  64. package/src/lib/runtime/ai-doctrine-validators.js +16 -5
  65. package/src/lib/runtime/ai-doctrine-validators.js.map +1 -1
  66. package/src/lib/runtime/ai-palette.generated.js +31 -0
  67. package/src/lib/runtime/ai-palette.generated.js.map +1 -1
  68. package/src/lib/server/ai-image-reads-route.js +24 -1
  69. package/src/lib/server/ai-image-reads-route.js.map +1 -1
  70. package/src/lib/server/ai-jobs-resume.js +7 -1
  71. package/src/lib/server/ai-jobs-resume.js.map +1 -1
  72. package/src/lib/site-import/fixtures/aglyn-com-recordings.d.ts +57 -0
  73. package/src/lib/site-import/fixtures/aglyn-com-recordings.js +172 -0
  74. package/src/lib/site-import/fixtures/aglyn-com-recordings.js.map +1 -0
  75. package/src/lib/site-import/site-import-crawl.d.ts +32 -7
  76. package/src/lib/site-import/site-import-crawl.js +133 -44
  77. package/src/lib/site-import/site-import-crawl.js.map +1 -1
  78. package/src/lib/site-import/site-import-edge-server.d.ts +31 -0
  79. package/src/lib/site-import/site-import-edge-server.js +31 -0
  80. package/src/lib/site-import/site-import-edge-server.js.map +1 -0
  81. package/src/lib/site-import/site-import-edge.d.ts +44 -0
  82. package/src/lib/site-import/site-import-edge.js +108 -0
  83. package/src/lib/site-import/site-import-edge.js.map +1 -0
  84. package/src/lib/site-import/site-import-html.d.ts +73 -3
  85. package/src/lib/site-import/site-import-html.js +332 -45
  86. package/src/lib/site-import/site-import-html.js.map +1 -1
  87. package/src/lib/site-import/site-import-images.d.ts +22 -0
  88. package/src/lib/site-import/site-import-images.js +78 -2
  89. package/src/lib/site-import/site-import-images.js.map +1 -1
  90. package/src/lib/site-import/site-import-page.d.ts +44 -2
  91. package/src/lib/site-import/site-import-page.js +116 -16
  92. package/src/lib/site-import/site-import-page.js.map +1 -1
@@ -28,20 +28,28 @@ import { _ as _extends } from "@swc/helpers/_/_extends";
28
28
  * current, the day's limit has room, the plan still has room; the
29
29
  * wave's pages are read again, fresh, and a page that became a sign-in
30
30
  * page, went away or is now off limits to AglynBot is left out.
31
- * 3. THE HEADER AND FOOTER, in the first wave: the layout step's own pass,
32
- * linking the wave's pages.
33
- * 4. EACH PAGE: its photos into the media library (no model, deduped by
34
- * source key), then the page step's own passes in the layout language,
35
- * told the page's text FENCED as untrusted data.
36
- * 5. CLOSE THE WAVE: the job waits again, with the wave's pages as drafts
37
- * to review, until the person starts the next one. The last wave ends
38
- * the job.
31
+ * 3. THE LOOK, in the first wave (no model, AGL-4084): the theme drawn
32
+ * from the owner's own home page, its logo into the library, the site's
33
+ * listing from the home page's own words (`ai-site-import-look.ts`).
34
+ * 4. THE HEADER AND FOOTER, in the first wave: the layout step's own pass,
35
+ * with the source's brand as its header draws it, its own header and
36
+ * footer words as the footer's facts, and the site's menu order.
37
+ * 5. EACH PAGE: its photos into the media library (no model, deduped by
38
+ * source key), then the page step's own passes, NEVER REWRITTEN
39
+ * (AGL-4084, `ai-site-import-document.ts`): a collection's page or a
40
+ * long page is copied as it is, every word in order, with no model; a
41
+ * main page is arranged, the model placing the source's numbered lines
42
+ * and code writing every word as the source has it.
43
+ * 6. CLOSE THE WAVE: its pages go live in the site's preview (AGL-4084,
44
+ * `ai-site-import-publish.ts`), where only its team sees them, and the
45
+ * job waits again until the person starts the next wave, or, where the
46
+ * person chose "Start every remaining wave", starts it. The last wave
47
+ * ends the job.
39
48
  *
40
49
  * Every page is an item of the job's ledger, so a page that fails on our
41
50
  * side gives back its own spend (the machine's `refundBuildCredits`) and the
42
- * wave goes on. Nothing here publishes: every page is a draft, and the site
43
- * stays unpublished until a member publishes it, which they can only reach
44
- * once the import, behind its ownership proof, has written something.
51
+ * wave goes on. Nothing is ever public by this job: a wave lands only in a
52
+ * site that is in preview, and a site that is not keeps its pages as drafts.
45
53
  *=========================================*/ import { resolveEffectivePlan } from "@aglyn/aglyn/app-utils/plan-entitlements";
46
54
  import { createResourceUid } from "@aglyn/aglyn/app-utils/create-resource-uid";
47
55
  import { pluginMediaIngest } from "@aglyn/aglyn/plugin-manager/plugin-media-ingest";
@@ -49,17 +57,22 @@ import { listDomainOwnershipClaims, normalizeOwnershipDomain } from "@aglyn/tena
49
57
  import { getOrgForUser, memberHasOrgPermission } from "@aglyn/tenant-data-admin/server/organizations";
50
58
  import { consumeRateLimit } from "@aglyn/tenant-data-admin/server/rate-limit-store";
51
59
  import { isServerReleaseFlagOnForOrg } from "@aglyn/tenant-data-admin/server/release-flags";
52
- import { AI_SITE_IMPORT_DOMAIN_INPUT, AI_SITE_IMPORT_FRAME_SLOT, AI_SITE_IMPORT_LEFT_OUT_COPY, AI_SITE_IMPORT_MAX_PAGES, AI_SITE_IMPORT_MIN_WORDS, AI_SITE_IMPORT_WAVE_PAGES, aiSiteImportInventory, aiSiteImportItemOpen, aiSiteImportLedger, aiSiteImportNextWork, aiSiteImportPageSettled, aiSiteImportPagesRead, aiSiteImportPhotosIn, aiSiteImportWaveClosed, aiSiteImportWaveMessage, aiSiteImportWaveStarted } from "../model/ai-site-import.js";
60
+ import { AI_SITE_IMPORT_DOMAIN_INPUT, AI_SITE_IMPORT_FRAME_SLOT, AI_SITE_IMPORT_LABEL_MAX_CHARS, AI_SITE_IMPORT_LEFT_OUT_COPY, AI_SITE_IMPORT_MAX_PAGES, AI_SITE_IMPORT_MIN_WORDS, AI_SITE_IMPORT_WAVE_PAGES, aiSiteImportInventory, aiSiteImportItemOpen, aiSiteImportLedger, aiSiteImportNextWork, aiSiteImportPageBuild, aiSiteImportPageSettled, aiSiteImportPagesRead, aiSiteImportPhotosIn, aiSiteImportReadStops, aiSiteImportReadVerdict, aiSiteImportReadVerdictMessage, aiSiteImportReadVerdictReason, aiSiteImportWaveClosed, aiSiteImportWaveMessage, aiSiteImportWaveStarted } from "../model/ai-site-import.js";
53
61
  import { aiModelForStep } from "../providers/routing.js";
54
62
  import { SITE_IMPORT_RELEASE_FLAG } from "../site-import/site-import-flag.js";
55
63
  import { crawlSiteForImport } from "../site-import/site-import-crawl.js";
56
64
  import { bringInSiteImportPhotos } from "../site-import/site-import-images.js";
57
- import { siteImportLeftOutReason, siteImportListedPage, siteImportPageRead, siteImportPageWords } from "../site-import/site-import-page.js";
65
+ import { siteImportHeaderBrand, siteImportLabel, siteImportLeftOutReason, siteImportListedPage, siteImportPageRead, siteImportPageWords, siteImportSiteFacts, siteImportSiteName } from "../site-import/site-import-page.js";
66
+ import { aiSiteKindFor } from "../model/ai-site-kinds.js";
67
+ import { AI_LAYOUT_SITE_BRAND_INPUT, AI_LAYOUT_SITE_FACTS_INPUT } from "./ai-job-layout-language.js";
68
+ import { AI_LAYOUT_IMPORTED_SECTIONS_INPUT, aiSiteImportDocLines } from "./ai-site-import-document.js";
69
+ import { aiRunSiteImportLook } from "./ai-site-import-look.js";
70
+ import { aiPublishImportedWave } from "./ai-site-import-publish.js";
58
71
  import { fileSiteImportReview } from "../site-import/site-import-review.js";
59
72
  import { aiUnitErrorRetryable, aiUnitFailure, aiUnitSpend } from "./ai-build-unit-outcome.js";
60
73
  import { registerAiJobAdmission } from "./ai-job-admission.js";
61
74
  import { AI_JOB_STEP_OVERHEAD_MS } from "./ai-job-budget.js";
62
- import { readAiScreenRoom } from "./ai-job-drafts.js";
75
+ import { readAiDraftNodes, readAiScreenRoom } from "./ai-job-drafts.js";
63
76
  import { aiUnspentOutcome } from "./ai-job-generation.js";
64
77
  import { AI_LAYOUT_PAGE_PHOTOS_INPUT } from "./ai-layout-owner-photos.js";
65
78
  import { AI_LAYOUT_SITE_PAGES_INPUT, AI_LAYOUT_SITE_PAGES_MAX } from "./ai-job-layout-site-pages.js";
@@ -163,9 +176,43 @@ const delivered = (items, slot)=>items.some((row)=>row.slot === slot && (row.sta
163
176
  ...pages.filter((page)=>page.slug !== '/')
164
177
  ].slice(0, AI_LAYOUT_SITE_PAGES_MAX);
165
178
  }
166
- /** The header and footer's job: a layout of the site's name, linking the wave's pages, in the layout language. */ export function aiSiteImportFrameJob(job, state, wave, items) {
167
- var _ref;
168
- var _state_frame;
179
+ /**
180
+ * How a page is built (AGL-4084): a collection's page, or a long page, is
181
+ * copied as it is; a main page is arranged. The home page is always
182
+ * arranged, however long: it is the site's front door, never a document.
183
+ */ export function aiSiteImportBuildOf(page) {
184
+ return page.group === 'main' && page.slug === '/' ? 'arranged' : aiSiteImportPageBuild(page);
185
+ }
186
+ /**
187
+ * The name the header and footer carry (AGL-4084): the site's own name where
188
+ * it is the name the person gave Create site but for its case or its
189
+ * punctuation, else the person's.
190
+ */ export function aiSiteImportBrandName(given, own) {
191
+ const key = (text)=>text.toLowerCase().replace(RegExp("[^\\u0041-\\u005A\\u0061-\\u007A\\u00AA\\u00B5\\u00BA\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376-\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0560-\\u0588\\u05D0-\\u05EA\\u05EF-\\u05F2\\u0620-\\u064A\\u066E-\\u066F\\u0671-\\u06D3\\u06D5\\u06E5-\\u06E6\\u06EE-\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4-\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u0860-\\u086A\\u0870-\\u0887\\u0889-\\u088F\\u08A0-\\u08C9\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F-\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC-\\u09DD\\u09DF-\\u09E1\\u09F0-\\u09F1\\u09FC\\u0A05-\\u0A0A\\u0A0F-\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32-\\u0A33\\u0A35-\\u0A36\\u0A38-\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2-\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0-\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F-\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32-\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C-\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99-\\u0B9A\\u0B9C\\u0B9E-\\u0B9F\\u0BA3-\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C5C-\\u0C5D\\u0C60-\\u0C61\\u0C80\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDC-\\u0CDE\\u0CE0-\\u0CE1\\u0CF1-\\u0CF2\\u0D04-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D54-\\u0D56\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32-\\u0E33\\u0E40-\\u0E46\\u0E81-\\u0E82\\u0E84\\u0E86-\\u0E8A\\u0E8C-\\u0EA3\\u0EA5\\u0EA7-\\u0EB0\\u0EB2-\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065-\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16F1-\\u16F8\\u1700-\\u1711\\u171F-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1878\\u1880-\\u1884\\u1887-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4C\\u1B83-\\u1BA0\\u1BAE-\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1C80-\\u1C8A\\u1C90-\\u1CBA\\u1CBD-\\u1CBF\\u1CE9-\\u1CEC\\u1CEE-\\u1CF3\\u1CF5-\\u1CF6\\u1CFA\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183-\\u2184\\u2C00-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2-\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005-\\u3006\\u3031-\\u3035\\u303B-\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312F\\u3131-\\u318E\\u31A0-\\u31BF\\u31F0-\\u31FF\\u3400-\\u4DBF\\u4E00-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A-\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6E5\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7DC\\uA7F1-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD-\\uA8FE\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5-\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB69\\uAB70-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40-\\uFB41\\uFB43-\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC\\u{10000}-\\u{1000B}\\u{1000D}-\\u{10026}\\u{10028}-\\u{1003A}\\u{1003C}-\\u{1003D}\\u{1003F}-\\u{1004D}\\u{10050}-\\u{1005D}\\u{10080}-\\u{100FA}\\u{10280}-\\u{1029C}\\u{102A0}-\\u{102D0}\\u{10300}-\\u{1031F}\\u{1032D}-\\u{10340}\\u{10342}-\\u{10349}\\u{10350}-\\u{10375}\\u{10380}-\\u{1039D}\\u{103A0}-\\u{103C3}\\u{103C8}-\\u{103CF}\\u{10400}-\\u{1049D}\\u{104B0}-\\u{104D3}\\u{104D8}-\\u{104FB}\\u{10500}-\\u{10527}\\u{10530}-\\u{10563}\\u{10570}-\\u{1057A}\\u{1057C}-\\u{1058A}\\u{1058C}-\\u{10592}\\u{10594}-\\u{10595}\\u{10597}-\\u{105A1}\\u{105A3}-\\u{105B1}\\u{105B3}-\\u{105B9}\\u{105BB}-\\u{105BC}\\u{105C0}-\\u{105F3}\\u{10600}-\\u{10736}\\u{10740}-\\u{10755}\\u{10760}-\\u{10767}\\u{10780}-\\u{10785}\\u{10787}-\\u{107B0}\\u{107B2}-\\u{107BA}\\u{10800}-\\u{10805}\\u{10808}\\u{1080A}-\\u{10835}\\u{10837}-\\u{10838}\\u{1083C}\\u{1083F}-\\u{10855}\\u{10860}-\\u{10876}\\u{10880}-\\u{1089E}\\u{108E0}-\\u{108F2}\\u{108F4}-\\u{108F5}\\u{10900}-\\u{10915}\\u{10920}-\\u{10939}\\u{10940}-\\u{10959}\\u{10980}-\\u{109B7}\\u{109BE}-\\u{109BF}\\u{10A00}\\u{10A10}-\\u{10A13}\\u{10A15}-\\u{10A17}\\u{10A19}-\\u{10A35}\\u{10A60}-\\u{10A7C}\\u{10A80}-\\u{10A9C}\\u{10AC0}-\\u{10AC7}\\u{10AC9}-\\u{10AE4}\\u{10B00}-\\u{10B35}\\u{10B40}-\\u{10B55}\\u{10B60}-\\u{10B72}\\u{10B80}-\\u{10B91}\\u{10C00}-\\u{10C48}\\u{10C80}-\\u{10CB2}\\u{10CC0}-\\u{10CF2}\\u{10D00}-\\u{10D23}\\u{10D4A}-\\u{10D65}\\u{10D6F}-\\u{10D85}\\u{10E80}-\\u{10EA9}\\u{10EB0}-\\u{10EB1}\\u{10EC2}-\\u{10EC7}\\u{10F00}-\\u{10F1C}\\u{10F27}\\u{10F30}-\\u{10F45}\\u{10F70}-\\u{10F81}\\u{10FB0}-\\u{10FC4}\\u{10FE0}-\\u{10FF6}\\u{11003}-\\u{11037}\\u{11071}-\\u{11072}\\u{11075}\\u{11083}-\\u{110AF}\\u{110D0}-\\u{110E8}\\u{11103}-\\u{11126}\\u{11144}\\u{11147}\\u{11150}-\\u{11172}\\u{11176}\\u{11183}-\\u{111B2}\\u{111C1}-\\u{111C4}\\u{111DA}\\u{111DC}\\u{11200}-\\u{11211}\\u{11213}-\\u{1122B}\\u{1123F}-\\u{11240}\\u{11280}-\\u{11286}\\u{11288}\\u{1128A}-\\u{1128D}\\u{1128F}-\\u{1129D}\\u{1129F}-\\u{112A8}\\u{112B0}-\\u{112DE}\\u{11305}-\\u{1130C}\\u{1130F}-\\u{11310}\\u{11313}-\\u{11328}\\u{1132A}-\\u{11330}\\u{11332}-\\u{11333}\\u{11335}-\\u{11339}\\u{1133D}\\u{11350}\\u{1135D}-\\u{11361}\\u{11380}-\\u{11389}\\u{1138B}\\u{1138E}\\u{11390}-\\u{113B5}\\u{113B7}\\u{113D1}\\u{113D3}\\u{11400}-\\u{11434}\\u{11447}-\\u{1144A}\\u{1145F}-\\u{11461}\\u{11480}-\\u{114AF}\\u{114C4}-\\u{114C5}\\u{114C7}\\u{11580}-\\u{115AE}\\u{115D8}-\\u{115DB}\\u{11600}-\\u{1162F}\\u{11644}\\u{11680}-\\u{116AA}\\u{116B8}\\u{11700}-\\u{1171A}\\u{11740}-\\u{11746}\\u{11800}-\\u{1182B}\\u{118A0}-\\u{118DF}\\u{118FF}-\\u{11906}\\u{11909}\\u{1190C}-\\u{11913}\\u{11915}-\\u{11916}\\u{11918}-\\u{1192F}\\u{1193F}\\u{11941}\\u{119A0}-\\u{119A7}\\u{119AA}-\\u{119D0}\\u{119E1}\\u{119E3}\\u{11A00}\\u{11A0B}-\\u{11A32}\\u{11A3A}\\u{11A50}\\u{11A5C}-\\u{11A89}\\u{11A9D}\\u{11AB0}-\\u{11AF8}\\u{11BC0}-\\u{11BE0}\\u{11C00}-\\u{11C08}\\u{11C0A}-\\u{11C2E}\\u{11C40}\\u{11C72}-\\u{11C8F}\\u{11D00}-\\u{11D06}\\u{11D08}-\\u{11D09}\\u{11D0B}-\\u{11D30}\\u{11D46}\\u{11D60}-\\u{11D65}\\u{11D67}-\\u{11D68}\\u{11D6A}-\\u{11D89}\\u{11D98}\\u{11DB0}-\\u{11DDB}\\u{11EE0}-\\u{11EF2}\\u{11F02}\\u{11F04}-\\u{11F10}\\u{11F12}-\\u{11F33}\\u{11FB0}\\u{12000}-\\u{12399}\\u{12480}-\\u{12543}\\u{12F90}-\\u{12FF0}\\u{13000}-\\u{1342F}\\u{13441}-\\u{13446}\\u{13460}-\\u{143FA}\\u{14400}-\\u{14646}\\u{16100}-\\u{1611D}\\u{16800}-\\u{16A38}\\u{16A40}-\\u{16A5E}\\u{16A70}-\\u{16ABE}\\u{16AD0}-\\u{16AED}\\u{16B00}-\\u{16B2F}\\u{16B40}-\\u{16B43}\\u{16B63}-\\u{16B77}\\u{16B7D}-\\u{16B8F}\\u{16D40}-\\u{16D6C}\\u{16E40}-\\u{16E7F}\\u{16EA0}-\\u{16EB8}\\u{16EBB}-\\u{16ED3}\\u{16F00}-\\u{16F4A}\\u{16F50}\\u{16F93}-\\u{16F9F}\\u{16FE0}-\\u{16FE1}\\u{16FE3}\\u{16FF2}-\\u{16FF3}\\u{17000}-\\u{18CD5}\\u{18CFF}-\\u{18D1E}\\u{18D80}-\\u{18DF2}\\u{1AFF0}-\\u{1AFF3}\\u{1AFF5}-\\u{1AFFB}\\u{1AFFD}-\\u{1AFFE}\\u{1B000}-\\u{1B122}\\u{1B132}\\u{1B150}-\\u{1B152}\\u{1B155}\\u{1B164}-\\u{1B167}\\u{1B170}-\\u{1B2FB}\\u{1BC00}-\\u{1BC6A}\\u{1BC70}-\\u{1BC7C}\\u{1BC80}-\\u{1BC88}\\u{1BC90}-\\u{1BC99}\\u{1D400}-\\u{1D454}\\u{1D456}-\\u{1D49C}\\u{1D49E}-\\u{1D49F}\\u{1D4A2}\\u{1D4A5}-\\u{1D4A6}\\u{1D4A9}-\\u{1D4AC}\\u{1D4AE}-\\u{1D4B9}\\u{1D4BB}\\u{1D4BD}-\\u{1D4C3}\\u{1D4C5}-\\u{1D505}\\u{1D507}-\\u{1D50A}\\u{1D50D}-\\u{1D514}\\u{1D516}-\\u{1D51C}\\u{1D51E}-\\u{1D539}\\u{1D53B}-\\u{1D53E}\\u{1D540}-\\u{1D544}\\u{1D546}\\u{1D54A}-\\u{1D550}\\u{1D552}-\\u{1D6A5}\\u{1D6A8}-\\u{1D6C0}\\u{1D6C2}-\\u{1D6DA}\\u{1D6DC}-\\u{1D6FA}\\u{1D6FC}-\\u{1D714}\\u{1D716}-\\u{1D734}\\u{1D736}-\\u{1D74E}\\u{1D750}-\\u{1D76E}\\u{1D770}-\\u{1D788}\\u{1D78A}-\\u{1D7A8}\\u{1D7AA}-\\u{1D7C2}\\u{1D7C4}-\\u{1D7CB}\\u{1DF00}-\\u{1DF1E}\\u{1DF25}-\\u{1DF2A}\\u{1E030}-\\u{1E06D}\\u{1E100}-\\u{1E12C}\\u{1E137}-\\u{1E13D}\\u{1E14E}\\u{1E290}-\\u{1E2AD}\\u{1E2C0}-\\u{1E2EB}\\u{1E4D0}-\\u{1E4EB}\\u{1E5D0}-\\u{1E5ED}\\u{1E5F0}\\u{1E6C0}-\\u{1E6DE}\\u{1E6E0}-\\u{1E6E2}\\u{1E6E4}-\\u{1E6E5}\\u{1E6E7}-\\u{1E6ED}\\u{1E6F0}-\\u{1E6F4}\\u{1E6FE}-\\u{1E6FF}\\u{1E7E0}-\\u{1E7E6}\\u{1E7E8}-\\u{1E7EB}\\u{1E7ED}-\\u{1E7EE}\\u{1E7F0}-\\u{1E7FE}\\u{1E800}-\\u{1E8C4}\\u{1E900}-\\u{1E943}\\u{1E94B}\\u{1EE00}-\\u{1EE03}\\u{1EE05}-\\u{1EE1F}\\u{1EE21}-\\u{1EE22}\\u{1EE24}\\u{1EE27}\\u{1EE29}-\\u{1EE32}\\u{1EE34}-\\u{1EE37}\\u{1EE39}\\u{1EE3B}\\u{1EE42}\\u{1EE47}\\u{1EE49}\\u{1EE4B}\\u{1EE4D}-\\u{1EE4F}\\u{1EE51}-\\u{1EE52}\\u{1EE54}\\u{1EE57}\\u{1EE59}\\u{1EE5B}\\u{1EE5D}\\u{1EE5F}\\u{1EE61}-\\u{1EE62}\\u{1EE64}\\u{1EE67}-\\u{1EE6A}\\u{1EE6C}-\\u{1EE72}\\u{1EE74}-\\u{1EE77}\\u{1EE79}-\\u{1EE7C}\\u{1EE7E}\\u{1EE80}-\\u{1EE89}\\u{1EE8B}-\\u{1EE9B}\\u{1EEA1}-\\u{1EEA3}\\u{1EEA5}-\\u{1EEA9}\\u{1EEAB}-\\u{1EEBB}\\u{20000}-\\u{2A6DF}\\u{2A700}-\\u{2B81D}\\u{2B820}-\\u{2CEAD}\\u{2CEB0}-\\u{2EBE0}\\u{2EBF0}-\\u{2EE5D}\\u{2F800}-\\u{2FA1D}\\u{30000}-\\u{3134A}\\u{31350}-\\u{33479}\\u0030-\\u0039\\u00B2-\\u00B3\\u00B9\\u00BC-\\u00BE\\u0660-\\u0669\\u06F0-\\u06F9\\u07C0-\\u07C9\\u0966-\\u096F\\u09E6-\\u09EF\\u09F4-\\u09F9\\u0A66-\\u0A6F\\u0AE6-\\u0AEF\\u0B66-\\u0B6F\\u0B72-\\u0B77\\u0BE6-\\u0BF2\\u0C66-\\u0C6F\\u0C78-\\u0C7E\\u0CE6-\\u0CEF\\u0D58-\\u0D5E\\u0D66-\\u0D78\\u0DE6-\\u0DEF\\u0E50-\\u0E59\\u0ED0-\\u0ED9\\u0F20-\\u0F33\\u1040-\\u1049\\u1090-\\u1099\\u1369-\\u137C\\u16EE-\\u16F0\\u17E0-\\u17E9\\u17F0-\\u17F9\\u1810-\\u1819\\u1946-\\u194F\\u19D0-\\u19DA\\u1A80-\\u1A89\\u1A90-\\u1A99\\u1B50-\\u1B59\\u1BB0-\\u1BB9\\u1C40-\\u1C49\\u1C50-\\u1C59\\u2070\\u2074-\\u2079\\u2080-\\u2089\\u2150-\\u2182\\u2185-\\u2189\\u2460-\\u249B\\u24EA-\\u24FF\\u2776-\\u2793\\u2CFD\\u3007\\u3021-\\u3029\\u3038-\\u303A\\u3192-\\u3195\\u3220-\\u3229\\u3248-\\u324F\\u3251-\\u325F\\u3280-\\u3289\\u32B1-\\u32BF\\uA620-\\uA629\\uA6E6-\\uA6EF\\uA830-\\uA835\\uA8D0-\\uA8D9\\uA900-\\uA909\\uA9D0-\\uA9D9\\uA9F0-\\uA9F9\\uAA50-\\uAA59\\uABF0-\\uABF9\\uFF10-\\uFF19\\u{10107}-\\u{10133}\\u{10140}-\\u{10178}\\u{1018A}-\\u{1018B}\\u{102E1}-\\u{102FB}\\u{10320}-\\u{10323}\\u{10341}\\u{1034A}\\u{103D1}-\\u{103D5}\\u{104A0}-\\u{104A9}\\u{10858}-\\u{1085F}\\u{10879}-\\u{1087F}\\u{108A7}-\\u{108AF}\\u{108FB}-\\u{108FF}\\u{10916}-\\u{1091B}\\u{109BC}-\\u{109BD}\\u{109C0}-\\u{109CF}\\u{109D2}-\\u{109FF}\\u{10A40}-\\u{10A48}\\u{10A7D}-\\u{10A7E}\\u{10A9D}-\\u{10A9F}\\u{10AEB}-\\u{10AEF}\\u{10B58}-\\u{10B5F}\\u{10B78}-\\u{10B7F}\\u{10BA9}-\\u{10BAF}\\u{10CFA}-\\u{10CFF}\\u{10D30}-\\u{10D39}\\u{10D40}-\\u{10D49}\\u{10E60}-\\u{10E7E}\\u{10F1D}-\\u{10F26}\\u{10F51}-\\u{10F54}\\u{10FC5}-\\u{10FCB}\\u{11052}-\\u{1106F}\\u{110F0}-\\u{110F9}\\u{11136}-\\u{1113F}\\u{111D0}-\\u{111D9}\\u{111E1}-\\u{111F4}\\u{112F0}-\\u{112F9}\\u{11450}-\\u{11459}\\u{114D0}-\\u{114D9}\\u{11650}-\\u{11659}\\u{116C0}-\\u{116C9}\\u{116D0}-\\u{116E3}\\u{11730}-\\u{1173B}\\u{118E0}-\\u{118F2}\\u{11950}-\\u{11959}\\u{11BF0}-\\u{11BF9}\\u{11C50}-\\u{11C6C}\\u{11D50}-\\u{11D59}\\u{11DA0}-\\u{11DA9}\\u{11DE0}-\\u{11DE9}\\u{11F50}-\\u{11F59}\\u{11FC0}-\\u{11FD4}\\u{12400}-\\u{1246E}\\u{16130}-\\u{16139}\\u{16A60}-\\u{16A69}\\u{16AC0}-\\u{16AC9}\\u{16B50}-\\u{16B59}\\u{16B5B}-\\u{16B61}\\u{16D70}-\\u{16D79}\\u{16E80}-\\u{16E96}\\u{16FF4}-\\u{16FF6}\\u{1CCF0}-\\u{1CCF9}\\u{1D2C0}-\\u{1D2D3}\\u{1D2E0}-\\u{1D2F3}\\u{1D360}-\\u{1D378}\\u{1D7CE}-\\u{1D7FF}\\u{1E140}-\\u{1E149}\\u{1E2F0}-\\u{1E2F9}\\u{1E4F0}-\\u{1E4F9}\\u{1E5F1}-\\u{1E5FA}\\u{1E8C7}-\\u{1E8CF}\\u{1E950}-\\u{1E959}\\u{1EC71}-\\u{1ECAB}\\u{1ECAD}-\\u{1ECAF}\\u{1ECB1}-\\u{1ECB4}\\u{1ED01}-\\u{1ED2D}\\u{1ED2F}-\\u{1ED3D}\\u{1F100}-\\u{1F10C}\\u{1FBF0}-\\u{1FBF9}]+", "gu"), '');
192
+ return own && key(own) && key(own) === key(given) ? own : given;
193
+ }
194
+ /** The design inputs every unit of an import is drawn with: the kind of site its own words say, and its look (AGL-4084). */ function aiSiteImportDesignInputs(state) {
195
+ var _look_style, _look_style1, _look_style2;
196
+ const home = state.home;
197
+ const kind = home ? aiSiteKindFor(`${home.siteName} ${home.description}`) : null;
198
+ const look = state.look;
199
+ return _extends({}, kind ? {
200
+ siteKind: kind.id
201
+ } : {}, look && look.seed !== null ? {
202
+ siteStyle: _extends({
203
+ seed: look.seed
204
+ }, ((_look_style = look.style) == null ? void 0 : _look_style.headerAlign) ? {
205
+ headerAlign: look.style.headerAlign
206
+ } : {}, ((_look_style1 = look.style) == null ? void 0 : _look_style1.rhythm) ? {
207
+ rhythm: look.style.rhythm
208
+ } : {}, ((_look_style2 = look.style) == null ? void 0 : _look_style2.motion) ? {
209
+ motion: look.style.motion
210
+ } : {})
211
+ } : {});
212
+ }
213
+ /** The header and footer's job: a layout of the site's brand, linking the wave's pages, in the layout language. */ export function aiSiteImportFrameJob(job, state, wave, items) {
214
+ var _ref, _state_home, _ref1, _ref2;
215
+ var _state_frame, _state_look;
169
216
  const draftId = (_ref = (_state_frame = state.frame) == null ? void 0 : _state_frame.draftId) != null ? _ref : `${job.$id}-${AI_SITE_IMPORT_FRAME_SLOT}`;
170
217
  const creation = {
171
218
  kind: 'layout',
@@ -180,6 +227,16 @@ const delivered = (items, slot)=>items.some((row)=>row.slot === slot && (row.sta
180
227
  ],
181
228
  id: draftId
182
229
  };
230
+ const home = (_state_home = state.home) != null ? _state_home : null;
231
+ const logo = (_ref1 = (_state_look = state.look) == null ? void 0 : _state_look.logo) != null ? _ref1 : null;
232
+ // The brand as the source's header draws it; with no logo in the library, its name.
233
+ const brand = home ? _extends({}, logo && home.brand.kind !== 'name-only' ? {
234
+ logo: {
235
+ src: logo.src
236
+ }
237
+ } : {}, {
238
+ name: !logo || home.brand.kind !== 'logo-only'
239
+ }) : null;
183
240
  return _extends({}, job, {
184
241
  $id: draftId,
185
242
  kind: 'layout',
@@ -192,22 +249,56 @@ const delivered = (items, slot)=>items.some((row)=>row.slot === slot && (row.sta
192
249
  creation
193
250
  ]
194
251
  }),
195
- inputs: {
252
+ inputs: _extends({
196
253
  originJobId: job.$id,
197
- businessName: state.siteName,
254
+ businessName: aiSiteImportBrandName(state.siteName, (_ref2 = home == null ? void 0 : home.siteName) != null ? _ref2 : ''),
198
255
  [AI_LAYOUT_LANGUAGE_INPUT]: true,
199
256
  [AI_LAYOUT_SITE_PAGES_INPUT]: aiSiteImportLinkedPages(state, items, wave.index)
200
- },
201
- brief: `Build the header and footer of “${state.siteName}”, a website brought in from ${state.domain}.`.slice(0, AI_JOB_BRIEF_MAX_CHARS)
257
+ }, aiSiteImportDesignInputs(state), brand ? {
258
+ [AI_LAYOUT_SITE_BRAND_INPUT]: brand
259
+ } : {}, home ? {
260
+ [AI_LAYOUT_SITE_FACTS_INPUT]: {
261
+ url: home.url,
262
+ description: home.description,
263
+ lines: home.facts.lines
264
+ }
265
+ } : {}),
266
+ // Never words a footer could print as the site's own (AGL-4084): the prompt shows the source's.
267
+ brief: `The header and footer of the site “${state.siteName}”.`.slice(0, AI_JOB_BRIEF_MAX_CHARS)
202
268
  });
203
269
  }
204
- /** One page's job: a page job's plan of one screen, its sections from the old page's headings, its text fenced. */ export function aiSiteImportPageJob(job, state, page, items) {
205
- var _ref, _ref1;
206
- var _page_read, _page_read1, _page_photos;
207
- const sections = (((_page_read = page.read) == null ? void 0 : _page_read.sections.length) ? page.read.sections : [
270
+ /** The page brought in, as its page job carries it: its lines, its photos, and the pages its links may go to (AGL-4084). */ export function aiSiteImportDocumentFor(state, page) {
271
+ var _page_build, _ref;
272
+ var _page_read, _page_photos;
273
+ const blocks = (_page_read = page.read) == null ? void 0 : _page_read.blocks;
274
+ if (!(blocks == null ? void 0 : blocks.length)) return null;
275
+ return {
276
+ build: (_page_build = page.build) != null ? _page_build : aiSiteImportBuildOf(page),
277
+ title: page.title,
278
+ url: page.url,
279
+ blocks,
280
+ photos: (_ref = (_page_photos = page.photos) == null ? void 0 : _page_photos.assets) != null ? _ref : [],
281
+ // Home's own links are words: a link home says home, which the source's words may not.
282
+ links: state.pages.filter((entry)=>entry.slug !== '/' && !entry.refused).map((entry)=>({
283
+ path: entry.path.replace(/\/+$/, '') || '/',
284
+ id: entry.draftId
285
+ })),
286
+ origins: [
287
+ `https://${state.domain}`,
288
+ `https://www.${state.domain.replace(/^www\./, '')}`
289
+ ]
290
+ };
291
+ }
292
+ /** One page's job: a page job's plan of one screen, its sections the old page's own, its words carried as they are. */ export function aiSiteImportPageJob(job, state, page, items) {
293
+ var _ref, _ref1, _ref2, _ref3;
294
+ var _page_read, _state_home, _page_read1, _page_photos;
295
+ const doc = aiSiteImportDocumentFor(state, page);
296
+ // The page's sections are the source's own (AGL-4084): its opening, then one at each second-level heading.
297
+ const names = doc ? aiSiteImportDocLines(doc.blocks, doc.title).sections.map((section)=>section.name) : (_ref = (_page_read = page.read) == null ? void 0 : _page_read.sections) != null ? _ref : [];
298
+ const sections = (names.length ? names : [
208
299
  'Introduction'
209
300
  ]).map((name)=>({
210
- name,
301
+ name: name.slice(0, AI_SITE_IMPORT_LABEL_MAX_CHARS),
211
302
  uses: [],
212
303
  items: 0
213
304
  }));
@@ -241,20 +332,78 @@ const delivered = (items, slot)=>items.some((row)=>row.slot === slot && (row.sta
241
332
  }),
242
333
  inputs: _extends({
243
334
  originJobId: job.$id,
244
- businessName: state.siteName,
335
+ businessName: aiSiteImportBrandName(state.siteName, (_ref1 = (_state_home = state.home) == null ? void 0 : _state_home.siteName) != null ? _ref1 : ''),
245
336
  [AI_LAYOUT_LANGUAGE_INPUT]: true,
246
- [AI_LAYOUT_SITE_PAGES_INPUT]: aiSiteImportLinkedPages(state, items, page.wave),
337
+ [AI_LAYOUT_SITE_PAGES_INPUT]: aiSiteImportLinkedPages(state, items, page.wave)
338
+ }, aiSiteImportDesignInputs(state), doc ? {
339
+ [AI_LAYOUT_IMPORTED_SECTIONS_INPUT]: doc
340
+ } : {
247
341
  [AI_LAYOUT_IMPORTED_PAGE_INPUT]: {
248
342
  url: page.url,
249
- text: (_ref = (_page_read1 = page.read) == null ? void 0 : _page_read1.text) != null ? _ref : ''
250
- },
251
- [AI_LAYOUT_PAGE_PHOTOS_INPUT]: (_ref1 = (_page_photos = page.photos) == null ? void 0 : _page_photos.assets) != null ? _ref1 : []
343
+ text: (_ref2 = (_page_read1 = page.read) == null ? void 0 : _page_read1.text) != null ? _ref2 : ''
344
+ }
345
+ }, {
346
+ [AI_LAYOUT_PAGE_PHOTOS_INPUT]: (_ref3 = (_page_photos = page.photos) == null ? void 0 : _page_photos.assets) != null ? _ref3 : []
252
347
  }, others.length ? {
253
348
  [AI_STOCK_PHOTO_PAGES_INPUT]: others
254
349
  } : {}),
255
350
  brief: `Bring in the page “${page.title}” of ${state.domain} as a page of “${state.siteName}”.`.slice(0, AI_JOB_BRIEF_MAX_CHARS)
256
351
  });
257
352
  }
353
+ /** What the home page says of the site as a whole (AGL-4084), kept for the look, the header and footer and the listing. */ export function aiSiteImportHomeOf(crawled) {
354
+ var _crawled_pages_find, _page_title, _page_description, _page_ogImage, _ref;
355
+ var _facts_organization;
356
+ const page = (_crawled_pages_find = crawled.pages.find((entry)=>entry.foundBy === 'home')) != null ? _crawled_pages_find : crawled.pages.find((entry)=>(entry.path.replace(/\/+$/, '') || '/') === '/');
357
+ if (!page) return null;
358
+ const brand = siteImportHeaderBrand(page);
359
+ const facts = siteImportSiteFacts(page);
360
+ const lines = [];
361
+ let chars = 0;
362
+ for (const block of [
363
+ ...facts.header,
364
+ ...facts.footer
365
+ ]){
366
+ if (block.kind === 'image' || block.kind === 'link' && block.inline) continue;
367
+ const text = block.text.replace(/\s+/g, ' ').trim();
368
+ const line = block.kind === 'link' && /^(?:mailto|tel):/i.test(block.href) ? text : block.kind === 'link' && facts.social.includes(block.href) ? `${text}: ${block.href}` : text;
369
+ if (!line || lines.includes(line) || chars + line.length > 3000 || lines.length >= 60) continue;
370
+ lines.push(line);
371
+ chars += line.length;
372
+ }
373
+ // And what the site states of itself in its structured data, as written: its address, phone and email.
374
+ const organization = facts.organization;
375
+ for (const line of [
376
+ organization == null ? void 0 : organization.address,
377
+ organization == null ? void 0 : organization.telephone,
378
+ organization == null ? void 0 : organization.email
379
+ ]){
380
+ const text = (line != null ? line : '').replace(/\s+/g, ' ').trim();
381
+ if (text && !lines.some((entry)=>entry.includes(text))) lines.push(text);
382
+ }
383
+ return {
384
+ url: page.url,
385
+ title: siteImportLabel((_page_title = page.title) != null ? _page_title : '', 160),
386
+ description: siteImportLabel((_page_description = page.description) != null ? _page_description : '', 320),
387
+ ogImage: (_page_ogImage = page.ogImage) != null ? _page_ogImage : null,
388
+ siteName: siteImportSiteName(page),
389
+ brand: {
390
+ kind: brand.kind,
391
+ text: brand.text,
392
+ logo: brand.logo ? {
393
+ url: brand.logo.url,
394
+ alt: brand.logo.alt,
395
+ type: brand.logo.type
396
+ } : null
397
+ },
398
+ facts: {
399
+ lines,
400
+ emails: facts.emails,
401
+ phones: facts.phones,
402
+ social: facts.social,
403
+ address: (_ref = (_facts_organization = facts.organization) == null ? void 0 : _facts_organization.address) != null ? _ref : ''
404
+ }
405
+ };
406
+ }
258
407
  /** The least time the import's next pass needs: a read's, a photo pass's, or the time of the step its unit is handed to. */ export function aiSiteImportRunMinimumMs(job, runnerFor = aiJobStepRunnerFor) {
259
408
  var _job_siteImport, _job_items;
260
409
  const state = (_job_siteImport = job.siteImport) != null ? _job_siteImport : null;
@@ -292,12 +441,65 @@ const delivered = (items, slot)=>items.some((row)=>row.slot === slot && (row.sta
292
441
  }) : row;
293
442
  });
294
443
  }
444
+ /**
445
+ * The state with how each page is built (AGL-4084): from its main region's
446
+ * words as the inventory listed them, and again from a wave's fresh read,
447
+ * which is what the page is built from.
448
+ */ export function aiSiteImportWithBuilds(state, mainWords) {
449
+ return _extends({}, state, {
450
+ pages: state.pages.map((page)=>{
451
+ var _ref, _ref1;
452
+ var _page_read;
453
+ const words = (_ref = (_ref1 = (_page_read = page.read) == null ? void 0 : _page_read.words) != null ? _ref1 : mainWords == null ? void 0 : mainWords.get(page.url)) != null ? _ref : page.words;
454
+ const build = aiSiteImportBuildOf(_extends({}, page, {
455
+ words
456
+ }));
457
+ return page.build === build ? page : _extends({}, page, {
458
+ build
459
+ });
460
+ })
461
+ });
462
+ }
463
+ /** The words a stored page shows (AGL-4084): its text, its list lines and its buttons. */ export function aiSiteImportShownWords(nodes) {
464
+ let words = 0;
465
+ for (const node of Object.values(nodes)){
466
+ var _ref;
467
+ const props = (_ref = node == null ? void 0 : node.props) != null ? _ref : {};
468
+ for (const key of [
469
+ 'children',
470
+ 'primary',
471
+ 'secondary'
472
+ ]){
473
+ var _value_match;
474
+ const value = props[key];
475
+ if (typeof value === 'string') words += ((_value_match = value.match(RegExp("[\\u0041-\\u005A\\u0061-\\u007A\\u00AA\\u00B5\\u00BA\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376-\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0560-\\u0588\\u05D0-\\u05EA\\u05EF-\\u05F2\\u0620-\\u064A\\u066E-\\u066F\\u0671-\\u06D3\\u06D5\\u06E5-\\u06E6\\u06EE-\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4-\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u0860-\\u086A\\u0870-\\u0887\\u0889-\\u088F\\u08A0-\\u08C9\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F-\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC-\\u09DD\\u09DF-\\u09E1\\u09F0-\\u09F1\\u09FC\\u0A05-\\u0A0A\\u0A0F-\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32-\\u0A33\\u0A35-\\u0A36\\u0A38-\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2-\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0-\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F-\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32-\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C-\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99-\\u0B9A\\u0B9C\\u0B9E-\\u0B9F\\u0BA3-\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C5C-\\u0C5D\\u0C60-\\u0C61\\u0C80\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDC-\\u0CDE\\u0CE0-\\u0CE1\\u0CF1-\\u0CF2\\u0D04-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D54-\\u0D56\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32-\\u0E33\\u0E40-\\u0E46\\u0E81-\\u0E82\\u0E84\\u0E86-\\u0E8A\\u0E8C-\\u0EA3\\u0EA5\\u0EA7-\\u0EB0\\u0EB2-\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065-\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16F1-\\u16F8\\u1700-\\u1711\\u171F-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1878\\u1880-\\u1884\\u1887-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4C\\u1B83-\\u1BA0\\u1BAE-\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1C80-\\u1C8A\\u1C90-\\u1CBA\\u1CBD-\\u1CBF\\u1CE9-\\u1CEC\\u1CEE-\\u1CF3\\u1CF5-\\u1CF6\\u1CFA\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183-\\u2184\\u2C00-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2-\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005-\\u3006\\u3031-\\u3035\\u303B-\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312F\\u3131-\\u318E\\u31A0-\\u31BF\\u31F0-\\u31FF\\u3400-\\u4DBF\\u4E00-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A-\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6E5\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7DC\\uA7F1-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD-\\uA8FE\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5-\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB69\\uAB70-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40-\\uFB41\\uFB43-\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC\\u{10000}-\\u{1000B}\\u{1000D}-\\u{10026}\\u{10028}-\\u{1003A}\\u{1003C}-\\u{1003D}\\u{1003F}-\\u{1004D}\\u{10050}-\\u{1005D}\\u{10080}-\\u{100FA}\\u{10280}-\\u{1029C}\\u{102A0}-\\u{102D0}\\u{10300}-\\u{1031F}\\u{1032D}-\\u{10340}\\u{10342}-\\u{10349}\\u{10350}-\\u{10375}\\u{10380}-\\u{1039D}\\u{103A0}-\\u{103C3}\\u{103C8}-\\u{103CF}\\u{10400}-\\u{1049D}\\u{104B0}-\\u{104D3}\\u{104D8}-\\u{104FB}\\u{10500}-\\u{10527}\\u{10530}-\\u{10563}\\u{10570}-\\u{1057A}\\u{1057C}-\\u{1058A}\\u{1058C}-\\u{10592}\\u{10594}-\\u{10595}\\u{10597}-\\u{105A1}\\u{105A3}-\\u{105B1}\\u{105B3}-\\u{105B9}\\u{105BB}-\\u{105BC}\\u{105C0}-\\u{105F3}\\u{10600}-\\u{10736}\\u{10740}-\\u{10755}\\u{10760}-\\u{10767}\\u{10780}-\\u{10785}\\u{10787}-\\u{107B0}\\u{107B2}-\\u{107BA}\\u{10800}-\\u{10805}\\u{10808}\\u{1080A}-\\u{10835}\\u{10837}-\\u{10838}\\u{1083C}\\u{1083F}-\\u{10855}\\u{10860}-\\u{10876}\\u{10880}-\\u{1089E}\\u{108E0}-\\u{108F2}\\u{108F4}-\\u{108F5}\\u{10900}-\\u{10915}\\u{10920}-\\u{10939}\\u{10940}-\\u{10959}\\u{10980}-\\u{109B7}\\u{109BE}-\\u{109BF}\\u{10A00}\\u{10A10}-\\u{10A13}\\u{10A15}-\\u{10A17}\\u{10A19}-\\u{10A35}\\u{10A60}-\\u{10A7C}\\u{10A80}-\\u{10A9C}\\u{10AC0}-\\u{10AC7}\\u{10AC9}-\\u{10AE4}\\u{10B00}-\\u{10B35}\\u{10B40}-\\u{10B55}\\u{10B60}-\\u{10B72}\\u{10B80}-\\u{10B91}\\u{10C00}-\\u{10C48}\\u{10C80}-\\u{10CB2}\\u{10CC0}-\\u{10CF2}\\u{10D00}-\\u{10D23}\\u{10D4A}-\\u{10D65}\\u{10D6F}-\\u{10D85}\\u{10E80}-\\u{10EA9}\\u{10EB0}-\\u{10EB1}\\u{10EC2}-\\u{10EC7}\\u{10F00}-\\u{10F1C}\\u{10F27}\\u{10F30}-\\u{10F45}\\u{10F70}-\\u{10F81}\\u{10FB0}-\\u{10FC4}\\u{10FE0}-\\u{10FF6}\\u{11003}-\\u{11037}\\u{11071}-\\u{11072}\\u{11075}\\u{11083}-\\u{110AF}\\u{110D0}-\\u{110E8}\\u{11103}-\\u{11126}\\u{11144}\\u{11147}\\u{11150}-\\u{11172}\\u{11176}\\u{11183}-\\u{111B2}\\u{111C1}-\\u{111C4}\\u{111DA}\\u{111DC}\\u{11200}-\\u{11211}\\u{11213}-\\u{1122B}\\u{1123F}-\\u{11240}\\u{11280}-\\u{11286}\\u{11288}\\u{1128A}-\\u{1128D}\\u{1128F}-\\u{1129D}\\u{1129F}-\\u{112A8}\\u{112B0}-\\u{112DE}\\u{11305}-\\u{1130C}\\u{1130F}-\\u{11310}\\u{11313}-\\u{11328}\\u{1132A}-\\u{11330}\\u{11332}-\\u{11333}\\u{11335}-\\u{11339}\\u{1133D}\\u{11350}\\u{1135D}-\\u{11361}\\u{11380}-\\u{11389}\\u{1138B}\\u{1138E}\\u{11390}-\\u{113B5}\\u{113B7}\\u{113D1}\\u{113D3}\\u{11400}-\\u{11434}\\u{11447}-\\u{1144A}\\u{1145F}-\\u{11461}\\u{11480}-\\u{114AF}\\u{114C4}-\\u{114C5}\\u{114C7}\\u{11580}-\\u{115AE}\\u{115D8}-\\u{115DB}\\u{11600}-\\u{1162F}\\u{11644}\\u{11680}-\\u{116AA}\\u{116B8}\\u{11700}-\\u{1171A}\\u{11740}-\\u{11746}\\u{11800}-\\u{1182B}\\u{118A0}-\\u{118DF}\\u{118FF}-\\u{11906}\\u{11909}\\u{1190C}-\\u{11913}\\u{11915}-\\u{11916}\\u{11918}-\\u{1192F}\\u{1193F}\\u{11941}\\u{119A0}-\\u{119A7}\\u{119AA}-\\u{119D0}\\u{119E1}\\u{119E3}\\u{11A00}\\u{11A0B}-\\u{11A32}\\u{11A3A}\\u{11A50}\\u{11A5C}-\\u{11A89}\\u{11A9D}\\u{11AB0}-\\u{11AF8}\\u{11BC0}-\\u{11BE0}\\u{11C00}-\\u{11C08}\\u{11C0A}-\\u{11C2E}\\u{11C40}\\u{11C72}-\\u{11C8F}\\u{11D00}-\\u{11D06}\\u{11D08}-\\u{11D09}\\u{11D0B}-\\u{11D30}\\u{11D46}\\u{11D60}-\\u{11D65}\\u{11D67}-\\u{11D68}\\u{11D6A}-\\u{11D89}\\u{11D98}\\u{11DB0}-\\u{11DDB}\\u{11EE0}-\\u{11EF2}\\u{11F02}\\u{11F04}-\\u{11F10}\\u{11F12}-\\u{11F33}\\u{11FB0}\\u{12000}-\\u{12399}\\u{12480}-\\u{12543}\\u{12F90}-\\u{12FF0}\\u{13000}-\\u{1342F}\\u{13441}-\\u{13446}\\u{13460}-\\u{143FA}\\u{14400}-\\u{14646}\\u{16100}-\\u{1611D}\\u{16800}-\\u{16A38}\\u{16A40}-\\u{16A5E}\\u{16A70}-\\u{16ABE}\\u{16AD0}-\\u{16AED}\\u{16B00}-\\u{16B2F}\\u{16B40}-\\u{16B43}\\u{16B63}-\\u{16B77}\\u{16B7D}-\\u{16B8F}\\u{16D40}-\\u{16D6C}\\u{16E40}-\\u{16E7F}\\u{16EA0}-\\u{16EB8}\\u{16EBB}-\\u{16ED3}\\u{16F00}-\\u{16F4A}\\u{16F50}\\u{16F93}-\\u{16F9F}\\u{16FE0}-\\u{16FE1}\\u{16FE3}\\u{16FF2}-\\u{16FF3}\\u{17000}-\\u{18CD5}\\u{18CFF}-\\u{18D1E}\\u{18D80}-\\u{18DF2}\\u{1AFF0}-\\u{1AFF3}\\u{1AFF5}-\\u{1AFFB}\\u{1AFFD}-\\u{1AFFE}\\u{1B000}-\\u{1B122}\\u{1B132}\\u{1B150}-\\u{1B152}\\u{1B155}\\u{1B164}-\\u{1B167}\\u{1B170}-\\u{1B2FB}\\u{1BC00}-\\u{1BC6A}\\u{1BC70}-\\u{1BC7C}\\u{1BC80}-\\u{1BC88}\\u{1BC90}-\\u{1BC99}\\u{1D400}-\\u{1D454}\\u{1D456}-\\u{1D49C}\\u{1D49E}-\\u{1D49F}\\u{1D4A2}\\u{1D4A5}-\\u{1D4A6}\\u{1D4A9}-\\u{1D4AC}\\u{1D4AE}-\\u{1D4B9}\\u{1D4BB}\\u{1D4BD}-\\u{1D4C3}\\u{1D4C5}-\\u{1D505}\\u{1D507}-\\u{1D50A}\\u{1D50D}-\\u{1D514}\\u{1D516}-\\u{1D51C}\\u{1D51E}-\\u{1D539}\\u{1D53B}-\\u{1D53E}\\u{1D540}-\\u{1D544}\\u{1D546}\\u{1D54A}-\\u{1D550}\\u{1D552}-\\u{1D6A5}\\u{1D6A8}-\\u{1D6C0}\\u{1D6C2}-\\u{1D6DA}\\u{1D6DC}-\\u{1D6FA}\\u{1D6FC}-\\u{1D714}\\u{1D716}-\\u{1D734}\\u{1D736}-\\u{1D74E}\\u{1D750}-\\u{1D76E}\\u{1D770}-\\u{1D788}\\u{1D78A}-\\u{1D7A8}\\u{1D7AA}-\\u{1D7C2}\\u{1D7C4}-\\u{1D7CB}\\u{1DF00}-\\u{1DF1E}\\u{1DF25}-\\u{1DF2A}\\u{1E030}-\\u{1E06D}\\u{1E100}-\\u{1E12C}\\u{1E137}-\\u{1E13D}\\u{1E14E}\\u{1E290}-\\u{1E2AD}\\u{1E2C0}-\\u{1E2EB}\\u{1E4D0}-\\u{1E4EB}\\u{1E5D0}-\\u{1E5ED}\\u{1E5F0}\\u{1E6C0}-\\u{1E6DE}\\u{1E6E0}-\\u{1E6E2}\\u{1E6E4}-\\u{1E6E5}\\u{1E6E7}-\\u{1E6ED}\\u{1E6F0}-\\u{1E6F4}\\u{1E6FE}-\\u{1E6FF}\\u{1E7E0}-\\u{1E7E6}\\u{1E7E8}-\\u{1E7EB}\\u{1E7ED}-\\u{1E7EE}\\u{1E7F0}-\\u{1E7FE}\\u{1E800}-\\u{1E8C4}\\u{1E900}-\\u{1E943}\\u{1E94B}\\u{1EE00}-\\u{1EE03}\\u{1EE05}-\\u{1EE1F}\\u{1EE21}-\\u{1EE22}\\u{1EE24}\\u{1EE27}\\u{1EE29}-\\u{1EE32}\\u{1EE34}-\\u{1EE37}\\u{1EE39}\\u{1EE3B}\\u{1EE42}\\u{1EE47}\\u{1EE49}\\u{1EE4B}\\u{1EE4D}-\\u{1EE4F}\\u{1EE51}-\\u{1EE52}\\u{1EE54}\\u{1EE57}\\u{1EE59}\\u{1EE5B}\\u{1EE5D}\\u{1EE5F}\\u{1EE61}-\\u{1EE62}\\u{1EE64}\\u{1EE67}-\\u{1EE6A}\\u{1EE6C}-\\u{1EE72}\\u{1EE74}-\\u{1EE77}\\u{1EE79}-\\u{1EE7C}\\u{1EE7E}\\u{1EE80}-\\u{1EE89}\\u{1EE8B}-\\u{1EE9B}\\u{1EEA1}-\\u{1EEA3}\\u{1EEA5}-\\u{1EEA9}\\u{1EEAB}-\\u{1EEBB}\\u{20000}-\\u{2A6DF}\\u{2A700}-\\u{2B81D}\\u{2B820}-\\u{2CEAD}\\u{2CEB0}-\\u{2EBE0}\\u{2EBF0}-\\u{2EE5D}\\u{2F800}-\\u{2FA1D}\\u{30000}-\\u{3134A}\\u{31350}-\\u{33479}\\u0030-\\u0039\\u00B2-\\u00B3\\u00B9\\u00BC-\\u00BE\\u0660-\\u0669\\u06F0-\\u06F9\\u07C0-\\u07C9\\u0966-\\u096F\\u09E6-\\u09EF\\u09F4-\\u09F9\\u0A66-\\u0A6F\\u0AE6-\\u0AEF\\u0B66-\\u0B6F\\u0B72-\\u0B77\\u0BE6-\\u0BF2\\u0C66-\\u0C6F\\u0C78-\\u0C7E\\u0CE6-\\u0CEF\\u0D58-\\u0D5E\\u0D66-\\u0D78\\u0DE6-\\u0DEF\\u0E50-\\u0E59\\u0ED0-\\u0ED9\\u0F20-\\u0F33\\u1040-\\u1049\\u1090-\\u1099\\u1369-\\u137C\\u16EE-\\u16F0\\u17E0-\\u17E9\\u17F0-\\u17F9\\u1810-\\u1819\\u1946-\\u194F\\u19D0-\\u19DA\\u1A80-\\u1A89\\u1A90-\\u1A99\\u1B50-\\u1B59\\u1BB0-\\u1BB9\\u1C40-\\u1C49\\u1C50-\\u1C59\\u2070\\u2074-\\u2079\\u2080-\\u2089\\u2150-\\u2182\\u2185-\\u2189\\u2460-\\u249B\\u24EA-\\u24FF\\u2776-\\u2793\\u2CFD\\u3007\\u3021-\\u3029\\u3038-\\u303A\\u3192-\\u3195\\u3220-\\u3229\\u3248-\\u324F\\u3251-\\u325F\\u3280-\\u3289\\u32B1-\\u32BF\\uA620-\\uA629\\uA6E6-\\uA6EF\\uA830-\\uA835\\uA8D0-\\uA8D9\\uA900-\\uA909\\uA9D0-\\uA9D9\\uA9F0-\\uA9F9\\uAA50-\\uAA59\\uABF0-\\uABF9\\uFF10-\\uFF19\\u{10107}-\\u{10133}\\u{10140}-\\u{10178}\\u{1018A}-\\u{1018B}\\u{102E1}-\\u{102FB}\\u{10320}-\\u{10323}\\u{10341}\\u{1034A}\\u{103D1}-\\u{103D5}\\u{104A0}-\\u{104A9}\\u{10858}-\\u{1085F}\\u{10879}-\\u{1087F}\\u{108A7}-\\u{108AF}\\u{108FB}-\\u{108FF}\\u{10916}-\\u{1091B}\\u{109BC}-\\u{109BD}\\u{109C0}-\\u{109CF}\\u{109D2}-\\u{109FF}\\u{10A40}-\\u{10A48}\\u{10A7D}-\\u{10A7E}\\u{10A9D}-\\u{10A9F}\\u{10AEB}-\\u{10AEF}\\u{10B58}-\\u{10B5F}\\u{10B78}-\\u{10B7F}\\u{10BA9}-\\u{10BAF}\\u{10CFA}-\\u{10CFF}\\u{10D30}-\\u{10D39}\\u{10D40}-\\u{10D49}\\u{10E60}-\\u{10E7E}\\u{10F1D}-\\u{10F26}\\u{10F51}-\\u{10F54}\\u{10FC5}-\\u{10FCB}\\u{11052}-\\u{1106F}\\u{110F0}-\\u{110F9}\\u{11136}-\\u{1113F}\\u{111D0}-\\u{111D9}\\u{111E1}-\\u{111F4}\\u{112F0}-\\u{112F9}\\u{11450}-\\u{11459}\\u{114D0}-\\u{114D9}\\u{11650}-\\u{11659}\\u{116C0}-\\u{116C9}\\u{116D0}-\\u{116E3}\\u{11730}-\\u{1173B}\\u{118E0}-\\u{118F2}\\u{11950}-\\u{11959}\\u{11BF0}-\\u{11BF9}\\u{11C50}-\\u{11C6C}\\u{11D50}-\\u{11D59}\\u{11DA0}-\\u{11DA9}\\u{11DE0}-\\u{11DE9}\\u{11F50}-\\u{11F59}\\u{11FC0}-\\u{11FD4}\\u{12400}-\\u{1246E}\\u{16130}-\\u{16139}\\u{16A60}-\\u{16A69}\\u{16AC0}-\\u{16AC9}\\u{16B50}-\\u{16B59}\\u{16B5B}-\\u{16B61}\\u{16D70}-\\u{16D79}\\u{16E80}-\\u{16E96}\\u{16FF4}-\\u{16FF6}\\u{1CCF0}-\\u{1CCF9}\\u{1D2C0}-\\u{1D2D3}\\u{1D2E0}-\\u{1D2F3}\\u{1D360}-\\u{1D378}\\u{1D7CE}-\\u{1D7FF}\\u{1E140}-\\u{1E149}\\u{1E2F0}-\\u{1E2F9}\\u{1E4F0}-\\u{1E4F9}\\u{1E5F1}-\\u{1E5FA}\\u{1E8C7}-\\u{1E8CF}\\u{1E950}-\\u{1E959}\\u{1EC71}-\\u{1ECAB}\\u{1ECAD}-\\u{1ECAF}\\u{1ECB1}-\\u{1ECB4}\\u{1ED01}-\\u{1ED2D}\\u{1ED2F}-\\u{1ED3D}\\u{1F100}-\\u{1F10C}\\u{1FBF0}-\\u{1FBF9}]+", "gu"))) != null ? _value_match : []).length;
476
+ }
477
+ }
478
+ return words;
479
+ }
480
+ async function readDraftWords(firestore, hostId, draftId) {
481
+ const stored = await readAiDraftNodes(firestore, {
482
+ kind: 'screen',
483
+ hostId,
484
+ id: draftId
485
+ });
486
+ return stored ? aiSiteImportShownWords(stored.nodes) : null;
487
+ }
488
+ /**
489
+ * The review a wave that went live in the site's preview parks on (AGL-4084):
490
+ * where its pages are now, who sees them, and the next wave's start.
491
+ */ export function aiSiteImportPreviewMessage(state, wave, published) {
492
+ const pages = `${published.toLocaleString('en-US')} ${published === 1 ? 'page is' : 'pages are'}`;
493
+ const lead = `${wave.label} is in your site’s preview: ${pages} on your site, where only you and your team can see ${published === 1 ? 'it' : 'them'}.`;
494
+ const next = state.waves.find((entry)=>entry.status === 'waiting');
495
+ return next ? `${lead} Start ${next.label} when you are ready.` : lead;
496
+ }
295
497
  /** Whether every row of the wave is settled, its header and footer included. */ function waveSettled(state, wave, items) {
296
498
  if (wave.frame && state.frame && aiSiteImportItemOpen(items, AI_SITE_IMPORT_FRAME_SLOT)) return false;
297
499
  return wave.slots.every((slot)=>!aiSiteImportItemOpen(items, slot));
298
500
  }
299
501
  export function createAiJobImportStep(deps = {}) {
300
- var _deps_crawl, _deps_runnerFor, _deps_ownership, _deps_rateLimit, _deps_releaseFlagOn, _deps_ingest, _deps_readRoom, _deps_readSiteName, _deps_fileReview, _deps_pageWritten, _deps_mintId, _deps_clock;
502
+ var _deps_crawl, _deps_runnerFor, _deps_ownership, _deps_rateLimit, _deps_releaseFlagOn, _deps_ingest, _deps_readRoom, _deps_readSiteName, _deps_fileReview, _deps_pageWritten, _deps_mintId, _deps_clock, _deps_look, _deps_publishWave, _deps_draftWords;
301
503
  const crawl = (_deps_crawl = deps.crawl) != null ? _deps_crawl : crawlSiteForImport;
302
504
  const runnerFor = (_deps_runnerFor = deps.runnerFor) != null ? _deps_runnerFor : aiJobStepRunnerFor;
303
505
  const ownershipOf = (_deps_ownership = deps.ownership) != null ? _deps_ownership : readOwnership;
@@ -310,8 +512,12 @@ export function createAiJobImportStep(deps = {}) {
310
512
  const pageWritten = (_deps_pageWritten = deps.pageWritten) != null ? _deps_pageWritten : aiSitePageWritten;
311
513
  const mintId = (_deps_mintId = deps.mintId) != null ? _deps_mintId : createResourceUid;
312
514
  const clock = (_deps_clock = deps.clock) != null ? _deps_clock : Date.now;
515
+ const runLook = (_deps_look = deps.look) != null ? _deps_look : aiRunSiteImportLook;
516
+ const publishWave = (_deps_publishWave = deps.publishWave) != null ? _deps_publishWave : aiPublishImportedWave;
517
+ const draftWordsOf = (_deps_draftWords = deps.draftWords) != null ? _deps_draftWords : readDraftWords;
313
518
  return async (context)=>{
314
519
  var _job_siteImport, _job_items;
520
+ var _state_waves_;
315
521
  const { job, firestore, now, signal } = context;
316
522
  const model = aiModelForStep('job.page');
317
523
  const unspent = (rest = {})=>_extends({}, aiUnspentOutcome(model), rest);
@@ -345,16 +551,51 @@ export function createAiJobImportStep(deps = {}) {
345
551
  continue: true
346
552
  });
347
553
  const closed = aiSiteImportWaveClosed(next, wave.index, nowIso);
554
+ // The wave's pages go live in the site's preview, where only its team sees them (AGL-4084).
555
+ let sitePublish = null;
556
+ try {
557
+ var _job_outputs, _outcome_outputs;
558
+ sitePublish = await publishWave(firestore, {
559
+ job,
560
+ state: closed,
561
+ wave,
562
+ items: ledger,
563
+ outputs: [
564
+ ...(_job_outputs = job.outputs) != null ? _job_outputs : [],
565
+ ...(_outcome_outputs = outcome.outputs) != null ? _outcome_outputs : []
566
+ ],
567
+ now
568
+ });
569
+ } catch (error) {
570
+ // A publish that failed leaves the pages drafts; the wave is still in.
571
+ console.error('ai site import: a wave could not be published into the preview', {
572
+ orgId: job.orgId,
573
+ jobId: job.$id,
574
+ wave: wave.index,
575
+ error
576
+ });
577
+ }
578
+ const published = sitePublish ? {
579
+ sitePublish
580
+ } : {};
348
581
  await review('wave-finished', closed, ledger, wave.index);
349
582
  const waiting = ((_closed_waves_find = closed.waves.find((entry)=>entry.index === wave.index)) == null ? void 0 : _closed_waves_find.status) === 'review';
350
- return waiting ? _extends({}, outcome, {
351
- siteImport: closed,
352
- review: waveReview(aiSiteImportWaveMessage(closed, ledger))
353
- }) : _extends({}, outcome, {
583
+ if (waiting) {
584
+ const message = (sitePublish == null ? void 0 : sitePublish.published.length) ? aiSiteImportPreviewMessage(closed, wave, sitePublish.published.length) : aiSiteImportWaveMessage(closed, ledger);
585
+ return _extends({}, outcome, published, {
586
+ siteImport: closed,
587
+ review: waveReview(message)
588
+ });
589
+ }
590
+ // "Start every remaining wave" (AGL-4083): the next wave starts with no review between them.
591
+ const more = closed.autoContinue === true && closed.waves.some((entry)=>entry.status === 'waiting');
592
+ return _extends({}, outcome, published, {
354
593
  siteImport: closed
355
- });
594
+ }, more ? {
595
+ continue: true
596
+ } : {});
356
597
  };
357
- /** The proof, the flag and the day's limit, asked before anything is read. */ const gate = async ()=>{
598
+ /** The proof, the flag and the day's limit, asked before anything is read. */ const gate = async (counted = true)=>{
358
599
  if (!await flagOn(job.orgId)) return unspent({
359
600
  review: waveReview(AI_SITE_IMPORT_COPY.unavailable)
360
601
  });
@@ -368,17 +609,19 @@ export function createAiJobImportStep(deps = {}) {
368
609
  }
369
610
  });
370
611
  }
371
- const window = await rateLimit(siteImportRateKey(job.orgId), {
372
- limit: SITE_IMPORT_WAVES_PER_ORG_PER_DAY,
373
- windowMs: DAY_MS
374
- });
375
- if (!window.allowed) return unspent({
376
- review: {
377
- reason: 'limit',
378
- message: AI_SITE_IMPORT_COPY.limit,
379
- findings: []
380
- }
381
- });
612
+ if (counted) {
613
+ const window = await rateLimit(siteImportRateKey(job.orgId), {
614
+ limit: SITE_IMPORT_WAVES_PER_ORG_PER_DAY,
615
+ windowMs: DAY_MS
616
+ });
617
+ if (!window.allowed) return unspent({
618
+ review: {
619
+ reason: 'limit',
620
+ message: AI_SITE_IMPORT_COPY.limit,
621
+ findings: []
622
+ }
623
+ });
624
+ }
382
625
  return {
383
626
  ownership
384
627
  };
@@ -412,13 +655,8 @@ export function createAiJobImportStep(deps = {}) {
412
655
  url: entry.url,
413
656
  reason: siteImportLeftOutReason(entry.reason, entry.status)
414
657
  }));
415
- if (!crawled.pages.length) {
416
- // A site its bot protection keeps AglynBot off is up: say what lets AglynBot in, not to check that it is.
417
- const blocked = skipped.some((entry)=>entry.reason === 'blocked');
418
- return unspent({
419
- review: waveReview(AI_SITE_IMPORT_COPY[blocked ? 'blocked' : 'nothing'](domain))
420
- });
421
- }
658
+ // Home first (AGL-4083): a site read without its home page plans nothing, quotes nothing and spends nothing.
659
+ const verdict = aiSiteImportReadVerdict(crawled);
422
660
  const inventory = aiSiteImportInventory({
423
661
  domain,
424
662
  siteName: await siteNameOf(firestore, hostId),
@@ -435,11 +673,36 @@ export function createAiJobImportStep(deps = {}) {
435
673
  stoppedBy: crawled.stoppedBy,
436
674
  pageLimit: room.limit,
437
675
  existingPages: room.used,
676
+ verdict,
438
677
  mintId
439
678
  });
440
- const ledger = aiSiteImportLedger(inventory);
441
- const reviewId = await review('read', inventory, ledger);
442
- const next = _extends({}, inventory, {
679
+ if (aiSiteImportReadStops(inventory.verdict)) {
680
+ var _aiSiteImportReadVerdictReason, _aiSiteImportReadVerdictMessage;
681
+ // Check again is the read again: the job waits, with why and what to do, and no ledger.
682
+ return unspent({
683
+ items: [],
684
+ siteImport: inventory,
685
+ review: {
686
+ reason: (_aiSiteImportReadVerdictReason = aiSiteImportReadVerdictReason(inventory.verdict)) != null ? _aiSiteImportReadVerdictReason : 'unreadable',
687
+ message: (_aiSiteImportReadVerdictMessage = aiSiteImportReadVerdictMessage(inventory.verdict, domain)) != null ? _aiSiteImportReadVerdictMessage : AI_SITE_IMPORT_COPY.nothing(domain),
688
+ findings: []
689
+ }
690
+ });
691
+ }
692
+ // How each page is built, from its main region's own words (AGL-4084), and what the home page says of the site.
693
+ const mainWords = new Map(crawled.pages.map((page)=>[
694
+ page.url,
695
+ siteImportPageWords({
696
+ title: '',
697
+ blocks: page.blocks.filter((block)=>block.region === 'main')
698
+ })
699
+ ]));
700
+ const planned = _extends({}, aiSiteImportWithBuilds(inventory, mainWords), {
701
+ home: aiSiteImportHomeOf(crawled)
702
+ });
703
+ const ledger = aiSiteImportLedger(planned);
704
+ const reviewId = await review('read', planned, ledger);
705
+ const next = _extends({}, planned, {
443
706
  reviewId
444
707
  });
445
708
  return unspent({
@@ -455,7 +718,9 @@ export function createAiJobImportStep(deps = {}) {
455
718
  // ── 2. Start a wave ──
456
719
  if (work.kind === 'start-wave') {
457
720
  var _context_org1;
458
- const passed = await gate();
721
+ // A wave "Start every remaining wave" started after the one the person did is that same start.
722
+ const counted = !(state.autoContinue && typeof state.autoContinueFrom === 'number' && work.wave.index > state.autoContinueFrom);
723
+ const passed = await gate(counted);
459
724
  if (!('ownership' in passed)) return passed;
460
725
  const wave = work.wave;
461
726
  const pages = wave.slots.map((slot)=>state.pages.find((page)=>page.slot === slot)).filter((page)=>!!page);
@@ -505,7 +770,7 @@ export function createAiJobImportStep(deps = {}) {
505
770
  note: 'Not built: no page of this wave could be read.'
506
771
  }) : row);
507
772
  }
508
- const started = aiSiteImportWaveStarted(state, wave.index, nowIso, reads);
773
+ const started = aiSiteImportWithBuilds(aiSiteImportWaveStarted(state, wave.index, nowIso, reads));
509
774
  await review('wave-started', started, ledger, wave.index);
510
775
  const running = started.waves.find((entry)=>entry.index === wave.index);
511
776
  return closing(started, ledger, running, unspent({
@@ -530,11 +795,40 @@ export function createAiJobImportStep(deps = {}) {
530
795
  cutShort: crawled.stoppedBy === 'time'
531
796
  });
532
797
  const ledger = withLeftOutRows(items, reads);
533
- return closing(aiSiteImportPagesRead(state, reads), ledger, wave, unspent({
798
+ return closing(aiSiteImportWithBuilds(aiSiteImportPagesRead(state, reads)), ledger, wave, unspent({
534
799
  items: ledger
535
800
  }));
536
801
  }
537
- // ── 3. The header and footer ──
802
+ // ── 3. The look, before anything of the first wave is built (AGL-4084): no model ──
803
+ const firstWave = ((_state_waves_ = state.waves[0]) == null ? void 0 : _state_waves_.index) === wave.index;
804
+ if (firstWave && !state.look && state.home && (work.kind === 'frame' || work.kind === 'images' || work.kind === 'page')) {
805
+ var _deps_crawlSeams, _deps_crawlSeams1;
806
+ const look = await runLook(_extends({
807
+ firestore,
808
+ hostId,
809
+ orgId: job.orgId,
810
+ uid: job.createdBy,
811
+ jobId: job.$id,
812
+ domain,
813
+ home: state.home,
814
+ at: nowIso
815
+ }, signal ? {
816
+ signal
817
+ } : {}), _extends({
818
+ ingest: ingestOf()
819
+ }, ((_deps_crawlSeams = deps.crawlSeams) == null ? void 0 : _deps_crawlSeams.fetch) ? {
820
+ fetch: deps.crawlSeams.fetch
821
+ } : {}, ((_deps_crawlSeams1 = deps.crawlSeams) == null ? void 0 : _deps_crawlSeams1.headersFor) ? {
822
+ headersFor: deps.crawlSeams.headersFor
823
+ } : {}, deps.lookDeps));
824
+ return unspent({
825
+ siteImport: _extends({}, state, {
826
+ look
827
+ }),
828
+ continue: true
829
+ });
830
+ }
831
+ // ── 4. The header and footer ──
538
832
  if (work.kind === 'frame') {
539
833
  const runner = runnerFor('layout');
540
834
  if (!runner) {
@@ -672,7 +966,19 @@ export function createAiJobImportStep(deps = {}) {
672
966
  outputs: spent.outputs.map((output)=>output.id)
673
967
  };
674
968
  }
675
- const settledState = page ? aiSiteImportPageSettled(current, slot) : current;
969
+ // What came through, for the row that says it beside what the old page had (AGL-4084).
970
+ let withBrought = current;
971
+ if (page && item.status === 'succeeded') {
972
+ const words = await draftWordsOf(firestore, hostId, page.draftId).catch(()=>null);
973
+ if (words !== null) withBrought = _extends({}, current, {
974
+ pages: current.pages.map((entry)=>entry.slot === slot ? _extends({}, entry, {
975
+ brought: {
976
+ words
977
+ }
978
+ }) : entry)
979
+ });
980
+ }
981
+ const settledState = page ? aiSiteImportPageSettled(withBrought, slot) : withBrought;
676
982
  return closing(settledState, aiApplyJobItemRecord(items, item, 0, now), wave, _extends({}, spent, {
677
983
  outputs: item.status === 'succeeded' ? spent.outputs : [],
678
984
  item
@@ -751,6 +1057,22 @@ function siteImportReadOrEmpty(page, at) {
751
1057
  if (siteImportPageWords(page) < AI_SITE_IMPORT_MIN_WORDS && !page.images.length) return 'empty';
752
1058
  return siteImportPageRead(page, at);
753
1059
  }
1060
+ /**
1061
+ * "Start every remaining wave" (AGL-4083, wired by AGL-4084), as the resume
1062
+ * door writes it onto an import waiting to start its next wave: every
1063
+ * remaining wave starts after the one before it closes, with no review
1064
+ * between them, and the person's one start is the one the day's limit
1065
+ * counts. `null` when the job is not an import waiting for a wave.
1066
+ */ export function aiSiteImportStartAllUpdate(job) {
1067
+ var _job_review, _job_siteImport;
1068
+ if (job.kind !== 'import' || job.status !== 'needs_review' || ((_job_review = job.review) == null ? void 0 : _job_review.reason) !== 'wave') return null;
1069
+ const next = (_job_siteImport = job.siteImport) == null ? void 0 : _job_siteImport.waves.find((wave)=>wave.status === 'waiting');
1070
+ if (!next) return null;
1071
+ return {
1072
+ 'siteImport.autoContinue': true,
1073
+ 'siteImport.autoContinueFrom': next.index
1074
+ };
1075
+ }
754
1076
  /**
755
1077
  * What an import asks before it exists and before each wave (AGL-3976): the
756
1078
  * release flag, a site to bring it into, a paid plan, the owner or an admin,