docs: update SCHEMA.md / ERRORS.md / PLATFORMS.md / RUNTIME.md for v2
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -2,121 +2,143 @@
|
||||
|
||||
## 数据库路径
|
||||
|
||||
`{JIANGCHANG_DATA_ROOT}/{JIANGCHANG_USER_ID}/account-manager/account-manager.db`
|
||||
|
||||
路径解析细节见 [RUNTIME.md](RUNTIME.md)。
|
||||
`{JIANGCHANG_DATA_ROOT}/{JIANGCHANG_USER_ID}/account-manager/account-manager.db`
|
||||
(或宿主映射的 `CLAW_DATA_ROOT` / `CLAW_USER_ID`,解析细节见 [`RUNTIME.md`](RUNTIME.md)。)
|
||||
|
||||
## Schema 版本
|
||||
|
||||
`PRAGMA user_version = 2`
|
||||
- `PRAGMA user_version = 2`
|
||||
- `_schema_meta.schema_version = "2.1"`(字符串;迁移完成后取值)
|
||||
|
||||
## 1. platforms — 平台注册表
|
||||
启动时 `ensure_schema` 自动执行 `migrate_v1_to_v2` 与 `migrate_v2_to_v2_1`,幂等。
|
||||
|
||||
---
|
||||
|
||||
## 1. `platforms` — 平台注册表
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `platform_key` | TEXT PK | 平台唯一键(maersk / deepseek / sohu 等) |
|
||||
| `display_name` | TEXT NOT NULL | 展示名(Maersk / DeepSeek / 搜狐号) |
|
||||
| `domain` | TEXT NOT NULL | 业务域:logistics / llm / content / ecommerce / generic |
|
||||
| `provider_code` | TEXT | 供应商代码,物流 profile 可复用 |
|
||||
|---|---|---|
|
||||
| `platform_key` | TEXT PK | 平台唯一键(`maersk` / `deepseek` / `sohu` …) |
|
||||
| `display_name` | TEXT NOT NULL | 展示名 |
|
||||
| `domain` | TEXT NOT NULL | `logistics` / `llm` / `content` / `dev` / `sim` / …(以代码注册为准) |
|
||||
| `provider_code` | TEXT | 供应商代码 |
|
||||
| `default_url` | TEXT | 默认入口 URL |
|
||||
| `aliases_json` | TEXT | 别名 JSON 数组 |
|
||||
| `capabilities_json` | TEXT | 能力声明 JSON(`{"web":true,"api_key":true,"rpa":true}`) |
|
||||
| `enabled` | INTEGER | 是否启用(1=yes 0=no) |
|
||||
| `capabilities_json` | TEXT | `{"web": bool, "api_key": bool, "rpa": bool}` |
|
||||
| `enabled` | INTEGER | 是否启用(1/0) |
|
||||
| `default_auth_strategy` | TEXT | 新账号默认 `auth_strategy`;可由迁移回填 |
|
||||
| `created_at` | INTEGER | Unix 秒 UTC |
|
||||
| `updated_at` | INTEGER | Unix 秒 UTC |
|
||||
|
||||
**索引:** `idx_platforms_domain`, `idx_platforms_provider_code`
|
||||
**索引:** `idx_platforms_domain`,`idx_platforms_provider_code`
|
||||
|
||||
## 2. accounts — 账号身份
|
||||
---
|
||||
|
||||
## 2. `accounts` — 账号身份
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
|---|---|---|
|
||||
| `id` | INTEGER PK AUTO | 主键 |
|
||||
| `platform_key` | TEXT NOT NULL | 对应 platforms.platform_key |
|
||||
| `platform_key` | TEXT NOT NULL | 对应 `platforms.platform_key` |
|
||||
| `account_label` | TEXT NOT NULL | 人可读名称 |
|
||||
| `login_id` | TEXT | 登录标识(email/phone/username/customer_code),可空 |
|
||||
| `login_id_type` | TEXT | email / username / phone / customer_code / api_account / unknown |
|
||||
| `tenant_id` | TEXT | 租户/项目标识,可空 |
|
||||
| `environment` | TEXT | simulator / staging / production / test |
|
||||
| `role` | TEXT | booking / tracking / admin / sales / api / default |
|
||||
| `login_id` | TEXT | 登录标识(可空) |
|
||||
| `login_id_type` | TEXT | `email` / `username` / `phone` / … |
|
||||
| `tenant_id` | TEXT | 租户,可空 |
|
||||
| `environment` | TEXT | `simulator` / `staging` / `production` / … |
|
||||
| `role` | TEXT | `booking` / `tracking` / `api` / … |
|
||||
| `provider_code` | TEXT | 冗余供应商码 |
|
||||
| `profile_dir` | TEXT | Playwright 持久化浏览器 profile 目录 |
|
||||
| `url` | TEXT | 账号默认入口 URL |
|
||||
| `status` | TEXT | active / disabled / needs_review |
|
||||
| `session_status` | TEXT | unknown / likely_valid / needs_login / expired |
|
||||
| `last_used_at` | INTEGER | 最近 pick/使用时间 |
|
||||
| `last_login_check_at` | INTEGER | 最近登录检查时间 |
|
||||
| `last_error_code` | TEXT | 最近错误代码 |
|
||||
| `last_error_message` | TEXT | 最近错误消息 |
|
||||
| `extra_json` | TEXT | 扩展字段 JSON |
|
||||
| `profile_dir` | TEXT | Playwright profile 目录 |
|
||||
| `url` | TEXT | 账号入口 URL |
|
||||
| `status` | TEXT | `active` / `disabled` / … |
|
||||
| `session_status` | TEXT | `unknown` / `likely_valid` / … |
|
||||
| `last_used_at` | INTEGER | Unix 秒 |
|
||||
| `last_login_check_at` | INTEGER | Unix 秒 |
|
||||
| `last_error_code` | TEXT | 文本错误码 |
|
||||
| `last_error_message` | TEXT | 错误说明 |
|
||||
| `extra_json` | TEXT | 扩展 JSON(可含 `logged_in_url_pattern` / `logged_in_selector` 等 hook) |
|
||||
| `auth_strategy` | TEXT NOT NULL | 九种策略之一(见 [`PLATFORMS.md`](PLATFORMS.md) / `db/auth_strategy.py`) |
|
||||
| `session_persistent` | INTEGER NOT NULL DEFAULT 1 | `0`/`1` |
|
||||
| `device_fingerprint` | TEXT | 仅 `device_bound` |
|
||||
| `created_at` | INTEGER | Unix 秒 UTC |
|
||||
| `updated_at` | INTEGER | Unix 秒 UTC |
|
||||
|
||||
**索引:** `idx_accounts_platform`, `idx_accounts_pick_web`, `idx_accounts_provider`, `idx_accounts_status`
|
||||
**索引:** `idx_accounts_platform`,`idx_accounts_pick_web`,`idx_accounts_provider`,`idx_accounts_status`
|
||||
|
||||
**唯一约束说明:** `(platform_key, login_id, tenant_id, environment, role)` 通过应用层检查,因为 SQLite 允许多条 NULL login_id。
|
||||
---
|
||||
|
||||
## 3. credentials — 凭据(API Key / Token / Password)
|
||||
|
||||
**核心原则:SQLite 只保存元数据,不保存 secret 明文。**
|
||||
## 3. `credentials` — 凭据(API Key / Token / Password …)
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
|---|---|---|
|
||||
| `id` | INTEGER PK AUTO | 主键 |
|
||||
| `account_id` | INTEGER | 关联 accounts.id,可空(平台级 API Key) |
|
||||
| `platform_key` | TEXT NOT NULL | 平台唯一键 |
|
||||
| `credential_label` | TEXT NOT NULL | 人可读名称 |
|
||||
| `credential_type` | TEXT | api_key / password / bearer_token / oauth_client / refresh_token / browser_profile / note |
|
||||
| `secret_storage` | TEXT | none / env / windows_credential |
|
||||
| `secret_ref` | TEXT | env 时为环境变量名;windows_credential 时为 target name |
|
||||
| `secret_mask` | TEXT | 打码展示(sk-****abcd),不可反推 |
|
||||
| `expires_at` | INTEGER | 过期时间 |
|
||||
| `status` | TEXT | active / disabled / expired / needs_rotation |
|
||||
| `last_used_at` | INTEGER | 最近使用时间 |
|
||||
| `extra_json` | TEXT | 扩展字段 JSON |
|
||||
| `created_at` | INTEGER | Unix 秒 UTC |
|
||||
| `updated_at` | INTEGER | Unix 秒 UTC |
|
||||
| `account_id` | INTEGER | 关联 `accounts.id`,可空(历史平台级 Key) |
|
||||
| `platform_key` | TEXT NOT NULL | 平台键 |
|
||||
| `credential_label` | TEXT NOT NULL | 展示名称 |
|
||||
| `credential_type` | TEXT NOT NULL | `api_key` / `password` / … |
|
||||
| `secret_storage` | TEXT NOT NULL | `none` / `env` / `windows_credential` / `local_encrypted` |
|
||||
| `secret_ref` | TEXT | `env` 变量名 / `windows_credential` target;其它后端可为空 |
|
||||
| `secret_mask` | TEXT | 打码展示 |
|
||||
| `secret_ciphertext` | TEXT | `local_encrypted` 专用 Fernet token(v2.1 增加) |
|
||||
| `expires_at` | INTEGER | Unix 秒 |
|
||||
| `status` | TEXT | `active` / `disabled` / … |
|
||||
| `last_used_at` | INTEGER | Unix 秒 |
|
||||
| `extra_json` | TEXT | JSON |
|
||||
| `created_at` | INTEGER | Unix 秒 |
|
||||
| `updated_at` | INTEGER | Unix 秒 |
|
||||
|
||||
**索引:** `idx_credentials_platform_type`, `idx_credentials_account`, `idx_credentials_status`
|
||||
**原则**:不把 **明文** secret 写入 SQLite;`local_encrypted` 仅存 **密文**。外部后端(env / Windows CM)仍在运行时解析。
|
||||
|
||||
## 4. account_leases — RPA 并发锁
|
||||
**索引:** `idx_credentials_platform_type`,`idx_credentials_status`,**`idx_credentials_account`(`migrate_v1_to_v2` 中 `CREATE INDEX IF NOT EXISTS`)**
|
||||
|
||||
防止多个任务同时打开同一个 profile_dir。
|
||||
---
|
||||
|
||||
## 4. `account_leases` — RPA 并发锁
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
|---|---|---|
|
||||
| `id` | INTEGER PK AUTO | 主键 |
|
||||
| `account_id` | INTEGER NOT NULL | 关联 accounts.id |
|
||||
| `lease_token` | TEXT UNIQUE | 随机 token,用于 release/heartbeat |
|
||||
| `account_id` | INTEGER NOT NULL | `accounts.id` |
|
||||
| `lease_token` | TEXT UNIQUE | 随机 token |
|
||||
| `holder` | TEXT NOT NULL | 持有者标识 |
|
||||
| `purpose` | TEXT | 用途说明 |
|
||||
| `expires_at` | INTEGER NOT NULL | 过期时间 |
|
||||
| `heartbeat_at` | INTEGER | 最近心跳时间 |
|
||||
| `released_at` | INTEGER | 主动释放时间 |
|
||||
| `status` | TEXT | active / released / expired |
|
||||
| `created_at` | INTEGER | Unix 秒 UTC |
|
||||
| `updated_at` | INTEGER | Unix 秒 UTC |
|
||||
| `purpose` | TEXT | 用途 |
|
||||
| `expires_at` | INTEGER NOT NULL | Unix 秒 UTC |
|
||||
| `heartbeat_at` | INTEGER | Unix 秒 |
|
||||
| `released_at` | INTEGER | Unix 秒 |
|
||||
| `status` | TEXT | `active` / `released` / `expired` |
|
||||
| `created_at` | INTEGER | Unix 秒 |
|
||||
| `updated_at` | INTEGER | Unix 秒 |
|
||||
|
||||
**索引:** `idx_leases_account_status`, `idx_leases_token`, `idx_leases_expires`
|
||||
**索引:** `idx_leases_account_status`,`idx_leases_token`,`idx_leases_expires`
|
||||
|
||||
**约束:**
|
||||
- acquire 前先把过期 active lease 标记为 expired
|
||||
- 同一 account_id 同时只能有一个 active 未过期 lease
|
||||
- release 必须校验 lease_token
|
||||
---
|
||||
|
||||
## 5. `_schema_meta` — Schema 元数据
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|---|---|---|
|
||||
| `key` | TEXT PRIMARY KEY | 键名 |
|
||||
| `value` | TEXT NOT NULL | 值 |
|
||||
|
||||
**已知键**
|
||||
|
||||
- `schema_version` — 逻辑 schema 版本字符串:`migrate_v1_to_v2` 完成后写入 `"2"`,`migrate_v2_to_v2_1` 完成后更新为 **`"2.1"`**。
|
||||
|
||||
---
|
||||
|
||||
## Profile 文件布局
|
||||
|
||||
```
|
||||
{DATA_ROOT}/{USER_ID}/account-manager/
|
||||
├── account-manager.db
|
||||
├── master.key # 若执行过 init-master-key(也可用环境变量代替)
|
||||
└── profiles/
|
||||
└── {domain}/
|
||||
└── {platform_key}/
|
||||
└── {safe_label}[_{login_id_suffix}]/
|
||||
```
|
||||
|
||||
删除账号时实现会尽量同时删除对应目录。
|
||||
删除账号时实现会尽量同步删除对应目录。
|
||||
|
||||
## 与 JSON 输出的对应关系
|
||||
|
||||
`account get/list/pick-web` 和 `credential pick` 的 JSON 输出字段与上表一一对应。详见 [INTEGRATION.md](INTEGRATION.md) 与 `assets/schemas/`。
|
||||
CLI JSON 字段与上表对应;若有封装层(`_ok_json`),详见 [`CLI.md`](CLI.md) / [`INTEGRATION.md`](INTEGRATION.md)。
|
||||
|
||||
Reference in New Issue
Block a user