@xopcai/xopc 0.0.102 → 0.0.104

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 (995) hide show
  1. package/README.md +8 -5
  2. package/README.zh-CN.md +8 -5
  3. package/dist/_virtual/_rolldown/runtime.js +2 -3
  4. package/dist/browser-ext/manifest.json +1 -1
  5. package/dist/extensions/feishu/src/adapters/cli-login.d.ts +1 -1
  6. package/dist/extensions/feishu/src/adapters/cli-login.js +1 -1
  7. package/dist/extensions/feishu/src/adapters/cli-login.js.map +1 -1
  8. package/dist/extensions/feishu/src/adapters/gateway-setup.d.ts +2 -0
  9. package/dist/extensions/feishu/src/adapters/gateway-setup.js +225 -0
  10. package/dist/extensions/feishu/src/adapters/gateway-setup.js.map +1 -0
  11. package/dist/extensions/feishu/src/index.d.ts +8 -1
  12. package/dist/extensions/feishu/src/index.js +14 -1
  13. package/dist/extensions/feishu/src/index.js.map +1 -0
  14. package/dist/extensions/feishu/src/outbound/outbound-adapter.js +1 -1
  15. package/dist/extensions/feishu/src/plugin.d.ts +2 -1
  16. package/dist/extensions/feishu/src/plugin.js +2 -0
  17. package/dist/extensions/feishu/src/plugin.js.map +1 -1
  18. package/dist/extensions/feishu/src/streaming/streaming-adapter.js +1 -1
  19. package/dist/extensions/feishu/src/transport/webhook/monitor.js +2 -2
  20. package/dist/extensions/feishu/src/transport/webhook/monitor.js.map +1 -1
  21. package/dist/extensions/feishu/xopc.extension.json +66 -1
  22. package/dist/extensions/telegram/src/adapters/gateway-setup.d.ts +2 -0
  23. package/dist/extensions/telegram/src/adapters/gateway-setup.js +146 -0
  24. package/dist/extensions/telegram/src/adapters/gateway-setup.js.map +1 -0
  25. package/dist/extensions/telegram/src/adapters/security-adapter.js +1 -1
  26. package/dist/extensions/telegram/src/command-handler.js +1 -2
  27. package/dist/extensions/telegram/src/command-handler.js.map +1 -1
  28. package/dist/extensions/telegram/src/config-schema.js +2 -2
  29. package/dist/extensions/telegram/src/config-schema.js.map +1 -1
  30. package/dist/extensions/telegram/src/doctor.d.ts +1 -0
  31. package/dist/extensions/telegram/src/doctor.js +68 -0
  32. package/dist/extensions/telegram/src/doctor.js.map +1 -1
  33. package/dist/extensions/telegram/src/index.d.ts +8 -1
  34. package/dist/extensions/telegram/src/index.js +15 -2
  35. package/dist/extensions/telegram/src/index.js.map +1 -0
  36. package/dist/extensions/telegram/src/plugin.d.ts +13 -5
  37. package/dist/extensions/telegram/src/plugin.js +32 -12
  38. package/dist/extensions/telegram/src/plugin.js.map +1 -1
  39. package/dist/extensions/telegram/src/proxy-fetch.js +22 -5
  40. package/dist/extensions/telegram/src/proxy-fetch.js.map +1 -1
  41. package/dist/extensions/telegram/src/send-options.js +8 -5
  42. package/dist/extensions/telegram/src/send-options.js.map +1 -1
  43. package/dist/extensions/telegram/xopc.extension.json +412 -5
  44. package/dist/extensions/weixin/src/adapters/onboard-cli.js +2 -2
  45. package/dist/extensions/weixin/src/adapters/onboard-cli.js.map +1 -1
  46. package/dist/extensions/weixin/src/api/api.js +1 -1
  47. package/dist/extensions/weixin/src/index.d.ts +8 -0
  48. package/dist/extensions/weixin/src/index.js +12 -1
  49. package/dist/extensions/weixin/src/index.js.map +1 -0
  50. package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
  51. package/dist/extensions/weixin/src/plugin.d.ts +2 -1
  52. package/dist/extensions/weixin/src/plugin.js +77 -2
  53. package/dist/extensions/weixin/src/plugin.js.map +1 -1
  54. package/dist/extensions/weixin/xopc.extension.json +52 -0
  55. package/dist/gateway/static/root/assets/agents-CvsBrBfi.js +396 -0
  56. package/dist/gateway/static/root/assets/{apps-page-Uv4kOmDE.js → apps-page-L-IwQTe0.js} +1 -1
  57. package/dist/gateway/static/root/assets/browser-BLJWD7WI.js +8 -0
  58. package/dist/gateway/static/root/assets/channels-settings-D95KuPeP.js +1 -0
  59. package/dist/gateway/static/root/assets/cron-page-CfkWXDAI.js +1 -0
  60. package/dist/gateway/static/root/assets/{dist-DH4IuRV0.js → dist-C6vclgEL.js} +1 -1
  61. package/dist/gateway/static/root/assets/{extension-debug-page-BNkhvRQW.js → extension-debug-page-D4JYAbsX.js} +1 -1
  62. package/dist/gateway/static/root/assets/{extension-page-CcIGQah2.js → extension-page-_T62gi6e.js} +1 -1
  63. package/dist/gateway/static/root/assets/extension-settings-page-CkJbjyM-.js +1 -0
  64. package/dist/gateway/static/root/assets/{fetch-drJUxxKP.js → fetch-B5aiIguv.js} +1 -1
  65. package/dist/gateway/static/root/assets/gateway-startup-retry-DqmLXhs6.js +1 -0
  66. package/dist/gateway/static/root/assets/heartbeat-config-api-HwJV1K_Y.js +1 -0
  67. package/dist/gateway/static/root/assets/index-BPYKW7FB.css +1 -0
  68. package/dist/gateway/static/root/assets/index-DvTb6wNR.js +4845 -0
  69. package/dist/gateway/static/root/assets/{logs-page-CiG0m81R.js → logs-page-DsjtTjBy.js} +2 -2
  70. package/dist/gateway/static/root/assets/{note-detail-page-DG3DVFTf.js → note-detail-page-B2V7RhgD.js} +43 -43
  71. package/dist/gateway/static/root/assets/{note-time-DjlllCF3.js → note-time-BG8GCTr4.js} +1 -1
  72. package/dist/gateway/static/root/assets/notes-page-xrcVBQ6Z.js +1 -0
  73. package/dist/gateway/static/root/assets/schema-form-S-QUvhul.js +1 -0
  74. package/dist/gateway/static/root/assets/sessions-page-CrQer6Au.js +1 -0
  75. package/dist/gateway/static/root/assets/settings-advanced-gate-DujQl9c7.js +2 -0
  76. package/dist/gateway/static/root/assets/{settings-form-section-C3_sEFfD.js → settings-form-section-r1V7dRV6.js} +1 -1
  77. package/dist/gateway/static/root/assets/settings-page-C9nrONQ2.js +3 -0
  78. package/dist/gateway/static/root/assets/share-preview-page-DOFy0FNt.js +2 -0
  79. package/dist/gateway/static/root/assets/skills-page-DmTsrs_a.js +2 -0
  80. package/dist/gateway/static/root/assets/{theme-store-B6KXPHgK.js → theme-store-Bo3j5Ovv.js} +1 -1
  81. package/dist/gateway/static/root/assets/url-WgQIjFZu.js +3 -0
  82. package/dist/gateway/static/root/assets/voice-api-key-field-AjmUAlEQ.js +1 -0
  83. package/dist/gateway/static/root/assets/{workflow-page.utils-g57BRfEd.js → workflow-page.utils-DLEJ92gK.js} +1 -1
  84. package/dist/gateway/static/root/assets/workflows-page-BnjjKrM1.js +27 -0
  85. package/dist/gateway/static/root/index.html +6 -5
  86. package/dist/package.js +1 -1
  87. package/dist/src/agent/agent-manager.d.ts +18 -6
  88. package/dist/src/agent/agent-manager.js +60 -35
  89. package/dist/src/agent/agent-manager.js.map +1 -1
  90. package/dist/src/agent/builtin-agent-ids.d.ts +2 -0
  91. package/dist/src/agent/builtin-agent-ids.js +17 -0
  92. package/dist/src/agent/builtin-agent-ids.js.map +1 -0
  93. package/dist/src/agent/child-agent-factory.d.ts +4 -0
  94. package/dist/src/agent/child-agent-factory.js +28 -8
  95. package/dist/src/agent/child-agent-factory.js.map +1 -1
  96. package/dist/src/agent/context/workspace-seed.js +1 -1
  97. package/dist/src/agent/context/workspace-templates/AGENTS.md +23 -184
  98. package/dist/src/agent/embedded/run-turn.js +8 -2
  99. package/dist/src/agent/embedded/run-turn.js.map +1 -1
  100. package/dist/src/agent/embedded/session-tool-result-guard.js +1 -1
  101. package/dist/src/agent/embedded/subscribe-session.js +33 -51
  102. package/dist/src/agent/embedded/subscribe-session.js.map +1 -1
  103. package/dist/src/agent/embedded/types.d.ts +36 -35
  104. package/dist/src/agent/fallback/candidates.js +1 -1
  105. package/dist/src/agent/fallback/candidates.js.map +1 -1
  106. package/dist/src/agent/inbound/attachment-pipeline.js +2 -2
  107. package/dist/src/agent/inbound/attachment-pipeline.js.map +1 -1
  108. package/dist/src/agent/inbound/inbound-loop.js +1 -1
  109. package/dist/src/agent/inbound/turn-dispatcher.d.ts +1 -0
  110. package/dist/src/agent/inbound/turn-dispatcher.js +24 -5
  111. package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -1
  112. package/dist/src/agent/models/manager.d.ts +1 -1
  113. package/dist/src/agent/models/manager.js +1 -1
  114. package/dist/src/agent/models/manager.js.map +1 -1
  115. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.d.ts +1 -1
  116. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js +1 -1
  117. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js.map +1 -1
  118. package/dist/src/agent/prompt/sections/tooling.js +4 -0
  119. package/dist/src/agent/prompt/sections/tooling.js.map +1 -1
  120. package/dist/src/agent/service/direct-turn-helpers.d.ts +1 -0
  121. package/dist/src/agent/service/direct-turn-helpers.js +1 -1
  122. package/dist/src/agent/service/direct-turn-helpers.js.map +1 -1
  123. package/dist/src/agent/service/process-direct-streaming.d.ts +1 -0
  124. package/dist/src/agent/service/process-direct-streaming.js +35 -18
  125. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  126. package/dist/src/agent/service-inbound-utils.d.ts +0 -1
  127. package/dist/src/agent/service-inbound-utils.js +1 -17
  128. package/dist/src/agent/service-inbound-utils.js.map +1 -1
  129. package/dist/src/agent/service.d.ts +4 -4
  130. package/dist/src/agent/service.js +27 -15
  131. package/dist/src/agent/service.js.map +1 -1
  132. package/dist/src/agent/session/session-config-service.d.ts +1 -0
  133. package/dist/src/agent/session/session-config-service.js +9 -1
  134. package/dist/src/agent/session/session-config-service.js.map +1 -1
  135. package/dist/src/agent/session/session-inspector.d.ts +2 -1
  136. package/dist/src/agent/session/session-inspector.js +4 -0
  137. package/dist/src/agent/session/session-inspector.js.map +1 -1
  138. package/dist/src/agent/skills/config.js +1 -3
  139. package/dist/src/agent/skills/config.js.map +1 -1
  140. package/dist/src/agent/skills/format-skills-prompt.d.ts +1 -0
  141. package/dist/src/agent/skills/format-skills-prompt.js +3 -2
  142. package/dist/src/agent/skills/format-skills-prompt.js.map +1 -1
  143. package/dist/src/agent/skills/hub-pull.js +1 -1
  144. package/dist/src/agent/skills/index.js +20 -5
  145. package/dist/src/agent/skills/index.js.map +1 -1
  146. package/dist/src/agent/skills/installer.js +14 -27
  147. package/dist/src/agent/skills/installer.js.map +1 -1
  148. package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js +11 -1
  149. package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js.map +1 -1
  150. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js +18 -4
  151. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js.map +1 -1
  152. package/dist/src/agent/skills/marketplace/adapters/store/adapter.js +11 -2
  153. package/dist/src/agent/skills/marketplace/adapters/store/adapter.js.map +1 -1
  154. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.d.ts +2 -2
  155. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js.map +1 -1
  156. package/dist/src/agent/skills/skill-manager.d.ts +4 -1
  157. package/dist/src/agent/skills/skill-manager.js +3 -3
  158. package/dist/src/agent/skills/skill-manager.js.map +1 -1
  159. package/dist/src/agent/skills/skill-view-path.d.ts +1 -17
  160. package/dist/src/agent/skills/skill-view-path.js +3 -66
  161. package/dist/src/agent/skills/skill-view-path.js.map +1 -1
  162. package/dist/src/agent/skills/test-framework.js +2 -3
  163. package/dist/src/agent/skills/test-framework.js.map +1 -1
  164. package/dist/src/agent/streaming/reasoning-visibility-sse.js +1 -0
  165. package/dist/src/agent/streaming/reasoning-visibility-sse.js.map +1 -1
  166. package/dist/src/agent/tool-manuals/browser.d.ts +1 -0
  167. package/{skills/browser/SKILL.md → dist/src/agent/tool-manuals/browser.js} +51 -54
  168. package/dist/src/agent/tool-manuals/browser.js.map +1 -0
  169. package/dist/src/agent/tool-manuals/index.d.ts +10 -0
  170. package/dist/src/agent/tool-manuals/index.js +28 -0
  171. package/dist/src/agent/tool-manuals/index.js.map +1 -0
  172. package/dist/src/agent/tools/browser/tool/browser-use-tool.js +1 -1
  173. package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +1 -1
  174. package/dist/src/agent/tools/factory.js +7 -5
  175. package/dist/src/agent/tools/factory.js.map +1 -1
  176. package/dist/src/agent/tools/index.d.ts +1 -0
  177. package/dist/src/agent/tools/index.js +5 -4
  178. package/dist/src/agent/tools/send-media.js +1 -2
  179. package/dist/src/agent/tools/send-media.js.map +1 -1
  180. package/dist/src/agent/tools/session-search-tool.js +1 -1
  181. package/dist/src/agent/tools/shell.js +1 -1
  182. package/dist/src/agent/tools/skills-tools.js +37 -8
  183. package/dist/src/agent/tools/skills-tools.js.map +1 -1
  184. package/dist/src/agent/tools/tool-manual-tool.d.ts +6 -0
  185. package/dist/src/agent/tools/tool-manual-tool.js +34 -0
  186. package/dist/src/agent/tools/tool-manual-tool.js.map +1 -0
  187. package/dist/src/agent/tools/web-extract.js +2 -2
  188. package/dist/src/agent/tools/web.js +1 -1
  189. package/dist/src/agent/workflow/catalog.d.ts +7 -2
  190. package/dist/src/agent/workflow/catalog.js +66 -25
  191. package/dist/src/agent/workflow/catalog.js.map +1 -1
  192. package/dist/src/agent/workflow/subagent-runner.d.ts +3 -0
  193. package/dist/src/agent/workflow/subagent-runner.js +50 -4
  194. package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
  195. package/dist/src/agent/workflow/types.d.ts +10 -0
  196. package/dist/src/auth/credentials.d.ts +7 -0
  197. package/dist/src/auth/credentials.js +45 -7
  198. package/dist/src/auth/credentials.js.map +1 -1
  199. package/dist/src/auth/index.d.ts +1 -1
  200. package/dist/src/auth/index.js.map +1 -1
  201. package/dist/src/auth/oauth/github-copilot.d.ts +1 -1
  202. package/dist/src/auth/oauth/google-antigravity.d.ts +1 -3
  203. package/dist/src/auth/oauth/google-antigravity.js +1 -1
  204. package/dist/src/auth/oauth/google-gemini-cli.d.ts +1 -3
  205. package/dist/src/auth/oauth/google-gemini-cli.js +1 -1
  206. package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/google-antigravity.js +3 -5
  207. package/dist/src/auth/oauth/google-oauth/google-antigravity.js.map +1 -0
  208. package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/google-gemini-cli.js +4 -5
  209. package/dist/src/auth/oauth/google-oauth/google-gemini-cli.js.map +1 -0
  210. package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/oauth-page.js +12 -4
  211. package/dist/src/auth/oauth/google-oauth/oauth-page.js.map +1 -0
  212. package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/pkce.d.ts +1 -1
  213. package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/pkce.js +2 -2
  214. package/dist/src/auth/oauth/google-oauth/pkce.js.map +1 -0
  215. package/dist/src/auth/oauth/index.js +2 -2
  216. package/dist/src/auth/oauth/kimi-coding.d.ts +1 -1
  217. package/dist/src/auth/oauth/kimi-coding.js +1 -1
  218. package/dist/src/auth/oauth/kimi-coding.js.map +1 -1
  219. package/dist/src/auth/oauth/minimax-cn.js +1 -1
  220. package/dist/src/auth/oauth/minimax-cn.js.map +1 -1
  221. package/dist/src/auth/oauth/minimax.js +1 -1
  222. package/dist/src/auth/oauth/minimax.js.map +1 -1
  223. package/dist/src/auth/oauth/openai-codex.d.ts +7 -2
  224. package/dist/src/auth/oauth/openai-codex.js +318 -1
  225. package/dist/src/auth/oauth/openai-codex.js.map +1 -0
  226. package/dist/src/auth/profiles/store.js +3 -2
  227. package/dist/src/auth/profiles/store.js.map +1 -1
  228. package/dist/src/browser/actions/extension-registry-bridge.js +1 -1
  229. package/dist/src/browser/actions/registry.js +2 -2
  230. package/dist/src/browser/cdp-local-launcher.js +1 -1
  231. package/dist/src/browser/index.js +3 -3
  232. package/dist/src/browser/providers/browser-ext-install.js +1 -1
  233. package/dist/src/browser/providers/cloakbrowser.js +1 -1
  234. package/dist/src/channels/attachments/attachment-classifiers.d.ts +1 -0
  235. package/dist/src/channels/attachments/attachment-classifiers.js +13 -2
  236. package/dist/src/channels/attachments/attachment-classifiers.js.map +1 -1
  237. package/dist/src/channels/catalog/channel-catalog-service.d.ts +11 -0
  238. package/dist/src/channels/catalog/channel-catalog-service.js +168 -0
  239. package/dist/src/channels/catalog/channel-catalog-service.js.map +1 -0
  240. package/dist/src/channels/catalog/channel-catalog-types.d.ts +22 -0
  241. package/dist/src/channels/catalog/channel-catalog-types.js +1 -0
  242. package/dist/src/channels/dock.d.ts +0 -7
  243. package/dist/src/channels/dock.js +1 -21
  244. package/dist/src/channels/index.d.ts +1 -3
  245. package/dist/src/channels/index.js +1 -5
  246. package/dist/src/channels/lifecycle-supervisor.d.ts +1 -0
  247. package/dist/src/channels/lifecycle-supervisor.js +11 -0
  248. package/dist/src/channels/lifecycle-supervisor.js.map +1 -1
  249. package/dist/src/channels/manager.d.ts +1 -0
  250. package/dist/src/channels/manager.js +3 -0
  251. package/dist/src/channels/manager.js.map +1 -1
  252. package/dist/src/channels/pairing/pairing-channel.d.ts +2 -3
  253. package/dist/src/channels/pairing/pairing-messages.js +1 -1
  254. package/dist/src/channels/pairing/pairing-messages.js.map +1 -1
  255. package/dist/src/channels/pairing/pairing-service.d.ts +1 -1
  256. package/dist/src/channels/pairing/pairing-service.js +8 -27
  257. package/dist/src/channels/pairing/pairing-service.js.map +1 -1
  258. package/dist/src/channels/plugin-types.d.ts +3 -1
  259. package/dist/src/channels/plugins/types.adapters.d.ts +55 -2
  260. package/dist/src/channels/telegram/index.js +1 -1
  261. package/dist/src/chat-commands/builtins/config.js +4 -4
  262. package/dist/src/chat-commands/builtins/config.js.map +1 -1
  263. package/dist/src/chat-commands/builtins/model.js +2 -2
  264. package/dist/src/chat-commands/builtins/model.js.map +1 -1
  265. package/dist/src/chat-commands/config-paths.js +1 -1
  266. package/dist/src/chat-commands/config-paths.js.map +1 -1
  267. package/dist/src/chat-commands/context.js +1 -1
  268. package/dist/src/chat-commands/context.js.map +1 -1
  269. package/dist/src/cli/bin.js +1 -1
  270. package/dist/src/cli/command-manifest.js +2 -2
  271. package/dist/src/cli/command-manifest.js.map +1 -1
  272. package/dist/src/cli/commands/agent.js +2 -2
  273. package/dist/src/cli/commands/agent.js.map +1 -1
  274. package/dist/src/cli/commands/agents.js +2 -4
  275. package/dist/src/cli/commands/agents.js.map +1 -1
  276. package/dist/src/cli/commands/auth.js +40 -52
  277. package/dist/src/cli/commands/auth.js.map +1 -1
  278. package/dist/src/cli/commands/browser-cli-helpers.js +1 -1
  279. package/dist/src/cli/commands/channels.d.ts +1 -5
  280. package/dist/src/cli/commands/channels.js +115 -281
  281. package/dist/src/cli/commands/channels.js.map +1 -1
  282. package/dist/src/cli/commands/config.js +2 -2
  283. package/dist/src/cli/commands/config.js.map +1 -1
  284. package/dist/src/cli/commands/doctor/checks/channel-config.js +16 -69
  285. package/dist/src/cli/commands/doctor/checks/channel-config.js.map +1 -1
  286. package/dist/src/cli/commands/doctor/checks/channel-pairing-pending.js +6 -4
  287. package/dist/src/cli/commands/doctor/checks/channel-pairing-pending.js.map +1 -1
  288. package/dist/src/cli/commands/doctor/checks/channel-plugins.js +2 -2
  289. package/dist/src/cli/commands/doctor/checks/channel-plugins.js.map +1 -1
  290. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  291. package/dist/src/cli/commands/doctor/checks/provider-auth.js +13 -9
  292. package/dist/src/cli/commands/doctor/checks/provider-auth.js.map +1 -1
  293. package/dist/src/cli/commands/extension-dev.js +2 -1
  294. package/dist/src/cli/commands/extension-dev.js.map +1 -1
  295. package/dist/src/cli/commands/extension-marketplace.js +2 -1
  296. package/dist/src/cli/commands/extension-marketplace.js.map +1 -1
  297. package/dist/src/cli/commands/extension-pack.js +2 -1
  298. package/dist/src/cli/commands/extension-pack.js.map +1 -1
  299. package/dist/src/cli/commands/models.js +192 -54
  300. package/dist/src/cli/commands/models.js.map +1 -1
  301. package/dist/src/cli/commands/onboard/channels/index.js +1 -1
  302. package/dist/src/cli/commands/onboard/channels/index.js.map +1 -1
  303. package/dist/src/cli/commands/onboard/channels/registry.d.ts +2 -1
  304. package/dist/src/cli/commands/onboard/channels/registry.js +32 -8
  305. package/dist/src/cli/commands/onboard/channels/registry.js.map +1 -1
  306. package/dist/src/cli/commands/onboard/model.d.ts +1 -4
  307. package/dist/src/cli/commands/onboard/model.js +257 -184
  308. package/dist/src/cli/commands/onboard/model.js.map +1 -1
  309. package/dist/src/cli/commands/onboard.js +4 -6
  310. package/dist/src/cli/commands/onboard.js.map +1 -1
  311. package/dist/src/cli/commands/setup-shared/runner.d.ts +1 -1
  312. package/dist/src/cli/commands/setup-shared/runner.js.map +1 -1
  313. package/dist/src/cli/commands/setup-shared/types.d.ts +1 -1
  314. package/dist/src/cli/commands/setup-shared/types.js.map +1 -1
  315. package/dist/src/cli/commands/tui.js +13 -5
  316. package/dist/src/cli/commands/tui.js.map +1 -1
  317. package/dist/src/cli/extension-cli-register.js +1 -1
  318. package/dist/src/cli/utils/oauth-login.d.ts +17 -0
  319. package/dist/src/cli/utils/oauth-login.js +93 -0
  320. package/dist/src/cli/utils/oauth-login.js.map +1 -0
  321. package/dist/src/cli/utils/oauth-providers.js +2 -2
  322. package/dist/src/commands/agents.config.d.ts +3 -3
  323. package/dist/src/commands/agents.config.js +7 -7
  324. package/dist/src/commands/agents.config.js.map +1 -1
  325. package/dist/src/config/agent-profile.d.ts +1 -1
  326. package/dist/src/config/agent-profile.js +6 -2
  327. package/dist/src/config/agent-profile.js.map +1 -1
  328. package/dist/src/config/agent-typed-models.d.ts +2 -2
  329. package/dist/src/config/agent-typed-models.js +13 -2
  330. package/dist/src/config/agent-typed-models.js.map +1 -1
  331. package/dist/src/config/index.js +3 -3
  332. package/dist/src/config/integration.d.ts +1 -1
  333. package/dist/src/config/loader.d.ts +0 -1
  334. package/dist/src/config/loader.js +4 -9
  335. package/dist/src/config/loader.js.map +1 -1
  336. package/dist/src/config/models-json.d.ts +6 -6
  337. package/dist/src/config/rules.js +2 -12
  338. package/dist/src/config/rules.js.map +1 -1
  339. package/dist/src/config/schema.d.ts +74 -47
  340. package/dist/src/config/schema.js +28 -66
  341. package/dist/src/config/schema.js.map +1 -1
  342. package/dist/src/config/validate-channel-configs.d.ts +0 -3
  343. package/dist/src/config/validate-channel-configs.js +29 -10
  344. package/dist/src/config/validate-channel-configs.js.map +1 -1
  345. package/dist/src/cron/executor.js +1 -4
  346. package/dist/src/cron/executor.js.map +1 -1
  347. package/dist/src/extensions/activation-context.js +3 -1
  348. package/dist/src/extensions/activation-context.js.map +1 -1
  349. package/dist/src/extensions/activation-planner.js +12 -0
  350. package/dist/src/extensions/activation-planner.js.map +1 -1
  351. package/dist/src/extensions/api.d.ts +5 -1
  352. package/dist/src/extensions/api.js +12 -0
  353. package/dist/src/extensions/api.js.map +1 -1
  354. package/dist/src/extensions/discover-extensions.js +17 -13
  355. package/dist/src/extensions/discover-extensions.js.map +1 -1
  356. package/dist/src/extensions/extension-metadata-snapshot.js +11 -5
  357. package/dist/src/extensions/extension-metadata-snapshot.js.map +1 -1
  358. package/dist/src/extensions/index.js +12 -4
  359. package/dist/src/extensions/index.js.map +1 -0
  360. package/dist/src/extensions/loader.d.ts +5 -1
  361. package/dist/src/extensions/loader.js +12 -11
  362. package/dist/src/extensions/loader.js.map +1 -1
  363. package/dist/src/extensions/manifest-registry.js +98 -93
  364. package/dist/src/extensions/manifest-registry.js.map +1 -1
  365. package/dist/src/extensions/normalize-manifest.js +91 -15
  366. package/dist/src/extensions/normalize-manifest.js.map +1 -1
  367. package/dist/src/extensions/sdk/index.js +1 -1
  368. package/dist/src/extensions/sdk/testing.js +4 -0
  369. package/dist/src/extensions/sdk/testing.js.map +1 -1
  370. package/dist/src/extensions/types/core.d.ts +32 -1
  371. package/dist/src/extensions/types/manifest.d.ts +60 -0
  372. package/dist/src/extensions/types/tui.d.ts +414 -5
  373. package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
  374. package/dist/src/gateway/agent-builtin-tools.js +16 -0
  375. package/dist/src/gateway/agent-builtin-tools.js.map +1 -1
  376. package/dist/src/gateway/agent-run-relay.d.ts +2 -3
  377. package/dist/src/gateway/agent-run-relay.js +10 -3
  378. package/dist/src/gateway/agent-run-relay.js.map +1 -1
  379. package/dist/src/gateway/agents-admin.d.ts +32 -19
  380. package/dist/src/gateway/agents-admin.js +113 -93
  381. package/dist/src/gateway/agents-admin.js.map +1 -1
  382. package/dist/src/gateway/chat-stream/mapper.d.ts +34 -0
  383. package/dist/src/gateway/chat-stream/mapper.js +244 -0
  384. package/dist/src/gateway/chat-stream/mapper.js.map +1 -0
  385. package/dist/src/gateway/chat-stream/protocol.d.ts +100 -0
  386. package/dist/src/gateway/chat-stream/protocol.js +1 -0
  387. package/dist/src/gateway/hono/lib/agent-model.d.ts +4 -4
  388. package/dist/src/gateway/hono/lib/agent-model.js +13 -11
  389. package/dist/src/gateway/hono/lib/agent-model.js.map +1 -1
  390. package/dist/src/gateway/hono/lib/config-payload.d.ts +19 -7
  391. package/dist/src/gateway/hono/lib/config-payload.js +16 -15
  392. package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
  393. package/dist/src/gateway/hono/oauth-async.js +2 -2
  394. package/dist/src/gateway/hono/oauth.js +2 -2
  395. package/dist/src/gateway/hono/routes/agents.js +83 -48
  396. package/dist/src/gateway/hono/routes/agents.js.map +1 -1
  397. package/dist/src/gateway/hono/routes/channels.js +134 -214
  398. package/dist/src/gateway/hono/routes/channels.js.map +1 -1
  399. package/dist/src/gateway/hono/routes/commands-skills.js +10 -4
  400. package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
  401. package/dist/src/gateway/hono/routes/config-patch/agents.js +26 -13
  402. package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -1
  403. package/dist/src/gateway/hono/routes/config-patch/channels.d.ts +1 -11
  404. package/dist/src/gateway/hono/routes/config-patch/channels.js +18 -165
  405. package/dist/src/gateway/hono/routes/config-patch/channels.js.map +1 -1
  406. package/dist/src/gateway/hono/routes/config.js +5 -2
  407. package/dist/src/gateway/hono/routes/config.js.map +1 -1
  408. package/dist/src/gateway/hono/routes/dreaming.js +1 -1
  409. package/dist/src/gateway/hono/routes/lazy-bundles.js +13 -1
  410. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  411. package/dist/src/gateway/hono/routes/models.js +25 -5
  412. package/dist/src/gateway/hono/routes/models.js.map +1 -1
  413. package/dist/src/gateway/hono/routes/public-gateway.js +2 -4
  414. package/dist/src/gateway/hono/routes/public-gateway.js.map +1 -1
  415. package/dist/src/gateway/hono/routes/sessions.js +179 -0
  416. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  417. package/dist/src/gateway/hono/routes/tui.d.ts +3 -0
  418. package/dist/src/gateway/hono/routes/tui.js +16 -0
  419. package/dist/src/gateway/hono/routes/tui.js.map +1 -0
  420. package/dist/src/gateway/hono/routes/workflows.js +25 -1
  421. package/dist/src/gateway/hono/routes/workflows.js.map +1 -1
  422. package/dist/src/gateway/hono/sse.d.ts +5 -7
  423. package/dist/src/gateway/hono/sse.js +21 -38
  424. package/dist/src/gateway/hono/sse.js.map +1 -1
  425. package/dist/src/gateway/protocol.js.map +1 -1
  426. package/dist/src/gateway/service/agent-runner.d.ts +2 -4
  427. package/dist/src/gateway/service/agent-runner.js +1 -1
  428. package/dist/src/gateway/service/agent-runner.js.map +1 -1
  429. package/dist/src/gateway/service/marketplace-service.d.ts +4 -3
  430. package/dist/src/gateway/service/marketplace-service.js +7 -4
  431. package/dist/src/gateway/service/marketplace-service.js.map +1 -1
  432. package/dist/src/gateway/service/run-gateway-agent.d.ts +2 -6
  433. package/dist/src/gateway/service/run-gateway-agent.js +63 -36
  434. package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
  435. package/dist/src/gateway/service/sessions-api.d.ts +19 -0
  436. package/dist/src/gateway/service/sessions-api.js +12 -0
  437. package/dist/src/gateway/service/sessions-api.js.map +1 -1
  438. package/dist/src/gateway/service.d.ts +6 -0
  439. package/dist/src/gateway/service.js +73 -57
  440. package/dist/src/gateway/service.js.map +1 -1
  441. package/dist/src/mcp/channel-bridge.js +1 -1
  442. package/dist/src/media/store.js +3 -0
  443. package/dist/src/media/store.js.map +1 -1
  444. package/dist/src/notes/service.js +1 -1
  445. package/dist/src/notes/service.js.map +1 -1
  446. package/dist/src/project-trust/trust-store.d.ts +30 -0
  447. package/dist/src/project-trust/trust-store.js +194 -0
  448. package/dist/src/project-trust/trust-store.js.map +1 -0
  449. package/dist/src/providers/index.d.ts +4 -4
  450. package/dist/src/providers/index.js +41 -22
  451. package/dist/src/providers/index.js.map +1 -1
  452. package/dist/src/providers/presentation.d.ts +34 -0
  453. package/dist/src/providers/presentation.js +162 -0
  454. package/dist/src/providers/presentation.js.map +1 -0
  455. package/dist/src/routing/resolve-route.d.ts +0 -3
  456. package/dist/src/routing/resolve-route.js.map +1 -1
  457. package/dist/src/routing/resolve-tui-session-key.d.ts +2 -0
  458. package/dist/src/routing/resolve-tui-session-key.js +8 -3
  459. package/dist/src/routing/resolve-tui-session-key.js.map +1 -1
  460. package/dist/src/session/client-history.d.ts +32 -0
  461. package/dist/src/session/client-history.js +232 -1
  462. package/dist/src/session/client-history.js.map +1 -1
  463. package/dist/src/session/manager.d.ts +37 -4
  464. package/dist/src/session/manager.js +39 -15
  465. package/dist/src/session/manager.js.map +1 -1
  466. package/dist/src/session/session-context-for-llm.d.ts +93 -1
  467. package/dist/src/session/session-context-for-llm.js +105 -2
  468. package/dist/src/session/session-context-for-llm.js.map +1 -1
  469. package/dist/src/session/store.d.ts +37 -0
  470. package/dist/src/session/store.js +127 -2
  471. package/dist/src/session/store.js.map +1 -1
  472. package/dist/src/session/stored-rows-to-file-entries.js +37 -1
  473. package/dist/src/session/stored-rows-to-file-entries.js.map +1 -1
  474. package/dist/src/session/types.d.ts +14 -1
  475. package/dist/src/session/types.js.map +1 -1
  476. package/dist/src/share/share-thumbnail.js +1 -1
  477. package/dist/src/storage/sqlite/migrations/004_add_session_type_metadata.sql +15 -0
  478. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  479. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  480. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  481. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  482. package/dist/src/storage/sqlite/row-mappers.d.ts +14 -1
  483. package/dist/src/storage/sqlite/row-mappers.js +14 -1
  484. package/dist/src/storage/sqlite/row-mappers.js.map +1 -1
  485. package/dist/src/storage/sqlite/schema.js +1 -1
  486. package/dist/src/storage/sqlite/session-metadata.js +1 -0
  487. package/dist/src/storage/sqlite/session-metadata.js.map +1 -1
  488. package/dist/src/storage/sqlite/session-repository.js +52 -25
  489. package/dist/src/storage/sqlite/session-repository.js.map +1 -1
  490. package/dist/src/tui/backends/embedded-backend.d.ts +53 -4
  491. package/dist/src/tui/backends/embedded-backend.js +227 -39
  492. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  493. package/dist/src/tui/backends/gateway-sse-backend.d.ts +59 -3
  494. package/dist/src/tui/backends/gateway-sse-backend.js +416 -26
  495. package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
  496. package/dist/src/tui/chat-history.d.ts +5 -1
  497. package/dist/src/tui/chat-history.js +78 -8
  498. package/dist/src/tui/chat-history.js.map +1 -1
  499. package/dist/src/tui/clipboard-text.d.ts +5 -0
  500. package/dist/src/tui/clipboard-text.js +46 -0
  501. package/dist/src/tui/clipboard-text.js.map +1 -0
  502. package/dist/src/tui/components/assistant-message.d.ts +19 -3
  503. package/dist/src/tui/components/assistant-message.js +115 -9
  504. package/dist/src/tui/components/assistant-message.js.map +1 -1
  505. package/dist/src/tui/components/bash-execution.d.ts +3 -2
  506. package/dist/src/tui/components/bash-execution.js +31 -3
  507. package/dist/src/tui/components/bash-execution.js.map +1 -1
  508. package/dist/src/tui/components/bash-summary.d.ts +23 -0
  509. package/dist/src/tui/components/bash-summary.js +87 -0
  510. package/dist/src/tui/components/bash-summary.js.map +1 -0
  511. package/dist/src/tui/components/branch-message-summary.d.ts +17 -0
  512. package/dist/src/tui/components/branch-message-summary.js +43 -0
  513. package/dist/src/tui/components/branch-message-summary.js.map +1 -0
  514. package/dist/src/tui/components/branch-summary.d.ts +13 -0
  515. package/dist/src/tui/components/branch-summary.js +51 -0
  516. package/dist/src/tui/components/branch-summary.js.map +1 -0
  517. package/dist/src/tui/components/chat-log.d.ts +46 -6
  518. package/dist/src/tui/components/chat-log.js +183 -21
  519. package/dist/src/tui/components/chat-log.js.map +1 -1
  520. package/dist/src/tui/components/compaction-summary.d.ts +13 -0
  521. package/dist/src/tui/components/compaction-summary.js +46 -0
  522. package/dist/src/tui/components/compaction-summary.js.map +1 -0
  523. package/dist/src/tui/components/custom-editor.d.ts +1 -0
  524. package/dist/src/tui/components/custom-editor.js +2 -0
  525. package/dist/src/tui/components/custom-editor.js.map +1 -1
  526. package/dist/src/tui/components/custom-message.d.ts +23 -0
  527. package/dist/src/tui/components/custom-message.js +65 -0
  528. package/dist/src/tui/components/custom-message.js.map +1 -0
  529. package/dist/src/tui/components/extension-dialog.d.ts +42 -0
  530. package/dist/src/tui/components/extension-dialog.js +127 -0
  531. package/dist/src/tui/components/extension-dialog.js.map +1 -0
  532. package/dist/src/tui/components/scoped-models-selector.d.ts +7 -2
  533. package/dist/src/tui/components/scoped-models-selector.js +89 -16
  534. package/dist/src/tui/components/scoped-models-selector.js.map +1 -1
  535. package/dist/src/tui/components/searchable-select-list.d.ts +30 -3
  536. package/dist/src/tui/components/searchable-select-list.js +82 -10
  537. package/dist/src/tui/components/searchable-select-list.js.map +1 -1
  538. package/dist/src/tui/components/session-selector.d.ts +18 -4
  539. package/dist/src/tui/components/session-selector.js +207 -40
  540. package/dist/src/tui/components/session-selector.js.map +1 -1
  541. package/dist/src/tui/components/settings-selector.d.ts +6 -2
  542. package/dist/src/tui/components/settings-selector.js +126 -7
  543. package/dist/src/tui/components/settings-selector.js.map +1 -1
  544. package/dist/src/tui/components/thinking-selector.d.ts +12 -0
  545. package/dist/src/tui/components/thinking-selector.js +48 -0
  546. package/dist/src/tui/components/thinking-selector.js.map +1 -0
  547. package/dist/src/tui/components/tool-execution.d.ts +57 -3
  548. package/dist/src/tui/components/tool-execution.js +378 -28
  549. package/dist/src/tui/components/tool-execution.js.map +1 -1
  550. package/dist/src/tui/components/tui-bottom-bar.d.ts +9 -1
  551. package/dist/src/tui/components/tui-bottom-bar.js +56 -11
  552. package/dist/src/tui/components/tui-bottom-bar.js.map +1 -1
  553. package/dist/src/tui/components/tui-header.d.ts +9 -2
  554. package/dist/src/tui/components/tui-header.js +25 -5
  555. package/dist/src/tui/components/tui-header.js.map +1 -1
  556. package/dist/src/tui/components/user-message.d.ts +4 -2
  557. package/dist/src/tui/components/user-message.js +42 -9
  558. package/dist/src/tui/components/user-message.js.map +1 -1
  559. package/dist/src/tui/components/visual-truncate.d.ts +11 -0
  560. package/dist/src/tui/components/visual-truncate.js +27 -0
  561. package/dist/src/tui/components/visual-truncate.js.map +1 -0
  562. package/dist/src/tui/extension-host/autocomplete.d.ts +43 -0
  563. package/dist/src/tui/extension-host/autocomplete.js +116 -0
  564. package/dist/src/tui/extension-host/autocomplete.js.map +1 -0
  565. package/dist/src/tui/extension-host/host.d.ts +31 -1
  566. package/dist/src/tui/extension-host/host.js +123 -6
  567. package/dist/src/tui/extension-host/host.js.map +1 -1
  568. package/dist/src/tui/extension-host/load-extensions.d.ts +6 -1
  569. package/dist/src/tui/extension-host/load-extensions.js +4 -3
  570. package/dist/src/tui/extension-host/load-extensions.js.map +1 -1
  571. package/dist/src/tui/extension-host/runtime-context.d.ts +21 -0
  572. package/dist/src/tui/extension-host/runtime-context.js +152 -0
  573. package/dist/src/tui/extension-host/runtime-context.js.map +1 -0
  574. package/dist/src/tui/extension-host/runtime.d.ts +52 -4
  575. package/dist/src/tui/extension-host/runtime.js +547 -85
  576. package/dist/src/tui/extension-host/runtime.js.map +1 -1
  577. package/dist/src/tui/extension-host/surface.d.ts +20 -0
  578. package/dist/src/tui/extension-host/surface.js +30 -6
  579. package/dist/src/tui/extension-host/surface.js.map +1 -1
  580. package/dist/src/tui/extension-host/tool-renderers.d.ts +6 -3
  581. package/dist/src/tui/extension-host/tool-renderers.js +43 -5
  582. package/dist/src/tui/extension-host/tool-renderers.js.map +1 -1
  583. package/dist/src/tui/format-tui-hotkeys.d.ts +12 -2
  584. package/dist/src/tui/format-tui-hotkeys.js +22 -5
  585. package/dist/src/tui/format-tui-hotkeys.js.map +1 -1
  586. package/dist/src/tui/tui-agent-events.d.ts +8 -6
  587. package/dist/src/tui/tui-agent-events.js +200 -59
  588. package/dist/src/tui/tui-agent-events.js.map +1 -1
  589. package/dist/src/tui/tui-backend.d.ts +169 -3
  590. package/dist/src/tui/tui-command-formatters.d.ts +76 -0
  591. package/dist/src/tui/tui-command-formatters.js +594 -0
  592. package/dist/src/tui/tui-command-formatters.js.map +1 -0
  593. package/dist/src/tui/tui-commands.d.ts +57 -7
  594. package/dist/src/tui/tui-commands.js +639 -43
  595. package/dist/src/tui/tui-commands.js.map +1 -1
  596. package/dist/src/tui/tui-context-usage.d.ts +1 -1
  597. package/dist/src/tui/tui-context-usage.js +9 -1
  598. package/dist/src/tui/tui-context-usage.js.map +1 -1
  599. package/dist/src/tui/tui-extension-user-message.d.ts +8 -0
  600. package/dist/src/tui/tui-extension-user-message.js +32 -0
  601. package/dist/src/tui/tui-extension-user-message.js.map +1 -0
  602. package/dist/src/tui/tui-follow-up-queue.d.ts +9 -0
  603. package/dist/src/tui/tui-follow-up-queue.js +18 -0
  604. package/dist/src/tui/tui-follow-up-queue.js.map +1 -0
  605. package/dist/src/tui/tui-local-shell.d.ts +11 -1
  606. package/dist/src/tui/tui-local-shell.js +50 -8
  607. package/dist/src/tui/tui-local-shell.js.map +1 -1
  608. package/dist/src/tui/tui-model-picker.d.ts +26 -0
  609. package/dist/src/tui/tui-model-picker.js +152 -0
  610. package/dist/src/tui/tui-model-picker.js.map +1 -0
  611. package/dist/src/tui/tui-oauth-login.d.ts +16 -0
  612. package/dist/src/tui/tui-oauth-login.js +189 -0
  613. package/dist/src/tui/tui-oauth-login.js.map +1 -0
  614. package/dist/src/tui/tui-overlays.d.ts +3 -3
  615. package/dist/src/tui/tui-overlays.js +6 -7
  616. package/dist/src/tui/tui-overlays.js.map +1 -1
  617. package/dist/src/tui/tui-picker-overlay.d.ts +27 -32
  618. package/dist/src/tui/tui-picker-overlay.js +340 -30
  619. package/dist/src/tui/tui-picker-overlay.js.map +1 -1
  620. package/dist/src/tui/tui-picker-services.d.ts +41 -0
  621. package/dist/src/tui/tui-picker-services.js +1 -0
  622. package/dist/src/tui/tui-run-state.d.ts +11 -0
  623. package/dist/src/tui/tui-run-state.js +114 -0
  624. package/dist/src/tui/tui-run-state.js.map +1 -0
  625. package/dist/src/tui/tui-runtime-hints.d.ts +4 -0
  626. package/dist/src/tui/tui-runtime-hints.js +18 -0
  627. package/dist/src/tui/tui-runtime-hints.js.map +1 -0
  628. package/dist/src/tui/tui-scoped-models.d.ts +1 -1
  629. package/dist/src/tui/tui-scoped-models.js +2 -2
  630. package/dist/src/tui/tui-scoped-models.js.map +1 -1
  631. package/dist/src/tui/tui-session-actions.d.ts +5 -3
  632. package/dist/src/tui/tui-session-actions.js +21 -9
  633. package/dist/src/tui/tui-session-actions.js.map +1 -1
  634. package/dist/src/tui/tui-session-format.d.ts +4 -1
  635. package/dist/src/tui/tui-session-format.js +17 -3
  636. package/dist/src/tui/tui-session-format.js.map +1 -1
  637. package/dist/src/tui/tui-session-snapshot.d.ts +82 -0
  638. package/dist/src/tui/tui-session-snapshot.js +184 -0
  639. package/dist/src/tui/tui-session-snapshot.js.map +1 -0
  640. package/dist/src/tui/tui-session-stats.d.ts +3 -0
  641. package/dist/src/tui/tui-session-stats.js +59 -0
  642. package/dist/src/tui/tui-session-stats.js.map +1 -0
  643. package/dist/src/tui/tui-settings.d.ts +21 -0
  644. package/dist/src/tui/tui-settings.js +28 -1
  645. package/dist/src/tui/tui-settings.js.map +1 -1
  646. package/dist/src/tui/tui-skills-autocomplete.js +1 -1
  647. package/dist/src/tui/tui-skills-autocomplete.js.map +1 -1
  648. package/dist/src/tui/tui-startup-resources.d.ts +3 -0
  649. package/dist/src/tui/tui-startup-resources.js +39 -0
  650. package/dist/src/tui/tui-startup-resources.js.map +1 -0
  651. package/dist/src/tui/tui-startup-text.d.ts +10 -0
  652. package/dist/src/tui/tui-startup-text.js +58 -0
  653. package/dist/src/tui/tui-startup-text.js.map +1 -0
  654. package/dist/src/tui/tui-stdio-filter.d.ts +1 -0
  655. package/dist/src/tui/tui-stdio-filter.js +11 -7
  656. package/dist/src/tui/tui-stdio-filter.js.map +1 -1
  657. package/dist/src/tui/tui-submit.d.ts +2 -0
  658. package/dist/src/tui/tui-submit.js +2 -1
  659. package/dist/src/tui/tui-submit.js.map +1 -1
  660. package/dist/src/tui/tui-tool-diff.js +61 -7
  661. package/dist/src/tui/tui-tool-diff.js.map +1 -1
  662. package/dist/src/tui/tui-tool-result.d.ts +17 -0
  663. package/dist/src/tui/tui-tool-result.js +74 -0
  664. package/dist/src/tui/tui-tool-result.js.map +1 -0
  665. package/dist/src/tui/tui-transcript-tree-picker.d.ts +57 -0
  666. package/dist/src/tui/tui-transcript-tree-picker.js +604 -0
  667. package/dist/src/tui/tui-transcript-tree-picker.js.map +1 -0
  668. package/dist/src/tui/tui-transcript-tree.d.ts +7 -0
  669. package/dist/src/tui/tui-transcript-tree.js +316 -0
  670. package/dist/src/tui/tui-transcript-tree.js.map +1 -0
  671. package/dist/src/tui/tui-types.d.ts +25 -34
  672. package/dist/src/tui/tui-types.js +12 -0
  673. package/dist/src/tui/tui-types.js.map +1 -1
  674. package/dist/src/tui/tui.js +1288 -112
  675. package/dist/src/tui/tui.js.map +1 -1
  676. package/dist/src/tui/xopc-tui-keybindings.d.ts +127 -2
  677. package/dist/src/tui/xopc-tui-keybindings.js +127 -2
  678. package/dist/src/tui/xopc-tui-keybindings.js.map +1 -1
  679. package/dist/src/workflows/domain/definition-utils.d.ts +2 -1
  680. package/dist/src/workflows/domain/definition-utils.js +18 -8
  681. package/dist/src/workflows/domain/definition-utils.js.map +1 -1
  682. package/dist/src/workflows/domain/definition.d.ts +25 -0
  683. package/dist/src/workflows/domain/event.d.ts +1 -0
  684. package/dist/src/workflows/domain/result.d.ts +15 -0
  685. package/dist/src/workflows/domain/run.d.ts +2 -0
  686. package/dist/src/workflows/domain/run.js.map +1 -1
  687. package/dist/src/workflows/engine/projector.js +4 -0
  688. package/dist/src/workflows/engine/projector.js.map +1 -1
  689. package/dist/src/workflows/engine/workflow-engine.d.ts +37 -1
  690. package/dist/src/workflows/engine/workflow-engine.js +75 -11
  691. package/dist/src/workflows/engine/workflow-engine.js.map +1 -1
  692. package/dist/src/workflows/index.d.ts +1 -0
  693. package/dist/src/workflows/index.js +4 -1
  694. package/dist/src/workflows/registry/catalog-workflow-definition-registry.d.ts +9 -0
  695. package/dist/src/workflows/registry/catalog-workflow-definition-registry.js +40 -0
  696. package/dist/src/workflows/registry/catalog-workflow-definition-registry.js.map +1 -0
  697. package/dist/src/workflows/registry/index.d.ts +2 -0
  698. package/dist/src/workflows/registry/index.js +2 -0
  699. package/dist/src/workflows/registry/workflow-definition-registry.d.ts +15 -0
  700. package/dist/src/workflows/registry/workflow-definition-registry.js +1 -0
  701. package/dist/src/workflows/runtime/index.d.ts +2 -0
  702. package/dist/src/workflows/runtime/index.js +2 -1
  703. package/dist/src/workflows/runtime/script-workflow-runtime.d.ts +5 -0
  704. package/dist/src/workflows/runtime/script-workflow-runtime.js +15 -0
  705. package/dist/src/workflows/runtime/script-workflow-runtime.js.map +1 -0
  706. package/dist/src/workflows/runtime/workflow-runtime-port.d.ts +16 -0
  707. package/dist/src/workflows/runtime/workflow-runtime-port.js +1 -0
  708. package/dist/src/workflows/service/run-view-to-snapshot.js +3 -0
  709. package/dist/src/workflows/service/run-view-to-snapshot.js.map +1 -1
  710. package/dist/src/workflows/service/workflow-run-service.d.ts +3 -0
  711. package/dist/src/workflows/service/workflow-run-service.js +10 -15
  712. package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
  713. package/dist/src/workflows/service/workflow-session-bridge.d.ts +1 -1
  714. package/dist/src/workflows/service/workflow-session-bridge.js +4 -1
  715. package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
  716. package/package.json +21 -15
  717. package/skills/creative/frontend-design/SKILL.md +1 -1
  718. package/skills/creative/theme-factory/SKILL.md +1 -1
  719. package/skills/documents/xlsx/SKILL.md +1 -1
  720. package/skills/engineering/diagnose/SKILL.md +2 -2
  721. package/skills/engineering/tdd/SKILL.md +1 -1
  722. package/skills/tools/github/SKILL.md +6 -1
  723. package/skills/tools/webapp-testing/SKILL.md +4 -1
  724. package/dist/extensions/telegram/src/adapters/config-surface.d.ts +0 -2
  725. package/dist/extensions/telegram/src/adapters/config-surface.js +0 -26
  726. package/dist/extensions/telegram/src/adapters/config-surface.js.map +0 -1
  727. package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js +0 -158
  728. package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js.map +0 -1
  729. package/dist/gateway/static/root/assets/agents-DQ0mQxIA.js +0 -222
  730. package/dist/gateway/static/root/assets/channels-settings-BEtP53V6.js +0 -1
  731. package/dist/gateway/static/root/assets/channels-status-swr-CxTtS1hI.js +0 -8
  732. package/dist/gateway/static/root/assets/cron-api-CznlPIZT.js +0 -1
  733. package/dist/gateway/static/root/assets/cron-page-Dx6dE3eD.js +0 -1
  734. package/dist/gateway/static/root/assets/extension-settings-page-DuDCSb3J.js +0 -1
  735. package/dist/gateway/static/root/assets/field-primitives-BUwUiDf5.js +0 -1
  736. package/dist/gateway/static/root/assets/heartbeat-config-api-BjFW1cl-.js +0 -1
  737. package/dist/gateway/static/root/assets/index-DKgHC1Ta.js +0 -4840
  738. package/dist/gateway/static/root/assets/index-DjNDHzwG.css +0 -1
  739. package/dist/gateway/static/root/assets/notes-page-D40ZpS0Y.js +0 -1
  740. package/dist/gateway/static/root/assets/sessions-page-BvtdbmW8.js +0 -1
  741. package/dist/gateway/static/root/assets/settings-advanced-gate-BQamRjkV.js +0 -2
  742. package/dist/gateway/static/root/assets/settings-page-D972_jaS.js +0 -3
  743. package/dist/gateway/static/root/assets/share-preview-page-CKCTMo0_.js +0 -2
  744. package/dist/gateway/static/root/assets/skills-page-QwFCB4yV.js +0 -2
  745. package/dist/gateway/static/root/assets/url-q28QhI7l.js +0 -3
  746. package/dist/gateway/static/root/assets/utils-DCm11_KW.js +0 -1
  747. package/dist/gateway/static/root/assets/voice-api-key-field-CywiB7Dw.js +0 -1
  748. package/dist/gateway/static/root/assets/workflows-page-Be7l_SWw.js +0 -27
  749. package/dist/src/agent/embedded/map-stream-events.d.ts +0 -9
  750. package/dist/src/agent/embedded/map-stream-events.js +0 -63
  751. package/dist/src/agent/embedded/map-stream-events.js.map +0 -1
  752. package/dist/src/auth/oauth/vendor-pi-google/google-antigravity.js.map +0 -1
  753. package/dist/src/auth/oauth/vendor-pi-google/google-gemini-cli.js.map +0 -1
  754. package/dist/src/auth/oauth/vendor-pi-google/oauth-page.js.map +0 -1
  755. package/dist/src/auth/oauth/vendor-pi-google/pkce.js.map +0 -1
  756. package/dist/src/channels/dock.js.map +0 -1
  757. package/dist/src/channels/plugins/bundled.d.ts +0 -11
  758. package/dist/src/channels/plugins/bundled.js +0 -10
  759. package/dist/src/channels/plugins/bundled.js.map +0 -1
  760. package/dist/src/channels/registry.d.ts +0 -25
  761. package/dist/src/channels/registry.js +0 -82
  762. package/dist/src/channels/registry.js.map +0 -1
  763. package/dist/src/config/localized-text.d.ts +0 -6
  764. package/dist/src/config/localized-text.js +0 -42
  765. package/dist/src/config/localized-text.js.map +0 -1
  766. package/dist/src/generated/bundled-channel-plugins.d.ts +0 -10
  767. package/dist/src/generated/bundled-channel-plugins.js +0 -16
  768. package/dist/src/generated/bundled-channel-plugins.js.map +0 -1
  769. package/dist/src/tui/stream-assembler.d.ts +0 -22
  770. package/dist/src/tui/stream-assembler.js +0 -63
  771. package/dist/src/tui/stream-assembler.js.map +0 -1
  772. package/skills/browser/SKILL-zh.md +0 -188
  773. package/skills/business/company-values/SKILL-zh.md +0 -80
  774. package/skills/business/company-values/SKILL.md +0 -80
  775. package/skills/business/find-community/SKILL-zh.md +0 -50
  776. package/skills/business/find-community/SKILL.md +0 -50
  777. package/skills/business/first-customers/SKILL-zh.md +0 -76
  778. package/skills/business/first-customers/SKILL.md +0 -76
  779. package/skills/business/grow-sustainably/SKILL-zh.md +0 -92
  780. package/skills/business/grow-sustainably/SKILL.md +0 -92
  781. package/skills/business/marketing-plan/SKILL-zh.md +0 -100
  782. package/skills/business/marketing-plan/SKILL.md +0 -100
  783. package/skills/business/minimalist-review/SKILL-zh.md +0 -82
  784. package/skills/business/minimalist-review/SKILL.md +0 -82
  785. package/skills/business/mvp/SKILL-zh.md +0 -81
  786. package/skills/business/mvp/SKILL.md +0 -81
  787. package/skills/business/pricing/SKILL-zh.md +0 -64
  788. package/skills/business/pricing/SKILL.md +0 -64
  789. package/skills/business/processize/SKILL-zh.md +0 -91
  790. package/skills/business/processize/SKILL.md +0 -91
  791. package/skills/business/validate-idea/SKILL-zh.md +0 -68
  792. package/skills/business/validate-idea/SKILL.md +0 -68
  793. package/skills/creative/algorithmic-art/LICENSE.txt +0 -202
  794. package/skills/creative/algorithmic-art/SKILL-zh.md +0 -405
  795. package/skills/creative/algorithmic-art/SKILL.md +0 -405
  796. package/skills/creative/algorithmic-art/templates/generator_template.js +0 -223
  797. package/skills/creative/algorithmic-art/templates/viewer.html +0 -599
  798. package/skills/creative/frontend-design/SKILL-zh.md +0 -42
  799. package/skills/creative/theme-factory/SKILL-zh.md +0 -59
  800. package/skills/creative/web-artifacts-builder/LICENSE.txt +0 -202
  801. package/skills/creative/web-artifacts-builder/SKILL-zh.md +0 -74
  802. package/skills/creative/web-artifacts-builder/SKILL.md +0 -74
  803. package/skills/creative/web-artifacts-builder/scripts/bundle-artifact.sh +0 -54
  804. package/skills/creative/web-artifacts-builder/scripts/init-artifact.sh +0 -322
  805. package/skills/creative/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
  806. package/skills/documents/doc-coauthoring/SKILL-zh.md +0 -375
  807. package/skills/documents/doc-coauthoring/SKILL.md +0 -375
  808. package/skills/documents/docx/LICENSE.txt +0 -30
  809. package/skills/documents/docx/SKILL-zh.md +0 -590
  810. package/skills/documents/docx/SKILL.md +0 -590
  811. package/skills/documents/docx/scripts/__init__.py +0 -1
  812. package/skills/documents/docx/scripts/accept_changes.py +0 -135
  813. package/skills/documents/docx/scripts/comment.py +0 -318
  814. package/skills/documents/docx/scripts/office/helpers/__init__.py +0 -0
  815. package/skills/documents/docx/scripts/office/helpers/merge_runs.py +0 -199
  816. package/skills/documents/docx/scripts/office/helpers/simplify_redlines.py +0 -197
  817. package/skills/documents/docx/scripts/office/pack.py +0 -159
  818. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
  819. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
  820. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
  821. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
  822. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
  823. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
  824. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
  825. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
  826. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
  827. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
  828. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
  829. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
  830. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
  831. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
  832. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
  833. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
  834. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
  835. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
  836. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
  837. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
  838. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
  839. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
  840. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
  841. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
  842. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
  843. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
  844. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
  845. package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
  846. package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
  847. package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
  848. package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
  849. package/skills/documents/docx/scripts/office/schemas/mce/mc.xsd +0 -75
  850. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-2010.xsd +0 -560
  851. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-2012.xsd +0 -67
  852. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-2018.xsd +0 -14
  853. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -20
  854. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -13
  855. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
  856. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -8
  857. package/skills/documents/docx/scripts/office/soffice.py +0 -183
  858. package/skills/documents/docx/scripts/office/unpack.py +0 -132
  859. package/skills/documents/docx/scripts/office/validate.py +0 -111
  860. package/skills/documents/docx/scripts/office/validators/__init__.py +0 -15
  861. package/skills/documents/docx/scripts/office/validators/base.py +0 -847
  862. package/skills/documents/docx/scripts/office/validators/docx.py +0 -446
  863. package/skills/documents/docx/scripts/office/validators/pptx.py +0 -275
  864. package/skills/documents/docx/scripts/office/validators/redlining.py +0 -247
  865. package/skills/documents/docx/scripts/templates/comments.xml +0 -3
  866. package/skills/documents/docx/scripts/templates/commentsExtended.xml +0 -3
  867. package/skills/documents/docx/scripts/templates/commentsExtensible.xml +0 -3
  868. package/skills/documents/docx/scripts/templates/commentsIds.xml +0 -3
  869. package/skills/documents/docx/scripts/templates/people.xml +0 -3
  870. package/skills/documents/pdf/LICENSE.txt +0 -30
  871. package/skills/documents/pdf/SKILL-zh.md +0 -314
  872. package/skills/documents/pdf/SKILL.md +0 -314
  873. package/skills/documents/pdf/forms.md +0 -294
  874. package/skills/documents/pdf/reference.md +0 -612
  875. package/skills/documents/pdf/scripts/check_bounding_boxes.py +0 -65
  876. package/skills/documents/pdf/scripts/check_fillable_fields.py +0 -11
  877. package/skills/documents/pdf/scripts/convert_pdf_to_images.py +0 -33
  878. package/skills/documents/pdf/scripts/create_validation_image.py +0 -37
  879. package/skills/documents/pdf/scripts/extract_form_field_info.py +0 -122
  880. package/skills/documents/pdf/scripts/extract_form_structure.py +0 -115
  881. package/skills/documents/pdf/scripts/fill_fillable_fields.py +0 -98
  882. package/skills/documents/pdf/scripts/fill_pdf_form_with_annotations.py +0 -107
  883. package/skills/documents/pptx/LICENSE.txt +0 -30
  884. package/skills/documents/pptx/SKILL-zh.md +0 -232
  885. package/skills/documents/pptx/SKILL.md +0 -232
  886. package/skills/documents/pptx/editing.md +0 -205
  887. package/skills/documents/pptx/pptxgenjs.md +0 -420
  888. package/skills/documents/pptx/scripts/__init__.py +0 -0
  889. package/skills/documents/pptx/scripts/add_slide.py +0 -195
  890. package/skills/documents/pptx/scripts/clean.py +0 -286
  891. package/skills/documents/pptx/scripts/office/helpers/__init__.py +0 -0
  892. package/skills/documents/pptx/scripts/office/helpers/merge_runs.py +0 -199
  893. package/skills/documents/pptx/scripts/office/helpers/simplify_redlines.py +0 -197
  894. package/skills/documents/pptx/scripts/office/pack.py +0 -159
  895. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
  896. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
  897. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
  898. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
  899. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
  900. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
  901. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
  902. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
  903. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
  904. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
  905. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
  906. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
  907. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
  908. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
  909. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
  910. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
  911. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
  912. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
  913. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
  914. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
  915. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
  916. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
  917. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
  918. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
  919. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
  920. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
  921. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
  922. package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
  923. package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
  924. package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
  925. package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
  926. package/skills/documents/pptx/scripts/office/schemas/mce/mc.xsd +0 -75
  927. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-2010.xsd +0 -560
  928. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-2012.xsd +0 -67
  929. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-2018.xsd +0 -14
  930. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -20
  931. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -13
  932. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
  933. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -8
  934. package/skills/documents/pptx/scripts/office/soffice.py +0 -183
  935. package/skills/documents/pptx/scripts/office/unpack.py +0 -132
  936. package/skills/documents/pptx/scripts/office/validate.py +0 -111
  937. package/skills/documents/pptx/scripts/office/validators/__init__.py +0 -15
  938. package/skills/documents/pptx/scripts/office/validators/base.py +0 -847
  939. package/skills/documents/pptx/scripts/office/validators/docx.py +0 -446
  940. package/skills/documents/pptx/scripts/office/validators/pptx.py +0 -275
  941. package/skills/documents/pptx/scripts/office/validators/redlining.py +0 -247
  942. package/skills/documents/pptx/scripts/thumbnail.py +0 -289
  943. package/skills/documents/xlsx/SKILL-zh.md +0 -292
  944. package/skills/engineering/diagnose/SKILL-zh.md +0 -117
  945. package/skills/engineering/grill-with-docs/ADR-FORMAT.md +0 -47
  946. package/skills/engineering/grill-with-docs/CONTEXT-FORMAT.md +0 -77
  947. package/skills/engineering/grill-with-docs/SKILL-zh.md +0 -88
  948. package/skills/engineering/grill-with-docs/SKILL.md +0 -88
  949. package/skills/engineering/improve-codebase-architecture/DEEPENING.md +0 -37
  950. package/skills/engineering/improve-codebase-architecture/INTERFACE-DESIGN.md +0 -44
  951. package/skills/engineering/improve-codebase-architecture/LANGUAGE.md +0 -53
  952. package/skills/engineering/improve-codebase-architecture/SKILL-zh.md +0 -71
  953. package/skills/engineering/improve-codebase-architecture/SKILL.md +0 -71
  954. package/skills/engineering/tdd/SKILL-zh.md +0 -109
  955. package/skills/engineering/to-issues/SKILL-zh.md +0 -81
  956. package/skills/engineering/to-issues/SKILL.md +0 -81
  957. package/skills/engineering/to-prd/SKILL-zh.md +0 -76
  958. package/skills/engineering/to-prd/SKILL.md +0 -74
  959. package/skills/engineering/zoom-out/SKILL-zh.md +0 -7
  960. package/skills/engineering/zoom-out/SKILL.md +0 -7
  961. package/skills/tools/find-skills/SKILL-zh.md +0 -440
  962. package/skills/tools/github/SKILL-zh.md +0 -48
  963. package/skills/tools/internal-comms/LICENSE.txt +0 -202
  964. package/skills/tools/internal-comms/SKILL-zh.md +0 -32
  965. package/skills/tools/internal-comms/SKILL.md +0 -32
  966. package/skills/tools/internal-comms/examples/3p-updates.md +0 -47
  967. package/skills/tools/internal-comms/examples/company-newsletter.md +0 -65
  968. package/skills/tools/internal-comms/examples/faq-answers.md +0 -30
  969. package/skills/tools/internal-comms/examples/general-comms.md +0 -16
  970. package/skills/tools/skill-creator/LICENSE.txt +0 -202
  971. package/skills/tools/skill-creator/SKILL-zh.md +0 -483
  972. package/skills/tools/skill-creator/SKILL.md +0 -485
  973. package/skills/tools/skill-creator/agents/analyzer.md +0 -274
  974. package/skills/tools/skill-creator/agents/comparator.md +0 -202
  975. package/skills/tools/skill-creator/agents/grader.md +0 -223
  976. package/skills/tools/skill-creator/assets/eval_review.html +0 -146
  977. package/skills/tools/skill-creator/eval-viewer/generate_review.py +0 -471
  978. package/skills/tools/skill-creator/eval-viewer/viewer.html +0 -1325
  979. package/skills/tools/skill-creator/references/schemas.md +0 -430
  980. package/skills/tools/skill-creator/scripts/__init__.py +0 -0
  981. package/skills/tools/skill-creator/scripts/aggregate_benchmark.py +0 -401
  982. package/skills/tools/skill-creator/scripts/generate_report.py +0 -326
  983. package/skills/tools/skill-creator/scripts/improve_description.py +0 -247
  984. package/skills/tools/skill-creator/scripts/package_skill.py +0 -136
  985. package/skills/tools/skill-creator/scripts/quick_validate.py +0 -103
  986. package/skills/tools/skill-creator/scripts/run_eval.py +0 -310
  987. package/skills/tools/skill-creator/scripts/run_loop.py +0 -328
  988. package/skills/tools/skill-creator/scripts/utils.py +0 -47
  989. package/skills/tools/summarize/SKILL-zh.md +0 -47
  990. package/skills/tools/weather/SKILL-zh.md +0 -46
  991. package/skills/tools/weather/SKILL.md +0 -46
  992. package/skills/tools/webapp-testing/SKILL-zh.md +0 -96
  993. /package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/google-antigravity.d.ts +0 -0
  994. /package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/google-gemini-cli.d.ts +0 -0
  995. /package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/oauth-page.d.ts +0 -0
@@ -1,332 +1,166 @@
1
- import { init_paths, resolveConfigPath } from "../../config/paths.js";
2
- import { init_loader, loadConfig } from "../../config/loader.js";
3
- import { getChannelPlugin, listChannelPlugins, syncChannelPluginsFromManager } from "../../channels/plugins/registry.js";
1
+ import { buildChannelCatalogForConfig, init_channel_catalog_service } from "../../channels/catalog/channel-catalog-service.js";
2
+ import { init_loader, loadConfig, saveConfig } from "../../config/loader.js";
3
+ import { listChannelPairingState } from "../../channels/pairing/pairing-service.js";
4
4
  import { approveChannelPairingFromCli } from "../../channels/pairing/approve-cli.js";
5
- import { bundledChannelPlugins } from "../../generated/bundled-channel-plugins.js";
6
5
  import { formatExamples, register } from "../registry.js";
7
6
  import { colors } from "../utils/colors.js";
8
- import { SETUP_EXIT } from "./setup-shared/types.js";
9
- import { emitOutcome } from "./setup-shared/output.js";
10
- import { isPromptCancelled, promptSecret } from "./setup-shared/prompts.js";
11
- import { SetupValidationError, runSetup } from "./setup-shared/runner.js";
12
- import "./setup-shared/index.js";
13
7
  import { Command } from "commander";
14
8
  //#region src/cli/commands/channels.ts
15
- init_paths();
9
+ init_channel_catalog_service();
16
10
  init_loader();
17
- function ensureChannelRegistryForCli() {
18
- if (listChannelPlugins().length === 0) syncChannelPluginsFromManager(bundledChannelPlugins);
11
+ function normalizeChannelId(raw) {
12
+ return raw.trim().toLowerCase();
19
13
  }
20
- function resolveConfigPathFromCommand(command) {
21
- const root = command.parent?.parent && command.parent.parent instanceof Command ? command.parent.parent : command.parent && command.parent instanceof Command ? command.parent : null;
22
- return (root && typeof root.opts === "function" ? root.opts() : {}).config?.trim() || process.env.XOPC_CONFIG_PATH?.trim() || process.env.XOPC_CONFIG?.trim() || resolveConfigPath();
14
+ function loadCliConfig(ctx) {
15
+ return loadConfig(ctx.configPath);
16
+ }
17
+ async function writeCliConfig(ctx, cfg) {
18
+ await saveConfig(cfg, ctx.configPath);
19
+ }
20
+ function ensureChannelObject(cfg, channelId) {
21
+ if (!cfg.channels) cfg.channels = {};
22
+ const channels = cfg.channels;
23
+ const existing = channels[channelId];
24
+ if (existing && typeof existing === "object" && !Array.isArray(existing)) return existing;
25
+ const next = {};
26
+ channels[channelId] = next;
27
+ return next;
28
+ }
29
+ function assertCatalogChannel(cfg, channelId) {
30
+ if (!buildChannelCatalogForConfig(cfg).byId.has(channelId)) throw new Error(`Unknown channel "${channelId}". Install or declare a channel extension contribution first.`);
23
31
  }
24
32
  function createChannelsCommand(ctx) {
25
- const cmd = new Command("channels").description("Messaging channel login and credentials").addHelpText("after", formatExamples([
26
- "xopc channels login",
27
- "xopc channels login --channel weixin",
28
- "xopc channels login --channel feishu",
29
- "xopc channels login --account my-bot-id",
30
- "xopc channels pairing approve --channel telegram ABC12XYZ"
33
+ const cmd = new Command("channels").description("Messaging channel configuration").addHelpText("after", formatExamples([
34
+ "xopc channels list",
35
+ "xopc channels show telegram",
36
+ "xopc channels enable telegram",
37
+ "xopc channels config set-json telegram '{\"enabled\":true}'",
38
+ "xopc channels pairing approve telegram ABC12XYZ"
31
39
  ]));
32
- const PAIRING_CHANNELS = new Set([
33
- "telegram",
34
- "feishu",
35
- "weixin"
36
- ]);
37
- cmd.command("login").description("Log in with QR code or channel-specific credentials flow").option("--channel <id>", "Channel id (auto-detected when only one login-capable channel is registered)").option("--account <id>", "Optional account id when re-logging an existing bot").option("--timeout <ms>", "Max wait for scan (default 480000)", "480000").option("--credentials-only", "Only save token files; do not update xopc.json").action(async (options, command) => {
38
- ensureChannelRegistryForCli();
39
- const explicitChannel = options.channel?.trim?.();
40
- let channelId;
41
- if (explicitChannel) channelId = explicitChannel;
42
- else {
43
- const loginCapable = listChannelPlugins().filter((p) => p.cliLogin);
44
- if (loginCapable.length === 1) {
45
- channelId = loginCapable[0].id;
46
- console.log(`Auto-detected channel: ${channelId}`);
47
- } else if (loginCapable.length === 0) {
48
- console.error("No channels with login support found.");
49
- process.exitCode = 1;
50
- return;
51
- } else {
52
- console.error(`Multiple channels support login: ${loginCapable.map((p) => p.id).join(", ")}. Use --channel <id> to specify.`);
53
- process.exitCode = 1;
54
- return;
55
- }
56
- }
57
- const plugin = getChannelPlugin(channelId);
58
- if (!plugin?.cliLogin) {
59
- console.error(`Channel "${channelId}" does not support CLI login.`);
60
- const capable = listChannelPlugins().filter((p) => p.cliLogin).map((p) => p.id);
61
- if (capable.length > 0) console.error(`Channels with login support: ${capable.join(", ")}`);
62
- process.exitCode = 1;
63
- return;
64
- }
65
- const configPath = resolveConfigPathFromCommand(command);
66
- const timeoutMs = Math.max(6e4, Number.parseInt(String(options.timeout), 10) || 48e4);
67
- const verbose = ctx.isVerbose;
68
- const result = await plugin.cliLogin.runLogin({
69
- configPath,
70
- verbose,
71
- timeoutMs,
72
- accountId: options.account?.trim() || void 0,
73
- writeConfig: !options.credentialsOnly
74
- });
75
- if (!result.ok) {
76
- if (result.cancelled) {
77
- process.exitCode = 130;
78
- return;
79
- }
80
- console.error(result.message || "Login failed");
81
- process.exitCode = 1;
82
- }
83
- });
84
- cmd.command("list").description("List configured channels and their account status").option("--json", "Output as JSON for agents/UIs", false).action((opts) => {
85
- ensureChannelRegistryForCli();
86
- const channelsCfg = loadConfig(resolveConfigPathFromCommand(cmd)).channels ?? {};
87
- const entries = listChannelPlugins().map((plugin) => {
88
- const raw = channelsCfg[plugin.id] ?? {};
89
- const enabled = raw.enabled === true;
90
- const accounts = raw.accounts ?? {};
91
- const accountSummaries = Object.entries(accounts).map(([id, acct]) => ({
92
- accountId: id,
93
- enabled: acct.enabled !== false,
94
- configured: typeof acct.botToken === "string" ? Boolean(acct.botToken.trim()) : false
95
- }));
96
- return {
97
- id: plugin.id,
98
- name: plugin.meta?.label ?? plugin.id,
99
- enabled,
100
- hasLogin: Boolean(plugin.cliLogin),
101
- accountCount: accountSummaries.length,
102
- accounts: accountSummaries
103
- };
104
- });
40
+ cmd.command("list").description("List channel extension contributions").option("--json", "Output as JSON", false).action((opts) => {
41
+ const cfg = loadCliConfig(ctx);
42
+ const catalog = buildChannelCatalogForConfig(cfg);
43
+ const channels = cfg.channels;
44
+ const rows = catalog.entries.map((entry) => ({
45
+ id: entry.id,
46
+ label: entry.label,
47
+ extensionId: entry.extensionId,
48
+ source: entry.source,
49
+ enabled: channels?.[entry.id]?.enabled === true,
50
+ configured: Boolean(channels?.[entry.id])
51
+ }));
105
52
  if (opts.json) {
106
- process.stdout.write(JSON.stringify({
53
+ process.stdout.write(`${JSON.stringify({
107
54
  ok: true,
108
- channels: entries
109
- }) + "\n");
55
+ channels: rows
56
+ })}\n`);
110
57
  return;
111
58
  }
112
59
  console.log("");
113
60
  console.log(colors.bold("CHANNELS"));
114
- const idWidth = Math.max(...entries.map((e) => e.id.length));
115
- for (const e of entries) {
116
- const status = e.enabled ? colors.green("enabled") : colors.gray("disabled");
117
- const accts = e.accountCount > 0 ? colors.gray(` (${e.accountCount} accounts)`) : "";
118
- console.log(` ${e.id.padEnd(idWidth)} ${status} ${colors.gray(e.name)}${accts}`);
61
+ const idWidth = Math.max(2, ...rows.map((r) => r.id.length));
62
+ for (const row of rows) {
63
+ const status = row.enabled ? colors.green("enabled") : colors.gray("disabled");
64
+ console.log(` ${row.id.padEnd(idWidth)} ${status} ${colors.gray(row.label)} ${colors.gray(row.extensionId)}`);
119
65
  }
120
66
  console.log("");
121
- console.log(colors.gray("Use: xopc channels add <id> [--token <token>]"));
122
67
  });
123
- cmd.command("add <channel>").description("Add or update a channel account (currently: telegram)").option("--token <value>", "Bot token (Telegram). Prompts securely if omitted.").option("--account <id>", "Account id (default: \"default\")").option("--enable", "Enable the channel after writing (default: true)", true).option("--dry-run", "Show the change without writing", false).option("--json", "Emit a single JSON outcome line", false).action(async (channel, opts) => {
124
- const channelId = channel.trim().toLowerCase();
125
- const accountId = opts.account?.trim() || "default";
126
- const dryRun = Boolean(opts.dryRun);
127
- const json = Boolean(opts.json);
128
- if (channelId === "feishu" || channelId === "weixin") {
129
- emitOutcome({
130
- ok: false,
131
- action: "add",
132
- domain: `channels.${channelId}`,
133
- target: accountId,
134
- changedPaths: [],
135
- dryRun,
136
- errors: [{ message: channelId === "weixin" ? "Weixin uses interactive QR login. Run: xopc channels login --channel weixin" : "Feishu add via CLI is not yet implemented. Edit `~/.xopc/xopc.json` (channels.feishu) or run: xopc onboard --channels" }]
137
- }, json);
138
- process.exitCode = SETUP_EXIT.ERROR;
139
- return;
140
- }
141
- if (channelId !== "telegram") {
142
- emitOutcome({
143
- ok: false,
144
- action: "add",
145
- domain: `channels.${channelId}`,
146
- target: accountId,
147
- changedPaths: [],
148
- dryRun,
149
- errors: [{ message: `Unknown channel "${channelId}". Try: xopc channels list` }]
150
- }, json);
151
- process.exitCode = SETUP_EXIT.ERROR;
68
+ cmd.command("show <channel>").description("Show one channel catalog entry and config").option("--json", "Output as JSON", false).action((channel, opts) => {
69
+ const cfg = loadCliConfig(ctx);
70
+ const channelId = normalizeChannelId(channel);
71
+ const entry = buildChannelCatalogForConfig(cfg).byId.get(channelId);
72
+ if (!entry) {
73
+ console.error(`Unknown channel "${channelId}".`);
74
+ process.exitCode = 1;
152
75
  return;
153
76
  }
154
- let token = opts.token?.trim();
155
- if (!token) token = process.env.TELEGRAM_BOT_TOKEN?.trim();
156
- if (!token) try {
157
- token = await promptSecret("Telegram bot token (from @BotFather):");
158
- } catch (error) {
159
- if (isPromptCancelled(error)) {
160
- emitOutcome({
161
- ok: false,
162
- action: "add",
163
- domain: "channels.telegram",
164
- target: accountId,
165
- changedPaths: [],
166
- dryRun,
167
- errors: [{ message: "Cancelled by user" }]
168
- }, json);
169
- process.exitCode = SETUP_EXIT.CANCELLED;
170
- return;
171
- }
172
- throw error;
173
- }
174
- if (!validateTelegramToken(token)) {
175
- emitOutcome({
176
- ok: false,
177
- action: "add",
178
- domain: "channels.telegram",
179
- target: accountId,
180
- changedPaths: [],
181
- dryRun,
182
- errors: [{
183
- path: "token",
184
- message: "Token does not look like a Telegram bot token (expected `<digits>:<35+ chars>`)."
185
- }]
186
- }, json);
187
- process.exitCode = SETUP_EXIT.ERROR;
77
+ const payload = {
78
+ entry,
79
+ config: cfg.channels?.[channelId] ?? {}
80
+ };
81
+ if (opts.json) {
82
+ process.stdout.write(`${JSON.stringify({
83
+ ok: true,
84
+ ...payload
85
+ })}\n`);
188
86
  return;
189
87
  }
190
- await runSetup({
191
- configPath: resolveConfigPathFromCommand(cmd),
192
- options: {
193
- dryRun,
194
- json
195
- },
196
- mutator: {
197
- domain: "channels.telegram",
198
- target: accountId,
199
- action: "add",
200
- mutate(config) {
201
- return applyTelegramAccount(config, accountId, token, opts.enable !== false);
202
- },
203
- resultValue: () => ({
204
- channel: "telegram",
205
- accountId,
206
- tokenMask: maskToken(token)
207
- }),
208
- notes: () => [opts.enable !== false ? "Telegram channel enabled. Restart the gateway for the new bot to come online." : "Telegram credentials saved (channel disabled). Use `--enable` to start it."]
209
- }
210
- });
88
+ console.log(JSON.stringify(payload, null, 2));
211
89
  });
212
- cmd.command("remove <channel>").description("Remove a channel account").option("--account <id>", "Account id (default: \"default\")").option("--dry-run", "Show the change without writing", false).option("--json", "Emit a single JSON outcome line", false).action(async (channel, opts) => {
213
- const channelId = channel.trim().toLowerCase();
214
- const accountId = opts.account?.trim() || "default";
215
- const dryRun = Boolean(opts.dryRun);
216
- const json = Boolean(opts.json);
217
- await runSetup({
218
- configPath: resolveConfigPathFromCommand(cmd),
219
- options: {
220
- dryRun,
221
- json
222
- },
223
- mutator: {
224
- domain: `channels.${channelId}`,
225
- target: accountId,
226
- action: "remove",
227
- mutate(config) {
228
- return removeChannelAccount(config, channelId, accountId);
229
- }
230
- }
231
- });
90
+ cmd.command("enable <channel>").description("Enable a channel config block").action(async (channel) => {
91
+ const cfg = loadCliConfig(ctx);
92
+ const channelId = normalizeChannelId(channel);
93
+ assertCatalogChannel(cfg, channelId);
94
+ ensureChannelObject(cfg, channelId).enabled = true;
95
+ await writeCliConfig(ctx, cfg);
96
+ console.log(`Enabled channel ${channelId}`);
232
97
  });
233
- cmd.command("schema [channel]").description("Print credential schemas for channels (for agents / UIs)").option("--json", "JSON output (default human-readable JSON)", false).action((channel, opts) => {
234
- ensureChannelRegistryForCli();
235
- const all = listChannelPlugins().map((p) => ({
236
- id: p.id,
237
- name: p.meta?.label ?? p.id,
238
- hasLogin: Boolean(p.cliLogin),
239
- configSchema: p.configSchema?.schema
240
- }));
241
- const payload = {
242
- ok: true,
243
- channels: channel ? all.filter((c) => c.id === channel) : all
244
- };
245
- if (opts.json) process.stdout.write(JSON.stringify(payload) + "\n");
246
- else console.log(JSON.stringify(payload, null, 2));
98
+ cmd.command("disable <channel>").description("Disable a channel config block").action(async (channel) => {
99
+ const cfg = loadCliConfig(ctx);
100
+ const channelId = normalizeChannelId(channel);
101
+ assertCatalogChannel(cfg, channelId);
102
+ ensureChannelObject(cfg, channelId).enabled = false;
103
+ await writeCliConfig(ctx, cfg);
104
+ console.log(`Disabled channel ${channelId}`);
247
105
  });
248
- cmd.command("pairing").description("Approve DM pairing requests (updates channel allowFrom credential files)").addCommand(new Command("approve").description("Approve a pairing code shown to the user in Telegram / Feishu / Weixin DMs").requiredOption("--channel <id>", "telegram | feishu | weixin").option("--account <id>", "Bot account id from config", "default").argument("<code>", "Pairing code from the user message").action((code, options) => {
249
- const ch = (options.channel ?? "").trim().toLowerCase();
250
- if (!PAIRING_CHANNELS.has(ch)) {
251
- console.error("Invalid --channel. Use: telegram, feishu, or weixin.");
252
- process.exitCode = 1;
106
+ cmd.command("config").description("Edit channel config").command("set-json <channel> <json>").description("Merge a JSON object into channels.<id>").action(async (channel, json) => {
107
+ const cfg = loadCliConfig(ctx);
108
+ const channelId = normalizeChannelId(channel);
109
+ assertCatalogChannel(cfg, channelId);
110
+ const patch = JSON.parse(json);
111
+ if (!patch || typeof patch !== "object" || Array.isArray(patch)) throw new Error("JSON value must be an object");
112
+ Object.assign(ensureChannelObject(cfg, channelId), patch);
113
+ await writeCliConfig(ctx, cfg);
114
+ console.log(`Updated channels.${channelId}`);
115
+ });
116
+ const pairing = cmd.command("pairing").description("Manage channel pairing state");
117
+ pairing.command("list <channel>").option("--account <id>", "Account id", "default").option("--json", "Output as JSON", false).action((channel, opts) => {
118
+ const cfg = loadCliConfig(ctx);
119
+ const state = listChannelPairingState({
120
+ channel: normalizeChannelId(channel),
121
+ accountId: opts.account,
122
+ config: cfg
123
+ });
124
+ if (opts.json) {
125
+ process.stdout.write(`${JSON.stringify({
126
+ ok: true,
127
+ state
128
+ })}\n`);
253
129
  return;
254
130
  }
131
+ console.log(JSON.stringify(state, null, 2));
132
+ });
133
+ pairing.command("approve <channel> <code>").option("--account <id>", "Account id", "default").action((channel, code, opts) => {
255
134
  const result = approveChannelPairingFromCli({
256
- channel: ch,
257
- accountId: (options.account ?? "default").trim() || "default",
258
- code: String(code ?? "").trim()
135
+ channel: normalizeChannelId(channel),
136
+ accountId: opts.account ?? "default",
137
+ code
259
138
  });
260
139
  if (result.ok === false) {
261
140
  console.error(result.error);
262
141
  process.exitCode = 1;
263
142
  return;
264
143
  }
265
- console.log(`Approved. Sender id added to allowFrom store: ${result.senderId}`);
266
- }));
144
+ console.log(`Approved sender ${result.senderId}`);
145
+ });
267
146
  return cmd;
268
147
  }
269
- const TELEGRAM_TOKEN_PATTERN = /^\d{5,}:[A-Za-z0-9_-]{30,}$/;
270
- function validateTelegramToken(token) {
271
- return TELEGRAM_TOKEN_PATTERN.test(token.trim());
272
- }
273
- function maskToken(token) {
274
- const t = token.trim();
275
- if (t.length <= 8) return "*".repeat(t.length);
276
- return `${t.slice(0, 4)}…${t.slice(-4)}`;
277
- }
278
- function applyTelegramAccount(cfg, accountId, botToken, enable) {
279
- const channels = { ...cfg.channels ?? {} };
280
- const tg = { ...channels.telegram ?? {} };
281
- if (enable) tg.enabled = true;
282
- const accounts = { ...tg.accounts ?? {} };
283
- accounts[accountId] = {
284
- ...accounts[accountId] ?? {},
285
- accountId,
286
- enabled: true,
287
- botToken
288
- };
289
- tg.accounts = accounts;
290
- channels.telegram = tg;
291
- return {
292
- ...cfg,
293
- channels
294
- };
295
- }
296
- function removeChannelAccount(cfg, channelId, accountId) {
297
- if (channelId === "feishu" || channelId === "weixin" || channelId === "telegram") {
298
- const channels = { ...cfg.channels ?? {} };
299
- const ch = { ...channels[channelId] ?? {} };
300
- const accounts = { ...ch.accounts ?? {} };
301
- if (!(accountId in accounts)) throw new SetupValidationError([{ message: `No account "${accountId}" on channel "${channelId}".` }]);
302
- delete accounts[accountId];
303
- ch.accounts = accounts;
304
- if (Object.keys(accounts).length === 0) ch.enabled = false;
305
- channels[channelId] = ch;
306
- return {
307
- ...cfg,
308
- channels
309
- };
310
- }
311
- throw new SetupValidationError([{ message: `Unknown channel "${channelId}". Try: xopc channels list` }]);
312
- }
313
148
  register({
314
149
  id: "channels",
315
150
  name: "channels",
316
- description: "Messaging channel login",
151
+ description: "Messaging channel configuration",
317
152
  factory: createChannelsCommand,
318
153
  metadata: {
319
154
  category: "setup",
320
155
  examples: [
321
156
  "xopc channels list",
322
- "xopc channels add telegram --token 123456:ABC...",
323
- "xopc channels remove telegram",
324
- "xopc channels login",
325
- "xopc channels pairing approve --channel feishu --account default ABC12XYZ"
157
+ "xopc channels show telegram",
158
+ "xopc channels enable telegram",
159
+ "xopc channels config set-json telegram '{\"enabled\":true}'"
326
160
  ]
327
161
  }
328
162
  });
329
163
  //#endregion
330
- export { applyTelegramAccount, maskToken, removeChannelAccount, validateTelegramToken };
164
+ export {};
331
165
 
332
166
  //# sourceMappingURL=channels.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"channels.js","names":[],"sources":["../../../../src/cli/commands/channels.ts"],"sourcesContent":["import { Command } from 'commander';\n\nimport { approveChannelPairingFromCli, type PairingCliChannel } from '../../channels/pairing/index.js';\nimport { resolveConfigPath } from '../../config/paths.js';\nimport {\n getChannelPlugin,\n listChannelPlugins,\n syncChannelPluginsFromManager,\n} from '../../channels/plugins/registry.js';\nimport { bundledChannelPlugins } from '../../generated/bundled-channel-plugins.js';\nimport { loadConfig } from '../../config/loader.js';\nimport type { Config } from '../../config/schema.js';\nimport { register, formatExamples, type CLIContext } from '../registry.js';\nimport { colors } from '../utils/colors.js';\n\nimport {\n SETUP_EXIT,\n SetupValidationError,\n emitOutcome,\n isPromptCancelled,\n promptSecret,\n runSetup,\n type SetupOutcome,\n} from './setup-shared/index.js';\n\nfunction ensureChannelRegistryForCli(): void {\n if (listChannelPlugins().length === 0) {\n syncChannelPluginsFromManager(bundledChannelPlugins);\n }\n}\n\nfunction resolveConfigPathFromCommand(command: Command): string {\n const root =\n command.parent?.parent && command.parent.parent instanceof Command\n ? command.parent.parent\n : command.parent && command.parent instanceof Command\n ? command.parent\n : null;\n const globalOpts = (root && typeof root.opts === 'function'\n ? (root.opts() as { config?: string })\n : {}) as { config?: string };\n return (\n globalOpts.config?.trim() ||\n process.env.XOPC_CONFIG_PATH?.trim() ||\n process.env.XOPC_CONFIG?.trim() ||\n resolveConfigPath()\n );\n}\n\nfunction createChannelsCommand(ctx: CLIContext): Command {\n const cmd = new Command('channels')\n .description('Messaging channel login and credentials')\n .addHelpText(\n 'after',\n formatExamples([\n 'xopc channels login',\n 'xopc channels login --channel weixin',\n 'xopc channels login --channel feishu',\n 'xopc channels login --account my-bot-id',\n 'xopc channels pairing approve --channel telegram ABC12XYZ',\n ]),\n );\n\n const PAIRING_CHANNELS = new Set<PairingCliChannel>(['telegram', 'feishu', 'weixin']);\n\n cmd\n .command('login')\n .description('Log in with QR code or channel-specific credentials flow')\n .option(\n '--channel <id>',\n 'Channel id (auto-detected when only one login-capable channel is registered)',\n )\n .option('--account <id>', 'Optional account id when re-logging an existing bot')\n .option('--timeout <ms>', 'Max wait for scan (default 480000)', '480000')\n .option('--credentials-only', 'Only save token files; do not update xopc.json')\n .action(async (options, command) => {\n ensureChannelRegistryForCli();\n const explicitChannel = options.channel?.trim?.();\n let channelId: string;\n if (explicitChannel) {\n channelId = explicitChannel;\n } else {\n const loginCapable = listChannelPlugins().filter((p) => p.cliLogin);\n if (loginCapable.length === 1) {\n channelId = loginCapable[0].id;\n console.log(`Auto-detected channel: ${channelId}`);\n } else if (loginCapable.length === 0) {\n console.error('No channels with login support found.');\n process.exitCode = 1;\n return;\n } else {\n console.error(\n `Multiple channels support login: ${loginCapable.map((p) => p.id).join(', ')}. ` +\n 'Use --channel <id> to specify.',\n );\n process.exitCode = 1;\n return;\n }\n }\n const plugin = getChannelPlugin(channelId);\n if (!plugin?.cliLogin) {\n console.error(`Channel \"${channelId}\" does not support CLI login.`);\n const capable = listChannelPlugins()\n .filter((p) => p.cliLogin)\n .map((p) => p.id);\n if (capable.length > 0) {\n console.error(`Channels with login support: ${capable.join(', ')}`);\n }\n process.exitCode = 1;\n return;\n }\n\n const configPath = resolveConfigPathFromCommand(command);\n const timeoutMs = Math.max(60_000, Number.parseInt(String(options.timeout), 10) || 480_000);\n const verbose = ctx.isVerbose;\n\n const result = await plugin.cliLogin.runLogin({\n configPath,\n verbose,\n timeoutMs,\n accountId: options.account?.trim() || undefined,\n writeConfig: !options.credentialsOnly,\n });\n\n if (!result.ok) {\n if (result.cancelled) {\n process.exitCode = 130;\n return;\n }\n console.error(result.message || 'Login failed');\n process.exitCode = 1;\n }\n });\n\n cmd\n .command('list')\n .description('List configured channels and their account status')\n .option('--json', 'Output as JSON for agents/UIs', false)\n .action((opts: { json?: boolean }) => {\n ensureChannelRegistryForCli();\n const cfg = loadConfig(resolveConfigPathFromCommand(cmd));\n const channelsCfg = (cfg.channels ?? {}) as Record<string, Record<string, unknown>>;\n const entries = listChannelPlugins().map((plugin) => {\n const raw = channelsCfg[plugin.id] ?? {};\n const enabled = raw.enabled === true;\n const accounts = (raw.accounts ?? {}) as Record<string, Record<string, unknown>>;\n const accountSummaries = Object.entries(accounts).map(([id, acct]) => ({\n accountId: id,\n enabled: acct.enabled !== false,\n configured: typeof acct.botToken === 'string'\n ? Boolean((acct.botToken as string).trim())\n : false,\n }));\n return {\n id: plugin.id,\n name: plugin.meta?.label ?? plugin.id,\n enabled,\n hasLogin: Boolean(plugin.cliLogin),\n accountCount: accountSummaries.length,\n accounts: accountSummaries,\n };\n });\n if (opts.json) {\n process.stdout.write(JSON.stringify({ ok: true, channels: entries }) + '\\n');\n return;\n }\n console.log('');\n console.log(colors.bold('CHANNELS'));\n const idWidth = Math.max(...entries.map((e) => e.id.length));\n for (const e of entries) {\n const status = e.enabled\n ? colors.green('● enabled')\n : colors.gray('○ disabled');\n const accts = e.accountCount > 0 ? colors.gray(` (${e.accountCount} accounts)`) : '';\n console.log(` ${e.id.padEnd(idWidth)} ${status} ${colors.gray(e.name)}${accts}`);\n }\n console.log('');\n console.log(colors.gray('Use: xopc channels add <id> [--token <token>]'));\n });\n\n cmd\n .command('add <channel>')\n .description('Add or update a channel account (currently: telegram)')\n .option('--token <value>', 'Bot token (Telegram). Prompts securely if omitted.')\n .option('--account <id>', 'Account id (default: \"default\")')\n .option('--enable', 'Enable the channel after writing (default: true)', true)\n .option('--dry-run', 'Show the change without writing', false)\n .option('--json', 'Emit a single JSON outcome line', false)\n .action(\n async (\n channel: string,\n opts: {\n token?: string;\n account?: string;\n enable?: boolean;\n dryRun?: boolean;\n json?: boolean;\n },\n ) => {\n const channelId = channel.trim().toLowerCase();\n const accountId = opts.account?.trim() || 'default';\n const dryRun = Boolean(opts.dryRun);\n const json = Boolean(opts.json);\n\n if (channelId === 'feishu' || channelId === 'weixin') {\n const outcome: SetupOutcome = {\n ok: false,\n action: 'add',\n domain: `channels.${channelId}`,\n target: accountId,\n changedPaths: [],\n dryRun,\n errors: [\n {\n message:\n channelId === 'weixin'\n ? 'Weixin uses interactive QR login. Run: xopc channels login --channel weixin'\n : 'Feishu add via CLI is not yet implemented. Edit `~/.xopc/xopc.json` (channels.feishu) or run: xopc onboard --channels',\n },\n ],\n };\n emitOutcome(outcome, json);\n process.exitCode = SETUP_EXIT.ERROR;\n return;\n }\n\n if (channelId !== 'telegram') {\n const outcome: SetupOutcome = {\n ok: false,\n action: 'add',\n domain: `channels.${channelId}`,\n target: accountId,\n changedPaths: [],\n dryRun,\n errors: [{ message: `Unknown channel \"${channelId}\". Try: xopc channels list` }],\n };\n emitOutcome(outcome, json);\n process.exitCode = SETUP_EXIT.ERROR;\n return;\n }\n\n let token = opts.token?.trim();\n if (!token) {\n token = process.env.TELEGRAM_BOT_TOKEN?.trim();\n }\n if (!token) {\n try {\n token = await promptSecret('Telegram bot token (from @BotFather):');\n } catch (error) {\n if (isPromptCancelled(error)) {\n const outcome: SetupOutcome = {\n ok: false,\n action: 'add',\n domain: 'channels.telegram',\n target: accountId,\n changedPaths: [],\n dryRun,\n errors: [{ message: 'Cancelled by user' }],\n };\n emitOutcome(outcome, json);\n process.exitCode = SETUP_EXIT.CANCELLED;\n return;\n }\n throw error;\n }\n }\n\n if (!validateTelegramToken(token)) {\n const outcome: SetupOutcome = {\n ok: false,\n action: 'add',\n domain: 'channels.telegram',\n target: accountId,\n changedPaths: [],\n dryRun,\n errors: [{ path: 'token', message: 'Token does not look like a Telegram bot token (expected `<digits>:<35+ chars>`).' }],\n };\n emitOutcome(outcome, json);\n process.exitCode = SETUP_EXIT.ERROR;\n return;\n }\n\n await runSetup({\n configPath: resolveConfigPathFromCommand(cmd),\n options: { dryRun, json },\n mutator: {\n domain: 'channels.telegram',\n target: accountId,\n action: 'add',\n mutate(config) {\n return applyTelegramAccount(config, accountId, token!, opts.enable !== false);\n },\n resultValue: () => ({\n channel: 'telegram',\n accountId,\n tokenMask: maskToken(token!),\n }),\n notes: () => [\n opts.enable !== false\n ? 'Telegram channel enabled. Restart the gateway for the new bot to come online.'\n : 'Telegram credentials saved (channel disabled). Use `--enable` to start it.',\n ],\n },\n });\n },\n );\n\n cmd\n .command('remove <channel>')\n .description('Remove a channel account')\n .option('--account <id>', 'Account id (default: \"default\")')\n .option('--dry-run', 'Show the change without writing', false)\n .option('--json', 'Emit a single JSON outcome line', false)\n .action(\n async (\n channel: string,\n opts: { account?: string; dryRun?: boolean; json?: boolean },\n ) => {\n const channelId = channel.trim().toLowerCase();\n const accountId = opts.account?.trim() || 'default';\n const dryRun = Boolean(opts.dryRun);\n const json = Boolean(opts.json);\n\n await runSetup({\n configPath: resolveConfigPathFromCommand(cmd),\n options: { dryRun, json },\n mutator: {\n domain: `channels.${channelId}`,\n target: accountId,\n action: 'remove',\n mutate(config) {\n return removeChannelAccount(config, channelId, accountId);\n },\n },\n });\n },\n );\n\n cmd\n .command('schema [channel]')\n .description('Print credential schemas for channels (for agents / UIs)')\n .option('--json', 'JSON output (default human-readable JSON)', false)\n .action((channel: string | undefined, opts: { json?: boolean }) => {\n ensureChannelRegistryForCli();\n const all = listChannelPlugins().map((p) => ({\n id: p.id,\n name: p.meta?.label ?? p.id,\n hasLogin: Boolean(p.cliLogin),\n configSchema: p.configSchema?.schema,\n }));\n const payload = {\n ok: true,\n channels: channel ? all.filter((c) => c.id === channel) : all,\n };\n if (opts.json) {\n process.stdout.write(JSON.stringify(payload) + '\\n');\n } else {\n console.log(JSON.stringify(payload, null, 2));\n }\n });\n\n cmd\n .command('pairing')\n .description('Approve DM pairing requests (updates channel allowFrom credential files)')\n .addCommand(\n new Command('approve')\n .description('Approve a pairing code shown to the user in Telegram / Feishu / Weixin DMs')\n .requiredOption('--channel <id>', 'telegram | feishu | weixin')\n .option('--account <id>', 'Bot account id from config', 'default')\n .argument('<code>', 'Pairing code from the user message')\n .action((code: string, options: { channel?: string; account?: string }) => {\n const ch = (options.channel ?? '').trim().toLowerCase() as PairingCliChannel;\n if (!PAIRING_CHANNELS.has(ch)) {\n console.error('Invalid --channel. Use: telegram, feishu, or weixin.');\n process.exitCode = 1;\n return;\n }\n const accountId = (options.account ?? 'default').trim() || 'default';\n const result = approveChannelPairingFromCli({\n channel: ch,\n accountId,\n code: String(code ?? '').trim(),\n });\n if (result.ok === false) {\n console.error(result.error);\n process.exitCode = 1;\n return;\n }\n console.log(`Approved. Sender id added to allowFrom store: ${result.senderId}`);\n }),\n );\n\n return cmd;\n}\n\n// ---------- helpers ----------\n\nconst TELEGRAM_TOKEN_PATTERN = /^\\d{5,}:[A-Za-z0-9_-]{30,}$/;\n\nexport function validateTelegramToken(token: string): boolean {\n return TELEGRAM_TOKEN_PATTERN.test(token.trim());\n}\n\nexport function maskToken(token: string): string {\n const t = token.trim();\n if (t.length <= 8) return '*'.repeat(t.length);\n return `${t.slice(0, 4)}…${t.slice(-4)}`;\n}\n\nexport function applyTelegramAccount(\n cfg: Config,\n accountId: string,\n botToken: string,\n enable: boolean,\n): Config {\n const channels = { ...((cfg.channels ?? {}) as Record<string, unknown>) };\n const tg = { ...((channels.telegram ?? {}) as Record<string, unknown>) };\n if (enable) tg.enabled = true;\n const accounts = { ...((tg.accounts ?? {}) as Record<string, Record<string, unknown>>) };\n accounts[accountId] = {\n ...(accounts[accountId] ?? {}),\n accountId,\n enabled: true,\n botToken,\n };\n tg.accounts = accounts;\n channels.telegram = tg;\n return { ...cfg, channels } as Config;\n}\n\nexport function removeChannelAccount(\n cfg: Config,\n channelId: string,\n accountId: string,\n): Config {\n if (channelId === 'feishu' || channelId === 'weixin' || channelId === 'telegram') {\n const channels = { ...((cfg.channels ?? {}) as Record<string, unknown>) };\n const ch = { ...((channels[channelId] ?? {}) as Record<string, unknown>) };\n const accounts = { ...((ch.accounts ?? {}) as Record<string, unknown>) };\n if (!(accountId in accounts)) {\n throw new SetupValidationError([\n { message: `No account \"${accountId}\" on channel \"${channelId}\".` },\n ]);\n }\n delete accounts[accountId];\n ch.accounts = accounts;\n if (Object.keys(accounts).length === 0) {\n ch.enabled = false;\n }\n channels[channelId] = ch;\n return { ...cfg, channels } as Config;\n }\n throw new SetupValidationError([\n { message: `Unknown channel \"${channelId}\". Try: xopc channels list` },\n ]);\n}\n\nregister({\n id: 'channels',\n name: 'channels',\n description: 'Messaging channel login',\n factory: createChannelsCommand,\n metadata: {\n category: 'setup',\n examples: [\n 'xopc channels list',\n 'xopc channels add telegram --token 123456:ABC...',\n 'xopc channels remove telegram',\n 'xopc channels login',\n 'xopc channels pairing approve --channel feishu --account default ABC12XYZ',\n ],\n },\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"channels.js","names":[],"sources":["../../../../src/cli/commands/channels.ts"],"sourcesContent":["import { Command } from 'commander';\n\nimport {\n approveChannelPairingFromCli,\n listChannelPairingState,\n} from '../../channels/pairing/index.js';\nimport { buildChannelCatalogForConfig } from '../../channels/catalog/channel-catalog-service.js';\nimport { loadConfig, saveConfig } from '../../config/loader.js';\nimport type { Config } from '../../config/schema.js';\nimport { register, formatExamples, type CLIContext } from '../registry.js';\nimport { colors } from '../utils/colors.js';\n\nfunction normalizeChannelId(raw: string): string {\n return raw.trim().toLowerCase();\n}\n\nfunction loadCliConfig(ctx: CLIContext): Config {\n return loadConfig(ctx.configPath);\n}\n\nasync function writeCliConfig(ctx: CLIContext, cfg: Config): Promise<void> {\n await saveConfig(cfg, ctx.configPath);\n}\n\nfunction ensureChannelObject(cfg: Config, channelId: string): Record<string, unknown> {\n if (!cfg.channels) cfg.channels = {};\n const channels = cfg.channels as Record<string, unknown>;\n const existing = channels[channelId];\n if (existing && typeof existing === 'object' && !Array.isArray(existing)) {\n return existing as Record<string, unknown>;\n }\n const next: Record<string, unknown> = {};\n channels[channelId] = next;\n return next;\n}\n\nfunction assertCatalogChannel(cfg: Config, channelId: string): void {\n const catalog = buildChannelCatalogForConfig(cfg);\n if (!catalog.byId.has(channelId)) {\n throw new Error(`Unknown channel \"${channelId}\". Install or declare a channel extension contribution first.`);\n }\n}\n\nfunction createChannelsCommand(ctx: CLIContext): Command {\n const cmd = new Command('channels')\n .description('Messaging channel configuration')\n .addHelpText(\n 'after',\n formatExamples([\n 'xopc channels list',\n 'xopc channels show telegram',\n 'xopc channels enable telegram',\n 'xopc channels config set-json telegram \\'{\"enabled\":true}\\'',\n 'xopc channels pairing approve telegram ABC12XYZ',\n ]),\n );\n\n cmd\n .command('list')\n .description('List channel extension contributions')\n .option('--json', 'Output as JSON', false)\n .action((opts: { json?: boolean }) => {\n const cfg = loadCliConfig(ctx);\n const catalog = buildChannelCatalogForConfig(cfg);\n const channels = cfg.channels as Record<string, { enabled?: boolean } | undefined> | undefined;\n const rows = catalog.entries.map((entry) => ({\n id: entry.id,\n label: entry.label,\n extensionId: entry.extensionId,\n source: entry.source,\n enabled: channels?.[entry.id]?.enabled === true,\n configured: Boolean(channels?.[entry.id]),\n }));\n if (opts.json) {\n process.stdout.write(`${JSON.stringify({ ok: true, channels: rows })}\\n`);\n return;\n }\n console.log('');\n console.log(colors.bold('CHANNELS'));\n const idWidth = Math.max(2, ...rows.map((r) => r.id.length));\n for (const row of rows) {\n const status = row.enabled ? colors.green('enabled') : colors.gray('disabled');\n console.log(` ${row.id.padEnd(idWidth)} ${status} ${colors.gray(row.label)} ${colors.gray(row.extensionId)}`);\n }\n console.log('');\n });\n\n cmd\n .command('show <channel>')\n .description('Show one channel catalog entry and config')\n .option('--json', 'Output as JSON', false)\n .action((channel: string, opts: { json?: boolean }) => {\n const cfg = loadCliConfig(ctx);\n const channelId = normalizeChannelId(channel);\n const catalog = buildChannelCatalogForConfig(cfg);\n const entry = catalog.byId.get(channelId);\n if (!entry) {\n console.error(`Unknown channel \"${channelId}\".`);\n process.exitCode = 1;\n return;\n }\n const config = (cfg.channels as Record<string, unknown> | undefined)?.[channelId] ?? {};\n const payload = { entry, config };\n if (opts.json) {\n process.stdout.write(`${JSON.stringify({ ok: true, ...payload })}\\n`);\n return;\n }\n console.log(JSON.stringify(payload, null, 2));\n });\n\n cmd\n .command('enable <channel>')\n .description('Enable a channel config block')\n .action(async (channel: string) => {\n const cfg = loadCliConfig(ctx);\n const channelId = normalizeChannelId(channel);\n assertCatalogChannel(cfg, channelId);\n ensureChannelObject(cfg, channelId).enabled = true;\n await writeCliConfig(ctx, cfg);\n console.log(`Enabled channel ${channelId}`);\n });\n\n cmd\n .command('disable <channel>')\n .description('Disable a channel config block')\n .action(async (channel: string) => {\n const cfg = loadCliConfig(ctx);\n const channelId = normalizeChannelId(channel);\n assertCatalogChannel(cfg, channelId);\n ensureChannelObject(cfg, channelId).enabled = false;\n await writeCliConfig(ctx, cfg);\n console.log(`Disabled channel ${channelId}`);\n });\n\n const config = cmd.command('config').description('Edit channel config');\n config\n .command('set-json <channel> <json>')\n .description('Merge a JSON object into channels.<id>')\n .action(async (channel: string, json: string) => {\n const cfg = loadCliConfig(ctx);\n const channelId = normalizeChannelId(channel);\n assertCatalogChannel(cfg, channelId);\n const patch = JSON.parse(json) as unknown;\n if (!patch || typeof patch !== 'object' || Array.isArray(patch)) {\n throw new Error('JSON value must be an object');\n }\n Object.assign(ensureChannelObject(cfg, channelId), patch);\n await writeCliConfig(ctx, cfg);\n console.log(`Updated channels.${channelId}`);\n });\n\n const pairing = cmd.command('pairing').description('Manage channel pairing state');\n pairing\n .command('list <channel>')\n .option('--account <id>', 'Account id', 'default')\n .option('--json', 'Output as JSON', false)\n .action((channel: string, opts: { account?: string; json?: boolean }) => {\n const cfg = loadCliConfig(ctx);\n const state = listChannelPairingState({\n channel: normalizeChannelId(channel),\n accountId: opts.account,\n config: cfg,\n });\n if (opts.json) {\n process.stdout.write(`${JSON.stringify({ ok: true, state })}\\n`);\n return;\n }\n console.log(JSON.stringify(state, null, 2));\n });\n pairing\n .command('approve <channel> <code>')\n .option('--account <id>', 'Account id', 'default')\n .action((channel: string, code: string, opts: { account?: string }) => {\n const result = approveChannelPairingFromCli({\n channel: normalizeChannelId(channel),\n accountId: opts.account ?? 'default',\n code,\n });\n if (result.ok === false) {\n console.error(result.error);\n process.exitCode = 1;\n return;\n }\n console.log(`Approved sender ${result.senderId}`);\n });\n\n return cmd;\n}\n\nregister({\n id: 'channels',\n name: 'channels',\n description: 'Messaging channel configuration',\n factory: createChannelsCommand,\n metadata: {\n category: 'setup',\n examples: [\n 'xopc channels list',\n 'xopc channels show telegram',\n 'xopc channels enable telegram',\n 'xopc channels config set-json telegram \\'{\"enabled\":true}\\'',\n ],\n },\n});\n"],"mappings":"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"}
@@ -75,7 +75,7 @@ function setNestedValue(obj, path, value) {
75
75
  }
76
76
  function createConfigCommand(ctx) {
77
77
  const cmd = new Command("config").description("View and edit configuration").option("--show", "Show full configuration (alias for `config show`)").option("--validate", "Validate configuration file (alias for `config validate`)").addHelpText("after", formatExamples([
78
- "xopc config get agents.defaults.model",
78
+ "xopc config get agents.defaults.models.chat",
79
79
  "xopc config set agents.defaults.temperature 0.8",
80
80
  "xopc config unset agents.defaults.max_tokens",
81
81
  "xopc config show",
@@ -205,7 +205,7 @@ register({
205
205
  metadata: {
206
206
  category: "utility",
207
207
  examples: [
208
- "xopc config get agents.defaults.model",
208
+ "xopc config get agents.defaults.models.chat",
209
209
  "xopc config set agents.defaults.temperature 0.8",
210
210
  "xopc config show",
211
211
  "xopc config validate",
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","names":[],"sources":["../../../../src/cli/commands/config.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { existsSync, readFileSync } from 'fs';\nimport { resolveGatewayLocalClientHost } from '../../config/gateway-bind.js';\nimport { writeTextAtomic } from '../../infra/write-file-atomic.js';\nimport { ConfigSchema } from '../../config/schema.js';\nimport { register, formatExamples, type CLIContext } from '../registry.js';\n\nconst MISSING_CONFIG_HINT = 'Run: xopc setup, xopc onboard, or xopc init';\n\nasync function loadConfigDeps() {\n const [{ loadConfig }, { createLogger }] = await Promise.all([\n import('../../config/index.js'),\n import('../../utils/logger.js'),\n ]);\n return { loadConfig, log: createLogger('ConfigCommand') };\n}\n\nasync function runConfigShow(configPath: string): Promise<void> {\n const { loadConfig, log } = await loadConfigDeps();\n if (!existsSync(configPath)) {\n log.warn(`No config file found. ${MISSING_CONFIG_HINT}`);\n return;\n }\n\n const config = loadConfig(configPath);\n const maskedConfig = JSON.stringify(\n config,\n (key, value) => {\n if (key === 'api_key' || key === 'token') {\n return value ? '********' : value;\n }\n return value;\n },\n 2,\n );\n console.log(maskedConfig);\n}\n\nasync function runConfigValidate(configPath: string): Promise<boolean> {\n const { log } = await loadConfigDeps();\n if (!existsSync(configPath)) {\n log.error('Config file not found. Run: xopc onboard');\n return false;\n }\n\n let json: unknown;\n try {\n json = JSON.parse(readFileSync(configPath, 'utf-8'));\n } catch {\n log.error('Config file is not valid JSON.');\n return false;\n }\n\n const parsed = ConfigSchema.safeParse(json);\n if (!parsed.success) {\n log.error('Config does not match the expected schema.');\n for (const issue of parsed.error.issues) {\n console.error(` - ${issue.path.join('.') || '(root)'}: ${issue.message}`);\n }\n return false;\n }\n\n const { validateChannelPluginConfigs } = await import('../../config/validate-channel-configs.js');\n const channelErrors = validateChannelPluginConfigs(parsed.data);\n if (channelErrors.length > 0) {\n log.error('Channel configuration failed validation.');\n for (const err of channelErrors) {\n console.error(` - ${err}`);\n }\n return false;\n }\n\n log.info({ path: configPath }, 'Config is valid');\n console.log('✅ Configuration is valid');\n return true;\n}\n\nfunction getNestedValue(obj: any, path: string): any {\n return path.split('.').reduce((current: any, key: string) => {\n if (current && typeof current === 'object' && key in current) {\n return current[key];\n }\n return undefined;\n }, obj);\n}\n\nfunction setNestedValue(obj: any, path: string, value: any): any {\n const keys = path.split('.');\n const lastKey = keys.pop()!;\n const target = keys.reduce((current: any, key: string) => {\n if (!current[key] || typeof current[key] !== 'object') {\n current[key] = {};\n }\n return current[key];\n }, obj);\n target[lastKey] = value;\n return obj;\n}\n\nfunction createConfigCommand(ctx: CLIContext): Command {\n const cmd = new Command('config')\n .description('View and edit configuration')\n .option('--show', 'Show full configuration (alias for `config show`)')\n .option('--validate', 'Validate configuration file (alias for `config validate`)')\n .addHelpText(\n 'after',\n formatExamples([\n 'xopc config get agents.defaults.model',\n 'xopc config set agents.defaults.temperature 0.8',\n 'xopc config unset agents.defaults.max_tokens',\n 'xopc config show',\n 'xopc config validate',\n 'xopc config token # Show gateway token info',\n 'xopc config token --show # Show full token',\n 'xopc config token --generate # Generate new token',\n ]),\n )\n .action(async (options) => {\n if (options.show) {\n await runConfigShow(ctx.configPath);\n return;\n }\n if (options.validate) {\n const ok = await runConfigValidate(ctx.configPath);\n if (!ok) {\n process.exit(1);\n }\n return;\n }\n cmd.outputHelp();\n });\n\n cmd\n .command('get <path>')\n .description('Get a config value by dot path')\n .action(async (path: string) => {\n const { loadConfig, log } = await loadConfigDeps();\n if (!existsSync(ctx.configPath)) {\n log.error(`Config file not found. ${MISSING_CONFIG_HINT}`);\n process.exit(1);\n }\n\n const config = loadConfig(ctx.configPath);\n const value = getNestedValue(config, path);\n\n if (value === undefined) {\n log.error({ path }, `Config path not found`);\n process.exit(1);\n }\n\n console.log(typeof value === 'object' ? JSON.stringify(value, null, 2) : value);\n });\n\n cmd\n .command('set <path> <value>')\n .description('Set a config value by dot path')\n .action(async (path: string, value: string) => {\n const { loadConfig, log } = await loadConfigDeps();\n if (!existsSync(ctx.configPath)) {\n log.error(`Config file not found. ${MISSING_CONFIG_HINT}`);\n process.exit(1);\n }\n\n let parsedValue: any;\n try {\n parsedValue = JSON.parse(value);\n } catch {\n parsedValue = value;\n }\n\n const config = loadConfig(ctx.configPath);\n setNestedValue(config, path, parsedValue);\n\n await writeTextAtomic(ctx.configPath, JSON.stringify(config, null, 2));\n\n log.info({ path }, `Config updated`);\n });\n\n cmd\n .command('unset <path>')\n .description('Remove a config value by dot path')\n .action(async (path: string) => {\n const { loadConfig, log } = await loadConfigDeps();\n if (!existsSync(ctx.configPath)) {\n log.error(`Config file not found. ${MISSING_CONFIG_HINT}`);\n process.exit(1);\n }\n\n const config = loadConfig(ctx.configPath);\n const keys = path.split('.');\n const lastKey = keys.pop()!;\n const target = keys.reduce((current: any, key: string) => {\n return current && current[key];\n }, config);\n\n if (target && typeof target === 'object' && lastKey in target) {\n delete target[lastKey];\n await writeTextAtomic(ctx.configPath, JSON.stringify(config, null, 2));\n log.info({ path }, `Config removed`);\n } else {\n log.error({ path }, `Config path not found`);\n process.exit(1);\n }\n });\n\n cmd\n .command('show')\n .description('Show full configuration (sensitive values masked)')\n .action(async () => {\n await runConfigShow(ctx.configPath);\n });\n\n cmd\n .command('validate')\n .description('Validate configuration file against schema and channel plugins')\n .action(async () => {\n const ok = await runConfigValidate(ctx.configPath);\n if (!ok) {\n process.exit(1);\n }\n });\n\n cmd\n .command('token')\n .description('Generate or view the gateway auth token')\n .option('--generate', 'Generate a new token')\n .option('--show', 'Show the current token (unmasked)')\n .action(async (options) => {\n const { loadConfig, log } = await loadConfigDeps();\n if (!existsSync(ctx.configPath)) {\n log.error(`Config file not found. ${MISSING_CONFIG_HINT}`);\n process.exit(1);\n }\n\n const config = loadConfig(ctx.configPath);\n\n if (options.show) {\n const token = config?.gateway?.auth?.token;\n if (token) {\n console.log(token);\n } else {\n console.log('No token configured. Gateway auth mode:', config?.gateway?.auth?.mode || 'not set');\n }\n return;\n }\n\n if (options.generate) {\n const crypto = await import('crypto');\n const newToken = crypto.randomBytes(24).toString('hex');\n\n config.gateway = config.gateway || {};\n config.gateway.auth = {\n mode: 'token',\n token: newToken,\n };\n\n await writeTextAtomic(ctx.configPath, JSON.stringify(config, null, 2));\n log.info('New gateway token generated');\n console.log(`Token: ${newToken.slice(0, 8)}...${newToken.slice(-8)}`);\n console.log('\\nUse \"xopc config token --show\" to view the full token');\n return;\n }\n\n // Default: show masked token info\n const token = config?.gateway?.auth?.token;\n const mode = config?.gateway?.auth?.mode;\n const bind = config?.gateway?.bind ?? 'loopback';\n const port = config?.gateway?.port || 18790;\n const clientHost = config ? resolveGatewayLocalClientHost(config) : '127.0.0.1';\n\n console.log('Gateway Configuration:');\n console.log(` Bind: ${bind}`);\n console.log(` Local URL: http://${clientHost}:${port}`);\n console.log(` Auth Mode: ${mode || 'not set'}`);\n if (token) {\n console.log(` Token: ${token.slice(0, 8)}...${token.slice(-8)}`);\n console.log('\\nUse \"xopc config token --show\" to view the full token');\n console.log('Use \"xopc config token --generate\" to generate a new token');\n } else if (mode === 'token') {\n console.log(' Token: not set (will be auto-generated on first `xopc gateway` run)');\n }\n });\n\n cmd\n .command('path')\n .description('Show configuration file path')\n .action(() => {\n console.log(ctx.configPath);\n });\n\n return cmd;\n}\n\nregister({\n id: 'config',\n name: 'config',\n description: 'View and edit configuration',\n factory: createConfigCommand,\n metadata: {\n category: 'utility',\n examples: [\n 'xopc config get agents.defaults.model',\n 'xopc config set agents.defaults.temperature 0.8',\n 'xopc config show',\n 'xopc config validate',\n 'xopc config token',\n 'xopc config token --show',\n 'xopc config token --generate',\n ],\n },\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"config.js","names":[],"sources":["../../../../src/cli/commands/config.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { existsSync, readFileSync } from 'fs';\nimport { resolveGatewayLocalClientHost } from '../../config/gateway-bind.js';\nimport { writeTextAtomic } from '../../infra/write-file-atomic.js';\nimport { ConfigSchema } from '../../config/schema.js';\nimport { register, formatExamples, type CLIContext } from '../registry.js';\n\nconst MISSING_CONFIG_HINT = 'Run: xopc setup, xopc onboard, or xopc init';\n\nasync function loadConfigDeps() {\n const [{ loadConfig }, { createLogger }] = await Promise.all([\n import('../../config/index.js'),\n import('../../utils/logger.js'),\n ]);\n return { loadConfig, log: createLogger('ConfigCommand') };\n}\n\nasync function runConfigShow(configPath: string): Promise<void> {\n const { loadConfig, log } = await loadConfigDeps();\n if (!existsSync(configPath)) {\n log.warn(`No config file found. ${MISSING_CONFIG_HINT}`);\n return;\n }\n\n const config = loadConfig(configPath);\n const maskedConfig = JSON.stringify(\n config,\n (key, value) => {\n if (key === 'api_key' || key === 'token') {\n return value ? '********' : value;\n }\n return value;\n },\n 2,\n );\n console.log(maskedConfig);\n}\n\nasync function runConfigValidate(configPath: string): Promise<boolean> {\n const { log } = await loadConfigDeps();\n if (!existsSync(configPath)) {\n log.error('Config file not found. Run: xopc onboard');\n return false;\n }\n\n let json: unknown;\n try {\n json = JSON.parse(readFileSync(configPath, 'utf-8'));\n } catch {\n log.error('Config file is not valid JSON.');\n return false;\n }\n\n const parsed = ConfigSchema.safeParse(json);\n if (!parsed.success) {\n log.error('Config does not match the expected schema.');\n for (const issue of parsed.error.issues) {\n console.error(` - ${issue.path.join('.') || '(root)'}: ${issue.message}`);\n }\n return false;\n }\n\n const { validateChannelPluginConfigs } = await import('../../config/validate-channel-configs.js');\n const channelErrors = validateChannelPluginConfigs(parsed.data);\n if (channelErrors.length > 0) {\n log.error('Channel configuration failed validation.');\n for (const err of channelErrors) {\n console.error(` - ${err}`);\n }\n return false;\n }\n\n log.info({ path: configPath }, 'Config is valid');\n console.log('✅ Configuration is valid');\n return true;\n}\n\nfunction getNestedValue(obj: any, path: string): any {\n return path.split('.').reduce((current: any, key: string) => {\n if (current && typeof current === 'object' && key in current) {\n return current[key];\n }\n return undefined;\n }, obj);\n}\n\nfunction setNestedValue(obj: any, path: string, value: any): any {\n const keys = path.split('.');\n const lastKey = keys.pop()!;\n const target = keys.reduce((current: any, key: string) => {\n if (!current[key] || typeof current[key] !== 'object') {\n current[key] = {};\n }\n return current[key];\n }, obj);\n target[lastKey] = value;\n return obj;\n}\n\nfunction createConfigCommand(ctx: CLIContext): Command {\n const cmd = new Command('config')\n .description('View and edit configuration')\n .option('--show', 'Show full configuration (alias for `config show`)')\n .option('--validate', 'Validate configuration file (alias for `config validate`)')\n .addHelpText(\n 'after',\n formatExamples([\n 'xopc config get agents.defaults.models.chat',\n 'xopc config set agents.defaults.temperature 0.8',\n 'xopc config unset agents.defaults.max_tokens',\n 'xopc config show',\n 'xopc config validate',\n 'xopc config token # Show gateway token info',\n 'xopc config token --show # Show full token',\n 'xopc config token --generate # Generate new token',\n ]),\n )\n .action(async (options) => {\n if (options.show) {\n await runConfigShow(ctx.configPath);\n return;\n }\n if (options.validate) {\n const ok = await runConfigValidate(ctx.configPath);\n if (!ok) {\n process.exit(1);\n }\n return;\n }\n cmd.outputHelp();\n });\n\n cmd\n .command('get <path>')\n .description('Get a config value by dot path')\n .action(async (path: string) => {\n const { loadConfig, log } = await loadConfigDeps();\n if (!existsSync(ctx.configPath)) {\n log.error(`Config file not found. ${MISSING_CONFIG_HINT}`);\n process.exit(1);\n }\n\n const config = loadConfig(ctx.configPath);\n const value = getNestedValue(config, path);\n\n if (value === undefined) {\n log.error({ path }, `Config path not found`);\n process.exit(1);\n }\n\n console.log(typeof value === 'object' ? JSON.stringify(value, null, 2) : value);\n });\n\n cmd\n .command('set <path> <value>')\n .description('Set a config value by dot path')\n .action(async (path: string, value: string) => {\n const { loadConfig, log } = await loadConfigDeps();\n if (!existsSync(ctx.configPath)) {\n log.error(`Config file not found. ${MISSING_CONFIG_HINT}`);\n process.exit(1);\n }\n\n let parsedValue: any;\n try {\n parsedValue = JSON.parse(value);\n } catch {\n parsedValue = value;\n }\n\n const config = loadConfig(ctx.configPath);\n setNestedValue(config, path, parsedValue);\n\n await writeTextAtomic(ctx.configPath, JSON.stringify(config, null, 2));\n\n log.info({ path }, `Config updated`);\n });\n\n cmd\n .command('unset <path>')\n .description('Remove a config value by dot path')\n .action(async (path: string) => {\n const { loadConfig, log } = await loadConfigDeps();\n if (!existsSync(ctx.configPath)) {\n log.error(`Config file not found. ${MISSING_CONFIG_HINT}`);\n process.exit(1);\n }\n\n const config = loadConfig(ctx.configPath);\n const keys = path.split('.');\n const lastKey = keys.pop()!;\n const target = keys.reduce((current: any, key: string) => {\n return current && current[key];\n }, config);\n\n if (target && typeof target === 'object' && lastKey in target) {\n delete target[lastKey];\n await writeTextAtomic(ctx.configPath, JSON.stringify(config, null, 2));\n log.info({ path }, `Config removed`);\n } else {\n log.error({ path }, `Config path not found`);\n process.exit(1);\n }\n });\n\n cmd\n .command('show')\n .description('Show full configuration (sensitive values masked)')\n .action(async () => {\n await runConfigShow(ctx.configPath);\n });\n\n cmd\n .command('validate')\n .description('Validate configuration file against schema and channel plugins')\n .action(async () => {\n const ok = await runConfigValidate(ctx.configPath);\n if (!ok) {\n process.exit(1);\n }\n });\n\n cmd\n .command('token')\n .description('Generate or view the gateway auth token')\n .option('--generate', 'Generate a new token')\n .option('--show', 'Show the current token (unmasked)')\n .action(async (options) => {\n const { loadConfig, log } = await loadConfigDeps();\n if (!existsSync(ctx.configPath)) {\n log.error(`Config file not found. ${MISSING_CONFIG_HINT}`);\n process.exit(1);\n }\n\n const config = loadConfig(ctx.configPath);\n\n if (options.show) {\n const token = config?.gateway?.auth?.token;\n if (token) {\n console.log(token);\n } else {\n console.log('No token configured. Gateway auth mode:', config?.gateway?.auth?.mode || 'not set');\n }\n return;\n }\n\n if (options.generate) {\n const crypto = await import('crypto');\n const newToken = crypto.randomBytes(24).toString('hex');\n\n config.gateway = config.gateway || {};\n config.gateway.auth = {\n mode: 'token',\n token: newToken,\n };\n\n await writeTextAtomic(ctx.configPath, JSON.stringify(config, null, 2));\n log.info('New gateway token generated');\n console.log(`Token: ${newToken.slice(0, 8)}...${newToken.slice(-8)}`);\n console.log('\\nUse \"xopc config token --show\" to view the full token');\n return;\n }\n\n // Default: show masked token info\n const token = config?.gateway?.auth?.token;\n const mode = config?.gateway?.auth?.mode;\n const bind = config?.gateway?.bind ?? 'loopback';\n const port = config?.gateway?.port || 18790;\n const clientHost = config ? resolveGatewayLocalClientHost(config) : '127.0.0.1';\n\n console.log('Gateway Configuration:');\n console.log(` Bind: ${bind}`);\n console.log(` Local URL: http://${clientHost}:${port}`);\n console.log(` Auth Mode: ${mode || 'not set'}`);\n if (token) {\n console.log(` Token: ${token.slice(0, 8)}...${token.slice(-8)}`);\n console.log('\\nUse \"xopc config token --show\" to view the full token');\n console.log('Use \"xopc config token --generate\" to generate a new token');\n } else if (mode === 'token') {\n console.log(' Token: not set (will be auto-generated on first `xopc gateway` run)');\n }\n });\n\n cmd\n .command('path')\n .description('Show configuration file path')\n .action(() => {\n console.log(ctx.configPath);\n });\n\n return cmd;\n}\n\nregister({\n id: 'config',\n name: 'config',\n description: 'View and edit configuration',\n factory: createConfigCommand,\n metadata: {\n category: 'utility',\n examples: [\n 'xopc config get agents.defaults.models.chat',\n 'xopc config set agents.defaults.temperature 0.8',\n 'xopc config show',\n 'xopc config validate',\n 'xopc config token',\n 'xopc config token --show',\n 'xopc config token --generate',\n ],\n },\n});\n"],"mappings":"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"}