@deployxai/dxc 0.1.0
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/README.md +131 -0
- package/dist/chunks/chunk-I6VZLNRZ.js +2118 -0
- package/dist/chunks/chunk-XIHX5YAF.js +16391 -0
- package/dist/chunks/knowledge-Q6MHPG6I.js +1248 -0
- package/dist/chunks/monitor-VPRVRQIS.js +694 -0
- package/dist/index.js +32367 -0
- package/docs/00-project-context.md +125 -0
- package/docs/01-north-star-architecture.md +234 -0
- package/docs/02-mvp-technical-design.md +553 -0
- package/docs/03-domain-state-api.md +599 -0
- package/docs/04-security-and-operations.md +413 -0
- package/docs/05-delivery-plan.md +407 -0
- package/docs/README.md +44 -0
- package/docs/decisions/0001-initial-architecture.md +57 -0
- package/docs/decisions/0002-mongodb-environment-boundary.md +42 -0
- package/docs/decisions/0003-staged-production-topology.md +33 -0
- package/docs/decisions/0004-local-first-agent-research-runtime.md +71 -0
- package/docs/decisions/0005-official-skill-orchestration-and-local-content-memory.md +97 -0
- package/docs/decisions/0006-separate-wechat-user-login-from-account-authorization.md +87 -0
- package/docs/decisions/0007-explicit-personal-wechat-start.md +67 -0
- package/docs/decisions/0008-end-to-end-content-workflow-continuity.md +115 -0
- package/docs/decisions/0009-privileged-multitenant-draft-scheduling.md +36 -0
- package/docs/decisions/0009-versioned-cloud-template-catalog.md +39 -0
- package/docs/eight-stage-implementation-audit.md +62 -0
- package/docs/first-user-guide.md +187 -0
- package/docs/history/content-forge-prd-v0.2-summary.md +81 -0
- package/docs/local-development.md +511 -0
- package/docs/references/aliyun-oss-production-setup.md +89 -0
- package/docs/references/legacy-content-to-wechat-contract.md +223 -0
- package/docs/references/renderer-compatibility-report.md +68 -0
- package/docs/references/source-inventory.md +179 -0
- package/docs/references/wechat-renderer-platform-validation.md +92 -0
- package/docs/references/wechat-third-party-platform-setup.md +159 -0
- package/docs/references/wechat-website-login-setup.md +137 -0
- package/docs/references/wemd-template-attribution.md +25 -0
- package/docs/research-monitoring-design.md +235 -0
- package/docs/todo-preview-local-first.md +31 -0
- package/docs/workbuddy-first-user-runbook.md +246 -0
- package/docs//345/221/230/345/267/245BCDE/347/232/204skill/employee-b-research-analyst/SKILL.md +230 -0
- package/docs//345/221/230/345/267/245BCDE/347/232/204skill/employee-c-outline-architect/SKILL.md +194 -0
- package/docs//345/221/230/345/267/245BCDE/347/232/204skill/employee-d-content-writer/SKILL.md +296 -0
- package/docs//345/221/230/345/267/245BCDE/347/232/204skill/employee-e-visual-designer/SKILL.md +268 -0
- package/package.json +25 -0
- package/skills/dxc-article-outline/SKILL.md +82 -0
- package/skills/dxc-article-outline/agents/openai.yaml +6 -0
- package/skills/dxc-article-outline/references/outline-methods.md +38 -0
- package/skills/dxc-article-write/SKILL.md +85 -0
- package/skills/dxc-article-write/agents/openai.yaml +6 -0
- package/skills/dxc-article-write/references/writing-methods.md +42 -0
- package/skills/dxc-content-brief/SKILL.md +81 -0
- package/skills/dxc-content-brief/agents/openai.yaml +6 -0
- package/skills/dxc-content-brief/references/brief-method.md +34 -0
- package/skills/dxc-content-review/SKILL.md +84 -0
- package/skills/dxc-content-review/agents/openai.yaml +6 -0
- package/skills/dxc-content-review/references/review-checklist.md +35 -0
- package/skills/dxc-content-workflow/SKILL.md +190 -0
- package/skills/dxc-content-workflow/agents/openai.yaml +6 -0
- package/skills/dxc-content-workflow/references/catalog.json +136 -0
- package/skills/dxc-content-workflow/references/onboarding-questions.md +107 -0
- package/skills/dxc-content-workflow/references/stage-contract.md +70 -0
- package/skills/dxc-research/SKILL.md +110 -0
- package/skills/dxc-research/agents/openai.yaml +6 -0
- package/skills/dxc-research/references/research-method.md +53 -0
- package/skills/dxc-title-write/SKILL.md +112 -0
- package/skills/dxc-title-write/agents/openai.yaml +6 -0
- package/skills/dxc-title-write/references/title-methods.md +26 -0
- package/skills/dxc-visual-plan/SKILL.md +119 -0
- package/skills/dxc-visual-plan/agents/openai.yaml +6 -0
- package/skills/dxc-visual-plan/references/visual-methods.md +35 -0
- package/skills/dxc-wechat-publisher/SKILL.md +157 -0
- package/skills/dxc-wechat-publisher/agents/openai.yaml +6 -0
|
@@ -0,0 +1,599 @@
|
|
|
1
|
+
# 领域模型、状态机与接口
|
|
2
|
+
|
|
3
|
+
更新日期:2026-07-30
|
|
4
|
+
|
|
5
|
+
## 1. 领域对象
|
|
6
|
+
|
|
7
|
+
### 1.1 身份与租户
|
|
8
|
+
|
|
9
|
+
| 对象 | 关键字段 | 说明 |
|
|
10
|
+
|---|---|---|
|
|
11
|
+
| `Tenant` | `id`, `name`, `status`, `createdAt` | DxC 内容空间 |
|
|
12
|
+
| `User` | `id`, `tenantId`, `role`, `status` | 为后续团队协作保留;MVP 可只有 owner |
|
|
13
|
+
| `ExternalIdentity` | `provider`, `subjectHash`, `unionIdHash`, `userId` | 独立网站应用个人微信等身份映射;不保存原始 openid/unionid |
|
|
14
|
+
| `DeviceBindingSession` | `challengeHash`, `publicKeyFingerprint`, `status`, `expiresAt` | 首次扫码前的短时设备持钥证明 |
|
|
15
|
+
| `DeviceIdentity` | `tenantId`, `publicKey`, `status`, `lastSeenAt` | CLI 设备身份,不保存设备私钥 |
|
|
16
|
+
| `DeviceSession` | `deviceId`, `tokenHash`, `refreshTokenHash`, `expiresAt`, `refreshExpiresAt`, `revokedAt` | 24 小时访问会话和 30 天可轮换刷新凭据 |
|
|
17
|
+
|
|
18
|
+
### 1.2 微信
|
|
19
|
+
|
|
20
|
+
| 对象 | 关键字段 | 说明 |
|
|
21
|
+
|---|---|---|
|
|
22
|
+
| `WechatAuthorizationSession` | `stateHash`, `deviceId`, `status`, `expiresAt` | 扫码授权的短时关联 |
|
|
23
|
+
| `WechatLoginSession` | `purpose`, `stateHash`, `pollTokenHash`, `subjectHash`, `status` | `start`/`link`/`login` 个人微信状态;与公众号授权分离 |
|
|
24
|
+
| `WechatAuthorization` | `tenantId`, `authorizerAppId`, `permissionSet`, `status` | 授权关系 |
|
|
25
|
+
| `WechatCredentialEnvelope` | `ciphertext`, `iv`, `tag`, `keyVersion` | 加密的 refresh/access token |
|
|
26
|
+
| `WechatAccount` | `tenantId`, `authorizerAppId`, `displayName`, `accountType` | 给用户选择的公众号信息 |
|
|
27
|
+
| `ComponentTicket` | `ciphertext`, `receivedAt`, `expiresAt` | 平台级票据,非租户字段 |
|
|
28
|
+
|
|
29
|
+
`WechatAuthorization` 和 `WechatAccount` 分开:授权关系可以撤销/重建,账号展示信息可以刷新并保留历史。
|
|
30
|
+
|
|
31
|
+
### 1.3 内容与交付
|
|
32
|
+
|
|
33
|
+
| 对象 | 关键字段 | 说明 |
|
|
34
|
+
|---|---|---|
|
|
35
|
+
| `ArticleSource` | `tenantId`, `title`, `sourceHash`, `coverHash`, `assetManifestHash`, `inlineAssets[]` | 用户上传的正文、封面和正文图片版本 |
|
|
36
|
+
| `Asset` | `tenantId`, `sha256`, `kind`, `objectKey`, `mediaType`, `size` | 原始正文图片或封面 |
|
|
37
|
+
| `RenderSnapshot` | `articleSourceId`, `templateId`, `rendererVersion`, `htmlHash`, `inlineAssets[]` | 绑定完整素材清单的不可变渲染结果 |
|
|
38
|
+
| `PreflightResult` | `errors[]`, `warnings[]`, `metrics` | 结构化检查结果 |
|
|
39
|
+
| `Approval` | `snapshotId`, `targetAccountId`, `approvedBy`, `approvedAt` | 用户对快照和账号的确认 |
|
|
40
|
+
| `DraftIntent` | `approvalId`, `idempotencyKey`, `entitlementReservationId` | 一次创建草稿意图 |
|
|
41
|
+
| `DraftDelivery` | `intentId`, `status`, `wechatMediaId`, `verification` | 微信副作用和回读结果 |
|
|
42
|
+
| `Job` | `kind`, `resourceId`, `status`, `lease`, `attempt` | Mongo 异步任务 |
|
|
43
|
+
| `AuditEvent` | `tenantId`, `actor`, `action`, `resource`, `metadata` | 追加式审计 |
|
|
44
|
+
|
|
45
|
+
固定真实联调继续使用 `WechatDraftSmokeIntent`。正式首位用户路径已经使用
|
|
46
|
+
`ArticleSource`、`RenderSnapshot`、`Approval` 和 `DraftIntent`;Worker 的特权调度仓储
|
|
47
|
+
跨租户原子领取和有界恢复意图,领取后所有业务资源查询与状态转移仍显式包含任务自带的
|
|
48
|
+
`tenantId`。独立的通用 `DraftDelivery` 和带 lease(租约)/heartbeat(心跳)的 `Job`
|
|
49
|
+
仍未拆出。
|
|
50
|
+
|
|
51
|
+
### 1.4 计费
|
|
52
|
+
|
|
53
|
+
| 对象 | 关键字段 | 说明 |
|
|
54
|
+
|---|---|---|
|
|
55
|
+
| `Offering` | `code`, `durationDays`, `creditCount`, `status` | 单次/月卡/年卡商品 |
|
|
56
|
+
| `PaymentOrder` | `tenantId`, `offeringCode`, `channel`, `outTradeNo`, `status` | 微信支付/SkillPay 订单 |
|
|
57
|
+
| `PaymentEvent` | `orderId`, `sourceEventId`, `verifiedPayloadDigest` | 幂等支付事件 |
|
|
58
|
+
| `Entitlement` | `tenantId`, `kind`, `validFrom`, `validUntil`, `status` | 固定期限权益 |
|
|
59
|
+
| `CreditWallet` | `tenantId`, `granted`, `reserved`, `consumed` | 单次额度,单文档原子更新 |
|
|
60
|
+
| `CreditReservation` | `walletId`, `intentId`, `status` | 预留、消费、释放、冻结 |
|
|
61
|
+
| `UsageLedger` | `tenantId`, `eventType`, `referenceId`, `delta` | 不可变用量流水 |
|
|
62
|
+
|
|
63
|
+
### 1.5 本地内容工作流
|
|
64
|
+
|
|
65
|
+
以下对象只存在于用户设备,不进入 Mongo:
|
|
66
|
+
|
|
67
|
+
| 对象 | 关键字段 | 说明 |
|
|
68
|
+
|---|---|---|
|
|
69
|
+
| `ContentProfile` | `questionnaireVersion`, `answers[]`, `profileId`, `updatedAt` | `~/.dxc/content-profile.json` 中的版本化创作偏好 |
|
|
70
|
+
| `ContentProjectManifest` | `workflowId`, `projectId`, `artifacts`, `checkpointsDirectory` | 项目根目录 `dxc.project.json` |
|
|
71
|
+
| `ContentProjectIndex` | `projectId`, `title`, `directory`, `updatedAt` | `~/.dxc/content-projects.json` 中的轻量恢复索引;不含文章正文 |
|
|
72
|
+
| `StepCheckpoint` | `stage`, `status`, `inputs`, `outputs`, `waitingFor`, `confirmationBinding`, `execution` | 八个步骤统一使用的 v3 本地阶段 contract |
|
|
73
|
+
| `StageArtifact` | `dxc.contract`, `workflowId`, `projectId`, `stage`, `skill`, `createdAt`, `artifactStatus`, `inputs[]` | 用户可读 Markdown 产物中的 `dxc-content-stage@1` 轻量元数据 |
|
|
74
|
+
| `KnowledgeArticle` | `articleId`, `sourceLabel`, `contentSha256`, `chunkCount` | 显式导入的历史文章元数据 |
|
|
75
|
+
| `KnowledgeChunk` | `chunkId`, `articleId`, `heading`, `body`, `chunkSha256`, `embedding` | 有界分段、FTS5 和本地向量真值 |
|
|
76
|
+
| `KnowledgeHit` | `articleId`, `chunkId`, `snippet`, `lanes`, `rank` | 交给内容 Skill 的可追溯候选片段;不暴露会被误当置信度的模型分数 |
|
|
77
|
+
|
|
78
|
+
`StepCheckpoint.status` 为 `running | awaiting-user | completed | failed | skipped`。v3
|
|
79
|
+
contract 记录实际输入和输出的路径、大小与 SHA-256,并用 `metadata.summary` 和
|
|
80
|
+
`waitingFor` 支持跨会话恢复。`confirmationBinding` 对真实确认结构化保存 `status`、
|
|
81
|
+
`snapshotType`、`snapshotHash`、`requestedAt`、`confirmedAt` 和 `confirmedBy`;
|
|
82
|
+
`awaiting-user` 和 `completed` 必须绑定非空输出。输出或输入缺失、变空或哈希改变时,
|
|
83
|
+
读取结果为 `stale`,不能直接推进后续步骤。普通内部步骤完成不要求人工确认;真实用户
|
|
84
|
+
决策缺少 `--confirm` 时保持 `awaiting-user` 并返回 guidance(引导),不会只抛出异常。
|
|
85
|
+
完成确认时必须存在同类型、同哈希的上一条 pending(待确认)绑定;正文使用稳定的
|
|
86
|
+
用户可见内容哈希,标题使用候选与最终选择的内容哈希,交付使用经过产物校验的
|
|
87
|
+
`renderSnapshot.snapshotHash`。内容或已选标题变化后必须重新进入 `awaiting-user`。
|
|
88
|
+
每个检查点同时记录 `executionLocation` 和 `dataTransit`,避免把 Agent 调用自动宣称为
|
|
89
|
+
本机执行。v1/v2 只读兼容,下一次写入升级为 v3。
|
|
90
|
+
|
|
91
|
+
`StageArtifact` 不替代 checkpoint,也不引入第二套复杂状态机。它让用户和新会话直接
|
|
92
|
+
打开 Markdown 就能知道产物由哪个阶段生成、读取了哪些上游哈希。CLI 在接受
|
|
93
|
+
`awaiting-user` 或 `completed` 前会解析其 frontmatter,核对固定 Skill 版本、项目、
|
|
94
|
+
工作流、实际输入和阶段特有字段;视觉产物还要通过真实文件、格式、体积和哈希校验。
|
|
95
|
+
checkpoint 仍是定位下一阶段、判断 stale 和恢复 `waitingFor` 的机器真值。
|
|
96
|
+
|
|
97
|
+
## 2. Mongo 集合和核心索引
|
|
98
|
+
|
|
99
|
+
建议集合:
|
|
100
|
+
|
|
101
|
+
```text
|
|
102
|
+
tenants
|
|
103
|
+
users
|
|
104
|
+
external_identities
|
|
105
|
+
device_binding_sessions
|
|
106
|
+
device_identities
|
|
107
|
+
device_sessions
|
|
108
|
+
wechat_login_sessions
|
|
109
|
+
wechat_login_identities
|
|
110
|
+
wechat_authorization_sessions
|
|
111
|
+
wechat_authorizations
|
|
112
|
+
wechat_accounts
|
|
113
|
+
component_tickets
|
|
114
|
+
articles
|
|
115
|
+
assets
|
|
116
|
+
render_snapshots
|
|
117
|
+
approvals
|
|
118
|
+
draft_intents
|
|
119
|
+
draft_deliveries
|
|
120
|
+
jobs
|
|
121
|
+
offerings
|
|
122
|
+
payment_orders
|
|
123
|
+
payment_events
|
|
124
|
+
entitlements
|
|
125
|
+
credit_wallets
|
|
126
|
+
credit_reservations
|
|
127
|
+
usage_ledger
|
|
128
|
+
audit_events
|
|
129
|
+
wechat_draft_smoke_intents
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
必须建立的唯一/查询索引:
|
|
133
|
+
|
|
134
|
+
- `wechat_login_identities(subjectHash)` unique;
|
|
135
|
+
- `wechat_login_identities(unionIdHash)` partial unique;
|
|
136
|
+
- `wechat_login_identities(tenantId, userId)` unique;
|
|
137
|
+
- `wechat_login_sessions(stateHash)` 和 `(pollTokenHash)` unique,`cleanupAt` TTL;
|
|
138
|
+
- `device_identities(publicKeyFingerprint)` 和 `(tenantId, installationId)` unique;`(tenantId, status)` 只做查询,不限制同租户多设备;
|
|
139
|
+
- `device_sessions(tokenHash)` unique,`refreshTokenHash` partial unique,`cleanupAt` TTL;
|
|
140
|
+
- `wechat_authorizations(authorizerAppId, status=active)` partial unique;
|
|
141
|
+
- `assets(tenantId, sha256, kind)` unique;
|
|
142
|
+
- `articles(tenantId, sourceHash, coverHash, assetManifestHash)` unique;
|
|
143
|
+
- `render_snapshots(tenantId, sourceHash, assetManifestHash, templateId, rendererVersion)` unique;
|
|
144
|
+
- `approvals(tenantId, snapshotId, targetAccountId, approvedAt)`;
|
|
145
|
+
- `draft_intents(tenantId, idempotencyKey)` unique;
|
|
146
|
+
- `draft_deliveries(tenantId, intentId)` unique;
|
|
147
|
+
- `payment_orders(outTradeNo)` unique;
|
|
148
|
+
- `payment_events(sourceEventId)` unique;
|
|
149
|
+
- `credit_reservations(tenantId, intentId)` unique;
|
|
150
|
+
- `jobs(status, nextRunAt, leaseExpiresAt)`;
|
|
151
|
+
- `wechat_draft_smoke_intents(tenantId, idempotencyKeyHash)` unique;
|
|
152
|
+
- `wechat_draft_smoke_intents(status, createdAt)`,供特权调度仓储跨租户原子领取固定测试意图;
|
|
153
|
+
- `wechat_draft_smoke_intents(status, updatedAt)`,供特权调度仓储按固定批次恢复中断意图;
|
|
154
|
+
- 领取后的授权、快照、素材、状态转移与审计查询仍显式包含任务自带的 `tenantId`;
|
|
155
|
+
- 短时会话、预览和过期诊断对象使用 TTL 索引。
|
|
156
|
+
|
|
157
|
+
所有面向租户的仓储方法必须接收 `TenantContext`,不允许调用者传一个可选 `tenantId`。
|
|
158
|
+
|
|
159
|
+
## 3. 状态机
|
|
160
|
+
|
|
161
|
+
### 3.1 微信授权会话
|
|
162
|
+
|
|
163
|
+
```mermaid
|
|
164
|
+
stateDiagram-v2
|
|
165
|
+
[*] --> CREATED
|
|
166
|
+
CREATED --> URL_READY
|
|
167
|
+
URL_READY --> EXCHANGING: 原子认领授权码
|
|
168
|
+
EXCHANGING --> AUTHORIZED: 加密授权结果已持久化
|
|
169
|
+
AUTHORIZED --> BOUND: 账号与租户绑定完成
|
|
170
|
+
CREATED --> EXPIRED
|
|
171
|
+
URL_READY --> EXPIRED
|
|
172
|
+
URL_READY --> CANCELLED
|
|
173
|
+
URL_READY --> FAILED
|
|
174
|
+
EXCHANGING --> FAILED: 明确失败或不确定结果到期
|
|
175
|
+
AUTHORIZED --> FAILED
|
|
176
|
+
BOUND --> [*]
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
`EXCHANGING` 是外部授权码消费的不可逆边界。只有成功持久化加密 access/refresh token、账号投影目标和租户目标后,才能进入 `AUTHORIZED`;此后的身份、账号和授权投影均从该检查点幂等恢复。若进程在微信返回后、检查点写入前中断,回调重放不得再次调用 `api_query_auth`,会话到期后进入 `FAILED` 并要求重新扫码。
|
|
180
|
+
|
|
181
|
+
授权入口固定为 15 分钟。设备绑定在授权会话创建时延长到同一绝对截止时间,避免设备挑战的初始 10 分钟窗口提前截断扫码。成功交换授权码后,绑定与 `AUTHORIZED` 会话进入最长 24 小时的投影恢复窗口;写入顺序为“先延长匹配的绑定会话,再写 `AUTHORIZED` 检查点”。恢复窗口不是新的授权入口,过期后必须进入 `FAILED`,不得再创建身份、账号或设备会话。
|
|
182
|
+
|
|
183
|
+
账号授权关系:
|
|
184
|
+
|
|
185
|
+
```text
|
|
186
|
+
ACTIVE → REFRESH_DEGRADED → ACTIVE
|
|
187
|
+
ACTIVE → REVOKED
|
|
188
|
+
ACTIVE → PERMISSION_CHANGED
|
|
189
|
+
PERMISSION_CHANGED → ACTIVE | REVOKED
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
`REFRESH_DEGRADED` 表示当前 access token 可能仍可用但刷新失败;它不是立即删除授权的理由。`REVOKED` 禁止创建新任务。
|
|
193
|
+
|
|
194
|
+
### 3.2 个人微信登录会话
|
|
195
|
+
|
|
196
|
+
```text
|
|
197
|
+
URL_READY → EXCHANGING → IDENTIFIED → SUCCEEDED
|
|
198
|
+
└──────────────→ FAILED
|
|
199
|
+
└──────────────→ EXPIRED
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
`purpose=link` 必须绑定当前有效设备会话;`purpose=login|start` 必须绑定尚未完成的设备
|
|
203
|
+
持钥证明。`login` 只查找已有映射,没有映射时进入
|
|
204
|
+
`FAILED/WECHAT_LOGIN_IDENTITY_NOT_LINKED`;用户显式触发的 `start` 才可为未关联身份创建
|
|
205
|
+
owner,并用确定性候选 UUID + Mongo 原子 bootstrap 收敛并发请求。`EXCHANGING` 表示
|
|
206
|
+
网站 OAuth code 已被原子认领;微信返回的 OAuth access/refresh token 只在内存中用于
|
|
207
|
+
解析身份,随后立即丢弃。`IDENTIFIED` 只保存作用域化 SHA-256 身份摘要,是防止 code
|
|
208
|
+
重放的恢复检查点。
|
|
209
|
+
|
|
210
|
+
### 3.3 渲染与确认
|
|
211
|
+
|
|
212
|
+
```text
|
|
213
|
+
UPLOADED
|
|
214
|
+
→ RENDERING
|
|
215
|
+
→ PREFLIGHT_FAILED
|
|
216
|
+
→ READY_FOR_PREVIEW
|
|
217
|
+
→ APPROVED
|
|
218
|
+
→ STALE
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
允许转换:
|
|
222
|
+
|
|
223
|
+
- `PREFLIGHT_FAILED → RENDERING`:用户修复或渲染器重试;
|
|
224
|
+
- `READY_FOR_PREVIEW → APPROVED`:用户确认;
|
|
225
|
+
- `READY_FOR_PREVIEW/APPROVED → STALE`:源内容、素材、模板或渲染器发生变化;
|
|
226
|
+
- `STALE` 不能创建草稿,必须产生新快照。
|
|
227
|
+
|
|
228
|
+
### 3.4 草稿交付
|
|
229
|
+
|
|
230
|
+
```mermaid
|
|
231
|
+
stateDiagram-v2
|
|
232
|
+
[*] --> INTENT_CREATED
|
|
233
|
+
INTENT_CREATED --> ENTITLEMENT_REQUIRED
|
|
234
|
+
ENTITLEMENT_REQUIRED --> INTENT_CREATED: 权益已授予
|
|
235
|
+
INTENT_CREATED --> QUEUED: 权益预留成功
|
|
236
|
+
QUEUED --> PREPARING
|
|
237
|
+
PREPARING --> UPLOADING_ASSETS
|
|
238
|
+
UPLOADING_ASSETS --> CREATING_DRAFT
|
|
239
|
+
CREATING_DRAFT --> VERIFYING
|
|
240
|
+
CREATING_DRAFT --> FAILED: 已验签响应明确拒绝
|
|
241
|
+
CREATING_DRAFT --> CREATED_UNVERIFIED: 请求结果不确定
|
|
242
|
+
VERIFYING --> SUCCEEDED
|
|
243
|
+
VERIFYING --> CREATED_UNVERIFIED: 回读暂时失败
|
|
244
|
+
CREATED_UNVERIFIED --> VERIFYING: 核验任务
|
|
245
|
+
CREATED_UNVERIFIED --> NEEDS_MANUAL_REVIEW
|
|
246
|
+
PREPARING --> RETRY_WAIT
|
|
247
|
+
UPLOADING_ASSETS --> RETRY_WAIT
|
|
248
|
+
RETRY_WAIT --> QUEUED
|
|
249
|
+
PREPARING --> FAILED
|
|
250
|
+
UPLOADING_ASSETS --> FAILED
|
|
251
|
+
VERIFYING --> FAILED
|
|
252
|
+
FAILED --> [*]
|
|
253
|
+
SUCCEEDED --> [*]
|
|
254
|
+
NEEDS_MANUAL_REVIEW --> [*]
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
关键规则:
|
|
258
|
+
|
|
259
|
+
- 进入 `CREATING_DRAFT` 后,网络超时不能直接重新调用 `draft/add`。
|
|
260
|
+
- `CREATING_DRAFT → FAILED` 只允许用于已通过微信平台响应验签,且正文明确返回“未创建”的 API 拒绝。超时、断线、响应验签失败、证书序列号未知、响应解密失败或其他无法证明结果的情况必须进入 `CREATED_UNVERIFIED`。
|
|
261
|
+
- `CREATED_UNVERIFIED` 的处理是回读、按内容指纹/时间窗口核验或人工处理。
|
|
262
|
+
- 只有能证明微信没有创建草稿时,才允许同一意图重新创建。
|
|
263
|
+
- `SUCCEEDED` 需要 `draft/get` 回读,至少核对 media ID、标题、作者、摘要和内容哈希/结构指标。
|
|
264
|
+
|
|
265
|
+
受控单账号联调只使用以下状态子集:
|
|
266
|
+
|
|
267
|
+
```text
|
|
268
|
+
QUEUED
|
|
269
|
+
→ PREPARING
|
|
270
|
+
→ UPLOADING_ASSETS
|
|
271
|
+
→ CREATING_DRAFT
|
|
272
|
+
→ VERIFYING
|
|
273
|
+
→ SUCCEEDED
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
旁路终态为 `FAILED`、`ASSET_UPLOAD_UNVERIFIED` 和 `CREATED_UNVERIFIED`。永久封面上传的结果无法确认时进入 `ASSET_UPLOAD_UNVERIFIED`,停止调用 `draft/add`;`draft/add` 或回读结果无法确认时进入 `CREATED_UNVERIFIED`。这个切片不提供自动 reconciliation(核验补偿);出现任一未确认状态后必须停止再次提交,先由人工在公众号后台核对。
|
|
277
|
+
|
|
278
|
+
### 3.5 Job
|
|
279
|
+
|
|
280
|
+
```text
|
|
281
|
+
QUEUED → RUNNING → SUCCEEDED
|
|
282
|
+
↘ RETRY_WAIT → QUEUED
|
|
283
|
+
↘ FAILED
|
|
284
|
+
↘ DEAD
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
- `FAILED`:确定性业务失败,不再自动重试;
|
|
288
|
+
- `DEAD`:达到重试上限或租约异常,需要人工;
|
|
289
|
+
- Worker 只领取 `QUEUED` 且 `nextRunAt <= now` 的任务;
|
|
290
|
+
- Worker 必须使用 compare-and-set(比较并更新)完成终态写入。
|
|
291
|
+
|
|
292
|
+
### 3.6 支付订单
|
|
293
|
+
|
|
294
|
+
```text
|
|
295
|
+
CREATED
|
|
296
|
+
→ PAYMENT_REQUIRED
|
|
297
|
+
→ USER_AUTHORIZING
|
|
298
|
+
→ PAID
|
|
299
|
+
→ FULFILLED
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
旁路状态:
|
|
303
|
+
|
|
304
|
+
- `EXPIRED`
|
|
305
|
+
- `CLOSED`
|
|
306
|
+
- `REFUND_PENDING`
|
|
307
|
+
- `REFUNDED`
|
|
308
|
+
- `PAID_UNFULFILLED`
|
|
309
|
+
- `RECONCILIATION_REQUIRED`
|
|
310
|
+
|
|
311
|
+
收到重复回调时返回成功,但不重复授予权益。Agent 声称支付成功不能推动状态;只有验签回调或服务端查单可以。
|
|
312
|
+
|
|
313
|
+
### 3.7 额度预留
|
|
314
|
+
|
|
315
|
+
```text
|
|
316
|
+
RESERVED → CONSUMED
|
|
317
|
+
RESERVED → RELEASED
|
|
318
|
+
RESERVED → FROZEN → CONSUMED | RELEASED | MANUAL
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
`CREATED_UNVERIFIED` 对应 `FROZEN`,避免同一额度既被释放又对应一个可能已存在的草稿。
|
|
322
|
+
|
|
323
|
+
## 4. HTTP API
|
|
324
|
+
|
|
325
|
+
所有业务 API 使用 `/api/v1`,返回统一 envelope:
|
|
326
|
+
|
|
327
|
+
```json
|
|
328
|
+
{
|
|
329
|
+
"data": {},
|
|
330
|
+
"requestId": "req_...",
|
|
331
|
+
"error": null
|
|
332
|
+
}
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
错误:
|
|
336
|
+
|
|
337
|
+
```json
|
|
338
|
+
{
|
|
339
|
+
"data": null,
|
|
340
|
+
"requestId": "req_...",
|
|
341
|
+
"error": {
|
|
342
|
+
"code": "ENTITLEMENT_REQUIRED",
|
|
343
|
+
"message": "需要购买权益后继续",
|
|
344
|
+
"retryable": false,
|
|
345
|
+
"details": {}
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
`message` 给人看,Agent/CLI 只能按稳定 `code` 分支。
|
|
351
|
+
|
|
352
|
+
### 4.1 健康和配置
|
|
353
|
+
|
|
354
|
+
| 方法 | 路径 | 说明 |
|
|
355
|
+
|---|---|---|
|
|
356
|
+
| GET | `/health/live` | 进程存活 |
|
|
357
|
+
| GET | `/health/ready` | 配置和依赖就绪,只返回分类状态 |
|
|
358
|
+
| GET | `/api/v1/meta/compatibility` | CLI/协议/Skill 支持范围 |
|
|
359
|
+
|
|
360
|
+
### 4.2 设备和身份
|
|
361
|
+
|
|
362
|
+
| 方法 | 路径 | 说明 |
|
|
363
|
+
|---|---|---|
|
|
364
|
+
| POST | `/api/v1/device-binding-sessions` | 创建设备绑定挑战 |
|
|
365
|
+
| POST | `/api/v1/device-binding-sessions/{id}/proof` | 提交 Ed25519 持钥证明;签名同时绑定候选访问/刷新 Token 哈希,并取得短时绑定 Token |
|
|
366
|
+
| GET | `/api/v1/device-sessions/current` | 查询当前设备、用户和租户 |
|
|
367
|
+
| POST | `/api/v1/device-sessions/current/refresh-credential` | 老会话在仍有效时登记首个设备刷新凭据 |
|
|
368
|
+
| POST | `/api/v1/device-sessions/refresh` | 刷新 Token + 设备签名轮换下一组访问/刷新 Token |
|
|
369
|
+
| DELETE | `/api/v1/device-sessions/current` | 注销/撤销当前设备 |
|
|
370
|
+
| POST | `/api/v1/auth/wechat/login-sessions` | 创建 `start`、`link` 或 `login` 个人微信会话 |
|
|
371
|
+
| GET | `/api/v1/auth/wechat/login-sessions/{id}` | 使用独立 poll Token 查询个人关联/登录结果 |
|
|
372
|
+
| GET | `/auth/wechat/login` | 同域个人微信登录发起页 |
|
|
373
|
+
| GET | `/callbacks/wechat/login` | 网站应用 OAuth 回调 |
|
|
374
|
+
|
|
375
|
+
设备访问会话有效期为 24 小时,设备刷新凭据有效期为 30 天。两个明文 Token 都只在 CLI 本机生成,Server 只保存 SHA-256;刷新同时要求设备 Ed25519 签名,并把下一组 Token 哈希和 `rotationId` 绑定到签名消息。同一轮请求可幂等重放恢复,其他旧刷新 Token 重放被拒绝。个人登录和公众号授权各自使用独立 poll Token,只能查询对应会话,不能调用设备、账号、预览、任务或草稿接口。
|
|
376
|
+
|
|
377
|
+
设备会话撤销也取消由该设备发起、尚未投影完成的新增公众号授权。Server 在消费微信授权码前、形成 `AUTHORIZED` 检查点前及恢复投影前,按 session 固化的 `deviceSessionId + deviceId + tenantId + userId` 重新读取并校验未撤销且未过期的设备会话;失效时授权会话进入 `FAILED`,不调用或不继续投影微信副作用。首次设备绑定尚无既有设备会话,改由短时绑定会话和持钥证明约束。
|
|
378
|
+
|
|
379
|
+
### 4.3 微信授权
|
|
380
|
+
|
|
381
|
+
| 方法 | 路径 | 说明 |
|
|
382
|
+
|---|---|---|
|
|
383
|
+
| POST | `/api/v1/wechat/authorization-sessions` | 创建第三方平台授权会话 |
|
|
384
|
+
| GET | `/api/v1/wechat/authorization-sessions/{id}` | 查询授权状态 |
|
|
385
|
+
| GET | `/api/v1/wechat/accounts` | 列出已授权账号 |
|
|
386
|
+
| GET | `/api/v1/wechat/accounts/{id}` | 账号详情和权限 |
|
|
387
|
+
| DELETE | `/api/v1/wechat/accounts/{id}/binding` | 在 DxC 停用绑定;提示用户同步从微信侧取消 |
|
|
388
|
+
| GET | `/authorize/wechat/start` | 与第三方平台配置同域的授权发起页;验证短时加密入口后才展示微信官方授权链接 |
|
|
389
|
+
| POST | `/callbacks/wechat/component-events` | ticket、授权、取消和权限变更回调 |
|
|
390
|
+
| POST | `/callbacks/wechat/authorizers/{APPID}/callback` | 被授权公众号消息与事件回调 |
|
|
391
|
+
| GET | `/authorize/wechat/callback` | 官方授权页面回跳 |
|
|
392
|
+
|
|
393
|
+
回调不得使用设备会话鉴权;它们使用微信签名/AES 验证、重放保护和来源限制。
|
|
394
|
+
|
|
395
|
+
旧版授权会话 Token 不再被解释为设备会话。身份版本上线后,旧 CLI 必须重新执行设备持钥证明和公众号扫码;`connect` 可识别精确旧会话文件并在成功后覆盖,但不会把旧 Token 发给 Server。Server 不提供把旧授权 Token 静默提升为设备 Token 的兼容路径。
|
|
396
|
+
|
|
397
|
+
### 4.4 文章、渲染和预览
|
|
398
|
+
|
|
399
|
+
| 方法 | 路径 | 说明 |
|
|
400
|
+
|---|---|---|
|
|
401
|
+
| POST | `/api/v1/uploads` | 创建短时、哈希和媒体类型绑定的上传会话 |
|
|
402
|
+
| PUT | `/api/v1/uploads/{id}/content?token=...` | 同源上传明确选择的正文、正文图片或封面;仍需设备会话 |
|
|
403
|
+
| POST | `/api/v1/articles` | 用已完成的正文、封面和有界正文图片清单创建内容寻址文章版本 |
|
|
404
|
+
| POST | `/api/v1/articles/{id}/render-snapshots` | 创建权威渲染快照 |
|
|
405
|
+
| POST | `/api/v1/render-snapshots/{id}/preview-links` | 创建短时预览链接 |
|
|
406
|
+
| GET | `/previews/{token}` | no-store、noindex、严格 CSP 的不可变预览 |
|
|
407
|
+
| GET | `/previews/{token}/cover` | 同一预览 token 绑定的封面 |
|
|
408
|
+
| GET | `/previews/{token}/assets/{index}` | 同一预览 token 和快照绑定的正文图片 |
|
|
409
|
+
| POST | `/api/v1/render-snapshots/{id}/approvals` | 确认快照和目标账号 |
|
|
410
|
+
|
|
411
|
+
当前首位用户切片使用短时同源上传 URL,由 Server 校验长度和 SHA-256 后写入对象存储;
|
|
412
|
+
URL 的 origin(源)必须与配置的 API origin 相同。后续若改成对象存储预签名直传,不改变
|
|
413
|
+
文章、快照和确认契约。
|
|
414
|
+
|
|
415
|
+
### 4.5 草稿
|
|
416
|
+
|
|
417
|
+
| 方法 | 路径 | 说明 |
|
|
418
|
+
|---|---|---|
|
|
419
|
+
| POST | `/api/v1/draft-intents` | 创建幂等草稿意图 |
|
|
420
|
+
| GET | `/api/v1/draft-intents/{id}` | 意图、交付状态、Worker 阶段和建议轮询间隔 |
|
|
421
|
+
|
|
422
|
+
`POST /draft-intents` 必须携带 `Idempotency-Key`。同一个 key 和同一请求摘要返回相同
|
|
423
|
+
资源;同 key 不同摘要返回 `PUBLISHING_IDEMPOTENCY_CONFLICT`。当前状态、微信 media ID
|
|
424
|
+
和回读验证直接投影在 `DraftIntent`;独立 `DraftDelivery`、权益确认接口和自动
|
|
425
|
+
reconcile(核验补偿)是后续阶段。
|
|
426
|
+
|
|
427
|
+
受控单账号真实草稿联调使用以下临时纵向接口:
|
|
428
|
+
|
|
429
|
+
| 方法 | 路径 | 说明 |
|
|
430
|
+
|---|---|---|
|
|
431
|
+
| POST | `/api/v1/wechat/draft-smoke-previews` | 为明确选择的账号返回固定测试文章和不可变 `snapshotHash` |
|
|
432
|
+
| POST | `/api/v1/wechat/draft-smoke-intents` | 接收 `accountId + snapshotHash + confirmed=true`,以 `Idempotency-Key` 排队 |
|
|
433
|
+
| GET | `/api/v1/wechat/draft-smoke-intents/{id}` | 查询固定测试草稿状态和脱敏结果 |
|
|
434
|
+
|
|
435
|
+
这三个接口仍要求 DxC 设备会话并强制租户边界。它们不接受任意文章正文,不能绕过快照确认,也不是完整 P5/P6 API 的替代品。
|
|
436
|
+
|
|
437
|
+
### 4.6 权益与支付(规划,尚未实现)
|
|
438
|
+
|
|
439
|
+
| 方法 | 路径 | 说明 |
|
|
440
|
+
|---|---|---|
|
|
441
|
+
| GET | `/api/v1/entitlements` | 当前期限和额度 |
|
|
442
|
+
| GET | `/api/v1/offerings` | 可购买商品 |
|
|
443
|
+
| POST | `/api/v1/purchase-intents` | 创建购买意图 |
|
|
444
|
+
| POST | `/api/v1/purchase-intents/{id}/skillpay` | 生成 X402 支付触发 |
|
|
445
|
+
| GET | `/api/v1/payment-orders/{id}` | 查询支付和履约状态 |
|
|
446
|
+
| POST | `/callbacks/wechat-pay/transactions` | 微信支付通知 |
|
|
447
|
+
|
|
448
|
+
SkillPay 路由可能返回 HTTP 402,并同时提供标准 Header 和 JSON Body。CLI 必须原样保留稳定支付字段,不能把它压扁成一段错误文本。
|
|
449
|
+
|
|
450
|
+
## 5. CLI 命令契约
|
|
451
|
+
|
|
452
|
+
当前已实现命令:
|
|
453
|
+
|
|
454
|
+
```text
|
|
455
|
+
dxc doctor --json
|
|
456
|
+
dxc version --json
|
|
457
|
+
dxc skills install --target <workbuddy|codex> [--force] [--json]
|
|
458
|
+
dxc setup --server <https-url>
|
|
459
|
+
|
|
460
|
+
dxc profile status --json
|
|
461
|
+
dxc profile save --input <answers.json> --json
|
|
462
|
+
|
|
463
|
+
dxc project init [--directory <directory>] --title <title> \
|
|
464
|
+
[--knowledge <files...>] [--lexical-only] --json
|
|
465
|
+
dxc project resolve [title-or-project-id] [--directory <directory>] --json
|
|
466
|
+
dxc project status [--directory <directory>] --json
|
|
467
|
+
dxc project checkpoint <stage> \
|
|
468
|
+
--status <running|awaiting-user|completed|failed|skipped> \
|
|
469
|
+
--skill <dxc-skill> \
|
|
470
|
+
--skill-version <version|unknown> \
|
|
471
|
+
[--inputs <artifact,artifact>] \
|
|
472
|
+
--summary <stage-summary> \
|
|
473
|
+
[--waiting-for <user-question>] \
|
|
474
|
+
[--confirm] \
|
|
475
|
+
[--confirmed-by <actor>] \
|
|
476
|
+
[--confirmation-snapshot <sha256>] \
|
|
477
|
+
--execution-location <local-device|agent-hosted|unknown> \
|
|
478
|
+
--data-transit <local-only|agent-provider|dxc-cloud|unknown> \
|
|
479
|
+
--json
|
|
480
|
+
|
|
481
|
+
dxc knowledge status --json
|
|
482
|
+
dxc knowledge import <files...> --json
|
|
483
|
+
dxc knowledge search <query> --mode <hybrid|lexical|semantic> --limit 8 --json
|
|
484
|
+
dxc knowledge remove <article-id> --json
|
|
485
|
+
|
|
486
|
+
dxc auth status
|
|
487
|
+
dxc auth start --server <https-url>
|
|
488
|
+
dxc auth link-wechat
|
|
489
|
+
dxc auth login
|
|
490
|
+
dxc auth logout
|
|
491
|
+
|
|
492
|
+
dxc wechat connect --server <https-url>
|
|
493
|
+
dxc wechat accounts
|
|
494
|
+
|
|
495
|
+
dxc wechat draft preview \
|
|
496
|
+
--article <article.md> \
|
|
497
|
+
[--assets-directory <local-images>] \
|
|
498
|
+
[--cover <cover.png-or-jpeg|auto>] \
|
|
499
|
+
--account <account-id> \
|
|
500
|
+
--title <confirmed-title>
|
|
501
|
+
dxc wechat draft preview-refresh \
|
|
502
|
+
--snapshot <snapshot-id> \
|
|
503
|
+
--snapshot-hash <snapshot-hash>
|
|
504
|
+
dxc wechat draft create \
|
|
505
|
+
--account <account-id> \
|
|
506
|
+
--snapshot <snapshot-id> \
|
|
507
|
+
--snapshot-hash <snapshot-hash> \
|
|
508
|
+
--idempotency-key <stable-key> \
|
|
509
|
+
--confirm
|
|
510
|
+
dxc wechat draft status <intent-id>
|
|
511
|
+
|
|
512
|
+
dxc wechat draft smoke-preview --account <account-id>
|
|
513
|
+
dxc wechat draft smoke-create \
|
|
514
|
+
--account <account-id> \
|
|
515
|
+
--snapshot <snapshot-hash> \
|
|
516
|
+
--idempotency-key <stable-key> \
|
|
517
|
+
--confirm
|
|
518
|
+
dxc wechat draft smoke-status <intent-id>
|
|
519
|
+
```
|
|
520
|
+
|
|
521
|
+
所有草稿命令都显式要求 `--account`。即使只有一个公众号,Agent 也先展示后使用;多个
|
|
522
|
+
公众号时必须让用户选择,不能静默复用上一次账号。
|
|
523
|
+
|
|
524
|
+
`profile`、`project` 和 `knowledge` 已实现为纯本地命令,成功和失败都有稳定 JSON envelope(信封结构)。`knowledge import` 默认建立本地语义索引;只有用户明确使用 `--lexical-only` 时才省略向量。之后调用 `hybrid`/`semantic` 而索引不完整时返回 `DXC_KNOWLEDGE_SEMANTIC_NOT_READY`,不得静默退化。
|
|
525
|
+
|
|
526
|
+
`project init` 会返回 `knowledgeBootstrap.articleCount/status/recommendedCommand`;空库时明确
|
|
527
|
+
建议导入,但不会扫描目录或阻断继续。`project` 的 `init/resolve/status/checkpoint`
|
|
528
|
+
统一使用 `--directory`,不接受目录位置参数。`draft create` 只接受 `--snapshot`;
|
|
529
|
+
缺少多个必填项时一次返回完整列表。云端预览响应返回创建时间、到期时间和剩余秒数;
|
|
530
|
+
草稿状态 API 为 v1 客户端兼容保留内部 `status`,并新增
|
|
531
|
+
`progress.label/message/nextAction/pollAfterSeconds/terminal`。CLI 和 Agent 面向用户
|
|
532
|
+
只展示 `progress`,不显示英文内部状态名。
|
|
533
|
+
|
|
534
|
+
`billing`、`tools` 和独立 `article import` 命令尚未实现,不属于当前 CLI 契约。
|
|
535
|
+
|
|
536
|
+
## 6. 稳定错误码
|
|
537
|
+
|
|
538
|
+
MVP 至少定义:
|
|
539
|
+
|
|
540
|
+
```text
|
|
541
|
+
CONFIG_INVALID
|
|
542
|
+
CLI_UPGRADE_REQUIRED
|
|
543
|
+
AUTH_REQUIRED
|
|
544
|
+
DEVICE_REVOKED
|
|
545
|
+
DEVICE_REFRESH_UNAUTHORIZED
|
|
546
|
+
WECHAT_LOGIN_IDENTITY_NOT_LINKED
|
|
547
|
+
WECHAT_LOGIN_IDENTITY_CONFLICT
|
|
548
|
+
WECHAT_AUTH_REQUIRED
|
|
549
|
+
WECHAT_AUTH_REVOKED
|
|
550
|
+
WECHAT_PERMISSION_MISSING
|
|
551
|
+
ACCOUNT_SELECTION_REQUIRED
|
|
552
|
+
ARTICLE_INVALID
|
|
553
|
+
ASSET_NOT_FOUND
|
|
554
|
+
ASSET_OUTSIDE_ROOT
|
|
555
|
+
OCR_REQUIRED
|
|
556
|
+
PREFLIGHT_FAILED
|
|
557
|
+
SNAPSHOT_STALE
|
|
558
|
+
APPROVAL_REQUIRED
|
|
559
|
+
ENTITLEMENT_REQUIRED
|
|
560
|
+
PAYMENT_REQUIRED
|
|
561
|
+
PAYMENT_PENDING
|
|
562
|
+
PAYMENT_VERIFICATION_FAILED
|
|
563
|
+
IDEMPOTENCY_CONFLICT
|
|
564
|
+
JOB_RETRYING
|
|
565
|
+
DRAFT_CREATED_UNVERIFIED
|
|
566
|
+
DRAFT_FAILED
|
|
567
|
+
RATE_LIMITED
|
|
568
|
+
EXTERNAL_UNAVAILABLE
|
|
569
|
+
```
|
|
570
|
+
|
|
571
|
+
纯本地命令另使用 `DXC_PROFILE_*`、`DXC_PROJECT_*` 和 `DXC_KNOWLEDGE_*` 命名空间;它们不会复用 HTTP 状态,也不会在错误消息中输出绝对路径、正文或模型输入。
|
|
572
|
+
|
|
573
|
+
错误对象包含:
|
|
574
|
+
|
|
575
|
+
- `code`
|
|
576
|
+
- `message`
|
|
577
|
+
- `retryable`
|
|
578
|
+
- `retryAfterMs`(可选)
|
|
579
|
+
- `requestId`
|
|
580
|
+
- `details`(经过脱敏的结构化信息)
|
|
581
|
+
|
|
582
|
+
## 7. 版本兼容
|
|
583
|
+
|
|
584
|
+
每个请求携带:
|
|
585
|
+
|
|
586
|
+
- `X-DxC-CLI-Version`
|
|
587
|
+
- `X-DxC-Protocol-Version`
|
|
588
|
+
- `X-DxC-Skill`
|
|
589
|
+
- `X-DxC-Skill-Version`
|
|
590
|
+
- `X-DxC-Installation-Id`
|
|
591
|
+
|
|
592
|
+
Server 返回当前任务固定的:
|
|
593
|
+
|
|
594
|
+
- `protocolVersion`
|
|
595
|
+
- `rendererVersion`
|
|
596
|
+
- `templateId`
|
|
597
|
+
- `workflowVersion`
|
|
598
|
+
|
|
599
|
+
服务端至少兼容稳定渠道当前和上一个协议版本。无法兼容时返回 `CLI_UPGRADE_REQUIRED`,不得在任务中途静默改变语义。
|