# E10 鉴权适配模块

E10 适配模块刻意与核心 CLI 框架隔离，避免平台逻辑污染通用命令基础设施。

存储路径与密钥：

- 鉴权根目录：通过 `weaver-work-cli auth root` 查看；默认位于用户主目录下的 `.weaver-work-cli/e10`（Windows PowerShell：`$env:USERPROFILE\.weaver-work-cli\e10`；macOS/Linux：`$HOME/.weaver-work-cli/e10`）
- Profile 目录：`profiles/<profile>`（位于鉴权根目录下）
- 当前激活 profile：`profile`（位于鉴权根目录下）
- Keychain service/account：`weaver-work-cli` / `auth-key`
- 发票业务 Token Keychain service：`cn.weaver.weaver-work-cli.invoice-token`

登录态加密使用的 Keychain 原生模块按需加载。模块缺失、原生依赖无法加载或系统
Keychain 不可用时，CLI 仍可启动，并回退到鉴权根目录下的 `.key` 文件继续完成
登录态加解密。该文件会请求 `0600` 模式；但 Windows 不提供完整的 POSIX 文件权限
语义，因此文件回退属于可用性保障，安全隔离强度不等同于 Windows 凭据管理器。

发票业务 Token 的 Keychain 缓存是可选的性能优化。在没有系统密钥环的
Web/Linux 环境中，CLI 不会把 Token 写入明文文件，而是仅在当前命令进程内保存并
继续完成业务请求；下一次命令会重新向 E10 获取 Token。

`weaver-work-cli` 默认不读取、不迁移 `e10-login` / `e10-cli` 的旧 `.e10-cli`
登录态，避免用户安装本插件后因为历史登录状态被自动授权。确需复用外部 auth
文件时，可以显式传 `--auth <path>` 或设置 `E10_AUTH_PATH`。

主要命令：

```text
weaver-work-cli auth status
weaver-work-cli auth login --base-url "https://weapp.xxx.cn"
weaver-work-cli auth oidc --base-url "https://weapp.xxx.cn"
weaver-work-cli auth xiaoe
weaver-work-cli auth set --eteamsid "PCACCOUNT_xxx" --base-url "https://weapp.xxx.cn"
weaver-work-cli auth whoami
weaver-work-cli auth whoami --live
weaver-work-cli auth logout
weaver-work-cli auth profile list
weaver-work-cli auth profile use PROFILE_NAME
weaver-work-cli auth export-weaver-env
```

`auth login` 和 `auth oidc` 都严格走 E10 OAuth2.0 浏览器授权登录，不会读取或消费 XiaoE 统一登录凭据。本地默认监听
`http://127.0.0.1:19800/callback`。如端口被占用，可以使用
`--port 19801` 指定其他端口；如需要区分客户端来源，可以使用
`--agent_type <value>`。未显式传入时，CLI 会依次读取 `WEAVER_AGENT_TYPE`、
`WORKBUDDY_AGENT_TYPE`、`CODEX_AGENT_TYPE`，再根据 `WORKBUDDY_*` / `CODEX_*`
环境变量推断当前宿主，最后回落为 `weaver-work-cli`。浏览器授权地址会同时携带
`agent_type=<value>` 和 `from=<value>`，其中 `from` 用于 E10 授权确认页展示客户端名称。
授权完成后的本地回调页会为已识别的桌面宿主显示应用打开弹层。CLI 内置 WorkBuddy
（`workbuddy://`）、智能小 E（`xiaoe-client://`）和 Codex（`codex://`）映射；其他
智能体在 `agent_type` 本身是合法协议名时，默认按 `<agent_type>://` 唤起。Windows/macOS
安装包需要注册对应协议。弹层通过一次性令牌请求
本地 CLI，再由 CLI 调用系统协议处理器，避免浏览器直接访问自定义协议时出现不可定制的
Chrome/Edge 原生确认框。宿主需要返回特定会话时，可以传
`--agent-return-url <自定义协议 URL>`，或注入 `WEAVER_AGENT_RETURN_URL`（命令行优先）。
该显式地址也用于协议名与 `agent_type` 不一致的客户端。
返回地址只接受桌面应用自定义协议，不接受 `http(s)`、脚本或本地文件 URL。“始终打开”
偏好保存在当前本地回调地址的浏览器存储中。本地 CLI 打开通道默认保留 15 分钟；通道
结束后页面会自动退回浏览器自定义协议打开方式，不直接显示网络请求错误。
智能小 E 统一登录不会经过浏览器，也不会显示“返回智能小 E”弹层；该弹层只属于用户另行显式发起的 `auth login` 浏览器 OAuth。

XiaoE 宿主身份有两种判定入口：桌面客户端由 Agent 根据“智能小 e 客户端”“小 E”、`XiaoE`、`xiaoe-client` 等明确上下文判断，并传入 `--runtime-agent xiaoe`；网页端沿用原有环境变量规则，成对的 `XIAOE_USER_TOKEN` + `XIAOE_DOMAIN` 会被识别为 XiaoE。工作目录、客户端文件、内置 Node.js、历史登录、路径变量或单个凭据变量都不能单独用于判定。判定为 XiaoE 后，Agent 显式执行 `weaver-work-cli auth xiaoe`。

CLI 依次尝试成对的平台凭据、npm 包自带的 `scripts/xiaoe_env.py` 兼容路径、宿主 `xiaoeUserData/tokens.py`、桌面 XiaoE 客户端本地会话和 `WEAVER_XIAOE_*` ETEAMSID 映射。客户端会话优先读取 `XIAOE_USER_SETTINGS_PATH`，再从 `XIAOE_ROBOT_DATA_ROOT` / `XIAOE_ROBOT_ROOT` 查找，最后回退 macOS `~/Library/Application Support/XiaoE/Robots/<id>/user_settings.json` 或 Windows `%LOCALAPPDATA%/XiaoE/Robots/<id>/user_settings.json`。这些变量和文件只用于定位凭据，不能用于识别宿主。`XIAOE_DOMAIN` 是 XiaoE/erpa 换票服务地址，不是 E10 登录地址。

E10 目标地址按“显式 `--base-url` → 专用 `WEAVER_XIAOE_*` E10 配置/映射 → 当前 profile → `https://www.e-cology.com.cn`”解析。凭证可用时，CLI 直接保存登录态，保存的 `agentType` 固定为 `XiaoE`。统一登录失败时，所有操作系统都返回 `authentication/xiaoe_credential_unavailable`，不启动浏览器 OAuth。需要浏览器授权时必须另行显式执行 `auth login`。

脚本兼容链路会先自动发现桌面 XiaoE 客户端内置 Python（macOS 应用包与 Windows 按用户/全局安装均支持），再回退到系统 `python3`、`/usr/bin/python3`、`python`；Windows 的系统回退顺序为 `python`、`python3`、`py`。可用 `WEAVER_XIAOE_TOKEN_SCRIPT_PYTHON` 精确指定解释器，用 `WEAVER_XIAOE_TOKEN_SCRIPT_PATH` 指定桌面宿主脚本路径（旧名 `XIAOE_TOKEN_SCRIPT_PYTHON` / `XIAOE_TOKEN_SCRIPT_PATH` 仍兼容）。CLI 自带的 `xiaoe_env.py` 位于 npm 包 `scripts/`，不会放入 `weaver-e10-shared` Skill；Skill 包禁止携带或直接执行 Token 脚本。`XIAOE_` 是平台保留前缀，本 CLI 的自定义变量统一使用 `WEAVER_XIAOE_*`。

`auth xiaoe` 会先打印不含凭证的 preflight 摘要，给出 `authMode=xiaoe`、`credentialSourceDetected`、`attempted`、各凭据源检测结果和目标 `baseUrl`。进入脚本分支时会打印 `Trying XiaoE token script credential...`；进入内置 Node 会话分支时会打印 `Trying built-in XiaoE client session credential...`。成功结果和后续 `auth status` 会显示 `credentialSourceStep`、`credentialSourceType`、`credentialSourceLabel`。

业务命令不会自动建立 XiaoE 登录态。桌面客户端需要 XiaoE 专属业务行为时，Agent 必须显式传全局参数，例如 `weaver-work-cli --runtime-agent xiaoe workflow ...`；网页端由原有环境变量规则自动识别，不要求补这个参数。`--runtime-agent` 只控制运行时行为，不携带也不选择凭据。WorkBuddy、Codex 及其他智能体使用 `auth login --base-url <url> --agent_type <agent_type>` 的浏览器 OAuth 流程。

无法使用浏览器回调时，可以用 `auth set` 直接写入浏览器中复制到的
`ETEAMSID`。命令会调用 `teamsCheck` 解析当前用户、租户和组织信息，并写入
E10 兼容的 auth 文件。

`auth whoami` 默认读取本地缓存，不发网络请求；`auth whoami --live` 会调用
`teamsCheck` 获取实时信息。`auth export-weaver-env` 会输出
`WEAVER_BASE_URL`、`WEAVER_ETEAMSID`、`WEAVER_COOKIE`、`WEAVER_USER_AGENT` 和
`WEAVER_AGENT_TYPE`。默认 `--shell auto` 会在 Windows 输出 PowerShell 语法，在
macOS/Linux 输出 POSIX shell 语法；也可显式使用 `--shell powershell` 或
`--shell posix`。Agent 给子进程使用登录态时，仍优先通过 `weaver-work-cli run ...`
自动注入，避免在回复或日志中展示敏感值。

`auth login`、`auth oidc` 和 `auth set` 保存新登录态前，会清理同一
profile/baseUrl/userId 下缓存的发票业务 Token，避免重登后继续复用旧 Token。

`auth logout` 会清理当前 profile 的本地登录凭据和对应的发票业务 Token；也可配合
`--profile <name>` 清理指定 profile。该命令不删除 profile 配置和登录加密用
keychain 密钥。

Windows PowerShell：

```powershell
Invoke-Expression (weaver-work-cli auth export-weaver-env --shell powershell)
weaver-work-cli run node -e "console.log(process.env.WEAVER_BASE_URL || 'no e10 auth')"
```

macOS/Linux（bash/zsh）：

```bash
eval "$(weaver-work-cli auth export-weaver-env --shell posix)"
weaver-work-cli run node -e "console.log(process.env.WEAVER_BASE_URL || 'no e10 auth')"
```
