Skip to content

feat: CLI access token 自动化 + bootstrap 一键开通 + 多命名配置 + config ui#95

Open
lishengzxc wants to merge 11 commits into
mainfrom
feat/cli-access-token
Open

feat: CLI access token 自动化 + bootstrap 一键开通 + 多命名配置 + config ui#95
lishengzxc wants to merge 11 commits into
mainfrom
feat/cli-access-token

Conversation

@lishengzxc

@lishengzxc lishengzxc commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

背景

在此之前,控制台域(console)鉴权只能靠浏览器登录拿到 access_token,token 过期后命令会直接报 NotLogined,需要用户手动重新登录;OpenAPI AK/SK 只能签名调用模型接口,无法换取控制台 token;同一台机器也只能维护一套凭证。本 PR 打通「AK/SK → 控制台 token」链路,补齐开通流程自动化、多套凭证隔离,并提供可视化管理配置的本地 WebUI。同时合并了最新 main(含 feat/recommend-new,移除了 intent-detect-v3 独立 base URL 机制)。

新增功能

1. CLI Access Token 生成与自动刷新(核心)

  • 新增 core 能力 generateCLIAccessToken():调用 ModelStudio OpenAPI GenerateCLIAccessToken,按 baseUrl 自动选 cn/intl 区域 host。
  • 新增命令 bl auth generate-access-token:用 --access-key-id / --access-key-secret(必填)+ --security-token(可选)换取 cliAccessToken
  • bl auth login --open-api 增强:保存 AK/SK 的同时自动换取 access_token 一并落盘,登录一步到位。
  • 控制台调用自动刷新:Client.console() 捕获 NotLogined 后用本地 AK/SK 静默刷新 token 并重试一次;无 AK/SK 时按原错误抛出。

2. bl bootstrap —— 一键初始化工作空间并开通后付费服务

串联 6 步控制台流程:检查登录/工作空间状态 → 初始化工作空间 → 创建控制台账号用户 → 轮询下单结果 → 查询商品激活状态 → 对未开通商品发起后付费开通并轮询至激活(超时抛 TIMEOUT)。支持 --dry-run 只打印计划、auth: "console" 复用鉴权域 flag。

3. 多命名配置 --config <name>

在同一个 ~/.bailian/config.json 内维护多套互相隔离的凭证 profile:默认配置写顶层字段,命名配置写独立 block,读写互不干扰;normalizeConfigName() 校验命名;auth login/logout/statusconfig set/show 全部按当前 --config 作用域读写并标注 config / config_file

4. STS Security Token 支持

新增 --security-token flag、ALIBABA_CLOUD_SECURITY_TOKEN 环境变量、config 字段 security_token;解析优先级 flag → env → config;签名注入 x-acs-security-token 头。

5. 可观测性与错误透传增强

console gateway --verbose 打印结构化请求/响应;BailianError 新增 rawResponse 字段,把原始响应与可读 message 分离;国内站 gateway 增加 switchUserType: 3

6. bl config ui —— 可视化管理配置的本地 WebUI(新增)

启动绑定 127.0.0.1 的本地 HTTP server + 内嵌单页 HTML(原生 JS,无新依赖、无构建步骤),可视化查看/新建/切换/删除全部命名 profile 并编辑其键值与凭证。

  • 新增 core 全量配置 API:readConfigProfiles()(分离 default 与各命名 profile)、deleteConfigProfile(name)
  • 复用 console 登录里 node:http + 127.0.0.1 随机端口 + openInBrowser 模式(抽到 commands/shared/local-server.ts 共用);抽出 commands/config/shared.ts 统一 config set 与 WebUI 的键校验。
  • 安全:仅绑 loopback;所有请求校验 ?token=(不匹配 401)与 Host 头为 loopback(防 DNS rebinding,否则 403)。
  • flags:--port <port>(默认随机空闲端口)、--no-open(不自动开浏览器)、--dry-run(只打印计划);--config <name> 决定 UI 初始聚焦的 profile。
  • 密钥按设计在 UI 内明文可见可编辑,靠 localhost 绑定 + token + Host 校验保护,启动提示会告知密钥会显示在浏览器中。

验证方法

自动化(无需真实凭证)

vp check   # format + lint + type check:420 files 格式通过,340 files 无 lint/type 错误
vp test    # 单元 + e2e,本次相关用例均为本地 mock

关键用例:packages/commands/tests/bootstrap.test.tspackages/commands/tests/config-ui.test.ts(server 集成:401/403 鉴权、GET/POST/DELETE、timeout 强转、空串清除、明文往返)、packages/cli/tests/e2e/config-profile.e2e.test.tspackages/commands/tests/e2e/config.e2e.test.ts(含 config ui --dry-run)、packages/core/tests/config-store.test.ts(含 readConfigProfiles / deleteConfigProfile)。

手工(需真实 AK/SK 或控制台账号,建议加 --config test 隔离)

  1. bl auth generate-access-token --access-key-id <AK> --access-key-secret <SK> → 输出含 cliAccessToken
  2. bl auth login --open-api ... --config testbl auth status --config test → openapi 与 console 均已配置
  3. test block 的 access_token 改为无效值,执行任意 console 命令 → 自动刷新成功而非报 NotLogined
  4. bl bootstrap --dry-run 看计划;bl bootstrap --config test --verbose → 最终 status: ready
  5. bl config set api_key sk-a --config a / --config bbl config show --config a 与默认互不影响
  6. bl config ui(可选 --port / --no-open / --config <name>)→ 浏览器打开带 token 的本地页面,管理各 profile;bl config ui --dry-run 只打印监听计划与路由

兼容性

  • 不带 --config 时行为与旧版一致,已有单套凭证的 config.json 无需迁移。
  • 合并 main 时对齐移除了 intent-detect 独立 base URL 的所有引用;skills/bailian-cli/reference/ 已重新生成。

已知事项

  • packages/commands/tests/e2e/auth.e2e.test.tsauth login --open-api 用例会触发真实 GenerateCLIAccessToken 网络调用,离线环境(占位 AK/SK)必然失败;该失败在本 PR 的 WebUI 改动之前即存在,属于 open-api-token 特性的既有问题,与本次改动无关。

lishengzxc and others added 10 commits July 9, 2026 23:40
When logging in with --open-api, call the GenerateCLIAccessToken API
using the provided AK/SK to obtain an access token and persist it
alongside the credentials in config.json.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…otLogined

Move the GenerateCLIAccessToken API call logic into core/auth/refresh-token.ts
so it can be reused across packages. Add refreshAccessToken() which reads
AK/SK from config, calls the API, and persists the new access_token.

Client.console() now catches NotLogined errors and automatically retries
with a refreshed token when AK/SK are available in config.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- 在 bootstrap 命令流程中添加第 3 步,调用 createUser 接口创建控制台账号用户
- 修改 callApi 函数支持传入请求体参数
- 增强错误日志输出,显示更完整的错误响应内容
- 在服务启动时校验登录信息包含 aliyun.uid,否则抛出错误
- 优化商品检查与激活逻辑,更清晰的状态输出及错误处理
- 在 CLI-core 控制台网关请求中添加日志,打印结构化请求负载,支持 verbose 模式
- BailianError 新增 rawResponse 字段,保存原始错误响应数据
- 增加 bootstrap 命令单元测试,覆盖用户创建及不同初始化场景
- 调整测试框架用例,增加调用控制台网关及错误处理的测试覆盖
- 新增 `--config <name>` 参数支持读取与写入命名的配置块
- 命名配置与默认配置完全隔离,互不影响
- 规范命名配置名称格式,禁止路径穿越及顶层字段冲突
- 配置文件读取写入逻辑改为维护原始完整对象,支持多配置块共存
- AuthStore 和 ConfigStore 均支持命名配置,登录登出只影响指定配置块
- CLI 命令增加对 `--config` 标志的支持,包括 config set/show/auth status 等
- 鉴权状态输出带上配置名和配置文件路径信息
- 提示和报错信息包含配置相关上下文,增强用户体验
- 完善相关单元测试覆盖命名配置行为
启动绑定 127.0.0.1 的本地 HTTP server + 内嵌单页 WebUI,可视化查看/
新建/切换/删除全部命名 profile 并编辑键值与凭证。

- core: readConfigProfiles / deleteConfigProfile 全量配置读写 API
- commands/config/shared.ts: 抽出 VALID_KEYS/别名/校验,set.ts 复用
- commands/shared/local-server.ts: 抽出 listen/openInBrowser,login-console 复用
- config ui: token + Host 校验,--config 决定初始聚焦,密钥明文可编辑
@lishengzxc lishengzxc changed the title feat: CLI access token 自动化 + bootstrap 一键开通 + 多命名配置 feat: CLI access token 自动化 + bootstrap 一键开通 + 多命名配置 + config ui Jul 13, 2026
- 新增命令行参数,支持通过--access-key-id和--access-key-secret传入阿里云凭证
- 集成generateCLIAccessToken接口实现AK/SK转CLI访问令牌
- 调用BailianControl OpenAPI完成用户创建,实现与控制台用户同步
- 新增获取工作空间列表接口,解析agentId以便权限管理
- 调用ResetPolicies4Agent接口完成用户权限授权
- 优化命令步骤日志输出,更详细展示执行流程
- 将轮询次数由120次减少至20次,缩短等待激活时长
- 移除旧有测试代码,适配新实现
- core包新增bailian-control客户端支持对应OpenAPI调用
- client模块添加openApiJson通用方法支持ROA风格接口调用
- console模块导出类型扩展,涵盖新的网关目标类型
- 修改acs请求签名类型支持number类型参数,增强签名兼容性
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant