dsh-grok-provider 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.
Files changed (46) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/CONTRIBUTING.md +51 -0
  3. package/LICENSE +21 -0
  4. package/README.en.md +200 -0
  5. package/README.md +200 -0
  6. package/SECURITY.md +35 -0
  7. package/dist/client/client.js +215 -0
  8. package/dist/host/index.mjs +147 -0
  9. package/dist/internal/account-dashboard.mjs +67 -0
  10. package/dist/internal/auth-controller.mjs +184 -0
  11. package/dist/internal/auth-registry.mjs +64 -0
  12. package/dist/internal/auth-rpc.mjs +118 -0
  13. package/dist/internal/billing-summary.mjs +105 -0
  14. package/dist/internal/credential-source.mjs +168 -0
  15. package/dist/internal/grok-adapter.mjs +160 -0
  16. package/dist/internal/grok-command-handler.mjs +62 -0
  17. package/dist/internal/grok-command.mjs +17 -0
  18. package/dist/internal/grok-transport.mjs +279 -0
  19. package/dist/internal/model-catalog.mjs +142 -0
  20. package/dist/internal/official-auth-driver.mjs +40 -0
  21. package/dist/internal/official-cli-auth.mjs +231 -0
  22. package/dist/internal/official-cli-verifier.mjs +62 -0
  23. package/dist/internal/official-credential-loader.mjs +64 -0
  24. package/dist/internal/provider-runtime.mjs +43 -0
  25. package/dist/internal/responses-codec.mjs +357 -0
  26. package/dist/internal/responses-request.mjs +246 -0
  27. package/dist/internal/responses-sse.mjs +123 -0
  28. package/docs/01-product-requirements.md +128 -0
  29. package/docs/02-architecture-options.md +180 -0
  30. package/docs/03-security-threat-model.md +243 -0
  31. package/docs/04-harness-contract.md +325 -0
  32. package/docs/05-test-plan.md +224 -0
  33. package/docs/06-release-plan.md +182 -0
  34. package/docs/07-decision-gate.md +76 -0
  35. package/docs/08-upstream-cli-1.0.5-evidence.md +98 -0
  36. package/docs/09-implementation-status.md +37 -0
  37. package/docs/README.md +60 -0
  38. package/docs/adr/0001-auth-and-transport-route.md +86 -0
  39. package/docs/adr/0002-v0.1-scope.md +46 -0
  40. package/docs/adr/0003-dual-authentication.md +77 -0
  41. package/docs/adr/0004-dynamic-model-catalog.md +34 -0
  42. package/docs/adr/0005-official-cli-only-authentication.md +36 -0
  43. package/docs/adr/0006-account-dashboard.md +84 -0
  44. package/grok-provider.patch.yml +3 -0
  45. package/package.json +92 -0
  46. package/types/index.d.ts +9 -0
@@ -0,0 +1,224 @@
1
+ # 兼容性与测试计划
2
+
3
+ ## 1. 测试原则
4
+
5
+ - 先验证最危险、最不确定的协议边界,再扩展实现。
6
+ - CI 不使用真实 token、账号、prompt 或录制的敏感响应。
7
+ - 所有本地模拟服务使用随机 loopback 端口,不访问真实第三方。
8
+ - 真实账号 smoke 只在发布候选上人工执行,记录脱敏结果。
9
+ - `0.1.0` 发布前必须通过 macOS arm64 真机与 macOS/Windows 自动化矩阵;Windows x64 首次真机验证在发布后对 Registry 精确版本执行,验证前对外标注“代码支持、真机未验证”。
10
+ - `0.1.1` 及后续版本不要求每次重复真机验证;自动化矩阵、契约测试、干净安装和 tarball 校验是常规发版门禁。
11
+
12
+ ## 2. Gate 0:方案确认
13
+
14
+ 仓库所有者确认 [开发前决策门](./07-decision-gate.md) 前,不创建代码和测试脚手架。
15
+
16
+ ## 3. Gate 1:协议与登录 spike
17
+
18
+ 确认后首先做一次最小、可丢弃的验证,不直接扩展为产品代码。
19
+
20
+ ### 官方 CLI 登录
21
+
22
+ - macOS 在标准 Grok 配置下从 Harness Host 启动 `grok login --oauth`,默认浏览器成功打开。
23
+ - Windows 在标准 Grok 配置下从 Harness Host 启动 `grok.exe login --oauth`,默认浏览器成功打开。
24
+ - 插件到 CLI 的 `ctx.subprocess` argv 不经 shell,不需要用户另开 Terminal/PowerShell;不声称官方 CLI 及其后代端到端无 shell。
25
+ - 锁定并记录精确 Grok CLI 版本、官方 tag/commit 与可用的 `SOURCE_REV`;auth flow/schema/Proxy 依据使用该版本永久链接,不以 mutable `main` 作为发布证据。
26
+ - 标准配置成功后凭据由官方 CLI 管理;验证“已有会话→重新登录取消/失败”可能清除旧会话、成功后的 managed-config sync,以及 logout 会影响共享 `GROK_HOME` 的其他应用。
27
+ - 取消、5 分钟超时、CLI 非零退出和 Harness 卸载都会终止并等待 Harness seam 可观察的受管进程树;单独记录官方 CLI 主动脱离的后代和系统浏览器。
28
+ - stdout/stderr 不进入 UI、session log 或普通日志。
29
+ - 当 Host 无图形桌面或浏览器启动失败时返回稳定错误,不把远程 Host 登录误报为客户端成功。
30
+ - `auth_provider_command` 缺失/为空/失败/成功、企业 OIDC、devbox、隔离 `GROK_HOME` 加 system/MDM 配置都要用真实 CLI 验证。产品选择是“不支持并明确报错”:不能把 external/OIDC 流程显示成标准浏览器登录,也不能把其凭据送入固定 Proxy。
31
+ - external provider 写 stderr、等待用户、经 shell 并启动后台后代的行为只作为 vendor-boundary 证据记录;原始 stderr 不显示。若用户不接受该信任边界,Gate 1 停止。
32
+ - stdin ignored 下只验收浏览器自动 callback;不支持手工粘贴授权 code。
33
+
34
+ ### Chat Proxy 协议
35
+
36
+ - 多轮 system/user/assistant/tool-result 消息角色保真。
37
+ - 文本流、reasoning、usage 与 finish。
38
+ - 一个和多个工具定义。
39
+ - tool call ID、名称和 JSON 参数的分段增量。
40
+ - 工具结果回放后继续生成。
41
+ - AbortSignal 中止。
42
+ - 401、429、5xx、截断 SSE 和空成功响应。
43
+ - 缺少/错误 `x-grok-client-version` 的 426;诚实的插件 identifier 必须成功,若只能冒充官方 `grok-shell` 才能调用则阻断发布。
44
+ - 每个目录返回模型的 `api_backend` 都必须有对应 codec 与真机最小流;未知 backend 不能被静默隐藏来伪称“全部模型”。
45
+
46
+ 只保留字段名、事件名、类型、状态码和大小等脱敏观察。若工具调用无法无损映射,立即停止并重新评审 ADR-0001。
47
+
48
+ ## 4. 单元测试
49
+
50
+ ### Binary resolver
51
+
52
+ - macOS 官方相对 symlink 指向 `~/.grok/downloads` 成功。
53
+ - symlink 逃出 `~/.grok` 失败。
54
+ - Windows reparse point、目录、设备文件和非 `.exe` 候选失败。
55
+ - 相对或 UI/RPC 提供的 `GROK_HOME` 失败;只接受 Host 启动时冻结的绝对值。
56
+ - workspace/PATH 中的假 `grok` 不会被选中。
57
+ - `--version` 超时、超限、非零退出、畸形版本,以及不在发布冻结有限精确版本集合中的更低/更高版本都失败。
58
+ - 登录期间 symlink/文件 identity/version 改变,或官方 CLI 自更新到未测试版本时失败关闭;不把 vendor updater 误记成插件下载安装。
59
+ - 路径/owner/version 检查不得在 UI 中宣称已密码学证明 publisher;从非官方安装入口取得的候选不在支持范围。
60
+
61
+ ### Login bridge
62
+
63
+ - 完整 argv 只能是 `[constrainedExecutable, "login", "--oauth"]`、`[constrainedExecutable, "logout"]` 或 `[constrainedExecutable, "--version"]`。
64
+ - 断言只调用 `ctx.subprocess`,从不 import/call `node:child_process`;验证受控 cwd、环境 tombstone、stdin ignored 和 raw bounded pipes。
65
+ - `XAI_API_KEY`、Grok auth/OIDC/endpoint/log override、`BROWSER`、动态加载器、Node/SSL key log、npm/DSH/API secret 都不继承;PATH/PATHEXT/COMSPEC 使用固定系统值,proxy/CA 和必要 OS 变量按冻结策略保留。workspace/PATH canary 不会被登录链执行。环境清理不能被测试误表述成覆盖 system/MDM 配置。
66
+ - 第二个并发 login 在 RPC 成功分支返回 `{ kind: "busy" }`,不伪造 RpcErrorCode。
67
+ - cancel、AbortSignal、timeout、subprocess service 替换和 dispose 都终止进程、`waitForExit()` 并 settle 一次。
68
+ - fake CLI 先写入有效 auth 再挂起:cancel/timeout 后 attempt outcome 与重新读取的 current credential 分开,UI 不谎报未登录,也不静默切换账号。
69
+ - stdout/stderr 超过 64 KiB 时终止。
70
+ - 退出 0 但 auth 文件缺失/无效仍失败。
71
+ - canary secret 出现在 fake CLI 输出时,不出现在 RPC、命令结果、错误和日志。
72
+ - Windows 真实 Gate 1 验证无额外 console 闪窗;若出现则发布阻断,不能用 rc.2 契约中不存在的 `windowsHide` 伪造单测。
73
+
74
+ ### Credential source
75
+
76
+ - 缺失、空、超 64 KiB、损坏 JSON、错误 schema、未知关键字段/模式。
77
+ - 唯一且与绑定版本第一方 OIDC schema 相符的候选通过;external 即使带相同 issuer 也拒绝;issuer/scope/client ID 任意不一致、web_login、api_key、legacy scope、企业 OIDC 和多候选歧义全部拒绝。测试名称不得把 metadata 形状称为已证明来源。
78
+ - 未知非关键字段只能有界忽略;精确 schema 与生产 issuer 绑定到发布支持的 CLI 版本。
79
+ - symlink/reparse、目录、替换竞态和读取中断。
80
+ - access/refresh token canary 不出现在 `JSON.stringify(status)`、异常、日志、cache、诊断输出或 fingerprint;测试承认完整文件字节会瞬时进入 Host 内存。
81
+ - 新鲜 access token 不启动 CLI;过期的同源官方 record 通过固定 `models` 命令刷新并只重试一次;并发请求 single-flight;外国 issuer/client/scope/schema 永不触发刷新;刷新失败或刷新后仍过期统一失败关闭。
82
+ - email、user ID、team/org、subscription 与 fingerprint canary 不进入 `PublicAuthStatus`、RPC、命令返回或持久事件。
83
+ - credential source 已挂载但文件缺失、无效或过期且续期失败时,Web/TUI 状态必须为 unavailable;不得把 source/transport 已注册误报为凭据 ready。状态校验与登录/退出 generation 竞态时失败关闭。
84
+ - `expires_at` 边界、固定 clock skew、缺失/畸形 expiry 和本机时钟偏移。
85
+ - mtime/identity 变化使缓存失效。
86
+ - logout/401 与并发读取竞态不会恢复旧缓存。
87
+
88
+ ### Transport
89
+
90
+ - 只有固定 endpoint ID 可用。
91
+ - Authorization 和官方要求 headers 精确;不接受调用方覆盖。
92
+ - 301/302/303/307/308 全部失败,第二跳服务器没有收到请求。
93
+ - 错误 body、JSON、SSE 行、事件和累计字节上限。
94
+ - 极小 SSE event/comment/heartbeat 数量上限、block/tool-call 数量、单个/累计 tool arguments 大小和响应结构深度上限。
95
+ - 无 Content-Length、伪造小长度、chunked、gzip/brotli 炸弹。
96
+ - 首字节、idle、绝对超时与 AbortSignal。
97
+ - 401 使 lease 失效并返回 LLM `AUTH`;已发送 POST 一律不自动重放,也不把被拒 token 改送其他 endpoint。
98
+ - 序列化前限制消息数、单条/总 UTF-8 字节、工具数、schema 大小/深度和 tool-result;响应验证 Content-Type。
99
+
100
+ ### 动态模型目录
101
+
102
+ - `/v1/models` 的 0/1/N、重复 ID、恶意超长 ID/名称、错误类型、未知字段、超限、重定向、401 与取消。
103
+ - catalog cache 绑定 auth mode+generation;切换模式、logout、401 或 credential update 立即失效,旧刷新不能覆盖新账号。
104
+ - `listModels()` 返回全部合法去重记录;`resolveModel()` 对未列出 ID 做一次有界刷新,但目录缺失本身不被误当作路由拒绝。
105
+ - macOS/Windows 真机将插件目录与同一账号同时刻的 `grok models` 对比,不得漏模型;当前 fixture 包含 `grok-4.6` 与 `grok-4.5`,不把它们当永久全集。
106
+
107
+ ### 账户额度
108
+
109
+ - 新版 credits shape 有显式 `creditUsagePercent` 时直接使用,并拒绝非有限数或 0–100 之外的值。
110
+ - 只有官方 weekly/monthly `currentPeriod` 同时具有有效 `start`、`end` 时,才把缺失百分比恢复为 proto3 省略的 `0%`;周期不完整或类型未知时保持 unknown。
111
+ - 旧版 shape 仅在 `monthlyLimit.val > 0` 且 `0 <= used.val <= monthlyLimit.val` 时计算百分比。
112
+ - reset 只来自 billing 周期结束时间,不得使用 OAuth token expiry;原始 billing、identity、balance 与 history 不进入 renderer。
113
+
114
+ ### Codec 与 adapter
115
+
116
+ - 文本、reasoning、交错 block 和 UTF-8 边界。
117
+ - index 必须为非负 safe integer;重复 start、delta 指向未打开/错误类型 index、成功 finish 时未闭合 block 都失败。
118
+ - tool arguments 跨多个事件分片。
119
+ - 成功响应 usage 恰好一次并紧邻 finish;finish 缺失/重复/之后还有事件都失败。`error|aborted` finish 携带 failure,并覆盖允许未闭合 block 的 rc.2 路径。
120
+ - finish reason 对象精确映射 `stop|tool-calls|max-tokens|error|aborted`;input/cache-read/cache-write 可同时存在但计数集合不重叠,billed input 为三者之和。
121
+ - 未知事件、重复 block、截断 JSON、无闭合 tool call 和空响应。
122
+ - `prepareCall` 后热更新,旧调用使用旧 generation,新调用使用新 generation。
123
+ - 直接 `stream()` 在返回 iterable 前冻结 generation。
124
+ - 每个请求都有 Harness attribution headers。
125
+ - 任何 image block 在 HTTP 前以 `UNSUPPORTED_CONTENT` 拒绝。
126
+ - Provider 只发 tool-call chunks,不执行工具/写文件;未声明工具名、恶意路径参数、伪造 server search/image/tool 事件不能绕过 Harness 权限层。
127
+
128
+ ### Web RPC 与 TUI
129
+
130
+ - 非 loopback RPC 在 handler 前拒绝。
131
+ - 未知字段、未知 action、错误 sessionId 拒绝。
132
+ - `busy|cli-not-found|cli-unsupported|unsupported-auth-config|auth-required` 都是 `ok:true` 的闭合业务 outcome;`bad-request` 带 `details.issues`,signal 中止为 `cancelled`,未分类异常才是 `internal`。
133
+ - RPC 业务 DTO 不含 Harness carrier correlation;插件 `diagnosticId` 与 token/process/OAuth state 无关。
134
+ - dependency throw、恶意 `toJSON`/序列化 throw 和 canary error message 都由 non-throwing handler 折叠为固定脱敏 `internal` RpcResult;不得逃逸成 HTTP 500。
135
+ - RPC 递归扫描不含 token、path、URL、stdout/stderr。
136
+ - `/grok` 只接受 `status|login|cancel|logout` 的闭合语法,额外参数返回 usage。
137
+ - `/grok` 不进入模型消息;`recordInput: false`。
138
+ - `recordInput:false` 仍记录命令名、run/done 和返回 text;验证这些持久字段全部脱敏,并覆盖命令后的原始分隔空白。
139
+ - TUI invocation signal 能取消 login。
140
+ - Web 与 TUI 同时 login 只产生一个官方 CLI 进程。
141
+ - `beginLogin` 只在 spawn 成功后返回 session;Web 轮询 status,TUI 等待同一 session;错误/陈旧 sessionId 不能取消后来启动的 login。
142
+ - logout confirmation 单次使用、短 TTL、绑定 auth generation;Web 明确确认,TUI 在 TTL 内第二次 `/grok logout` 才执行。
143
+ - E2E 验证 rc.2 loopback trust fence 拒绝错误 Origin/Sec-Fetch 的浏览器请求;不把它误写成网络认证或 sender/frame/user-gesture 证明。前台 login 按钮、logout 二次确认、旧 sessionId/confirmation ID 失效属于防误操作 UX;同用户本地进程不在该边界内。
144
+
145
+ ## 5. 集成测试
146
+
147
+ 使用两个独立 loopback 服务:
148
+
149
+ 1. fake pinned API。
150
+ 2. fake redirect/attacker origin。
151
+
152
+ 断言第二个服务在所有 3xx 状态与恶意 body 情况下都收不到 Authorization、Cookie、Referer 或请求 body。
153
+
154
+ 使用 fake official CLI executable:
155
+
156
+ - 记录 argv、cwd 和允许的环境变量名,不记录值。
157
+ - 模拟成功、取消、超时、输出超限、退出 0 无凭据、退出非零。
158
+ - 原子创建 fake auth 文件,验证 Host 热读。
159
+ - 测试卸载时进程和所有 handler 均注销。
160
+
161
+ ## 6. 平台矩阵
162
+
163
+ | 平台 | 自动测试 | 真实 smoke |
164
+ |---|---:|---:|
165
+ | macOS arm64 | 必须 | 必须 |
166
+ | Windows x64 | 必须 | `0.1.0` 发布后首次验证;后续非强制 |
167
+
168
+ macOS x64 不在当前官方 Grok CLI 支持矩阵,也不写入 `0.1.0` 发布承诺。只有 Gate 1 对某个精确官方版本取得 Intel macOS 发布证据后,才能作为非阻断实验记录;runner 可用本身不等于官方支持。
169
+
170
+ 所有平台使用 Harness 内置 Node 24,并对 `0.1.1-rc.2` 公开类型执行 typecheck。
171
+
172
+ Windows 特有用例:
173
+
174
+ - `%USERPROFILE%`、盘符大小写、UNC、ADS、保留设备名和 reparse point。
175
+ - 路径包含空格与非 ASCII 字符。
176
+ - 真实观察登录不闪出额外 shell/console 窗口;rc.2 subprocess seam 没有 `windowsHide` 字段,不能用不存在的契约替代 smoke。
177
+ - 取消不会误杀浏览器,只终止登录 CLI。
178
+
179
+ macOS 特有用例:
180
+
181
+ - 官方相对 symlink、FileVault 场景说明、arm64 binary 匹配。
182
+ - 路径包含空格与非 ASCII 字符。
183
+ - 默认浏览器由官方 CLI 打开,不调用插件自己的 `open`。
184
+
185
+ ## 7. Harness 端到端
186
+
187
+ Web 与 TUI 分别验证:
188
+
189
+ - 插件安装、Harness 重启和 Provider/模型发现。
190
+ - 登录状态、浏览器登录、取消、退出和重新登录。
191
+ - Web/TUI 共用官方凭据状态。
192
+ - 多轮对话、reasoning、工具调用、工具结果继续生成。
193
+ - 中止、429、认证过期、断网和 Harness 重启。
194
+ - HMR/unload 后 adapter、RPC、command、settings slot 和子进程全部清理。
195
+ - Host 连续 activate → unload → activate 两轮后仍只有一个 adapter/RPC/command;async disposer 在 `Promise.allSettled(inflight)` 后才完成。
196
+ - client bundle revision 更新后旧 settings slot、listener、store/controller 被释放,不出现重复页面。
197
+ - subprocess service 替换时对应 child fiber 卸载,login tree 终止并 `waitForExit()` 后才重新安装 capability。
198
+ - teardown wait 有界;`waitForExit()` 返回 `false` 时 HMR 不永久挂起,登录 capability 保持隔离并要求 Host 重启或 subprocess service replacement,不能自动启动第二棵树。
199
+ - Web、TUI、headless profile 分别覆盖缺失 optional peer/service;缺少 subprocess 时登录按钮/命令明确不可用,但已有合格会话的 Provider 可安全启动。
200
+ - Web dashboard 只在 credential ready 后请求固定 billing/models;分别覆盖百分比+重置时间、仅重置时间、旧 monthly counters、空 config 与两个分支独立失败。
201
+ - dashboard RPC 与 client bundle 断言不含 token、credential path、`user_id`、email、team/principal ID、balance、history、原始响应或远端错误。
202
+ - 视觉验收覆盖桌面双列模型卡和 `max-width:680px` 单列规则;刷新操作不得触发重复登录或持久化额度。
203
+
204
+ ## 8. 打包与供应链
205
+
206
+ - lint、typecheck、unit、integration、platform tests 全部通过。
207
+ - `npm pack --dry-run --json` 文件白名单符合预期。
208
+ - 解包 tarball 后测试 root、`./client`、patch 和 exports。
209
+ - 扫描 tarball:无 token、测试账号、本机绝对路径、日志、fixtures 中的真实响应和 `node_modules`。
210
+ - root 与完整 runtime/optional dependency 图均无 `preinstall`、`install`、`postinstall`;普通构建/测试 scripts 不在该市场阻断集合中,但候选包不得依赖安装时构建。
211
+ - 从真实 tarball 在全新 Harness profile 安装,不依赖仓库外文件。
212
+ - GitHub macOS/Windows checkout 后发行文本统一为 LF;`grok-provider.patch.yml` 的逐字节契约不得因 `core.autocrlf` 改写。
213
+
214
+ ## 9. 发布验收
215
+
216
+ `0.1.0` 发布前必须同时满足:
217
+
218
+ - 所有 P0/P1 测试通过。
219
+ - xAI 官方文档与服务条款复核通过。
220
+ - macOS arm64 真实浏览器登录、聊天与工具调用 smoke 通过。
221
+ - Windows x64 自动化平台测试通过,且 README、release notes 和 marketplace 元数据在首次真机验证前明确披露“代码支持、真机未验证”。
222
+ - npm 回读的 SHA-512 与本地发布 tarball 一致。
223
+
224
+ `0.1.0` 发布后必须完成一次 Windows x64 Registry 精确版本的 production inspector、浏览器登录、聊天与工具调用 smoke,并记录结果。`0.1.1` 及后续版本以 CI/契约/安装/制品校验为常规门禁;认证流程、官方 CLI 版本、Harness subprocess seam 或平台安全策略发生变化时建议定向真机验证,但默认不阻断发版。
@@ -0,0 +1,182 @@
1
+ # npm `0.1.0` 发布计划
2
+
3
+ ## 1. 精确发布身份
4
+
5
+ 已冻结:
6
+
7
+ ```text
8
+ dsh-grok-provider@0.1.0
9
+ ```
10
+
11
+ 不采用 `dsh-llm-grok-yukiryou`,避免被理解为第三方包的修补或衍生版本。
12
+
13
+ 2026-08-25 的只读 Registry 查询显示该名称未公开发布;本机 `npm whoami` 返回 `ENEEDAUTH`。真正发布前必须重新检查名称和登录身份,任何 token 都不能出现在聊天或日志中。
14
+
15
+ ## 2. 为什么是 `0.1.0`
16
+
17
+ - 这是原创实现的首版,不继承第三方版本历史。
18
+ - Harness 基线仍是 `0.1.1-rc.2`,上游接口和 Grok Proxy 契约都可能变化。
19
+ - YukiRyou 受管市场要求根包为纯 `x.y.z`;`0.1.0` 合法,prerelease 不合法。
20
+ - npm 的同一 name/version 一旦发布不可覆盖;所有门禁必须在发布前完成。
21
+
22
+ ## 3. 包结构
23
+
24
+ 预计 tarball 白名单:
25
+
26
+ ```text
27
+ dist/host/*
28
+ dist/client/*
29
+ docs/**/*
30
+ types/*
31
+ grok-provider.patch.yml
32
+ package.json
33
+ README.md
34
+ README.en.md
35
+ CONTRIBUTING.md
36
+ SECURITY.md
37
+ LICENSE
38
+ CHANGELOG.md
39
+ ```
40
+
41
+ 不打包:
42
+
43
+ - `src/`、`tests/`、coverage、fixtures、日志和本机配置。
44
+ - `node_modules`。
45
+ - auth.json、token、真实 prompt/响应和用户路径。
46
+ - symlink、hardlink、socket 或设备文件。
47
+
48
+ `docs/` 与根目录中相互链接的中文默认页 `README.md`、英文版 `README.en.md`、`CONTRIBUTING.md` 和 `SECURITY.md` 一起进入 tarball,使安装后的架构、安全边界、社区维护方式和发布门禁链接保持可读。发布前的证据文档只记录脱敏事实、hash 与固定公开地址,不得包含 token、真实 prompt/响应或用户身份数据。
49
+
50
+ 目标为零普通 runtime dependencies。DSH peer 精确使用 `0.1.1-rc.2`;Cordis `4.0.1`、Schemastery `3.18.1` 由目标桌面 Runtime snapshot 满足。`@deepseek-ai/dsh-subprocess`、settings、commands、connection 和 client UI/locale 等 profile-specific peer 通过 `peerDependenciesMeta.optional: true` 标注,并有 Web/TUI/headless 缺失-peer 测试。插件不打包本地 subprocess 实现。
51
+
52
+ `package.json` 同时固定公开 Registry:
53
+
54
+ ```json
55
+ {
56
+ "publishConfig": {
57
+ "access": "public",
58
+ "registry": "https://registry.npmjs.org/"
59
+ }
60
+ }
61
+ ```
62
+
63
+ 纯 JavaScript 包不设置 npm `os`/`cpu` 字段:npm 这两个列表形成笛卡尔式允许集,不能精确表达“仅 darwin-arm64 与 win32-x64”两个 tuple。实际发布支持矩阵由 Harness/Marketplace 的平台验证字段和运行时 capability check 约束。
64
+
65
+ ## 4. DSH bundle 元数据
66
+
67
+ `package.json` 必须包含实际存在的 patch:
68
+
69
+ ```json
70
+ {
71
+ "dsh": {
72
+ "bundle": {
73
+ "patch": "grok-provider.patch.yml"
74
+ }
75
+ }
76
+ }
77
+ ```
78
+
79
+ patch 路径必须为不含 `..`、绝对路径、反斜线或 NUL 的相对 `.yml`/`.yaml` 路径,长度不超过 240 字节。
80
+
81
+ `package.json.repository.url` 必须与执行 provenance 发布 workflow 的公开 GitHub repository 精确匹配(包括 owner/repo 大小写),再与市场 catalog 的 canonical repository 精确匹配。创建 GitHub 仓库及确定 URL 是发布前独立门禁,不能先填占位值。
82
+
83
+ ## 5. 受管市场约束
84
+
85
+ - 根包为精确稳定版本 `0.1.0`,name/version 与目录一致。
86
+ - 不得 deprecated。
87
+ - root 与完整 `dependencies`/`optionalDependencies` 图无 `preinstall`、`install`、`postinstall`。
88
+ - 每个依赖节点来自 `https://registry.npmjs.org` 并有 SHA-512 integrity。
89
+ - 图预算:256 nodes、深度 16、1024 edges。
90
+ - 单 tarball ≤32 MiB;全图压缩≤128 MiB;解压≤512 MiB;文件≤20,000。
91
+ - 禁止越界路径、大小写冲突、`node_modules`、symlink 和 hardlink。
92
+ - peer 必须由内置 Runtime 或冻结图唯一满足。
93
+
94
+ 零 runtime dependencies 会显著降低这些供应链和平台风险。
95
+
96
+ ## 6. 构建门禁
97
+
98
+ 从干净 checkout:
99
+
100
+ 1. 安装锁定的开发依赖。
101
+ 2. lint、typecheck、unit、integration 和平台测试。
102
+ 3. 构建 Host ESM/CJS 产物、类型声明和 lazy-CJS client。
103
+ 4. `npm pack --dry-run --json` 审查清单。
104
+ 5. 生成唯一候选 tarball并记录 SHA-512。
105
+ 6. 解包审查 identity、exports、peer、scripts、patch 和文件类型。
106
+ 7. 从该 tarball 在临时 Harness profile 安装并执行 Web/TUI smoke。
107
+ 8. 同一个 tarball 在 macOS arm64 运行 verifier-equivalent 检查与安装 smoke;Windows x64 由 CI 完成自动化检查。首次 Windows 真机安装和 production inspector 在 `0.1.0` 发布后针对 Registry 精确版本执行。
108
+
109
+ 候选 tarball 只构建一次,并记录 npm SRI `sha512-<base64>`。预发布 macOS 验收、Windows CI 和 publish job 都必须先验证同一 digest;测试 job 和 publish job 不得重新构建或重新 `npm pack`。发布后的 Windows 首次真机验证必须下载 Registry 的精确 `0.1.0` 并核对同一 SRI。
110
+
111
+ 禁止为不同平台重新打两个内容不同但版本相同的 tarball。
112
+
113
+ ## 7. Git 与版本
114
+
115
+ - 开发分支:`yukiryou/v0.1.0`。
116
+ - `package.json`、CHANGELOG、release notes、Git tag 和 tarball 必须都是 `0.1.0`。
117
+ - 发布提交必须干净且可复现。
118
+ - tag:`v0.1.0`,只在发布提交确定后创建。
119
+ - 受当前全局分支命名策略约束,发布基线使用 `yukiryou/main`;不创建无前缀 `main`,也不直接在发布基线开发或发布未验收内容。
120
+ - 首次仓库当前没有发布基线;验收完成后才创建/保护 `yukiryou/main`。该分支必须 fast-forward 到生成并测试候选 tarball 的同一 release commit,不得在 pack 后再 merge、squash、rebase 或修改文件;`yukiryou/main`、`v0.1.0` 和候选 manifest 记录的 source commit 必须是同一 Git OID。publish job 核对 `GITHUB_SHA` 与候选 SHA-512 后直接发布,禁止重新构建或重新 pack。
121
+
122
+ ## 8. 发布方式
123
+
124
+ 优先从公开 GitHub 仓库的 GitHub-hosted runner 使用 npm provenance 发布。
125
+
126
+ 首次包无法预先配置 staged publishing;需要一次最小权限的首次发布凭据,发布完成后立刻配置 npm Trusted Publisher 并撤销首次凭据。按 2026-08-25 的 npm 官方要求,Trusted Publishing 需要 npm ≥`11.5.1`、Node ≥`22.14.0`、GitHub-hosted runner 和 workflow `id-token: write`;正式发布前再次核对。本机 npm `10.9.7` 不作为发布环境。
127
+
128
+ CI 使用的官方 GitHub Actions 必须固定到已核对的完整 commit SHA;不得依赖可移动 major tag 作为发布门禁实现。
129
+
130
+ 发布经过测试的同一个 tarball:
131
+
132
+ ```sh
133
+ npm publish ./<exact-0.1.0-tarball>.tgz \
134
+ --access public \
135
+ --tag latest \
136
+ --provenance \
137
+ --registry=https://registry.npmjs.org/
138
+ ```
139
+
140
+ scoped 包首次公开发布必须保留 `--access public`。
141
+
142
+ ## 9. 发布后回读
143
+
144
+ 回读 `<name>@0.1.0` 并核对:
145
+
146
+ - name、version、repository。
147
+ - `dist.tarball`、`dist.integrity`、unpacked size、file count。
148
+ - scripts、dependencies、optionalDependencies、peerDependencies。
149
+ - peerDependenciesMeta 与 publishConfig 的 Registry 回读表现。
150
+ - engines、os、cpu 和 `dsh.bundle.patch`。
151
+ - `dist-tags.latest === "0.1.0"`。
152
+
153
+ 从 Registry 重新下载,计算 SRI 并与 `dist.integrity` 及候选 digest 比较;在临时项目安装精确版本、生成 lockfile 后执行 `npm audit signatures`;核对 provenance attestation 的 GitHub repository 与 release commit,不使用 `latest` 安装。
154
+
155
+ ## 10. Marketplace
156
+
157
+ npm 发布不会自动成为受管可安装项。发布后还需要:
158
+
159
+ - DSHFind verified repository backlink;或
160
+ - 加入 YukiRyou curated catalog 的精确 `0.1.0`。
161
+
162
+ 优先先通过公开 GitHub repository backlink 形成 DSHFind candidate,避免“尚无 candidate 因而无法受管安装、尚未受管安装因而不能进 curated”的循环。Registry 回读完成后,在 Windows x64 的生产 inspector 上对精确 `0.1.0` 完成首次 `artifact-verified`、安装、重启、浏览器登录、聊天、工具调用和重新认证;完成前必须保留“代码支持、真机未验证”标识。
163
+
164
+ curated 条目只在上述验证通过后添加。当前 catalog schema 只记录:
165
+
166
+ - UTC `testedAt`。
167
+ - Harness `0.1.1-rc.2`。
168
+ - `darwin-arm64` 和 `win32-x64`。
169
+
170
+ 从 `0.1.1` 起,常规发版不再要求重复 macOS/Windows 真机 smoke。每次仍须通过两平台 CI、协议与安全测试、干净 profile 安装、确定性 tarball 和 Registry integrity/provenance 回读。涉及认证、官方 CLI、Harness subprocess seam 或平台安全策略的变更应安排定向真机复核,但默认不是发版阻断项。
171
+
172
+ macOS x64 不在当前官方 Grok CLI 支持矩阵,不进入 `0.1.0` catalog 或发布承诺。npm SHA-512 作为 release evidence 保存;它不是当前 curated schema 字段,市场会从 Registry `dist.integrity` 自行验证 SHA-512。
173
+
174
+ 发布证据还必须固定精确 Grok CLI 版本、官方 tag/commit、可用的 `SOURCE_REV`,以及同版本 auth flow、auth schema、支持平台和 Proxy 文档永久链接;不得只引用 mutable `main`。
175
+
176
+ ## 11. 失败与回滚
177
+
178
+ - 发布前失败:修复后重建新 tarball,旧候选不发布。
179
+ - 发布后发现问题:不能覆盖 `0.1.0`;从 catalog 撤下并发布递增版本,例如 `0.1.1`。
180
+ - 对已知有问题的版本执行 `npm deprecate` 并在公告中说明;撤下 catalog 不会删除用户已安装或缓存的 `0.1.0`。
181
+ - 不依赖 unpublish 复用版本号。
182
+ - 凭据或 token 泄漏时立即停止分发、撤销相关凭据、发布安全公告并轮换发布权限。
@@ -0,0 +1,76 @@
1
+ # 开发前决策门
2
+
3
+ 状态:**已确认(2026-08-25)**
4
+
5
+ 仓库所有者已接受“官方 CLI 及其有效配置为信任边界,并按推荐路线开发”。2026-08-26 进一步确认:`0.1.0` 的 Windows x64 真机验证移到首次发布后;`0.1.1` 及后续版本不再把重复真机验证作为常规发版门禁。发布审计、自动化平台矩阵和制品校验仍不可跳过。
6
+
7
+ 2026-08-26 仓库所有者把认证要求收敛为“能跳转浏览器登录即可”;ADR-0005 取代 ADR-0003 的双认证设计。动态全模型目录仍以 ADR-0004 为准。
8
+
9
+ ## 推荐决策
10
+
11
+ ### 1. 登录体验
12
+
13
+ 采用:Web 设置页按钮和 TUI `/grok login` 从 Harness 发起登录。
14
+
15
+ Host 通过 Harness `ctx.subprocess` 以固定 argv 启动经路径/版本约束的 `grok login --oauth`;插件这一启动层不经过 shell。官方 CLI 打开浏览器并持久化自己的 token,插件不实现第二套 OAuth client 或凭据库。
16
+
17
+ 必须同时接受:`--oauth` 只固定 loopback transport,官方 CLI 当前没有 builtin-only/no-config 开关。它仍可能按用户、system 或 MDM 的有效配置执行 external auth command(内部可用 `sh -c`/`cmd /C`)、devbox 或企业 OIDC。本项目把“官方 CLI + 它的有效配置”作为用户管理的信任边界,只承诺插件自身不启动 shell。`0.1.0` 只支持标准 xAI 浏览器路径:已知环境型 external/enterprise override 在 spawn 前拒绝;磁盘/MDM 配置不能可靠预判,官方 CLI 仍可能先执行它们;登录后只有与绑定版本生产 OIDC schema 相符的候选可进入插件 transport。本地未签名 metadata 不是密码学来源证明。
18
+
19
+ ### 2. 推理传输
20
+
21
+ 采用:Host 有界只读官方 `~/.grok/auth.json`,选择唯一且与精确 CLI 版本的 xAI 生产 OIDC schema 相符的候选,再请求 xAI 官方文档公开的固定 CLI Chat Proxy。禁止自定义 endpoint、schema 不符凭据和重定向;真实 token 仍由 xAI Proxy 服务端验证。
22
+
23
+ ### 3. 首版范围
24
+
25
+ 采用:动态发现账号可用的全部 Grok Build 模型,并支持文本、reasoning、流式输出、usage 和 Harness 工具调用;能力只能依据真实协议声明/验证。
26
+
27
+ 延期:Web/X Search、图片输入、图片生成、任意下载、API Key、多账号、企业 OIDC、ACP、Headless 和 Linux 发布承诺。
28
+
29
+ ### 4. 发布身份
30
+
31
+ 采用并冻结:`dsh-grok-provider@0.1.0`。npm 页面通过发布账户、maintainers 与 provenance 关联维护者;Host、client bundle、patch 与 provenance 必须使用这一精确身份。
32
+
33
+ ### 5. 发布门禁
34
+
35
+ 采用:协议 spike、全部安全测试、macOS arm64 预发布真实 smoke、Windows x64 自动化矩阵、服务条款复核和 npm provenance 发布链配置通过后,才允许发布 `0.1.0`。发布后必须完成 provenance attestation、Registry 回读和 Windows x64 首次生产 inspector/真机验收;完成前对 Windows 明确标注“代码支持、真机未验证”。`0.1.1` 及后续版本以两平台 CI、契约、干净安装和制品校验替代重复真机门禁。
36
+
37
+ ## 需要明确接受的代价
38
+
39
+ - 用户必须先从 xAI 官方渠道安装 Grok Build CLI。
40
+ - 插件会以 Harness Host 当前 OS 用户权限启动一个严格窄化的官方 CLI 子进程;该 CLI 可访问此用户的 Grok 配置与凭据,必须接受并测试这一新信任边界。
41
+ - 官方 login 可能先清除旧 credential;取消或失败也可能使共享会话失效。logout 会影响所有共享同一 `GROK_HOME` 的应用,因此 UI 必须提示并对 logout 二次确认。
42
+ - 官方 CLI 的 proxy、managed-config sync 与已启用遥测不受插件固定推理 transport 约束,需单独披露。
43
+ - Harness rc.2 的 Web `loopback` RPC 只提供浏览器 Origin/Fetch-Metadata reachability fence,不认证本机进程。按钮与 logout 二次确认是防误操作 UX;同一 OS 用户下的本地进程属于信任边界,若不能接受则 `0.1.0` 只能取消 Web login/logout、保留 TUI。
44
+ - 官方 CLI 文件本身含 refresh token,Host 原始读取会短暂接触其字节但不得使用、复制或写回。
45
+ - 首版浏览器登录面向本机 macOS/Windows 桌面会话;远程 Web/headless 不在承诺内。
46
+ - 首版功能刻意少于部分第三方插件,以消除搜索、生图和任意 URL 下载带来的风险。
47
+ - CLI Chat Proxy 和凭据文件是可变化的上游契约;未知版本或结构必须失败关闭。
48
+ - macOS x64 不在当前官方 CLI 支持矩阵;`0.1.0` 发布承诺为 macOS arm64 与 Windows x64。
49
+
50
+ ## 尚未解决但不阻碍方案确认的事项
51
+
52
+ - 首个开发绑定版本已冻结为 `1.0.5`(build `5115b46bc909`),详见 `08-upstream-cli-1.0.5-evidence.md`。其 macOS 官方下载物当前无法通过严格代码签名验证,仍是发布阻断项。
53
+ - npm 登录身份与冻结名称在发布时仍可用:发布前确认。
54
+ - canonical GitHub repository URL:已冻结为 `https://github.com/yoshino-xiao7/dsh-grok-provider`,并用于 `package.json.repository`、provenance workflow 和发布脚手架。
55
+ - xAI 服务条款/官方许可的最终发布复核。
56
+
57
+ 仓库所有者已明确要求继续公开发布,并接受当前 CLI 契约/服务条款没有第三方 adapter 明确支持依据的残余风险。发布仍必须通过制品、CI、provenance 和 Registry 回读门禁。
58
+
59
+ ## 确认语句
60
+
61
+ 如果同意以上五项推荐决策,可回复:
62
+
63
+ ```text
64
+ 确认接受官方 CLI 及其有效配置为信任边界,并按推荐路线开发
65
+ ```
66
+
67
+ 确认后按以下顺序动工:
68
+
69
+ 1. 登录与 Chat Proxy 协议 spike。
70
+ 2. 建立测试脚手架,先写安全与契约测试。
71
+ 3. 实现 Host 深模块、TUI 命令和 Web 设置页。
72
+ 4. macOS/Windows 与 Harness rc.2 集成验证。
73
+ 5. 打包审计。
74
+ 6. 满足发布门禁后发布精确 npm `0.1.0` 并回读。
75
+
76
+ 在收到确认前,仓库保持 docs-only。
@@ -0,0 +1,98 @@
1
+ # Grok CLI 1.0.5 上游契约证据
2
+
3
+ 状态:**开发绑定,尚未通过发布门禁**
4
+ 核验日期:2026-08-25(Asia/Shanghai)
5
+
6
+ ## 1. 精确版本
7
+
8
+ - 官方 stable 指针:`1.0.5`。
9
+ - 本机输出:`grok 1.0.5 (5115b46bc909)`。
10
+ - 首个开发 allowlist:只包含精确版本 `1.0.5` 与 build `5115b46bc909`;任何其他输出失败关闭,增补版本必须重新跑完整契约与真机门禁。
11
+ - 本机安装路径:默认 `~/.grok/bin/grok` 相对链接到 `../downloads/grok-macos-aarch64`。插件仍只支持默认路径;官方安装器支持 `GROK_BIN_DIR` 不代表插件必须接受自定义可执行路径。
12
+
13
+ ## 2. 分发完整性现状
14
+
15
+ - `https://x.ai/cli/grok-1.0.5-macos-aarch64` 与安装脚本声明的 GCS fallback 逐字节相同。
16
+ - 两者 SHA-256 都是 `3dfa7f04fbb5427a8fbead286591543aaecb478b3a0ab222c4329eca1a3b2f86`。
17
+ - 官方路径未发现 `.sha256`、`.sha256sum` 或 `.sig` sidecar;本地记录的哈希只能用于复现实验,不能证明发布者身份。
18
+ - Mach-O 嵌入指定要求含 Team ID `5Y6N3AJ54S`,但重新下载且尚未执行的 CDN/GCS 副本以及本机安装副本均未通过 `codesign --verify --strict`,错误为 `invalid signature (code or signature have been modified)`。
19
+ - 因此当前不得把 macOS 签名描述为“已验证”,也不得把插件的路径、owner、版本检查包装成 publisher verification。该异常是发布阻断项;开发可继续,但 `0.1.0` 发布前必须由 xAI 修复或提供可验证的官方完整性机制,并重新记录证据。
20
+
21
+ ## 3. 登录命令
22
+
23
+ `grok login --help` 确认 `1.0.5` 支持:
24
+
25
+ - `--oauth`:经 `auth.x.ai` 的 Grok OAuth;
26
+ - `--device-auth`:远程/headless 设备码;
27
+ - `--debug`、`--debug-file`、`--leader-socket`。
28
+
29
+ 本插件只调用固定 argv `[constrainedExecutable, "login", "--oauth"]`,不传 debug 文件、leader socket 或设备码参数。
30
+
31
+ ## 4. 真实凭据 schema(脱敏结构检查)
32
+
33
+ 本机浏览器授权后的 `~/.grok/auth.json`:
34
+
35
+ - 权限为 `0600`,当前大小 1730 bytes;
36
+ - 顶层只有一条记录;map key 精确匹配 `https://auth.x.ai::b1a00492-073a-47ea-816f-4c329264a828`;
37
+ - 记录字段包含 `key`、`auth_mode`、`create_time`、`user_id`、`email`、`first_name`、`profile_image_asset_id`、`principal_type`、`principal_id`、`team_id`、`coding_data_retention_opt_out`、`refresh_token`、`expires_at`、`oidc_issuer`、`oidc_client_id`。
38
+
39
+ 核验过程只输出字段名、类型、字符串长度和 scope 是否命中,未输出任何字段值。实现只需要 `key`、`auth_mode`、`expires_at`、`oidc_issuer`、`oidc_client_id` 与顶层 scope;身份字段不得进入状态、日志或诊断。
40
+
41
+ ## 5. refresh token 风险更正
42
+
43
+ 直接读取该 JSON 文件意味着 Host 进程读到的原始字节包含 refresh token,即使解析器不使用该字段。原先“插件不掌握 refresh token”的绝对表述不成立。
44
+
45
+ 实现约束:
46
+
47
+ - 使用有界、一次性读取;不缓存原始文本或完整对象;
48
+ - 解析后立即只保留闭合校验所需元数据和 access token lease,显式忽略 refresh token 与全部身份字段;
49
+ - 不把原始文本/异常、字段值或 token 放入日志、错误、设置、测试快照或诊断包;
50
+ - 插件不执行 refresh grant、不写回 `auth.json`;失效后可启动固定、受控的 `grok models`,由官方 CLI 使用其 refresh token 并原子更新文件,插件只重读和重新校验;
51
+ - 这只是缩短暴露窗口,不是进程级秘密隔离。发布说明必须披露 Host 会短暂读取含 refresh token 的文件内容。
52
+
53
+ 若后续官方 CLI 提供只返回短期 access token 的受支持 broker 接口,应优先迁移并新增 ADR;在此之前这是已接受路线新增的 P0 审计面。
54
+
55
+ ## 6. 尚待绑定
56
+
57
+ - `auth_mode`、issuer、client ID 的精确值关系(只通过常量比较验证,不在日志中打印用户记录值)。
58
+ - access token 到固定 Chat Proxy 的最小请求/流事件契约与 refresh 行为。
59
+ - Windows x64 官方 artifact 的哈希、Authenticode 与真实登录结构。
60
+ - xAI 对第三方本地适配器读取此凭据并调用 CLI Chat Proxy 的公开支持/许可依据。
61
+
62
+ ## 7. 真实模型目录与 Responses 流
63
+
64
+ 2026-08-26 使用本机已授权会话对固定 `GET https://cli-chat-proxy.grok.com/v1/models` 做了脱敏只读探测:
65
+
66
+ - HTTP 200,`application/json`,顶层 `{ object, data }`;
67
+ - `grok-4.6`:500000 context,backend `responses`,reasoning efforts 为 `xhigh|high|medium|low`,默认 `high`;
68
+ - `grok-4.5`:500000 context,backend `responses`,reasoning efforts 为 `high|medium|low`,默认 `high`。
69
+
70
+ 随后用不含用户数据的最小 prompt 对 `grok-4.6` 做真实 `POST /v1/responses` 流探测:
71
+
72
+ - 缺少 `x-grok-client-version` 时返回 HTTP 426;
73
+ - 使用 `X-XAI-Token-Auth: xai-grok-cli`、`x-grok-client-version: 1.0.5` 与诚实的 `x-grok-client-identifier: dsh-grok-provider` 返回 HTTP 200;无需且不得冒充 `grok-shell`;
74
+ - 响应为 `text/event-stream`,观察到 Responses API 的 created/in-progress、reasoning summary part/text、output item、content part、output text 与 completed 事件;
75
+ - `grok-4.5` 使用相同诚实 headers 的最小流也返回 HTTP 200;当前真实目录中的两个模型都已完成基础调用 smoke;
76
+ - `grok-4.6` 的无副作用强制 fixture function call 返回 `function_call` item、`response.function_call_arguments.delta/done` 与 completed usage,确认 `item.id` 用于流关联而 `call_id` 用于 Harness 工具结果关联;
77
+ - 检查只保存事件名、字段名、状态和字节数,未保存 token、身份、prompt 内容或模型输出内容。
78
+
79
+ 因此旧的固定 Chat Completions 假设已撤回。当前真实目录的两个模型都必须走 Responses codec;其他 backend 只有完成同等级协议与真机门禁后才能计入“全部模型支持”。
80
+
81
+ ## 8. 当前 clean-room 实现真机回归
82
+
83
+ 2026-08-26 在 macOS arm64 上直接运行本仓库的 credential loader、动态 catalog、固定 transport、Responses request encoder、SSE parser 与 Harness chunk codec;未经过第三方插件,也未输出 token、提示内容或回复内容。
84
+
85
+ - `/v1/models` 返回并成功映射 `grok-4.6`、`grok-4.5`。
86
+ - 两个模型均接受 `store:false` 与 `include:["reasoning.encrypted_content"]`,并完整产生 reasoning block、text block、usage 和 terminal finish。
87
+ - 两个模型返回的 reasoning item 都含非空 `encrypted_content`。当前实现把它按 Harness `ReplayEnvelope.blocks` 与内容块对齐保存,并在同一 provider、同一 model、版本与块数均匹配时恢复为下一轮 native reasoning input;两个模型的真实第二轮请求均成功。探测只记录字段名、类型、长度和 chunk 计数,未打印或保存密文。
88
+ - 两个模型均在同一 fake、未执行的 `fixture_tool` smoke 中恰好产生一个可解析 function call;name 与 JSON arguments 经当前 codec 校验通过。
89
+ - `grok-4.6` 的 `max_output_tokens:16` 真机探测以 `response.incomplete` 和 `max_output_tokens` 原因结束;当前 codec 对截断 text 合成闭合 block,并映射为 Harness `max-tokens` finish。截断 tool arguments 仍失败关闭。
90
+ - 当前实现因此覆盖本账号在该时点可见的全部模型;生产仍以动态目录为准,未来出现未知 backend 时失败关闭而不是猜测协议。
91
+
92
+ 该回归只完成 macOS 上的官方 CLI credential 路径。它不替代 Harness 受管安装与浏览器登录验收,也不替代 `0.1.0` 发布后的 Windows x64 首次真机验证。
93
+
94
+ ## 9. 已放弃的自管 OAuth 路线
95
+
96
+ 2026-08-26 重新读取 `https://auth.x.ai/.well-known/openid-configuration`:issuer 公开 Device Authorization、refresh、revoke、PKCE 和 `none` client authentication,但没有 `registration_endpoint`。同日官方 `https://docs.x.ai/sitemap.xml` 中也没有 OAuth 应用注册或第三方 public client 申请页面。
97
+
98
+ 这只能证明“协议能力存在、公开自助注册入口未发现”,不能推导任意 client ID 获得授权。ADR-0005 因而删除自管状态机、持久化、轮换和注销实现;`0.1.0` 不再等待独立 client ID,也不得复制官方 CLI client ID 或让用户输入第三方 client ID。
@@ -0,0 +1,37 @@
1
+ # 当前实现与发布阻断项
2
+
3
+ 状态日期:2026-08-26
4
+ 目标包:`dsh-grok-provider@0.1.0`
5
+ 开发分支:`yukiryou/v0.1.0`
6
+
7
+ ## 已实现
8
+
9
+ - 原创 Host provider、固定 Grok Build transport、动态账号模型目录和严格 Responses SSE codec。
10
+ - 文本、reasoning、usage、`stop|tool-calls|max-tokens`、函数调用/结果、多轮历史和加密 reasoning replay。
11
+ - 官方 CLI 单路径:固定默认路径、精确 `1.0.5 (5115b46bc909)`、受控 cwd/环境、固定 argv、无 shell spawn、10 秒准备期限、5 分钟登录期限、2 分钟退出期限、整棵进程树取消与异步卸载等待;`grok login --oauth` 负责打开浏览器和持久化 token,CLI 退出 0 后插件再次校验生产 OIDC credential schema。
12
+ - 包中不存在独立 OAuth client identity、device flow、插件实现的 refresh/revoke、Harness credential grant 或模式选择接口;过期 access token 只通过 single-flight、30 秒有界的官方 CLI `models` 命令续期,插件不提取 refresh token、不执行 refresh grant、不写凭据文件。ADR-0003 已由 ADR-0005 取代。
13
+ - Web:Harness settings section、中文/英文、loopback-only RPC、登录状态轮询、陈旧 session 防护、取消和二次退出确认;新增参考 Harness 信息层级的账户卡、真实 billing 周期/重置时间和动态模型 capability 卡。完整类型化周期可恢复 proto3 省略的零使用率,其他缺失百分比仍显示未知;renderer 不接触 token 或 identity。
14
+ - TUI:闭合 `/grok status|login|cancel|logout` grammar,`recordInput:false`,不输出 CLI 原文或 token。
15
+ - 发布构建:`src`、测试和 spike 不进入 tarball;`dist`、类型、bundle patch 与发行文档由确定性脚本生成。`prepack` 强制重建 `dist`,避免直接 `npm pack`/`npm publish` 带入陈旧产物。零普通 runtime dependencies。
16
+
17
+ ## 已验证
18
+
19
+ - Node 完整构建/测试通过:57 项,55 pass、0 fail、2 项 Windows-only 在 macOS 按预期跳过并由 CI matrix 承接。
20
+ - `npm audit --omit=dev`:0 vulnerability。
21
+ - 新认证接口的本地候选已安装到隔离的 Harness `0.1.1-rc.2` TUI/Web profile。真实 TUI 的缺失凭据 `unavailable`、`/grok login` 浏览器跳转、官方 CLI 登录成功和有效凭据 `ready` 均通过。真实 Web 的 client bundle 发现、Grok 设置页、登录启动/取消、Host 重启和临时 profile 卸载均通过;rc.2 scanner 所需的 `./package.json` 导出已加入回归测试。
22
+ - Web/TUI 的 `available` 现在实际验证官方 credential contract,不再把 credential source 已注册误报为 ready;缺失凭据的真机 Web/TUI 双向验证通过。
23
+ - macOS arm64 使用当前 clean-room 代码和本机官方 credential,动态发现 `grok-4.6`、`grok-4.5`;两个模型的首轮流、加密 reasoning 第二轮续接、usage、finish 和 fixture function call 均通过。
24
+ - `max_output_tokens` 真机返回 `response.incomplete/max_output_tokens`,已映射为 Harness `max-tokens`。
25
+ - macOS 隔离 Harness Web profile 已从当前 `dsh-grok-provider@0.1.0` tarball 安装并验证:设置页真实显示登录状态、`grok-4.6`/`grok-4.5` 上下文与推理档位、流式/tool capability、每周周期和重置时间;手动刷新通过。当前真实账号的 CLI Proxy JSON 省略百分比,而同周期官方移动端显示 `0% 已使用`;解析器现按完整类型化周期恢复为 `0% 已使用 / 100% 剩余`。
26
+
27
+ ## 发布阻断项
28
+
29
+ 以下任何一项未关闭都不得执行 `npm publish`:
30
+
31
+ 1. **已接受的上游残余风险**:官方 macOS `1.0.5` 下载物当前无法通过严格代码签名验证,也没有可验证 sidecar signature/checksum;xAI 也没有为第三方本地 adapter 使用 Grok Build session credential 与 CLI Chat Proxy 提供明确支持依据。仓库所有者已明确要求继续公开发布并承担该风险。
32
+ 2. **发布身份**:公开 canonical repository 已冻结为 `https://github.com/yoshino-xiao7/dsh-grok-provider`;仍需让 GitHub publish workflow 获得最小权限的首次 npm 发布凭据,发布后配置 Trusted Publisher 并撤销首次凭据。
33
+ 3. **精确候选与回读**:发布前由 macOS 验收、Windows CI 和 publish job 核验同一个 tarball SHA-512;发布后回读 Registry integrity、attestation 和精确版本安装。
34
+
35
+ Windows x64 真机不再是 `0.1.0` 预发布阻断项。首次发布后必须从 Registry 安装精确 `0.1.0`,完成官方安装物 Authenticode/hash、浏览器登录、取消/超时/卸载、动态全部模型、聊天、reasoning replay、工具调用和 production inspector;完成前对 Windows 保持“代码支持、真机未验证”标识。`0.1.1` 及后续版本不要求重复真机验证,以两平台 CI、契约测试、干净安装和制品校验作为常规门禁。
36
+
37
+ 当前结论是“核心实现可继续审计与集成”,不是“已具备发布条件”。