Fix Kiro BuilderId profileArn upload

This commit is contained in:
QLHazyCoder
2026-05-19 13:18:37 +08:00
parent 996ec92168
commit 3ad41965ff
5 changed files with 19 additions and 10 deletions
+3
View File
@@ -4,6 +4,7 @@
const kiroStateApi = root?.MultiPageBackgroundKiroState || null;
const DEFAULT_REGION = kiroStateApi?.DEFAULT_REGION || 'us-east-1';
const DEFAULT_TARGET_ID = kiroStateApi?.DEFAULT_TARGET_ID || 'kiro-rs';
const BUILDER_ID_PROFILE_ARN = 'arn:aws:codewhisperer:us-east-1:638616132270:profile/AAAACCCCXXXX';
function isPlainObject(value) {
return Boolean(value) && typeof value === 'object' && !Array.isArray(value);
@@ -207,6 +208,7 @@
region,
email,
refreshToken,
profileArn: BUILDER_ID_PROFILE_ARN,
clientId,
clientSecret,
authMethod: 'idc',
@@ -364,6 +366,7 @@
const uploadResult = await uploadBuilderIdCredential(baseUrl, apiKey, {
refreshToken: uploadInput.refreshToken,
profileArn: uploadInput.profileArn,
authMethod: uploadInput.authMethod,
clientId: uploadInput.clientId,
clientSecret: uploadInput.clientSecret,
+5 -4
View File
@@ -12,7 +12,7 @@
4. 等待回到 Kiro Web 登录完成页,建立 Kiro Web 登录态
5. 基于已有 Kiro Web / Builder ID 浏览器会话打开桌面端授权页
6. 监听 localhost callback,用授权码与 PKCE 换取桌面端 Builder ID 凭据
7.`refreshToken / clientId / clientSecret / machineId / email` 等字段上传到 `kiro.rs`
7.`refreshToken / profileArn / clientId / clientSecret / machineId / email` 等字段上传到 `kiro.rs`
这条链路的核心判断是:能被 `kiro.rs` 稳定使用的不是注册页里某个临时结果,而是 Kiro 桌面端授权链路产生的 Builder ID 凭据。
@@ -23,7 +23,7 @@
- **两套 flow 分开**Kiro flow 独立使用 `background/kiro/*``content/kiro/*``kiroRuntime` 和自己的 9 个节点,不复用 OpenAI 的页面、接码、Plus、平台绑定逻辑。
- **只抽公共能力**:Kiro 只复用邮箱服务、账户密码生成、IP 代理和 `kiro.rs` 目标配置;这些能力本身是跨 flow 基础设施,不带 OpenAI 业务语义。
- **来源与目标清晰**:Kiro 的目标固定为 `kiro-rs`;运行页面来源按 runtime source 识别,注册子链路覆盖 Kiro Web 与 Builder ID 注册页,桌面授权子链路只覆盖 Builder ID authorize 页。
- **上传到 `kiro.rs`**:上传器只按 `kiro.rs` 新增凭据接口构建 payload不上传 `profileArn`不引入本地账号管理项目里的私有字段。
- **上传到 `kiro.rs`**:上传器只按 `kiro.rs` 新增凭据接口构建 payload并固定上传 BuilderId 的 Kiro runtime `profileArn`不引入本地账号管理项目里的私有字段。
- **不考虑旧兼容**:设计中不保留旧字段别名、不保留旧入口回退、不保留“失败后换旧链路”的分支。
### 2.2 完整性分析
@@ -33,7 +33,7 @@
- UI 配置:Kiro flow、`kiro.rs URL``API Key`、共享邮箱、共享密码、共享代理。
- 注册页面:官方 Kiro 登录页、Builder ID 注册页、授权确认页、Kiro Web 登录完成页。
- 桌面授权:OIDC client 注册、PKCE、authorize URL、localhost callback、token exchange。
- 上传:`kiro.rs` baseUrl 归一化、API Key 鉴权、payload 构建、machineId 计算、上传状态回写。
- 上传:`kiro.rs` baseUrl 归一化、API Key 鉴权、payload 构建、BuilderId profileArn 固定映射、machineId 计算、上传状态回写。
- 自动运行:Kiro 9 节点 linear workflow,执行范围、状态、日志、失败停止与轮次汇总走通用 runner,但节点实现完全属于 Kiro。
- 测试:覆盖状态模型、source 归属、注册页状态机、桌面授权 gate、上传器 payload、sidepanel flow 选择。
@@ -128,6 +128,7 @@ kiroRuntime: {
```js
{
refreshToken,
profileArn,
clientId,
clientSecret,
region,
@@ -146,8 +147,8 @@ kiroRuntime: {
- `machineId = sha256("KotlinNativeAPI/" + refreshToken)`
- `region / authRegion / apiRegion` 使用 Kiro 默认固定值
- `profileArn` 使用 BuilderId 固定值 `arn:aws:codewhisperer:us-east-1:638616132270:profile/AAAACCCCXXXX`
- `proxy*` 仅在当前共享代理存在且可解析时上传
- 不上传 `profileArn`
## 4. 设计自检
@@ -17,7 +17,7 @@ test('kiro publisher exposes a factory and upload payload helpers', () => {
assert.equal(typeof api?.buildMachineId, 'function');
});
test('kiro publisher builds kiro.rs payload from desktop auth runtime without profileArn', async () => {
test('kiro publisher builds kiro.rs payload from desktop auth runtime with BuilderId profileArn', async () => {
const api = loadPublisherApi();
const payload = api.buildKiroRsPayload({
kiroTargetId: 'kiro-rs',
@@ -51,6 +51,7 @@ test('kiro publisher builds kiro.rs payload from desktop auth runtime without pr
region: 'us-east-1',
email: 'aws-user@example.com',
refreshToken: 'refresh-token-001',
profileArn: 'arn:aws:codewhisperer:us-east-1:638616132270:profile/AAAACCCCXXXX',
clientId: 'client-001',
clientSecret: 'secret-001',
authMethod: 'idc',
@@ -62,7 +63,6 @@ test('kiro publisher builds kiro.rs payload from desktop auth runtime without pr
});
assert.equal(machineId.length, 64);
assert.match(machineId, /^[0-9a-f]{64}$/);
assert.equal(Object.prototype.hasOwnProperty.call(payload, 'profileArn'), false);
});
test('kiro publisher reads latest kiro.rs key from background state instead of stale node snapshot', async () => {
@@ -113,6 +113,7 @@ test('kiro publisher reads latest kiro.rs key from background state instead of s
method: options.method || 'GET',
apiKey: options.headers?.['x-api-key'],
authorization: options.headers?.Authorization,
body: options.body ? JSON.parse(options.body) : null,
});
if ((options.method || 'GET') === 'GET') {
return {
@@ -162,6 +163,10 @@ test('kiro publisher reads latest kiro.rs key from background state instead of s
assert.equal(requests[0].authorization, 'Bearer live-key');
assert.equal(requests[1].apiKey, 'live-key');
assert.equal(requests[1].authorization, 'Bearer live-key');
assert.equal(
requests[1].body.profileArn,
'arn:aws:codewhisperer:us-east-1:638616132270:profile/AAAACCCCXXXX'
);
assert.equal(completed.length, 1);
assert.equal(completed[0].nodeId, 'kiro-upload-credential');
});
+2 -2
View File
@@ -661,7 +661,7 @@ Kiro flow 的目标不是复用 OpenAI 注册链,而是独立完成“Kiro 官
6. 步骤 9 调用 `kiro.rs` Admin API
- 先探活 `/api/admin/credentials`
- 再用 `x-api-key` 上传桌面端 Builder ID 凭据
- payload 固定包含 `refreshToken / clientId / clientSecret / region / authRegion / apiRegion / machineId / email`
- payload 固定包含 `refreshToken / profileArn / clientId / clientSecret / region / authRegion / apiRegion / machineId / email`
- 如果当前启用了共享 IP 代理,也会把 `proxyUrl / proxyUsername / proxyPassword` 一并上传
- 上传结果保存到 `kiroRuntime.upload`
@@ -670,7 +670,7 @@ Kiro flow 的目标不是复用 OpenAI 注册链,而是独立完成“Kiro 官
- Kiro 只复用共享账户密码、共享邮箱服务和共享 IP 代理服务,不复用 OpenAI 接码 / Plus / 平台绑定 / 贡献模式链路
- Kiro 自动运行走通用 linear node runner,但执行器、运行态、页面驱动和上传器全部独立在 `background/kiro/*``content/kiro/*`
- Kiro 运行态统一落在 `kiroRuntime` 命名空间,不再散落为多个平铺字段
- `kiro.rs` 上传不再发送 `profileArn`machineId 固定按 `sha256("KotlinNativeAPI/" + refreshToken)` 生成
- `kiro.rs` 上传固定发送 BuilderId profileArn `arn:aws:codewhisperer:us-east-1:638616132270:profile/AAAACCCCXXXX`machineId 固定按 `sha256("KotlinNativeAPI/" + refreshToken)` 生成
- Kiro 注册页覆盖 `app.kiro.dev` 与 AWS Builder ID 页面;桌面授权页只绑定 AWS authorize 页面,二者由后台按 source 动态注入,避免同域 AWS 页面被错误归到另一条 Kiro 子链路
## 7. 邮箱与 provider 链路
+2 -2
View File
@@ -56,7 +56,7 @@
- `background/kiro/register-runner.js`:Kiro 注册页执行器,负责步骤 1~6 的编排、Kiro / AWS Builder ID cookies 清理、打开 `https://app.kiro.dev/signin`、选择 Builder ID 入口、注册标签页管理、邮箱/姓名/验证码/密码/授权确认,以及 Kiro Web 登录态推进。
- `background/kiro/desktop-client.js`:Kiro 桌面授权协议层,负责桌面 OIDC client 注册、PKCE 参数生成、授权地址组装、callback 参数校验和授权码换 token。
- `background/kiro/desktop-authorize-runner.js`:Kiro 桌面授权执行器,负责步骤 7~8 的标签页打开、授权页轮询、localhost callback 捕获,以及桌面授权完成后的凭据落库。
- `background/kiro/publisher-kiro-rs.js`Kiro 发布器,负责 `kiro.rs` 地址归一化、连通性探测、machineId 计算、上传 payload 构建与最终凭据上传。
- `background/kiro/publisher-kiro-rs.js`Kiro 发布器,负责 `kiro.rs` 地址归一化、连通性探测、BuilderId profileArn 固定映射、machineId 计算、上传 payload 构建与最终凭据上传。
- `background/ip-proxy-core.js`:IP 代理核心模块,负责代理条目解析、账号/接口代理池运行态、PAC 应用与清除、代理鉴权回填、出口探测、失败时的目标站点 fail-close 防漏规则,以及自动运行成功阈值后的代理切换支撑。
- `background/ip-proxy-provider-711proxy.js`711Proxy provider 规则模块,负责从账号串中识别和写回 `region / session / sessTime` 等参数,并在固定账号模式下把侧栏配置转换为最终生效的代理账号。
- `background/logging-status.js`:后台日志、步骤状态、错误信息和若干状态判断的公共工具层;日志条目统一写入结构化 `step / stepKey`,sidepanel 只读取该元数据渲染步骤标签,不再从日志正文解析步骤号;当前额外承接 `add-phone / 手机号页` 这类认证 fatal 错误的共享判定,并会把 Step 2 的“手机号输入模式未切成功”与真正的 auth `add-phone` 页面区分开,避免自动运行误停机。
@@ -216,7 +216,7 @@
- `tests/background-kiro-state-module.test.js`:测试 Kiro 运行态模块已接入且导出工厂,并覆盖默认命名空间、状态归一化、节点完成回写和下游重置规则。
- `tests/background-kiro-register-runner-module.test.js`:测试 Kiro 注册页执行器已接入且导出工厂,并覆盖步骤 1~6 的状态推进、页面命令派发与注册态回写。
- `tests/background-kiro-desktop-authorize-runner-module.test.js`:测试 Kiro 桌面授权执行器已接入且导出工厂,并覆盖 callback 捕获、state 校验、token 兑换和授权态更新。
- `tests/background-kiro-publisher-kiro-rs-module.test.js`:测试 `kiro.rs` 发布器已接入且导出工厂,并覆盖 machineId 生成、payload 构建、连通性探测与上传成功/失败处理。
- `tests/background-kiro-publisher-kiro-rs-module.test.js`:测试 `kiro.rs` 发布器已接入且导出工厂,并覆盖 BuilderId profileArn、machineId 生成、payload 构建、连通性探测与上传成功/失败处理。
- `tests/background-contribution-mode.test.js`:测试贡献模式的后台运行态与公开 OAuth 接入,覆盖 `contributionMode` 只存在于运行态、`SET_CONTRIBUTION_MODE / POLL_CONTRIBUTION_STATUS` 消息接入、reset 保留贡献运行态,以及 callback 自动提交在“无需手动提交”场景下的兼容处理。
- `tests/background-custom-email-pool.test.js`:测试后台对自定义邮箱池生成方式,以及自定义邮箱服务号池的归一化、标签文案和按轮次取邮箱逻辑。
- `tests/background-generated-email-module.test.js`:测试生成邮箱辅助模块已接入且导出工厂,并覆盖 Duck 对比基线优先级、2925 receive 模式回退普通邮箱生成、自定义邮箱池按轮次取值、2925 provide 模式账号池预热,以及 Duck / iCloud 在保留手机号身份场景下的共享持久化传参。