coding-tool-x 3.8.4 → 3.8.6

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 (434) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +86 -15
  3. package/dist/web/assets/AgentsDrawer-Db9wAyaZ.js +1 -0
  4. package/dist/web/assets/AgentsDrawer-Pw2k-ZAa.css +1 -0
  5. package/dist/web/assets/Analytics-C4gMzv7g.js +1 -0
  6. package/dist/web/assets/Analytics-CyHhR126.css +1 -0
  7. package/dist/web/assets/AssetPathField-Bd_nMFu3.js +1 -0
  8. package/dist/web/assets/ChatHistoryDrawer-B2qBQs9L.css +1 -0
  9. package/dist/web/assets/ChatHistoryDrawer-CwzJHyNP.js +1 -0
  10. package/dist/web/assets/CollapseItem-CTCfSiue.js +1 -0
  11. package/dist/web/assets/CommandsDrawer-BZJxlPvV.css +1 -0
  12. package/dist/web/assets/CommandsDrawer-vDghB1U9.js +1 -0
  13. package/dist/web/assets/ConfigExportDrawer-C-XDvlHc.js +1 -0
  14. package/dist/web/assets/ConfigExportDrawer-dwruRKWr.css +1 -0
  15. package/dist/web/assets/ConfigTemplates-CYY8XRED.js +1 -0
  16. package/dist/web/assets/ConfigTemplatesDrawer-BfDi8yO3.css +1 -0
  17. package/dist/web/assets/ConfigTemplatesDrawer-CbsJp76X.js +1 -0
  18. package/dist/web/assets/ConfigTemplatesPanel-CWyPtk67.css +1 -0
  19. package/dist/web/assets/ConfigTemplatesPanel-liMSTh7s.js +1 -0
  20. package/dist/web/assets/Divider-D28g1gwj.js +1 -0
  21. package/dist/web/assets/DrawerContent-ChXgZ1Xm.js +1 -0
  22. package/dist/web/assets/FavoritesDrawer-CG9eI9Ay.css +1 -0
  23. package/dist/web/assets/FavoritesDrawer-D6QSiYaL.js +1 -0
  24. package/dist/web/assets/GatewayConvertDrawer-CuNlf7AC.css +1 -0
  25. package/dist/web/assets/GatewayConvertDrawer-RvET6iNG.js +1 -0
  26. package/dist/web/assets/Home-CSuFuJ9Y.css +1 -0
  27. package/dist/web/assets/Home-P8eseZcf.js +1 -0
  28. package/dist/web/assets/MarkdownEditor-CYmLGYju.js +1 -0
  29. package/dist/web/assets/MarkdownEditor-qfVgSre_.css +1 -0
  30. package/dist/web/assets/McpDrawer-C0dnsZhQ.css +1 -0
  31. package/dist/web/assets/McpDrawer-Ch3bkKIq.js +1 -0
  32. package/dist/web/assets/McpFormDrawer-BRbDcawn.css +1 -0
  33. package/dist/web/assets/McpFormDrawer-BcTlgSpN.js +1 -0
  34. package/dist/web/assets/PluginManager-Dh2o0xkZ.js +1 -0
  35. package/dist/web/assets/PluginsDrawer-DM3QjprE.css +1 -0
  36. package/dist/web/assets/PluginsDrawer-deKQ5u3I.js +1 -0
  37. package/dist/web/assets/PluginsPanel-BofsgQgj.js +1 -0
  38. package/dist/web/assets/PluginsPanel-D6ZqITcR.css +1 -0
  39. package/dist/web/assets/ProjectList-677RLZ8O.css +1 -0
  40. package/dist/web/assets/ProjectList-DhSWJHTA.js +1 -0
  41. package/dist/web/assets/PromptsDrawer-BIgiYCEQ.css +1 -0
  42. package/dist/web/assets/PromptsDrawer-Cfb2FeeU.js +1 -0
  43. package/dist/web/assets/RecentSessionsDrawer-3eXamJhr.js +1 -0
  44. package/dist/web/assets/RecentSessionsDrawer-CKFsOYDM.css +1 -0
  45. package/dist/web/assets/SessionCard-CW0eHURI.js +1 -0
  46. package/dist/web/assets/SessionCard-aM2NHu6i.css +1 -0
  47. package/dist/web/assets/SessionList-BpYRz1cX.css +1 -0
  48. package/dist/web/assets/SessionList-DQfyDGWU.js +1 -0
  49. package/dist/web/assets/SettingsDrawer-Dw5NUgHC.css +1 -0
  50. package/dist/web/assets/SettingsDrawer-u_vwUuPS.js +1 -0
  51. package/dist/web/assets/SkillManager-C0GCT2Kb.css +1 -0
  52. package/dist/web/assets/SkillManager-DHMprJLA.js +1 -0
  53. package/dist/web/assets/SkillsDrawer-BCNme-aJ.css +1 -0
  54. package/dist/web/assets/SkillsDrawer-CkF3BpyC.js +1 -0
  55. package/dist/web/assets/SkillsPanel-B3Nm5j32.css +1 -0
  56. package/dist/web/assets/SkillsPanel-DWE4pFGx.js +1 -0
  57. package/dist/web/assets/SpeedTestDrawer-BgfG1Ked.js +1 -0
  58. package/dist/web/assets/SpeedTestDrawer-Dc0WToJ_.css +1 -0
  59. package/dist/web/assets/Upload-CNwaGOws.js +1 -0
  60. package/dist/web/assets/WorkspaceDrawer-Br5CeCzL.js +1 -0
  61. package/dist/web/assets/WorkspaceDrawer-CGnMu9p1.css +1 -0
  62. package/dist/web/assets/WorkspaceManager-B2O8-qIw.js +1 -0
  63. package/dist/web/assets/WorkspacePanel-5oDKit3c.js +1 -0
  64. package/dist/web/assets/WorkspacePanel-D0-zHTHP.css +1 -0
  65. package/dist/web/assets/_plugin-vue_export-helper-BeLZJZij.js +1 -0
  66. package/dist/web/assets/client-UDwXBP9i.js +1 -0
  67. package/dist/web/assets/clipboard-B46yyoz_.js +1 -0
  68. package/dist/web/assets/headers-cf-QapUq.js +1 -0
  69. package/dist/web/assets/icons-B2Vg-IOC.js +1 -0
  70. package/dist/web/assets/index-BMAUPq5K.js +2 -0
  71. package/dist/web/assets/index-Bi1MQHYX.css +1 -0
  72. package/dist/web/assets/light-Cp0t7v32.js +1 -0
  73. package/dist/web/assets/markdown-u082bbtj.js +1 -0
  74. package/dist/web/assets/platforms-CBkB45JP.js +1 -0
  75. package/dist/web/assets/platforms-FTpjxAT6.js +1 -0
  76. package/dist/web/assets/project-config-B2baPzYL.js +1 -0
  77. package/dist/web/assets/sessions-Cmy31slD.js +1 -0
  78. package/dist/web/assets/sessions-yC_oVVh8.js +1 -0
  79. package/dist/web/assets/skill-repo-input-B_fkGlUK.js +1 -0
  80. package/dist/web/assets/use-lock-html-scroll-DXIqmUW4.js +1 -0
  81. package/dist/web/assets/use-message-DoLM8C1C.js +1 -0
  82. package/dist/web/assets/useResponsiveDrawer-jbmqZuJs.js +1 -0
  83. package/dist/web/assets/vendors-D0c_0KLP.js +1 -0
  84. package/dist/web/assets/vue-vendor-BqZbbXHA.js +1 -0
  85. package/dist/web/assets/workspaces-mjyPVGS8.js +1 -0
  86. package/dist/web/assets/xml-CgY3RMlX.js +1 -0
  87. package/dist/web/index.html +12 -8
  88. package/docs/native-log-memory-2026-09-16.md +43 -0
  89. package/docs/superpowers/plans/2026-08-26-configuration-driven-cli-platform.md +1578 -0
  90. package/docs/superpowers/plans/2026-08-30-project-scoped-config-control.md +1260 -0
  91. package/docs/superpowers/plans/2026-09-01-omp-skill-refresh-boundary.md +213 -0
  92. package/docs/superpowers/plans/2026-09-01-realtime-logs-panel.md +125 -0
  93. package/docs/superpowers/plans/2026-09-02-config-driven-platform-boundary.md +86 -0
  94. package/docs/superpowers/plans/2026-09-02-platform-implementation-drivers.md +508 -0
  95. package/docs/superpowers/plans/2026-09-03-cli-platform-correctness-boundary.md +760 -0
  96. package/docs/superpowers/plans/2026-09-03-dependency-security-remediation.md +133 -0
  97. package/docs/superpowers/plans/2026-09-04-model-catalog-pricing-sync.md +1078 -0
  98. package/docs/superpowers/plans/2026-09-05-codex-project-scan-500.md +128 -0
  99. package/docs/superpowers/plans/2026-09-06-project-skill-path-fix.md +97 -0
  100. package/docs/superpowers/specs/2026-08-26-configuration-driven-cli-platform-design.md +408 -0
  101. package/docs/superpowers/specs/2026-08-30-project-scoped-config-control-design.md +467 -0
  102. package/docs/superpowers/specs/2026-09-01-claude-session-content-repair-design.md +111 -0
  103. package/docs/superpowers/specs/2026-09-01-omp-skill-refresh-boundary-design.md +83 -0
  104. package/docs/superpowers/specs/2026-09-01-realtime-logs-panel-design.md +27 -0
  105. package/docs/superpowers/specs/2026-09-02-config-driven-platform-boundary-design.md +64 -0
  106. package/docs/superpowers/specs/2026-09-02-platform-implementation-driver-boundary-design.md +123 -0
  107. package/docs/superpowers/specs/2026-09-03-cli-platform-correctness-boundary-design.md +249 -0
  108. package/docs/superpowers/specs/2026-09-03-dependency-security-remediation-design.md +87 -0
  109. package/docs/superpowers/specs/2026-09-04-model-catalog-pricing-sync-design.md +301 -0
  110. package/docs/superpowers/specs/2026-09-05-codex-project-scan-500-design.md +24 -0
  111. package/package.json +8 -4
  112. package/src/commands/channels.js +88 -191
  113. package/src/commands/cli-type.js +19 -11
  114. package/src/commands/daemon.js +104 -32
  115. package/src/commands/doctor.js +16 -9
  116. package/src/commands/export-config.js +23 -5
  117. package/src/commands/list.js +130 -52
  118. package/src/commands/logs.js +44 -27
  119. package/src/commands/platform-command-registry.js +78 -0
  120. package/src/commands/plugin.js +11 -5
  121. package/src/commands/port-config.js +34 -52
  122. package/src/commands/proxy-control.js +207 -145
  123. package/src/commands/proxy.js +2 -2
  124. package/src/commands/resume.js +87 -91
  125. package/src/commands/search.js +137 -67
  126. package/src/commands/stats.js +30 -22
  127. package/src/commands/switch.js +1 -1
  128. package/src/commands/toggle-proxy.js +94 -111
  129. package/src/commands/ui.js +67 -6
  130. package/src/commands/workspace.js +90 -8
  131. package/src/config/default.js +6 -53
  132. package/src/config/loader.js +61 -24
  133. package/src/config/model-metadata.js +49 -59
  134. package/src/config/model-metadata.json +4095 -99
  135. package/src/config/paths.js +181 -8
  136. package/src/index.js +134 -71
  137. package/src/platforms/access.js +196 -0
  138. package/src/{server/services → platforms}/agents-service.js +354 -197
  139. package/src/platforms/channel-auth-registry.js +165 -0
  140. package/src/platforms/channel-auth-service.js +107 -0
  141. package/src/{server/services → platforms}/commands-service.js +195 -115
  142. package/src/platforms/driver-registry.js +59 -0
  143. package/src/platforms/drivers/claude/api-operations.js +62 -0
  144. package/src/{server/services/channels.js → platforms/drivers/claude/channels-implementation.js} +131 -33
  145. package/src/platforms/drivers/claude/channels.js +39 -0
  146. package/src/{server/services/config-sync-service.js → platforms/drivers/claude/config-sync.js} +29 -5
  147. package/src/{server/services → platforms/drivers/claude}/health-check.js +4 -4
  148. package/src/platforms/drivers/claude/health.js +22 -0
  149. package/src/platforms/drivers/claude/mcp.js +9 -0
  150. package/src/{server/services/settings-manager.js → platforms/drivers/claude/native-config-implementation.js} +13 -4
  151. package/src/platforms/drivers/claude/native-config.js +46 -0
  152. package/src/platforms/drivers/claude/native-logs.js +72 -0
  153. package/src/{server/services/claude-openai-gateway.js → platforms/drivers/claude/openai-gateway.js} +8 -65
  154. package/src/platforms/drivers/claude/project-config.js +21 -0
  155. package/src/platforms/drivers/claude/projects.js +62 -0
  156. package/src/platforms/drivers/claude/prompts.js +9 -0
  157. package/src/{server/proxy-server.js → platforms/drivers/claude/proxy-implementation.js} +41 -278
  158. package/src/platforms/drivers/claude/proxy.js +16 -0
  159. package/src/platforms/drivers/claude/resource-sync.js +9 -0
  160. package/src/platforms/drivers/claude/session-history-adapter.js +313 -0
  161. package/src/{server/services/sessions.js → platforms/drivers/claude/sessions-implementation.js} +145 -35
  162. package/src/platforms/drivers/claude/sessions.js +76 -0
  163. package/src/{server/services/claude-statistics-service.js → platforms/drivers/claude/statistics-implementation.js} +2 -2
  164. package/src/platforms/drivers/claude/statistics.js +16 -0
  165. package/src/{server/services/claude-wire.js → platforms/drivers/claude/wire.js} +1 -1
  166. package/src/platforms/drivers/codex/api-operations.js +9 -0
  167. package/src/{server/services/codex-channels.js → platforms/drivers/codex/channels-implementation.js} +149 -14
  168. package/src/platforms/drivers/codex/channels.js +45 -0
  169. package/src/{server/services/codex-config.js → platforms/drivers/codex/config.js} +12 -2
  170. package/src/{server/services/codex-env-manager.js → platforms/drivers/codex/env-manager.js} +1 -1
  171. package/src/platforms/drivers/codex/mcp.js +9 -0
  172. package/src/{server/services/codex-settings-manager.js → platforms/drivers/codex/native-config-implementation.js} +15 -6
  173. package/src/platforms/drivers/codex/native-config.js +47 -0
  174. package/src/platforms/drivers/codex/native-logs.js +166 -0
  175. package/src/platforms/drivers/codex/project-config.js +21 -0
  176. package/src/platforms/drivers/codex/projects.js +26 -0
  177. package/src/platforms/drivers/codex/prompts.js +9 -0
  178. package/src/{server/codex-proxy-server.js → platforms/drivers/codex/proxy-implementation.js} +30 -233
  179. package/src/platforms/drivers/codex/proxy.js +16 -0
  180. package/src/platforms/drivers/codex/resource-sync.js +9 -0
  181. package/src/{server/services/session-history-adapters/codex.js → platforms/drivers/codex/session-history-adapter.js} +37 -23
  182. package/src/{server/services/codex-sessions.js → platforms/drivers/codex/sessions-implementation.js} +81 -75
  183. package/src/platforms/drivers/codex/sessions.js +36 -0
  184. package/src/{server/services/codex-statistics-service.js → platforms/drivers/codex/statistics-implementation.js} +2 -2
  185. package/src/platforms/drivers/codex/statistics.js +16 -0
  186. package/src/platforms/drivers/gemini/api-operations.js +9 -0
  187. package/src/{server/services/gemini-channels.js → platforms/drivers/gemini/channels-implementation.js} +202 -37
  188. package/src/platforms/drivers/gemini/channels.js +39 -0
  189. package/src/{server/services/gemini-config.js → platforms/drivers/gemini/config.js} +12 -2
  190. package/src/platforms/drivers/gemini/mcp.js +9 -0
  191. package/src/{server/services/gemini-settings-manager.js → platforms/drivers/gemini/native-config-implementation.js} +14 -5
  192. package/src/platforms/drivers/gemini/native-config.js +39 -0
  193. package/src/platforms/drivers/gemini/native-logs.js +180 -0
  194. package/src/platforms/drivers/gemini/project-config.js +21 -0
  195. package/src/platforms/drivers/gemini/projects.js +26 -0
  196. package/src/platforms/drivers/gemini/prompts.js +9 -0
  197. package/src/{server/gemini-proxy-server.js → platforms/drivers/gemini/proxy-implementation.js} +36 -267
  198. package/src/platforms/drivers/gemini/proxy.js +16 -0
  199. package/src/platforms/drivers/gemini/resource-sync.js +9 -0
  200. package/src/{server/services/session-history-adapters/gemini.js → platforms/drivers/gemini/session-history-adapter.js} +70 -18
  201. package/src/{server/services/gemini-sessions.js → platforms/drivers/gemini/sessions-implementation.js} +53 -37
  202. package/src/platforms/drivers/gemini/sessions.js +47 -0
  203. package/src/{server/services/gemini-statistics-service.js → platforms/drivers/gemini/statistics-implementation.js} +2 -2
  204. package/src/platforms/drivers/gemini/statistics.js +16 -0
  205. package/src/{server/services/gemini-wire.js → platforms/drivers/gemini/wire.js} +1 -1
  206. package/src/platforms/drivers/generic-filesystem.js +166 -0
  207. package/src/platforms/drivers/generic-jsonl.js +141 -0
  208. package/src/platforms/drivers/generic-mcp.js +44 -0
  209. package/src/platforms/drivers/generic-openai-compatible.js +45 -0
  210. package/src/platforms/drivers/generic-prompt.js +41 -0
  211. package/src/platforms/drivers/legacy.js +677 -0
  212. package/src/platforms/drivers/native-config-snapshot.js +125 -0
  213. package/src/platforms/drivers/native-log-utils.js +1292 -0
  214. package/src/platforms/drivers/notification-hooks.js +578 -0
  215. package/src/{server/api/omp-config.js → platforms/drivers/omp/api-operations.js} +52 -64
  216. package/src/{server/services/omp-auth-provider-worker.js → platforms/drivers/omp/auth-provider-worker.js} +1 -1
  217. package/src/{server/services/omp-auth-providers.js → platforms/drivers/omp/auth-providers.js} +1 -1
  218. package/src/{server/services/omp-channels.js → platforms/drivers/omp/channels-implementation.js} +166 -39
  219. package/src/platforms/drivers/omp/channels.js +58 -0
  220. package/src/{server/services/omp-config.js → platforms/drivers/omp/config.js} +53 -13
  221. package/src/{server/services/omp-gateway-routing.js → platforms/drivers/omp/gateway-routing.js} +14 -7
  222. package/src/{server/services/omp-gateway.js → platforms/drivers/omp/gateway.js} +4 -262
  223. package/src/platforms/drivers/omp/mcp.js +9 -0
  224. package/src/{server/services/omp-settings-manager.js → platforms/drivers/omp/native-config-implementation.js} +75 -10
  225. package/src/platforms/drivers/omp/native-config.js +46 -0
  226. package/src/platforms/drivers/omp/native-logs.js +52 -0
  227. package/src/{server/services/omp-native-plugin-adapter.js → platforms/drivers/omp/native-plugin-adapter.js} +91 -4
  228. package/src/platforms/drivers/omp/project-config.js +29 -0
  229. package/src/platforms/drivers/omp/projects.js +20 -0
  230. package/src/platforms/drivers/omp/prompts.js +9 -0
  231. package/src/{server/omp-proxy-server.js → platforms/drivers/omp/proxy-implementation.js} +6 -15
  232. package/src/platforms/drivers/omp/proxy.js +16 -0
  233. package/src/platforms/drivers/omp/resource-sync.js +9 -0
  234. package/src/{server/services/session-history-adapters/omp.js → platforms/drivers/omp/session-history-adapter.js} +42 -18
  235. package/src/{server/services/omp-sessions.js → platforms/drivers/omp/sessions-implementation.js} +130 -94
  236. package/src/platforms/drivers/omp/sessions.js +36 -0
  237. package/src/{server/services/omp-skill-discovery.js → platforms/drivers/omp/skill-discovery.js} +159 -32
  238. package/src/{server/services/omp-skill-settings-service.js → platforms/drivers/omp/skill-settings.js} +1 -1
  239. package/src/{server/services/omp-statistics-service.js → platforms/drivers/omp/statistics-implementation.js} +3 -3
  240. package/src/platforms/drivers/omp/statistics.js +16 -0
  241. package/src/platforms/drivers/opencode/api-operations.js +9 -0
  242. package/src/{server/services/opencode-channels.js → platforms/drivers/opencode/channels-implementation.js} +28 -9
  243. package/src/platforms/drivers/opencode/channels.js +40 -0
  244. package/src/platforms/drivers/opencode/conversion.js +41 -0
  245. package/src/{server/services/opencode-gateway-converter.js → platforms/drivers/opencode/gateway-converter.js} +1 -1
  246. package/src/platforms/drivers/opencode/mcp.js +9 -0
  247. package/src/{server/services/opencode-settings-manager.js → platforms/drivers/opencode/native-config-implementation.js} +17 -6
  248. package/src/platforms/drivers/opencode/native-config.js +26 -0
  249. package/src/platforms/drivers/opencode/native-logs.js +133 -0
  250. package/src/platforms/drivers/opencode/project-config.js +98 -0
  251. package/src/platforms/drivers/opencode/projects.js +20 -0
  252. package/src/platforms/drivers/opencode/prompts.js +9 -0
  253. package/src/{server/opencode-proxy-server.js → platforms/drivers/opencode/proxy-implementation.js} +27 -362
  254. package/src/platforms/drivers/opencode/proxy.js +16 -0
  255. package/src/platforms/drivers/opencode/resource-sync.js +9 -0
  256. package/src/{server/services/opencode-sessions.js → platforms/drivers/opencode/sessions-implementation.js} +211 -64
  257. package/src/platforms/drivers/opencode/sessions.js +48 -0
  258. package/src/{server/services/opencode-statistics-service.js → platforms/drivers/opencode/statistics-implementation.js} +2 -2
  259. package/src/platforms/drivers/opencode/statistics.js +16 -0
  260. package/src/platforms/drivers/secure-file-driver.js +272 -0
  261. package/src/platforms/drivers/unsupported.js +7 -0
  262. package/src/platforms/manifest-schema.js +398 -0
  263. package/src/platforms/manifests/claude.json +489 -0
  264. package/src/platforms/manifests/codex.json +448 -0
  265. package/src/platforms/manifests/gemini.json +447 -0
  266. package/src/platforms/manifests/omp.json +496 -0
  267. package/src/platforms/manifests/opencode.json +422 -0
  268. package/src/{server/services → platforms}/native-oauth-adapters.js +98 -418
  269. package/src/{server/services → platforms}/notification-hooks.js +190 -1023
  270. package/src/platforms/oauth-credentials-service.js +635 -0
  271. package/src/platforms/path-resolver.js +179 -0
  272. package/src/platforms/platform-path-context.js +305 -0
  273. package/src/platforms/registry.js +248 -0
  274. package/src/platforms/remote-notification-providers.js +678 -0
  275. package/src/platforms/runtime.js +259 -0
  276. package/src/{server/services/session-history-adapters/index.js → platforms/session-history-adapters.js} +8 -1
  277. package/src/plugins/plugin-loader.js +2 -2
  278. package/src/plugins/plugin-manager.js +2 -2
  279. package/src/plugins/registry.js +27 -10
  280. package/src/reset-config.js +21 -5
  281. package/src/server/api/agents.js +46 -72
  282. package/src/server/api/commands.js +16 -6
  283. package/src/server/api/config-registry.js +206 -59
  284. package/src/server/api/config-sync.js +3 -2
  285. package/src/server/api/config-templates.js +20 -4
  286. package/src/server/api/config.js +111 -102
  287. package/src/server/api/convert.js +54 -178
  288. package/src/server/api/dashboard.js +168 -102
  289. package/src/server/api/hooks.js +1 -1
  290. package/src/server/api/mcp.js +224 -84
  291. package/src/server/api/platform-api-config.js +102 -0
  292. package/src/server/api/platform-route-factory.js +215 -0
  293. package/src/server/api/platform-routes.js +26 -0
  294. package/src/server/api/platforms.js +110 -0
  295. package/src/server/api/plugins.js +57 -57
  296. package/src/server/api/project-config.js +168 -0
  297. package/src/server/api/prompts.js +58 -45
  298. package/src/server/api/settings.js +55 -8
  299. package/src/server/api/skills.js +262 -133
  300. package/src/server/api/ui-config.js +2 -2
  301. package/src/server/api/validation-errors.js +18 -4
  302. package/src/server/api/workspaces.js +47 -12
  303. package/src/server/index.js +164 -213
  304. package/src/server/platform-context.js +81 -0
  305. package/src/server/services/channel-balance.js +133 -24
  306. package/src/server/services/channel-health.js +21 -6
  307. package/src/server/services/channel-scheduler.js +29 -39
  308. package/src/server/services/channel-sync-utils.js +23 -13
  309. package/src/server/services/config-export-service.js +350 -319
  310. package/src/server/services/config-registry-service.js +280 -54
  311. package/src/server/services/config-sync-manager.js +172 -944
  312. package/src/server/services/config-templates-service.js +419 -353
  313. package/src/server/services/control-manifest-store.js +206 -0
  314. package/src/server/services/dashboard-snapshot-worker.js +656 -100
  315. package/src/server/services/effective-control-service.js +557 -0
  316. package/src/server/services/local-resource-index.js +314 -0
  317. package/src/server/services/mcp-service.js +607 -977
  318. package/src/server/services/model-detector.js +15 -10
  319. package/src/server/services/native-log-channel-resolver.js +214 -0
  320. package/src/server/services/native-log-observer.js +291 -0
  321. package/src/server/services/network-access.js +12 -2
  322. package/src/server/services/platform-catalog.js +82 -0
  323. package/src/server/services/platform-resolution.js +32 -29
  324. package/src/server/services/plugins-service.js +376 -122
  325. package/src/server/services/project-config-service.js +550 -0
  326. package/src/server/services/project-path-validation.js +31 -0
  327. package/src/server/services/prompts-service.js +267 -233
  328. package/src/server/services/proxy-runtime.js +7 -4
  329. package/src/server/services/remote-credential-cache.js +43 -0
  330. package/src/server/services/repo-scanner-base.js +182 -75
  331. package/src/server/services/request-logger.js +7 -4
  332. package/src/server/services/session-history-index.js +876 -214
  333. package/src/server/services/session-history-worker.js +228 -33
  334. package/src/server/services/session-snapshot-worker.js +124 -34
  335. package/src/server/services/session-snapshots.js +4 -2
  336. package/src/server/services/skill-artifact-store.js +355 -0
  337. package/src/server/services/skill-format-adapters.js +65 -0
  338. package/src/server/services/skill-projection-service.js +323 -0
  339. package/src/server/services/skill-refresh-task-service.js +275 -0
  340. package/src/server/services/skill-service.js +2020 -677
  341. package/src/server/services/snapshot-cache.js +30 -8
  342. package/src/server/services/speed-test.js +8 -8
  343. package/src/server/services/sqlite-connection.js +19 -3
  344. package/src/server/services/statistics-service.js +240 -57
  345. package/src/server/services/ui-config.js +107 -76
  346. package/src/server/services/usage-log-utils.js +98 -0
  347. package/src/server/services/web-build.js +1 -1
  348. package/src/server/services/workspace-service.js +59 -29
  349. package/src/server/utils/pricing.js +10 -19
  350. package/src/server/websocket-server.js +153 -28
  351. package/src/{server/services/base → shared}/base-channel-service.js +156 -28
  352. package/src/shared/capability-driver.js +104 -0
  353. package/src/shared/channel-auth-policy.js +27 -0
  354. package/src/shared/channel-driver.js +161 -0
  355. package/src/shared/driver-factories/api.js +180 -0
  356. package/src/shared/driver-factories/mcp.js +244 -0
  357. package/src/shared/driver-factories/projects.js +121 -0
  358. package/src/shared/driver-factories/prompts.js +58 -0
  359. package/src/shared/driver-factories/resource-sync.js +375 -0
  360. package/src/shared/driver-result.js +78 -0
  361. package/src/shared/mcp-format.js +189 -0
  362. package/src/shared/platforms.js +104 -167
  363. package/src/shared/project-config.js +512 -0
  364. package/src/shared/proxy-driver.js +57 -0
  365. package/src/{server/services/base → shared}/response-usage-parser.js +8 -4
  366. package/src/ui/menu.js +91 -67
  367. package/src/utils/port-helper.js +35 -19
  368. package/src/utils/session.js +1 -1
  369. package/dist/web/assets/Analytics-COEUXmd4.js +0 -25
  370. package/dist/web/assets/Analytics-RNn1BUbG.css +0 -1
  371. package/dist/web/assets/ConfigTemplates-DLLkS53H.js +0 -1
  372. package/dist/web/assets/Home-DCEyLzwX.js +0 -1
  373. package/dist/web/assets/Home-DYVy4cGZ.css +0 -1
  374. package/dist/web/assets/PluginManager-Oe1ZHoMO.js +0 -1
  375. package/dist/web/assets/ProjectList-CWjuAFof.js +0 -1
  376. package/dist/web/assets/ProjectList-VeMNXfgO.css +0 -1
  377. package/dist/web/assets/SessionList-C4chCPxK.css +0 -1
  378. package/dist/web/assets/SessionList-v3ehGg9U.js +0 -1
  379. package/dist/web/assets/SkillManager-BsX8Qpj0.css +0 -1
  380. package/dist/web/assets/SkillManager-DUF_qP5S.js +0 -1
  381. package/dist/web/assets/WorkspaceManager-CjAWBosO.js +0 -1
  382. package/dist/web/assets/icons-nGdSKQn2.js +0 -1
  383. package/dist/web/assets/index-D5hyHPj7.js +0 -2
  384. package/dist/web/assets/index-bJRG3RXH.css +0 -1
  385. package/dist/web/assets/markdown-BNJfEgCA.js +0 -1
  386. package/dist/web/assets/markdown-BfC0goYb.css +0 -10
  387. package/dist/web/assets/naive-ui-BALVpMgd.js +0 -1
  388. package/dist/web/assets/vendors-DQA4Hw9v.js +0 -7
  389. package/dist/web/assets/vue-vendor-B5RqjEjQ.js +0 -45
  390. package/src/config/model-pricing.js +0 -35
  391. package/src/server/api/channels.js +0 -439
  392. package/src/server/api/claude-hooks.js +0 -56
  393. package/src/server/api/claude-statistics.js +0 -57
  394. package/src/server/api/codex-channels.js +0 -491
  395. package/src/server/api/codex-projects.js +0 -117
  396. package/src/server/api/codex-proxy.js +0 -293
  397. package/src/server/api/codex-sessions.js +0 -652
  398. package/src/server/api/codex-statistics.js +0 -57
  399. package/src/server/api/gemini-channels.js +0 -392
  400. package/src/server/api/gemini-projects.js +0 -103
  401. package/src/server/api/gemini-proxy.js +0 -231
  402. package/src/server/api/gemini-sessions.js +0 -550
  403. package/src/server/api/gemini-statistics.js +0 -57
  404. package/src/server/api/health-check.js +0 -31
  405. package/src/server/api/oauth-credentials.js +0 -198
  406. package/src/server/api/omp-channels.js +0 -575
  407. package/src/server/api/omp-projects.js +0 -88
  408. package/src/server/api/omp-proxy.js +0 -125
  409. package/src/server/api/omp-sessions.js +0 -386
  410. package/src/server/api/omp-statistics.js +0 -40
  411. package/src/server/api/opencode-channels.js +0 -471
  412. package/src/server/api/opencode-projects.js +0 -110
  413. package/src/server/api/opencode-proxy.js +0 -354
  414. package/src/server/api/opencode-sessions.js +0 -466
  415. package/src/server/api/opencode-statistics.js +0 -57
  416. package/src/server/api/projects.js +0 -120
  417. package/src/server/api/proxy.js +0 -330
  418. package/src/server/api/sessions.js +0 -810
  419. package/src/server/services/oauth-credentials-service.js +0 -945
  420. package/src/server/services/omp-session-log-observer.js +0 -138
  421. package/src/server/services/opencode-gateway-adapters.js +0 -43
  422. package/src/server/services/project-snapshots.js +0 -59
  423. package/src/server/services/proxy-log-helper.js +0 -298
  424. package/src/server/services/session-cache.js +0 -127
  425. package/src/server/services/session-converter.js +0 -582
  426. package/src/server/services/session-history-adapters/claude.js +0 -235
  427. /package/src/{server/services/claude-token-recovery.js → platforms/drivers/claude/token-recovery.js} +0 -0
  428. /package/src/{server/services/codex-parser.js → platforms/drivers/codex/parser.js} +0 -0
  429. /package/src/{server/services/codex-speed-test-template.json → platforms/drivers/codex/speed-test-template.json} +0 -0
  430. /package/src/{server/services/codex-wire.js → platforms/drivers/codex/wire.js} +0 -0
  431. /package/src/{server/services/omp-auth-gateway-client.js → platforms/drivers/omp/auth-gateway-client.js} +0 -0
  432. /package/src/{server/services/opencode-normalization.js → platforms/drivers/opencode/normalization.js} +0 -0
  433. /package/src/{server/services → shared}/config-artifact-paths.js +0 -0
  434. /package/src/{server/services/base → shared}/proxy-utils.js +0 -0
package/CHANGELOG.md CHANGED
@@ -5,8 +5,21 @@
5
5
  该项目遵循 [Semantic Versioning](https://semver.org/)。
6
6
 
7
7
  ## [Unreleased]
8
+ ### Added
9
+ - **原生路径可配置** - 新增 `~/.cc-tool/config/platform-paths.json` 路径覆盖层;Claude、Codex、Gemini、OpenCode、OMP 及新增 Registry 平台的原生配置、会话状态、渠道、Skills、Plugins 和请求快照均可按平台重定向,未配置时保持原有默认路径,不自动搬迁已有数据。
10
+ - **配置驱动的平台 Registry** - 新增 Manifest 校验、allowlisted capability driver、`~/.cc-tool/config/platforms.json` 用户扩展和安全的 `GET /api/platforms` 公共目录;符合通用协议的 CLI 可通过受控 Manifest / driver 扩展,但不会自动获得任意平台的完整能力。
11
+ - **Registry-backed CLI / Web UI 路由** - 代理、日志、统计、端口配置、Dashboard 聚合和前端平台元数据改为从 Registry 派生,同时保留旧 CLI/API facade、OMP managed mode 与现有测试 mock seam。
12
+ - **项目级配置控制** - 在项目历史会话页管理原生项目指令、Skills 和 MCP,配置按项目 realpath 隔离并保留用户级配置。
13
+ - **Skill 有效控制面** - Skill 仓库只保存 source reference;手动刷新异步下载仓库中全部 Skill 的完整目录,不保存仓库归档或 tree,并按五个平台的 native format 分开持久化
14
+ - **Skill 缓存与开关** - 所有扫描到的 Skill 默认登记为 `managed=true`;新远端 Skill 默认 `needs_review/disabled`,`enabled` 控制实际 CLI/OMP 加载,关闭只撤销 native projection
15
+ - **配置驱动通知设置** - Hooks capability、可信 hooks/provider adapter 和公开字段 schema 统一从平台注册表发现;设置面板可消费新增平台/provider 描述,无需重复维护前端模板。
16
+
17
+ ### Changed
18
+ - **兼容性边界明确** - 用户配置禁止任意 Node.js 模块、函数值和 shell 命令;特殊 SQLite、OAuth/keychain、非标准配置及 fork 语义继续由专用 capability driver 负责;既有 CLI/API 兼容路径与 mock seam 保持有意稳定。
19
+ - **手动刷新边界** - Skill 页面进入、浏览器刷新、切换页面和添加/修改仓库只读取或保存本地状态;只有用户手动点击刷新才触发远端网络任务。
8
20
 
9
21
  ### Security
22
+ - **控制面安全** - MCP/Skill 控制清单不保存完整 secret;项目 MCP 静态 secret 默认拒绝;LAN 远程写默认关闭,并要求 same-origin/loopback 控制
10
23
  - **依赖安全升级** - adm-zip 升至 0.6.0(GHSA-xcpc-8h2w-3j85)、js-yaml 升至 4.3.1(GHSA-h67p-54hq-rp68 / GHSA-52cp-r559-cp3m / GHSA-5p4m-2wfm-xmqj)、pm2 升至 7.0.3(GHSA-x5gf-qvw8-r2rm),overrides 同步更新 basic-ftp / qs / systeminformation / js-yaml;`npm audit` 报告归零
11
24
 
12
25
  ### Fixed
@@ -14,6 +27,8 @@
14
27
  - **OMP Codex Responses 路径兼容** - managed gateway 将 OMP 原生 `openai-codex-responses` 的 `/codex/responses` 请求映射到 OpenAI-compatible 渠道的 `/v1/responses`,避免 Codex-only 服务返回 HTTP 404
15
28
  - **OMP 渠道失败不再冻结** - OMP 动态切换开启后,失败渠道不再进入冻结状态。OMP 网关按请求即时回退其他渠道,冻结会导致短暂故障的渠道在恢复前被排除在后续分配之外
16
29
  - **OMP 动态切换凭据稳定** - 同步当前 OMP 渠道时不再把动态切换生成的本地网关 `base_url` 和 capability API Key 覆盖真实渠道配置;同一渠道的受管 provider 生成值现在复用持久化网关密钥保持稳定
30
+ - **测速模型用户配置持久化** - 自定义测速模型写入用户配置并在重载时回填;包内 `src/config/model-metadata.json` 保持只读,旧配置按静态 metadata/catalog fallback 兼容。
31
+ - **Claude Hooks 路由兼容** - 保留 `/api/claude/hooks*` 与 `/api/hooks` 的既有语义,避免 Claude root alias 截获通用通知设置接口。
17
32
 
18
33
  ## [3.6.7] - 2026-05-16
19
34
 
package/README.md CHANGED
@@ -1,11 +1,11 @@
1
1
  # coding-tool-x
2
2
 
3
- > 面向 Claude Code、Codex CLI、Gemini CLI、OpenCode、OMP 的统一增强控制台
3
+ > 面向 Claude Code、Codex CLI、Gemini CLI、OpenCode、OMP 的统一增强控制台,并支持通过 Manifest 扩展兼容协议的 Coding CLI
4
4
  > Web UI + CLI + 多平台代理 + 配置托管 + 工作区编排 + 分析面板
5
5
 
6
6
  ![Node.js](https://img.shields.io/badge/Node.js-%3E%3D22.13.0-43853d?style=flat-square)
7
7
  ![License](https://img.shields.io/badge/License-MIT-blue?style=flat-square)
8
- ![Platforms](https://img.shields.io/badge/Platforms-Claude%20%7C%20Codex%20%7C%20Gemini%20%7C%20OpenCode%20%7C%20OMP-1f6feb?style=flat-square)
8
+ ![Platforms](https://img.shields.io/badge/Platforms-Registry--driven-1f6feb?style=flat-square)
9
9
 
10
10
  ![Home Preview](docs/home.png)
11
11
 
@@ -15,7 +15,7 @@
15
15
 
16
16
  ## 适合做什么
17
17
 
18
- - 统一查看五个平台的项目和会话
18
+ - 统一查看已启用平台的项目和会话
19
19
  - 管理多渠道代理、测速、模型探测和健康状态
20
20
  - 集中托管 Prompts、Skills、Agents、Commands、MCP、Plugins 等常用配置项
21
21
  - 为多项目创建工作区,必要时自动创建 Git worktree
@@ -26,7 +26,7 @@
26
26
 
27
27
  ### 会话与项目
28
28
 
29
- - 支持 Claude、Codex、Gemini、OpenCode、OMP 五个平台的项目与会话列表
29
+ - 支持内置平台及已启用扩展平台的项目与会话列表;具体能力以平台 Manifest 为准
30
30
  - 支持项目排序、项目搜索、会话排序、会话搜索
31
31
  - 支持最近会话、收藏、别名、聊天记录查看
32
32
  - 支持新建会话、删除会话、复制启动命令
@@ -35,7 +35,7 @@
35
35
 
36
36
  ### 多渠道代理
37
37
 
38
- - 五个平台均支持独立代理端口和独立渠道配置
38
+ - 具备渠道能力的平台支持独立代理端口和独立渠道配置
39
39
  - 支持渠道增删改查、启用 / 停用、权重、并发限制
40
40
  - 支持速度测试、模型可用性探测、健康检查与故障冻结
41
41
  - 支持模型重定向和默认测速模型配置
@@ -45,10 +45,17 @@
45
45
 
46
46
  - 集中存储在 `~/.cc-tool`
47
47
  - 保留并同步各平台原生配置目录,而不是替代原生用法
48
- - 支持 Prompts 预设管理,并同步到 Claude、Codex、Gemini、OpenCode 对应提示文件;OMP 同步为原生 prompt templates
48
+ - 支持 Prompts 预设管理,并同步到声明 `prompts` capability 的平台提示文件;具体平台能力以 Manifest 为准
49
49
  - 支持 Skills、Agents、Commands、Plugins 的中心托管与按支持的平台启停
50
50
  - OMP Commands 按 OMP 原生语义管理为 slash commands,OMP Plugins 按 packages / extensions 管理
51
51
  - 支持 MCP 服务器配置、预设、连通性测试和多平台写入;OMP 写入原生 `mcp.json`
52
+ - Skill 仓库只保存 source reference;手动刷新时下载仓库中发现的每个 Skill 完整目录,不保存仓库归档或 tree
53
+ - 每个 CLI 使用独立的 Skill artifact 格式和目录:`claude-skill-v1`、`codex-skill-v1`、`gemini-skill-v1`、`opencode-skill-v1`、`omp-skill-v1`
54
+ - Skill 页面进入、浏览器刷新和页面切换只扫描本地;只有用户点击“刷新远端”才创建异步网络任务
55
+ - Skill `enabled` 控制实际 CLI/OMP 加载;关闭只移除 native projection,不删除本地 artifact
56
+ - 新下载 Skill 默认 `trust=needs_review`、`enabled=false`,审批前不会进入实际运行面
57
+ - 所有扫描到的 Skill 默认登记为 `managed=true`;`managed` 不等于已启用
58
+ - OMP 可将提示词同步为原生 prompt templates;MCP/Skill activation、trust 和 secret reference 由同一有效控制面管理
52
59
  - 支持 Claude、Codex、Gemini、OpenCode 的 OAuth 凭证池管理与回写原生配置;OMP auth 通过原生配置导入导出保留
53
60
  - 支持 ZIP / JSON 配置导入导出
54
61
 
@@ -59,7 +66,7 @@
59
66
  - 支持配置模板,将提示词、技能、命令、代理、MCP、插件组合成一套模板
60
67
  - 支持 Dashboard、Analytics、日志、统计导出、环境诊断
61
68
  - 支持面板访问密码
62
- - LAN 模式默认允许远程写操作,可用环境变量关闭
69
+ - LAN 模式默认禁止远程写操作;只有显式设置 `CC_TOOL_ALLOW_REMOTE_WRITE=true` 才允许
63
70
 
64
71
  ### 通知
65
72
 
@@ -73,7 +80,7 @@
73
80
  | --- | --- | --- | --- | --- | --- |
74
81
  | 项目 / 会话查看 | 支持 | 支持 | 支持 | 支持 | 支持 |
75
82
  | 渠道 / 代理管理 | 支持 | 支持 | 支持 | 支持 | 支持,含余额显示与批量测速 |
76
- | Prompts 预设同步 | 支持 | 支持 | 支持 | 支持 | 写入 OMP prompt templates |
83
+ | Prompts 预设同步 | 支持 | 支持 | 支持 | 支持 | 不提供集中式提示文件同步 |
77
84
  | Skills 管理 | 支持 | 支持 | 支持 | 支持 | 原生支持 |
78
85
  | Commands 管理 | 支持 | 支持 | 支持 | 支持 | 映射为 OMP commands |
79
86
  | Agents 管理 | 支持 | 用户级 | 支持 | 支持 | 不提供直接原生管理 |
@@ -87,10 +94,18 @@
87
94
 
88
95
  - Codex Agents 目前仅支持用户级代理
89
96
  - OpenCode 会话读取使用内置 `node:sqlite`,不再依赖本机 sqlite3 可执行文件
90
- - OMP 的原生资源轴包含 skills、commands、prompt templates、packages / extensions 和 MCP `mcp.json`;Agents 暂不作为独立可写配置文件管理
97
+ - OMP 的原生资源轴包含 skills、commands、prompt templates、packages / extensions 和 MCP `mcp.json`;集中式 Prompts 预设不向 OMP 同步,Agents 暂不作为独立可写配置文件管理
91
98
  - OMP 平台键统一为 `omp`,不再保留 `omp` 平台键兼容
92
99
  - OMP OAuth 不在 OAuth Credentials 抽屉中直接增删改;`auth.json` 仍随 Config Export / Import 的 native config 快照迁移
93
100
 
101
+ ## 配置驱动的平台扩展
102
+
103
+ - 平台目录由 Registry 统一发布;用户 Manifest 放在 `~/.cc-tool/config/platforms.json`,修改后由服务重新加载。
104
+ - 通用 CLI 必须提供有效 Manifest,并且只能使用项目 allowlist 中的通用 capability driver;声明式配置不会自动赋予任意 CLI 完整功能。
105
+ - 非标准协议(例如特殊数据库、OAuth / keychain 或平台专有配置语义)必须由专用 capability driver 实现,不能仅靠 Manifest 拼接出等价行为。
106
+ - 用户配置禁止加载任意 Node.js 模块、执行函数值或 shell 命令;Manifest 只能引用受控路径和已登记的 driver。
107
+ - 现有 CLI/API facade、OMP managed mode、旧的 mock path 和测试 seam 会继续保留;配置驱动扩展不会替换已有平台专用实现。
108
+
94
109
  ## 安装
95
110
 
96
111
  ### 全局安装
@@ -155,11 +170,11 @@ ctx ui --host
155
170
  LAN 模式说明:
156
171
 
157
172
  - 服务会监听 `0.0.0.0`
158
- - 默认允许 LAN 远程写操作,便于从其他设备操作和修改
159
- - 如需禁止远程写操作,可显式设置:
173
+ - 默认禁止 LAN 远程写操作,保护 Skill/MCP/配置控制面
174
+ - 如需允许远程写操作,必须显式设置:
160
175
 
161
176
  ```bash
162
- CC_TOOL_ALLOW_REMOTE_WRITE=false ctx ui --host
177
+ CC_TOOL_ALLOW_REMOTE_WRITE=true ctx ui --host
163
178
  ```
164
179
 
165
180
  ### 单独控制平台代理
@@ -247,6 +262,25 @@ ctx omp start
247
262
  - 聊天历史查看
248
263
  - 收藏、别名、删除、复制启动命令,部分平台支持 Fork
249
264
 
265
+
266
+ #### 项目级配置
267
+
268
+ 在项目历史会话页点击“项目配置”,可管理当前项目的项目指令、Skill 和 MCP。
269
+ 项目级 Skill 页面只扫描本地 artifact/native roots;远端仓库不会因为打开页面、刷新浏览器或切换项目而拉取。
270
+
271
+ 支持的项目级原生位置:
272
+
273
+ | 平台 | 项目指令 | 项目 Skills | 项目 MCP |
274
+ | --- | --- | --- | --- |
275
+ | Claude | `CLAUDE.md` | `.claude/skills/` | `.mcp.json` |
276
+ | Codex | `AGENTS.md` | `.agents/skills/`(读取兼容 `.codex/skills/`) | `.codex/config.toml` 的 `[mcp_servers]` |
277
+ | Gemini | `GEMINI.md` | `.gemini/skills/` | `.gemini/settings.json` 的 `mcpServers` |
278
+ | OpenCode | `.opencode/AGENTS.md`(以平台 Manifest 为准) | `.opencode/skills/` | `.opencode/opencode.json` |
279
+ | OMP | 无单独项目指令文件 | `.omp/skills/` | `.omp/mcp.json` |
280
+
281
+ 项目 Skill 关闭只移除该项目的 native projection,不删除 artifact;同名项目 Skill 优先于 inherited user Skill。
282
+ 平台无法安全投影的 managed project Skill 返回 `projection: unsupported`,不伪造关闭成功。
283
+ 静态 MCP 环境变量、Headers 或凭据禁止写入项目 Git;项目 MCP 只允许环境变量引用或 secret reference。
250
284
  ### 配置管理
251
285
 
252
286
  - Prompts
@@ -350,9 +384,46 @@ npm test
350
384
 
351
385
  ## 已知说明
352
386
 
353
- - `ctx ui --host` 开启 LAN 访问后,默认允许远程写操作;如需只读 LAN 模式,请设置 `CC_TOOL_ALLOW_REMOTE_WRITE=false`
354
- - OpenCode 部分能力依赖本机可访问的 OpenCode 配置目录和 `sqlite3`
355
- - 配置导出包可能包含 API Key、Webhook、OAuth 等敏感信息,请妥善保管
387
+ - `ctx ui --host` 开启 LAN 访问后默认禁止远程写操作;只有显式设置 `CC_TOOL_ALLOW_REMOTE_WRITE=true` 才允许
388
+ - Skill refresh 是异步网络任务;打开 Skill 面板、刷新浏览器和切换页面只扫描本地
389
+ - Skill `enabled` 控制实际 CLI/OMP 加载;关闭不会删除 artifact;新远端 Skill 默认 needs_review/disabled
390
+ - MCP/Skill 的 secret 不写入 control manifest、项目 Git、任务状态、日志或 API 响应
391
+ - 项目 native Skill/MCP 若平台无法安全表达开关,会返回 `projection: unsupported` 或 `external`,不伪造关闭成功
392
+
393
+ ## 可配置 CLI 平台
394
+
395
+ 平台目录由 Registry 统一提供。用户扩展写入:
396
+
397
+ ```text
398
+ ~/.cc-tool/config/platforms.json
399
+ ```
400
+
401
+ 每个平台必须通过 Manifest 校验,并只能引用内置 allowlisted driver(例如 `generic-jsonl`、`generic-filesystem` 或 `generic-openai-compatible`)。配置文件不支持任意 Node.js 模块、`require`、函数值或 shell 命令;运行时不会从用户配置动态加载可执行代码。
402
+
403
+ 声明稳定文件协议的平台可以直接复用 generic driver。特殊 SQLite schema、OAuth / keychain、非标准配置或特殊 fork 语义仍需要专用 capability driver;不能仅靠配置保证任意 CLI 获得完整功能对等。
404
+
405
+ 现有 `ctx claude ...`、`ctx codex ...` 等 CLI/API 路径继续保留。`GET /api/platforms` 只返回安全的公共元数据;旧 facade、`require.resolve()` + `require.cache` 测试 seam 以及 OMP managed mode 都是有意保留的兼容契约。
406
+
407
+ ### 原生路径覆盖
408
+
409
+ 原生路径可以单独写入 `~/.cc-tool/config/platform-paths.json`,不需要修改平台 Manifest。路径配置只覆盖 `paths`,不会改变平台能力、Driver 或命令定义:
410
+
411
+ ```json
412
+ {
413
+ "platforms": {
414
+ "demo-cli": {
415
+ "paths": {
416
+ "home": "/opt/demo-cli",
417
+ "sessions": "/opt/demo-cli/history",
418
+ "settings": "/opt/demo-cli/settings.json",
419
+ "channels": "/opt/demo-cli/cc-tool/channels.json"
420
+ }
421
+ }
422
+ }
423
+ }
424
+ ```
425
+
426
+ 路径值支持 `{home}` 和 `$ENV_VAR`;内置平台未配置覆盖时继续使用原有默认目录。配置变化不会自动搬迁已有数据;无效覆盖文件会被忽略并记录诊断信息。
356
427
 
357
428
  ## 相关文档
358
429
 
@@ -0,0 +1 @@
1
+ import{i as e,s as a,t as l}from"./_plugin-vue_export-helper-BeLZJZij.js";import{C as t,D as s,K as n,O as i,S as o,V as u,W as c,Y as d,Z as r,_t as p,b as v,et as f,g,ht as m,m as y,mt as h,r as b,st as k,w as _,x as w}from"./vue-vendor-BqZbbXHA.js";import{n as C}from"./client-UDwXBP9i.js";import{r as x,s as j,t as M}from"./platforms-CBkB45JP.js";import{A as z,B as N,Ft as P,Mt as U,N as F,U as I,_ as $,h as B,p as O,tt as D,v as L,w as S}from"./icons-B2Vg-IOC.js";import{l as q}from"./light-Cp0t7v32.js";import{a as A,c as R,i as T,o as E,r as V,s as G,t as H}from"./AssetPathField-Bd_nMFu3.js";import{n as W,t as Y}from"./useResponsiveDrawer-jbmqZuJs.js";import{t as K}from"./DrawerContent-ChXgZ1Xm.js";import{$ as Z,B as J,F as Q,I as X,N as ee,Nt as ae,O as le,V as te,ct as se,dt as ne,et as ie,k as oe,lt as ue,nt as ce,pt as de,tt as re}from"./index-BMAUPq5K.js";import{t as pe}from"./MarkdownEditor-CYmLGYju.js";async function ve(e=null,a="claude",l={}){const t=le("agents",a,l.scope||"",e||"");return oe(t,l=>C.get("/agents",{params:e?{projectPath:e,platform:a}:{platform:a},signal:l}).then(e=>e.data),"agents",`agents:${a}`)}var fe={class:"asset-card-main"},ge={class:"asset-card-top"},me={class:"asset-card-title-stack"},ye={class:"asset-card-title-row"},he={class:"asset-name"},be={class:"asset-tags"},ke={key:0,class:"asset-description"},_e={class:"asset-meta"},we={key:0,class:"asset-meta-item"},Ce={key:1,class:"asset-meta-item"},xe={class:"asset-card-actions"},je={class:"asset-platform-strip"},Me=["onClick"],ze=l({__name:"AgentCard",props:{agent:{type:Object,required:!0},deleting:{type:Boolean,default:!1},registryInfo:{type:Object,default:null},toggling:{type:Boolean,default:!1}},emits:["click","edit","delete","toggle-enabled","toggle-platform"],setup(l,{emit:u}){const r=l,b=u,{byCapability:k}=ae(),C=v(()=>k("agents"));return(u,v)=>{return c(),_("div",{class:m(["agent-card asset-card",{"is-project":"project"===l.agent.scope,"is-managed":l.registryInfo}]),onClick:v[4]||(v[4]=e=>b("click",l.agent))},[w("div",fe,[w("div",ge,[w("div",me,[w("div",ye,[w("span",{class:m(["asset-status-dot",{active:l.registryInfo?.enabled||"project"===l.agent.scope}])},null,2),w("span",he,p(l.agent.name),1)]),w("div",be,[i(h(ne),{type:"user"===l.agent.scope?"info":"success",size:"tiny",bordered:!1},{default:f(()=>[s(p("user"===l.agent.scope?"用户级":"项目级"),1)]),_:1},8,["type"]),l.registryInfo?(c(),o(h(ne),{key:0,type:"success",size:"tiny",bordered:!1},{default:f(()=>[...v[5]||(v[5]=[s("托管",-1)])]),_:1})):t("",!0),l.agent.model?(c(),o(h(ne),{key:1,type:"warning",size:"tiny",bordered:!1},{default:f(()=>[s(p(l.agent.model),1)]),_:1})):t("",!0)])])]),l.agent.description?(c(),_("div",ke,p((x=l.agent.description,x?x.length>80?x.slice(0,80)+"...":x:"")),1)):t("",!0),w("div",_e,[l.agent.tools?(c(),_("span",we,[i(h(e),{size:"12"},{default:f(()=>[i(h(I))]),_:1}),s(" "+p((k=l.agent.tools,k?k.length>30?k.slice(0,30)+"...":k:"")),1)])):t("",!0),l.agent.permissionMode?(c(),_("span",Ce,[i(h(e),{size:"12"},{default:f(()=>[i(h(O))]),_:1}),s(" "+p(l.agent.permissionMode),1)])):t("",!0)])]),w("div",xe,[l.registryInfo?(c(),_(g,{key:0},[i(h(Z),{trigger:"hover"},{trigger:f(()=>[i(h(Q),{value:l.registryInfo.enabled,size:"small",loading:l.toggling,"onUpdate:value":v[0]||(v[0]=e=>b("toggle-enabled",l.agent,e)),onClick:v[1]||(v[1]=y(()=>{},["stop"]))},null,8,["value","loading"])]),default:f(()=>[s(" "+p(l.registryInfo.enabled?"已启用":"已禁用"),1)]),_:1}),w("div",je,[(c(!0),_(g,null,n(C.value,a=>(c(),o(h(Z),{key:a.key,trigger:"hover"},{trigger:f(()=>[w("span",{class:m(["asset-platform-icon",{active:l.registryInfo.platforms?.[a.key]}]),onClick:y(e=>b("toggle-platform",l.agent,a.key,!l.registryInfo.platforms?.[a.key]),["stop"])},[i(h(e),{size:"14"},{default:f(()=>[(c(),o(d(a.icon)))]),_:2},1024)],10,Me)]),default:f(()=>[s(" "+p(a.label||a.title||a.key)+" "+p(l.registryInfo.platforms?.[a.key]?"已启用":"未启用"),1)]),_:2},1024))),128))])],64)):(c(),_(g,{key:1},[i(h(a),{size:"tiny",tertiary:"",onClick:v[2]||(v[2]=y(e=>b("edit",l.agent),["stop"]))},{default:f(()=>[...v[6]||(v[6]=[s(" 编辑 ",-1)])]),_:1}),i(h(a),{size:"tiny",tertiary:"",type:"error",loading:r.deleting,onClick:v[3]||(v[3]=y(e=>b("delete",l.agent),["stop"]))},{default:f(()=>[...v[7]||(v[7]=[s(" 删除 ",-1)])]),_:1},8,["loading"])],64))])],2);var k,x}}},[["__scopeId","data-v-044e4192"]]),Ne={class:"asset-detail-drawer-header"},Pe={class:"asset-detail-identity"},Ue={class:"asset-detail-heading"},Fe={class:"asset-detail-name"},Ie={class:"asset-detail-meta"},$e={key:2,class:"asset-detail-subtle"},Be={class:"asset-detail-body"},Oe={key:0,class:"asset-detail-loading"},De={class:"asset-detail-container"},Le={class:"asset-detail-info-section"},Se={class:"asset-detail-description"},qe={class:"asset-detail-info-section"},Ae={class:"asset-detail-list"},Re={class:"asset-detail-row"},Te={class:"asset-detail-value"},Ee={key:0,class:"asset-detail-row"},Ve={class:"asset-detail-value mono"},Ge={key:1,class:"asset-detail-row"},He={class:"asset-detail-value mono"},We={key:2,class:"asset-detail-row"},Ye={class:"asset-detail-value"},Ke={key:3,class:"asset-detail-row"},Ze={class:"asset-detail-value"},Je={key:4,class:"asset-detail-row"},Qe={class:"asset-detail-value"},Xe={key:1,class:"asset-detail-info-section"},ea={class:"asset-detail-box"},aa={class:"asset-detail-code"},la={key:2,class:"asset-detail-empty"},ta={__name:"AgentDetailDrawer",props:{visible:{type:Boolean,default:!1},agent:{type:Object,default:null},platform:{type:String,default:"claude"},loading:{type:Boolean,default:!1}},emits:["update:visible"],setup(a,{emit:l}){const{drawerWidth:n}=Y(600),u=a,d=l,r=v({get:()=>u.visible,set:e=>d("update:visible",e)}),g={height:"100%",minHeight:0,overflow:"hidden"},m=v(()=>({claude:"Claude Code",codex:"Codex CLI",gemini:"Gemini CLI",opencode:"OpenCode"}[u.platform]||"")),y=v(()=>u.agent?.fileName?"codex"===u.platform?`[agents.${u.agent.fileName}]`:`${u.agent.fileName}.md`:""),b=v(()=>u.agent?"codex"===u.platform?u.agent.fullContent||"(无内容)":u.agent.systemPrompt||"(无内容)":"(无内容)"),k=v(()=>u.agent?.fullPath||u.agent?.path||"");function C(e){return"project"===e?"项目级":"用户级"}return(l,u)=>(c(),o(h(W),{show:r.value,"onUpdate:show":u[0]||(u[0]=e=>r.value=e),width:h(n),placement:"right","show-mask":!0},{default:f(()=>[i(h(K),{closable:"","native-scrollbar":!1,"body-content-style":g},{header:f(()=>[w("div",Ne,[w("div",Pe,[i(h(e),{size:20,class:"asset-detail-icon"},{default:f(()=>[i(h(z))]),_:1}),w("div",Ue,[w("span",Fe,p(a.agent?.name||"代理详情"),1),w("div",Ie,[a.agent?.scope?(c(),o(h(ne),{key:0,type:"project"===a.agent.scope?"success":"info",size:"tiny",bordered:!1},{default:f(()=>[s(p(C(a.agent.scope)),1)]),_:1},8,["type"])):t("",!0),a.agent?.model?(c(),o(h(ne),{key:1,type:"warning",size:"tiny",bordered:!1},{default:f(()=>[s(p(a.agent.model),1)]),_:1})):t("",!0),m.value?(c(),_("span",$e,p(m.value),1)):t("",!0)])])])])]),default:f(()=>[w("div",Be,[a.loading&&!a.agent?(c(),_("div",Oe,[i(h(X),{size:"medium"}),u[1]||(u[1]=w("p",null,"加载代理详情中...",-1))])):a.agent?(c(),o(h(G),{key:1,type:"line",animated:"",class:"asset-detail-tabs"},{default:f(()=>[i(h(R),{name:"overview",tab:"概览"},{default:f(()=>[w("div",De,["codex"===a.platform&&a.agent.configReadError?(c(),o(h(ue),{key:0,type:"warning",bordered:!1},{default:f(()=>[s(p(a.agent.configReadError),1)]),_:1})):t("",!0),w("div",Le,[u[2]||(u[2]=w("h3",{class:"asset-detail-section-title"},"描述",-1)),w("p",Se,p(a.agent.description||"暂无描述"),1)]),w("div",qe,[u[9]||(u[9]=w("h3",{class:"asset-detail-section-title"},"基础信息",-1)),w("div",Ae,[w("div",Re,[u[3]||(u[3]=w("span",{class:"asset-detail-label"},"作用域",-1)),w("span",Te,p(C(a.agent.scope)),1)]),a.agent.fileName?(c(),_("div",Ee,[u[4]||(u[4]=w("span",{class:"asset-detail-label"},"文件名",-1)),w("span",Ve,p(y.value),1)])):t("",!0),"codex"===a.platform&&a.agent.configFile?(c(),_("div",Ge,[u[5]||(u[5]=w("span",{class:"asset-detail-label"},"config_file",-1)),w("span",He,p(a.agent.configFile),1)])):t("",!0),a.agent.model?(c(),_("div",We,[u[6]||(u[6]=w("span",{class:"asset-detail-label"},"模型",-1)),w("span",Ye,p(a.agent.model),1)])):t("",!0),a.agent.permissionMode?(c(),_("div",Ke,[u[7]||(u[7]=w("span",{class:"asset-detail-label"},"权限模式",-1)),w("span",Ze,p(a.agent.permissionMode),1)])):t("",!0),a.agent.skills?(c(),_("div",Je,[u[8]||(u[8]=w("span",{class:"asset-detail-label"},"技能",-1)),w("span",Qe,p(a.agent.skills),1)])):t("",!0)])]),a.agent.tools?(c(),_("div",Xe,[u[10]||(u[10]=w("h3",{class:"asset-detail-section-title"},"可用工具",-1)),w("div",ea,[i(h(e),{size:16},{default:f(()=>[i(h(I))]),_:1}),w("code",null,p(a.agent.tools),1)])])):t("",!0),i(H,{path:k.value},null,8,["path"])])]),_:1}),i(h(R),{name:"content",tab:"codex"===a.platform?"配置":"提示词"},{default:f(()=>[w("pre",aa,p(b.value),1)]),_:1},8,["tab"])]),_:1})):(c(),_("div",la,[i(h(e),{size:44,class:"asset-detail-empty-icon"},{default:f(()=>[i(h(D))]),_:1}),u[11]||(u[11]=w("p",null,"未选择代理",-1))]))])]),_:1})]),_:1},8,["show","width"]))}},sa={class:"config-edit-header"},na={class:"config-edit-identity"},ia={class:"config-edit-icon"},oa={class:"config-edit-title-stack"},ua={class:"config-edit-kicker"},ca={class:"config-edit-title"},da={class:"config-edit-badges"},ra={class:"config-edit-section"},pa={class:"section-heading"},va={class:"field-grid"},fa={class:"scope-option"},ga={class:"scope-path"},ma={class:"scope-option"},ya={class:"scope-path"},ha={key:0,class:"platform-note"},ba={class:"config-edit-section"},ka={class:"section-heading"},_a={key:1,class:"empty-config-box"},wa={class:"field-grid"},Ca={key:0,class:"config-edit-section content-section"},xa={class:"section-heading"},ja={class:"modal-footer"},Ma=l({__name:"AgentFormModal",props:{visible:{type:Boolean,default:!1},agent:{type:Object,default:null},projectPath:{type:String,default:null},platform:{type:String,default:"claude"}},emits:["update:visible","saved"],setup(l,{emit:n}){const u=l,d=n,y=v({get:()=>u.visible,set:e=>d("update:visible",e)}),b=v(()=>!!u.agent),x=v(()=>"codex"===u.platform),j=v(()=>"claude"===u.platform),M=v(()=>"codex"===u.platform||"opencode"===u.platform),P=v(()=>b.value?"编辑代理":"创建代理"),U=v(()=>({claude:"Claude Code",codex:"Codex CLI",gemini:"Gemini CLI",opencode:"OpenCode"}[u.platform]||"Claude Code")),I=v(()=>"codex"===u.platform?"~/.codex/config.toml":"opencode"===u.platform?"~/.config/opencode/agents/":"gemini"===u.platform?"~/.gemini/agents/":"~/.claude/agents/"),$=v(()=>"opencode"===u.platform?".opencode/agents/":"gemini"===u.platform?".gemini/agents/":".claude/agents/"),O=v(()=>"project"===H.value.scope?"项目级":"用户级"),S=v(()=>G.find(e=>e.value===H.value.configMode)?.label||"配置"),A=k(null),R=k(!1),T={maxHeight:"calc(92vh - 134px)",overflowY:"auto",paddingBottom:"18px"},E=[{label:"Sonnet",value:"sonnet"},{label:"Opus",value:"opus"},{label:"Haiku",value:"haiku"},{label:"继承 (inherit)",value:"inherit"}],V=[{label:"默认 (default)",value:"default"},{label:"宽松 (permissive)",value:"permissive"},{label:"严格 (strict)",value:"strict"}],G=[{label:"仅描述",value:"none"},{label:"托管 TOML",value:"managed"},{label:"自定义路径",value:"custom"}],H=k({fileName:"",scope:"user",name:"",description:"",configMode:"none",configFile:"",configContent:"",tools:"",model:"",permissionMode:"",skills:"",systemPrompt:""}),W=v(()=>{const e={fileName:{required:!0,message:"请输入文件名",trigger:"blur"},scope:{required:!0,message:"请选择作用域",trigger:"change"},description:{required:!0,message:"请输入代理描述",trigger:"blur"}};return j.value&&(e.name={required:!0,message:"请输入代理名称",trigger:"blur"}),x.value&&(e.configMode={required:!0,message:"请选择配置模式",trigger:"change"},e.configFile={required:"custom"===H.value.configMode,message:"请输入自定义配置文件路径",trigger:"blur"}),e});function Y(){H.value={fileName:"",scope:"user",name:"",description:"",configMode:"none",configFile:"",configContent:"",tools:"",model:"",permissionMode:"",skills:"",systemPrompt:""}}function K(){y.value=!1,Y()}async function Z(){try{await(A.value?.validate())}catch{return}R.value=!0;try{const e={...H.value,projectPath:u.projectPath};x.value?("custom"===H.value.configMode?e.configFile=H.value.configFile:delete e.configFile,"managed"===H.value.configMode||"custom"===H.value.configMode?e.configContent=H.value.configContent||"":delete e.configContent):(delete e.configMode,delete e.configFile,delete e.configContent),b.value?(await async function(e,a,l,t="claude"){return(await C.put(`/agents/${a}/${e}`,{...l,platform:t})).data}(H.value.fileName,H.value.scope,e,u.platform),ee.success("代理更新成功")):(await async function(e,a="claude"){return(await C.post("/agents",{...e,platform:a})).data}(e,u.platform),ee.success("代理创建成功")),d("saved"),y.value=!1,Y()}catch(e){ee.error("操作失败: "+e.message)}finally{R.value=!1}}return r(()=>u.agent,e=>{if(e){const a=e.configMode||(e.configFile?String(e.configFile).includes("/.codex/agents/")?"managed":"custom":"none");H.value={fileName:e.fileName||"",scope:e.scope||"user",name:e.name||"",description:e.description||"",configMode:a,configFile:e.configFile||"",configContent:e.fullContent||"",tools:e.tools||"",model:e.model||"",permissionMode:e.permissionMode||"",skills:e.skills||"",systemPrompt:e.systemPrompt||""}}else Y()},{immediate:!0}),r(()=>u.platform,e=>{"codex"===e&&(H.value.scope="user",H.value.configMode||(H.value.configMode="none"))},{immediate:!0}),(l,n)=>(c(),o(h(q),{show:y.value,"onUpdate:show":n[13]||(n[13]=e=>y.value=e),preset:"card",title:P.value,style:{width:"min(940px, 96vw)","max-height":"92vh"},"content-style":T,"mask-closable":!1,class:"config-edit-modal"},{footer:f(()=>[w("div",ja,[i(h(a),{onClick:K},{default:f(()=>[...n[21]||(n[21]=[s("取消",-1)])]),_:1}),i(h(a),{type:"primary",loading:R.value,onClick:Z},{icon:f(()=>[i(h(e),null,{default:f(()=>[i(h(L))]),_:1})]),default:f(()=>[s(" "+p(b.value?"保存":"创建"),1)]),_:1},8,["loading"])])]),default:f(()=>[w("div",sa,[w("div",na,[w("span",ia,[i(h(e),{size:22},{default:f(()=>[i(h(z))]),_:1})]),w("div",oa,[w("span",ua,p(U.value),1),w("span",ca,p(b.value?H.value.fileName||"编辑代理":"创建新代理"),1)])]),w("div",da,[i(h(ne),{size:"small",bordered:!1,type:"info"},{default:f(()=>[s(p(O.value),1)]),_:1}),x.value?(c(),o(h(ne),{key:0,size:"small",bordered:!1,type:"success"},{default:f(()=>[...n[14]||(n[14]=[s("Codex 用户级",-1)])]),_:1})):t("",!0),x.value&&"none"!==H.value.configMode?(c(),o(h(ne),{key:1,size:"small",bordered:!1,type:"warning"},{default:f(()=>[s(p(S.value),1)]),_:1})):t("",!0)])]),i(h(te),{ref_key:"formRef",ref:A,model:H.value,rules:W.value,"label-placement":"top","require-mark-placement":"right-hanging",class:"config-edit-form"},{default:f(()=>[w("div",{class:m(["config-edit-grid",{"is-codex":x.value}])},[w("section",ra,[w("div",pa,[i(h(e),{size:16},{default:f(()=>[i(h(F))]),_:1}),n[15]||(n[15]=w("span",null,"基础信息",-1))]),w("div",va,[i(h(J),{label:"文件名",path:"fileName"},{default:f(()=>[i(h(se),{value:H.value.fileName,"onUpdate:value":n[0]||(n[0]=e=>H.value.fileName=e),disabled:b.value,placeholder:"code-reviewer"},null,8,["value","disabled"])]),_:1}),j.value?(c(),o(h(J),{key:0,label:"显示名称",path:"name"},{default:f(()=>[i(h(se),{value:H.value.name,"onUpdate:value":n[1]||(n[1]=e=>H.value.name=e),placeholder:"代理的显示名称"},null,8,["value"])]),_:1})):t("",!0)]),i(h(J),{label:"作用域",path:"scope"},{default:f(()=>[i(h(ie),{value:H.value.scope,"onUpdate:value":n[2]||(n[2]=e=>H.value.scope=e),disabled:b.value,class:m(["scope-picker",{"single-option":x.value}])},{default:f(()=>[i(h(re),{value:"user"},{default:f(()=>[w("span",fa,[n[16]||(n[16]=w("span",{class:"scope-title"},"用户级",-1)),w("span",ga,p(I.value),1)])]),_:1}),x.value?t("",!0):(c(),o(h(re),{key:0,value:"project"},{default:f(()=>[w("span",ma,[n[17]||(n[17]=w("span",{class:"scope-title"},"项目级",-1)),w("span",ya,p($.value),1)])]),_:1}))]),_:1},8,["value","disabled","class"])]),_:1}),i(h(J),{label:"描述",path:"description"},{default:f(()=>[i(h(se),{value:H.value.description,"onUpdate:value":n[3]||(n[3]=e=>H.value.description=e),type:"textarea",autosize:{minRows:3,maxRows:5},placeholder:"一句话说明这个代理什么时候该被调用"},null,8,["value"])]),_:1}),x.value?(c(),_("div",ha,[i(h(e),{size:16},{default:f(()=>[i(h(N))]),_:1}),n[18]||(n[18]=w("span",null,[s("Codex agents 写入用户级配置。描述会进入 "),w("code",null,"~/.codex/config.toml"),s(",TOML 配置可托管到 "),w("code",null,"~/.codex/agents/"),s("。")],-1))])):t("",!0)]),w("section",ba,[w("div",ka,[i(h(e),{size:16},{default:f(()=>[i(h(B))]),_:1}),w("span",null,p(x.value?"运行配置":"模型与权限"),1)]),x.value?(c(),_(g,{key:0},[i(h(J),{label:"配置模式",path:"configMode"},{default:f(()=>[i(h(ce),{value:H.value.configMode,"onUpdate:value":n[4]||(n[4]=e=>H.value.configMode=e),options:G,placeholder:"选择配置模式"},null,8,["value"])]),_:1}),"custom"===H.value.configMode?(c(),o(h(J),{key:0,label:"配置文件路径",path:"configFile"},{default:f(()=>[i(h(se),{value:H.value.configFile,"onUpdate:value":n[5]||(n[5]=e=>H.value.configFile=e),placeholder:"~/.omx/agents/my-agent.toml"},null,8,["value"])]),_:1})):t("",!0),"none"===H.value.configMode?(c(),_("div",_a,[i(h(e),{size:18},{default:f(()=>[i(h(D))]),_:1}),n[19]||(n[19]=w("span",null,"仅保存代理描述,不额外写入模型或工具配置。",-1))])):(c(),o(h(J),{key:2,label:"Agent Config (TOML)",path:"configContent",class:"editor-form-item"},{default:f(()=>[i(h(se),{value:H.value.configContent,"onUpdate:value":n[6]||(n[6]=e=>H.value.configContent=e),type:"textarea",autosize:{minRows:14,maxRows:22},class:"toml-editor",placeholder:'model = "gpt-5.4"'},null,8,["value"])]),_:1}))],64)):(c(),_(g,{key:1},[i(h(J),{label:"可用工具",path:"tools"},{default:f(()=>[i(h(se),{value:H.value.tools,"onUpdate:value":n[7]||(n[7]=e=>H.value.tools=e),placeholder:"Read, Edit, Bash"},null,8,["value"])]),_:1}),i(h(J),{label:"模型",path:"model"},{default:f(()=>[M.value?(c(),o(h(se),{key:0,value:H.value.model,"onUpdate:value":n[8]||(n[8]=e=>H.value.model=e),placeholder:"gpt-5, claude-sonnet-4, openrouter/model"},null,8,["value"])):(c(),o(h(ce),{key:1,value:H.value.model,"onUpdate:value":n[9]||(n[9]=e=>H.value.model=e),options:E,placeholder:"选择模型",clearable:""},null,8,["value"]))]),_:1}),w("div",wa,["opencode"!==u.platform?(c(),o(h(J),{key:0,label:"权限模式",path:"permissionMode"},{default:f(()=>[i(h(ce),{value:H.value.permissionMode,"onUpdate:value":n[10]||(n[10]=e=>H.value.permissionMode=e),options:V,placeholder:"选择权限模式",clearable:""},null,8,["value"])]),_:1})):t("",!0),"opencode"!==u.platform?(c(),o(h(J),{key:1,label:"技能",path:"skills"},{default:f(()=>[i(h(se),{value:H.value.skills,"onUpdate:value":n[11]||(n[11]=e=>H.value.skills=e),placeholder:"自动加载的技能,逗号分隔"},null,8,["value"])]),_:1})):t("",!0)])],64))]),x.value?t("",!0):(c(),_("section",Ca,[w("div",xa,[i(h(e),{size:16},{default:f(()=>[i(h(D))]),_:1}),n[20]||(n[20]=w("span",null,"系统提示词",-1))]),i(h(J),{path:"systemPrompt","show-label":!1,class:"editor-form-item"},{default:f(()=>[i(pe,{modelValue:H.value.systemPrompt,"onUpdate:modelValue":n[12]||(n[12]=e=>H.value.systemPrompt=e),rows:10,"min-height":240,placeholder:"定义代理的行为、边界和输出要求","default-editing":!b.value},null,8,["modelValue","default-editing"])]),_:1})]))],2)]),_:1},8,["model","rules"])]),_:1},8,["show","title"]))}},[["__scopeId","data-v-00915421"]]),za={key:0,class:"asset-panel-header"},Na={class:"asset-title-group"},Pa={class:"asset-heading"},Ua={class:"asset-title-row"},Fa={class:"asset-platform-pill"},Ia={key:0,class:"asset-action-row"},$a={key:1,class:"asset-drawer-toolbar"},Ba={key:0,class:"asset-action-row"},Oa={class:"asset-summary"},Da={class:"asset-summary-item"},La={class:"asset-summary-value"},Sa={class:"asset-summary-item"},qa={class:"asset-summary-value"},Aa={class:"asset-summary-item"},Ra={class:"asset-summary-value"},Ta={class:"asset-summary-item"},Ea={class:"asset-summary-value"},Va={class:"asset-filter-bar"},Ga={class:"asset-panel-content"},Ha={key:0,class:"asset-empty"},Wa={key:1,class:"asset-list"},Ya={class:"asset-footer"},Ka=l({__name:"AgentsPanel",props:{hideBack:{type:Boolean,default:!1},inDrawer:{type:Boolean,default:!1},projectPath:{type:String,default:null},platform:{type:String,default:""}},emits:["back","updated"],setup(l,{emit:d}){const y=l,F=d,I=M(),B=b(),O=k([]),D=k(!1),L=k(""),q=k("all"),R=k(!1),G=k(!1),H=k(null),W=k(!1),Y=k(null),K=k({}),Z=k({}),J=k({});let Q=0;const{byCapability:te}=ae(),ne=v(()=>te("agents").map(e=>e.key)),ie=v(()=>ne.value.includes(ue.value)),ue=v(()=>String(y.platform||x(B)||"").trim().toLowerCase()),re=v(()=>"opencode"===ue.value?"使用 @agent 或 Task 在 OpenCode 中调用":"gemini"===ue.value?"使用 @agent 调用 Gemini 自定义代理":"使用 Task tool 调用自定义代理"),pe=v(()=>{const e=I.get(ue.value)||j(ue.value);return e.label||e.title||"Claude Code"}),fe=[{label:"全部",value:"all"},{label:"用户级",value:"user"},{label:"项目级",value:"project"},{label:"已托管",value:"managed"}],ge=v(()=>O.value.filter(e=>"user"===e.scope).length),me=v(()=>O.value.filter(e=>"project"===e.scope).length),ye=v(()=>Object.keys(Z.value).length);function he(e){if(!e)return"";const a="string"==typeof e.scope&&e.scope.trim()?e.scope.trim():"unknown",l="string"==typeof e.path&&e.path.trim()?e.path.trim():"",t="string"==typeof e.fileName&&e.fileName.trim()?e.fileName.trim():"";return`${a}:${l||t}`}function be(e){if(!e)return"";const a=[];if("string"==typeof e.path&&e.path.trim()&&a.push(e.path.trim()),"string"==typeof e.fileName&&e.fileName.trim()){const l=e.fileName.trim();a.push(`${l}.md`,l)}"string"==typeof e.name&&e.name.trim()&&a.push(e.name.trim());for(const l of a)if(Z.value[l])return l;return a[0]||""}const ke=v(()=>{let e=O.value;if("user"===q.value?e=e.filter(e=>"user"===e.scope):"project"===q.value?e=e.filter(e=>"project"===e.scope):"managed"===q.value&&(e=e.filter(e=>Z.value[be(e)])),L.value.trim()){const a=L.value.toLowerCase();e=e.filter(e=>e.name?.toLowerCase().includes(a)||e.description?.toLowerCase().includes(a)||e.fileName?.toLowerCase().includes(a))}return e}),_e=v(()=>L.value?"没有匹配的代理":"user"===q.value?"暂无用户级代理":"project"===q.value?"暂无项目级代理":"managed"===q.value?"暂无托管的代理":ie.value?"暂无自定义代理":`${pe.value} 暂未提供 Agents 能力`);async function we(){if(!ie.value)return O.value=[],Z.value={},void(D.value=!1);D.value=!0;try{const[e,a]=await Promise.all([ve(y.projectPath,ue.value),V("agents",{platform:ue.value,projectPath:y.projectPath})]);if(e.success&&(O.value=e.agents||[]),a.success){Z.value={};for(const[e,l]of Object.entries(a.items||{}))Z.value[e]=l}}catch(e){ee.error("加载代理列表失败: "+e.message)}finally{D.value=!1}}async function Ce(e,a){const l=be(e);if(l){J.value[l]=!0;try{(await A("agents",l,a)).success&&(ee.success(a?"已启用":"已禁用"),await we())}catch(t){ee.error("切换失败: "+t.message)}finally{delete J.value[l]}}else ee.error("未找到代理对应的托管配置键")}async function xe(e,a,l){const t=be(e);if(t){J.value[t]=!0;try{(await E("agents",t,a,l)).success&&(ee.success(`${a} ${l?"已启用":"已禁用"}`),await we())}catch(s){ee.error("切换失败: "+s.message)}finally{delete J.value[t]}}else ee.error("未找到代理对应的托管配置键")}async function je(){D.value=!0;try{const e=await T("agents");e?.success||ee.warning(e?.message||"同步失败,已继续刷新列表")}catch(e){ee.warning("同步失败,已继续刷新列表: "+e.message)}await we()}function Me(){Y.value=null,R.value=!0}function Ne(e){R.value=e,e||(Y.value=null)}function Pe(e){Fe(e,!0)}async function Ue(e){const a=he(e);K.value[a]=!0;try{(await async function(e,a,l=null,t="claude"){const s={};return t&&(s.platform=t),l&&(s.projectPath=l),(await C.delete(`/agents/${a}/${e}`,{params:s})).data}(e.fileName,e.scope,y.projectPath,ue.value)).success&&(ee.success("代理已删除"),await we(),F("updated"))}catch(l){ee.error("删除失败: "+l.message)}finally{delete K.value[a]}}async function Fe(e,a=!1){if(!e)return;const l=++Q;W.value=!0,a||(H.value=null,G.value=!0);try{const t=await async function(e,a,l=null,t="claude"){const s={};t&&(s.platform=t),l&&(s.projectPath=l);const n=le(`agent-detail:${e}`,t,a||"",l||"");return oe(n,l=>C.get(`/agents/${a}/${e}`,{params:s,signal:l}).then(e=>e.data),"agent-detail",`agent-detail:${t}`)}(e.fileName,e.scope,y.projectPath,ue.value);if(l!==Q)return;const s=t?.agent||e;a?(Y.value=s,R.value=!0):H.value=s}catch(t){if(l!==Q)return;ee.error("加载代理详情失败: "+t.message),a?(Y.value=e,R.value=!0):H.value=e}finally{l===Q&&(W.value=!1)}}function Ie(e){Fe(e,!1)}function $e(){Y.value=null,we(),F("updated")}function Be(){F("back")}return u(()=>{we()}),r(ue,()=>{Q+=1,W.value=!1,H.value=null,we()}),(u,d)=>(c(),_("div",{class:m(["agents-panel asset-panel",{"in-drawer":y.inDrawer}])},[y.inDrawer?t("",!0):(c(),_("div",za,[w("div",Na,[y.hideBack?t("",!0):(c(),o(h(a),{key:0,text:"",onClick:Be,class:"back-btn"},{icon:f(()=>[i(h(e),null,{default:f(()=>[i(h(U))]),_:1})]),_:1})),w("div",Pa,[w("div",Ua,[d[3]||(d[3]=w("span",{class:"asset-title"},"代理管理",-1)),w("span",Fa,p(pe.value),1)]),d[4]||(d[4]=w("div",{class:"asset-subtitle"},"维护自定义代理、工具权限和平台启用状态",-1))])]),ie.value?(c(),_("div",Ia,[i(h(a),{text:"",onClick:Me,class:"action-btn"},{icon:f(()=>[i(h(e),null,{default:f(()=>[i(h(P))]),_:1})]),default:f(()=>[d[5]||(d[5]=s(" 创建 ",-1))]),_:1}),i(h(a),{text:"",onClick:je,loading:D.value,class:"action-btn"},{icon:f(()=>[i(h(e),null,{default:f(()=>[i(h(S))]),_:1})]),default:f(()=>[d[6]||(d[6]=s(" 刷新 ",-1))]),_:1},8,["loading"])])):t("",!0)])),y.inDrawer?(c(),_("div",$a,[ie.value?(c(),_("div",Ba,[i(h(a),{text:"",onClick:Me,class:"action-btn"},{icon:f(()=>[i(h(e),null,{default:f(()=>[i(h(P))]),_:1})]),default:f(()=>[d[7]||(d[7]=s(" 创建 ",-1))]),_:1}),i(h(a),{text:"",onClick:je,loading:D.value,class:"action-btn"},{icon:f(()=>[i(h(e),null,{default:f(()=>[i(h(S))]),_:1})]),default:f(()=>[d[8]||(d[8]=s(" 刷新 ",-1))]),_:1},8,["loading"])])):t("",!0)])):t("",!0),w("div",Oa,[w("span",Da,[d[9]||(d[9]=w("span",{class:"asset-summary-label"},"全部",-1)),w("span",La,p(O.value.length),1)]),w("span",Sa,[d[10]||(d[10]=w("span",{class:"asset-summary-label"},"用户级",-1)),w("span",qa,p(ge.value),1)]),w("span",Aa,[d[11]||(d[11]=w("span",{class:"asset-summary-label"},"项目级",-1)),w("span",Ra,p(me.value),1)]),w("span",Ta,[d[12]||(d[12]=w("span",{class:"asset-summary-label"},"托管",-1)),w("span",Ea,p(ye.value),1)])]),w("div",Va,[i(h(se),{value:L.value,"onUpdate:value":d[0]||(d[0]=e=>L.value=e),placeholder:"搜索代理、描述或文件名",clearable:"",size:"small",class:"asset-search"},{prefix:f(()=>[i(h(e),null,{default:f(()=>[i(h($))]),_:1})]),_:1},8,["value"]),i(h(ce),{value:q.value,"onUpdate:value":d[1]||(d[1]=e=>q.value=e),options:fe,size:"small",class:"asset-filter"},null,8,["value"])]),w("div",Ga,[i(h(X),{show:D.value},{default:f(()=>[0!==ke.value.length||D.value?(c(),_("div",Wa,[(c(!0),_(g,null,n(ke.value,e=>(c(),o(ze,{key:he(e),agent:e,deleting:!!K.value[he(e)],"registry-info":Z.value[be(e)],toggling:!!J.value[be(e)],onEdit:Pe,onDelete:Ue,onClick:Ie,onToggleEnabled:Ce,onTogglePlatform:xe},null,8,["agent","deleting","registry-info","toggling"]))),128))])):(c(),_("div",Ha,[i(h(de),{description:_e.value},{icon:f(()=>[i(h(e),{size:"48",color:"var(--text-quaternary)"},{default:f(()=>[i(h(z))]),_:1})]),extra:f(()=>[ie.value?(c(),o(h(a),{key:0,size:"small",onClick:Me},{default:f(()=>[...d[13]||(d[13]=[s(" 创建第一个代理 ",-1)])]),_:1})):t("",!0)]),_:1},8,["description"])]))]),_:1},8,["show"])]),w("div",Ya,[i(h(e),{size:"14",class:"asset-info-icon"},{default:f(()=>[i(h(N))]),_:1}),w("span",null,p(re.value),1)]),i(Ma,{visible:R.value,"onUpdate:visible":Ne,agent:Y.value,"project-path":l.projectPath,platform:ue.value,onSaved:$e},null,8,["visible","agent","project-path","platform"]),i(ta,{visible:G.value,"onUpdate:visible":d[2]||(d[2]=e=>G.value=e),agent:H.value,platform:ue.value,loading:W.value},null,8,["visible","agent","platform","loading"])],2))}},[["__scopeId","data-v-b673c699"]]),Za=l({__name:"AgentsDrawer",props:{visible:Boolean,platform:{type:String,default:""}},emits:["update:visible"],setup(e,{emit:a}){const l=e,t=a,{drawerWidth:s}=Y(720),n=v({get:()=>l.visible,set:e=>t("update:visible",e)}),u={padding:0,display:"flex",flexDirection:"column",overflow:"hidden"};return(e,a)=>(c(),o(h(W),{show:n.value,"onUpdate:show":a[1]||(a[1]=e=>n.value=e),width:h(s),placement:"right","mask-closable":!0},{default:f(()=>[i(h(K),{closable:"","native-scrollbar":!1,"body-content-style":u},{header:f(()=>[...a[2]||(a[2]=[w("div",{class:"drawer-header"},[w("span",null,"代理管理")],-1)])]),default:f(()=>[i(Ka,{onBack:a[0]||(a[0]=e=>n.value=!1),"hide-back":!0,"in-drawer":!0,platform:l.platform},null,8,["platform"])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-b9b7a7fa"]]);export{Za as default};
@@ -0,0 +1 @@
1
+ .asset-meta-item[data-v-044e4192]{max-width:150px}.config-edit-header[data-v-00915421]{border:1px solid var(--border-primary);background:var(--bg-secondary);border-radius:8px;justify-content:space-between;align-items:flex-start;gap:18px;margin:-4px 0 18px;padding:16px;display:flex}.config-edit-identity[data-v-00915421]{align-items:center;gap:12px;min-width:0;display:flex}.config-edit-icon[data-v-00915421]{width:42px;height:42px;color:var(--primary-color);background:oklch(62% .15 151/.1);border:1px solid oklch(62% .15 151/.28);border-radius:8px;flex:none;justify-content:center;align-items:center;display:inline-flex}.config-edit-title-stack[data-v-00915421]{flex-direction:column;gap:3px;min-width:0;display:flex}.config-edit-kicker[data-v-00915421]{color:var(--text-tertiary);font-size:12px;line-height:1.3}.config-edit-title[data-v-00915421]{color:var(--text-primary);text-overflow:ellipsis;white-space:nowrap;font-size:18px;font-weight:650;line-height:1.3;overflow:hidden}.config-edit-badges[data-v-00915421]{flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:6px;display:flex}.config-edit-form[data-v-00915421]{min-width:0}.config-edit-grid[data-v-00915421]{grid-template-columns:minmax(280px,.9fr) minmax(340px,1.1fr);gap:14px;display:grid}.config-edit-grid.is-codex[data-v-00915421]{align-items:start}.config-edit-section[data-v-00915421]{border:1px solid var(--border-primary);background:var(--bg-primary);border-radius:8px;min-width:0;padding:16px}.content-section[data-v-00915421]{grid-column:1/-1}.section-heading[data-v-00915421]{color:var(--text-primary);align-items:center;gap:8px;margin-bottom:14px;font-size:13px;font-weight:650;display:flex}.field-grid[data-v-00915421]{grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;display:grid}.scope-picker[data-v-00915421]{grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:10px;width:100%;display:grid}.scope-picker.single-option[data-v-00915421]{grid-template-columns:1fr}.scope-picker[data-v-00915421] .n-radio{border:1px solid var(--border-primary);background:var(--bg-secondary);border-radius:8px;align-items:flex-start;min-width:0;margin:0;padding:10px}.scope-option[data-v-00915421]{flex-direction:column;gap:2px;min-width:0;display:flex}.scope-title[data-v-00915421]{color:var(--text-primary);font-size:13px;font-weight:600}.scope-path[data-v-00915421]{overflow-wrap:anywhere;color:var(--text-tertiary);font-family:var(--font-mono);font-size:11px;line-height:1.4}.platform-note[data-v-00915421],.empty-config-box[data-v-00915421]{border:1px solid var(--border-primary);background:var(--bg-secondary);color:var(--text-secondary);border-radius:8px;align-items:flex-start;gap:8px;padding:11px 12px;font-size:12px;line-height:1.6;display:flex}.platform-note code[data-v-00915421]{font-family:var(--font-mono);font-size:11px}.empty-config-box[data-v-00915421]{align-items:center;margin-top:4px}.editor-form-item[data-v-00915421]{margin-bottom:0}.toml-editor[data-v-00915421] textarea{font-family:var(--font-mono);font-size:12px;line-height:1.65}.modal-footer[data-v-00915421]{justify-content:flex-end;gap:10px;padding-top:2px;display:flex}@media (width<=760px){.config-edit-header[data-v-00915421]{flex-direction:column}.config-edit-grid[data-v-00915421],.field-grid[data-v-00915421],.scope-picker[data-v-00915421]{grid-template-columns:1fr}}.back-btn[data-v-b673c699]{padding:4px}.action-btn[data-v-b673c699]{padding:4px 8px}.drawer-header[data-v-b9b7a7fa]{color:var(--text-primary);font-size:16px;font-weight:600}