@xopcai/xopc 0.0.103 → 0.0.105

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (950) hide show
  1. package/README.md +7 -4
  2. package/README.zh-CN.md +7 -4
  3. package/dist/_virtual/_rolldown/runtime.js +2 -3
  4. package/dist/browser-ext/manifest.json +1 -1
  5. package/dist/extensions/feishu/src/adapters/cli-login.d.ts +1 -1
  6. package/dist/extensions/feishu/src/adapters/cli-login.js +1 -1
  7. package/dist/extensions/feishu/src/adapters/cli-login.js.map +1 -1
  8. package/dist/extensions/feishu/src/adapters/gateway-setup.d.ts +2 -0
  9. package/dist/extensions/feishu/src/adapters/gateway-setup.js +225 -0
  10. package/dist/extensions/feishu/src/adapters/gateway-setup.js.map +1 -0
  11. package/dist/extensions/feishu/src/index.d.ts +8 -1
  12. package/dist/extensions/feishu/src/index.js +14 -1
  13. package/dist/extensions/feishu/src/index.js.map +1 -0
  14. package/dist/extensions/feishu/src/outbound/outbound-adapter.js +1 -1
  15. package/dist/extensions/feishu/src/plugin.d.ts +2 -1
  16. package/dist/extensions/feishu/src/plugin.js +2 -0
  17. package/dist/extensions/feishu/src/plugin.js.map +1 -1
  18. package/dist/extensions/feishu/src/streaming/streaming-adapter.js +1 -1
  19. package/dist/extensions/feishu/src/transport/webhook/monitor.js +1 -1
  20. package/dist/extensions/feishu/xopc.extension.json +66 -1
  21. package/dist/extensions/telegram/src/adapters/gateway-setup.d.ts +2 -0
  22. package/dist/extensions/telegram/src/adapters/gateway-setup.js +146 -0
  23. package/dist/extensions/telegram/src/adapters/gateway-setup.js.map +1 -0
  24. package/dist/extensions/telegram/src/adapters/security-adapter.js +1 -1
  25. package/dist/extensions/telegram/src/command-handler.js +1 -2
  26. package/dist/extensions/telegram/src/command-handler.js.map +1 -1
  27. package/dist/extensions/telegram/src/config-schema.js +2 -2
  28. package/dist/extensions/telegram/src/config-schema.js.map +1 -1
  29. package/dist/extensions/telegram/src/doctor.d.ts +1 -0
  30. package/dist/extensions/telegram/src/doctor.js +68 -0
  31. package/dist/extensions/telegram/src/doctor.js.map +1 -1
  32. package/dist/extensions/telegram/src/index.d.ts +8 -1
  33. package/dist/extensions/telegram/src/index.js +15 -2
  34. package/dist/extensions/telegram/src/index.js.map +1 -0
  35. package/dist/extensions/telegram/src/plugin.d.ts +13 -5
  36. package/dist/extensions/telegram/src/plugin.js +32 -12
  37. package/dist/extensions/telegram/src/plugin.js.map +1 -1
  38. package/dist/extensions/telegram/src/proxy-fetch.js +22 -5
  39. package/dist/extensions/telegram/src/proxy-fetch.js.map +1 -1
  40. package/dist/extensions/telegram/xopc.extension.json +412 -5
  41. package/dist/extensions/weixin/src/adapters/onboard-cli.js +2 -2
  42. package/dist/extensions/weixin/src/adapters/onboard-cli.js.map +1 -1
  43. package/dist/extensions/weixin/src/api/api.js +1 -1
  44. package/dist/extensions/weixin/src/index.d.ts +8 -0
  45. package/dist/extensions/weixin/src/index.js +12 -1
  46. package/dist/extensions/weixin/src/index.js.map +1 -0
  47. package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
  48. package/dist/extensions/weixin/src/plugin.d.ts +2 -1
  49. package/dist/extensions/weixin/src/plugin.js +77 -2
  50. package/dist/extensions/weixin/src/plugin.js.map +1 -1
  51. package/dist/extensions/weixin/xopc.extension.json +52 -0
  52. package/dist/gateway/static/root/assets/agents-XzgIVKcI.js +396 -0
  53. package/dist/gateway/static/root/assets/{apps-page-C5RmwmTT.js → apps-page-B7Us3RMl.js} +1 -1
  54. package/dist/gateway/static/root/assets/browser-BLJWD7WI.js +8 -0
  55. package/dist/gateway/static/root/assets/channels-settings-BgeV6fzw.js +1 -0
  56. package/dist/gateway/static/root/assets/cron-page-DKGHEeAU.js +1 -0
  57. package/dist/gateway/static/root/assets/{dist-CWm8hTXZ.js → dist-DJDkNhu5.js} +1 -1
  58. package/dist/gateway/static/root/assets/{extension-debug-page-BzYgTkS9.js → extension-debug-page-DI1XJTJi.js} +1 -1
  59. package/dist/gateway/static/root/assets/{extension-page-BmTZH6gL.js → extension-page-SuafGTT_.js} +1 -1
  60. package/dist/gateway/static/root/assets/extension-settings-page-cKmGax9v.js +1 -0
  61. package/dist/gateway/static/root/assets/{fetch-CMoWY2Si.js → fetch-CkvRO30i.js} +1 -1
  62. package/dist/gateway/static/root/assets/gateway-startup-retry-BkKyRDrF.js +1 -0
  63. package/dist/gateway/static/root/assets/heartbeat-config-api-CRiDcxtt.js +1 -0
  64. package/dist/gateway/static/root/assets/index-50FVtgXU.js +4845 -0
  65. package/dist/gateway/static/root/assets/index-BPYKW7FB.css +1 -0
  66. package/dist/gateway/static/root/assets/{logs-page-BjdQjHwk.js → logs-page-DM8o5-Bm.js} +2 -2
  67. package/dist/gateway/static/root/assets/{note-detail-page-8Er4197b.js → note-detail-page-j53jtvq9.js} +53 -53
  68. package/dist/gateway/static/root/assets/{note-time-CF3vf1jm.js → note-time-Ck2H2Qpw.js} +1 -1
  69. package/dist/gateway/static/root/assets/notes-page-CsWIw35Q.js +1 -0
  70. package/dist/gateway/static/root/assets/schema-form-BvmGNxiJ.js +1 -0
  71. package/dist/gateway/static/root/assets/sessions-page-CLPsbyOW.js +1 -0
  72. package/dist/gateway/static/root/assets/settings-advanced-gate-DRdayl8P.js +2 -0
  73. package/dist/gateway/static/root/assets/{settings-form-section-C7qA7y0J.js → settings-form-section-BlIYg2gZ.js} +1 -1
  74. package/dist/gateway/static/root/assets/settings-page-CRGHT_bm.js +3 -0
  75. package/dist/gateway/static/root/assets/{share-preview-page-Tvr5Mtq5.js → share-preview-page-BlT6Akvk.js} +1 -1
  76. package/dist/gateway/static/root/assets/skills-page-Ce-RIH2y.js +2 -0
  77. package/dist/gateway/static/root/assets/{theme-store-HTvJlFLL.js → theme-store-DYgVdRB4.js} +1 -1
  78. package/dist/gateway/static/root/assets/url-DPEStU4M.js +3 -0
  79. package/dist/gateway/static/root/assets/voice-api-key-field-CJGTidqc.js +1 -0
  80. package/dist/gateway/static/root/assets/{workflow-page.utils-CeBkAjP7.js → workflow-page.utils-_sjXCMvi.js} +1 -1
  81. package/dist/gateway/static/root/assets/workflows-page-o63aaARK.js +27 -0
  82. package/dist/gateway/static/root/index.html +6 -5
  83. package/dist/package.js +1 -1
  84. package/dist/src/agent/agent-manager.d.ts +18 -6
  85. package/dist/src/agent/agent-manager.js +60 -35
  86. package/dist/src/agent/agent-manager.js.map +1 -1
  87. package/dist/src/agent/builtin-agent-ids.d.ts +2 -0
  88. package/dist/src/agent/builtin-agent-ids.js +17 -0
  89. package/dist/src/agent/builtin-agent-ids.js.map +1 -0
  90. package/dist/src/agent/child-agent-factory.d.ts +4 -0
  91. package/dist/src/agent/child-agent-factory.js +28 -8
  92. package/dist/src/agent/child-agent-factory.js.map +1 -1
  93. package/dist/src/agent/context/workspace-templates/AGENTS.md +23 -184
  94. package/dist/src/agent/embedded/run-turn.js +8 -2
  95. package/dist/src/agent/embedded/run-turn.js.map +1 -1
  96. package/dist/src/agent/embedded/session-tool-result-guard.js +1 -1
  97. package/dist/src/agent/embedded/subscribe-session.js +33 -51
  98. package/dist/src/agent/embedded/subscribe-session.js.map +1 -1
  99. package/dist/src/agent/embedded/types.d.ts +36 -35
  100. package/dist/src/agent/fallback/candidates.js +1 -1
  101. package/dist/src/agent/fallback/candidates.js.map +1 -1
  102. package/dist/src/agent/inbound/inbound-loop.js +1 -1
  103. package/dist/src/agent/inbound/turn-dispatcher.d.ts +3 -0
  104. package/dist/src/agent/inbound/turn-dispatcher.js +25 -5
  105. package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -1
  106. package/dist/src/agent/models/manager.d.ts +1 -1
  107. package/dist/src/agent/models/manager.js +1 -1
  108. package/dist/src/agent/models/manager.js.map +1 -1
  109. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.d.ts +1 -1
  110. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js +1 -1
  111. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js.map +1 -1
  112. package/dist/src/agent/prompt/memory/index.js +30 -2
  113. package/dist/src/agent/prompt/memory/index.js.map +1 -1
  114. package/dist/src/agent/prompt/sections/tooling.js +4 -0
  115. package/dist/src/agent/prompt/sections/tooling.js.map +1 -1
  116. package/dist/src/agent/service/direct-turn-helpers.d.ts +3 -0
  117. package/dist/src/agent/service/direct-turn-helpers.js +6 -3
  118. package/dist/src/agent/service/direct-turn-helpers.js.map +1 -1
  119. package/dist/src/agent/service/process-direct-streaming.d.ts +3 -0
  120. package/dist/src/agent/service/process-direct-streaming.js +50 -19
  121. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  122. package/dist/src/agent/service-inbound-utils.d.ts +0 -1
  123. package/dist/src/agent/service-inbound-utils.js +1 -17
  124. package/dist/src/agent/service-inbound-utils.js.map +1 -1
  125. package/dist/src/agent/service.d.ts +4 -4
  126. package/dist/src/agent/service.js +29 -16
  127. package/dist/src/agent/service.js.map +1 -1
  128. package/dist/src/agent/service.types.d.ts +3 -0
  129. package/dist/src/agent/session/session-config-service.d.ts +1 -0
  130. package/dist/src/agent/session/session-config-service.js +9 -1
  131. package/dist/src/agent/session/session-config-service.js.map +1 -1
  132. package/dist/src/agent/session/session-inspector.d.ts +2 -1
  133. package/dist/src/agent/session/session-inspector.js +4 -0
  134. package/dist/src/agent/session/session-inspector.js.map +1 -1
  135. package/dist/src/agent/skills/config.js +1 -3
  136. package/dist/src/agent/skills/config.js.map +1 -1
  137. package/dist/src/agent/skills/format-skills-prompt.d.ts +1 -0
  138. package/dist/src/agent/skills/format-skills-prompt.js +3 -2
  139. package/dist/src/agent/skills/format-skills-prompt.js.map +1 -1
  140. package/dist/src/agent/skills/index.js +20 -5
  141. package/dist/src/agent/skills/index.js.map +1 -1
  142. package/dist/src/agent/skills/installer.js +14 -27
  143. package/dist/src/agent/skills/installer.js.map +1 -1
  144. package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js +11 -1
  145. package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js.map +1 -1
  146. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js +18 -4
  147. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js.map +1 -1
  148. package/dist/src/agent/skills/marketplace/adapters/store/adapter.js +11 -2
  149. package/dist/src/agent/skills/marketplace/adapters/store/adapter.js.map +1 -1
  150. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.d.ts +2 -2
  151. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js.map +1 -1
  152. package/dist/src/agent/skills/skill-manager.d.ts +4 -1
  153. package/dist/src/agent/skills/skill-manager.js +3 -3
  154. package/dist/src/agent/skills/skill-manager.js.map +1 -1
  155. package/dist/src/agent/skills/skill-view-path.d.ts +1 -17
  156. package/dist/src/agent/skills/skill-view-path.js +3 -66
  157. package/dist/src/agent/skills/skill-view-path.js.map +1 -1
  158. package/dist/src/agent/skills/test-framework.js +2 -3
  159. package/dist/src/agent/skills/test-framework.js.map +1 -1
  160. package/dist/src/agent/source-context/index.d.ts +2 -0
  161. package/dist/src/agent/source-context/index.js +3 -0
  162. package/dist/src/agent/source-context/injector.d.ts +3 -0
  163. package/dist/src/agent/source-context/injector.js +36 -0
  164. package/dist/src/agent/source-context/injector.js.map +1 -0
  165. package/dist/src/agent/source-context/types.d.ts +19 -0
  166. package/dist/src/agent/source-context/types.js +10 -0
  167. package/dist/src/agent/source-context/types.js.map +1 -0
  168. package/dist/src/agent/streaming/reasoning-visibility-sse.js +1 -0
  169. package/dist/src/agent/streaming/reasoning-visibility-sse.js.map +1 -1
  170. package/dist/src/agent/tool-manuals/browser.d.ts +1 -0
  171. package/{skills/browser/SKILL.md → dist/src/agent/tool-manuals/browser.js} +51 -54
  172. package/dist/src/agent/tool-manuals/browser.js.map +1 -0
  173. package/dist/src/agent/tool-manuals/index.d.ts +10 -0
  174. package/dist/src/agent/tool-manuals/index.js +28 -0
  175. package/dist/src/agent/tool-manuals/index.js.map +1 -0
  176. package/dist/src/agent/tools/browser/tool/browser-use-tool.js +1 -1
  177. package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +1 -1
  178. package/dist/src/agent/tools/factory.js +2 -0
  179. package/dist/src/agent/tools/factory.js.map +1 -1
  180. package/dist/src/agent/tools/index.d.ts +1 -0
  181. package/dist/src/agent/tools/index.js +2 -1
  182. package/dist/src/agent/tools/skills-tools.js +37 -8
  183. package/dist/src/agent/tools/skills-tools.js.map +1 -1
  184. package/dist/src/agent/tools/tool-manual-tool.d.ts +6 -0
  185. package/dist/src/agent/tools/tool-manual-tool.js +34 -0
  186. package/dist/src/agent/tools/tool-manual-tool.js.map +1 -0
  187. package/dist/src/agent/workflow/catalog.d.ts +7 -2
  188. package/dist/src/agent/workflow/catalog.js +66 -25
  189. package/dist/src/agent/workflow/catalog.js.map +1 -1
  190. package/dist/src/agent/workflow/subagent-runner.d.ts +3 -0
  191. package/dist/src/agent/workflow/subagent-runner.js +50 -4
  192. package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
  193. package/dist/src/agent/workflow/types.d.ts +10 -0
  194. package/dist/src/auth/credentials.js +10 -5
  195. package/dist/src/auth/credentials.js.map +1 -1
  196. package/dist/src/channels/catalog/channel-catalog-service.d.ts +11 -0
  197. package/dist/src/channels/catalog/channel-catalog-service.js +168 -0
  198. package/dist/src/channels/catalog/channel-catalog-service.js.map +1 -0
  199. package/dist/src/channels/catalog/channel-catalog-types.d.ts +22 -0
  200. package/dist/src/channels/catalog/channel-catalog-types.js +1 -0
  201. package/dist/src/channels/dock.d.ts +0 -7
  202. package/dist/src/channels/dock.js +1 -21
  203. package/dist/src/channels/index.d.ts +1 -3
  204. package/dist/src/channels/index.js +1 -5
  205. package/dist/src/channels/lifecycle-supervisor.d.ts +1 -0
  206. package/dist/src/channels/lifecycle-supervisor.js +11 -0
  207. package/dist/src/channels/lifecycle-supervisor.js.map +1 -1
  208. package/dist/src/channels/manager.d.ts +1 -0
  209. package/dist/src/channels/manager.js +3 -0
  210. package/dist/src/channels/manager.js.map +1 -1
  211. package/dist/src/channels/pairing/pairing-channel.d.ts +2 -3
  212. package/dist/src/channels/pairing/pairing-messages.js +1 -1
  213. package/dist/src/channels/pairing/pairing-messages.js.map +1 -1
  214. package/dist/src/channels/pairing/pairing-service.d.ts +1 -1
  215. package/dist/src/channels/pairing/pairing-service.js +8 -27
  216. package/dist/src/channels/pairing/pairing-service.js.map +1 -1
  217. package/dist/src/channels/plugin-types.d.ts +3 -1
  218. package/dist/src/channels/plugins/types.adapters.d.ts +55 -2
  219. package/dist/src/channels/telegram/index.js +1 -1
  220. package/dist/src/chat-commands/builtins/config.js +4 -4
  221. package/dist/src/chat-commands/builtins/config.js.map +1 -1
  222. package/dist/src/chat-commands/config-paths.js +1 -1
  223. package/dist/src/chat-commands/config-paths.js.map +1 -1
  224. package/dist/src/chat-commands/context.js +1 -1
  225. package/dist/src/chat-commands/context.js.map +1 -1
  226. package/dist/src/cli/bin.js +1 -1
  227. package/dist/src/cli/command-manifest.js +1 -1
  228. package/dist/src/cli/command-manifest.js.map +1 -1
  229. package/dist/src/cli/commands/agent.js +2 -2
  230. package/dist/src/cli/commands/agent.js.map +1 -1
  231. package/dist/src/cli/commands/agents.js +2 -4
  232. package/dist/src/cli/commands/agents.js.map +1 -1
  233. package/dist/src/cli/commands/auth.js +1 -1
  234. package/dist/src/cli/commands/channels.d.ts +1 -5
  235. package/dist/src/cli/commands/channels.js +115 -281
  236. package/dist/src/cli/commands/channels.js.map +1 -1
  237. package/dist/src/cli/commands/config.js +2 -2
  238. package/dist/src/cli/commands/config.js.map +1 -1
  239. package/dist/src/cli/commands/doctor/checks/channel-config.js +16 -69
  240. package/dist/src/cli/commands/doctor/checks/channel-config.js.map +1 -1
  241. package/dist/src/cli/commands/doctor/checks/channel-pairing-pending.js +6 -4
  242. package/dist/src/cli/commands/doctor/checks/channel-pairing-pending.js.map +1 -1
  243. package/dist/src/cli/commands/doctor/checks/channel-plugins.js +2 -2
  244. package/dist/src/cli/commands/doctor/checks/channel-plugins.js.map +1 -1
  245. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  246. package/dist/src/cli/commands/doctor/checks/provider-auth.js +13 -9
  247. package/dist/src/cli/commands/doctor/checks/provider-auth.js.map +1 -1
  248. package/dist/src/cli/commands/extension-dev.js +2 -1
  249. package/dist/src/cli/commands/extension-dev.js.map +1 -1
  250. package/dist/src/cli/commands/extension-marketplace.js +2 -1
  251. package/dist/src/cli/commands/extension-marketplace.js.map +1 -1
  252. package/dist/src/cli/commands/extension-pack.js +2 -1
  253. package/dist/src/cli/commands/extension-pack.js.map +1 -1
  254. package/dist/src/cli/commands/models.js +7 -4
  255. package/dist/src/cli/commands/models.js.map +1 -1
  256. package/dist/src/cli/commands/onboard/channels/index.js +1 -1
  257. package/dist/src/cli/commands/onboard/channels/index.js.map +1 -1
  258. package/dist/src/cli/commands/onboard/channels/registry.d.ts +2 -1
  259. package/dist/src/cli/commands/onboard/channels/registry.js +32 -8
  260. package/dist/src/cli/commands/onboard/channels/registry.js.map +1 -1
  261. package/dist/src/cli/commands/onboard/model.js +8 -5
  262. package/dist/src/cli/commands/onboard/model.js.map +1 -1
  263. package/dist/src/cli/commands/onboard.js +4 -6
  264. package/dist/src/cli/commands/onboard.js.map +1 -1
  265. package/dist/src/cli/commands/setup-shared/runner.d.ts +1 -1
  266. package/dist/src/cli/commands/setup-shared/runner.js.map +1 -1
  267. package/dist/src/cli/commands/setup-shared/types.d.ts +1 -1
  268. package/dist/src/cli/commands/setup-shared/types.js.map +1 -1
  269. package/dist/src/cli/commands/tui.js +13 -5
  270. package/dist/src/cli/commands/tui.js.map +1 -1
  271. package/dist/src/cli/extension-cli-register.js +1 -1
  272. package/dist/src/commands/agents.config.d.ts +3 -3
  273. package/dist/src/commands/agents.config.js +7 -7
  274. package/dist/src/commands/agents.config.js.map +1 -1
  275. package/dist/src/config/agent-profile.d.ts +1 -1
  276. package/dist/src/config/agent-profile.js +6 -2
  277. package/dist/src/config/agent-profile.js.map +1 -1
  278. package/dist/src/config/agent-typed-models.d.ts +2 -2
  279. package/dist/src/config/agent-typed-models.js +13 -2
  280. package/dist/src/config/agent-typed-models.js.map +1 -1
  281. package/dist/src/config/index.js +3 -3
  282. package/dist/src/config/integration.d.ts +1 -1
  283. package/dist/src/config/loader.d.ts +0 -1
  284. package/dist/src/config/loader.js +4 -9
  285. package/dist/src/config/loader.js.map +1 -1
  286. package/dist/src/config/models-json.d.ts +6 -6
  287. package/dist/src/config/paths.d.ts +1 -0
  288. package/dist/src/config/paths.js +5 -1
  289. package/dist/src/config/paths.js.map +1 -1
  290. package/dist/src/config/rules.js +2 -12
  291. package/dist/src/config/rules.js.map +1 -1
  292. package/dist/src/config/schema.d.ts +74 -47
  293. package/dist/src/config/schema.js +28 -66
  294. package/dist/src/config/schema.js.map +1 -1
  295. package/dist/src/config/validate-channel-configs.d.ts +0 -3
  296. package/dist/src/config/validate-channel-configs.js +29 -10
  297. package/dist/src/config/validate-channel-configs.js.map +1 -1
  298. package/dist/src/cron/executor.js +1 -4
  299. package/dist/src/cron/executor.js.map +1 -1
  300. package/dist/src/document-understanding/extract.d.ts +13 -0
  301. package/dist/src/document-understanding/extract.js +63 -0
  302. package/dist/src/document-understanding/extract.js.map +1 -0
  303. package/dist/src/extensions/activation-context.js +3 -1
  304. package/dist/src/extensions/activation-context.js.map +1 -1
  305. package/dist/src/extensions/activation-planner.js +12 -0
  306. package/dist/src/extensions/activation-planner.js.map +1 -1
  307. package/dist/src/extensions/api.d.ts +5 -1
  308. package/dist/src/extensions/api.js +12 -0
  309. package/dist/src/extensions/api.js.map +1 -1
  310. package/dist/src/extensions/discover-extensions.js +17 -13
  311. package/dist/src/extensions/discover-extensions.js.map +1 -1
  312. package/dist/src/extensions/extension-metadata-snapshot.js +11 -5
  313. package/dist/src/extensions/extension-metadata-snapshot.js.map +1 -1
  314. package/dist/src/extensions/index.js +12 -4
  315. package/dist/src/extensions/index.js.map +1 -0
  316. package/dist/src/extensions/loader.d.ts +5 -1
  317. package/dist/src/extensions/loader.js +12 -11
  318. package/dist/src/extensions/loader.js.map +1 -1
  319. package/dist/src/extensions/manifest-registry.js +98 -93
  320. package/dist/src/extensions/manifest-registry.js.map +1 -1
  321. package/dist/src/extensions/normalize-manifest.js +91 -15
  322. package/dist/src/extensions/normalize-manifest.js.map +1 -1
  323. package/dist/src/extensions/sdk/index.js +1 -1
  324. package/dist/src/extensions/sdk/testing.js +4 -0
  325. package/dist/src/extensions/sdk/testing.js.map +1 -1
  326. package/dist/src/extensions/types/core.d.ts +32 -1
  327. package/dist/src/extensions/types/manifest.d.ts +60 -0
  328. package/dist/src/extensions/types/tui.d.ts +414 -5
  329. package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
  330. package/dist/src/gateway/agent-builtin-tools.js +16 -0
  331. package/dist/src/gateway/agent-builtin-tools.js.map +1 -1
  332. package/dist/src/gateway/agent-run-relay.d.ts +2 -3
  333. package/dist/src/gateway/agent-run-relay.js +10 -3
  334. package/dist/src/gateway/agent-run-relay.js.map +1 -1
  335. package/dist/src/gateway/agents-admin.d.ts +32 -19
  336. package/dist/src/gateway/agents-admin.js +113 -93
  337. package/dist/src/gateway/agents-admin.js.map +1 -1
  338. package/dist/src/gateway/chat-stream/mapper.d.ts +34 -0
  339. package/dist/src/gateway/chat-stream/mapper.js +244 -0
  340. package/dist/src/gateway/chat-stream/mapper.js.map +1 -0
  341. package/dist/src/gateway/chat-stream/protocol.d.ts +100 -0
  342. package/dist/src/gateway/chat-stream/protocol.js +1 -0
  343. package/dist/src/gateway/heartbeat/service.js +1 -1
  344. package/dist/src/gateway/hono/lib/agent-model.d.ts +4 -4
  345. package/dist/src/gateway/hono/lib/agent-model.js +13 -11
  346. package/dist/src/gateway/hono/lib/agent-model.js.map +1 -1
  347. package/dist/src/gateway/hono/lib/config-payload.d.ts +19 -7
  348. package/dist/src/gateway/hono/lib/config-payload.js +16 -15
  349. package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
  350. package/dist/src/gateway/hono/routes/agents.js +83 -48
  351. package/dist/src/gateway/hono/routes/agents.js.map +1 -1
  352. package/dist/src/gateway/hono/routes/channels.js +134 -214
  353. package/dist/src/gateway/hono/routes/channels.js.map +1 -1
  354. package/dist/src/gateway/hono/routes/commands-skills.js +10 -4
  355. package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
  356. package/dist/src/gateway/hono/routes/config-patch/agents.js +26 -13
  357. package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -1
  358. package/dist/src/gateway/hono/routes/config-patch/channels.d.ts +1 -11
  359. package/dist/src/gateway/hono/routes/config-patch/channels.js +18 -165
  360. package/dist/src/gateway/hono/routes/config-patch/channels.js.map +1 -1
  361. package/dist/src/gateway/hono/routes/config.js +5 -2
  362. package/dist/src/gateway/hono/routes/config.js.map +1 -1
  363. package/dist/src/gateway/hono/routes/dreaming.js +1 -1
  364. package/dist/src/gateway/hono/routes/lazy-bundles.js +13 -1
  365. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  366. package/dist/src/gateway/hono/routes/notes.js +46 -27
  367. package/dist/src/gateway/hono/routes/notes.js.map +1 -1
  368. package/dist/src/gateway/hono/routes/public-gateway.js +2 -4
  369. package/dist/src/gateway/hono/routes/public-gateway.js.map +1 -1
  370. package/dist/src/gateway/hono/routes/sessions.js +179 -0
  371. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  372. package/dist/src/gateway/hono/routes/tui.d.ts +3 -0
  373. package/dist/src/gateway/hono/routes/tui.js +16 -0
  374. package/dist/src/gateway/hono/routes/tui.js.map +1 -0
  375. package/dist/src/gateway/hono/routes/workflows.js +25 -1
  376. package/dist/src/gateway/hono/routes/workflows.js.map +1 -1
  377. package/dist/src/gateway/hono/sse.d.ts +5 -7
  378. package/dist/src/gateway/hono/sse.js +21 -38
  379. package/dist/src/gateway/hono/sse.js.map +1 -1
  380. package/dist/src/gateway/protocol.js.map +1 -1
  381. package/dist/src/gateway/service/agent-runner.d.ts +2 -4
  382. package/dist/src/gateway/service/agent-runner.js +1 -1
  383. package/dist/src/gateway/service/agent-runner.js.map +1 -1
  384. package/dist/src/gateway/service/marketplace-service.d.ts +4 -3
  385. package/dist/src/gateway/service/marketplace-service.js +7 -4
  386. package/dist/src/gateway/service/marketplace-service.js.map +1 -1
  387. package/dist/src/gateway/service/run-gateway-agent.d.ts +2 -6
  388. package/dist/src/gateway/service/run-gateway-agent.js +63 -36
  389. package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
  390. package/dist/src/gateway/service/sessions-api.d.ts +19 -0
  391. package/dist/src/gateway/service/sessions-api.js +12 -0
  392. package/dist/src/gateway/service/sessions-api.js.map +1 -1
  393. package/dist/src/gateway/service.d.ts +6 -0
  394. package/dist/src/gateway/service.js +84 -57
  395. package/dist/src/gateway/service.js.map +1 -1
  396. package/dist/src/heartbeat/index.js +1 -1
  397. package/dist/src/notes/agent-context.d.ts +40 -0
  398. package/dist/src/notes/agent-context.js +383 -0
  399. package/dist/src/notes/agent-context.js.map +1 -0
  400. package/dist/src/notes/index.d.ts +2 -0
  401. package/dist/src/notes/index.js +2 -1
  402. package/dist/src/notes/service.d.ts +5 -0
  403. package/dist/src/notes/service.js +22 -0
  404. package/dist/src/notes/service.js.map +1 -1
  405. package/dist/src/notes/store.js +2 -0
  406. package/dist/src/notes/store.js.map +1 -1
  407. package/dist/src/project-trust/trust-store.d.ts +30 -0
  408. package/dist/src/project-trust/trust-store.js +194 -0
  409. package/dist/src/project-trust/trust-store.js.map +1 -0
  410. package/dist/src/providers/index.d.ts +1 -1
  411. package/dist/src/providers/index.js +18 -7
  412. package/dist/src/providers/index.js.map +1 -1
  413. package/dist/src/routing/resolve-route.d.ts +0 -3
  414. package/dist/src/routing/resolve-route.js.map +1 -1
  415. package/dist/src/routing/resolve-tui-session-key.d.ts +2 -0
  416. package/dist/src/routing/resolve-tui-session-key.js +8 -3
  417. package/dist/src/routing/resolve-tui-session-key.js.map +1 -1
  418. package/dist/src/session/client-history.d.ts +32 -0
  419. package/dist/src/session/client-history.js +232 -1
  420. package/dist/src/session/client-history.js.map +1 -1
  421. package/dist/src/session/manager.d.ts +37 -4
  422. package/dist/src/session/manager.js +39 -15
  423. package/dist/src/session/manager.js.map +1 -1
  424. package/dist/src/session/session-context-for-llm.d.ts +93 -1
  425. package/dist/src/session/session-context-for-llm.js +105 -2
  426. package/dist/src/session/session-context-for-llm.js.map +1 -1
  427. package/dist/src/session/store.d.ts +37 -0
  428. package/dist/src/session/store.js +127 -2
  429. package/dist/src/session/store.js.map +1 -1
  430. package/dist/src/session/stored-rows-to-file-entries.js +37 -1
  431. package/dist/src/session/stored-rows-to-file-entries.js.map +1 -1
  432. package/dist/src/session/types.d.ts +14 -1
  433. package/dist/src/session/types.js.map +1 -1
  434. package/dist/src/storage/sqlite/index.d.ts +1 -0
  435. package/dist/src/storage/sqlite/index.js +2 -1
  436. package/dist/src/storage/sqlite/migrations/004_add_session_type_metadata.sql +15 -0
  437. package/dist/src/storage/sqlite/migrations/005_add_note_agent_contexts.sql +10 -0
  438. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  439. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  440. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  441. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  442. package/dist/src/storage/sqlite/note-agent-context-repository.d.ts +10 -0
  443. package/dist/src/storage/sqlite/note-agent-context-repository.js +35 -0
  444. package/dist/src/storage/sqlite/note-agent-context-repository.js.map +1 -0
  445. package/dist/src/storage/sqlite/row-mappers.d.ts +14 -1
  446. package/dist/src/storage/sqlite/row-mappers.js +14 -1
  447. package/dist/src/storage/sqlite/row-mappers.js.map +1 -1
  448. package/dist/src/storage/sqlite/schema.js +1 -1
  449. package/dist/src/storage/sqlite/session-metadata.js +1 -0
  450. package/dist/src/storage/sqlite/session-metadata.js.map +1 -1
  451. package/dist/src/storage/sqlite/session-repository.js +52 -25
  452. package/dist/src/storage/sqlite/session-repository.js.map +1 -1
  453. package/dist/src/tui/backends/embedded-backend.d.ts +53 -4
  454. package/dist/src/tui/backends/embedded-backend.js +227 -39
  455. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  456. package/dist/src/tui/backends/gateway-sse-backend.d.ts +59 -3
  457. package/dist/src/tui/backends/gateway-sse-backend.js +416 -26
  458. package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
  459. package/dist/src/tui/chat-history.d.ts +5 -1
  460. package/dist/src/tui/chat-history.js +78 -8
  461. package/dist/src/tui/chat-history.js.map +1 -1
  462. package/dist/src/tui/clipboard-text.d.ts +5 -0
  463. package/dist/src/tui/clipboard-text.js +46 -0
  464. package/dist/src/tui/clipboard-text.js.map +1 -0
  465. package/dist/src/tui/components/assistant-message.d.ts +19 -3
  466. package/dist/src/tui/components/assistant-message.js +115 -9
  467. package/dist/src/tui/components/assistant-message.js.map +1 -1
  468. package/dist/src/tui/components/bash-execution.d.ts +3 -2
  469. package/dist/src/tui/components/bash-execution.js +31 -3
  470. package/dist/src/tui/components/bash-execution.js.map +1 -1
  471. package/dist/src/tui/components/bash-summary.d.ts +23 -0
  472. package/dist/src/tui/components/bash-summary.js +87 -0
  473. package/dist/src/tui/components/bash-summary.js.map +1 -0
  474. package/dist/src/tui/components/branch-message-summary.d.ts +17 -0
  475. package/dist/src/tui/components/branch-message-summary.js +43 -0
  476. package/dist/src/tui/components/branch-message-summary.js.map +1 -0
  477. package/dist/src/tui/components/branch-summary.d.ts +13 -0
  478. package/dist/src/tui/components/branch-summary.js +51 -0
  479. package/dist/src/tui/components/branch-summary.js.map +1 -0
  480. package/dist/src/tui/components/chat-log.d.ts +46 -6
  481. package/dist/src/tui/components/chat-log.js +183 -21
  482. package/dist/src/tui/components/chat-log.js.map +1 -1
  483. package/dist/src/tui/components/compaction-summary.d.ts +13 -0
  484. package/dist/src/tui/components/compaction-summary.js +46 -0
  485. package/dist/src/tui/components/compaction-summary.js.map +1 -0
  486. package/dist/src/tui/components/custom-editor.d.ts +1 -0
  487. package/dist/src/tui/components/custom-editor.js +2 -0
  488. package/dist/src/tui/components/custom-editor.js.map +1 -1
  489. package/dist/src/tui/components/custom-message.d.ts +23 -0
  490. package/dist/src/tui/components/custom-message.js +65 -0
  491. package/dist/src/tui/components/custom-message.js.map +1 -0
  492. package/dist/src/tui/components/extension-dialog.d.ts +42 -0
  493. package/dist/src/tui/components/extension-dialog.js +127 -0
  494. package/dist/src/tui/components/extension-dialog.js.map +1 -0
  495. package/dist/src/tui/components/scoped-models-selector.d.ts +7 -2
  496. package/dist/src/tui/components/scoped-models-selector.js +89 -16
  497. package/dist/src/tui/components/scoped-models-selector.js.map +1 -1
  498. package/dist/src/tui/components/searchable-select-list.d.ts +30 -3
  499. package/dist/src/tui/components/searchable-select-list.js +82 -10
  500. package/dist/src/tui/components/searchable-select-list.js.map +1 -1
  501. package/dist/src/tui/components/session-selector.d.ts +18 -4
  502. package/dist/src/tui/components/session-selector.js +207 -40
  503. package/dist/src/tui/components/session-selector.js.map +1 -1
  504. package/dist/src/tui/components/settings-selector.d.ts +6 -2
  505. package/dist/src/tui/components/settings-selector.js +126 -7
  506. package/dist/src/tui/components/settings-selector.js.map +1 -1
  507. package/dist/src/tui/components/thinking-selector.d.ts +12 -0
  508. package/dist/src/tui/components/thinking-selector.js +48 -0
  509. package/dist/src/tui/components/thinking-selector.js.map +1 -0
  510. package/dist/src/tui/components/tool-execution.d.ts +57 -3
  511. package/dist/src/tui/components/tool-execution.js +378 -28
  512. package/dist/src/tui/components/tool-execution.js.map +1 -1
  513. package/dist/src/tui/components/tui-bottom-bar.d.ts +9 -1
  514. package/dist/src/tui/components/tui-bottom-bar.js +56 -11
  515. package/dist/src/tui/components/tui-bottom-bar.js.map +1 -1
  516. package/dist/src/tui/components/tui-header.d.ts +9 -2
  517. package/dist/src/tui/components/tui-header.js +25 -5
  518. package/dist/src/tui/components/tui-header.js.map +1 -1
  519. package/dist/src/tui/components/user-message.d.ts +4 -2
  520. package/dist/src/tui/components/user-message.js +42 -9
  521. package/dist/src/tui/components/user-message.js.map +1 -1
  522. package/dist/src/tui/components/visual-truncate.d.ts +11 -0
  523. package/dist/src/tui/components/visual-truncate.js +27 -0
  524. package/dist/src/tui/components/visual-truncate.js.map +1 -0
  525. package/dist/src/tui/extension-host/autocomplete.d.ts +43 -0
  526. package/dist/src/tui/extension-host/autocomplete.js +116 -0
  527. package/dist/src/tui/extension-host/autocomplete.js.map +1 -0
  528. package/dist/src/tui/extension-host/host.d.ts +31 -1
  529. package/dist/src/tui/extension-host/host.js +123 -6
  530. package/dist/src/tui/extension-host/host.js.map +1 -1
  531. package/dist/src/tui/extension-host/load-extensions.d.ts +6 -1
  532. package/dist/src/tui/extension-host/load-extensions.js +4 -3
  533. package/dist/src/tui/extension-host/load-extensions.js.map +1 -1
  534. package/dist/src/tui/extension-host/runtime-context.d.ts +21 -0
  535. package/dist/src/tui/extension-host/runtime-context.js +152 -0
  536. package/dist/src/tui/extension-host/runtime-context.js.map +1 -0
  537. package/dist/src/tui/extension-host/runtime.d.ts +52 -4
  538. package/dist/src/tui/extension-host/runtime.js +547 -85
  539. package/dist/src/tui/extension-host/runtime.js.map +1 -1
  540. package/dist/src/tui/extension-host/surface.d.ts +20 -0
  541. package/dist/src/tui/extension-host/surface.js +30 -6
  542. package/dist/src/tui/extension-host/surface.js.map +1 -1
  543. package/dist/src/tui/extension-host/tool-renderers.d.ts +6 -3
  544. package/dist/src/tui/extension-host/tool-renderers.js +43 -5
  545. package/dist/src/tui/extension-host/tool-renderers.js.map +1 -1
  546. package/dist/src/tui/format-tui-hotkeys.d.ts +12 -2
  547. package/dist/src/tui/format-tui-hotkeys.js +22 -5
  548. package/dist/src/tui/format-tui-hotkeys.js.map +1 -1
  549. package/dist/src/tui/tui-agent-events.d.ts +8 -6
  550. package/dist/src/tui/tui-agent-events.js +200 -59
  551. package/dist/src/tui/tui-agent-events.js.map +1 -1
  552. package/dist/src/tui/tui-backend.d.ts +169 -3
  553. package/dist/src/tui/tui-command-formatters.d.ts +76 -0
  554. package/dist/src/tui/tui-command-formatters.js +594 -0
  555. package/dist/src/tui/tui-command-formatters.js.map +1 -0
  556. package/dist/src/tui/tui-commands.d.ts +57 -7
  557. package/dist/src/tui/tui-commands.js +639 -43
  558. package/dist/src/tui/tui-commands.js.map +1 -1
  559. package/dist/src/tui/tui-context-usage.d.ts +1 -1
  560. package/dist/src/tui/tui-context-usage.js +9 -1
  561. package/dist/src/tui/tui-context-usage.js.map +1 -1
  562. package/dist/src/tui/tui-extension-user-message.d.ts +8 -0
  563. package/dist/src/tui/tui-extension-user-message.js +32 -0
  564. package/dist/src/tui/tui-extension-user-message.js.map +1 -0
  565. package/dist/src/tui/tui-follow-up-queue.d.ts +9 -0
  566. package/dist/src/tui/tui-follow-up-queue.js +18 -0
  567. package/dist/src/tui/tui-follow-up-queue.js.map +1 -0
  568. package/dist/src/tui/tui-local-shell.d.ts +11 -1
  569. package/dist/src/tui/tui-local-shell.js +50 -8
  570. package/dist/src/tui/tui-local-shell.js.map +1 -1
  571. package/dist/src/tui/tui-model-picker.d.ts +26 -0
  572. package/dist/src/tui/tui-model-picker.js +152 -0
  573. package/dist/src/tui/tui-model-picker.js.map +1 -0
  574. package/dist/src/tui/tui-oauth-login.d.ts +16 -0
  575. package/dist/src/tui/tui-oauth-login.js +189 -0
  576. package/dist/src/tui/tui-oauth-login.js.map +1 -0
  577. package/dist/src/tui/tui-overlays.d.ts +3 -3
  578. package/dist/src/tui/tui-overlays.js +6 -7
  579. package/dist/src/tui/tui-overlays.js.map +1 -1
  580. package/dist/src/tui/tui-picker-overlay.d.ts +27 -32
  581. package/dist/src/tui/tui-picker-overlay.js +340 -30
  582. package/dist/src/tui/tui-picker-overlay.js.map +1 -1
  583. package/dist/src/tui/tui-picker-services.d.ts +41 -0
  584. package/dist/src/tui/tui-picker-services.js +1 -0
  585. package/dist/src/tui/tui-run-state.d.ts +11 -0
  586. package/dist/src/tui/tui-run-state.js +114 -0
  587. package/dist/src/tui/tui-run-state.js.map +1 -0
  588. package/dist/src/tui/tui-runtime-hints.d.ts +4 -0
  589. package/dist/src/tui/tui-runtime-hints.js +18 -0
  590. package/dist/src/tui/tui-runtime-hints.js.map +1 -0
  591. package/dist/src/tui/tui-scoped-models.d.ts +1 -1
  592. package/dist/src/tui/tui-scoped-models.js +2 -2
  593. package/dist/src/tui/tui-scoped-models.js.map +1 -1
  594. package/dist/src/tui/tui-session-actions.d.ts +5 -3
  595. package/dist/src/tui/tui-session-actions.js +21 -9
  596. package/dist/src/tui/tui-session-actions.js.map +1 -1
  597. package/dist/src/tui/tui-session-format.d.ts +4 -1
  598. package/dist/src/tui/tui-session-format.js +17 -3
  599. package/dist/src/tui/tui-session-format.js.map +1 -1
  600. package/dist/src/tui/tui-session-snapshot.d.ts +82 -0
  601. package/dist/src/tui/tui-session-snapshot.js +184 -0
  602. package/dist/src/tui/tui-session-snapshot.js.map +1 -0
  603. package/dist/src/tui/tui-session-stats.d.ts +3 -0
  604. package/dist/src/tui/tui-session-stats.js +59 -0
  605. package/dist/src/tui/tui-session-stats.js.map +1 -0
  606. package/dist/src/tui/tui-settings.d.ts +21 -0
  607. package/dist/src/tui/tui-settings.js +28 -1
  608. package/dist/src/tui/tui-settings.js.map +1 -1
  609. package/dist/src/tui/tui-skills-autocomplete.js +1 -1
  610. package/dist/src/tui/tui-skills-autocomplete.js.map +1 -1
  611. package/dist/src/tui/tui-startup-resources.d.ts +3 -0
  612. package/dist/src/tui/tui-startup-resources.js +39 -0
  613. package/dist/src/tui/tui-startup-resources.js.map +1 -0
  614. package/dist/src/tui/tui-startup-text.d.ts +10 -0
  615. package/dist/src/tui/tui-startup-text.js +58 -0
  616. package/dist/src/tui/tui-startup-text.js.map +1 -0
  617. package/dist/src/tui/tui-stdio-filter.d.ts +1 -0
  618. package/dist/src/tui/tui-stdio-filter.js +11 -7
  619. package/dist/src/tui/tui-stdio-filter.js.map +1 -1
  620. package/dist/src/tui/tui-submit.d.ts +2 -0
  621. package/dist/src/tui/tui-submit.js +2 -1
  622. package/dist/src/tui/tui-submit.js.map +1 -1
  623. package/dist/src/tui/tui-tool-diff.js +61 -7
  624. package/dist/src/tui/tui-tool-diff.js.map +1 -1
  625. package/dist/src/tui/tui-tool-result.d.ts +17 -0
  626. package/dist/src/tui/tui-tool-result.js +74 -0
  627. package/dist/src/tui/tui-tool-result.js.map +1 -0
  628. package/dist/src/tui/tui-transcript-tree-picker.d.ts +57 -0
  629. package/dist/src/tui/tui-transcript-tree-picker.js +604 -0
  630. package/dist/src/tui/tui-transcript-tree-picker.js.map +1 -0
  631. package/dist/src/tui/tui-transcript-tree.d.ts +7 -0
  632. package/dist/src/tui/tui-transcript-tree.js +316 -0
  633. package/dist/src/tui/tui-transcript-tree.js.map +1 -0
  634. package/dist/src/tui/tui-types.d.ts +25 -34
  635. package/dist/src/tui/tui-types.js +12 -0
  636. package/dist/src/tui/tui-types.js.map +1 -1
  637. package/dist/src/tui/tui.js +1288 -112
  638. package/dist/src/tui/tui.js.map +1 -1
  639. package/dist/src/tui/xopc-tui-keybindings.d.ts +127 -2
  640. package/dist/src/tui/xopc-tui-keybindings.js +127 -2
  641. package/dist/src/tui/xopc-tui-keybindings.js.map +1 -1
  642. package/dist/src/workflows/domain/definition-utils.d.ts +2 -1
  643. package/dist/src/workflows/domain/definition-utils.js +18 -8
  644. package/dist/src/workflows/domain/definition-utils.js.map +1 -1
  645. package/dist/src/workflows/domain/definition.d.ts +25 -0
  646. package/dist/src/workflows/domain/event.d.ts +1 -0
  647. package/dist/src/workflows/domain/result.d.ts +15 -0
  648. package/dist/src/workflows/domain/run.d.ts +2 -0
  649. package/dist/src/workflows/domain/run.js.map +1 -1
  650. package/dist/src/workflows/engine/projector.js +4 -0
  651. package/dist/src/workflows/engine/projector.js.map +1 -1
  652. package/dist/src/workflows/engine/workflow-engine.d.ts +37 -1
  653. package/dist/src/workflows/engine/workflow-engine.js +75 -11
  654. package/dist/src/workflows/engine/workflow-engine.js.map +1 -1
  655. package/dist/src/workflows/index.d.ts +1 -0
  656. package/dist/src/workflows/index.js +4 -1
  657. package/dist/src/workflows/registry/catalog-workflow-definition-registry.d.ts +9 -0
  658. package/dist/src/workflows/registry/catalog-workflow-definition-registry.js +40 -0
  659. package/dist/src/workflows/registry/catalog-workflow-definition-registry.js.map +1 -0
  660. package/dist/src/workflows/registry/index.d.ts +2 -0
  661. package/dist/src/workflows/registry/index.js +2 -0
  662. package/dist/src/workflows/registry/workflow-definition-registry.d.ts +15 -0
  663. package/dist/src/workflows/registry/workflow-definition-registry.js +1 -0
  664. package/dist/src/workflows/runtime/index.d.ts +2 -0
  665. package/dist/src/workflows/runtime/index.js +2 -1
  666. package/dist/src/workflows/runtime/script-workflow-runtime.d.ts +5 -0
  667. package/dist/src/workflows/runtime/script-workflow-runtime.js +15 -0
  668. package/dist/src/workflows/runtime/script-workflow-runtime.js.map +1 -0
  669. package/dist/src/workflows/runtime/workflow-runtime-port.d.ts +16 -0
  670. package/dist/src/workflows/runtime/workflow-runtime-port.js +1 -0
  671. package/dist/src/workflows/service/run-view-to-snapshot.js +3 -0
  672. package/dist/src/workflows/service/run-view-to-snapshot.js.map +1 -1
  673. package/dist/src/workflows/service/workflow-run-service.d.ts +3 -0
  674. package/dist/src/workflows/service/workflow-run-service.js +10 -15
  675. package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
  676. package/dist/src/workflows/service/workflow-session-bridge.d.ts +1 -1
  677. package/dist/src/workflows/service/workflow-session-bridge.js +4 -1
  678. package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
  679. package/package.json +23 -17
  680. package/skills/creative/frontend-design/SKILL.md +1 -1
  681. package/skills/creative/theme-factory/SKILL.md +1 -1
  682. package/skills/documents/xlsx/SKILL.md +1 -1
  683. package/skills/engineering/diagnose/SKILL.md +2 -2
  684. package/skills/engineering/tdd/SKILL.md +1 -1
  685. package/skills/tools/github/SKILL.md +6 -1
  686. package/skills/tools/webapp-testing/SKILL.md +4 -1
  687. package/dist/extensions/telegram/src/adapters/config-surface.d.ts +0 -2
  688. package/dist/extensions/telegram/src/adapters/config-surface.js +0 -26
  689. package/dist/extensions/telegram/src/adapters/config-surface.js.map +0 -1
  690. package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js +0 -158
  691. package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js.map +0 -1
  692. package/dist/gateway/static/root/assets/agents-BwXkia_W.js +0 -222
  693. package/dist/gateway/static/root/assets/channels-settings-tlOTdaXw.js +0 -1
  694. package/dist/gateway/static/root/assets/channels-status-swr-D4XjqwqC.js +0 -8
  695. package/dist/gateway/static/root/assets/cron-api-DcmfGuj0.js +0 -1
  696. package/dist/gateway/static/root/assets/cron-page-CijJ4G6F.js +0 -1
  697. package/dist/gateway/static/root/assets/extension-settings-page-CyJk_G64.js +0 -1
  698. package/dist/gateway/static/root/assets/field-primitives-C4GpxsDo.js +0 -1
  699. package/dist/gateway/static/root/assets/heartbeat-config-api-CLD0Gpi3.js +0 -1
  700. package/dist/gateway/static/root/assets/index-0HmunJW9.js +0 -4845
  701. package/dist/gateway/static/root/assets/index-Bk75Phrd.css +0 -1
  702. package/dist/gateway/static/root/assets/notes-page-BBnTh0uI.js +0 -1
  703. package/dist/gateway/static/root/assets/sessions-page-B0riYK7j.js +0 -1
  704. package/dist/gateway/static/root/assets/settings-advanced-gate-DiP_WHu_.js +0 -2
  705. package/dist/gateway/static/root/assets/settings-page-1ZPhcCZ9.js +0 -3
  706. package/dist/gateway/static/root/assets/skills-page-BQ1hllKD.js +0 -2
  707. package/dist/gateway/static/root/assets/url-F3_D_6zZ.js +0 -3
  708. package/dist/gateway/static/root/assets/utils-CPr3FBh2.js +0 -1
  709. package/dist/gateway/static/root/assets/voice-api-key-field-BkbDl6dH.js +0 -1
  710. package/dist/gateway/static/root/assets/workflows-page-D059ysoF.js +0 -27
  711. package/dist/src/agent/embedded/map-stream-events.d.ts +0 -9
  712. package/dist/src/agent/embedded/map-stream-events.js +0 -63
  713. package/dist/src/agent/embedded/map-stream-events.js.map +0 -1
  714. package/dist/src/channels/dock.js.map +0 -1
  715. package/dist/src/channels/plugins/bundled.d.ts +0 -11
  716. package/dist/src/channels/plugins/bundled.js +0 -10
  717. package/dist/src/channels/plugins/bundled.js.map +0 -1
  718. package/dist/src/channels/registry.d.ts +0 -25
  719. package/dist/src/channels/registry.js +0 -82
  720. package/dist/src/channels/registry.js.map +0 -1
  721. package/dist/src/config/localized-text.d.ts +0 -6
  722. package/dist/src/config/localized-text.js +0 -42
  723. package/dist/src/config/localized-text.js.map +0 -1
  724. package/dist/src/generated/bundled-channel-plugins.d.ts +0 -10
  725. package/dist/src/generated/bundled-channel-plugins.js +0 -16
  726. package/dist/src/generated/bundled-channel-plugins.js.map +0 -1
  727. package/dist/src/tui/stream-assembler.d.ts +0 -22
  728. package/dist/src/tui/stream-assembler.js +0 -63
  729. package/dist/src/tui/stream-assembler.js.map +0 -1
  730. package/skills/browser/SKILL-zh.md +0 -188
  731. package/skills/business/company-values/SKILL-zh.md +0 -80
  732. package/skills/business/company-values/SKILL.md +0 -80
  733. package/skills/business/find-community/SKILL-zh.md +0 -50
  734. package/skills/business/find-community/SKILL.md +0 -50
  735. package/skills/business/first-customers/SKILL-zh.md +0 -76
  736. package/skills/business/first-customers/SKILL.md +0 -76
  737. package/skills/business/grow-sustainably/SKILL-zh.md +0 -92
  738. package/skills/business/grow-sustainably/SKILL.md +0 -92
  739. package/skills/business/marketing-plan/SKILL-zh.md +0 -100
  740. package/skills/business/marketing-plan/SKILL.md +0 -100
  741. package/skills/business/minimalist-review/SKILL-zh.md +0 -82
  742. package/skills/business/minimalist-review/SKILL.md +0 -82
  743. package/skills/business/mvp/SKILL-zh.md +0 -81
  744. package/skills/business/mvp/SKILL.md +0 -81
  745. package/skills/business/pricing/SKILL-zh.md +0 -64
  746. package/skills/business/pricing/SKILL.md +0 -64
  747. package/skills/business/processize/SKILL-zh.md +0 -91
  748. package/skills/business/processize/SKILL.md +0 -91
  749. package/skills/business/validate-idea/SKILL-zh.md +0 -68
  750. package/skills/business/validate-idea/SKILL.md +0 -68
  751. package/skills/creative/algorithmic-art/LICENSE.txt +0 -202
  752. package/skills/creative/algorithmic-art/SKILL-zh.md +0 -405
  753. package/skills/creative/algorithmic-art/SKILL.md +0 -405
  754. package/skills/creative/algorithmic-art/templates/generator_template.js +0 -223
  755. package/skills/creative/algorithmic-art/templates/viewer.html +0 -599
  756. package/skills/creative/frontend-design/SKILL-zh.md +0 -42
  757. package/skills/creative/theme-factory/SKILL-zh.md +0 -59
  758. package/skills/creative/web-artifacts-builder/LICENSE.txt +0 -202
  759. package/skills/creative/web-artifacts-builder/SKILL-zh.md +0 -74
  760. package/skills/creative/web-artifacts-builder/SKILL.md +0 -74
  761. package/skills/creative/web-artifacts-builder/scripts/bundle-artifact.sh +0 -54
  762. package/skills/creative/web-artifacts-builder/scripts/init-artifact.sh +0 -322
  763. package/skills/creative/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
  764. package/skills/documents/doc-coauthoring/SKILL-zh.md +0 -375
  765. package/skills/documents/doc-coauthoring/SKILL.md +0 -375
  766. package/skills/documents/docx/LICENSE.txt +0 -30
  767. package/skills/documents/docx/SKILL-zh.md +0 -590
  768. package/skills/documents/docx/SKILL.md +0 -590
  769. package/skills/documents/docx/scripts/__init__.py +0 -1
  770. package/skills/documents/docx/scripts/accept_changes.py +0 -135
  771. package/skills/documents/docx/scripts/comment.py +0 -318
  772. package/skills/documents/docx/scripts/office/helpers/__init__.py +0 -0
  773. package/skills/documents/docx/scripts/office/helpers/merge_runs.py +0 -199
  774. package/skills/documents/docx/scripts/office/helpers/simplify_redlines.py +0 -197
  775. package/skills/documents/docx/scripts/office/pack.py +0 -159
  776. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
  777. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
  778. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
  779. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
  780. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
  781. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
  782. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
  783. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
  784. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
  785. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
  786. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
  787. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
  788. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
  789. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
  790. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
  791. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
  792. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
  793. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
  794. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
  795. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
  796. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
  797. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
  798. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
  799. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
  800. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
  801. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
  802. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
  803. package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
  804. package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
  805. package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
  806. package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
  807. package/skills/documents/docx/scripts/office/schemas/mce/mc.xsd +0 -75
  808. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-2010.xsd +0 -560
  809. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-2012.xsd +0 -67
  810. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-2018.xsd +0 -14
  811. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -20
  812. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -13
  813. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
  814. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -8
  815. package/skills/documents/docx/scripts/office/soffice.py +0 -183
  816. package/skills/documents/docx/scripts/office/unpack.py +0 -132
  817. package/skills/documents/docx/scripts/office/validate.py +0 -111
  818. package/skills/documents/docx/scripts/office/validators/__init__.py +0 -15
  819. package/skills/documents/docx/scripts/office/validators/base.py +0 -847
  820. package/skills/documents/docx/scripts/office/validators/docx.py +0 -446
  821. package/skills/documents/docx/scripts/office/validators/pptx.py +0 -275
  822. package/skills/documents/docx/scripts/office/validators/redlining.py +0 -247
  823. package/skills/documents/docx/scripts/templates/comments.xml +0 -3
  824. package/skills/documents/docx/scripts/templates/commentsExtended.xml +0 -3
  825. package/skills/documents/docx/scripts/templates/commentsExtensible.xml +0 -3
  826. package/skills/documents/docx/scripts/templates/commentsIds.xml +0 -3
  827. package/skills/documents/docx/scripts/templates/people.xml +0 -3
  828. package/skills/documents/pdf/LICENSE.txt +0 -30
  829. package/skills/documents/pdf/SKILL-zh.md +0 -314
  830. package/skills/documents/pdf/SKILL.md +0 -314
  831. package/skills/documents/pdf/forms.md +0 -294
  832. package/skills/documents/pdf/reference.md +0 -612
  833. package/skills/documents/pdf/scripts/check_bounding_boxes.py +0 -65
  834. package/skills/documents/pdf/scripts/check_fillable_fields.py +0 -11
  835. package/skills/documents/pdf/scripts/convert_pdf_to_images.py +0 -33
  836. package/skills/documents/pdf/scripts/create_validation_image.py +0 -37
  837. package/skills/documents/pdf/scripts/extract_form_field_info.py +0 -122
  838. package/skills/documents/pdf/scripts/extract_form_structure.py +0 -115
  839. package/skills/documents/pdf/scripts/fill_fillable_fields.py +0 -98
  840. package/skills/documents/pdf/scripts/fill_pdf_form_with_annotations.py +0 -107
  841. package/skills/documents/pptx/LICENSE.txt +0 -30
  842. package/skills/documents/pptx/SKILL-zh.md +0 -232
  843. package/skills/documents/pptx/SKILL.md +0 -232
  844. package/skills/documents/pptx/editing.md +0 -205
  845. package/skills/documents/pptx/pptxgenjs.md +0 -420
  846. package/skills/documents/pptx/scripts/__init__.py +0 -0
  847. package/skills/documents/pptx/scripts/add_slide.py +0 -195
  848. package/skills/documents/pptx/scripts/clean.py +0 -286
  849. package/skills/documents/pptx/scripts/office/helpers/__init__.py +0 -0
  850. package/skills/documents/pptx/scripts/office/helpers/merge_runs.py +0 -199
  851. package/skills/documents/pptx/scripts/office/helpers/simplify_redlines.py +0 -197
  852. package/skills/documents/pptx/scripts/office/pack.py +0 -159
  853. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
  854. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
  855. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
  856. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
  857. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
  858. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
  859. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
  860. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
  861. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
  862. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
  863. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
  864. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
  865. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
  866. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
  867. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
  868. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
  869. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
  870. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
  871. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
  872. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
  873. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
  874. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
  875. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
  876. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
  877. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
  878. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
  879. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
  880. package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
  881. package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
  882. package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
  883. package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
  884. package/skills/documents/pptx/scripts/office/schemas/mce/mc.xsd +0 -75
  885. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-2010.xsd +0 -560
  886. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-2012.xsd +0 -67
  887. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-2018.xsd +0 -14
  888. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -20
  889. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -13
  890. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
  891. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -8
  892. package/skills/documents/pptx/scripts/office/soffice.py +0 -183
  893. package/skills/documents/pptx/scripts/office/unpack.py +0 -132
  894. package/skills/documents/pptx/scripts/office/validate.py +0 -111
  895. package/skills/documents/pptx/scripts/office/validators/__init__.py +0 -15
  896. package/skills/documents/pptx/scripts/office/validators/base.py +0 -847
  897. package/skills/documents/pptx/scripts/office/validators/docx.py +0 -446
  898. package/skills/documents/pptx/scripts/office/validators/pptx.py +0 -275
  899. package/skills/documents/pptx/scripts/office/validators/redlining.py +0 -247
  900. package/skills/documents/pptx/scripts/thumbnail.py +0 -289
  901. package/skills/documents/xlsx/SKILL-zh.md +0 -292
  902. package/skills/engineering/diagnose/SKILL-zh.md +0 -117
  903. package/skills/engineering/grill-with-docs/ADR-FORMAT.md +0 -47
  904. package/skills/engineering/grill-with-docs/CONTEXT-FORMAT.md +0 -77
  905. package/skills/engineering/grill-with-docs/SKILL-zh.md +0 -88
  906. package/skills/engineering/grill-with-docs/SKILL.md +0 -88
  907. package/skills/engineering/improve-codebase-architecture/DEEPENING.md +0 -37
  908. package/skills/engineering/improve-codebase-architecture/INTERFACE-DESIGN.md +0 -44
  909. package/skills/engineering/improve-codebase-architecture/LANGUAGE.md +0 -53
  910. package/skills/engineering/improve-codebase-architecture/SKILL-zh.md +0 -71
  911. package/skills/engineering/improve-codebase-architecture/SKILL.md +0 -71
  912. package/skills/engineering/tdd/SKILL-zh.md +0 -109
  913. package/skills/engineering/to-issues/SKILL-zh.md +0 -81
  914. package/skills/engineering/to-issues/SKILL.md +0 -81
  915. package/skills/engineering/to-prd/SKILL-zh.md +0 -76
  916. package/skills/engineering/to-prd/SKILL.md +0 -74
  917. package/skills/engineering/zoom-out/SKILL-zh.md +0 -7
  918. package/skills/engineering/zoom-out/SKILL.md +0 -7
  919. package/skills/tools/find-skills/SKILL-zh.md +0 -440
  920. package/skills/tools/github/SKILL-zh.md +0 -48
  921. package/skills/tools/internal-comms/LICENSE.txt +0 -202
  922. package/skills/tools/internal-comms/SKILL-zh.md +0 -32
  923. package/skills/tools/internal-comms/SKILL.md +0 -32
  924. package/skills/tools/internal-comms/examples/3p-updates.md +0 -47
  925. package/skills/tools/internal-comms/examples/company-newsletter.md +0 -65
  926. package/skills/tools/internal-comms/examples/faq-answers.md +0 -30
  927. package/skills/tools/internal-comms/examples/general-comms.md +0 -16
  928. package/skills/tools/skill-creator/LICENSE.txt +0 -202
  929. package/skills/tools/skill-creator/SKILL-zh.md +0 -483
  930. package/skills/tools/skill-creator/SKILL.md +0 -485
  931. package/skills/tools/skill-creator/agents/analyzer.md +0 -274
  932. package/skills/tools/skill-creator/agents/comparator.md +0 -202
  933. package/skills/tools/skill-creator/agents/grader.md +0 -223
  934. package/skills/tools/skill-creator/assets/eval_review.html +0 -146
  935. package/skills/tools/skill-creator/eval-viewer/generate_review.py +0 -471
  936. package/skills/tools/skill-creator/eval-viewer/viewer.html +0 -1325
  937. package/skills/tools/skill-creator/references/schemas.md +0 -430
  938. package/skills/tools/skill-creator/scripts/__init__.py +0 -0
  939. package/skills/tools/skill-creator/scripts/aggregate_benchmark.py +0 -401
  940. package/skills/tools/skill-creator/scripts/generate_report.py +0 -326
  941. package/skills/tools/skill-creator/scripts/improve_description.py +0 -247
  942. package/skills/tools/skill-creator/scripts/package_skill.py +0 -136
  943. package/skills/tools/skill-creator/scripts/quick_validate.py +0 -103
  944. package/skills/tools/skill-creator/scripts/run_eval.py +0 -310
  945. package/skills/tools/skill-creator/scripts/run_loop.py +0 -328
  946. package/skills/tools/skill-creator/scripts/utils.py +0 -47
  947. package/skills/tools/summarize/SKILL-zh.md +0 -47
  948. package/skills/tools/weather/SKILL-zh.md +0 -46
  949. package/skills/tools/weather/SKILL.md +0 -46
  950. package/skills/tools/webapp-testing/SKILL-zh.md +0 -96
@@ -1,24 +1,18 @@
1
+ import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
1
2
  import { createLogger } from "../utils/logger/index.js";
2
3
  import { init_logger } from "../utils/logger.js";
3
4
  import { init_agent_scope, resolveDefaultAgentId } from "../agent/agent-scope.js";
4
5
  import { init_paths, resolveBundledExtensionsDir, resolveExtensionsDir, resolveWorkspaceExtensionsDir } from "../config/paths.js";
5
- import { init_loader, loadConfig } from "../config/loader.js";
6
- import { normalizeExtensionManifest } from "./normalize-manifest.js";
6
+ import { init_normalize_manifest, normalizeExtensionManifest } from "./normalize-manifest.js";
7
7
  import { join } from "path";
8
8
  import { existsSync, readFileSync, readdirSync } from "fs";
9
9
  //#region src/extensions/discover-extensions.ts
10
10
  /**
11
11
  * Filesystem-only extension discovery (manifest parse, no module load).
12
12
  */
13
- init_agent_scope();
14
- init_loader();
15
- init_paths();
16
- init_logger();
17
13
  function asSchemaConfig(config) {
18
14
  return config;
19
15
  }
20
- const EXTENSION_MANIFEST_FILE = "xopc.extension.json";
21
- const log = createLogger("ExtensionDiscover");
22
16
  function isRecord(x) {
23
17
  return typeof x === "object" && x !== null && !Array.isArray(x);
24
18
  }
@@ -118,12 +112,12 @@ function discoverInDirectory(dir, source, discovered) {
118
112
  }
119
113
  }
120
114
  function resolveDiscoveryPaths(options, config) {
121
- const cfg = asSchemaConfig(config ?? loadConfig());
122
- const aid = resolveDefaultAgentId(cfg);
115
+ const cfg = config ? asSchemaConfig(config) : null;
116
+ const aid = cfg ? resolveDefaultAgentId(cfg) : null;
123
117
  return {
124
118
  bundledDir: resolveBundledExtensionsDir(),
125
119
  globalDir: options.extensionsDir ?? resolveExtensionsDir(),
126
- workspaceExtensionsDir: options.workspaceExtensionsDir ?? resolveWorkspaceExtensionsDir(cfg, aid)
120
+ workspaceExtensionsDir: options.workspaceExtensionsDir ?? (cfg && aid ? resolveWorkspaceExtensionsDir(cfg, aid) : null)
127
121
  };
128
122
  }
129
123
  /**
@@ -134,7 +128,7 @@ function discoverExtensionsFromDisk(options = {}, config) {
134
128
  const paths = resolveDiscoveryPaths(options, config);
135
129
  if (paths.bundledDir) discoverInDirectory(paths.bundledDir, "bundled", discovered);
136
130
  discoverInDirectory(paths.globalDir, "global", discovered);
137
- discoverInDirectory(paths.workspaceExtensionsDir, "workspace", discovered);
131
+ if (paths.workspaceExtensionsDir) discoverInDirectory(paths.workspaceExtensionsDir, "workspace", discovered);
138
132
  return Array.from(discovered.values());
139
133
  }
140
134
  /** True when extension discovery/load should be skipped entirely. */
@@ -142,7 +136,17 @@ function areExtensionsGloballyDisabled(config) {
142
136
  if (process.env.XOPC_SKIP_EXTENSIONS === "1" || process.env.XOPC_SKIP_EXTENSIONS === "true") return true;
143
137
  return (config && isRecord(config) && isRecord(config.extensions) ? config.extensions : void 0)?.enabled === false;
144
138
  }
139
+ var EXTENSION_MANIFEST_FILE, log;
140
+ var init_discover_extensions = __esmMin((() => {
141
+ init_agent_scope();
142
+ init_paths();
143
+ init_logger();
144
+ init_normalize_manifest();
145
+ EXTENSION_MANIFEST_FILE = "xopc.extension.json";
146
+ log = createLogger("ExtensionDiscover");
147
+ }));
145
148
  //#endregion
146
- export { areExtensionsGloballyDisabled, discoverExtensionsFromDisk };
149
+ init_discover_extensions();
150
+ export { areExtensionsGloballyDisabled, discoverExtensionsFromDisk, init_discover_extensions };
147
151
 
148
152
  //# sourceMappingURL=discover-extensions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"discover-extensions.js","names":[],"sources":["../../../src/extensions/discover-extensions.ts"],"sourcesContent":["/**\n * Filesystem-only extension discovery (manifest parse, no module load).\n */\n\nimport { existsSync, readdirSync, readFileSync } from 'fs';\nimport { join } from 'path';\n\nimport { resolveDefaultAgentId } from '../agent/agent-scope.js';\nimport { loadConfig } from '../config/loader.js';\nimport type { Config } from '../config/schema.js';\nimport {\n resolveBundledExtensionsDir,\n resolveExtensionsDir,\n resolveWorkspaceExtensionsDir,\n} from '../config/paths.js';\nimport { createLogger } from '../utils/logger.js';\nimport { normalizeExtensionManifest } from './normalize-manifest.js';\nimport type { ExtensionManifest } from './types/manifest.js';\nimport type { DiscoveredExtension } from './types/loader.js';\n\n/** App config slice used for discovery (any loaded config shape). */\nexport type DiscoverConfig = Record<string, unknown>;\n\nfunction asSchemaConfig(config: DiscoverConfig): Config {\n return config as Config;\n}\n\nconst EXTENSION_MANIFEST_FILE = 'xopc.extension.json';\n\nconst log = createLogger('ExtensionDiscover');\n\nexport type ExtensionSourceOrigin = 'workspace' | 'global' | 'bundled' | 'config';\n\nexport interface ExtensionLoaderOptions {\n workspaceDir?: string;\n extensionsDir?: string;\n workspaceExtensionsDir?: string;\n bundledExtensions?: string[];\n}\n\nfunction isRecord(x: unknown): x is Record<string, unknown> {\n return typeof x === 'object' && x !== null && !Array.isArray(x);\n}\n\nfunction loadManifest(extensionPath: string): ExtensionManifest | null {\n const manifestPath = join(extensionPath, EXTENSION_MANIFEST_FILE);\n\n if (existsSync(manifestPath)) {\n try {\n const raw = JSON.parse(readFileSync(manifestPath, 'utf-8'));\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {\n log.error({ manifestPath }, 'Manifest root must be a JSON object');\n return null;\n }\n return normalizeExtensionManifest(raw as Record<string, unknown>);\n } catch (error) {\n log.error({ err: error, manifestPath }, 'Failed to parse manifest');\n return null;\n }\n }\n\n const packagePath = join(extensionPath, 'package.json');\n if (existsSync(packagePath)) {\n try {\n const packageJson = JSON.parse(readFileSync(packagePath, 'utf-8'));\n\n if (packageJson.xopc?.extension) {\n const xopcConfig = packageJson.xopc;\n return normalizeExtensionManifest({\n id: xopcConfig.id || packageJson.name,\n name: xopcConfig.name || packageJson.name,\n description: xopcConfig.description || packageJson.description,\n version: xopcConfig.version || packageJson.version || '1.0.0',\n kind: xopcConfig.kind || 'utility',\n main: xopcConfig.main || packageJson.main || 'index.js',\n configSchema: xopcConfig.configSchema,\n });\n }\n\n if (packageJson.name?.startsWith('xopc-extension-')) {\n const id = packageJson.name.replace('xopc-extension-', '');\n return normalizeExtensionManifest({\n id,\n name: packageJson.name,\n description: packageJson.description,\n version: packageJson.version || '1.0.0',\n kind: 'utility',\n main: packageJson.main || 'index.js',\n });\n }\n } catch (error) {\n log.error({ err: error, packagePath }, 'Failed to parse package.json');\n }\n }\n\n return null;\n}\n\nfunction discoverInDirectory(\n dir: string,\n source: ExtensionSourceOrigin,\n discovered: Map<string, DiscoveredExtension>,\n): void {\n if (!existsSync(dir)) {\n return;\n }\n\n let entries: string[];\n try {\n entries = readdirSync(dir);\n } catch {\n return;\n }\n\n for (const entry of entries) {\n const extensionPath = join(dir, entry);\n\n try {\n if (!existsSync(extensionPath)) continue;\n } catch {\n continue;\n }\n\n const manifest = loadManifest(extensionPath);\n if (!manifest) continue;\n\n const extensionId = manifest.id || entry;\n\n const existing = discovered.get(extensionId);\n if (existing) {\n const priority = { workspace: 3, global: 2, bundled: 1, config: 0 };\n if (priority[source] <= priority[existing.source]) {\n log.debug(\n { extensionId, from: source, existing: existing.source },\n 'Skipping lower priority extension',\n );\n continue;\n }\n log.info(\n { extensionId, from: source, overriding: existing.source },\n 'Extension override by higher priority source',\n );\n }\n\n discovered.set(extensionId, {\n id: extensionId,\n path: extensionPath,\n source,\n manifest,\n });\n }\n}\n\nfunction resolveDiscoveryPaths(\n options: ExtensionLoaderOptions,\n config?: DiscoverConfig,\n): {\n bundledDir: string | null;\n globalDir: string;\n workspaceExtensionsDir: string;\n} {\n const cfg = asSchemaConfig(config ?? loadConfig());\n const aid = resolveDefaultAgentId(cfg);\n\n return {\n bundledDir: resolveBundledExtensionsDir(),\n globalDir: options.extensionsDir ?? resolveExtensionsDir(),\n workspaceExtensionsDir:\n options.workspaceExtensionsDir ??\n resolveWorkspaceExtensionsDir(cfg, aid),\n };\n}\n\n/**\n * Discover extensions from workspace, global, and bundled tiers without loading code.\n */\nexport function discoverExtensionsFromDisk(\n options: ExtensionLoaderOptions = {},\n config?: DiscoverConfig,\n): DiscoveredExtension[] {\n const discovered = new Map<string, DiscoveredExtension>();\n const paths = resolveDiscoveryPaths(options, config);\n\n if (paths.bundledDir) {\n discoverInDirectory(paths.bundledDir, 'bundled', discovered);\n }\n\n discoverInDirectory(paths.globalDir, 'global', discovered);\n discoverInDirectory(paths.workspaceExtensionsDir, 'workspace', discovered);\n\n return Array.from(discovered.values());\n}\n\n/** True when extension discovery/load should be skipped entirely. */\nexport function areExtensionsGloballyDisabled(config?: DiscoverConfig): boolean {\n if (\n process.env.XOPC_SKIP_EXTENSIONS === '1' ||\n process.env.XOPC_SKIP_EXTENSIONS === 'true'\n ) {\n return true;\n }\n\n const ext =\n config && isRecord(config) && isRecord((config as Record<string, unknown>).extensions)\n ? ((config as Record<string, unknown>).extensions as Record<string, unknown>)\n : undefined;\n\n return ext?.enabled === false;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"discover-extensions.js","names":[],"sources":["../../../src/extensions/discover-extensions.ts"],"sourcesContent":["/**\n * Filesystem-only extension discovery (manifest parse, no module load).\n */\n\nimport { existsSync, readdirSync, readFileSync } from 'fs';\nimport { join } from 'path';\n\nimport { resolveDefaultAgentId } from '../agent/agent-scope.js';\nimport type { Config } from '../config/schema.js';\nimport {\n resolveBundledExtensionsDir,\n resolveExtensionsDir,\n resolveWorkspaceExtensionsDir,\n} from '../config/paths.js';\nimport { createLogger } from '../utils/logger.js';\nimport { normalizeExtensionManifest } from './normalize-manifest.js';\nimport type { ExtensionManifest } from './types/manifest.js';\nimport type { DiscoveredExtension } from './types/loader.js';\n\n/** App config slice used for discovery (any loaded config shape). */\nexport type DiscoverConfig = Record<string, unknown>;\n\nfunction asSchemaConfig(config: DiscoverConfig): Config {\n return config as Config;\n}\n\nconst EXTENSION_MANIFEST_FILE = 'xopc.extension.json';\n\nconst log = createLogger('ExtensionDiscover');\n\nexport type ExtensionSourceOrigin = 'workspace' | 'global' | 'bundled' | 'config';\n\nexport interface ExtensionLoaderOptions {\n workspaceDir?: string;\n extensionsDir?: string;\n workspaceExtensionsDir?: string;\n bundledExtensions?: string[];\n}\n\nfunction isRecord(x: unknown): x is Record<string, unknown> {\n return typeof x === 'object' && x !== null && !Array.isArray(x);\n}\n\nfunction loadManifest(extensionPath: string): ExtensionManifest | null {\n const manifestPath = join(extensionPath, EXTENSION_MANIFEST_FILE);\n\n if (existsSync(manifestPath)) {\n try {\n const raw = JSON.parse(readFileSync(manifestPath, 'utf-8'));\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {\n log.error({ manifestPath }, 'Manifest root must be a JSON object');\n return null;\n }\n return normalizeExtensionManifest(raw as Record<string, unknown>);\n } catch (error) {\n log.error({ err: error, manifestPath }, 'Failed to parse manifest');\n return null;\n }\n }\n\n const packagePath = join(extensionPath, 'package.json');\n if (existsSync(packagePath)) {\n try {\n const packageJson = JSON.parse(readFileSync(packagePath, 'utf-8'));\n\n if (packageJson.xopc?.extension) {\n const xopcConfig = packageJson.xopc;\n return normalizeExtensionManifest({\n id: xopcConfig.id || packageJson.name,\n name: xopcConfig.name || packageJson.name,\n description: xopcConfig.description || packageJson.description,\n version: xopcConfig.version || packageJson.version || '1.0.0',\n kind: xopcConfig.kind || 'utility',\n main: xopcConfig.main || packageJson.main || 'index.js',\n configSchema: xopcConfig.configSchema,\n });\n }\n\n if (packageJson.name?.startsWith('xopc-extension-')) {\n const id = packageJson.name.replace('xopc-extension-', '');\n return normalizeExtensionManifest({\n id,\n name: packageJson.name,\n description: packageJson.description,\n version: packageJson.version || '1.0.0',\n kind: 'utility',\n main: packageJson.main || 'index.js',\n });\n }\n } catch (error) {\n log.error({ err: error, packagePath }, 'Failed to parse package.json');\n }\n }\n\n return null;\n}\n\nfunction discoverInDirectory(\n dir: string,\n source: ExtensionSourceOrigin,\n discovered: Map<string, DiscoveredExtension>,\n): void {\n if (!existsSync(dir)) {\n return;\n }\n\n let entries: string[];\n try {\n entries = readdirSync(dir);\n } catch {\n return;\n }\n\n for (const entry of entries) {\n const extensionPath = join(dir, entry);\n\n try {\n if (!existsSync(extensionPath)) continue;\n } catch {\n continue;\n }\n\n const manifest = loadManifest(extensionPath);\n if (!manifest) continue;\n\n const extensionId = manifest.id || entry;\n\n const existing = discovered.get(extensionId);\n if (existing) {\n const priority = { workspace: 3, global: 2, bundled: 1, config: 0 };\n if (priority[source] <= priority[existing.source]) {\n log.debug(\n { extensionId, from: source, existing: existing.source },\n 'Skipping lower priority extension',\n );\n continue;\n }\n log.info(\n { extensionId, from: source, overriding: existing.source },\n 'Extension override by higher priority source',\n );\n }\n\n discovered.set(extensionId, {\n id: extensionId,\n path: extensionPath,\n source,\n manifest,\n });\n }\n}\n\nfunction resolveDiscoveryPaths(\n options: ExtensionLoaderOptions,\n config?: DiscoverConfig,\n): {\n bundledDir: string | null;\n globalDir: string;\n workspaceExtensionsDir: string | null;\n} {\n const cfg = config ? asSchemaConfig(config) : null;\n const aid = cfg ? resolveDefaultAgentId(cfg) : null;\n\n return {\n bundledDir: resolveBundledExtensionsDir(),\n globalDir: options.extensionsDir ?? resolveExtensionsDir(),\n workspaceExtensionsDir:\n options.workspaceExtensionsDir ??\n (cfg && aid ? resolveWorkspaceExtensionsDir(cfg, aid) : null),\n };\n}\n\n/**\n * Discover extensions from workspace, global, and bundled tiers without loading code.\n */\nexport function discoverExtensionsFromDisk(\n options: ExtensionLoaderOptions = {},\n config?: DiscoverConfig,\n): DiscoveredExtension[] {\n const discovered = new Map<string, DiscoveredExtension>();\n const paths = resolveDiscoveryPaths(options, config);\n\n if (paths.bundledDir) {\n discoverInDirectory(paths.bundledDir, 'bundled', discovered);\n }\n\n discoverInDirectory(paths.globalDir, 'global', discovered);\n if (paths.workspaceExtensionsDir) {\n discoverInDirectory(paths.workspaceExtensionsDir, 'workspace', discovered);\n }\n\n return Array.from(discovered.values());\n}\n\n/** True when extension discovery/load should be skipped entirely. */\nexport function areExtensionsGloballyDisabled(config?: DiscoverConfig): boolean {\n if (\n process.env.XOPC_SKIP_EXTENSIONS === '1' ||\n process.env.XOPC_SKIP_EXTENSIONS === 'true'\n ) {\n return true;\n }\n\n const ext =\n config && isRecord(config) && isRecord((config as Record<string, unknown>).extensions)\n ? ((config as Record<string, unknown>).extensions as Record<string, unknown>)\n : undefined;\n\n return ext?.enabled === false;\n}\n"],"mappings":"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"}
@@ -1,10 +1,9 @@
1
+ import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
1
2
  import { init_agent_scope, resolveAgentWorkspaceDir, resolveDefaultAgentId } from "../agent/agent-scope.js";
2
3
  import { init_paths, resolveExtensionsDir, resolveWorkspaceExtensionsDir } from "../config/paths.js";
3
- import { discoverExtensionsFromDisk } from "./discover-extensions.js";
4
- import { ManifestRegistry } from "./manifest-registry.js";
4
+ import { discoverExtensionsFromDisk, init_discover_extensions } from "./discover-extensions.js";
5
+ import { ManifestRegistry, init_manifest_registry } from "./manifest-registry.js";
5
6
  //#region src/extensions/extension-metadata-snapshot.ts
6
- init_agent_scope();
7
- init_paths();
8
7
  /**
9
8
  * Scan extension directories once and build a manifest registry snapshot.
10
9
  * Pass the result to {@link ExtensionLoader.setManifestSnapshot} to avoid rediscovery.
@@ -28,7 +27,14 @@ function resolveExtensionLoaderOptionsFromConfig(config) {
28
27
  workspaceExtensionsDir: resolveWorkspaceExtensionsDir(cfg, aid)
29
28
  };
30
29
  }
30
+ var init_extension_metadata_snapshot = __esmMin((() => {
31
+ init_agent_scope();
32
+ init_paths();
33
+ init_discover_extensions();
34
+ init_manifest_registry();
35
+ }));
31
36
  //#endregion
32
- export { buildExtensionMetadataSnapshot, resolveExtensionLoaderOptionsFromConfig };
37
+ init_extension_metadata_snapshot();
38
+ export { buildExtensionMetadataSnapshot, init_extension_metadata_snapshot, resolveExtensionLoaderOptionsFromConfig };
33
39
 
34
40
  //# sourceMappingURL=extension-metadata-snapshot.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"extension-metadata-snapshot.js","names":[],"sources":["../../../src/extensions/extension-metadata-snapshot.ts"],"sourcesContent":["/**\n * One-shot extension manifest discovery for config load + gateway bootstrap reuse.\n */\n\nimport { resolveDefaultAgentId } from '../agent/agent-scope.js';\nimport type { Config } from '../config/schema.js';\nimport {\n resolveAgentWorkspaceDir,\n resolveExtensionsDir,\n resolveWorkspaceExtensionsDir,\n} from '../config/paths.js';\nimport {\n discoverExtensionsFromDisk,\n type DiscoverConfig,\n type ExtensionLoaderOptions,\n} from './discover-extensions.js';\nimport { ManifestRegistry } from './manifest-registry.js';\nimport type { DiscoveredExtension } from './types/loader.js';\n\nexport interface ExtensionMetadataSnapshot {\n discovered: DiscoveredExtension[];\n manifestRegistry: ManifestRegistry;\n}\n\n/**\n * Scan extension directories once and build a manifest registry snapshot.\n * Pass the result to {@link ExtensionLoader.setManifestSnapshot} to avoid rediscovery.\n */\nexport function buildExtensionMetadataSnapshot(\n options: ExtensionLoaderOptions,\n config?: DiscoverConfig,\n): ExtensionMetadataSnapshot {\n const discovered = discoverExtensionsFromDisk(options, config);\n return {\n discovered,\n manifestRegistry: ManifestRegistry.fromDiscovered(discovered),\n };\n}\n\n/**\n * Resolve loader options from app config when caller omits workspace paths.\n */\nexport function resolveExtensionLoaderOptionsFromConfig(\n config: DiscoverConfig,\n): ExtensionLoaderOptions {\n const cfg = config as Config;\n const aid = resolveDefaultAgentId(cfg);\n return {\n workspaceDir: resolveAgentWorkspaceDir(cfg, aid),\n extensionsDir: resolveExtensionsDir(),\n workspaceExtensionsDir: resolveWorkspaceExtensionsDir(cfg, aid),\n };\n}\n"],"mappings":";;;;;kBAIgE;YAMpC;;;;;AAkB5B,SAAgB,+BACd,SACA,QAC2B;CAC3B,MAAM,aAAa,2BAA2B,SAAS,OAAO;AAC9D,QAAO;EACL;EACA,kBAAkB,iBAAiB,eAAe,WAAW;EAC9D;;;;;AAMH,SAAgB,wCACd,QACwB;CACxB,MAAM,MAAM;CACZ,MAAM,MAAM,sBAAsB,IAAI;AACtC,QAAO;EACL,cAAc,yBAAyB,KAAK,IAAI;EAChD,eAAe,sBAAsB;EACrC,wBAAwB,8BAA8B,KAAK,IAAI;EAChE"}
1
+ {"version":3,"file":"extension-metadata-snapshot.js","names":[],"sources":["../../../src/extensions/extension-metadata-snapshot.ts"],"sourcesContent":["/**\n * One-shot extension manifest discovery for config load + gateway bootstrap reuse.\n */\n\nimport { resolveDefaultAgentId } from '../agent/agent-scope.js';\nimport type { Config } from '../config/schema.js';\nimport {\n resolveAgentWorkspaceDir,\n resolveExtensionsDir,\n resolveWorkspaceExtensionsDir,\n} from '../config/paths.js';\nimport {\n discoverExtensionsFromDisk,\n type DiscoverConfig,\n type ExtensionLoaderOptions,\n} from './discover-extensions.js';\nimport { ManifestRegistry } from './manifest-registry.js';\nimport type { DiscoveredExtension } from './types/loader.js';\n\nexport interface ExtensionMetadataSnapshot {\n discovered: DiscoveredExtension[];\n manifestRegistry: ManifestRegistry;\n}\n\n/**\n * Scan extension directories once and build a manifest registry snapshot.\n * Pass the result to {@link ExtensionLoader.setManifestSnapshot} to avoid rediscovery.\n */\nexport function buildExtensionMetadataSnapshot(\n options: ExtensionLoaderOptions,\n config?: DiscoverConfig,\n): ExtensionMetadataSnapshot {\n const discovered = discoverExtensionsFromDisk(options, config);\n return {\n discovered,\n manifestRegistry: ManifestRegistry.fromDiscovered(discovered),\n };\n}\n\n/**\n * Resolve loader options from app config when caller omits workspace paths.\n */\nexport function resolveExtensionLoaderOptionsFromConfig(\n config: DiscoverConfig,\n): ExtensionLoaderOptions {\n const cfg = config as Config;\n const aid = resolveDefaultAgentId(cfg);\n return {\n workspaceDir: resolveAgentWorkspaceDir(cfg, aid),\n extensionsDir: resolveExtensionsDir(),\n workspaceExtensionsDir: resolveWorkspaceExtensionsDir(cfg, aid),\n };\n}\n"],"mappings":";;;;;;;;;;AA4BA,SAAgB,+BACd,SACA,QAC2B;CAC3B,MAAM,aAAa,2BAA2B,SAAS,OAAO;AAC9D,QAAO;EACL;EACA,kBAAkB,iBAAiB,eAAe,WAAW;EAC9D;;;;;AAMH,SAAgB,wCACd,QACwB;CACxB,MAAM,MAAM;CACZ,MAAM,MAAM,sBAAsB,IAAI;AACtC,QAAO;EACL,cAAc,yBAAyB,KAAK,IAAI;EAChD,eAAe,sBAAsB;EACrC,wBAAwB,8BAA8B,KAAK,IAAI;EAChE;;;mBA/C6D;aAMpC;2BAKM;yBACwB"}
@@ -1,14 +1,22 @@
1
+ import { init_normalize_manifest, normalizeExtensionManifest } from "./normalize-manifest.js";
2
+ import { areExtensionsGloballyDisabled, discoverExtensionsFromDisk, init_discover_extensions } from "./discover-extensions.js";
3
+ import { ManifestRegistry, init_manifest_registry } from "./manifest-registry.js";
4
+ import { buildExtensionMetadataSnapshot, init_extension_metadata_snapshot, resolveExtensionLoaderOptionsFromConfig } from "./extension-metadata-snapshot.js";
1
5
  import { HOOK_EXECUTION_MODES } from "./types/hooks.js";
2
6
  import { BUILTIN_PROVIDERS } from "./types/providers.js";
3
7
  import { ExtensionRegistryImpl } from "./extension-registry-impl.js";
4
8
  import { ExtensionApiImpl, createExtensionLogger, createPathResolver } from "./api.js";
5
9
  import { ActivationPlanner } from "./activation-planner.js";
6
10
  import { collectConfiguredChannelIds, collectConfiguredProviderIds, mergeActivationContext } from "./activation-context.js";
7
- import { normalizeExtensionManifest } from "./normalize-manifest.js";
8
- import { areExtensionsGloballyDisabled, discoverExtensionsFromDisk } from "./discover-extensions.js";
9
- import { ManifestRegistry } from "./manifest-registry.js";
10
11
  import { ExtensionLoader, normalizeExtensionConfig, resolveExtensionPath } from "./loader.js";
11
12
  import { listOnboardChannels, listOnboardProviders, resolveProviderForModel } from "./onboard-helpers.js";
12
- import { buildExtensionMetadataSnapshot, resolveExtensionLoaderOptionsFromConfig } from "./extension-metadata-snapshot.js";
13
13
  import { ExtensionHookRunner, createHookContext, isHookEvent } from "./hooks.js";
14
+ //#region src/extensions/index.ts
15
+ init_manifest_registry();
16
+ init_normalize_manifest();
17
+ init_extension_metadata_snapshot();
18
+ init_discover_extensions();
19
+ //#endregion
14
20
  export { ActivationPlanner, BUILTIN_PROVIDERS, ExtensionApiImpl, ExtensionHookRunner, ExtensionLoader, ExtensionRegistryImpl, HOOK_EXECUTION_MODES, ManifestRegistry, areExtensionsGloballyDisabled, buildExtensionMetadataSnapshot, collectConfiguredChannelIds, collectConfiguredProviderIds, createExtensionLogger, createHookContext, createPathResolver, discoverExtensionsFromDisk, isHookEvent, listOnboardChannels, listOnboardProviders, mergeActivationContext, normalizeExtensionConfig, normalizeExtensionManifest, resolveExtensionLoaderOptionsFromConfig, resolveExtensionPath, resolveProviderForModel };
21
+
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/extensions/index.ts"],"sourcesContent":["/**\n * xopc Extension System\n * \n * @module extensions\n */\n\n// Core Types\nexport * from './types/index.js';\n\n// Extension API\nexport { ExtensionApiImpl, createExtensionLogger, createPathResolver } from './api.js';\n\n// Extension Loader and Registry\nexport { ExtensionRegistryImpl, ExtensionLoader, normalizeExtensionConfig, resolveExtensionPath, areExtensionsGloballyDisabled } from './loader.js';\nexport type { ActivationPlanLoadOptions } from './loader.js';\nexport type { ExtensionRegistry } from './types/core.js';\n\n// Manifest-first control plane\nexport { ManifestRegistry, type ManifestRegistryEntry } from './manifest-registry.js';\nexport {\n ActivationPlanner,\n type ActivationContext,\n type ActivationDecision,\n type ActivationReason,\n type ActivationLoadPhase,\n} from './activation-planner.js';\nexport {\n mergeActivationContext,\n collectConfiguredChannelIds,\n collectConfiguredProviderIds,\n} from './activation-context.js';\nexport {\n listOnboardProviders,\n listOnboardChannels,\n resolveProviderForModel,\n type OnboardProviderInfo,\n type OnboardChannelInfo,\n} from './onboard-helpers.js';\nexport { normalizeExtensionManifest } from './normalize-manifest.js';\nexport {\n buildExtensionMetadataSnapshot,\n resolveExtensionLoaderOptionsFromConfig,\n type ExtensionMetadataSnapshot,\n} from './extension-metadata-snapshot.js';\nexport {\n discoverExtensionsFromDisk,\n type ExtensionLoaderOptions,\n type ExtensionSourceOrigin,\n} from './discover-extensions.js';\n\n// Hook System\nexport { ExtensionHookRunner, createHookContext, isHookEvent } from './hooks.js';\n"],"mappings":";;;;;;;;;;;;;;wBAkBsF;yBAoBjB;kCAK3B;0BAKR"}
@@ -76,9 +76,13 @@ export declare class ExtensionLoader {
76
76
  * Inject MessageBus and optional SessionManager for ExtensionApi.runtime (Gateway).
77
77
  */
78
78
  setRuntimeContext(ctx: {
79
- bus: MessageBus;
79
+ bus?: MessageBus;
80
80
  sessionManager?: SessionIndex;
81
81
  scheduleWebchatContinuation?: (sessionKey: string, message: string) => void;
82
+ setLabel?: (entryId: string, label: string | undefined) => void;
83
+ sendUserMessage?: import('./types/index.js').ExtensionRuntime['sendUserMessage'];
84
+ appendEntry?: import('./types/index.js').ExtensionRuntime['appendEntry'];
85
+ sendMessage?: import('./types/index.js').ExtensionRuntime['sendMessage'];
82
86
  }): void;
83
87
  getRegistry(): ExtensionRegistryImpl;
84
88
  /**
@@ -3,18 +3,16 @@ import { createLogger, createServiceLogger } from "../utils/logger/index.js";
3
3
  import { init_logger } from "../utils/logger.js";
4
4
  import { init_agent_scope, resolveAgentWorkspaceDir, resolveDefaultAgentId } from "../agent/agent-scope.js";
5
5
  import { init_paths, resolveBundledExtensionsDir, resolveExtensionSdkPath, resolveExtensionsDir, resolveWorkspaceExtensionsDir } from "../config/paths.js";
6
+ import { init_normalize_manifest, normalizeExtensionManifest } from "./normalize-manifest.js";
7
+ import { areExtensionsGloballyDisabled, discoverExtensionsFromDisk, init_discover_extensions } from "./discover-extensions.js";
8
+ import { ManifestRegistry, init_manifest_registry } from "./manifest-registry.js";
6
9
  import { init_loader, loadConfig } from "../config/loader.js";
7
10
  import { getProviderRegistry, init_plugin_registry } from "../providers/plugin-registry.js";
8
11
  import { ExtensionRegistryImpl } from "./extension-registry-impl.js";
9
12
  import { ExtensionApiImpl, createExtensionLogger, createPathResolver } from "./api.js";
10
13
  import { ActivationPlanner } from "./activation-planner.js";
11
14
  import { mergeActivationContext } from "./activation-context.js";
12
- import { normalizeExtensionManifest } from "./normalize-manifest.js";
13
- import { areExtensionsGloballyDisabled, discoverExtensionsFromDisk } from "./discover-extensions.js";
14
- import { ManifestRegistry } from "./manifest-registry.js";
15
15
  import { checkEngineCompatibility } from "./engine-check.js";
16
- import { bundledChannelPlugins } from "../generated/bundled-channel-plugins.js";
17
- import "../channels/plugins/bundled.js";
18
16
  import { validateSpeechProviderContracts } from "./speech-provider-contracts.js";
19
17
  import { validateMediaUnderstandingProviderContracts } from "./media-provider-contracts.js";
20
18
  import { DEFAULT_SECURITY_CONFIG, checkExtensionPathSafety, isExtensionAllowed, logSecurityIssue, provenanceTracker } from "./security.js";
@@ -37,6 +35,9 @@ import { createJiti } from "jiti";
37
35
  init_agent_scope();
38
36
  init_loader();
39
37
  init_paths();
38
+ init_discover_extensions();
39
+ init_manifest_registry();
40
+ init_normalize_manifest();
40
41
  init_package_version();
41
42
  init_logger();
42
43
  init_plugin_registry();
@@ -73,7 +74,6 @@ var ExtensionLoader = class {
73
74
  manifestSnapshot = null;
74
75
  constructor(options) {
75
76
  this.registry = new ExtensionRegistryImpl();
76
- for (const p of bundledChannelPlugins) this.registry.addChannelPlugin(p);
77
77
  this.options = options || (() => {
78
78
  const c = loadConfig();
79
79
  const aid = resolveDefaultAgentId(c);
@@ -447,10 +447,7 @@ var ExtensionLoader = class {
447
447
  "memory": "memory",
448
448
  "tts": "tts",
449
449
  "speech-provider": "tts",
450
- "image-generation": "imageGeneration",
451
- "imageGeneration": "imageGeneration",
452
- "web-search": "webSearch",
453
- "webSearch": "webSearch"
450
+ "web-search": "webSearch"
454
451
  }[manifest.kind];
455
452
  if (!slotKey) return true;
456
453
  const preferredPlugin = this.slotsConfig[slotKey];
@@ -566,7 +563,11 @@ var ExtensionLoader = class {
566
563
  bus: this._runtimeContext.bus,
567
564
  log: logger,
568
565
  sessionManager: this._runtimeContext.sessionManager,
569
- scheduleWebchatContinuation: this._runtimeContext.scheduleWebchatContinuation
566
+ scheduleWebchatContinuation: this._runtimeContext.scheduleWebchatContinuation,
567
+ setLabel: this._runtimeContext.setLabel,
568
+ sendUserMessage: this._runtimeContext.sendUserMessage,
569
+ appendEntry: this._runtimeContext.appendEntry,
570
+ sendMessage: this._runtimeContext.sendMessage
570
571
  } : this._appConfig ? {
571
572
  config: this._appConfig,
572
573
  log: logger
@@ -1 +1 @@
1
- {"version":3,"file":"loader.js","names":["apiImpl"],"sources":["../../../src/extensions/loader.ts"],"sourcesContent":["/**\n * Extension Loader and Registry\n * \n * Supports three-tier extension storage:\n * 1. Workspace level (workspace/.extensions/) - highest priority\n * 2. Global level (~/.xopc/extensions/) - shared across workspaces\n * 3. Bundled level (xopc/extensions/) - shipped with xopc\n */\n\nimport { existsSync, readFileSync } from 'fs';\nimport { join, dirname, isAbsolute } from 'path';\nimport { fileURLToPath } from 'node:url';\nimport { createRequire } from 'node:module';\nimport { createJiti } from 'jiti';\nimport { resolveDefaultAgentId } from '../agent/agent-scope.js';\nimport { loadConfig } from '../config/loader.js';\nimport {\n resolveAgentWorkspaceDir,\n resolveExtensionsDir,\n resolveWorkspaceExtensionsDir,\n resolveBundledExtensionsDir,\n resolveExtensionSdkPath,\n} from '../config/paths.js';\nimport type { Config } from '../config/config-surface.js';\nimport type { MessageBus } from '../infra/bus/index.js';\nimport type { SessionIndex } from '../session/manager.js';\nimport type { AgentTool } from '@earendil-works/pi-agent-core';\nimport type {\n ExtensionApi,\n ExtensionModule,\n ExtensionManifest,\n ResolvedExtensionConfig,\n DiscoveredExtension,\n} from './types/index.js';\nimport type { ActivationContext } from './activation-planner.js';\nimport { ActivationPlanner, type ActivationLoadPhase } from './activation-planner.js';\nimport { mergeActivationContext } from './activation-context.js';\nimport {\n areExtensionsGloballyDisabled,\n discoverExtensionsFromDisk,\n type DiscoverConfig,\n type ExtensionLoaderOptions,\n} from './discover-extensions.js';\nimport type { ExtensionMetadataSnapshot } from './extension-metadata-snapshot.js';\nimport { ManifestRegistry } from './manifest-registry.js';\nimport { normalizeExtensionManifest } from './normalize-manifest.js';\nimport { checkEngineCompatibility } from './engine-check.js';\nimport { PACKAGE_VERSION } from '../package-version.js';\nimport { bundledChannelPlugins } from '../channels/plugins/bundled.js';\nimport { ExtensionApiImpl, createExtensionLogger, createPathResolver } from './api.js';\nimport { validateSpeechProviderContracts } from './speech-provider-contracts.js';\nimport { validateMediaUnderstandingProviderContracts } from './media-provider-contracts.js';\nimport { createLogger, createServiceLogger } from '../utils/logger.js';\n\n// Security imports\nimport {\n checkExtensionPathSafety,\n isExtensionAllowed,\n provenanceTracker,\n logSecurityIssue,\n DEFAULT_SECURITY_CONFIG,\n type SecurityConfig,\n // Note: ExtensionSourceOrigin is defined locally in this file\n} from './security.js';\n\n// Provider imports\nimport { getProviderRegistry, type ProviderPluginRegistry } from '../providers/plugin-registry.js';\n\n// Slot imports\nimport {\n getSlotRegistry,\n type SlotRegistry,\n type SlotKey,\n} from './slots.js';\n\n// Diagnostics imports\nimport {\n getExtensionCache,\n getExtensionDiagnostics,\n type ExtensionLoaderCache,\n type ExtensionDiagnostics,\n} from './diagnostics.js';\n\nconst EXTENSION_MANIFEST_FILE = 'xopc.extension.json';\n\nconst log = createLogger('ExtensionLoader');\n\nconst DEFAULT_EXTENSION_LOAD_CONCURRENCY = 4;\n\nasync function mapWithConcurrency<T>(\n items: readonly T[],\n concurrency: number,\n fn: (item: T) => Promise<void>,\n): Promise<void> {\n if (items.length === 0) {\n return;\n }\n const queue = [...items];\n const workerCount = Math.min(Math.max(1, concurrency), queue.length);\n await Promise.all(\n Array.from({ length: workerCount }, async () => {\n while (queue.length > 0) {\n const item = queue.shift();\n if (item === undefined) {\n break;\n }\n await fn(item);\n }\n }),\n );\n}\n\nexport type { ExtensionLoaderOptions, ExtensionSourceOrigin } from './discover-extensions.js';\nexport { areExtensionsGloballyDisabled } from './discover-extensions.js';\n\n// ============================================================================\n// Extension Registry\n// ============================================================================\n\n// `ExtensionRegistryImpl` moved to `./extension-registry-impl.ts` so `api.ts`\n// can use the class without going through loader.ts (which imports back from\n// api.ts and formed a circular cycle). Re-exported here for backward-compat.\nexport { ExtensionRegistryImpl } from './extension-registry-impl.js';\nimport { ExtensionRegistryImpl } from './extension-registry-impl.js';\n\n// ============================================================================\n// Extension Loader\n// ============================================================================\n\nexport interface ActivationPlanLoadOptions extends Partial<ActivationContext> {\n phase?: ActivationLoadPhase | 'all';\n}\n\nexport class ExtensionLoader {\n private registry: ExtensionRegistryImpl;\n private options: ExtensionLoaderOptions;\n private extensionInstances: Map<string, ExtensionApi> = new Map();\n private jiti: ReturnType<typeof createJiti>;\n private _appConfig?: Config;\n private _runtimeContext?: {\n bus: MessageBus;\n sessionManager?: SessionIndex;\n scheduleWebchatContinuation?: (sessionKey: string, message: string) => void;\n };\n \n // Security\n private securityConfig: SecurityConfig;\n \n // Provider Registry\n private providerRegistry: ProviderPluginRegistry;\n \n // Slot Registry & Config\n private slotRegistry: SlotRegistry;\n private slotsConfig: Partial<Record<SlotKey, string>> = {};\n \n // Cache and Diagnostics\n private cache: ExtensionLoaderCache;\n private diagnostics: ExtensionDiagnostics;\n\n /** Manifest-only registry cache (no runtime module load). */\n private manifestRegistry: ManifestRegistry | null = null;\n private manifestSnapshot: ExtensionMetadataSnapshot | null = null;\n\n constructor(options?: ExtensionLoaderOptions) {\n this.registry = new ExtensionRegistryImpl();\n for (const p of bundledChannelPlugins) {\n this.registry.addChannelPlugin(p);\n }\n this.options = options || (() => {\n const c = loadConfig();\n const aid = resolveDefaultAgentId(c);\n return {\n workspaceDir: resolveAgentWorkspaceDir(c, aid),\n extensionsDir: resolveWorkspaceExtensionsDir(c, aid),\n };\n })();\n\n // Initialize security config\n this.securityConfig = DEFAULT_SECURITY_CONFIG;\n \n // Initialize provider registry\n this.providerRegistry = getProviderRegistry();\n \n // Initialize slot registry\n this.slotRegistry = getSlotRegistry();\n \n // Initialize cache and diagnostics \n this.cache = getExtensionCache();\n this.diagnostics = getExtensionDiagnostics();\n\n // Build jiti alias for extension-sdk (+ subpath entry points)\n const alias: Record<string, string> = {};\n const sdkPath = resolveExtensionSdkPath();\n if (sdkPath) {\n alias['xopc/extension-sdk'] = sdkPath;\n const sdkDir = dirname(sdkPath);\n alias['xopc/extension-sdk/core'] = join(sdkDir, 'core.ts');\n alias['xopc/extension-sdk/lazy'] = join(sdkDir, 'lazy.ts');\n alias['xopc/extension-sdk/provider'] = join(sdkDir, 'provider.ts');\n alias['xopc/extension-sdk/channel'] = join(sdkDir, 'channel.ts');\n alias['xopc/extension-sdk/hooks'] = join(sdkDir, 'hooks.ts');\n alias['xopc/extension-sdk/tools'] = join(sdkDir, 'tools.ts');\n alias['xopc/extension-sdk/testing'] = join(sdkDir, 'testing.ts');\n alias['xopc/extension-sdk/speech'] = join(sdkDir, 'speech.ts');\n alias['xopc/extension-sdk/media'] = join(sdkDir, 'media.ts');\n }\n\n // Initialize jiti with TypeScript support and SDK alias\n this.jiti = createJiti(fileURLToPath(import.meta.url), {\n interopDefault: true,\n extensions: ['.ts', '.tsx', '.mts', '.cts', '.js', '.mjs', '.cjs', '.json'],\n alias,\n });\n }\n\n /**\n * Reuse a pre-built metadata snapshot (avoids duplicate filesystem discovery).\n */\n setManifestSnapshot(snapshot: ExtensionMetadataSnapshot | null): void {\n this.manifestSnapshot = snapshot;\n this.manifestRegistry = snapshot?.manifestRegistry ?? null;\n }\n\n getManifestSnapshot(): ExtensionMetadataSnapshot | null {\n return this.manifestSnapshot;\n }\n\n /**\n * Set security configuration \n */\n setSecurityConfig(config: Partial<SecurityConfig>): void {\n this.securityConfig = { ...this.securityConfig, ...config };\n }\n\n /**\n * Get security configuration \n */\n getSecurityConfig(): SecurityConfig {\n return this.securityConfig;\n }\n\n /**\n * Get provider registry \n */\n getProviderRegistry(): ProviderPluginRegistry {\n return this.providerRegistry;\n }\n\n /**\n * Get slot registry \n */\n getSlotRegistry(): SlotRegistry {\n return this.slotRegistry;\n }\n\n /**\n * Get diagnostics \n */\n getDiagnostics(): ExtensionDiagnostics {\n return this.diagnostics;\n }\n\n /**\n * Set configuration from main Config object \n */\n setConfig(config: Config): void {\n this._appConfig = config;\n // Wire slot config\n const slots = (config.extensions as any)?.slots || {};\n this.slotsConfig = {\n memory: slots.memory,\n tts: slots.tts,\n imageGeneration: slots.imageGeneration,\n webSearch: slots.webSearch,\n };\n\n // Wire security config\n const security = (config.extensions as any)?.security;\n if (security) {\n this.securityConfig = {\n checkPermissions: security.checkPermissions ?? true,\n allowUntrusted: security.allowUntrusted ?? false,\n allow: security.allow ?? [],\n trackProvenance: security.trackProvenance ?? true,\n allowPromptInjection: security.allowPromptInjection ?? false,\n };\n }\n }\n\n /**\n * Inject MessageBus and optional SessionManager for ExtensionApi.runtime (Gateway).\n */\n setRuntimeContext(ctx: {\n bus: MessageBus;\n sessionManager?: SessionIndex;\n scheduleWebchatContinuation?: (sessionKey: string, message: string) => void;\n }): void {\n this._runtimeContext = ctx;\n // ExtensionApi snapshots `runtime` at construction and is tied to this loader's registry.\n // CLI startup loads extensions with `{ bus }` first; a global cache hit would reuse that\n // api for the gateway loader (no sessionManager, wrong registry) — breaks extensions that need SessionManager.\n this.cache.invalidate();\n }\n\n getRegistry(): ExtensionRegistryImpl {\n return this.registry;\n }\n\n /**\n * Phase 1: build manifest registry (filesystem manifests only, no extension code load).\n */\n buildManifestRegistry(): ManifestRegistry {\n if (this.manifestRegistry) {\n return this.manifestRegistry;\n }\n const discovered = this.discoverExtensions();\n this.manifestRegistry = ManifestRegistry.fromDiscovered(discovered);\n return this.manifestRegistry;\n }\n\n /**\n * Phase 2: activation planner over the manifest registry (pure logic).\n */\n planActivation(_context?: Partial<ActivationContext>): ActivationPlanner {\n return new ActivationPlanner(this.buildManifestRegistry());\n }\n\n /**\n * Phase 3: load only extensions selected by the activation plan.\n */\n async loadByActivationPlan(context?: ActivationPlanLoadOptions): Promise<void> {\n if (areExtensionsGloballyDisabled(this._appConfig as DiscoverConfig | undefined)) {\n log.debug('Extension loading skipped (extensions globally disabled)');\n return;\n }\n\n const registry = this.buildManifestRegistry();\n const planner = new ActivationPlanner(registry);\n const fullContext = mergeActivationContext(this._appConfig, context);\n let activatedIds = planner.getActivatedIds(fullContext).sort((a, b) => a.localeCompare(b));\n\n const phase = context?.phase ?? 'all';\n if (phase === 'startup' || phase === 'deferred') {\n activatedIds = planner.filterActivatedIdsByLoadPhase(activatedIds, phase);\n }\n\n const concurrency = Number.parseInt(\n process.env.XOPC_EXTENSION_LOAD_CONCURRENCY ?? '',\n 10,\n );\n const loadConcurrency = Number.isFinite(concurrency) && concurrency > 0\n ? concurrency\n : DEFAULT_EXTENSION_LOAD_CONCURRENCY;\n\n await mapWithConcurrency(activatedIds, loadConcurrency, async (extensionId) => {\n if (this.extensionInstances.has(extensionId)) {\n return;\n }\n const entry = registry.getEntry(extensionId);\n if (!entry) {\n log.debug(\n { extensionId },\n 'Activation plan references extension id that was not discovered on disk',\n );\n return;\n }\n\n const config: ResolvedExtensionConfig = {\n id: extensionId,\n name: entry.manifest.name || extensionId,\n source: entry.source,\n path: entry.path,\n enabled: true,\n config: this.resolveExtensionConfig(extensionId),\n };\n\n await this.loadExtension(config);\n });\n }\n\n getManifestRegistry(): ManifestRegistry {\n return this.buildManifestRegistry();\n }\n\n invalidateManifestCache(): void {\n this.manifestRegistry = this.manifestSnapshot?.manifestRegistry ?? null;\n }\n\n private resolveExtensionConfig(extensionId: string): Record<string, unknown> {\n if (!this._appConfig) return {};\n const extensionsConfig = (this._appConfig as Record<string, unknown>).extensions as\n | Record<string, unknown>\n | undefined;\n if (!extensionsConfig || typeof extensionsConfig !== 'object') return {};\n const raw = extensionsConfig[extensionId];\n if (raw && typeof raw === 'object' && !Array.isArray(raw)) {\n return raw as Record<string, unknown>;\n }\n return {};\n }\n\n /**\n * Discover extensions from all three tiers:\n * 1. Workspace (.extensions/) - highest priority\n * 2. Global (~/.xopc/extensions/) - shared\n * 3. Bundled (xopc/extensions/) - lowest priority\n */\n discoverExtensions(): DiscoveredExtension[] {\n if (this.manifestSnapshot) {\n return this.manifestSnapshot.discovered;\n }\n return discoverExtensionsFromDisk(this.options, this._appConfig as DiscoverConfig | undefined);\n }\n\n /**\n * Load all discovered extensions\n */\n async loadAllExtensions(enabledIds?: string[]): Promise<void> {\n const extensions = this.discoverExtensions();\n\n for (const extension of extensions) {\n // If enabledIds specified, only load those\n if (enabledIds && !enabledIds.includes(extension.id)) {\n continue;\n }\n\n const config: ResolvedExtensionConfig = {\n id: extension.id,\n name: extension.manifest.name || extension.id,\n source: extension.source,\n path: extension.path,\n enabled: true,\n config: {},\n };\n\n await this.loadExtension(config);\n }\n }\n\n async loadExtensions(configs: ResolvedExtensionConfig[]): Promise<void> {\n for (const extensionConfig of configs) {\n if (extensionConfig.enabled) {\n await this.loadExtension(extensionConfig);\n }\n }\n }\n\n async loadExtension(config: ResolvedExtensionConfig): Promise<ExtensionApi | null> {\n try {\n // Check cache first\n const cacheKey = this.cache.buildKey(this.options, [config.id]);\n const cached = this.cache.get<ExtensionApi>(cacheKey);\n if (cached) {\n log.debug({ extensionId: config.id }, 'Extension loaded from cache');\n return cached;\n }\n\n // Check if already loaded\n if (this.extensionInstances.has(config.id)) {\n return this.extensionInstances.get(config.id)!;\n }\n\n // Resolve extension path using resolveExtensionPath\n let extensionPath: string | null;\n if (isAbsolute(config.path)) {\n extensionPath = config.path;\n } else {\n // Try to resolve extension ID to actual path\n extensionPath = resolveExtensionPath(config.path, this.options) ||\n resolveExtensionPath(config.id, this.options);\n }\n \n if (!extensionPath) {\n log.error({ extensionId: config.id, path: config.path }, `Could not resolve extension path`);\n this.diagnostics.error(config.id, `Could not resolve extension path: ${config.path}`);\n return null;\n }\n\n log.debug({ extensionId: config.id, extensionPath }, 'Resolved extension path');\n\n // Security check\n const source = config.source || 'bundled';\n const safetyResult = checkExtensionPathSafety(extensionPath, extensionPath, source);\n \n if (!safetyResult.safe) {\n logSecurityIssue(config.id, safetyResult);\n \n if (this.securityConfig.checkPermissions && source !== 'bundled') {\n // Check allowlist\n if (!isExtensionAllowed(config.id, this.securityConfig)) {\n this.diagnostics.error(config.id, `Extension not allowed: ${safetyResult.detail}`);\n log.error({ extensionId: config.id, reason: safetyResult.reason }, 'Extension blocked by security policy');\n return null;\n }\n }\n }\n\n // Track provenance \n provenanceTracker.track(config.id, source);\n\n const manifest = this.loadManifest(extensionPath);\n if (!manifest) {\n log.error({ extensionId: config.id, extensionPath }, `Failed to load manifest for extension`);\n this.diagnostics.error(config.id, `Failed to load manifest`);\n return null;\n }\n\n if (manifest.engines?.xopc) {\n const range = manifest.engines.xopc;\n const engineResult = checkEngineCompatibility(PACKAGE_VERSION, range);\n if (engineResult.parseWarning) {\n log.warn(\n { extensionId: config.id, range, reason: engineResult.reason },\n 'Engine range parse warning — loading anyway',\n );\n } else if (!engineResult.compatible) {\n log.warn(\n { extensionId: config.id, range, currentVersion: PACKAGE_VERSION },\n 'Extension engine requirement not met (engines.xopc) — skipping load',\n );\n this.diagnostics.error(\n config.id,\n engineResult.reason ?? 'Incompatible xopc version (engines.xopc)',\n );\n return null;\n }\n }\n\n // Validate extension config against schema (basic validation)\n if (manifest.configSchema) {\n try {\n const schema = manifest.configSchema as Record<string, unknown>;\n const extensionConfig = config.config as Record<string, unknown>;\n \n // Basic validation: check required fields and types\n if (schema.type === 'object' && schema.properties) {\n const props = schema.properties as Record<string, Record<string, unknown>>;\n const required = (schema.required as string[]) || [];\n \n for (const field of required) {\n if (extensionConfig[field] === undefined) {\n log.error({ \n extensionId: config.id, \n field \n }, 'Extension config validation failed: missing required field');\n return null;\n }\n }\n \n for (const [key, value] of Object.entries(extensionConfig)) {\n const propSchema = props[key];\n if (propSchema) {\n if (propSchema.type && !this.validateType(value, propSchema.type as string)) {\n log.error({ \n extensionId: config.id, \n field: key,\n expected: propSchema.type,\n actual: typeof value\n }, 'Extension config validation failed: type mismatch');\n return null;\n }\n }\n }\n }\n \n log.debug({ extensionId: config.id }, 'Extension config validated');\n } catch (err) {\n log.warn({ err, extensionId: config.id }, 'Config schema validation skipped');\n }\n }\n\n // Create extension API\n const extensionDir = dirname(extensionPath);\n const api = this.createExtensionApi(manifest, config, extensionDir);\n\n // Load extension module\n const module = await this.loadModule(extensionPath, manifest);\n if (!module) {\n log.error({ extensionId: config.id }, `Failed to load module for extension`);\n this.diagnostics.error(config.id, `Failed to load module`);\n return null;\n }\n\n // Check and claim slots\n const slotClaimed = this.claimExtensionSlots(config.id, manifest);\n if (!slotClaimed) {\n log.warn({ extensionId: config.id }, 'Failed to claim required slots');\n }\n\n // Initialize extension\n await this.initializeExtension(module, api, manifest);\n\n validateSpeechProviderContracts({\n extensionId: config.id,\n manifest,\n registeredProviderIds: (api as ExtensionApiImpl).getRegisteredSpeechProviderIds(),\n logger: api.logger,\n });\n\n validateMediaUnderstandingProviderContracts({\n extensionId: config.id,\n manifest,\n registeredProviderIds: (api as ExtensionApiImpl).getRegisteredMediaUnderstandingProviderIds(),\n logger: api.logger,\n });\n\n // Register to registry\n this.registry.addExtension({\n id: config.id,\n name: manifest.name,\n version: manifest.version,\n path: extensionPath,\n module,\n config: config.config,\n enabled: true,\n source: config.source,\n });\n\n // Register extension tools to registry (so AgentManager can access them)\n // Note: api is actually ExtensionApiImpl at runtime\n const apiImpl = api as unknown as { _getTools: () => Map<string, AgentTool> };\n const extensionTools = apiImpl._getTools();\n for (const tool of extensionTools.values()) {\n this.registry.addTool(tool);\n }\n\n this.extensionInstances.set(config.id, api);\n \n // Cache the loaded extension\n this.cache.set(cacheKey, api);\n\n this.diagnostics.info(config.id, `Loaded extension: ${manifest.name}`);\n log.info({ name: manifest.name, id: manifest.id, source: config.source }, `Loaded extension`);\n\n return api;\n } catch (error) {\n log.error({ err: error, extensionId: config.id }, `Error loading extension`);\n this.diagnostics.error(config.id, `Error loading extension: ${error}`);\n return null;\n }\n }\n\n /**\n * Claim extension slots based on manifest kind\n * Respects configured preferred plugin from config.extensions.slots\n */\n private claimExtensionSlots(extensionId: string, manifest: ExtensionManifest): boolean {\n const kind = manifest.kind as string;\n \n // Map extension kind to slot\n const slotMap: Record<string, SlotKey> = {\n 'memory': 'memory',\n 'tts': 'tts',\n 'speech-provider': 'tts',\n 'image-generation': 'imageGeneration',\n 'imageGeneration': 'imageGeneration',\n 'web-search': 'webSearch',\n 'webSearch': 'webSearch',\n };\n \n const slotKey = slotMap[kind];\n if (!slotKey) {\n return true; // No slot required\n }\n \n // Check if slot is reserved for a different plugin in config\n const preferredPlugin = this.slotsConfig[slotKey];\n if (preferredPlugin && preferredPlugin !== extensionId) {\n log.info(\n { extensionId, slotKey, preferredPlugin },\n `Skipping slot claim: slot \"${slotKey}\" is reserved for \"${preferredPlugin}\"`\n );\n this.diagnostics.info(\n extensionId,\n `Slot \"${slotKey}\" is reserved for \"${preferredPlugin}\", skipping claim`\n );\n return false;\n }\n \n const claimed = this.slotRegistry.claim(slotKey, extensionId, null);\n if (!claimed) {\n this.diagnostics.warn(extensionId, `Slot \"${slotKey}\" already claimed by another extension`);\n }\n return claimed;\n }\n\n loadManifest(extensionPath: string): ExtensionManifest | null {\n const manifestPath = join(extensionPath, EXTENSION_MANIFEST_FILE);\n\n // First try to load xopc.extension.json\n if (existsSync(manifestPath)) {\n try {\n const raw = JSON.parse(readFileSync(manifestPath, 'utf-8'));\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {\n log.error({ manifestPath }, 'Manifest root must be a JSON object');\n return null;\n }\n return normalizeExtensionManifest(raw as Record<string, unknown>);\n } catch (error) {\n log.error({ err: error, manifestPath }, `Failed to parse manifest`);\n return null;\n }\n }\n\n // Fallback to package.json\n const packagePath = join(extensionPath, 'package.json');\n if (existsSync(packagePath)) {\n try {\n const packageJson = JSON.parse(readFileSync(packagePath, 'utf-8'));\n \n // Check for xopc.extension marker\n if (packageJson.xopc?.extension) {\n const xopcConfig = packageJson.xopc;\n return normalizeExtensionManifest({\n id: xopcConfig.id || packageJson.name,\n name: xopcConfig.name || packageJson.name,\n description: xopcConfig.description || packageJson.description,\n version: xopcConfig.version || packageJson.version || '1.0.0',\n kind: xopcConfig.kind || 'utility',\n main: xopcConfig.main || packageJson.main || 'index.js',\n configSchema: xopcConfig.configSchema,\n });\n }\n\n // Also support xopc-extension-* naming convention\n if (packageJson.name?.startsWith('xopc-extension-')) {\n const id = packageJson.name.replace('xopc-extension-', '');\n return normalizeExtensionManifest({\n id,\n name: packageJson.name,\n description: packageJson.description,\n version: packageJson.version || '1.0.0',\n kind: 'utility',\n main: packageJson.main || 'index.js',\n });\n }\n } catch (error) {\n log.error({ err: error, packagePath }, `Failed to parse package.json`);\n }\n }\n\n return null;\n }\n\n /**\n * Build candidate extension entry paths. After `tsdown`, manifests may still\n * point at `*.ts` while the shipped tree only contains the emitted `*.js`.\n */\n private moduleEntryCandidates(manifest: ExtensionManifest): string[] {\n const raw = [\n manifest.main,\n 'index.ts',\n 'index.js',\n 'extension.ts',\n 'extension.js',\n ].filter(Boolean) as string[];\n\n const out: string[] = [];\n for (const entry of raw) {\n out.push(entry);\n if (entry.endsWith('.tsx')) {\n out.push(`${entry.slice(0, -4)}.js`);\n } else if (entry.endsWith('.ts')) {\n out.push(`${entry.slice(0, -3)}.js`);\n } else if (entry.endsWith('.mts')) {\n out.push(`${entry.slice(0, -4)}.mjs`);\n } else if (entry.endsWith('.cts')) {\n out.push(`${entry.slice(0, -4)}.cjs`);\n }\n }\n return [...new Set(out)];\n }\n\n private async loadModule(\n extensionPath: string,\n manifest: ExtensionManifest,\n ): Promise<ExtensionModule | null> {\n const entryPoints = this.moduleEntryCandidates(manifest);\n\n for (const entry of entryPoints) {\n const fullPath = isAbsolute(entry) ? entry : join(extensionPath, entry);\n\n if (existsSync(fullPath)) {\n try {\n if (/\\.(js|mjs|cjs)$/.test(fullPath)) {\n const require = createRequire(import.meta.url);\n const mod = require(fullPath);\n return mod.default || mod;\n }\n const mod = this.jiti(fullPath);\n return mod.default || mod;\n } catch (error) {\n log.warn({ err: error, path: fullPath }, `Failed to load module`);\n }\n }\n }\n\n return null;\n }\n\n private createExtensionApi(\n manifest: ExtensionManifest,\n resolved: ResolvedExtensionConfig,\n extensionDir: string,\n ): ExtensionApi {\n const logger = createExtensionLogger(`[${manifest.id}]`);\n const resolvePath = createPathResolver(extensionDir, this.options.workspaceDir || '');\n\n const appConfig = this._appConfig ?? ({} as Config);\n const extensionOnly = (resolved.config ?? {}) as Record<string, unknown>;\n\n const runtime =\n this._appConfig && this._runtimeContext\n ? {\n config: this._appConfig,\n bus: this._runtimeContext.bus,\n log: logger,\n sessionManager: this._runtimeContext.sessionManager,\n scheduleWebchatContinuation: this._runtimeContext.scheduleWebchatContinuation,\n }\n : this._appConfig\n ? {\n config: this._appConfig,\n log: logger,\n }\n : undefined;\n\n const api = new ExtensionApiImpl(\n manifest.id,\n manifest.name,\n manifest.version,\n extensionDir,\n appConfig,\n extensionOnly,\n logger,\n resolvePath,\n this.registry,\n runtime,\n );\n if (manifest.reload?.configPrefixes?.length) {\n api._setReloadConfigPrefixes(manifest.reload.configPrefixes);\n }\n const manifestCommands = manifest.ui?.contributions?.commands;\n if (manifestCommands?.length) {\n (api as ExtensionApiImpl)._setManifestCommands(manifestCommands);\n }\n return api;\n }\n\n private async initializeExtension(\n module: ExtensionModule,\n api: ExtensionApi,\n _manifest: ExtensionManifest,\n ): Promise<void> {\n if (typeof module === 'function') {\n // Module is a function that receives the API\n await module(api);\n } else if (typeof module === 'object' && module.register) {\n // Module is a ExtensionDefinition with register method\n await module.register(api);\n }\n }\n\n async startServices(): Promise<void> {\n const services = Array.from(this.registry.services.values());\n\n for (const service of services) {\n const serviceLog = createServiceLogger(service.id);\n try {\n await service.start?.();\n serviceLog.info(`Started service`);\n } catch (error) {\n serviceLog.error({ err: error }, `Failed to start service`);\n }\n }\n }\n\n async stopServices(): Promise<void> {\n const services = Array.from(this.registry.services.values()).reverse();\n\n for (const service of services) {\n if (service.stop) {\n const serviceLog = createServiceLogger(service.id);\n try {\n await service.stop();\n serviceLog.info(`Stopped service`);\n } catch (error) {\n serviceLog.error({ err: error }, `Failed to stop service`);\n }\n }\n }\n }\n\n /**\n * Basic type validation for config values\n */\n private validateType(value: unknown, expectedType: string): boolean {\n if (expectedType === 'string') return typeof value === 'string';\n if (expectedType === 'number' || expectedType === 'integer') return typeof value === 'number';\n if (expectedType === 'boolean') return typeof value === 'boolean';\n if (expectedType === 'array') return Array.isArray(value);\n if (expectedType === 'object') return typeof value === 'object' && value !== null && !Array.isArray(value);\n return true;\n }\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\nexport function resolveExtensionPath(id: string, _options: ExtensionLoaderOptions): string | null {\n const c = loadConfig();\n const aid = resolveDefaultAgentId(c);\n // Priority 1: Workspace\n const workspacePath = join(resolveWorkspaceExtensionsDir(c, aid), id);\n if (existsSync(workspacePath)) return workspacePath;\n\n // Priority 2: Global\n const globalPath = join(resolveExtensionsDir(), id);\n if (existsSync(globalPath)) return globalPath;\n\n // Priority 3: Bundled\n const bundledDir = resolveBundledExtensionsDir();\n if (bundledDir) {\n const bundledPath = join(bundledDir, id);\n if (existsSync(bundledPath)) return bundledPath;\n }\n\n // Check if it's an npm package\n try {\n const require = createRequire(import.meta.url);\n const resolved = require.resolve(id);\n return dirname(resolved);\n } catch {\n return null;\n }\n}\n\nexport function normalizeExtensionConfig(\n rawConfig: Record<string, unknown>,\n): ResolvedExtensionConfig[] {\n const extensions: ResolvedExtensionConfig[] = [];\n\n const enabled = (rawConfig.enabled as string[]) || [];\n const disabled = (rawConfig.disabled as string[]) || [];\n\n // Parse enabled extensions\n for (const id of enabled) {\n const config = (rawConfig[id] as Record<string, unknown>) || {};\n extensions.push({\n id,\n name: id,\n source: 'config',\n path: id,\n enabled: true,\n config,\n });\n }\n\n // Parse disabled extensions\n for (const id of disabled) {\n if (!extensions.find((p) => p.id === id)) {\n const config = (rawConfig[id] as Record<string, unknown>) || {};\n extensions.push({\n id,\n name: id,\n source: 'config',\n path: id,\n enabled: false,\n config,\n });\n }\n }\n\n return extensions;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"loader.js","names":["apiImpl"],"sources":["../../../src/extensions/loader.ts"],"sourcesContent":["/**\n * Extension Loader and Registry\n * \n * Supports three-tier extension storage:\n * 1. Workspace level (workspace/.extensions/) - highest priority\n * 2. Global level (~/.xopc/extensions/) - shared across workspaces\n * 3. Bundled level (xopc/extensions/) - shipped with xopc\n */\n\nimport { existsSync, readFileSync } from 'fs';\nimport { join, dirname, isAbsolute } from 'path';\nimport { fileURLToPath } from 'node:url';\nimport { createRequire } from 'node:module';\nimport { createJiti } from 'jiti';\nimport { resolveDefaultAgentId } from '../agent/agent-scope.js';\nimport { loadConfig } from '../config/loader.js';\nimport {\n resolveAgentWorkspaceDir,\n resolveExtensionsDir,\n resolveWorkspaceExtensionsDir,\n resolveBundledExtensionsDir,\n resolveExtensionSdkPath,\n} from '../config/paths.js';\nimport type { Config } from '../config/config-surface.js';\nimport type { MessageBus } from '../infra/bus/index.js';\nimport type { SessionIndex } from '../session/manager.js';\nimport type { AgentTool } from '@earendil-works/pi-agent-core';\nimport type {\n ExtensionApi,\n ExtensionModule,\n ExtensionManifest,\n ResolvedExtensionConfig,\n DiscoveredExtension,\n} from './types/index.js';\nimport type { ActivationContext } from './activation-planner.js';\nimport { ActivationPlanner, type ActivationLoadPhase } from './activation-planner.js';\nimport { mergeActivationContext } from './activation-context.js';\nimport {\n areExtensionsGloballyDisabled,\n discoverExtensionsFromDisk,\n type DiscoverConfig,\n type ExtensionLoaderOptions,\n} from './discover-extensions.js';\nimport type { ExtensionMetadataSnapshot } from './extension-metadata-snapshot.js';\nimport { ManifestRegistry } from './manifest-registry.js';\nimport { normalizeExtensionManifest } from './normalize-manifest.js';\nimport { checkEngineCompatibility } from './engine-check.js';\nimport { PACKAGE_VERSION } from '../package-version.js';\nimport { ExtensionApiImpl, createExtensionLogger, createPathResolver } from './api.js';\nimport { validateSpeechProviderContracts } from './speech-provider-contracts.js';\nimport { validateMediaUnderstandingProviderContracts } from './media-provider-contracts.js';\nimport { createLogger, createServiceLogger } from '../utils/logger.js';\n\n// Security imports\nimport {\n checkExtensionPathSafety,\n isExtensionAllowed,\n provenanceTracker,\n logSecurityIssue,\n DEFAULT_SECURITY_CONFIG,\n type SecurityConfig,\n // Note: ExtensionSourceOrigin is defined locally in this file\n} from './security.js';\n\n// Provider imports\nimport { getProviderRegistry, type ProviderPluginRegistry } from '../providers/plugin-registry.js';\n\n// Slot imports\nimport {\n getSlotRegistry,\n type SlotRegistry,\n type SlotKey,\n} from './slots.js';\n\n// Diagnostics imports\nimport {\n getExtensionCache,\n getExtensionDiagnostics,\n type ExtensionLoaderCache,\n type ExtensionDiagnostics,\n} from './diagnostics.js';\n\nconst EXTENSION_MANIFEST_FILE = 'xopc.extension.json';\n\nconst log = createLogger('ExtensionLoader');\n\nconst DEFAULT_EXTENSION_LOAD_CONCURRENCY = 4;\n\nasync function mapWithConcurrency<T>(\n items: readonly T[],\n concurrency: number,\n fn: (item: T) => Promise<void>,\n): Promise<void> {\n if (items.length === 0) {\n return;\n }\n const queue = [...items];\n const workerCount = Math.min(Math.max(1, concurrency), queue.length);\n await Promise.all(\n Array.from({ length: workerCount }, async () => {\n while (queue.length > 0) {\n const item = queue.shift();\n if (item === undefined) {\n break;\n }\n await fn(item);\n }\n }),\n );\n}\n\nexport type { ExtensionLoaderOptions, ExtensionSourceOrigin } from './discover-extensions.js';\nexport { areExtensionsGloballyDisabled } from './discover-extensions.js';\n\n// ============================================================================\n// Extension Registry\n// ============================================================================\n\n// `ExtensionRegistryImpl` moved to `./extension-registry-impl.ts` so `api.ts`\n// can use the class without going through loader.ts (which imports back from\n// api.ts and formed a circular cycle). Re-exported here for backward-compat.\nexport { ExtensionRegistryImpl } from './extension-registry-impl.js';\nimport { ExtensionRegistryImpl } from './extension-registry-impl.js';\n\n// ============================================================================\n// Extension Loader\n// ============================================================================\n\nexport interface ActivationPlanLoadOptions extends Partial<ActivationContext> {\n phase?: ActivationLoadPhase | 'all';\n}\n\nexport class ExtensionLoader {\n private registry: ExtensionRegistryImpl;\n private options: ExtensionLoaderOptions;\n private extensionInstances: Map<string, ExtensionApi> = new Map();\n private jiti: ReturnType<typeof createJiti>;\n private _appConfig?: Config;\n private _runtimeContext?: {\n bus?: MessageBus;\n sessionManager?: SessionIndex;\n scheduleWebchatContinuation?: (sessionKey: string, message: string) => void;\n setLabel?: (entryId: string, label: string | undefined) => void;\n sendUserMessage?: import('./types/index.js').ExtensionRuntime['sendUserMessage'];\n appendEntry?: import('./types/index.js').ExtensionRuntime['appendEntry'];\n sendMessage?: import('./types/index.js').ExtensionRuntime['sendMessage'];\n };\n \n // Security\n private securityConfig: SecurityConfig;\n \n // Provider Registry\n private providerRegistry: ProviderPluginRegistry;\n \n // Slot Registry & Config\n private slotRegistry: SlotRegistry;\n private slotsConfig: Partial<Record<SlotKey, string>> = {};\n \n // Cache and Diagnostics\n private cache: ExtensionLoaderCache;\n private diagnostics: ExtensionDiagnostics;\n\n /** Manifest-only registry cache (no runtime module load). */\n private manifestRegistry: ManifestRegistry | null = null;\n private manifestSnapshot: ExtensionMetadataSnapshot | null = null;\n\n constructor(options?: ExtensionLoaderOptions) {\n this.registry = new ExtensionRegistryImpl();\n this.options = options || (() => {\n const c = loadConfig();\n const aid = resolveDefaultAgentId(c);\n return {\n workspaceDir: resolveAgentWorkspaceDir(c, aid),\n extensionsDir: resolveWorkspaceExtensionsDir(c, aid),\n };\n })();\n\n // Initialize security config\n this.securityConfig = DEFAULT_SECURITY_CONFIG;\n \n // Initialize provider registry\n this.providerRegistry = getProviderRegistry();\n \n // Initialize slot registry\n this.slotRegistry = getSlotRegistry();\n \n // Initialize cache and diagnostics \n this.cache = getExtensionCache();\n this.diagnostics = getExtensionDiagnostics();\n\n // Build jiti alias for extension-sdk (+ subpath entry points)\n const alias: Record<string, string> = {};\n const sdkPath = resolveExtensionSdkPath();\n if (sdkPath) {\n alias['xopc/extension-sdk'] = sdkPath;\n const sdkDir = dirname(sdkPath);\n alias['xopc/extension-sdk/core'] = join(sdkDir, 'core.ts');\n alias['xopc/extension-sdk/lazy'] = join(sdkDir, 'lazy.ts');\n alias['xopc/extension-sdk/provider'] = join(sdkDir, 'provider.ts');\n alias['xopc/extension-sdk/channel'] = join(sdkDir, 'channel.ts');\n alias['xopc/extension-sdk/hooks'] = join(sdkDir, 'hooks.ts');\n alias['xopc/extension-sdk/tools'] = join(sdkDir, 'tools.ts');\n alias['xopc/extension-sdk/testing'] = join(sdkDir, 'testing.ts');\n alias['xopc/extension-sdk/speech'] = join(sdkDir, 'speech.ts');\n alias['xopc/extension-sdk/media'] = join(sdkDir, 'media.ts');\n }\n\n // Initialize jiti with TypeScript support and SDK alias\n this.jiti = createJiti(fileURLToPath(import.meta.url), {\n interopDefault: true,\n extensions: ['.ts', '.tsx', '.mts', '.cts', '.js', '.mjs', '.cjs', '.json'],\n alias,\n });\n }\n\n /**\n * Reuse a pre-built metadata snapshot (avoids duplicate filesystem discovery).\n */\n setManifestSnapshot(snapshot: ExtensionMetadataSnapshot | null): void {\n this.manifestSnapshot = snapshot;\n this.manifestRegistry = snapshot?.manifestRegistry ?? null;\n }\n\n getManifestSnapshot(): ExtensionMetadataSnapshot | null {\n return this.manifestSnapshot;\n }\n\n /**\n * Set security configuration \n */\n setSecurityConfig(config: Partial<SecurityConfig>): void {\n this.securityConfig = { ...this.securityConfig, ...config };\n }\n\n /**\n * Get security configuration \n */\n getSecurityConfig(): SecurityConfig {\n return this.securityConfig;\n }\n\n /**\n * Get provider registry \n */\n getProviderRegistry(): ProviderPluginRegistry {\n return this.providerRegistry;\n }\n\n /**\n * Get slot registry \n */\n getSlotRegistry(): SlotRegistry {\n return this.slotRegistry;\n }\n\n /**\n * Get diagnostics \n */\n getDiagnostics(): ExtensionDiagnostics {\n return this.diagnostics;\n }\n\n /**\n * Set configuration from main Config object \n */\n setConfig(config: Config): void {\n this._appConfig = config;\n // Wire slot config\n const slots = (config.extensions as any)?.slots || {};\n this.slotsConfig = {\n memory: slots.memory,\n tts: slots.tts,\n imageGeneration: slots.imageGeneration,\n webSearch: slots.webSearch,\n };\n\n // Wire security config\n const security = (config.extensions as any)?.security;\n if (security) {\n this.securityConfig = {\n checkPermissions: security.checkPermissions ?? true,\n allowUntrusted: security.allowUntrusted ?? false,\n allow: security.allow ?? [],\n trackProvenance: security.trackProvenance ?? true,\n allowPromptInjection: security.allowPromptInjection ?? false,\n };\n }\n }\n\n /**\n * Inject MessageBus and optional SessionManager for ExtensionApi.runtime (Gateway).\n */\n setRuntimeContext(ctx: {\n bus?: MessageBus;\n sessionManager?: SessionIndex;\n scheduleWebchatContinuation?: (sessionKey: string, message: string) => void;\n setLabel?: (entryId: string, label: string | undefined) => void;\n sendUserMessage?: import('./types/index.js').ExtensionRuntime['sendUserMessage'];\n appendEntry?: import('./types/index.js').ExtensionRuntime['appendEntry'];\n sendMessage?: import('./types/index.js').ExtensionRuntime['sendMessage'];\n }): void {\n this._runtimeContext = ctx;\n // ExtensionApi snapshots `runtime` at construction and is tied to this loader's registry.\n // CLI startup loads extensions with `{ bus }` first; a global cache hit would reuse that\n // api for the gateway loader (no sessionManager, wrong registry) — breaks extensions that need SessionManager.\n this.cache.invalidate();\n }\n\n getRegistry(): ExtensionRegistryImpl {\n return this.registry;\n }\n\n /**\n * Phase 1: build manifest registry (filesystem manifests only, no extension code load).\n */\n buildManifestRegistry(): ManifestRegistry {\n if (this.manifestRegistry) {\n return this.manifestRegistry;\n }\n const discovered = this.discoverExtensions();\n this.manifestRegistry = ManifestRegistry.fromDiscovered(discovered);\n return this.manifestRegistry;\n }\n\n /**\n * Phase 2: activation planner over the manifest registry (pure logic).\n */\n planActivation(_context?: Partial<ActivationContext>): ActivationPlanner {\n return new ActivationPlanner(this.buildManifestRegistry());\n }\n\n /**\n * Phase 3: load only extensions selected by the activation plan.\n */\n async loadByActivationPlan(context?: ActivationPlanLoadOptions): Promise<void> {\n if (areExtensionsGloballyDisabled(this._appConfig as DiscoverConfig | undefined)) {\n log.debug('Extension loading skipped (extensions globally disabled)');\n return;\n }\n\n const registry = this.buildManifestRegistry();\n const planner = new ActivationPlanner(registry);\n const fullContext = mergeActivationContext(this._appConfig, context);\n let activatedIds = planner.getActivatedIds(fullContext).sort((a, b) => a.localeCompare(b));\n\n const phase = context?.phase ?? 'all';\n if (phase === 'startup' || phase === 'deferred') {\n activatedIds = planner.filterActivatedIdsByLoadPhase(activatedIds, phase);\n }\n\n const concurrency = Number.parseInt(\n process.env.XOPC_EXTENSION_LOAD_CONCURRENCY ?? '',\n 10,\n );\n const loadConcurrency = Number.isFinite(concurrency) && concurrency > 0\n ? concurrency\n : DEFAULT_EXTENSION_LOAD_CONCURRENCY;\n\n await mapWithConcurrency(activatedIds, loadConcurrency, async (extensionId) => {\n if (this.extensionInstances.has(extensionId)) {\n return;\n }\n const entry = registry.getEntry(extensionId);\n if (!entry) {\n log.debug(\n { extensionId },\n 'Activation plan references extension id that was not discovered on disk',\n );\n return;\n }\n\n const config: ResolvedExtensionConfig = {\n id: extensionId,\n name: entry.manifest.name || extensionId,\n source: entry.source,\n path: entry.path,\n enabled: true,\n config: this.resolveExtensionConfig(extensionId),\n };\n\n await this.loadExtension(config);\n });\n }\n\n getManifestRegistry(): ManifestRegistry {\n return this.buildManifestRegistry();\n }\n\n invalidateManifestCache(): void {\n this.manifestRegistry = this.manifestSnapshot?.manifestRegistry ?? null;\n }\n\n private resolveExtensionConfig(extensionId: string): Record<string, unknown> {\n if (!this._appConfig) return {};\n const extensionsConfig = (this._appConfig as Record<string, unknown>).extensions as\n | Record<string, unknown>\n | undefined;\n if (!extensionsConfig || typeof extensionsConfig !== 'object') return {};\n const raw = extensionsConfig[extensionId];\n if (raw && typeof raw === 'object' && !Array.isArray(raw)) {\n return raw as Record<string, unknown>;\n }\n return {};\n }\n\n /**\n * Discover extensions from all three tiers:\n * 1. Workspace (.extensions/) - highest priority\n * 2. Global (~/.xopc/extensions/) - shared\n * 3. Bundled (xopc/extensions/) - lowest priority\n */\n discoverExtensions(): DiscoveredExtension[] {\n if (this.manifestSnapshot) {\n return this.manifestSnapshot.discovered;\n }\n return discoverExtensionsFromDisk(this.options, this._appConfig as DiscoverConfig | undefined);\n }\n\n /**\n * Load all discovered extensions\n */\n async loadAllExtensions(enabledIds?: string[]): Promise<void> {\n const extensions = this.discoverExtensions();\n\n for (const extension of extensions) {\n // If enabledIds specified, only load those\n if (enabledIds && !enabledIds.includes(extension.id)) {\n continue;\n }\n\n const config: ResolvedExtensionConfig = {\n id: extension.id,\n name: extension.manifest.name || extension.id,\n source: extension.source,\n path: extension.path,\n enabled: true,\n config: {},\n };\n\n await this.loadExtension(config);\n }\n }\n\n async loadExtensions(configs: ResolvedExtensionConfig[]): Promise<void> {\n for (const extensionConfig of configs) {\n if (extensionConfig.enabled) {\n await this.loadExtension(extensionConfig);\n }\n }\n }\n\n async loadExtension(config: ResolvedExtensionConfig): Promise<ExtensionApi | null> {\n try {\n // Check cache first\n const cacheKey = this.cache.buildKey(this.options, [config.id]);\n const cached = this.cache.get<ExtensionApi>(cacheKey);\n if (cached) {\n log.debug({ extensionId: config.id }, 'Extension loaded from cache');\n return cached;\n }\n\n // Check if already loaded\n if (this.extensionInstances.has(config.id)) {\n return this.extensionInstances.get(config.id)!;\n }\n\n // Resolve extension path using resolveExtensionPath\n let extensionPath: string | null;\n if (isAbsolute(config.path)) {\n extensionPath = config.path;\n } else {\n // Try to resolve extension ID to actual path\n extensionPath = resolveExtensionPath(config.path, this.options) ||\n resolveExtensionPath(config.id, this.options);\n }\n \n if (!extensionPath) {\n log.error({ extensionId: config.id, path: config.path }, `Could not resolve extension path`);\n this.diagnostics.error(config.id, `Could not resolve extension path: ${config.path}`);\n return null;\n }\n\n log.debug({ extensionId: config.id, extensionPath }, 'Resolved extension path');\n\n // Security check\n const source = config.source || 'bundled';\n const safetyResult = checkExtensionPathSafety(extensionPath, extensionPath, source);\n \n if (!safetyResult.safe) {\n logSecurityIssue(config.id, safetyResult);\n \n if (this.securityConfig.checkPermissions && source !== 'bundled') {\n // Check allowlist\n if (!isExtensionAllowed(config.id, this.securityConfig)) {\n this.diagnostics.error(config.id, `Extension not allowed: ${safetyResult.detail}`);\n log.error({ extensionId: config.id, reason: safetyResult.reason }, 'Extension blocked by security policy');\n return null;\n }\n }\n }\n\n // Track provenance \n provenanceTracker.track(config.id, source);\n\n const manifest = this.loadManifest(extensionPath);\n if (!manifest) {\n log.error({ extensionId: config.id, extensionPath }, `Failed to load manifest for extension`);\n this.diagnostics.error(config.id, `Failed to load manifest`);\n return null;\n }\n\n if (manifest.engines?.xopc) {\n const range = manifest.engines.xopc;\n const engineResult = checkEngineCompatibility(PACKAGE_VERSION, range);\n if (engineResult.parseWarning) {\n log.warn(\n { extensionId: config.id, range, reason: engineResult.reason },\n 'Engine range parse warning — loading anyway',\n );\n } else if (!engineResult.compatible) {\n log.warn(\n { extensionId: config.id, range, currentVersion: PACKAGE_VERSION },\n 'Extension engine requirement not met (engines.xopc) — skipping load',\n );\n this.diagnostics.error(\n config.id,\n engineResult.reason ?? 'Incompatible xopc version (engines.xopc)',\n );\n return null;\n }\n }\n\n // Validate extension config against schema (basic validation)\n if (manifest.configSchema) {\n try {\n const schema = manifest.configSchema as Record<string, unknown>;\n const extensionConfig = config.config as Record<string, unknown>;\n \n // Basic validation: check required fields and types\n if (schema.type === 'object' && schema.properties) {\n const props = schema.properties as Record<string, Record<string, unknown>>;\n const required = (schema.required as string[]) || [];\n \n for (const field of required) {\n if (extensionConfig[field] === undefined) {\n log.error({ \n extensionId: config.id, \n field \n }, 'Extension config validation failed: missing required field');\n return null;\n }\n }\n \n for (const [key, value] of Object.entries(extensionConfig)) {\n const propSchema = props[key];\n if (propSchema) {\n if (propSchema.type && !this.validateType(value, propSchema.type as string)) {\n log.error({ \n extensionId: config.id, \n field: key,\n expected: propSchema.type,\n actual: typeof value\n }, 'Extension config validation failed: type mismatch');\n return null;\n }\n }\n }\n }\n \n log.debug({ extensionId: config.id }, 'Extension config validated');\n } catch (err) {\n log.warn({ err, extensionId: config.id }, 'Config schema validation skipped');\n }\n }\n\n // Create extension API\n const extensionDir = dirname(extensionPath);\n const api = this.createExtensionApi(manifest, config, extensionDir);\n\n // Load extension module\n const module = await this.loadModule(extensionPath, manifest);\n if (!module) {\n log.error({ extensionId: config.id }, `Failed to load module for extension`);\n this.diagnostics.error(config.id, `Failed to load module`);\n return null;\n }\n\n // Check and claim slots\n const slotClaimed = this.claimExtensionSlots(config.id, manifest);\n if (!slotClaimed) {\n log.warn({ extensionId: config.id }, 'Failed to claim required slots');\n }\n\n // Initialize extension\n await this.initializeExtension(module, api, manifest);\n\n validateSpeechProviderContracts({\n extensionId: config.id,\n manifest,\n registeredProviderIds: (api as ExtensionApiImpl).getRegisteredSpeechProviderIds(),\n logger: api.logger,\n });\n\n validateMediaUnderstandingProviderContracts({\n extensionId: config.id,\n manifest,\n registeredProviderIds: (api as ExtensionApiImpl).getRegisteredMediaUnderstandingProviderIds(),\n logger: api.logger,\n });\n\n // Register to registry\n this.registry.addExtension({\n id: config.id,\n name: manifest.name,\n version: manifest.version,\n path: extensionPath,\n module,\n config: config.config,\n enabled: true,\n source: config.source,\n });\n\n // Register extension tools to registry (so AgentManager can access them)\n // Note: api is actually ExtensionApiImpl at runtime\n const apiImpl = api as unknown as { _getTools: () => Map<string, AgentTool> };\n const extensionTools = apiImpl._getTools();\n for (const tool of extensionTools.values()) {\n this.registry.addTool(tool);\n }\n\n this.extensionInstances.set(config.id, api);\n \n // Cache the loaded extension\n this.cache.set(cacheKey, api);\n\n this.diagnostics.info(config.id, `Loaded extension: ${manifest.name}`);\n log.info({ name: manifest.name, id: manifest.id, source: config.source }, `Loaded extension`);\n\n return api;\n } catch (error) {\n log.error({ err: error, extensionId: config.id }, `Error loading extension`);\n this.diagnostics.error(config.id, `Error loading extension: ${error}`);\n return null;\n }\n }\n\n /**\n * Claim extension slots based on manifest kind\n * Respects configured preferred plugin from config.extensions.slots\n */\n private claimExtensionSlots(extensionId: string, manifest: ExtensionManifest): boolean {\n const kind = manifest.kind as string;\n \n // Map extension kind to slot\n const slotMap: Record<string, SlotKey> = {\n 'memory': 'memory',\n 'tts': 'tts',\n 'speech-provider': 'tts',\n 'web-search': 'webSearch',\n };\n \n const slotKey = slotMap[kind];\n if (!slotKey) {\n return true; // No slot required\n }\n \n // Check if slot is reserved for a different plugin in config\n const preferredPlugin = this.slotsConfig[slotKey];\n if (preferredPlugin && preferredPlugin !== extensionId) {\n log.info(\n { extensionId, slotKey, preferredPlugin },\n `Skipping slot claim: slot \"${slotKey}\" is reserved for \"${preferredPlugin}\"`\n );\n this.diagnostics.info(\n extensionId,\n `Slot \"${slotKey}\" is reserved for \"${preferredPlugin}\", skipping claim`\n );\n return false;\n }\n \n const claimed = this.slotRegistry.claim(slotKey, extensionId, null);\n if (!claimed) {\n this.diagnostics.warn(extensionId, `Slot \"${slotKey}\" already claimed by another extension`);\n }\n return claimed;\n }\n\n loadManifest(extensionPath: string): ExtensionManifest | null {\n const manifestPath = join(extensionPath, EXTENSION_MANIFEST_FILE);\n\n // First try to load xopc.extension.json\n if (existsSync(manifestPath)) {\n try {\n const raw = JSON.parse(readFileSync(manifestPath, 'utf-8'));\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {\n log.error({ manifestPath }, 'Manifest root must be a JSON object');\n return null;\n }\n return normalizeExtensionManifest(raw as Record<string, unknown>);\n } catch (error) {\n log.error({ err: error, manifestPath }, `Failed to parse manifest`);\n return null;\n }\n }\n\n // Fallback to package.json\n const packagePath = join(extensionPath, 'package.json');\n if (existsSync(packagePath)) {\n try {\n const packageJson = JSON.parse(readFileSync(packagePath, 'utf-8'));\n \n // Check for xopc.extension marker\n if (packageJson.xopc?.extension) {\n const xopcConfig = packageJson.xopc;\n return normalizeExtensionManifest({\n id: xopcConfig.id || packageJson.name,\n name: xopcConfig.name || packageJson.name,\n description: xopcConfig.description || packageJson.description,\n version: xopcConfig.version || packageJson.version || '1.0.0',\n kind: xopcConfig.kind || 'utility',\n main: xopcConfig.main || packageJson.main || 'index.js',\n configSchema: xopcConfig.configSchema,\n });\n }\n\n // Also support xopc-extension-* naming convention\n if (packageJson.name?.startsWith('xopc-extension-')) {\n const id = packageJson.name.replace('xopc-extension-', '');\n return normalizeExtensionManifest({\n id,\n name: packageJson.name,\n description: packageJson.description,\n version: packageJson.version || '1.0.0',\n kind: 'utility',\n main: packageJson.main || 'index.js',\n });\n }\n } catch (error) {\n log.error({ err: error, packagePath }, `Failed to parse package.json`);\n }\n }\n\n return null;\n }\n\n /**\n * Build candidate extension entry paths. After `tsdown`, manifests may still\n * point at `*.ts` while the shipped tree only contains the emitted `*.js`.\n */\n private moduleEntryCandidates(manifest: ExtensionManifest): string[] {\n const raw = [\n manifest.main,\n 'index.ts',\n 'index.js',\n 'extension.ts',\n 'extension.js',\n ].filter(Boolean) as string[];\n\n const out: string[] = [];\n for (const entry of raw) {\n out.push(entry);\n if (entry.endsWith('.tsx')) {\n out.push(`${entry.slice(0, -4)}.js`);\n } else if (entry.endsWith('.ts')) {\n out.push(`${entry.slice(0, -3)}.js`);\n } else if (entry.endsWith('.mts')) {\n out.push(`${entry.slice(0, -4)}.mjs`);\n } else if (entry.endsWith('.cts')) {\n out.push(`${entry.slice(0, -4)}.cjs`);\n }\n }\n return [...new Set(out)];\n }\n\n private async loadModule(\n extensionPath: string,\n manifest: ExtensionManifest,\n ): Promise<ExtensionModule | null> {\n const entryPoints = this.moduleEntryCandidates(manifest);\n\n for (const entry of entryPoints) {\n const fullPath = isAbsolute(entry) ? entry : join(extensionPath, entry);\n\n if (existsSync(fullPath)) {\n try {\n if (/\\.(js|mjs|cjs)$/.test(fullPath)) {\n const require = createRequire(import.meta.url);\n const mod = require(fullPath);\n return mod.default || mod;\n }\n const mod = this.jiti(fullPath);\n return mod.default || mod;\n } catch (error) {\n log.warn({ err: error, path: fullPath }, `Failed to load module`);\n }\n }\n }\n\n return null;\n }\n\n private createExtensionApi(\n manifest: ExtensionManifest,\n resolved: ResolvedExtensionConfig,\n extensionDir: string,\n ): ExtensionApi {\n const logger = createExtensionLogger(`[${manifest.id}]`);\n const resolvePath = createPathResolver(extensionDir, this.options.workspaceDir || '');\n\n const appConfig = this._appConfig ?? ({} as Config);\n const extensionOnly = (resolved.config ?? {}) as Record<string, unknown>;\n\n const runtime =\n this._appConfig && this._runtimeContext\n ? {\n config: this._appConfig,\n bus: this._runtimeContext.bus,\n log: logger,\n sessionManager: this._runtimeContext.sessionManager,\n scheduleWebchatContinuation: this._runtimeContext.scheduleWebchatContinuation,\n setLabel: this._runtimeContext.setLabel,\n sendUserMessage: this._runtimeContext.sendUserMessage,\n appendEntry: this._runtimeContext.appendEntry,\n sendMessage: this._runtimeContext.sendMessage,\n }\n : this._appConfig\n ? {\n config: this._appConfig,\n log: logger,\n }\n : undefined;\n\n const api = new ExtensionApiImpl(\n manifest.id,\n manifest.name,\n manifest.version,\n extensionDir,\n appConfig,\n extensionOnly,\n logger,\n resolvePath,\n this.registry,\n runtime,\n );\n if (manifest.reload?.configPrefixes?.length) {\n api._setReloadConfigPrefixes(manifest.reload.configPrefixes);\n }\n const manifestCommands = manifest.ui?.contributions?.commands;\n if (manifestCommands?.length) {\n (api as ExtensionApiImpl)._setManifestCommands(manifestCommands);\n }\n return api;\n }\n\n private async initializeExtension(\n module: ExtensionModule,\n api: ExtensionApi,\n _manifest: ExtensionManifest,\n ): Promise<void> {\n if (typeof module === 'function') {\n // Module is a function that receives the API\n await module(api);\n } else if (typeof module === 'object' && module.register) {\n // Module is a ExtensionDefinition with register method\n await module.register(api);\n }\n }\n\n async startServices(): Promise<void> {\n const services = Array.from(this.registry.services.values());\n\n for (const service of services) {\n const serviceLog = createServiceLogger(service.id);\n try {\n await service.start?.();\n serviceLog.info(`Started service`);\n } catch (error) {\n serviceLog.error({ err: error }, `Failed to start service`);\n }\n }\n }\n\n async stopServices(): Promise<void> {\n const services = Array.from(this.registry.services.values()).reverse();\n\n for (const service of services) {\n if (service.stop) {\n const serviceLog = createServiceLogger(service.id);\n try {\n await service.stop();\n serviceLog.info(`Stopped service`);\n } catch (error) {\n serviceLog.error({ err: error }, `Failed to stop service`);\n }\n }\n }\n }\n\n /**\n * Basic type validation for config values\n */\n private validateType(value: unknown, expectedType: string): boolean {\n if (expectedType === 'string') return typeof value === 'string';\n if (expectedType === 'number' || expectedType === 'integer') return typeof value === 'number';\n if (expectedType === 'boolean') return typeof value === 'boolean';\n if (expectedType === 'array') return Array.isArray(value);\n if (expectedType === 'object') return typeof value === 'object' && value !== null && !Array.isArray(value);\n return true;\n }\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\nexport function resolveExtensionPath(id: string, _options: ExtensionLoaderOptions): string | null {\n const c = loadConfig();\n const aid = resolveDefaultAgentId(c);\n // Priority 1: Workspace\n const workspacePath = join(resolveWorkspaceExtensionsDir(c, aid), id);\n if (existsSync(workspacePath)) return workspacePath;\n\n // Priority 2: Global\n const globalPath = join(resolveExtensionsDir(), id);\n if (existsSync(globalPath)) return globalPath;\n\n // Priority 3: Bundled\n const bundledDir = resolveBundledExtensionsDir();\n if (bundledDir) {\n const bundledPath = join(bundledDir, id);\n if (existsSync(bundledPath)) return bundledPath;\n }\n\n // Check if it's an npm package\n try {\n const require = createRequire(import.meta.url);\n const resolved = require.resolve(id);\n return dirname(resolved);\n } catch {\n return null;\n }\n}\n\nexport function normalizeExtensionConfig(\n rawConfig: Record<string, unknown>,\n): ResolvedExtensionConfig[] {\n const extensions: ResolvedExtensionConfig[] = [];\n\n const enabled = (rawConfig.enabled as string[]) || [];\n const disabled = (rawConfig.disabled as string[]) || [];\n\n // Parse enabled extensions\n for (const id of enabled) {\n const config = (rawConfig[id] as Record<string, unknown>) || {};\n extensions.push({\n id,\n name: id,\n source: 'config',\n path: id,\n enabled: true,\n config,\n });\n }\n\n // Parse disabled extensions\n for (const id of disabled) {\n if (!extensions.find((p) => p.id === id)) {\n const config = (rawConfig[id] as Record<string, unknown>) || {};\n extensions.push({\n id,\n name: id,\n source: 'config',\n path: id,\n enabled: false,\n config,\n });\n }\n }\n\n return extensions;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAcgE;aACf;YAOrB;0BAoBM;wBAEwB;yBACW;sBAEb;aAIe;sBAc4B;AAiBnG,MAAM,0BAA0B;AAEhC,MAAM,MAAM,aAAa,kBAAkB;AAE3C,MAAM,qCAAqC;AAE3C,eAAe,mBACb,OACA,aACA,IACe;AACf,KAAI,MAAM,WAAW,EACnB;CAEF,MAAM,QAAQ,CAAC,GAAG,MAAM;CACxB,MAAM,cAAc,KAAK,IAAI,KAAK,IAAI,GAAG,YAAY,EAAE,MAAM,OAAO;AACpE,OAAM,QAAQ,IACZ,MAAM,KAAK,EAAE,QAAQ,aAAa,EAAE,YAAY;AAC9C,SAAO,MAAM,SAAS,GAAG;GACvB,MAAM,OAAO,MAAM,OAAO;AAC1B,OAAI,SAAS,KAAA,EACX;AAEF,SAAM,GAAG,KAAK;;GAEhB,CACH;;AAwBH,IAAa,kBAAb,MAA6B;CAC3B;CACA;CACA,qCAAwD,IAAI,KAAK;CACjE;CACA;CACA;CAWA;CAGA;CAGA;CACA,cAAwD,EAAE;CAG1D;CACA;;CAGA,mBAAoD;CACpD,mBAA6D;CAE7D,YAAY,SAAkC;AAC5C,OAAK,WAAW,IAAI,uBAAuB;AAC3C,OAAK,UAAU,kBAAkB;GAC/B,MAAM,IAAI,YAAY;GACtB,MAAM,MAAM,sBAAsB,EAAE;AACpC,UAAO;IACL,cAAc,yBAAyB,GAAG,IAAI;IAC9C,eAAe,8BAA8B,GAAG,IAAI;IACrD;MACC;AAGJ,OAAK,iBAAiB;AAGtB,OAAK,mBAAmB,qBAAqB;AAG7C,OAAK,eAAe,iBAAiB;AAGrC,OAAK,QAAQ,mBAAmB;AAChC,OAAK,cAAc,yBAAyB;EAG5C,MAAM,QAAgC,EAAE;EACxC,MAAM,UAAU,yBAAyB;AACzC,MAAI,SAAS;AACX,SAAM,wBAAwB;GAC9B,MAAM,SAAS,QAAQ,QAAQ;AAC/B,SAAM,6BAA6B,KAAK,QAAQ,UAAU;AAC1D,SAAM,6BAA6B,KAAK,QAAQ,UAAU;AAC1D,SAAM,iCAAiC,KAAK,QAAQ,cAAc;AAClE,SAAM,gCAAgC,KAAK,QAAQ,aAAa;AAChE,SAAM,8BAA8B,KAAK,QAAQ,WAAW;AAC5D,SAAM,8BAA8B,KAAK,QAAQ,WAAW;AAC5D,SAAM,gCAAgC,KAAK,QAAQ,aAAa;AAChE,SAAM,+BAA+B,KAAK,QAAQ,YAAY;AAC9D,SAAM,8BAA8B,KAAK,QAAQ,WAAW;;AAI9D,OAAK,OAAO,WAAW,cAAc,OAAO,KAAK,IAAI,EAAE;GACrD,gBAAgB;GAChB,YAAY;IAAC;IAAO;IAAQ;IAAQ;IAAQ;IAAO;IAAQ;IAAQ;IAAQ;GAC3E;GACD,CAAC;;;;;CAMJ,oBAAoB,UAAkD;AACpE,OAAK,mBAAmB;AACxB,OAAK,mBAAmB,UAAU,oBAAoB;;CAGxD,sBAAwD;AACtD,SAAO,KAAK;;;;;CAMd,kBAAkB,QAAuC;AACvD,OAAK,iBAAiB;GAAE,GAAG,KAAK;GAAgB,GAAG;GAAQ;;;;;CAM7D,oBAAoC;AAClC,SAAO,KAAK;;;;;CAMd,sBAA8C;AAC5C,SAAO,KAAK;;;;;CAMd,kBAAgC;AAC9B,SAAO,KAAK;;;;;CAMd,iBAAuC;AACrC,SAAO,KAAK;;;;;CAMd,UAAU,QAAsB;AAC9B,OAAK,aAAa;EAElB,MAAM,QAAS,OAAO,YAAoB,SAAS,EAAE;AACrD,OAAK,cAAc;GACjB,QAAQ,MAAM;GACd,KAAK,MAAM;GACX,iBAAiB,MAAM;GACvB,WAAW,MAAM;GAClB;EAGD,MAAM,WAAY,OAAO,YAAoB;AAC7C,MAAI,SACF,MAAK,iBAAiB;GACpB,kBAAkB,SAAS,oBAAoB;GAC/C,gBAAgB,SAAS,kBAAkB;GAC3C,OAAO,SAAS,SAAS,EAAE;GAC3B,iBAAiB,SAAS,mBAAmB;GAC7C,sBAAsB,SAAS,wBAAwB;GACxD;;;;;CAOL,kBAAkB,KAQT;AACP,OAAK,kBAAkB;AAIvB,OAAK,MAAM,YAAY;;CAGzB,cAAqC;AACnC,SAAO,KAAK;;;;;CAMd,wBAA0C;AACxC,MAAI,KAAK,iBACP,QAAO,KAAK;EAEd,MAAM,aAAa,KAAK,oBAAoB;AAC5C,OAAK,mBAAmB,iBAAiB,eAAe,WAAW;AACnE,SAAO,KAAK;;;;;CAMd,eAAe,UAA0D;AACvE,SAAO,IAAI,kBAAkB,KAAK,uBAAuB,CAAC;;;;;CAM5D,MAAM,qBAAqB,SAAoD;AAC7E,MAAI,8BAA8B,KAAK,WAAyC,EAAE;AAChF,OAAI,MAAM,2DAA2D;AACrE;;EAGF,MAAM,WAAW,KAAK,uBAAuB;EAC7C,MAAM,UAAU,IAAI,kBAAkB,SAAS;EAC/C,MAAM,cAAc,uBAAuB,KAAK,YAAY,QAAQ;EACpE,IAAI,eAAe,QAAQ,gBAAgB,YAAY,CAAC,MAAM,GAAG,MAAM,EAAE,cAAc,EAAE,CAAC;EAE1F,MAAM,QAAQ,SAAS,SAAS;AAChC,MAAI,UAAU,aAAa,UAAU,WACnC,gBAAe,QAAQ,8BAA8B,cAAc,MAAM;EAG3E,MAAM,cAAc,OAAO,SACzB,QAAQ,IAAI,mCAAmC,IAC/C,GACD;AAKD,QAAM,mBAAmB,cAJD,OAAO,SAAS,YAAY,IAAI,cAAc,IAClE,cACA,oCAEoD,OAAO,gBAAgB;AAC7E,OAAI,KAAK,mBAAmB,IAAI,YAAY,CAC1C;GAEF,MAAM,QAAQ,SAAS,SAAS,YAAY;AAC5C,OAAI,CAAC,OAAO;AACV,QAAI,MACF,EAAE,aAAa,EACf,0EACD;AACD;;GAGF,MAAM,SAAkC;IACtC,IAAI;IACJ,MAAM,MAAM,SAAS,QAAQ;IAC7B,QAAQ,MAAM;IACd,MAAM,MAAM;IACZ,SAAS;IACT,QAAQ,KAAK,uBAAuB,YAAY;IACjD;AAED,SAAM,KAAK,cAAc,OAAO;IAChC;;CAGJ,sBAAwC;AACtC,SAAO,KAAK,uBAAuB;;CAGrC,0BAAgC;AAC9B,OAAK,mBAAmB,KAAK,kBAAkB,oBAAoB;;CAGrE,uBAA+B,aAA8C;AAC3E,MAAI,CAAC,KAAK,WAAY,QAAO,EAAE;EAC/B,MAAM,mBAAoB,KAAK,WAAuC;AAGtE,MAAI,CAAC,oBAAoB,OAAO,qBAAqB,SAAU,QAAO,EAAE;EACxE,MAAM,MAAM,iBAAiB;AAC7B,MAAI,OAAO,OAAO,QAAQ,YAAY,CAAC,MAAM,QAAQ,IAAI,CACvD,QAAO;AAET,SAAO,EAAE;;;;;;;;CASX,qBAA4C;AAC1C,MAAI,KAAK,iBACP,QAAO,KAAK,iBAAiB;AAE/B,SAAO,2BAA2B,KAAK,SAAS,KAAK,WAAyC;;;;;CAMhG,MAAM,kBAAkB,YAAsC;EAC5D,MAAM,aAAa,KAAK,oBAAoB;AAE5C,OAAK,MAAM,aAAa,YAAY;AAElC,OAAI,cAAc,CAAC,WAAW,SAAS,UAAU,GAAG,CAClD;GAGF,MAAM,SAAkC;IACtC,IAAI,UAAU;IACd,MAAM,UAAU,SAAS,QAAQ,UAAU;IAC3C,QAAQ,UAAU;IAClB,MAAM,UAAU;IAChB,SAAS;IACT,QAAQ,EAAE;IACX;AAED,SAAM,KAAK,cAAc,OAAO;;;CAIpC,MAAM,eAAe,SAAmD;AACtE,OAAK,MAAM,mBAAmB,QAC5B,KAAI,gBAAgB,QAClB,OAAM,KAAK,cAAc,gBAAgB;;CAK/C,MAAM,cAAc,QAA+D;AACjF,MAAI;GAEF,MAAM,WAAW,KAAK,MAAM,SAAS,KAAK,SAAS,CAAC,OAAO,GAAG,CAAC;GAC/D,MAAM,SAAS,KAAK,MAAM,IAAkB,SAAS;AACrD,OAAI,QAAQ;AACV,QAAI,MAAM,EAAE,aAAa,OAAO,IAAI,EAAE,8BAA8B;AACpE,WAAO;;AAIT,OAAI,KAAK,mBAAmB,IAAI,OAAO,GAAG,CACxC,QAAO,KAAK,mBAAmB,IAAI,OAAO,GAAG;GAI/C,IAAI;AACJ,OAAI,WAAW,OAAO,KAAK,CACzB,iBAAgB,OAAO;OAGvB,iBAAgB,qBAAqB,OAAO,MAAM,KAAK,QAAQ,IAClD,qBAAqB,OAAO,IAAI,KAAK,QAAQ;AAG5D,OAAI,CAAC,eAAe;AAClB,QAAI,MAAM;KAAE,aAAa,OAAO;KAAI,MAAM,OAAO;KAAM,EAAE,mCAAmC;AAC5F,SAAK,YAAY,MAAM,OAAO,IAAI,qCAAqC,OAAO,OAAO;AACrF,WAAO;;AAGT,OAAI,MAAM;IAAE,aAAa,OAAO;IAAI;IAAe,EAAE,0BAA0B;GAG/E,MAAM,SAAS,OAAO,UAAU;GAChC,MAAM,eAAe,yBAAyB,eAAe,eAAe,OAAO;AAEnF,OAAI,CAAC,aAAa,MAAM;AACtB,qBAAiB,OAAO,IAAI,aAAa;AAEzC,QAAI,KAAK,eAAe,oBAAoB,WAAW;SAEjD,CAAC,mBAAmB,OAAO,IAAI,KAAK,eAAe,EAAE;AACvD,WAAK,YAAY,MAAM,OAAO,IAAI,0BAA0B,aAAa,SAAS;AAClF,UAAI,MAAM;OAAE,aAAa,OAAO;OAAI,QAAQ,aAAa;OAAQ,EAAE,uCAAuC;AAC1G,aAAO;;;;AAMb,qBAAkB,MAAM,OAAO,IAAI,OAAO;GAE1C,MAAM,WAAW,KAAK,aAAa,cAAc;AACjD,OAAI,CAAC,UAAU;AACb,QAAI,MAAM;KAAE,aAAa,OAAO;KAAI;KAAe,EAAE,wCAAwC;AAC7F,SAAK,YAAY,MAAM,OAAO,IAAI,0BAA0B;AAC5D,WAAO;;AAGT,OAAI,SAAS,SAAS,MAAM;IAC1B,MAAM,QAAQ,SAAS,QAAQ;IAC/B,MAAM,eAAe,yBAAyB,iBAAiB,MAAM;AACrE,QAAI,aAAa,aACf,KAAI,KACF;KAAE,aAAa,OAAO;KAAI;KAAO,QAAQ,aAAa;KAAQ,EAC9D,8CACD;aACQ,CAAC,aAAa,YAAY;AACnC,SAAI,KACF;MAAE,aAAa,OAAO;MAAI;MAAO,gBAAgB;MAAiB,EAClE,sEACD;AACD,UAAK,YAAY,MACf,OAAO,IACP,aAAa,UAAU,2CACxB;AACD,YAAO;;;AAKX,OAAI,SAAS,aACX,KAAI;IACF,MAAM,SAAS,SAAS;IACxB,MAAM,kBAAkB,OAAO;AAG/B,QAAI,OAAO,SAAS,YAAY,OAAO,YAAY;KACjD,MAAM,QAAQ,OAAO;KACrB,MAAM,WAAY,OAAO,YAAyB,EAAE;AAEpD,UAAK,MAAM,SAAS,SAClB,KAAI,gBAAgB,WAAW,KAAA,GAAW;AACxC,UAAI,MAAM;OACR,aAAa,OAAO;OACpB;OACD,EAAE,6DAA6D;AAChE,aAAO;;AAIX,UAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,gBAAgB,EAAE;MAC1D,MAAM,aAAa,MAAM;AACzB,UAAI;WACE,WAAW,QAAQ,CAAC,KAAK,aAAa,OAAO,WAAW,KAAe,EAAE;AAC3E,YAAI,MAAM;SACR,aAAa,OAAO;SACpB,OAAO;SACP,UAAU,WAAW;SACrB,QAAQ,OAAO;SAChB,EAAE,oDAAoD;AACvD,eAAO;;;;;AAMf,QAAI,MAAM,EAAE,aAAa,OAAO,IAAI,EAAE,6BAA6B;YAC5D,KAAK;AACZ,QAAI,KAAK;KAAE;KAAK,aAAa,OAAO;KAAI,EAAE,mCAAmC;;GAKjF,MAAM,eAAe,QAAQ,cAAc;GAC3C,MAAM,MAAM,KAAK,mBAAmB,UAAU,QAAQ,aAAa;GAGnE,MAAM,SAAS,MAAM,KAAK,WAAW,eAAe,SAAS;AAC7D,OAAI,CAAC,QAAQ;AACX,QAAI,MAAM,EAAE,aAAa,OAAO,IAAI,EAAE,sCAAsC;AAC5E,SAAK,YAAY,MAAM,OAAO,IAAI,wBAAwB;AAC1D,WAAO;;AAKT,OAAI,CADgB,KAAK,oBAAoB,OAAO,IAAI,SACxC,CACd,KAAI,KAAK,EAAE,aAAa,OAAO,IAAI,EAAE,iCAAiC;AAIxE,SAAM,KAAK,oBAAoB,QAAQ,KAAK,SAAS;AAErD,mCAAgC;IAC9B,aAAa,OAAO;IACpB;IACA,uBAAwB,IAAyB,gCAAgC;IACjF,QAAQ,IAAI;IACb,CAAC;AAEF,+CAA4C;IAC1C,aAAa,OAAO;IACpB;IACA,uBAAwB,IAAyB,4CAA4C;IAC7F,QAAQ,IAAI;IACb,CAAC;AAGF,QAAK,SAAS,aAAa;IACzB,IAAI,OAAO;IACX,MAAM,SAAS;IACf,SAAS,SAAS;IAClB,MAAM;IACN;IACA,QAAQ,OAAO;IACf,SAAS;IACT,QAAQ,OAAO;IAChB,CAAC;GAKF,MAAM,iBAAiBA,IAAQ,WAAW;AAC1C,QAAK,MAAM,QAAQ,eAAe,QAAQ,CACxC,MAAK,SAAS,QAAQ,KAAK;AAG7B,QAAK,mBAAmB,IAAI,OAAO,IAAI,IAAI;AAG3C,QAAK,MAAM,IAAI,UAAU,IAAI;AAE7B,QAAK,YAAY,KAAK,OAAO,IAAI,qBAAqB,SAAS,OAAO;AACtE,OAAI,KAAK;IAAE,MAAM,SAAS;IAAM,IAAI,SAAS;IAAI,QAAQ,OAAO;IAAQ,EAAE,mBAAmB;AAE7F,UAAO;WACA,OAAO;AACd,OAAI,MAAM;IAAE,KAAK;IAAO,aAAa,OAAO;IAAI,EAAE,0BAA0B;AAC5E,QAAK,YAAY,MAAM,OAAO,IAAI,4BAA4B,QAAQ;AACtE,UAAO;;;;;;;CAQX,oBAA4B,aAAqB,UAAsC;EAWrF,MAAM,UAAU;GANd,UAAU;GACV,OAAO;GACP,mBAAmB;GACnB,cAAc;GAGO,CAVV,SAAS;AAWtB,MAAI,CAAC,QACH,QAAO;EAIT,MAAM,kBAAkB,KAAK,YAAY;AACzC,MAAI,mBAAmB,oBAAoB,aAAa;AACtD,OAAI,KACF;IAAE;IAAa;IAAS;IAAiB,EACzC,8BAA8B,QAAQ,qBAAqB,gBAAgB,GAC5E;AACD,QAAK,YAAY,KACf,aACA,SAAS,QAAQ,qBAAqB,gBAAgB,mBACvD;AACD,UAAO;;EAGT,MAAM,UAAU,KAAK,aAAa,MAAM,SAAS,aAAa,KAAK;AACnE,MAAI,CAAC,QACH,MAAK,YAAY,KAAK,aAAa,SAAS,QAAQ,wCAAwC;AAE9F,SAAO;;CAGT,aAAa,eAAiD;EAC5D,MAAM,eAAe,KAAK,eAAe,wBAAwB;AAGjE,MAAI,WAAW,aAAa,CAC1B,KAAI;GACF,MAAM,MAAM,KAAK,MAAM,aAAa,cAAc,QAAQ,CAAC;AAC3D,OAAI,CAAC,OAAO,OAAO,QAAQ,YAAY,MAAM,QAAQ,IAAI,EAAE;AACzD,QAAI,MAAM,EAAE,cAAc,EAAE,sCAAsC;AAClE,WAAO;;AAET,UAAO,2BAA2B,IAA+B;WAC1D,OAAO;AACd,OAAI,MAAM;IAAE,KAAK;IAAO;IAAc,EAAE,2BAA2B;AACnE,UAAO;;EAKX,MAAM,cAAc,KAAK,eAAe,eAAe;AACvD,MAAI,WAAW,YAAY,CACzB,KAAI;GACF,MAAM,cAAc,KAAK,MAAM,aAAa,aAAa,QAAQ,CAAC;AAGlE,OAAI,YAAY,MAAM,WAAW;IAC/B,MAAM,aAAa,YAAY;AAC/B,WAAO,2BAA2B;KAChC,IAAI,WAAW,MAAM,YAAY;KACjC,MAAM,WAAW,QAAQ,YAAY;KACrC,aAAa,WAAW,eAAe,YAAY;KACnD,SAAS,WAAW,WAAW,YAAY,WAAW;KACtD,MAAM,WAAW,QAAQ;KACzB,MAAM,WAAW,QAAQ,YAAY,QAAQ;KAC7C,cAAc,WAAW;KAC1B,CAAC;;AAIJ,OAAI,YAAY,MAAM,WAAW,kBAAkB,CAEjD,QAAO,2BAA2B;IAChC,IAFS,YAAY,KAAK,QAAQ,mBAAmB,GAEnD;IACF,MAAM,YAAY;IAClB,aAAa,YAAY;IACzB,SAAS,YAAY,WAAW;IAChC,MAAM;IACN,MAAM,YAAY,QAAQ;IAC3B,CAAC;WAEG,OAAO;AACd,OAAI,MAAM;IAAE,KAAK;IAAO;IAAa,EAAE,+BAA+B;;AAI1E,SAAO;;;;;;CAOT,sBAA8B,UAAuC;EACnE,MAAM,MAAM;GACV,SAAS;GACT;GACA;GACA;GACA;GACD,CAAC,OAAO,QAAQ;EAEjB,MAAM,MAAgB,EAAE;AACxB,OAAK,MAAM,SAAS,KAAK;AACvB,OAAI,KAAK,MAAM;AACf,OAAI,MAAM,SAAS,OAAO,CACxB,KAAI,KAAK,GAAG,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK;YAC3B,MAAM,SAAS,MAAM,CAC9B,KAAI,KAAK,GAAG,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK;YAC3B,MAAM,SAAS,OAAO,CAC/B,KAAI,KAAK,GAAG,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM;YAC5B,MAAM,SAAS,OAAO,CAC/B,KAAI,KAAK,GAAG,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM;;AAGzC,SAAO,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC;;CAG1B,MAAc,WACZ,eACA,UACiC;EACjC,MAAM,cAAc,KAAK,sBAAsB,SAAS;AAExD,OAAK,MAAM,SAAS,aAAa;GAC/B,MAAM,WAAW,WAAW,MAAM,GAAG,QAAQ,KAAK,eAAe,MAAM;AAEvE,OAAI,WAAW,SAAS,CACtB,KAAI;AACF,QAAI,kBAAkB,KAAK,SAAS,EAAE;KAEpC,MAAM,MADU,cAAc,OAAO,KAAK,IACvB,CAAC,SAAS;AAC7B,YAAO,IAAI,WAAW;;IAExB,MAAM,MAAM,KAAK,KAAK,SAAS;AAC/B,WAAO,IAAI,WAAW;YACf,OAAO;AACd,QAAI,KAAK;KAAE,KAAK;KAAO,MAAM;KAAU,EAAE,wBAAwB;;;AAKvE,SAAO;;CAGT,mBACE,UACA,UACA,cACc;EACd,MAAM,SAAS,sBAAsB,IAAI,SAAS,GAAG,GAAG;EACxD,MAAM,cAAc,mBAAmB,cAAc,KAAK,QAAQ,gBAAgB,GAAG;EAErF,MAAM,YAAY,KAAK,cAAe,EAAE;EACxC,MAAM,gBAAiB,SAAS,UAAU,EAAE;EAE5C,MAAM,UACJ,KAAK,cAAc,KAAK,kBACpB;GACE,QAAQ,KAAK;GACb,KAAK,KAAK,gBAAgB;GAC1B,KAAK;GACL,gBAAgB,KAAK,gBAAgB;GACrC,6BAA6B,KAAK,gBAAgB;GAClD,UAAU,KAAK,gBAAgB;GAC/B,iBAAiB,KAAK,gBAAgB;GACtC,aAAa,KAAK,gBAAgB;GAClC,aAAa,KAAK,gBAAgB;GACnC,GACD,KAAK,aACH;GACE,QAAQ,KAAK;GACb,KAAK;GACN,GACD,KAAA;EAER,MAAM,MAAM,IAAI,iBACd,SAAS,IACT,SAAS,MACT,SAAS,SACT,cACA,WACA,eACA,QACA,aACA,KAAK,UACL,QACD;AACD,MAAI,SAAS,QAAQ,gBAAgB,OACnC,KAAI,yBAAyB,SAAS,OAAO,eAAe;EAE9D,MAAM,mBAAmB,SAAS,IAAI,eAAe;AACrD,MAAI,kBAAkB,OACnB,KAAyB,qBAAqB,iBAAiB;AAElE,SAAO;;CAGT,MAAc,oBACZ,QACA,KACA,WACe;AACf,MAAI,OAAO,WAAW,WAEpB,OAAM,OAAO,IAAI;WACR,OAAO,WAAW,YAAY,OAAO,SAE9C,OAAM,OAAO,SAAS,IAAI;;CAI9B,MAAM,gBAA+B;EACnC,MAAM,WAAW,MAAM,KAAK,KAAK,SAAS,SAAS,QAAQ,CAAC;AAE5D,OAAK,MAAM,WAAW,UAAU;GAC9B,MAAM,aAAa,oBAAoB,QAAQ,GAAG;AAClD,OAAI;AACF,UAAM,QAAQ,SAAS;AACvB,eAAW,KAAK,kBAAkB;YAC3B,OAAO;AACd,eAAW,MAAM,EAAE,KAAK,OAAO,EAAE,0BAA0B;;;;CAKjE,MAAM,eAA8B;EAClC,MAAM,WAAW,MAAM,KAAK,KAAK,SAAS,SAAS,QAAQ,CAAC,CAAC,SAAS;AAEtE,OAAK,MAAM,WAAW,SACpB,KAAI,QAAQ,MAAM;GAChB,MAAM,aAAa,oBAAoB,QAAQ,GAAG;AAClD,OAAI;AACF,UAAM,QAAQ,MAAM;AACpB,eAAW,KAAK,kBAAkB;YAC3B,OAAO;AACd,eAAW,MAAM,EAAE,KAAK,OAAO,EAAE,yBAAyB;;;;;;;CASlE,aAAqB,OAAgB,cAA+B;AAClE,MAAI,iBAAiB,SAAU,QAAO,OAAO,UAAU;AACvD,MAAI,iBAAiB,YAAY,iBAAiB,UAAW,QAAO,OAAO,UAAU;AACrF,MAAI,iBAAiB,UAAW,QAAO,OAAO,UAAU;AACxD,MAAI,iBAAiB,QAAS,QAAO,MAAM,QAAQ,MAAM;AACzD,MAAI,iBAAiB,SAAU,QAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,MAAM;AAC1G,SAAO;;;AAQX,SAAgB,qBAAqB,IAAY,UAAiD;CAChG,MAAM,IAAI,YAAY;CAGtB,MAAM,gBAAgB,KAAK,8BAA8B,GAF7C,sBAAsB,EAE6B,CAAC,EAAE,GAAG;AACrE,KAAI,WAAW,cAAc,CAAE,QAAO;CAGtC,MAAM,aAAa,KAAK,sBAAsB,EAAE,GAAG;AACnD,KAAI,WAAW,WAAW,CAAE,QAAO;CAGnC,MAAM,aAAa,6BAA6B;AAChD,KAAI,YAAY;EACd,MAAM,cAAc,KAAK,YAAY,GAAG;AACxC,MAAI,WAAW,YAAY,CAAE,QAAO;;AAItC,KAAI;AAGF,SAAO,QAFS,cAAc,OAAO,KAAK,IAClB,CAAC,QAAQ,GACV,CAAC;SAClB;AACN,SAAO;;;AAIX,SAAgB,yBACd,WAC2B;CAC3B,MAAM,aAAwC,EAAE;CAEhD,MAAM,UAAW,UAAU,WAAwB,EAAE;CACrD,MAAM,WAAY,UAAU,YAAyB,EAAE;AAGvD,MAAK,MAAM,MAAM,SAAS;EACxB,MAAM,SAAU,UAAU,OAAmC,EAAE;AAC/D,aAAW,KAAK;GACd;GACA,MAAM;GACN,QAAQ;GACR,MAAM;GACN,SAAS;GACT;GACD,CAAC;;AAIJ,MAAK,MAAM,MAAM,SACf,KAAI,CAAC,WAAW,MAAM,MAAM,EAAE,OAAO,GAAG,EAAE;EACxC,MAAM,SAAU,UAAU,OAAmC,EAAE;AAC/D,aAAW,KAAK;GACd;GACA,MAAM;GACN,QAAQ;GACR,MAAM;GACN,SAAS;GACT;GACD,CAAC;;AAIN,QAAO"}