# dws-chat — 凭证隔离机制

> 主流程见 `../SKILL.md`。本文件解释**为什么**必须用 `scripts/dws_agent.py`，以及多 agent 共存时凭证是如何隔离的。

## 关键事实（实测到 dws v1.0.30）

OAuth token 写在 **用户配置目录**，不在 `DWS_CONFIG_DIR` 内：

| 平台 | 典型路径 |
|------|----------|
| macOS | `$HOME/Library/Application Support/dws-cli/{dek, auth-token.enc}` |
| Linux | 多为 `$HOME/.config/dws-cli/` 或 `Library/...`（视构建而定） |
| Windows | `%APPDATA%\dws-cli\` 或 `$HOME\Library\Application Support\dws-cli\` |

- `DWS_CONFIG_DIR` → 仅 `app.json` / `identity.json` / `logs/` / `cache/`
- `DWS_DISABLE_KEYCHAIN=1` → 禁用系统 Keychain，**不会**搬移 token 文件

多 agent 共享同一用户配置目录时，后一次 login 会覆盖前一次的 token → **串库**。

## 隔离方案：独立配置目录

`scripts/dws_agent.py` 为子进程注入：

```text
HOME={workspace}/.dws_home
DWS_CONFIG_DIR={workspace}/.dws
DWS_DISABLE_KEYCHAIN=1
```

**Windows 额外注入：**

```text
USERPROFILE={workspace}/.dws_home
APPDATA={workspace}/.dws_home/AppData/Roaming
```

并预创建 `%APPDATA%\dws-cli` 与 `Library\Application Support\dws-cli`（兼容不同 dws 构建）。

| 项 | 规则 |
|----|------|
| 机制 | 一 agent ↔ 一 `.dws_home` ↔ 一套 token |
| Token（macOS） | `{workspace}/.dws_home/Library/Application Support/dws-cli/` |
| Token（Windows） | `{workspace}/.dws_home/AppData/Roaming/dws-cli/`（主路径） |
| 配置/日志 | `{workspace}/.dws/` |

exec 前看 stderr：

```text
[dws-chat] agent=<id>
[dws-chat] workspace=...
[dws-chat] HOME=.../.dws_home
[dws-chat] DWS_CONFIG_DIR=.../.dws
[dws-chat] platform=windows APPDATA=.../.dws_home/AppData/Roaming   # 仅 Windows
```

## OpenClaw 沙盒（Docker）

容器内 `HOME=/workspace`，workspace 已 bind-mount：

- 在沙盒内安装 + 授权 → 凭证落在挂载目录 → per-agent 隔离
- **Windows 宿主机上的 OpenClaw** 多数为**非沙盒 exec**，在 PowerShell 装 `dws.exe` 即可，**不必** WSL/Docker

**禁止**让用户去宿主机 `~/.dws/bin` 或另一台机器授权（除非明确跨机部署）。
