@xopcai/xopc 0.0.102 → 0.0.104

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (995) hide show
  1. package/README.md +8 -5
  2. package/README.zh-CN.md +8 -5
  3. package/dist/_virtual/_rolldown/runtime.js +2 -3
  4. package/dist/browser-ext/manifest.json +1 -1
  5. package/dist/extensions/feishu/src/adapters/cli-login.d.ts +1 -1
  6. package/dist/extensions/feishu/src/adapters/cli-login.js +1 -1
  7. package/dist/extensions/feishu/src/adapters/cli-login.js.map +1 -1
  8. package/dist/extensions/feishu/src/adapters/gateway-setup.d.ts +2 -0
  9. package/dist/extensions/feishu/src/adapters/gateway-setup.js +225 -0
  10. package/dist/extensions/feishu/src/adapters/gateway-setup.js.map +1 -0
  11. package/dist/extensions/feishu/src/index.d.ts +8 -1
  12. package/dist/extensions/feishu/src/index.js +14 -1
  13. package/dist/extensions/feishu/src/index.js.map +1 -0
  14. package/dist/extensions/feishu/src/outbound/outbound-adapter.js +1 -1
  15. package/dist/extensions/feishu/src/plugin.d.ts +2 -1
  16. package/dist/extensions/feishu/src/plugin.js +2 -0
  17. package/dist/extensions/feishu/src/plugin.js.map +1 -1
  18. package/dist/extensions/feishu/src/streaming/streaming-adapter.js +1 -1
  19. package/dist/extensions/feishu/src/transport/webhook/monitor.js +2 -2
  20. package/dist/extensions/feishu/src/transport/webhook/monitor.js.map +1 -1
  21. package/dist/extensions/feishu/xopc.extension.json +66 -1
  22. package/dist/extensions/telegram/src/adapters/gateway-setup.d.ts +2 -0
  23. package/dist/extensions/telegram/src/adapters/gateway-setup.js +146 -0
  24. package/dist/extensions/telegram/src/adapters/gateway-setup.js.map +1 -0
  25. package/dist/extensions/telegram/src/adapters/security-adapter.js +1 -1
  26. package/dist/extensions/telegram/src/command-handler.js +1 -2
  27. package/dist/extensions/telegram/src/command-handler.js.map +1 -1
  28. package/dist/extensions/telegram/src/config-schema.js +2 -2
  29. package/dist/extensions/telegram/src/config-schema.js.map +1 -1
  30. package/dist/extensions/telegram/src/doctor.d.ts +1 -0
  31. package/dist/extensions/telegram/src/doctor.js +68 -0
  32. package/dist/extensions/telegram/src/doctor.js.map +1 -1
  33. package/dist/extensions/telegram/src/index.d.ts +8 -1
  34. package/dist/extensions/telegram/src/index.js +15 -2
  35. package/dist/extensions/telegram/src/index.js.map +1 -0
  36. package/dist/extensions/telegram/src/plugin.d.ts +13 -5
  37. package/dist/extensions/telegram/src/plugin.js +32 -12
  38. package/dist/extensions/telegram/src/plugin.js.map +1 -1
  39. package/dist/extensions/telegram/src/proxy-fetch.js +22 -5
  40. package/dist/extensions/telegram/src/proxy-fetch.js.map +1 -1
  41. package/dist/extensions/telegram/src/send-options.js +8 -5
  42. package/dist/extensions/telegram/src/send-options.js.map +1 -1
  43. package/dist/extensions/telegram/xopc.extension.json +412 -5
  44. package/dist/extensions/weixin/src/adapters/onboard-cli.js +2 -2
  45. package/dist/extensions/weixin/src/adapters/onboard-cli.js.map +1 -1
  46. package/dist/extensions/weixin/src/api/api.js +1 -1
  47. package/dist/extensions/weixin/src/index.d.ts +8 -0
  48. package/dist/extensions/weixin/src/index.js +12 -1
  49. package/dist/extensions/weixin/src/index.js.map +1 -0
  50. package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
  51. package/dist/extensions/weixin/src/plugin.d.ts +2 -1
  52. package/dist/extensions/weixin/src/plugin.js +77 -2
  53. package/dist/extensions/weixin/src/plugin.js.map +1 -1
  54. package/dist/extensions/weixin/xopc.extension.json +52 -0
  55. package/dist/gateway/static/root/assets/agents-CvsBrBfi.js +396 -0
  56. package/dist/gateway/static/root/assets/{apps-page-Uv4kOmDE.js → apps-page-L-IwQTe0.js} +1 -1
  57. package/dist/gateway/static/root/assets/browser-BLJWD7WI.js +8 -0
  58. package/dist/gateway/static/root/assets/channels-settings-D95KuPeP.js +1 -0
  59. package/dist/gateway/static/root/assets/cron-page-CfkWXDAI.js +1 -0
  60. package/dist/gateway/static/root/assets/{dist-DH4IuRV0.js → dist-C6vclgEL.js} +1 -1
  61. package/dist/gateway/static/root/assets/{extension-debug-page-BNkhvRQW.js → extension-debug-page-D4JYAbsX.js} +1 -1
  62. package/dist/gateway/static/root/assets/{extension-page-CcIGQah2.js → extension-page-_T62gi6e.js} +1 -1
  63. package/dist/gateway/static/root/assets/extension-settings-page-CkJbjyM-.js +1 -0
  64. package/dist/gateway/static/root/assets/{fetch-drJUxxKP.js → fetch-B5aiIguv.js} +1 -1
  65. package/dist/gateway/static/root/assets/gateway-startup-retry-DqmLXhs6.js +1 -0
  66. package/dist/gateway/static/root/assets/heartbeat-config-api-HwJV1K_Y.js +1 -0
  67. package/dist/gateway/static/root/assets/index-BPYKW7FB.css +1 -0
  68. package/dist/gateway/static/root/assets/index-DvTb6wNR.js +4845 -0
  69. package/dist/gateway/static/root/assets/{logs-page-CiG0m81R.js → logs-page-DsjtTjBy.js} +2 -2
  70. package/dist/gateway/static/root/assets/{note-detail-page-DG3DVFTf.js → note-detail-page-B2V7RhgD.js} +43 -43
  71. package/dist/gateway/static/root/assets/{note-time-DjlllCF3.js → note-time-BG8GCTr4.js} +1 -1
  72. package/dist/gateway/static/root/assets/notes-page-xrcVBQ6Z.js +1 -0
  73. package/dist/gateway/static/root/assets/schema-form-S-QUvhul.js +1 -0
  74. package/dist/gateway/static/root/assets/sessions-page-CrQer6Au.js +1 -0
  75. package/dist/gateway/static/root/assets/settings-advanced-gate-DujQl9c7.js +2 -0
  76. package/dist/gateway/static/root/assets/{settings-form-section-C3_sEFfD.js → settings-form-section-r1V7dRV6.js} +1 -1
  77. package/dist/gateway/static/root/assets/settings-page-C9nrONQ2.js +3 -0
  78. package/dist/gateway/static/root/assets/share-preview-page-DOFy0FNt.js +2 -0
  79. package/dist/gateway/static/root/assets/skills-page-DmTsrs_a.js +2 -0
  80. package/dist/gateway/static/root/assets/{theme-store-B6KXPHgK.js → theme-store-Bo3j5Ovv.js} +1 -1
  81. package/dist/gateway/static/root/assets/url-WgQIjFZu.js +3 -0
  82. package/dist/gateway/static/root/assets/voice-api-key-field-AjmUAlEQ.js +1 -0
  83. package/dist/gateway/static/root/assets/{workflow-page.utils-g57BRfEd.js → workflow-page.utils-DLEJ92gK.js} +1 -1
  84. package/dist/gateway/static/root/assets/workflows-page-BnjjKrM1.js +27 -0
  85. package/dist/gateway/static/root/index.html +6 -5
  86. package/dist/package.js +1 -1
  87. package/dist/src/agent/agent-manager.d.ts +18 -6
  88. package/dist/src/agent/agent-manager.js +60 -35
  89. package/dist/src/agent/agent-manager.js.map +1 -1
  90. package/dist/src/agent/builtin-agent-ids.d.ts +2 -0
  91. package/dist/src/agent/builtin-agent-ids.js +17 -0
  92. package/dist/src/agent/builtin-agent-ids.js.map +1 -0
  93. package/dist/src/agent/child-agent-factory.d.ts +4 -0
  94. package/dist/src/agent/child-agent-factory.js +28 -8
  95. package/dist/src/agent/child-agent-factory.js.map +1 -1
  96. package/dist/src/agent/context/workspace-seed.js +1 -1
  97. package/dist/src/agent/context/workspace-templates/AGENTS.md +23 -184
  98. package/dist/src/agent/embedded/run-turn.js +8 -2
  99. package/dist/src/agent/embedded/run-turn.js.map +1 -1
  100. package/dist/src/agent/embedded/session-tool-result-guard.js +1 -1
  101. package/dist/src/agent/embedded/subscribe-session.js +33 -51
  102. package/dist/src/agent/embedded/subscribe-session.js.map +1 -1
  103. package/dist/src/agent/embedded/types.d.ts +36 -35
  104. package/dist/src/agent/fallback/candidates.js +1 -1
  105. package/dist/src/agent/fallback/candidates.js.map +1 -1
  106. package/dist/src/agent/inbound/attachment-pipeline.js +2 -2
  107. package/dist/src/agent/inbound/attachment-pipeline.js.map +1 -1
  108. package/dist/src/agent/inbound/inbound-loop.js +1 -1
  109. package/dist/src/agent/inbound/turn-dispatcher.d.ts +1 -0
  110. package/dist/src/agent/inbound/turn-dispatcher.js +24 -5
  111. package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -1
  112. package/dist/src/agent/models/manager.d.ts +1 -1
  113. package/dist/src/agent/models/manager.js +1 -1
  114. package/dist/src/agent/models/manager.js.map +1 -1
  115. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.d.ts +1 -1
  116. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js +1 -1
  117. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js.map +1 -1
  118. package/dist/src/agent/prompt/sections/tooling.js +4 -0
  119. package/dist/src/agent/prompt/sections/tooling.js.map +1 -1
  120. package/dist/src/agent/service/direct-turn-helpers.d.ts +1 -0
  121. package/dist/src/agent/service/direct-turn-helpers.js +1 -1
  122. package/dist/src/agent/service/direct-turn-helpers.js.map +1 -1
  123. package/dist/src/agent/service/process-direct-streaming.d.ts +1 -0
  124. package/dist/src/agent/service/process-direct-streaming.js +35 -18
  125. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  126. package/dist/src/agent/service-inbound-utils.d.ts +0 -1
  127. package/dist/src/agent/service-inbound-utils.js +1 -17
  128. package/dist/src/agent/service-inbound-utils.js.map +1 -1
  129. package/dist/src/agent/service.d.ts +4 -4
  130. package/dist/src/agent/service.js +27 -15
  131. package/dist/src/agent/service.js.map +1 -1
  132. package/dist/src/agent/session/session-config-service.d.ts +1 -0
  133. package/dist/src/agent/session/session-config-service.js +9 -1
  134. package/dist/src/agent/session/session-config-service.js.map +1 -1
  135. package/dist/src/agent/session/session-inspector.d.ts +2 -1
  136. package/dist/src/agent/session/session-inspector.js +4 -0
  137. package/dist/src/agent/session/session-inspector.js.map +1 -1
  138. package/dist/src/agent/skills/config.js +1 -3
  139. package/dist/src/agent/skills/config.js.map +1 -1
  140. package/dist/src/agent/skills/format-skills-prompt.d.ts +1 -0
  141. package/dist/src/agent/skills/format-skills-prompt.js +3 -2
  142. package/dist/src/agent/skills/format-skills-prompt.js.map +1 -1
  143. package/dist/src/agent/skills/hub-pull.js +1 -1
  144. package/dist/src/agent/skills/index.js +20 -5
  145. package/dist/src/agent/skills/index.js.map +1 -1
  146. package/dist/src/agent/skills/installer.js +14 -27
  147. package/dist/src/agent/skills/installer.js.map +1 -1
  148. package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js +11 -1
  149. package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js.map +1 -1
  150. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js +18 -4
  151. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js.map +1 -1
  152. package/dist/src/agent/skills/marketplace/adapters/store/adapter.js +11 -2
  153. package/dist/src/agent/skills/marketplace/adapters/store/adapter.js.map +1 -1
  154. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.d.ts +2 -2
  155. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js.map +1 -1
  156. package/dist/src/agent/skills/skill-manager.d.ts +4 -1
  157. package/dist/src/agent/skills/skill-manager.js +3 -3
  158. package/dist/src/agent/skills/skill-manager.js.map +1 -1
  159. package/dist/src/agent/skills/skill-view-path.d.ts +1 -17
  160. package/dist/src/agent/skills/skill-view-path.js +3 -66
  161. package/dist/src/agent/skills/skill-view-path.js.map +1 -1
  162. package/dist/src/agent/skills/test-framework.js +2 -3
  163. package/dist/src/agent/skills/test-framework.js.map +1 -1
  164. package/dist/src/agent/streaming/reasoning-visibility-sse.js +1 -0
  165. package/dist/src/agent/streaming/reasoning-visibility-sse.js.map +1 -1
  166. package/dist/src/agent/tool-manuals/browser.d.ts +1 -0
  167. package/{skills/browser/SKILL.md → dist/src/agent/tool-manuals/browser.js} +51 -54
  168. package/dist/src/agent/tool-manuals/browser.js.map +1 -0
  169. package/dist/src/agent/tool-manuals/index.d.ts +10 -0
  170. package/dist/src/agent/tool-manuals/index.js +28 -0
  171. package/dist/src/agent/tool-manuals/index.js.map +1 -0
  172. package/dist/src/agent/tools/browser/tool/browser-use-tool.js +1 -1
  173. package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +1 -1
  174. package/dist/src/agent/tools/factory.js +7 -5
  175. package/dist/src/agent/tools/factory.js.map +1 -1
  176. package/dist/src/agent/tools/index.d.ts +1 -0
  177. package/dist/src/agent/tools/index.js +5 -4
  178. package/dist/src/agent/tools/send-media.js +1 -2
  179. package/dist/src/agent/tools/send-media.js.map +1 -1
  180. package/dist/src/agent/tools/session-search-tool.js +1 -1
  181. package/dist/src/agent/tools/shell.js +1 -1
  182. package/dist/src/agent/tools/skills-tools.js +37 -8
  183. package/dist/src/agent/tools/skills-tools.js.map +1 -1
  184. package/dist/src/agent/tools/tool-manual-tool.d.ts +6 -0
  185. package/dist/src/agent/tools/tool-manual-tool.js +34 -0
  186. package/dist/src/agent/tools/tool-manual-tool.js.map +1 -0
  187. package/dist/src/agent/tools/web-extract.js +2 -2
  188. package/dist/src/agent/tools/web.js +1 -1
  189. package/dist/src/agent/workflow/catalog.d.ts +7 -2
  190. package/dist/src/agent/workflow/catalog.js +66 -25
  191. package/dist/src/agent/workflow/catalog.js.map +1 -1
  192. package/dist/src/agent/workflow/subagent-runner.d.ts +3 -0
  193. package/dist/src/agent/workflow/subagent-runner.js +50 -4
  194. package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
  195. package/dist/src/agent/workflow/types.d.ts +10 -0
  196. package/dist/src/auth/credentials.d.ts +7 -0
  197. package/dist/src/auth/credentials.js +45 -7
  198. package/dist/src/auth/credentials.js.map +1 -1
  199. package/dist/src/auth/index.d.ts +1 -1
  200. package/dist/src/auth/index.js.map +1 -1
  201. package/dist/src/auth/oauth/github-copilot.d.ts +1 -1
  202. package/dist/src/auth/oauth/google-antigravity.d.ts +1 -3
  203. package/dist/src/auth/oauth/google-antigravity.js +1 -1
  204. package/dist/src/auth/oauth/google-gemini-cli.d.ts +1 -3
  205. package/dist/src/auth/oauth/google-gemini-cli.js +1 -1
  206. package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/google-antigravity.js +3 -5
  207. package/dist/src/auth/oauth/google-oauth/google-antigravity.js.map +1 -0
  208. package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/google-gemini-cli.js +4 -5
  209. package/dist/src/auth/oauth/google-oauth/google-gemini-cli.js.map +1 -0
  210. package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/oauth-page.js +12 -4
  211. package/dist/src/auth/oauth/google-oauth/oauth-page.js.map +1 -0
  212. package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/pkce.d.ts +1 -1
  213. package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/pkce.js +2 -2
  214. package/dist/src/auth/oauth/google-oauth/pkce.js.map +1 -0
  215. package/dist/src/auth/oauth/index.js +2 -2
  216. package/dist/src/auth/oauth/kimi-coding.d.ts +1 -1
  217. package/dist/src/auth/oauth/kimi-coding.js +1 -1
  218. package/dist/src/auth/oauth/kimi-coding.js.map +1 -1
  219. package/dist/src/auth/oauth/minimax-cn.js +1 -1
  220. package/dist/src/auth/oauth/minimax-cn.js.map +1 -1
  221. package/dist/src/auth/oauth/minimax.js +1 -1
  222. package/dist/src/auth/oauth/minimax.js.map +1 -1
  223. package/dist/src/auth/oauth/openai-codex.d.ts +7 -2
  224. package/dist/src/auth/oauth/openai-codex.js +318 -1
  225. package/dist/src/auth/oauth/openai-codex.js.map +1 -0
  226. package/dist/src/auth/profiles/store.js +3 -2
  227. package/dist/src/auth/profiles/store.js.map +1 -1
  228. package/dist/src/browser/actions/extension-registry-bridge.js +1 -1
  229. package/dist/src/browser/actions/registry.js +2 -2
  230. package/dist/src/browser/cdp-local-launcher.js +1 -1
  231. package/dist/src/browser/index.js +3 -3
  232. package/dist/src/browser/providers/browser-ext-install.js +1 -1
  233. package/dist/src/browser/providers/cloakbrowser.js +1 -1
  234. package/dist/src/channels/attachments/attachment-classifiers.d.ts +1 -0
  235. package/dist/src/channels/attachments/attachment-classifiers.js +13 -2
  236. package/dist/src/channels/attachments/attachment-classifiers.js.map +1 -1
  237. package/dist/src/channels/catalog/channel-catalog-service.d.ts +11 -0
  238. package/dist/src/channels/catalog/channel-catalog-service.js +168 -0
  239. package/dist/src/channels/catalog/channel-catalog-service.js.map +1 -0
  240. package/dist/src/channels/catalog/channel-catalog-types.d.ts +22 -0
  241. package/dist/src/channels/catalog/channel-catalog-types.js +1 -0
  242. package/dist/src/channels/dock.d.ts +0 -7
  243. package/dist/src/channels/dock.js +1 -21
  244. package/dist/src/channels/index.d.ts +1 -3
  245. package/dist/src/channels/index.js +1 -5
  246. package/dist/src/channels/lifecycle-supervisor.d.ts +1 -0
  247. package/dist/src/channels/lifecycle-supervisor.js +11 -0
  248. package/dist/src/channels/lifecycle-supervisor.js.map +1 -1
  249. package/dist/src/channels/manager.d.ts +1 -0
  250. package/dist/src/channels/manager.js +3 -0
  251. package/dist/src/channels/manager.js.map +1 -1
  252. package/dist/src/channels/pairing/pairing-channel.d.ts +2 -3
  253. package/dist/src/channels/pairing/pairing-messages.js +1 -1
  254. package/dist/src/channels/pairing/pairing-messages.js.map +1 -1
  255. package/dist/src/channels/pairing/pairing-service.d.ts +1 -1
  256. package/dist/src/channels/pairing/pairing-service.js +8 -27
  257. package/dist/src/channels/pairing/pairing-service.js.map +1 -1
  258. package/dist/src/channels/plugin-types.d.ts +3 -1
  259. package/dist/src/channels/plugins/types.adapters.d.ts +55 -2
  260. package/dist/src/channels/telegram/index.js +1 -1
  261. package/dist/src/chat-commands/builtins/config.js +4 -4
  262. package/dist/src/chat-commands/builtins/config.js.map +1 -1
  263. package/dist/src/chat-commands/builtins/model.js +2 -2
  264. package/dist/src/chat-commands/builtins/model.js.map +1 -1
  265. package/dist/src/chat-commands/config-paths.js +1 -1
  266. package/dist/src/chat-commands/config-paths.js.map +1 -1
  267. package/dist/src/chat-commands/context.js +1 -1
  268. package/dist/src/chat-commands/context.js.map +1 -1
  269. package/dist/src/cli/bin.js +1 -1
  270. package/dist/src/cli/command-manifest.js +2 -2
  271. package/dist/src/cli/command-manifest.js.map +1 -1
  272. package/dist/src/cli/commands/agent.js +2 -2
  273. package/dist/src/cli/commands/agent.js.map +1 -1
  274. package/dist/src/cli/commands/agents.js +2 -4
  275. package/dist/src/cli/commands/agents.js.map +1 -1
  276. package/dist/src/cli/commands/auth.js +40 -52
  277. package/dist/src/cli/commands/auth.js.map +1 -1
  278. package/dist/src/cli/commands/browser-cli-helpers.js +1 -1
  279. package/dist/src/cli/commands/channels.d.ts +1 -5
  280. package/dist/src/cli/commands/channels.js +115 -281
  281. package/dist/src/cli/commands/channels.js.map +1 -1
  282. package/dist/src/cli/commands/config.js +2 -2
  283. package/dist/src/cli/commands/config.js.map +1 -1
  284. package/dist/src/cli/commands/doctor/checks/channel-config.js +16 -69
  285. package/dist/src/cli/commands/doctor/checks/channel-config.js.map +1 -1
  286. package/dist/src/cli/commands/doctor/checks/channel-pairing-pending.js +6 -4
  287. package/dist/src/cli/commands/doctor/checks/channel-pairing-pending.js.map +1 -1
  288. package/dist/src/cli/commands/doctor/checks/channel-plugins.js +2 -2
  289. package/dist/src/cli/commands/doctor/checks/channel-plugins.js.map +1 -1
  290. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  291. package/dist/src/cli/commands/doctor/checks/provider-auth.js +13 -9
  292. package/dist/src/cli/commands/doctor/checks/provider-auth.js.map +1 -1
  293. package/dist/src/cli/commands/extension-dev.js +2 -1
  294. package/dist/src/cli/commands/extension-dev.js.map +1 -1
  295. package/dist/src/cli/commands/extension-marketplace.js +2 -1
  296. package/dist/src/cli/commands/extension-marketplace.js.map +1 -1
  297. package/dist/src/cli/commands/extension-pack.js +2 -1
  298. package/dist/src/cli/commands/extension-pack.js.map +1 -1
  299. package/dist/src/cli/commands/models.js +192 -54
  300. package/dist/src/cli/commands/models.js.map +1 -1
  301. package/dist/src/cli/commands/onboard/channels/index.js +1 -1
  302. package/dist/src/cli/commands/onboard/channels/index.js.map +1 -1
  303. package/dist/src/cli/commands/onboard/channels/registry.d.ts +2 -1
  304. package/dist/src/cli/commands/onboard/channels/registry.js +32 -8
  305. package/dist/src/cli/commands/onboard/channels/registry.js.map +1 -1
  306. package/dist/src/cli/commands/onboard/model.d.ts +1 -4
  307. package/dist/src/cli/commands/onboard/model.js +257 -184
  308. package/dist/src/cli/commands/onboard/model.js.map +1 -1
  309. package/dist/src/cli/commands/onboard.js +4 -6
  310. package/dist/src/cli/commands/onboard.js.map +1 -1
  311. package/dist/src/cli/commands/setup-shared/runner.d.ts +1 -1
  312. package/dist/src/cli/commands/setup-shared/runner.js.map +1 -1
  313. package/dist/src/cli/commands/setup-shared/types.d.ts +1 -1
  314. package/dist/src/cli/commands/setup-shared/types.js.map +1 -1
  315. package/dist/src/cli/commands/tui.js +13 -5
  316. package/dist/src/cli/commands/tui.js.map +1 -1
  317. package/dist/src/cli/extension-cli-register.js +1 -1
  318. package/dist/src/cli/utils/oauth-login.d.ts +17 -0
  319. package/dist/src/cli/utils/oauth-login.js +93 -0
  320. package/dist/src/cli/utils/oauth-login.js.map +1 -0
  321. package/dist/src/cli/utils/oauth-providers.js +2 -2
  322. package/dist/src/commands/agents.config.d.ts +3 -3
  323. package/dist/src/commands/agents.config.js +7 -7
  324. package/dist/src/commands/agents.config.js.map +1 -1
  325. package/dist/src/config/agent-profile.d.ts +1 -1
  326. package/dist/src/config/agent-profile.js +6 -2
  327. package/dist/src/config/agent-profile.js.map +1 -1
  328. package/dist/src/config/agent-typed-models.d.ts +2 -2
  329. package/dist/src/config/agent-typed-models.js +13 -2
  330. package/dist/src/config/agent-typed-models.js.map +1 -1
  331. package/dist/src/config/index.js +3 -3
  332. package/dist/src/config/integration.d.ts +1 -1
  333. package/dist/src/config/loader.d.ts +0 -1
  334. package/dist/src/config/loader.js +4 -9
  335. package/dist/src/config/loader.js.map +1 -1
  336. package/dist/src/config/models-json.d.ts +6 -6
  337. package/dist/src/config/rules.js +2 -12
  338. package/dist/src/config/rules.js.map +1 -1
  339. package/dist/src/config/schema.d.ts +74 -47
  340. package/dist/src/config/schema.js +28 -66
  341. package/dist/src/config/schema.js.map +1 -1
  342. package/dist/src/config/validate-channel-configs.d.ts +0 -3
  343. package/dist/src/config/validate-channel-configs.js +29 -10
  344. package/dist/src/config/validate-channel-configs.js.map +1 -1
  345. package/dist/src/cron/executor.js +1 -4
  346. package/dist/src/cron/executor.js.map +1 -1
  347. package/dist/src/extensions/activation-context.js +3 -1
  348. package/dist/src/extensions/activation-context.js.map +1 -1
  349. package/dist/src/extensions/activation-planner.js +12 -0
  350. package/dist/src/extensions/activation-planner.js.map +1 -1
  351. package/dist/src/extensions/api.d.ts +5 -1
  352. package/dist/src/extensions/api.js +12 -0
  353. package/dist/src/extensions/api.js.map +1 -1
  354. package/dist/src/extensions/discover-extensions.js +17 -13
  355. package/dist/src/extensions/discover-extensions.js.map +1 -1
  356. package/dist/src/extensions/extension-metadata-snapshot.js +11 -5
  357. package/dist/src/extensions/extension-metadata-snapshot.js.map +1 -1
  358. package/dist/src/extensions/index.js +12 -4
  359. package/dist/src/extensions/index.js.map +1 -0
  360. package/dist/src/extensions/loader.d.ts +5 -1
  361. package/dist/src/extensions/loader.js +12 -11
  362. package/dist/src/extensions/loader.js.map +1 -1
  363. package/dist/src/extensions/manifest-registry.js +98 -93
  364. package/dist/src/extensions/manifest-registry.js.map +1 -1
  365. package/dist/src/extensions/normalize-manifest.js +91 -15
  366. package/dist/src/extensions/normalize-manifest.js.map +1 -1
  367. package/dist/src/extensions/sdk/index.js +1 -1
  368. package/dist/src/extensions/sdk/testing.js +4 -0
  369. package/dist/src/extensions/sdk/testing.js.map +1 -1
  370. package/dist/src/extensions/types/core.d.ts +32 -1
  371. package/dist/src/extensions/types/manifest.d.ts +60 -0
  372. package/dist/src/extensions/types/tui.d.ts +414 -5
  373. package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
  374. package/dist/src/gateway/agent-builtin-tools.js +16 -0
  375. package/dist/src/gateway/agent-builtin-tools.js.map +1 -1
  376. package/dist/src/gateway/agent-run-relay.d.ts +2 -3
  377. package/dist/src/gateway/agent-run-relay.js +10 -3
  378. package/dist/src/gateway/agent-run-relay.js.map +1 -1
  379. package/dist/src/gateway/agents-admin.d.ts +32 -19
  380. package/dist/src/gateway/agents-admin.js +113 -93
  381. package/dist/src/gateway/agents-admin.js.map +1 -1
  382. package/dist/src/gateway/chat-stream/mapper.d.ts +34 -0
  383. package/dist/src/gateway/chat-stream/mapper.js +244 -0
  384. package/dist/src/gateway/chat-stream/mapper.js.map +1 -0
  385. package/dist/src/gateway/chat-stream/protocol.d.ts +100 -0
  386. package/dist/src/gateway/chat-stream/protocol.js +1 -0
  387. package/dist/src/gateway/hono/lib/agent-model.d.ts +4 -4
  388. package/dist/src/gateway/hono/lib/agent-model.js +13 -11
  389. package/dist/src/gateway/hono/lib/agent-model.js.map +1 -1
  390. package/dist/src/gateway/hono/lib/config-payload.d.ts +19 -7
  391. package/dist/src/gateway/hono/lib/config-payload.js +16 -15
  392. package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
  393. package/dist/src/gateway/hono/oauth-async.js +2 -2
  394. package/dist/src/gateway/hono/oauth.js +2 -2
  395. package/dist/src/gateway/hono/routes/agents.js +83 -48
  396. package/dist/src/gateway/hono/routes/agents.js.map +1 -1
  397. package/dist/src/gateway/hono/routes/channels.js +134 -214
  398. package/dist/src/gateway/hono/routes/channels.js.map +1 -1
  399. package/dist/src/gateway/hono/routes/commands-skills.js +10 -4
  400. package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
  401. package/dist/src/gateway/hono/routes/config-patch/agents.js +26 -13
  402. package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -1
  403. package/dist/src/gateway/hono/routes/config-patch/channels.d.ts +1 -11
  404. package/dist/src/gateway/hono/routes/config-patch/channels.js +18 -165
  405. package/dist/src/gateway/hono/routes/config-patch/channels.js.map +1 -1
  406. package/dist/src/gateway/hono/routes/config.js +5 -2
  407. package/dist/src/gateway/hono/routes/config.js.map +1 -1
  408. package/dist/src/gateway/hono/routes/dreaming.js +1 -1
  409. package/dist/src/gateway/hono/routes/lazy-bundles.js +13 -1
  410. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  411. package/dist/src/gateway/hono/routes/models.js +25 -5
  412. package/dist/src/gateway/hono/routes/models.js.map +1 -1
  413. package/dist/src/gateway/hono/routes/public-gateway.js +2 -4
  414. package/dist/src/gateway/hono/routes/public-gateway.js.map +1 -1
  415. package/dist/src/gateway/hono/routes/sessions.js +179 -0
  416. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  417. package/dist/src/gateway/hono/routes/tui.d.ts +3 -0
  418. package/dist/src/gateway/hono/routes/tui.js +16 -0
  419. package/dist/src/gateway/hono/routes/tui.js.map +1 -0
  420. package/dist/src/gateway/hono/routes/workflows.js +25 -1
  421. package/dist/src/gateway/hono/routes/workflows.js.map +1 -1
  422. package/dist/src/gateway/hono/sse.d.ts +5 -7
  423. package/dist/src/gateway/hono/sse.js +21 -38
  424. package/dist/src/gateway/hono/sse.js.map +1 -1
  425. package/dist/src/gateway/protocol.js.map +1 -1
  426. package/dist/src/gateway/service/agent-runner.d.ts +2 -4
  427. package/dist/src/gateway/service/agent-runner.js +1 -1
  428. package/dist/src/gateway/service/agent-runner.js.map +1 -1
  429. package/dist/src/gateway/service/marketplace-service.d.ts +4 -3
  430. package/dist/src/gateway/service/marketplace-service.js +7 -4
  431. package/dist/src/gateway/service/marketplace-service.js.map +1 -1
  432. package/dist/src/gateway/service/run-gateway-agent.d.ts +2 -6
  433. package/dist/src/gateway/service/run-gateway-agent.js +63 -36
  434. package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
  435. package/dist/src/gateway/service/sessions-api.d.ts +19 -0
  436. package/dist/src/gateway/service/sessions-api.js +12 -0
  437. package/dist/src/gateway/service/sessions-api.js.map +1 -1
  438. package/dist/src/gateway/service.d.ts +6 -0
  439. package/dist/src/gateway/service.js +73 -57
  440. package/dist/src/gateway/service.js.map +1 -1
  441. package/dist/src/mcp/channel-bridge.js +1 -1
  442. package/dist/src/media/store.js +3 -0
  443. package/dist/src/media/store.js.map +1 -1
  444. package/dist/src/notes/service.js +1 -1
  445. package/dist/src/notes/service.js.map +1 -1
  446. package/dist/src/project-trust/trust-store.d.ts +30 -0
  447. package/dist/src/project-trust/trust-store.js +194 -0
  448. package/dist/src/project-trust/trust-store.js.map +1 -0
  449. package/dist/src/providers/index.d.ts +4 -4
  450. package/dist/src/providers/index.js +41 -22
  451. package/dist/src/providers/index.js.map +1 -1
  452. package/dist/src/providers/presentation.d.ts +34 -0
  453. package/dist/src/providers/presentation.js +162 -0
  454. package/dist/src/providers/presentation.js.map +1 -0
  455. package/dist/src/routing/resolve-route.d.ts +0 -3
  456. package/dist/src/routing/resolve-route.js.map +1 -1
  457. package/dist/src/routing/resolve-tui-session-key.d.ts +2 -0
  458. package/dist/src/routing/resolve-tui-session-key.js +8 -3
  459. package/dist/src/routing/resolve-tui-session-key.js.map +1 -1
  460. package/dist/src/session/client-history.d.ts +32 -0
  461. package/dist/src/session/client-history.js +232 -1
  462. package/dist/src/session/client-history.js.map +1 -1
  463. package/dist/src/session/manager.d.ts +37 -4
  464. package/dist/src/session/manager.js +39 -15
  465. package/dist/src/session/manager.js.map +1 -1
  466. package/dist/src/session/session-context-for-llm.d.ts +93 -1
  467. package/dist/src/session/session-context-for-llm.js +105 -2
  468. package/dist/src/session/session-context-for-llm.js.map +1 -1
  469. package/dist/src/session/store.d.ts +37 -0
  470. package/dist/src/session/store.js +127 -2
  471. package/dist/src/session/store.js.map +1 -1
  472. package/dist/src/session/stored-rows-to-file-entries.js +37 -1
  473. package/dist/src/session/stored-rows-to-file-entries.js.map +1 -1
  474. package/dist/src/session/types.d.ts +14 -1
  475. package/dist/src/session/types.js.map +1 -1
  476. package/dist/src/share/share-thumbnail.js +1 -1
  477. package/dist/src/storage/sqlite/migrations/004_add_session_type_metadata.sql +15 -0
  478. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  479. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  480. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  481. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  482. package/dist/src/storage/sqlite/row-mappers.d.ts +14 -1
  483. package/dist/src/storage/sqlite/row-mappers.js +14 -1
  484. package/dist/src/storage/sqlite/row-mappers.js.map +1 -1
  485. package/dist/src/storage/sqlite/schema.js +1 -1
  486. package/dist/src/storage/sqlite/session-metadata.js +1 -0
  487. package/dist/src/storage/sqlite/session-metadata.js.map +1 -1
  488. package/dist/src/storage/sqlite/session-repository.js +52 -25
  489. package/dist/src/storage/sqlite/session-repository.js.map +1 -1
  490. package/dist/src/tui/backends/embedded-backend.d.ts +53 -4
  491. package/dist/src/tui/backends/embedded-backend.js +227 -39
  492. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  493. package/dist/src/tui/backends/gateway-sse-backend.d.ts +59 -3
  494. package/dist/src/tui/backends/gateway-sse-backend.js +416 -26
  495. package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
  496. package/dist/src/tui/chat-history.d.ts +5 -1
  497. package/dist/src/tui/chat-history.js +78 -8
  498. package/dist/src/tui/chat-history.js.map +1 -1
  499. package/dist/src/tui/clipboard-text.d.ts +5 -0
  500. package/dist/src/tui/clipboard-text.js +46 -0
  501. package/dist/src/tui/clipboard-text.js.map +1 -0
  502. package/dist/src/tui/components/assistant-message.d.ts +19 -3
  503. package/dist/src/tui/components/assistant-message.js +115 -9
  504. package/dist/src/tui/components/assistant-message.js.map +1 -1
  505. package/dist/src/tui/components/bash-execution.d.ts +3 -2
  506. package/dist/src/tui/components/bash-execution.js +31 -3
  507. package/dist/src/tui/components/bash-execution.js.map +1 -1
  508. package/dist/src/tui/components/bash-summary.d.ts +23 -0
  509. package/dist/src/tui/components/bash-summary.js +87 -0
  510. package/dist/src/tui/components/bash-summary.js.map +1 -0
  511. package/dist/src/tui/components/branch-message-summary.d.ts +17 -0
  512. package/dist/src/tui/components/branch-message-summary.js +43 -0
  513. package/dist/src/tui/components/branch-message-summary.js.map +1 -0
  514. package/dist/src/tui/components/branch-summary.d.ts +13 -0
  515. package/dist/src/tui/components/branch-summary.js +51 -0
  516. package/dist/src/tui/components/branch-summary.js.map +1 -0
  517. package/dist/src/tui/components/chat-log.d.ts +46 -6
  518. package/dist/src/tui/components/chat-log.js +183 -21
  519. package/dist/src/tui/components/chat-log.js.map +1 -1
  520. package/dist/src/tui/components/compaction-summary.d.ts +13 -0
  521. package/dist/src/tui/components/compaction-summary.js +46 -0
  522. package/dist/src/tui/components/compaction-summary.js.map +1 -0
  523. package/dist/src/tui/components/custom-editor.d.ts +1 -0
  524. package/dist/src/tui/components/custom-editor.js +2 -0
  525. package/dist/src/tui/components/custom-editor.js.map +1 -1
  526. package/dist/src/tui/components/custom-message.d.ts +23 -0
  527. package/dist/src/tui/components/custom-message.js +65 -0
  528. package/dist/src/tui/components/custom-message.js.map +1 -0
  529. package/dist/src/tui/components/extension-dialog.d.ts +42 -0
  530. package/dist/src/tui/components/extension-dialog.js +127 -0
  531. package/dist/src/tui/components/extension-dialog.js.map +1 -0
  532. package/dist/src/tui/components/scoped-models-selector.d.ts +7 -2
  533. package/dist/src/tui/components/scoped-models-selector.js +89 -16
  534. package/dist/src/tui/components/scoped-models-selector.js.map +1 -1
  535. package/dist/src/tui/components/searchable-select-list.d.ts +30 -3
  536. package/dist/src/tui/components/searchable-select-list.js +82 -10
  537. package/dist/src/tui/components/searchable-select-list.js.map +1 -1
  538. package/dist/src/tui/components/session-selector.d.ts +18 -4
  539. package/dist/src/tui/components/session-selector.js +207 -40
  540. package/dist/src/tui/components/session-selector.js.map +1 -1
  541. package/dist/src/tui/components/settings-selector.d.ts +6 -2
  542. package/dist/src/tui/components/settings-selector.js +126 -7
  543. package/dist/src/tui/components/settings-selector.js.map +1 -1
  544. package/dist/src/tui/components/thinking-selector.d.ts +12 -0
  545. package/dist/src/tui/components/thinking-selector.js +48 -0
  546. package/dist/src/tui/components/thinking-selector.js.map +1 -0
  547. package/dist/src/tui/components/tool-execution.d.ts +57 -3
  548. package/dist/src/tui/components/tool-execution.js +378 -28
  549. package/dist/src/tui/components/tool-execution.js.map +1 -1
  550. package/dist/src/tui/components/tui-bottom-bar.d.ts +9 -1
  551. package/dist/src/tui/components/tui-bottom-bar.js +56 -11
  552. package/dist/src/tui/components/tui-bottom-bar.js.map +1 -1
  553. package/dist/src/tui/components/tui-header.d.ts +9 -2
  554. package/dist/src/tui/components/tui-header.js +25 -5
  555. package/dist/src/tui/components/tui-header.js.map +1 -1
  556. package/dist/src/tui/components/user-message.d.ts +4 -2
  557. package/dist/src/tui/components/user-message.js +42 -9
  558. package/dist/src/tui/components/user-message.js.map +1 -1
  559. package/dist/src/tui/components/visual-truncate.d.ts +11 -0
  560. package/dist/src/tui/components/visual-truncate.js +27 -0
  561. package/dist/src/tui/components/visual-truncate.js.map +1 -0
  562. package/dist/src/tui/extension-host/autocomplete.d.ts +43 -0
  563. package/dist/src/tui/extension-host/autocomplete.js +116 -0
  564. package/dist/src/tui/extension-host/autocomplete.js.map +1 -0
  565. package/dist/src/tui/extension-host/host.d.ts +31 -1
  566. package/dist/src/tui/extension-host/host.js +123 -6
  567. package/dist/src/tui/extension-host/host.js.map +1 -1
  568. package/dist/src/tui/extension-host/load-extensions.d.ts +6 -1
  569. package/dist/src/tui/extension-host/load-extensions.js +4 -3
  570. package/dist/src/tui/extension-host/load-extensions.js.map +1 -1
  571. package/dist/src/tui/extension-host/runtime-context.d.ts +21 -0
  572. package/dist/src/tui/extension-host/runtime-context.js +152 -0
  573. package/dist/src/tui/extension-host/runtime-context.js.map +1 -0
  574. package/dist/src/tui/extension-host/runtime.d.ts +52 -4
  575. package/dist/src/tui/extension-host/runtime.js +547 -85
  576. package/dist/src/tui/extension-host/runtime.js.map +1 -1
  577. package/dist/src/tui/extension-host/surface.d.ts +20 -0
  578. package/dist/src/tui/extension-host/surface.js +30 -6
  579. package/dist/src/tui/extension-host/surface.js.map +1 -1
  580. package/dist/src/tui/extension-host/tool-renderers.d.ts +6 -3
  581. package/dist/src/tui/extension-host/tool-renderers.js +43 -5
  582. package/dist/src/tui/extension-host/tool-renderers.js.map +1 -1
  583. package/dist/src/tui/format-tui-hotkeys.d.ts +12 -2
  584. package/dist/src/tui/format-tui-hotkeys.js +22 -5
  585. package/dist/src/tui/format-tui-hotkeys.js.map +1 -1
  586. package/dist/src/tui/tui-agent-events.d.ts +8 -6
  587. package/dist/src/tui/tui-agent-events.js +200 -59
  588. package/dist/src/tui/tui-agent-events.js.map +1 -1
  589. package/dist/src/tui/tui-backend.d.ts +169 -3
  590. package/dist/src/tui/tui-command-formatters.d.ts +76 -0
  591. package/dist/src/tui/tui-command-formatters.js +594 -0
  592. package/dist/src/tui/tui-command-formatters.js.map +1 -0
  593. package/dist/src/tui/tui-commands.d.ts +57 -7
  594. package/dist/src/tui/tui-commands.js +639 -43
  595. package/dist/src/tui/tui-commands.js.map +1 -1
  596. package/dist/src/tui/tui-context-usage.d.ts +1 -1
  597. package/dist/src/tui/tui-context-usage.js +9 -1
  598. package/dist/src/tui/tui-context-usage.js.map +1 -1
  599. package/dist/src/tui/tui-extension-user-message.d.ts +8 -0
  600. package/dist/src/tui/tui-extension-user-message.js +32 -0
  601. package/dist/src/tui/tui-extension-user-message.js.map +1 -0
  602. package/dist/src/tui/tui-follow-up-queue.d.ts +9 -0
  603. package/dist/src/tui/tui-follow-up-queue.js +18 -0
  604. package/dist/src/tui/tui-follow-up-queue.js.map +1 -0
  605. package/dist/src/tui/tui-local-shell.d.ts +11 -1
  606. package/dist/src/tui/tui-local-shell.js +50 -8
  607. package/dist/src/tui/tui-local-shell.js.map +1 -1
  608. package/dist/src/tui/tui-model-picker.d.ts +26 -0
  609. package/dist/src/tui/tui-model-picker.js +152 -0
  610. package/dist/src/tui/tui-model-picker.js.map +1 -0
  611. package/dist/src/tui/tui-oauth-login.d.ts +16 -0
  612. package/dist/src/tui/tui-oauth-login.js +189 -0
  613. package/dist/src/tui/tui-oauth-login.js.map +1 -0
  614. package/dist/src/tui/tui-overlays.d.ts +3 -3
  615. package/dist/src/tui/tui-overlays.js +6 -7
  616. package/dist/src/tui/tui-overlays.js.map +1 -1
  617. package/dist/src/tui/tui-picker-overlay.d.ts +27 -32
  618. package/dist/src/tui/tui-picker-overlay.js +340 -30
  619. package/dist/src/tui/tui-picker-overlay.js.map +1 -1
  620. package/dist/src/tui/tui-picker-services.d.ts +41 -0
  621. package/dist/src/tui/tui-picker-services.js +1 -0
  622. package/dist/src/tui/tui-run-state.d.ts +11 -0
  623. package/dist/src/tui/tui-run-state.js +114 -0
  624. package/dist/src/tui/tui-run-state.js.map +1 -0
  625. package/dist/src/tui/tui-runtime-hints.d.ts +4 -0
  626. package/dist/src/tui/tui-runtime-hints.js +18 -0
  627. package/dist/src/tui/tui-runtime-hints.js.map +1 -0
  628. package/dist/src/tui/tui-scoped-models.d.ts +1 -1
  629. package/dist/src/tui/tui-scoped-models.js +2 -2
  630. package/dist/src/tui/tui-scoped-models.js.map +1 -1
  631. package/dist/src/tui/tui-session-actions.d.ts +5 -3
  632. package/dist/src/tui/tui-session-actions.js +21 -9
  633. package/dist/src/tui/tui-session-actions.js.map +1 -1
  634. package/dist/src/tui/tui-session-format.d.ts +4 -1
  635. package/dist/src/tui/tui-session-format.js +17 -3
  636. package/dist/src/tui/tui-session-format.js.map +1 -1
  637. package/dist/src/tui/tui-session-snapshot.d.ts +82 -0
  638. package/dist/src/tui/tui-session-snapshot.js +184 -0
  639. package/dist/src/tui/tui-session-snapshot.js.map +1 -0
  640. package/dist/src/tui/tui-session-stats.d.ts +3 -0
  641. package/dist/src/tui/tui-session-stats.js +59 -0
  642. package/dist/src/tui/tui-session-stats.js.map +1 -0
  643. package/dist/src/tui/tui-settings.d.ts +21 -0
  644. package/dist/src/tui/tui-settings.js +28 -1
  645. package/dist/src/tui/tui-settings.js.map +1 -1
  646. package/dist/src/tui/tui-skills-autocomplete.js +1 -1
  647. package/dist/src/tui/tui-skills-autocomplete.js.map +1 -1
  648. package/dist/src/tui/tui-startup-resources.d.ts +3 -0
  649. package/dist/src/tui/tui-startup-resources.js +39 -0
  650. package/dist/src/tui/tui-startup-resources.js.map +1 -0
  651. package/dist/src/tui/tui-startup-text.d.ts +10 -0
  652. package/dist/src/tui/tui-startup-text.js +58 -0
  653. package/dist/src/tui/tui-startup-text.js.map +1 -0
  654. package/dist/src/tui/tui-stdio-filter.d.ts +1 -0
  655. package/dist/src/tui/tui-stdio-filter.js +11 -7
  656. package/dist/src/tui/tui-stdio-filter.js.map +1 -1
  657. package/dist/src/tui/tui-submit.d.ts +2 -0
  658. package/dist/src/tui/tui-submit.js +2 -1
  659. package/dist/src/tui/tui-submit.js.map +1 -1
  660. package/dist/src/tui/tui-tool-diff.js +61 -7
  661. package/dist/src/tui/tui-tool-diff.js.map +1 -1
  662. package/dist/src/tui/tui-tool-result.d.ts +17 -0
  663. package/dist/src/tui/tui-tool-result.js +74 -0
  664. package/dist/src/tui/tui-tool-result.js.map +1 -0
  665. package/dist/src/tui/tui-transcript-tree-picker.d.ts +57 -0
  666. package/dist/src/tui/tui-transcript-tree-picker.js +604 -0
  667. package/dist/src/tui/tui-transcript-tree-picker.js.map +1 -0
  668. package/dist/src/tui/tui-transcript-tree.d.ts +7 -0
  669. package/dist/src/tui/tui-transcript-tree.js +316 -0
  670. package/dist/src/tui/tui-transcript-tree.js.map +1 -0
  671. package/dist/src/tui/tui-types.d.ts +25 -34
  672. package/dist/src/tui/tui-types.js +12 -0
  673. package/dist/src/tui/tui-types.js.map +1 -1
  674. package/dist/src/tui/tui.js +1288 -112
  675. package/dist/src/tui/tui.js.map +1 -1
  676. package/dist/src/tui/xopc-tui-keybindings.d.ts +127 -2
  677. package/dist/src/tui/xopc-tui-keybindings.js +127 -2
  678. package/dist/src/tui/xopc-tui-keybindings.js.map +1 -1
  679. package/dist/src/workflows/domain/definition-utils.d.ts +2 -1
  680. package/dist/src/workflows/domain/definition-utils.js +18 -8
  681. package/dist/src/workflows/domain/definition-utils.js.map +1 -1
  682. package/dist/src/workflows/domain/definition.d.ts +25 -0
  683. package/dist/src/workflows/domain/event.d.ts +1 -0
  684. package/dist/src/workflows/domain/result.d.ts +15 -0
  685. package/dist/src/workflows/domain/run.d.ts +2 -0
  686. package/dist/src/workflows/domain/run.js.map +1 -1
  687. package/dist/src/workflows/engine/projector.js +4 -0
  688. package/dist/src/workflows/engine/projector.js.map +1 -1
  689. package/dist/src/workflows/engine/workflow-engine.d.ts +37 -1
  690. package/dist/src/workflows/engine/workflow-engine.js +75 -11
  691. package/dist/src/workflows/engine/workflow-engine.js.map +1 -1
  692. package/dist/src/workflows/index.d.ts +1 -0
  693. package/dist/src/workflows/index.js +4 -1
  694. package/dist/src/workflows/registry/catalog-workflow-definition-registry.d.ts +9 -0
  695. package/dist/src/workflows/registry/catalog-workflow-definition-registry.js +40 -0
  696. package/dist/src/workflows/registry/catalog-workflow-definition-registry.js.map +1 -0
  697. package/dist/src/workflows/registry/index.d.ts +2 -0
  698. package/dist/src/workflows/registry/index.js +2 -0
  699. package/dist/src/workflows/registry/workflow-definition-registry.d.ts +15 -0
  700. package/dist/src/workflows/registry/workflow-definition-registry.js +1 -0
  701. package/dist/src/workflows/runtime/index.d.ts +2 -0
  702. package/dist/src/workflows/runtime/index.js +2 -1
  703. package/dist/src/workflows/runtime/script-workflow-runtime.d.ts +5 -0
  704. package/dist/src/workflows/runtime/script-workflow-runtime.js +15 -0
  705. package/dist/src/workflows/runtime/script-workflow-runtime.js.map +1 -0
  706. package/dist/src/workflows/runtime/workflow-runtime-port.d.ts +16 -0
  707. package/dist/src/workflows/runtime/workflow-runtime-port.js +1 -0
  708. package/dist/src/workflows/service/run-view-to-snapshot.js +3 -0
  709. package/dist/src/workflows/service/run-view-to-snapshot.js.map +1 -1
  710. package/dist/src/workflows/service/workflow-run-service.d.ts +3 -0
  711. package/dist/src/workflows/service/workflow-run-service.js +10 -15
  712. package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
  713. package/dist/src/workflows/service/workflow-session-bridge.d.ts +1 -1
  714. package/dist/src/workflows/service/workflow-session-bridge.js +4 -1
  715. package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
  716. package/package.json +21 -15
  717. package/skills/creative/frontend-design/SKILL.md +1 -1
  718. package/skills/creative/theme-factory/SKILL.md +1 -1
  719. package/skills/documents/xlsx/SKILL.md +1 -1
  720. package/skills/engineering/diagnose/SKILL.md +2 -2
  721. package/skills/engineering/tdd/SKILL.md +1 -1
  722. package/skills/tools/github/SKILL.md +6 -1
  723. package/skills/tools/webapp-testing/SKILL.md +4 -1
  724. package/dist/extensions/telegram/src/adapters/config-surface.d.ts +0 -2
  725. package/dist/extensions/telegram/src/adapters/config-surface.js +0 -26
  726. package/dist/extensions/telegram/src/adapters/config-surface.js.map +0 -1
  727. package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js +0 -158
  728. package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js.map +0 -1
  729. package/dist/gateway/static/root/assets/agents-DQ0mQxIA.js +0 -222
  730. package/dist/gateway/static/root/assets/channels-settings-BEtP53V6.js +0 -1
  731. package/dist/gateway/static/root/assets/channels-status-swr-CxTtS1hI.js +0 -8
  732. package/dist/gateway/static/root/assets/cron-api-CznlPIZT.js +0 -1
  733. package/dist/gateway/static/root/assets/cron-page-Dx6dE3eD.js +0 -1
  734. package/dist/gateway/static/root/assets/extension-settings-page-DuDCSb3J.js +0 -1
  735. package/dist/gateway/static/root/assets/field-primitives-BUwUiDf5.js +0 -1
  736. package/dist/gateway/static/root/assets/heartbeat-config-api-BjFW1cl-.js +0 -1
  737. package/dist/gateway/static/root/assets/index-DKgHC1Ta.js +0 -4840
  738. package/dist/gateway/static/root/assets/index-DjNDHzwG.css +0 -1
  739. package/dist/gateway/static/root/assets/notes-page-D40ZpS0Y.js +0 -1
  740. package/dist/gateway/static/root/assets/sessions-page-BvtdbmW8.js +0 -1
  741. package/dist/gateway/static/root/assets/settings-advanced-gate-BQamRjkV.js +0 -2
  742. package/dist/gateway/static/root/assets/settings-page-D972_jaS.js +0 -3
  743. package/dist/gateway/static/root/assets/share-preview-page-CKCTMo0_.js +0 -2
  744. package/dist/gateway/static/root/assets/skills-page-QwFCB4yV.js +0 -2
  745. package/dist/gateway/static/root/assets/url-q28QhI7l.js +0 -3
  746. package/dist/gateway/static/root/assets/utils-DCm11_KW.js +0 -1
  747. package/dist/gateway/static/root/assets/voice-api-key-field-CywiB7Dw.js +0 -1
  748. package/dist/gateway/static/root/assets/workflows-page-Be7l_SWw.js +0 -27
  749. package/dist/src/agent/embedded/map-stream-events.d.ts +0 -9
  750. package/dist/src/agent/embedded/map-stream-events.js +0 -63
  751. package/dist/src/agent/embedded/map-stream-events.js.map +0 -1
  752. package/dist/src/auth/oauth/vendor-pi-google/google-antigravity.js.map +0 -1
  753. package/dist/src/auth/oauth/vendor-pi-google/google-gemini-cli.js.map +0 -1
  754. package/dist/src/auth/oauth/vendor-pi-google/oauth-page.js.map +0 -1
  755. package/dist/src/auth/oauth/vendor-pi-google/pkce.js.map +0 -1
  756. package/dist/src/channels/dock.js.map +0 -1
  757. package/dist/src/channels/plugins/bundled.d.ts +0 -11
  758. package/dist/src/channels/plugins/bundled.js +0 -10
  759. package/dist/src/channels/plugins/bundled.js.map +0 -1
  760. package/dist/src/channels/registry.d.ts +0 -25
  761. package/dist/src/channels/registry.js +0 -82
  762. package/dist/src/channels/registry.js.map +0 -1
  763. package/dist/src/config/localized-text.d.ts +0 -6
  764. package/dist/src/config/localized-text.js +0 -42
  765. package/dist/src/config/localized-text.js.map +0 -1
  766. package/dist/src/generated/bundled-channel-plugins.d.ts +0 -10
  767. package/dist/src/generated/bundled-channel-plugins.js +0 -16
  768. package/dist/src/generated/bundled-channel-plugins.js.map +0 -1
  769. package/dist/src/tui/stream-assembler.d.ts +0 -22
  770. package/dist/src/tui/stream-assembler.js +0 -63
  771. package/dist/src/tui/stream-assembler.js.map +0 -1
  772. package/skills/browser/SKILL-zh.md +0 -188
  773. package/skills/business/company-values/SKILL-zh.md +0 -80
  774. package/skills/business/company-values/SKILL.md +0 -80
  775. package/skills/business/find-community/SKILL-zh.md +0 -50
  776. package/skills/business/find-community/SKILL.md +0 -50
  777. package/skills/business/first-customers/SKILL-zh.md +0 -76
  778. package/skills/business/first-customers/SKILL.md +0 -76
  779. package/skills/business/grow-sustainably/SKILL-zh.md +0 -92
  780. package/skills/business/grow-sustainably/SKILL.md +0 -92
  781. package/skills/business/marketing-plan/SKILL-zh.md +0 -100
  782. package/skills/business/marketing-plan/SKILL.md +0 -100
  783. package/skills/business/minimalist-review/SKILL-zh.md +0 -82
  784. package/skills/business/minimalist-review/SKILL.md +0 -82
  785. package/skills/business/mvp/SKILL-zh.md +0 -81
  786. package/skills/business/mvp/SKILL.md +0 -81
  787. package/skills/business/pricing/SKILL-zh.md +0 -64
  788. package/skills/business/pricing/SKILL.md +0 -64
  789. package/skills/business/processize/SKILL-zh.md +0 -91
  790. package/skills/business/processize/SKILL.md +0 -91
  791. package/skills/business/validate-idea/SKILL-zh.md +0 -68
  792. package/skills/business/validate-idea/SKILL.md +0 -68
  793. package/skills/creative/algorithmic-art/LICENSE.txt +0 -202
  794. package/skills/creative/algorithmic-art/SKILL-zh.md +0 -405
  795. package/skills/creative/algorithmic-art/SKILL.md +0 -405
  796. package/skills/creative/algorithmic-art/templates/generator_template.js +0 -223
  797. package/skills/creative/algorithmic-art/templates/viewer.html +0 -599
  798. package/skills/creative/frontend-design/SKILL-zh.md +0 -42
  799. package/skills/creative/theme-factory/SKILL-zh.md +0 -59
  800. package/skills/creative/web-artifacts-builder/LICENSE.txt +0 -202
  801. package/skills/creative/web-artifacts-builder/SKILL-zh.md +0 -74
  802. package/skills/creative/web-artifacts-builder/SKILL.md +0 -74
  803. package/skills/creative/web-artifacts-builder/scripts/bundle-artifact.sh +0 -54
  804. package/skills/creative/web-artifacts-builder/scripts/init-artifact.sh +0 -322
  805. package/skills/creative/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
  806. package/skills/documents/doc-coauthoring/SKILL-zh.md +0 -375
  807. package/skills/documents/doc-coauthoring/SKILL.md +0 -375
  808. package/skills/documents/docx/LICENSE.txt +0 -30
  809. package/skills/documents/docx/SKILL-zh.md +0 -590
  810. package/skills/documents/docx/SKILL.md +0 -590
  811. package/skills/documents/docx/scripts/__init__.py +0 -1
  812. package/skills/documents/docx/scripts/accept_changes.py +0 -135
  813. package/skills/documents/docx/scripts/comment.py +0 -318
  814. package/skills/documents/docx/scripts/office/helpers/__init__.py +0 -0
  815. package/skills/documents/docx/scripts/office/helpers/merge_runs.py +0 -199
  816. package/skills/documents/docx/scripts/office/helpers/simplify_redlines.py +0 -197
  817. package/skills/documents/docx/scripts/office/pack.py +0 -159
  818. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
  819. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
  820. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
  821. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
  822. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
  823. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
  824. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
  825. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
  826. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
  827. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
  828. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
  829. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
  830. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
  831. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
  832. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
  833. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
  834. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
  835. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
  836. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
  837. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
  838. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
  839. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
  840. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
  841. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
  842. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
  843. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
  844. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
  845. package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
  846. package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
  847. package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
  848. package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
  849. package/skills/documents/docx/scripts/office/schemas/mce/mc.xsd +0 -75
  850. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-2010.xsd +0 -560
  851. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-2012.xsd +0 -67
  852. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-2018.xsd +0 -14
  853. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -20
  854. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -13
  855. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
  856. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -8
  857. package/skills/documents/docx/scripts/office/soffice.py +0 -183
  858. package/skills/documents/docx/scripts/office/unpack.py +0 -132
  859. package/skills/documents/docx/scripts/office/validate.py +0 -111
  860. package/skills/documents/docx/scripts/office/validators/__init__.py +0 -15
  861. package/skills/documents/docx/scripts/office/validators/base.py +0 -847
  862. package/skills/documents/docx/scripts/office/validators/docx.py +0 -446
  863. package/skills/documents/docx/scripts/office/validators/pptx.py +0 -275
  864. package/skills/documents/docx/scripts/office/validators/redlining.py +0 -247
  865. package/skills/documents/docx/scripts/templates/comments.xml +0 -3
  866. package/skills/documents/docx/scripts/templates/commentsExtended.xml +0 -3
  867. package/skills/documents/docx/scripts/templates/commentsExtensible.xml +0 -3
  868. package/skills/documents/docx/scripts/templates/commentsIds.xml +0 -3
  869. package/skills/documents/docx/scripts/templates/people.xml +0 -3
  870. package/skills/documents/pdf/LICENSE.txt +0 -30
  871. package/skills/documents/pdf/SKILL-zh.md +0 -314
  872. package/skills/documents/pdf/SKILL.md +0 -314
  873. package/skills/documents/pdf/forms.md +0 -294
  874. package/skills/documents/pdf/reference.md +0 -612
  875. package/skills/documents/pdf/scripts/check_bounding_boxes.py +0 -65
  876. package/skills/documents/pdf/scripts/check_fillable_fields.py +0 -11
  877. package/skills/documents/pdf/scripts/convert_pdf_to_images.py +0 -33
  878. package/skills/documents/pdf/scripts/create_validation_image.py +0 -37
  879. package/skills/documents/pdf/scripts/extract_form_field_info.py +0 -122
  880. package/skills/documents/pdf/scripts/extract_form_structure.py +0 -115
  881. package/skills/documents/pdf/scripts/fill_fillable_fields.py +0 -98
  882. package/skills/documents/pdf/scripts/fill_pdf_form_with_annotations.py +0 -107
  883. package/skills/documents/pptx/LICENSE.txt +0 -30
  884. package/skills/documents/pptx/SKILL-zh.md +0 -232
  885. package/skills/documents/pptx/SKILL.md +0 -232
  886. package/skills/documents/pptx/editing.md +0 -205
  887. package/skills/documents/pptx/pptxgenjs.md +0 -420
  888. package/skills/documents/pptx/scripts/__init__.py +0 -0
  889. package/skills/documents/pptx/scripts/add_slide.py +0 -195
  890. package/skills/documents/pptx/scripts/clean.py +0 -286
  891. package/skills/documents/pptx/scripts/office/helpers/__init__.py +0 -0
  892. package/skills/documents/pptx/scripts/office/helpers/merge_runs.py +0 -199
  893. package/skills/documents/pptx/scripts/office/helpers/simplify_redlines.py +0 -197
  894. package/skills/documents/pptx/scripts/office/pack.py +0 -159
  895. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
  896. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
  897. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
  898. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
  899. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
  900. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
  901. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
  902. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
  903. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
  904. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
  905. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
  906. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
  907. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
  908. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
  909. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
  910. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
  911. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
  912. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
  913. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
  914. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
  915. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
  916. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
  917. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
  918. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
  919. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
  920. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
  921. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
  922. package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
  923. package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
  924. package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
  925. package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
  926. package/skills/documents/pptx/scripts/office/schemas/mce/mc.xsd +0 -75
  927. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-2010.xsd +0 -560
  928. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-2012.xsd +0 -67
  929. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-2018.xsd +0 -14
  930. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -20
  931. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -13
  932. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
  933. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -8
  934. package/skills/documents/pptx/scripts/office/soffice.py +0 -183
  935. package/skills/documents/pptx/scripts/office/unpack.py +0 -132
  936. package/skills/documents/pptx/scripts/office/validate.py +0 -111
  937. package/skills/documents/pptx/scripts/office/validators/__init__.py +0 -15
  938. package/skills/documents/pptx/scripts/office/validators/base.py +0 -847
  939. package/skills/documents/pptx/scripts/office/validators/docx.py +0 -446
  940. package/skills/documents/pptx/scripts/office/validators/pptx.py +0 -275
  941. package/skills/documents/pptx/scripts/office/validators/redlining.py +0 -247
  942. package/skills/documents/pptx/scripts/thumbnail.py +0 -289
  943. package/skills/documents/xlsx/SKILL-zh.md +0 -292
  944. package/skills/engineering/diagnose/SKILL-zh.md +0 -117
  945. package/skills/engineering/grill-with-docs/ADR-FORMAT.md +0 -47
  946. package/skills/engineering/grill-with-docs/CONTEXT-FORMAT.md +0 -77
  947. package/skills/engineering/grill-with-docs/SKILL-zh.md +0 -88
  948. package/skills/engineering/grill-with-docs/SKILL.md +0 -88
  949. package/skills/engineering/improve-codebase-architecture/DEEPENING.md +0 -37
  950. package/skills/engineering/improve-codebase-architecture/INTERFACE-DESIGN.md +0 -44
  951. package/skills/engineering/improve-codebase-architecture/LANGUAGE.md +0 -53
  952. package/skills/engineering/improve-codebase-architecture/SKILL-zh.md +0 -71
  953. package/skills/engineering/improve-codebase-architecture/SKILL.md +0 -71
  954. package/skills/engineering/tdd/SKILL-zh.md +0 -109
  955. package/skills/engineering/to-issues/SKILL-zh.md +0 -81
  956. package/skills/engineering/to-issues/SKILL.md +0 -81
  957. package/skills/engineering/to-prd/SKILL-zh.md +0 -76
  958. package/skills/engineering/to-prd/SKILL.md +0 -74
  959. package/skills/engineering/zoom-out/SKILL-zh.md +0 -7
  960. package/skills/engineering/zoom-out/SKILL.md +0 -7
  961. package/skills/tools/find-skills/SKILL-zh.md +0 -440
  962. package/skills/tools/github/SKILL-zh.md +0 -48
  963. package/skills/tools/internal-comms/LICENSE.txt +0 -202
  964. package/skills/tools/internal-comms/SKILL-zh.md +0 -32
  965. package/skills/tools/internal-comms/SKILL.md +0 -32
  966. package/skills/tools/internal-comms/examples/3p-updates.md +0 -47
  967. package/skills/tools/internal-comms/examples/company-newsletter.md +0 -65
  968. package/skills/tools/internal-comms/examples/faq-answers.md +0 -30
  969. package/skills/tools/internal-comms/examples/general-comms.md +0 -16
  970. package/skills/tools/skill-creator/LICENSE.txt +0 -202
  971. package/skills/tools/skill-creator/SKILL-zh.md +0 -483
  972. package/skills/tools/skill-creator/SKILL.md +0 -485
  973. package/skills/tools/skill-creator/agents/analyzer.md +0 -274
  974. package/skills/tools/skill-creator/agents/comparator.md +0 -202
  975. package/skills/tools/skill-creator/agents/grader.md +0 -223
  976. package/skills/tools/skill-creator/assets/eval_review.html +0 -146
  977. package/skills/tools/skill-creator/eval-viewer/generate_review.py +0 -471
  978. package/skills/tools/skill-creator/eval-viewer/viewer.html +0 -1325
  979. package/skills/tools/skill-creator/references/schemas.md +0 -430
  980. package/skills/tools/skill-creator/scripts/__init__.py +0 -0
  981. package/skills/tools/skill-creator/scripts/aggregate_benchmark.py +0 -401
  982. package/skills/tools/skill-creator/scripts/generate_report.py +0 -326
  983. package/skills/tools/skill-creator/scripts/improve_description.py +0 -247
  984. package/skills/tools/skill-creator/scripts/package_skill.py +0 -136
  985. package/skills/tools/skill-creator/scripts/quick_validate.py +0 -103
  986. package/skills/tools/skill-creator/scripts/run_eval.py +0 -310
  987. package/skills/tools/skill-creator/scripts/run_loop.py +0 -328
  988. package/skills/tools/skill-creator/scripts/utils.py +0 -47
  989. package/skills/tools/summarize/SKILL-zh.md +0 -47
  990. package/skills/tools/weather/SKILL-zh.md +0 -46
  991. package/skills/tools/weather/SKILL.md +0 -46
  992. package/skills/tools/webapp-testing/SKILL-zh.md +0 -96
  993. /package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/google-antigravity.d.ts +0 -0
  994. /package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/google-gemini-cli.d.ts +0 -0
  995. /package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/oauth-page.d.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.js","names":[],"sources":["../../../../../../../src/agent/skills/marketplace/adapters/store/adapter.ts"],"sourcesContent":["import {\n downloadSkillZipBuffer,\n fetchMarketplacePackageDetail,\n listSkillPackages,\n resolveSkillZipDownloadUrl,\n resolveSkillsStoreBaseUrl,\n skillIdForMarketplaceInstall,\n} from './store-api-client.js';\n\nimport type { SkillsMarketplaceAdapter } from '../../adapter.types.js';\nimport { registerMarketplaceAdapter } from '../../registry.js';\n\nexport const storeMarketplaceAdapter: SkillsMarketplaceAdapter = {\n id: 'store',\n\n async listCategories(_config) {\n return [];\n },\n\n async listPackages(config, params) {\n const base = resolveSkillsStoreBaseUrl(config);\n const response = await listSkillPackages(base, params);\n return {\n items: response.items,\n meta: response.meta,\n provider: 'store',\n };\n },\n\n async getPackageDetail(config, packageName) {\n const base = resolveSkillsStoreBaseUrl(config);\n const detail = await fetchMarketplacePackageDetail(base, packageName);\n return { ...detail, provider: 'store' };\n },\n\n async downloadPackage(config, packageName, version) {\n const base = resolveSkillsStoreBaseUrl(config);\n const { downloadUrl, version: resolvedVersion } = await resolveSkillZipDownloadUrl(\n base,\n packageName,\n version,\n );\n const buffer = await downloadSkillZipBuffer(base, downloadUrl);\n return {\n buffer,\n skillId: skillIdForMarketplaceInstall(packageName) ?? packageName,\n version: resolvedVersion,\n };\n },\n};\n\n// Self-register into the dynamic marketplace adapter registry.\nregisterMarketplaceAdapter({\n adapter: storeMarketplaceAdapter,\n displayName: 'XOPC Store',\n});\n"],"mappings":";;;AAYA,MAAa,0BAAoD;CAC/D,IAAI;CAEJ,MAAM,eAAe,SAAS;AAC5B,SAAO,EAAE;;CAGX,MAAM,aAAa,QAAQ,QAAQ;EAEjC,MAAM,WAAW,MAAM,kBADV,0BAA0B,OACM,EAAE,OAAO;AACtD,SAAO;GACL,OAAO,SAAS;GAChB,MAAM,SAAS;GACf,UAAU;GACX;;CAGH,MAAM,iBAAiB,QAAQ,aAAa;AAG1C,SAAO;GAAE,GAAG,MADS,8BADR,0BAA0B,OACgB,EAAE,YAAY;GACjD,UAAU;GAAS;;CAGzC,MAAM,gBAAgB,QAAQ,aAAa,SAAS;EAClD,MAAM,OAAO,0BAA0B,OAAO;EAC9C,MAAM,EAAE,aAAa,SAAS,oBAAoB,MAAM,2BACtD,MACA,aACA,QACD;AAED,SAAO;GACL,QAAA,MAFmB,uBAAuB,MAAM,YAAY;GAG5D,SAAS,6BAA6B,YAAY,IAAI;GACtD,SAAS;GACV;;CAEJ;AAGD,2BAA2B;CACzB,SAAS;CACT,aAAa;CACd,CAAC"}
1
+ {"version":3,"file":"adapter.js","names":[],"sources":["../../../../../../../src/agent/skills/marketplace/adapters/store/adapter.ts"],"sourcesContent":["import { buildSkillMarkdownPreviewFromRaw } from '../../../skill-markdown-preview-from-raw.js';\nimport {\n downloadSkillZipBuffer,\n fetchMarketplacePackageDetail,\n listSkillPackages,\n resolveSkillZipDownloadUrl,\n resolveSkillsStoreBaseUrl,\n skillIdForMarketplaceInstall,\n} from './store-api-client.js';\n\nimport type { SkillsMarketplaceAdapter } from '../../adapter.types.js';\nimport { registerMarketplaceAdapter } from '../../registry.js';\n\nexport const storeMarketplaceAdapter: SkillsMarketplaceAdapter = {\n id: 'store',\n\n async listCategories(_config) {\n return [];\n },\n\n async listPackages(config, params) {\n const base = resolveSkillsStoreBaseUrl(config);\n const response = await listSkillPackages(base, params);\n return {\n items: response.items,\n meta: response.meta,\n provider: 'store',\n };\n },\n\n async getPackageDetail(config, packageName) {\n const base = resolveSkillsStoreBaseUrl(config);\n const detail = await fetchMarketplacePackageDetail(base, packageName);\n const readme = detail.readme?.trim();\n if (!readme) {\n throw new Error(`Store skill package [${packageName}] did not include readme`);\n }\n return {\n ...detail,\n readme,\n provider: 'store',\n skillDocPreview: buildSkillMarkdownPreviewFromRaw(readme, {\n name: detail.name,\n description: detail.description,\n }),\n };\n },\n\n async downloadPackage(config, packageName, version) {\n const base = resolveSkillsStoreBaseUrl(config);\n const { downloadUrl, version: resolvedVersion } = await resolveSkillZipDownloadUrl(\n base,\n packageName,\n version,\n );\n const buffer = await downloadSkillZipBuffer(base, downloadUrl);\n return {\n buffer,\n skillId: skillIdForMarketplaceInstall(packageName) ?? packageName,\n version: resolvedVersion,\n };\n },\n};\n\n// Self-register into the dynamic marketplace adapter registry.\nregisterMarketplaceAdapter({\n adapter: storeMarketplaceAdapter,\n displayName: 'XOPC Store',\n});\n"],"mappings":";;;;AAaA,MAAa,0BAAoD;CAC/D,IAAI;CAEJ,MAAM,eAAe,SAAS;AAC5B,SAAO,EAAE;;CAGX,MAAM,aAAa,QAAQ,QAAQ;EAEjC,MAAM,WAAW,MAAM,kBADV,0BAA0B,OACM,EAAE,OAAO;AACtD,SAAO;GACL,OAAO,SAAS;GAChB,MAAM,SAAS;GACf,UAAU;GACX;;CAGH,MAAM,iBAAiB,QAAQ,aAAa;EAE1C,MAAM,SAAS,MAAM,8BADR,0BAA0B,OACgB,EAAE,YAAY;EACrE,MAAM,SAAS,OAAO,QAAQ,MAAM;AACpC,MAAI,CAAC,OACH,OAAM,IAAI,MAAM,wBAAwB,YAAY,0BAA0B;AAEhF,SAAO;GACL,GAAG;GACH;GACA,UAAU;GACV,iBAAiB,iCAAiC,QAAQ;IACxD,MAAM,OAAO;IACb,aAAa,OAAO;IACrB,CAAC;GACH;;CAGH,MAAM,gBAAgB,QAAQ,aAAa,SAAS;EAClD,MAAM,OAAO,0BAA0B,OAAO;EAC9C,MAAM,EAAE,aAAa,SAAS,oBAAoB,MAAM,2BACtD,MACA,aACA,QACD;AAED,SAAO;GACL,QAAA,MAFmB,uBAAuB,MAAM,YAAY;GAG5D,SAAS,6BAA6B,YAAY,IAAI;GACtD,SAAS;GACV;;CAEJ;AAGD,2BAA2B;CACzB,SAAS;CACT,aAAa;CACd,CAAC"}
@@ -127,8 +127,8 @@ export interface UnifiedMarketplaceListResponse {
127
127
  */
128
128
  export interface UnifiedMarketplacePackageDetail extends MarketplacePackageDetail {
129
129
  provider: string;
130
- /** When set (e.g. SkillHub SKILL.md), gateway console renders structured meta + body like installed skills. */
131
- skillDocPreview?: SkillMarkdownPreviewPayload;
130
+ /** Gateway-normalized structured meta + body rendered by the console. */
131
+ skillDocPreview: SkillMarkdownPreviewPayload;
132
132
  /** SkillHub-specific fields */
133
133
  skillHubInfo?: {
134
134
  category: string;
@@ -1 +1 @@
1
- {"version":3,"file":"store-api-client.js","names":[],"sources":["../../../../../../../src/agent/skills/marketplace/adapters/store/store-api-client.ts"],"sourcesContent":["/**\n * HTTP client for the public xopc-store-compatible REST API (packages list, detail, zip download).\n * Used by the store marketplace adapter and SSRF-safe download helpers.\n *\n * Facade: {@link ../../../skills-marketplace.js}.\n */\n\nimport type { Config } from '../../../../../config/schema.js';\nimport { MAX_EXTENSION_STORE_ZIP_BYTES } from '../../../../../extensions/store-zip-limits.js';\nimport { isValidSkillId, MAX_SKILL_ZIP_BYTES } from '../../../managed-store.js';\nimport type { SkillMarkdownPreviewPayload } from '../../../types.js';\n\nconst DEFAULT_STORE_BASE = 'https://store.xopc.ai';\n\n/**\n * Marketplace provider identifier. Dynamic — extensions can register additional providers\n * via `api.registerMarketplaceAdapter()`. Built-in values: 'store', 'skillhub', 'clawhub'.\n */\nexport type SkillsMarketplaceProvider = string;\n\nexport interface SkillsStoreListParams {\n q?: string;\n page?: number;\n pageSize?: number;\n sort?: 'downloads' | 'newest';\n /** Adapter-defined category id (exact match against package `categories`). */\n category?: string;\n}\n\n/** Category option for marketplace filter chips (from adapter). */\nexport interface MarketplaceCategoryOption {\n id: string;\n label: string;\n}\n\n/** Mirrors xopc-store GET /api/v1/packages list response (subset used by UI). */\nexport interface SkillsStorePackageListItem {\n id: string;\n name: string;\n type: string;\n description: string;\n downloads: number;\n author: { username: string; avatarUrl: string | null };\n latestVersion?: string;\n updatedAt: string;\n /** Taxonomy / tags from the marketplace (adapter-specific). */\n categories?: string[];\n tags?: string[];\n stars?: number;\n /** Short provenance label for the row (e.g. ClawHub). */\n sourceLabel?: string;\n}\n\n/** Unified marketplace package list item (works for all adapters). */\nexport type MarketplacePackageListItem = SkillsStorePackageListItem;\n\nexport interface SkillsStoreListResponse {\n items: SkillsStorePackageListItem[];\n meta: { page: number; pageSize: number; total: number; totalPages: number };\n}\n\nexport function resolveSkillsStoreBaseUrl(config: Config): string {\n const env = process.env.XOPC_SKILLS_STORE_URL?.trim();\n if (env) {\n try {\n return normalizeBaseUrl(new URL(env).toString());\n } catch {\n // fall through\n }\n }\n const fromConfig = config.gateway?.skillsStoreBaseUrl?.trim();\n if (fromConfig) {\n try {\n return normalizeBaseUrl(new URL(fromConfig).toString());\n } catch {\n return DEFAULT_STORE_BASE;\n }\n }\n return DEFAULT_STORE_BASE;\n}\n\nexport { MAX_EXTENSION_STORE_ZIP_BYTES };\n\n/**\n * Base URL for extension downloads (defaults to skills store host — usually store.xopc.ai).\n * Override with `XOPC_EXTENSIONS_STORE_URL`.\n */\nexport function resolveExtensionsStoreBaseUrl(config: Config): string {\n const env = process.env.XOPC_EXTENSIONS_STORE_URL?.trim();\n if (env) {\n try {\n return normalizeBaseUrl(new URL(env).toString());\n } catch {\n // fall through\n }\n }\n return resolveSkillsStoreBaseUrl(config);\n}\n\nfunction normalizeBaseUrl(url: string): string {\n return url.replace(/\\/$/, '');\n}\n\nexport function getStoreOrigin(baseUrl: string): string {\n const u = new URL(baseUrl);\n return `${u.protocol}//${u.host}`;\n}\n\n/**\n * Allow download URLs whose origin matches the configured store base (SSRF guard).\n * Production store is HTTPS-only; local dev (`http://localhost` / `127.0.0.1`) may use HTTP.\n */\nexport function assertDownloadUrlAllowed(downloadUrl: string, storeBaseUrl: string): URL {\n let u: URL;\n try {\n u = new URL(downloadUrl);\n } catch {\n throw new Error('Invalid download URL from store');\n }\n const allowed = new URL(storeBaseUrl);\n const localHttpDev =\n allowed.protocol === 'http:' &&\n (allowed.hostname === 'localhost' || allowed.hostname === '127.0.0.1');\n if (localHttpDev) {\n if (u.protocol !== 'http:' && u.protocol !== 'https:') {\n throw new Error('Download URL must use HTTP or HTTPS');\n }\n } else if (u.protocol !== 'https:') {\n throw new Error('Download URL must use HTTPS');\n }\n if (u.host !== allowed.host) {\n throw new Error('Download URL host does not match configured store host');\n }\n return u;\n}\n\nasync function fetchJson<T>(url: string, init?: RequestInit): Promise<T> {\n const res = await fetch(url, {\n ...init,\n headers: { Accept: 'application/json', ...init?.headers },\n });\n const text = await res.text();\n if (!res.ok) {\n let msg = `Store request failed (${res.status})`;\n try {\n const j = JSON.parse(text) as { error?: { message?: string } };\n if (j.error?.message) msg = j.error.message;\n } catch {\n if (text) msg = text.slice(0, 200);\n }\n throw new Error(msg);\n }\n try {\n return JSON.parse(text) as T;\n } catch {\n throw new Error('Store returned invalid JSON');\n }\n}\n\nexport async function listSkillPackages(\n storeBaseUrl: string,\n params: SkillsStoreListParams,\n): Promise<SkillsStoreListResponse> {\n const base = normalizeBaseUrl(storeBaseUrl);\n const sp = new URLSearchParams();\n sp.set('type', 'skill');\n if (params.q?.trim()) sp.set('q', params.q.trim());\n if (params.page != null) sp.set('page', String(params.page));\n if (params.pageSize != null) sp.set('pageSize', String(params.pageSize));\n if (params.sort) sp.set('sort', params.sort);\n if (params.category?.trim()) sp.set('category', params.category.trim());\n\n const url = `${base}/api/v1/packages?${sp.toString()}`;\n return fetchJson<SkillsStoreListResponse>(url);\n}\n\n/** GET /api/v1/packages/:name — published skill package (public). */\nexport interface MarketplacePackageDetail {\n id: string;\n name: string;\n type: string;\n description: string;\n readme: string | null;\n downloads: number;\n author: { username: string; avatarUrl: string | null };\n latestVersion: {\n version: string;\n changelog: string | null;\n publishedAt: string;\n };\n}\n\nexport async function fetchMarketplacePackageDetail(\n storeBaseUrl: string,\n packageName: string,\n): Promise<MarketplacePackageDetail> {\n const base = normalizeBaseUrl(storeBaseUrl);\n const enc = encodeURIComponent(packageName.trim());\n return fetchJson<MarketplacePackageDetail>(`${base}/api/v1/packages/${enc}`);\n}\n\nexport async function resolveSkillZipDownloadUrl(\n storeBaseUrl: string,\n packageName: string,\n version?: string,\n): Promise<{ downloadUrl: string; version: string }> {\n const base = normalizeBaseUrl(storeBaseUrl);\n const enc = encodeURIComponent(packageName);\n if (version?.trim()) {\n const v = encodeURIComponent(version.trim());\n const detail = await fetchJson<{\n downloadUrl: string;\n version: string;\n }>(`${base}/api/v1/packages/${enc}/versions/${v}`);\n if (!detail.downloadUrl) {\n throw new Error('Store version has no download URL');\n }\n assertDownloadUrlAllowed(detail.downloadUrl, base);\n return { downloadUrl: detail.downloadUrl, version: detail.version };\n }\n\n const pkg = await fetchJson<{\n name: string;\n latestVersion: { downloadUrl: string; version: string };\n }>(`${base}/api/v1/packages/${enc}`);\n if (!pkg.latestVersion?.downloadUrl) {\n throw new Error('Package has no published version');\n }\n assertDownloadUrlAllowed(pkg.latestVersion.downloadUrl, base);\n return {\n downloadUrl: pkg.latestVersion.downloadUrl,\n version: pkg.latestVersion.version,\n };\n}\n\nexport async function downloadSkillZipBuffer(\n storeBaseUrl: string,\n downloadUrl: string,\n): Promise<Buffer> {\n const base = normalizeBaseUrl(storeBaseUrl);\n assertDownloadUrlAllowed(downloadUrl, base);\n\n const res = await fetch(downloadUrl, { redirect: 'follow' });\n if (!res.ok) {\n throw new Error(`Failed to download skill archive (${res.status})`);\n }\n const len = res.headers.get('content-length');\n if (len) {\n const n = Number(len);\n if (Number.isFinite(n) && n > MAX_SKILL_ZIP_BYTES) {\n throw new Error(`Zip exceeds maximum size (${MAX_SKILL_ZIP_BYTES} bytes)`);\n }\n }\n const ab = await res.arrayBuffer();\n const buf = Buffer.from(ab);\n if (buf.length > MAX_SKILL_ZIP_BYTES) {\n throw new Error(`Zip exceeds maximum size (${MAX_SKILL_ZIP_BYTES} bytes)`);\n }\n return buf;\n}\n\n/** GET /api/v1/packages/:name — subset used for extension installs. */\nexport interface StorePublishedPackageHead {\n name: string;\n type: string;\n latestVersion: {\n version: string;\n downloadUrl: string;\n };\n}\n\nexport async function resolveExtensionZipDownloadUrl(\n storeBaseUrl: string,\n packageName: string,\n version?: string,\n): Promise<{ downloadUrl: string; version: string }> {\n const base = normalizeBaseUrl(storeBaseUrl);\n const enc = encodeURIComponent(packageName.trim());\n const meta = await fetchJson<StorePublishedPackageHead>(`${base}/api/v1/packages/${enc}`);\n if (meta.type !== 'extension') {\n throw new Error(\n `Package \"${packageName}\" has type \"${meta.type}\" (expected extension). ` +\n 'Use `xopc skills install` for skills.',\n );\n }\n if (version?.trim()) {\n const v = encodeURIComponent(version.trim());\n const detail = await fetchJson<{ downloadUrl: string; version: string }>(\n `${base}/api/v1/packages/${enc}/versions/${v}`,\n );\n if (!detail.downloadUrl) {\n throw new Error('Store version has no download URL');\n }\n assertDownloadUrlAllowed(detail.downloadUrl, base);\n return { downloadUrl: detail.downloadUrl, version: detail.version };\n }\n const lv = meta.latestVersion;\n if (!lv?.downloadUrl) {\n throw new Error('Package has no published version');\n }\n assertDownloadUrlAllowed(lv.downloadUrl, base);\n return { downloadUrl: lv.downloadUrl, version: lv.version };\n}\n\nexport async function downloadExtensionStoreZipBuffer(\n storeBaseUrl: string,\n downloadUrl: string,\n): Promise<Buffer> {\n const base = normalizeBaseUrl(storeBaseUrl);\n assertDownloadUrlAllowed(downloadUrl, base);\n const res = await fetch(downloadUrl, { redirect: 'follow' });\n if (!res.ok) {\n throw new Error(`Failed to download extension archive (${res.status})`);\n }\n const len = res.headers.get('content-length');\n if (len) {\n const n = Number(len);\n if (Number.isFinite(n) && n > MAX_EXTENSION_STORE_ZIP_BYTES) {\n throw new Error(`Zip exceeds maximum size (${MAX_EXTENSION_STORE_ZIP_BYTES} bytes)`);\n }\n }\n const ab = await res.arrayBuffer();\n const buf = Buffer.from(ab);\n if (buf.length > MAX_EXTENSION_STORE_ZIP_BYTES) {\n throw new Error(`Zip exceeds maximum size (${MAX_EXTENSION_STORE_ZIP_BYTES} bytes)`);\n }\n return buf;\n}\n\nexport function skillIdForMarketplaceInstall(packageName: string): string | undefined {\n const trimmed = packageName.trim();\n if (!trimmed) return undefined;\n return isValidSkillId(trimmed) ? trimmed : undefined;\n}\n\n/**\n * Unified marketplace list response (adapter fills `provider`).\n */\nexport interface UnifiedMarketplaceListResponse {\n items: MarketplacePackageListItem[];\n meta: { page: number; pageSize: number; total: number; totalPages: number };\n provider: string;\n}\n\n/**\n * Unified marketplace package detail response.\n */\nexport interface UnifiedMarketplacePackageDetail extends MarketplacePackageDetail {\n provider: string;\n /** When set (e.g. SkillHub SKILL.md), gateway console renders structured meta + body like installed skills. */\n skillDocPreview?: SkillMarkdownPreviewPayload;\n /** SkillHub-specific fields */\n skillHubInfo?: {\n category: string;\n installs: number;\n stars: number;\n securityReports?: {\n keen?: { status: string; statusText: string; reportUrl?: string };\n sanbu?: { status: string; statusText: string; reportUrl?: string };\n };\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"store-api-client.js","names":[],"sources":["../../../../../../../src/agent/skills/marketplace/adapters/store/store-api-client.ts"],"sourcesContent":["/**\n * HTTP client for the public xopc-store-compatible REST API (packages list, detail, zip download).\n * Used by the store marketplace adapter and SSRF-safe download helpers.\n *\n * Facade: {@link ../../../skills-marketplace.js}.\n */\n\nimport type { Config } from '../../../../../config/schema.js';\nimport { MAX_EXTENSION_STORE_ZIP_BYTES } from '../../../../../extensions/store-zip-limits.js';\nimport { isValidSkillId, MAX_SKILL_ZIP_BYTES } from '../../../managed-store.js';\nimport type { SkillMarkdownPreviewPayload } from '../../../types.js';\n\nconst DEFAULT_STORE_BASE = 'https://store.xopc.ai';\n\n/**\n * Marketplace provider identifier. Dynamic — extensions can register additional providers\n * via `api.registerMarketplaceAdapter()`. Built-in values: 'store', 'skillhub', 'clawhub'.\n */\nexport type SkillsMarketplaceProvider = string;\n\nexport interface SkillsStoreListParams {\n q?: string;\n page?: number;\n pageSize?: number;\n sort?: 'downloads' | 'newest';\n /** Adapter-defined category id (exact match against package `categories`). */\n category?: string;\n}\n\n/** Category option for marketplace filter chips (from adapter). */\nexport interface MarketplaceCategoryOption {\n id: string;\n label: string;\n}\n\n/** Mirrors xopc-store GET /api/v1/packages list response (subset used by UI). */\nexport interface SkillsStorePackageListItem {\n id: string;\n name: string;\n type: string;\n description: string;\n downloads: number;\n author: { username: string; avatarUrl: string | null };\n latestVersion?: string;\n updatedAt: string;\n /** Taxonomy / tags from the marketplace (adapter-specific). */\n categories?: string[];\n tags?: string[];\n stars?: number;\n /** Short provenance label for the row (e.g. ClawHub). */\n sourceLabel?: string;\n}\n\n/** Unified marketplace package list item (works for all adapters). */\nexport type MarketplacePackageListItem = SkillsStorePackageListItem;\n\nexport interface SkillsStoreListResponse {\n items: SkillsStorePackageListItem[];\n meta: { page: number; pageSize: number; total: number; totalPages: number };\n}\n\nexport function resolveSkillsStoreBaseUrl(config: Config): string {\n const env = process.env.XOPC_SKILLS_STORE_URL?.trim();\n if (env) {\n try {\n return normalizeBaseUrl(new URL(env).toString());\n } catch {\n // fall through\n }\n }\n const fromConfig = config.gateway?.skillsStoreBaseUrl?.trim();\n if (fromConfig) {\n try {\n return normalizeBaseUrl(new URL(fromConfig).toString());\n } catch {\n return DEFAULT_STORE_BASE;\n }\n }\n return DEFAULT_STORE_BASE;\n}\n\nexport { MAX_EXTENSION_STORE_ZIP_BYTES };\n\n/**\n * Base URL for extension downloads (defaults to skills store host — usually store.xopc.ai).\n * Override with `XOPC_EXTENSIONS_STORE_URL`.\n */\nexport function resolveExtensionsStoreBaseUrl(config: Config): string {\n const env = process.env.XOPC_EXTENSIONS_STORE_URL?.trim();\n if (env) {\n try {\n return normalizeBaseUrl(new URL(env).toString());\n } catch {\n // fall through\n }\n }\n return resolveSkillsStoreBaseUrl(config);\n}\n\nfunction normalizeBaseUrl(url: string): string {\n return url.replace(/\\/$/, '');\n}\n\nexport function getStoreOrigin(baseUrl: string): string {\n const u = new URL(baseUrl);\n return `${u.protocol}//${u.host}`;\n}\n\n/**\n * Allow download URLs whose origin matches the configured store base (SSRF guard).\n * Production store is HTTPS-only; local dev (`http://localhost` / `127.0.0.1`) may use HTTP.\n */\nexport function assertDownloadUrlAllowed(downloadUrl: string, storeBaseUrl: string): URL {\n let u: URL;\n try {\n u = new URL(downloadUrl);\n } catch {\n throw new Error('Invalid download URL from store');\n }\n const allowed = new URL(storeBaseUrl);\n const localHttpDev =\n allowed.protocol === 'http:' &&\n (allowed.hostname === 'localhost' || allowed.hostname === '127.0.0.1');\n if (localHttpDev) {\n if (u.protocol !== 'http:' && u.protocol !== 'https:') {\n throw new Error('Download URL must use HTTP or HTTPS');\n }\n } else if (u.protocol !== 'https:') {\n throw new Error('Download URL must use HTTPS');\n }\n if (u.host !== allowed.host) {\n throw new Error('Download URL host does not match configured store host');\n }\n return u;\n}\n\nasync function fetchJson<T>(url: string, init?: RequestInit): Promise<T> {\n const res = await fetch(url, {\n ...init,\n headers: { Accept: 'application/json', ...init?.headers },\n });\n const text = await res.text();\n if (!res.ok) {\n let msg = `Store request failed (${res.status})`;\n try {\n const j = JSON.parse(text) as { error?: { message?: string } };\n if (j.error?.message) msg = j.error.message;\n } catch {\n if (text) msg = text.slice(0, 200);\n }\n throw new Error(msg);\n }\n try {\n return JSON.parse(text) as T;\n } catch {\n throw new Error('Store returned invalid JSON');\n }\n}\n\nexport async function listSkillPackages(\n storeBaseUrl: string,\n params: SkillsStoreListParams,\n): Promise<SkillsStoreListResponse> {\n const base = normalizeBaseUrl(storeBaseUrl);\n const sp = new URLSearchParams();\n sp.set('type', 'skill');\n if (params.q?.trim()) sp.set('q', params.q.trim());\n if (params.page != null) sp.set('page', String(params.page));\n if (params.pageSize != null) sp.set('pageSize', String(params.pageSize));\n if (params.sort) sp.set('sort', params.sort);\n if (params.category?.trim()) sp.set('category', params.category.trim());\n\n const url = `${base}/api/v1/packages?${sp.toString()}`;\n return fetchJson<SkillsStoreListResponse>(url);\n}\n\n/** GET /api/v1/packages/:name — published skill package (public). */\nexport interface MarketplacePackageDetail {\n id: string;\n name: string;\n type: string;\n description: string;\n readme: string | null;\n downloads: number;\n author: { username: string; avatarUrl: string | null };\n latestVersion: {\n version: string;\n changelog: string | null;\n publishedAt: string;\n };\n}\n\nexport async function fetchMarketplacePackageDetail(\n storeBaseUrl: string,\n packageName: string,\n): Promise<MarketplacePackageDetail> {\n const base = normalizeBaseUrl(storeBaseUrl);\n const enc = encodeURIComponent(packageName.trim());\n return fetchJson<MarketplacePackageDetail>(`${base}/api/v1/packages/${enc}`);\n}\n\nexport async function resolveSkillZipDownloadUrl(\n storeBaseUrl: string,\n packageName: string,\n version?: string,\n): Promise<{ downloadUrl: string; version: string }> {\n const base = normalizeBaseUrl(storeBaseUrl);\n const enc = encodeURIComponent(packageName);\n if (version?.trim()) {\n const v = encodeURIComponent(version.trim());\n const detail = await fetchJson<{\n downloadUrl: string;\n version: string;\n }>(`${base}/api/v1/packages/${enc}/versions/${v}`);\n if (!detail.downloadUrl) {\n throw new Error('Store version has no download URL');\n }\n assertDownloadUrlAllowed(detail.downloadUrl, base);\n return { downloadUrl: detail.downloadUrl, version: detail.version };\n }\n\n const pkg = await fetchJson<{\n name: string;\n latestVersion: { downloadUrl: string; version: string };\n }>(`${base}/api/v1/packages/${enc}`);\n if (!pkg.latestVersion?.downloadUrl) {\n throw new Error('Package has no published version');\n }\n assertDownloadUrlAllowed(pkg.latestVersion.downloadUrl, base);\n return {\n downloadUrl: pkg.latestVersion.downloadUrl,\n version: pkg.latestVersion.version,\n };\n}\n\nexport async function downloadSkillZipBuffer(\n storeBaseUrl: string,\n downloadUrl: string,\n): Promise<Buffer> {\n const base = normalizeBaseUrl(storeBaseUrl);\n assertDownloadUrlAllowed(downloadUrl, base);\n\n const res = await fetch(downloadUrl, { redirect: 'follow' });\n if (!res.ok) {\n throw new Error(`Failed to download skill archive (${res.status})`);\n }\n const len = res.headers.get('content-length');\n if (len) {\n const n = Number(len);\n if (Number.isFinite(n) && n > MAX_SKILL_ZIP_BYTES) {\n throw new Error(`Zip exceeds maximum size (${MAX_SKILL_ZIP_BYTES} bytes)`);\n }\n }\n const ab = await res.arrayBuffer();\n const buf = Buffer.from(ab);\n if (buf.length > MAX_SKILL_ZIP_BYTES) {\n throw new Error(`Zip exceeds maximum size (${MAX_SKILL_ZIP_BYTES} bytes)`);\n }\n return buf;\n}\n\n/** GET /api/v1/packages/:name — subset used for extension installs. */\nexport interface StorePublishedPackageHead {\n name: string;\n type: string;\n latestVersion: {\n version: string;\n downloadUrl: string;\n };\n}\n\nexport async function resolveExtensionZipDownloadUrl(\n storeBaseUrl: string,\n packageName: string,\n version?: string,\n): Promise<{ downloadUrl: string; version: string }> {\n const base = normalizeBaseUrl(storeBaseUrl);\n const enc = encodeURIComponent(packageName.trim());\n const meta = await fetchJson<StorePublishedPackageHead>(`${base}/api/v1/packages/${enc}`);\n if (meta.type !== 'extension') {\n throw new Error(\n `Package \"${packageName}\" has type \"${meta.type}\" (expected extension). ` +\n 'Use `xopc skills install` for skills.',\n );\n }\n if (version?.trim()) {\n const v = encodeURIComponent(version.trim());\n const detail = await fetchJson<{ downloadUrl: string; version: string }>(\n `${base}/api/v1/packages/${enc}/versions/${v}`,\n );\n if (!detail.downloadUrl) {\n throw new Error('Store version has no download URL');\n }\n assertDownloadUrlAllowed(detail.downloadUrl, base);\n return { downloadUrl: detail.downloadUrl, version: detail.version };\n }\n const lv = meta.latestVersion;\n if (!lv?.downloadUrl) {\n throw new Error('Package has no published version');\n }\n assertDownloadUrlAllowed(lv.downloadUrl, base);\n return { downloadUrl: lv.downloadUrl, version: lv.version };\n}\n\nexport async function downloadExtensionStoreZipBuffer(\n storeBaseUrl: string,\n downloadUrl: string,\n): Promise<Buffer> {\n const base = normalizeBaseUrl(storeBaseUrl);\n assertDownloadUrlAllowed(downloadUrl, base);\n const res = await fetch(downloadUrl, { redirect: 'follow' });\n if (!res.ok) {\n throw new Error(`Failed to download extension archive (${res.status})`);\n }\n const len = res.headers.get('content-length');\n if (len) {\n const n = Number(len);\n if (Number.isFinite(n) && n > MAX_EXTENSION_STORE_ZIP_BYTES) {\n throw new Error(`Zip exceeds maximum size (${MAX_EXTENSION_STORE_ZIP_BYTES} bytes)`);\n }\n }\n const ab = await res.arrayBuffer();\n const buf = Buffer.from(ab);\n if (buf.length > MAX_EXTENSION_STORE_ZIP_BYTES) {\n throw new Error(`Zip exceeds maximum size (${MAX_EXTENSION_STORE_ZIP_BYTES} bytes)`);\n }\n return buf;\n}\n\nexport function skillIdForMarketplaceInstall(packageName: string): string | undefined {\n const trimmed = packageName.trim();\n if (!trimmed) return undefined;\n return isValidSkillId(trimmed) ? trimmed : undefined;\n}\n\n/**\n * Unified marketplace list response (adapter fills `provider`).\n */\nexport interface UnifiedMarketplaceListResponse {\n items: MarketplacePackageListItem[];\n meta: { page: number; pageSize: number; total: number; totalPages: number };\n provider: string;\n}\n\n/**\n * Unified marketplace package detail response.\n */\nexport interface UnifiedMarketplacePackageDetail extends MarketplacePackageDetail {\n provider: string;\n /** Gateway-normalized structured meta + body rendered by the console. */\n skillDocPreview: SkillMarkdownPreviewPayload;\n /** SkillHub-specific fields */\n skillHubInfo?: {\n category: string;\n installs: number;\n stars: number;\n securityReports?: {\n keen?: { status: string; statusText: string; reportUrl?: string };\n sanbu?: { status: string; statusText: string; reportUrl?: string };\n };\n };\n}\n"],"mappings":"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"}
@@ -79,7 +79,10 @@ export declare class SkillManager {
79
79
  /**
80
80
  * Expand a skill command into a full skill block
81
81
  */
82
- expandCommand(text: string): string;
82
+ expandCommand(text: string, options?: {
83
+ skillAllowlist?: string[];
84
+ registeredToolNames?: string[];
85
+ }): string;
83
86
  /**
84
87
  * Parse a /skill: command
85
88
  */
@@ -147,12 +147,12 @@ var SkillManager = class {
147
147
  /**
148
148
  * Expand a skill command into a full skill block
149
149
  */
150
- expandCommand(text) {
150
+ expandCommand(text, options) {
151
151
  if (!text.startsWith("/skill:")) return text;
152
152
  const { skillName, args } = this.parseSkillCommand(text);
153
- const skill = this.findSkill(skillName);
153
+ const skill = this.selectSkillsForAgentIndexing(options).find((s) => s.name === skillName);
154
154
  if (!skill) {
155
- log.warn({ skillName }, "Skill not found for expansion");
155
+ log.warn({ skillName }, "Skill not visible for expansion");
156
156
  return text;
157
157
  }
158
158
  return this.buildSkillBlock(skill, args);
@@ -1 +1 @@
1
- {"version":3,"file":"skill-manager.js","names":[],"sources":["../../../../src/agent/skills/skill-manager.ts"],"sourcesContent":["/**\n * Skill Manager - Manages skills loading and expansion\n *\n * Handles skill initialization, reloading, and command expansion.\n */\n\nimport { createSkillLoader, type Skill } from './index.js';\nimport { resolveBundledSkillsDir, resolveStateDir } from '../../config/paths.js';\nimport { createLogger } from '../../utils/logger.js';\nimport { createSkillConfigManager, isSkillEnabled } from './config.js';\nimport { formatSkillsForPrompt, selectSkillsVisibleInPrompt } from './format-skills-prompt.js';\n\nconst log = createLogger('SkillManager');\n\nexport interface SkillDiagnostic {\n type: 'collision' | 'warning' | 'error' | 'info';\n skillName: string;\n message: string;\n}\n\nexport interface SkillLoadResult {\n skills: Skill[];\n prompt: string;\n diagnostics: SkillDiagnostic[];\n}\n\nexport class SkillManager {\n private skillPrompt: string = '';\n private skills: Skill[] = [];\n private skillLoader = createSkillLoader();\n private workspace: string;\n private bundledSkillsDir: string;\n\n constructor(workspace: string, bundledSkillsDir?: string) {\n this.workspace = workspace;\n this.bundledSkillsDir = bundledSkillsDir || resolveBundledSkillsDir();\n this.initialize();\n }\n\n /**\n * Initialize skills from workspace and bundled directories\n */\n private initialize(): void {\n const result = this.skillLoader.init(this.workspace, this.bundledSkillsDir);\n this.skillPrompt = result.prompt;\n this.skills = result.skills;\n\n // Log diagnostics\n for (const diag of result.diagnostics) {\n if (diag.type === 'collision') {\n log.warn({ skill: diag.skillName, message: diag.message }, 'Skill collision');\n } else if (diag.type === 'warning') {\n log.warn({ skill: diag.skillName, message: diag.message }, 'Skill warning');\n } else if (diag.type === 'error') {\n log.error({ skill: diag.skillName, message: diag.message }, 'Skill error');\n } else {\n log.info({ skill: diag.skillName, message: diag.message }, 'Skill info');\n }\n }\n\n log.debug({ count: result.skills.length }, 'Skills loaded');\n }\n\n /**\n * Recompute skill XML prompt from current skills.json (no disk rescan).\n */\n refreshPromptFromConfig(): void {\n this.skillLoader.refreshPromptFromConfig();\n this.skillPrompt = this.skillLoader.getPrompt();\n }\n\n /**\n * Reload skills from disk\n */\n reload(): void {\n log.info('Reloading skills...');\n const result = this.skillLoader.reload();\n this.skillPrompt = result.prompt;\n this.skills = result.skills;\n\n for (const diag of result.diagnostics) {\n if (diag.type === 'collision') {\n log.warn({ skill: diag.skillName, message: diag.message }, 'Skill collision');\n } else if (diag.type === 'warning') {\n log.warn({ skill: diag.skillName, message: diag.message }, 'Skill warning');\n } else if (diag.type === 'error') {\n log.error({ skill: diag.skillName, message: diag.message }, 'Skill error');\n }\n }\n\n log.info({ count: result.skills.length }, 'Skills reloaded');\n }\n\n /**\n * Get the skill prompt to append to system prompt\n */\n getPrompt(): string {\n return this.skillPrompt;\n }\n\n /**\n * `<available_skills>` XML with optional per-agent allowlist and/or tool-based gating.\n * When both arguments are omitted, returns the cached prompt from disk load (no tool gating).\n */\n getPromptForSkillAllowlist(\n allowlist: string[] | undefined,\n registeredToolNames?: string[],\n ): string {\n if (allowlist === undefined && registeredToolNames === undefined) {\n return this.getPrompt();\n }\n const skillsConfig = createSkillConfigManager(resolveStateDir()).load();\n return formatSkillsForPrompt(this.getSkills(), skillsConfig, {\n skillAllowlist: allowlist,\n registeredToolNames,\n });\n }\n\n /** Skills visible for prompts and skills_list given the same indexing options as {@link getPromptForSkillAllowlist}. */\n selectSkillsForAgentIndexing(options?: {\n skillAllowlist?: string[];\n registeredToolNames?: string[];\n }): Skill[] {\n const skillsConfig = createSkillConfigManager(resolveStateDir()).load();\n return selectSkillsVisibleInPrompt(this.getSkills(), skillsConfig, options);\n }\n\n /**\n * Get all loaded skills\n */\n getSkills(): Skill[] {\n return [...this.skills];\n }\n\n /**\n * Get skill names\n */\n getSkillNames(): string[] {\n return this.skills.map((s) => s.name);\n }\n\n /** Names of skills included in the agent system prompt (`<available_skills>`). */\n getSkillNamesForPrompt(): string[] {\n const skillsConfig = createSkillConfigManager(resolveStateDir()).load();\n return this.getSkills()\n .filter((s) => !s.disableModelInvocation && isSkillEnabled(s, skillsConfig))\n .map((s) => s.name);\n }\n\n /**\n * Skills that are enabled for model discovery (respects skills.json and requirement checks).\n */\n getEnabledSkills(): Skill[] {\n const skillsConfig = createSkillConfigManager(resolveStateDir()).load();\n return this.getSkills().filter(\n (s) => !s.disableModelInvocation && isSkillEnabled(s, skillsConfig),\n );\n }\n\n /**\n * Like {@link getEnabledSkills} plus optional allowlist and tool gating (matches `<available_skills>`).\n */\n getEnabledSkillsForAgentSession(options?: {\n skillAllowlist?: string[];\n registeredToolNames?: string[];\n }): Skill[] {\n return this.selectSkillsForAgentIndexing(options);\n }\n\n /**\n * Find a skill by name\n */\n findSkill(name: string): Skill | undefined {\n return this.skills.find(s => s.name === name);\n }\n\n /**\n * Check if a skill exists\n */\n hasSkill(name: string): boolean {\n return this.skills.some(s => s.name === name);\n }\n\n /**\n * Expand a skill command into a full skill block\n */\n expandCommand(text: string): string {\n if (!text.startsWith('/skill:')) {\n return text;\n }\n\n const { skillName, args } = this.parseSkillCommand(text);\n const skill = this.findSkill(skillName);\n\n if (!skill) {\n log.warn({ skillName }, 'Skill not found for expansion');\n return text;\n }\n\n return this.buildSkillBlock(skill, args);\n }\n\n /**\n * Parse a /skill: command\n */\n private parseSkillCommand(text: string): { skillName: string; args?: string } {\n // Format: /skill:name args...\n const withoutPrefix = text.slice(7); // Remove '/skill:'\n const spaceIndex = withoutPrefix.indexOf(' ');\n\n if (spaceIndex === -1) {\n return { skillName: withoutPrefix.trim() };\n }\n\n return {\n skillName: withoutPrefix.slice(0, spaceIndex).trim(),\n args: withoutPrefix.slice(spaceIndex + 1).trim(),\n };\n }\n\n /**\n * Build a skill block for inclusion in the prompt\n */\n private buildSkillBlock(skill: Skill, args?: string): string {\n let block = `\\n\\n## Skill: ${skill.name}\\n\\n`;\n \n if (skill.description) {\n block += `${skill.description}\\n\\n`;\n }\n\n // Include raw skill content (SKILL.md content)\n if (skill.content) {\n block += `${skill.content}\\n\\n`;\n }\n\n if (args) {\n block += `**Arguments**: ${args}\\n\\n`;\n }\n\n return block;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"skill-manager.js","names":[],"sources":["../../../../src/agent/skills/skill-manager.ts"],"sourcesContent":["/**\n * Skill Manager - Manages skills loading and expansion\n *\n * Handles skill initialization, reloading, and command expansion.\n */\n\nimport { createSkillLoader, type Skill } from './index.js';\nimport { resolveBundledSkillsDir, resolveStateDir } from '../../config/paths.js';\nimport { createLogger } from '../../utils/logger.js';\nimport { createSkillConfigManager, isSkillEnabled } from './config.js';\nimport { formatSkillsForPrompt, selectSkillsVisibleInPrompt } from './format-skills-prompt.js';\n\nconst log = createLogger('SkillManager');\n\nexport interface SkillDiagnostic {\n type: 'collision' | 'warning' | 'error' | 'info';\n skillName: string;\n message: string;\n}\n\nexport interface SkillLoadResult {\n skills: Skill[];\n prompt: string;\n diagnostics: SkillDiagnostic[];\n}\n\nexport class SkillManager {\n private skillPrompt: string = '';\n private skills: Skill[] = [];\n private skillLoader = createSkillLoader();\n private workspace: string;\n private bundledSkillsDir: string;\n\n constructor(workspace: string, bundledSkillsDir?: string) {\n this.workspace = workspace;\n this.bundledSkillsDir = bundledSkillsDir || resolveBundledSkillsDir();\n this.initialize();\n }\n\n /**\n * Initialize skills from workspace and bundled directories\n */\n private initialize(): void {\n const result = this.skillLoader.init(this.workspace, this.bundledSkillsDir);\n this.skillPrompt = result.prompt;\n this.skills = result.skills;\n\n // Log diagnostics\n for (const diag of result.diagnostics) {\n if (diag.type === 'collision') {\n log.warn({ skill: diag.skillName, message: diag.message }, 'Skill collision');\n } else if (diag.type === 'warning') {\n log.warn({ skill: diag.skillName, message: diag.message }, 'Skill warning');\n } else if (diag.type === 'error') {\n log.error({ skill: diag.skillName, message: diag.message }, 'Skill error');\n } else {\n log.info({ skill: diag.skillName, message: diag.message }, 'Skill info');\n }\n }\n\n log.debug({ count: result.skills.length }, 'Skills loaded');\n }\n\n /**\n * Recompute skill XML prompt from current skills.json (no disk rescan).\n */\n refreshPromptFromConfig(): void {\n this.skillLoader.refreshPromptFromConfig();\n this.skillPrompt = this.skillLoader.getPrompt();\n }\n\n /**\n * Reload skills from disk\n */\n reload(): void {\n log.info('Reloading skills...');\n const result = this.skillLoader.reload();\n this.skillPrompt = result.prompt;\n this.skills = result.skills;\n\n for (const diag of result.diagnostics) {\n if (diag.type === 'collision') {\n log.warn({ skill: diag.skillName, message: diag.message }, 'Skill collision');\n } else if (diag.type === 'warning') {\n log.warn({ skill: diag.skillName, message: diag.message }, 'Skill warning');\n } else if (diag.type === 'error') {\n log.error({ skill: diag.skillName, message: diag.message }, 'Skill error');\n }\n }\n\n log.info({ count: result.skills.length }, 'Skills reloaded');\n }\n\n /**\n * Get the skill prompt to append to system prompt\n */\n getPrompt(): string {\n return this.skillPrompt;\n }\n\n /**\n * `<available_skills>` XML with optional per-agent allowlist and/or tool-based gating.\n * When both arguments are omitted, returns the cached prompt from disk load (no tool gating).\n */\n getPromptForSkillAllowlist(\n allowlist: string[] | undefined,\n registeredToolNames?: string[],\n ): string {\n if (allowlist === undefined && registeredToolNames === undefined) {\n return this.getPrompt();\n }\n const skillsConfig = createSkillConfigManager(resolveStateDir()).load();\n return formatSkillsForPrompt(this.getSkills(), skillsConfig, {\n skillAllowlist: allowlist,\n registeredToolNames,\n });\n }\n\n /** Skills visible for prompts and skills_list given the same indexing options as {@link getPromptForSkillAllowlist}. */\n selectSkillsForAgentIndexing(options?: {\n skillAllowlist?: string[];\n registeredToolNames?: string[];\n }): Skill[] {\n const skillsConfig = createSkillConfigManager(resolveStateDir()).load();\n return selectSkillsVisibleInPrompt(this.getSkills(), skillsConfig, options);\n }\n\n /**\n * Get all loaded skills\n */\n getSkills(): Skill[] {\n return [...this.skills];\n }\n\n /**\n * Get skill names\n */\n getSkillNames(): string[] {\n return this.skills.map((s) => s.name);\n }\n\n /** Names of skills included in the agent system prompt (`<available_skills>`). */\n getSkillNamesForPrompt(): string[] {\n const skillsConfig = createSkillConfigManager(resolveStateDir()).load();\n return this.getSkills()\n .filter((s) => !s.disableModelInvocation && isSkillEnabled(s, skillsConfig))\n .map((s) => s.name);\n }\n\n /**\n * Skills that are enabled for model discovery (respects skills.json and requirement checks).\n */\n getEnabledSkills(): Skill[] {\n const skillsConfig = createSkillConfigManager(resolveStateDir()).load();\n return this.getSkills().filter(\n (s) => !s.disableModelInvocation && isSkillEnabled(s, skillsConfig),\n );\n }\n\n /**\n * Like {@link getEnabledSkills} plus optional allowlist and tool gating (matches `<available_skills>`).\n */\n getEnabledSkillsForAgentSession(options?: {\n skillAllowlist?: string[];\n registeredToolNames?: string[];\n }): Skill[] {\n return this.selectSkillsForAgentIndexing(options);\n }\n\n /**\n * Find a skill by name\n */\n findSkill(name: string): Skill | undefined {\n return this.skills.find(s => s.name === name);\n }\n\n /**\n * Check if a skill exists\n */\n hasSkill(name: string): boolean {\n return this.skills.some(s => s.name === name);\n }\n\n /**\n * Expand a skill command into a full skill block\n */\n expandCommand(text: string, options?: { skillAllowlist?: string[]; registeredToolNames?: string[] }): string {\n if (!text.startsWith('/skill:')) {\n return text;\n }\n\n const { skillName, args } = this.parseSkillCommand(text);\n const visible = this.selectSkillsForAgentIndexing(options);\n const skill = visible.find((s) => s.name === skillName);\n\n if (!skill) {\n log.warn({ skillName }, 'Skill not visible for expansion');\n return text;\n }\n\n return this.buildSkillBlock(skill, args);\n }\n\n /**\n * Parse a /skill: command\n */\n private parseSkillCommand(text: string): { skillName: string; args?: string } {\n // Format: /skill:name args...\n const withoutPrefix = text.slice(7); // Remove '/skill:'\n const spaceIndex = withoutPrefix.indexOf(' ');\n\n if (spaceIndex === -1) {\n return { skillName: withoutPrefix.trim() };\n }\n\n return {\n skillName: withoutPrefix.slice(0, spaceIndex).trim(),\n args: withoutPrefix.slice(spaceIndex + 1).trim(),\n };\n }\n\n /**\n * Build a skill block for inclusion in the prompt\n */\n private buildSkillBlock(skill: Skill, args?: string): string {\n let block = `\\n\\n## Skill: ${skill.name}\\n\\n`;\n \n if (skill.description) {\n block += `${skill.description}\\n\\n`;\n }\n\n // Include raw skill content (SKILL.md content)\n if (skill.content) {\n block += `${skill.content}\\n\\n`;\n }\n\n if (args) {\n block += `**Arguments**: ${args}\\n\\n`;\n }\n\n return block;\n }\n}\n"],"mappings":"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"}
@@ -1,8 +1,7 @@
1
1
  /**
2
2
  * Resolve safe paths for skill_view: only SKILL.md (default) or files under allowlisted subdirs.
3
- * Also provides localized SKILL.md resolution for multi-language display.
4
3
  */
5
- import type { Skill, SkillMarkdownPreviewPayload } from './types.js';
4
+ import type { Skill } from './types.js';
6
5
  export type ResolveSkillFileResult = {
7
6
  ok: true;
8
7
  absolutePath: string;
@@ -15,18 +14,3 @@ export type ResolveSkillFileResult = {
15
14
  * Other paths must live under references/, templates/, scripts/, or assets/.
16
15
  */
17
16
  export declare function resolveSkillReadablePath(skill: Skill, subPath: string | undefined): ResolveSkillFileResult;
18
- /**
19
- * Resolve a localized SKILL.md for display (e.g. SKILL-zh.md, SKILL-en.md).
20
- * Falls back to the base SKILL.md content if no localized file exists.
21
- *
22
- * This is the **display** path — execution always reads the base SKILL.md.
23
- */
24
- export declare function resolveLocalizedSkillMarkdown(skill: Skill, lang?: string): SkillMarkdownPreviewPayload | null;
25
- /**
26
- * Lightweight localized name/description lookup (frontmatter only) for list views.
27
- * Reuses the same SKILL-{lang}.md resolution as {@link resolveLocalizedSkillMarkdown}.
28
- */
29
- export declare function resolveLocalizedSkillMeta(skill: Skill, lang: string): {
30
- name: string;
31
- description: string;
32
- } | null;
@@ -1,13 +1,8 @@
1
- import { parseFrontmatter } from "../../markdown/frontmatter.js";
2
- import { parseSkillToolConditions } from "./skill-tool-gating.js";
3
- import { parseRequiredEnvVarNames } from "./required-env-vars.js";
4
- import { parseSkillMetadata } from "./parse-skill-metadata.js";
5
- import { join, resolve, sep } from "path";
6
- import { existsSync, readFileSync, realpathSync } from "fs";
1
+ import { resolve, sep } from "path";
2
+ import { existsSync, realpathSync } from "fs";
7
3
  //#region src/agent/skills/skill-view-path.ts
8
4
  /**
9
5
  * Resolve safe paths for skill_view: only SKILL.md (default) or files under allowlisted subdirs.
10
- * Also provides localized SKILL.md resolution for multi-language display.
11
6
  */
12
7
  const ALLOWED_TOP = new Set([
13
8
  "references",
@@ -71,65 +66,7 @@ function resolveSkillReadablePath(skill, subPath) {
71
66
  };
72
67
  }
73
68
  }
74
- /**
75
- * Resolve a localized SKILL.md for display (e.g. SKILL-zh.md, SKILL-en.md).
76
- * Falls back to the base SKILL.md content if no localized file exists.
77
- *
78
- * This is the **display** path — execution always reads the base SKILL.md.
79
- */
80
- function resolveLocalizedSkillMarkdown(skill, lang) {
81
- if (!lang) return null;
82
- const normalizedLang = lang.split(/[-_]/)[0]?.toLowerCase();
83
- if (!normalizedLang || normalizedLang === "en") return null;
84
- const localizedPath = join(skill.baseDir, `SKILL-${normalizedLang}.md`);
85
- if (!existsSync(localizedPath)) return null;
86
- try {
87
- const { frontmatter, content } = parseFrontmatter(readFileSync(localizedPath, "utf-8"));
88
- const fm = frontmatter;
89
- const name = typeof fm.name === "string" && fm.name.trim() || skill.name;
90
- const description = (typeof fm.description === "string" ? fm.description.trim() : "") || skill.description;
91
- const metadata = parseSkillMetadata(fm);
92
- if (!metadata.name.trim()) metadata.name = name;
93
- if (!metadata.description.trim()) metadata.description = description;
94
- const toolConditions = parseSkillToolConditions(fm);
95
- const requiredEnvVarNames = parseRequiredEnvVarNames(fm);
96
- return {
97
- name,
98
- description,
99
- bodyMarkdown: content.trim(),
100
- disableModelInvocation: skill.disableModelInvocation,
101
- metadata,
102
- toolConditions,
103
- requiredEnvVarNames: requiredEnvVarNames.length > 0 ? requiredEnvVarNames : void 0
104
- };
105
- } catch {
106
- return null;
107
- }
108
- }
109
- /**
110
- * Lightweight localized name/description lookup (frontmatter only) for list views.
111
- * Reuses the same SKILL-{lang}.md resolution as {@link resolveLocalizedSkillMarkdown}.
112
- */
113
- function resolveLocalizedSkillMeta(skill, lang) {
114
- const normalizedLang = lang.split(/[-_]/)[0]?.toLowerCase();
115
- if (!normalizedLang || normalizedLang === "en") return null;
116
- const localizedPath = join(skill.baseDir, `SKILL-${normalizedLang}.md`);
117
- if (!existsSync(localizedPath)) return null;
118
- try {
119
- const { frontmatter } = parseFrontmatter(readFileSync(localizedPath, "utf-8"));
120
- const fm = frontmatter;
121
- const name = typeof fm.name === "string" && fm.name.trim() ? fm.name.trim() : void 0;
122
- const description = typeof fm.description === "string" && fm.description.trim() ? fm.description.trim() : void 0;
123
- if (!name && !description) return null;
124
- return {
125
- name: name ?? skill.name,
126
- description: description ?? skill.description
127
- };
128
- } catch {
129
- return null;
130
- }
131
- }
132
69
  //#endregion
133
- export { resolveLocalizedSkillMarkdown, resolveLocalizedSkillMeta, resolveSkillReadablePath };
70
+ export { resolveSkillReadablePath };
134
71
 
135
72
  //# sourceMappingURL=skill-view-path.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"skill-view-path.js","names":[],"sources":["../../../../src/agent/skills/skill-view-path.ts"],"sourcesContent":["/**\n * Resolve safe paths for skill_view: only SKILL.md (default) or files under allowlisted subdirs.\n * Also provides localized SKILL.md resolution for multi-language display.\n */\n\nimport { existsSync, readFileSync, realpathSync } from 'fs';\nimport { join, resolve, sep } from 'path';\n\nimport { parseFrontmatter } from '../../markdown/frontmatter.js';\nimport { parseRequiredEnvVarNames } from './required-env-vars.js';\nimport { parseSkillMetadata } from './parse-skill-metadata.js';\nimport { parseSkillToolConditions } from './skill-tool-gating.js';\nimport type { Skill, SkillMarkdownPreviewPayload } from './types.js';\n\nconst ALLOWED_TOP = new Set(['references', 'templates', 'scripts', 'assets']);\n\nexport type ResolveSkillFileResult =\n | { ok: true; absolutePath: string }\n | { ok: false; error: string };\n\nfunction isSkillMdSegment(p: string): boolean {\n const s = p.trim();\n return s === 'SKILL.md' || s.toLowerCase() === 'skill.md';\n}\n\nfunction isInsideDir(dirReal: string, fileReal: string): boolean {\n const prefix = dirReal.endsWith(sep) ? dirReal : dirReal + sep;\n return fileReal === dirReal || fileReal.startsWith(prefix);\n}\n\n/**\n * Resolve a readable file path for {@link skill}. Empty or SKILL.md → main SKILL.md file.\n * Other paths must live under references/, templates/, scripts/, or assets/.\n */\nexport function resolveSkillReadablePath(\n skill: Skill,\n subPath: string | undefined,\n): ResolveSkillFileResult {\n const base = skill.baseDir;\n const trimmed = subPath?.trim() ?? '';\n\n let target: string;\n if (!trimmed || trimmed === '.' || isSkillMdSegment(trimmed)) {\n target = skill.filePath;\n } else {\n const norm = trimmed.replace(/\\\\/g, '/');\n if (norm.includes('..')) {\n return { ok: false, error: 'Invalid path: path traversal is not allowed.' };\n }\n if (norm.startsWith('/') || /^[A-Za-z]:/.test(norm)) {\n return {\n ok: false,\n error: 'Invalid path: use a path relative to the skill directory.',\n };\n }\n const first = norm.split('/').filter(Boolean)[0] ?? '';\n if (!ALLOWED_TOP.has(first)) {\n return {\n ok: false,\n error: `Invalid path: must be under references/, templates/, scripts/, or assets/ (or omit path for SKILL.md).`,\n };\n }\n target = resolve(base, norm);\n }\n\n try {\n const baseReal = realpathSync(base);\n if (!existsSync(target)) {\n return { ok: false, error: `File not found: ${trimmed || 'SKILL.md'}` };\n }\n const targetReal = realpathSync(target);\n if (!isInsideDir(baseReal, targetReal)) {\n return { ok: false, error: 'Resolved path escapes the skill directory.' };\n }\n return { ok: true, absolutePath: targetReal };\n } catch (e) {\n return { ok: false, error: e instanceof Error ? e.message : String(e) };\n }\n}\n\n/**\n * Resolve a localized SKILL.md for display (e.g. SKILL-zh.md, SKILL-en.md).\n * Falls back to the base SKILL.md content if no localized file exists.\n *\n * This is the **display** path — execution always reads the base SKILL.md.\n */\nexport function resolveLocalizedSkillMarkdown(\n skill: Skill,\n lang?: string,\n): SkillMarkdownPreviewPayload | null {\n if (!lang) {\n return null; // caller should fall back to skill.content\n }\n\n // Normalize: prefer two-letter code\n const normalizedLang = lang.split(/[-_]/)[0]?.toLowerCase();\n if (!normalizedLang || normalizedLang === 'en') {\n return null; // 'en' is the base SKILL.md\n }\n\n const localizedPath = join(skill.baseDir, `SKILL-${normalizedLang}.md`);\n if (!existsSync(localizedPath)) {\n return null;\n }\n\n try {\n const rawContent = readFileSync(localizedPath, 'utf-8');\n const { frontmatter, content } = parseFrontmatter(rawContent);\n const fm = frontmatter as Record<string, unknown>;\n\n const name = (typeof fm.name === 'string' && fm.name.trim()) || skill.name;\n const descFromFm = typeof fm.description === 'string' ? fm.description.trim() : '';\n const description = descFromFm || skill.description;\n const metadata = parseSkillMetadata(fm);\n if (!metadata.name.trim()) metadata.name = name;\n if (!metadata.description.trim()) metadata.description = description;\n\n const toolConditions = parseSkillToolConditions(fm);\n const requiredEnvVarNames = parseRequiredEnvVarNames(fm);\n\n return {\n name,\n description,\n bodyMarkdown: content.trim(),\n disableModelInvocation: skill.disableModelInvocation,\n metadata,\n toolConditions,\n requiredEnvVarNames: requiredEnvVarNames.length > 0 ? requiredEnvVarNames : undefined,\n };\n } catch {\n return null; // parse error → fall back\n }\n}\n\n/**\n * Lightweight localized name/description lookup (frontmatter only) for list views.\n * Reuses the same SKILL-{lang}.md resolution as {@link resolveLocalizedSkillMarkdown}.\n */\nexport function resolveLocalizedSkillMeta(\n skill: Skill,\n lang: string,\n): { name: string; description: string } | null {\n const normalizedLang = lang.split(/[-_]/)[0]?.toLowerCase();\n if (!normalizedLang || normalizedLang === 'en') return null;\n\n const localizedPath = join(skill.baseDir, `SKILL-${normalizedLang}.md`);\n if (!existsSync(localizedPath)) return null;\n\n try {\n const rawContent = readFileSync(localizedPath, 'utf-8');\n const { frontmatter } = parseFrontmatter(rawContent);\n const fm = frontmatter as Record<string, unknown>;\n const name = typeof fm.name === 'string' && fm.name.trim() ? fm.name.trim() : undefined;\n const description =\n typeof fm.description === 'string' && fm.description.trim() ? fm.description.trim() : undefined;\n if (!name && !description) return null;\n return {\n name: name ?? skill.name,\n description: description ?? skill.description,\n };\n } catch {\n return null;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"skill-view-path.js","names":[],"sources":["../../../../src/agent/skills/skill-view-path.ts"],"sourcesContent":["/**\n * Resolve safe paths for skill_view: only SKILL.md (default) or files under allowlisted subdirs.\n */\n\nimport { existsSync, realpathSync } from 'fs';\nimport { resolve, sep } from 'path';\n\nimport type { Skill } from './types.js';\n\nconst ALLOWED_TOP = new Set(['references', 'templates', 'scripts', 'assets']);\n\nexport type ResolveSkillFileResult =\n | { ok: true; absolutePath: string }\n | { ok: false; error: string };\n\nfunction isSkillMdSegment(p: string): boolean {\n const s = p.trim();\n return s === 'SKILL.md' || s.toLowerCase() === 'skill.md';\n}\n\nfunction isInsideDir(dirReal: string, fileReal: string): boolean {\n const prefix = dirReal.endsWith(sep) ? dirReal : dirReal + sep;\n return fileReal === dirReal || fileReal.startsWith(prefix);\n}\n\n/**\n * Resolve a readable file path for {@link skill}. Empty or SKILL.md → main SKILL.md file.\n * Other paths must live under references/, templates/, scripts/, or assets/.\n */\nexport function resolveSkillReadablePath(\n skill: Skill,\n subPath: string | undefined,\n): ResolveSkillFileResult {\n const base = skill.baseDir;\n const trimmed = subPath?.trim() ?? '';\n\n let target: string;\n if (!trimmed || trimmed === '.' || isSkillMdSegment(trimmed)) {\n target = skill.filePath;\n } else {\n const norm = trimmed.replace(/\\\\/g, '/');\n if (norm.includes('..')) {\n return { ok: false, error: 'Invalid path: path traversal is not allowed.' };\n }\n if (norm.startsWith('/') || /^[A-Za-z]:/.test(norm)) {\n return {\n ok: false,\n error: 'Invalid path: use a path relative to the skill directory.',\n };\n }\n const first = norm.split('/').filter(Boolean)[0] ?? '';\n if (!ALLOWED_TOP.has(first)) {\n return {\n ok: false,\n error: `Invalid path: must be under references/, templates/, scripts/, or assets/ (or omit path for SKILL.md).`,\n };\n }\n target = resolve(base, norm);\n }\n\n try {\n const baseReal = realpathSync(base);\n if (!existsSync(target)) {\n return { ok: false, error: `File not found: ${trimmed || 'SKILL.md'}` };\n }\n const targetReal = realpathSync(target);\n if (!isInsideDir(baseReal, targetReal)) {\n return { ok: false, error: 'Resolved path escapes the skill directory.' };\n }\n return { ok: true, absolutePath: targetReal };\n } catch (e) {\n return { ok: false, error: e instanceof Error ? e.message : String(e) };\n }\n}\n"],"mappings":";;;;;;AASA,MAAM,cAAc,IAAI,IAAI;CAAC;CAAc;CAAa;CAAW;CAAS,CAAC;AAM7E,SAAS,iBAAiB,GAAoB;CAC5C,MAAM,IAAI,EAAE,MAAM;AAClB,QAAO,MAAM,cAAc,EAAE,aAAa,KAAK;;AAGjD,SAAS,YAAY,SAAiB,UAA2B;CAC/D,MAAM,SAAS,QAAQ,SAAS,IAAI,GAAG,UAAU,UAAU;AAC3D,QAAO,aAAa,WAAW,SAAS,WAAW,OAAO;;;;;;AAO5D,SAAgB,yBACd,OACA,SACwB;CACxB,MAAM,OAAO,MAAM;CACnB,MAAM,UAAU,SAAS,MAAM,IAAI;CAEnC,IAAI;AACJ,KAAI,CAAC,WAAW,YAAY,OAAO,iBAAiB,QAAQ,CAC1D,UAAS,MAAM;MACV;EACL,MAAM,OAAO,QAAQ,QAAQ,OAAO,IAAI;AACxC,MAAI,KAAK,SAAS,KAAK,CACrB,QAAO;GAAE,IAAI;GAAO,OAAO;GAAgD;AAE7E,MAAI,KAAK,WAAW,IAAI,IAAI,aAAa,KAAK,KAAK,CACjD,QAAO;GACL,IAAI;GACJ,OAAO;GACR;EAEH,MAAM,QAAQ,KAAK,MAAM,IAAI,CAAC,OAAO,QAAQ,CAAC,MAAM;AACpD,MAAI,CAAC,YAAY,IAAI,MAAM,CACzB,QAAO;GACL,IAAI;GACJ,OAAO;GACR;AAEH,WAAS,QAAQ,MAAM,KAAK;;AAG9B,KAAI;EACF,MAAM,WAAW,aAAa,KAAK;AACnC,MAAI,CAAC,WAAW,OAAO,CACrB,QAAO;GAAE,IAAI;GAAO,OAAO,mBAAmB,WAAW;GAAc;EAEzE,MAAM,aAAa,aAAa,OAAO;AACvC,MAAI,CAAC,YAAY,UAAU,WAAW,CACpC,QAAO;GAAE,IAAI;GAAO,OAAO;GAA8C;AAE3E,SAAO;GAAE,IAAI;GAAM,cAAc;GAAY;UACtC,GAAG;AACV,SAAO;GAAE,IAAI;GAAO,OAAO,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE;GAAE"}
@@ -1,9 +1,9 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
3
  import { parseFrontmatter } from "../../markdown/frontmatter.js";
4
- import { hasBinary, init_installer } from "./installer.js";
5
- import { parseSkillMetadata } from "./parse-skill-metadata.js";
4
+ import { hasBinary } from "./installer.js";
6
5
  import { scanSkillDirectory } from "./scanner.js";
6
+ import { parseSkillMetadata } from "./parse-skill-metadata.js";
7
7
  import { basename, join, relative } from "path";
8
8
  import { existsSync, readFileSync, readdirSync } from "fs";
9
9
  //#region src/agent/skills/test-framework.ts
@@ -14,7 +14,6 @@ import { existsSync, readFileSync, readdirSync } from "fs";
14
14
  * Validates SKILL.md format, dependencies, security, and examples.
15
15
  */
16
16
  init_logger();
17
- init_installer();
18
17
  const log = createLogger("SkillTestFramework");
19
18
  var SkillTestFramework = class {
20
19
  options;
@@ -1 +1 @@
1
- {"version":3,"file":"test-framework.js","names":[],"sources":["../../../../src/agent/skills/test-framework.ts"],"sourcesContent":["/**\n * Skill Test Framework\n * \n * Comprehensive testing framework for skills.\n * Validates SKILL.md format, dependencies, security, and examples.\n */\n\nimport { existsSync, readFileSync, readdirSync } from 'fs';\nimport { basename, join, relative } from 'path';\nimport { createLogger } from '../../utils/logger.js';\nimport { parseFrontmatter } from '../../markdown/frontmatter.js';\nimport { parseSkillMetadata } from './parse-skill-metadata.js';\nimport { scanSkillDirectory } from './scanner.js';\nimport { hasBinary } from './installer.js';\nimport type { SkillMetadata, SkillInstallSpec } from './types.js';\n\nconst log = createLogger('SkillTestFramework');\n\n// ============================================================================\n// Test Result Types\n// ============================================================================\n\nexport type TestStatus = 'pass' | 'fail' | 'warn' | 'skip';\n\nexport interface TestResult {\n name: string;\n status: TestStatus;\n message?: string;\n details?: string[];\n duration?: number;\n}\n\nexport interface SkillTestReport {\n skillName: string;\n skillPath: string;\n timestamp: number;\n results: TestResult[];\n summary: {\n total: number;\n passed: number;\n failed: number;\n warnings: number;\n skipped: number;\n };\n passed: boolean;\n}\n\nexport interface TestOptions {\n /** Skip security tests */\n skipSecurity?: boolean;\n /** Skip dependency tests */\n skipDeps?: boolean;\n /** Skip example tests */\n skipExamples?: boolean;\n /** Strict mode - fail on warnings */\n strict?: boolean;\n /** Timeout for example tests (ms) */\n exampleTimeout?: number;\n /** Working directory for example tests */\n cwd?: string;\n}\n\n// ============================================================================\n// Test Framework Core\n// ============================================================================\n\nexport class SkillTestFramework {\n private options: TestOptions;\n\n constructor(options: TestOptions = {}) {\n this.options = {\n skipSecurity: false,\n skipDeps: false,\n skipExamples: false,\n strict: false,\n exampleTimeout: 10000,\n cwd: process.cwd(),\n ...options,\n };\n }\n\n /**\n * Run all tests for a skill\n */\n async testSkill(skillDir: string): Promise<SkillTestReport> {\n const results: TestResult[] = [];\n\n log.info({ skillDir }, 'Testing skill');\n\n // Validate skill directory\n if (!existsSync(skillDir)) {\n return this.createFailureReport(skillDir, 'Skill directory not found');\n }\n\n const skillMdPath = join(skillDir, 'SKILL.md');\n if (!existsSync(skillMdPath)) {\n return this.createFailureReport(skillDir, 'SKILL.md not found');\n }\n\n // Parse SKILL.md\n const parseResult = this.testSkillMdFormat(skillMdPath);\n results.push(parseResult);\n\n if (parseResult.status === 'fail') {\n return this.createReport(skillDir, results);\n }\n\n const { frontmatter } = parseFrontmatter(readFileSync(skillMdPath, 'utf-8'));\n const metadata = parseSkillMetadata(frontmatter);\n\n // Run dependency tests\n if (!this.options.skipDeps) {\n const depsResult = await this.testDependencies(metadata);\n results.push(depsResult);\n }\n\n // Run security tests\n if (!this.options.skipSecurity) {\n const securityResult = await this.testSecurity(skillDir);\n results.push(securityResult);\n }\n\n // Run metadata tests\n const metadataResult = this.testMetadata(metadata, skillDir);\n results.push(metadataResult);\n\n // Run example tests\n if (!this.options.skipExamples) {\n const content = readFileSync(skillMdPath, 'utf-8');\n const examplesResult = await this.testExamples(content, skillDir);\n results.push(examplesResult);\n }\n\n return this.createReport(skillDir, results);\n }\n\n /**\n * Test SKILL.md format\n */\n testSkillMdFormat(filePath: string): TestResult {\n const startTime = Date.now();\n const details: string[] = [];\n\n try {\n const content = readFileSync(filePath, 'utf-8');\n\n // Check for frontmatter\n if (!content.startsWith('---')) {\n return {\n name: 'SKILL.md format',\n status: 'fail',\n message: 'Missing YAML frontmatter',\n duration: Date.now() - startTime,\n };\n }\n\n const { frontmatter } = parseFrontmatter(content);\n\n // Required fields\n const requiredFields = ['name', 'description'];\n for (const field of requiredFields) {\n if (!frontmatter[field]) {\n details.push(`Missing required field: ${field}`);\n }\n }\n\n if (details.length > 0) {\n return {\n name: 'SKILL.md format',\n status: 'fail',\n message: 'Missing required frontmatter fields',\n details,\n duration: Date.now() - startTime,\n };\n }\n\n // Validate field types\n if (typeof frontmatter.name !== 'string') {\n return {\n name: 'SKILL.md format',\n status: 'fail',\n message: 'Field \"name\" must be a string',\n duration: Date.now() - startTime,\n };\n }\n\n if (typeof frontmatter.description !== 'string') {\n return {\n name: 'SKILL.md format',\n status: 'fail',\n message: 'Field \"description\" must be a string',\n duration: Date.now() - startTime,\n };\n }\n\n // Check for content after frontmatter\n const { content: bodyContent } = parseFrontmatter(content);\n if (!bodyContent || bodyContent.length < 10) {\n return {\n name: 'SKILL.md format',\n status: 'warn',\n message: 'SKILL.md body is too short',\n details: ['Consider adding more detailed documentation'],\n duration: Date.now() - startTime,\n };\n }\n\n return {\n name: 'SKILL.md format',\n status: 'pass',\n message: 'Valid SKILL.md format',\n duration: Date.now() - startTime,\n };\n } catch (err) {\n return {\n name: 'SKILL.md format',\n status: 'fail',\n message: err instanceof Error ? err.message : 'Failed to parse SKILL.md',\n duration: Date.now() - startTime,\n };\n }\n }\n\n /**\n * Test dependencies\n */\n async testDependencies(metadata: SkillMetadata): Promise<TestResult> {\n const startTime = Date.now();\n const details: string[] = [];\n let hasWarnings = false;\n let hasFailures = false;\n\n const requires = metadata.xopc?.requires;\n\n if (!requires) {\n return {\n name: 'Dependencies',\n status: 'skip',\n message: 'No dependencies declared',\n duration: Date.now() - startTime,\n };\n }\n\n // Check required binaries\n if (requires.bins) {\n for (const bin of requires.bins) {\n const available = hasBinary(bin);\n if (!available) {\n details.push(`Missing required binary: ${bin}`);\n hasFailures = true;\n } else {\n details.push(`Found binary: ${bin}`);\n }\n }\n }\n\n // Check anyBins (OR condition)\n if (requires.anyBins) {\n const hasAny = requires.anyBins.some(bin => hasBinary(bin));\n if (!hasAny) {\n details.push(`Missing binaries (need one of): ${requires.anyBins.join(', ')}`);\n hasFailures = true;\n } else {\n details.push(`Found at least one binary from: ${requires.anyBins.join(', ')}`);\n }\n }\n\n // Check install specs\n const installSpecs = metadata.xopc?.install;\n if (installSpecs && installSpecs.length > 0) {\n details.push(`Available installers: ${installSpecs.map(s => s.kind).join(', ')}`);\n \n // Validate install specs\n for (const spec of installSpecs) {\n const installCheck = this.validateInstallSpec(spec);\n if (installCheck.status === 'fail') {\n details.push(installCheck.message);\n hasWarnings = true;\n }\n }\n }\n\n return {\n name: 'Dependencies',\n status: hasFailures ? 'fail' : hasWarnings ? 'warn' : 'pass',\n message: hasFailures ? 'Missing dependencies' : hasWarnings ? 'Dependency warnings' : 'All dependencies satisfied',\n details,\n duration: Date.now() - startTime,\n };\n }\n\n /**\n * Test security\n */\n async testSecurity(skillDir: string): Promise<TestResult> {\n const startTime = Date.now();\n\n try {\n const summary = await scanSkillDirectory(skillDir);\n\n const details: string[] = [\n `Critical: ${summary.critical}`,\n `Warnings: ${summary.warn}`,\n `Info: ${summary.info}`,\n ];\n\n if (summary.critical > 0) {\n return {\n name: 'Security',\n status: 'fail',\n message: 'Critical security issues found',\n details: [\n ...details,\n ...summary.findings\n .filter(f => f.severity === 'critical')\n .map(f => `${f.message} at ${relative(skillDir, f.file)}:${f.line}`),\n ],\n duration: Date.now() - startTime,\n };\n }\n\n if (summary.warn > 0) {\n return {\n name: 'Security',\n status: 'warn',\n message: 'Security warnings found',\n details: [\n ...details,\n ...summary.findings\n .filter(f => f.severity === 'warning')\n .map(f => `${f.message} at ${relative(skillDir, f.file)}:${f.line}`),\n ],\n duration: Date.now() - startTime,\n };\n }\n\n return {\n name: 'Security',\n status: 'pass',\n message: 'No security issues',\n details,\n duration: Date.now() - startTime,\n };\n } catch (err) {\n return {\n name: 'Security',\n status: 'fail',\n message: err instanceof Error ? err.message : 'Security scan failed',\n duration: Date.now() - startTime,\n };\n }\n }\n\n /**\n * Test metadata\n */\n testMetadata(metadata: SkillMetadata, _skillDir: string): TestResult {\n const startTime = Date.now();\n const details: string[] = [];\n let hasWarnings = false;\n\n // Check for emoji\n const emoji = metadata.xopc?.emoji;\n if (emoji) {\n details.push(`Emoji: ${emoji}`);\n } else {\n details.push('No emoji defined (recommended)');\n hasWarnings = true;\n }\n\n // Check for homepage\n if (metadata.homepage) {\n details.push(`Homepage: ${metadata.homepage}`);\n } else {\n details.push('No homepage defined (recommended)');\n hasWarnings = true;\n }\n\n // Check for OS restrictions\n const os = metadata.xopc?.os;\n if (os) {\n details.push(`Supported OS: ${os.join(', ')}`);\n }\n\n // Check for install specs\n const installSpecs = metadata.xopc?.install;\n if (installSpecs && installSpecs.length > 0) {\n details.push(`Installers: ${installSpecs.length} defined`);\n }\n\n return {\n name: 'Metadata',\n status: hasWarnings ? 'warn' : 'pass',\n message: hasWarnings ? 'Metadata could be improved' : 'Complete metadata',\n details,\n duration: Date.now() - startTime,\n };\n }\n\n /**\n * Test code examples\n */\n async testExamples(content: string, _skillDir: string): Promise<TestResult> {\n const startTime = Date.now();\n const details: string[] = [];\n let hasFailures = false;\n\n // Extract code blocks\n const codeBlocks = this.extractCodeBlocks(content);\n \n if (codeBlocks.length === 0) {\n return {\n name: 'Examples',\n status: 'warn',\n message: 'No code examples found',\n details: ['Consider adding usage examples'],\n duration: Date.now() - startTime,\n };\n }\n\n details.push(`Found ${codeBlocks.length} code block(s)`);\n\n // Test shell command examples (basic validation)\n const shellCommands = codeBlocks.filter(block => {\n const lang = block.language?.toLowerCase();\n return lang === 'bash' || lang === 'sh' || lang === 'shell';\n });\n\n if (shellCommands.length > 0) {\n details.push(`Shell examples: ${shellCommands.length}`);\n \n // Validate command syntax (basic check)\n for (const cmd of shellCommands) {\n const syntaxCheck = this.validateShellSyntax(cmd.code);\n if (!syntaxCheck.valid) {\n details.push(`Invalid syntax: ${syntaxCheck.error}`);\n hasFailures = true;\n }\n }\n }\n\n return {\n name: 'Examples',\n status: hasFailures ? 'fail' : 'pass',\n message: hasFailures ? 'Invalid examples found' : 'Examples validated',\n details,\n duration: Date.now() - startTime,\n };\n }\n\n // ============================================================================\n // Helper Methods\n // ============================================================================\n\n private validateInstallSpec(spec: SkillInstallSpec): TestResult {\n switch (spec.kind) {\n case 'brew':\n if (!spec.formula) {\n return {\n name: 'Install spec',\n status: 'fail',\n message: 'Brew installer missing \"formula\" field',\n };\n }\n break;\n case 'pnpm':\n case 'npm':\n case 'yarn':\n case 'bun':\n if (!spec.package) {\n return {\n name: 'Install spec',\n status: 'fail',\n message: 'Node installer missing \"package\" field',\n };\n }\n break;\n case 'go':\n if (!spec.module) {\n return {\n name: 'Install spec',\n status: 'fail',\n message: 'Go installer missing \"module\" field',\n };\n }\n break;\n case 'uv':\n if (!spec.package) {\n return {\n name: 'Install spec',\n status: 'fail',\n message: 'UV installer missing \"package\" field',\n };\n }\n break;\n }\n return { name: 'Install spec', status: 'pass' };\n }\n\n private extractCodeBlocks(content: string): Array<{ language: string; code: string }> {\n const blocks: Array<{ language: string; code: string }> = [];\n const regex = /```(\\w+)?\\n([\\s\\S]*?)```/g;\n let match;\n\n while ((match = regex.exec(content)) !== null) {\n blocks.push({\n language: match[1] || 'text',\n code: match[2].trim(),\n });\n }\n\n return blocks;\n }\n\n private validateShellSyntax(code: string): { valid: boolean; error?: string } {\n // Basic validation - check for common syntax errors\n const lines = code.split('\\n').filter(line => line.trim() && !line.trim().startsWith('#'));\n \n for (const line of lines) {\n // Check for unclosed quotes\n const singleQuotes = (line.match(/'/g) || []).length;\n const doubleQuotes = (line.match(/\"/g) || []).length;\n \n if (singleQuotes % 2 !== 0) {\n return { valid: false, error: 'Unclosed single quote' };\n }\n if (doubleQuotes % 2 !== 0) {\n return { valid: false, error: 'Unclosed double quote' };\n }\n \n // Check for unclosed parentheses/brackets\n const openParens = (line.match(/\\(/g) || []).length;\n const closeParens = (line.match(/\\)/g) || []).length;\n if (openParens !== closeParens) {\n return { valid: false, error: 'Mismatched parentheses' };\n }\n }\n\n return { valid: true };\n }\n\n private createReport(skillDir: string, results: TestResult[]): SkillTestReport {\n const summary = {\n total: results.length,\n passed: results.filter(r => r.status === 'pass').length,\n failed: results.filter(r => r.status === 'fail').length,\n warnings: results.filter(r => r.status === 'warn').length,\n skipped: results.filter(r => r.status === 'skip').length,\n };\n\n const passed = summary.failed === 0 && (this.options.strict ? summary.warnings === 0 : true);\n\n return {\n skillName: basename(skillDir),\n skillPath: skillDir,\n timestamp: Date.now(),\n results,\n summary,\n passed,\n };\n }\n\n private createFailureReport(skillDir: string, message: string): SkillTestReport {\n return {\n skillName: basename(skillDir),\n skillPath: skillDir,\n timestamp: Date.now(),\n results: [{\n name: 'Validation',\n status: 'fail',\n message,\n }],\n summary: {\n total: 1,\n passed: 0,\n failed: 1,\n warnings: 0,\n skipped: 0,\n },\n passed: false,\n };\n }\n}\n\n// ============================================================================\n// Test Runner\n// ============================================================================\n\nexport interface TestRunnerOptions extends TestOptions {\n /** Skills directory to test */\n skillsDir: string;\n /** Output format */\n format?: 'text' | 'json' | 'tap';\n /** Verbose output */\n verbose?: boolean;\n}\n\nexport class SkillTestRunner {\n private options: TestRunnerOptions;\n private framework: SkillTestFramework;\n\n constructor(options: TestRunnerOptions) {\n this.options = options;\n this.framework = new SkillTestFramework(options);\n }\n\n async run(): Promise<{ reports: SkillTestReport[]; passed: boolean }> {\n const reports: SkillTestReport[] = [];\n const skillsDir = this.options.skillsDir;\n\n log.info({ skillsDir }, 'Running skill tests');\n\n // Find all skill directories\n const skillDirs = this.findSkillDirectories(skillsDir);\n\n for (const skillDir of skillDirs) {\n const report = await this.framework.testSkill(skillDir);\n reports.push(report);\n }\n\n const allPassed = reports.every(r => r.passed);\n\n return { reports, passed: allPassed };\n }\n\n private findSkillDirectories(skillsDir: string): string[] {\n const dirs: string[] = [];\n\n try {\n const entries = readdirSync(skillsDir, { withFileTypes: true });\n \n for (const entry of entries) {\n if (entry.isDirectory() && !entry.name.startsWith('.')) {\n const skillDir = join(skillsDir, entry.name);\n const skillMdPath = join(skillDir, 'SKILL.md');\n \n if (existsSync(skillMdPath)) {\n dirs.push(skillDir);\n }\n }\n }\n } catch (err) {\n log.warn({ error: err }, 'Failed to scan skills directory');\n }\n\n return dirs;\n }\n}\n\n/**\n * Format test results as text\n */\nexport function formatTestResults(reports: SkillTestReport[], verbose = false): string {\n const lines: string[] = [];\n \n for (const report of reports) {\n const icon = report.passed ? '✅' : '❌';\n lines.push(`\\n${icon} ${report.skillName}`);\n lines.push('─'.repeat(50));\n\n for (const result of report.results) {\n const statusIcon = result.status === 'pass' ? '✓' : result.status === 'fail' ? '✗' : result.status === 'warn' ? '⚠' : '○';\n lines.push(` ${statusIcon} ${result.name}: ${result.message || ''}`);\n \n if (verbose && result.details) {\n for (const detail of result.details) {\n lines.push(` ${detail}`);\n }\n }\n }\n\n lines.push(` Summary: ${report.summary.passed}/${report.summary.total} passed`);\n if (report.summary.failed > 0) {\n lines.push(` Failed: ${report.summary.failed}`);\n }\n if (report.summary.warnings > 0) {\n lines.push(` Warnings: ${report.summary.warnings}`);\n }\n }\n\n const totalTests = reports.reduce((sum, r) => sum + r.summary.total, 0);\n const totalPassed = reports.reduce((sum, r) => sum + r.summary.passed, 0);\n const totalFailed = reports.reduce((sum, r) => sum + r.summary.failed, 0);\n const totalWarnings = reports.reduce((sum, r) => sum + r.summary.warnings, 0);\n\n lines.push('\\n' + '='.repeat(50));\n lines.push(`Total: ${totalTests} tests, ${totalPassed} passed, ${totalFailed} failed, ${totalWarnings} warnings`);\n \n const allPassed = reports.every(r => r.passed);\n lines.push(`Result: ${allPassed ? '✅ PASSED' : '❌ FAILED'}`);\n\n return lines.join('\\n');\n}\n\n/**\n * Format test results as JSON\n */\nexport function formatTestResultsJson(reports: SkillTestReport[]): string {\n return JSON.stringify({\n timestamp: new Date().toISOString(),\n totalSkills: reports.length,\n passedSkills: reports.filter(r => r.passed).length,\n reports,\n }, null, 2);\n}\n\n/**\n * Format test results as TAP (Test Anything Protocol)\n */\nexport function formatTestResultsTap(reports: SkillTestReport[]): string {\n const lines: string[] = [];\n let testNum = 1;\n\n lines.push(`TAP version 13`);\n lines.push(`1..${reports.reduce((sum, r) => sum + r.results.length, 0)}`);\n\n for (const report of reports) {\n for (const result of report.results) {\n const status = result.status === 'pass' ? 'ok' : 'not ok';\n const testId = testNum++;\n lines.push(`${status} ${testId} - ${report.skillName}: ${result.name}`);\n \n if (result.status === 'fail' && result.message) {\n lines.push(` ---`);\n lines.push(` message: ${result.message}`);\n lines.push(` ...`);\n }\n }\n }\n\n return lines.join('\\n');\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"test-framework.js","names":[],"sources":["../../../../src/agent/skills/test-framework.ts"],"sourcesContent":["/**\n * Skill Test Framework\n * \n * Comprehensive testing framework for skills.\n * Validates SKILL.md format, dependencies, security, and examples.\n */\n\nimport { existsSync, readFileSync, readdirSync } from 'fs';\nimport { basename, join, relative } from 'path';\nimport { createLogger } from '../../utils/logger.js';\nimport { parseFrontmatter } from '../../markdown/frontmatter.js';\nimport { parseSkillMetadata } from './parse-skill-metadata.js';\nimport { scanSkillDirectory } from './scanner.js';\nimport { hasBinary } from './installer.js';\nimport type { SkillMetadata, SkillInstallSpec } from './types.js';\n\nconst log = createLogger('SkillTestFramework');\n\n// ============================================================================\n// Test Result Types\n// ============================================================================\n\nexport type TestStatus = 'pass' | 'fail' | 'warn' | 'skip';\n\nexport interface TestResult {\n name: string;\n status: TestStatus;\n message?: string;\n details?: string[];\n duration?: number;\n}\n\nexport interface SkillTestReport {\n skillName: string;\n skillPath: string;\n timestamp: number;\n results: TestResult[];\n summary: {\n total: number;\n passed: number;\n failed: number;\n warnings: number;\n skipped: number;\n };\n passed: boolean;\n}\n\nexport interface TestOptions {\n /** Skip security tests */\n skipSecurity?: boolean;\n /** Skip dependency tests */\n skipDeps?: boolean;\n /** Skip example tests */\n skipExamples?: boolean;\n /** Strict mode - fail on warnings */\n strict?: boolean;\n /** Timeout for example tests (ms) */\n exampleTimeout?: number;\n /** Working directory for example tests */\n cwd?: string;\n}\n\n// ============================================================================\n// Test Framework Core\n// ============================================================================\n\nexport class SkillTestFramework {\n private options: TestOptions;\n\n constructor(options: TestOptions = {}) {\n this.options = {\n skipSecurity: false,\n skipDeps: false,\n skipExamples: false,\n strict: false,\n exampleTimeout: 10000,\n cwd: process.cwd(),\n ...options,\n };\n }\n\n /**\n * Run all tests for a skill\n */\n async testSkill(skillDir: string): Promise<SkillTestReport> {\n const results: TestResult[] = [];\n\n log.info({ skillDir }, 'Testing skill');\n\n // Validate skill directory\n if (!existsSync(skillDir)) {\n return this.createFailureReport(skillDir, 'Skill directory not found');\n }\n\n const skillMdPath = join(skillDir, 'SKILL.md');\n if (!existsSync(skillMdPath)) {\n return this.createFailureReport(skillDir, 'SKILL.md not found');\n }\n\n // Parse SKILL.md\n const parseResult = this.testSkillMdFormat(skillMdPath);\n results.push(parseResult);\n\n if (parseResult.status === 'fail') {\n return this.createReport(skillDir, results);\n }\n\n const { frontmatter } = parseFrontmatter(readFileSync(skillMdPath, 'utf-8'));\n const metadata = parseSkillMetadata(frontmatter);\n\n // Run dependency tests\n if (!this.options.skipDeps) {\n const depsResult = await this.testDependencies(metadata);\n results.push(depsResult);\n }\n\n // Run security tests\n if (!this.options.skipSecurity) {\n const securityResult = await this.testSecurity(skillDir);\n results.push(securityResult);\n }\n\n // Run metadata tests\n const metadataResult = this.testMetadata(metadata, skillDir);\n results.push(metadataResult);\n\n // Run example tests\n if (!this.options.skipExamples) {\n const content = readFileSync(skillMdPath, 'utf-8');\n const examplesResult = await this.testExamples(content, skillDir);\n results.push(examplesResult);\n }\n\n return this.createReport(skillDir, results);\n }\n\n /**\n * Test SKILL.md format\n */\n testSkillMdFormat(filePath: string): TestResult {\n const startTime = Date.now();\n const details: string[] = [];\n\n try {\n const content = readFileSync(filePath, 'utf-8');\n\n // Check for frontmatter\n if (!content.startsWith('---')) {\n return {\n name: 'SKILL.md format',\n status: 'fail',\n message: 'Missing YAML frontmatter',\n duration: Date.now() - startTime,\n };\n }\n\n const { frontmatter } = parseFrontmatter(content);\n\n // Required fields\n const requiredFields = ['name', 'description'];\n for (const field of requiredFields) {\n if (!frontmatter[field]) {\n details.push(`Missing required field: ${field}`);\n }\n }\n\n if (details.length > 0) {\n return {\n name: 'SKILL.md format',\n status: 'fail',\n message: 'Missing required frontmatter fields',\n details,\n duration: Date.now() - startTime,\n };\n }\n\n // Validate field types\n if (typeof frontmatter.name !== 'string') {\n return {\n name: 'SKILL.md format',\n status: 'fail',\n message: 'Field \"name\" must be a string',\n duration: Date.now() - startTime,\n };\n }\n\n if (typeof frontmatter.description !== 'string') {\n return {\n name: 'SKILL.md format',\n status: 'fail',\n message: 'Field \"description\" must be a string',\n duration: Date.now() - startTime,\n };\n }\n\n // Check for content after frontmatter\n const { content: bodyContent } = parseFrontmatter(content);\n if (!bodyContent || bodyContent.length < 10) {\n return {\n name: 'SKILL.md format',\n status: 'warn',\n message: 'SKILL.md body is too short',\n details: ['Consider adding more detailed documentation'],\n duration: Date.now() - startTime,\n };\n }\n\n return {\n name: 'SKILL.md format',\n status: 'pass',\n message: 'Valid SKILL.md format',\n duration: Date.now() - startTime,\n };\n } catch (err) {\n return {\n name: 'SKILL.md format',\n status: 'fail',\n message: err instanceof Error ? err.message : 'Failed to parse SKILL.md',\n duration: Date.now() - startTime,\n };\n }\n }\n\n /**\n * Test dependencies\n */\n async testDependencies(metadata: SkillMetadata): Promise<TestResult> {\n const startTime = Date.now();\n const details: string[] = [];\n let hasWarnings = false;\n let hasFailures = false;\n\n const requires = metadata.xopc?.requires;\n\n if (!requires) {\n return {\n name: 'Dependencies',\n status: 'skip',\n message: 'No dependencies declared',\n duration: Date.now() - startTime,\n };\n }\n\n // Check required binaries\n if (requires.bins) {\n for (const bin of requires.bins) {\n const available = hasBinary(bin);\n if (!available) {\n details.push(`Missing required binary: ${bin}`);\n hasFailures = true;\n } else {\n details.push(`Found binary: ${bin}`);\n }\n }\n }\n\n // Check anyBins (OR condition)\n if (requires.anyBins) {\n const hasAny = requires.anyBins.some(bin => hasBinary(bin));\n if (!hasAny) {\n details.push(`Missing binaries (need one of): ${requires.anyBins.join(', ')}`);\n hasFailures = true;\n } else {\n details.push(`Found at least one binary from: ${requires.anyBins.join(', ')}`);\n }\n }\n\n // Check install specs\n const installSpecs = metadata.xopc?.install;\n if (installSpecs && installSpecs.length > 0) {\n details.push(`Available installers: ${installSpecs.map(s => s.kind).join(', ')}`);\n \n // Validate install specs\n for (const spec of installSpecs) {\n const installCheck = this.validateInstallSpec(spec);\n if (installCheck.status === 'fail') {\n details.push(installCheck.message);\n hasWarnings = true;\n }\n }\n }\n\n return {\n name: 'Dependencies',\n status: hasFailures ? 'fail' : hasWarnings ? 'warn' : 'pass',\n message: hasFailures ? 'Missing dependencies' : hasWarnings ? 'Dependency warnings' : 'All dependencies satisfied',\n details,\n duration: Date.now() - startTime,\n };\n }\n\n /**\n * Test security\n */\n async testSecurity(skillDir: string): Promise<TestResult> {\n const startTime = Date.now();\n\n try {\n const summary = await scanSkillDirectory(skillDir);\n\n const details: string[] = [\n `Critical: ${summary.critical}`,\n `Warnings: ${summary.warn}`,\n `Info: ${summary.info}`,\n ];\n\n if (summary.critical > 0) {\n return {\n name: 'Security',\n status: 'fail',\n message: 'Critical security issues found',\n details: [\n ...details,\n ...summary.findings\n .filter(f => f.severity === 'critical')\n .map(f => `${f.message} at ${relative(skillDir, f.file)}:${f.line}`),\n ],\n duration: Date.now() - startTime,\n };\n }\n\n if (summary.warn > 0) {\n return {\n name: 'Security',\n status: 'warn',\n message: 'Security warnings found',\n details: [\n ...details,\n ...summary.findings\n .filter(f => f.severity === 'warning')\n .map(f => `${f.message} at ${relative(skillDir, f.file)}:${f.line}`),\n ],\n duration: Date.now() - startTime,\n };\n }\n\n return {\n name: 'Security',\n status: 'pass',\n message: 'No security issues',\n details,\n duration: Date.now() - startTime,\n };\n } catch (err) {\n return {\n name: 'Security',\n status: 'fail',\n message: err instanceof Error ? err.message : 'Security scan failed',\n duration: Date.now() - startTime,\n };\n }\n }\n\n /**\n * Test metadata\n */\n testMetadata(metadata: SkillMetadata, _skillDir: string): TestResult {\n const startTime = Date.now();\n const details: string[] = [];\n let hasWarnings = false;\n\n // Check for emoji\n const emoji = metadata.xopc?.emoji;\n if (emoji) {\n details.push(`Emoji: ${emoji}`);\n } else {\n details.push('No emoji defined (recommended)');\n hasWarnings = true;\n }\n\n // Check for homepage\n if (metadata.homepage) {\n details.push(`Homepage: ${metadata.homepage}`);\n } else {\n details.push('No homepage defined (recommended)');\n hasWarnings = true;\n }\n\n // Check for OS restrictions\n const os = metadata.xopc?.os;\n if (os) {\n details.push(`Supported OS: ${os.join(', ')}`);\n }\n\n // Check for install specs\n const installSpecs = metadata.xopc?.install;\n if (installSpecs && installSpecs.length > 0) {\n details.push(`Installers: ${installSpecs.length} defined`);\n }\n\n return {\n name: 'Metadata',\n status: hasWarnings ? 'warn' : 'pass',\n message: hasWarnings ? 'Metadata could be improved' : 'Complete metadata',\n details,\n duration: Date.now() - startTime,\n };\n }\n\n /**\n * Test code examples\n */\n async testExamples(content: string, _skillDir: string): Promise<TestResult> {\n const startTime = Date.now();\n const details: string[] = [];\n let hasFailures = false;\n\n // Extract code blocks\n const codeBlocks = this.extractCodeBlocks(content);\n \n if (codeBlocks.length === 0) {\n return {\n name: 'Examples',\n status: 'warn',\n message: 'No code examples found',\n details: ['Consider adding usage examples'],\n duration: Date.now() - startTime,\n };\n }\n\n details.push(`Found ${codeBlocks.length} code block(s)`);\n\n // Test shell command examples (basic validation)\n const shellCommands = codeBlocks.filter(block => {\n const lang = block.language?.toLowerCase();\n return lang === 'bash' || lang === 'sh' || lang === 'shell';\n });\n\n if (shellCommands.length > 0) {\n details.push(`Shell examples: ${shellCommands.length}`);\n \n // Validate command syntax (basic check)\n for (const cmd of shellCommands) {\n const syntaxCheck = this.validateShellSyntax(cmd.code);\n if (!syntaxCheck.valid) {\n details.push(`Invalid syntax: ${syntaxCheck.error}`);\n hasFailures = true;\n }\n }\n }\n\n return {\n name: 'Examples',\n status: hasFailures ? 'fail' : 'pass',\n message: hasFailures ? 'Invalid examples found' : 'Examples validated',\n details,\n duration: Date.now() - startTime,\n };\n }\n\n // ============================================================================\n // Helper Methods\n // ============================================================================\n\n private validateInstallSpec(spec: SkillInstallSpec): TestResult {\n switch (spec.kind) {\n case 'brew':\n if (!spec.formula) {\n return {\n name: 'Install spec',\n status: 'fail',\n message: 'Brew installer missing \"formula\" field',\n };\n }\n break;\n case 'pnpm':\n case 'npm':\n case 'yarn':\n case 'bun':\n if (!spec.package) {\n return {\n name: 'Install spec',\n status: 'fail',\n message: 'Node installer missing \"package\" field',\n };\n }\n break;\n case 'go':\n if (!spec.module) {\n return {\n name: 'Install spec',\n status: 'fail',\n message: 'Go installer missing \"module\" field',\n };\n }\n break;\n case 'uv':\n if (!spec.package) {\n return {\n name: 'Install spec',\n status: 'fail',\n message: 'UV installer missing \"package\" field',\n };\n }\n break;\n }\n return { name: 'Install spec', status: 'pass' };\n }\n\n private extractCodeBlocks(content: string): Array<{ language: string; code: string }> {\n const blocks: Array<{ language: string; code: string }> = [];\n const regex = /```(\\w+)?\\n([\\s\\S]*?)```/g;\n let match;\n\n while ((match = regex.exec(content)) !== null) {\n blocks.push({\n language: match[1] || 'text',\n code: match[2].trim(),\n });\n }\n\n return blocks;\n }\n\n private validateShellSyntax(code: string): { valid: boolean; error?: string } {\n // Basic validation - check for common syntax errors\n const lines = code.split('\\n').filter(line => line.trim() && !line.trim().startsWith('#'));\n \n for (const line of lines) {\n // Check for unclosed quotes\n const singleQuotes = (line.match(/'/g) || []).length;\n const doubleQuotes = (line.match(/\"/g) || []).length;\n \n if (singleQuotes % 2 !== 0) {\n return { valid: false, error: 'Unclosed single quote' };\n }\n if (doubleQuotes % 2 !== 0) {\n return { valid: false, error: 'Unclosed double quote' };\n }\n \n // Check for unclosed parentheses/brackets\n const openParens = (line.match(/\\(/g) || []).length;\n const closeParens = (line.match(/\\)/g) || []).length;\n if (openParens !== closeParens) {\n return { valid: false, error: 'Mismatched parentheses' };\n }\n }\n\n return { valid: true };\n }\n\n private createReport(skillDir: string, results: TestResult[]): SkillTestReport {\n const summary = {\n total: results.length,\n passed: results.filter(r => r.status === 'pass').length,\n failed: results.filter(r => r.status === 'fail').length,\n warnings: results.filter(r => r.status === 'warn').length,\n skipped: results.filter(r => r.status === 'skip').length,\n };\n\n const passed = summary.failed === 0 && (this.options.strict ? summary.warnings === 0 : true);\n\n return {\n skillName: basename(skillDir),\n skillPath: skillDir,\n timestamp: Date.now(),\n results,\n summary,\n passed,\n };\n }\n\n private createFailureReport(skillDir: string, message: string): SkillTestReport {\n return {\n skillName: basename(skillDir),\n skillPath: skillDir,\n timestamp: Date.now(),\n results: [{\n name: 'Validation',\n status: 'fail',\n message,\n }],\n summary: {\n total: 1,\n passed: 0,\n failed: 1,\n warnings: 0,\n skipped: 0,\n },\n passed: false,\n };\n }\n}\n\n// ============================================================================\n// Test Runner\n// ============================================================================\n\nexport interface TestRunnerOptions extends TestOptions {\n /** Skills directory to test */\n skillsDir: string;\n /** Output format */\n format?: 'text' | 'json' | 'tap';\n /** Verbose output */\n verbose?: boolean;\n}\n\nexport class SkillTestRunner {\n private options: TestRunnerOptions;\n private framework: SkillTestFramework;\n\n constructor(options: TestRunnerOptions) {\n this.options = options;\n this.framework = new SkillTestFramework(options);\n }\n\n async run(): Promise<{ reports: SkillTestReport[]; passed: boolean }> {\n const reports: SkillTestReport[] = [];\n const skillsDir = this.options.skillsDir;\n\n log.info({ skillsDir }, 'Running skill tests');\n\n // Find all skill directories\n const skillDirs = this.findSkillDirectories(skillsDir);\n\n for (const skillDir of skillDirs) {\n const report = await this.framework.testSkill(skillDir);\n reports.push(report);\n }\n\n const allPassed = reports.every(r => r.passed);\n\n return { reports, passed: allPassed };\n }\n\n private findSkillDirectories(skillsDir: string): string[] {\n const dirs: string[] = [];\n\n try {\n const entries = readdirSync(skillsDir, { withFileTypes: true });\n \n for (const entry of entries) {\n if (entry.isDirectory() && !entry.name.startsWith('.')) {\n const skillDir = join(skillsDir, entry.name);\n const skillMdPath = join(skillDir, 'SKILL.md');\n \n if (existsSync(skillMdPath)) {\n dirs.push(skillDir);\n }\n }\n }\n } catch (err) {\n log.warn({ error: err }, 'Failed to scan skills directory');\n }\n\n return dirs;\n }\n}\n\n/**\n * Format test results as text\n */\nexport function formatTestResults(reports: SkillTestReport[], verbose = false): string {\n const lines: string[] = [];\n \n for (const report of reports) {\n const icon = report.passed ? '✅' : '❌';\n lines.push(`\\n${icon} ${report.skillName}`);\n lines.push('─'.repeat(50));\n\n for (const result of report.results) {\n const statusIcon = result.status === 'pass' ? '✓' : result.status === 'fail' ? '✗' : result.status === 'warn' ? '⚠' : '○';\n lines.push(` ${statusIcon} ${result.name}: ${result.message || ''}`);\n \n if (verbose && result.details) {\n for (const detail of result.details) {\n lines.push(` ${detail}`);\n }\n }\n }\n\n lines.push(` Summary: ${report.summary.passed}/${report.summary.total} passed`);\n if (report.summary.failed > 0) {\n lines.push(` Failed: ${report.summary.failed}`);\n }\n if (report.summary.warnings > 0) {\n lines.push(` Warnings: ${report.summary.warnings}`);\n }\n }\n\n const totalTests = reports.reduce((sum, r) => sum + r.summary.total, 0);\n const totalPassed = reports.reduce((sum, r) => sum + r.summary.passed, 0);\n const totalFailed = reports.reduce((sum, r) => sum + r.summary.failed, 0);\n const totalWarnings = reports.reduce((sum, r) => sum + r.summary.warnings, 0);\n\n lines.push('\\n' + '='.repeat(50));\n lines.push(`Total: ${totalTests} tests, ${totalPassed} passed, ${totalFailed} failed, ${totalWarnings} warnings`);\n \n const allPassed = reports.every(r => r.passed);\n lines.push(`Result: ${allPassed ? '✅ PASSED' : '❌ FAILED'}`);\n\n return lines.join('\\n');\n}\n\n/**\n * Format test results as JSON\n */\nexport function formatTestResultsJson(reports: SkillTestReport[]): string {\n return JSON.stringify({\n timestamp: new Date().toISOString(),\n totalSkills: reports.length,\n passedSkills: reports.filter(r => r.passed).length,\n reports,\n }, null, 2);\n}\n\n/**\n * Format test results as TAP (Test Anything Protocol)\n */\nexport function formatTestResultsTap(reports: SkillTestReport[]): string {\n const lines: string[] = [];\n let testNum = 1;\n\n lines.push(`TAP version 13`);\n lines.push(`1..${reports.reduce((sum, r) => sum + r.results.length, 0)}`);\n\n for (const report of reports) {\n for (const result of report.results) {\n const status = result.status === 'pass' ? 'ok' : 'not ok';\n const testId = testNum++;\n lines.push(`${status} ${testId} - ${report.skillName}: ${result.name}`);\n \n if (result.status === 'fail' && result.message) {\n lines.push(` ---`);\n lines.push(` message: ${result.message}`);\n lines.push(` ...`);\n }\n }\n }\n\n return lines.join('\\n');\n}\n"],"mappings":"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"}
@@ -5,6 +5,7 @@
5
5
  function applyReasoningVisibilityToSseEvent(event, reasoningLevel) {
6
6
  if (reasoningLevel !== "off") return event;
7
7
  if (event.type === "thinking") return null;
8
+ if (event.type === "message_update" && event.assistantMessageEvent?.type === "thinking_delta") return null;
8
9
  if (event.type === "progress" && event.stage === "thinking") return null;
9
10
  return event;
10
11
  }
@@ -1 +1 @@
1
- {"version":3,"file":"reasoning-visibility-sse.js","names":[],"sources":["../../../../src/agent/streaming/reasoning-visibility-sse.ts"],"sourcesContent":["/**\n * Outbound SSE visibility for session `reasoningLevel`.\n * Single choke point: call from the queue push path so agent subscribe stays free of policy branches.\n *\n * Note: Does not alter persisted messages or agent state; history/UI may still strip thinking separately.\n */\n\nimport type { ReasoningLevel } from '../transcript/thinking-types.js';\n\nexport type SseStreamEvent = { type: string; [key: string]: unknown };\n\n/**\n * @returns `null` to drop the event; unchanged `event` otherwise.\n */\nexport function applyReasoningVisibilityToSseEvent(\n event: SseStreamEvent,\n reasoningLevel: ReasoningLevel,\n): SseStreamEvent | null {\n if (reasoningLevel !== 'off') {\n return event;\n }\n if (event.type === 'thinking') {\n return null;\n }\n if (event.type === 'progress' && event.stage === 'thinking') {\n return null;\n }\n return event;\n}\n"],"mappings":";;;;AAcA,SAAgB,mCACd,OACA,gBACuB;AACvB,KAAI,mBAAmB,MACrB,QAAO;AAET,KAAI,MAAM,SAAS,WACjB,QAAO;AAET,KAAI,MAAM,SAAS,cAAc,MAAM,UAAU,WAC/C,QAAO;AAET,QAAO"}
1
+ {"version":3,"file":"reasoning-visibility-sse.js","names":[],"sources":["../../../../src/agent/streaming/reasoning-visibility-sse.ts"],"sourcesContent":["/**\n * Outbound SSE visibility for session `reasoningLevel`.\n * Single choke point: call from the queue push path so agent subscribe stays free of policy branches.\n *\n * Note: Does not alter persisted messages or agent state; history/UI may still strip thinking separately.\n */\n\nimport type { ReasoningLevel } from '../transcript/thinking-types.js';\n\nexport type SseStreamEvent = { type: string; [key: string]: unknown };\n\n/**\n * @returns `null` to drop the event; unchanged `event` otherwise.\n */\nexport function applyReasoningVisibilityToSseEvent(\n event: SseStreamEvent,\n reasoningLevel: ReasoningLevel,\n): SseStreamEvent | null {\n if (reasoningLevel !== 'off') {\n return event;\n }\n if (event.type === 'thinking') {\n return null;\n }\n if (\n event.type === 'message_update' &&\n (event.assistantMessageEvent as { type?: unknown } | undefined)?.type === 'thinking_delta'\n ) {\n return null;\n }\n if (event.type === 'progress' && event.stage === 'thinking') {\n return null;\n }\n return event;\n}\n"],"mappings":";;;;AAcA,SAAgB,mCACd,OACA,gBACuB;AACvB,KAAI,mBAAmB,MACrB,QAAO;AAET,KAAI,MAAM,SAAS,WACjB,QAAO;AAET,KACE,MAAM,SAAS,oBACd,MAAM,uBAA0D,SAAS,iBAE1E,QAAO;AAET,KAAI,MAAM,SAAS,cAAc,MAAM,UAAU,WAC/C,QAAO;AAET,QAAO"}
@@ -0,0 +1 @@
1
+ export declare const browserUseManual = "# Browser Tool Manual\n\n## Overview\n\n`browser_use` is XOPC's unified browser tool. It supports four modes:\n\n| Mode | Purpose |\n|------|---------|\n| `command` | Run a single browser action |\n| `pipeline` | Run a multi-step YAML flow |\n| `inspect` | Read current page state |\n| `close` | Close the browser session |\n\n## When to use\n\n- Open pages, click controls, fill forms\n- Capture screenshots or page content\n- Run multi-step automation flows\n- Extract data from pages\n\n## Command mode\n\n### Basic shape\n\n```json\n{\n \"mode\": \"command\",\n \"command\": \"<action>\",\n \"args\": { ... }\n}\n```\n\n### Available commands\n\n| Command | Description | Key arguments |\n|---------|-------------|---------------|\n| `open` / `navigate` | Open a URL | `url`, `wait_until` |\n| `state` / `snapshot` | ARIA snapshot of the page | `selector`, `maxLength` |\n| `click` | Click an element | `selector` / `text` / `role` |\n| `type` / `input` | Type text | `selector` / `label`, `text`, `pressEnter` |\n| `scroll` | Scroll the page | `direction`, `amount` |\n| `screenshot` | Screenshot | `selector`, `full_page`, `path` |\n| `back` | Go back | `waitFor` |\n| `keys` / `press` | Keyboard input | `key` |\n| `console` / `eval` | Run JavaScript | `javascript` |\n| `images` | Collect images on the page | `selector`, `maxImages` |\n| `wait` | Wait for element/time | `selector` / `text` / `ms`, `timeout_ms` |\n| `dialog` | Handle dialogs | `action` (accept/dismiss) |\n| `close` | Close the current page | \u2014 |\n\n### Element targeting\n\nPrefer, in order:\n\n1. **ARIA role**: most stable, e.g. `\"role\": \"button:Submit\"`\n2. **Visible text**, e.g. `\"text\": \"Sign In\"`\n3. **CSS selector**, e.g. `\"selector\": \"#login-btn\"`\n\nGuidelines:\n\n- Use `inspect` or `state` first to get a snapshot\n- Pick locators from ARIA info in the snapshot\n- Avoid dynamic class names when possible\n\n## Inspect mode\n\nBefore acting, understand the current page:\n\n```json\n{ \"mode\": \"inspect\" }\n```\n\nReturns: current URL, title, ARIA snapshot.\n\n**Best practice**: after each navigation, inspect, then choose the next step.\n\n## Pipeline mode\n\nFor multi-step, reusable flows. Uses a brocli-style YAML DSL.\n\n### Run from file\n\n```json\n{\n \"mode\": \"pipeline\",\n \"pipeline\": {\n \"path\": \"./browser-flow.yaml\",\n \"args\": { \"url\": \"https://example.com\" }\n }\n}\n```\n\n### Run inline YAML\n\n```json\n{\n \"mode\": \"pipeline\",\n \"pipeline\": {\n \"yaml\": \"name: quick-check\\npipeline:\\n - navigate:\\n url: https://example.com\\n - screenshot:\\n full_page: true\",\n \"dryRun\": false\n }\n}\n```\n\n### YAML layout\n\n```yaml\nname: pipeline-name\ndescription: What this flow does\nargs:\n url:\n type: string\n required: true\n query:\n type: string\n default: \"hello\"\npipeline:\n - navigate:\n url: ${{ args.url }}\n wait_until: domcontentloaded\n - wait:\n selector: input[name=\"q\"]\n - type:\n selector: input[name=\"q\"]\n text: ${{ args.query }}\n - press:\n key: Enter\n - wait:\n selector: body\n timeout_ms: 10000\n - screenshot:\n path: ./artifacts/result.png\n full_page: true\n - output:\n value:\n screenshot: ./artifacts/result.png\non_error:\n - screenshot:\n path: ./artifacts/error.png\n full_page: true\n```\n\n### Authoring rules\n\n1. One action per step\n2. Use `${{ args.xxx }}` for parameters\n3. Use `${{ data }}` or `${{ data | json }}` for the previous step's result\n4. Use `on_error` to collect diagnostics after failure\n\n### Validate without running\n\n```json\n{\n \"mode\": \"pipeline\",\n \"pipeline\": {\n \"yaml\": \"...\",\n \"dryRun\": true\n }\n}\n```\n\n## Recovery when something fails\n\n1. `inspect` to see current state\n2. Confirm the URL (redirects may have changed it)\n3. Use the snapshot to see if the page finished loading\n4. `screenshot` for visual debugging\n5. `wait` for elements, then retry\n\n## Safety\n\n- Do not put API keys or tokens in URLs\n- Do not target private IPs / localhost unless configuration allows it\n- Cloud metadata endpoints are always blocked\n- For destructive actions (submit forms, delete data), confirm intent with the user first\n";