重构 Kiro 注册页面状态收养

This commit is contained in:
QLHazyCoder
2026-05-20 20:42:29 +08:00
parent 065607bc04
commit 59b7d77b5d
5 changed files with 618 additions and 70 deletions
+329 -60
View File
@@ -68,6 +68,48 @@
'code',
'aws',
]);
const KIRO_REGISTER_PAGE_STATES = Object.freeze([
'kiro_signin_page',
'email_entry',
'name_entry',
'register_otp_page',
'create_password_page',
'authorization_page',
'success_page',
'kiro_web_signed_in',
'login_password_page',
'login_otp_page',
]);
const KIRO_REGISTER_EXISTING_ACCOUNT_STATES = Object.freeze([
'login_password_page',
'login_otp_page',
]);
const KIRO_REGISTER_AFTER_EMAIL_STATES = Object.freeze([
'name_entry',
'register_otp_page',
'create_password_page',
'authorization_page',
'success_page',
'kiro_web_signed_in',
]);
const KIRO_REGISTER_AFTER_NAME_STATES = Object.freeze([
'register_otp_page',
'create_password_page',
'authorization_page',
'success_page',
'kiro_web_signed_in',
]);
const KIRO_REGISTER_AFTER_OTP_STATES = Object.freeze([
'create_password_page',
'authorization_page',
'success_page',
'kiro_web_signed_in',
]);
const KIRO_REGISTER_AFTER_PASSWORD_STATES = Object.freeze([
'authorization_page',
'success_page',
'kiro_web_signed_in',
]);
function isPlainObject(value) {
return Boolean(value) && typeof value === 'object' && !Array.isArray(value);
@@ -607,6 +649,7 @@
fromStates: Array.isArray(options.fromStates) ? options.fromStates : [],
timeoutMs: stateWaitTimeoutMs,
retryDelayMs: Number(options.pageRetryDelayMs) || 250,
returnOnCodeInvalid: Boolean(options.returnOnCodeInvalid),
timeoutMessage: options.timeoutMessage || '',
},
}, {
@@ -624,6 +667,109 @@
return result || { state: '', url: '' };
}
async function readKiroRegisterPageState(tabId, options = {}) {
return ensureKiroPageState(tabId, {
...options,
targetStates: KIRO_REGISTER_PAGE_STATES,
});
}
function isKiroExistingAccountState(pageState = '') {
return KIRO_REGISTER_EXISTING_ACCOUNT_STATES.includes(cleanString(pageState));
}
function resolveKiroRegisterEmail(currentState = {}, pageState = {}, fallbackEmail = '') {
const runtimeState = readKiroRuntime(currentState);
return cleanString(
fallbackEmail
|| pageState?.email
|| pageState?.accountEmail
|| runtimeState.register?.email
|| currentState?.email
).toLowerCase();
}
function createKiroExistingAccountError(pageState = {}, currentState = {}, step = 0, fallbackEmail = '') {
const email = resolveKiroRegisterEmail(currentState, pageState, fallbackEmail);
const emailText = email ? ` ${email}` : '';
return new Error(
`步骤 ${step}:邮箱${emailText} 已进入 AWS Builder ID 登录页,说明该邮箱已存在或被 AWS 判定为已有账号;Kiro 注册流程只处理新账号注册,已停止,请换新邮箱重试。`
);
}
function assertKiroRegistrationOnlyState(pageState = {}, currentState = {}, step = 0, fallbackEmail = '') {
if (isKiroExistingAccountState(pageState?.state)) {
throw createKiroExistingAccountError(pageState, currentState, step, fallbackEmail);
}
}
function getKiroRegisterStatusForPageState(pageState = '') {
switch (cleanString(pageState)) {
case 'email_entry':
return 'waiting_email';
case 'name_entry':
return 'waiting_name';
case 'register_otp_page':
return 'waiting_otp';
case 'create_password_page':
return 'waiting_password';
case 'authorization_page':
return 'waiting_consent';
case 'success_page':
case 'kiro_web_signed_in':
return 'completed';
default:
return '';
}
}
function buildKiroRegisterStatePatch(currentState = {}, pageState = {}, options = {}) {
const resolvedEmail = resolveKiroRegisterEmail(currentState, pageState, options.email);
const nextStatus = cleanString(options.status) || getKiroRegisterStatusForPageState(pageState?.state);
const registerPatch = {};
if (resolvedEmail) {
registerPatch.email = resolvedEmail;
}
if (options.fullName !== undefined) {
registerPatch.fullName = cleanString(options.fullName);
}
if (options.verificationRequestedAt !== undefined) {
registerPatch.verificationRequestedAt = Math.max(0, Number(options.verificationRequestedAt) || 0);
}
if (nextStatus) {
registerPatch.status = nextStatus;
registerPatch.completedAt = nextStatus === 'completed' ? Date.now() : 0;
}
return {
session: {
currentStage: nextStatus === 'completed' ? 'desktop-authorize' : 'register',
pageState: pageState?.state || '',
pageUrl: pageState?.url || '',
lastError: '',
},
register: registerPatch,
upload: {
status: nextStatus === 'completed' ? 'waiting_desktop_authorize' : 'waiting_register',
error: '',
},
};
}
async function adoptKiroRegisterPageState(currentState = {}, pageState = {}, nodeId = '', options = {}) {
const payload = await applyRuntimeState(
currentState,
buildKiroRegisterStatePatch(currentState, pageState, options)
);
await completeNodeFromBackground(nodeId, {
...payload,
email: resolveKiroRegisterEmail(currentState, pageState, options.email),
accountIdentifierType: 'email',
accountIdentifier: resolveKiroRegisterEmail(currentState, pageState, options.email),
});
return payload;
}
function resolveKiroFullName(state = {}) {
const runtimeState = readKiroRuntime(state);
const cachedName = cleanString(runtimeState.register?.fullName);
@@ -753,7 +899,8 @@
}
const runtimeState = readKiroRuntime(state);
const requestedAt = Math.max(0, Number(runtimeState.register?.verificationRequestedAt) || Date.now());
const recordedRequestedAt = Math.max(0, Number(runtimeState.register?.verificationRequestedAt) || 0);
const requestedAt = recordedRequestedAt || Math.max(0, Date.now() - MAIL_2925_FILTER_LOOKBACK_MS);
const filterAfterTimestamp = mail.provider === '2925'
? Math.max(0, requestedAt - MAIL_2925_FILTER_LOOKBACK_MS)
: requestedAt;
@@ -952,22 +1099,44 @@
const nodeId = String(state?.nodeId || 'kiro-submit-email').trim();
const currentState = await getExecutionState(state);
try {
if (typeof resolveSignupEmailForFlow !== 'function') {
throw new Error('Kiro 邮箱步骤缺少公共邮箱解析能力,无法继续执行。');
}
const tabId = await activateKiroRegisterTab(currentState, {
missingUrlMessage: '缺少 Kiro 注册页地址,请先执行步骤 1。',
openFailedMessage: '无法恢复 Kiro 注册页,请重新执行步骤 1。',
});
await ensureKiroPageState(tabId, {
const currentPageState = await readKiroRegisterPageState(tabId, {
step: 2,
targetStates: ['email_entry'],
stableMs: 2500,
initialDelayMs: 300,
injectLogMessage: '步骤 2:Kiro 注册页内容脚本未就绪,正在等待页面恢复...',
readyLogMessage: '步骤 2:正在等待 Kiro 注册页邮箱输入框加载完成...',
readyLogMessage: '步骤 2:正在读取 Kiro 注册页当前状态...',
});
assertKiroRegistrationOnlyState(currentPageState, currentState, 2);
if (KIRO_REGISTER_AFTER_EMAIL_STATES.includes(currentPageState?.state)) {
const runtimeState = readKiroRuntime(currentState);
const adoptedEmail = resolveKiroRegisterEmail(currentState, currentPageState);
if (!adoptedEmail) {
throw new Error('步骤 2:当前已不在邮箱页,但无法识别注册邮箱,请回到邮箱页重新提交或在配置中填入注册邮箱。');
}
const status = getKiroRegisterStatusForPageState(currentPageState.state);
await adoptKiroRegisterPageState(currentState, currentPageState, nodeId, {
email: adoptedEmail,
status,
verificationRequestedAt: currentPageState.state === 'register_otp_page'
? runtimeState.register?.verificationRequestedAt || 0
: undefined,
});
await log(`步骤 2:检测到当前已进入 ${currentPageState.state},已收养注册进度并继续。`, 'ok', nodeId);
return;
}
if (currentPageState?.state !== 'email_entry') {
throw new Error(`步骤 2:当前页面状态为 ${currentPageState?.state || 'unknown'},不是 Kiro 注册邮箱页,请先执行步骤 1 或回到邮箱输入页。`);
}
if (typeof resolveSignupEmailForFlow !== 'function') {
throw new Error('Kiro 邮箱步骤缺少公共邮箱解析能力,无法继续执行。');
}
const resolvedEmail = await resolveSignupEmailForFlow(currentState, {
preserveAccountIdentity: true,
@@ -993,19 +1162,27 @@
throw new Error(submitResult.error);
}
const landingResult = await ensureKiroPageState(tabId, {
const landingResult = await waitForKiroPageChange(tabId, {
step: 2,
targetStates: ['name_entry'],
fromStates: ['email_entry'],
stableMs: 1500,
initialDelayMs: 150,
injectLogMessage: '步骤 2:邮箱提交后页面切换中,正在等待 Kiro 注册页恢复...',
readyLogMessage: '步骤 2:邮箱已提交,正在等待 Kiro 姓名页加载完成...',
timeoutMessage: '邮箱提交后未进入姓名页,请检查当前邮箱是否已注册或页面是否异常。',
readyLogMessage: '步骤 2:邮箱已提交,正在等待 Kiro 注册链路进入下一页...',
timeoutMessage: '邮箱提交后页面没有离开邮箱页,请检查邮箱是否被拒绝、页面是否异常或代理是否卡住。',
});
assertKiroRegistrationOnlyState(landingResult, currentState, 2, resolvedEmail);
if (!KIRO_REGISTER_AFTER_EMAIL_STATES.includes(landingResult?.state)) {
throw new Error(`步骤 2:邮箱提交后进入了无法继续注册的页面状态:${landingResult?.state || 'unknown'}`);
}
const landedStatus = getKiroRegisterStatusForPageState(landingResult.state);
const requestedAt = landingResult.state === 'register_otp_page' ? Date.now() : 0;
const isCompleted = landedStatus === 'completed';
const payload = await applyRuntimeState(currentState, {
session: {
currentStage: 'register',
currentStage: isCompleted ? 'desktop-authorize' : 'register',
pageState: landingResult?.state || '',
pageUrl: landingResult?.url || '',
lastError: '',
@@ -1013,15 +1190,16 @@
register: {
email: resolvedEmail,
fullName: '',
verificationRequestedAt: 0,
status: 'waiting_name',
verificationRequestedAt: requestedAt,
status: landedStatus,
completedAt: isCompleted ? Date.now() : 0,
},
upload: {
status: 'waiting_register',
status: isCompleted ? 'waiting_desktop_authorize' : 'waiting_register',
error: '',
},
});
await log(`步骤 2:邮箱 ${resolvedEmail} 已提交,当前已进入姓名页。`, 'ok', nodeId);
await log(`步骤 2:邮箱 ${resolvedEmail} 已提交,当前页面状态:${landingResult?.state || 'unknown'}`, 'ok', nodeId);
await completeNodeFromBackground(nodeId, {
...payload,
email: resolvedEmail,
@@ -1040,22 +1218,41 @@
const currentState = await getExecutionState(state);
try {
const runtimeState = readKiroRuntime(currentState);
if (!cleanString(runtimeState.register?.email || currentState?.email)) {
throw new Error('缺少 Kiro 注册邮箱,请先完成步骤 2。');
}
const tabId = await activateKiroRegisterTab(currentState, {
missingUrlMessage: '缺少 Kiro 注册页地址,请先执行步骤 1。',
openFailedMessage: '无法恢复 Kiro 注册页,请重新执行步骤 1。',
});
await ensureKiroPageState(tabId, {
const currentPageState = await readKiroRegisterPageState(tabId, {
step: 3,
targetStates: ['name_entry'],
stableMs: 1500,
initialDelayMs: 150,
injectLogMessage: '步骤 3:Kiro 姓名页内容脚本未就绪,正在等待页面恢复...',
readyLogMessage: '步骤 3:正在等待 Kiro 姓名页加载完成...',
readyLogMessage: '步骤 3:正在读取 Kiro 注册页当前状态...',
});
assertKiroRegistrationOnlyState(currentPageState, currentState, 3);
const currentEmail = resolveKiroRegisterEmail(currentState, currentPageState);
if (!currentEmail) {
throw new Error('步骤 3:缺少 Kiro 注册邮箱,请先完成步骤 2。');
}
if (KIRO_REGISTER_AFTER_NAME_STATES.includes(currentPageState?.state)) {
const status = getKiroRegisterStatusForPageState(currentPageState.state);
await adoptKiroRegisterPageState(currentState, currentPageState, nodeId, {
email: currentEmail,
status,
verificationRequestedAt: currentPageState.state === 'register_otp_page'
? (runtimeState.register?.verificationRequestedAt || 0)
: undefined,
});
await log(`步骤 3:检测到当前已进入 ${currentPageState.state},已收养注册进度并继续。`, 'ok', nodeId);
return;
}
if (currentPageState?.state !== 'name_entry') {
throw new Error(`步骤 3:当前页面状态为 ${currentPageState?.state || 'unknown'},不是 Kiro 注册姓名页,请先完成步骤 2。`);
}
const fullName = resolveKiroFullName(currentState);
const verificationRequestedAt = Date.now();
@@ -1079,33 +1276,44 @@
throw new Error(submitResult.error);
}
const landingResult = await ensureKiroPageState(tabId, {
const landingResult = await waitForKiroPageChange(tabId, {
step: 3,
targetStates: ['otp_page'],
fromStates: ['name_entry'],
stableMs: 1500,
initialDelayMs: 150,
injectLogMessage: '步骤 3:姓名提交后页面切换中,正在等待 Kiro 注册页恢复...',
readyLogMessage: '步骤 3:姓名已提交,正在等待 Kiro 验证码页加载完成...',
readyLogMessage: '步骤 3:姓名已提交,正在等待 Kiro 注册链路进入下一页...',
timeoutMessage: '姓名提交后未进入验证码页,请检查当前页面状态。',
});
assertKiroRegistrationOnlyState(landingResult, currentState, 3, currentEmail);
if (!KIRO_REGISTER_AFTER_NAME_STATES.includes(landingResult?.state)) {
throw new Error(`步骤 3:姓名提交后进入了无法继续注册的页面状态:${landingResult?.state || 'unknown'}`);
}
const landedStatus = getKiroRegisterStatusForPageState(landingResult.state);
const isCompleted = landedStatus === 'completed';
const payload = await applyRuntimeState(currentState, {
session: {
currentStage: 'register',
currentStage: isCompleted ? 'desktop-authorize' : 'register',
pageState: landingResult?.state || '',
pageUrl: landingResult?.url || '',
lastError: '',
},
register: {
email: currentEmail,
fullName,
verificationRequestedAt,
status: 'waiting_otp',
verificationRequestedAt: landingResult.state === 'register_otp_page'
? verificationRequestedAt
: runtimeState.register?.verificationRequestedAt || 0,
status: landedStatus,
completedAt: isCompleted ? Date.now() : 0,
},
upload: {
status: 'waiting_register',
status: isCompleted ? 'waiting_desktop_authorize' : 'waiting_register',
error: '',
},
});
await log('步骤 3:姓名已提交,当前已进入验证码页。', 'ok', nodeId);
await log(`步骤 3:姓名已提交,当前页面状态:${landingResult?.state || 'unknown'}`, 'ok', nodeId);
await completeNodeFromBackground(nodeId, payload);
} catch (error) {
const message = getErrorMessage(error);
@@ -1118,25 +1326,48 @@
const nodeId = String(state?.nodeId || 'kiro-submit-verification-code').trim();
const currentState = await getExecutionState(state);
try {
const runtimeState = readKiroRuntime(currentState);
if (!cleanString(runtimeState.register?.email || currentState?.email)) {
throw new Error('缺少 Kiro 注册邮箱,请先完成步骤 2。');
}
const tabId = await activateKiroRegisterTab(currentState, {
missingUrlMessage: '缺少 Kiro 注册页地址,请先执行步骤 1。',
openFailedMessage: '无法恢复 Kiro 注册页,请重新执行步骤 1。',
});
await ensureKiroPageState(tabId, {
const currentPageState = await readKiroRegisterPageState(tabId, {
step: 4,
targetStates: ['otp_page'],
stableMs: 1500,
initialDelayMs: 150,
injectLogMessage: '步骤 4:Kiro 验证码页内容脚本未就绪,正在等待页面恢复...',
readyLogMessage: '步骤 4:正在等待 Kiro 验证码页加载完成...',
readyLogMessage: '步骤 4:正在读取 Kiro 注册页当前状态...',
});
assertKiroRegistrationOnlyState(currentPageState, currentState, 4);
const codeResult = await pollKiroVerificationCode(4, currentState, nodeId);
const currentEmail = resolveKiroRegisterEmail(currentState, currentPageState);
if (!currentEmail) {
throw new Error('步骤 4:缺少 Kiro 注册邮箱,请先完成步骤 2,或在当前验证码页显示注册邮箱后重试。');
}
if (KIRO_REGISTER_AFTER_OTP_STATES.includes(currentPageState?.state)) {
const status = getKiroRegisterStatusForPageState(currentPageState.state);
await adoptKiroRegisterPageState(currentState, currentPageState, nodeId, {
email: currentEmail,
status,
});
await log(`步骤 4:检测到当前已进入 ${currentPageState.state},已收养注册进度并继续。`, 'ok', nodeId);
return;
}
if (currentPageState?.state !== 'register_otp_page') {
throw new Error(`步骤 4:当前页面状态为 ${currentPageState?.state || 'unknown'},不是 Kiro 注册验证码页,请先完成前置注册步骤。`);
}
const pollingState = {
...currentState,
email: currentEmail,
kiroRuntime: deepMerge(readKiroRuntime(currentState), {
register: {
email: currentEmail,
},
}),
};
const codeResult = await pollKiroVerificationCode(4, pollingState, nodeId);
const code = cleanString(codeResult?.code);
if (!code) {
throw new Error('未能获取到 Kiro 邮箱验证码。');
@@ -1162,31 +1393,44 @@
throw new Error(submitResult.error);
}
const landingResult = await ensureKiroPageState(tabId, {
const landingResult = await waitForKiroPageChange(tabId, {
step: 4,
targetStates: ['password_page'],
fromStates: ['register_otp_page'],
stableMs: 1500,
initialDelayMs: 150,
injectLogMessage: '步骤 4:验证码提交后页面切换中,正在等待 Kiro 注册页恢复...',
readyLogMessage: '步骤 4:验证码已提交,正在等待 Kiro 密码页加载完成...',
returnOnCodeInvalid: true,
timeoutMessage: '验证码提交后未进入密码页,请检查验证码是否失效或页面是否异常。',
});
assertKiroRegistrationOnlyState(landingResult, currentState, 4, currentEmail);
if (landingResult?.state === 'register_otp_page' && landingResult?.codeInvalid) {
throw new Error('步骤 4:Kiro 提示验证码无效或已过期,已停止当前注册;请重新获取验证码或换邮箱重试。');
}
if (!KIRO_REGISTER_AFTER_OTP_STATES.includes(landingResult?.state)) {
throw new Error(`步骤 4:验证码提交后进入了无法继续注册的页面状态:${landingResult?.state || 'unknown'}`);
}
const landedStatus = getKiroRegisterStatusForPageState(landingResult.state);
const isCompleted = landedStatus === 'completed';
const payload = await applyRuntimeState(currentState, {
session: {
currentStage: 'register',
currentStage: isCompleted ? 'desktop-authorize' : 'register',
pageState: landingResult?.state || '',
pageUrl: landingResult?.url || '',
lastError: '',
},
register: {
status: 'waiting_password',
email: currentEmail,
status: landedStatus,
completedAt: isCompleted ? Date.now() : 0,
},
upload: {
status: 'waiting_register',
status: isCompleted ? 'waiting_desktop_authorize' : 'waiting_register',
error: '',
},
});
await log('步骤 4:验证码已提交,当前已进入密码页。', 'ok', nodeId);
await log(`步骤 4:验证码已提交,当前页面状态:${landingResult?.state || 'unknown'}`, 'ok', nodeId);
await completeNodeFromBackground(nodeId, {
...payload,
code,
@@ -1208,14 +1452,29 @@
missingUrlMessage: '缺少 Kiro 注册页地址,请先执行步骤 1。',
openFailedMessage: '无法恢复 Kiro 注册页,请重新执行步骤 1。',
});
await ensureKiroPageState(tabId, {
const currentPageState = await readKiroRegisterPageState(tabId, {
step: 5,
targetStates: ['password_page'],
stableMs: 1500,
initialDelayMs: 150,
injectLogMessage: '步骤 5:Kiro 密码页内容脚本未就绪,正在等待页面恢复...',
readyLogMessage: '步骤 5:正在等待 Kiro 密码页加载完成...',
readyLogMessage: '步骤 5:正在读取 Kiro 注册页当前状态...',
});
assertKiroRegistrationOnlyState(currentPageState, currentState, 5);
const currentEmail = resolveKiroRegisterEmail(currentState, currentPageState);
if (KIRO_REGISTER_AFTER_PASSWORD_STATES.includes(currentPageState?.state)) {
const status = getKiroRegisterStatusForPageState(currentPageState.state);
await adoptKiroRegisterPageState(currentState, currentPageState, nodeId, {
email: currentEmail,
status,
});
await log(`步骤 5:检测到当前已进入 ${currentPageState.state},已收养注册进度并继续。`, 'ok', nodeId);
return;
}
if (currentPageState?.state !== 'create_password_page') {
throw new Error(`步骤 5:当前页面状态为 ${currentPageState?.state || 'unknown'},不是 Kiro 注册密码页,请先完成前置注册步骤。`);
}
const passwordResolution = resolveKiroPassword(currentState);
const password = passwordResolution.password;
@@ -1253,28 +1512,33 @@
const landingResult = await waitForKiroPageChange(tabId, {
step: 5,
fromStates: ['password_page'],
fromStates: ['create_password_page'],
stableMs: 1200,
initialDelayMs: 120,
injectLogMessage: '步骤 5:密码提交后页面切换中,正在等待 Kiro 注册页恢复...',
readyLogMessage: '步骤 5:密码已提交,正在等待 Kiro 注册页完成跳转...',
timeoutMessage: '密码提交后页面未离开密码页,请检查密码规则或当前页面提示。',
});
const nextRegisterStatus = landingResult?.state === 'success_page'
? 'completed'
: 'waiting_consent';
assertKiroRegistrationOnlyState(landingResult, currentState, 5, currentEmail);
if (!KIRO_REGISTER_AFTER_PASSWORD_STATES.includes(landingResult?.state)) {
throw new Error(`步骤 5:密码提交后进入了无法继续注册的页面状态:${landingResult?.state || 'unknown'}`);
}
const nextRegisterStatus = getKiroRegisterStatusForPageState(landingResult?.state);
const payload = await applyRuntimeState(currentState, {
session: {
currentStage: 'register',
currentStage: nextRegisterStatus === 'completed' ? 'desktop-authorize' : 'register',
pageState: landingResult?.state || '',
pageUrl: landingResult?.url || '',
lastError: '',
},
register: {
email: currentEmail || undefined,
status: nextRegisterStatus,
completedAt: nextRegisterStatus === 'completed' ? Date.now() : 0,
},
upload: {
status: 'waiting_register',
status: nextRegisterStatus === 'completed' ? 'waiting_desktop_authorize' : 'waiting_register',
error: '',
},
});
@@ -1295,17 +1559,21 @@
missingUrlMessage: '缺少 Kiro 注册页地址,请先执行步骤 1。',
openFailedMessage: '无法恢复 Kiro 注册页,请重新执行步骤 1。',
});
let landingResult = await ensureKiroPageState(tabId, {
let landingResult = await readKiroRegisterPageState(tabId, {
step: 6,
targetStates: ['authorization_page', 'kiro_web_signed_in'],
stableMs: 1500,
initialDelayMs: 150,
injectLogMessage: '步骤 6:Kiro 授权确认页内容脚本未就绪,正在等待页面恢复...',
readyLogMessage: '步骤 6:正在等待 Kiro 授权确认页加载完成...',
readyLogMessage: '步骤 6:正在读取 Kiro 注册页当前状态...',
timeoutMessage: '未进入 Kiro 授权确认页,请检查当前页面状态。',
});
assertKiroRegistrationOnlyState(landingResult, currentState, 6);
if (landingResult?.state !== 'kiro_web_signed_in') {
if (!['authorization_page', 'success_page', 'kiro_web_signed_in'].includes(landingResult?.state)) {
throw new Error(`步骤 6:当前页面状态为 ${landingResult?.state || 'unknown'},不是 Kiro 注册授权确认页,请先完成前置注册步骤。`);
}
if (landingResult?.state === 'authorization_page') {
await log('步骤 6:正在确认访问并完成 Kiro 注册授权...', 'info', nodeId);
const submitResult = await sendToContentScriptResilient(KIRO_REGISTER_PAGE_SOURCE_ID, {
type: 'EXECUTE_NODE',
@@ -1326,13 +1594,14 @@
}
landingResult = await ensureKiroPageState(tabId, {
step: 6,
targetStates: ['kiro_web_signed_in'],
targetStates: ['success_page', 'kiro_web_signed_in'],
stableMs: 2000,
initialDelayMs: 300,
injectLogMessage: '步骤 6:授权确认后页面跳转中,正在等待 Kiro Web 登录态恢复...',
readyLogMessage: '步骤 6:授权确认已提交,正在等待回到 Kiro Web...',
timeoutMessage: '授权确认后未回到 Kiro Web 登录完成页,请检查当前页面或代理状态。',
});
assertKiroRegistrationOnlyState(landingResult, currentState, 6);
}
const webAuthSummary = await captureKiroWebAuthSummary();