feat: add flow-aware kiro device auth workflow

This commit is contained in:
QLHazyCoder
2026-05-18 00:34:51 +08:00
parent b3da7c9e7f
commit 0c034c232d
26 changed files with 4085 additions and 383 deletions
+69 -15
View File
@@ -120,6 +120,40 @@
'step8VerificationTargetEmail',
]),
});
const KIRO_FLOW_FIELD_GROUPS = Object.freeze({
auth: Object.freeze([
'kiroDeviceCode',
'kiroUserCode',
'kiroDeviceAuthorizationCode',
'kiroLoginUrl',
'kiroVerificationUri',
'kiroVerificationUriComplete',
'kiroClientId',
'kiroClientSecret',
'kiroAuthRegion',
'kiroAuthExpiresAt',
'kiroAuthIntervalSeconds',
'kiroAuthTabId',
'kiroAuthStatus',
'kiroAuthError',
'kiroAccessToken',
'kiroRefreshToken',
]),
upload: Object.freeze([
'kiroUploadStatus',
'kiroUploadError',
'kiroCredentialId',
'kiroLastUploadAt',
'kiroLastConnectionMessage',
]),
identity: Object.freeze([
'kiroAuthorizedEmail',
]),
});
const FLOW_FIELD_GROUPS = Object.freeze({
openai: OPENAI_FLOW_FIELD_GROUPS,
kiro: KIRO_FLOW_FIELD_GROUPS,
});
function isPlainObject(value) {
return Boolean(value) && typeof value === 'object' && !Array.isArray(value);
@@ -210,11 +244,12 @@
};
}
function flattenOpenAiFlowState(flowState = {}) {
const openaiState = normalizePlainObject(flowState.openai);
function flattenFlowStateById(flowState = {}, flowId = 'openai') {
const fieldGroups = FLOW_FIELD_GROUPS[flowId] || {};
const scopedState = normalizePlainObject(flowState[flowId]);
const next = {};
for (const [groupKey, fields] of Object.entries(OPENAI_FLOW_FIELD_GROUPS)) {
const group = normalizePlainObject(openaiState[groupKey]);
for (const [groupKey, fields] of Object.entries(fieldGroups)) {
const group = normalizePlainObject(scopedState[groupKey]);
for (const field of fields) {
if (Object.prototype.hasOwnProperty.call(group, field)) {
next[field] = cloneValue(group[field]);
@@ -224,23 +259,29 @@
return next;
}
function buildOpenAiFlowState(baseValue = {}, state = {}) {
const baseFlowState = cloneValue(normalizePlainObject(baseValue));
const baseOpenAi = cloneValue(normalizePlainObject(baseFlowState.openai));
const openaiState = {
...baseOpenAi,
function buildScopedFlowState(baseFlowState = {}, state = {}, flowId = 'openai') {
const fieldGroups = FLOW_FIELD_GROUPS[flowId] || {};
const baseScopedState = cloneValue(normalizePlainObject(baseFlowState[flowId]));
const scopedState = {
...baseScopedState,
};
for (const [groupKey, fields] of Object.entries(OPENAI_FLOW_FIELD_GROUPS)) {
openaiState[groupKey] = {
...cloneValue(normalizePlainObject(baseOpenAi[groupKey])),
for (const [groupKey, fields] of Object.entries(fieldGroups)) {
scopedState[groupKey] = {
...cloneValue(normalizePlainObject(baseScopedState[groupKey])),
...pickDefinedFields(state, fields),
};
}
return scopedState;
}
function buildOpenAiFlowState(baseValue = {}, state = {}) {
const baseFlowState = cloneValue(normalizePlainObject(baseValue));
return {
...baseFlowState,
openai: openaiState,
openai: buildScopedFlowState(baseFlowState, state, 'openai'),
kiro: buildScopedFlowState(baseFlowState, state, 'kiro'),
};
}
@@ -265,6 +306,11 @@
luckmail: {},
identity: {},
},
kiro: {
auth: {},
upload: {},
identity: {},
},
},
};
}
@@ -375,9 +421,12 @@
);
}
Object.assign(next, flattenOpenAiFlowState(flowState));
Object.assign(next, flattenFlowStateById(flowState, 'openai'));
Object.assign(next, flattenFlowStateById(flowState, 'kiro'));
if (Object.prototype.hasOwnProperty.call(runtimeState, 'flowState')) {
Object.assign(next, flattenOpenAiFlowState(normalizePlainObject(runtimeState.flowState)));
const runtimeFlowState = normalizePlainObject(runtimeState.flowState);
Object.assign(next, flattenFlowStateById(runtimeFlowState, 'openai'));
Object.assign(next, flattenFlowStateById(runtimeFlowState, 'kiro'));
}
return next;
@@ -396,6 +445,9 @@
flowState: cloneValue(runtimeState.flowState),
sharedState: cloneValue(runtimeState.sharedState),
serviceState: cloneValue(runtimeState.serviceState),
flows: cloneValue(runtimeState.flowState),
shared: cloneValue(runtimeState.sharedState),
services: cloneValue(runtimeState.serviceState),
runtimeState,
};
}
@@ -422,6 +474,8 @@
return {
DEFAULT_ACTIVE_FLOW_ID,
FLOW_FIELD_GROUPS,
KIRO_FLOW_FIELD_GROUPS,
OPENAI_FLOW_FIELD_GROUPS,
RUNTIME_PROXY_FIELDS,
RUNTIME_SHARED_FIELDS,