@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
@@ -18,12 +18,12 @@ import { _ as _extends } from "@swc/helpers/_/_extends";
18
18
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
19
19
  import { PageHeaderRecord } from "@aglyn/aglyn/app-utils/page-header-record-context";
20
20
  import { buildRoute, Route } from "@aglyn/aglyn/app-utils/console-routes";
21
- import { mdiAlertCircle, mdiCheckCircle, mdiChevronDown, mdiClockOutline, mdiMinusCircleOutline } from "@aglyn/shared-data-mdi";
21
+ import { mdiAlertCircle, mdiCheckCircle, mdiChevronDown, mdiClockOutline, mdiMinusCircleOutline, mdiOpenInNew } from "@aglyn/shared-data-mdi";
22
22
  import { AppLink, HelpTip, MdiIcon } from "@aglyn/shared-ui-jsx";
23
23
  import { Accordion, AccordionDetails, AccordionSummary, Alert, Box, Button, Card, CircularProgress, Container, LinearProgress, Stack, Typography } from "@mui/material";
24
24
  import { useCallback, useState } from "react";
25
25
  import { aiSiteImportReviewWave, aiSiteImportRunningWave } from "../model/ai-site-import.js";
26
- import { aiSiteImportFoundText, aiSiteImportLeftOutLines, aiSiteImportPhaseOf, aiSiteImportPlanText, aiSiteImportStartAction, aiSiteImportWaveRows, aiSiteImportWaveSpent } from "../model/ai-site-import-view.js";
26
+ import { aiSiteImportFoundText, aiSiteImportHeldCopy, aiSiteImportLeftOutLines, aiSiteImportPhaseOf, aiSiteImportPlanText, aiSiteImportStartAction, aiSiteImportStartAllAction, aiSiteImportVerdictNote, aiSiteImportWaveRows, aiSiteImportWaveSpent } from "../model/ai-site-import-view.js";
27
27
  import { AiJobCancelButton } from "./ai-job-cancel.component.js";
28
28
  import { aiCreditsBillingHref, aiJobOutputHref } from "./ai-job-links.js";
29
29
  import { AI_SITE_IMPORT_HELP } from "./ai-site-import-start.component.js";
@@ -134,14 +134,49 @@ function RowIcon({ state }) {
134
134
  }) : null
135
135
  ]
136
136
  }),
137
- /*#__PURE__*/ _jsx(Typography, {
138
- variant: "body2",
139
- color: "text.secondary",
137
+ /*#__PURE__*/ _jsxs(Stack, {
138
+ direction: "row",
139
+ spacing: 1,
140
140
  sx: {
141
- overflowWrap: 'anywhere'
141
+ alignItems: 'baseline',
142
+ flexWrap: 'wrap'
142
143
  },
143
- children: `${row.from} → ${row.to}`
144
+ children: [
145
+ /*#__PURE__*/ _jsx(Typography, {
146
+ variant: "body2",
147
+ color: "text.secondary",
148
+ sx: {
149
+ overflowWrap: 'anywhere'
150
+ },
151
+ children: `${row.from} → ${row.to}`
152
+ }),
153
+ /*#__PURE__*/ _jsx(Button, {
154
+ size: "small",
155
+ component: "a",
156
+ href: row.oldPage,
157
+ target: "_blank",
158
+ rel: "noopener noreferrer",
159
+ endIcon: /*#__PURE__*/ _jsx(MdiIcon, {
160
+ path: mdiOpenInNew.path,
161
+ "aria-hidden": true
162
+ }),
163
+ "aria-label": `Old page: ${row.from}, opens in a new tab`,
164
+ sx: {
165
+ minWidth: 0,
166
+ py: 0
167
+ },
168
+ children: 'Old page'
169
+ })
170
+ ]
144
171
  }),
172
+ row.build || row.words ? /*#__PURE__*/ _jsx(Typography, {
173
+ variant: "body2",
174
+ color: "text.secondary",
175
+ children: [
176
+ row.build,
177
+ row.words
178
+ ].filter(Boolean).join(' · ')
179
+ }) : null,
145
180
  row.photos ? /*#__PURE__*/ _jsx(Typography, {
146
181
  variant: "body2",
147
182
  color: "text.secondary",
@@ -212,11 +247,13 @@ function Frame({ siteName, heading, lede, children }) {
212
247
  * a wave in for its review with its drafts to open, and the next wave's
213
248
  * button — the only way the next one starts. A wave held for a new proof, the
214
249
  * day's limit or a site that could not be read says so and offers the way on.
215
- */ export function AiSiteImportJob({ job, orgId, orgSlug, host, siteName, user, busy, notice, onResume, onJob }) {
250
+ */ export function AiSiteImportJob({ job, orgId, orgSlug, host, siteName, user, busy, notice, onResume, onStartAll, onJob }) {
216
251
  var _job_siteImport, _job_error;
217
252
  const phase = aiSiteImportPhaseOf(job);
218
253
  const state = (_job_siteImport = job.siteImport) != null ? _job_siteImport : null;
219
254
  const start = aiSiteImportStartAction(job);
255
+ const startAll = onStartAll ? aiSiteImportStartAllAction(job) : null;
256
+ const held = aiSiteImportHeldCopy(job);
220
257
  const pagesHref = host && orgSlug ? buildRoute(Route.HOST_SCREENS, {
221
258
  orgSlug,
222
259
  host
@@ -251,14 +288,37 @@ function Frame({ siteName, heading, lede, children }) {
251
288
  const startButton = start ? /*#__PURE__*/ _jsxs(Stack, {
252
289
  spacing: 1,
253
290
  children: [
254
- /*#__PURE__*/ _jsx(Box, {
255
- children: /*#__PURE__*/ _jsx(Button, {
256
- variant: "contained",
257
- size: "large",
258
- disabled: busy,
259
- onClick: onResume,
260
- children: busy ? 'Starting…' : start.label
261
- })
291
+ /*#__PURE__*/ _jsxs(Stack, {
292
+ direction: {
293
+ xs: 'column',
294
+ sm: 'row'
295
+ },
296
+ spacing: 1.5,
297
+ sx: {
298
+ alignItems: {
299
+ sm: 'center'
300
+ }
301
+ },
302
+ children: [
303
+ /*#__PURE__*/ _jsx(Box, {
304
+ children: /*#__PURE__*/ _jsx(Button, {
305
+ variant: "contained",
306
+ size: "large",
307
+ disabled: busy,
308
+ onClick: onResume,
309
+ children: busy ? 'Starting…' : start.label
310
+ })
311
+ }),
312
+ startAll && onStartAll ? /*#__PURE__*/ _jsx(Box, {
313
+ children: /*#__PURE__*/ _jsx(Button, {
314
+ variant: "outlined",
315
+ size: "large",
316
+ disabled: busy,
317
+ onClick: onStartAll,
318
+ children: startAll.label
319
+ })
320
+ }) : null
321
+ ]
262
322
  }),
263
323
  /*#__PURE__*/ _jsxs(Stack, {
264
324
  direction: "row",
@@ -276,7 +336,12 @@ function Frame({ siteName, heading, lede, children }) {
276
336
  ariaLabel: "How waves work"
277
337
  }))
278
338
  ]
279
- })
339
+ }),
340
+ startAll && onStartAll ? /*#__PURE__*/ _jsx(Typography, {
341
+ variant: "body2",
342
+ color: "text.secondary",
343
+ children: `${startAll.quote} for every remaining wave (${startAll.waves}), one after another with no review between them. You review the last one.`
344
+ }) : null
280
345
  ]
281
346
  }) : null;
282
347
  const waves = state ? /*#__PURE__*/ _jsxs(Accordion, {
@@ -414,6 +479,10 @@ function Frame({ siteName, heading, lede, children }) {
414
479
  severity: "warning",
415
480
  children: notice
416
481
  }),
482
+ aiSiteImportVerdictNote(state) ? /*#__PURE__*/ _jsx(Alert, {
483
+ severity: "warning",
484
+ children: aiSiteImportVerdictNote(state)
485
+ }) : null,
417
486
  /*#__PURE__*/ _jsxs(Stack, {
418
487
  spacing: 1,
419
488
  children: [
@@ -567,6 +636,44 @@ function Frame({ siteName, heading, lede, children }) {
567
636
  ]
568
637
  });
569
638
  }
639
+ // The home page was turned away or could not be read (AGL-4083): nothing was
640
+ // planned or spent, and Check again reads the site again, for free.
641
+ if (phase === 'held' && held) {
642
+ return /*#__PURE__*/ _jsxs(Frame, {
643
+ siteName: siteName,
644
+ heading: held.heading,
645
+ children: [
646
+ notice && /*#__PURE__*/ _jsx(Alert, {
647
+ severity: "warning",
648
+ children: notice
649
+ }),
650
+ /*#__PURE__*/ _jsx(Alert, {
651
+ severity: "warning",
652
+ children: held.message
653
+ }),
654
+ /*#__PURE__*/ _jsxs(Stack, {
655
+ direction: "row",
656
+ spacing: 0.5,
657
+ sx: {
658
+ alignItems: 'center'
659
+ },
660
+ children: [
661
+ /*#__PURE__*/ _jsx(Button, {
662
+ variant: "contained",
663
+ disabled: busy,
664
+ onClick: onResume,
665
+ children: busy ? 'Checking…' : held.action
666
+ }),
667
+ /*#__PURE__*/ _jsx(HelpTip, _extends({}, AI_SITE_IMPORT_HELP.turnedAway, {
668
+ ariaLabel: "How to let AglynBot in"
669
+ }))
670
+ ]
671
+ }),
672
+ leftOutCard,
673
+ cancel
674
+ ]
675
+ });
676
+ }
570
677
  if (phase === 'held' || phase === 'paused') {
571
678
  var _ref2, _ref3;
572
679
  var _job_review1, _job_review2;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../libs/plugins/ai/src/lib/components/ai-site-import-job.component.tsx"],"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\n'use client'\n\nimport { PageHeaderRecord } from '@aglyn/aglyn/app-utils/page-header-record-context'\nimport { buildRoute, Route } from '@aglyn/aglyn/app-utils/console-routes'\nimport {\n mdiAlertCircle,\n mdiCheckCircle,\n mdiChevronDown,\n mdiClockOutline,\n mdiMinusCircleOutline,\n} from '@aglyn/shared-data-mdi'\nimport { AppLink, HelpTip, MdiIcon } from '@aglyn/shared-ui-jsx'\nimport type { MaybeTokenSource } from '@aglyn/shared-util-http/authorized-token'\nimport {\n Accordion,\n AccordionDetails,\n AccordionSummary,\n Alert,\n Box,\n Button,\n Card,\n CircularProgress,\n Container,\n LinearProgress,\n Stack,\n Typography,\n} from '@mui/material'\nimport { useCallback, useState, type ReactNode } from 'react'\nimport type { AiJobSummary } from '../model/ai-jobs.types'\nimport { aiSiteImportReviewWave, aiSiteImportRunningWave, type AiSiteImportWave } from '../model/ai-site-import'\nimport {\n aiSiteImportFoundText,\n aiSiteImportLeftOutLines,\n aiSiteImportPhaseOf,\n aiSiteImportPlanText,\n aiSiteImportStartAction,\n aiSiteImportWaveRows,\n aiSiteImportWaveSpent,\n type AiSiteImportClaim,\n type AiSiteImportRowState,\n} from '../model/ai-site-import-view'\nimport { AiJobCancelButton } from './ai-job-cancel.component'\nimport { aiCreditsBillingHref, aiJobOutputHref } from './ai-job-links'\nimport { AI_SITE_IMPORT_HELP } from './ai-site-import-start.component'\nimport { AiSiteOwnershipProof, postAiSiteOwnership } from './ai-site-ownership-proof.component'\n\nconst ROW_ICON: Readonly<Record<Exclude<AiSiteImportRowState, 'active'>, { path: string; color: string; label: string }>> = {\n done: { path: mdiCheckCircle.path, color: 'success.main', label: 'In' },\n waiting: { path: mdiClockOutline.path, color: 'text.disabled', label: 'Waiting' },\n failed: { path: mdiAlertCircle.path, color: 'error.main', label: 'Could not be brought in' },\n skipped: { path: mdiMinusCircleOutline.path, color: 'text.disabled', label: 'Left out' },\n}\n\nfunction RowIcon({ state }: { state: AiSiteImportRowState }) {\n if (state === 'active') return <CircularProgress size={20} aria-label=\"In progress\" />\n const icon = ROW_ICON[state]\n return (\n <Box component=\"span\" role=\"img\" aria-label={icon.label} sx={{ color: icon.color, display: 'inline-flex', fontSize: (theme) => theme.spacing(2.5) }}>\n <MdiIcon path={icon.path} aria-hidden />\n </Box>\n )\n}\n\n/** One wave's pages: where each was, where it is now, how it went, and its draft to open. */\nfunction WaveRows({ job, wave, orgSlug }: { job: AiJobSummary; wave: AiSiteImportWave; orgSlug: string }) {\n const rows = aiSiteImportWaveRows(job, wave)\n return (\n <Box component=\"ol\" aria-label={wave.label} sx={{ listStyle: 'none', m: 0, p: { xs: 2, sm: 3 } }}>\n <Stack spacing={2}>\n {rows.map((row) => {\n const output = row.outputId ? job.outputs.find((entry) => entry.id === row.outputId) : undefined\n const href = output ? aiJobOutputHref(output, orgSlug) : null\n return (\n <Stack component=\"li\" key={row.slot} direction=\"row\" spacing={2} sx={{ alignItems: 'flex-start' }}>\n <Box sx={{ width: (theme) => theme.spacing(3), display: 'flex', justifyContent: 'center' }}>\n <RowIcon state={row.state} />\n </Box>\n <Box sx={{ flex: 1, minWidth: 0 }}>\n <Stack direction=\"row\" spacing={1} sx={{ alignItems: 'baseline', justifyContent: 'space-between' }}>\n <Typography variant=\"body1\" color={row.state === 'waiting' || row.state === 'skipped' ? 'text.secondary' : 'text.primary'}>\n {row.title}\n </Typography>\n {href && row.state === 'done' ? (\n <Button size=\"small\" component={AppLink} href={href}>\n {'Open draft'}\n </Button>\n ) : null}\n </Stack>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ overflowWrap: 'anywhere' }}>\n {`${row.from} → ${row.to}`}\n </Typography>\n {row.photos ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {row.photos}\n </Typography>\n ) : null}\n {row.note && row.state !== 'done' ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {row.note}\n </Typography>\n ) : null}\n </Box>\n </Stack>\n )\n })}\n </Stack>\n </Box>\n )\n}\n\nfunction Frame({ siteName, heading, lede, children }: { siteName?: string; heading: string; lede?: string; children?: ReactNode }) {\n return (\n <Container maxWidth=\"sm\" sx={{ py: { xs: 3, sm: 5 }, px: { xs: 2, sm: 3 } }}>\n <PageHeaderRecord title={heading} />\n <Stack spacing={4}>\n <Stack spacing={1}>\n {siteName ? (\n <Typography variant=\"overline\" color=\"text.secondary\">\n {siteName}\n </Typography>\n ) : null}\n <Typography variant=\"h4\" component=\"h1\">\n {heading}\n </Typography>\n {lede ? (\n <Typography variant=\"body1\" color=\"text.secondary\">\n {lede}\n </Typography>\n ) : null}\n </Stack>\n {children}\n </Stack>\n </Container>\n )\n}\n\nexport interface AiSiteImportJobProps {\n job: AiJobSummary\n orgId: string | null\n orgSlug: string\n /** The site's subdomain, which its Pages list is addressed by. */\n host: string | null\n siteName?: string\n user: MaybeTokenSource\n busy: boolean\n notice: string | null\n /** Starts the next wave, or reads the site again: the resume door. */\n onResume: () => void\n onJob: (job: AiJobSummary) => void\n}\n\n/**\n * \"Bring my site\" (AGL-3976), on the import job's own page: the site read\n * and its waves planned with each one's quote, a wave running page by page,\n * a wave in for its review with its drafts to open, and the next wave's\n * button — the only way the next one starts. A wave held for a new proof, the\n * day's limit or a site that could not be read says so and offers the way on.\n */\nexport function AiSiteImportJob({ job, orgId, orgSlug, host, siteName, user, busy, notice, onResume, onJob }: AiSiteImportJobProps) {\n const phase = aiSiteImportPhaseOf(job)\n const state = job.siteImport ?? null\n const start = aiSiteImportStartAction(job)\n const pagesHref = host && orgSlug ? buildRoute(Route.HOST_SCREENS, { orgSlug, host }) : null\n const [claim, setClaim] = useState<AiSiteImportClaim | null>(null)\n const [claimNotice, setClaimNotice] = useState<string | null>(null)\n const verifyAgain = useCallback(async () => {\n if (!orgId || !state) return\n setClaimNotice(null)\n const answer = await postAiSiteOwnership(user, { orgId, action: 'claim', domain: state.domain })\n if (answer.claim) setClaim(answer.claim)\n else setClaimNotice(answer.message)\n }, [orgId, state, user])\n\n const cancel = (\n <Box>\n <AiJobCancelButton job={job} user={user} orgId={orgId} onJob={onJob} variant=\"text\" size=\"small\" />\n </Box>\n )\n const startButton = start ? (\n <Stack spacing={1}>\n <Box>\n <Button variant=\"contained\" size=\"large\" disabled={busy} onClick={onResume}>\n {busy ? 'Starting…' : start.label}\n </Button>\n </Box>\n <Stack direction=\"row\" spacing={0.5} sx={{ alignItems: 'center' }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {`${start.quote}, from your AI credits. Every page is a draft until you publish it.`}\n </Typography>\n <HelpTip {...AI_SITE_IMPORT_HELP.waves} ariaLabel=\"How waves work\" />\n </Stack>\n </Stack>\n ) : null\n const waves = state ? (\n <Accordion variant=\"outlined\" disableGutters sx={{ borderRadius: 2, '&::before': { display: 'none' } }}>\n <AccordionSummary expandIcon={<MdiIcon path={mdiChevronDown.path} />}>\n <Typography variant=\"subtitle1\">{`Every wave (${state.waves.length})`}</Typography>\n </AccordionSummary>\n <AccordionDetails>\n <Stack component=\"ol\" spacing={1} sx={{ m: 0, pl: 2.5 }}>\n {state.waves.map((wave) => (\n <Typography component=\"li\" variant=\"body2\" key={wave.index}>\n {`${wave.label}: ${wave.slots.length} ${wave.slots.length === 1 ? 'page' : 'pages'}${wave.frame ? ', with your header and footer' : ''}${\n wave.status === 'done' || wave.status === 'review' ? ' (in)' : wave.status === 'running' ? ' (running)' : ''\n }`}\n </Typography>\n ))}\n </Stack>\n </AccordionDetails>\n </Accordion>\n ) : null\n const leftOut = state ? aiSiteImportLeftOutLines(state) : []\n const leftOutCard = leftOut.length ? (\n <Accordion variant=\"outlined\" disableGutters sx={{ borderRadius: 2, '&::before': { display: 'none' } }}>\n <AccordionSummary expandIcon={<MdiIcon path={mdiChevronDown.path} />}>\n <Typography variant=\"subtitle1\">{`Not brought in (${leftOut.reduce((total, line) => total + line.count, 0)})`}</Typography>\n </AccordionSummary>\n <AccordionDetails>\n <Stack spacing={1.5}>\n {leftOut.map((line) => (\n <Box key={line.reason}>\n <Typography variant=\"body2\">{`${line.count} · ${line.text}`}</Typography>\n {line.paths.length ? (\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ overflowWrap: 'anywhere' }}>\n {line.paths.slice(0, 8).join(', ')}\n {line.paths.length > 8 || line.count > line.paths.length ? ', …' : ''}\n </Typography>\n ) : null}\n {line.reason === 'plan-limit' && orgSlug ? (\n <Button size=\"small\" component={AppLink} href={aiCreditsBillingHref(orgSlug)} sx={{ mt: 0.5 }}>\n {'See plans'}\n </Button>\n ) : null}\n </Box>\n ))}\n </Stack>\n </AccordionDetails>\n </Accordion>\n ) : null\n\n if (phase === 'reading') {\n return (\n <Frame siteName={siteName} heading=\"Reading your site\" lede=\"AglynBot reads robots.txt first, then your sitemap and your pages. Nothing is built yet, and reading uses no AI credits.\">\n <Card variant=\"outlined\" sx={{ borderRadius: 2 }}>\n <LinearProgress aria-label=\"Reading your site\" />\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ p: { xs: 2, sm: 3 } }}>\n {'This takes a minute or two. You can leave this page; we tell you when your site is read.'}\n </Typography>\n </Card>\n {cancel}\n </Frame>\n )\n }\n\n if (phase === 'ready' && state) {\n return (\n <Frame siteName={siteName} heading=\"Your site is read\" lede={job.review?.message ?? undefined}>\n {notice && <Alert severity=\"warning\">{notice}</Alert>}\n <Stack spacing={1}>\n <Typography variant=\"body1\">{aiSiteImportFoundText(state)}</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {aiSiteImportPlanText(state)}\n </Typography>\n </Stack>\n {start ? (\n <Card variant=\"outlined\" sx={{ borderRadius: 2 }}>\n <Typography variant=\"subtitle1\" sx={{ px: { xs: 2, sm: 3 }, pt: { xs: 2, sm: 3 } }}>\n {`First: ${start.wave.label}`}\n </Typography>\n <WaveRows job={job} wave={start.wave} orgSlug={orgSlug} />\n </Card>\n ) : null}\n {startButton}\n {waves}\n {leftOutCard}\n {cancel}\n </Frame>\n )\n }\n\n if ((phase === 'running' || phase === 'starting') && state) {\n const wave = aiSiteImportRunningWave(state) ?? start?.wave ?? null\n const rows = wave ? aiSiteImportWaveRows(job, wave) : []\n const done = rows.filter((row) => row.state !== 'waiting' && row.state !== 'active').length\n return (\n <Frame\n siteName={siteName}\n heading={wave ? `Bringing in ${wave.label}` : 'Bringing in your site'}\n lede=\"Each page is rewritten into your new site’s design with its own words, facts and photos. You review the wave when it is in.\"\n >\n <Card variant=\"outlined\" sx={{ borderRadius: 2 }}>\n {rows.length ? (\n <LinearProgress variant=\"determinate\" value={Math.round((done / rows.length) * 100)} aria-label={`${done} of ${rows.length} in`} />\n ) : (\n <LinearProgress aria-label=\"Starting the wave\" />\n )}\n {wave ? <WaveRows job={job} wave={wave} orgSlug={orgSlug} /> : null}\n </Card>\n {waves}\n {cancel}\n </Frame>\n )\n }\n\n if (phase === 'review' && state) {\n const wave = aiSiteImportReviewWave(state) as AiSiteImportWave\n const spent = aiSiteImportWaveSpent(job, wave)\n return (\n <Frame siteName={siteName} heading={`${wave.label} is in`} lede=\"Open each page to review it. They are drafts: nothing is published until you publish it.\">\n {notice && <Alert severity=\"warning\">{notice}</Alert>}\n <Card variant=\"outlined\" sx={{ borderRadius: 2 }}>\n <WaveRows job={job} wave={wave} orgSlug={orgSlug} />\n </Card>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {`This wave used ${spent.toLocaleString('en-US')} AI ${spent === 1 ? 'credit' : 'credits'}.`}\n </Typography>\n {pagesHref ? (\n <Box>\n <Button variant=\"outlined\" component={AppLink} href={pagesHref}>\n {'Open your draft pages'}\n </Button>\n </Box>\n ) : null}\n {start ? (\n <Card variant=\"outlined\" sx={{ borderRadius: 2 }}>\n <Typography variant=\"subtitle1\" sx={{ px: { xs: 2, sm: 3 }, pt: { xs: 2, sm: 3 } }}>\n {`Next: ${start.wave.label}`}\n </Typography>\n <WaveRows job={job} wave={start.wave} orgSlug={orgSlug} />\n </Card>\n ) : null}\n {startButton}\n {waves}\n {leftOutCard}\n {cancel}\n </Frame>\n )\n }\n\n if (phase === 'held' || phase === 'paused') {\n const ownership = job.review?.reason === 'ownership'\n return (\n <Frame siteName={siteName} heading={ownership ? 'Verify your site again' : phase === 'paused' ? 'Your site import is paused' : 'Your site import is waiting'}>\n {notice && <Alert severity=\"warning\">{notice}</Alert>}\n <Alert severity=\"info\">{job.review?.message ?? job.error ?? 'It stopped for your decision.'}</Alert>\n {ownership && orgId ? (\n claim ? (\n <AiSiteOwnershipProof orgId={orgId} user={user} claim={claim} onClaim={setClaim} />\n ) : (\n <Box>\n <Button variant=\"outlined\" onClick={() => void verifyAgain()}>\n {'Verify again'}\n </Button>\n {claimNotice ? <Alert severity=\"warning\" sx={{ mt: 1 }}>{claimNotice}</Alert> : null}\n </Box>\n )\n ) : null}\n <Stack direction={{ xs: 'column', sm: 'row' }} spacing={2} sx={{ alignItems: { sm: 'center' } }}>\n <Button variant=\"contained\" disabled={busy || (ownership && !claim?.current)} onClick={onResume}>\n {busy ? 'Starting…' : phase === 'paused' ? 'Resume' : start ? `${start.label} again` : 'Read the site again'}\n </Button>\n {phase === 'paused' && orgSlug ? (\n <Button variant=\"outlined\" component={AppLink} href={aiCreditsBillingHref(orgSlug)}>\n {'Get more AI credits'}\n </Button>\n ) : null}\n </Stack>\n {waves}\n {cancel}\n </Frame>\n )\n }\n\n if (phase === 'done' && state) {\n const brought = (job.items ?? []).filter((row) => row.op === 'page' && (row.status === 'succeeded' || row.status === 'degraded')).length\n return (\n <Frame\n siteName={siteName}\n heading=\"Your site is in\"\n lede={`${brought} ${brought === 1 ? 'page was' : 'pages were'} brought in from ${state.domain}. They are drafts: review them, then publish them when you are ready.`}\n >\n {pagesHref ? (\n <Box>\n <Button variant=\"contained\" size=\"large\" component={AppLink} href={pagesHref}>\n {'Open your draft pages'}\n </Button>\n </Box>\n ) : null}\n {state.waves.map((wave) => (\n <Card key={wave.index} variant=\"outlined\" sx={{ borderRadius: 2 }}>\n <Typography variant=\"subtitle1\" sx={{ px: { xs: 2, sm: 3 }, pt: { xs: 2, sm: 3 } }}>\n {wave.label}\n </Typography>\n <WaveRows job={job} wave={wave} orgSlug={orgSlug} />\n </Card>\n ))}\n {leftOutCard}\n </Frame>\n )\n }\n\n return (\n <Frame siteName={siteName} heading={job.status === 'canceled' ? 'Your site import was stopped' : 'Your site import stopped'}>\n <Alert severity=\"info\">\n {job.error ??\n (job.status === 'canceled'\n ? 'Nothing more is brought in. The pages already in stay as drafts.'\n : 'It could not go on. The pages already in stay as drafts.')}\n </Alert>\n {pagesHref ? (\n <Box>\n <Button variant=\"outlined\" component={AppLink} href={pagesHref}>\n {'Open your draft pages'}\n </Button>\n </Box>\n ) : null}\n </Frame>\n )\n}\n\nexport default AiSiteImportJob\n"],"names":["PageHeaderRecord","buildRoute","Route","mdiAlertCircle","mdiCheckCircle","mdiChevronDown","mdiClockOutline","mdiMinusCircleOutline","AppLink","HelpTip","MdiIcon","Accordion","AccordionDetails","AccordionSummary","Alert","Box","Button","Card","CircularProgress","Container","LinearProgress","Stack","Typography","useCallback","useState","aiSiteImportReviewWave","aiSiteImportRunningWave","aiSiteImportFoundText","aiSiteImportLeftOutLines","aiSiteImportPhaseOf","aiSiteImportPlanText","aiSiteImportStartAction","aiSiteImportWaveRows","aiSiteImportWaveSpent","AiJobCancelButton","aiCreditsBillingHref","aiJobOutputHref","AI_SITE_IMPORT_HELP","AiSiteOwnershipProof","postAiSiteOwnership","ROW_ICON","done","path","color","label","waiting","failed","skipped","RowIcon","state","size","aria-label","icon","component","role","sx","display","fontSize","theme","spacing","aria-hidden","WaveRows","job","wave","orgSlug","rows","listStyle","m","p","xs","sm","map","row","output","outputId","outputs","find","entry","id","undefined","href","direction","alignItems","width","justifyContent","flex","minWidth","variant","title","overflowWrap","from","to","photos","note","slot","Frame","siteName","heading","lede","children","maxWidth","py","px","AiSiteImportJob","orgId","host","user","busy","notice","onResume","onJob","phase","siteImport","start","pagesHref","HOST_SCREENS","claim","setClaim","claimNotice","setClaimNotice","verifyAgain","answer","action","domain","message","cancel","startButton","disabled","onClick","quote","waves","ariaLabel","disableGutters","borderRadius","expandIcon","length","pl","slots","frame","status","index","leftOut","leftOutCard","reduce","total","line","count","text","paths","slice","join","reason","mt","review","severity","pt","filter","value","Math","round","spent","toLocaleString","ownership","error","onClaim","current","brought","items","op"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/ai/src/lib/components/ai-site-import-job.component.tsx"],"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\n'use client'\n\nimport { PageHeaderRecord } from '@aglyn/aglyn/app-utils/page-header-record-context'\nimport { buildRoute, Route } from '@aglyn/aglyn/app-utils/console-routes'\nimport {\n mdiAlertCircle,\n mdiCheckCircle,\n mdiChevronDown,\n mdiClockOutline,\n mdiMinusCircleOutline,\n mdiOpenInNew,\n} from '@aglyn/shared-data-mdi'\nimport { AppLink, HelpTip, MdiIcon } from '@aglyn/shared-ui-jsx'\nimport type { MaybeTokenSource } from '@aglyn/shared-util-http/authorized-token'\nimport {\n Accordion,\n AccordionDetails,\n AccordionSummary,\n Alert,\n Box,\n Button,\n Card,\n CircularProgress,\n Container,\n LinearProgress,\n Stack,\n Typography,\n} from '@mui/material'\nimport { useCallback, useState, type ReactNode } from 'react'\nimport type { AiJobSummary } from '../model/ai-jobs.types'\nimport { aiSiteImportReviewWave, aiSiteImportRunningWave, type AiSiteImportWave } from '../model/ai-site-import'\nimport {\n aiSiteImportFoundText,\n aiSiteImportHeldCopy,\n aiSiteImportLeftOutLines,\n aiSiteImportPhaseOf,\n aiSiteImportPlanText,\n aiSiteImportStartAction,\n aiSiteImportStartAllAction,\n aiSiteImportVerdictNote,\n aiSiteImportWaveRows,\n aiSiteImportWaveSpent,\n type AiSiteImportClaim,\n type AiSiteImportRowState,\n} from '../model/ai-site-import-view'\nimport { AiJobCancelButton } from './ai-job-cancel.component'\nimport { aiCreditsBillingHref, aiJobOutputHref } from './ai-job-links'\nimport { AI_SITE_IMPORT_HELP } from './ai-site-import-start.component'\nimport { AiSiteOwnershipProof, postAiSiteOwnership } from './ai-site-ownership-proof.component'\n\nconst ROW_ICON: Readonly<Record<Exclude<AiSiteImportRowState, 'active'>, { path: string; color: string; label: string }>> = {\n done: { path: mdiCheckCircle.path, color: 'success.main', label: 'In' },\n waiting: { path: mdiClockOutline.path, color: 'text.disabled', label: 'Waiting' },\n failed: { path: mdiAlertCircle.path, color: 'error.main', label: 'Could not be brought in' },\n skipped: { path: mdiMinusCircleOutline.path, color: 'text.disabled', label: 'Left out' },\n}\n\nfunction RowIcon({ state }: { state: AiSiteImportRowState }) {\n if (state === 'active') return <CircularProgress size={20} aria-label=\"In progress\" />\n const icon = ROW_ICON[state]\n return (\n <Box component=\"span\" role=\"img\" aria-label={icon.label} sx={{ color: icon.color, display: 'inline-flex', fontSize: (theme) => theme.spacing(2.5) }}>\n <MdiIcon path={icon.path} aria-hidden />\n </Box>\n )\n}\n\n/** One wave's pages: where each was, where it is now, how it went, and its draft to open. */\nfunction WaveRows({ job, wave, orgSlug }: { job: AiJobSummary; wave: AiSiteImportWave; orgSlug: string }) {\n const rows = aiSiteImportWaveRows(job, wave)\n return (\n <Box component=\"ol\" aria-label={wave.label} sx={{ listStyle: 'none', m: 0, p: { xs: 2, sm: 3 } }}>\n <Stack spacing={2}>\n {rows.map((row) => {\n const output = row.outputId ? job.outputs.find((entry) => entry.id === row.outputId) : undefined\n const href = output ? aiJobOutputHref(output, orgSlug) : null\n return (\n <Stack component=\"li\" key={row.slot} direction=\"row\" spacing={2} sx={{ alignItems: 'flex-start' }}>\n <Box sx={{ width: (theme) => theme.spacing(3), display: 'flex', justifyContent: 'center' }}>\n <RowIcon state={row.state} />\n </Box>\n <Box sx={{ flex: 1, minWidth: 0 }}>\n <Stack direction=\"row\" spacing={1} sx={{ alignItems: 'baseline', justifyContent: 'space-between' }}>\n <Typography variant=\"body1\" color={row.state === 'waiting' || row.state === 'skipped' ? 'text.secondary' : 'text.primary'}>\n {row.title}\n </Typography>\n {href && row.state === 'done' ? (\n <Button size=\"small\" component={AppLink} href={href}>\n {'Open draft'}\n </Button>\n ) : null}\n </Stack>\n <Stack direction=\"row\" spacing={1} sx={{ alignItems: 'baseline', flexWrap: 'wrap' }}>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ overflowWrap: 'anywhere' }}>\n {`${row.from} → ${row.to}`}\n </Typography>\n <Button\n size=\"small\"\n component=\"a\"\n href={row.oldPage}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n endIcon={<MdiIcon path={mdiOpenInNew.path} aria-hidden />}\n aria-label={`Old page: ${row.from}, opens in a new tab`}\n sx={{ minWidth: 0, py: 0 }}\n >\n {'Old page'}\n </Button>\n </Stack>\n {row.build || row.words ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {[row.build, row.words].filter(Boolean).join(' · ')}\n </Typography>\n ) : null}\n {row.photos ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {row.photos}\n </Typography>\n ) : null}\n {row.note && row.state !== 'done' ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {row.note}\n </Typography>\n ) : null}\n </Box>\n </Stack>\n )\n })}\n </Stack>\n </Box>\n )\n}\n\nfunction Frame({ siteName, heading, lede, children }: { siteName?: string; heading: string; lede?: string; children?: ReactNode }) {\n return (\n <Container maxWidth=\"sm\" sx={{ py: { xs: 3, sm: 5 }, px: { xs: 2, sm: 3 } }}>\n <PageHeaderRecord title={heading} />\n <Stack spacing={4}>\n <Stack spacing={1}>\n {siteName ? (\n <Typography variant=\"overline\" color=\"text.secondary\">\n {siteName}\n </Typography>\n ) : null}\n <Typography variant=\"h4\" component=\"h1\">\n {heading}\n </Typography>\n {lede ? (\n <Typography variant=\"body1\" color=\"text.secondary\">\n {lede}\n </Typography>\n ) : null}\n </Stack>\n {children}\n </Stack>\n </Container>\n )\n}\n\nexport interface AiSiteImportJobProps {\n job: AiJobSummary\n orgId: string | null\n orgSlug: string\n /** The site's subdomain, which its Pages list is addressed by. */\n host: string | null\n siteName?: string\n user: MaybeTokenSource\n busy: boolean\n notice: string | null\n /** Starts the next wave, or reads the site again: the resume door. */\n onResume: () => void\n /**\n * Starts every remaining wave with no review between them (AGL-4083). The\n * button is drawn only where the page can start them this way.\n */\n onStartAll?: () => void\n onJob: (job: AiJobSummary) => void\n}\n\n/**\n * \"Bring my site\" (AGL-3976), on the import job's own page: the site read\n * and its waves planned with each one's quote, a wave running page by page,\n * a wave in for its review with its drafts to open, and the next wave's\n * button — the only way the next one starts. A wave held for a new proof, the\n * day's limit or a site that could not be read says so and offers the way on.\n */\nexport function AiSiteImportJob({ job, orgId, orgSlug, host, siteName, user, busy, notice, onResume, onStartAll, onJob }: AiSiteImportJobProps) {\n const phase = aiSiteImportPhaseOf(job)\n const state = job.siteImport ?? null\n const start = aiSiteImportStartAction(job)\n const startAll = onStartAll ? aiSiteImportStartAllAction(job) : null\n const held = aiSiteImportHeldCopy(job)\n const pagesHref = host && orgSlug ? buildRoute(Route.HOST_SCREENS, { orgSlug, host }) : null\n const [claim, setClaim] = useState<AiSiteImportClaim | null>(null)\n const [claimNotice, setClaimNotice] = useState<string | null>(null)\n const verifyAgain = useCallback(async () => {\n if (!orgId || !state) return\n setClaimNotice(null)\n const answer = await postAiSiteOwnership(user, { orgId, action: 'claim', domain: state.domain })\n if (answer.claim) setClaim(answer.claim)\n else setClaimNotice(answer.message)\n }, [orgId, state, user])\n\n const cancel = (\n <Box>\n <AiJobCancelButton job={job} user={user} orgId={orgId} onJob={onJob} variant=\"text\" size=\"small\" />\n </Box>\n )\n const startButton = start ? (\n <Stack spacing={1}>\n <Stack direction={{ xs: 'column', sm: 'row' }} spacing={1.5} sx={{ alignItems: { sm: 'center' } }}>\n <Box>\n <Button variant=\"contained\" size=\"large\" disabled={busy} onClick={onResume}>\n {busy ? 'Starting…' : start.label}\n </Button>\n </Box>\n {startAll && onStartAll ? (\n <Box>\n <Button variant=\"outlined\" size=\"large\" disabled={busy} onClick={onStartAll}>\n {startAll.label}\n </Button>\n </Box>\n ) : null}\n </Stack>\n <Stack direction=\"row\" spacing={0.5} sx={{ alignItems: 'center' }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {`${start.quote}, from your AI credits. Every page is a draft until you publish it.`}\n </Typography>\n <HelpTip {...AI_SITE_IMPORT_HELP.waves} ariaLabel=\"How waves work\" />\n </Stack>\n {startAll && onStartAll ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {`${startAll.quote} for every remaining wave (${startAll.waves}), one after another with no review between them. You review the last one.`}\n </Typography>\n ) : null}\n </Stack>\n ) : null\n const waves = state ? (\n <Accordion variant=\"outlined\" disableGutters sx={{ borderRadius: 2, '&::before': { display: 'none' } }}>\n <AccordionSummary expandIcon={<MdiIcon path={mdiChevronDown.path} />}>\n <Typography variant=\"subtitle1\">{`Every wave (${state.waves.length})`}</Typography>\n </AccordionSummary>\n <AccordionDetails>\n <Stack component=\"ol\" spacing={1} sx={{ m: 0, pl: 2.5 }}>\n {state.waves.map((wave) => (\n <Typography component=\"li\" variant=\"body2\" key={wave.index}>\n {`${wave.label}: ${wave.slots.length} ${wave.slots.length === 1 ? 'page' : 'pages'}${wave.frame ? ', with your header and footer' : ''}${\n wave.status === 'done' || wave.status === 'review' ? ' (in)' : wave.status === 'running' ? ' (running)' : ''\n }`}\n </Typography>\n ))}\n </Stack>\n </AccordionDetails>\n </Accordion>\n ) : null\n const leftOut = state ? aiSiteImportLeftOutLines(state) : []\n const leftOutCard = leftOut.length ? (\n <Accordion variant=\"outlined\" disableGutters sx={{ borderRadius: 2, '&::before': { display: 'none' } }}>\n <AccordionSummary expandIcon={<MdiIcon path={mdiChevronDown.path} />}>\n <Typography variant=\"subtitle1\">{`Not brought in (${leftOut.reduce((total, line) => total + line.count, 0)})`}</Typography>\n </AccordionSummary>\n <AccordionDetails>\n <Stack spacing={1.5}>\n {leftOut.map((line) => (\n <Box key={line.reason}>\n <Typography variant=\"body2\">{`${line.count} · ${line.text}`}</Typography>\n {line.paths.length ? (\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ overflowWrap: 'anywhere' }}>\n {line.paths.slice(0, 8).join(', ')}\n {line.paths.length > 8 || line.count > line.paths.length ? ', …' : ''}\n </Typography>\n ) : null}\n {line.reason === 'plan-limit' && orgSlug ? (\n <Button size=\"small\" component={AppLink} href={aiCreditsBillingHref(orgSlug)} sx={{ mt: 0.5 }}>\n {'See plans'}\n </Button>\n ) : null}\n </Box>\n ))}\n </Stack>\n </AccordionDetails>\n </Accordion>\n ) : null\n\n if (phase === 'reading') {\n return (\n <Frame siteName={siteName} heading=\"Reading your site\" lede=\"AglynBot reads robots.txt first, then your sitemap and your pages. Nothing is built yet, and reading uses no AI credits.\">\n <Card variant=\"outlined\" sx={{ borderRadius: 2 }}>\n <LinearProgress aria-label=\"Reading your site\" />\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ p: { xs: 2, sm: 3 } }}>\n {'This takes a minute or two. You can leave this page; we tell you when your site is read.'}\n </Typography>\n </Card>\n {cancel}\n </Frame>\n )\n }\n\n if (phase === 'ready' && state) {\n return (\n <Frame siteName={siteName} heading=\"Your site is read\" lede={job.review?.message ?? undefined}>\n {notice && <Alert severity=\"warning\">{notice}</Alert>}\n {aiSiteImportVerdictNote(state) ? <Alert severity=\"warning\">{aiSiteImportVerdictNote(state)}</Alert> : null}\n <Stack spacing={1}>\n <Typography variant=\"body1\">{aiSiteImportFoundText(state)}</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {aiSiteImportPlanText(state)}\n </Typography>\n </Stack>\n {start ? (\n <Card variant=\"outlined\" sx={{ borderRadius: 2 }}>\n <Typography variant=\"subtitle1\" sx={{ px: { xs: 2, sm: 3 }, pt: { xs: 2, sm: 3 } }}>\n {`First: ${start.wave.label}`}\n </Typography>\n <WaveRows job={job} wave={start.wave} orgSlug={orgSlug} />\n </Card>\n ) : null}\n {startButton}\n {waves}\n {leftOutCard}\n {cancel}\n </Frame>\n )\n }\n\n if ((phase === 'running' || phase === 'starting') && state) {\n const wave = aiSiteImportRunningWave(state) ?? start?.wave ?? null\n const rows = wave ? aiSiteImportWaveRows(job, wave) : []\n const done = rows.filter((row) => row.state !== 'waiting' && row.state !== 'active').length\n return (\n <Frame\n siteName={siteName}\n heading={wave ? `Bringing in ${wave.label}` : 'Bringing in your site'}\n lede=\"Each page is rewritten into your new site’s design with its own words, facts and photos. You review the wave when it is in.\"\n >\n <Card variant=\"outlined\" sx={{ borderRadius: 2 }}>\n {rows.length ? (\n <LinearProgress variant=\"determinate\" value={Math.round((done / rows.length) * 100)} aria-label={`${done} of ${rows.length} in`} />\n ) : (\n <LinearProgress aria-label=\"Starting the wave\" />\n )}\n {wave ? <WaveRows job={job} wave={wave} orgSlug={orgSlug} /> : null}\n </Card>\n {waves}\n {cancel}\n </Frame>\n )\n }\n\n if (phase === 'review' && state) {\n const wave = aiSiteImportReviewWave(state) as AiSiteImportWave\n const spent = aiSiteImportWaveSpent(job, wave)\n return (\n <Frame siteName={siteName} heading={`${wave.label} is in`} lede=\"Open each page to review it. They are drafts: nothing is published until you publish it.\">\n {notice && <Alert severity=\"warning\">{notice}</Alert>}\n <Card variant=\"outlined\" sx={{ borderRadius: 2 }}>\n <WaveRows job={job} wave={wave} orgSlug={orgSlug} />\n </Card>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {`This wave used ${spent.toLocaleString('en-US')} AI ${spent === 1 ? 'credit' : 'credits'}.`}\n </Typography>\n {pagesHref ? (\n <Box>\n <Button variant=\"outlined\" component={AppLink} href={pagesHref}>\n {'Open your draft pages'}\n </Button>\n </Box>\n ) : null}\n {start ? (\n <Card variant=\"outlined\" sx={{ borderRadius: 2 }}>\n <Typography variant=\"subtitle1\" sx={{ px: { xs: 2, sm: 3 }, pt: { xs: 2, sm: 3 } }}>\n {`Next: ${start.wave.label}`}\n </Typography>\n <WaveRows job={job} wave={start.wave} orgSlug={orgSlug} />\n </Card>\n ) : null}\n {startButton}\n {waves}\n {leftOutCard}\n {cancel}\n </Frame>\n )\n }\n\n // The home page was turned away or could not be read (AGL-4083): nothing was\n // planned or spent, and Check again reads the site again, for free.\n if (phase === 'held' && held) {\n return (\n <Frame siteName={siteName} heading={held.heading}>\n {notice && <Alert severity=\"warning\">{notice}</Alert>}\n <Alert severity=\"warning\">{held.message}</Alert>\n <Stack direction=\"row\" spacing={0.5} sx={{ alignItems: 'center' }}>\n <Button variant=\"contained\" disabled={busy} onClick={onResume}>\n {busy ? 'Checking…' : held.action}\n </Button>\n <HelpTip {...AI_SITE_IMPORT_HELP.turnedAway} ariaLabel=\"How to let AglynBot in\" />\n </Stack>\n {leftOutCard}\n {cancel}\n </Frame>\n )\n }\n\n if (phase === 'held' || phase === 'paused') {\n const ownership = job.review?.reason === 'ownership'\n return (\n <Frame siteName={siteName} heading={ownership ? 'Verify your site again' : phase === 'paused' ? 'Your site import is paused' : 'Your site import is waiting'}>\n {notice && <Alert severity=\"warning\">{notice}</Alert>}\n <Alert severity=\"info\">{job.review?.message ?? job.error ?? 'It stopped for your decision.'}</Alert>\n {ownership && orgId ? (\n claim ? (\n <AiSiteOwnershipProof orgId={orgId} user={user} claim={claim} onClaim={setClaim} />\n ) : (\n <Box>\n <Button variant=\"outlined\" onClick={() => void verifyAgain()}>\n {'Verify again'}\n </Button>\n {claimNotice ? <Alert severity=\"warning\" sx={{ mt: 1 }}>{claimNotice}</Alert> : null}\n </Box>\n )\n ) : null}\n <Stack direction={{ xs: 'column', sm: 'row' }} spacing={2} sx={{ alignItems: { sm: 'center' } }}>\n <Button variant=\"contained\" disabled={busy || (ownership && !claim?.current)} onClick={onResume}>\n {busy ? 'Starting…' : phase === 'paused' ? 'Resume' : start ? `${start.label} again` : 'Read the site again'}\n </Button>\n {phase === 'paused' && orgSlug ? (\n <Button variant=\"outlined\" component={AppLink} href={aiCreditsBillingHref(orgSlug)}>\n {'Get more AI credits'}\n </Button>\n ) : null}\n </Stack>\n {waves}\n {cancel}\n </Frame>\n )\n }\n\n if (phase === 'done' && state) {\n const brought = (job.items ?? []).filter((row) => row.op === 'page' && (row.status === 'succeeded' || row.status === 'degraded')).length\n return (\n <Frame\n siteName={siteName}\n heading=\"Your site is in\"\n lede={`${brought} ${brought === 1 ? 'page was' : 'pages were'} brought in from ${state.domain}. They are drafts: review them, then publish them when you are ready.`}\n >\n {pagesHref ? (\n <Box>\n <Button variant=\"contained\" size=\"large\" component={AppLink} href={pagesHref}>\n {'Open your draft pages'}\n </Button>\n </Box>\n ) : null}\n {state.waves.map((wave) => (\n <Card key={wave.index} variant=\"outlined\" sx={{ borderRadius: 2 }}>\n <Typography variant=\"subtitle1\" sx={{ px: { xs: 2, sm: 3 }, pt: { xs: 2, sm: 3 } }}>\n {wave.label}\n </Typography>\n <WaveRows job={job} wave={wave} orgSlug={orgSlug} />\n </Card>\n ))}\n {leftOutCard}\n </Frame>\n )\n }\n\n return (\n <Frame siteName={siteName} heading={job.status === 'canceled' ? 'Your site import was stopped' : 'Your site import stopped'}>\n <Alert severity=\"info\">\n {job.error ??\n (job.status === 'canceled'\n ? 'Nothing more is brought in. The pages already in stay as drafts.'\n : 'It could not go on. The pages already in stay as drafts.')}\n </Alert>\n {pagesHref ? (\n <Box>\n <Button variant=\"outlined\" component={AppLink} href={pagesHref}>\n {'Open your draft pages'}\n </Button>\n </Box>\n ) : null}\n </Frame>\n )\n}\n\nexport default AiSiteImportJob\n"],"names":["PageHeaderRecord","buildRoute","Route","mdiAlertCircle","mdiCheckCircle","mdiChevronDown","mdiClockOutline","mdiMinusCircleOutline","mdiOpenInNew","AppLink","HelpTip","MdiIcon","Accordion","AccordionDetails","AccordionSummary","Alert","Box","Button","Card","CircularProgress","Container","LinearProgress","Stack","Typography","useCallback","useState","aiSiteImportReviewWave","aiSiteImportRunningWave","aiSiteImportFoundText","aiSiteImportHeldCopy","aiSiteImportLeftOutLines","aiSiteImportPhaseOf","aiSiteImportPlanText","aiSiteImportStartAction","aiSiteImportStartAllAction","aiSiteImportVerdictNote","aiSiteImportWaveRows","aiSiteImportWaveSpent","AiJobCancelButton","aiCreditsBillingHref","aiJobOutputHref","AI_SITE_IMPORT_HELP","AiSiteOwnershipProof","postAiSiteOwnership","ROW_ICON","done","path","color","label","waiting","failed","skipped","RowIcon","state","size","aria-label","icon","component","role","sx","display","fontSize","theme","spacing","aria-hidden","WaveRows","job","wave","orgSlug","rows","listStyle","m","p","xs","sm","map","row","output","outputId","outputs","find","entry","id","undefined","href","direction","alignItems","width","justifyContent","flex","minWidth","variant","title","flexWrap","overflowWrap","from","to","oldPage","target","rel","endIcon","py","build","words","filter","Boolean","join","photos","note","slot","Frame","siteName","heading","lede","children","maxWidth","px","AiSiteImportJob","orgId","host","user","busy","notice","onResume","onStartAll","onJob","phase","siteImport","start","startAll","held","pagesHref","HOST_SCREENS","claim","setClaim","claimNotice","setClaimNotice","verifyAgain","answer","action","domain","message","cancel","startButton","disabled","onClick","quote","waves","ariaLabel","disableGutters","borderRadius","expandIcon","length","pl","slots","frame","status","index","leftOut","leftOutCard","reduce","total","line","count","text","paths","slice","reason","mt","review","severity","pt","value","Math","round","spent","toLocaleString","turnedAway","ownership","error","onClaim","current","brought","items","op"],"mappings":"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"}
@@ -36,6 +36,12 @@ export declare const AI_SITE_IMPORT_HELP: {
36
36
  excerptText: string;
37
37
  href: string;
38
38
  };
39
+ turnedAway: {
40
+ title: string;
41
+ excerpt: import("react").ReactNode;
42
+ excerptText: string;
43
+ href: string;
44
+ };
39
45
  };
40
46
  export interface AiSiteImportStartProps {
41
47
  orgId: string;
@@ -40,6 +40,10 @@ import { AiSiteOwnershipProof, postAiSiteOwnership } from "./ai-site-ownership-p
40
40
  waves: pluginDocsHelp('aiImport', {
41
41
  anchor: '#waves',
42
42
  excerpt: 'Your main pages come in first, then each collection, such as blog posts, ten pages at a time. You review each wave and start the next yourself.'
43
+ }),
44
+ turnedAway: pluginDocsHelp('aiImport', {
45
+ anchor: '#turned-away',
46
+ excerpt: 'Allow AglynBot in your site’s bot protection or firewall settings, then choose Check again. Reading your site again uses no AI credits.'
43
47
  })
44
48
  };
45
49
  /**
@@ -122,7 +126,11 @@ import { AiSiteOwnershipProof, postAiSiteOwnership } from "./ai-site-ownership-p
122
126
  if (!hostId && pendingSite) {
123
127
  // Asked before the site exists, so a refusal creates nothing (AGL-3859).
124
128
  if (!pendingSite.created && !await refused(await requestJob(null, true))) return;
125
- const made = await pendingSite.create();
129
+ // A site brought in starts in preview unless the person switched it
130
+ // off (AGL-4086): its pages arrive here before anyone has looked.
131
+ const made = await pendingSite.create({
132
+ start: 'import'
133
+ });
126
134
  if ('error' in made) {
127
135
  setNotice(made.error);
128
136
  if (made.address) onBack();
@@ -270,12 +278,17 @@ import { AiSiteOwnershipProof, postAiSiteOwnership } from "./ai-site-ownership-p
270
278
  /*#__PURE__*/ _jsx(Typography, {
271
279
  component: "li",
272
280
  variant: "body2",
273
- children: `AglynBot reads your site, as many pages as your plan includes: your main pages first, then collections such as blog posts.`
281
+ children: `AglynBot reads your whole site, home page first, as many pages as your plan includes: your main pages first, then collections such as blog posts.`
282
+ }),
283
+ /*#__PURE__*/ _jsx(Typography, {
284
+ component: "li",
285
+ variant: "body2",
286
+ children: `You see what was found, what could not be read and why, and what each wave of up to ${AI_SITE_IMPORT_WAVE_PAGES} pages costs before anything is built. Reading your site uses no AI credits.`
274
287
  }),
275
288
  /*#__PURE__*/ _jsx(Typography, {
276
289
  component: "li",
277
290
  variant: "body2",
278
- children: `You see what was found and what each wave of up to ${AI_SITE_IMPORT_WAVE_PAGES} pages costs before anything is built. Reading your site uses no AI credits.`
291
+ children: 'If your home page cannot be read, nothing is planned and no AI credits are used. You are told why, and you check again once it can be.'
279
292
  }),
280
293
  /*#__PURE__*/ _jsx(Typography, {
281
294
  component: "li",
@@ -288,7 +301,8 @@ import { AiSiteOwnershipProof, postAiSiteOwnership } from "./ai-site-ownership-p
288
301
  children: 'Every page is a draft. Nothing is published until you publish it, and your current site is not changed.'
289
302
  })
290
303
  ]
291
- })
304
+ }),
305
+ !hostId && pendingSite && !pendingSite.created ? pendingSite.previewControl == null ? void 0 : pendingSite.previewControl.call(pendingSite, 'import') : null
292
306
  ]
293
307
  }),
294
308
  /*#__PURE__*/ _jsxs(Stack, {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../libs/plugins/ai/src/lib/components/ai-site-import-start.component.tsx"],"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\n'use client'\n\nimport { lockdownRefusalText, parseLockdownRefusal, PLATFORM_BRAND_NAME } from '@aglyn/aglyn'\nimport type { ConsolePendingSite } from '@aglyn/aglyn/plugin-manager/feature-plugins'\nimport { pluginDocsHelp } from '@aglyn/aglyn/app-utils/docs-help'\nimport { mdiWebSync } from '@aglyn/shared-data-mdi'\nimport { HelpTip, MdiIcon } from '@aglyn/shared-ui-jsx'\nimport { authorizedFetch, type MaybeTokenSource } from '@aglyn/shared-util-http/authorized-token'\nimport { Alert, Box, Button, Stack, TextField, Typography } from '@mui/material'\nimport { useRouter } from 'next/navigation'\nimport { useCallback, useRef, useState } from 'react'\nimport type { AiJobSummary } from '../model/ai-jobs.types'\nimport { AI_SITE_IMPORT_DOMAIN_INPUT, AI_SITE_IMPORT_KIND, AI_SITE_IMPORT_WAVE_PAGES } from '../model/ai-site-import'\nimport type { AiSiteImportClaim } from '../model/ai-site-import-view'\nimport { aiSiteBuildHref } from './ai-job-links'\nimport { publishAiJob } from './ai-jobs-store'\nimport { AiSiteOwnershipProof, postAiSiteOwnership } from './ai-site-ownership-proof.component'\n\n/** Each part of the flow links its own section of the Bring my site guide. */\nexport const AI_SITE_IMPORT_HELP = {\n address: pluginDocsHelp('aiImport', {\n anchor: '#your-current-website',\n excerpt: 'The address people type to reach your site today. You prove it is yours next, so only a site you own can be brought in.',\n }),\n prove: pluginDocsHelp('aiImport', {\n anchor: '#prove-it-is-yours',\n excerpt: 'Add a DNS record, add a tag to your home page, or get a code at an address at your domain. Any one is enough.',\n }),\n waves: pluginDocsHelp('aiImport', {\n anchor: '#waves',\n excerpt: 'Your main pages come in first, then each collection, such as blog posts, ten pages at a time. You review each wave and start the next yourself.',\n }),\n}\n\ntype Step = 'address' | 'prove' | 'read'\n\nexport interface AiSiteImportStartProps {\n orgId: string\n orgSlug: string | null\n hostId: string | null\n host: string | null\n user: MaybeTokenSource\n /** The site being created by \"Create site\", when it does not exist yet (AGL-3761). */\n pendingSite?: ConsolePendingSite\n /** Back to how the site starts. */\n onBack: () => void\n /** The dialog closes before the job's page opens. */\n leave?: () => void\n}\n\n/**\n * \"Bring my site\" (AGL-3976): the address of the site the person has now,\n * the proof that it is theirs, and what happens next — then the site is read\n * and its waves planned, nothing built, on the import job's own page.\n *\n * Nothing is created until \"Read my site\": the site in Create site is made\n * then, empty, and the import job is started on it. The job reads the site\n * and waits for the person to start its first wave, so even this costs no\n * AI credits.\n */\nexport function AiSiteImportStart({ orgId, orgSlug, hostId, host, user, pendingSite, onBack, leave }: AiSiteImportStartProps) {\n const router = useRouter()\n const userRef = useRef(user)\n userRef.current = user\n const [step, setStep] = useState<Step>('address')\n const [address, setAddress] = useState('')\n const [claim, setClaim] = useState<AiSiteImportClaim | null>(null)\n const [notice, setNotice] = useState<string | null>(null)\n const [busy, setBusy] = useState(false)\n // A site already verified skips the proof step, and Back skips it too.\n const [proved, setProved] = useState(false)\n\n const claimIt = useCallback(async () => {\n setBusy(true)\n setNotice(null)\n const answer = await postAiSiteOwnership(userRef.current, { orgId, action: 'claim', domain: address })\n setBusy(false)\n if (!answer.claim) {\n setNotice(answer.message ?? 'That address could not be used.')\n return\n }\n setClaim(answer.claim)\n setProved(!answer.claim.current)\n setStep(answer.claim.current ? 'read' : 'prove')\n }, [orgId, address])\n\n const read = useCallback(async () => {\n if (!claim?.current) return\n setBusy(true)\n setNotice(null)\n try {\n const requestJob = (siteId: string | null, check: boolean) =>\n authorizedFetch(userRef.current, '/api/ai/jobs', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n orgId,\n hostId: siteId,\n kind: AI_SITE_IMPORT_KIND,\n brief: `Bring in ${claim.domain}`,\n inputs: { [AI_SITE_IMPORT_DOMAIN_INPUT]: claim.domain },\n ...(check ? { check: true } : {}),\n }),\n })\n const refused = async (response: Response): Promise<Record<string, unknown> | null> => {\n const payload = (await response.json().catch(() => null)) as Record<string, unknown> | null\n if (response.ok) return payload ?? {}\n const locked = parseLockdownRefusal(response.status, payload)\n setNotice(locked ? lockdownRefusalText(locked) : String(payload?.['error'] ?? 'Your site could not be read. Try again.'))\n return null\n }\n let site = { hostId, host, orgSlug }\n if (!hostId && pendingSite) {\n // Asked before the site exists, so a refusal creates nothing (AGL-3859).\n if (!pendingSite.created && !(await refused(await requestJob(null, true)))) return\n const made = await pendingSite.create()\n if ('error' in made) {\n setNotice(made.error)\n if (made.address) onBack()\n return\n }\n site = { hostId: made.hostId, host: made.host, orgSlug: made.orgSlug || orgSlug }\n }\n if (!site.hostId) return\n const payload = await refused(await requestJob(site.hostId, false))\n const job = (payload?.['job'] as AiJobSummary | undefined) ?? null\n if (!job) {\n if (payload) setNotice('Your site could not be read. Try again.')\n return\n }\n publishAiJob(job)\n const href = aiSiteBuildHref(site.orgSlug, site.host, job.id)\n if (href) {\n leave?.()\n router.push(href)\n }\n } catch {\n setNotice('Your site could not be read. Try again.')\n } finally {\n setBusy(false)\n }\n }, [claim, orgId, hostId, host, orgSlug, pendingSite, onBack, leave, router])\n\n const back = () => {\n setNotice(null)\n if (step === 'address') onBack()\n else if (step === 'prove') setStep('address')\n else setStep(proved ? 'prove' : 'address')\n }\n\n return (\n <Stack spacing={3} component=\"section\" aria-label=\"Bring my site\" data-start-area=\"import\">\n {notice && <Alert severity=\"info\">{notice}</Alert>}\n {step === 'address' && (\n <Stack spacing={2}>\n <Stack direction=\"row\" spacing={0.5} sx={{ alignItems: 'center' }}>\n <Typography variant=\"subtitle1\" component=\"h2\">\n {'Your current website'}\n </Typography>\n <HelpTip {...AI_SITE_IMPORT_HELP.address} />\n </Stack>\n <TextField\n label=\"Website address\"\n placeholder=\"example.com\"\n value={address}\n autoFocus\n onChange={(event) => setAddress(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter' && address.trim() && !busy) {\n event.preventDefault()\n void claimIt()\n }\n }}\n helperText=\"The address people type to reach your site today. You prove it is yours next.\"\n />\n </Stack>\n )}\n {step === 'prove' && claim && (\n <Stack spacing={2}>\n <Stack direction=\"row\" spacing={0.5} sx={{ alignItems: 'center' }}>\n <Typography variant=\"subtitle1\" component=\"h2\">\n {'Prove it is yours'}\n </Typography>\n <HelpTip {...AI_SITE_IMPORT_HELP.prove} />\n </Stack>\n <AiSiteOwnershipProof orgId={orgId} user={user} claim={claim} onClaim={setClaim} />\n </Stack>\n )}\n {step === 'read' && claim && (\n <Stack spacing={2}>\n <Stack direction=\"row\" spacing={0.5} sx={{ alignItems: 'center' }}>\n <Typography variant=\"subtitle1\" component=\"h2\">\n {`Bring in ${claim.domain}`}\n </Typography>\n <HelpTip {...AI_SITE_IMPORT_HELP.waves} />\n </Stack>\n <Box component=\"ul\" sx={{ m: 0, pl: 3, '& li': { mb: 1 } }}>\n <Typography component=\"li\" variant=\"body2\">\n {`AglynBot reads your site, as many pages as your plan includes: your main pages first, then collections such as blog posts.`}\n </Typography>\n <Typography component=\"li\" variant=\"body2\">\n {`You see what was found and what each wave of up to ${AI_SITE_IMPORT_WAVE_PAGES} pages costs before anything is built. Reading your site uses no AI credits.`}\n </Typography>\n <Typography component=\"li\" variant=\"body2\">\n {`${PLATFORM_BRAND_NAME} AI rewrites each page into your new site’s design, with its words, facts and photos. You review each wave and start the next yourself.`}\n </Typography>\n <Typography component=\"li\" variant=\"body2\">\n {'Every page is a draft. Nothing is published until you publish it, and your current site is not changed.'}\n </Typography>\n </Box>\n </Stack>\n )}\n <Stack direction=\"row\" spacing={1} sx={{ justifyContent: 'space-between' }}>\n <Button onClick={back} disabled={busy}>\n {'Back'}\n </Button>\n {step === 'address' && (\n <Button variant=\"contained\" disabled={busy || !address.trim()} onClick={() => void claimIt()}>\n {busy ? 'Checking…' : 'Next'}\n </Button>\n )}\n {step === 'prove' && (\n <Button variant=\"contained\" disabled={!claim?.current} onClick={() => setStep('read')}>\n {'Next'}\n </Button>\n )}\n {step === 'read' && (\n <Button\n variant=\"contained\"\n size=\"large\"\n disabled={busy || !claim?.current}\n onClick={() => void read()}\n startIcon={<MdiIcon path={mdiWebSync.path} />}\n >\n {busy ? 'Starting…' : 'Read my site'}\n </Button>\n )}\n </Stack>\n </Stack>\n )\n}\n\nexport default AiSiteImportStart\n"],"names":["lockdownRefusalText","parseLockdownRefusal","PLATFORM_BRAND_NAME","pluginDocsHelp","mdiWebSync","HelpTip","MdiIcon","authorizedFetch","Alert","Box","Button","Stack","TextField","Typography","useRouter","useCallback","useRef","useState","AI_SITE_IMPORT_DOMAIN_INPUT","AI_SITE_IMPORT_KIND","AI_SITE_IMPORT_WAVE_PAGES","aiSiteBuildHref","publishAiJob","AiSiteOwnershipProof","postAiSiteOwnership","AI_SITE_IMPORT_HELP","address","anchor","excerpt","prove","waves","AiSiteImportStart","orgId","orgSlug","hostId","host","user","pendingSite","onBack","leave","router","userRef","current","step","setStep","setAddress","claim","setClaim","notice","setNotice","busy","setBusy","proved","setProved","claimIt","answer","action","domain","message","read","requestJob","siteId","check","method","headers","body","JSON","stringify","kind","brief","inputs","refused","response","payload","json","catch","ok","locked","status","String","site","created","made","create","error","job","href","id","push","back","spacing","component","aria-label","data-start-area","severity","direction","sx","alignItems","variant","label","placeholder","value","autoFocus","onChange","event","target","onKeyDown","key","trim","preventDefault","helperText","onClaim","m","pl","mb","justifyContent","onClick","disabled","size","startIcon","path"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/ai/src/lib/components/ai-site-import-start.component.tsx"],"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\n'use client'\n\nimport { lockdownRefusalText, parseLockdownRefusal, PLATFORM_BRAND_NAME } from '@aglyn/aglyn'\nimport type { ConsolePendingSite } from '@aglyn/aglyn/plugin-manager/feature-plugins'\nimport { pluginDocsHelp } from '@aglyn/aglyn/app-utils/docs-help'\nimport { mdiWebSync } from '@aglyn/shared-data-mdi'\nimport { HelpTip, MdiIcon } from '@aglyn/shared-ui-jsx'\nimport { authorizedFetch, type MaybeTokenSource } from '@aglyn/shared-util-http/authorized-token'\nimport { Alert, Box, Button, Stack, TextField, Typography } from '@mui/material'\nimport { useRouter } from 'next/navigation'\nimport { useCallback, useRef, useState } from 'react'\nimport type { AiJobSummary } from '../model/ai-jobs.types'\nimport { AI_SITE_IMPORT_DOMAIN_INPUT, AI_SITE_IMPORT_KIND, AI_SITE_IMPORT_WAVE_PAGES } from '../model/ai-site-import'\nimport type { AiSiteImportClaim } from '../model/ai-site-import-view'\nimport { aiSiteBuildHref } from './ai-job-links'\nimport { publishAiJob } from './ai-jobs-store'\nimport { AiSiteOwnershipProof, postAiSiteOwnership } from './ai-site-ownership-proof.component'\n\n/** Each part of the flow links its own section of the Bring my site guide. */\nexport const AI_SITE_IMPORT_HELP = {\n address: pluginDocsHelp('aiImport', {\n anchor: '#your-current-website',\n excerpt: 'The address people type to reach your site today. You prove it is yours next, so only a site you own can be brought in.',\n }),\n prove: pluginDocsHelp('aiImport', {\n anchor: '#prove-it-is-yours',\n excerpt: 'Add a DNS record, add a tag to your home page, or get a code at an address at your domain. Any one is enough.',\n }),\n waves: pluginDocsHelp('aiImport', {\n anchor: '#waves',\n excerpt: 'Your main pages come in first, then each collection, such as blog posts, ten pages at a time. You review each wave and start the next yourself.',\n }),\n turnedAway: pluginDocsHelp('aiImport', {\n anchor: '#turned-away',\n excerpt: 'Allow AglynBot in your site’s bot protection or firewall settings, then choose Check again. Reading your site again uses no AI credits.',\n }),\n}\n\ntype Step = 'address' | 'prove' | 'read'\n\nexport interface AiSiteImportStartProps {\n orgId: string\n orgSlug: string | null\n hostId: string | null\n host: string | null\n user: MaybeTokenSource\n /** The site being created by \"Create site\", when it does not exist yet (AGL-3761). */\n pendingSite?: ConsolePendingSite\n /** Back to how the site starts. */\n onBack: () => void\n /** The dialog closes before the job's page opens. */\n leave?: () => void\n}\n\n/**\n * \"Bring my site\" (AGL-3976): the address of the site the person has now,\n * the proof that it is theirs, and what happens next — then the site is read\n * and its waves planned, nothing built, on the import job's own page.\n *\n * Nothing is created until \"Read my site\": the site in Create site is made\n * then, empty, and the import job is started on it. The job reads the site\n * and waits for the person to start its first wave, so even this costs no\n * AI credits.\n */\nexport function AiSiteImportStart({ orgId, orgSlug, hostId, host, user, pendingSite, onBack, leave }: AiSiteImportStartProps) {\n const router = useRouter()\n const userRef = useRef(user)\n userRef.current = user\n const [step, setStep] = useState<Step>('address')\n const [address, setAddress] = useState('')\n const [claim, setClaim] = useState<AiSiteImportClaim | null>(null)\n const [notice, setNotice] = useState<string | null>(null)\n const [busy, setBusy] = useState(false)\n // A site already verified skips the proof step, and Back skips it too.\n const [proved, setProved] = useState(false)\n\n const claimIt = useCallback(async () => {\n setBusy(true)\n setNotice(null)\n const answer = await postAiSiteOwnership(userRef.current, { orgId, action: 'claim', domain: address })\n setBusy(false)\n if (!answer.claim) {\n setNotice(answer.message ?? 'That address could not be used.')\n return\n }\n setClaim(answer.claim)\n setProved(!answer.claim.current)\n setStep(answer.claim.current ? 'read' : 'prove')\n }, [orgId, address])\n\n const read = useCallback(async () => {\n if (!claim?.current) return\n setBusy(true)\n setNotice(null)\n try {\n const requestJob = (siteId: string | null, check: boolean) =>\n authorizedFetch(userRef.current, '/api/ai/jobs', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n orgId,\n hostId: siteId,\n kind: AI_SITE_IMPORT_KIND,\n brief: `Bring in ${claim.domain}`,\n inputs: { [AI_SITE_IMPORT_DOMAIN_INPUT]: claim.domain },\n ...(check ? { check: true } : {}),\n }),\n })\n const refused = async (response: Response): Promise<Record<string, unknown> | null> => {\n const payload = (await response.json().catch(() => null)) as Record<string, unknown> | null\n if (response.ok) return payload ?? {}\n const locked = parseLockdownRefusal(response.status, payload)\n setNotice(locked ? lockdownRefusalText(locked) : String(payload?.['error'] ?? 'Your site could not be read. Try again.'))\n return null\n }\n let site = { hostId, host, orgSlug }\n if (!hostId && pendingSite) {\n // Asked before the site exists, so a refusal creates nothing (AGL-3859).\n if (!pendingSite.created && !(await refused(await requestJob(null, true)))) return\n // A site brought in starts in preview unless the person switched it\n // off (AGL-4086): its pages arrive here before anyone has looked.\n const made = await pendingSite.create({ start: 'import' })\n if ('error' in made) {\n setNotice(made.error)\n if (made.address) onBack()\n return\n }\n site = { hostId: made.hostId, host: made.host, orgSlug: made.orgSlug || orgSlug }\n }\n if (!site.hostId) return\n const payload = await refused(await requestJob(site.hostId, false))\n const job = (payload?.['job'] as AiJobSummary | undefined) ?? null\n if (!job) {\n if (payload) setNotice('Your site could not be read. Try again.')\n return\n }\n publishAiJob(job)\n const href = aiSiteBuildHref(site.orgSlug, site.host, job.id)\n if (href) {\n leave?.()\n router.push(href)\n }\n } catch {\n setNotice('Your site could not be read. Try again.')\n } finally {\n setBusy(false)\n }\n }, [claim, orgId, hostId, host, orgSlug, pendingSite, onBack, leave, router])\n\n const back = () => {\n setNotice(null)\n if (step === 'address') onBack()\n else if (step === 'prove') setStep('address')\n else setStep(proved ? 'prove' : 'address')\n }\n\n return (\n <Stack spacing={3} component=\"section\" aria-label=\"Bring my site\" data-start-area=\"import\">\n {notice && <Alert severity=\"info\">{notice}</Alert>}\n {step === 'address' && (\n <Stack spacing={2}>\n <Stack direction=\"row\" spacing={0.5} sx={{ alignItems: 'center' }}>\n <Typography variant=\"subtitle1\" component=\"h2\">\n {'Your current website'}\n </Typography>\n <HelpTip {...AI_SITE_IMPORT_HELP.address} />\n </Stack>\n <TextField\n label=\"Website address\"\n placeholder=\"example.com\"\n value={address}\n autoFocus\n onChange={(event) => setAddress(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter' && address.trim() && !busy) {\n event.preventDefault()\n void claimIt()\n }\n }}\n helperText=\"The address people type to reach your site today. You prove it is yours next.\"\n />\n </Stack>\n )}\n {step === 'prove' && claim && (\n <Stack spacing={2}>\n <Stack direction=\"row\" spacing={0.5} sx={{ alignItems: 'center' }}>\n <Typography variant=\"subtitle1\" component=\"h2\">\n {'Prove it is yours'}\n </Typography>\n <HelpTip {...AI_SITE_IMPORT_HELP.prove} />\n </Stack>\n <AiSiteOwnershipProof orgId={orgId} user={user} claim={claim} onClaim={setClaim} />\n </Stack>\n )}\n {step === 'read' && claim && (\n <Stack spacing={2}>\n <Stack direction=\"row\" spacing={0.5} sx={{ alignItems: 'center' }}>\n <Typography variant=\"subtitle1\" component=\"h2\">\n {`Bring in ${claim.domain}`}\n </Typography>\n <HelpTip {...AI_SITE_IMPORT_HELP.waves} />\n </Stack>\n <Box component=\"ul\" sx={{ m: 0, pl: 3, '& li': { mb: 1 } }}>\n <Typography component=\"li\" variant=\"body2\">\n {`AglynBot reads your whole site, home page first, as many pages as your plan includes: your main pages first, then collections such as blog posts.`}\n </Typography>\n <Typography component=\"li\" variant=\"body2\">\n {`You see what was found, what could not be read and why, and what each wave of up to ${AI_SITE_IMPORT_WAVE_PAGES} pages costs before anything is built. Reading your site uses no AI credits.`}\n </Typography>\n <Typography component=\"li\" variant=\"body2\">\n {'If your home page cannot be read, nothing is planned and no AI credits are used. You are told why, and you check again once it can be.'}\n </Typography>\n <Typography component=\"li\" variant=\"body2\">\n {`${PLATFORM_BRAND_NAME} AI rewrites each page into your new site’s design, with its words, facts and photos. You review each wave and start the next yourself.`}\n </Typography>\n <Typography component=\"li\" variant=\"body2\">\n {'Every page is a draft. Nothing is published until you publish it, and your current site is not changed.'}\n </Typography>\n </Box>\n {/* Start in preview (AGL-4086), for a site this creates: on unless\n the person switches it off. */}\n {!hostId && pendingSite && !pendingSite.created\n ? pendingSite.previewControl?.('import')\n : null}\n </Stack>\n )}\n <Stack direction=\"row\" spacing={1} sx={{ justifyContent: 'space-between' }}>\n <Button onClick={back} disabled={busy}>\n {'Back'}\n </Button>\n {step === 'address' && (\n <Button variant=\"contained\" disabled={busy || !address.trim()} onClick={() => void claimIt()}>\n {busy ? 'Checking…' : 'Next'}\n </Button>\n )}\n {step === 'prove' && (\n <Button variant=\"contained\" disabled={!claim?.current} onClick={() => setStep('read')}>\n {'Next'}\n </Button>\n )}\n {step === 'read' && (\n <Button\n variant=\"contained\"\n size=\"large\"\n disabled={busy || !claim?.current}\n onClick={() => void read()}\n startIcon={<MdiIcon path={mdiWebSync.path} />}\n >\n {busy ? 'Starting…' : 'Read my site'}\n </Button>\n )}\n </Stack>\n </Stack>\n )\n}\n\nexport default AiSiteImportStart\n"],"names":["lockdownRefusalText","parseLockdownRefusal","PLATFORM_BRAND_NAME","pluginDocsHelp","mdiWebSync","HelpTip","MdiIcon","authorizedFetch","Alert","Box","Button","Stack","TextField","Typography","useRouter","useCallback","useRef","useState","AI_SITE_IMPORT_DOMAIN_INPUT","AI_SITE_IMPORT_KIND","AI_SITE_IMPORT_WAVE_PAGES","aiSiteBuildHref","publishAiJob","AiSiteOwnershipProof","postAiSiteOwnership","AI_SITE_IMPORT_HELP","address","anchor","excerpt","prove","waves","turnedAway","AiSiteImportStart","orgId","orgSlug","hostId","host","user","pendingSite","onBack","leave","router","userRef","current","step","setStep","setAddress","claim","setClaim","notice","setNotice","busy","setBusy","proved","setProved","claimIt","answer","action","domain","message","read","requestJob","siteId","check","method","headers","body","JSON","stringify","kind","brief","inputs","refused","response","payload","json","catch","ok","locked","status","String","site","created","made","create","start","error","job","href","id","push","back","spacing","component","aria-label","data-start-area","severity","direction","sx","alignItems","variant","label","placeholder","value","autoFocus","onChange","event","target","onKeyDown","key","trim","preventDefault","helperText","onClaim","m","pl","mb","previewControl","justifyContent","onClick","disabled","size","startIcon","path"],"mappings":"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"}
@@ -926,7 +926,8 @@ function SectionLabel({ children, help }) {
926
926
  /*#__PURE__*/ _jsx(SectionLabel, {
927
927
  children: 'Your site'
928
928
  }),
929
- pendingSite.fields
929
+ pendingSite.fields,
930
+ pendingSite.previewControl == null ? void 0 : pendingSite.previewControl.call(pendingSite, 'ai')
930
931
  ]
931
932
  }) : null,
932
933
  importing && orgId ? /*#__PURE__*/ _jsx(AiSiteImportStart, {