@aglyn/plugins-ai 1.0.0-beta.271 → 1.0.0-beta.272
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +17 -17
- package/src/lib/activity/ai-activity-actions.d.ts +4 -3
- package/src/lib/activity/ai-activity-actions.js +3 -0
- package/src/lib/activity/ai-activity-actions.js.map +1 -1
- package/src/lib/components/ai-site-build-page.component.js +18 -0
- package/src/lib/components/ai-site-build-page.component.js.map +1 -1
- package/src/lib/components/ai-site-import-job.component.d.ts +41 -0
- package/src/lib/components/ai-site-import-job.component.js +707 -0
- package/src/lib/components/ai-site-import-job.component.js.map +1 -0
- package/src/lib/components/ai-site-import-start.component.d.ts +64 -0
- package/src/lib/components/ai-site-import-start.component.js +335 -0
- package/src/lib/components/ai-site-import-start.component.js.map +1 -0
- package/src/lib/components/ai-site-ownership-proof.component.d.ts +42 -0
- package/src/lib/components/ai-site-ownership-proof.component.js +353 -0
- package/src/lib/components/ai-site-ownership-proof.component.js.map +1 -0
- package/src/lib/components/ai-site-start-card.component.js +165 -91
- package/src/lib/components/ai-site-start-card.component.js.map +1 -1
- package/src/lib/jobs/ai-job-drafts.d.ts +14 -0
- package/src/lib/jobs/ai-job-drafts.js +24 -0
- package/src/lib/jobs/ai-job-drafts.js.map +1 -1
- package/src/lib/jobs/ai-job-import-step.d.ts +136 -0
- package/src/lib/jobs/ai-job-import-step.js +809 -0
- package/src/lib/jobs/ai-job-import-step.js.map +1 -0
- package/src/lib/jobs/ai-job-page-language.d.ts +39 -1
- package/src/lib/jobs/ai-job-page-language.js +62 -4
- package/src/lib/jobs/ai-job-page-language.js.map +1 -1
- package/src/lib/jobs/ai-job-page-step.d.ts +2 -2
- package/src/lib/jobs/ai-job-page-step.js +5 -2
- package/src/lib/jobs/ai-job-page-step.js.map +1 -1
- package/src/lib/jobs/ai-job-text-step.d.ts +7 -0
- package/src/lib/jobs/ai-job-text-step.js.map +1 -1
- package/src/lib/jobs/ai-jobs.d.ts +5 -0
- package/src/lib/jobs/ai-jobs.js +15 -3
- package/src/lib/jobs/ai-jobs.js.map +1 -1
- package/src/lib/jobs/ai-layout-owner-photos.d.ts +16 -1
- package/src/lib/jobs/ai-layout-owner-photos.js +47 -0
- package/src/lib/jobs/ai-layout-owner-photos.js.map +1 -1
- package/src/lib/jobs/ai-theme-brand-inputs.d.ts +61 -3
- package/src/lib/jobs/ai-theme-brand-inputs.js +117 -27
- package/src/lib/jobs/ai-theme-brand-inputs.js.map +1 -1
- package/src/lib/model/ai-credit-estimate.d.ts +20 -0
- package/src/lib/model/ai-credit-estimate.js +13 -0
- package/src/lib/model/ai-credit-estimate.js.map +1 -1
- package/src/lib/model/ai-job-activity.d.ts +2 -2
- package/src/lib/model/ai-job-activity.js +6 -4
- package/src/lib/model/ai-job-activity.js.map +1 -1
- package/src/lib/model/ai-job-notice.js +18 -4
- package/src/lib/model/ai-job-notice.js.map +1 -1
- package/src/lib/model/ai-jobs.types.d.ts +29 -2
- package/src/lib/model/ai-jobs.types.js +2 -1
- package/src/lib/model/ai-jobs.types.js.map +1 -1
- package/src/lib/model/ai-site-import-view.d.ts +130 -0
- package/src/lib/model/ai-site-import-view.js +182 -0
- package/src/lib/model/ai-site-import-view.js.map +1 -0
- package/src/lib/model/ai-site-import.d.ts +302 -0
- package/src/lib/model/ai-site-import.js +526 -0
- package/src/lib/model/ai-site-import.js.map +1 -0
- package/src/lib/model/ai-site-start.d.ts +22 -9
- package/src/lib/model/ai-site-start.js +64 -23
- package/src/lib/model/ai-site-start.js.map +1 -1
- package/src/lib/server/ai-jobs-route.js +11 -0
- package/src/lib/server/ai-jobs-route.js.map +1 -1
- package/src/lib/server/ai-site-import-route.d.ts +89 -0
- package/src/lib/server/ai-site-import-route.js +356 -0
- package/src/lib/server/ai-site-import-route.js.map +1 -0
- package/src/lib/server.js +14 -0
- package/src/lib/server.js.map +1 -1
- package/src/lib/site-import/fixtures/site-import-crawl-recordings.d.ts +45 -0
- package/src/lib/site-import/fixtures/site-import-crawl-recordings.js +313 -0
- package/src/lib/site-import/fixtures/site-import-crawl-recordings.js.map +1 -0
- package/src/lib/site-import/fixtures/site-import-wave-recordings.d.ts +50 -0
- package/src/lib/site-import/fixtures/site-import-wave-recordings.js +217 -0
- package/src/lib/site-import/fixtures/site-import-wave-recordings.js.map +1 -0
- package/src/lib/site-import/site-import-crawl.d.ts +163 -0
- package/src/lib/site-import/site-import-crawl.js +467 -0
- package/src/lib/site-import/site-import-crawl.js.map +1 -0
- package/src/lib/site-import/site-import-flag.d.ts +23 -0
- package/src/lib/site-import/site-import-flag.js +23 -0
- package/src/lib/site-import/site-import-flag.js.map +1 -0
- package/src/lib/site-import/site-import-html.d.ts +94 -0
- package/src/lib/site-import/site-import-html.js +462 -0
- package/src/lib/site-import/site-import-html.js.map +1 -0
- package/src/lib/site-import/site-import-images.d.ts +54 -0
- package/src/lib/site-import/site-import-images.js +204 -0
- package/src/lib/site-import/site-import-images.js.map +1 -0
- package/src/lib/site-import/site-import-page.d.ts +48 -0
- package/src/lib/site-import/site-import-page.js +150 -0
- package/src/lib/site-import/site-import-page.js.map +1 -0
- package/src/lib/site-import/site-import-review.d.ts +40 -0
- package/src/lib/site-import/site-import-review.js +149 -0
- package/src/lib/site-import/site-import-review.js.map +1 -0
- package/src/lib/site-import/site-import-robots.d.ts +52 -0
- package/src/lib/site-import/site-import-robots.js +126 -0
- package/src/lib/site-import/site-import-robots.js.map +1 -0
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Aglyn LLC
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/ 'use client';
|
|
17
|
+
import { _ as _extends } from "@swc/helpers/_/_extends";
|
|
18
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
19
|
+
import { CopyField } from "@aglyn/shared-ui-jsx/components/copy-field.component";
|
|
20
|
+
import { authorizedFetch } from "@aglyn/shared-util-http/authorized-token";
|
|
21
|
+
import { Alert, Box, Button, Card, CardContent, Chip, InputAdornment, Stack, TextField, Typography } from "@mui/material";
|
|
22
|
+
import { useCallback, useState } from "react";
|
|
23
|
+
/** The ownership door, as the console calls it (AGL-3974). */ export const AI_SITE_IMPORT_OWNERSHIP_PATH = '/api/ai/site-import/ownership';
|
|
24
|
+
/** Posts one action to the ownership door. Never throws. */ export async function postAiSiteOwnership(user, body) {
|
|
25
|
+
try {
|
|
26
|
+
var _ref, _ref1, _ref2, _ref3;
|
|
27
|
+
const response = await authorizedFetch(user, AI_SITE_IMPORT_OWNERSHIP_PATH, {
|
|
28
|
+
method: 'POST',
|
|
29
|
+
headers: {
|
|
30
|
+
'Content-Type': 'application/json'
|
|
31
|
+
},
|
|
32
|
+
body: JSON.stringify(body)
|
|
33
|
+
});
|
|
34
|
+
const payload = await response.json().catch(()=>null);
|
|
35
|
+
const result = payload == null ? void 0 : payload['result'];
|
|
36
|
+
const claim = (_ref = (_ref1 = result == null ? void 0 : result.claim) != null ? _ref1 : payload == null ? void 0 : payload['claim']) != null ? _ref : null;
|
|
37
|
+
return {
|
|
38
|
+
claim,
|
|
39
|
+
message: (_ref2 = result == null ? void 0 : result.message) != null ? _ref2 : response.ok ? null : String((_ref3 = payload == null ? void 0 : payload['error']) != null ? _ref3 : 'That did not work. Try again.'),
|
|
40
|
+
ok: response.ok
|
|
41
|
+
};
|
|
42
|
+
} catch (unused) {
|
|
43
|
+
return {
|
|
44
|
+
claim: null,
|
|
45
|
+
message: 'That did not work. Check your connection and try again.',
|
|
46
|
+
ok: false
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
const PROVEN_WORDS = {
|
|
51
|
+
dns: 'a DNS record',
|
|
52
|
+
meta: 'a tag on your home page',
|
|
53
|
+
email: 'a code sent to an address at your domain'
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Proving the site is yours (AGL-3974, AGL-3976): any ONE of three ways, each
|
|
57
|
+
* a card with what to do where and a button that checks it now. The status
|
|
58
|
+
* at the top says whether the site is verified, by which way and when, or
|
|
59
|
+
* that it is not yet. Nothing is read from the site until it is.
|
|
60
|
+
*/ export function AiSiteOwnershipProof({ orgId, user, claim, onClaim }) {
|
|
61
|
+
const [busy, setBusy] = useState(null);
|
|
62
|
+
const [messages, setMessages] = useState({});
|
|
63
|
+
const [mailbox, setMailbox] = useState('');
|
|
64
|
+
const [code, setCode] = useState('');
|
|
65
|
+
const domain = claim.domain;
|
|
66
|
+
const recordName = claim.dns.host.endsWith(`.${domain}`) ? claim.dns.host.slice(0, -(domain.length + 1)) : claim.dns.host;
|
|
67
|
+
const act = useCallback(async (method, busyKey, body)=>{
|
|
68
|
+
setBusy(busyKey);
|
|
69
|
+
const answer = await postAiSiteOwnership(user, _extends({
|
|
70
|
+
orgId,
|
|
71
|
+
domain
|
|
72
|
+
}, body));
|
|
73
|
+
if (answer.claim) onClaim(answer.claim);
|
|
74
|
+
setMessages((current)=>{
|
|
75
|
+
var _answer_claim;
|
|
76
|
+
return _extends({}, current, answer.message ? {
|
|
77
|
+
[method]: {
|
|
78
|
+
text: answer.message,
|
|
79
|
+
ok: Boolean((_answer_claim = answer.claim) == null ? void 0 : _answer_claim.current)
|
|
80
|
+
}
|
|
81
|
+
} : {});
|
|
82
|
+
});
|
|
83
|
+
setBusy(null);
|
|
84
|
+
return answer;
|
|
85
|
+
}, [
|
|
86
|
+
user,
|
|
87
|
+
orgId,
|
|
88
|
+
domain,
|
|
89
|
+
onClaim
|
|
90
|
+
]);
|
|
91
|
+
const verified = claim.current;
|
|
92
|
+
const provenOn = claim.provenAt ? new Date(claim.provenAt).toLocaleDateString('en-US', {
|
|
93
|
+
month: 'long',
|
|
94
|
+
day: 'numeric',
|
|
95
|
+
year: 'numeric'
|
|
96
|
+
}) : null;
|
|
97
|
+
const lapsed = claim.status === 'proven' && !claim.current;
|
|
98
|
+
const note = (method)=>{
|
|
99
|
+
var _messages_method, _messages_method1;
|
|
100
|
+
return messages[method] ? /*#__PURE__*/ _jsx(Alert, {
|
|
101
|
+
severity: ((_messages_method = messages[method]) == null ? void 0 : _messages_method.ok) ? 'success' : 'info',
|
|
102
|
+
sx: {
|
|
103
|
+
mt: 1
|
|
104
|
+
},
|
|
105
|
+
children: (_messages_method1 = messages[method]) == null ? void 0 : _messages_method1.text
|
|
106
|
+
}) : null;
|
|
107
|
+
};
|
|
108
|
+
return /*#__PURE__*/ _jsxs(Stack, {
|
|
109
|
+
spacing: 2,
|
|
110
|
+
"data-start-area": "ownership",
|
|
111
|
+
children: [
|
|
112
|
+
/*#__PURE__*/ _jsxs(Stack, {
|
|
113
|
+
direction: "row",
|
|
114
|
+
spacing: 1,
|
|
115
|
+
sx: {
|
|
116
|
+
alignItems: 'center',
|
|
117
|
+
flexWrap: 'wrap',
|
|
118
|
+
rowGap: 1
|
|
119
|
+
},
|
|
120
|
+
children: [
|
|
121
|
+
/*#__PURE__*/ _jsx(Typography, {
|
|
122
|
+
variant: "subtitle1",
|
|
123
|
+
component: "h2",
|
|
124
|
+
children: domain
|
|
125
|
+
}),
|
|
126
|
+
verified ? /*#__PURE__*/ _jsx(Chip, {
|
|
127
|
+
size: "small",
|
|
128
|
+
color: "success",
|
|
129
|
+
label: "Verified"
|
|
130
|
+
}) : /*#__PURE__*/ _jsx(Chip, {
|
|
131
|
+
size: "small",
|
|
132
|
+
variant: "outlined",
|
|
133
|
+
label: lapsed ? 'Verify again' : 'Not verified yet'
|
|
134
|
+
})
|
|
135
|
+
]
|
|
136
|
+
}),
|
|
137
|
+
verified && claim.provenMethod ? /*#__PURE__*/ _jsx(Alert, {
|
|
138
|
+
severity: "success",
|
|
139
|
+
children: `Verified by ${PROVEN_WORDS[claim.provenMethod]}${provenOn ? ` on ${provenOn}` : ''}. A proof is good for 30 days.`
|
|
140
|
+
}) : /*#__PURE__*/ _jsx(Typography, {
|
|
141
|
+
variant: "body2",
|
|
142
|
+
color: "text.secondary",
|
|
143
|
+
children: lapsed ? 'Your last proof is more than 30 days old. Prove the site is yours again, any one way below.' : 'Prove the site is yours, any one way below. Nothing is read from your site until you do, so only a site you own can be brought in.'
|
|
144
|
+
}),
|
|
145
|
+
!verified && /*#__PURE__*/ _jsxs(Stack, {
|
|
146
|
+
spacing: 2,
|
|
147
|
+
children: [
|
|
148
|
+
/*#__PURE__*/ _jsx(Card, {
|
|
149
|
+
variant: "outlined",
|
|
150
|
+
sx: {
|
|
151
|
+
borderRadius: 2
|
|
152
|
+
},
|
|
153
|
+
children: /*#__PURE__*/ _jsx(CardContent, {
|
|
154
|
+
children: /*#__PURE__*/ _jsxs(Stack, {
|
|
155
|
+
spacing: 1.5,
|
|
156
|
+
children: [
|
|
157
|
+
/*#__PURE__*/ _jsx(Typography, {
|
|
158
|
+
variant: "subtitle2",
|
|
159
|
+
component: "h3",
|
|
160
|
+
children: 'Add a DNS record'
|
|
161
|
+
}),
|
|
162
|
+
/*#__PURE__*/ _jsx(Typography, {
|
|
163
|
+
variant: "body2",
|
|
164
|
+
color: "text.secondary",
|
|
165
|
+
children: 'Where your domain is registered or its DNS is managed, add a TXT record with this name and value. It can take a few minutes to an hour to appear.'
|
|
166
|
+
}),
|
|
167
|
+
/*#__PURE__*/ _jsxs(Box, {
|
|
168
|
+
sx: {
|
|
169
|
+
display: 'grid',
|
|
170
|
+
gridTemplateColumns: {
|
|
171
|
+
xs: '1fr',
|
|
172
|
+
sm: '1fr 2fr'
|
|
173
|
+
},
|
|
174
|
+
gap: 1.5
|
|
175
|
+
},
|
|
176
|
+
children: [
|
|
177
|
+
/*#__PURE__*/ _jsx(CopyField, {
|
|
178
|
+
label: "Name",
|
|
179
|
+
value: recordName,
|
|
180
|
+
helperText: `Some providers want the full name: ${claim.dns.host}`
|
|
181
|
+
}),
|
|
182
|
+
/*#__PURE__*/ _jsx(CopyField, {
|
|
183
|
+
label: "Value",
|
|
184
|
+
value: claim.dns.value,
|
|
185
|
+
helperText: "Record type: TXT"
|
|
186
|
+
})
|
|
187
|
+
]
|
|
188
|
+
}),
|
|
189
|
+
/*#__PURE__*/ _jsx(Box, {
|
|
190
|
+
children: /*#__PURE__*/ _jsx(Button, {
|
|
191
|
+
variant: "outlined",
|
|
192
|
+
disabled: busy !== null,
|
|
193
|
+
onClick: ()=>void act('dns', 'dns', {
|
|
194
|
+
action: 'check',
|
|
195
|
+
method: 'dns'
|
|
196
|
+
}),
|
|
197
|
+
children: busy === 'dns' ? 'Checking…' : 'Check the DNS record'
|
|
198
|
+
})
|
|
199
|
+
}),
|
|
200
|
+
note('dns')
|
|
201
|
+
]
|
|
202
|
+
})
|
|
203
|
+
})
|
|
204
|
+
}),
|
|
205
|
+
/*#__PURE__*/ _jsx(Card, {
|
|
206
|
+
variant: "outlined",
|
|
207
|
+
sx: {
|
|
208
|
+
borderRadius: 2
|
|
209
|
+
},
|
|
210
|
+
children: /*#__PURE__*/ _jsx(CardContent, {
|
|
211
|
+
children: /*#__PURE__*/ _jsxs(Stack, {
|
|
212
|
+
spacing: 1.5,
|
|
213
|
+
children: [
|
|
214
|
+
/*#__PURE__*/ _jsx(Typography, {
|
|
215
|
+
variant: "subtitle2",
|
|
216
|
+
component: "h3",
|
|
217
|
+
children: 'Add a tag to your home page'
|
|
218
|
+
}),
|
|
219
|
+
/*#__PURE__*/ _jsx(Typography, {
|
|
220
|
+
variant: "body2",
|
|
221
|
+
color: "text.secondary",
|
|
222
|
+
children: 'In the builder your site is made with now, open the setting for code in your home page’s header (often called Custom code or Header code), paste this tag there, and publish the site.'
|
|
223
|
+
}),
|
|
224
|
+
/*#__PURE__*/ _jsx(CopyField, {
|
|
225
|
+
label: "Tag",
|
|
226
|
+
value: claim.meta.tag
|
|
227
|
+
}),
|
|
228
|
+
/*#__PURE__*/ _jsx(Box, {
|
|
229
|
+
children: /*#__PURE__*/ _jsx(Button, {
|
|
230
|
+
variant: "outlined",
|
|
231
|
+
disabled: busy !== null,
|
|
232
|
+
onClick: ()=>void act('meta', 'meta', {
|
|
233
|
+
action: 'check',
|
|
234
|
+
method: 'meta'
|
|
235
|
+
}),
|
|
236
|
+
children: busy === 'meta' ? 'Checking…' : 'Check my home page'
|
|
237
|
+
})
|
|
238
|
+
}),
|
|
239
|
+
note('meta')
|
|
240
|
+
]
|
|
241
|
+
})
|
|
242
|
+
})
|
|
243
|
+
}),
|
|
244
|
+
/*#__PURE__*/ _jsx(Card, {
|
|
245
|
+
variant: "outlined",
|
|
246
|
+
sx: {
|
|
247
|
+
borderRadius: 2
|
|
248
|
+
},
|
|
249
|
+
children: /*#__PURE__*/ _jsx(CardContent, {
|
|
250
|
+
children: /*#__PURE__*/ _jsxs(Stack, {
|
|
251
|
+
spacing: 1.5,
|
|
252
|
+
children: [
|
|
253
|
+
/*#__PURE__*/ _jsx(Typography, {
|
|
254
|
+
variant: "subtitle2",
|
|
255
|
+
component: "h3",
|
|
256
|
+
children: 'Get a code by email'
|
|
257
|
+
}),
|
|
258
|
+
/*#__PURE__*/ _jsx(Typography, {
|
|
259
|
+
variant: "body2",
|
|
260
|
+
color: "text.secondary",
|
|
261
|
+
children: `We email a six-digit code to an address at ${domain}. It is good for 15 minutes.`
|
|
262
|
+
}),
|
|
263
|
+
/*#__PURE__*/ _jsxs(Stack, {
|
|
264
|
+
direction: {
|
|
265
|
+
xs: 'column',
|
|
266
|
+
sm: 'row'
|
|
267
|
+
},
|
|
268
|
+
spacing: 1.5,
|
|
269
|
+
sx: {
|
|
270
|
+
alignItems: {
|
|
271
|
+
sm: 'flex-start'
|
|
272
|
+
}
|
|
273
|
+
},
|
|
274
|
+
children: [
|
|
275
|
+
/*#__PURE__*/ _jsx(TextField, {
|
|
276
|
+
label: "Email address",
|
|
277
|
+
size: "small",
|
|
278
|
+
value: mailbox,
|
|
279
|
+
onChange: (event)=>setMailbox(event.target.value.replace(/@.*$/, '')),
|
|
280
|
+
slotProps: {
|
|
281
|
+
input: {
|
|
282
|
+
endAdornment: /*#__PURE__*/ _jsx(InputAdornment, {
|
|
283
|
+
position: "end",
|
|
284
|
+
children: `@${domain}`
|
|
285
|
+
})
|
|
286
|
+
}
|
|
287
|
+
},
|
|
288
|
+
sx: {
|
|
289
|
+
flex: 1
|
|
290
|
+
}
|
|
291
|
+
}),
|
|
292
|
+
/*#__PURE__*/ _jsx(Button, {
|
|
293
|
+
variant: "outlined",
|
|
294
|
+
disabled: busy !== null || !mailbox.trim(),
|
|
295
|
+
onClick: ()=>void act('email', 'send', {
|
|
296
|
+
action: 'send-code',
|
|
297
|
+
email: `${mailbox.trim()}@${domain}`
|
|
298
|
+
}),
|
|
299
|
+
children: busy === 'send' ? 'Sending…' : claim.email.pendingAddress ? 'Send a new code' : 'Send a code'
|
|
300
|
+
})
|
|
301
|
+
]
|
|
302
|
+
}),
|
|
303
|
+
claim.email.pendingAddress ? /*#__PURE__*/ _jsxs(Stack, {
|
|
304
|
+
direction: {
|
|
305
|
+
xs: 'column',
|
|
306
|
+
sm: 'row'
|
|
307
|
+
},
|
|
308
|
+
spacing: 1.5,
|
|
309
|
+
sx: {
|
|
310
|
+
alignItems: {
|
|
311
|
+
sm: 'flex-start'
|
|
312
|
+
}
|
|
313
|
+
},
|
|
314
|
+
children: [
|
|
315
|
+
/*#__PURE__*/ _jsx(TextField, {
|
|
316
|
+
label: `Code sent to ${claim.email.pendingAddress}`,
|
|
317
|
+
size: "small",
|
|
318
|
+
value: code,
|
|
319
|
+
onChange: (event)=>setCode(event.target.value.replace(/\D/g, '').slice(0, 6)),
|
|
320
|
+
slotProps: {
|
|
321
|
+
htmlInput: {
|
|
322
|
+
inputMode: 'numeric',
|
|
323
|
+
autoComplete: 'one-time-code'
|
|
324
|
+
}
|
|
325
|
+
},
|
|
326
|
+
sx: {
|
|
327
|
+
flex: 1
|
|
328
|
+
}
|
|
329
|
+
}),
|
|
330
|
+
/*#__PURE__*/ _jsx(Button, {
|
|
331
|
+
variant: "contained",
|
|
332
|
+
disabled: busy !== null || code.length !== 6,
|
|
333
|
+
onClick: ()=>void act('email', 'email', {
|
|
334
|
+
action: 'confirm-code',
|
|
335
|
+
code
|
|
336
|
+
}),
|
|
337
|
+
children: busy === 'email' ? 'Checking…' : 'Confirm the code'
|
|
338
|
+
})
|
|
339
|
+
]
|
|
340
|
+
}) : null,
|
|
341
|
+
note('email')
|
|
342
|
+
]
|
|
343
|
+
})
|
|
344
|
+
})
|
|
345
|
+
})
|
|
346
|
+
]
|
|
347
|
+
})
|
|
348
|
+
]
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
export default AiSiteOwnershipProof;
|
|
352
|
+
|
|
353
|
+
//# sourceMappingURL=ai-site-ownership-proof.component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../libs/plugins/ai/src/lib/components/ai-site-ownership-proof.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 { CopyField } from '@aglyn/shared-ui-jsx/components/copy-field.component'\nimport { authorizedFetch, type MaybeTokenSource } from '@aglyn/shared-util-http/authorized-token'\nimport {\n Alert,\n Box,\n Button,\n Card,\n CardContent,\n Chip,\n InputAdornment,\n Stack,\n TextField,\n Typography,\n} from '@mui/material'\nimport { useCallback, useState } from 'react'\nimport type { AiSiteImportClaim } from '../model/ai-site-import-view'\n\n/** The ownership door, as the console calls it (AGL-3974). */\nexport const AI_SITE_IMPORT_OWNERSHIP_PATH = '/api/ai/site-import/ownership'\n\ntype Method = 'dns' | 'meta' | 'email'\n\n/** One answer of the ownership door: the claim it left, and the sentence for the person. */\nexport interface AiSiteOwnershipAnswer {\n claim: AiSiteImportClaim | null\n message: string | null\n ok: boolean\n}\n\n/** Posts one action to the ownership door. Never throws. */\nexport async function postAiSiteOwnership(\n user: MaybeTokenSource,\n body: Record<string, unknown>,\n): Promise<AiSiteOwnershipAnswer> {\n try {\n const response = await authorizedFetch(user, AI_SITE_IMPORT_OWNERSHIP_PATH, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n })\n const payload = (await response.json().catch(() => null)) as Record<string, unknown> | null\n const result = payload?.['result'] as { claim?: AiSiteImportClaim; message?: string } | undefined\n const claim = (result?.claim ?? (payload?.['claim'] as AiSiteImportClaim | undefined)) ?? null\n return {\n claim,\n message: result?.message ?? (response.ok ? null : String(payload?.['error'] ?? 'That did not work. Try again.')),\n ok: response.ok,\n }\n } catch {\n return { claim: null, message: 'That did not work. Check your connection and try again.', ok: false }\n }\n}\n\nconst PROVEN_WORDS: Record<Method, string> = {\n dns: 'a DNS record',\n meta: 'a tag on your home page',\n email: 'a code sent to an address at your domain',\n}\n\nexport interface AiSiteOwnershipProofProps {\n orgId: string\n user: MaybeTokenSource\n claim: AiSiteImportClaim\n onClaim: (claim: AiSiteImportClaim) => void\n}\n\n/**\n * Proving the site is yours (AGL-3974, AGL-3976): any ONE of three ways, each\n * a card with what to do where and a button that checks it now. The status\n * at the top says whether the site is verified, by which way and when, or\n * that it is not yet. Nothing is read from the site until it is.\n */\nexport function AiSiteOwnershipProof({ orgId, user, claim, onClaim }: AiSiteOwnershipProofProps) {\n const [busy, setBusy] = useState<Method | 'send' | null>(null)\n const [messages, setMessages] = useState<Partial<Record<Method, { text: string; ok: boolean }>>>({})\n const [mailbox, setMailbox] = useState('')\n const [code, setCode] = useState('')\n const domain = claim.domain\n const recordName = claim.dns.host.endsWith(`.${domain}`) ? claim.dns.host.slice(0, -(domain.length + 1)) : claim.dns.host\n\n const act = useCallback(\n async (method: Method, busyKey: Method | 'send', body: Record<string, unknown>) => {\n setBusy(busyKey)\n const answer = await postAiSiteOwnership(user, { orgId, domain, ...body })\n if (answer.claim) onClaim(answer.claim)\n setMessages((current) => ({\n ...current,\n ...(answer.message ? { [method]: { text: answer.message, ok: Boolean(answer.claim?.current) } } : {}),\n }))\n setBusy(null)\n return answer\n },\n [user, orgId, domain, onClaim],\n )\n\n const verified = claim.current\n const provenOn = claim.provenAt ? new Date(claim.provenAt).toLocaleDateString('en-US', { month: 'long', day: 'numeric', year: 'numeric' }) : null\n const lapsed = claim.status === 'proven' && !claim.current\n\n const note = (method: Method) =>\n messages[method] ? (\n <Alert severity={messages[method]?.ok ? 'success' : 'info'} sx={{ mt: 1 }}>\n {messages[method]?.text}\n </Alert>\n ) : null\n\n return (\n <Stack spacing={2} data-start-area=\"ownership\">\n <Stack direction=\"row\" spacing={1} sx={{ alignItems: 'center', flexWrap: 'wrap', rowGap: 1 }}>\n <Typography variant=\"subtitle1\" component=\"h2\">\n {domain}\n </Typography>\n {verified ? (\n <Chip size=\"small\" color=\"success\" label=\"Verified\" />\n ) : (\n <Chip size=\"small\" variant=\"outlined\" label={lapsed ? 'Verify again' : 'Not verified yet'} />\n )}\n </Stack>\n {verified && claim.provenMethod ? (\n <Alert severity=\"success\">\n {`Verified by ${PROVEN_WORDS[claim.provenMethod]}${provenOn ? ` on ${provenOn}` : ''}. A proof is good for 30 days.`}\n </Alert>\n ) : (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {lapsed\n ? 'Your last proof is more than 30 days old. Prove the site is yours again, any one way below.'\n : 'Prove the site is yours, any one way below. Nothing is read from your site until you do, so only a site you own can be brought in.'}\n </Typography>\n )}\n {!verified && (\n <Stack spacing={2}>\n <Card variant=\"outlined\" sx={{ borderRadius: 2 }}>\n <CardContent>\n <Stack spacing={1.5}>\n <Typography variant=\"subtitle2\" component=\"h3\">\n {'Add a DNS record'}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Where your domain is registered or its DNS is managed, add a TXT record with this name and value. It can take a few minutes to an hour to appear.'}\n </Typography>\n <Box sx={{ display: 'grid', gridTemplateColumns: { xs: '1fr', sm: '1fr 2fr' }, gap: 1.5 }}>\n <CopyField label=\"Name\" value={recordName} helperText={`Some providers want the full name: ${claim.dns.host}`} />\n <CopyField label=\"Value\" value={claim.dns.value} helperText=\"Record type: TXT\" />\n </Box>\n <Box>\n <Button variant=\"outlined\" disabled={busy !== null} onClick={() => void act('dns', 'dns', { action: 'check', method: 'dns' })}>\n {busy === 'dns' ? 'Checking…' : 'Check the DNS record'}\n </Button>\n </Box>\n {note('dns')}\n </Stack>\n </CardContent>\n </Card>\n <Card variant=\"outlined\" sx={{ borderRadius: 2 }}>\n <CardContent>\n <Stack spacing={1.5}>\n <Typography variant=\"subtitle2\" component=\"h3\">\n {'Add a tag to your home page'}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'In the builder your site is made with now, open the setting for code in your home page’s header (often called Custom code or Header code), paste this tag there, and publish the site.'}\n </Typography>\n <CopyField label=\"Tag\" value={claim.meta.tag} />\n <Box>\n <Button variant=\"outlined\" disabled={busy !== null} onClick={() => void act('meta', 'meta', { action: 'check', method: 'meta' })}>\n {busy === 'meta' ? 'Checking…' : 'Check my home page'}\n </Button>\n </Box>\n {note('meta')}\n </Stack>\n </CardContent>\n </Card>\n <Card variant=\"outlined\" sx={{ borderRadius: 2 }}>\n <CardContent>\n <Stack spacing={1.5}>\n <Typography variant=\"subtitle2\" component=\"h3\">\n {'Get a code by email'}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {`We email a six-digit code to an address at ${domain}. It is good for 15 minutes.`}\n </Typography>\n <Stack direction={{ xs: 'column', sm: 'row' }} spacing={1.5} sx={{ alignItems: { sm: 'flex-start' } }}>\n <TextField\n label=\"Email address\"\n size=\"small\"\n value={mailbox}\n onChange={(event) => setMailbox(event.target.value.replace(/@.*$/, ''))}\n slotProps={{ input: { endAdornment: <InputAdornment position=\"end\">{`@${domain}`}</InputAdornment> } }}\n sx={{ flex: 1 }}\n />\n <Button\n variant=\"outlined\"\n disabled={busy !== null || !mailbox.trim()}\n onClick={() => void act('email', 'send', { action: 'send-code', email: `${mailbox.trim()}@${domain}` })}\n >\n {busy === 'send' ? 'Sending…' : claim.email.pendingAddress ? 'Send a new code' : 'Send a code'}\n </Button>\n </Stack>\n {claim.email.pendingAddress ? (\n <Stack direction={{ xs: 'column', sm: 'row' }} spacing={1.5} sx={{ alignItems: { sm: 'flex-start' } }}>\n <TextField\n label={`Code sent to ${claim.email.pendingAddress}`}\n size=\"small\"\n value={code}\n onChange={(event) => setCode(event.target.value.replace(/\\D/g, '').slice(0, 6))}\n slotProps={{ htmlInput: { inputMode: 'numeric', autoComplete: 'one-time-code' } }}\n sx={{ flex: 1 }}\n />\n <Button\n variant=\"contained\"\n disabled={busy !== null || code.length !== 6}\n onClick={() => void act('email', 'email', { action: 'confirm-code', code })}\n >\n {busy === 'email' ? 'Checking…' : 'Confirm the code'}\n </Button>\n </Stack>\n ) : null}\n {note('email')}\n </Stack>\n </CardContent>\n </Card>\n </Stack>\n )}\n </Stack>\n )\n}\n\nexport default AiSiteOwnershipProof\n"],"names":["CopyField","authorizedFetch","Alert","Box","Button","Card","CardContent","Chip","InputAdornment","Stack","TextField","Typography","useCallback","useState","AI_SITE_IMPORT_OWNERSHIP_PATH","postAiSiteOwnership","user","body","result","response","method","headers","JSON","stringify","payload","json","catch","claim","message","ok","String","PROVEN_WORDS","dns","meta","email","AiSiteOwnershipProof","orgId","onClaim","busy","setBusy","messages","setMessages","mailbox","setMailbox","code","setCode","domain","recordName","host","endsWith","slice","length","act","busyKey","answer","current","text","Boolean","verified","provenOn","provenAt","Date","toLocaleDateString","month","day","year","lapsed","status","note","severity","sx","mt","spacing","data-start-area","direction","alignItems","flexWrap","rowGap","variant","component","size","color","label","provenMethod","borderRadius","display","gridTemplateColumns","xs","sm","gap","value","helperText","disabled","onClick","action","tag","onChange","event","target","replace","slotProps","input","endAdornment","position","flex","trim","pendingAddress","htmlInput","inputMode","autoComplete"],"mappings":"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"}
|