benchgo-plugin 0.0.0-stage → 0.0.2

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 (180) hide show
  1. package/DEEPSEEK-LICENSE +21 -0
  2. package/LICENSE +21 -0
  3. package/NOTICE +17 -0
  4. package/PASEO-LICENSE +211 -0
  5. package/README.md +256 -2
  6. package/TOOL-CONFIG.md +33 -0
  7. package/VERIFICATION.md +297 -0
  8. package/assets/fonts/README.md +13 -0
  9. package/assets/fonts/manifest.json +437 -0
  10. package/assets/fonts/web/fangyuan-latin-238bc49130b1.woff2 +0 -0
  11. package/assets/fonts/web/fangyuan-u30-0fe8d99641c3.woff2 +0 -0
  12. package/assets/fonts/web/fangyuan-u32-202a573131a1.woff2 +0 -0
  13. package/assets/fonts/web/fangyuan-u4e-cc2f8b20be49.woff2 +0 -0
  14. package/assets/fonts/web/fangyuan-u4f-9189b5f2d321.woff2 +0 -0
  15. package/assets/fonts/web/fangyuan-u50-e2560e003872.woff2 +0 -0
  16. package/assets/fonts/web/fangyuan-u51-a9c5e7a8c7c4.woff2 +0 -0
  17. package/assets/fonts/web/fangyuan-u52-0cfd00b473c8.woff2 +0 -0
  18. package/assets/fonts/web/fangyuan-u53-18122a07f60a.woff2 +0 -0
  19. package/assets/fonts/web/fangyuan-u54-8ca41aa9cff2.woff2 +0 -0
  20. package/assets/fonts/web/fangyuan-u55-7bd55e14647e.woff2 +0 -0
  21. package/assets/fonts/web/fangyuan-u56-26f093e8a810.woff2 +0 -0
  22. package/assets/fonts/web/fangyuan-u57-36bde83a8378.woff2 +0 -0
  23. package/assets/fonts/web/fangyuan-u58-d1df14217098.woff2 +0 -0
  24. package/assets/fonts/web/fangyuan-u59-4e41ab22c51a.woff2 +0 -0
  25. package/assets/fonts/web/fangyuan-u5a-746a367174e6.woff2 +0 -0
  26. package/assets/fonts/web/fangyuan-u5b-3d1dd404d70c.woff2 +0 -0
  27. package/assets/fonts/web/fangyuan-u5c-fe0a273f69e7.woff2 +0 -0
  28. package/assets/fonts/web/fangyuan-u5d-af1f0a1c8d2d.woff2 +0 -0
  29. package/assets/fonts/web/fangyuan-u5e-598c65420e17.woff2 +0 -0
  30. package/assets/fonts/web/fangyuan-u5f-a92eaaa5265a.woff2 +0 -0
  31. package/assets/fonts/web/fangyuan-u60-48ee3d26462d.woff2 +0 -0
  32. package/assets/fonts/web/fangyuan-u61-7a57f35bc077.woff2 +0 -0
  33. package/assets/fonts/web/fangyuan-u62-d2d0b7b36631.woff2 +0 -0
  34. package/assets/fonts/web/fangyuan-u63-cade7c6635e6.woff2 +0 -0
  35. package/assets/fonts/web/fangyuan-u64-ed34e40d7f65.woff2 +0 -0
  36. package/assets/fonts/web/fangyuan-u65-e13e83e69c38.woff2 +0 -0
  37. package/assets/fonts/web/fangyuan-u66-1dbcfa5da147.woff2 +0 -0
  38. package/assets/fonts/web/fangyuan-u67-6b0a26b82da6.woff2 +0 -0
  39. package/assets/fonts/web/fangyuan-u68-1b8217cfceed.woff2 +0 -0
  40. package/assets/fonts/web/fangyuan-u69-673e63627790.woff2 +0 -0
  41. package/assets/fonts/web/fangyuan-u6a-3c94008a4640.woff2 +0 -0
  42. package/assets/fonts/web/fangyuan-u6b-44572c410fa0.woff2 +0 -0
  43. package/assets/fonts/web/fangyuan-u6c-1b323b366e88.woff2 +0 -0
  44. package/assets/fonts/web/fangyuan-u6d-cbc376d6fe3f.woff2 +0 -0
  45. package/assets/fonts/web/fangyuan-u6e-7f7e211e2fee.woff2 +0 -0
  46. package/assets/fonts/web/fangyuan-u6f-ff280ce052fa.woff2 +0 -0
  47. package/assets/fonts/web/fangyuan-u70-cb727eaf73b6.woff2 +0 -0
  48. package/assets/fonts/web/fangyuan-u71-0bb1747439fe.woff2 +0 -0
  49. package/assets/fonts/web/fangyuan-u72-cccd39590d69.woff2 +0 -0
  50. package/assets/fonts/web/fangyuan-u73-e67705133584.woff2 +0 -0
  51. package/assets/fonts/web/fangyuan-u74-03a4e7ac9df5.woff2 +0 -0
  52. package/assets/fonts/web/fangyuan-u75-a2d30b327e65.woff2 +0 -0
  53. package/assets/fonts/web/fangyuan-u76-c08fe029c988.woff2 +0 -0
  54. package/assets/fonts/web/fangyuan-u77-76f03be1f4cb.woff2 +0 -0
  55. package/assets/fonts/web/fangyuan-u78-5b721deaf582.woff2 +0 -0
  56. package/assets/fonts/web/fangyuan-u79-db7713c2eda4.woff2 +0 -0
  57. package/assets/fonts/web/fangyuan-u7a-3e40d3726a09.woff2 +0 -0
  58. package/assets/fonts/web/fangyuan-u7b-a8204d1c9dba.woff2 +0 -0
  59. package/assets/fonts/web/fangyuan-u7c-89bcdae046de.woff2 +0 -0
  60. package/assets/fonts/web/fangyuan-u7d-bcc45fa6351a.woff2 +0 -0
  61. package/assets/fonts/web/fangyuan-u7e-49fab96d9269.woff2 +0 -0
  62. package/assets/fonts/web/fangyuan-u7f-dc110e1ecbf3.woff2 +0 -0
  63. package/assets/fonts/web/fangyuan-u80-c5ce9be0335e.woff2 +0 -0
  64. package/assets/fonts/web/fangyuan-u81-b026091b3779.woff2 +0 -0
  65. package/assets/fonts/web/fangyuan-u82-a7c6960e875d.woff2 +0 -0
  66. package/assets/fonts/web/fangyuan-u83-4b7d1c2c50d4.woff2 +0 -0
  67. package/assets/fonts/web/fangyuan-u84-4119128100c8.woff2 +0 -0
  68. package/assets/fonts/web/fangyuan-u85-ca43dd4c5411.woff2 +0 -0
  69. package/assets/fonts/web/fangyuan-u86-54fc0e3158fb.woff2 +0 -0
  70. package/assets/fonts/web/fangyuan-u87-b64f5eb55720.woff2 +0 -0
  71. package/assets/fonts/web/fangyuan-u88-00feb1251f08.woff2 +0 -0
  72. package/assets/fonts/web/fangyuan-u89-db419435b316.woff2 +0 -0
  73. package/assets/fonts/web/fangyuan-u8a-06c11d45fb87.woff2 +0 -0
  74. package/assets/fonts/web/fangyuan-u8b-5c2f6fda436a.woff2 +0 -0
  75. package/assets/fonts/web/fangyuan-u8c-2b46d2d1f4cc.woff2 +0 -0
  76. package/assets/fonts/web/fangyuan-u8d-1a67d064000d.woff2 +0 -0
  77. package/assets/fonts/web/fangyuan-u8e-eb87baf0091c.woff2 +0 -0
  78. package/assets/fonts/web/fangyuan-u8f-96c1f0632da6.woff2 +0 -0
  79. package/assets/fonts/web/fangyuan-u90-86752dba8cbe.woff2 +0 -0
  80. package/assets/fonts/web/fangyuan-u91-0573b8548552.woff2 +0 -0
  81. package/assets/fonts/web/fangyuan-u92-f85ecf735974.woff2 +0 -0
  82. package/assets/fonts/web/fangyuan-u93-e7e0451735db.woff2 +0 -0
  83. package/assets/fonts/web/fangyuan-u94-f3957ff98bcd.woff2 +0 -0
  84. package/assets/fonts/web/fangyuan-u95-b31129d29013.woff2 +0 -0
  85. package/assets/fonts/web/fangyuan-u96-ca7f779c2c13.woff2 +0 -0
  86. package/assets/fonts/web/fangyuan-u97-100a25198b2c.woff2 +0 -0
  87. package/assets/fonts/web/fangyuan-u98-59e4b784a94f.woff2 +0 -0
  88. package/assets/fonts/web/fangyuan-u99-d35af6e30868.woff2 +0 -0
  89. package/assets/fonts/web/fangyuan-u9a-1eb6f7cdfcfe.woff2 +0 -0
  90. package/assets/fonts/web/fangyuan-u9b-8f428d81dcbb.woff2 +0 -0
  91. package/assets/fonts/web/fangyuan-u9c-e10f7f8f0274.woff2 +0 -0
  92. package/assets/fonts/web/fangyuan-u9e-2be65003b759.woff2 +0 -0
  93. package/assets/fonts/web/fangyuan-u9f-02c3d5224fdb.woff2 +0 -0
  94. package/assets/fonts/web/fangyuan-ufb-3eaee54bc476.woff2 +0 -0
  95. package/assets/fonts/web/fangyuan-ufe-f64da8a3acce.woff2 +0 -0
  96. package/assets/fonts/web/fangyuan-uff-0a6dcfb689fd.woff2 +0 -0
  97. package/client/assets/iconsax/LICENSE +16 -0
  98. package/client/assets/iconsax/SOURCE.md +14 -0
  99. package/config/routergo-deepseek.example.yml +25 -0
  100. package/config.example.json +24 -0
  101. package/cordis.patch.yml +5 -0
  102. package/lib/LINK-THIRD-PARTY-LICENSES.txt +1197 -0
  103. package/lib/client.js +3577 -0
  104. package/lib/link-web/app.css +92 -0
  105. package/lib/link-web/app.js +599 -0
  106. package/lib/link-web/index.html +1 -0
  107. package/lib/link-web/workbench.js +118 -0
  108. package/lib/link.mjs +244 -0
  109. package/lib/relay/ip-certificate.mjs +559 -0
  110. package/lib/relay/relay.example.json +8 -0
  111. package/lib/relay/run-relay-server.cjs +4100 -0
  112. package/lib/server/bootstrap.mjs +147 -0
  113. package/lib/server/bootstrap.sh +39 -0
  114. package/lib/server/manifest.json +8 -0
  115. package/lib/server/server-seed.tar.gz +0 -0
  116. package/locale/en.json +6 -0
  117. package/locale/zh-CN.json +6 -0
  118. package/openapi.json +629 -0
  119. package/package.json +104 -4
  120. package/shared/plugin-install.mjs +198 -0
  121. package/shared/tool-quick-settings.mjs +70 -0
  122. package/shared/update-feed.mjs +191 -0
  123. package/shared/update-public-key.pem +3 -0
  124. package/src/cli.mjs +102 -0
  125. package/src/commands.mjs +17 -0
  126. package/src/delegation.mjs +47 -0
  127. package/src/fonts.mjs +17 -0
  128. package/src/harness-adapter.mjs +228 -0
  129. package/src/harness-commands.mjs +39 -0
  130. package/src/harness-selection.mjs +5 -0
  131. package/src/harness-usage.mjs +31 -0
  132. package/src/isolated-launch.mjs +22 -0
  133. package/src/line-process.mjs +114 -0
  134. package/src/link-plugin.mjs +21 -0
  135. package/src/mcp.mjs +21 -0
  136. package/src/model-providers.mjs +125 -0
  137. package/src/models.mjs +37 -0
  138. package/src/native-auth.mjs +32 -0
  139. package/src/picker-catalog.mjs +82 -0
  140. package/src/plugin.mjs +138 -0
  141. package/src/projects.mjs +96 -0
  142. package/src/provider-access.mjs +11 -0
  143. package/src/providers/acp.mjs +138 -0
  144. package/src/providers/claude.mjs +115 -0
  145. package/src/providers/codex.mjs +134 -0
  146. package/src/providers/opencode.mjs +138 -0
  147. package/src/providers/pi-permissions.ts +24 -0
  148. package/src/providers/pi.mjs +97 -0
  149. package/src/questions.mjs +34 -0
  150. package/src/recent-workspace.mjs +36 -0
  151. package/src/runtime.mjs +421 -0
  152. package/src/session-routes.mjs +89 -0
  153. package/src/store.mjs +98 -0
  154. package/src/tool-catalog.mjs +22 -0
  155. package/src/tool-config.mjs +94 -0
  156. package/src/tool-install.mjs +31 -0
  157. package/src/tool-profiles.mjs +114 -0
  158. package/src/tooling.mjs +90 -0
  159. package/src/updates.mjs +156 -0
  160. package/src/usage-import-parsers.mjs +37 -0
  161. package/src/usage-import.mjs +114 -0
  162. package/src/usage-timeline.mjs +36 -0
  163. package/src/usage.mjs +142 -0
  164. package/src/web.mjs +274 -0
  165. package/voice/README.md +49 -0
  166. package/voice/STREAMING.md +141 -0
  167. package/voice/VERIFICATION.md +36 -0
  168. package/voice/client/audio-worklet.js +35 -0
  169. package/voice/locale/en.json +1 -0
  170. package/voice/locale/zh-CN.json +1 -0
  171. package/voice/src/asr.mjs +44 -0
  172. package/voice/src/calls.mjs +37 -0
  173. package/voice/src/config.mjs +139 -0
  174. package/voice/src/media.mjs +70 -0
  175. package/voice/src/plugin.mjs +10 -0
  176. package/voice/src/realtime-protocols.mjs +30 -0
  177. package/voice/src/realtime-socket.mjs +86 -0
  178. package/voice/src/realtime.mjs +130 -0
  179. package/voice/src/tts.mjs +16 -0
  180. package/voice/src/web.mjs +171 -0
package/openapi.json ADDED
@@ -0,0 +1,629 @@
1
+ {
2
+ "openapi": "3.1.0",
3
+ "info": {
4
+ "title": "BenchGo Harness 工具管理",
5
+ "version": "1.2.0",
6
+ "description": "官方 owner 通道的侧栏状态与工具设置接口;已配对工作台仅通过 Link 既有转发白名单访问。工具安装与本机配置写入仍受对应权限限制,不通过 MCP 向 Agent 暴露安装或配置写入权限。"
7
+ },
8
+ "servers": [
9
+ {
10
+ "url": "/"
11
+ }
12
+ ],
13
+ "paths": {
14
+ "/api/commander/tooling": {
15
+ "post": {
16
+ "summary": "管理工具、隔离会话方案与安装任务",
17
+ "description": "请求必须通过官方 owner 通道且 Origin 同源。安装、更新、重装均绑定系统真实安装来源;未知来源禁止自动更新或卸载。旧客户端携带的 source 字段仅为兼容,不改变来源选择;卸载需携带探测快照 snapshot 二次确认。本机配置写入需 confirmNativeWrite=true。",
18
+ "requestBody": {
19
+ "required": true,
20
+ "content": {
21
+ "application/json": {
22
+ "schema": {
23
+ "$ref": "#/components/schemas/ToolingRequest"
24
+ }
25
+ }
26
+ }
27
+ },
28
+ "responses": {
29
+ "200": {
30
+ "description": "操作结果;安装操作立即返回异步 job,后续使用 job/cancel 查询或取消。",
31
+ "content": {
32
+ "application/json": {
33
+ "schema": {
34
+ "$ref": "#/components/schemas/ToolingResponse"
35
+ }
36
+ }
37
+ }
38
+ },
39
+ "400": {
40
+ "description": "输入无效或操作失败;未知 source 拒绝,不静默回退。",
41
+ "content": {
42
+ "application/json": {
43
+ "schema": {
44
+ "$ref": "#/components/schemas/Error"
45
+ }
46
+ }
47
+ }
48
+ },
49
+ "403": {
50
+ "description": "非同源请求或未获 owner 授权。",
51
+ "content": {
52
+ "application/json": {
53
+ "schema": {
54
+ "$ref": "#/components/schemas/Error"
55
+ }
56
+ }
57
+ }
58
+ },
59
+ "409": {
60
+ "description": "方案冲突、缺少显式本机写入确认或工具仍在运行。",
61
+ "content": {
62
+ "application/json": {
63
+ "schema": {
64
+ "$ref": "#/components/schemas/Error"
65
+ }
66
+ }
67
+ }
68
+ },
69
+ "413": {
70
+ "description": "请求超过 300 KiB。",
71
+ "content": {
72
+ "application/json": {
73
+ "schema": {
74
+ "$ref": "#/components/schemas/Error"
75
+ }
76
+ }
77
+ }
78
+ },
79
+ "415": {
80
+ "description": "Content-Type 不是 application/json。",
81
+ "content": {
82
+ "application/json": {
83
+ "schema": {
84
+ "$ref": "#/components/schemas/Error"
85
+ }
86
+ }
87
+ }
88
+ }
89
+ }
90
+ }
91
+ },
92
+ "/api/commander": {
93
+ "post": {
94
+ "summary": "原生会话与项目侧栏操作",
95
+ "description": "通过现有 owner 认证 Connection 通道调用。state 返回项目、会话、隐藏记录及可选能力状态;ensureRecent 恢复最近工作区。委派 loopback 监听或字体初始化失败不撤销本接口,capabilities 对应 available=false,并保留 error/code。损坏的用户持久化数据仍报错,不重置。其他会话操作保持既有语义。",
96
+ "requestBody": {
97
+ "required": true,
98
+ "content": {
99
+ "application/json": {
100
+ "schema": {
101
+ "type": "object",
102
+ "required": [
103
+ "action"
104
+ ],
105
+ "properties": {
106
+ "action": {
107
+ "type": "string",
108
+ "enum": [
109
+ "state",
110
+ "ensureRecent",
111
+ "binding",
112
+ "browse",
113
+ "clone",
114
+ "dismiss",
115
+ "doctor",
116
+ "project",
117
+ "models",
118
+ "create",
119
+ "start",
120
+ "events",
121
+ "adopt",
122
+ "archive",
123
+ "delete",
124
+ "send",
125
+ "connect",
126
+ "interrupt",
127
+ "steer",
128
+ "close",
129
+ "history",
130
+ "approve"
131
+ ]
132
+ }
133
+ },
134
+ "additionalProperties": true
135
+ }
136
+ }
137
+ }
138
+ },
139
+ "responses": {
140
+ "200": {
141
+ "description": "state 返回 SidebarState;ensureRecent 返回 RecentWorkspace;其他操作返回对应结果。",
142
+ "content": {
143
+ "application/json": {
144
+ "schema": {
145
+ "anyOf": [
146
+ {
147
+ "$ref": "#/components/schemas/SidebarState"
148
+ },
149
+ {
150
+ "$ref": "#/components/schemas/RecentWorkspace"
151
+ },
152
+ {
153
+ "type": "object",
154
+ "additionalProperties": true
155
+ }
156
+ ]
157
+ }
158
+ }
159
+ }
160
+ },
161
+ "400": {
162
+ "description": "输入或操作失败;已有会话身份可随 session 字段返回。",
163
+ "content": {
164
+ "application/json": {
165
+ "schema": {
166
+ "$ref": "#/components/schemas/Error"
167
+ }
168
+ }
169
+ }
170
+ },
171
+ "503": {
172
+ "description": "BenchGo 存储或侧栏初始化失败(含数据目录占用、无法确认旧锁持有者或损坏持久状态);明确报告原因,保留已有数据,不返回空会话或缺失路由 404。修复原因后需重启主机。",
173
+ "content": {
174
+ "application/json": {
175
+ "schema": {
176
+ "type": "object",
177
+ "required": [
178
+ "error",
179
+ "code"
180
+ ],
181
+ "properties": {
182
+ "error": {
183
+ "type": "string"
184
+ },
185
+ "code": {
186
+ "const": "COMMANDER_UNAVAILABLE"
187
+ }
188
+ }
189
+ }
190
+ }
191
+ }
192
+ }
193
+ }
194
+ }
195
+ }
196
+ },
197
+ "components": {
198
+ "schemas": {
199
+ "ToolingRequest": {
200
+ "type": "object",
201
+ "required": [
202
+ "action"
203
+ ],
204
+ "properties": {
205
+ "action": {
206
+ "type": "string",
207
+ "enum": [
208
+ "pickerCatalog",
209
+ "catalog",
210
+ "profiles",
211
+ "providers",
212
+ "models",
213
+ "job",
214
+ "install",
215
+ "update",
216
+ "reinstall",
217
+ "uninstallPreview",
218
+ "uninstall",
219
+ "cancel",
220
+ "setDefault",
221
+ "saveProfile",
222
+ "setBindings",
223
+ "preview",
224
+ "apply",
225
+ "restore"
226
+ ]
227
+ },
228
+ "tool": {
229
+ "type": "string"
230
+ },
231
+ "id": {
232
+ "type": "string",
233
+ "description": "安装任务 ID(job/cancel)"
234
+ },
235
+ "providerId": {
236
+ "type": "string"
237
+ },
238
+ "model": {
239
+ "type": "string"
240
+ },
241
+ "protocol": {
242
+ "type": "string"
243
+ },
244
+ "quickSettings": {
245
+ "type": "object"
246
+ },
247
+ "overrides": {
248
+ "type": "object"
249
+ },
250
+ "contextWindow": {
251
+ "type": "integer",
252
+ "minimum": 1
253
+ },
254
+ "expectedRevision": {
255
+ "type": "string"
256
+ },
257
+ "revision": {
258
+ "type": "string"
259
+ },
260
+ "tools": {
261
+ "type": "array",
262
+ "items": {
263
+ "type": "string"
264
+ }
265
+ },
266
+ "confirmNativeWrite": {
267
+ "type": "boolean"
268
+ },
269
+ "checksums": {
270
+ "type": "object",
271
+ "additionalProperties": {
272
+ "type": [
273
+ "string",
274
+ "null"
275
+ ]
276
+ }
277
+ },
278
+ "backupId": {
279
+ "type": "string"
280
+ },
281
+ "snapshot": {
282
+ "type": "string"
283
+ },
284
+ "source": {
285
+ "type": "string",
286
+ "description": "卸载预览返回的实际安装来源;仅用于展示和任务结果。"
287
+ }
288
+ },
289
+ "allOf": [
290
+ {
291
+ "if": {
292
+ "properties": {
293
+ "action": {
294
+ "enum": [
295
+ "install",
296
+ "update",
297
+ "reinstall"
298
+ ]
299
+ }
300
+ }
301
+ },
302
+ "then": {
303
+ "required": [
304
+ "tool"
305
+ ],
306
+ "properties": {}
307
+ }
308
+ },
309
+ {
310
+ "if": {
311
+ "properties": {
312
+ "action": {
313
+ "enum": [
314
+ "uninstall",
315
+ "setDefault",
316
+ "saveProfile",
317
+ "preview",
318
+ "apply"
319
+ ]
320
+ }
321
+ }
322
+ },
323
+ "then": {
324
+ "required": [
325
+ "tool"
326
+ ]
327
+ }
328
+ },
329
+ {
330
+ "if": {
331
+ "properties": {
332
+ "action": {
333
+ "enum": [
334
+ "job",
335
+ "cancel"
336
+ ]
337
+ }
338
+ }
339
+ },
340
+ "then": {
341
+ "required": [
342
+ "id"
343
+ ]
344
+ }
345
+ }
346
+ ]
347
+ },
348
+ "ToolSummary": {
349
+ "type": "object",
350
+ "required": [
351
+ "id"
352
+ ],
353
+ "properties": {
354
+ "id": {
355
+ "type": "string"
356
+ },
357
+ "installer": {
358
+ "type": [
359
+ "string",
360
+ "null"
361
+ ]
362
+ },
363
+ "canInstall": {
364
+ "type": "boolean"
365
+ },
366
+ "canUpdate": {
367
+ "type": "boolean"
368
+ },
369
+ "canReinstall": {
370
+ "type": "boolean"
371
+ },
372
+ "canUninstall": {
373
+ "type": "boolean"
374
+ },
375
+ "job": {
376
+ "$ref": "#/components/schemas/InstallJob"
377
+ }
378
+ }
379
+ },
380
+ "InstallJob": {
381
+ "type": "object",
382
+ "required": [
383
+ "id",
384
+ "toolId",
385
+ "action",
386
+ "status"
387
+ ],
388
+ "properties": {
389
+ "id": {
390
+ "type": "string"
391
+ },
392
+ "toolId": {
393
+ "type": "string"
394
+ },
395
+ "action": {
396
+ "type": "string",
397
+ "enum": [
398
+ "install",
399
+ "update",
400
+ "reinstall",
401
+ "uninstall"
402
+ ]
403
+ },
404
+ "source": {
405
+ "type": "string",
406
+ "description": "实际探测到的安装来源。"
407
+ },
408
+ "status": {
409
+ "type": "string",
410
+ "enum": [
411
+ "queued",
412
+ "running",
413
+ "succeeded",
414
+ "failed",
415
+ "cancelled"
416
+ ]
417
+ },
418
+ "message": {
419
+ "type": "string",
420
+ "description": "当前阶段,如环境准备、工具安装或版本验证。"
421
+ },
422
+ "logs": {
423
+ "type": "array",
424
+ "items": {
425
+ "type": "string"
426
+ }
427
+ },
428
+ "error": {
429
+ "type": [
430
+ "string",
431
+ "null"
432
+ ]
433
+ }
434
+ }
435
+ },
436
+ "NativeConfigFileStatus": {
437
+ "type": "object",
438
+ "properties": {
439
+ "path": {
440
+ "type": "string"
441
+ },
442
+ "exists": {
443
+ "type": "boolean"
444
+ },
445
+ "unavailable": {
446
+ "type": "boolean"
447
+ },
448
+ "externalChanged": {
449
+ "type": "boolean",
450
+ "description": "与最近一次显式同步后的 SHA-256 不同;仅报告,不自动覆盖。"
451
+ }
452
+ },
453
+ "additionalProperties": true
454
+ },
455
+ "NativeToolStatus": {
456
+ "type": "object",
457
+ "properties": {
458
+ "tool": {
459
+ "type": "string"
460
+ },
461
+ "lastSyncAt": {
462
+ "type": "string",
463
+ "format": "date-time"
464
+ },
465
+ "files": {
466
+ "type": "array",
467
+ "items": {
468
+ "$ref": "#/components/schemas/NativeConfigFileStatus"
469
+ }
470
+ }
471
+ },
472
+ "additionalProperties": true
473
+ },
474
+ "ToolingResponse": {
475
+ "type": "object",
476
+ "properties": {
477
+ "native": {
478
+ "type": "array",
479
+ "items": {
480
+ "$ref": "#/components/schemas/NativeToolStatus"
481
+ },
482
+ "description": "只读原生配置状态。externalChanged 表示同步后发生改动,不触发自动合并或写入。"
483
+ },
484
+ "tools": {
485
+ "type": "array",
486
+ "items": {
487
+ "$ref": "#/components/schemas/ToolSummary"
488
+ }
489
+ },
490
+ "job": {
491
+ "$ref": "#/components/schemas/InstallJob"
492
+ }
493
+ },
494
+ "description": "按 action 返回:catalog 含 tools/profiles/defaults/capabilities/backups/bindings/providerAccess;pickerCatalog 返回模型选择目录;profiles 返回方案目录;providers/models 返回对应列表;install/update/reinstall/uninstall/job/cancel 返回 job;saveProfile 返回 profile;preview 返回 preview;apply/restore 返回 result;setDefault/setBindings 返回方案管理结果。保留既有响应字段。"
495
+ },
496
+ "Error": {
497
+ "type": "object",
498
+ "required": [
499
+ "error"
500
+ ],
501
+ "properties": {
502
+ "error": {
503
+ "type": "string"
504
+ }
505
+ }
506
+ },
507
+ "OptionalWebCapability": {
508
+ "type": "object",
509
+ "required": [
510
+ "available"
511
+ ],
512
+ "properties": {
513
+ "available": {
514
+ "type": "boolean"
515
+ },
516
+ "error": {
517
+ "type": "string",
518
+ "description": "初始化失败的实际错误消息,仅不可用时存在。"
519
+ },
520
+ "code": {
521
+ "type": "string",
522
+ "description": "原始错误码,如 EACCES;原异常未提供时省略。"
523
+ }
524
+ },
525
+ "additionalProperties": false
526
+ },
527
+ "SidebarState": {
528
+ "type": "object",
529
+ "required": [
530
+ "projects",
531
+ "sessions",
532
+ "deletedHarnessIds",
533
+ "capabilities"
534
+ ],
535
+ "properties": {
536
+ "projects": {
537
+ "type": "array",
538
+ "items": {
539
+ "type": "object",
540
+ "additionalProperties": true
541
+ }
542
+ },
543
+ "sessions": {
544
+ "type": "array",
545
+ "items": {
546
+ "type": "object",
547
+ "additionalProperties": true
548
+ }
549
+ },
550
+ "deletedHarnessIds": {
551
+ "type": "array",
552
+ "items": {
553
+ "type": "string"
554
+ }
555
+ },
556
+ "capabilities": {
557
+ "type": "object",
558
+ "required": [
559
+ "delegation",
560
+ "fonts"
561
+ ],
562
+ "properties": {
563
+ "delegation": {
564
+ "$ref": "#/components/schemas/OptionalWebCapability"
565
+ },
566
+ "fonts": {
567
+ "$ref": "#/components/schemas/OptionalWebCapability"
568
+ }
569
+ },
570
+ "additionalProperties": false
571
+ }
572
+ },
573
+ "additionalProperties": false
574
+ },
575
+ "RecentWorkspace": {
576
+ "type": "object",
577
+ "required": [
578
+ "workspaceId",
579
+ "path"
580
+ ],
581
+ "properties": {
582
+ "workspaceId": {
583
+ "type": "string"
584
+ },
585
+ "path": {
586
+ "type": "string"
587
+ },
588
+ "title": {
589
+ "type": "string"
590
+ }
591
+ },
592
+ "additionalProperties": false
593
+ },
594
+ "UninstallPreview": {
595
+ "type": "object",
596
+ "required": [
597
+ "available",
598
+ "snapshot"
599
+ ],
600
+ "properties": {
601
+ "path": {
602
+ "type": "string"
603
+ },
604
+ "realpath": {
605
+ "type": "string"
606
+ },
607
+ "source": {
608
+ "type": "string"
609
+ },
610
+ "version": {
611
+ "type": "string"
612
+ },
613
+ "command": {
614
+ "type": "string"
615
+ },
616
+ "description": {
617
+ "type": "string"
618
+ },
619
+ "snapshot": {
620
+ "type": "string"
621
+ },
622
+ "available": {
623
+ "type": "boolean"
624
+ }
625
+ }
626
+ }
627
+ }
628
+ }
629
+ }