@aglyn/plugins-ai 1.0.0-beta.271 → 1.0.0-beta.273

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 (132) 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 +3 -0
  4. package/src/lib/activity/ai-activity-actions.js.map +1 -1
  5. package/src/lib/components/ai-site-build-page.component.js +18 -0
  6. package/src/lib/components/ai-site-build-page.component.js.map +1 -1
  7. package/src/lib/components/ai-site-import-job.component.d.ts +41 -0
  8. package/src/lib/components/ai-site-import-job.component.js +707 -0
  9. package/src/lib/components/ai-site-import-job.component.js.map +1 -0
  10. package/src/lib/components/ai-site-import-start.component.d.ts +64 -0
  11. package/src/lib/components/ai-site-import-start.component.js +335 -0
  12. package/src/lib/components/ai-site-import-start.component.js.map +1 -0
  13. package/src/lib/components/ai-site-ownership-proof.component.d.ts +42 -0
  14. package/src/lib/components/ai-site-ownership-proof.component.js +353 -0
  15. package/src/lib/components/ai-site-ownership-proof.component.js.map +1 -0
  16. package/src/lib/components/ai-site-start-card.component.js +329 -252
  17. package/src/lib/components/ai-site-start-card.component.js.map +1 -1
  18. package/src/lib/jobs/ai-empty-site-sweep.d.ts +12 -1
  19. package/src/lib/jobs/ai-empty-site-sweep.js +15 -3
  20. package/src/lib/jobs/ai-empty-site-sweep.js.map +1 -1
  21. package/src/lib/jobs/ai-job-drafts.d.ts +14 -0
  22. package/src/lib/jobs/ai-job-drafts.js +24 -0
  23. package/src/lib/jobs/ai-job-drafts.js.map +1 -1
  24. package/src/lib/jobs/ai-job-import-step.d.ts +136 -0
  25. package/src/lib/jobs/ai-job-import-step.js +809 -0
  26. package/src/lib/jobs/ai-job-import-step.js.map +1 -0
  27. package/src/lib/jobs/ai-job-page-language.d.ts +39 -1
  28. package/src/lib/jobs/ai-job-page-language.js +62 -4
  29. package/src/lib/jobs/ai-job-page-language.js.map +1 -1
  30. package/src/lib/jobs/ai-job-page-step.d.ts +2 -2
  31. package/src/lib/jobs/ai-job-page-step.js +26 -4
  32. package/src/lib/jobs/ai-job-page-step.js.map +1 -1
  33. package/src/lib/jobs/ai-job-seo-step.js +8 -4
  34. package/src/lib/jobs/ai-job-seo-step.js.map +1 -1
  35. package/src/lib/jobs/ai-job-site-datasets.d.ts +39 -1
  36. package/src/lib/jobs/ai-job-site-datasets.js +111 -15
  37. package/src/lib/jobs/ai-job-site-datasets.js.map +1 -1
  38. package/src/lib/jobs/ai-job-site-step.d.ts +12 -3
  39. package/src/lib/jobs/ai-job-site-step.js +85 -11
  40. package/src/lib/jobs/ai-job-site-step.js.map +1 -1
  41. package/src/lib/jobs/ai-job-text-step.d.ts +15 -0
  42. package/src/lib/jobs/ai-job-text-step.js.map +1 -1
  43. package/src/lib/jobs/ai-jobs.d.ts +8 -0
  44. package/src/lib/jobs/ai-jobs.js +19 -3
  45. package/src/lib/jobs/ai-jobs.js.map +1 -1
  46. package/src/lib/jobs/ai-layout-owner-photos.d.ts +16 -1
  47. package/src/lib/jobs/ai-layout-owner-photos.js +49 -2
  48. package/src/lib/jobs/ai-layout-owner-photos.js.map +1 -1
  49. package/src/lib/jobs/ai-layout-stock-photos.d.ts +35 -0
  50. package/src/lib/jobs/ai-layout-stock-photos.js +114 -43
  51. package/src/lib/jobs/ai-layout-stock-photos.js.map +1 -1
  52. package/src/lib/jobs/ai-site-late-photos.d.ts +143 -0
  53. package/src/lib/jobs/ai-site-late-photos.js +486 -0
  54. package/src/lib/jobs/ai-site-late-photos.js.map +1 -0
  55. package/src/lib/jobs/ai-site-publish.d.ts +18 -0
  56. package/src/lib/jobs/ai-site-publish.js +123 -5
  57. package/src/lib/jobs/ai-site-publish.js.map +1 -1
  58. package/src/lib/jobs/ai-theme-brand-inputs.d.ts +61 -3
  59. package/src/lib/jobs/ai-theme-brand-inputs.js +117 -27
  60. package/src/lib/jobs/ai-theme-brand-inputs.js.map +1 -1
  61. package/src/lib/jobs/fixtures/ai-site-late-photos-laurel-fork.d.ts +83 -0
  62. package/src/lib/jobs/fixtures/ai-site-late-photos-laurel-fork.js +1553 -0
  63. package/src/lib/jobs/fixtures/ai-site-late-photos-laurel-fork.js.map +1 -0
  64. package/src/lib/layout-language/ai-layout-pictures.d.ts +50 -13
  65. package/src/lib/layout-language/ai-layout-pictures.js +81 -19
  66. package/src/lib/layout-language/ai-layout-pictures.js.map +1 -1
  67. package/src/lib/model/ai-credit-estimate.d.ts +20 -0
  68. package/src/lib/model/ai-credit-estimate.js +13 -0
  69. package/src/lib/model/ai-credit-estimate.js.map +1 -1
  70. package/src/lib/model/ai-job-activity.d.ts +2 -2
  71. package/src/lib/model/ai-job-activity.js +6 -4
  72. package/src/lib/model/ai-job-activity.js.map +1 -1
  73. package/src/lib/model/ai-job-notice.js +18 -4
  74. package/src/lib/model/ai-job-notice.js.map +1 -1
  75. package/src/lib/model/ai-jobs.types.d.ts +39 -2
  76. package/src/lib/model/ai-jobs.types.js +2 -1
  77. package/src/lib/model/ai-jobs.types.js.map +1 -1
  78. package/src/lib/model/ai-site-import-view.d.ts +130 -0
  79. package/src/lib/model/ai-site-import-view.js +182 -0
  80. package/src/lib/model/ai-site-import-view.js.map +1 -0
  81. package/src/lib/model/ai-site-import.d.ts +302 -0
  82. package/src/lib/model/ai-site-import.js +526 -0
  83. package/src/lib/model/ai-site-import.js.map +1 -0
  84. package/src/lib/model/ai-site-photos.d.ts +119 -0
  85. package/src/lib/model/ai-site-photos.js +128 -0
  86. package/src/lib/model/ai-site-photos.js.map +1 -0
  87. package/src/lib/model/ai-site-start.d.ts +22 -9
  88. package/src/lib/model/ai-site-start.js +64 -23
  89. package/src/lib/model/ai-site-start.js.map +1 -1
  90. package/src/lib/runtime/ai-doctrine-validators.d.ts +3 -1
  91. package/src/lib/runtime/ai-doctrine-validators.js +3 -1
  92. package/src/lib/runtime/ai-doctrine-validators.js.map +1 -1
  93. package/src/lib/runtime/seo-fields.d.ts +29 -4
  94. package/src/lib/runtime/seo-fields.js +58 -11
  95. package/src/lib/runtime/seo-fields.js.map +1 -1
  96. package/src/lib/server/ai-jobs-route.js +11 -0
  97. package/src/lib/server/ai-jobs-route.js.map +1 -1
  98. package/src/lib/server/ai-site-import-route.d.ts +89 -0
  99. package/src/lib/server/ai-site-import-route.js +356 -0
  100. package/src/lib/server/ai-site-import-route.js.map +1 -0
  101. package/src/lib/server.js +14 -0
  102. package/src/lib/server.js.map +1 -1
  103. package/src/lib/site-import/fixtures/site-import-crawl-recordings.d.ts +45 -0
  104. package/src/lib/site-import/fixtures/site-import-crawl-recordings.js +313 -0
  105. package/src/lib/site-import/fixtures/site-import-crawl-recordings.js.map +1 -0
  106. package/src/lib/site-import/fixtures/site-import-wave-recordings.d.ts +50 -0
  107. package/src/lib/site-import/fixtures/site-import-wave-recordings.js +217 -0
  108. package/src/lib/site-import/fixtures/site-import-wave-recordings.js.map +1 -0
  109. package/src/lib/site-import/site-import-crawl.d.ts +163 -0
  110. package/src/lib/site-import/site-import-crawl.js +467 -0
  111. package/src/lib/site-import/site-import-crawl.js.map +1 -0
  112. package/src/lib/site-import/site-import-flag.d.ts +23 -0
  113. package/src/lib/site-import/site-import-flag.js +23 -0
  114. package/src/lib/site-import/site-import-flag.js.map +1 -0
  115. package/src/lib/site-import/site-import-html.d.ts +94 -0
  116. package/src/lib/site-import/site-import-html.js +462 -0
  117. package/src/lib/site-import/site-import-html.js.map +1 -0
  118. package/src/lib/site-import/site-import-images.d.ts +54 -0
  119. package/src/lib/site-import/site-import-images.js +204 -0
  120. package/src/lib/site-import/site-import-images.js.map +1 -0
  121. package/src/lib/site-import/site-import-page.d.ts +48 -0
  122. package/src/lib/site-import/site-import-page.js +150 -0
  123. package/src/lib/site-import/site-import-page.js.map +1 -0
  124. package/src/lib/site-import/site-import-review.d.ts +40 -0
  125. package/src/lib/site-import/site-import-review.js +149 -0
  126. package/src/lib/site-import/site-import-review.js.map +1 -0
  127. package/src/lib/site-import/site-import-robots.d.ts +52 -0
  128. package/src/lib/site-import/site-import-robots.js +126 -0
  129. package/src/lib/site-import/site-import-robots.js.map +1 -0
  130. package/src/lib/tools/ai-seo-tool.d.ts +25 -1
  131. package/src/lib/tools/ai-seo-tool.js +61 -0
  132. package/src/lib/tools/ai-seo-tool.js.map +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../../libs/plugins/ai/src/lib/jobs/fixtures/ai-site-late-photos-laurel-fork.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { NodesMap } from '@aglyn/aglyn/types/nodes'\n\n/**\n * THE V1.0.0-BETA.271 LAUREL FORK PHOTOGRAPHY GUIDED START (AGL-3988), as\n * production left it: workspace jWmGooWE3L, host zVfToa7iIQ\n * (laurel-fork-photography.aglyn.app), job yZUqIPmjIZ, 2026-10-19 23:05Z,\n * \"a wedding and family photographer in the Blue Ridge Mountains who books\n * sessions and elopements\". Read back read-only from production's job and\n * host documents after the job finished.\n *\n * - `LAUREL_FORK_PAGES`: each published page's tree, cut to its sections,\n * its pictures and every node between them (frames keep their shape), in\n * document order. Copy and styling are left out; nothing else is changed.\n * - `LAUREL_FORK_PHOTOS`: the ten stock photos the job copied into the\n * site's library (23:08:29 to 23:13:30), with the query that found each.\n * - `LAUREL_FORK_COVERS`: the twelve \"Gallery collections\" records, in\n * order, every one on a starter (the office team and the desk in turn).\n * - `LAUREL_FORK_REFUSALS`: the Pixabay ids whose downloads the console's\n * request logs show pixabay.com's Cloudflare refusing with 429 (after four\n * tries each), by the beat that sent them. The logs name the photo, not\n * the slot: the covers' beat built the datasets (23:07:09), the next beat\n * the home page (23:08:11).\n */\n\n/** The site's share image the publish left: the starter the site was created with. */\nexport const LAUREL_FORK_SHARE_IMAGE = { image: '/_static/starter/hero-team.jpg', imageWidth: 1600, imageHeight: 1067, imageAlt: 'A small team working together around a table in a bright office' } as const\n\n/** The pages the start put live, in the site's order, each cut to its pictures. */\nexport const LAUREL_FORK_PAGES: ReadonlyArray<{ id: string; title: string; slug: string; nodes: NodesMap }> = [\n {\n id: '5opPRLVW_U',\n title: 'Home',\n slug: '/',\n nodes: {\n '_@_': { $id: '_@_', componentId: 'div', nodes: ['ai-5opPRLVW_U-section-1', 'ai-5opPRLVW_U-section-2', 'ai-5opPRLVW_U-section-3', 'ai-5opPRLVW_U-section-4', 'ai-5opPRLVW_U-section-5', 'ai-5opPRLVW_U-section-6'] },\n 'ai-5opPRLVW_U-section-1': { $id: 'ai-5opPRLVW_U-section-1', componentId: 'section', parentId: '_@_', nodes: ['bUKvvYVspl'] },\n 'ai-5opPRLVW_U-section-2': { $id: 'ai-5opPRLVW_U-section-2', componentId: 'section', parentId: '_@_', nodes: ['kZnxgtEEwW'] },\n 'ai-5opPRLVW_U-section-3': { $id: 'ai-5opPRLVW_U-section-3', componentId: 'section', parentId: '_@_', nodes: ['rPNWWfbfQf'] },\n 'ai-5opPRLVW_U-section-4': { $id: 'ai-5opPRLVW_U-section-4', componentId: 'section', parentId: '_@_', nodes: [] },\n 'ai-5opPRLVW_U-section-5': { $id: 'ai-5opPRLVW_U-section-5', componentId: 'section', parentId: '_@_', nodes: ['k0XulehpfP'] },\n 'ai-5opPRLVW_U-section-6': { $id: 'ai-5opPRLVW_U-section-6', componentId: 'section', parentId: '_@_', nodes: ['p9fSYaMS_L'], sx: { position: 'relative' } },\n bUKvvYVspl: { $id: 'bUKvvYVspl', componentId: 'muiContainer', parentId: 'ai-5opPRLVW_U-section-1', nodes: ['qDfEd0AZCr'] },\n kZnxgtEEwW: { $id: 'kZnxgtEEwW', componentId: 'muiContainer', parentId: 'ai-5opPRLVW_U-section-2', nodes: ['AyvCN0Vv9Z'] },\n rPNWWfbfQf: { $id: 'rPNWWfbfQf', componentId: 'muiContainer', parentId: 'ai-5opPRLVW_U-section-3', nodes: ['Ffnn6cK5Ga'] },\n k0XulehpfP: { $id: 'k0XulehpfP', componentId: 'muiContainer', parentId: 'ai-5opPRLVW_U-section-5', nodes: ['FR7WdQd4sZ'] },\n p9fSYaMS_L: { $id: 'p9fSYaMS_L', componentId: 'muiBox', parentId: 'ai-5opPRLVW_U-section-6', nodes: ['Hg-Yoxi45H'], sx: { position: 'absolute', width: '100%', height: '100%' } },\n qDfEd0AZCr: { $id: 'qDfEd0AZCr', componentId: 'muiStack', parentId: 'bUKvvYVspl', nodes: ['ECW4_DSLWt'] },\n AyvCN0Vv9Z: { $id: 'AyvCN0Vv9Z', componentId: 'muiStack', parentId: 'kZnxgtEEwW', nodes: ['QwlyU6yYqS'] },\n Ffnn6cK5Ga: { $id: 'Ffnn6cK5Ga', componentId: 'muiGrid', parentId: 'rPNWWfbfQf', nodes: ['bAJ25yBgWt'] },\n FR7WdQd4sZ: { $id: 'FR7WdQd4sZ', componentId: 'muiStack', parentId: 'k0XulehpfP', nodes: ['mTWJuHpqNc'] },\n 'Hg-Yoxi45H': { $id: 'Hg-Yoxi45H', componentId: 'image', parentId: 'p9fSYaMS_L', nodes: [], props: { alt: 'A couple at a wedding', src: 'media:zVfToa7iIQ/20t9SUxyKJ', intrinsicWidth: 1280, intrinsicHeight: 720 } },\n ECW4_DSLWt: { $id: 'ECW4_DSLWt', componentId: 'muiBox', parentId: 'qDfEd0AZCr', nodes: ['MDpjUplylc'], sx: { position: 'relative', aspectRatio: { xs: '4 / 3', md: '21 / 9' } } },\n QwlyU6yYqS: { $id: 'QwlyU6yYqS', componentId: 'muiBox', parentId: 'AyvCN0Vv9Z', nodes: ['-AJupgvXns'] },\n bAJ25yBgWt: { $id: 'bAJ25yBgWt', componentId: 'muiGrid', parentId: 'Ffnn6cK5Ga', nodes: ['21gPMGZVtp'] },\n mTWJuHpqNc: { $id: 'mTWJuHpqNc', componentId: 'muiGrid', parentId: 'FR7WdQd4sZ', nodes: ['6fk0o-tRgv'] },\n MDpjUplylc: { $id: 'MDpjUplylc', componentId: 'image', parentId: 'ECW4_DSLWt', nodes: [], props: { alt: 'A small team working together around a table in a bright office', src: '/_static/starter/hero-team.jpg', intrinsicWidth: 1600, intrinsicHeight: 1067, loading: 'eager' } },\n '-AJupgvXns': { $id: '-AJupgvXns', componentId: 'muiStack', parentId: 'QwlyU6yYqS', nodes: ['pfhzMkYkWV'] },\n '21gPMGZVtp': { $id: '21gPMGZVtp', componentId: 'muiBox', parentId: 'bAJ25yBgWt', nodes: ['A60C_InPsl'], sx: { position: 'relative', aspectRatio: '4 / 3' } },\n '6fk0o-tRgv': { $id: '6fk0o-tRgv', componentId: 'muiGrid', parentId: 'mTWJuHpqNc', nodes: ['MDsN8QXzkJ'] },\n pfhzMkYkWV: { $id: 'pfhzMkYkWV', componentId: 'image', parentId: '-AJupgvXns', nodes: [], sx: { aspectRatio: '4 / 5' }, props: { alt: '{{item.image_description}}', loading: 'lazy', src: '{{item.image}}' } },\n A60C_InPsl: { $id: 'A60C_InPsl', componentId: 'image', parentId: '21gPMGZVtp', nodes: [], sx: { position: 'absolute', width: '100%', height: '100%' }, props: { alt: 'A tidy desk with a laptop, a lamp and fresh flowers', src: '/_static/starter/gallery-desk.jpg', intrinsicWidth: 1600, intrinsicHeight: 1068 } },\n MDsN8QXzkJ: { $id: 'MDsN8QXzkJ', componentId: 'muiStack', parentId: '6fk0o-tRgv', nodes: ['HpkOCRgkaU'] },\n HpkOCRgkaU: { $id: 'HpkOCRgkaU', componentId: 'image', parentId: 'MDsN8QXzkJ', nodes: [], sx: { aspectRatio: { xs: '4 / 3', md: '4 / 5' } }, props: { alt: 'A family in the mountains', src: 'media:zVfToa7iIQ/Dno5tXH307', intrinsicWidth: 853, intrinsicHeight: 1280 } },\n } as unknown as NodesMap,\n },\n {\n id: 'GLoK3JfOCj',\n title: 'Galleries',\n slug: '/galleries',\n nodes: {\n '_@_': { $id: '_@_', componentId: 'div', nodes: ['ai-GLoK3JfOCj-section-1', 'ai-GLoK3JfOCj-section-2', 'ai-GLoK3JfOCj-section-3', 'ai-GLoK3JfOCj-section-4'] },\n 'ai-GLoK3JfOCj-section-1': { $id: 'ai-GLoK3JfOCj-section-1', componentId: 'section', parentId: '_@_', nodes: ['bE7h5VR4fS'] },\n 'ai-GLoK3JfOCj-section-2': { $id: 'ai-GLoK3JfOCj-section-2', componentId: 'section', parentId: '_@_', nodes: ['keKfGYqdrv'] },\n 'ai-GLoK3JfOCj-section-3': { $id: 'ai-GLoK3JfOCj-section-3', componentId: 'section', parentId: '_@_', nodes: ['T0-Kc1k-5E'] },\n 'ai-GLoK3JfOCj-section-4': { $id: 'ai-GLoK3JfOCj-section-4', componentId: 'section', parentId: '_@_', nodes: ['m7rhszuwJ_'], sx: { position: 'relative' } },\n bE7h5VR4fS: { $id: 'bE7h5VR4fS', componentId: 'muiContainer', parentId: 'ai-GLoK3JfOCj-section-1', nodes: ['61515BBhnA'] },\n keKfGYqdrv: { $id: 'keKfGYqdrv', componentId: 'muiContainer', parentId: 'ai-GLoK3JfOCj-section-2', nodes: ['dmaHvXXLog'] },\n 'T0-Kc1k-5E': { $id: 'T0-Kc1k-5E', componentId: 'muiContainer', parentId: 'ai-GLoK3JfOCj-section-3', nodes: ['rRaTuKKtV_'] },\n m7rhszuwJ_: { $id: 'm7rhszuwJ_', componentId: 'muiBox', parentId: 'ai-GLoK3JfOCj-section-4', nodes: ['wt_B806Cz2'], sx: { position: 'absolute', width: '100%', height: '100%' } },\n '61515BBhnA': { $id: '61515BBhnA', componentId: 'muiStack', parentId: 'bE7h5VR4fS', nodes: ['lxEoMaVorh'] },\n dmaHvXXLog: { $id: 'dmaHvXXLog', componentId: 'muiStack', parentId: 'keKfGYqdrv', nodes: ['vjw8N7hFAS'] },\n rRaTuKKtV_: { $id: 'rRaTuKKtV_', componentId: 'muiStack', parentId: 'T0-Kc1k-5E', nodes: ['lrqoLGssJc'] },\n wt_B806Cz2: { $id: 'wt_B806Cz2', componentId: 'image', parentId: 'm7rhszuwJ_', nodes: [], props: { alt: 'A father with a son in the mountains', src: 'media:zVfToa7iIQ/oKqg7KVmFs', intrinsicWidth: 1280, intrinsicHeight: 820 } },\n lxEoMaVorh: { $id: 'lxEoMaVorh', componentId: 'muiBox', parentId: '61515BBhnA', nodes: ['8Z0J2Dvkc4'], sx: { position: 'relative', aspectRatio: { xs: '16 / 9', md: '3 / 1' } } },\n vjw8N7hFAS: { $id: 'vjw8N7hFAS', componentId: 'muiBox', parentId: 'dmaHvXXLog', nodes: ['bctLBlZwCn'] },\n lrqoLGssJc: { $id: 'lrqoLGssJc', componentId: 'muiBox', parentId: 'rRaTuKKtV_', nodes: ['BuK5C-zbWh'] },\n '8Z0J2Dvkc4': { $id: '8Z0J2Dvkc4', componentId: 'image', parentId: 'lxEoMaVorh', nodes: [], props: { alt: 'A flower at a wedding', src: 'media:zVfToa7iIQ/adqePe-iIO', intrinsicWidth: 1280, intrinsicHeight: 853, loading: 'eager' } },\n bctLBlZwCn: { $id: 'bctLBlZwCn', componentId: 'muiStack', parentId: 'vjw8N7hFAS', nodes: ['5VjwlqdQsP'] },\n 'BuK5C-zbWh': { $id: 'BuK5C-zbWh', componentId: 'muiStack', parentId: 'lrqoLGssJc', nodes: ['rmPoyiqnm1'] },\n '5VjwlqdQsP': { $id: '5VjwlqdQsP', componentId: 'image', parentId: 'bctLBlZwCn', nodes: [], sx: { aspectRatio: '4 / 5' }, props: { alt: '{{item.image_description}}', loading: 'lazy', src: '{{item.image}}' } },\n rmPoyiqnm1: { $id: 'rmPoyiqnm1', componentId: 'image', parentId: 'BuK5C-zbWh', nodes: [], sx: { aspectRatio: '4 / 5' }, props: { alt: '{{item.image_description}}', loading: 'lazy', src: '{{item.image}}' } },\n } as unknown as NodesMap,\n },\n {\n id: 'KgHi9fbWpy',\n title: 'Packages',\n slug: '/packages',\n nodes: {\n '_@_': { $id: '_@_', componentId: 'div', nodes: ['ai-KgHi9fbWpy-section-1', 'ai-KgHi9fbWpy-section-2', 'ai-KgHi9fbWpy-section-3', 'ai-KgHi9fbWpy-section-4'] },\n 'ai-KgHi9fbWpy-section-1': { $id: 'ai-KgHi9fbWpy-section-1', componentId: 'section', parentId: '_@_', nodes: ['KcpbqM5HGe'] },\n 'ai-KgHi9fbWpy-section-2': { $id: 'ai-KgHi9fbWpy-section-2', componentId: 'section', parentId: '_@_', nodes: [] },\n 'ai-KgHi9fbWpy-section-3': { $id: 'ai-KgHi9fbWpy-section-3', componentId: 'section', parentId: '_@_', nodes: [] },\n 'ai-KgHi9fbWpy-section-4': { $id: 'ai-KgHi9fbWpy-section-4', componentId: 'section', parentId: '_@_', nodes: ['RUCfDEpGHe'], sx: { position: 'relative' } },\n KcpbqM5HGe: { $id: 'KcpbqM5HGe', componentId: 'muiContainer', parentId: 'ai-KgHi9fbWpy-section-1', nodes: ['FqJTPKOFhc'] },\n RUCfDEpGHe: { $id: 'RUCfDEpGHe', componentId: 'muiBox', parentId: 'ai-KgHi9fbWpy-section-4', nodes: ['JYPG2A7rAM'], sx: { position: 'absolute', width: '100%', height: '100%' } },\n FqJTPKOFhc: { $id: 'FqJTPKOFhc', componentId: 'muiStack', parentId: 'KcpbqM5HGe', nodes: ['A0jJJciYYl'] },\n JYPG2A7rAM: { $id: 'JYPG2A7rAM', componentId: 'image', parentId: 'RUCfDEpGHe', nodes: [], props: { alt: 'A couple at sunset', src: 'media:zVfToa7iIQ/RyW7TuJfq4', intrinsicWidth: 1280, intrinsicHeight: 1117 } },\n A0jJJciYYl: { $id: 'A0jJJciYYl', componentId: 'muiBox', parentId: 'FqJTPKOFhc', nodes: ['TSZstV47eS'], sx: { position: 'relative', aspectRatio: { xs: '16 / 9', md: '3 / 1' } } },\n TSZstV47eS: { $id: 'TSZstV47eS', componentId: 'image', parentId: 'A0jJJciYYl', nodes: [], props: { alt: 'An aisle at a wedding', src: 'media:zVfToa7iIQ/Q_imBRl0u7', intrinsicWidth: 1280, intrinsicHeight: 854, loading: 'eager' } },\n } as unknown as NodesMap,\n },\n {\n id: '2V3XE8mq50',\n title: 'About',\n slug: '/about',\n nodes: {\n '_@_': { $id: '_@_', componentId: 'div', nodes: ['ai-2V3XE8mq50-section-1', 'ai-2V3XE8mq50-section-2', 'ai-2V3XE8mq50-section-3', 'ai-2V3XE8mq50-section-4', 'ai-2V3XE8mq50-section-5'] },\n 'ai-2V3XE8mq50-section-1': { $id: 'ai-2V3XE8mq50-section-1', componentId: 'section', parentId: '_@_', nodes: ['_qdKnXC6SG'] },\n 'ai-2V3XE8mq50-section-2': { $id: 'ai-2V3XE8mq50-section-2', componentId: 'section', parentId: '_@_', nodes: ['DNXBX6Rjty'] },\n 'ai-2V3XE8mq50-section-3': { $id: 'ai-2V3XE8mq50-section-3', componentId: 'section', parentId: '_@_', nodes: ['P05uXIH3ay'] },\n 'ai-2V3XE8mq50-section-4': { $id: 'ai-2V3XE8mq50-section-4', componentId: 'section', parentId: '_@_', nodes: ['laVjLPJZ4L'] },\n 'ai-2V3XE8mq50-section-5': { $id: 'ai-2V3XE8mq50-section-5', componentId: 'section', parentId: '_@_', nodes: [] },\n _qdKnXC6SG: { $id: '_qdKnXC6SG', componentId: 'muiContainer', parentId: 'ai-2V3XE8mq50-section-1', nodes: ['uPTgcF6jUS'] },\n DNXBX6Rjty: { $id: 'DNXBX6Rjty', componentId: 'muiContainer', parentId: 'ai-2V3XE8mq50-section-2', nodes: ['7W5I4m7ArO'] },\n P05uXIH3ay: { $id: 'P05uXIH3ay', componentId: 'muiContainer', parentId: 'ai-2V3XE8mq50-section-3', nodes: ['3s62hrq9-J'] },\n laVjLPJZ4L: { $id: 'laVjLPJZ4L', componentId: 'muiContainer', parentId: 'ai-2V3XE8mq50-section-4', nodes: ['o66WNW1fIn'] },\n uPTgcF6jUS: { $id: 'uPTgcF6jUS', componentId: 'muiStack', parentId: '_qdKnXC6SG', nodes: ['Kg7ruI_Meh'] },\n '7W5I4m7ArO': { $id: '7W5I4m7ArO', componentId: 'muiGrid', parentId: 'DNXBX6Rjty', nodes: ['QWuFAJeRmO'] },\n '3s62hrq9-J': { $id: '3s62hrq9-J', componentId: 'muiStack', parentId: 'P05uXIH3ay', nodes: ['vFwen5PXdE'] },\n o66WNW1fIn: { $id: 'o66WNW1fIn', componentId: 'muiStack', parentId: 'laVjLPJZ4L', nodes: ['ermJcuJZ3n'] },\n Kg7ruI_Meh: { $id: 'Kg7ruI_Meh', componentId: 'muiBox', parentId: 'uPTgcF6jUS', nodes: ['w2coL2n_tN'], sx: { position: 'relative', aspectRatio: { xs: '16 / 9', md: '3 / 1' } } },\n QWuFAJeRmO: { $id: 'QWuFAJeRmO', componentId: 'muiGrid', parentId: '7W5I4m7ArO', nodes: ['oXdwyBK5Gj'] },\n vFwen5PXdE: { $id: 'vFwen5PXdE', componentId: 'muiGrid', parentId: '3s62hrq9-J', nodes: ['R8y0_H5y1r', 'qh6v4JMuvM', 'ss9ZdrPkPO'] },\n ermJcuJZ3n: { $id: 'ermJcuJZ3n', componentId: 'muiGrid', parentId: 'o66WNW1fIn', nodes: ['zNjq_ENdsA', 'xHGY5h74hw', 'OXk2tX7oIo'] },\n w2coL2n_tN: { $id: 'w2coL2n_tN', componentId: 'image', parentId: 'Kg7ruI_Meh', nodes: [], props: { alt: 'A father with a son in the mountains', src: 'media:zVfToa7iIQ/oKqg7KVmFs', intrinsicWidth: 1280, intrinsicHeight: 820, loading: 'eager' } },\n oXdwyBK5Gj: { $id: 'oXdwyBK5Gj', componentId: 'muiBox', parentId: 'QWuFAJeRmO', nodes: ['oFYhWhTjA8'], sx: { position: 'relative', aspectRatio: '4 / 3' } },\n R8y0_H5y1r: { $id: 'R8y0_H5y1r', componentId: 'muiGrid', parentId: 'vFwen5PXdE', nodes: ['mxxJl8mJeQ'] },\n qh6v4JMuvM: { $id: 'qh6v4JMuvM', componentId: 'muiGrid', parentId: 'vFwen5PXdE', nodes: ['7B-dRm9KH0'] },\n ss9ZdrPkPO: { $id: 'ss9ZdrPkPO', componentId: 'muiGrid', parentId: 'vFwen5PXdE', nodes: ['UqRQw7fAJL'] },\n zNjq_ENdsA: { $id: 'zNjq_ENdsA', componentId: 'muiGrid', parentId: 'ermJcuJZ3n', nodes: ['_tcXdiehBM'] },\n xHGY5h74hw: { $id: 'xHGY5h74hw', componentId: 'muiGrid', parentId: 'ermJcuJZ3n', nodes: ['DhHFJngdtx'] },\n OXk2tX7oIo: { $id: 'OXk2tX7oIo', componentId: 'muiGrid', parentId: 'ermJcuJZ3n', nodes: ['DX1d3Nk_SS'] },\n oFYhWhTjA8: { $id: 'oFYhWhTjA8', componentId: 'image', parentId: 'oXdwyBK5Gj', nodes: [], sx: { position: 'absolute', width: '100%', height: '100%' }, props: { alt: 'A couple at sunset', src: 'media:zVfToa7iIQ/RyW7TuJfq4', intrinsicWidth: 1280, intrinsicHeight: 1117 } },\n mxxJl8mJeQ: { $id: 'mxxJl8mJeQ', componentId: 'muiStack', parentId: 'R8y0_H5y1r', nodes: ['NUokTPuJqS'] },\n '7B-dRm9KH0': { $id: '7B-dRm9KH0', componentId: 'muiStack', parentId: 'qh6v4JMuvM', nodes: ['mXvxLG6ZCC'] },\n UqRQw7fAJL: { $id: 'UqRQw7fAJL', componentId: 'muiStack', parentId: 'ss9ZdrPkPO', nodes: ['cDkrmCHRY8'] },\n _tcXdiehBM: { $id: '_tcXdiehBM', componentId: 'muiStack', parentId: 'zNjq_ENdsA', nodes: ['_18zZdjkXI'] },\n DhHFJngdtx: { $id: 'DhHFJngdtx', componentId: 'muiStack', parentId: 'xHGY5h74hw', nodes: ['T4nyq3oMFE'] },\n DX1d3Nk_SS: { $id: 'DX1d3Nk_SS', componentId: 'muiStack', parentId: 'OXk2tX7oIo', nodes: ['6r8o7QflaP'] },\n NUokTPuJqS: { $id: 'NUokTPuJqS', componentId: 'image', parentId: 'mxxJl8mJeQ', nodes: [], sx: { aspectRatio: { xs: '4 / 3', md: '4 / 5' } }, props: { alt: 'A family in the mountains', src: 'media:zVfToa7iIQ/Dno5tXH307', intrinsicWidth: 853, intrinsicHeight: 1280 } },\n mXvxLG6ZCC: { $id: 'mXvxLG6ZCC', componentId: 'image', parentId: '7B-dRm9KH0', nodes: [], sx: { aspectRatio: { xs: '4 / 3', md: '4 / 5' } }, props: { alt: 'An aisle at a wedding', src: 'media:zVfToa7iIQ/Q_imBRl0u7', intrinsicWidth: 1280, intrinsicHeight: 854 } },\n cDkrmCHRY8: { $id: 'cDkrmCHRY8', componentId: 'image', parentId: 'UqRQw7fAJL', nodes: [], sx: { aspectRatio: { xs: '4 / 3', md: '4 / 5' } }, props: { alt: 'A flower at a wedding', src: 'media:zVfToa7iIQ/adqePe-iIO', intrinsicWidth: 1280, intrinsicHeight: 853 } },\n _18zZdjkXI: { $id: '_18zZdjkXI', componentId: 'image', parentId: '_tcXdiehBM', nodes: [], sx: { aspectRatio: { xs: '4 / 3', md: '4 / 5' } }, props: { alt: 'A couple at a wedding', src: 'media:zVfToa7iIQ/20t9SUxyKJ', intrinsicWidth: 1280, intrinsicHeight: 720 } },\n T4nyq3oMFE: { $id: 'T4nyq3oMFE', componentId: 'image', parentId: 'DhHFJngdtx', nodes: [], sx: { aspectRatio: { xs: '4 / 3', md: '4 / 5' } }, props: { alt: 'A family in the mountains', src: 'media:zVfToa7iIQ/Dno5tXH307', intrinsicWidth: 853, intrinsicHeight: 1280 } },\n '6r8o7QflaP': { $id: '6r8o7QflaP', componentId: 'image', parentId: 'DX1d3Nk_SS', nodes: [], sx: { aspectRatio: { xs: '4 / 3', md: '4 / 5' } }, props: { alt: 'A couple at sunset', src: 'media:zVfToa7iIQ/RyW7TuJfq4', intrinsicWidth: 1280, intrinsicHeight: 1117 } },\n } as unknown as NodesMap,\n },\n {\n id: 'uck__d_Wpk',\n title: 'FAQ',\n slug: '/faq',\n nodes: {\n '_@_': { $id: '_@_', componentId: 'div', nodes: ['ai-uck__d_Wpk-section-1', 'ai-uck__d_Wpk-section-2', 'ai-uck__d_Wpk-section-3'] },\n 'ai-uck__d_Wpk-section-1': { $id: 'ai-uck__d_Wpk-section-1', componentId: 'section', parentId: '_@_', nodes: ['Sq20gfoLHO'] },\n 'ai-uck__d_Wpk-section-2': { $id: 'ai-uck__d_Wpk-section-2', componentId: 'section', parentId: '_@_', nodes: [] },\n 'ai-uck__d_Wpk-section-3': { $id: 'ai-uck__d_Wpk-section-3', componentId: 'section', parentId: '_@_', nodes: ['iPn-4Qm3HO'], sx: { position: 'relative' } },\n Sq20gfoLHO: { $id: 'Sq20gfoLHO', componentId: 'muiContainer', parentId: 'ai-uck__d_Wpk-section-1', nodes: ['jm8QiMQi_q'] },\n 'iPn-4Qm3HO': { $id: 'iPn-4Qm3HO', componentId: 'muiBox', parentId: 'ai-uck__d_Wpk-section-3', nodes: ['ELjSSmxB67'], sx: { position: 'absolute', width: '100%', height: '100%' } },\n jm8QiMQi_q: { $id: 'jm8QiMQi_q', componentId: 'muiStack', parentId: 'Sq20gfoLHO', nodes: ['xBtp9iJ8EL'] },\n ELjSSmxB67: { $id: 'ELjSSmxB67', componentId: 'image', parentId: 'iPn-4Qm3HO', nodes: [], props: { alt: 'A family in the mountains', src: 'media:zVfToa7iIQ/OdwfZdKKAt', intrinsicWidth: 1280, intrinsicHeight: 853 } },\n xBtp9iJ8EL: { $id: 'xBtp9iJ8EL', componentId: 'muiBox', parentId: 'jm8QiMQi_q', nodes: ['AGD00MGenQ'], sx: { position: 'relative', aspectRatio: { xs: '16 / 9', md: '3 / 1' } } },\n AGD00MGenQ: { $id: 'AGD00MGenQ', componentId: 'image', parentId: 'xBtp9iJ8EL', nodes: [], props: { alt: 'A bride at a wedding', src: 'media:zVfToa7iIQ/abVI9Y5qiS', intrinsicWidth: 1280, intrinsicHeight: 853, loading: 'eager' } },\n } as unknown as NodesMap,\n },\n {\n id: 'BmIet_iYyX',\n title: 'Contact',\n slug: '/contact',\n nodes: {\n '_@_': { $id: '_@_', componentId: 'div', nodes: ['ai-BmIet_iYyX-section-1', 'ai-BmIet_iYyX-section-2', 'ai-BmIet_iYyX-section-3', 'ai-BmIet_iYyX-section-4'] },\n 'ai-BmIet_iYyX-section-1': { $id: 'ai-BmIet_iYyX-section-1', componentId: 'section', parentId: '_@_', nodes: ['30K-RgmUlF'] },\n 'ai-BmIet_iYyX-section-2': { $id: 'ai-BmIet_iYyX-section-2', componentId: 'section', parentId: '_@_', nodes: [] },\n 'ai-BmIet_iYyX-section-3': { $id: 'ai-BmIet_iYyX-section-3', componentId: 'section', parentId: '_@_', nodes: ['5DbQg2dXyW'] },\n 'ai-BmIet_iYyX-section-4': { $id: 'ai-BmIet_iYyX-section-4', componentId: 'section', parentId: '_@_', nodes: [] },\n '30K-RgmUlF': { $id: '30K-RgmUlF', componentId: 'muiContainer', parentId: 'ai-BmIet_iYyX-section-1', nodes: ['adsQCltSNm'] },\n '5DbQg2dXyW': { $id: '5DbQg2dXyW', componentId: 'muiContainer', parentId: 'ai-BmIet_iYyX-section-3', nodes: ['EYX7UJW0m4'] },\n adsQCltSNm: { $id: 'adsQCltSNm', componentId: 'muiStack', parentId: '30K-RgmUlF', nodes: ['4EJrAgdmXy'] },\n EYX7UJW0m4: { $id: 'EYX7UJW0m4', componentId: 'muiGrid', parentId: '5DbQg2dXyW', nodes: ['1wp3Gj6_uw'] },\n '4EJrAgdmXy': { $id: '4EJrAgdmXy', componentId: 'muiBox', parentId: 'adsQCltSNm', nodes: ['DY8Ya5RX5O'], sx: { position: 'relative', aspectRatio: { xs: '16 / 9', md: '3 / 1' } } },\n '1wp3Gj6_uw': { $id: '1wp3Gj6_uw', componentId: 'muiGrid', parentId: 'EYX7UJW0m4', nodes: ['4dzQeWnYMQ'] },\n DY8Ya5RX5O: { $id: 'DY8Ya5RX5O', componentId: 'image', parentId: '4EJrAgdmXy', nodes: [], props: { alt: 'A family in the mountains', src: 'media:zVfToa7iIQ/TIP2UNTKZJ', intrinsicWidth: 1280, intrinsicHeight: 853, loading: 'eager' } },\n '4dzQeWnYMQ': { $id: '4dzQeWnYMQ', componentId: 'muiBox', parentId: '1wp3Gj6_uw', nodes: ['cS8XMuN79D'], sx: { position: 'relative', aspectRatio: '4 / 3' } },\n cS8XMuN79D: { $id: 'cS8XMuN79D', componentId: 'image', parentId: '4dzQeWnYMQ', nodes: [], sx: { position: 'absolute', width: '100%', height: '100%' }, props: { alt: 'A couple with a cowboy', src: 'media:zVfToa7iIQ/4QuVNZGL4H', intrinsicWidth: 1280, intrinsicHeight: 719 } },\n } as unknown as NodesMap,\n },\n]\n\n/** The photos the job copied into the site's library, in the order it copied them. */\nexport const LAUREL_FORK_PHOTOS: ReadonlyArray<{ mediaId: string; key: string; width: number; height: number; alt: string; query: string; at: string }> = [\n { mediaId: '20t9SUxyKJ', key: 'pixabay:5401602', width: 1280, height: 720, alt: 'A couple at a wedding', query: 'wedding couple mountains', at: '2026-10-19T23:08:29.029Z' },\n { mediaId: 'Dno5tXH307', key: 'pixabay:6071186', width: 853, height: 1280, alt: 'A family in the mountains', query: 'family mountains', at: '2026-10-19T23:08:29.363Z' },\n { mediaId: 'adqePe-iIO', key: 'pixabay:5582980', width: 1280, height: 853, alt: 'A flower at a wedding', query: 'wedding', at: '2026-10-19T23:09:30.033Z' },\n { mediaId: 'oKqg7KVmFs', key: 'pixabay:1576456', width: 1280, height: 820, alt: 'A father with a son in the mountains', query: 'family mountains', at: '2026-10-19T23:09:30.054Z' },\n { mediaId: 'Q_imBRl0u7', key: 'pixabay:1846114', width: 1280, height: 854, alt: 'An aisle at a wedding', query: 'wedding', at: '2026-10-19T23:10:42.873Z' },\n { mediaId: 'RyW7TuJfq4', key: 'pixabay:2191391', width: 1280, height: 1117, alt: 'A couple at sunset', query: 'wedding couple mountains', at: '2026-10-19T23:10:42.886Z' },\n { mediaId: 'abVI9Y5qiS', key: 'pixabay:1837148', width: 1280, height: 853, alt: 'A bride at a wedding', query: 'wedding couple mountains', at: '2026-10-19T23:12:32.576Z' },\n { mediaId: 'OdwfZdKKAt', key: 'pixabay:4610864', width: 1280, height: 853, alt: 'A family in the mountains', query: 'family mountains', at: '2026-10-19T23:12:32.883Z' },\n { mediaId: '4QuVNZGL4H', key: 'pixabay:5404826', width: 1280, height: 719, alt: 'A couple with a cowboy', query: 'wedding couple mountains', at: '2026-10-19T23:13:29.574Z' },\n { mediaId: 'TIP2UNTKZJ', key: 'pixabay:7843738', width: 1280, height: 853, alt: 'A family in the mountains', query: 'family mountains', at: '2026-10-19T23:13:30.077Z' },\n]\n\n/** The \"Gallery collections\" records production wrote (dataset WX2B9IcAnF), in order. */\nexport const LAUREL_FORK_COVERS: ReadonlyArray<{ order: number; title: string; category: string; image: string; imageDescription: string }> = [\n { order: 0, title: 'Mountain elopements', category: 'Weddings and elopements', image: '/_static/starter/hero-team.jpg', imageDescription: 'A small team working together around a table in a bright office' },\n { order: 1, title: 'Overlook vows', category: 'Weddings and elopements', image: '/_static/starter/gallery-desk.jpg', imageDescription: 'A tidy desk with a laptop, a lamp and fresh flowers' },\n { order: 2, title: 'Small weddings', category: 'Weddings and elopements', image: '/_static/starter/hero-team.jpg', imageDescription: 'A small team working together around a table in a bright office' },\n { order: 3, title: 'Getting ready', category: 'Weddings and elopements', image: '/_static/starter/gallery-desk.jpg', imageDescription: 'A tidy desk with a laptop, a lamp and fresh flowers' },\n { order: 4, title: 'First looks in the trees', category: 'Weddings and elopements', image: '/_static/starter/hero-team.jpg', imageDescription: 'A small team working together around a table in a bright office' },\n { order: 5, title: 'Couples portraits', category: 'Weddings and elopements', image: '/_static/starter/gallery-desk.jpg', imageDescription: 'A tidy desk with a laptop, a lamp and fresh flowers' },\n { order: 6, title: 'Family sessions outdoors', category: 'Family portraits', image: '/_static/starter/hero-team.jpg', imageDescription: 'A small team working together around a table in a bright office' },\n { order: 7, title: 'Parents and little ones', category: 'Family portraits', image: '/_static/starter/gallery-desk.jpg', imageDescription: 'A tidy desk with a laptop, a lamp and fresh flowers' },\n { order: 8, title: 'Multi-generation portraits', category: 'Family portraits', image: '/_static/starter/hero-team.jpg', imageDescription: 'A small team working together around a table in a bright office' },\n { order: 9, title: 'Golden hour families', category: 'Family portraits', image: '/_static/starter/gallery-desk.jpg', imageDescription: 'A tidy desk with a laptop, a lamp and fresh flowers' },\n { order: 10, title: 'Milestone sessions', category: 'Family portraits', image: '/_static/starter/hero-team.jpg', imageDescription: 'A small team working together around a table in a bright office' },\n { order: 11, title: 'Siblings and cousins', category: 'Family portraits', image: '/_static/starter/gallery-desk.jpg', imageDescription: 'A tidy desk with a laptop, a lamp and fresh flowers' },\n]\n\n/** The downloads the image hosts refused, by the beat that sent them (its request's start, from the console's logs). */\nexport const LAUREL_FORK_REFUSALS = {\n /** The beat that built the site layout, the datasets and the form: every one of them a \"Gallery collections\" cover's pick. */\n covers: {\n at: '2026-10-19T23:07:09.140Z',\n ids: ['8028185', '2179256', '7612157', '1837148', '5693164', '6935359', '6704262', '7103290', '2191391', '7162791', '6230410', '1576456', '621634', '4610864', '2592704', '868394', '5401602', '7843738', '3717770', '6883668', '515532', '6935341'],\n },\n /** The beat that built the home page: its hero's and its about split's picks among them. */\n home: {\n at: '2026-10-19T23:08:11.813Z',\n ids: ['1846114', '5061887', '7302669', '7315389', '1837148', '3997967', '7103290', '621634', '5582980', '9981742', '9034408'],\n },\n} as const\n\n"],"names":["LAUREL_FORK_SHARE_IMAGE","image","imageWidth","imageHeight","imageAlt","LAUREL_FORK_PAGES","id","title","slug","nodes","$id","componentId","parentId","sx","position","bUKvvYVspl","kZnxgtEEwW","rPNWWfbfQf","k0XulehpfP","p9fSYaMS_L","width","height","qDfEd0AZCr","AyvCN0Vv9Z","Ffnn6cK5Ga","FR7WdQd4sZ","props","alt","src","intrinsicWidth","intrinsicHeight","ECW4_DSLWt","aspectRatio","xs","md","QwlyU6yYqS","bAJ25yBgWt","mTWJuHpqNc","MDpjUplylc","loading","pfhzMkYkWV","A60C_InPsl","MDsN8QXzkJ","HpkOCRgkaU","bE7h5VR4fS","keKfGYqdrv","m7rhszuwJ_","dmaHvXXLog","rRaTuKKtV_","wt_B806Cz2","lxEoMaVorh","vjw8N7hFAS","lrqoLGssJc","bctLBlZwCn","rmPoyiqnm1","KcpbqM5HGe","RUCfDEpGHe","FqJTPKOFhc","JYPG2A7rAM","A0jJJciYYl","TSZstV47eS","_qdKnXC6SG","DNXBX6Rjty","P05uXIH3ay","laVjLPJZ4L","uPTgcF6jUS","o66WNW1fIn","Kg7ruI_Meh","QWuFAJeRmO","vFwen5PXdE","ermJcuJZ3n","w2coL2n_tN","oXdwyBK5Gj","R8y0_H5y1r","qh6v4JMuvM","ss9ZdrPkPO","zNjq_ENdsA","xHGY5h74hw","OXk2tX7oIo","oFYhWhTjA8","mxxJl8mJeQ","UqRQw7fAJL","_tcXdiehBM","DhHFJngdtx","DX1d3Nk_SS","NUokTPuJqS","mXvxLG6ZCC","cDkrmCHRY8","_18zZdjkXI","T4nyq3oMFE","Sq20gfoLHO","jm8QiMQi_q","ELjSSmxB67","xBtp9iJ8EL","AGD00MGenQ","adsQCltSNm","EYX7UJW0m4","DY8Ya5RX5O","cS8XMuN79D","LAUREL_FORK_PHOTOS","mediaId","key","query","at","LAUREL_FORK_COVERS","order","category","imageDescription","LAUREL_FORK_REFUSALS","covers","ids","home"],"mappings":"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"}
@@ -15,6 +15,7 @@
15
15
  * limitations under the License.
16
16
  */
17
17
  import type { NodesMap } from '@aglyn/aglyn/types/nodes';
18
+ import { type AiSiteStarterSlot, type AiStockRefusedPicks } from '../model/ai-site-photos';
18
19
  /**
19
20
  * THE PICTURES OF A LANGUAGE PAGE (AGL-3660).
20
21
  *
@@ -31,17 +32,21 @@ import type { NodesMap } from '@aglyn/aglyn/types/nodes';
31
32
  * deployment has a stock-photo key.
32
33
  * 2. Where the library failed the slot — down, refusing, out of time, or its
33
34
  * photo not copied — one of the photos the same job already placed on
34
- * this site, on its other pages or its datasets' records
35
- * ({@link aiLayoutJobPhotoPicks}, AGL-3988): each was found for the
36
- * site's own world, so a wedding photographer's home page shows a wedding
37
- * and never an office.
35
+ * this site, on its other pages, its datasets' records or this page's
36
+ * other slots ({@link aiLayoutJobPhotoPicks}, AGL-3988): each was found
37
+ * for the site's own world, so a wedding photographer's home page shows a
38
+ * wedding and never an office.
38
39
  * 3. Where the job has no photo of its own — no stock-photo key, or the
39
- * library failed it from the start — one of the
40
+ * library failed it before the job copied any — one of the
40
41
  * STARTER PHOTOS every new site is born with (`DEFAULT_SITE_IMAGES`,
41
42
  * served at `/_static/starter/` by the tenant and the console alike,
42
43
  * credited in the CREDITS file beside them). They are the platform's own
43
44
  * files, so a visitor's browser asks no other host for them, and a
44
- * starter reads better than no picture when there is no library.
45
+ * starter reads better than no picture when there is no library. On a
46
+ * site start, which never places a photo its page already shows, a slot
47
+ * none of the job's other photos fits yet keeps one too, and the start's
48
+ * late photo pass gives it one of the job's own photos once every page
49
+ * is built (`jobs/ai-site-late-photos.ts`).
45
50
  *
46
51
  * Where the library answered and nothing in it fits a slot
47
52
  * ({@link AI_LAYOUT_NO_PHOTO}), the slot never takes a starter: the beta.257
@@ -229,8 +234,17 @@ export declare function aiLayoutNeutralStarterPhotos(slots: readonly AiLayoutPic
229
234
  * portrait of the business's people are of one named thing, which no other
230
235
  * photo is, so they take none. Among equals the seed picks, so one job
231
236
  * always picks the same. `null` for a slot given none. Pure.
237
+ *
238
+ * `repeats` is a site start's (AGL-3988), where a photo shown twice on one
239
+ * page reads as a defect: `'never'` when its page is built, where a slot no
240
+ * photo the page does not show yet fits keeps a starter for the start's
241
+ * late photo pass; `'last'` in that pass, where the other choice is a starter
242
+ * of another business, so a photo the page does not show comes first, then
243
+ * one it shows elsewhere, and the photo beside the slot only after that.
232
244
  */
233
- export declare function aiLayoutJobPhotoPicks(slots: readonly AiLayoutPictureSlot[], need: readonly boolean[], jobPhotos: readonly AiLayoutPicturePhoto[], placed: ReadonlyArray<AiLayoutPicturePhoto | null | undefined>, seed: string): Array<AiLayoutPicturePhoto | null>;
245
+ export declare function aiLayoutJobPhotoPicks(slots: readonly AiLayoutPictureSlot[], need: readonly boolean[], jobPhotos: readonly AiLayoutPicturePhoto[], placed: ReadonlyArray<AiLayoutPicturePhoto | null | undefined>, seed: string, options?: {
246
+ repeats?: 'never' | 'last';
247
+ }): Array<AiLayoutPicturePhoto | null>;
234
248
  /**
235
249
  * The page with each slot filled by its photo: the `image` given its source,
236
250
  * its intrinsic size and how it loads (the hero eagerly, as the starter home
@@ -261,17 +275,31 @@ export declare function aiLayoutDropEmptyPictures(nodes: NodesMap, slots: readon
261
275
  * not be asked, which takes a starter photo. It may throw, and then every
262
276
  * slot takes a starter.
263
277
  */
264
- export type AiLayoutPictureSource = (slots: readonly AiLayoutPictureSlot[]) => Promise<ReadonlyArray<AiLayoutPicturePhoto | null>>;
278
+ export type AiLayoutPictureSource = (slots: readonly AiLayoutPictureSlot[], report?: AiLayoutPictureReport) => Promise<ReadonlyArray<AiLayoutPicturePhoto | null>>;
279
+ /**
280
+ * What a source tells its caller beside its answers (AGL-3988): for each slot
281
+ * whose fitting photo the library's image hosts would not hand over, the
282
+ * picks it kept in hand and the search they came from, so the site start's
283
+ * late photo pass can ask for them again once the burst is over. Keyed by
284
+ * the slot itself, which every source hands on unchanged.
285
+ */
286
+ export interface AiLayoutPictureReport {
287
+ refused: Map<AiLayoutPictureSlot, AiStockRefusedPicks>;
288
+ }
265
289
  /**
266
290
  * Fills a stored page's empty picture slots (AGL-3660): from `source` where
267
291
  * one is given and it answers; a slot it answers with nothing fitting stays
268
292
  * without a photo and is taken out ({@link aiLayoutDropEmptyPictures}). A
269
293
  * slot it could not answer — the library down, out of time, or its photo not
270
- * copied — takes one of the photos the job already placed on this site
271
- * (`jobPhotos`, {@link aiLayoutJobPhotoPicks}, AGL-3988), and only where the
272
- * job has none of its own, a starter photo described by its own words
273
- * (AGL-3831). Never throws, and never leaves a page worse than it came: a
274
- * picture is decoration, and a job never fails over one.
294
+ * copied — takes one of the photos the job already placed on this site or
295
+ * this page just copied (`jobPhotos`, {@link aiLayoutJobPhotoPicks},
296
+ * AGL-3988), and only where the job has none, a starter photo described by
297
+ * its own words (AGL-3831). On a site start (`onStarters`), a photo the
298
+ * page already shows is never placed again, a slot none of the others fits
299
+ * yet keeps a neutral starter too, and `onStarters` is told of every
300
+ * picture left on one, for the late photo pass. Never throws, and
301
+ * never leaves a page worse than it came: a picture is decoration, and a
302
+ * job never fails over one.
275
303
  */
276
304
  export declare function aiResolveLayoutPictures(nodes: NodesMap, input: {
277
305
  rootId: string;
@@ -288,4 +316,13 @@ export declare function aiResolveLayoutPictures(nodes: NodesMap, input: {
288
316
  jobPhotos?: readonly AiLayoutPicturePhoto[];
289
317
  /** The site's language (AGL-3750); a starter photo's English words are not its own. */
290
318
  language?: string;
319
+ /**
320
+ * Told the pictures left on a starter where the site has a library
321
+ * (AGL-3988), with the picks the image hosts refused for each: what the
322
+ * site start's late photo pass fills from the job's own photos. Given
323
+ * only where such a pass follows: a failed slot then never takes a photo
324
+ * the page already shows, and one none of the job's other photos fits
325
+ * yet keeps a neutral starter for that pass, rather than lose its frame.
326
+ */
327
+ onStarters?: (slots: AiSiteStarterSlot[]) => void;
291
328
  }): Promise<NodesMap>;
@@ -15,6 +15,7 @@ import { _ as _extends } from "@swc/helpers/_/_extends";
15
15
  * See the License for the specific language governing permissions and
16
16
  * limitations under the License.
17
17
  */ import { DEFAULT_SITE_IMAGES } from "@aglyn/aglyn/app-utils/default-site";
18
+ import { aiSiteIsStarterSrc } from "../model/ai-site-photos.js";
18
19
  import { aiLayoutLabel, aiLayoutSpeaksOtherThanEnglish } from "./ai-layout-labels.js";
19
20
  /** Words that say a picture shows people, or a section is about them. */ const PEOPLE = /\b(team|story|owner|owners|founder|founders|staff|crew|people|person|portrait|meet|family|families|who we are|our (?:team|crew|people|story)|therapist|counsel(?:l)?or|coach|doctor|dentist|stylist|trainer|smil(?:e|es|ing)|headshot)\b/i;
20
21
  /**
@@ -313,7 +314,14 @@ function rotate(list, by) {
313
314
  * portrait of the business's people are of one named thing, which no other
314
315
  * photo is, so they take none. Among equals the seed picks, so one job
315
316
  * always picks the same. `null` for a slot given none. Pure.
316
- */ export function aiLayoutJobPhotoPicks(slots, need, jobPhotos, placed, seed) {
317
+ *
318
+ * `repeats` is a site start's (AGL-3988), where a photo shown twice on one
319
+ * page reads as a defect: `'never'` when its page is built, where a slot no
320
+ * photo the page does not show yet fits keeps a starter for the start's
321
+ * late photo pass; `'last'` in that pass, where the other choice is a starter
322
+ * of another business, so a photo the page does not show comes first, then
323
+ * one it shows elsewhere, and the photo beside the slot only after that.
324
+ */ export function aiLayoutJobPhotoPicks(slots, need, jobPhotos, placed, seed, options = {}) {
317
325
  const seen = new Set();
318
326
  const pool = jobPhotos.filter((photo)=>{
319
327
  if (!photo.src || !(photo.width > 0) || !(photo.height > 0) || seen.has(photo.src)) return false;
@@ -345,13 +353,15 @@ function rotate(list, by) {
345
353
  let best = null;
346
354
  for (const [at, photo] of pool.entries()){
347
355
  var _photo_alt;
348
- if (beside.has(photo.src)) continue;
349
- const aspect = photo.width / photo.height;
356
+ const nextTo = beside.has(photo.src);
350
357
  const uses = shown.filter((src)=>src === photo.src).length;
358
+ if (nextTo && options.repeats !== 'last') continue;
359
+ if (uses && options.repeats === 'never') continue;
360
+ const aspect = photo.width / photo.height;
351
361
  const shared = [
352
362
  ...wordsOf((_photo_alt = photo.alt) != null ? _photo_alt : '')
353
363
  ].filter((word)=>says.has(word)).length;
354
- const score = -100 * uses + (slot.role === 'hero' && aspect >= 1.3 ? 20 : 0) - 10 * Math.abs(Math.log(aspect / (slot.aspect > 0 ? slot.aspect : 1))) + 4 * shared;
364
+ const score = (nextTo ? -10000 : 0) - (options.repeats === 'last' ? 1000 : 100) * uses + (slot.role === 'hero' && aspect >= 1.3 ? 20 : 0) - 10 * Math.abs(Math.log(aspect / (slot.aspect > 0 ? slot.aspect : 1))) + 4 * shared;
355
365
  // The seed turns the pool, so equals are taken in a per-job order.
356
366
  const rank = (at - turn % pool.length + pool.length) % pool.length;
357
367
  if (!best || score > best.score || score === best.score && rank < best.rank) best = {
@@ -501,23 +511,30 @@ function rotate(list, by) {
501
511
  * one is given and it answers; a slot it answers with nothing fitting stays
502
512
  * without a photo and is taken out ({@link aiLayoutDropEmptyPictures}). A
503
513
  * slot it could not answer — the library down, out of time, or its photo not
504
- * copied — takes one of the photos the job already placed on this site
505
- * (`jobPhotos`, {@link aiLayoutJobPhotoPicks}, AGL-3988), and only where the
506
- * job has none of its own, a starter photo described by its own words
507
- * (AGL-3831). Never throws, and never leaves a page worse than it came: a
508
- * picture is decoration, and a job never fails over one.
514
+ * copied — takes one of the photos the job already placed on this site or
515
+ * this page just copied (`jobPhotos`, {@link aiLayoutJobPhotoPicks},
516
+ * AGL-3988), and only where the job has none, a starter photo described by
517
+ * its own words (AGL-3831). On a site start (`onStarters`), a photo the
518
+ * page already shows is never placed again, a slot none of the others fits
519
+ * yet keeps a neutral starter too, and `onStarters` is told of every
520
+ * picture left on one, for the late photo pass. Never throws, and
521
+ * never leaves a page worse than it came: a picture is decoration, and a
522
+ * job never fails over one.
509
523
  */ export async function aiResolveLayoutPictures(nodes, input) {
510
524
  try {
511
- var _input_jobPhotos;
525
+ var _input_jobPhotos, _input_jobPhotos1;
512
526
  const slots = aiLayoutPictureSlots(nodes, input.rootId, {
513
527
  ids: input.sectionIds,
514
528
  names: input.sectionNames
515
529
  });
516
530
  if (!slots.length) return nodes;
517
531
  let found = [];
532
+ const report = {
533
+ refused: new Map()
534
+ };
518
535
  if (input.source) {
519
536
  try {
520
- found = await input.source(slots);
537
+ found = await input.source(slots, report);
521
538
  } catch (error) {
522
539
  console.warn('ai layout pictures: the stock source failed; the job’s own photos or starters fill the page', {
523
540
  error
@@ -539,18 +556,44 @@ function rotate(list, by) {
539
556
  // With a library, the job's own photos come before any starter (AGL-3988),
540
557
  // and a starter is only ever a neutral one (AGL-3923): the beta.267
541
558
  // Brightvale start, whose library refused its copies, showed a pottery
542
- // bench and a coffee shop's owner as a marketer's pictures.
543
- const own = input.source ? ((_input_jobPhotos = input.jobPhotos) != null ? _input_jobPhotos : []).filter((photo)=>photo.src && photo.width > 0 && photo.height > 0) : [];
559
+ // bench and a coffee shop's owner as a marketer's pictures. The job's
560
+ // own are its other pages' and its records' photos, and the ones this
561
+ // page just copied for its other slots: the beta.271 Laurel Fork home
562
+ // page, the first page built, copied a wide wedding couple and a family
563
+ // for two of its slots while its hero's picks were refused, and opened
564
+ // on the starters' office team. A photo the page does not show yet is
565
+ // still preferred, and never the one beside it.
566
+ const own = input.source ? [
567
+ ...(_input_jobPhotos = input.jobPhotos) != null ? _input_jobPhotos : [],
568
+ ...photos.filter((photo)=>Boolean(photo))
569
+ ].filter((photo)=>photo.src && photo.width > 0 && photo.height > 0) : [];
570
+ // On a site start (`onStarters`) a photo the page already shows is never
571
+ // placed again here (AGL-3988): the beta.271 Laurel Fork home page opened
572
+ // on the wedding couple its closing band shows. Such a slot keeps a
573
+ // starter, and the start's late photo pass fills it.
574
+ const lateStart = Boolean(input.source && input.onStarters);
544
575
  if (own.length) {
545
- aiLayoutJobPhotoPicks(slots, unanswered, own, photos, input.seed).forEach((pick, index)=>{
576
+ aiLayoutJobPhotoPicks(slots, unanswered, own, photos, input.seed, lateStart ? {
577
+ repeats: 'never'
578
+ } : {}).forEach((pick, index)=>{
546
579
  if (pick && unanswered[index]) photos[index] = pick;
547
580
  });
548
- } else {
549
- const starters = input.source ? aiLayoutNeutralStarterPhotos(slots, input.seed) : aiLayoutStarterPhotos(slots, input.seed);
550
- starters.forEach((photo, index)=>{
551
- if (photo && unanswered[index]) photos[index] = said(photo);
552
- });
553
581
  }
582
+ // A failed slot takes a neutral starter only where the job had no photo
583
+ // of its own before this page, as #1831 had it. On a site start, where
584
+ // the job has photos of its own, every failed slot none of them fits yet
585
+ // keeps one: that start's late photo pass gives it one of the job's own
586
+ // once every page is built (AGL-3988), told of it by `onStarters`.
587
+ // Anywhere else it keeps the no-photo treatment. With no library, every
588
+ // starter, as before.
589
+ const hadOwn = ((_input_jobPhotos1 = input.jobPhotos) != null ? _input_jobPhotos1 : []).some((photo)=>photo.src && photo.width > 0 && photo.height > 0);
590
+ const starters = !input.source ? aiLayoutStarterPhotos(slots, input.seed) : lateStart && own.length ? aiLayoutNeutralStarterRun(slots.length, input.seed).map((photo, index)=>{
591
+ var _slots_index, _slots_index1;
592
+ return ((_slots_index = slots[index]) == null ? void 0 : _slots_index.people) || ((_slots_index1 = slots[index]) == null ? void 0 : _slots_index1.product) ? null : photo;
593
+ }) : hadOwn && !lateStart ? [] : aiLayoutNeutralStarterPhotos(slots, input.seed);
594
+ starters.forEach((photo, index)=>{
595
+ if (photo && unanswered[index] && !photos[index]) photos[index] = said(photo);
596
+ });
554
597
  // The page floor (AGL-3923; Zach, 2026-10-12: a starter photo before no
555
598
  // photo at all): a page the library answered that would show no picture
556
599
  // keeps one, in its hero, else its first slot: one of the job's own
@@ -578,6 +621,25 @@ function rotate(list, by) {
578
621
  alt: starter.alt
579
622
  });
580
623
  }
624
+ // The pictures left on a starter, for the late photo pass (AGL-3988).
625
+ if (input.source && input.onStarters) {
626
+ const left = slots.flatMap((slot, index)=>{
627
+ var _photos_index;
628
+ if (!aiSiteIsStarterSrc((_photos_index = photos[index]) == null ? void 0 : _photos_index.src)) return [];
629
+ const refused = report.refused.get(slot);
630
+ return [
631
+ _extends({
632
+ image: slot.imageId,
633
+ words: slot.alt,
634
+ role: slot.role,
635
+ aspect: slot.aspect
636
+ }, refused ? {
637
+ refused
638
+ } : {})
639
+ ];
640
+ });
641
+ if (left.length) input.onStarters(left);
642
+ }
581
643
  return aiLayoutDropEmptyPictures(aiLayoutPlacePictures(nodes, slots, photos), slots, photos, input.sectionIds);
582
644
  } catch (error) {
583
645
  console.error('ai layout pictures: the page keeps its empty picture slots', {