@itpay/cli 2.0.25 → 2.0.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/client/backend.js +17 -0
- package/dist/src/commands/checkout_handoff.js +12 -3
- package/dist/src/commands/guidance.js +1 -1
- package/dist/src/commands/install.js +1 -1
- package/dist/src/commands/pay.js +7 -5
- package/dist/src/commands/vault.js +95 -0
- package/dist/src/main.js +72 -0
- package/dist/src/state/config.js +2 -2
- package/docs/agent/buyer/payment-flow.json +1 -1
- package/docs/agent/buyer/render-hosts.json +4 -3
- package/docs/cli-reference/agent-types.md +5 -4
- package/docs/cli-reference/commands/buy.md +1 -1
- package/docs/cli-reference/commands/checkout.md +1 -1
- package/docs/cli-reference/commands/install.md +1 -1
- package/docs/cli-reference/commands/pay.md +1 -1
- package/docs/cli-reference/commands/services/checkout.md +2 -2
- package/docs/cli-reference/commands/vault/access.md +32 -0
- package/docs/cli-reference/commands/vault/index.md +11 -0
- package/docs/cli-reference/commands/vault/list.md +49 -0
- package/docs/cli-reference/commands/vault/read.md +27 -0
- package/docs/cli-reference/index.md +7 -0
- package/docs/skill-bundle-rollout/01-mcp-authentication.md +95 -217
- package/docs/skill-bundle-rollout/02-platform-bundle-repositories.md +140 -209
- package/docs/skill-bundle-rollout/03-platform-publishing.md +117 -227
- package/docs/skill-bundle-rollout/04-first-wave-platforms.md +58 -21
- package/docs/skill-bundle-rollout/05-sync-operations.md +62 -0
- package/docs/skill-bundle-rollout/README.md +120 -68
- package/package.json +1 -1
- package/skills/itpay/SKILL.md +17 -1
|
@@ -1,256 +1,134 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Local Device 与远程 MCP OAuth 边界
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
状态:current boundary;服务端实现以 `itpay-ai/compose` 为准。
|
|
4
|
+
最后核对:2026-08-10。
|
|
4
5
|
|
|
5
|
-
## 1.
|
|
6
|
+
## 1. 本文负责什么
|
|
6
7
|
|
|
7
|
-
|
|
8
|
+
本文只定义 CLI/平台包必须遵守的身份选择和凭据保管规则。
|
|
8
9
|
|
|
9
|
-
|
|
10
|
+
服务端 OAuth 协议、Connection、workload delegation、Buyer 和 Vault 数据
|
|
11
|
+
模型由 Compose 仓库的 V3 文档、Schema、OpenAPI 和代码负责。CLI 仓库不再
|
|
12
|
+
维护一份重复的 OAuth Server 实施计划。
|
|
10
13
|
|
|
11
|
-
|
|
12
|
-
- 私钥和 Device 状态存放在 `~/.itpay-v3/device`,owner-only 权限。
|
|
13
|
-
- 一个 production Device registration 下按 `agent_type` 建立 Agent Instance。
|
|
14
|
-
- CLI 通过 challenge 签名取得短期 Device session。
|
|
15
|
-
- 受保护请求使用 `Authorization: ItPayDevice ...` 加请求签名。
|
|
16
|
-
- session 失效只续期一次;已撤销的 v2 registration 不会静默替换。
|
|
14
|
+
## 2. Local Device Authority
|
|
17
15
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
### Buyer Bearer
|
|
21
|
-
|
|
22
|
-
`src/state/config.ts` 可以从 `ITPAY_BEARER_TOKEN` 读取账号 Bearer token,供 `orders` 等账号范围命令使用。它是外部注入能力,不是平台 OAuth 连接系统,不应直接扩展成把 token 写进 Skill bundle。
|
|
23
|
-
|
|
24
|
-
### 问题
|
|
25
|
-
|
|
26
|
-
云端 Chat 平台不能稳定访问用户电脑上的 `~/.itpay-v3`。即使 Skill 在沙箱里写出同名目录,那也是平台执行容器的临时身份,不是用户本机身份,也不能作为订阅、订单或支付权限的长期主键。
|
|
27
|
-
|
|
28
|
-
## 2. Target Behavior
|
|
29
|
-
|
|
30
|
-
新增远程 MCP OAuth 通道:
|
|
16
|
+
本地 CLI 使用:
|
|
31
17
|
|
|
32
18
|
```text
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
Platform -> token endpoint (code + PKCE)
|
|
36
|
-
<- access token + refresh token
|
|
37
|
-
Platform -> MCP tool + Bearer access token
|
|
38
|
-
MCP -> validate issuer/audience/scope/expiry
|
|
39
|
-
MCP -> principal.user_id
|
|
40
|
-
Backend -> account/entitlement/order authorization
|
|
19
|
+
~/.itpay-v3/device/device-private.pem
|
|
20
|
+
~/.itpay-v3/device/identity.json
|
|
41
21
|
```
|
|
42
22
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
- MCP 通过 ItPay 用户身份追踪收费、套餐、订单与权限。
|
|
46
|
-
- CLI 继续通过 Device Authority 追踪本地 Agent 设备和 Agent Instance。
|
|
47
|
-
- 用户可以显式把 Device 关联到同一 ItPay account,但关联不改变认证方式。
|
|
48
|
-
- 两套 token 具有不同 issuer/audience、Header scheme、存储位置和撤销域。
|
|
49
|
-
- 后端授权逻辑接收统一 principal,但不混淆 principal 类型。
|
|
50
|
-
|
|
51
|
-
不应该改变:
|
|
52
|
-
|
|
53
|
-
- 现有 CLI 私钥位置、Device 注册协议、签名格式和一次性 session 恢复规则。
|
|
54
|
-
- 默认 `https://app.itpay.ai`,且仅允许准确 `https://dev.itpay.ai` 测试 override 的官方 Backend 规则。
|
|
55
|
-
- Checkout 外部人类确认和服务端支付状态权威性。
|
|
56
|
-
|
|
57
|
-
## 3. Scope
|
|
58
|
-
|
|
59
|
-
### In scope
|
|
60
|
-
|
|
61
|
-
- ItPay OAuth Authorization Server 所需的 authorize、token、refresh、revoke 和 metadata。
|
|
62
|
-
- MCP resource server 的 Bearer token 验证。
|
|
63
|
-
- PKCE、state、精确 redirect URI、scope、audience、过期和撤销。
|
|
64
|
-
- OAuth subject 到现有 ItPay `user_id` 的映射。
|
|
65
|
-
- 平台 OAuth client/connection 记录。
|
|
66
|
-
- MCP 工具级 scope 与敏感写操作确认策略。
|
|
67
|
-
- CLI Device 与用户账号的可选显式关联。
|
|
68
|
-
- 审计日志、最小化返回、测试账号和平台审核所需演示凭据。
|
|
23
|
+
`src/state/device_authority.ts`:
|
|
69
24
|
|
|
70
|
-
|
|
25
|
+
- 生成/保存本地 Ed25519 私钥;
|
|
26
|
+
- 按 Backend base URL 保持独立 Device registration;
|
|
27
|
+
- 按显式 Agent Type 解析 exact Agent Instance;
|
|
28
|
+
- 用 challenge 签名取得短期 Device Session;
|
|
29
|
+
- 对受保护请求签名并防重放;
|
|
30
|
+
- 只对可恢复 session 执行一次续期和同请求重放;
|
|
31
|
+
- 不静默替换被吊销 Device。
|
|
71
32
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
- 让平台 Access Token 代替支付确认。
|
|
75
|
-
- 在聊天内容中采集支付卡、支付密码、验证码、钱包私钥。
|
|
76
|
-
- 为每个平台建立独立 ItPay 用户表。
|
|
33
|
+
这些文件表示本地工作负载,不表示网页登录 Token,也不能被复制进平台
|
|
34
|
+
bundle。
|
|
77
35
|
|
|
78
|
-
##
|
|
36
|
+
## 3. 远程 MCP OAuth
|
|
79
37
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
后端至少明确区分:
|
|
83
|
-
|
|
84
|
-
```ts
|
|
85
|
-
type Principal =
|
|
86
|
-
| { kind: "device"; deviceId: string; agentInstanceId: string; agentType: string }
|
|
87
|
-
| { kind: "user"; userId: string; oauthClientId: string; scopes: string[] };
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
不要求实际代码使用这个 TypeScript 类型,但授权层必须保留等价区分。禁止根据“有 Authorization Header”就把两者当成同一种账号。
|
|
91
|
-
|
|
92
|
-
### Header 与 audience
|
|
93
|
-
|
|
94
|
-
| 通道 | Header | audience | 用途 |
|
|
95
|
-
| --- | --- | --- | --- |
|
|
96
|
-
| CLI | `Authorization: ItPayDevice <session>` + 签名 Headers | Device API | 本地设备、Agent Instance、设备额度与执行 |
|
|
97
|
-
| MCP | `Authorization: Bearer <oauth_access_token>` | ItPay MCP resource | 用户账号、套餐、订单和 MCP 工具 |
|
|
98
|
-
|
|
99
|
-
Bearer token 不能被 CLI Device middleware 接受;Device session 不能被 MCP middleware 接受。鉴权失败返回 401,授权不足返回 403,不做静默降级。
|
|
100
|
-
|
|
101
|
-
### 服务端身份关系
|
|
102
|
-
|
|
103
|
-
建议关系而非第二套用户系统:
|
|
38
|
+
云端 MCP 客户端使用标准 OAuth Connection:
|
|
104
39
|
|
|
105
40
|
```text
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
status
|
|
114
|
-
|
|
115
|
-
oauth_grants
|
|
116
|
-
user_id -> itpay_users.id
|
|
117
|
-
client_id -> oauth_clients.client_id
|
|
118
|
-
scopes
|
|
119
|
-
revoked_at
|
|
120
|
-
|
|
121
|
-
agent_devices
|
|
122
|
-
optional_linked_user_id -> itpay_users.id
|
|
41
|
+
MCP client
|
|
42
|
+
-> Authorization Code + PKCE
|
|
43
|
+
-> ItPay login/consent
|
|
44
|
+
-> client stores Access/Refresh Token
|
|
45
|
+
-> ItPay MCP validates token
|
|
46
|
+
-> exact MCP Connection
|
|
47
|
+
-> Buyer-less workload delegation to Backend
|
|
123
48
|
```
|
|
124
49
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
## 5. Implementation Steps
|
|
128
|
-
|
|
129
|
-
### Step 1:冻结现有 CLI 认证合同
|
|
50
|
+
平台客户端负责 Token 持久化、刷新和断线重连。以下位置都不能保存或打印
|
|
51
|
+
OAuth Token:
|
|
130
52
|
|
|
131
|
-
|
|
53
|
+
- CLI;
|
|
54
|
+
- `~/.itpay-v3`;
|
|
55
|
+
- Skill / Plugin;
|
|
56
|
+
- `bundle.lock.json`;
|
|
57
|
+
- 模型提示、tool 参数或 tool 输出;
|
|
58
|
+
- Git 仓库;
|
|
59
|
+
- Backend 普通 API 日志。
|
|
132
60
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
- 确认 MCP 改动不会修改 `src/state/device_authority.ts` 的持久化 schema。
|
|
61
|
+
十分钟 Access Token 到期应由 Refresh Token 自动续期,不得让用户每十分钟
|
|
62
|
+
重新扫码。Vault 短期授权到期是独立事件,只重新请求 Vault 授权。
|
|
136
63
|
|
|
137
|
-
|
|
64
|
+
## 4. 两条线路不能混用
|
|
138
65
|
|
|
139
|
-
|
|
66
|
+
| 属性 | Local CLI | Remote MCP |
|
|
67
|
+
| --- | --- | --- |
|
|
68
|
+
| caller | Device + exact Agent Instance | exact MCP Connection |
|
|
69
|
+
| credential owner | 用户本机 CLI | MCP client/platform |
|
|
70
|
+
| Authorization | `ItPayDevice` + signed headers | OAuth Bearer at MCP resource |
|
|
71
|
+
| server hop | CLI -> Backend | Platform -> MCP -> delegated Backend |
|
|
72
|
+
| durable revoke | Device/Agent | Connection/Grant |
|
|
73
|
+
| Buyer relationship | explicit Device binding | OAuth Connection binding |
|
|
140
74
|
|
|
141
|
-
|
|
75
|
+
互斥规则:
|
|
142
76
|
|
|
143
|
-
-
|
|
144
|
-
-
|
|
145
|
-
-
|
|
146
|
-
-
|
|
77
|
+
- Backend Device middleware 不接受 MCP Bearer;
|
|
78
|
+
- MCP resource 不接受 Device Session;
|
|
79
|
+
- CLI 不读取 MCP Token;
|
|
80
|
+
- MCP 不读取 `~/.itpay-v3`;
|
|
81
|
+
- 撤销一个通道不删除另一个通道;
|
|
82
|
+
- 两个通道可指向同一 Buyer,但 Vault 临时授权按 exact audience 分开。
|
|
147
83
|
|
|
148
|
-
|
|
84
|
+
## 5. 平台路由
|
|
149
85
|
|
|
150
|
-
|
|
86
|
+
平台 Skill 在开始业务动作前选择线路:
|
|
151
87
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
- 密钥轮换保留合理验证窗口;日志不记录原始 token 或 authorization code。
|
|
159
|
-
|
|
160
|
-
完成条件:登录、刷新、过期、撤销、重放和错误 redirect URI 均有自动测试。
|
|
161
|
-
|
|
162
|
-
### Step 4:在 MCP 服务建立认证和工具授权
|
|
163
|
-
|
|
164
|
-
依赖:Step 3。
|
|
165
|
-
|
|
166
|
-
- MCP 入口只接受匹配 issuer、audience、签名、有效期和未撤销 grant 的 Bearer token。
|
|
167
|
-
- 每个工具声明并验证最小 scope。
|
|
168
|
-
- 只读工具与创建 Checkout、退款等写工具分开。
|
|
169
|
-
- 敏感写工具保留平台确认和 ItPay 服务端幂等键。
|
|
170
|
-
- 工具响应去掉 token、内部用户 ID、Device ID、调试 payload 和不必要个人数据。
|
|
171
|
-
|
|
172
|
-
建议第一版 scope:
|
|
173
|
-
|
|
174
|
-
| Scope | 能力 |
|
|
175
|
-
| --- | --- |
|
|
176
|
-
| `catalog:read` | 浏览公开目录 |
|
|
177
|
-
| `checkout:write` | 创建或恢复当前用户的 Checkout handoff |
|
|
178
|
-
| `orders:read` | 读取当前用户订单摘要 |
|
|
179
|
-
| `refunds:write` | 按既有退款政策发起退款请求 |
|
|
180
|
-
|
|
181
|
-
不要第一版就增加通配 scope。
|
|
182
|
-
|
|
183
|
-
完成条件:越权工具返回 403;不能通过参数替换其他用户 ID;写操作保持幂等。
|
|
184
|
-
|
|
185
|
-
### Step 5:关联账号而不合并凭据
|
|
186
|
-
|
|
187
|
-
依赖:Step 3、Step 4。
|
|
188
|
-
|
|
189
|
-
- MCP OAuth grant 直接绑定 ItPay `user_id`。
|
|
190
|
-
- 本地 Device 若需要账号能力,通过网页显式关联到同一 `user_id`。
|
|
191
|
-
- 关联只写服务端关系,不把 OAuth refresh token 写入 `~/.itpay-v3/device`,也不把 Device 私钥传到服务端或 MCP。
|
|
192
|
-
- 解除关联不删除 Device 身份;撤销 OAuth 不删除 Device registration。
|
|
193
|
-
|
|
194
|
-
完成条件:分别撤销任一通道不会破坏另一通道;同一用户的订单权限由服务端政策决定。
|
|
195
|
-
|
|
196
|
-
### Step 6:平台审核材料与运维
|
|
197
|
-
|
|
198
|
-
依赖:Step 4。
|
|
199
|
-
|
|
200
|
-
- 建立无 MFA、无短信/邮件确认、无内网依赖的审核测试账号,仅含固定测试数据和限额。
|
|
201
|
-
- 准备 privacy policy、terms、support、数据删除和撤销说明。
|
|
202
|
-
- 记录 client、user、tool、scope、结果和 request ID;不记录 secret。
|
|
203
|
-
- 对 token 签发、失败登录、撤销、敏感工具建立告警。
|
|
204
|
-
|
|
205
|
-
完成条件:审核者可以独立完成正向和负向测试;运营可以按 user/client 撤销连接。
|
|
206
|
-
|
|
207
|
-
## 6. API / Data / Type Changes
|
|
208
|
-
|
|
209
|
-
预计涉及,具体路由名在服务端仓库调研后确定:
|
|
210
|
-
|
|
211
|
-
- OAuth metadata、authorize、token、revoke 端点。
|
|
212
|
-
- MCP protected resource metadata。
|
|
213
|
-
- OAuth client、grant、refresh-token family、consent/audit 数据。
|
|
214
|
-
- 统一但保留 `device`/`user` 区分的 principal 类型。
|
|
215
|
-
- MCP tool scope 和平台 action annotation。
|
|
216
|
-
|
|
217
|
-
CLI 公共命令和 `~/.itpay-v3/device` schema:无计划变更。
|
|
88
|
+
```text
|
|
89
|
+
persistent local shell and bundled CLI and no explicit MCP -> CLI
|
|
90
|
+
pure cloud -> MCP
|
|
91
|
+
explicit MCP request -> MCP
|
|
92
|
+
explicit CLI request -> CLI
|
|
93
|
+
```
|
|
218
94
|
|
|
219
|
-
|
|
95
|
+
同一任务不能:
|
|
220
96
|
|
|
221
|
-
|
|
97
|
+
- 同时调用两条线路;
|
|
98
|
+
- 在失败后静默 fallback;
|
|
99
|
+
- 用 email、昵称、Agent Type 或平台名推断 Buyer;
|
|
100
|
+
- 用 Device/MCP 重连重置免费额度或资源归属。
|
|
222
101
|
|
|
223
|
-
|
|
224
|
-
- issuer/audience/scope/expiry/signature/revocation。
|
|
225
|
-
- refresh rotation 和旧 token 重放。
|
|
226
|
-
- Device/Bearer scheme 互相拒绝。
|
|
102
|
+
## 6. 跨平台 Buyer Vault 读取
|
|
227
103
|
|
|
228
|
-
|
|
104
|
+
Local Device 与 MCP Connection 可以读取同一 Buyer Vault,但必须分别完成:
|
|
229
105
|
|
|
230
|
-
|
|
231
|
-
-
|
|
232
|
-
|
|
233
|
-
- Device 撤销后 MCP grant 仍按自身状态工作;反向亦然。
|
|
234
|
-
- 订单、Checkout、退款的跨用户越权测试。
|
|
106
|
+
1. durable caller authentication;
|
|
107
|
+
2. exact-audience temporary Vault window;
|
|
108
|
+
3. 对需要首次揭示的工件完成 artifact-specific consent。
|
|
235
109
|
|
|
236
|
-
|
|
110
|
+
CLI/MCP 连接不等于持续读取授权,OAuth 登录也不等于首次揭示或退款授权。
|
|
237
111
|
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
- 本地 CLI 同时运行并完成 `readyz`、目录、Checkout 恢复。
|
|
112
|
+
最终产品、API、Schema 和测试合同由 Compose 文档
|
|
113
|
+
`V3_CROSS_PLATFORM_BUYER_VAULT_READ_IMPLEMENTATION_PLAN.md` 负责。
|
|
241
114
|
|
|
242
|
-
##
|
|
115
|
+
## 7. 平台不兼容时
|
|
243
116
|
|
|
244
|
-
|
|
245
|
-
- 各平台对动态 client registration、redirect URI 和 token metadata 的细节可能不同;以平台实际连接测试为准。
|
|
246
|
-
- OpenAI 对金融交易和 PCI 数据有额外限制。MCP 只编排外部 Checkout,不把 OAuth 登录等同于付款授权。
|
|
247
|
-
- `ITPAY_BEARER_TOKEN` 的长期定位需要服务端确认;第一版不删除、不重命名,也不让 MCP 依赖该环境变量。
|
|
117
|
+
如果平台不能安全完成标准 OAuth 或保存/刷新 Token:
|
|
248
118
|
|
|
249
|
-
|
|
119
|
+
- 有本地 Shell 时使用 bundled CLI;
|
|
120
|
+
- 没有本地 Shell 时标记 MCP 不支持;
|
|
121
|
+
- 不接受静态 personal bearer;
|
|
122
|
+
- 不要求用户在聊天中粘贴 Token;
|
|
123
|
+
- 不把 Token做成普通 Skill setting。
|
|
250
124
|
|
|
251
|
-
|
|
125
|
+
## 8. 验证门禁
|
|
252
126
|
|
|
253
|
-
-
|
|
254
|
-
-
|
|
255
|
-
-
|
|
256
|
-
-
|
|
127
|
+
- CLI 升级前后 Device ID 和私钥 hash 不变;
|
|
128
|
+
- MCP 连接/刷新/撤销不修改 Local Device 文件;
|
|
129
|
+
- Device 与 MCP auth scheme 互相拒绝;
|
|
130
|
+
- 两个 Connection 与两个 Agent Instance 的 Vault audience 相互隔离;
|
|
131
|
+
- Access Token 刷新无需用户或模型参与;
|
|
132
|
+
- Vault window 到期不会销毁 OAuth/Device durable identity;
|
|
133
|
+
- 日志、bundle、tool output 和 repo secret scan 无凭据;
|
|
134
|
+
- 平台失败时没有静默线路切换。
|