@xopcai/xopc 0.0.103 → 0.0.105

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 (950) hide show
  1. package/README.md +7 -4
  2. package/README.zh-CN.md +7 -4
  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 +1 -1
  20. package/dist/extensions/feishu/xopc.extension.json +66 -1
  21. package/dist/extensions/telegram/src/adapters/gateway-setup.d.ts +2 -0
  22. package/dist/extensions/telegram/src/adapters/gateway-setup.js +146 -0
  23. package/dist/extensions/telegram/src/adapters/gateway-setup.js.map +1 -0
  24. package/dist/extensions/telegram/src/adapters/security-adapter.js +1 -1
  25. package/dist/extensions/telegram/src/command-handler.js +1 -2
  26. package/dist/extensions/telegram/src/command-handler.js.map +1 -1
  27. package/dist/extensions/telegram/src/config-schema.js +2 -2
  28. package/dist/extensions/telegram/src/config-schema.js.map +1 -1
  29. package/dist/extensions/telegram/src/doctor.d.ts +1 -0
  30. package/dist/extensions/telegram/src/doctor.js +68 -0
  31. package/dist/extensions/telegram/src/doctor.js.map +1 -1
  32. package/dist/extensions/telegram/src/index.d.ts +8 -1
  33. package/dist/extensions/telegram/src/index.js +15 -2
  34. package/dist/extensions/telegram/src/index.js.map +1 -0
  35. package/dist/extensions/telegram/src/plugin.d.ts +13 -5
  36. package/dist/extensions/telegram/src/plugin.js +32 -12
  37. package/dist/extensions/telegram/src/plugin.js.map +1 -1
  38. package/dist/extensions/telegram/src/proxy-fetch.js +22 -5
  39. package/dist/extensions/telegram/src/proxy-fetch.js.map +1 -1
  40. package/dist/extensions/telegram/xopc.extension.json +412 -5
  41. package/dist/extensions/weixin/src/adapters/onboard-cli.js +2 -2
  42. package/dist/extensions/weixin/src/adapters/onboard-cli.js.map +1 -1
  43. package/dist/extensions/weixin/src/api/api.js +1 -1
  44. package/dist/extensions/weixin/src/index.d.ts +8 -0
  45. package/dist/extensions/weixin/src/index.js +12 -1
  46. package/dist/extensions/weixin/src/index.js.map +1 -0
  47. package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
  48. package/dist/extensions/weixin/src/plugin.d.ts +2 -1
  49. package/dist/extensions/weixin/src/plugin.js +77 -2
  50. package/dist/extensions/weixin/src/plugin.js.map +1 -1
  51. package/dist/extensions/weixin/xopc.extension.json +52 -0
  52. package/dist/gateway/static/root/assets/agents-XzgIVKcI.js +396 -0
  53. package/dist/gateway/static/root/assets/{apps-page-C5RmwmTT.js → apps-page-B7Us3RMl.js} +1 -1
  54. package/dist/gateway/static/root/assets/browser-BLJWD7WI.js +8 -0
  55. package/dist/gateway/static/root/assets/channels-settings-BgeV6fzw.js +1 -0
  56. package/dist/gateway/static/root/assets/cron-page-DKGHEeAU.js +1 -0
  57. package/dist/gateway/static/root/assets/{dist-CWm8hTXZ.js → dist-DJDkNhu5.js} +1 -1
  58. package/dist/gateway/static/root/assets/{extension-debug-page-BzYgTkS9.js → extension-debug-page-DI1XJTJi.js} +1 -1
  59. package/dist/gateway/static/root/assets/{extension-page-BmTZH6gL.js → extension-page-SuafGTT_.js} +1 -1
  60. package/dist/gateway/static/root/assets/extension-settings-page-cKmGax9v.js +1 -0
  61. package/dist/gateway/static/root/assets/{fetch-CMoWY2Si.js → fetch-CkvRO30i.js} +1 -1
  62. package/dist/gateway/static/root/assets/gateway-startup-retry-BkKyRDrF.js +1 -0
  63. package/dist/gateway/static/root/assets/heartbeat-config-api-CRiDcxtt.js +1 -0
  64. package/dist/gateway/static/root/assets/index-50FVtgXU.js +4845 -0
  65. package/dist/gateway/static/root/assets/index-BPYKW7FB.css +1 -0
  66. package/dist/gateway/static/root/assets/{logs-page-BjdQjHwk.js → logs-page-DM8o5-Bm.js} +2 -2
  67. package/dist/gateway/static/root/assets/{note-detail-page-8Er4197b.js → note-detail-page-j53jtvq9.js} +53 -53
  68. package/dist/gateway/static/root/assets/{note-time-CF3vf1jm.js → note-time-Ck2H2Qpw.js} +1 -1
  69. package/dist/gateway/static/root/assets/notes-page-CsWIw35Q.js +1 -0
  70. package/dist/gateway/static/root/assets/schema-form-BvmGNxiJ.js +1 -0
  71. package/dist/gateway/static/root/assets/sessions-page-CLPsbyOW.js +1 -0
  72. package/dist/gateway/static/root/assets/settings-advanced-gate-DRdayl8P.js +2 -0
  73. package/dist/gateway/static/root/assets/{settings-form-section-C7qA7y0J.js → settings-form-section-BlIYg2gZ.js} +1 -1
  74. package/dist/gateway/static/root/assets/settings-page-CRGHT_bm.js +3 -0
  75. package/dist/gateway/static/root/assets/{share-preview-page-Tvr5Mtq5.js → share-preview-page-BlT6Akvk.js} +1 -1
  76. package/dist/gateway/static/root/assets/skills-page-Ce-RIH2y.js +2 -0
  77. package/dist/gateway/static/root/assets/{theme-store-HTvJlFLL.js → theme-store-DYgVdRB4.js} +1 -1
  78. package/dist/gateway/static/root/assets/url-DPEStU4M.js +3 -0
  79. package/dist/gateway/static/root/assets/voice-api-key-field-CJGTidqc.js +1 -0
  80. package/dist/gateway/static/root/assets/{workflow-page.utils-CeBkAjP7.js → workflow-page.utils-_sjXCMvi.js} +1 -1
  81. package/dist/gateway/static/root/assets/workflows-page-o63aaARK.js +27 -0
  82. package/dist/gateway/static/root/index.html +6 -5
  83. package/dist/package.js +1 -1
  84. package/dist/src/agent/agent-manager.d.ts +18 -6
  85. package/dist/src/agent/agent-manager.js +60 -35
  86. package/dist/src/agent/agent-manager.js.map +1 -1
  87. package/dist/src/agent/builtin-agent-ids.d.ts +2 -0
  88. package/dist/src/agent/builtin-agent-ids.js +17 -0
  89. package/dist/src/agent/builtin-agent-ids.js.map +1 -0
  90. package/dist/src/agent/child-agent-factory.d.ts +4 -0
  91. package/dist/src/agent/child-agent-factory.js +28 -8
  92. package/dist/src/agent/child-agent-factory.js.map +1 -1
  93. package/dist/src/agent/context/workspace-templates/AGENTS.md +23 -184
  94. package/dist/src/agent/embedded/run-turn.js +8 -2
  95. package/dist/src/agent/embedded/run-turn.js.map +1 -1
  96. package/dist/src/agent/embedded/session-tool-result-guard.js +1 -1
  97. package/dist/src/agent/embedded/subscribe-session.js +33 -51
  98. package/dist/src/agent/embedded/subscribe-session.js.map +1 -1
  99. package/dist/src/agent/embedded/types.d.ts +36 -35
  100. package/dist/src/agent/fallback/candidates.js +1 -1
  101. package/dist/src/agent/fallback/candidates.js.map +1 -1
  102. package/dist/src/agent/inbound/inbound-loop.js +1 -1
  103. package/dist/src/agent/inbound/turn-dispatcher.d.ts +3 -0
  104. package/dist/src/agent/inbound/turn-dispatcher.js +25 -5
  105. package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -1
  106. package/dist/src/agent/models/manager.d.ts +1 -1
  107. package/dist/src/agent/models/manager.js +1 -1
  108. package/dist/src/agent/models/manager.js.map +1 -1
  109. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.d.ts +1 -1
  110. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js +1 -1
  111. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js.map +1 -1
  112. package/dist/src/agent/prompt/memory/index.js +30 -2
  113. package/dist/src/agent/prompt/memory/index.js.map +1 -1
  114. package/dist/src/agent/prompt/sections/tooling.js +4 -0
  115. package/dist/src/agent/prompt/sections/tooling.js.map +1 -1
  116. package/dist/src/agent/service/direct-turn-helpers.d.ts +3 -0
  117. package/dist/src/agent/service/direct-turn-helpers.js +6 -3
  118. package/dist/src/agent/service/direct-turn-helpers.js.map +1 -1
  119. package/dist/src/agent/service/process-direct-streaming.d.ts +3 -0
  120. package/dist/src/agent/service/process-direct-streaming.js +50 -19
  121. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  122. package/dist/src/agent/service-inbound-utils.d.ts +0 -1
  123. package/dist/src/agent/service-inbound-utils.js +1 -17
  124. package/dist/src/agent/service-inbound-utils.js.map +1 -1
  125. package/dist/src/agent/service.d.ts +4 -4
  126. package/dist/src/agent/service.js +29 -16
  127. package/dist/src/agent/service.js.map +1 -1
  128. package/dist/src/agent/service.types.d.ts +3 -0
  129. package/dist/src/agent/session/session-config-service.d.ts +1 -0
  130. package/dist/src/agent/session/session-config-service.js +9 -1
  131. package/dist/src/agent/session/session-config-service.js.map +1 -1
  132. package/dist/src/agent/session/session-inspector.d.ts +2 -1
  133. package/dist/src/agent/session/session-inspector.js +4 -0
  134. package/dist/src/agent/session/session-inspector.js.map +1 -1
  135. package/dist/src/agent/skills/config.js +1 -3
  136. package/dist/src/agent/skills/config.js.map +1 -1
  137. package/dist/src/agent/skills/format-skills-prompt.d.ts +1 -0
  138. package/dist/src/agent/skills/format-skills-prompt.js +3 -2
  139. package/dist/src/agent/skills/format-skills-prompt.js.map +1 -1
  140. package/dist/src/agent/skills/index.js +20 -5
  141. package/dist/src/agent/skills/index.js.map +1 -1
  142. package/dist/src/agent/skills/installer.js +14 -27
  143. package/dist/src/agent/skills/installer.js.map +1 -1
  144. package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js +11 -1
  145. package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js.map +1 -1
  146. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js +18 -4
  147. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js.map +1 -1
  148. package/dist/src/agent/skills/marketplace/adapters/store/adapter.js +11 -2
  149. package/dist/src/agent/skills/marketplace/adapters/store/adapter.js.map +1 -1
  150. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.d.ts +2 -2
  151. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js.map +1 -1
  152. package/dist/src/agent/skills/skill-manager.d.ts +4 -1
  153. package/dist/src/agent/skills/skill-manager.js +3 -3
  154. package/dist/src/agent/skills/skill-manager.js.map +1 -1
  155. package/dist/src/agent/skills/skill-view-path.d.ts +1 -17
  156. package/dist/src/agent/skills/skill-view-path.js +3 -66
  157. package/dist/src/agent/skills/skill-view-path.js.map +1 -1
  158. package/dist/src/agent/skills/test-framework.js +2 -3
  159. package/dist/src/agent/skills/test-framework.js.map +1 -1
  160. package/dist/src/agent/source-context/index.d.ts +2 -0
  161. package/dist/src/agent/source-context/index.js +3 -0
  162. package/dist/src/agent/source-context/injector.d.ts +3 -0
  163. package/dist/src/agent/source-context/injector.js +36 -0
  164. package/dist/src/agent/source-context/injector.js.map +1 -0
  165. package/dist/src/agent/source-context/types.d.ts +19 -0
  166. package/dist/src/agent/source-context/types.js +10 -0
  167. package/dist/src/agent/source-context/types.js.map +1 -0
  168. package/dist/src/agent/streaming/reasoning-visibility-sse.js +1 -0
  169. package/dist/src/agent/streaming/reasoning-visibility-sse.js.map +1 -1
  170. package/dist/src/agent/tool-manuals/browser.d.ts +1 -0
  171. package/{skills/browser/SKILL.md → dist/src/agent/tool-manuals/browser.js} +51 -54
  172. package/dist/src/agent/tool-manuals/browser.js.map +1 -0
  173. package/dist/src/agent/tool-manuals/index.d.ts +10 -0
  174. package/dist/src/agent/tool-manuals/index.js +28 -0
  175. package/dist/src/agent/tool-manuals/index.js.map +1 -0
  176. package/dist/src/agent/tools/browser/tool/browser-use-tool.js +1 -1
  177. package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +1 -1
  178. package/dist/src/agent/tools/factory.js +2 -0
  179. package/dist/src/agent/tools/factory.js.map +1 -1
  180. package/dist/src/agent/tools/index.d.ts +1 -0
  181. package/dist/src/agent/tools/index.js +2 -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/workflow/catalog.d.ts +7 -2
  188. package/dist/src/agent/workflow/catalog.js +66 -25
  189. package/dist/src/agent/workflow/catalog.js.map +1 -1
  190. package/dist/src/agent/workflow/subagent-runner.d.ts +3 -0
  191. package/dist/src/agent/workflow/subagent-runner.js +50 -4
  192. package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
  193. package/dist/src/agent/workflow/types.d.ts +10 -0
  194. package/dist/src/auth/credentials.js +10 -5
  195. package/dist/src/auth/credentials.js.map +1 -1
  196. package/dist/src/channels/catalog/channel-catalog-service.d.ts +11 -0
  197. package/dist/src/channels/catalog/channel-catalog-service.js +168 -0
  198. package/dist/src/channels/catalog/channel-catalog-service.js.map +1 -0
  199. package/dist/src/channels/catalog/channel-catalog-types.d.ts +22 -0
  200. package/dist/src/channels/catalog/channel-catalog-types.js +1 -0
  201. package/dist/src/channels/dock.d.ts +0 -7
  202. package/dist/src/channels/dock.js +1 -21
  203. package/dist/src/channels/index.d.ts +1 -3
  204. package/dist/src/channels/index.js +1 -5
  205. package/dist/src/channels/lifecycle-supervisor.d.ts +1 -0
  206. package/dist/src/channels/lifecycle-supervisor.js +11 -0
  207. package/dist/src/channels/lifecycle-supervisor.js.map +1 -1
  208. package/dist/src/channels/manager.d.ts +1 -0
  209. package/dist/src/channels/manager.js +3 -0
  210. package/dist/src/channels/manager.js.map +1 -1
  211. package/dist/src/channels/pairing/pairing-channel.d.ts +2 -3
  212. package/dist/src/channels/pairing/pairing-messages.js +1 -1
  213. package/dist/src/channels/pairing/pairing-messages.js.map +1 -1
  214. package/dist/src/channels/pairing/pairing-service.d.ts +1 -1
  215. package/dist/src/channels/pairing/pairing-service.js +8 -27
  216. package/dist/src/channels/pairing/pairing-service.js.map +1 -1
  217. package/dist/src/channels/plugin-types.d.ts +3 -1
  218. package/dist/src/channels/plugins/types.adapters.d.ts +55 -2
  219. package/dist/src/channels/telegram/index.js +1 -1
  220. package/dist/src/chat-commands/builtins/config.js +4 -4
  221. package/dist/src/chat-commands/builtins/config.js.map +1 -1
  222. package/dist/src/chat-commands/config-paths.js +1 -1
  223. package/dist/src/chat-commands/config-paths.js.map +1 -1
  224. package/dist/src/chat-commands/context.js +1 -1
  225. package/dist/src/chat-commands/context.js.map +1 -1
  226. package/dist/src/cli/bin.js +1 -1
  227. package/dist/src/cli/command-manifest.js +1 -1
  228. package/dist/src/cli/command-manifest.js.map +1 -1
  229. package/dist/src/cli/commands/agent.js +2 -2
  230. package/dist/src/cli/commands/agent.js.map +1 -1
  231. package/dist/src/cli/commands/agents.js +2 -4
  232. package/dist/src/cli/commands/agents.js.map +1 -1
  233. package/dist/src/cli/commands/auth.js +1 -1
  234. package/dist/src/cli/commands/channels.d.ts +1 -5
  235. package/dist/src/cli/commands/channels.js +115 -281
  236. package/dist/src/cli/commands/channels.js.map +1 -1
  237. package/dist/src/cli/commands/config.js +2 -2
  238. package/dist/src/cli/commands/config.js.map +1 -1
  239. package/dist/src/cli/commands/doctor/checks/channel-config.js +16 -69
  240. package/dist/src/cli/commands/doctor/checks/channel-config.js.map +1 -1
  241. package/dist/src/cli/commands/doctor/checks/channel-pairing-pending.js +6 -4
  242. package/dist/src/cli/commands/doctor/checks/channel-pairing-pending.js.map +1 -1
  243. package/dist/src/cli/commands/doctor/checks/channel-plugins.js +2 -2
  244. package/dist/src/cli/commands/doctor/checks/channel-plugins.js.map +1 -1
  245. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  246. package/dist/src/cli/commands/doctor/checks/provider-auth.js +13 -9
  247. package/dist/src/cli/commands/doctor/checks/provider-auth.js.map +1 -1
  248. package/dist/src/cli/commands/extension-dev.js +2 -1
  249. package/dist/src/cli/commands/extension-dev.js.map +1 -1
  250. package/dist/src/cli/commands/extension-marketplace.js +2 -1
  251. package/dist/src/cli/commands/extension-marketplace.js.map +1 -1
  252. package/dist/src/cli/commands/extension-pack.js +2 -1
  253. package/dist/src/cli/commands/extension-pack.js.map +1 -1
  254. package/dist/src/cli/commands/models.js +7 -4
  255. package/dist/src/cli/commands/models.js.map +1 -1
  256. package/dist/src/cli/commands/onboard/channels/index.js +1 -1
  257. package/dist/src/cli/commands/onboard/channels/index.js.map +1 -1
  258. package/dist/src/cli/commands/onboard/channels/registry.d.ts +2 -1
  259. package/dist/src/cli/commands/onboard/channels/registry.js +32 -8
  260. package/dist/src/cli/commands/onboard/channels/registry.js.map +1 -1
  261. package/dist/src/cli/commands/onboard/model.js +8 -5
  262. package/dist/src/cli/commands/onboard/model.js.map +1 -1
  263. package/dist/src/cli/commands/onboard.js +4 -6
  264. package/dist/src/cli/commands/onboard.js.map +1 -1
  265. package/dist/src/cli/commands/setup-shared/runner.d.ts +1 -1
  266. package/dist/src/cli/commands/setup-shared/runner.js.map +1 -1
  267. package/dist/src/cli/commands/setup-shared/types.d.ts +1 -1
  268. package/dist/src/cli/commands/setup-shared/types.js.map +1 -1
  269. package/dist/src/cli/commands/tui.js +13 -5
  270. package/dist/src/cli/commands/tui.js.map +1 -1
  271. package/dist/src/cli/extension-cli-register.js +1 -1
  272. package/dist/src/commands/agents.config.d.ts +3 -3
  273. package/dist/src/commands/agents.config.js +7 -7
  274. package/dist/src/commands/agents.config.js.map +1 -1
  275. package/dist/src/config/agent-profile.d.ts +1 -1
  276. package/dist/src/config/agent-profile.js +6 -2
  277. package/dist/src/config/agent-profile.js.map +1 -1
  278. package/dist/src/config/agent-typed-models.d.ts +2 -2
  279. package/dist/src/config/agent-typed-models.js +13 -2
  280. package/dist/src/config/agent-typed-models.js.map +1 -1
  281. package/dist/src/config/index.js +3 -3
  282. package/dist/src/config/integration.d.ts +1 -1
  283. package/dist/src/config/loader.d.ts +0 -1
  284. package/dist/src/config/loader.js +4 -9
  285. package/dist/src/config/loader.js.map +1 -1
  286. package/dist/src/config/models-json.d.ts +6 -6
  287. package/dist/src/config/paths.d.ts +1 -0
  288. package/dist/src/config/paths.js +5 -1
  289. package/dist/src/config/paths.js.map +1 -1
  290. package/dist/src/config/rules.js +2 -12
  291. package/dist/src/config/rules.js.map +1 -1
  292. package/dist/src/config/schema.d.ts +74 -47
  293. package/dist/src/config/schema.js +28 -66
  294. package/dist/src/config/schema.js.map +1 -1
  295. package/dist/src/config/validate-channel-configs.d.ts +0 -3
  296. package/dist/src/config/validate-channel-configs.js +29 -10
  297. package/dist/src/config/validate-channel-configs.js.map +1 -1
  298. package/dist/src/cron/executor.js +1 -4
  299. package/dist/src/cron/executor.js.map +1 -1
  300. package/dist/src/document-understanding/extract.d.ts +13 -0
  301. package/dist/src/document-understanding/extract.js +63 -0
  302. package/dist/src/document-understanding/extract.js.map +1 -0
  303. package/dist/src/extensions/activation-context.js +3 -1
  304. package/dist/src/extensions/activation-context.js.map +1 -1
  305. package/dist/src/extensions/activation-planner.js +12 -0
  306. package/dist/src/extensions/activation-planner.js.map +1 -1
  307. package/dist/src/extensions/api.d.ts +5 -1
  308. package/dist/src/extensions/api.js +12 -0
  309. package/dist/src/extensions/api.js.map +1 -1
  310. package/dist/src/extensions/discover-extensions.js +17 -13
  311. package/dist/src/extensions/discover-extensions.js.map +1 -1
  312. package/dist/src/extensions/extension-metadata-snapshot.js +11 -5
  313. package/dist/src/extensions/extension-metadata-snapshot.js.map +1 -1
  314. package/dist/src/extensions/index.js +12 -4
  315. package/dist/src/extensions/index.js.map +1 -0
  316. package/dist/src/extensions/loader.d.ts +5 -1
  317. package/dist/src/extensions/loader.js +12 -11
  318. package/dist/src/extensions/loader.js.map +1 -1
  319. package/dist/src/extensions/manifest-registry.js +98 -93
  320. package/dist/src/extensions/manifest-registry.js.map +1 -1
  321. package/dist/src/extensions/normalize-manifest.js +91 -15
  322. package/dist/src/extensions/normalize-manifest.js.map +1 -1
  323. package/dist/src/extensions/sdk/index.js +1 -1
  324. package/dist/src/extensions/sdk/testing.js +4 -0
  325. package/dist/src/extensions/sdk/testing.js.map +1 -1
  326. package/dist/src/extensions/types/core.d.ts +32 -1
  327. package/dist/src/extensions/types/manifest.d.ts +60 -0
  328. package/dist/src/extensions/types/tui.d.ts +414 -5
  329. package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
  330. package/dist/src/gateway/agent-builtin-tools.js +16 -0
  331. package/dist/src/gateway/agent-builtin-tools.js.map +1 -1
  332. package/dist/src/gateway/agent-run-relay.d.ts +2 -3
  333. package/dist/src/gateway/agent-run-relay.js +10 -3
  334. package/dist/src/gateway/agent-run-relay.js.map +1 -1
  335. package/dist/src/gateway/agents-admin.d.ts +32 -19
  336. package/dist/src/gateway/agents-admin.js +113 -93
  337. package/dist/src/gateway/agents-admin.js.map +1 -1
  338. package/dist/src/gateway/chat-stream/mapper.d.ts +34 -0
  339. package/dist/src/gateway/chat-stream/mapper.js +244 -0
  340. package/dist/src/gateway/chat-stream/mapper.js.map +1 -0
  341. package/dist/src/gateway/chat-stream/protocol.d.ts +100 -0
  342. package/dist/src/gateway/chat-stream/protocol.js +1 -0
  343. package/dist/src/gateway/heartbeat/service.js +1 -1
  344. package/dist/src/gateway/hono/lib/agent-model.d.ts +4 -4
  345. package/dist/src/gateway/hono/lib/agent-model.js +13 -11
  346. package/dist/src/gateway/hono/lib/agent-model.js.map +1 -1
  347. package/dist/src/gateway/hono/lib/config-payload.d.ts +19 -7
  348. package/dist/src/gateway/hono/lib/config-payload.js +16 -15
  349. package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
  350. package/dist/src/gateway/hono/routes/agents.js +83 -48
  351. package/dist/src/gateway/hono/routes/agents.js.map +1 -1
  352. package/dist/src/gateway/hono/routes/channels.js +134 -214
  353. package/dist/src/gateway/hono/routes/channels.js.map +1 -1
  354. package/dist/src/gateway/hono/routes/commands-skills.js +10 -4
  355. package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
  356. package/dist/src/gateway/hono/routes/config-patch/agents.js +26 -13
  357. package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -1
  358. package/dist/src/gateway/hono/routes/config-patch/channels.d.ts +1 -11
  359. package/dist/src/gateway/hono/routes/config-patch/channels.js +18 -165
  360. package/dist/src/gateway/hono/routes/config-patch/channels.js.map +1 -1
  361. package/dist/src/gateway/hono/routes/config.js +5 -2
  362. package/dist/src/gateway/hono/routes/config.js.map +1 -1
  363. package/dist/src/gateway/hono/routes/dreaming.js +1 -1
  364. package/dist/src/gateway/hono/routes/lazy-bundles.js +13 -1
  365. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  366. package/dist/src/gateway/hono/routes/notes.js +46 -27
  367. package/dist/src/gateway/hono/routes/notes.js.map +1 -1
  368. package/dist/src/gateway/hono/routes/public-gateway.js +2 -4
  369. package/dist/src/gateway/hono/routes/public-gateway.js.map +1 -1
  370. package/dist/src/gateway/hono/routes/sessions.js +179 -0
  371. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  372. package/dist/src/gateway/hono/routes/tui.d.ts +3 -0
  373. package/dist/src/gateway/hono/routes/tui.js +16 -0
  374. package/dist/src/gateway/hono/routes/tui.js.map +1 -0
  375. package/dist/src/gateway/hono/routes/workflows.js +25 -1
  376. package/dist/src/gateway/hono/routes/workflows.js.map +1 -1
  377. package/dist/src/gateway/hono/sse.d.ts +5 -7
  378. package/dist/src/gateway/hono/sse.js +21 -38
  379. package/dist/src/gateway/hono/sse.js.map +1 -1
  380. package/dist/src/gateway/protocol.js.map +1 -1
  381. package/dist/src/gateway/service/agent-runner.d.ts +2 -4
  382. package/dist/src/gateway/service/agent-runner.js +1 -1
  383. package/dist/src/gateway/service/agent-runner.js.map +1 -1
  384. package/dist/src/gateway/service/marketplace-service.d.ts +4 -3
  385. package/dist/src/gateway/service/marketplace-service.js +7 -4
  386. package/dist/src/gateway/service/marketplace-service.js.map +1 -1
  387. package/dist/src/gateway/service/run-gateway-agent.d.ts +2 -6
  388. package/dist/src/gateway/service/run-gateway-agent.js +63 -36
  389. package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
  390. package/dist/src/gateway/service/sessions-api.d.ts +19 -0
  391. package/dist/src/gateway/service/sessions-api.js +12 -0
  392. package/dist/src/gateway/service/sessions-api.js.map +1 -1
  393. package/dist/src/gateway/service.d.ts +6 -0
  394. package/dist/src/gateway/service.js +84 -57
  395. package/dist/src/gateway/service.js.map +1 -1
  396. package/dist/src/heartbeat/index.js +1 -1
  397. package/dist/src/notes/agent-context.d.ts +40 -0
  398. package/dist/src/notes/agent-context.js +383 -0
  399. package/dist/src/notes/agent-context.js.map +1 -0
  400. package/dist/src/notes/index.d.ts +2 -0
  401. package/dist/src/notes/index.js +2 -1
  402. package/dist/src/notes/service.d.ts +5 -0
  403. package/dist/src/notes/service.js +22 -0
  404. package/dist/src/notes/service.js.map +1 -1
  405. package/dist/src/notes/store.js +2 -0
  406. package/dist/src/notes/store.js.map +1 -1
  407. package/dist/src/project-trust/trust-store.d.ts +30 -0
  408. package/dist/src/project-trust/trust-store.js +194 -0
  409. package/dist/src/project-trust/trust-store.js.map +1 -0
  410. package/dist/src/providers/index.d.ts +1 -1
  411. package/dist/src/providers/index.js +18 -7
  412. package/dist/src/providers/index.js.map +1 -1
  413. package/dist/src/routing/resolve-route.d.ts +0 -3
  414. package/dist/src/routing/resolve-route.js.map +1 -1
  415. package/dist/src/routing/resolve-tui-session-key.d.ts +2 -0
  416. package/dist/src/routing/resolve-tui-session-key.js +8 -3
  417. package/dist/src/routing/resolve-tui-session-key.js.map +1 -1
  418. package/dist/src/session/client-history.d.ts +32 -0
  419. package/dist/src/session/client-history.js +232 -1
  420. package/dist/src/session/client-history.js.map +1 -1
  421. package/dist/src/session/manager.d.ts +37 -4
  422. package/dist/src/session/manager.js +39 -15
  423. package/dist/src/session/manager.js.map +1 -1
  424. package/dist/src/session/session-context-for-llm.d.ts +93 -1
  425. package/dist/src/session/session-context-for-llm.js +105 -2
  426. package/dist/src/session/session-context-for-llm.js.map +1 -1
  427. package/dist/src/session/store.d.ts +37 -0
  428. package/dist/src/session/store.js +127 -2
  429. package/dist/src/session/store.js.map +1 -1
  430. package/dist/src/session/stored-rows-to-file-entries.js +37 -1
  431. package/dist/src/session/stored-rows-to-file-entries.js.map +1 -1
  432. package/dist/src/session/types.d.ts +14 -1
  433. package/dist/src/session/types.js.map +1 -1
  434. package/dist/src/storage/sqlite/index.d.ts +1 -0
  435. package/dist/src/storage/sqlite/index.js +2 -1
  436. package/dist/src/storage/sqlite/migrations/004_add_session_type_metadata.sql +15 -0
  437. package/dist/src/storage/sqlite/migrations/005_add_note_agent_contexts.sql +10 -0
  438. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  439. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  440. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  441. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  442. package/dist/src/storage/sqlite/note-agent-context-repository.d.ts +10 -0
  443. package/dist/src/storage/sqlite/note-agent-context-repository.js +35 -0
  444. package/dist/src/storage/sqlite/note-agent-context-repository.js.map +1 -0
  445. package/dist/src/storage/sqlite/row-mappers.d.ts +14 -1
  446. package/dist/src/storage/sqlite/row-mappers.js +14 -1
  447. package/dist/src/storage/sqlite/row-mappers.js.map +1 -1
  448. package/dist/src/storage/sqlite/schema.js +1 -1
  449. package/dist/src/storage/sqlite/session-metadata.js +1 -0
  450. package/dist/src/storage/sqlite/session-metadata.js.map +1 -1
  451. package/dist/src/storage/sqlite/session-repository.js +52 -25
  452. package/dist/src/storage/sqlite/session-repository.js.map +1 -1
  453. package/dist/src/tui/backends/embedded-backend.d.ts +53 -4
  454. package/dist/src/tui/backends/embedded-backend.js +227 -39
  455. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  456. package/dist/src/tui/backends/gateway-sse-backend.d.ts +59 -3
  457. package/dist/src/tui/backends/gateway-sse-backend.js +416 -26
  458. package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
  459. package/dist/src/tui/chat-history.d.ts +5 -1
  460. package/dist/src/tui/chat-history.js +78 -8
  461. package/dist/src/tui/chat-history.js.map +1 -1
  462. package/dist/src/tui/clipboard-text.d.ts +5 -0
  463. package/dist/src/tui/clipboard-text.js +46 -0
  464. package/dist/src/tui/clipboard-text.js.map +1 -0
  465. package/dist/src/tui/components/assistant-message.d.ts +19 -3
  466. package/dist/src/tui/components/assistant-message.js +115 -9
  467. package/dist/src/tui/components/assistant-message.js.map +1 -1
  468. package/dist/src/tui/components/bash-execution.d.ts +3 -2
  469. package/dist/src/tui/components/bash-execution.js +31 -3
  470. package/dist/src/tui/components/bash-execution.js.map +1 -1
  471. package/dist/src/tui/components/bash-summary.d.ts +23 -0
  472. package/dist/src/tui/components/bash-summary.js +87 -0
  473. package/dist/src/tui/components/bash-summary.js.map +1 -0
  474. package/dist/src/tui/components/branch-message-summary.d.ts +17 -0
  475. package/dist/src/tui/components/branch-message-summary.js +43 -0
  476. package/dist/src/tui/components/branch-message-summary.js.map +1 -0
  477. package/dist/src/tui/components/branch-summary.d.ts +13 -0
  478. package/dist/src/tui/components/branch-summary.js +51 -0
  479. package/dist/src/tui/components/branch-summary.js.map +1 -0
  480. package/dist/src/tui/components/chat-log.d.ts +46 -6
  481. package/dist/src/tui/components/chat-log.js +183 -21
  482. package/dist/src/tui/components/chat-log.js.map +1 -1
  483. package/dist/src/tui/components/compaction-summary.d.ts +13 -0
  484. package/dist/src/tui/components/compaction-summary.js +46 -0
  485. package/dist/src/tui/components/compaction-summary.js.map +1 -0
  486. package/dist/src/tui/components/custom-editor.d.ts +1 -0
  487. package/dist/src/tui/components/custom-editor.js +2 -0
  488. package/dist/src/tui/components/custom-editor.js.map +1 -1
  489. package/dist/src/tui/components/custom-message.d.ts +23 -0
  490. package/dist/src/tui/components/custom-message.js +65 -0
  491. package/dist/src/tui/components/custom-message.js.map +1 -0
  492. package/dist/src/tui/components/extension-dialog.d.ts +42 -0
  493. package/dist/src/tui/components/extension-dialog.js +127 -0
  494. package/dist/src/tui/components/extension-dialog.js.map +1 -0
  495. package/dist/src/tui/components/scoped-models-selector.d.ts +7 -2
  496. package/dist/src/tui/components/scoped-models-selector.js +89 -16
  497. package/dist/src/tui/components/scoped-models-selector.js.map +1 -1
  498. package/dist/src/tui/components/searchable-select-list.d.ts +30 -3
  499. package/dist/src/tui/components/searchable-select-list.js +82 -10
  500. package/dist/src/tui/components/searchable-select-list.js.map +1 -1
  501. package/dist/src/tui/components/session-selector.d.ts +18 -4
  502. package/dist/src/tui/components/session-selector.js +207 -40
  503. package/dist/src/tui/components/session-selector.js.map +1 -1
  504. package/dist/src/tui/components/settings-selector.d.ts +6 -2
  505. package/dist/src/tui/components/settings-selector.js +126 -7
  506. package/dist/src/tui/components/settings-selector.js.map +1 -1
  507. package/dist/src/tui/components/thinking-selector.d.ts +12 -0
  508. package/dist/src/tui/components/thinking-selector.js +48 -0
  509. package/dist/src/tui/components/thinking-selector.js.map +1 -0
  510. package/dist/src/tui/components/tool-execution.d.ts +57 -3
  511. package/dist/src/tui/components/tool-execution.js +378 -28
  512. package/dist/src/tui/components/tool-execution.js.map +1 -1
  513. package/dist/src/tui/components/tui-bottom-bar.d.ts +9 -1
  514. package/dist/src/tui/components/tui-bottom-bar.js +56 -11
  515. package/dist/src/tui/components/tui-bottom-bar.js.map +1 -1
  516. package/dist/src/tui/components/tui-header.d.ts +9 -2
  517. package/dist/src/tui/components/tui-header.js +25 -5
  518. package/dist/src/tui/components/tui-header.js.map +1 -1
  519. package/dist/src/tui/components/user-message.d.ts +4 -2
  520. package/dist/src/tui/components/user-message.js +42 -9
  521. package/dist/src/tui/components/user-message.js.map +1 -1
  522. package/dist/src/tui/components/visual-truncate.d.ts +11 -0
  523. package/dist/src/tui/components/visual-truncate.js +27 -0
  524. package/dist/src/tui/components/visual-truncate.js.map +1 -0
  525. package/dist/src/tui/extension-host/autocomplete.d.ts +43 -0
  526. package/dist/src/tui/extension-host/autocomplete.js +116 -0
  527. package/dist/src/tui/extension-host/autocomplete.js.map +1 -0
  528. package/dist/src/tui/extension-host/host.d.ts +31 -1
  529. package/dist/src/tui/extension-host/host.js +123 -6
  530. package/dist/src/tui/extension-host/host.js.map +1 -1
  531. package/dist/src/tui/extension-host/load-extensions.d.ts +6 -1
  532. package/dist/src/tui/extension-host/load-extensions.js +4 -3
  533. package/dist/src/tui/extension-host/load-extensions.js.map +1 -1
  534. package/dist/src/tui/extension-host/runtime-context.d.ts +21 -0
  535. package/dist/src/tui/extension-host/runtime-context.js +152 -0
  536. package/dist/src/tui/extension-host/runtime-context.js.map +1 -0
  537. package/dist/src/tui/extension-host/runtime.d.ts +52 -4
  538. package/dist/src/tui/extension-host/runtime.js +547 -85
  539. package/dist/src/tui/extension-host/runtime.js.map +1 -1
  540. package/dist/src/tui/extension-host/surface.d.ts +20 -0
  541. package/dist/src/tui/extension-host/surface.js +30 -6
  542. package/dist/src/tui/extension-host/surface.js.map +1 -1
  543. package/dist/src/tui/extension-host/tool-renderers.d.ts +6 -3
  544. package/dist/src/tui/extension-host/tool-renderers.js +43 -5
  545. package/dist/src/tui/extension-host/tool-renderers.js.map +1 -1
  546. package/dist/src/tui/format-tui-hotkeys.d.ts +12 -2
  547. package/dist/src/tui/format-tui-hotkeys.js +22 -5
  548. package/dist/src/tui/format-tui-hotkeys.js.map +1 -1
  549. package/dist/src/tui/tui-agent-events.d.ts +8 -6
  550. package/dist/src/tui/tui-agent-events.js +200 -59
  551. package/dist/src/tui/tui-agent-events.js.map +1 -1
  552. package/dist/src/tui/tui-backend.d.ts +169 -3
  553. package/dist/src/tui/tui-command-formatters.d.ts +76 -0
  554. package/dist/src/tui/tui-command-formatters.js +594 -0
  555. package/dist/src/tui/tui-command-formatters.js.map +1 -0
  556. package/dist/src/tui/tui-commands.d.ts +57 -7
  557. package/dist/src/tui/tui-commands.js +639 -43
  558. package/dist/src/tui/tui-commands.js.map +1 -1
  559. package/dist/src/tui/tui-context-usage.d.ts +1 -1
  560. package/dist/src/tui/tui-context-usage.js +9 -1
  561. package/dist/src/tui/tui-context-usage.js.map +1 -1
  562. package/dist/src/tui/tui-extension-user-message.d.ts +8 -0
  563. package/dist/src/tui/tui-extension-user-message.js +32 -0
  564. package/dist/src/tui/tui-extension-user-message.js.map +1 -0
  565. package/dist/src/tui/tui-follow-up-queue.d.ts +9 -0
  566. package/dist/src/tui/tui-follow-up-queue.js +18 -0
  567. package/dist/src/tui/tui-follow-up-queue.js.map +1 -0
  568. package/dist/src/tui/tui-local-shell.d.ts +11 -1
  569. package/dist/src/tui/tui-local-shell.js +50 -8
  570. package/dist/src/tui/tui-local-shell.js.map +1 -1
  571. package/dist/src/tui/tui-model-picker.d.ts +26 -0
  572. package/dist/src/tui/tui-model-picker.js +152 -0
  573. package/dist/src/tui/tui-model-picker.js.map +1 -0
  574. package/dist/src/tui/tui-oauth-login.d.ts +16 -0
  575. package/dist/src/tui/tui-oauth-login.js +189 -0
  576. package/dist/src/tui/tui-oauth-login.js.map +1 -0
  577. package/dist/src/tui/tui-overlays.d.ts +3 -3
  578. package/dist/src/tui/tui-overlays.js +6 -7
  579. package/dist/src/tui/tui-overlays.js.map +1 -1
  580. package/dist/src/tui/tui-picker-overlay.d.ts +27 -32
  581. package/dist/src/tui/tui-picker-overlay.js +340 -30
  582. package/dist/src/tui/tui-picker-overlay.js.map +1 -1
  583. package/dist/src/tui/tui-picker-services.d.ts +41 -0
  584. package/dist/src/tui/tui-picker-services.js +1 -0
  585. package/dist/src/tui/tui-run-state.d.ts +11 -0
  586. package/dist/src/tui/tui-run-state.js +114 -0
  587. package/dist/src/tui/tui-run-state.js.map +1 -0
  588. package/dist/src/tui/tui-runtime-hints.d.ts +4 -0
  589. package/dist/src/tui/tui-runtime-hints.js +18 -0
  590. package/dist/src/tui/tui-runtime-hints.js.map +1 -0
  591. package/dist/src/tui/tui-scoped-models.d.ts +1 -1
  592. package/dist/src/tui/tui-scoped-models.js +2 -2
  593. package/dist/src/tui/tui-scoped-models.js.map +1 -1
  594. package/dist/src/tui/tui-session-actions.d.ts +5 -3
  595. package/dist/src/tui/tui-session-actions.js +21 -9
  596. package/dist/src/tui/tui-session-actions.js.map +1 -1
  597. package/dist/src/tui/tui-session-format.d.ts +4 -1
  598. package/dist/src/tui/tui-session-format.js +17 -3
  599. package/dist/src/tui/tui-session-format.js.map +1 -1
  600. package/dist/src/tui/tui-session-snapshot.d.ts +82 -0
  601. package/dist/src/tui/tui-session-snapshot.js +184 -0
  602. package/dist/src/tui/tui-session-snapshot.js.map +1 -0
  603. package/dist/src/tui/tui-session-stats.d.ts +3 -0
  604. package/dist/src/tui/tui-session-stats.js +59 -0
  605. package/dist/src/tui/tui-session-stats.js.map +1 -0
  606. package/dist/src/tui/tui-settings.d.ts +21 -0
  607. package/dist/src/tui/tui-settings.js +28 -1
  608. package/dist/src/tui/tui-settings.js.map +1 -1
  609. package/dist/src/tui/tui-skills-autocomplete.js +1 -1
  610. package/dist/src/tui/tui-skills-autocomplete.js.map +1 -1
  611. package/dist/src/tui/tui-startup-resources.d.ts +3 -0
  612. package/dist/src/tui/tui-startup-resources.js +39 -0
  613. package/dist/src/tui/tui-startup-resources.js.map +1 -0
  614. package/dist/src/tui/tui-startup-text.d.ts +10 -0
  615. package/dist/src/tui/tui-startup-text.js +58 -0
  616. package/dist/src/tui/tui-startup-text.js.map +1 -0
  617. package/dist/src/tui/tui-stdio-filter.d.ts +1 -0
  618. package/dist/src/tui/tui-stdio-filter.js +11 -7
  619. package/dist/src/tui/tui-stdio-filter.js.map +1 -1
  620. package/dist/src/tui/tui-submit.d.ts +2 -0
  621. package/dist/src/tui/tui-submit.js +2 -1
  622. package/dist/src/tui/tui-submit.js.map +1 -1
  623. package/dist/src/tui/tui-tool-diff.js +61 -7
  624. package/dist/src/tui/tui-tool-diff.js.map +1 -1
  625. package/dist/src/tui/tui-tool-result.d.ts +17 -0
  626. package/dist/src/tui/tui-tool-result.js +74 -0
  627. package/dist/src/tui/tui-tool-result.js.map +1 -0
  628. package/dist/src/tui/tui-transcript-tree-picker.d.ts +57 -0
  629. package/dist/src/tui/tui-transcript-tree-picker.js +604 -0
  630. package/dist/src/tui/tui-transcript-tree-picker.js.map +1 -0
  631. package/dist/src/tui/tui-transcript-tree.d.ts +7 -0
  632. package/dist/src/tui/tui-transcript-tree.js +316 -0
  633. package/dist/src/tui/tui-transcript-tree.js.map +1 -0
  634. package/dist/src/tui/tui-types.d.ts +25 -34
  635. package/dist/src/tui/tui-types.js +12 -0
  636. package/dist/src/tui/tui-types.js.map +1 -1
  637. package/dist/src/tui/tui.js +1288 -112
  638. package/dist/src/tui/tui.js.map +1 -1
  639. package/dist/src/tui/xopc-tui-keybindings.d.ts +127 -2
  640. package/dist/src/tui/xopc-tui-keybindings.js +127 -2
  641. package/dist/src/tui/xopc-tui-keybindings.js.map +1 -1
  642. package/dist/src/workflows/domain/definition-utils.d.ts +2 -1
  643. package/dist/src/workflows/domain/definition-utils.js +18 -8
  644. package/dist/src/workflows/domain/definition-utils.js.map +1 -1
  645. package/dist/src/workflows/domain/definition.d.ts +25 -0
  646. package/dist/src/workflows/domain/event.d.ts +1 -0
  647. package/dist/src/workflows/domain/result.d.ts +15 -0
  648. package/dist/src/workflows/domain/run.d.ts +2 -0
  649. package/dist/src/workflows/domain/run.js.map +1 -1
  650. package/dist/src/workflows/engine/projector.js +4 -0
  651. package/dist/src/workflows/engine/projector.js.map +1 -1
  652. package/dist/src/workflows/engine/workflow-engine.d.ts +37 -1
  653. package/dist/src/workflows/engine/workflow-engine.js +75 -11
  654. package/dist/src/workflows/engine/workflow-engine.js.map +1 -1
  655. package/dist/src/workflows/index.d.ts +1 -0
  656. package/dist/src/workflows/index.js +4 -1
  657. package/dist/src/workflows/registry/catalog-workflow-definition-registry.d.ts +9 -0
  658. package/dist/src/workflows/registry/catalog-workflow-definition-registry.js +40 -0
  659. package/dist/src/workflows/registry/catalog-workflow-definition-registry.js.map +1 -0
  660. package/dist/src/workflows/registry/index.d.ts +2 -0
  661. package/dist/src/workflows/registry/index.js +2 -0
  662. package/dist/src/workflows/registry/workflow-definition-registry.d.ts +15 -0
  663. package/dist/src/workflows/registry/workflow-definition-registry.js +1 -0
  664. package/dist/src/workflows/runtime/index.d.ts +2 -0
  665. package/dist/src/workflows/runtime/index.js +2 -1
  666. package/dist/src/workflows/runtime/script-workflow-runtime.d.ts +5 -0
  667. package/dist/src/workflows/runtime/script-workflow-runtime.js +15 -0
  668. package/dist/src/workflows/runtime/script-workflow-runtime.js.map +1 -0
  669. package/dist/src/workflows/runtime/workflow-runtime-port.d.ts +16 -0
  670. package/dist/src/workflows/runtime/workflow-runtime-port.js +1 -0
  671. package/dist/src/workflows/service/run-view-to-snapshot.js +3 -0
  672. package/dist/src/workflows/service/run-view-to-snapshot.js.map +1 -1
  673. package/dist/src/workflows/service/workflow-run-service.d.ts +3 -0
  674. package/dist/src/workflows/service/workflow-run-service.js +10 -15
  675. package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
  676. package/dist/src/workflows/service/workflow-session-bridge.d.ts +1 -1
  677. package/dist/src/workflows/service/workflow-session-bridge.js +4 -1
  678. package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
  679. package/package.json +23 -17
  680. package/skills/creative/frontend-design/SKILL.md +1 -1
  681. package/skills/creative/theme-factory/SKILL.md +1 -1
  682. package/skills/documents/xlsx/SKILL.md +1 -1
  683. package/skills/engineering/diagnose/SKILL.md +2 -2
  684. package/skills/engineering/tdd/SKILL.md +1 -1
  685. package/skills/tools/github/SKILL.md +6 -1
  686. package/skills/tools/webapp-testing/SKILL.md +4 -1
  687. package/dist/extensions/telegram/src/adapters/config-surface.d.ts +0 -2
  688. package/dist/extensions/telegram/src/adapters/config-surface.js +0 -26
  689. package/dist/extensions/telegram/src/adapters/config-surface.js.map +0 -1
  690. package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js +0 -158
  691. package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js.map +0 -1
  692. package/dist/gateway/static/root/assets/agents-BwXkia_W.js +0 -222
  693. package/dist/gateway/static/root/assets/channels-settings-tlOTdaXw.js +0 -1
  694. package/dist/gateway/static/root/assets/channels-status-swr-D4XjqwqC.js +0 -8
  695. package/dist/gateway/static/root/assets/cron-api-DcmfGuj0.js +0 -1
  696. package/dist/gateway/static/root/assets/cron-page-CijJ4G6F.js +0 -1
  697. package/dist/gateway/static/root/assets/extension-settings-page-CyJk_G64.js +0 -1
  698. package/dist/gateway/static/root/assets/field-primitives-C4GpxsDo.js +0 -1
  699. package/dist/gateway/static/root/assets/heartbeat-config-api-CLD0Gpi3.js +0 -1
  700. package/dist/gateway/static/root/assets/index-0HmunJW9.js +0 -4845
  701. package/dist/gateway/static/root/assets/index-Bk75Phrd.css +0 -1
  702. package/dist/gateway/static/root/assets/notes-page-BBnTh0uI.js +0 -1
  703. package/dist/gateway/static/root/assets/sessions-page-B0riYK7j.js +0 -1
  704. package/dist/gateway/static/root/assets/settings-advanced-gate-DiP_WHu_.js +0 -2
  705. package/dist/gateway/static/root/assets/settings-page-1ZPhcCZ9.js +0 -3
  706. package/dist/gateway/static/root/assets/skills-page-BQ1hllKD.js +0 -2
  707. package/dist/gateway/static/root/assets/url-F3_D_6zZ.js +0 -3
  708. package/dist/gateway/static/root/assets/utils-CPr3FBh2.js +0 -1
  709. package/dist/gateway/static/root/assets/voice-api-key-field-BkbDl6dH.js +0 -1
  710. package/dist/gateway/static/root/assets/workflows-page-D059ysoF.js +0 -27
  711. package/dist/src/agent/embedded/map-stream-events.d.ts +0 -9
  712. package/dist/src/agent/embedded/map-stream-events.js +0 -63
  713. package/dist/src/agent/embedded/map-stream-events.js.map +0 -1
  714. package/dist/src/channels/dock.js.map +0 -1
  715. package/dist/src/channels/plugins/bundled.d.ts +0 -11
  716. package/dist/src/channels/plugins/bundled.js +0 -10
  717. package/dist/src/channels/plugins/bundled.js.map +0 -1
  718. package/dist/src/channels/registry.d.ts +0 -25
  719. package/dist/src/channels/registry.js +0 -82
  720. package/dist/src/channels/registry.js.map +0 -1
  721. package/dist/src/config/localized-text.d.ts +0 -6
  722. package/dist/src/config/localized-text.js +0 -42
  723. package/dist/src/config/localized-text.js.map +0 -1
  724. package/dist/src/generated/bundled-channel-plugins.d.ts +0 -10
  725. package/dist/src/generated/bundled-channel-plugins.js +0 -16
  726. package/dist/src/generated/bundled-channel-plugins.js.map +0 -1
  727. package/dist/src/tui/stream-assembler.d.ts +0 -22
  728. package/dist/src/tui/stream-assembler.js +0 -63
  729. package/dist/src/tui/stream-assembler.js.map +0 -1
  730. package/skills/browser/SKILL-zh.md +0 -188
  731. package/skills/business/company-values/SKILL-zh.md +0 -80
  732. package/skills/business/company-values/SKILL.md +0 -80
  733. package/skills/business/find-community/SKILL-zh.md +0 -50
  734. package/skills/business/find-community/SKILL.md +0 -50
  735. package/skills/business/first-customers/SKILL-zh.md +0 -76
  736. package/skills/business/first-customers/SKILL.md +0 -76
  737. package/skills/business/grow-sustainably/SKILL-zh.md +0 -92
  738. package/skills/business/grow-sustainably/SKILL.md +0 -92
  739. package/skills/business/marketing-plan/SKILL-zh.md +0 -100
  740. package/skills/business/marketing-plan/SKILL.md +0 -100
  741. package/skills/business/minimalist-review/SKILL-zh.md +0 -82
  742. package/skills/business/minimalist-review/SKILL.md +0 -82
  743. package/skills/business/mvp/SKILL-zh.md +0 -81
  744. package/skills/business/mvp/SKILL.md +0 -81
  745. package/skills/business/pricing/SKILL-zh.md +0 -64
  746. package/skills/business/pricing/SKILL.md +0 -64
  747. package/skills/business/processize/SKILL-zh.md +0 -91
  748. package/skills/business/processize/SKILL.md +0 -91
  749. package/skills/business/validate-idea/SKILL-zh.md +0 -68
  750. package/skills/business/validate-idea/SKILL.md +0 -68
  751. package/skills/creative/algorithmic-art/LICENSE.txt +0 -202
  752. package/skills/creative/algorithmic-art/SKILL-zh.md +0 -405
  753. package/skills/creative/algorithmic-art/SKILL.md +0 -405
  754. package/skills/creative/algorithmic-art/templates/generator_template.js +0 -223
  755. package/skills/creative/algorithmic-art/templates/viewer.html +0 -599
  756. package/skills/creative/frontend-design/SKILL-zh.md +0 -42
  757. package/skills/creative/theme-factory/SKILL-zh.md +0 -59
  758. package/skills/creative/web-artifacts-builder/LICENSE.txt +0 -202
  759. package/skills/creative/web-artifacts-builder/SKILL-zh.md +0 -74
  760. package/skills/creative/web-artifacts-builder/SKILL.md +0 -74
  761. package/skills/creative/web-artifacts-builder/scripts/bundle-artifact.sh +0 -54
  762. package/skills/creative/web-artifacts-builder/scripts/init-artifact.sh +0 -322
  763. package/skills/creative/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
  764. package/skills/documents/doc-coauthoring/SKILL-zh.md +0 -375
  765. package/skills/documents/doc-coauthoring/SKILL.md +0 -375
  766. package/skills/documents/docx/LICENSE.txt +0 -30
  767. package/skills/documents/docx/SKILL-zh.md +0 -590
  768. package/skills/documents/docx/SKILL.md +0 -590
  769. package/skills/documents/docx/scripts/__init__.py +0 -1
  770. package/skills/documents/docx/scripts/accept_changes.py +0 -135
  771. package/skills/documents/docx/scripts/comment.py +0 -318
  772. package/skills/documents/docx/scripts/office/helpers/__init__.py +0 -0
  773. package/skills/documents/docx/scripts/office/helpers/merge_runs.py +0 -199
  774. package/skills/documents/docx/scripts/office/helpers/simplify_redlines.py +0 -197
  775. package/skills/documents/docx/scripts/office/pack.py +0 -159
  776. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
  777. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
  778. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
  779. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
  780. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
  781. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
  782. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
  783. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
  784. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
  785. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
  786. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
  787. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
  788. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
  789. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
  790. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
  791. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
  792. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
  793. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
  794. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
  795. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
  796. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
  797. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
  798. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
  799. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
  800. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
  801. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
  802. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
  803. package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
  804. package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
  805. package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
  806. package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
  807. package/skills/documents/docx/scripts/office/schemas/mce/mc.xsd +0 -75
  808. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-2010.xsd +0 -560
  809. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-2012.xsd +0 -67
  810. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-2018.xsd +0 -14
  811. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -20
  812. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -13
  813. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
  814. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -8
  815. package/skills/documents/docx/scripts/office/soffice.py +0 -183
  816. package/skills/documents/docx/scripts/office/unpack.py +0 -132
  817. package/skills/documents/docx/scripts/office/validate.py +0 -111
  818. package/skills/documents/docx/scripts/office/validators/__init__.py +0 -15
  819. package/skills/documents/docx/scripts/office/validators/base.py +0 -847
  820. package/skills/documents/docx/scripts/office/validators/docx.py +0 -446
  821. package/skills/documents/docx/scripts/office/validators/pptx.py +0 -275
  822. package/skills/documents/docx/scripts/office/validators/redlining.py +0 -247
  823. package/skills/documents/docx/scripts/templates/comments.xml +0 -3
  824. package/skills/documents/docx/scripts/templates/commentsExtended.xml +0 -3
  825. package/skills/documents/docx/scripts/templates/commentsExtensible.xml +0 -3
  826. package/skills/documents/docx/scripts/templates/commentsIds.xml +0 -3
  827. package/skills/documents/docx/scripts/templates/people.xml +0 -3
  828. package/skills/documents/pdf/LICENSE.txt +0 -30
  829. package/skills/documents/pdf/SKILL-zh.md +0 -314
  830. package/skills/documents/pdf/SKILL.md +0 -314
  831. package/skills/documents/pdf/forms.md +0 -294
  832. package/skills/documents/pdf/reference.md +0 -612
  833. package/skills/documents/pdf/scripts/check_bounding_boxes.py +0 -65
  834. package/skills/documents/pdf/scripts/check_fillable_fields.py +0 -11
  835. package/skills/documents/pdf/scripts/convert_pdf_to_images.py +0 -33
  836. package/skills/documents/pdf/scripts/create_validation_image.py +0 -37
  837. package/skills/documents/pdf/scripts/extract_form_field_info.py +0 -122
  838. package/skills/documents/pdf/scripts/extract_form_structure.py +0 -115
  839. package/skills/documents/pdf/scripts/fill_fillable_fields.py +0 -98
  840. package/skills/documents/pdf/scripts/fill_pdf_form_with_annotations.py +0 -107
  841. package/skills/documents/pptx/LICENSE.txt +0 -30
  842. package/skills/documents/pptx/SKILL-zh.md +0 -232
  843. package/skills/documents/pptx/SKILL.md +0 -232
  844. package/skills/documents/pptx/editing.md +0 -205
  845. package/skills/documents/pptx/pptxgenjs.md +0 -420
  846. package/skills/documents/pptx/scripts/__init__.py +0 -0
  847. package/skills/documents/pptx/scripts/add_slide.py +0 -195
  848. package/skills/documents/pptx/scripts/clean.py +0 -286
  849. package/skills/documents/pptx/scripts/office/helpers/__init__.py +0 -0
  850. package/skills/documents/pptx/scripts/office/helpers/merge_runs.py +0 -199
  851. package/skills/documents/pptx/scripts/office/helpers/simplify_redlines.py +0 -197
  852. package/skills/documents/pptx/scripts/office/pack.py +0 -159
  853. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
  854. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
  855. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
  856. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
  857. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
  858. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
  859. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
  860. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
  861. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
  862. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
  863. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
  864. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
  865. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
  866. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
  867. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
  868. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
  869. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
  870. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
  871. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
  872. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
  873. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
  874. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
  875. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
  876. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
  877. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
  878. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
  879. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
  880. package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
  881. package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
  882. package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
  883. package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
  884. package/skills/documents/pptx/scripts/office/schemas/mce/mc.xsd +0 -75
  885. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-2010.xsd +0 -560
  886. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-2012.xsd +0 -67
  887. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-2018.xsd +0 -14
  888. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -20
  889. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -13
  890. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
  891. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -8
  892. package/skills/documents/pptx/scripts/office/soffice.py +0 -183
  893. package/skills/documents/pptx/scripts/office/unpack.py +0 -132
  894. package/skills/documents/pptx/scripts/office/validate.py +0 -111
  895. package/skills/documents/pptx/scripts/office/validators/__init__.py +0 -15
  896. package/skills/documents/pptx/scripts/office/validators/base.py +0 -847
  897. package/skills/documents/pptx/scripts/office/validators/docx.py +0 -446
  898. package/skills/documents/pptx/scripts/office/validators/pptx.py +0 -275
  899. package/skills/documents/pptx/scripts/office/validators/redlining.py +0 -247
  900. package/skills/documents/pptx/scripts/thumbnail.py +0 -289
  901. package/skills/documents/xlsx/SKILL-zh.md +0 -292
  902. package/skills/engineering/diagnose/SKILL-zh.md +0 -117
  903. package/skills/engineering/grill-with-docs/ADR-FORMAT.md +0 -47
  904. package/skills/engineering/grill-with-docs/CONTEXT-FORMAT.md +0 -77
  905. package/skills/engineering/grill-with-docs/SKILL-zh.md +0 -88
  906. package/skills/engineering/grill-with-docs/SKILL.md +0 -88
  907. package/skills/engineering/improve-codebase-architecture/DEEPENING.md +0 -37
  908. package/skills/engineering/improve-codebase-architecture/INTERFACE-DESIGN.md +0 -44
  909. package/skills/engineering/improve-codebase-architecture/LANGUAGE.md +0 -53
  910. package/skills/engineering/improve-codebase-architecture/SKILL-zh.md +0 -71
  911. package/skills/engineering/improve-codebase-architecture/SKILL.md +0 -71
  912. package/skills/engineering/tdd/SKILL-zh.md +0 -109
  913. package/skills/engineering/to-issues/SKILL-zh.md +0 -81
  914. package/skills/engineering/to-issues/SKILL.md +0 -81
  915. package/skills/engineering/to-prd/SKILL-zh.md +0 -76
  916. package/skills/engineering/to-prd/SKILL.md +0 -74
  917. package/skills/engineering/zoom-out/SKILL-zh.md +0 -7
  918. package/skills/engineering/zoom-out/SKILL.md +0 -7
  919. package/skills/tools/find-skills/SKILL-zh.md +0 -440
  920. package/skills/tools/github/SKILL-zh.md +0 -48
  921. package/skills/tools/internal-comms/LICENSE.txt +0 -202
  922. package/skills/tools/internal-comms/SKILL-zh.md +0 -32
  923. package/skills/tools/internal-comms/SKILL.md +0 -32
  924. package/skills/tools/internal-comms/examples/3p-updates.md +0 -47
  925. package/skills/tools/internal-comms/examples/company-newsletter.md +0 -65
  926. package/skills/tools/internal-comms/examples/faq-answers.md +0 -30
  927. package/skills/tools/internal-comms/examples/general-comms.md +0 -16
  928. package/skills/tools/skill-creator/LICENSE.txt +0 -202
  929. package/skills/tools/skill-creator/SKILL-zh.md +0 -483
  930. package/skills/tools/skill-creator/SKILL.md +0 -485
  931. package/skills/tools/skill-creator/agents/analyzer.md +0 -274
  932. package/skills/tools/skill-creator/agents/comparator.md +0 -202
  933. package/skills/tools/skill-creator/agents/grader.md +0 -223
  934. package/skills/tools/skill-creator/assets/eval_review.html +0 -146
  935. package/skills/tools/skill-creator/eval-viewer/generate_review.py +0 -471
  936. package/skills/tools/skill-creator/eval-viewer/viewer.html +0 -1325
  937. package/skills/tools/skill-creator/references/schemas.md +0 -430
  938. package/skills/tools/skill-creator/scripts/__init__.py +0 -0
  939. package/skills/tools/skill-creator/scripts/aggregate_benchmark.py +0 -401
  940. package/skills/tools/skill-creator/scripts/generate_report.py +0 -326
  941. package/skills/tools/skill-creator/scripts/improve_description.py +0 -247
  942. package/skills/tools/skill-creator/scripts/package_skill.py +0 -136
  943. package/skills/tools/skill-creator/scripts/quick_validate.py +0 -103
  944. package/skills/tools/skill-creator/scripts/run_eval.py +0 -310
  945. package/skills/tools/skill-creator/scripts/run_loop.py +0 -328
  946. package/skills/tools/skill-creator/scripts/utils.py +0 -47
  947. package/skills/tools/summarize/SKILL-zh.md +0 -47
  948. package/skills/tools/weather/SKILL-zh.md +0 -46
  949. package/skills/tools/weather/SKILL.md +0 -46
  950. package/skills/tools/webapp-testing/SKILL-zh.md +0 -96
@@ -1,62 +1,11 @@
1
+ import { buildChannelCatalogForConfig, init_channel_catalog_service } from "../../../../channels/catalog/channel-catalog-service.js";
1
2
  import { init_loader, loadConfig } from "../../../../config/loader.js";
2
3
  import { existsSync } from "node:fs";
3
4
  //#region src/cli/commands/doctor/checks/channel-config.ts
5
+ init_channel_catalog_service();
4
6
  init_loader();
5
- function checkTelegram(cfg) {
6
- const tg = cfg.channels?.telegram;
7
- if (!tg) return {
8
- ok: true,
9
- messages: [],
10
- hints: []
11
- };
12
- const defaultAcc = tg.accounts?.default;
13
- const token = defaultAcc?.botToken?.trim() ?? "";
14
- if (!(tg.enabled === true || token.length > 0)) return {
15
- ok: true,
16
- messages: [],
17
- hints: []
18
- };
19
- const messages = [];
20
- const hints = [];
21
- if (!token) {
22
- messages.push("Telegram is enabled but no bot token is set.");
23
- hints.push("Set channels.telegram.accounts.default.botToken.");
24
- }
25
- const dm = (defaultAcc?.dmPolicy ?? tg.dmPolicy) || "pairing";
26
- if (![
27
- "pairing",
28
- "allowlist",
29
- "open",
30
- "disabled"
31
- ].includes(dm)) messages.push(`Telegram dmPolicy "${dm}" is not valid.`);
32
- if (dm === "open") {
33
- messages.push("Telegram DM policy is \"open\" (any user can message the bot).");
34
- hints.push("Consider \"pairing\" or \"allowlist\" for stricter access.");
35
- }
36
- return {
37
- ok: messages.length === 0,
38
- messages,
39
- hints
40
- };
41
- }
42
- function checkWeixin(cfg) {
43
- const wx = cfg.channels?.weixin;
44
- if (!wx || wx.enabled !== true) return {
45
- ok: true,
46
- messages: [],
47
- hints: []
48
- };
49
- const messages = [];
50
- const hints = [];
51
- if ((wx.accounts ? Object.keys(wx.accounts).filter((k) => k.trim()) : []).length === 0) {
52
- messages.push("Weixin is enabled but no accounts are defined in config.");
53
- hints.push("Run: xopc channels login --channel weixin (or add channels.weixin.accounts).");
54
- }
55
- return {
56
- ok: messages.length === 0,
57
- messages,
58
- hints
59
- };
7
+ function isEnabledChannelConfig(value) {
8
+ return typeof value === "object" && value !== null && !Array.isArray(value) && value.enabled === true;
60
9
  }
61
10
  async function checkChannelConfig(ctx) {
62
11
  if (!existsSync(ctx.configPath)) return {
@@ -78,32 +27,30 @@ async function checkChannelConfig(ctx) {
78
27
  hints: []
79
28
  };
80
29
  }
81
- const tg = checkTelegram(cfg);
82
- const wx = checkWeixin(cfg);
83
- const allMsg = [...tg.messages, ...wx.messages];
84
- const allHints = [...tg.hints, ...wx.hints];
85
- const tgEnabled = (cfg.channels?.telegram)?.enabled === true || Boolean((cfg.channels?.telegram)?.accounts?.default?.botToken?.trim());
86
- const wxOn = (cfg.channels?.weixin)?.enabled === true;
87
- if (!tgEnabled && !wxOn) return {
30
+ const channels = cfg.channels;
31
+ const enabledIds = Object.entries(channels ?? {}).filter(([, value]) => isEnabledChannelConfig(value)).map(([id]) => id);
32
+ if (enabledIds.length === 0) return {
88
33
  id: "channel-config",
89
34
  label: "Channels",
90
35
  status: "skip",
91
36
  message: "No channels enabled; skipped.",
92
37
  hints: []
93
38
  };
94
- if (allMsg.length === 0) return {
39
+ const catalog = buildChannelCatalogForConfig(cfg);
40
+ const unknownIds = enabledIds.filter((id) => !catalog.byId.has(id));
41
+ if (unknownIds.length > 0) return {
95
42
  id: "channel-config",
96
43
  label: "Channels",
97
- status: "pass",
98
- message: "Enabled channel configuration looks valid.",
99
- hints: []
44
+ status: "fail",
45
+ message: `Enabled channel(s) are not declared by installed extensions: ${unknownIds.join(", ")}.`,
46
+ hints: ["Install or enable an extension that declares each channel contribution."]
100
47
  };
101
48
  return {
102
49
  id: "channel-config",
103
50
  label: "Channels",
104
- status: allMsg.some((m) => m.includes("no bot token") || m.includes("no accounts")) ? "fail" : "warn",
105
- message: allMsg.join(" "),
106
- hints: allHints
51
+ status: "pass",
52
+ message: `Enabled channel configuration loaded for: ${enabledIds.join(", ")}.`,
53
+ hints: []
107
54
  };
108
55
  }
109
56
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"channel-config.js","names":[],"sources":["../../../../../../src/cli/commands/doctor/checks/channel-config.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\n\nimport { loadConfig } from '../../../../config/loader.js';\nimport type { Config } from '../../../../config/schema.js';\nimport type { CheckResult, DoctorContext } from '../types.js';\n\ntype TelegramCfg = {\n enabled?: boolean;\n accounts?: Record<string, { botToken?: string; dmPolicy?: string; enabled?: boolean }>;\n dmPolicy?: string;\n};\n\ntype WeixinCfg = {\n enabled?: boolean;\n accounts?: Record<string, unknown>;\n};\n\nfunction checkTelegram(cfg: Config): { ok: boolean; messages: string[]; hints: string[] } {\n const tg = cfg.channels?.telegram as TelegramCfg | undefined;\n if (!tg) {\n return { ok: true, messages: [], hints: [] };\n }\n\n const defaultAcc = tg.accounts?.default;\n const token = defaultAcc?.botToken?.trim() ?? '';\n const enabled = tg.enabled === true || token.length > 0;\n\n if (!enabled) {\n return { ok: true, messages: [], hints: [] };\n }\n\n const messages: string[] = [];\n const hints: string[] = [];\n\n if (!token) {\n messages.push('Telegram is enabled but no bot token is set.');\n hints.push('Set channels.telegram.accounts.default.botToken.');\n }\n\n const dm = (defaultAcc?.dmPolicy ?? tg.dmPolicy) || 'pairing';\n if (!['pairing', 'allowlist', 'open', 'disabled'].includes(dm)) {\n messages.push(`Telegram dmPolicy \"${dm}\" is not valid.`);\n }\n if (dm === 'open') {\n messages.push('Telegram DM policy is \"open\" (any user can message the bot).');\n hints.push('Consider \"pairing\" or \"allowlist\" for stricter access.');\n }\n\n return {\n ok: messages.length === 0,\n messages,\n hints,\n };\n}\n\nfunction checkWeixin(cfg: Config): { ok: boolean; messages: string[]; hints: string[] } {\n const wx = cfg.channels?.weixin as WeixinCfg | undefined;\n if (!wx || wx.enabled !== true) {\n return { ok: true, messages: [], hints: [] };\n }\n\n const messages: string[] = [];\n const hints: string[] = [];\n const accountKeys = wx.accounts ? Object.keys(wx.accounts).filter((k) => k.trim()) : [];\n if (accountKeys.length === 0) {\n messages.push('Weixin is enabled but no accounts are defined in config.');\n hints.push('Run: xopc channels login --channel weixin (or add channels.weixin.accounts).');\n }\n\n return { ok: messages.length === 0, messages, hints };\n}\n\nexport async function checkChannelConfig(ctx: DoctorContext): Promise<CheckResult> {\n if (!existsSync(ctx.configPath)) {\n return {\n id: 'channel-config',\n label: 'Channels',\n status: 'skip',\n message: 'No config file; skipped.',\n hints: [],\n };\n }\n\n let cfg: Config;\n try {\n cfg = loadConfig(ctx.configPath);\n } catch {\n return {\n id: 'channel-config',\n label: 'Channels',\n status: 'skip',\n message: 'Config could not be loaded; skipped.',\n hints: [],\n };\n }\n\n const tg = checkTelegram(cfg);\n const wx = checkWeixin(cfg);\n const allMsg = [...tg.messages, ...wx.messages];\n const allHints = [...tg.hints, ...wx.hints];\n\n const tgEnabled =\n (cfg.channels?.telegram as TelegramCfg | undefined)?.enabled === true ||\n Boolean((cfg.channels?.telegram as TelegramCfg | undefined)?.accounts?.default?.botToken?.trim());\n const wxOn = (cfg.channels?.weixin as WeixinCfg | undefined)?.enabled === true;\n if (!tgEnabled && !wxOn) {\n return {\n id: 'channel-config',\n label: 'Channels',\n status: 'skip',\n message: 'No channels enabled; skipped.',\n hints: [],\n };\n }\n\n if (allMsg.length === 0) {\n return {\n id: 'channel-config',\n label: 'Channels',\n status: 'pass',\n message: 'Enabled channel configuration looks valid.',\n hints: [],\n };\n }\n\n const hasFail = allMsg.some((m) => m.includes('no bot token') || m.includes('no accounts'));\n return {\n id: 'channel-config',\n label: 'Channels',\n status: hasFail ? 'fail' : 'warn',\n message: allMsg.join(' '),\n hints: allHints,\n };\n}\n"],"mappings":";;;aAE0D;AAe1D,SAAS,cAAc,KAAmE;CACxF,MAAM,KAAK,IAAI,UAAU;AACzB,KAAI,CAAC,GACH,QAAO;EAAE,IAAI;EAAM,UAAU,EAAE;EAAE,OAAO,EAAE;EAAE;CAG9C,MAAM,aAAa,GAAG,UAAU;CAChC,MAAM,QAAQ,YAAY,UAAU,MAAM,IAAI;AAG9C,KAAI,EAFY,GAAG,YAAY,QAAQ,MAAM,SAAS,GAGpD,QAAO;EAAE,IAAI;EAAM,UAAU,EAAE;EAAE,OAAO,EAAE;EAAE;CAG9C,MAAM,WAAqB,EAAE;CAC7B,MAAM,QAAkB,EAAE;AAE1B,KAAI,CAAC,OAAO;AACV,WAAS,KAAK,+CAA+C;AAC7D,QAAM,KAAK,mDAAmD;;CAGhE,MAAM,MAAM,YAAY,YAAY,GAAG,aAAa;AACpD,KAAI,CAAC;EAAC;EAAW;EAAa;EAAQ;EAAW,CAAC,SAAS,GAAG,CAC5D,UAAS,KAAK,sBAAsB,GAAG,iBAAiB;AAE1D,KAAI,OAAO,QAAQ;AACjB,WAAS,KAAK,iEAA+D;AAC7E,QAAM,KAAK,6DAAyD;;AAGtE,QAAO;EACL,IAAI,SAAS,WAAW;EACxB;EACA;EACD;;AAGH,SAAS,YAAY,KAAmE;CACtF,MAAM,KAAK,IAAI,UAAU;AACzB,KAAI,CAAC,MAAM,GAAG,YAAY,KACxB,QAAO;EAAE,IAAI;EAAM,UAAU,EAAE;EAAE,OAAO,EAAE;EAAE;CAG9C,MAAM,WAAqB,EAAE;CAC7B,MAAM,QAAkB,EAAE;AAE1B,MADoB,GAAG,WAAW,OAAO,KAAK,GAAG,SAAS,CAAC,QAAQ,MAAM,EAAE,MAAM,CAAC,GAAG,EAAE,EACvE,WAAW,GAAG;AAC5B,WAAS,KAAK,2DAA2D;AACzE,QAAM,KAAK,+EAA+E;;AAG5F,QAAO;EAAE,IAAI,SAAS,WAAW;EAAG;EAAU;EAAO;;AAGvD,eAAsB,mBAAmB,KAA0C;AACjF,KAAI,CAAC,WAAW,IAAI,WAAW,CAC7B,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS;EACT,OAAO,EAAE;EACV;CAGH,IAAI;AACJ,KAAI;AACF,QAAM,WAAW,IAAI,WAAW;SAC1B;AACN,SAAO;GACL,IAAI;GACJ,OAAO;GACP,QAAQ;GACR,SAAS;GACT,OAAO,EAAE;GACV;;CAGH,MAAM,KAAK,cAAc,IAAI;CAC7B,MAAM,KAAK,YAAY,IAAI;CAC3B,MAAM,SAAS,CAAC,GAAG,GAAG,UAAU,GAAG,GAAG,SAAS;CAC/C,MAAM,WAAW,CAAC,GAAG,GAAG,OAAO,GAAG,GAAG,MAAM;CAE3C,MAAM,aACH,IAAI,UAAU,WAAsC,YAAY,QACjE,SAAS,IAAI,UAAU,WAAsC,UAAU,SAAS,UAAU,MAAM,CAAC;CACnG,MAAM,QAAQ,IAAI,UAAU,SAAkC,YAAY;AAC1E,KAAI,CAAC,aAAa,CAAC,KACjB,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS;EACT,OAAO,EAAE;EACV;AAGH,KAAI,OAAO,WAAW,EACpB,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS;EACT,OAAO,EAAE;EACV;AAIH,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAJc,OAAO,MAAM,MAAM,EAAE,SAAS,eAAe,IAAI,EAAE,SAAS,cAAc,CAIzE,GAAG,SAAS;EAC3B,SAAS,OAAO,KAAK,IAAI;EACzB,OAAO;EACR"}
1
+ {"version":3,"file":"channel-config.js","names":[],"sources":["../../../../../../src/cli/commands/doctor/checks/channel-config.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\n\nimport { buildChannelCatalogForConfig } from '../../../../channels/catalog/channel-catalog-service.js';\nimport { loadConfig } from '../../../../config/loader.js';\nimport type { Config } from '../../../../config/schema.js';\nimport type { CheckResult, DoctorContext } from '../types.js';\n\nfunction isEnabledChannelConfig(value: unknown): value is { enabled: true } {\n return typeof value === 'object' && value !== null && !Array.isArray(value) && (value as { enabled?: unknown }).enabled === true;\n}\n\nexport async function checkChannelConfig(ctx: DoctorContext): Promise<CheckResult> {\n if (!existsSync(ctx.configPath)) {\n return {\n id: 'channel-config',\n label: 'Channels',\n status: 'skip',\n message: 'No config file; skipped.',\n hints: [],\n };\n }\n\n let cfg: Config;\n try {\n cfg = loadConfig(ctx.configPath);\n } catch {\n return {\n id: 'channel-config',\n label: 'Channels',\n status: 'skip',\n message: 'Config could not be loaded; skipped.',\n hints: [],\n };\n }\n\n const channels = cfg.channels as Record<string, unknown> | undefined;\n const enabledIds = Object.entries(channels ?? {})\n .filter(([, value]) => isEnabledChannelConfig(value))\n .map(([id]) => id);\n\n if (enabledIds.length === 0) {\n return {\n id: 'channel-config',\n label: 'Channels',\n status: 'skip',\n message: 'No channels enabled; skipped.',\n hints: [],\n };\n }\n\n const catalog = buildChannelCatalogForConfig(cfg);\n const unknownIds = enabledIds.filter((id) => !catalog.byId.has(id));\n if (unknownIds.length > 0) {\n return {\n id: 'channel-config',\n label: 'Channels',\n status: 'fail',\n message: `Enabled channel(s) are not declared by installed extensions: ${unknownIds.join(', ')}.`,\n hints: ['Install or enable an extension that declares each channel contribution.'],\n };\n }\n\n return {\n id: 'channel-config',\n label: 'Channels',\n status: 'pass',\n message: `Enabled channel configuration loaded for: ${enabledIds.join(', ')}.`,\n hints: [],\n };\n}\n"],"mappings":";;;;8BAEuG;aAC7C;AAI1D,SAAS,uBAAuB,OAA4C;AAC1E,QAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,MAAM,IAAK,MAAgC,YAAY;;AAG9H,eAAsB,mBAAmB,KAA0C;AACjF,KAAI,CAAC,WAAW,IAAI,WAAW,CAC7B,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS;EACT,OAAO,EAAE;EACV;CAGH,IAAI;AACJ,KAAI;AACF,QAAM,WAAW,IAAI,WAAW;SAC1B;AACN,SAAO;GACL,IAAI;GACJ,OAAO;GACP,QAAQ;GACR,SAAS;GACT,OAAO,EAAE;GACV;;CAGH,MAAM,WAAW,IAAI;CACrB,MAAM,aAAa,OAAO,QAAQ,YAAY,EAAE,CAAC,CAC9C,QAAQ,GAAG,WAAW,uBAAuB,MAAM,CAAC,CACpD,KAAK,CAAC,QAAQ,GAAG;AAEpB,KAAI,WAAW,WAAW,EACxB,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS;EACT,OAAO,EAAE;EACV;CAGH,MAAM,UAAU,6BAA6B,IAAI;CACjD,MAAM,aAAa,WAAW,QAAQ,OAAO,CAAC,QAAQ,KAAK,IAAI,GAAG,CAAC;AACnE,KAAI,WAAW,SAAS,EACtB,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS,gEAAgE,WAAW,KAAK,KAAK,CAAC;EAC/F,OAAO,CAAC,0EAA0E;EACnF;AAGH,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS,6CAA6C,WAAW,KAAK,KAAK,CAAC;EAC5E,OAAO,EAAE;EACV"}
@@ -3,8 +3,10 @@ import { collectPairingPendingIssues } from "../../../../channels/pairing/pairin
3
3
  import { existsSync } from "node:fs";
4
4
  //#region src/cli/commands/doctor/checks/channel-pairing-pending.ts
5
5
  init_loader();
6
- function channelEnabled(cfg, channel) {
7
- return (cfg.channels?.[channel])?.enabled === true;
6
+ function hasEnabledChannel(cfg) {
7
+ return Object.values(cfg.channels ?? {}).some((value) => {
8
+ return typeof value === "object" && value !== null && !Array.isArray(value) && value.enabled === true;
9
+ });
8
10
  }
9
11
  async function checkChannelPairingPending(ctx) {
10
12
  if (!existsSync(ctx.configPath)) return {
@@ -26,7 +28,7 @@ async function checkChannelPairingPending(ctx) {
26
28
  hints: []
27
29
  };
28
30
  }
29
- if (!(channelEnabled(cfg, "telegram") || channelEnabled(cfg, "feishu") || channelEnabled(cfg, "weixin"))) return {
31
+ if (!hasEnabledChannel(cfg)) return {
30
32
  id: "channel-pairing-pending",
31
33
  label: "Channel pairing",
32
34
  status: "skip",
@@ -47,7 +49,7 @@ async function checkChannelPairingPending(ctx) {
47
49
  const parts = [`${totalPending} pending pairing request(s) across enabled channels.`];
48
50
  if (totalStale > 0) parts.push(`${totalStale} pending over 30 minutes (codes expire after 1 hour).`);
49
51
  if (atCapacity.length > 0) parts.push(`${atCapacity.length} account(s) at the pending limit — approve or wait for expiry before new users can request codes.`);
50
- const hints = ["Approve in the gateway console under Settings → Channels, or run: xopc channels pairing approve --channel <id> <CODE>"];
52
+ const hints = ["Approve in the gateway console under Settings → Channels, or run: xopc channels pairing approve <id> <CODE>"];
51
53
  if (totalStale > 0) hints.push("Stale requests may expire soon; ask users to send a fresh DM if approval fails.");
52
54
  return {
53
55
  id: "channel-pairing-pending",
@@ -1 +1 @@
1
- {"version":3,"file":"channel-pairing-pending.js","names":[],"sources":["../../../../../../src/cli/commands/doctor/checks/channel-pairing-pending.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\n\nimport { collectPairingPendingIssues } from '../../../../channels/pairing/pairing-service.js';\nimport { loadConfig } from '../../../../config/loader.js';\nimport type { Config } from '../../../../config/schema.js';\nimport type { CheckResult, DoctorContext } from '../types.js';\n\nfunction channelEnabled(cfg: Config, channel: 'telegram' | 'feishu' | 'weixin'): boolean {\n const ch = cfg.channels?.[channel] as { enabled?: boolean } | undefined;\n return ch?.enabled === true;\n}\n\nexport async function checkChannelPairingPending(ctx: DoctorContext): Promise<CheckResult> {\n if (!existsSync(ctx.configPath)) {\n return {\n id: 'channel-pairing-pending',\n label: 'Channel pairing',\n status: 'skip',\n message: 'No config file; skipped.',\n hints: [],\n };\n }\n\n let cfg: Config;\n try {\n cfg = loadConfig(ctx.configPath);\n } catch {\n return {\n id: 'channel-pairing-pending',\n label: 'Channel pairing',\n status: 'skip',\n message: 'Config could not be loaded; skipped.',\n hints: [],\n };\n }\n\n const anyChannel =\n channelEnabled(cfg, 'telegram') || channelEnabled(cfg, 'feishu') || channelEnabled(cfg, 'weixin');\n if (!anyChannel) {\n return {\n id: 'channel-pairing-pending',\n label: 'Channel pairing',\n status: 'skip',\n message: 'No channels enabled; skipped.',\n hints: [],\n };\n }\n\n const issues = collectPairingPendingIssues(cfg);\n if (issues.length === 0) {\n return {\n id: 'channel-pairing-pending',\n label: 'Channel pairing',\n status: 'pass',\n message: 'No pending DM pairing requests.',\n hints: [],\n };\n }\n\n const totalPending = issues.reduce((n, i) => n + i.pending, 0);\n const totalStale = issues.reduce((n, i) => n + i.stale, 0);\n const atCapacity = issues.filter((i) => i.atCapacity);\n\n const parts: string[] = [\n `${totalPending} pending pairing request(s) across enabled channels.`,\n ];\n if (totalStale > 0) {\n parts.push(`${totalStale} pending over 30 minutes (codes expire after 1 hour).`);\n }\n if (atCapacity.length > 0) {\n parts.push(\n `${atCapacity.length} account(s) at the pending limit — approve or wait for expiry before new users can request codes.`,\n );\n }\n\n const hints = [\n 'Approve in the gateway console under Settings → Channels, or run: xopc channels pairing approve --channel <id> <CODE>',\n ];\n if (totalStale > 0) {\n hints.push('Stale requests may expire soon; ask users to send a fresh DM if approval fails.');\n }\n\n return {\n id: 'channel-pairing-pending',\n label: 'Channel pairing',\n status: 'warn',\n message: parts.join(' '),\n hints,\n };\n}\n"],"mappings":";;;;aAG0D;AAI1D,SAAS,eAAe,KAAa,SAAoD;AAEvF,SADW,IAAI,WAAW,WACf,YAAY;;AAGzB,eAAsB,2BAA2B,KAA0C;AACzF,KAAI,CAAC,WAAW,IAAI,WAAW,CAC7B,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS;EACT,OAAO,EAAE;EACV;CAGH,IAAI;AACJ,KAAI;AACF,QAAM,WAAW,IAAI,WAAW;SAC1B;AACN,SAAO;GACL,IAAI;GACJ,OAAO;GACP,QAAQ;GACR,SAAS;GACT,OAAO,EAAE;GACV;;AAKH,KAAI,EADF,eAAe,KAAK,WAAW,IAAI,eAAe,KAAK,SAAS,IAAI,eAAe,KAAK,SAAS,EAEjG,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS;EACT,OAAO,EAAE;EACV;CAGH,MAAM,SAAS,4BAA4B,IAAI;AAC/C,KAAI,OAAO,WAAW,EACpB,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS;EACT,OAAO,EAAE;EACV;CAGH,MAAM,eAAe,OAAO,QAAQ,GAAG,MAAM,IAAI,EAAE,SAAS,EAAE;CAC9D,MAAM,aAAa,OAAO,QAAQ,GAAG,MAAM,IAAI,EAAE,OAAO,EAAE;CAC1D,MAAM,aAAa,OAAO,QAAQ,MAAM,EAAE,WAAW;CAErD,MAAM,QAAkB,CACtB,GAAG,aAAa,sDACjB;AACD,KAAI,aAAa,EACf,OAAM,KAAK,GAAG,WAAW,uDAAuD;AAElF,KAAI,WAAW,SAAS,EACtB,OAAM,KACJ,GAAG,WAAW,OAAO,mGACtB;CAGH,MAAM,QAAQ,CACZ,wHACD;AACD,KAAI,aAAa,EACf,OAAM,KAAK,kFAAkF;AAG/F,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS,MAAM,KAAK,IAAI;EACxB;EACD"}
1
+ {"version":3,"file":"channel-pairing-pending.js","names":[],"sources":["../../../../../../src/cli/commands/doctor/checks/channel-pairing-pending.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\n\nimport { collectPairingPendingIssues } from '../../../../channels/pairing/pairing-service.js';\nimport { loadConfig } from '../../../../config/loader.js';\nimport type { Config } from '../../../../config/schema.js';\nimport type { CheckResult, DoctorContext } from '../types.js';\n\nfunction hasEnabledChannel(cfg: Config): boolean {\n return Object.values(cfg.channels ?? {}).some((value) => {\n return typeof value === 'object' && value !== null && !Array.isArray(value) && (value as { enabled?: unknown }).enabled === true;\n });\n}\n\nexport async function checkChannelPairingPending(ctx: DoctorContext): Promise<CheckResult> {\n if (!existsSync(ctx.configPath)) {\n return {\n id: 'channel-pairing-pending',\n label: 'Channel pairing',\n status: 'skip',\n message: 'No config file; skipped.',\n hints: [],\n };\n }\n\n let cfg: Config;\n try {\n cfg = loadConfig(ctx.configPath);\n } catch {\n return {\n id: 'channel-pairing-pending',\n label: 'Channel pairing',\n status: 'skip',\n message: 'Config could not be loaded; skipped.',\n hints: [],\n };\n }\n\n if (!hasEnabledChannel(cfg)) {\n return {\n id: 'channel-pairing-pending',\n label: 'Channel pairing',\n status: 'skip',\n message: 'No channels enabled; skipped.',\n hints: [],\n };\n }\n\n const issues = collectPairingPendingIssues(cfg);\n if (issues.length === 0) {\n return {\n id: 'channel-pairing-pending',\n label: 'Channel pairing',\n status: 'pass',\n message: 'No pending DM pairing requests.',\n hints: [],\n };\n }\n\n const totalPending = issues.reduce((n, i) => n + i.pending, 0);\n const totalStale = issues.reduce((n, i) => n + i.stale, 0);\n const atCapacity = issues.filter((i) => i.atCapacity);\n\n const parts: string[] = [\n `${totalPending} pending pairing request(s) across enabled channels.`,\n ];\n if (totalStale > 0) {\n parts.push(`${totalStale} pending over 30 minutes (codes expire after 1 hour).`);\n }\n if (atCapacity.length > 0) {\n parts.push(\n `${atCapacity.length} account(s) at the pending limit — approve or wait for expiry before new users can request codes.`,\n );\n }\n\n const hints = [\n 'Approve in the gateway console under Settings → Channels, or run: xopc channels pairing approve <id> <CODE>',\n ];\n if (totalStale > 0) {\n hints.push('Stale requests may expire soon; ask users to send a fresh DM if approval fails.');\n }\n\n return {\n id: 'channel-pairing-pending',\n label: 'Channel pairing',\n status: 'warn',\n message: parts.join(' '),\n hints,\n };\n}\n"],"mappings":";;;;aAG0D;AAI1D,SAAS,kBAAkB,KAAsB;AAC/C,QAAO,OAAO,OAAO,IAAI,YAAY,EAAE,CAAC,CAAC,MAAM,UAAU;AACvD,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,MAAM,IAAK,MAAgC,YAAY;GAC5H;;AAGJ,eAAsB,2BAA2B,KAA0C;AACzF,KAAI,CAAC,WAAW,IAAI,WAAW,CAC7B,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS;EACT,OAAO,EAAE;EACV;CAGH,IAAI;AACJ,KAAI;AACF,QAAM,WAAW,IAAI,WAAW;SAC1B;AACN,SAAO;GACL,IAAI;GACJ,OAAO;GACP,QAAQ;GACR,SAAS;GACT,OAAO,EAAE;GACV;;AAGH,KAAI,CAAC,kBAAkB,IAAI,CACzB,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS;EACT,OAAO,EAAE;EACV;CAGH,MAAM,SAAS,4BAA4B,IAAI;AAC/C,KAAI,OAAO,WAAW,EACpB,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS;EACT,OAAO,EAAE;EACV;CAGH,MAAM,eAAe,OAAO,QAAQ,GAAG,MAAM,IAAI,EAAE,SAAS,EAAE;CAC9D,MAAM,aAAa,OAAO,QAAQ,GAAG,MAAM,IAAI,EAAE,OAAO,EAAE;CAC1D,MAAM,aAAa,OAAO,QAAQ,MAAM,EAAE,WAAW;CAErD,MAAM,QAAkB,CACtB,GAAG,aAAa,sDACjB;AACD,KAAI,aAAa,EACf,OAAM,KAAK,GAAG,WAAW,uDAAuD;AAElF,KAAI,WAAW,SAAS,EACtB,OAAM,KACJ,GAAG,WAAW,OAAO,mGACtB;CAGH,MAAM,QAAQ,CACZ,8GACD;AACD,KAAI,aAAa,EACf,OAAM,KAAK,kFAAkF;AAG/F,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS,MAAM,KAAK,IAAI;EACxB;EACD"}
@@ -1,5 +1,5 @@
1
1
  import { init_loader, loadConfig } from "../../../../config/loader.js";
2
- import { bundledChannelPlugins } from "../../../../generated/bundled-channel-plugins.js";
2
+ import { listChannelPlugins } from "../../../../channels/plugins/registry.js";
3
3
  import { existsSync } from "node:fs";
4
4
  //#region src/cli/commands/doctor/checks/channel-plugins.ts
5
5
  init_loader();
@@ -22,7 +22,7 @@ async function checkChannelPlugins(ctx) {
22
22
  return [];
23
23
  }
24
24
  const out = [];
25
- for (const plugin of bundledChannelPlugins) {
25
+ for (const plugin of listChannelPlugins()) {
26
26
  const doctor = plugin.doctor;
27
27
  if (!doctor?.check) continue;
28
28
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"channel-plugins.js","names":[],"sources":["../../../../../../src/cli/commands/doctor/checks/channel-plugins.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\n\nimport type { CheckResult, DoctorContext } from '../types.js';\nimport { loadConfig } from '../../../../config/loader.js';\nimport { bundledChannelPlugins } from '../../../../generated/bundled-channel-plugins.js';\nimport type { ChannelDoctorCheckResult, ChannelPlugin } from '../../../../channels/plugin-types.js';\n\nfunction toCheckResults(plugin: ChannelPlugin, raw: ChannelDoctorCheckResult[]): CheckResult[] {\n const pid = String(plugin.id);\n return raw.map((r) => ({\n id: `channel:${pid}:${r.id}`,\n label: `${pid}: ${r.label}`,\n status: r.status,\n message: r.message,\n hints: r.hints,\n }));\n}\n\nexport async function checkChannelPlugins(ctx: DoctorContext): Promise<CheckResult[]> {\n if (!existsSync(ctx.configPath)) {\n return [];\n }\n\n let cfg;\n try {\n cfg = loadConfig(ctx.configPath);\n } catch {\n return [];\n }\n\n const out: CheckResult[] = [];\n for (const plugin of bundledChannelPlugins) {\n const doctor = plugin.doctor;\n if (!doctor?.check) continue;\n try {\n const res = await doctor.check({ cfg });\n out.push(...toCheckResults(plugin, res));\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n out.push({\n id: `channel:${plugin.id}:error`,\n label: `${String(plugin.id)}: doctor`,\n status: 'warn',\n message: `Channel doctor check failed: ${msg}`,\n hints: [],\n });\n }\n }\n return out;\n}\n"],"mappings":";;;;aAG0D;AAI1D,SAAS,eAAe,QAAuB,KAAgD;CAC7F,MAAM,MAAM,OAAO,OAAO,GAAG;AAC7B,QAAO,IAAI,KAAK,OAAO;EACrB,IAAI,WAAW,IAAI,GAAG,EAAE;EACxB,OAAO,GAAG,IAAI,IAAI,EAAE;EACpB,QAAQ,EAAE;EACV,SAAS,EAAE;EACX,OAAO,EAAE;EACV,EAAE;;AAGL,eAAsB,oBAAoB,KAA4C;AACpF,KAAI,CAAC,WAAW,IAAI,WAAW,CAC7B,QAAO,EAAE;CAGX,IAAI;AACJ,KAAI;AACF,QAAM,WAAW,IAAI,WAAW;SAC1B;AACN,SAAO,EAAE;;CAGX,MAAM,MAAqB,EAAE;AAC7B,MAAK,MAAM,UAAU,uBAAuB;EAC1C,MAAM,SAAS,OAAO;AACtB,MAAI,CAAC,QAAQ,MAAO;AACpB,MAAI;GACF,MAAM,MAAM,MAAM,OAAO,MAAM,EAAE,KAAK,CAAC;AACvC,OAAI,KAAK,GAAG,eAAe,QAAQ,IAAI,CAAC;WACjC,GAAG;GACV,MAAM,MAAM,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE;AACtD,OAAI,KAAK;IACP,IAAI,WAAW,OAAO,GAAG;IACzB,OAAO,GAAG,OAAO,OAAO,GAAG,CAAC;IAC5B,QAAQ;IACR,SAAS,gCAAgC;IACzC,OAAO,EAAE;IACV,CAAC;;;AAGN,QAAO"}
1
+ {"version":3,"file":"channel-plugins.js","names":[],"sources":["../../../../../../src/cli/commands/doctor/checks/channel-plugins.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\n\nimport type { CheckResult, DoctorContext } from '../types.js';\nimport { loadConfig } from '../../../../config/loader.js';\nimport { listChannelPlugins } from '../../../../channels/plugins/registry.js';\nimport type { ChannelDoctorCheckResult, ChannelPlugin } from '../../../../channels/plugin-types.js';\n\nfunction toCheckResults(plugin: ChannelPlugin, raw: ChannelDoctorCheckResult[]): CheckResult[] {\n const pid = String(plugin.id);\n return raw.map((r) => ({\n id: `channel:${pid}:${r.id}`,\n label: `${pid}: ${r.label}`,\n status: r.status,\n message: r.message,\n hints: r.hints,\n }));\n}\n\nexport async function checkChannelPlugins(ctx: DoctorContext): Promise<CheckResult[]> {\n if (!existsSync(ctx.configPath)) {\n return [];\n }\n\n let cfg;\n try {\n cfg = loadConfig(ctx.configPath);\n } catch {\n return [];\n }\n\n const out: CheckResult[] = [];\n for (const plugin of listChannelPlugins()) {\n const doctor = plugin.doctor;\n if (!doctor?.check) continue;\n try {\n const res = await doctor.check({ cfg });\n out.push(...toCheckResults(plugin, res));\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n out.push({\n id: `channel:${plugin.id}:error`,\n label: `${String(plugin.id)}: doctor`,\n status: 'warn',\n message: `Channel doctor check failed: ${msg}`,\n hints: [],\n });\n }\n }\n return out;\n}\n"],"mappings":";;;;aAG0D;AAI1D,SAAS,eAAe,QAAuB,KAAgD;CAC7F,MAAM,MAAM,OAAO,OAAO,GAAG;AAC7B,QAAO,IAAI,KAAK,OAAO;EACrB,IAAI,WAAW,IAAI,GAAG,EAAE;EACxB,OAAO,GAAG,IAAI,IAAI,EAAE;EACpB,QAAQ,EAAE;EACV,SAAS,EAAE;EACX,OAAO,EAAE;EACV,EAAE;;AAGL,eAAsB,oBAAoB,KAA4C;AACpF,KAAI,CAAC,WAAW,IAAI,WAAW,CAC7B,QAAO,EAAE;CAGX,IAAI;AACJ,KAAI;AACF,QAAM,WAAW,IAAI,WAAW;SAC1B;AACN,SAAO,EAAE;;CAGX,MAAM,MAAqB,EAAE;AAC7B,MAAK,MAAM,UAAU,oBAAoB,EAAE;EACzC,MAAM,SAAS,OAAO;AACtB,MAAI,CAAC,QAAQ,MAAO;AACpB,MAAI;GACF,MAAM,MAAM,MAAM,OAAO,MAAM,EAAE,KAAK,CAAC;AACvC,OAAI,KAAK,GAAG,eAAe,QAAQ,IAAI,CAAC;WACjC,GAAG;GACV,MAAM,MAAM,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE;AACtD,OAAI,KAAK;IACP,IAAI,WAAW,OAAO,GAAG;IACzB,OAAO,GAAG,OAAO,OAAO,GAAG,CAAC;IAC5B,QAAQ;IACR,SAAS,gCAAgC;IACzC,OAAO,EAAE;IACV,CAAC;;;AAGN,QAAO"}
@@ -52,7 +52,7 @@ async function checkDatabaseSchema(ctx) {
52
52
  id: "database-schema",
53
53
  label: "Database schema",
54
54
  status: "pass",
55
- message: `SQLite schema v${status.dbVersion} (current release v3).`,
55
+ message: `SQLite schema v${status.dbVersion} (current release v5).`,
56
56
  hints: []
57
57
  };
58
58
  }
@@ -14,18 +14,22 @@ function collectProviderIdsFromConfig(cfg) {
14
14
  if (parsed) ids.add(parsed.provider.toLowerCase());
15
15
  };
16
16
  addRef(getAgentDefaultModelRef(cfg));
17
- const raw = cfg.agents?.defaults?.model;
18
- if (raw && typeof raw === "object" && "fallbacks" in raw && Array.isArray(raw.fallbacks)) for (const f of raw.fallbacks) addRef(typeof f === "string" ? f : void 0);
17
+ const addModelConfig = (raw) => {
18
+ addRef(raw?.primary);
19
+ if (Array.isArray(raw?.fallbacks)) for (const f of raw.fallbacks) addRef(typeof f === "string" ? f : void 0);
20
+ };
21
+ const addRoles = (roles) => {
22
+ for (const role of Object.values(roles ?? {})) addRef(role.model);
23
+ };
24
+ addModelConfig(cfg.agents?.defaults?.models?.chat);
25
+ addRoles(cfg.agents?.defaults?.models?.roles);
19
26
  const list = cfg.agents?.list;
20
27
  if (Array.isArray(list)) for (const e of list) {
21
- const m = e?.model;
22
- if (typeof m === "string") addRef(m);
23
- else if (m && typeof m === "object" && "primary" in m) {
24
- addRef(typeof m.primary === "string" ? m.primary : void 0);
25
- const fb = m.fallbacks;
26
- if (Array.isArray(fb)) for (const f of fb) addRef(f);
27
- }
28
+ addModelConfig(e?.models?.chat);
29
+ addRoles(e?.models?.roles);
28
30
  }
31
+ const raw = cfg.agents?.defaults?.imageModel;
32
+ if (raw && typeof raw === "object" && "fallbacks" in raw && Array.isArray(raw.fallbacks)) for (const f of raw.fallbacks) addRef(typeof f === "string" ? f : void 0);
29
33
  const img = cfg.agents?.defaults?.imageModel;
30
34
  if (typeof img === "string") addRef(img);
31
35
  else if (img && typeof img === "object" && "primary" in img) addRef(typeof img.primary === "string" ? img.primary : void 0);
@@ -1 +1 @@
1
- {"version":3,"file":"provider-auth.js","names":[],"sources":["../../../../../../src/cli/commands/doctor/checks/provider-auth.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\n\nimport { loadConfig } from '../../../../config/loader.js';\nimport type { Config } from '../../../../config/schema.js';\nimport { parseModelRef, getAgentDefaultModelRef } from '../../../../config/schema.js';\nimport { getApiKeyFromEnv, PROVIDER_ENV_MAP } from '../../../../providers/env-keys.js';\nimport type { CheckResult, DoctorContext } from '../types.js';\n\nfunction collectProviderIdsFromConfig(cfg: Config): Set<string> {\n const ids = new Set<string>();\n\n const addRef = (ref: string | undefined) => {\n if (!ref?.trim()) return;\n const parsed = parseModelRef(ref.trim());\n if (parsed) ids.add(parsed.provider.toLowerCase());\n };\n\n addRef(getAgentDefaultModelRef(cfg));\n\n const raw = cfg.agents?.defaults?.model;\n if (raw && typeof raw === 'object' && 'fallbacks' in raw && Array.isArray(raw.fallbacks)) {\n for (const f of raw.fallbacks) {\n addRef(typeof f === 'string' ? f : undefined);\n }\n }\n\n const list = cfg.agents?.list;\n if (Array.isArray(list)) {\n for (const e of list) {\n const m = e?.model;\n if (typeof m === 'string') addRef(m);\n else if (m && typeof m === 'object' && 'primary' in m) {\n addRef(typeof m.primary === 'string' ? m.primary : undefined);\n const fb = (m as { fallbacks?: string[] }).fallbacks;\n if (Array.isArray(fb)) {\n for (const f of fb) addRef(f);\n }\n }\n }\n }\n\n const img = cfg.agents?.defaults?.imageModel;\n if (typeof img === 'string') addRef(img);\n else if (img && typeof img === 'object' && 'primary' in img) {\n addRef(typeof img.primary === 'string' ? img.primary : undefined);\n }\n\n const ss = cfg.agents?.defaults?.sessionSearch?.summaryModel;\n if (typeof ss === 'string') addRef(ss);\n\n return ids;\n}\n\nfunction anyProviderEnvPresent(): boolean {\n for (const vars of Object.values(PROVIDER_ENV_MAP)) {\n for (const v of vars) {\n if (process.env[v]?.trim()) return true;\n }\n }\n for (const [k, val] of Object.entries(process.env)) {\n if (!val?.trim()) continue;\n if (k.endsWith('_API_KEY') || k.endsWith('_TOKEN')) return true;\n }\n return false;\n}\n\nexport async function checkProviderAuth(ctx: DoctorContext): Promise<CheckResult> {\n if (!existsSync(ctx.configPath)) {\n return {\n id: 'provider-auth',\n label: 'Provider auth',\n status: 'skip',\n message: 'No config file; skipped.',\n hints: [],\n };\n }\n\n let cfg: Config;\n try {\n cfg = loadConfig(ctx.configPath);\n } catch {\n return {\n id: 'provider-auth',\n label: 'Provider auth',\n status: 'skip',\n message: 'Config could not be loaded; skipped.',\n hints: [],\n };\n }\n\n const fromConfig = collectProviderIdsFromConfig(cfg);\n const checkIds = fromConfig.size > 0 ? [...fromConfig] : Object.keys(PROVIDER_ENV_MAP);\n\n for (const id of checkIds) {\n const key = getApiKeyFromEnv(id);\n if (key?.trim()) {\n return {\n id: 'provider-auth',\n label: 'Provider auth',\n status: 'pass',\n message: 'At least one LLM provider API key is available.',\n hints: [],\n };\n }\n }\n\n if (anyProviderEnvPresent()) {\n return {\n id: 'provider-auth',\n label: 'Provider auth',\n status: 'pass',\n message: 'Environment contains provider credentials.',\n hints: [],\n };\n }\n\n return {\n id: 'provider-auth',\n label: 'Provider auth',\n status: 'warn',\n message: 'No API keys detected for configured providers.',\n hints: ['Set keys via: xopc auth set <provider> <key>', 'Or export the provider env vars from the pi-ai docs.'],\n };\n}\n"],"mappings":";;;;;aAE0D;aAE4B;eACC;AAGvF,SAAS,6BAA6B,KAA0B;CAC9D,MAAM,sBAAM,IAAI,KAAa;CAE7B,MAAM,UAAU,QAA4B;AAC1C,MAAI,CAAC,KAAK,MAAM,CAAE;EAClB,MAAM,SAAS,cAAc,IAAI,MAAM,CAAC;AACxC,MAAI,OAAQ,KAAI,IAAI,OAAO,SAAS,aAAa,CAAC;;AAGpD,QAAO,wBAAwB,IAAI,CAAC;CAEpC,MAAM,MAAM,IAAI,QAAQ,UAAU;AAClC,KAAI,OAAO,OAAO,QAAQ,YAAY,eAAe,OAAO,MAAM,QAAQ,IAAI,UAAU,CACtF,MAAK,MAAM,KAAK,IAAI,UAClB,QAAO,OAAO,MAAM,WAAW,IAAI,KAAA,EAAU;CAIjD,MAAM,OAAO,IAAI,QAAQ;AACzB,KAAI,MAAM,QAAQ,KAAK,CACrB,MAAK,MAAM,KAAK,MAAM;EACpB,MAAM,IAAI,GAAG;AACb,MAAI,OAAO,MAAM,SAAU,QAAO,EAAE;WAC3B,KAAK,OAAO,MAAM,YAAY,aAAa,GAAG;AACrD,UAAO,OAAO,EAAE,YAAY,WAAW,EAAE,UAAU,KAAA,EAAU;GAC7D,MAAM,KAAM,EAA+B;AAC3C,OAAI,MAAM,QAAQ,GAAG,CACnB,MAAK,MAAM,KAAK,GAAI,QAAO,EAAE;;;CAMrC,MAAM,MAAM,IAAI,QAAQ,UAAU;AAClC,KAAI,OAAO,QAAQ,SAAU,QAAO,IAAI;UAC/B,OAAO,OAAO,QAAQ,YAAY,aAAa,IACtD,QAAO,OAAO,IAAI,YAAY,WAAW,IAAI,UAAU,KAAA,EAAU;CAGnE,MAAM,KAAK,IAAI,QAAQ,UAAU,eAAe;AAChD,KAAI,OAAO,OAAO,SAAU,QAAO,GAAG;AAEtC,QAAO;;AAGT,SAAS,wBAAiC;AACxC,MAAK,MAAM,QAAQ,OAAO,OAAO,iBAAiB,CAChD,MAAK,MAAM,KAAK,KACd,KAAI,QAAQ,IAAI,IAAI,MAAM,CAAE,QAAO;AAGvC,MAAK,MAAM,CAAC,GAAG,QAAQ,OAAO,QAAQ,QAAQ,IAAI,EAAE;AAClD,MAAI,CAAC,KAAK,MAAM,CAAE;AAClB,MAAI,EAAE,SAAS,WAAW,IAAI,EAAE,SAAS,SAAS,CAAE,QAAO;;AAE7D,QAAO;;AAGT,eAAsB,kBAAkB,KAA0C;AAChF,KAAI,CAAC,WAAW,IAAI,WAAW,CAC7B,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS;EACT,OAAO,EAAE;EACV;CAGH,IAAI;AACJ,KAAI;AACF,QAAM,WAAW,IAAI,WAAW;SAC1B;AACN,SAAO;GACL,IAAI;GACJ,OAAO;GACP,QAAQ;GACR,SAAS;GACT,OAAO,EAAE;GACV;;CAGH,MAAM,aAAa,6BAA6B,IAAI;CACpD,MAAM,WAAW,WAAW,OAAO,IAAI,CAAC,GAAG,WAAW,GAAG,OAAO,KAAK,iBAAiB;AAEtF,MAAK,MAAM,MAAM,SAEf,KADY,iBAAiB,GACtB,EAAE,MAAM,CACb,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS;EACT,OAAO,EAAE;EACV;AAIL,KAAI,uBAAuB,CACzB,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS;EACT,OAAO,EAAE;EACV;AAGH,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS;EACT,OAAO,CAAC,gDAAgD,uDAAuD;EAChH"}
1
+ {"version":3,"file":"provider-auth.js","names":[],"sources":["../../../../../../src/cli/commands/doctor/checks/provider-auth.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\n\nimport { loadConfig } from '../../../../config/loader.js';\nimport type { Config } from '../../../../config/schema.js';\nimport { parseModelRef, getAgentDefaultModelRef } from '../../../../config/schema.js';\nimport { getApiKeyFromEnv, PROVIDER_ENV_MAP } from '../../../../providers/env-keys.js';\nimport type { CheckResult, DoctorContext } from '../types.js';\n\nfunction collectProviderIdsFromConfig(cfg: Config): Set<string> {\n const ids = new Set<string>();\n\n const addRef = (ref: string | undefined) => {\n if (!ref?.trim()) return;\n const parsed = parseModelRef(ref.trim());\n if (parsed) ids.add(parsed.provider.toLowerCase());\n };\n\n addRef(getAgentDefaultModelRef(cfg));\n\n const addModelConfig = (raw: { primary?: string; fallbacks?: string[] } | undefined) => {\n addRef(raw?.primary);\n if (Array.isArray(raw?.fallbacks)) {\n for (const f of raw.fallbacks) {\n addRef(typeof f === 'string' ? f : undefined);\n }\n }\n };\n const addRoles = (roles: Record<string, { model?: string }> | undefined) => {\n for (const role of Object.values(roles ?? {})) {\n addRef(role.model);\n }\n };\n\n addModelConfig(cfg.agents?.defaults?.models?.chat);\n addRoles(cfg.agents?.defaults?.models?.roles);\n\n const list = cfg.agents?.list;\n if (Array.isArray(list)) {\n for (const e of list) {\n addModelConfig(e?.models?.chat);\n addRoles(e?.models?.roles);\n }\n }\n\n const raw = cfg.agents?.defaults?.imageModel;\n if (raw && typeof raw === 'object' && 'fallbacks' in raw && Array.isArray(raw.fallbacks)) {\n for (const f of raw.fallbacks) {\n addRef(typeof f === 'string' ? f : undefined);\n }\n }\n\n const img = cfg.agents?.defaults?.imageModel;\n if (typeof img === 'string') addRef(img);\n else if (img && typeof img === 'object' && 'primary' in img) {\n addRef(typeof img.primary === 'string' ? img.primary : undefined);\n }\n\n const ss = cfg.agents?.defaults?.sessionSearch?.summaryModel;\n if (typeof ss === 'string') addRef(ss);\n\n return ids;\n}\n\nfunction anyProviderEnvPresent(): boolean {\n for (const vars of Object.values(PROVIDER_ENV_MAP)) {\n for (const v of vars) {\n if (process.env[v]?.trim()) return true;\n }\n }\n for (const [k, val] of Object.entries(process.env)) {\n if (!val?.trim()) continue;\n if (k.endsWith('_API_KEY') || k.endsWith('_TOKEN')) return true;\n }\n return false;\n}\n\nexport async function checkProviderAuth(ctx: DoctorContext): Promise<CheckResult> {\n if (!existsSync(ctx.configPath)) {\n return {\n id: 'provider-auth',\n label: 'Provider auth',\n status: 'skip',\n message: 'No config file; skipped.',\n hints: [],\n };\n }\n\n let cfg: Config;\n try {\n cfg = loadConfig(ctx.configPath);\n } catch {\n return {\n id: 'provider-auth',\n label: 'Provider auth',\n status: 'skip',\n message: 'Config could not be loaded; skipped.',\n hints: [],\n };\n }\n\n const fromConfig = collectProviderIdsFromConfig(cfg);\n const checkIds = fromConfig.size > 0 ? [...fromConfig] : Object.keys(PROVIDER_ENV_MAP);\n\n for (const id of checkIds) {\n const key = getApiKeyFromEnv(id);\n if (key?.trim()) {\n return {\n id: 'provider-auth',\n label: 'Provider auth',\n status: 'pass',\n message: 'At least one LLM provider API key is available.',\n hints: [],\n };\n }\n }\n\n if (anyProviderEnvPresent()) {\n return {\n id: 'provider-auth',\n label: 'Provider auth',\n status: 'pass',\n message: 'Environment contains provider credentials.',\n hints: [],\n };\n }\n\n return {\n id: 'provider-auth',\n label: 'Provider auth',\n status: 'warn',\n message: 'No API keys detected for configured providers.',\n hints: ['Set keys via: xopc auth set <provider> <key>', 'Or export the provider env vars from the pi-ai docs.'],\n };\n}\n"],"mappings":";;;;;aAE0D;aAE4B;eACC;AAGvF,SAAS,6BAA6B,KAA0B;CAC9D,MAAM,sBAAM,IAAI,KAAa;CAE7B,MAAM,UAAU,QAA4B;AAC1C,MAAI,CAAC,KAAK,MAAM,CAAE;EAClB,MAAM,SAAS,cAAc,IAAI,MAAM,CAAC;AACxC,MAAI,OAAQ,KAAI,IAAI,OAAO,SAAS,aAAa,CAAC;;AAGpD,QAAO,wBAAwB,IAAI,CAAC;CAEpC,MAAM,kBAAkB,QAAgE;AACtF,SAAO,KAAK,QAAQ;AACpB,MAAI,MAAM,QAAQ,KAAK,UAAU,CAC/B,MAAK,MAAM,KAAK,IAAI,UAClB,QAAO,OAAO,MAAM,WAAW,IAAI,KAAA,EAAU;;CAInD,MAAM,YAAY,UAA0D;AAC1E,OAAK,MAAM,QAAQ,OAAO,OAAO,SAAS,EAAE,CAAC,CAC3C,QAAO,KAAK,MAAM;;AAItB,gBAAe,IAAI,QAAQ,UAAU,QAAQ,KAAK;AAClD,UAAS,IAAI,QAAQ,UAAU,QAAQ,MAAM;CAE7C,MAAM,OAAO,IAAI,QAAQ;AACzB,KAAI,MAAM,QAAQ,KAAK,CACrB,MAAK,MAAM,KAAK,MAAM;AACpB,iBAAe,GAAG,QAAQ,KAAK;AAC/B,WAAS,GAAG,QAAQ,MAAM;;CAI9B,MAAM,MAAM,IAAI,QAAQ,UAAU;AAClC,KAAI,OAAO,OAAO,QAAQ,YAAY,eAAe,OAAO,MAAM,QAAQ,IAAI,UAAU,CACtF,MAAK,MAAM,KAAK,IAAI,UAClB,QAAO,OAAO,MAAM,WAAW,IAAI,KAAA,EAAU;CAIjD,MAAM,MAAM,IAAI,QAAQ,UAAU;AAClC,KAAI,OAAO,QAAQ,SAAU,QAAO,IAAI;UAC/B,OAAO,OAAO,QAAQ,YAAY,aAAa,IACtD,QAAO,OAAO,IAAI,YAAY,WAAW,IAAI,UAAU,KAAA,EAAU;CAGnE,MAAM,KAAK,IAAI,QAAQ,UAAU,eAAe;AAChD,KAAI,OAAO,OAAO,SAAU,QAAO,GAAG;AAEtC,QAAO;;AAGT,SAAS,wBAAiC;AACxC,MAAK,MAAM,QAAQ,OAAO,OAAO,iBAAiB,CAChD,MAAK,MAAM,KAAK,KACd,KAAI,QAAQ,IAAI,IAAI,MAAM,CAAE,QAAO;AAGvC,MAAK,MAAM,CAAC,GAAG,QAAQ,OAAO,QAAQ,QAAQ,IAAI,EAAE;AAClD,MAAI,CAAC,KAAK,MAAM,CAAE;AAClB,MAAI,EAAE,SAAS,WAAW,IAAI,EAAE,SAAS,SAAS,CAAE,QAAO;;AAE7D,QAAO;;AAGT,eAAsB,kBAAkB,KAA0C;AAChF,KAAI,CAAC,WAAW,IAAI,WAAW,CAC7B,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS;EACT,OAAO,EAAE;EACV;CAGH,IAAI;AACJ,KAAI;AACF,QAAM,WAAW,IAAI,WAAW;SAC1B;AACN,SAAO;GACL,IAAI;GACJ,OAAO;GACP,QAAQ;GACR,SAAS;GACT,OAAO,EAAE;GACV;;CAGH,MAAM,aAAa,6BAA6B,IAAI;CACpD,MAAM,WAAW,WAAW,OAAO,IAAI,CAAC,GAAG,WAAW,GAAG,OAAO,KAAK,iBAAiB;AAEtF,MAAK,MAAM,MAAM,SAEf,KADY,iBAAiB,GACtB,EAAE,MAAM,CACb,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS;EACT,OAAO,EAAE;EACV;AAIL,KAAI,uBAAuB,CACzB,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS;EACT,OAAO,EAAE;EACV;AAGH,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS;EACT,OAAO,CAAC,gDAAgD,uDAAuD;EAChH"}
@@ -2,8 +2,8 @@ import { PACKAGE_VERSION, init_package_version } from "../../package-version.js"
2
2
  import { createLogger } from "../../utils/logger/index.js";
3
3
  import { init_logger } from "../../utils/logger.js";
4
4
  import { init_paths, resolveConfigPath, resolveExtensionsDir } from "../../config/paths.js";
5
+ import { init_normalize_manifest, normalizeExtensionManifest } from "../../extensions/normalize-manifest.js";
5
6
  import { init_loader, loadConfig } from "../../config/loader.js";
6
- import { normalizeExtensionManifest } from "../../extensions/normalize-manifest.js";
7
7
  import { checkEngineCompatibility } from "../../extensions/engine-check.js";
8
8
  import { getContextWithOpts } from "../context.js";
9
9
  import { seedMainAgentProfileMarkdown } from "../../agent/context/workspace-seed.js";
@@ -18,6 +18,7 @@ import { Command } from "commander";
18
18
  //#region src/cli/commands/extension-dev.ts
19
19
  init_loader();
20
20
  init_paths();
21
+ init_normalize_manifest();
21
22
  init_package_version();
22
23
  init_logger();
23
24
  const log = createLogger("ExtensionDev");
@@ -1 +1 @@
1
- {"version":3,"file":"extension-dev.js","names":[],"sources":["../../../../src/cli/commands/extension-dev.ts"],"sourcesContent":["import {\n existsSync,\n mkdirSync,\n readFileSync,\n symlinkSync,\n unlinkSync,\n watch,\n type FSWatcher,\n} from 'node:fs';\nimport { join, resolve } from 'node:path';\n\nimport { Command } from 'commander';\n\nimport { loadConfig } from '../../config/loader.js';\nimport { resolveConfigPath, resolveExtensionsDir } from '../../config/paths.js';\nimport { checkEngineCompatibility } from '../../extensions/engine-check.js';\nimport type { ExtensionManifest } from '../../extensions/types/index.js';\nimport { normalizeExtensionManifest } from '../../extensions/normalize-manifest.js';\nimport { GatewayServer } from '../../gateway/index.js';\nimport { runGatewayLoop } from '../../gateway/run-loop.js';\nimport { PACKAGE_VERSION } from '../../package-version.js';\nimport { createLogger } from '../../utils/logger.js';\nimport { colors } from '../utils/colors.js';\nimport { getContextWithOpts } from '../context.js';\nimport { initWorkspace } from '../utils/init-workspace.js';\nimport { seedMainAgentProfileMarkdown } from '../../agent/context/workspace-seed.js';\n\nconst log = createLogger('ExtensionDev');\nconst MANIFEST = 'xopc.extension.json';\n\nfunction isRecord(x: unknown): x is Record<string, unknown> {\n return typeof x === 'object' && x !== null && !Array.isArray(x);\n}\n\nasync function ensureGatewayReady(\n configPath: string,\n workspacePath: string,\n gatewayPort: number,\n): Promise<void> {\n const result = await initWorkspace({\n configPath,\n workspacePath,\n gatewayPort,\n });\n\n if (result.configCreated || result.workspaceCreated) {\n console.log('');\n console.log('👋 First-time setup before starting the gateway...');\n console.log('');\n console.log('✅ Setup complete.');\n console.log(` Config: ${configPath}`);\n console.log(` Workspace: ${workspacePath}`);\n console.log('');\n seedMainAgentProfileMarkdown(result.config);\n }\n}\n\nfunction loadAndValidateManifest(extensionDir: string): ExtensionManifest | null {\n const manifestPath = join(extensionDir, MANIFEST);\n if (!existsSync(manifestPath)) {\n console.error(colors.red('error:'), `Missing ${MANIFEST} in ${extensionDir}`);\n return null;\n }\n try {\n const raw = JSON.parse(readFileSync(manifestPath, 'utf-8') as string) as unknown;\n if (!isRecord(raw)) {\n console.error(colors.red('error:'), 'Manifest must be a JSON object');\n return null;\n }\n const manifest = normalizeExtensionManifest(raw);\n if (!manifest.id?.trim()) {\n console.error(colors.red('error:'), 'Manifest \"id\" is required');\n return null;\n }\n if (manifest.engines?.xopc) {\n const r = checkEngineCompatibility(PACKAGE_VERSION, manifest.engines.xopc);\n if (r.parseWarning) {\n console.log(\n colors.yellow('warning:'),\n r.reason ?? 'engines.xopc could not be fully parsed — continuing',\n );\n } else if (!r.compatible) {\n console.log(\n colors.yellow('warning:'),\n r.reason ?? `engines.xopc may not match xopc ${PACKAGE_VERSION} — continuing`,\n );\n }\n }\n return manifest;\n } catch (e) {\n log.error({ err: e }, 'Failed to read manifest');\n console.error(\n colors.red('error:'),\n e instanceof Error ? e.message : String(e),\n );\n return null;\n }\n}\n\nfunction setupDevSymlink(extensionDir: string, extensionsDir: string, extensionId: string): string {\n mkdirSync(extensionsDir, { recursive: true });\n const symlinkPath = join(extensionsDir, extensionId);\n if (existsSync(symlinkPath)) {\n unlinkSync(symlinkPath);\n }\n symlinkSync(extensionDir, symlinkPath, 'dir');\n return symlinkPath;\n}\n\nfunction cleanupSymlink(symlinkPath: string | null): void {\n if (!symlinkPath) return;\n try {\n if (existsSync(symlinkPath)) {\n unlinkSync(symlinkPath);\n }\n } catch (e) {\n log.warn({ err: e, symlinkPath }, 'Failed to remove dev symlink');\n }\n}\n\nfunction shouldIgnorePath(relativePath: string): boolean {\n const parts = relativePath.split(/[/\\\\]/);\n if (parts.some((p) => p === 'node_modules')) return true;\n if (parts.some((p) => p.startsWith('.'))) return true;\n return false;\n}\n\nexport function createExtensionDevCommand(): Command {\n return new Command('dev')\n .description('Symlink an extension into the workspace for live development (optional file watch + gateway)')\n .argument('[dir]', 'Extension directory (default: current working directory)', '.')\n .option('--port <number>', 'Gateway port', '18790')\n .option('--bind <mode>', 'Gateway bind mode', 'loopback')\n .option('--no-gateway', 'Do not start the gateway (symlink only)')\n .option('--no-watch', 'Do not watch files for changes')\n .action(\n async (\n dir: string,\n options: { port: string; bind: string; gateway: boolean; watch: boolean },\n ) => {\n const extensionDir = resolve(dir || '.');\n const manifest = loadAndValidateManifest(extensionDir);\n if (!manifest) {\n process.exit(1);\n }\n\n const ctx = getContextWithOpts();\n loadConfig(ctx.configPath);\n const extensionsDir = resolveExtensionsDir();\n const symlinkPath = setupDevSymlink(extensionDir, extensionsDir, manifest.id);\n\n console.log(\n colors.green('✓'),\n `Dev symlink: ${symlinkPath} → ${extensionDir}`,\n );\n console.log(\n colors.cyan('Note:'),\n 'restart the gateway or trigger config hot-reload so the extension reload picks up changes.',\n );\n\n let debounce: ReturnType<typeof setTimeout> | null = null;\n let watcher: FSWatcher | null = null;\n\n if (options.watch) {\n try {\n watcher = watch(\n extensionDir,\n { recursive: true },\n (_event, filename) => {\n const rel = filename ? String(filename) : '';\n if (rel && shouldIgnorePath(rel)) return;\n if (debounce) clearTimeout(debounce);\n debounce = setTimeout(() => {\n const label = rel || '(unknown)';\n if (/(^|[\\\\/])xopc\\.extension\\.json$/.test(rel) || rel === MANIFEST) {\n console.log(colors.cyan('[watch]'), `manifest: ${label}`);\n } else if (/\\.(html?|css|mjs|js|tsx?|jsx|json)$/i.test(label)) {\n if (/^ui[\\\\/]/.test(rel) || /[\\\\/]ui[\\\\/]/.test(label)) {\n console.log(colors.cyan('[watch]'), `ui: ${label}`);\n } else {\n console.log(colors.cyan('[watch]'), `source: ${label}`);\n }\n } else {\n console.log(colors.cyan('[watch]'), `changed: ${label}`);\n }\n }, 300);\n },\n );\n } catch (e) {\n log.warn({ err: e }, 'fs.watch failed; continuing without watch');\n }\n }\n\n let cleaned = false;\n const cleanup = () => {\n if (cleaned) return;\n cleaned = true;\n if (debounce) clearTimeout(debounce);\n if (watcher) {\n try {\n watcher.close();\n } catch (e) {\n log.warn({ err: e }, 'watcher close failed');\n }\n }\n cleanupSymlink(symlinkPath);\n };\n\n for (const sig of ['SIGINT', 'SIGTERM'] as const) {\n process.on(sig, () => {\n cleanup();\n process.exit(0);\n });\n }\n\n if (!options.gateway) {\n if (options.watch) {\n console.log(colors.cyan('Watching…'), 'Ctrl+C to stop and remove symlink');\n } else {\n console.log(\n colors.cyan('Holding process…'),\n 'Ctrl+C to stop and remove symlink (no file watch)',\n );\n }\n await new Promise(() => {\n /* until SIGINT / SIGTERM */\n });\n return;\n }\n\n const port = parseInt(options.port, 10);\n const bindModes = new Set(['auto', 'loopback', 'lan', 'tailnet', 'custom']);\n const bindRaw = options.bind.trim().toLowerCase();\n if (!bindModes.has(bindRaw)) {\n console.error(colors.red('error:'), 'Invalid --bind mode');\n cleanup();\n process.exit(1);\n }\n const bind = bindRaw as import('../../config/schema.js').GatewayBindMode;\n await ensureGatewayReady(ctx.configPath, ctx.workspacePath, port);\n const cfg = loadConfig(ctx.configPath);\n const { resolveGatewayListenPlan } = await import('../../gateway/listen.js');\n const listenPlan = resolveGatewayListenPlan({ cfg, bindOverride: bind });\n\n if (Number.isNaN(port)) {\n console.error(colors.red('error:'), 'Invalid --port');\n cleanup();\n process.exit(1);\n }\n\n console.log('🚀 Starting gateway (extension dev)…');\n console.log(` Bind: ${bind} (${listenPlan.bindHost})`);\n console.log(` Port: ${port}`);\n console.log('');\n\n try {\n await runGatewayLoop({\n configPath: ctx.configPath || resolveConfigPath(),\n port,\n start: async () => {\n const server = new GatewayServer({\n bindHost: listenPlan.bindHost,\n bind: listenPlan.bindMode,\n customBindHost: listenPlan.customBindHost,\n port,\n token: cfg?.gateway?.auth?.token,\n verbose: ctx.isVerbose,\n configPath: ctx.configPath,\n enableHotReload: true,\n });\n await server.start();\n const displayHost = listenPlan.bindHost === '0.0.0.0' ? 'localhost' : listenPlan.bindHost;\n const token = cfg?.gateway?.auth?.token;\n console.log('✅ Gateway started');\n console.log(` URL: http://${displayHost}:${port}`);\n if (token) {\n console.log(\n ` Token: ${String(token).slice(0, 8)}...${String(token).slice(-8)}`,\n );\n }\n console.log('');\n return server;\n },\n });\n } finally {\n cleanup();\n }\n },\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"extension-dev.js","names":[],"sources":["../../../../src/cli/commands/extension-dev.ts"],"sourcesContent":["import {\n existsSync,\n mkdirSync,\n readFileSync,\n symlinkSync,\n unlinkSync,\n watch,\n type FSWatcher,\n} from 'node:fs';\nimport { join, resolve } from 'node:path';\n\nimport { Command } from 'commander';\n\nimport { loadConfig } from '../../config/loader.js';\nimport { resolveConfigPath, resolveExtensionsDir } from '../../config/paths.js';\nimport { checkEngineCompatibility } from '../../extensions/engine-check.js';\nimport type { ExtensionManifest } from '../../extensions/types/index.js';\nimport { normalizeExtensionManifest } from '../../extensions/normalize-manifest.js';\nimport { GatewayServer } from '../../gateway/index.js';\nimport { runGatewayLoop } from '../../gateway/run-loop.js';\nimport { PACKAGE_VERSION } from '../../package-version.js';\nimport { createLogger } from '../../utils/logger.js';\nimport { colors } from '../utils/colors.js';\nimport { getContextWithOpts } from '../context.js';\nimport { initWorkspace } from '../utils/init-workspace.js';\nimport { seedMainAgentProfileMarkdown } from '../../agent/context/workspace-seed.js';\n\nconst log = createLogger('ExtensionDev');\nconst MANIFEST = 'xopc.extension.json';\n\nfunction isRecord(x: unknown): x is Record<string, unknown> {\n return typeof x === 'object' && x !== null && !Array.isArray(x);\n}\n\nasync function ensureGatewayReady(\n configPath: string,\n workspacePath: string,\n gatewayPort: number,\n): Promise<void> {\n const result = await initWorkspace({\n configPath,\n workspacePath,\n gatewayPort,\n });\n\n if (result.configCreated || result.workspaceCreated) {\n console.log('');\n console.log('👋 First-time setup before starting the gateway...');\n console.log('');\n console.log('✅ Setup complete.');\n console.log(` Config: ${configPath}`);\n console.log(` Workspace: ${workspacePath}`);\n console.log('');\n seedMainAgentProfileMarkdown(result.config);\n }\n}\n\nfunction loadAndValidateManifest(extensionDir: string): ExtensionManifest | null {\n const manifestPath = join(extensionDir, MANIFEST);\n if (!existsSync(manifestPath)) {\n console.error(colors.red('error:'), `Missing ${MANIFEST} in ${extensionDir}`);\n return null;\n }\n try {\n const raw = JSON.parse(readFileSync(manifestPath, 'utf-8') as string) as unknown;\n if (!isRecord(raw)) {\n console.error(colors.red('error:'), 'Manifest must be a JSON object');\n return null;\n }\n const manifest = normalizeExtensionManifest(raw);\n if (!manifest.id?.trim()) {\n console.error(colors.red('error:'), 'Manifest \"id\" is required');\n return null;\n }\n if (manifest.engines?.xopc) {\n const r = checkEngineCompatibility(PACKAGE_VERSION, manifest.engines.xopc);\n if (r.parseWarning) {\n console.log(\n colors.yellow('warning:'),\n r.reason ?? 'engines.xopc could not be fully parsed — continuing',\n );\n } else if (!r.compatible) {\n console.log(\n colors.yellow('warning:'),\n r.reason ?? `engines.xopc may not match xopc ${PACKAGE_VERSION} — continuing`,\n );\n }\n }\n return manifest;\n } catch (e) {\n log.error({ err: e }, 'Failed to read manifest');\n console.error(\n colors.red('error:'),\n e instanceof Error ? e.message : String(e),\n );\n return null;\n }\n}\n\nfunction setupDevSymlink(extensionDir: string, extensionsDir: string, extensionId: string): string {\n mkdirSync(extensionsDir, { recursive: true });\n const symlinkPath = join(extensionsDir, extensionId);\n if (existsSync(symlinkPath)) {\n unlinkSync(symlinkPath);\n }\n symlinkSync(extensionDir, symlinkPath, 'dir');\n return symlinkPath;\n}\n\nfunction cleanupSymlink(symlinkPath: string | null): void {\n if (!symlinkPath) return;\n try {\n if (existsSync(symlinkPath)) {\n unlinkSync(symlinkPath);\n }\n } catch (e) {\n log.warn({ err: e, symlinkPath }, 'Failed to remove dev symlink');\n }\n}\n\nfunction shouldIgnorePath(relativePath: string): boolean {\n const parts = relativePath.split(/[/\\\\]/);\n if (parts.some((p) => p === 'node_modules')) return true;\n if (parts.some((p) => p.startsWith('.'))) return true;\n return false;\n}\n\nexport function createExtensionDevCommand(): Command {\n return new Command('dev')\n .description('Symlink an extension into the workspace for live development (optional file watch + gateway)')\n .argument('[dir]', 'Extension directory (default: current working directory)', '.')\n .option('--port <number>', 'Gateway port', '18790')\n .option('--bind <mode>', 'Gateway bind mode', 'loopback')\n .option('--no-gateway', 'Do not start the gateway (symlink only)')\n .option('--no-watch', 'Do not watch files for changes')\n .action(\n async (\n dir: string,\n options: { port: string; bind: string; gateway: boolean; watch: boolean },\n ) => {\n const extensionDir = resolve(dir || '.');\n const manifest = loadAndValidateManifest(extensionDir);\n if (!manifest) {\n process.exit(1);\n }\n\n const ctx = getContextWithOpts();\n loadConfig(ctx.configPath);\n const extensionsDir = resolveExtensionsDir();\n const symlinkPath = setupDevSymlink(extensionDir, extensionsDir, manifest.id);\n\n console.log(\n colors.green('✓'),\n `Dev symlink: ${symlinkPath} → ${extensionDir}`,\n );\n console.log(\n colors.cyan('Note:'),\n 'restart the gateway or trigger config hot-reload so the extension reload picks up changes.',\n );\n\n let debounce: ReturnType<typeof setTimeout> | null = null;\n let watcher: FSWatcher | null = null;\n\n if (options.watch) {\n try {\n watcher = watch(\n extensionDir,\n { recursive: true },\n (_event, filename) => {\n const rel = filename ? String(filename) : '';\n if (rel && shouldIgnorePath(rel)) return;\n if (debounce) clearTimeout(debounce);\n debounce = setTimeout(() => {\n const label = rel || '(unknown)';\n if (/(^|[\\\\/])xopc\\.extension\\.json$/.test(rel) || rel === MANIFEST) {\n console.log(colors.cyan('[watch]'), `manifest: ${label}`);\n } else if (/\\.(html?|css|mjs|js|tsx?|jsx|json)$/i.test(label)) {\n if (/^ui[\\\\/]/.test(rel) || /[\\\\/]ui[\\\\/]/.test(label)) {\n console.log(colors.cyan('[watch]'), `ui: ${label}`);\n } else {\n console.log(colors.cyan('[watch]'), `source: ${label}`);\n }\n } else {\n console.log(colors.cyan('[watch]'), `changed: ${label}`);\n }\n }, 300);\n },\n );\n } catch (e) {\n log.warn({ err: e }, 'fs.watch failed; continuing without watch');\n }\n }\n\n let cleaned = false;\n const cleanup = () => {\n if (cleaned) return;\n cleaned = true;\n if (debounce) clearTimeout(debounce);\n if (watcher) {\n try {\n watcher.close();\n } catch (e) {\n log.warn({ err: e }, 'watcher close failed');\n }\n }\n cleanupSymlink(symlinkPath);\n };\n\n for (const sig of ['SIGINT', 'SIGTERM'] as const) {\n process.on(sig, () => {\n cleanup();\n process.exit(0);\n });\n }\n\n if (!options.gateway) {\n if (options.watch) {\n console.log(colors.cyan('Watching…'), 'Ctrl+C to stop and remove symlink');\n } else {\n console.log(\n colors.cyan('Holding process…'),\n 'Ctrl+C to stop and remove symlink (no file watch)',\n );\n }\n await new Promise(() => {\n /* until SIGINT / SIGTERM */\n });\n return;\n }\n\n const port = parseInt(options.port, 10);\n const bindModes = new Set(['auto', 'loopback', 'lan', 'tailnet', 'custom']);\n const bindRaw = options.bind.trim().toLowerCase();\n if (!bindModes.has(bindRaw)) {\n console.error(colors.red('error:'), 'Invalid --bind mode');\n cleanup();\n process.exit(1);\n }\n const bind = bindRaw as import('../../config/schema.js').GatewayBindMode;\n await ensureGatewayReady(ctx.configPath, ctx.workspacePath, port);\n const cfg = loadConfig(ctx.configPath);\n const { resolveGatewayListenPlan } = await import('../../gateway/listen.js');\n const listenPlan = resolveGatewayListenPlan({ cfg, bindOverride: bind });\n\n if (Number.isNaN(port)) {\n console.error(colors.red('error:'), 'Invalid --port');\n cleanup();\n process.exit(1);\n }\n\n console.log('🚀 Starting gateway (extension dev)…');\n console.log(` Bind: ${bind} (${listenPlan.bindHost})`);\n console.log(` Port: ${port}`);\n console.log('');\n\n try {\n await runGatewayLoop({\n configPath: ctx.configPath || resolveConfigPath(),\n port,\n start: async () => {\n const server = new GatewayServer({\n bindHost: listenPlan.bindHost,\n bind: listenPlan.bindMode,\n customBindHost: listenPlan.customBindHost,\n port,\n token: cfg?.gateway?.auth?.token,\n verbose: ctx.isVerbose,\n configPath: ctx.configPath,\n enableHotReload: true,\n });\n await server.start();\n const displayHost = listenPlan.bindHost === '0.0.0.0' ? 'localhost' : listenPlan.bindHost;\n const token = cfg?.gateway?.auth?.token;\n console.log('✅ Gateway started');\n console.log(` URL: http://${displayHost}:${port}`);\n if (token) {\n console.log(\n ` Token: ${String(token).slice(0, 8)}...${String(token).slice(-8)}`,\n );\n }\n console.log('');\n return server;\n },\n });\n } finally {\n cleanup();\n }\n },\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;aAaoD;YAC4B;yBAGI;sBAGzB;aACN;AAMrD,MAAM,MAAM,aAAa,eAAe;AACxC,MAAM,WAAW;AAEjB,SAAS,SAAS,GAA0C;AAC1D,QAAO,OAAO,MAAM,YAAY,MAAM,QAAQ,CAAC,MAAM,QAAQ,EAAE;;AAGjE,eAAe,mBACb,YACA,eACA,aACe;CACf,MAAM,SAAS,MAAM,cAAc;EACjC;EACA;EACA;EACD,CAAC;AAEF,KAAI,OAAO,iBAAiB,OAAO,kBAAkB;AACnD,UAAQ,IAAI,GAAG;AACf,UAAQ,IAAI,qDAAqD;AACjE,UAAQ,IAAI,GAAG;AACf,UAAQ,IAAI,oBAAoB;AAChC,UAAQ,IAAI,iBAAiB,aAAa;AAC1C,UAAQ,IAAI,iBAAiB,gBAAgB;AAC7C,UAAQ,IAAI,GAAG;AACf,+BAA6B,OAAO,OAAO;;;AAI/C,SAAS,wBAAwB,cAAgD;CAC/E,MAAM,eAAe,KAAK,cAAc,SAAS;AACjD,KAAI,CAAC,WAAW,aAAa,EAAE;AAC7B,UAAQ,MAAM,OAAO,IAAI,SAAS,EAAE,WAAW,SAAS,MAAM,eAAe;AAC7E,SAAO;;AAET,KAAI;EACF,MAAM,MAAM,KAAK,MAAM,aAAa,cAAc,QAAQ,CAAW;AACrE,MAAI,CAAC,SAAS,IAAI,EAAE;AAClB,WAAQ,MAAM,OAAO,IAAI,SAAS,EAAE,iCAAiC;AACrE,UAAO;;EAET,MAAM,WAAW,2BAA2B,IAAI;AAChD,MAAI,CAAC,SAAS,IAAI,MAAM,EAAE;AACxB,WAAQ,MAAM,OAAO,IAAI,SAAS,EAAE,8BAA4B;AAChE,UAAO;;AAET,MAAI,SAAS,SAAS,MAAM;GAC1B,MAAM,IAAI,yBAAyB,iBAAiB,SAAS,QAAQ,KAAK;AAC1E,OAAI,EAAE,aACJ,SAAQ,IACN,OAAO,OAAO,WAAW,EACzB,EAAE,UAAU,sDACb;YACQ,CAAC,EAAE,WACZ,SAAQ,IACN,OAAO,OAAO,WAAW,EACzB,EAAE,UAAU,mCAAmC,gBAAgB,eAChE;;AAGL,SAAO;UACA,GAAG;AACV,MAAI,MAAM,EAAE,KAAK,GAAG,EAAE,0BAA0B;AAChD,UAAQ,MACN,OAAO,IAAI,SAAS,EACpB,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE,CAC3C;AACD,SAAO;;;AAIX,SAAS,gBAAgB,cAAsB,eAAuB,aAA6B;AACjG,WAAU,eAAe,EAAE,WAAW,MAAM,CAAC;CAC7C,MAAM,cAAc,KAAK,eAAe,YAAY;AACpD,KAAI,WAAW,YAAY,CACzB,YAAW,YAAY;AAEzB,aAAY,cAAc,aAAa,MAAM;AAC7C,QAAO;;AAGT,SAAS,eAAe,aAAkC;AACxD,KAAI,CAAC,YAAa;AAClB,KAAI;AACF,MAAI,WAAW,YAAY,CACzB,YAAW,YAAY;UAElB,GAAG;AACV,MAAI,KAAK;GAAE,KAAK;GAAG;GAAa,EAAE,+BAA+B;;;AAIrE,SAAS,iBAAiB,cAA+B;CACvD,MAAM,QAAQ,aAAa,MAAM,QAAQ;AACzC,KAAI,MAAM,MAAM,MAAM,MAAM,eAAe,CAAE,QAAO;AACpD,KAAI,MAAM,MAAM,MAAM,EAAE,WAAW,IAAI,CAAC,CAAE,QAAO;AACjD,QAAO;;AAGT,SAAgB,4BAAqC;AACnD,QAAO,IAAI,QAAQ,MAAM,CACtB,YAAY,+FAA+F,CAC3G,SAAS,SAAS,4DAA4D,IAAI,CAClF,OAAO,mBAAmB,gBAAgB,QAAQ,CAClD,OAAO,iBAAiB,qBAAqB,WAAW,CACxD,OAAO,gBAAgB,0CAA0C,CACjE,OAAO,cAAc,iCAAiC,CACtD,OACC,OACE,KACA,YACG;EACH,MAAM,eAAe,QAAQ,OAAO,IAAI;EACxC,MAAM,WAAW,wBAAwB,aAAa;AACtD,MAAI,CAAC,SACH,SAAQ,KAAK,EAAE;EAGjB,MAAM,MAAM,oBAAoB;AAChC,aAAW,IAAI,WAAW;EAE1B,MAAM,cAAc,gBAAgB,cADd,sBACyC,EAAE,SAAS,GAAG;AAE7E,UAAQ,IACN,OAAO,MAAM,IAAI,EACjB,gBAAgB,YAAY,KAAK,eAClC;AACD,UAAQ,IACN,OAAO,KAAK,QAAQ,EACpB,6FACD;EAED,IAAI,WAAiD;EACrD,IAAI,UAA4B;AAEhC,MAAI,QAAQ,MACV,KAAI;AACF,aAAU,MACR,cACA,EAAE,WAAW,MAAM,GAClB,QAAQ,aAAa;IACpB,MAAM,MAAM,WAAW,OAAO,SAAS,GAAG;AAC1C,QAAI,OAAO,iBAAiB,IAAI,CAAE;AAClC,QAAI,SAAU,cAAa,SAAS;AACpC,eAAW,iBAAiB;KAC1B,MAAM,QAAQ,OAAO;AACrB,SAAI,kCAAkC,KAAK,IAAI,IAAI,QAAQ,SACzD,SAAQ,IAAI,OAAO,KAAK,UAAU,EAAE,aAAa,QAAQ;cAChD,uCAAuC,KAAK,MAAM,CAC3D,KAAI,WAAW,KAAK,IAAI,IAAI,eAAe,KAAK,MAAM,CACpD,SAAQ,IAAI,OAAO,KAAK,UAAU,EAAE,OAAO,QAAQ;SAEnD,SAAQ,IAAI,OAAO,KAAK,UAAU,EAAE,WAAW,QAAQ;SAGzD,SAAQ,IAAI,OAAO,KAAK,UAAU,EAAE,YAAY,QAAQ;OAEzD,IAAI;KAEV;WACM,GAAG;AACV,OAAI,KAAK,EAAE,KAAK,GAAG,EAAE,4CAA4C;;EAIrE,IAAI,UAAU;EACd,MAAM,gBAAgB;AACpB,OAAI,QAAS;AACb,aAAU;AACV,OAAI,SAAU,cAAa,SAAS;AACpC,OAAI,QACF,KAAI;AACF,YAAQ,OAAO;YACR,GAAG;AACV,QAAI,KAAK,EAAE,KAAK,GAAG,EAAE,uBAAuB;;AAGhD,kBAAe,YAAY;;AAG7B,OAAK,MAAM,OAAO,CAAC,UAAU,UAAU,CACrC,SAAQ,GAAG,WAAW;AACpB,YAAS;AACT,WAAQ,KAAK,EAAE;IACf;AAGJ,MAAI,CAAC,QAAQ,SAAS;AACpB,OAAI,QAAQ,MACV,SAAQ,IAAI,OAAO,KAAK,YAAY,EAAE,oCAAoC;OAE1E,SAAQ,IACN,OAAO,KAAK,mBAAmB,EAC/B,oDACD;AAEH,SAAM,IAAI,cAAc,GAEtB;AACF;;EAGF,MAAM,OAAO,SAAS,QAAQ,MAAM,GAAG;EACvC,MAAM,YAAY,IAAI,IAAI;GAAC;GAAQ;GAAY;GAAO;GAAW;GAAS,CAAC;EAC3E,MAAM,UAAU,QAAQ,KAAK,MAAM,CAAC,aAAa;AACjD,MAAI,CAAC,UAAU,IAAI,QAAQ,EAAE;AAC3B,WAAQ,MAAM,OAAO,IAAI,SAAS,EAAE,sBAAsB;AAC1D,YAAS;AACT,WAAQ,KAAK,EAAE;;EAEjB,MAAM,OAAO;AACb,QAAM,mBAAmB,IAAI,YAAY,IAAI,eAAe,KAAK;EACjE,MAAM,MAAM,WAAW,IAAI,WAAW;EACtC,MAAM,EAAE,6BAA6B,MAAM,OAAO;EAClD,MAAM,aAAa,yBAAyB;GAAE;GAAK,cAAc;GAAM,CAAC;AAExE,MAAI,OAAO,MAAM,KAAK,EAAE;AACtB,WAAQ,MAAM,OAAO,IAAI,SAAS,EAAE,iBAAiB;AACrD,YAAS;AACT,WAAQ,KAAK,EAAE;;AAGjB,UAAQ,IAAI,uCAAuC;AACnD,UAAQ,IAAI,YAAY,KAAK,IAAI,WAAW,SAAS,GAAG;AACxD,UAAQ,IAAI,YAAY,OAAO;AAC/B,UAAQ,IAAI,GAAG;AAEf,MAAI;AACF,SAAM,eAAe;IACnB,YAAY,IAAI,cAAc,mBAAmB;IACjD;IACA,OAAO,YAAY;KACjB,MAAM,SAAS,IAAI,cAAc;MAC/B,UAAU,WAAW;MACrB,MAAM,WAAW;MACjB,gBAAgB,WAAW;MAC3B;MACA,OAAO,KAAK,SAAS,MAAM;MAC3B,SAAS,IAAI;MACb,YAAY,IAAI;MAChB,iBAAiB;MAClB,CAAC;AACF,WAAM,OAAO,OAAO;KACpB,MAAM,cAAc,WAAW,aAAa,YAAY,cAAc,WAAW;KACjF,MAAM,QAAQ,KAAK,SAAS,MAAM;AAClC,aAAQ,IAAI,oBAAoB;AAChC,aAAQ,IAAI,kBAAkB,YAAY,GAAG,OAAO;AACpD,SAAI,MACF,SAAQ,IACN,aAAa,OAAO,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC,KAAK,OAAO,MAAM,CAAC,MAAM,GAAG,GACpE;AAEH,aAAQ,IAAI,GAAG;AACf,YAAO;;IAEV,CAAC;YACM;AACR,YAAS;;GAGd"}
@@ -1,6 +1,6 @@
1
1
  import { init_paths, resolveExtensionsDir } from "../../config/paths.js";
2
+ import { init_normalize_manifest, normalizeExtensionManifest } from "../../extensions/normalize-manifest.js";
2
3
  import { init_loader, loadConfig } from "../../config/loader.js";
3
- import { normalizeExtensionManifest } from "../../extensions/normalize-manifest.js";
4
4
  import { getContextWithOpts } from "../context.js";
5
5
  import { getExtensionLockfileManager } from "../../extensions/lockfile.js";
6
6
  import { installExtensionFromStoreZip, installFromLocal, installFromNpm, peekExtensionIdFromStoreZip } from "../../extensions/install.js";
@@ -15,6 +15,7 @@ import semver from "semver";
15
15
  //#region src/cli/commands/extension-marketplace.ts
16
16
  init_loader();
17
17
  init_paths();
18
+ init_normalize_manifest();
18
19
  const MANIFEST = "xopc.extension.json";
19
20
  function isRecord(x) {
20
21
  return typeof x === "object" && x !== null && !Array.isArray(x);
@@ -1 +1 @@
1
- {"version":3,"file":"extension-marketplace.js","names":["marketplace.findExtension","marketplace.listExtensions","marketplace.searchExtensions","marketplace.fetchRegistry","marketplace.getExtensionMarketplaceStoreBaseUrl"],"sources":["../../../../src/cli/commands/extension-marketplace.ts"],"sourcesContent":["import { execSync } from 'node:child_process';\nimport { existsSync, readFileSync, statSync, rmSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\n\nimport { Command } from 'commander';\nimport semver from 'semver';\n\nimport {\n downloadExtensionStoreZipBuffer,\n resolveExtensionZipDownloadUrl,\n resolveExtensionsStoreBaseUrl,\n} from '../../agent/skills/marketplace/adapters/store/store-api-client.js';\nimport { loadConfig } from '../../config/loader.js';\nimport { resolveExtensionsDir } from '../../config/paths.js';\nimport type { InstallResult } from '../../extensions/install.js';\nimport {\n installExtensionFromStoreZip,\n installFromLocal,\n installFromNpm,\n peekExtensionIdFromStoreZip,\n} from '../../extensions/install.js';\nimport { getExtensionLockfileManager } from '../../extensions/lockfile.js';\nimport * as marketplace from '../../extensions/marketplace.js';\nimport { normalizeExtensionManifest } from '../../extensions/normalize-manifest.js';\nimport { colors } from '../utils/colors.js';\nimport { getContextWithOpts } from '../context.js';\n\nconst MANIFEST = 'xopc.extension.json';\n\nfunction isRecord(x: unknown): x is Record<string, unknown> {\n return typeof x === 'object' && x !== null && !Array.isArray(x);\n}\n\nfunction hasWorkspaceDeps(pkg: Record<string, unknown>): boolean {\n const deps = pkg.dependencies;\n const dev = pkg.devDependencies;\n const check = (d: unknown) => {\n if (!isRecord(d)) return false;\n return Object.values(d).some((v) => typeof v === 'string' && v.startsWith('workspace:'));\n };\n return check(deps) || check(dev);\n}\n\nfunction parseNameAtVersion(raw: string): { name: string; version?: string } {\n const t = raw.trim();\n const at = t.lastIndexOf('@');\n if (at <= 0 || at === t.length - 1) return { name: t };\n const maybeVer = t.slice(at + 1);\n const v = semver.valid(maybeVer);\n if (v) return { name: t.slice(0, at), version: v };\n return { name: t };\n}\n\nfunction looksLikeLocalPath(raw: string): boolean {\n const p = raw.trim();\n if (p.startsWith('./') || p.startsWith('../')) return true;\n if (p === '.' || p === '..') return true;\n try {\n const abs = resolve(process.cwd(), p);\n return existsSync(abs) && statSync(abs).isDirectory();\n } catch {\n return false;\n }\n}\n\n/** xopc-store package names: lowercase letters, digits, hyphen (see xopc-store scan). */\nconst STORE_NAME_RE = /^[a-z0-9-]{1,64}$/;\n\nfunction looksLikeStorePackageRef(raw: string): boolean {\n const { name } = parseNameAtVersion(raw);\n return STORE_NAME_RE.test(name);\n}\n\nasync function upsertNpmExtensionLock(\n lock: ReturnType<typeof getExtensionLockfileManager>,\n targetDir: string,\n result: InstallResult,\n spec: string,\n): Promise<void> {\n if (!result.extensionId) return;\n const reg = await marketplace.findExtension(result.extensionId);\n const resolved = reg?.npmPackage ?? spec;\n let ver = reg?.version ?? '0.0.0';\n try {\n const raw = readFileSync(join(targetDir, result.extensionId, MANIFEST), 'utf-8');\n const m = JSON.parse(raw) as { version?: string };\n const mv = typeof m.version === 'string' ? semver.valid(m.version) : null;\n if (mv) ver = mv;\n } catch {\n /* keep registry / fallback version */\n }\n await lock.upsert(result.extensionId, {\n name: result.extensionId,\n version: ver,\n resolved,\n source: 'npm',\n });\n}\n\nasync function installExtensionFromStoreWithLock(params: {\n storeBase: string;\n packageName: string;\n version?: string;\n targetDir: string;\n lock: ReturnType<typeof getExtensionLockfileManager>;\n force?: boolean;\n}): Promise<{ ok: true; extensionId: string; version: string } | { ok: false; error: string }> {\n try {\n const { downloadUrl, version } = await resolveExtensionZipDownloadUrl(\n params.storeBase,\n params.packageName,\n params.version,\n );\n console.log(\n colors.cyan('📦'),\n `Downloading ${params.packageName}@${version} from xopc-store (${params.storeBase})…`,\n );\n const buf = await downloadExtensionStoreZipBuffer(params.storeBase, downloadUrl);\n if (params.force) {\n const id = peekExtensionIdFromStoreZip(buf);\n if (id && existsSync(join(params.targetDir, id))) {\n rmSync(join(params.targetDir, id), { recursive: true, force: true });\n }\n }\n const result = await installExtensionFromStoreZip(buf, params.targetDir);\n if (!result.ok || !result.extensionId) {\n return { ok: false, error: result.error ?? 'install failed' };\n }\n await params.lock.upsert(result.extensionId, {\n name: result.extensionId,\n version,\n resolved: params.packageName,\n source: 'store',\n });\n return { ok: true, extensionId: result.extensionId, version };\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return { ok: false, error: msg };\n }\n}\n\nexport function createExtensionInstallCommand(): Command {\n return new Command('install')\n .description(\n 'Install extension from xopc-store (store.xopc.ai), npm, or a local directory into ~/.xopc/extensions',\n )\n .argument(\n '<target>',\n 'npm spec, path, store:id, or store-shaped id (npm is tried first; use --store / store: for store-only)',\n )\n .option('--store', 'Install from xopc-store only (fail if not an extension package)', false)\n .option('--npm', 'Install from npm only', false)\n .option(\n '-f, --force',\n 'Remove existing extension folder (manifest id) before store or local install',\n false,\n )\n .action(\n async (\n target: string,\n opts: { store: boolean; npm: boolean; force: boolean },\n ) => {\n const ctx = getContextWithOpts();\n const cfg = loadConfig(ctx.configPath);\n const targetDir = resolveExtensionsDir();\n const lock = getExtensionLockfileManager();\n\n let installTarget = target.trim();\n const storeExplicit = /^store:/i.test(installTarget);\n if (storeExplicit) {\n installTarget = installTarget.replace(/^store:/i, '').trim();\n }\n if (!installTarget) {\n console.error(colors.red('error:'), 'Missing target');\n process.exit(1);\n }\n\n if (opts.store && opts.npm) {\n console.error(colors.red('error:'), 'Use only one of --store and --npm');\n process.exit(1);\n }\n\n const storeOnly = opts.store || storeExplicit;\n if (storeExplicit && opts.npm) {\n console.error(colors.red('error:'), 'Cannot combine store: prefix with --npm');\n process.exit(1);\n }\n\n const storeBase = resolveExtensionsStoreBaseUrl(cfg);\n\n if (storeOnly) {\n const { name: pkgName, version: ver } = parseNameAtVersion(installTarget);\n if (!STORE_NAME_RE.test(pkgName)) {\n console.error(\n colors.red('error:'),\n 'Invalid store package name (lowercase letters, digits, hyphen only)',\n );\n process.exit(1);\n }\n const r = await installExtensionFromStoreWithLock({\n storeBase,\n packageName: pkgName,\n version: ver,\n targetDir,\n lock,\n force: opts.force,\n });\n if (r.ok === false) {\n console.error(colors.red('error:'), r.error);\n process.exit(1);\n }\n console.log(colors.green('✓'), `${r.extensionId}@${r.version} (store)`);\n return;\n }\n\n if (opts.npm) {\n const spec = installTarget;\n console.log(colors.cyan('📦'), `Installing from npm: ${spec}…`);\n const result = await installFromNpm(spec, targetDir);\n if (!result.ok) {\n console.error(colors.red('error:'), result.error ?? 'install failed');\n process.exit(1);\n }\n await upsertNpmExtensionLock(lock, targetDir, result, spec);\n console.log(colors.green('✓'), result.extensionId ?? 'ok', '(npm)');\n return;\n }\n\n if (looksLikeLocalPath(installTarget)) {\n const sourceDir = resolve(process.cwd(), installTarget);\n if (opts.force) {\n const manifestPath = join(sourceDir, MANIFEST);\n if (existsSync(manifestPath)) {\n try {\n const raw = readFileSync(manifestPath, 'utf-8');\n const m = JSON.parse(raw) as { id?: string };\n const extId =\n typeof m.id === 'string' &&\n m.id &&\n !m.id.includes('/') &&\n !m.id.includes('\\\\')\n ? m.id\n : undefined;\n if (extId && existsSync(join(targetDir, extId))) {\n rmSync(join(targetDir, extId), { recursive: true, force: true });\n }\n } catch {\n /* installFromLocal will surface manifest errors */\n }\n }\n }\n console.log(colors.cyan('📂'), 'Installing from local directory…');\n const result = await installFromLocal(sourceDir, targetDir);\n if (!result.ok) {\n console.error(colors.red('error:'), result.error ?? 'install failed');\n process.exit(1);\n }\n console.log(colors.green('✓'), result.extensionId ?? 'ok');\n return;\n }\n\n if (looksLikeStorePackageRef(installTarget)) {\n const spec = installTarget;\n console.log(colors.cyan('📦'), `Trying npm: ${spec}…`);\n const npmTry = await installFromNpm(spec, targetDir);\n if (npmTry.ok) {\n await upsertNpmExtensionLock(lock, targetDir, npmTry, spec);\n console.log(colors.green('✓'), npmTry.extensionId ?? 'ok', '(npm)');\n return;\n }\n console.log(colors.yellow('npm:'), npmTry.error ?? 'failed', '— trying xopc-store…');\n const { name: pkgName, version: ver } = parseNameAtVersion(installTarget);\n const r = await installExtensionFromStoreWithLock({\n storeBase,\n packageName: pkgName,\n version: ver,\n targetDir,\n lock,\n force: opts.force,\n });\n if (r.ok === false) {\n console.error(colors.red('error:'), r.error);\n process.exit(1);\n }\n console.log(colors.green('✓'), `${r.extensionId}@${r.version} (store)`);\n return;\n }\n\n const spec = installTarget;\n console.log(colors.cyan('📦'), `Installing from npm: ${spec}…`);\n const result = await installFromNpm(spec, targetDir);\n if (!result.ok) {\n console.error(colors.red('error:'), result.error ?? 'install failed');\n process.exit(1);\n }\n await upsertNpmExtensionLock(lock, targetDir, result, spec);\n console.log(colors.green('✓'), result.extensionId ?? 'ok', '(npm)');\n },\n );\n}\n\nexport function createExtensionSearchCommand(): Command {\n return new Command('search')\n .description('Search extensions listed on xopc-store')\n .argument('[keyword]', 'Search text (omit to list all)', '')\n .option('--category <cat>', 'Filter by category')\n .option('--json', 'JSON output')\n .action(async (keyword: string, opts: { category?: string; json?: boolean }) => {\n try {\n let rows;\n if (opts.category?.trim()) {\n rows = await marketplace.listExtensions(opts.category.trim());\n if (keyword.trim()) {\n const k = keyword.trim().toLowerCase();\n rows = rows.filter(\n (e) =>\n e.id.toLowerCase().includes(k) ||\n e.name.toLowerCase().includes(k) ||\n (e.description ?? '').toLowerCase().includes(k),\n );\n }\n } else if (keyword.trim()) {\n rows = await marketplace.searchExtensions(keyword.trim());\n } else {\n const reg = await marketplace.fetchRegistry();\n rows = reg.extensions;\n }\n\n if (opts.json) {\n console.log(JSON.stringify(rows, null, 2));\n return;\n }\n\n if (rows.length === 0) {\n console.log('No extensions found.');\n return;\n }\n\n console.log(`xopc-store: ${marketplace.getExtensionMarketplaceStoreBaseUrl()}`);\n console.log('');\n for (const e of rows) {\n const badge = e.verified ? ` ${colors.green('✓')}` : '';\n console.log(`${colors.cyan(e.name)}${badge} ${colors.gray(e.version ?? '')}`);\n console.log(` id: ${e.id} npm: ${e.npmPackage}`);\n if (e.description) console.log(` ${e.description}`);\n if (e.categories?.length) console.log(` categories: ${e.categories.join(', ')}`);\n console.log('');\n }\n } catch (err) {\n console.error(colors.red('Error:'), err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n}\n\nexport function createExtensionPublishCommand(): Command {\n return new Command('publish')\n .description('Publish extension to npm (public)')\n .argument('[directory]', 'Extension root', '.')\n .option('--dry-run', 'npm publish --dry-run', false)\n .option('--access <level>', 'npm access', 'public')\n .action((dir: string, opts: { dryRun: boolean; access: string }) => {\n const root = resolve(dir || '.');\n const manifestPath = join(root, MANIFEST);\n const pkgPath = join(root, 'package.json');\n if (!existsSync(manifestPath) || !existsSync(pkgPath)) {\n console.error(colors.red('error:'), `Need ${MANIFEST} and package.json in ${root}`);\n process.exit(1);\n }\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8')) as Record<string, unknown>;\n if (hasWorkspaceDeps(pkg)) {\n console.error(\n colors.red('error:'),\n 'Remove workspace:* dependencies before publishing.',\n );\n process.exit(1);\n }\n const raw = JSON.parse(readFileSync(manifestPath, 'utf-8')) as Record<string, unknown>;\n const manifest = normalizeExtensionManifest(raw);\n if (!manifest.id) {\n console.error(colors.red('error:'), 'Invalid manifest id');\n process.exit(1);\n }\n } catch (e) {\n console.error(colors.red('error:'), e instanceof Error ? e.message : String(e));\n process.exit(1);\n }\n\n const args = ['publish', `--access=${opts.access}`];\n if (opts.dryRun) args.push('--dry-run');\n console.log(colors.cyan('Running:'), `npm ${args.join(' ')}`);\n try {\n execSync(`npm ${args.join(' ')}`, { cwd: root, stdio: 'inherit' });\n } catch {\n process.exit(1);\n }\n });\n}\n\nexport function createExtensionUpdateCommand(): Command {\n return new Command('update')\n .description('Re-install extension(s) from the lockfile (npm or xopc-store) under ~/.xopc/extensions')\n .argument('[extensionId]', 'Specific extension id (default: all in lockfile)')\n .action(async (extensionId: string | undefined) => {\n const ctx = getContextWithOpts();\n const cfg = loadConfig(ctx.configPath);\n const targetDir = resolveExtensionsDir();\n const storeBase = resolveExtensionsStoreBaseUrl(cfg);\n\n const lock = getExtensionLockfileManager();\n const data = await lock.load();\n const ids = extensionId?.trim()\n ? [extensionId.trim()]\n : Object.keys(data.extensions);\n\n if (ids.length === 0) {\n console.log('No extensions in lockfile.');\n return;\n }\n\n for (const id of ids) {\n const entry = data.extensions[id];\n if (!entry) {\n console.log(colors.yellow('skip'), id, '(not in lockfile)');\n continue;\n }\n if (entry.source === 'store') {\n const pkgName = entry.resolved?.trim() || id;\n console.log(colors.cyan('Updating'), id, '←', `store:${pkgName}`);\n if (existsSync(join(targetDir, id))) {\n rmSync(join(targetDir, id), { recursive: true, force: true });\n }\n const r = await installExtensionFromStoreWithLock({\n storeBase,\n packageName: pkgName,\n targetDir,\n lock,\n });\n if (r.ok === false) {\n console.error(colors.red('error:'), r.error ?? id);\n process.exit(1);\n }\n console.log(colors.green('✓'), id);\n continue;\n }\n if (entry.source !== 'npm') {\n console.log(colors.yellow('skip'), id, `(source ${entry.source})`);\n continue;\n }\n const spec = entry.resolved?.trim() || (await npmPackageForId(id));\n if (!spec) {\n console.log(colors.yellow('skip'), id, '(could not resolve npm package)');\n continue;\n }\n console.log(colors.cyan('Updating'), id, '←', spec);\n if (existsSync(join(targetDir, id))) {\n rmSync(join(targetDir, id), { recursive: true, force: true });\n }\n const result = await installFromNpm(spec, targetDir);\n if (!result.ok) {\n console.error(colors.red('error:'), result.error ?? id);\n process.exit(1);\n }\n await lock.upsert(id, {\n name: id,\n version: entry.version,\n resolved: spec,\n source: 'npm',\n });\n console.log(colors.green('✓'), id);\n }\n });\n}\n\nasync function npmPackageForId(id: string): Promise<string | undefined> {\n const found = await marketplace.findExtension(id);\n return found?.npmPackage;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"extension-marketplace.js","names":["marketplace.findExtension","marketplace.listExtensions","marketplace.searchExtensions","marketplace.fetchRegistry","marketplace.getExtensionMarketplaceStoreBaseUrl"],"sources":["../../../../src/cli/commands/extension-marketplace.ts"],"sourcesContent":["import { execSync } from 'node:child_process';\nimport { existsSync, readFileSync, statSync, rmSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\n\nimport { Command } from 'commander';\nimport semver from 'semver';\n\nimport {\n downloadExtensionStoreZipBuffer,\n resolveExtensionZipDownloadUrl,\n resolveExtensionsStoreBaseUrl,\n} from '../../agent/skills/marketplace/adapters/store/store-api-client.js';\nimport { loadConfig } from '../../config/loader.js';\nimport { resolveExtensionsDir } from '../../config/paths.js';\nimport type { InstallResult } from '../../extensions/install.js';\nimport {\n installExtensionFromStoreZip,\n installFromLocal,\n installFromNpm,\n peekExtensionIdFromStoreZip,\n} from '../../extensions/install.js';\nimport { getExtensionLockfileManager } from '../../extensions/lockfile.js';\nimport * as marketplace from '../../extensions/marketplace.js';\nimport { normalizeExtensionManifest } from '../../extensions/normalize-manifest.js';\nimport { colors } from '../utils/colors.js';\nimport { getContextWithOpts } from '../context.js';\n\nconst MANIFEST = 'xopc.extension.json';\n\nfunction isRecord(x: unknown): x is Record<string, unknown> {\n return typeof x === 'object' && x !== null && !Array.isArray(x);\n}\n\nfunction hasWorkspaceDeps(pkg: Record<string, unknown>): boolean {\n const deps = pkg.dependencies;\n const dev = pkg.devDependencies;\n const check = (d: unknown) => {\n if (!isRecord(d)) return false;\n return Object.values(d).some((v) => typeof v === 'string' && v.startsWith('workspace:'));\n };\n return check(deps) || check(dev);\n}\n\nfunction parseNameAtVersion(raw: string): { name: string; version?: string } {\n const t = raw.trim();\n const at = t.lastIndexOf('@');\n if (at <= 0 || at === t.length - 1) return { name: t };\n const maybeVer = t.slice(at + 1);\n const v = semver.valid(maybeVer);\n if (v) return { name: t.slice(0, at), version: v };\n return { name: t };\n}\n\nfunction looksLikeLocalPath(raw: string): boolean {\n const p = raw.trim();\n if (p.startsWith('./') || p.startsWith('../')) return true;\n if (p === '.' || p === '..') return true;\n try {\n const abs = resolve(process.cwd(), p);\n return existsSync(abs) && statSync(abs).isDirectory();\n } catch {\n return false;\n }\n}\n\n/** xopc-store package names: lowercase letters, digits, hyphen (see xopc-store scan). */\nconst STORE_NAME_RE = /^[a-z0-9-]{1,64}$/;\n\nfunction looksLikeStorePackageRef(raw: string): boolean {\n const { name } = parseNameAtVersion(raw);\n return STORE_NAME_RE.test(name);\n}\n\nasync function upsertNpmExtensionLock(\n lock: ReturnType<typeof getExtensionLockfileManager>,\n targetDir: string,\n result: InstallResult,\n spec: string,\n): Promise<void> {\n if (!result.extensionId) return;\n const reg = await marketplace.findExtension(result.extensionId);\n const resolved = reg?.npmPackage ?? spec;\n let ver = reg?.version ?? '0.0.0';\n try {\n const raw = readFileSync(join(targetDir, result.extensionId, MANIFEST), 'utf-8');\n const m = JSON.parse(raw) as { version?: string };\n const mv = typeof m.version === 'string' ? semver.valid(m.version) : null;\n if (mv) ver = mv;\n } catch {\n /* keep registry / fallback version */\n }\n await lock.upsert(result.extensionId, {\n name: result.extensionId,\n version: ver,\n resolved,\n source: 'npm',\n });\n}\n\nasync function installExtensionFromStoreWithLock(params: {\n storeBase: string;\n packageName: string;\n version?: string;\n targetDir: string;\n lock: ReturnType<typeof getExtensionLockfileManager>;\n force?: boolean;\n}): Promise<{ ok: true; extensionId: string; version: string } | { ok: false; error: string }> {\n try {\n const { downloadUrl, version } = await resolveExtensionZipDownloadUrl(\n params.storeBase,\n params.packageName,\n params.version,\n );\n console.log(\n colors.cyan('📦'),\n `Downloading ${params.packageName}@${version} from xopc-store (${params.storeBase})…`,\n );\n const buf = await downloadExtensionStoreZipBuffer(params.storeBase, downloadUrl);\n if (params.force) {\n const id = peekExtensionIdFromStoreZip(buf);\n if (id && existsSync(join(params.targetDir, id))) {\n rmSync(join(params.targetDir, id), { recursive: true, force: true });\n }\n }\n const result = await installExtensionFromStoreZip(buf, params.targetDir);\n if (!result.ok || !result.extensionId) {\n return { ok: false, error: result.error ?? 'install failed' };\n }\n await params.lock.upsert(result.extensionId, {\n name: result.extensionId,\n version,\n resolved: params.packageName,\n source: 'store',\n });\n return { ok: true, extensionId: result.extensionId, version };\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return { ok: false, error: msg };\n }\n}\n\nexport function createExtensionInstallCommand(): Command {\n return new Command('install')\n .description(\n 'Install extension from xopc-store (store.xopc.ai), npm, or a local directory into ~/.xopc/extensions',\n )\n .argument(\n '<target>',\n 'npm spec, path, store:id, or store-shaped id (npm is tried first; use --store / store: for store-only)',\n )\n .option('--store', 'Install from xopc-store only (fail if not an extension package)', false)\n .option('--npm', 'Install from npm only', false)\n .option(\n '-f, --force',\n 'Remove existing extension folder (manifest id) before store or local install',\n false,\n )\n .action(\n async (\n target: string,\n opts: { store: boolean; npm: boolean; force: boolean },\n ) => {\n const ctx = getContextWithOpts();\n const cfg = loadConfig(ctx.configPath);\n const targetDir = resolveExtensionsDir();\n const lock = getExtensionLockfileManager();\n\n let installTarget = target.trim();\n const storeExplicit = /^store:/i.test(installTarget);\n if (storeExplicit) {\n installTarget = installTarget.replace(/^store:/i, '').trim();\n }\n if (!installTarget) {\n console.error(colors.red('error:'), 'Missing target');\n process.exit(1);\n }\n\n if (opts.store && opts.npm) {\n console.error(colors.red('error:'), 'Use only one of --store and --npm');\n process.exit(1);\n }\n\n const storeOnly = opts.store || storeExplicit;\n if (storeExplicit && opts.npm) {\n console.error(colors.red('error:'), 'Cannot combine store: prefix with --npm');\n process.exit(1);\n }\n\n const storeBase = resolveExtensionsStoreBaseUrl(cfg);\n\n if (storeOnly) {\n const { name: pkgName, version: ver } = parseNameAtVersion(installTarget);\n if (!STORE_NAME_RE.test(pkgName)) {\n console.error(\n colors.red('error:'),\n 'Invalid store package name (lowercase letters, digits, hyphen only)',\n );\n process.exit(1);\n }\n const r = await installExtensionFromStoreWithLock({\n storeBase,\n packageName: pkgName,\n version: ver,\n targetDir,\n lock,\n force: opts.force,\n });\n if (r.ok === false) {\n console.error(colors.red('error:'), r.error);\n process.exit(1);\n }\n console.log(colors.green('✓'), `${r.extensionId}@${r.version} (store)`);\n return;\n }\n\n if (opts.npm) {\n const spec = installTarget;\n console.log(colors.cyan('📦'), `Installing from npm: ${spec}…`);\n const result = await installFromNpm(spec, targetDir);\n if (!result.ok) {\n console.error(colors.red('error:'), result.error ?? 'install failed');\n process.exit(1);\n }\n await upsertNpmExtensionLock(lock, targetDir, result, spec);\n console.log(colors.green('✓'), result.extensionId ?? 'ok', '(npm)');\n return;\n }\n\n if (looksLikeLocalPath(installTarget)) {\n const sourceDir = resolve(process.cwd(), installTarget);\n if (opts.force) {\n const manifestPath = join(sourceDir, MANIFEST);\n if (existsSync(manifestPath)) {\n try {\n const raw = readFileSync(manifestPath, 'utf-8');\n const m = JSON.parse(raw) as { id?: string };\n const extId =\n typeof m.id === 'string' &&\n m.id &&\n !m.id.includes('/') &&\n !m.id.includes('\\\\')\n ? m.id\n : undefined;\n if (extId && existsSync(join(targetDir, extId))) {\n rmSync(join(targetDir, extId), { recursive: true, force: true });\n }\n } catch {\n /* installFromLocal will surface manifest errors */\n }\n }\n }\n console.log(colors.cyan('📂'), 'Installing from local directory…');\n const result = await installFromLocal(sourceDir, targetDir);\n if (!result.ok) {\n console.error(colors.red('error:'), result.error ?? 'install failed');\n process.exit(1);\n }\n console.log(colors.green('✓'), result.extensionId ?? 'ok');\n return;\n }\n\n if (looksLikeStorePackageRef(installTarget)) {\n const spec = installTarget;\n console.log(colors.cyan('📦'), `Trying npm: ${spec}…`);\n const npmTry = await installFromNpm(spec, targetDir);\n if (npmTry.ok) {\n await upsertNpmExtensionLock(lock, targetDir, npmTry, spec);\n console.log(colors.green('✓'), npmTry.extensionId ?? 'ok', '(npm)');\n return;\n }\n console.log(colors.yellow('npm:'), npmTry.error ?? 'failed', '— trying xopc-store…');\n const { name: pkgName, version: ver } = parseNameAtVersion(installTarget);\n const r = await installExtensionFromStoreWithLock({\n storeBase,\n packageName: pkgName,\n version: ver,\n targetDir,\n lock,\n force: opts.force,\n });\n if (r.ok === false) {\n console.error(colors.red('error:'), r.error);\n process.exit(1);\n }\n console.log(colors.green('✓'), `${r.extensionId}@${r.version} (store)`);\n return;\n }\n\n const spec = installTarget;\n console.log(colors.cyan('📦'), `Installing from npm: ${spec}…`);\n const result = await installFromNpm(spec, targetDir);\n if (!result.ok) {\n console.error(colors.red('error:'), result.error ?? 'install failed');\n process.exit(1);\n }\n await upsertNpmExtensionLock(lock, targetDir, result, spec);\n console.log(colors.green('✓'), result.extensionId ?? 'ok', '(npm)');\n },\n );\n}\n\nexport function createExtensionSearchCommand(): Command {\n return new Command('search')\n .description('Search extensions listed on xopc-store')\n .argument('[keyword]', 'Search text (omit to list all)', '')\n .option('--category <cat>', 'Filter by category')\n .option('--json', 'JSON output')\n .action(async (keyword: string, opts: { category?: string; json?: boolean }) => {\n try {\n let rows;\n if (opts.category?.trim()) {\n rows = await marketplace.listExtensions(opts.category.trim());\n if (keyword.trim()) {\n const k = keyword.trim().toLowerCase();\n rows = rows.filter(\n (e) =>\n e.id.toLowerCase().includes(k) ||\n e.name.toLowerCase().includes(k) ||\n (e.description ?? '').toLowerCase().includes(k),\n );\n }\n } else if (keyword.trim()) {\n rows = await marketplace.searchExtensions(keyword.trim());\n } else {\n const reg = await marketplace.fetchRegistry();\n rows = reg.extensions;\n }\n\n if (opts.json) {\n console.log(JSON.stringify(rows, null, 2));\n return;\n }\n\n if (rows.length === 0) {\n console.log('No extensions found.');\n return;\n }\n\n console.log(`xopc-store: ${marketplace.getExtensionMarketplaceStoreBaseUrl()}`);\n console.log('');\n for (const e of rows) {\n const badge = e.verified ? ` ${colors.green('✓')}` : '';\n console.log(`${colors.cyan(e.name)}${badge} ${colors.gray(e.version ?? '')}`);\n console.log(` id: ${e.id} npm: ${e.npmPackage}`);\n if (e.description) console.log(` ${e.description}`);\n if (e.categories?.length) console.log(` categories: ${e.categories.join(', ')}`);\n console.log('');\n }\n } catch (err) {\n console.error(colors.red('Error:'), err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n}\n\nexport function createExtensionPublishCommand(): Command {\n return new Command('publish')\n .description('Publish extension to npm (public)')\n .argument('[directory]', 'Extension root', '.')\n .option('--dry-run', 'npm publish --dry-run', false)\n .option('--access <level>', 'npm access', 'public')\n .action((dir: string, opts: { dryRun: boolean; access: string }) => {\n const root = resolve(dir || '.');\n const manifestPath = join(root, MANIFEST);\n const pkgPath = join(root, 'package.json');\n if (!existsSync(manifestPath) || !existsSync(pkgPath)) {\n console.error(colors.red('error:'), `Need ${MANIFEST} and package.json in ${root}`);\n process.exit(1);\n }\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8')) as Record<string, unknown>;\n if (hasWorkspaceDeps(pkg)) {\n console.error(\n colors.red('error:'),\n 'Remove workspace:* dependencies before publishing.',\n );\n process.exit(1);\n }\n const raw = JSON.parse(readFileSync(manifestPath, 'utf-8')) as Record<string, unknown>;\n const manifest = normalizeExtensionManifest(raw);\n if (!manifest.id) {\n console.error(colors.red('error:'), 'Invalid manifest id');\n process.exit(1);\n }\n } catch (e) {\n console.error(colors.red('error:'), e instanceof Error ? e.message : String(e));\n process.exit(1);\n }\n\n const args = ['publish', `--access=${opts.access}`];\n if (opts.dryRun) args.push('--dry-run');\n console.log(colors.cyan('Running:'), `npm ${args.join(' ')}`);\n try {\n execSync(`npm ${args.join(' ')}`, { cwd: root, stdio: 'inherit' });\n } catch {\n process.exit(1);\n }\n });\n}\n\nexport function createExtensionUpdateCommand(): Command {\n return new Command('update')\n .description('Re-install extension(s) from the lockfile (npm or xopc-store) under ~/.xopc/extensions')\n .argument('[extensionId]', 'Specific extension id (default: all in lockfile)')\n .action(async (extensionId: string | undefined) => {\n const ctx = getContextWithOpts();\n const cfg = loadConfig(ctx.configPath);\n const targetDir = resolveExtensionsDir();\n const storeBase = resolveExtensionsStoreBaseUrl(cfg);\n\n const lock = getExtensionLockfileManager();\n const data = await lock.load();\n const ids = extensionId?.trim()\n ? [extensionId.trim()]\n : Object.keys(data.extensions);\n\n if (ids.length === 0) {\n console.log('No extensions in lockfile.');\n return;\n }\n\n for (const id of ids) {\n const entry = data.extensions[id];\n if (!entry) {\n console.log(colors.yellow('skip'), id, '(not in lockfile)');\n continue;\n }\n if (entry.source === 'store') {\n const pkgName = entry.resolved?.trim() || id;\n console.log(colors.cyan('Updating'), id, '←', `store:${pkgName}`);\n if (existsSync(join(targetDir, id))) {\n rmSync(join(targetDir, id), { recursive: true, force: true });\n }\n const r = await installExtensionFromStoreWithLock({\n storeBase,\n packageName: pkgName,\n targetDir,\n lock,\n });\n if (r.ok === false) {\n console.error(colors.red('error:'), r.error ?? id);\n process.exit(1);\n }\n console.log(colors.green('✓'), id);\n continue;\n }\n if (entry.source !== 'npm') {\n console.log(colors.yellow('skip'), id, `(source ${entry.source})`);\n continue;\n }\n const spec = entry.resolved?.trim() || (await npmPackageForId(id));\n if (!spec) {\n console.log(colors.yellow('skip'), id, '(could not resolve npm package)');\n continue;\n }\n console.log(colors.cyan('Updating'), id, '←', spec);\n if (existsSync(join(targetDir, id))) {\n rmSync(join(targetDir, id), { recursive: true, force: true });\n }\n const result = await installFromNpm(spec, targetDir);\n if (!result.ok) {\n console.error(colors.red('error:'), result.error ?? id);\n process.exit(1);\n }\n await lock.upsert(id, {\n name: id,\n version: entry.version,\n resolved: spec,\n source: 'npm',\n });\n console.log(colors.green('✓'), id);\n }\n });\n}\n\nasync function npmPackageForId(id: string): Promise<string | undefined> {\n const found = await marketplace.findExtension(id);\n return found?.npmPackage;\n}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { PACKAGE_VERSION, init_package_version } from "../../package-version.js";
2
2
  import { createLogger } from "../../utils/logger/index.js";
3
3
  import { init_logger } from "../../utils/logger.js";
4
- import { normalizeExtensionManifest } from "../../extensions/normalize-manifest.js";
4
+ import { init_normalize_manifest, normalizeExtensionManifest } from "../../extensions/normalize-manifest.js";
5
5
  import { checkEngineCompatibility } from "../../extensions/engine-check.js";
6
6
  import { colors } from "../utils/colors.js";
7
7
  import { existsSync, mkdirSync, readFileSync, readdirSync, renameSync, statSync } from "node:fs";
@@ -9,6 +9,7 @@ import { isAbsolute, join, resolve } from "node:path";
9
9
  import { execSync } from "node:child_process";
10
10
  import { Command } from "commander";
11
11
  //#region src/cli/commands/extension-pack.ts
12
+ init_normalize_manifest();
12
13
  init_package_version();
13
14
  init_logger();
14
15
  const log = createLogger("ExtensionPack");