@xopcai/xopc 0.0.103 → 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 (930) hide show
  1. package/README.md +7 -4
  2. package/README.zh-CN.md +7 -4
  3. package/dist/_virtual/_rolldown/runtime.js +2 -3
  4. package/dist/browser-ext/manifest.json +1 -1
  5. package/dist/extensions/feishu/src/adapters/cli-login.d.ts +1 -1
  6. package/dist/extensions/feishu/src/adapters/cli-login.js +1 -1
  7. package/dist/extensions/feishu/src/adapters/cli-login.js.map +1 -1
  8. package/dist/extensions/feishu/src/adapters/gateway-setup.d.ts +2 -0
  9. package/dist/extensions/feishu/src/adapters/gateway-setup.js +225 -0
  10. package/dist/extensions/feishu/src/adapters/gateway-setup.js.map +1 -0
  11. package/dist/extensions/feishu/src/index.d.ts +8 -1
  12. package/dist/extensions/feishu/src/index.js +14 -1
  13. package/dist/extensions/feishu/src/index.js.map +1 -0
  14. package/dist/extensions/feishu/src/outbound/outbound-adapter.js +1 -1
  15. package/dist/extensions/feishu/src/plugin.d.ts +2 -1
  16. package/dist/extensions/feishu/src/plugin.js +2 -0
  17. package/dist/extensions/feishu/src/plugin.js.map +1 -1
  18. package/dist/extensions/feishu/src/streaming/streaming-adapter.js +1 -1
  19. package/dist/extensions/feishu/src/transport/webhook/monitor.js +1 -1
  20. package/dist/extensions/feishu/xopc.extension.json +66 -1
  21. package/dist/extensions/telegram/src/adapters/gateway-setup.d.ts +2 -0
  22. package/dist/extensions/telegram/src/adapters/gateway-setup.js +146 -0
  23. package/dist/extensions/telegram/src/adapters/gateway-setup.js.map +1 -0
  24. package/dist/extensions/telegram/src/adapters/security-adapter.js +1 -1
  25. package/dist/extensions/telegram/src/command-handler.js +1 -2
  26. package/dist/extensions/telegram/src/command-handler.js.map +1 -1
  27. package/dist/extensions/telegram/src/config-schema.js +2 -2
  28. package/dist/extensions/telegram/src/config-schema.js.map +1 -1
  29. package/dist/extensions/telegram/src/doctor.d.ts +1 -0
  30. package/dist/extensions/telegram/src/doctor.js +68 -0
  31. package/dist/extensions/telegram/src/doctor.js.map +1 -1
  32. package/dist/extensions/telegram/src/index.d.ts +8 -1
  33. package/dist/extensions/telegram/src/index.js +15 -2
  34. package/dist/extensions/telegram/src/index.js.map +1 -0
  35. package/dist/extensions/telegram/src/plugin.d.ts +13 -5
  36. package/dist/extensions/telegram/src/plugin.js +32 -12
  37. package/dist/extensions/telegram/src/plugin.js.map +1 -1
  38. package/dist/extensions/telegram/src/proxy-fetch.js +22 -5
  39. package/dist/extensions/telegram/src/proxy-fetch.js.map +1 -1
  40. package/dist/extensions/telegram/xopc.extension.json +412 -5
  41. package/dist/extensions/weixin/src/adapters/onboard-cli.js +2 -2
  42. package/dist/extensions/weixin/src/adapters/onboard-cli.js.map +1 -1
  43. package/dist/extensions/weixin/src/api/api.js +1 -1
  44. package/dist/extensions/weixin/src/index.d.ts +8 -0
  45. package/dist/extensions/weixin/src/index.js +12 -1
  46. package/dist/extensions/weixin/src/index.js.map +1 -0
  47. package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
  48. package/dist/extensions/weixin/src/plugin.d.ts +2 -1
  49. package/dist/extensions/weixin/src/plugin.js +77 -2
  50. package/dist/extensions/weixin/src/plugin.js.map +1 -1
  51. package/dist/extensions/weixin/xopc.extension.json +52 -0
  52. package/dist/gateway/static/root/assets/agents-CvsBrBfi.js +396 -0
  53. package/dist/gateway/static/root/assets/{apps-page-C5RmwmTT.js → apps-page-L-IwQTe0.js} +1 -1
  54. package/dist/gateway/static/root/assets/browser-BLJWD7WI.js +8 -0
  55. package/dist/gateway/static/root/assets/channels-settings-D95KuPeP.js +1 -0
  56. package/dist/gateway/static/root/assets/cron-page-CfkWXDAI.js +1 -0
  57. package/dist/gateway/static/root/assets/{dist-CWm8hTXZ.js → dist-C6vclgEL.js} +1 -1
  58. package/dist/gateway/static/root/assets/{extension-debug-page-BzYgTkS9.js → extension-debug-page-D4JYAbsX.js} +1 -1
  59. package/dist/gateway/static/root/assets/{extension-page-BmTZH6gL.js → extension-page-_T62gi6e.js} +1 -1
  60. package/dist/gateway/static/root/assets/extension-settings-page-CkJbjyM-.js +1 -0
  61. package/dist/gateway/static/root/assets/{fetch-CMoWY2Si.js → fetch-B5aiIguv.js} +1 -1
  62. package/dist/gateway/static/root/assets/gateway-startup-retry-DqmLXhs6.js +1 -0
  63. package/dist/gateway/static/root/assets/heartbeat-config-api-HwJV1K_Y.js +1 -0
  64. package/dist/gateway/static/root/assets/index-BPYKW7FB.css +1 -0
  65. package/dist/gateway/static/root/assets/index-DvTb6wNR.js +4845 -0
  66. package/dist/gateway/static/root/assets/{logs-page-BjdQjHwk.js → logs-page-DsjtTjBy.js} +2 -2
  67. package/dist/gateway/static/root/assets/{note-detail-page-8Er4197b.js → note-detail-page-B2V7RhgD.js} +43 -43
  68. package/dist/gateway/static/root/assets/{note-time-CF3vf1jm.js → note-time-BG8GCTr4.js} +1 -1
  69. package/dist/gateway/static/root/assets/notes-page-xrcVBQ6Z.js +1 -0
  70. package/dist/gateway/static/root/assets/schema-form-S-QUvhul.js +1 -0
  71. package/dist/gateway/static/root/assets/sessions-page-CrQer6Au.js +1 -0
  72. package/dist/gateway/static/root/assets/settings-advanced-gate-DujQl9c7.js +2 -0
  73. package/dist/gateway/static/root/assets/{settings-form-section-C7qA7y0J.js → settings-form-section-r1V7dRV6.js} +1 -1
  74. package/dist/gateway/static/root/assets/settings-page-C9nrONQ2.js +3 -0
  75. package/dist/gateway/static/root/assets/{share-preview-page-Tvr5Mtq5.js → share-preview-page-DOFy0FNt.js} +1 -1
  76. package/dist/gateway/static/root/assets/skills-page-DmTsrs_a.js +2 -0
  77. package/dist/gateway/static/root/assets/{theme-store-HTvJlFLL.js → theme-store-Bo3j5Ovv.js} +1 -1
  78. package/dist/gateway/static/root/assets/url-WgQIjFZu.js +3 -0
  79. package/dist/gateway/static/root/assets/voice-api-key-field-AjmUAlEQ.js +1 -0
  80. package/dist/gateway/static/root/assets/{workflow-page.utils-CeBkAjP7.js → workflow-page.utils-DLEJ92gK.js} +1 -1
  81. package/dist/gateway/static/root/assets/workflows-page-BnjjKrM1.js +27 -0
  82. package/dist/gateway/static/root/index.html +6 -5
  83. package/dist/package.js +1 -1
  84. package/dist/src/agent/agent-manager.d.ts +18 -6
  85. package/dist/src/agent/agent-manager.js +60 -35
  86. package/dist/src/agent/agent-manager.js.map +1 -1
  87. package/dist/src/agent/builtin-agent-ids.d.ts +2 -0
  88. package/dist/src/agent/builtin-agent-ids.js +17 -0
  89. package/dist/src/agent/builtin-agent-ids.js.map +1 -0
  90. package/dist/src/agent/child-agent-factory.d.ts +4 -0
  91. package/dist/src/agent/child-agent-factory.js +28 -8
  92. package/dist/src/agent/child-agent-factory.js.map +1 -1
  93. package/dist/src/agent/context/workspace-seed.js +1 -1
  94. package/dist/src/agent/context/workspace-templates/AGENTS.md +23 -184
  95. package/dist/src/agent/embedded/run-turn.js +8 -2
  96. package/dist/src/agent/embedded/run-turn.js.map +1 -1
  97. package/dist/src/agent/embedded/session-tool-result-guard.js +1 -1
  98. package/dist/src/agent/embedded/subscribe-session.js +33 -51
  99. package/dist/src/agent/embedded/subscribe-session.js.map +1 -1
  100. package/dist/src/agent/embedded/types.d.ts +36 -35
  101. package/dist/src/agent/fallback/candidates.js +1 -1
  102. package/dist/src/agent/fallback/candidates.js.map +1 -1
  103. package/dist/src/agent/inbound/inbound-loop.js +1 -1
  104. package/dist/src/agent/inbound/turn-dispatcher.d.ts +1 -0
  105. package/dist/src/agent/inbound/turn-dispatcher.js +24 -5
  106. package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -1
  107. package/dist/src/agent/models/manager.d.ts +1 -1
  108. package/dist/src/agent/models/manager.js +1 -1
  109. package/dist/src/agent/models/manager.js.map +1 -1
  110. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.d.ts +1 -1
  111. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js +1 -1
  112. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js.map +1 -1
  113. package/dist/src/agent/prompt/sections/tooling.js +4 -0
  114. package/dist/src/agent/prompt/sections/tooling.js.map +1 -1
  115. package/dist/src/agent/service/direct-turn-helpers.d.ts +1 -0
  116. package/dist/src/agent/service/direct-turn-helpers.js +1 -1
  117. package/dist/src/agent/service/direct-turn-helpers.js.map +1 -1
  118. package/dist/src/agent/service/process-direct-streaming.d.ts +1 -0
  119. package/dist/src/agent/service/process-direct-streaming.js +35 -18
  120. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  121. package/dist/src/agent/service-inbound-utils.d.ts +0 -1
  122. package/dist/src/agent/service-inbound-utils.js +1 -17
  123. package/dist/src/agent/service-inbound-utils.js.map +1 -1
  124. package/dist/src/agent/service.d.ts +4 -4
  125. package/dist/src/agent/service.js +27 -15
  126. package/dist/src/agent/service.js.map +1 -1
  127. package/dist/src/agent/session/session-config-service.d.ts +1 -0
  128. package/dist/src/agent/session/session-config-service.js +9 -1
  129. package/dist/src/agent/session/session-config-service.js.map +1 -1
  130. package/dist/src/agent/session/session-inspector.d.ts +2 -1
  131. package/dist/src/agent/session/session-inspector.js +4 -0
  132. package/dist/src/agent/session/session-inspector.js.map +1 -1
  133. package/dist/src/agent/skills/config.js +1 -3
  134. package/dist/src/agent/skills/config.js.map +1 -1
  135. package/dist/src/agent/skills/format-skills-prompt.d.ts +1 -0
  136. package/dist/src/agent/skills/format-skills-prompt.js +3 -2
  137. package/dist/src/agent/skills/format-skills-prompt.js.map +1 -1
  138. package/dist/src/agent/skills/hub-pull.js +1 -1
  139. package/dist/src/agent/skills/index.js +20 -5
  140. package/dist/src/agent/skills/index.js.map +1 -1
  141. package/dist/src/agent/skills/installer.js +14 -27
  142. package/dist/src/agent/skills/installer.js.map +1 -1
  143. package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js +11 -1
  144. package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js.map +1 -1
  145. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js +18 -4
  146. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js.map +1 -1
  147. package/dist/src/agent/skills/marketplace/adapters/store/adapter.js +11 -2
  148. package/dist/src/agent/skills/marketplace/adapters/store/adapter.js.map +1 -1
  149. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.d.ts +2 -2
  150. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js.map +1 -1
  151. package/dist/src/agent/skills/skill-manager.d.ts +4 -1
  152. package/dist/src/agent/skills/skill-manager.js +3 -3
  153. package/dist/src/agent/skills/skill-manager.js.map +1 -1
  154. package/dist/src/agent/skills/skill-view-path.d.ts +1 -17
  155. package/dist/src/agent/skills/skill-view-path.js +3 -66
  156. package/dist/src/agent/skills/skill-view-path.js.map +1 -1
  157. package/dist/src/agent/skills/test-framework.js +2 -3
  158. package/dist/src/agent/skills/test-framework.js.map +1 -1
  159. package/dist/src/agent/streaming/reasoning-visibility-sse.js +1 -0
  160. package/dist/src/agent/streaming/reasoning-visibility-sse.js.map +1 -1
  161. package/dist/src/agent/tool-manuals/browser.d.ts +1 -0
  162. package/{skills/browser/SKILL.md → dist/src/agent/tool-manuals/browser.js} +51 -54
  163. package/dist/src/agent/tool-manuals/browser.js.map +1 -0
  164. package/dist/src/agent/tool-manuals/index.d.ts +10 -0
  165. package/dist/src/agent/tool-manuals/index.js +28 -0
  166. package/dist/src/agent/tool-manuals/index.js.map +1 -0
  167. package/dist/src/agent/tools/browser/tool/browser-use-tool.js +1 -1
  168. package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +1 -1
  169. package/dist/src/agent/tools/factory.js +7 -5
  170. package/dist/src/agent/tools/factory.js.map +1 -1
  171. package/dist/src/agent/tools/index.d.ts +1 -0
  172. package/dist/src/agent/tools/index.js +5 -4
  173. package/dist/src/agent/tools/session-search-tool.js +1 -1
  174. package/dist/src/agent/tools/shell.js +1 -1
  175. package/dist/src/agent/tools/skills-tools.js +37 -8
  176. package/dist/src/agent/tools/skills-tools.js.map +1 -1
  177. package/dist/src/agent/tools/tool-manual-tool.d.ts +6 -0
  178. package/dist/src/agent/tools/tool-manual-tool.js +34 -0
  179. package/dist/src/agent/tools/tool-manual-tool.js.map +1 -0
  180. package/dist/src/agent/tools/web-extract.js +2 -2
  181. package/dist/src/agent/tools/web.js +1 -1
  182. package/dist/src/agent/workflow/catalog.d.ts +7 -2
  183. package/dist/src/agent/workflow/catalog.js +66 -25
  184. package/dist/src/agent/workflow/catalog.js.map +1 -1
  185. package/dist/src/agent/workflow/subagent-runner.d.ts +3 -0
  186. package/dist/src/agent/workflow/subagent-runner.js +50 -4
  187. package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
  188. package/dist/src/agent/workflow/types.d.ts +10 -0
  189. package/dist/src/auth/credentials.js +10 -5
  190. package/dist/src/auth/credentials.js.map +1 -1
  191. package/dist/src/browser/actions/extension-registry-bridge.js +1 -1
  192. package/dist/src/browser/actions/registry.js +2 -2
  193. package/dist/src/browser/cdp-local-launcher.js +1 -1
  194. package/dist/src/browser/index.js +3 -3
  195. package/dist/src/browser/providers/browser-ext-install.js +1 -1
  196. package/dist/src/browser/providers/cloakbrowser.js +1 -1
  197. package/dist/src/channels/catalog/channel-catalog-service.d.ts +11 -0
  198. package/dist/src/channels/catalog/channel-catalog-service.js +168 -0
  199. package/dist/src/channels/catalog/channel-catalog-service.js.map +1 -0
  200. package/dist/src/channels/catalog/channel-catalog-types.d.ts +22 -0
  201. package/dist/src/channels/catalog/channel-catalog-types.js +1 -0
  202. package/dist/src/channels/dock.d.ts +0 -7
  203. package/dist/src/channels/dock.js +1 -21
  204. package/dist/src/channels/index.d.ts +1 -3
  205. package/dist/src/channels/index.js +1 -5
  206. package/dist/src/channels/lifecycle-supervisor.d.ts +1 -0
  207. package/dist/src/channels/lifecycle-supervisor.js +11 -0
  208. package/dist/src/channels/lifecycle-supervisor.js.map +1 -1
  209. package/dist/src/channels/manager.d.ts +1 -0
  210. package/dist/src/channels/manager.js +3 -0
  211. package/dist/src/channels/manager.js.map +1 -1
  212. package/dist/src/channels/pairing/pairing-channel.d.ts +2 -3
  213. package/dist/src/channels/pairing/pairing-messages.js +1 -1
  214. package/dist/src/channels/pairing/pairing-messages.js.map +1 -1
  215. package/dist/src/channels/pairing/pairing-service.d.ts +1 -1
  216. package/dist/src/channels/pairing/pairing-service.js +8 -27
  217. package/dist/src/channels/pairing/pairing-service.js.map +1 -1
  218. package/dist/src/channels/plugin-types.d.ts +3 -1
  219. package/dist/src/channels/plugins/types.adapters.d.ts +55 -2
  220. package/dist/src/channels/telegram/index.js +1 -1
  221. package/dist/src/chat-commands/builtins/config.js +4 -4
  222. package/dist/src/chat-commands/builtins/config.js.map +1 -1
  223. package/dist/src/chat-commands/config-paths.js +1 -1
  224. package/dist/src/chat-commands/config-paths.js.map +1 -1
  225. package/dist/src/chat-commands/context.js +1 -1
  226. package/dist/src/chat-commands/context.js.map +1 -1
  227. package/dist/src/cli/bin.js +1 -1
  228. package/dist/src/cli/command-manifest.js +1 -1
  229. package/dist/src/cli/command-manifest.js.map +1 -1
  230. package/dist/src/cli/commands/agent.js +2 -2
  231. package/dist/src/cli/commands/agent.js.map +1 -1
  232. package/dist/src/cli/commands/agents.js +2 -4
  233. package/dist/src/cli/commands/agents.js.map +1 -1
  234. package/dist/src/cli/commands/auth.js +1 -1
  235. package/dist/src/cli/commands/browser-cli-helpers.js +1 -1
  236. package/dist/src/cli/commands/channels.d.ts +1 -5
  237. package/dist/src/cli/commands/channels.js +115 -281
  238. package/dist/src/cli/commands/channels.js.map +1 -1
  239. package/dist/src/cli/commands/config.js +2 -2
  240. package/dist/src/cli/commands/config.js.map +1 -1
  241. package/dist/src/cli/commands/doctor/checks/channel-config.js +16 -69
  242. package/dist/src/cli/commands/doctor/checks/channel-config.js.map +1 -1
  243. package/dist/src/cli/commands/doctor/checks/channel-pairing-pending.js +6 -4
  244. package/dist/src/cli/commands/doctor/checks/channel-pairing-pending.js.map +1 -1
  245. package/dist/src/cli/commands/doctor/checks/channel-plugins.js +2 -2
  246. package/dist/src/cli/commands/doctor/checks/channel-plugins.js.map +1 -1
  247. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  248. package/dist/src/cli/commands/doctor/checks/provider-auth.js +13 -9
  249. package/dist/src/cli/commands/doctor/checks/provider-auth.js.map +1 -1
  250. package/dist/src/cli/commands/extension-dev.js +2 -1
  251. package/dist/src/cli/commands/extension-dev.js.map +1 -1
  252. package/dist/src/cli/commands/extension-marketplace.js +2 -1
  253. package/dist/src/cli/commands/extension-marketplace.js.map +1 -1
  254. package/dist/src/cli/commands/extension-pack.js +2 -1
  255. package/dist/src/cli/commands/extension-pack.js.map +1 -1
  256. package/dist/src/cli/commands/models.js +7 -4
  257. package/dist/src/cli/commands/models.js.map +1 -1
  258. package/dist/src/cli/commands/onboard/channels/index.js +1 -1
  259. package/dist/src/cli/commands/onboard/channels/index.js.map +1 -1
  260. package/dist/src/cli/commands/onboard/channels/registry.d.ts +2 -1
  261. package/dist/src/cli/commands/onboard/channels/registry.js +32 -8
  262. package/dist/src/cli/commands/onboard/channels/registry.js.map +1 -1
  263. package/dist/src/cli/commands/onboard/model.js +8 -5
  264. package/dist/src/cli/commands/onboard/model.js.map +1 -1
  265. package/dist/src/cli/commands/onboard.js +4 -6
  266. package/dist/src/cli/commands/onboard.js.map +1 -1
  267. package/dist/src/cli/commands/setup-shared/runner.d.ts +1 -1
  268. package/dist/src/cli/commands/setup-shared/runner.js.map +1 -1
  269. package/dist/src/cli/commands/setup-shared/types.d.ts +1 -1
  270. package/dist/src/cli/commands/setup-shared/types.js.map +1 -1
  271. package/dist/src/cli/commands/tui.js +13 -5
  272. package/dist/src/cli/commands/tui.js.map +1 -1
  273. package/dist/src/cli/extension-cli-register.js +1 -1
  274. package/dist/src/commands/agents.config.d.ts +3 -3
  275. package/dist/src/commands/agents.config.js +7 -7
  276. package/dist/src/commands/agents.config.js.map +1 -1
  277. package/dist/src/config/agent-profile.d.ts +1 -1
  278. package/dist/src/config/agent-profile.js +6 -2
  279. package/dist/src/config/agent-profile.js.map +1 -1
  280. package/dist/src/config/agent-typed-models.d.ts +2 -2
  281. package/dist/src/config/agent-typed-models.js +13 -2
  282. package/dist/src/config/agent-typed-models.js.map +1 -1
  283. package/dist/src/config/index.js +3 -3
  284. package/dist/src/config/integration.d.ts +1 -1
  285. package/dist/src/config/loader.d.ts +0 -1
  286. package/dist/src/config/loader.js +4 -9
  287. package/dist/src/config/loader.js.map +1 -1
  288. package/dist/src/config/models-json.d.ts +6 -6
  289. package/dist/src/config/rules.js +2 -12
  290. package/dist/src/config/rules.js.map +1 -1
  291. package/dist/src/config/schema.d.ts +74 -47
  292. package/dist/src/config/schema.js +28 -66
  293. package/dist/src/config/schema.js.map +1 -1
  294. package/dist/src/config/validate-channel-configs.d.ts +0 -3
  295. package/dist/src/config/validate-channel-configs.js +29 -10
  296. package/dist/src/config/validate-channel-configs.js.map +1 -1
  297. package/dist/src/cron/executor.js +1 -4
  298. package/dist/src/cron/executor.js.map +1 -1
  299. package/dist/src/extensions/activation-context.js +3 -1
  300. package/dist/src/extensions/activation-context.js.map +1 -1
  301. package/dist/src/extensions/activation-planner.js +12 -0
  302. package/dist/src/extensions/activation-planner.js.map +1 -1
  303. package/dist/src/extensions/api.d.ts +5 -1
  304. package/dist/src/extensions/api.js +12 -0
  305. package/dist/src/extensions/api.js.map +1 -1
  306. package/dist/src/extensions/discover-extensions.js +17 -13
  307. package/dist/src/extensions/discover-extensions.js.map +1 -1
  308. package/dist/src/extensions/extension-metadata-snapshot.js +11 -5
  309. package/dist/src/extensions/extension-metadata-snapshot.js.map +1 -1
  310. package/dist/src/extensions/index.js +12 -4
  311. package/dist/src/extensions/index.js.map +1 -0
  312. package/dist/src/extensions/loader.d.ts +5 -1
  313. package/dist/src/extensions/loader.js +12 -11
  314. package/dist/src/extensions/loader.js.map +1 -1
  315. package/dist/src/extensions/manifest-registry.js +98 -93
  316. package/dist/src/extensions/manifest-registry.js.map +1 -1
  317. package/dist/src/extensions/normalize-manifest.js +91 -15
  318. package/dist/src/extensions/normalize-manifest.js.map +1 -1
  319. package/dist/src/extensions/sdk/index.js +1 -1
  320. package/dist/src/extensions/sdk/testing.js +4 -0
  321. package/dist/src/extensions/sdk/testing.js.map +1 -1
  322. package/dist/src/extensions/types/core.d.ts +32 -1
  323. package/dist/src/extensions/types/manifest.d.ts +60 -0
  324. package/dist/src/extensions/types/tui.d.ts +414 -5
  325. package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
  326. package/dist/src/gateway/agent-builtin-tools.js +16 -0
  327. package/dist/src/gateway/agent-builtin-tools.js.map +1 -1
  328. package/dist/src/gateway/agent-run-relay.d.ts +2 -3
  329. package/dist/src/gateway/agent-run-relay.js +10 -3
  330. package/dist/src/gateway/agent-run-relay.js.map +1 -1
  331. package/dist/src/gateway/agents-admin.d.ts +32 -19
  332. package/dist/src/gateway/agents-admin.js +113 -93
  333. package/dist/src/gateway/agents-admin.js.map +1 -1
  334. package/dist/src/gateway/chat-stream/mapper.d.ts +34 -0
  335. package/dist/src/gateway/chat-stream/mapper.js +244 -0
  336. package/dist/src/gateway/chat-stream/mapper.js.map +1 -0
  337. package/dist/src/gateway/chat-stream/protocol.d.ts +100 -0
  338. package/dist/src/gateway/chat-stream/protocol.js +1 -0
  339. package/dist/src/gateway/heartbeat/service.js +1 -1
  340. package/dist/src/gateway/hono/lib/agent-model.d.ts +4 -4
  341. package/dist/src/gateway/hono/lib/agent-model.js +13 -11
  342. package/dist/src/gateway/hono/lib/agent-model.js.map +1 -1
  343. package/dist/src/gateway/hono/lib/config-payload.d.ts +19 -7
  344. package/dist/src/gateway/hono/lib/config-payload.js +16 -15
  345. package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
  346. package/dist/src/gateway/hono/routes/agents.js +83 -48
  347. package/dist/src/gateway/hono/routes/agents.js.map +1 -1
  348. package/dist/src/gateway/hono/routes/channels.js +134 -214
  349. package/dist/src/gateway/hono/routes/channels.js.map +1 -1
  350. package/dist/src/gateway/hono/routes/commands-skills.js +10 -4
  351. package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
  352. package/dist/src/gateway/hono/routes/config-patch/agents.js +26 -13
  353. package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -1
  354. package/dist/src/gateway/hono/routes/config-patch/channels.d.ts +1 -11
  355. package/dist/src/gateway/hono/routes/config-patch/channels.js +18 -165
  356. package/dist/src/gateway/hono/routes/config-patch/channels.js.map +1 -1
  357. package/dist/src/gateway/hono/routes/config.js +5 -2
  358. package/dist/src/gateway/hono/routes/config.js.map +1 -1
  359. package/dist/src/gateway/hono/routes/dreaming.js +1 -1
  360. package/dist/src/gateway/hono/routes/lazy-bundles.js +13 -1
  361. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  362. package/dist/src/gateway/hono/routes/public-gateway.js +2 -4
  363. package/dist/src/gateway/hono/routes/public-gateway.js.map +1 -1
  364. package/dist/src/gateway/hono/routes/sessions.js +179 -0
  365. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  366. package/dist/src/gateway/hono/routes/tui.d.ts +3 -0
  367. package/dist/src/gateway/hono/routes/tui.js +16 -0
  368. package/dist/src/gateway/hono/routes/tui.js.map +1 -0
  369. package/dist/src/gateway/hono/routes/workflows.js +25 -1
  370. package/dist/src/gateway/hono/routes/workflows.js.map +1 -1
  371. package/dist/src/gateway/hono/sse.d.ts +5 -7
  372. package/dist/src/gateway/hono/sse.js +21 -38
  373. package/dist/src/gateway/hono/sse.js.map +1 -1
  374. package/dist/src/gateway/protocol.js.map +1 -1
  375. package/dist/src/gateway/service/agent-runner.d.ts +2 -4
  376. package/dist/src/gateway/service/agent-runner.js +1 -1
  377. package/dist/src/gateway/service/agent-runner.js.map +1 -1
  378. package/dist/src/gateway/service/marketplace-service.d.ts +4 -3
  379. package/dist/src/gateway/service/marketplace-service.js +7 -4
  380. package/dist/src/gateway/service/marketplace-service.js.map +1 -1
  381. package/dist/src/gateway/service/run-gateway-agent.d.ts +2 -6
  382. package/dist/src/gateway/service/run-gateway-agent.js +63 -36
  383. package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
  384. package/dist/src/gateway/service/sessions-api.d.ts +19 -0
  385. package/dist/src/gateway/service/sessions-api.js +12 -0
  386. package/dist/src/gateway/service/sessions-api.js.map +1 -1
  387. package/dist/src/gateway/service.d.ts +6 -0
  388. package/dist/src/gateway/service.js +73 -57
  389. package/dist/src/gateway/service.js.map +1 -1
  390. package/dist/src/heartbeat/index.js +1 -1
  391. package/dist/src/mcp/channel-bridge.js +1 -1
  392. package/dist/src/project-trust/trust-store.d.ts +30 -0
  393. package/dist/src/project-trust/trust-store.js +194 -0
  394. package/dist/src/project-trust/trust-store.js.map +1 -0
  395. package/dist/src/providers/index.d.ts +1 -1
  396. package/dist/src/providers/index.js +18 -7
  397. package/dist/src/providers/index.js.map +1 -1
  398. package/dist/src/routing/resolve-route.d.ts +0 -3
  399. package/dist/src/routing/resolve-route.js.map +1 -1
  400. package/dist/src/routing/resolve-tui-session-key.d.ts +2 -0
  401. package/dist/src/routing/resolve-tui-session-key.js +8 -3
  402. package/dist/src/routing/resolve-tui-session-key.js.map +1 -1
  403. package/dist/src/session/client-history.d.ts +32 -0
  404. package/dist/src/session/client-history.js +232 -1
  405. package/dist/src/session/client-history.js.map +1 -1
  406. package/dist/src/session/manager.d.ts +37 -4
  407. package/dist/src/session/manager.js +39 -15
  408. package/dist/src/session/manager.js.map +1 -1
  409. package/dist/src/session/session-context-for-llm.d.ts +93 -1
  410. package/dist/src/session/session-context-for-llm.js +105 -2
  411. package/dist/src/session/session-context-for-llm.js.map +1 -1
  412. package/dist/src/session/store.d.ts +37 -0
  413. package/dist/src/session/store.js +127 -2
  414. package/dist/src/session/store.js.map +1 -1
  415. package/dist/src/session/stored-rows-to-file-entries.js +37 -1
  416. package/dist/src/session/stored-rows-to-file-entries.js.map +1 -1
  417. package/dist/src/session/types.d.ts +14 -1
  418. package/dist/src/session/types.js.map +1 -1
  419. package/dist/src/share/share-thumbnail.js +1 -1
  420. package/dist/src/storage/sqlite/migrations/004_add_session_type_metadata.sql +15 -0
  421. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  422. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  423. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  424. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  425. package/dist/src/storage/sqlite/row-mappers.d.ts +14 -1
  426. package/dist/src/storage/sqlite/row-mappers.js +14 -1
  427. package/dist/src/storage/sqlite/row-mappers.js.map +1 -1
  428. package/dist/src/storage/sqlite/schema.js +1 -1
  429. package/dist/src/storage/sqlite/session-metadata.js +1 -0
  430. package/dist/src/storage/sqlite/session-metadata.js.map +1 -1
  431. package/dist/src/storage/sqlite/session-repository.js +52 -25
  432. package/dist/src/storage/sqlite/session-repository.js.map +1 -1
  433. package/dist/src/tui/backends/embedded-backend.d.ts +53 -4
  434. package/dist/src/tui/backends/embedded-backend.js +227 -39
  435. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  436. package/dist/src/tui/backends/gateway-sse-backend.d.ts +59 -3
  437. package/dist/src/tui/backends/gateway-sse-backend.js +416 -26
  438. package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
  439. package/dist/src/tui/chat-history.d.ts +5 -1
  440. package/dist/src/tui/chat-history.js +78 -8
  441. package/dist/src/tui/chat-history.js.map +1 -1
  442. package/dist/src/tui/clipboard-text.d.ts +5 -0
  443. package/dist/src/tui/clipboard-text.js +46 -0
  444. package/dist/src/tui/clipboard-text.js.map +1 -0
  445. package/dist/src/tui/components/assistant-message.d.ts +19 -3
  446. package/dist/src/tui/components/assistant-message.js +115 -9
  447. package/dist/src/tui/components/assistant-message.js.map +1 -1
  448. package/dist/src/tui/components/bash-execution.d.ts +3 -2
  449. package/dist/src/tui/components/bash-execution.js +31 -3
  450. package/dist/src/tui/components/bash-execution.js.map +1 -1
  451. package/dist/src/tui/components/bash-summary.d.ts +23 -0
  452. package/dist/src/tui/components/bash-summary.js +87 -0
  453. package/dist/src/tui/components/bash-summary.js.map +1 -0
  454. package/dist/src/tui/components/branch-message-summary.d.ts +17 -0
  455. package/dist/src/tui/components/branch-message-summary.js +43 -0
  456. package/dist/src/tui/components/branch-message-summary.js.map +1 -0
  457. package/dist/src/tui/components/branch-summary.d.ts +13 -0
  458. package/dist/src/tui/components/branch-summary.js +51 -0
  459. package/dist/src/tui/components/branch-summary.js.map +1 -0
  460. package/dist/src/tui/components/chat-log.d.ts +46 -6
  461. package/dist/src/tui/components/chat-log.js +183 -21
  462. package/dist/src/tui/components/chat-log.js.map +1 -1
  463. package/dist/src/tui/components/compaction-summary.d.ts +13 -0
  464. package/dist/src/tui/components/compaction-summary.js +46 -0
  465. package/dist/src/tui/components/compaction-summary.js.map +1 -0
  466. package/dist/src/tui/components/custom-editor.d.ts +1 -0
  467. package/dist/src/tui/components/custom-editor.js +2 -0
  468. package/dist/src/tui/components/custom-editor.js.map +1 -1
  469. package/dist/src/tui/components/custom-message.d.ts +23 -0
  470. package/dist/src/tui/components/custom-message.js +65 -0
  471. package/dist/src/tui/components/custom-message.js.map +1 -0
  472. package/dist/src/tui/components/extension-dialog.d.ts +42 -0
  473. package/dist/src/tui/components/extension-dialog.js +127 -0
  474. package/dist/src/tui/components/extension-dialog.js.map +1 -0
  475. package/dist/src/tui/components/scoped-models-selector.d.ts +7 -2
  476. package/dist/src/tui/components/scoped-models-selector.js +89 -16
  477. package/dist/src/tui/components/scoped-models-selector.js.map +1 -1
  478. package/dist/src/tui/components/searchable-select-list.d.ts +30 -3
  479. package/dist/src/tui/components/searchable-select-list.js +82 -10
  480. package/dist/src/tui/components/searchable-select-list.js.map +1 -1
  481. package/dist/src/tui/components/session-selector.d.ts +18 -4
  482. package/dist/src/tui/components/session-selector.js +207 -40
  483. package/dist/src/tui/components/session-selector.js.map +1 -1
  484. package/dist/src/tui/components/settings-selector.d.ts +6 -2
  485. package/dist/src/tui/components/settings-selector.js +126 -7
  486. package/dist/src/tui/components/settings-selector.js.map +1 -1
  487. package/dist/src/tui/components/thinking-selector.d.ts +12 -0
  488. package/dist/src/tui/components/thinking-selector.js +48 -0
  489. package/dist/src/tui/components/thinking-selector.js.map +1 -0
  490. package/dist/src/tui/components/tool-execution.d.ts +57 -3
  491. package/dist/src/tui/components/tool-execution.js +378 -28
  492. package/dist/src/tui/components/tool-execution.js.map +1 -1
  493. package/dist/src/tui/components/tui-bottom-bar.d.ts +9 -1
  494. package/dist/src/tui/components/tui-bottom-bar.js +56 -11
  495. package/dist/src/tui/components/tui-bottom-bar.js.map +1 -1
  496. package/dist/src/tui/components/tui-header.d.ts +9 -2
  497. package/dist/src/tui/components/tui-header.js +25 -5
  498. package/dist/src/tui/components/tui-header.js.map +1 -1
  499. package/dist/src/tui/components/user-message.d.ts +4 -2
  500. package/dist/src/tui/components/user-message.js +42 -9
  501. package/dist/src/tui/components/user-message.js.map +1 -1
  502. package/dist/src/tui/components/visual-truncate.d.ts +11 -0
  503. package/dist/src/tui/components/visual-truncate.js +27 -0
  504. package/dist/src/tui/components/visual-truncate.js.map +1 -0
  505. package/dist/src/tui/extension-host/autocomplete.d.ts +43 -0
  506. package/dist/src/tui/extension-host/autocomplete.js +116 -0
  507. package/dist/src/tui/extension-host/autocomplete.js.map +1 -0
  508. package/dist/src/tui/extension-host/host.d.ts +31 -1
  509. package/dist/src/tui/extension-host/host.js +123 -6
  510. package/dist/src/tui/extension-host/host.js.map +1 -1
  511. package/dist/src/tui/extension-host/load-extensions.d.ts +6 -1
  512. package/dist/src/tui/extension-host/load-extensions.js +4 -3
  513. package/dist/src/tui/extension-host/load-extensions.js.map +1 -1
  514. package/dist/src/tui/extension-host/runtime-context.d.ts +21 -0
  515. package/dist/src/tui/extension-host/runtime-context.js +152 -0
  516. package/dist/src/tui/extension-host/runtime-context.js.map +1 -0
  517. package/dist/src/tui/extension-host/runtime.d.ts +52 -4
  518. package/dist/src/tui/extension-host/runtime.js +547 -85
  519. package/dist/src/tui/extension-host/runtime.js.map +1 -1
  520. package/dist/src/tui/extension-host/surface.d.ts +20 -0
  521. package/dist/src/tui/extension-host/surface.js +30 -6
  522. package/dist/src/tui/extension-host/surface.js.map +1 -1
  523. package/dist/src/tui/extension-host/tool-renderers.d.ts +6 -3
  524. package/dist/src/tui/extension-host/tool-renderers.js +43 -5
  525. package/dist/src/tui/extension-host/tool-renderers.js.map +1 -1
  526. package/dist/src/tui/format-tui-hotkeys.d.ts +12 -2
  527. package/dist/src/tui/format-tui-hotkeys.js +22 -5
  528. package/dist/src/tui/format-tui-hotkeys.js.map +1 -1
  529. package/dist/src/tui/tui-agent-events.d.ts +8 -6
  530. package/dist/src/tui/tui-agent-events.js +200 -59
  531. package/dist/src/tui/tui-agent-events.js.map +1 -1
  532. package/dist/src/tui/tui-backend.d.ts +169 -3
  533. package/dist/src/tui/tui-command-formatters.d.ts +76 -0
  534. package/dist/src/tui/tui-command-formatters.js +594 -0
  535. package/dist/src/tui/tui-command-formatters.js.map +1 -0
  536. package/dist/src/tui/tui-commands.d.ts +57 -7
  537. package/dist/src/tui/tui-commands.js +639 -43
  538. package/dist/src/tui/tui-commands.js.map +1 -1
  539. package/dist/src/tui/tui-context-usage.d.ts +1 -1
  540. package/dist/src/tui/tui-context-usage.js +9 -1
  541. package/dist/src/tui/tui-context-usage.js.map +1 -1
  542. package/dist/src/tui/tui-extension-user-message.d.ts +8 -0
  543. package/dist/src/tui/tui-extension-user-message.js +32 -0
  544. package/dist/src/tui/tui-extension-user-message.js.map +1 -0
  545. package/dist/src/tui/tui-follow-up-queue.d.ts +9 -0
  546. package/dist/src/tui/tui-follow-up-queue.js +18 -0
  547. package/dist/src/tui/tui-follow-up-queue.js.map +1 -0
  548. package/dist/src/tui/tui-local-shell.d.ts +11 -1
  549. package/dist/src/tui/tui-local-shell.js +50 -8
  550. package/dist/src/tui/tui-local-shell.js.map +1 -1
  551. package/dist/src/tui/tui-model-picker.d.ts +26 -0
  552. package/dist/src/tui/tui-model-picker.js +152 -0
  553. package/dist/src/tui/tui-model-picker.js.map +1 -0
  554. package/dist/src/tui/tui-oauth-login.d.ts +16 -0
  555. package/dist/src/tui/tui-oauth-login.js +189 -0
  556. package/dist/src/tui/tui-oauth-login.js.map +1 -0
  557. package/dist/src/tui/tui-overlays.d.ts +3 -3
  558. package/dist/src/tui/tui-overlays.js +6 -7
  559. package/dist/src/tui/tui-overlays.js.map +1 -1
  560. package/dist/src/tui/tui-picker-overlay.d.ts +27 -32
  561. package/dist/src/tui/tui-picker-overlay.js +340 -30
  562. package/dist/src/tui/tui-picker-overlay.js.map +1 -1
  563. package/dist/src/tui/tui-picker-services.d.ts +41 -0
  564. package/dist/src/tui/tui-picker-services.js +1 -0
  565. package/dist/src/tui/tui-run-state.d.ts +11 -0
  566. package/dist/src/tui/tui-run-state.js +114 -0
  567. package/dist/src/tui/tui-run-state.js.map +1 -0
  568. package/dist/src/tui/tui-runtime-hints.d.ts +4 -0
  569. package/dist/src/tui/tui-runtime-hints.js +18 -0
  570. package/dist/src/tui/tui-runtime-hints.js.map +1 -0
  571. package/dist/src/tui/tui-scoped-models.d.ts +1 -1
  572. package/dist/src/tui/tui-scoped-models.js +2 -2
  573. package/dist/src/tui/tui-scoped-models.js.map +1 -1
  574. package/dist/src/tui/tui-session-actions.d.ts +5 -3
  575. package/dist/src/tui/tui-session-actions.js +21 -9
  576. package/dist/src/tui/tui-session-actions.js.map +1 -1
  577. package/dist/src/tui/tui-session-format.d.ts +4 -1
  578. package/dist/src/tui/tui-session-format.js +17 -3
  579. package/dist/src/tui/tui-session-format.js.map +1 -1
  580. package/dist/src/tui/tui-session-snapshot.d.ts +82 -0
  581. package/dist/src/tui/tui-session-snapshot.js +184 -0
  582. package/dist/src/tui/tui-session-snapshot.js.map +1 -0
  583. package/dist/src/tui/tui-session-stats.d.ts +3 -0
  584. package/dist/src/tui/tui-session-stats.js +59 -0
  585. package/dist/src/tui/tui-session-stats.js.map +1 -0
  586. package/dist/src/tui/tui-settings.d.ts +21 -0
  587. package/dist/src/tui/tui-settings.js +28 -1
  588. package/dist/src/tui/tui-settings.js.map +1 -1
  589. package/dist/src/tui/tui-skills-autocomplete.js +1 -1
  590. package/dist/src/tui/tui-skills-autocomplete.js.map +1 -1
  591. package/dist/src/tui/tui-startup-resources.d.ts +3 -0
  592. package/dist/src/tui/tui-startup-resources.js +39 -0
  593. package/dist/src/tui/tui-startup-resources.js.map +1 -0
  594. package/dist/src/tui/tui-startup-text.d.ts +10 -0
  595. package/dist/src/tui/tui-startup-text.js +58 -0
  596. package/dist/src/tui/tui-startup-text.js.map +1 -0
  597. package/dist/src/tui/tui-stdio-filter.d.ts +1 -0
  598. package/dist/src/tui/tui-stdio-filter.js +11 -7
  599. package/dist/src/tui/tui-stdio-filter.js.map +1 -1
  600. package/dist/src/tui/tui-submit.d.ts +2 -0
  601. package/dist/src/tui/tui-submit.js +2 -1
  602. package/dist/src/tui/tui-submit.js.map +1 -1
  603. package/dist/src/tui/tui-tool-diff.js +61 -7
  604. package/dist/src/tui/tui-tool-diff.js.map +1 -1
  605. package/dist/src/tui/tui-tool-result.d.ts +17 -0
  606. package/dist/src/tui/tui-tool-result.js +74 -0
  607. package/dist/src/tui/tui-tool-result.js.map +1 -0
  608. package/dist/src/tui/tui-transcript-tree-picker.d.ts +57 -0
  609. package/dist/src/tui/tui-transcript-tree-picker.js +604 -0
  610. package/dist/src/tui/tui-transcript-tree-picker.js.map +1 -0
  611. package/dist/src/tui/tui-transcript-tree.d.ts +7 -0
  612. package/dist/src/tui/tui-transcript-tree.js +316 -0
  613. package/dist/src/tui/tui-transcript-tree.js.map +1 -0
  614. package/dist/src/tui/tui-types.d.ts +25 -34
  615. package/dist/src/tui/tui-types.js +12 -0
  616. package/dist/src/tui/tui-types.js.map +1 -1
  617. package/dist/src/tui/tui.js +1288 -112
  618. package/dist/src/tui/tui.js.map +1 -1
  619. package/dist/src/tui/xopc-tui-keybindings.d.ts +127 -2
  620. package/dist/src/tui/xopc-tui-keybindings.js +127 -2
  621. package/dist/src/tui/xopc-tui-keybindings.js.map +1 -1
  622. package/dist/src/workflows/domain/definition-utils.d.ts +2 -1
  623. package/dist/src/workflows/domain/definition-utils.js +18 -8
  624. package/dist/src/workflows/domain/definition-utils.js.map +1 -1
  625. package/dist/src/workflows/domain/definition.d.ts +25 -0
  626. package/dist/src/workflows/domain/event.d.ts +1 -0
  627. package/dist/src/workflows/domain/result.d.ts +15 -0
  628. package/dist/src/workflows/domain/run.d.ts +2 -0
  629. package/dist/src/workflows/domain/run.js.map +1 -1
  630. package/dist/src/workflows/engine/projector.js +4 -0
  631. package/dist/src/workflows/engine/projector.js.map +1 -1
  632. package/dist/src/workflows/engine/workflow-engine.d.ts +37 -1
  633. package/dist/src/workflows/engine/workflow-engine.js +75 -11
  634. package/dist/src/workflows/engine/workflow-engine.js.map +1 -1
  635. package/dist/src/workflows/index.d.ts +1 -0
  636. package/dist/src/workflows/index.js +4 -1
  637. package/dist/src/workflows/registry/catalog-workflow-definition-registry.d.ts +9 -0
  638. package/dist/src/workflows/registry/catalog-workflow-definition-registry.js +40 -0
  639. package/dist/src/workflows/registry/catalog-workflow-definition-registry.js.map +1 -0
  640. package/dist/src/workflows/registry/index.d.ts +2 -0
  641. package/dist/src/workflows/registry/index.js +2 -0
  642. package/dist/src/workflows/registry/workflow-definition-registry.d.ts +15 -0
  643. package/dist/src/workflows/registry/workflow-definition-registry.js +1 -0
  644. package/dist/src/workflows/runtime/index.d.ts +2 -0
  645. package/dist/src/workflows/runtime/index.js +2 -1
  646. package/dist/src/workflows/runtime/script-workflow-runtime.d.ts +5 -0
  647. package/dist/src/workflows/runtime/script-workflow-runtime.js +15 -0
  648. package/dist/src/workflows/runtime/script-workflow-runtime.js.map +1 -0
  649. package/dist/src/workflows/runtime/workflow-runtime-port.d.ts +16 -0
  650. package/dist/src/workflows/runtime/workflow-runtime-port.js +1 -0
  651. package/dist/src/workflows/service/run-view-to-snapshot.js +3 -0
  652. package/dist/src/workflows/service/run-view-to-snapshot.js.map +1 -1
  653. package/dist/src/workflows/service/workflow-run-service.d.ts +3 -0
  654. package/dist/src/workflows/service/workflow-run-service.js +10 -15
  655. package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
  656. package/dist/src/workflows/service/workflow-session-bridge.d.ts +1 -1
  657. package/dist/src/workflows/service/workflow-session-bridge.js +4 -1
  658. package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
  659. package/package.json +21 -15
  660. package/skills/creative/frontend-design/SKILL.md +1 -1
  661. package/skills/creative/theme-factory/SKILL.md +1 -1
  662. package/skills/documents/xlsx/SKILL.md +1 -1
  663. package/skills/engineering/diagnose/SKILL.md +2 -2
  664. package/skills/engineering/tdd/SKILL.md +1 -1
  665. package/skills/tools/github/SKILL.md +6 -1
  666. package/skills/tools/webapp-testing/SKILL.md +4 -1
  667. package/dist/extensions/telegram/src/adapters/config-surface.d.ts +0 -2
  668. package/dist/extensions/telegram/src/adapters/config-surface.js +0 -26
  669. package/dist/extensions/telegram/src/adapters/config-surface.js.map +0 -1
  670. package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js +0 -158
  671. package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js.map +0 -1
  672. package/dist/gateway/static/root/assets/agents-BwXkia_W.js +0 -222
  673. package/dist/gateway/static/root/assets/channels-settings-tlOTdaXw.js +0 -1
  674. package/dist/gateway/static/root/assets/channels-status-swr-D4XjqwqC.js +0 -8
  675. package/dist/gateway/static/root/assets/cron-api-DcmfGuj0.js +0 -1
  676. package/dist/gateway/static/root/assets/cron-page-CijJ4G6F.js +0 -1
  677. package/dist/gateway/static/root/assets/extension-settings-page-CyJk_G64.js +0 -1
  678. package/dist/gateway/static/root/assets/field-primitives-C4GpxsDo.js +0 -1
  679. package/dist/gateway/static/root/assets/heartbeat-config-api-CLD0Gpi3.js +0 -1
  680. package/dist/gateway/static/root/assets/index-0HmunJW9.js +0 -4845
  681. package/dist/gateway/static/root/assets/index-Bk75Phrd.css +0 -1
  682. package/dist/gateway/static/root/assets/notes-page-BBnTh0uI.js +0 -1
  683. package/dist/gateway/static/root/assets/sessions-page-B0riYK7j.js +0 -1
  684. package/dist/gateway/static/root/assets/settings-advanced-gate-DiP_WHu_.js +0 -2
  685. package/dist/gateway/static/root/assets/settings-page-1ZPhcCZ9.js +0 -3
  686. package/dist/gateway/static/root/assets/skills-page-BQ1hllKD.js +0 -2
  687. package/dist/gateway/static/root/assets/url-F3_D_6zZ.js +0 -3
  688. package/dist/gateway/static/root/assets/utils-CPr3FBh2.js +0 -1
  689. package/dist/gateway/static/root/assets/voice-api-key-field-BkbDl6dH.js +0 -1
  690. package/dist/gateway/static/root/assets/workflows-page-D059ysoF.js +0 -27
  691. package/dist/src/agent/embedded/map-stream-events.d.ts +0 -9
  692. package/dist/src/agent/embedded/map-stream-events.js +0 -63
  693. package/dist/src/agent/embedded/map-stream-events.js.map +0 -1
  694. package/dist/src/channels/dock.js.map +0 -1
  695. package/dist/src/channels/plugins/bundled.d.ts +0 -11
  696. package/dist/src/channels/plugins/bundled.js +0 -10
  697. package/dist/src/channels/plugins/bundled.js.map +0 -1
  698. package/dist/src/channels/registry.d.ts +0 -25
  699. package/dist/src/channels/registry.js +0 -82
  700. package/dist/src/channels/registry.js.map +0 -1
  701. package/dist/src/config/localized-text.d.ts +0 -6
  702. package/dist/src/config/localized-text.js +0 -42
  703. package/dist/src/config/localized-text.js.map +0 -1
  704. package/dist/src/generated/bundled-channel-plugins.d.ts +0 -10
  705. package/dist/src/generated/bundled-channel-plugins.js +0 -16
  706. package/dist/src/generated/bundled-channel-plugins.js.map +0 -1
  707. package/dist/src/tui/stream-assembler.d.ts +0 -22
  708. package/dist/src/tui/stream-assembler.js +0 -63
  709. package/dist/src/tui/stream-assembler.js.map +0 -1
  710. package/skills/browser/SKILL-zh.md +0 -188
  711. package/skills/business/company-values/SKILL-zh.md +0 -80
  712. package/skills/business/company-values/SKILL.md +0 -80
  713. package/skills/business/find-community/SKILL-zh.md +0 -50
  714. package/skills/business/find-community/SKILL.md +0 -50
  715. package/skills/business/first-customers/SKILL-zh.md +0 -76
  716. package/skills/business/first-customers/SKILL.md +0 -76
  717. package/skills/business/grow-sustainably/SKILL-zh.md +0 -92
  718. package/skills/business/grow-sustainably/SKILL.md +0 -92
  719. package/skills/business/marketing-plan/SKILL-zh.md +0 -100
  720. package/skills/business/marketing-plan/SKILL.md +0 -100
  721. package/skills/business/minimalist-review/SKILL-zh.md +0 -82
  722. package/skills/business/minimalist-review/SKILL.md +0 -82
  723. package/skills/business/mvp/SKILL-zh.md +0 -81
  724. package/skills/business/mvp/SKILL.md +0 -81
  725. package/skills/business/pricing/SKILL-zh.md +0 -64
  726. package/skills/business/pricing/SKILL.md +0 -64
  727. package/skills/business/processize/SKILL-zh.md +0 -91
  728. package/skills/business/processize/SKILL.md +0 -91
  729. package/skills/business/validate-idea/SKILL-zh.md +0 -68
  730. package/skills/business/validate-idea/SKILL.md +0 -68
  731. package/skills/creative/algorithmic-art/LICENSE.txt +0 -202
  732. package/skills/creative/algorithmic-art/SKILL-zh.md +0 -405
  733. package/skills/creative/algorithmic-art/SKILL.md +0 -405
  734. package/skills/creative/algorithmic-art/templates/generator_template.js +0 -223
  735. package/skills/creative/algorithmic-art/templates/viewer.html +0 -599
  736. package/skills/creative/frontend-design/SKILL-zh.md +0 -42
  737. package/skills/creative/theme-factory/SKILL-zh.md +0 -59
  738. package/skills/creative/web-artifacts-builder/LICENSE.txt +0 -202
  739. package/skills/creative/web-artifacts-builder/SKILL-zh.md +0 -74
  740. package/skills/creative/web-artifacts-builder/SKILL.md +0 -74
  741. package/skills/creative/web-artifacts-builder/scripts/bundle-artifact.sh +0 -54
  742. package/skills/creative/web-artifacts-builder/scripts/init-artifact.sh +0 -322
  743. package/skills/creative/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
  744. package/skills/documents/doc-coauthoring/SKILL-zh.md +0 -375
  745. package/skills/documents/doc-coauthoring/SKILL.md +0 -375
  746. package/skills/documents/docx/LICENSE.txt +0 -30
  747. package/skills/documents/docx/SKILL-zh.md +0 -590
  748. package/skills/documents/docx/SKILL.md +0 -590
  749. package/skills/documents/docx/scripts/__init__.py +0 -1
  750. package/skills/documents/docx/scripts/accept_changes.py +0 -135
  751. package/skills/documents/docx/scripts/comment.py +0 -318
  752. package/skills/documents/docx/scripts/office/helpers/__init__.py +0 -0
  753. package/skills/documents/docx/scripts/office/helpers/merge_runs.py +0 -199
  754. package/skills/documents/docx/scripts/office/helpers/simplify_redlines.py +0 -197
  755. package/skills/documents/docx/scripts/office/pack.py +0 -159
  756. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
  757. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
  758. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
  759. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
  760. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
  761. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
  762. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
  763. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
  764. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
  765. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
  766. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
  767. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
  768. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
  769. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
  770. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
  771. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
  772. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
  773. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
  774. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
  775. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
  776. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
  777. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
  778. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
  779. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
  780. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
  781. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
  782. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
  783. package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
  784. package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
  785. package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
  786. package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
  787. package/skills/documents/docx/scripts/office/schemas/mce/mc.xsd +0 -75
  788. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-2010.xsd +0 -560
  789. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-2012.xsd +0 -67
  790. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-2018.xsd +0 -14
  791. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -20
  792. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -13
  793. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
  794. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -8
  795. package/skills/documents/docx/scripts/office/soffice.py +0 -183
  796. package/skills/documents/docx/scripts/office/unpack.py +0 -132
  797. package/skills/documents/docx/scripts/office/validate.py +0 -111
  798. package/skills/documents/docx/scripts/office/validators/__init__.py +0 -15
  799. package/skills/documents/docx/scripts/office/validators/base.py +0 -847
  800. package/skills/documents/docx/scripts/office/validators/docx.py +0 -446
  801. package/skills/documents/docx/scripts/office/validators/pptx.py +0 -275
  802. package/skills/documents/docx/scripts/office/validators/redlining.py +0 -247
  803. package/skills/documents/docx/scripts/templates/comments.xml +0 -3
  804. package/skills/documents/docx/scripts/templates/commentsExtended.xml +0 -3
  805. package/skills/documents/docx/scripts/templates/commentsExtensible.xml +0 -3
  806. package/skills/documents/docx/scripts/templates/commentsIds.xml +0 -3
  807. package/skills/documents/docx/scripts/templates/people.xml +0 -3
  808. package/skills/documents/pdf/LICENSE.txt +0 -30
  809. package/skills/documents/pdf/SKILL-zh.md +0 -314
  810. package/skills/documents/pdf/SKILL.md +0 -314
  811. package/skills/documents/pdf/forms.md +0 -294
  812. package/skills/documents/pdf/reference.md +0 -612
  813. package/skills/documents/pdf/scripts/check_bounding_boxes.py +0 -65
  814. package/skills/documents/pdf/scripts/check_fillable_fields.py +0 -11
  815. package/skills/documents/pdf/scripts/convert_pdf_to_images.py +0 -33
  816. package/skills/documents/pdf/scripts/create_validation_image.py +0 -37
  817. package/skills/documents/pdf/scripts/extract_form_field_info.py +0 -122
  818. package/skills/documents/pdf/scripts/extract_form_structure.py +0 -115
  819. package/skills/documents/pdf/scripts/fill_fillable_fields.py +0 -98
  820. package/skills/documents/pdf/scripts/fill_pdf_form_with_annotations.py +0 -107
  821. package/skills/documents/pptx/LICENSE.txt +0 -30
  822. package/skills/documents/pptx/SKILL-zh.md +0 -232
  823. package/skills/documents/pptx/SKILL.md +0 -232
  824. package/skills/documents/pptx/editing.md +0 -205
  825. package/skills/documents/pptx/pptxgenjs.md +0 -420
  826. package/skills/documents/pptx/scripts/__init__.py +0 -0
  827. package/skills/documents/pptx/scripts/add_slide.py +0 -195
  828. package/skills/documents/pptx/scripts/clean.py +0 -286
  829. package/skills/documents/pptx/scripts/office/helpers/__init__.py +0 -0
  830. package/skills/documents/pptx/scripts/office/helpers/merge_runs.py +0 -199
  831. package/skills/documents/pptx/scripts/office/helpers/simplify_redlines.py +0 -197
  832. package/skills/documents/pptx/scripts/office/pack.py +0 -159
  833. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
  834. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
  835. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
  836. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
  837. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
  838. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
  839. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
  840. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
  841. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
  842. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
  843. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
  844. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
  845. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
  846. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
  847. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
  848. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
  849. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
  850. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
  851. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
  852. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
  853. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
  854. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
  855. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
  856. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
  857. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
  858. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
  859. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
  860. package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
  861. package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
  862. package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
  863. package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
  864. package/skills/documents/pptx/scripts/office/schemas/mce/mc.xsd +0 -75
  865. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-2010.xsd +0 -560
  866. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-2012.xsd +0 -67
  867. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-2018.xsd +0 -14
  868. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -20
  869. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -13
  870. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
  871. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -8
  872. package/skills/documents/pptx/scripts/office/soffice.py +0 -183
  873. package/skills/documents/pptx/scripts/office/unpack.py +0 -132
  874. package/skills/documents/pptx/scripts/office/validate.py +0 -111
  875. package/skills/documents/pptx/scripts/office/validators/__init__.py +0 -15
  876. package/skills/documents/pptx/scripts/office/validators/base.py +0 -847
  877. package/skills/documents/pptx/scripts/office/validators/docx.py +0 -446
  878. package/skills/documents/pptx/scripts/office/validators/pptx.py +0 -275
  879. package/skills/documents/pptx/scripts/office/validators/redlining.py +0 -247
  880. package/skills/documents/pptx/scripts/thumbnail.py +0 -289
  881. package/skills/documents/xlsx/SKILL-zh.md +0 -292
  882. package/skills/engineering/diagnose/SKILL-zh.md +0 -117
  883. package/skills/engineering/grill-with-docs/ADR-FORMAT.md +0 -47
  884. package/skills/engineering/grill-with-docs/CONTEXT-FORMAT.md +0 -77
  885. package/skills/engineering/grill-with-docs/SKILL-zh.md +0 -88
  886. package/skills/engineering/grill-with-docs/SKILL.md +0 -88
  887. package/skills/engineering/improve-codebase-architecture/DEEPENING.md +0 -37
  888. package/skills/engineering/improve-codebase-architecture/INTERFACE-DESIGN.md +0 -44
  889. package/skills/engineering/improve-codebase-architecture/LANGUAGE.md +0 -53
  890. package/skills/engineering/improve-codebase-architecture/SKILL-zh.md +0 -71
  891. package/skills/engineering/improve-codebase-architecture/SKILL.md +0 -71
  892. package/skills/engineering/tdd/SKILL-zh.md +0 -109
  893. package/skills/engineering/to-issues/SKILL-zh.md +0 -81
  894. package/skills/engineering/to-issues/SKILL.md +0 -81
  895. package/skills/engineering/to-prd/SKILL-zh.md +0 -76
  896. package/skills/engineering/to-prd/SKILL.md +0 -74
  897. package/skills/engineering/zoom-out/SKILL-zh.md +0 -7
  898. package/skills/engineering/zoom-out/SKILL.md +0 -7
  899. package/skills/tools/find-skills/SKILL-zh.md +0 -440
  900. package/skills/tools/github/SKILL-zh.md +0 -48
  901. package/skills/tools/internal-comms/LICENSE.txt +0 -202
  902. package/skills/tools/internal-comms/SKILL-zh.md +0 -32
  903. package/skills/tools/internal-comms/SKILL.md +0 -32
  904. package/skills/tools/internal-comms/examples/3p-updates.md +0 -47
  905. package/skills/tools/internal-comms/examples/company-newsletter.md +0 -65
  906. package/skills/tools/internal-comms/examples/faq-answers.md +0 -30
  907. package/skills/tools/internal-comms/examples/general-comms.md +0 -16
  908. package/skills/tools/skill-creator/LICENSE.txt +0 -202
  909. package/skills/tools/skill-creator/SKILL-zh.md +0 -483
  910. package/skills/tools/skill-creator/SKILL.md +0 -485
  911. package/skills/tools/skill-creator/agents/analyzer.md +0 -274
  912. package/skills/tools/skill-creator/agents/comparator.md +0 -202
  913. package/skills/tools/skill-creator/agents/grader.md +0 -223
  914. package/skills/tools/skill-creator/assets/eval_review.html +0 -146
  915. package/skills/tools/skill-creator/eval-viewer/generate_review.py +0 -471
  916. package/skills/tools/skill-creator/eval-viewer/viewer.html +0 -1325
  917. package/skills/tools/skill-creator/references/schemas.md +0 -430
  918. package/skills/tools/skill-creator/scripts/__init__.py +0 -0
  919. package/skills/tools/skill-creator/scripts/aggregate_benchmark.py +0 -401
  920. package/skills/tools/skill-creator/scripts/generate_report.py +0 -326
  921. package/skills/tools/skill-creator/scripts/improve_description.py +0 -247
  922. package/skills/tools/skill-creator/scripts/package_skill.py +0 -136
  923. package/skills/tools/skill-creator/scripts/quick_validate.py +0 -103
  924. package/skills/tools/skill-creator/scripts/run_eval.py +0 -310
  925. package/skills/tools/skill-creator/scripts/run_loop.py +0 -328
  926. package/skills/tools/skill-creator/scripts/utils.py +0 -47
  927. package/skills/tools/summarize/SKILL-zh.md +0 -47
  928. package/skills/tools/weather/SKILL-zh.md +0 -46
  929. package/skills/tools/weather/SKILL.md +0 -46
  930. package/skills/tools/webapp-testing/SKILL-zh.md +0 -96
@@ -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";
@@ -1,24 +1,16 @@
1
- ---
2
- name: browser
3
- description: Use browser_use for web navigation, page inspection, UI interaction, screenshots, network capture, and reusable browser pipelines. Load this skill before complex browser tasks.
4
- metadata:
5
- xopc:
6
- requires_tools:
7
- - browser_use
8
- ---
9
-
10
- # Browser Skill
1
+ //#region src/agent/tool-manuals/browser.ts
2
+ const browserUseManual = `# Browser Tool Manual
11
3
 
12
4
  ## Overview
13
5
 
14
- `browser_use` is XOPCs unified browser tool. It supports four modes:
6
+ \`browser_use\` is XOPC's unified browser tool. It supports four modes:
15
7
 
16
8
  | Mode | Purpose |
17
9
  |------|---------|
18
- | `command` | Run a single browser action |
19
- | `pipeline` | Run a multi-step YAML flow |
20
- | `inspect` | Read current page state |
21
- | `close` | Close the browser session |
10
+ | \`command\` | Run a single browser action |
11
+ | \`pipeline\` | Run a multi-step YAML flow |
12
+ | \`inspect\` | Read current page state |
13
+ | \`close\` | Close the browser session |
22
14
 
23
15
  ## When to use
24
16
 
@@ -31,43 +23,43 @@ metadata:
31
23
 
32
24
  ### Basic shape
33
25
 
34
- ```json
26
+ \`\`\`json
35
27
  {
36
28
  "mode": "command",
37
29
  "command": "<action>",
38
30
  "args": { ... }
39
31
  }
40
- ```
32
+ \`\`\`
41
33
 
42
34
  ### Available commands
43
35
 
44
36
  | Command | Description | Key arguments |
45
- |---------|-------------|----------------|
46
- | `open` / `navigate` | Open a URL | `url`, `wait_until` |
47
- | `state` / `snapshot` | ARIA snapshot of the page | `selector`, `maxLength` |
48
- | `click` | Click an element | `selector` / `text` / `role` |
49
- | `type` / `input` | Type text | `selector` / `label`, `text`, `pressEnter` |
50
- | `scroll` | Scroll the page | `direction`, `amount` |
51
- | `screenshot` | Screenshot | `selector`, `full_page`, `path` |
52
- | `back` | Go back | `waitFor` |
53
- | `keys` / `press` | Keyboard input | `key` |
54
- | `console` / `eval` | Run JavaScript | `javascript` |
55
- | `images` | Collect images on the page | `selector`, `maxImages` |
56
- | `wait` | Wait for element/time | `selector` / `text` / `ms`, `timeout_ms` |
57
- | `dialog` | Handle dialogs | `action` (accept/dismiss) |
58
- | `close` | Close the current page | — |
37
+ |---------|-------------|---------------|
38
+ | \`open\` / \`navigate\` | Open a URL | \`url\`, \`wait_until\` |
39
+ | \`state\` / \`snapshot\` | ARIA snapshot of the page | \`selector\`, \`maxLength\` |
40
+ | \`click\` | Click an element | \`selector\` / \`text\` / \`role\` |
41
+ | \`type\` / \`input\` | Type text | \`selector\` / \`label\`, \`text\`, \`pressEnter\` |
42
+ | \`scroll\` | Scroll the page | \`direction\`, \`amount\` |
43
+ | \`screenshot\` | Screenshot | \`selector\`, \`full_page\`, \`path\` |
44
+ | \`back\` | Go back | \`waitFor\` |
45
+ | \`keys\` / \`press\` | Keyboard input | \`key\` |
46
+ | \`console\` / \`eval\` | Run JavaScript | \`javascript\` |
47
+ | \`images\` | Collect images on the page | \`selector\`, \`maxImages\` |
48
+ | \`wait\` | Wait for element/time | \`selector\` / \`text\` / \`ms\`, \`timeout_ms\` |
49
+ | \`dialog\` | Handle dialogs | \`action\` (accept/dismiss) |
50
+ | \`close\` | Close the current page | — |
59
51
 
60
52
  ### Element targeting
61
53
 
62
54
  Prefer, in order:
63
55
 
64
- 1. **ARIA role**: most stable, e.g. `"role": "button:Submit"`
65
- 2. **Visible text**, e.g. `"text": "Sign In"`
66
- 3. **CSS selector**, e.g. `"selector": "#login-btn"`
56
+ 1. **ARIA role**: most stable, e.g. \`"role": "button:Submit"\`
57
+ 2. **Visible text**, e.g. \`"text": "Sign In"\`
58
+ 3. **CSS selector**, e.g. \`"selector": "#login-btn"\`
67
59
 
68
60
  Guidelines:
69
61
 
70
- - Use `inspect` or `state` first to get a snapshot
62
+ - Use \`inspect\` or \`state\` first to get a snapshot
71
63
  - Pick locators from ARIA info in the snapshot
72
64
  - Avoid dynamic class names when possible
73
65
 
@@ -75,9 +67,9 @@ Guidelines:
75
67
 
76
68
  Before acting, understand the current page:
77
69
 
78
- ```json
70
+ \`\`\`json
79
71
  { "mode": "inspect" }
80
- ```
72
+ \`\`\`
81
73
 
82
74
  Returns: current URL, title, ARIA snapshot.
83
75
 
@@ -89,7 +81,7 @@ For multi-step, reusable flows. Uses a brocli-style YAML DSL.
89
81
 
90
82
  ### Run from file
91
83
 
92
- ```json
84
+ \`\`\`json
93
85
  {
94
86
  "mode": "pipeline",
95
87
  "pipeline": {
@@ -97,23 +89,23 @@ For multi-step, reusable flows. Uses a brocli-style YAML DSL.
97
89
  "args": { "url": "https://example.com" }
98
90
  }
99
91
  }
100
- ```
92
+ \`\`\`
101
93
 
102
94
  ### Run inline YAML
103
95
 
104
- ```json
96
+ \`\`\`json
105
97
  {
106
98
  "mode": "pipeline",
107
99
  "pipeline": {
108
- "yaml": "name: quick-check\npipeline:\n - navigate:\n url: https://example.com\n - screenshot:\n full_page: true",
100
+ "yaml": "name: quick-check\\npipeline:\\n - navigate:\\n url: https://example.com\\n - screenshot:\\n full_page: true",
109
101
  "dryRun": false
110
102
  }
111
103
  }
112
- ```
104
+ \`\`\`
113
105
 
114
106
  ### YAML layout
115
107
 
116
- ```yaml
108
+ \`\`\`yaml
117
109
  name: pipeline-name
118
110
  description: What this flow does
119
111
  args:
@@ -125,13 +117,13 @@ args:
125
117
  default: "hello"
126
118
  pipeline:
127
119
  - navigate:
128
- url: ${{ args.url }}
120
+ url: \${{ args.url }}
129
121
  wait_until: domcontentloaded
130
122
  - wait:
131
123
  selector: input[name="q"]
132
124
  - type:
133
125
  selector: input[name="q"]
134
- text: ${{ args.query }}
126
+ text: \${{ args.query }}
135
127
  - press:
136
128
  key: Enter
137
129
  - wait:
@@ -147,18 +139,18 @@ on_error:
147
139
  - screenshot:
148
140
  path: ./artifacts/error.png
149
141
  full_page: true
150
- ```
142
+ \`\`\`
151
143
 
152
144
  ### Authoring rules
153
145
 
154
146
  1. One action per step
155
- 2. Use `${{ args.xxx }}` for parameters
156
- 3. Use `${{ data }}` or `${{ data | json }}` for the previous steps result
157
- 4. Use `on_error` to collect diagnostics after failure
147
+ 2. Use \`\${{ args.xxx }}\` for parameters
148
+ 3. Use \`\${{ data }}\` or \`\${{ data | json }}\` for the previous step's result
149
+ 4. Use \`on_error\` to collect diagnostics after failure
158
150
 
159
151
  ### Validate without running
160
152
 
161
- ```json
153
+ \`\`\`json
162
154
  {
163
155
  "mode": "pipeline",
164
156
  "pipeline": {
@@ -166,15 +158,15 @@ on_error:
166
158
  "dryRun": true
167
159
  }
168
160
  }
169
- ```
161
+ \`\`\`
170
162
 
171
163
  ## Recovery when something fails
172
164
 
173
- 1. `inspect` to see current state
165
+ 1. \`inspect\` to see current state
174
166
  2. Confirm the URL (redirects may have changed it)
175
167
  3. Use the snapshot to see if the page finished loading
176
- 4. `screenshot` for visual debugging
177
- 5. `wait` for elements, then retry
168
+ 4. \`screenshot\` for visual debugging
169
+ 5. \`wait\` for elements, then retry
178
170
 
179
171
  ## Safety
180
172
 
@@ -182,3 +174,8 @@ on_error:
182
174
  - Do not target private IPs / localhost unless configuration allows it
183
175
  - Cloud metadata endpoints are always blocked
184
176
  - For destructive actions (submit forms, delete data), confirm intent with the user first
177
+ `;
178
+ //#endregion
179
+ export { browserUseManual };
180
+
181
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.js","names":[],"sources":["../../../../src/agent/tool-manuals/browser.ts"],"sourcesContent":["export 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 | — |\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`;\n"],"mappings":";AAAA,MAAa,mBAAmB"}
@@ -0,0 +1,10 @@
1
+ export interface ToolManual {
2
+ toolName: string;
3
+ title: string;
4
+ description: string;
5
+ content: string;
6
+ }
7
+ export type ToolManualSummary = Omit<ToolManual, 'content'>;
8
+ export declare function getToolManual(toolName: string): ToolManual | null;
9
+ export declare function hasToolManual(toolName: string): boolean;
10
+ export declare function listToolManuals(): ToolManualSummary[];
@@ -0,0 +1,28 @@
1
+ import { browserUseManual } from "./browser.js";
2
+ //#region src/agent/tool-manuals/index.ts
3
+ const TOOL_MANUALS = { browser_use: {
4
+ toolName: "browser_use",
5
+ title: "Browser Tool Manual",
6
+ description: "Usage guide for browser navigation, inspection, interaction, screenshots, and pipelines.",
7
+ content: browserUseManual
8
+ } };
9
+ function normalizeToolName(toolName) {
10
+ return toolName.trim().toLowerCase();
11
+ }
12
+ function getToolManual(toolName) {
13
+ return TOOL_MANUALS[normalizeToolName(toolName)] ?? null;
14
+ }
15
+ function hasToolManual(toolName) {
16
+ return getToolManual(toolName) !== null;
17
+ }
18
+ function listToolManuals() {
19
+ return Object.values(TOOL_MANUALS).map(({ toolName, title, description }) => ({
20
+ toolName,
21
+ title,
22
+ description
23
+ })).sort((a, b) => a.toolName.localeCompare(b.toolName));
24
+ }
25
+ //#endregion
26
+ export { getToolManual, hasToolManual, listToolManuals };
27
+
28
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../src/agent/tool-manuals/index.ts"],"sourcesContent":["import { browserUseManual } from './browser.js';\n\nexport interface ToolManual {\n toolName: string;\n title: string;\n description: string;\n content: string;\n}\n\nexport type ToolManualSummary = Omit<ToolManual, 'content'>;\n\nconst TOOL_MANUALS: Record<string, ToolManual> = {\n browser_use: {\n toolName: 'browser_use',\n title: 'Browser Tool Manual',\n description: 'Usage guide for browser navigation, inspection, interaction, screenshots, and pipelines.',\n content: browserUseManual,\n },\n};\n\nfunction normalizeToolName(toolName: string): string {\n return toolName.trim().toLowerCase();\n}\n\nexport function getToolManual(toolName: string): ToolManual | null {\n return TOOL_MANUALS[normalizeToolName(toolName)] ?? null;\n}\n\nexport function hasToolManual(toolName: string): boolean {\n return getToolManual(toolName) !== null;\n}\n\nexport function listToolManuals(): ToolManualSummary[] {\n return Object.values(TOOL_MANUALS)\n .map(({ toolName, title, description }) => ({ toolName, title, description }))\n .sort((a, b) => a.toolName.localeCompare(b.toolName));\n}\n"],"mappings":";;AAWA,MAAM,eAA2C,EAC/C,aAAa;CACX,UAAU;CACV,OAAO;CACP,aAAa;CACb,SAAS;CACV,EACF;AAED,SAAS,kBAAkB,UAA0B;AACnD,QAAO,SAAS,MAAM,CAAC,aAAa;;AAGtC,SAAgB,cAAc,UAAqC;AACjE,QAAO,aAAa,kBAAkB,SAAS,KAAK;;AAGtD,SAAgB,cAAc,UAA2B;AACvD,QAAO,cAAc,SAAS,KAAK;;AAGrC,SAAgB,kBAAuC;AACrD,QAAO,OAAO,OAAO,aAAa,CAC/B,KAAK,EAAE,UAAU,OAAO,mBAAmB;EAAE;EAAU;EAAO;EAAa,EAAE,CAC7E,MAAM,GAAG,MAAM,EAAE,SAAS,cAAc,EAAE,SAAS,CAAC"}
@@ -85,7 +85,7 @@ function createBrowserUseTool(deps) {
85
85
  return {
86
86
  name: "browser_use",
87
87
  label: "🌐 Browser",
88
- description: "Use a persistent browser for web navigation, page inspection, interaction, screenshots, network capture, and scripted browser pipelines. For non-trivial browser tasks, load the \"browser\" skill first with skill_view.",
88
+ description: "Use a persistent browser for web navigation, page inspection, interaction, screenshots, network capture, and scripted browser pipelines. For non-trivial browser tasks, load the built-in manual first with tool_manual({ tool: \"browser_use\" }).",
89
89
  parameters: BrowserUseSchema,
90
90
  async execute(_toolCallId, params, signal, _onUpdate) {
91
91
  const { mode, command, args: cmdArgs, pipeline: pipelineParams, options: _options } = params;