@xopcai/xopc 0.0.103 → 0.0.104

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (930) hide show
  1. package/README.md +7 -4
  2. package/README.zh-CN.md +7 -4
  3. package/dist/_virtual/_rolldown/runtime.js +2 -3
  4. package/dist/browser-ext/manifest.json +1 -1
  5. package/dist/extensions/feishu/src/adapters/cli-login.d.ts +1 -1
  6. package/dist/extensions/feishu/src/adapters/cli-login.js +1 -1
  7. package/dist/extensions/feishu/src/adapters/cli-login.js.map +1 -1
  8. package/dist/extensions/feishu/src/adapters/gateway-setup.d.ts +2 -0
  9. package/dist/extensions/feishu/src/adapters/gateway-setup.js +225 -0
  10. package/dist/extensions/feishu/src/adapters/gateway-setup.js.map +1 -0
  11. package/dist/extensions/feishu/src/index.d.ts +8 -1
  12. package/dist/extensions/feishu/src/index.js +14 -1
  13. package/dist/extensions/feishu/src/index.js.map +1 -0
  14. package/dist/extensions/feishu/src/outbound/outbound-adapter.js +1 -1
  15. package/dist/extensions/feishu/src/plugin.d.ts +2 -1
  16. package/dist/extensions/feishu/src/plugin.js +2 -0
  17. package/dist/extensions/feishu/src/plugin.js.map +1 -1
  18. package/dist/extensions/feishu/src/streaming/streaming-adapter.js +1 -1
  19. package/dist/extensions/feishu/src/transport/webhook/monitor.js +1 -1
  20. package/dist/extensions/feishu/xopc.extension.json +66 -1
  21. package/dist/extensions/telegram/src/adapters/gateway-setup.d.ts +2 -0
  22. package/dist/extensions/telegram/src/adapters/gateway-setup.js +146 -0
  23. package/dist/extensions/telegram/src/adapters/gateway-setup.js.map +1 -0
  24. package/dist/extensions/telegram/src/adapters/security-adapter.js +1 -1
  25. package/dist/extensions/telegram/src/command-handler.js +1 -2
  26. package/dist/extensions/telegram/src/command-handler.js.map +1 -1
  27. package/dist/extensions/telegram/src/config-schema.js +2 -2
  28. package/dist/extensions/telegram/src/config-schema.js.map +1 -1
  29. package/dist/extensions/telegram/src/doctor.d.ts +1 -0
  30. package/dist/extensions/telegram/src/doctor.js +68 -0
  31. package/dist/extensions/telegram/src/doctor.js.map +1 -1
  32. package/dist/extensions/telegram/src/index.d.ts +8 -1
  33. package/dist/extensions/telegram/src/index.js +15 -2
  34. package/dist/extensions/telegram/src/index.js.map +1 -0
  35. package/dist/extensions/telegram/src/plugin.d.ts +13 -5
  36. package/dist/extensions/telegram/src/plugin.js +32 -12
  37. package/dist/extensions/telegram/src/plugin.js.map +1 -1
  38. package/dist/extensions/telegram/src/proxy-fetch.js +22 -5
  39. package/dist/extensions/telegram/src/proxy-fetch.js.map +1 -1
  40. package/dist/extensions/telegram/xopc.extension.json +412 -5
  41. package/dist/extensions/weixin/src/adapters/onboard-cli.js +2 -2
  42. package/dist/extensions/weixin/src/adapters/onboard-cli.js.map +1 -1
  43. package/dist/extensions/weixin/src/api/api.js +1 -1
  44. package/dist/extensions/weixin/src/index.d.ts +8 -0
  45. package/dist/extensions/weixin/src/index.js +12 -1
  46. package/dist/extensions/weixin/src/index.js.map +1 -0
  47. package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
  48. package/dist/extensions/weixin/src/plugin.d.ts +2 -1
  49. package/dist/extensions/weixin/src/plugin.js +77 -2
  50. package/dist/extensions/weixin/src/plugin.js.map +1 -1
  51. package/dist/extensions/weixin/xopc.extension.json +52 -0
  52. package/dist/gateway/static/root/assets/agents-CvsBrBfi.js +396 -0
  53. package/dist/gateway/static/root/assets/{apps-page-C5RmwmTT.js → apps-page-L-IwQTe0.js} +1 -1
  54. package/dist/gateway/static/root/assets/browser-BLJWD7WI.js +8 -0
  55. package/dist/gateway/static/root/assets/channels-settings-D95KuPeP.js +1 -0
  56. package/dist/gateway/static/root/assets/cron-page-CfkWXDAI.js +1 -0
  57. package/dist/gateway/static/root/assets/{dist-CWm8hTXZ.js → dist-C6vclgEL.js} +1 -1
  58. package/dist/gateway/static/root/assets/{extension-debug-page-BzYgTkS9.js → extension-debug-page-D4JYAbsX.js} +1 -1
  59. package/dist/gateway/static/root/assets/{extension-page-BmTZH6gL.js → extension-page-_T62gi6e.js} +1 -1
  60. package/dist/gateway/static/root/assets/extension-settings-page-CkJbjyM-.js +1 -0
  61. package/dist/gateway/static/root/assets/{fetch-CMoWY2Si.js → fetch-B5aiIguv.js} +1 -1
  62. package/dist/gateway/static/root/assets/gateway-startup-retry-DqmLXhs6.js +1 -0
  63. package/dist/gateway/static/root/assets/heartbeat-config-api-HwJV1K_Y.js +1 -0
  64. package/dist/gateway/static/root/assets/index-BPYKW7FB.css +1 -0
  65. package/dist/gateway/static/root/assets/index-DvTb6wNR.js +4845 -0
  66. package/dist/gateway/static/root/assets/{logs-page-BjdQjHwk.js → logs-page-DsjtTjBy.js} +2 -2
  67. package/dist/gateway/static/root/assets/{note-detail-page-8Er4197b.js → note-detail-page-B2V7RhgD.js} +43 -43
  68. package/dist/gateway/static/root/assets/{note-time-CF3vf1jm.js → note-time-BG8GCTr4.js} +1 -1
  69. package/dist/gateway/static/root/assets/notes-page-xrcVBQ6Z.js +1 -0
  70. package/dist/gateway/static/root/assets/schema-form-S-QUvhul.js +1 -0
  71. package/dist/gateway/static/root/assets/sessions-page-CrQer6Au.js +1 -0
  72. package/dist/gateway/static/root/assets/settings-advanced-gate-DujQl9c7.js +2 -0
  73. package/dist/gateway/static/root/assets/{settings-form-section-C7qA7y0J.js → settings-form-section-r1V7dRV6.js} +1 -1
  74. package/dist/gateway/static/root/assets/settings-page-C9nrONQ2.js +3 -0
  75. package/dist/gateway/static/root/assets/{share-preview-page-Tvr5Mtq5.js → share-preview-page-DOFy0FNt.js} +1 -1
  76. package/dist/gateway/static/root/assets/skills-page-DmTsrs_a.js +2 -0
  77. package/dist/gateway/static/root/assets/{theme-store-HTvJlFLL.js → theme-store-Bo3j5Ovv.js} +1 -1
  78. package/dist/gateway/static/root/assets/url-WgQIjFZu.js +3 -0
  79. package/dist/gateway/static/root/assets/voice-api-key-field-AjmUAlEQ.js +1 -0
  80. package/dist/gateway/static/root/assets/{workflow-page.utils-CeBkAjP7.js → workflow-page.utils-DLEJ92gK.js} +1 -1
  81. package/dist/gateway/static/root/assets/workflows-page-BnjjKrM1.js +27 -0
  82. package/dist/gateway/static/root/index.html +6 -5
  83. package/dist/package.js +1 -1
  84. package/dist/src/agent/agent-manager.d.ts +18 -6
  85. package/dist/src/agent/agent-manager.js +60 -35
  86. package/dist/src/agent/agent-manager.js.map +1 -1
  87. package/dist/src/agent/builtin-agent-ids.d.ts +2 -0
  88. package/dist/src/agent/builtin-agent-ids.js +17 -0
  89. package/dist/src/agent/builtin-agent-ids.js.map +1 -0
  90. package/dist/src/agent/child-agent-factory.d.ts +4 -0
  91. package/dist/src/agent/child-agent-factory.js +28 -8
  92. package/dist/src/agent/child-agent-factory.js.map +1 -1
  93. package/dist/src/agent/context/workspace-seed.js +1 -1
  94. package/dist/src/agent/context/workspace-templates/AGENTS.md +23 -184
  95. package/dist/src/agent/embedded/run-turn.js +8 -2
  96. package/dist/src/agent/embedded/run-turn.js.map +1 -1
  97. package/dist/src/agent/embedded/session-tool-result-guard.js +1 -1
  98. package/dist/src/agent/embedded/subscribe-session.js +33 -51
  99. package/dist/src/agent/embedded/subscribe-session.js.map +1 -1
  100. package/dist/src/agent/embedded/types.d.ts +36 -35
  101. package/dist/src/agent/fallback/candidates.js +1 -1
  102. package/dist/src/agent/fallback/candidates.js.map +1 -1
  103. package/dist/src/agent/inbound/inbound-loop.js +1 -1
  104. package/dist/src/agent/inbound/turn-dispatcher.d.ts +1 -0
  105. package/dist/src/agent/inbound/turn-dispatcher.js +24 -5
  106. package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -1
  107. package/dist/src/agent/models/manager.d.ts +1 -1
  108. package/dist/src/agent/models/manager.js +1 -1
  109. package/dist/src/agent/models/manager.js.map +1 -1
  110. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.d.ts +1 -1
  111. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js +1 -1
  112. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js.map +1 -1
  113. package/dist/src/agent/prompt/sections/tooling.js +4 -0
  114. package/dist/src/agent/prompt/sections/tooling.js.map +1 -1
  115. package/dist/src/agent/service/direct-turn-helpers.d.ts +1 -0
  116. package/dist/src/agent/service/direct-turn-helpers.js +1 -1
  117. package/dist/src/agent/service/direct-turn-helpers.js.map +1 -1
  118. package/dist/src/agent/service/process-direct-streaming.d.ts +1 -0
  119. package/dist/src/agent/service/process-direct-streaming.js +35 -18
  120. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  121. package/dist/src/agent/service-inbound-utils.d.ts +0 -1
  122. package/dist/src/agent/service-inbound-utils.js +1 -17
  123. package/dist/src/agent/service-inbound-utils.js.map +1 -1
  124. package/dist/src/agent/service.d.ts +4 -4
  125. package/dist/src/agent/service.js +27 -15
  126. package/dist/src/agent/service.js.map +1 -1
  127. package/dist/src/agent/session/session-config-service.d.ts +1 -0
  128. package/dist/src/agent/session/session-config-service.js +9 -1
  129. package/dist/src/agent/session/session-config-service.js.map +1 -1
  130. package/dist/src/agent/session/session-inspector.d.ts +2 -1
  131. package/dist/src/agent/session/session-inspector.js +4 -0
  132. package/dist/src/agent/session/session-inspector.js.map +1 -1
  133. package/dist/src/agent/skills/config.js +1 -3
  134. package/dist/src/agent/skills/config.js.map +1 -1
  135. package/dist/src/agent/skills/format-skills-prompt.d.ts +1 -0
  136. package/dist/src/agent/skills/format-skills-prompt.js +3 -2
  137. package/dist/src/agent/skills/format-skills-prompt.js.map +1 -1
  138. package/dist/src/agent/skills/hub-pull.js +1 -1
  139. package/dist/src/agent/skills/index.js +20 -5
  140. package/dist/src/agent/skills/index.js.map +1 -1
  141. package/dist/src/agent/skills/installer.js +14 -27
  142. package/dist/src/agent/skills/installer.js.map +1 -1
  143. package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js +11 -1
  144. package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js.map +1 -1
  145. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js +18 -4
  146. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js.map +1 -1
  147. package/dist/src/agent/skills/marketplace/adapters/store/adapter.js +11 -2
  148. package/dist/src/agent/skills/marketplace/adapters/store/adapter.js.map +1 -1
  149. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.d.ts +2 -2
  150. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js.map +1 -1
  151. package/dist/src/agent/skills/skill-manager.d.ts +4 -1
  152. package/dist/src/agent/skills/skill-manager.js +3 -3
  153. package/dist/src/agent/skills/skill-manager.js.map +1 -1
  154. package/dist/src/agent/skills/skill-view-path.d.ts +1 -17
  155. package/dist/src/agent/skills/skill-view-path.js +3 -66
  156. package/dist/src/agent/skills/skill-view-path.js.map +1 -1
  157. package/dist/src/agent/skills/test-framework.js +2 -3
  158. package/dist/src/agent/skills/test-framework.js.map +1 -1
  159. package/dist/src/agent/streaming/reasoning-visibility-sse.js +1 -0
  160. package/dist/src/agent/streaming/reasoning-visibility-sse.js.map +1 -1
  161. package/dist/src/agent/tool-manuals/browser.d.ts +1 -0
  162. package/{skills/browser/SKILL.md → dist/src/agent/tool-manuals/browser.js} +51 -54
  163. package/dist/src/agent/tool-manuals/browser.js.map +1 -0
  164. package/dist/src/agent/tool-manuals/index.d.ts +10 -0
  165. package/dist/src/agent/tool-manuals/index.js +28 -0
  166. package/dist/src/agent/tool-manuals/index.js.map +1 -0
  167. package/dist/src/agent/tools/browser/tool/browser-use-tool.js +1 -1
  168. package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +1 -1
  169. package/dist/src/agent/tools/factory.js +7 -5
  170. package/dist/src/agent/tools/factory.js.map +1 -1
  171. package/dist/src/agent/tools/index.d.ts +1 -0
  172. package/dist/src/agent/tools/index.js +5 -4
  173. package/dist/src/agent/tools/session-search-tool.js +1 -1
  174. package/dist/src/agent/tools/shell.js +1 -1
  175. package/dist/src/agent/tools/skills-tools.js +37 -8
  176. package/dist/src/agent/tools/skills-tools.js.map +1 -1
  177. package/dist/src/agent/tools/tool-manual-tool.d.ts +6 -0
  178. package/dist/src/agent/tools/tool-manual-tool.js +34 -0
  179. package/dist/src/agent/tools/tool-manual-tool.js.map +1 -0
  180. package/dist/src/agent/tools/web-extract.js +2 -2
  181. package/dist/src/agent/tools/web.js +1 -1
  182. package/dist/src/agent/workflow/catalog.d.ts +7 -2
  183. package/dist/src/agent/workflow/catalog.js +66 -25
  184. package/dist/src/agent/workflow/catalog.js.map +1 -1
  185. package/dist/src/agent/workflow/subagent-runner.d.ts +3 -0
  186. package/dist/src/agent/workflow/subagent-runner.js +50 -4
  187. package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
  188. package/dist/src/agent/workflow/types.d.ts +10 -0
  189. package/dist/src/auth/credentials.js +10 -5
  190. package/dist/src/auth/credentials.js.map +1 -1
  191. package/dist/src/browser/actions/extension-registry-bridge.js +1 -1
  192. package/dist/src/browser/actions/registry.js +2 -2
  193. package/dist/src/browser/cdp-local-launcher.js +1 -1
  194. package/dist/src/browser/index.js +3 -3
  195. package/dist/src/browser/providers/browser-ext-install.js +1 -1
  196. package/dist/src/browser/providers/cloakbrowser.js +1 -1
  197. package/dist/src/channels/catalog/channel-catalog-service.d.ts +11 -0
  198. package/dist/src/channels/catalog/channel-catalog-service.js +168 -0
  199. package/dist/src/channels/catalog/channel-catalog-service.js.map +1 -0
  200. package/dist/src/channels/catalog/channel-catalog-types.d.ts +22 -0
  201. package/dist/src/channels/catalog/channel-catalog-types.js +1 -0
  202. package/dist/src/channels/dock.d.ts +0 -7
  203. package/dist/src/channels/dock.js +1 -21
  204. package/dist/src/channels/index.d.ts +1 -3
  205. package/dist/src/channels/index.js +1 -5
  206. package/dist/src/channels/lifecycle-supervisor.d.ts +1 -0
  207. package/dist/src/channels/lifecycle-supervisor.js +11 -0
  208. package/dist/src/channels/lifecycle-supervisor.js.map +1 -1
  209. package/dist/src/channels/manager.d.ts +1 -0
  210. package/dist/src/channels/manager.js +3 -0
  211. package/dist/src/channels/manager.js.map +1 -1
  212. package/dist/src/channels/pairing/pairing-channel.d.ts +2 -3
  213. package/dist/src/channels/pairing/pairing-messages.js +1 -1
  214. package/dist/src/channels/pairing/pairing-messages.js.map +1 -1
  215. package/dist/src/channels/pairing/pairing-service.d.ts +1 -1
  216. package/dist/src/channels/pairing/pairing-service.js +8 -27
  217. package/dist/src/channels/pairing/pairing-service.js.map +1 -1
  218. package/dist/src/channels/plugin-types.d.ts +3 -1
  219. package/dist/src/channels/plugins/types.adapters.d.ts +55 -2
  220. package/dist/src/channels/telegram/index.js +1 -1
  221. package/dist/src/chat-commands/builtins/config.js +4 -4
  222. package/dist/src/chat-commands/builtins/config.js.map +1 -1
  223. package/dist/src/chat-commands/config-paths.js +1 -1
  224. package/dist/src/chat-commands/config-paths.js.map +1 -1
  225. package/dist/src/chat-commands/context.js +1 -1
  226. package/dist/src/chat-commands/context.js.map +1 -1
  227. package/dist/src/cli/bin.js +1 -1
  228. package/dist/src/cli/command-manifest.js +1 -1
  229. package/dist/src/cli/command-manifest.js.map +1 -1
  230. package/dist/src/cli/commands/agent.js +2 -2
  231. package/dist/src/cli/commands/agent.js.map +1 -1
  232. package/dist/src/cli/commands/agents.js +2 -4
  233. package/dist/src/cli/commands/agents.js.map +1 -1
  234. package/dist/src/cli/commands/auth.js +1 -1
  235. package/dist/src/cli/commands/browser-cli-helpers.js +1 -1
  236. package/dist/src/cli/commands/channels.d.ts +1 -5
  237. package/dist/src/cli/commands/channels.js +115 -281
  238. package/dist/src/cli/commands/channels.js.map +1 -1
  239. package/dist/src/cli/commands/config.js +2 -2
  240. package/dist/src/cli/commands/config.js.map +1 -1
  241. package/dist/src/cli/commands/doctor/checks/channel-config.js +16 -69
  242. package/dist/src/cli/commands/doctor/checks/channel-config.js.map +1 -1
  243. package/dist/src/cli/commands/doctor/checks/channel-pairing-pending.js +6 -4
  244. package/dist/src/cli/commands/doctor/checks/channel-pairing-pending.js.map +1 -1
  245. package/dist/src/cli/commands/doctor/checks/channel-plugins.js +2 -2
  246. package/dist/src/cli/commands/doctor/checks/channel-plugins.js.map +1 -1
  247. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  248. package/dist/src/cli/commands/doctor/checks/provider-auth.js +13 -9
  249. package/dist/src/cli/commands/doctor/checks/provider-auth.js.map +1 -1
  250. package/dist/src/cli/commands/extension-dev.js +2 -1
  251. package/dist/src/cli/commands/extension-dev.js.map +1 -1
  252. package/dist/src/cli/commands/extension-marketplace.js +2 -1
  253. package/dist/src/cli/commands/extension-marketplace.js.map +1 -1
  254. package/dist/src/cli/commands/extension-pack.js +2 -1
  255. package/dist/src/cli/commands/extension-pack.js.map +1 -1
  256. package/dist/src/cli/commands/models.js +7 -4
  257. package/dist/src/cli/commands/models.js.map +1 -1
  258. package/dist/src/cli/commands/onboard/channels/index.js +1 -1
  259. package/dist/src/cli/commands/onboard/channels/index.js.map +1 -1
  260. package/dist/src/cli/commands/onboard/channels/registry.d.ts +2 -1
  261. package/dist/src/cli/commands/onboard/channels/registry.js +32 -8
  262. package/dist/src/cli/commands/onboard/channels/registry.js.map +1 -1
  263. package/dist/src/cli/commands/onboard/model.js +8 -5
  264. package/dist/src/cli/commands/onboard/model.js.map +1 -1
  265. package/dist/src/cli/commands/onboard.js +4 -6
  266. package/dist/src/cli/commands/onboard.js.map +1 -1
  267. package/dist/src/cli/commands/setup-shared/runner.d.ts +1 -1
  268. package/dist/src/cli/commands/setup-shared/runner.js.map +1 -1
  269. package/dist/src/cli/commands/setup-shared/types.d.ts +1 -1
  270. package/dist/src/cli/commands/setup-shared/types.js.map +1 -1
  271. package/dist/src/cli/commands/tui.js +13 -5
  272. package/dist/src/cli/commands/tui.js.map +1 -1
  273. package/dist/src/cli/extension-cli-register.js +1 -1
  274. package/dist/src/commands/agents.config.d.ts +3 -3
  275. package/dist/src/commands/agents.config.js +7 -7
  276. package/dist/src/commands/agents.config.js.map +1 -1
  277. package/dist/src/config/agent-profile.d.ts +1 -1
  278. package/dist/src/config/agent-profile.js +6 -2
  279. package/dist/src/config/agent-profile.js.map +1 -1
  280. package/dist/src/config/agent-typed-models.d.ts +2 -2
  281. package/dist/src/config/agent-typed-models.js +13 -2
  282. package/dist/src/config/agent-typed-models.js.map +1 -1
  283. package/dist/src/config/index.js +3 -3
  284. package/dist/src/config/integration.d.ts +1 -1
  285. package/dist/src/config/loader.d.ts +0 -1
  286. package/dist/src/config/loader.js +4 -9
  287. package/dist/src/config/loader.js.map +1 -1
  288. package/dist/src/config/models-json.d.ts +6 -6
  289. package/dist/src/config/rules.js +2 -12
  290. package/dist/src/config/rules.js.map +1 -1
  291. package/dist/src/config/schema.d.ts +74 -47
  292. package/dist/src/config/schema.js +28 -66
  293. package/dist/src/config/schema.js.map +1 -1
  294. package/dist/src/config/validate-channel-configs.d.ts +0 -3
  295. package/dist/src/config/validate-channel-configs.js +29 -10
  296. package/dist/src/config/validate-channel-configs.js.map +1 -1
  297. package/dist/src/cron/executor.js +1 -4
  298. package/dist/src/cron/executor.js.map +1 -1
  299. package/dist/src/extensions/activation-context.js +3 -1
  300. package/dist/src/extensions/activation-context.js.map +1 -1
  301. package/dist/src/extensions/activation-planner.js +12 -0
  302. package/dist/src/extensions/activation-planner.js.map +1 -1
  303. package/dist/src/extensions/api.d.ts +5 -1
  304. package/dist/src/extensions/api.js +12 -0
  305. package/dist/src/extensions/api.js.map +1 -1
  306. package/dist/src/extensions/discover-extensions.js +17 -13
  307. package/dist/src/extensions/discover-extensions.js.map +1 -1
  308. package/dist/src/extensions/extension-metadata-snapshot.js +11 -5
  309. package/dist/src/extensions/extension-metadata-snapshot.js.map +1 -1
  310. package/dist/src/extensions/index.js +12 -4
  311. package/dist/src/extensions/index.js.map +1 -0
  312. package/dist/src/extensions/loader.d.ts +5 -1
  313. package/dist/src/extensions/loader.js +12 -11
  314. package/dist/src/extensions/loader.js.map +1 -1
  315. package/dist/src/extensions/manifest-registry.js +98 -93
  316. package/dist/src/extensions/manifest-registry.js.map +1 -1
  317. package/dist/src/extensions/normalize-manifest.js +91 -15
  318. package/dist/src/extensions/normalize-manifest.js.map +1 -1
  319. package/dist/src/extensions/sdk/index.js +1 -1
  320. package/dist/src/extensions/sdk/testing.js +4 -0
  321. package/dist/src/extensions/sdk/testing.js.map +1 -1
  322. package/dist/src/extensions/types/core.d.ts +32 -1
  323. package/dist/src/extensions/types/manifest.d.ts +60 -0
  324. package/dist/src/extensions/types/tui.d.ts +414 -5
  325. package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
  326. package/dist/src/gateway/agent-builtin-tools.js +16 -0
  327. package/dist/src/gateway/agent-builtin-tools.js.map +1 -1
  328. package/dist/src/gateway/agent-run-relay.d.ts +2 -3
  329. package/dist/src/gateway/agent-run-relay.js +10 -3
  330. package/dist/src/gateway/agent-run-relay.js.map +1 -1
  331. package/dist/src/gateway/agents-admin.d.ts +32 -19
  332. package/dist/src/gateway/agents-admin.js +113 -93
  333. package/dist/src/gateway/agents-admin.js.map +1 -1
  334. package/dist/src/gateway/chat-stream/mapper.d.ts +34 -0
  335. package/dist/src/gateway/chat-stream/mapper.js +244 -0
  336. package/dist/src/gateway/chat-stream/mapper.js.map +1 -0
  337. package/dist/src/gateway/chat-stream/protocol.d.ts +100 -0
  338. package/dist/src/gateway/chat-stream/protocol.js +1 -0
  339. package/dist/src/gateway/heartbeat/service.js +1 -1
  340. package/dist/src/gateway/hono/lib/agent-model.d.ts +4 -4
  341. package/dist/src/gateway/hono/lib/agent-model.js +13 -11
  342. package/dist/src/gateway/hono/lib/agent-model.js.map +1 -1
  343. package/dist/src/gateway/hono/lib/config-payload.d.ts +19 -7
  344. package/dist/src/gateway/hono/lib/config-payload.js +16 -15
  345. package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
  346. package/dist/src/gateway/hono/routes/agents.js +83 -48
  347. package/dist/src/gateway/hono/routes/agents.js.map +1 -1
  348. package/dist/src/gateway/hono/routes/channels.js +134 -214
  349. package/dist/src/gateway/hono/routes/channels.js.map +1 -1
  350. package/dist/src/gateway/hono/routes/commands-skills.js +10 -4
  351. package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
  352. package/dist/src/gateway/hono/routes/config-patch/agents.js +26 -13
  353. package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -1
  354. package/dist/src/gateway/hono/routes/config-patch/channels.d.ts +1 -11
  355. package/dist/src/gateway/hono/routes/config-patch/channels.js +18 -165
  356. package/dist/src/gateway/hono/routes/config-patch/channels.js.map +1 -1
  357. package/dist/src/gateway/hono/routes/config.js +5 -2
  358. package/dist/src/gateway/hono/routes/config.js.map +1 -1
  359. package/dist/src/gateway/hono/routes/dreaming.js +1 -1
  360. package/dist/src/gateway/hono/routes/lazy-bundles.js +13 -1
  361. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  362. package/dist/src/gateway/hono/routes/public-gateway.js +2 -4
  363. package/dist/src/gateway/hono/routes/public-gateway.js.map +1 -1
  364. package/dist/src/gateway/hono/routes/sessions.js +179 -0
  365. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  366. package/dist/src/gateway/hono/routes/tui.d.ts +3 -0
  367. package/dist/src/gateway/hono/routes/tui.js +16 -0
  368. package/dist/src/gateway/hono/routes/tui.js.map +1 -0
  369. package/dist/src/gateway/hono/routes/workflows.js +25 -1
  370. package/dist/src/gateway/hono/routes/workflows.js.map +1 -1
  371. package/dist/src/gateway/hono/sse.d.ts +5 -7
  372. package/dist/src/gateway/hono/sse.js +21 -38
  373. package/dist/src/gateway/hono/sse.js.map +1 -1
  374. package/dist/src/gateway/protocol.js.map +1 -1
  375. package/dist/src/gateway/service/agent-runner.d.ts +2 -4
  376. package/dist/src/gateway/service/agent-runner.js +1 -1
  377. package/dist/src/gateway/service/agent-runner.js.map +1 -1
  378. package/dist/src/gateway/service/marketplace-service.d.ts +4 -3
  379. package/dist/src/gateway/service/marketplace-service.js +7 -4
  380. package/dist/src/gateway/service/marketplace-service.js.map +1 -1
  381. package/dist/src/gateway/service/run-gateway-agent.d.ts +2 -6
  382. package/dist/src/gateway/service/run-gateway-agent.js +63 -36
  383. package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
  384. package/dist/src/gateway/service/sessions-api.d.ts +19 -0
  385. package/dist/src/gateway/service/sessions-api.js +12 -0
  386. package/dist/src/gateway/service/sessions-api.js.map +1 -1
  387. package/dist/src/gateway/service.d.ts +6 -0
  388. package/dist/src/gateway/service.js +73 -57
  389. package/dist/src/gateway/service.js.map +1 -1
  390. package/dist/src/heartbeat/index.js +1 -1
  391. package/dist/src/mcp/channel-bridge.js +1 -1
  392. package/dist/src/project-trust/trust-store.d.ts +30 -0
  393. package/dist/src/project-trust/trust-store.js +194 -0
  394. package/dist/src/project-trust/trust-store.js.map +1 -0
  395. package/dist/src/providers/index.d.ts +1 -1
  396. package/dist/src/providers/index.js +18 -7
  397. package/dist/src/providers/index.js.map +1 -1
  398. package/dist/src/routing/resolve-route.d.ts +0 -3
  399. package/dist/src/routing/resolve-route.js.map +1 -1
  400. package/dist/src/routing/resolve-tui-session-key.d.ts +2 -0
  401. package/dist/src/routing/resolve-tui-session-key.js +8 -3
  402. package/dist/src/routing/resolve-tui-session-key.js.map +1 -1
  403. package/dist/src/session/client-history.d.ts +32 -0
  404. package/dist/src/session/client-history.js +232 -1
  405. package/dist/src/session/client-history.js.map +1 -1
  406. package/dist/src/session/manager.d.ts +37 -4
  407. package/dist/src/session/manager.js +39 -15
  408. package/dist/src/session/manager.js.map +1 -1
  409. package/dist/src/session/session-context-for-llm.d.ts +93 -1
  410. package/dist/src/session/session-context-for-llm.js +105 -2
  411. package/dist/src/session/session-context-for-llm.js.map +1 -1
  412. package/dist/src/session/store.d.ts +37 -0
  413. package/dist/src/session/store.js +127 -2
  414. package/dist/src/session/store.js.map +1 -1
  415. package/dist/src/session/stored-rows-to-file-entries.js +37 -1
  416. package/dist/src/session/stored-rows-to-file-entries.js.map +1 -1
  417. package/dist/src/session/types.d.ts +14 -1
  418. package/dist/src/session/types.js.map +1 -1
  419. package/dist/src/share/share-thumbnail.js +1 -1
  420. package/dist/src/storage/sqlite/migrations/004_add_session_type_metadata.sql +15 -0
  421. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  422. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  423. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  424. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  425. package/dist/src/storage/sqlite/row-mappers.d.ts +14 -1
  426. package/dist/src/storage/sqlite/row-mappers.js +14 -1
  427. package/dist/src/storage/sqlite/row-mappers.js.map +1 -1
  428. package/dist/src/storage/sqlite/schema.js +1 -1
  429. package/dist/src/storage/sqlite/session-metadata.js +1 -0
  430. package/dist/src/storage/sqlite/session-metadata.js.map +1 -1
  431. package/dist/src/storage/sqlite/session-repository.js +52 -25
  432. package/dist/src/storage/sqlite/session-repository.js.map +1 -1
  433. package/dist/src/tui/backends/embedded-backend.d.ts +53 -4
  434. package/dist/src/tui/backends/embedded-backend.js +227 -39
  435. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  436. package/dist/src/tui/backends/gateway-sse-backend.d.ts +59 -3
  437. package/dist/src/tui/backends/gateway-sse-backend.js +416 -26
  438. package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
  439. package/dist/src/tui/chat-history.d.ts +5 -1
  440. package/dist/src/tui/chat-history.js +78 -8
  441. package/dist/src/tui/chat-history.js.map +1 -1
  442. package/dist/src/tui/clipboard-text.d.ts +5 -0
  443. package/dist/src/tui/clipboard-text.js +46 -0
  444. package/dist/src/tui/clipboard-text.js.map +1 -0
  445. package/dist/src/tui/components/assistant-message.d.ts +19 -3
  446. package/dist/src/tui/components/assistant-message.js +115 -9
  447. package/dist/src/tui/components/assistant-message.js.map +1 -1
  448. package/dist/src/tui/components/bash-execution.d.ts +3 -2
  449. package/dist/src/tui/components/bash-execution.js +31 -3
  450. package/dist/src/tui/components/bash-execution.js.map +1 -1
  451. package/dist/src/tui/components/bash-summary.d.ts +23 -0
  452. package/dist/src/tui/components/bash-summary.js +87 -0
  453. package/dist/src/tui/components/bash-summary.js.map +1 -0
  454. package/dist/src/tui/components/branch-message-summary.d.ts +17 -0
  455. package/dist/src/tui/components/branch-message-summary.js +43 -0
  456. package/dist/src/tui/components/branch-message-summary.js.map +1 -0
  457. package/dist/src/tui/components/branch-summary.d.ts +13 -0
  458. package/dist/src/tui/components/branch-summary.js +51 -0
  459. package/dist/src/tui/components/branch-summary.js.map +1 -0
  460. package/dist/src/tui/components/chat-log.d.ts +46 -6
  461. package/dist/src/tui/components/chat-log.js +183 -21
  462. package/dist/src/tui/components/chat-log.js.map +1 -1
  463. package/dist/src/tui/components/compaction-summary.d.ts +13 -0
  464. package/dist/src/tui/components/compaction-summary.js +46 -0
  465. package/dist/src/tui/components/compaction-summary.js.map +1 -0
  466. package/dist/src/tui/components/custom-editor.d.ts +1 -0
  467. package/dist/src/tui/components/custom-editor.js +2 -0
  468. package/dist/src/tui/components/custom-editor.js.map +1 -1
  469. package/dist/src/tui/components/custom-message.d.ts +23 -0
  470. package/dist/src/tui/components/custom-message.js +65 -0
  471. package/dist/src/tui/components/custom-message.js.map +1 -0
  472. package/dist/src/tui/components/extension-dialog.d.ts +42 -0
  473. package/dist/src/tui/components/extension-dialog.js +127 -0
  474. package/dist/src/tui/components/extension-dialog.js.map +1 -0
  475. package/dist/src/tui/components/scoped-models-selector.d.ts +7 -2
  476. package/dist/src/tui/components/scoped-models-selector.js +89 -16
  477. package/dist/src/tui/components/scoped-models-selector.js.map +1 -1
  478. package/dist/src/tui/components/searchable-select-list.d.ts +30 -3
  479. package/dist/src/tui/components/searchable-select-list.js +82 -10
  480. package/dist/src/tui/components/searchable-select-list.js.map +1 -1
  481. package/dist/src/tui/components/session-selector.d.ts +18 -4
  482. package/dist/src/tui/components/session-selector.js +207 -40
  483. package/dist/src/tui/components/session-selector.js.map +1 -1
  484. package/dist/src/tui/components/settings-selector.d.ts +6 -2
  485. package/dist/src/tui/components/settings-selector.js +126 -7
  486. package/dist/src/tui/components/settings-selector.js.map +1 -1
  487. package/dist/src/tui/components/thinking-selector.d.ts +12 -0
  488. package/dist/src/tui/components/thinking-selector.js +48 -0
  489. package/dist/src/tui/components/thinking-selector.js.map +1 -0
  490. package/dist/src/tui/components/tool-execution.d.ts +57 -3
  491. package/dist/src/tui/components/tool-execution.js +378 -28
  492. package/dist/src/tui/components/tool-execution.js.map +1 -1
  493. package/dist/src/tui/components/tui-bottom-bar.d.ts +9 -1
  494. package/dist/src/tui/components/tui-bottom-bar.js +56 -11
  495. package/dist/src/tui/components/tui-bottom-bar.js.map +1 -1
  496. package/dist/src/tui/components/tui-header.d.ts +9 -2
  497. package/dist/src/tui/components/tui-header.js +25 -5
  498. package/dist/src/tui/components/tui-header.js.map +1 -1
  499. package/dist/src/tui/components/user-message.d.ts +4 -2
  500. package/dist/src/tui/components/user-message.js +42 -9
  501. package/dist/src/tui/components/user-message.js.map +1 -1
  502. package/dist/src/tui/components/visual-truncate.d.ts +11 -0
  503. package/dist/src/tui/components/visual-truncate.js +27 -0
  504. package/dist/src/tui/components/visual-truncate.js.map +1 -0
  505. package/dist/src/tui/extension-host/autocomplete.d.ts +43 -0
  506. package/dist/src/tui/extension-host/autocomplete.js +116 -0
  507. package/dist/src/tui/extension-host/autocomplete.js.map +1 -0
  508. package/dist/src/tui/extension-host/host.d.ts +31 -1
  509. package/dist/src/tui/extension-host/host.js +123 -6
  510. package/dist/src/tui/extension-host/host.js.map +1 -1
  511. package/dist/src/tui/extension-host/load-extensions.d.ts +6 -1
  512. package/dist/src/tui/extension-host/load-extensions.js +4 -3
  513. package/dist/src/tui/extension-host/load-extensions.js.map +1 -1
  514. package/dist/src/tui/extension-host/runtime-context.d.ts +21 -0
  515. package/dist/src/tui/extension-host/runtime-context.js +152 -0
  516. package/dist/src/tui/extension-host/runtime-context.js.map +1 -0
  517. package/dist/src/tui/extension-host/runtime.d.ts +52 -4
  518. package/dist/src/tui/extension-host/runtime.js +547 -85
  519. package/dist/src/tui/extension-host/runtime.js.map +1 -1
  520. package/dist/src/tui/extension-host/surface.d.ts +20 -0
  521. package/dist/src/tui/extension-host/surface.js +30 -6
  522. package/dist/src/tui/extension-host/surface.js.map +1 -1
  523. package/dist/src/tui/extension-host/tool-renderers.d.ts +6 -3
  524. package/dist/src/tui/extension-host/tool-renderers.js +43 -5
  525. package/dist/src/tui/extension-host/tool-renderers.js.map +1 -1
  526. package/dist/src/tui/format-tui-hotkeys.d.ts +12 -2
  527. package/dist/src/tui/format-tui-hotkeys.js +22 -5
  528. package/dist/src/tui/format-tui-hotkeys.js.map +1 -1
  529. package/dist/src/tui/tui-agent-events.d.ts +8 -6
  530. package/dist/src/tui/tui-agent-events.js +200 -59
  531. package/dist/src/tui/tui-agent-events.js.map +1 -1
  532. package/dist/src/tui/tui-backend.d.ts +169 -3
  533. package/dist/src/tui/tui-command-formatters.d.ts +76 -0
  534. package/dist/src/tui/tui-command-formatters.js +594 -0
  535. package/dist/src/tui/tui-command-formatters.js.map +1 -0
  536. package/dist/src/tui/tui-commands.d.ts +57 -7
  537. package/dist/src/tui/tui-commands.js +639 -43
  538. package/dist/src/tui/tui-commands.js.map +1 -1
  539. package/dist/src/tui/tui-context-usage.d.ts +1 -1
  540. package/dist/src/tui/tui-context-usage.js +9 -1
  541. package/dist/src/tui/tui-context-usage.js.map +1 -1
  542. package/dist/src/tui/tui-extension-user-message.d.ts +8 -0
  543. package/dist/src/tui/tui-extension-user-message.js +32 -0
  544. package/dist/src/tui/tui-extension-user-message.js.map +1 -0
  545. package/dist/src/tui/tui-follow-up-queue.d.ts +9 -0
  546. package/dist/src/tui/tui-follow-up-queue.js +18 -0
  547. package/dist/src/tui/tui-follow-up-queue.js.map +1 -0
  548. package/dist/src/tui/tui-local-shell.d.ts +11 -1
  549. package/dist/src/tui/tui-local-shell.js +50 -8
  550. package/dist/src/tui/tui-local-shell.js.map +1 -1
  551. package/dist/src/tui/tui-model-picker.d.ts +26 -0
  552. package/dist/src/tui/tui-model-picker.js +152 -0
  553. package/dist/src/tui/tui-model-picker.js.map +1 -0
  554. package/dist/src/tui/tui-oauth-login.d.ts +16 -0
  555. package/dist/src/tui/tui-oauth-login.js +189 -0
  556. package/dist/src/tui/tui-oauth-login.js.map +1 -0
  557. package/dist/src/tui/tui-overlays.d.ts +3 -3
  558. package/dist/src/tui/tui-overlays.js +6 -7
  559. package/dist/src/tui/tui-overlays.js.map +1 -1
  560. package/dist/src/tui/tui-picker-overlay.d.ts +27 -32
  561. package/dist/src/tui/tui-picker-overlay.js +340 -30
  562. package/dist/src/tui/tui-picker-overlay.js.map +1 -1
  563. package/dist/src/tui/tui-picker-services.d.ts +41 -0
  564. package/dist/src/tui/tui-picker-services.js +1 -0
  565. package/dist/src/tui/tui-run-state.d.ts +11 -0
  566. package/dist/src/tui/tui-run-state.js +114 -0
  567. package/dist/src/tui/tui-run-state.js.map +1 -0
  568. package/dist/src/tui/tui-runtime-hints.d.ts +4 -0
  569. package/dist/src/tui/tui-runtime-hints.js +18 -0
  570. package/dist/src/tui/tui-runtime-hints.js.map +1 -0
  571. package/dist/src/tui/tui-scoped-models.d.ts +1 -1
  572. package/dist/src/tui/tui-scoped-models.js +2 -2
  573. package/dist/src/tui/tui-scoped-models.js.map +1 -1
  574. package/dist/src/tui/tui-session-actions.d.ts +5 -3
  575. package/dist/src/tui/tui-session-actions.js +21 -9
  576. package/dist/src/tui/tui-session-actions.js.map +1 -1
  577. package/dist/src/tui/tui-session-format.d.ts +4 -1
  578. package/dist/src/tui/tui-session-format.js +17 -3
  579. package/dist/src/tui/tui-session-format.js.map +1 -1
  580. package/dist/src/tui/tui-session-snapshot.d.ts +82 -0
  581. package/dist/src/tui/tui-session-snapshot.js +184 -0
  582. package/dist/src/tui/tui-session-snapshot.js.map +1 -0
  583. package/dist/src/tui/tui-session-stats.d.ts +3 -0
  584. package/dist/src/tui/tui-session-stats.js +59 -0
  585. package/dist/src/tui/tui-session-stats.js.map +1 -0
  586. package/dist/src/tui/tui-settings.d.ts +21 -0
  587. package/dist/src/tui/tui-settings.js +28 -1
  588. package/dist/src/tui/tui-settings.js.map +1 -1
  589. package/dist/src/tui/tui-skills-autocomplete.js +1 -1
  590. package/dist/src/tui/tui-skills-autocomplete.js.map +1 -1
  591. package/dist/src/tui/tui-startup-resources.d.ts +3 -0
  592. package/dist/src/tui/tui-startup-resources.js +39 -0
  593. package/dist/src/tui/tui-startup-resources.js.map +1 -0
  594. package/dist/src/tui/tui-startup-text.d.ts +10 -0
  595. package/dist/src/tui/tui-startup-text.js +58 -0
  596. package/dist/src/tui/tui-startup-text.js.map +1 -0
  597. package/dist/src/tui/tui-stdio-filter.d.ts +1 -0
  598. package/dist/src/tui/tui-stdio-filter.js +11 -7
  599. package/dist/src/tui/tui-stdio-filter.js.map +1 -1
  600. package/dist/src/tui/tui-submit.d.ts +2 -0
  601. package/dist/src/tui/tui-submit.js +2 -1
  602. package/dist/src/tui/tui-submit.js.map +1 -1
  603. package/dist/src/tui/tui-tool-diff.js +61 -7
  604. package/dist/src/tui/tui-tool-diff.js.map +1 -1
  605. package/dist/src/tui/tui-tool-result.d.ts +17 -0
  606. package/dist/src/tui/tui-tool-result.js +74 -0
  607. package/dist/src/tui/tui-tool-result.js.map +1 -0
  608. package/dist/src/tui/tui-transcript-tree-picker.d.ts +57 -0
  609. package/dist/src/tui/tui-transcript-tree-picker.js +604 -0
  610. package/dist/src/tui/tui-transcript-tree-picker.js.map +1 -0
  611. package/dist/src/tui/tui-transcript-tree.d.ts +7 -0
  612. package/dist/src/tui/tui-transcript-tree.js +316 -0
  613. package/dist/src/tui/tui-transcript-tree.js.map +1 -0
  614. package/dist/src/tui/tui-types.d.ts +25 -34
  615. package/dist/src/tui/tui-types.js +12 -0
  616. package/dist/src/tui/tui-types.js.map +1 -1
  617. package/dist/src/tui/tui.js +1288 -112
  618. package/dist/src/tui/tui.js.map +1 -1
  619. package/dist/src/tui/xopc-tui-keybindings.d.ts +127 -2
  620. package/dist/src/tui/xopc-tui-keybindings.js +127 -2
  621. package/dist/src/tui/xopc-tui-keybindings.js.map +1 -1
  622. package/dist/src/workflows/domain/definition-utils.d.ts +2 -1
  623. package/dist/src/workflows/domain/definition-utils.js +18 -8
  624. package/dist/src/workflows/domain/definition-utils.js.map +1 -1
  625. package/dist/src/workflows/domain/definition.d.ts +25 -0
  626. package/dist/src/workflows/domain/event.d.ts +1 -0
  627. package/dist/src/workflows/domain/result.d.ts +15 -0
  628. package/dist/src/workflows/domain/run.d.ts +2 -0
  629. package/dist/src/workflows/domain/run.js.map +1 -1
  630. package/dist/src/workflows/engine/projector.js +4 -0
  631. package/dist/src/workflows/engine/projector.js.map +1 -1
  632. package/dist/src/workflows/engine/workflow-engine.d.ts +37 -1
  633. package/dist/src/workflows/engine/workflow-engine.js +75 -11
  634. package/dist/src/workflows/engine/workflow-engine.js.map +1 -1
  635. package/dist/src/workflows/index.d.ts +1 -0
  636. package/dist/src/workflows/index.js +4 -1
  637. package/dist/src/workflows/registry/catalog-workflow-definition-registry.d.ts +9 -0
  638. package/dist/src/workflows/registry/catalog-workflow-definition-registry.js +40 -0
  639. package/dist/src/workflows/registry/catalog-workflow-definition-registry.js.map +1 -0
  640. package/dist/src/workflows/registry/index.d.ts +2 -0
  641. package/dist/src/workflows/registry/index.js +2 -0
  642. package/dist/src/workflows/registry/workflow-definition-registry.d.ts +15 -0
  643. package/dist/src/workflows/registry/workflow-definition-registry.js +1 -0
  644. package/dist/src/workflows/runtime/index.d.ts +2 -0
  645. package/dist/src/workflows/runtime/index.js +2 -1
  646. package/dist/src/workflows/runtime/script-workflow-runtime.d.ts +5 -0
  647. package/dist/src/workflows/runtime/script-workflow-runtime.js +15 -0
  648. package/dist/src/workflows/runtime/script-workflow-runtime.js.map +1 -0
  649. package/dist/src/workflows/runtime/workflow-runtime-port.d.ts +16 -0
  650. package/dist/src/workflows/runtime/workflow-runtime-port.js +1 -0
  651. package/dist/src/workflows/service/run-view-to-snapshot.js +3 -0
  652. package/dist/src/workflows/service/run-view-to-snapshot.js.map +1 -1
  653. package/dist/src/workflows/service/workflow-run-service.d.ts +3 -0
  654. package/dist/src/workflows/service/workflow-run-service.js +10 -15
  655. package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
  656. package/dist/src/workflows/service/workflow-session-bridge.d.ts +1 -1
  657. package/dist/src/workflows/service/workflow-session-bridge.js +4 -1
  658. package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
  659. package/package.json +21 -15
  660. package/skills/creative/frontend-design/SKILL.md +1 -1
  661. package/skills/creative/theme-factory/SKILL.md +1 -1
  662. package/skills/documents/xlsx/SKILL.md +1 -1
  663. package/skills/engineering/diagnose/SKILL.md +2 -2
  664. package/skills/engineering/tdd/SKILL.md +1 -1
  665. package/skills/tools/github/SKILL.md +6 -1
  666. package/skills/tools/webapp-testing/SKILL.md +4 -1
  667. package/dist/extensions/telegram/src/adapters/config-surface.d.ts +0 -2
  668. package/dist/extensions/telegram/src/adapters/config-surface.js +0 -26
  669. package/dist/extensions/telegram/src/adapters/config-surface.js.map +0 -1
  670. package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js +0 -158
  671. package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js.map +0 -1
  672. package/dist/gateway/static/root/assets/agents-BwXkia_W.js +0 -222
  673. package/dist/gateway/static/root/assets/channels-settings-tlOTdaXw.js +0 -1
  674. package/dist/gateway/static/root/assets/channels-status-swr-D4XjqwqC.js +0 -8
  675. package/dist/gateway/static/root/assets/cron-api-DcmfGuj0.js +0 -1
  676. package/dist/gateway/static/root/assets/cron-page-CijJ4G6F.js +0 -1
  677. package/dist/gateway/static/root/assets/extension-settings-page-CyJk_G64.js +0 -1
  678. package/dist/gateway/static/root/assets/field-primitives-C4GpxsDo.js +0 -1
  679. package/dist/gateway/static/root/assets/heartbeat-config-api-CLD0Gpi3.js +0 -1
  680. package/dist/gateway/static/root/assets/index-0HmunJW9.js +0 -4845
  681. package/dist/gateway/static/root/assets/index-Bk75Phrd.css +0 -1
  682. package/dist/gateway/static/root/assets/notes-page-BBnTh0uI.js +0 -1
  683. package/dist/gateway/static/root/assets/sessions-page-B0riYK7j.js +0 -1
  684. package/dist/gateway/static/root/assets/settings-advanced-gate-DiP_WHu_.js +0 -2
  685. package/dist/gateway/static/root/assets/settings-page-1ZPhcCZ9.js +0 -3
  686. package/dist/gateway/static/root/assets/skills-page-BQ1hllKD.js +0 -2
  687. package/dist/gateway/static/root/assets/url-F3_D_6zZ.js +0 -3
  688. package/dist/gateway/static/root/assets/utils-CPr3FBh2.js +0 -1
  689. package/dist/gateway/static/root/assets/voice-api-key-field-BkbDl6dH.js +0 -1
  690. package/dist/gateway/static/root/assets/workflows-page-D059ysoF.js +0 -27
  691. package/dist/src/agent/embedded/map-stream-events.d.ts +0 -9
  692. package/dist/src/agent/embedded/map-stream-events.js +0 -63
  693. package/dist/src/agent/embedded/map-stream-events.js.map +0 -1
  694. package/dist/src/channels/dock.js.map +0 -1
  695. package/dist/src/channels/plugins/bundled.d.ts +0 -11
  696. package/dist/src/channels/plugins/bundled.js +0 -10
  697. package/dist/src/channels/plugins/bundled.js.map +0 -1
  698. package/dist/src/channels/registry.d.ts +0 -25
  699. package/dist/src/channels/registry.js +0 -82
  700. package/dist/src/channels/registry.js.map +0 -1
  701. package/dist/src/config/localized-text.d.ts +0 -6
  702. package/dist/src/config/localized-text.js +0 -42
  703. package/dist/src/config/localized-text.js.map +0 -1
  704. package/dist/src/generated/bundled-channel-plugins.d.ts +0 -10
  705. package/dist/src/generated/bundled-channel-plugins.js +0 -16
  706. package/dist/src/generated/bundled-channel-plugins.js.map +0 -1
  707. package/dist/src/tui/stream-assembler.d.ts +0 -22
  708. package/dist/src/tui/stream-assembler.js +0 -63
  709. package/dist/src/tui/stream-assembler.js.map +0 -1
  710. package/skills/browser/SKILL-zh.md +0 -188
  711. package/skills/business/company-values/SKILL-zh.md +0 -80
  712. package/skills/business/company-values/SKILL.md +0 -80
  713. package/skills/business/find-community/SKILL-zh.md +0 -50
  714. package/skills/business/find-community/SKILL.md +0 -50
  715. package/skills/business/first-customers/SKILL-zh.md +0 -76
  716. package/skills/business/first-customers/SKILL.md +0 -76
  717. package/skills/business/grow-sustainably/SKILL-zh.md +0 -92
  718. package/skills/business/grow-sustainably/SKILL.md +0 -92
  719. package/skills/business/marketing-plan/SKILL-zh.md +0 -100
  720. package/skills/business/marketing-plan/SKILL.md +0 -100
  721. package/skills/business/minimalist-review/SKILL-zh.md +0 -82
  722. package/skills/business/minimalist-review/SKILL.md +0 -82
  723. package/skills/business/mvp/SKILL-zh.md +0 -81
  724. package/skills/business/mvp/SKILL.md +0 -81
  725. package/skills/business/pricing/SKILL-zh.md +0 -64
  726. package/skills/business/pricing/SKILL.md +0 -64
  727. package/skills/business/processize/SKILL-zh.md +0 -91
  728. package/skills/business/processize/SKILL.md +0 -91
  729. package/skills/business/validate-idea/SKILL-zh.md +0 -68
  730. package/skills/business/validate-idea/SKILL.md +0 -68
  731. package/skills/creative/algorithmic-art/LICENSE.txt +0 -202
  732. package/skills/creative/algorithmic-art/SKILL-zh.md +0 -405
  733. package/skills/creative/algorithmic-art/SKILL.md +0 -405
  734. package/skills/creative/algorithmic-art/templates/generator_template.js +0 -223
  735. package/skills/creative/algorithmic-art/templates/viewer.html +0 -599
  736. package/skills/creative/frontend-design/SKILL-zh.md +0 -42
  737. package/skills/creative/theme-factory/SKILL-zh.md +0 -59
  738. package/skills/creative/web-artifacts-builder/LICENSE.txt +0 -202
  739. package/skills/creative/web-artifacts-builder/SKILL-zh.md +0 -74
  740. package/skills/creative/web-artifacts-builder/SKILL.md +0 -74
  741. package/skills/creative/web-artifacts-builder/scripts/bundle-artifact.sh +0 -54
  742. package/skills/creative/web-artifacts-builder/scripts/init-artifact.sh +0 -322
  743. package/skills/creative/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
  744. package/skills/documents/doc-coauthoring/SKILL-zh.md +0 -375
  745. package/skills/documents/doc-coauthoring/SKILL.md +0 -375
  746. package/skills/documents/docx/LICENSE.txt +0 -30
  747. package/skills/documents/docx/SKILL-zh.md +0 -590
  748. package/skills/documents/docx/SKILL.md +0 -590
  749. package/skills/documents/docx/scripts/__init__.py +0 -1
  750. package/skills/documents/docx/scripts/accept_changes.py +0 -135
  751. package/skills/documents/docx/scripts/comment.py +0 -318
  752. package/skills/documents/docx/scripts/office/helpers/__init__.py +0 -0
  753. package/skills/documents/docx/scripts/office/helpers/merge_runs.py +0 -199
  754. package/skills/documents/docx/scripts/office/helpers/simplify_redlines.py +0 -197
  755. package/skills/documents/docx/scripts/office/pack.py +0 -159
  756. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
  757. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
  758. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
  759. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
  760. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
  761. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
  762. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
  763. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
  764. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
  765. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
  766. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
  767. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
  768. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
  769. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
  770. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
  771. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
  772. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
  773. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
  774. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
  775. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
  776. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
  777. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
  778. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
  779. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
  780. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
  781. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
  782. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
  783. package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
  784. package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
  785. package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
  786. package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
  787. package/skills/documents/docx/scripts/office/schemas/mce/mc.xsd +0 -75
  788. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-2010.xsd +0 -560
  789. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-2012.xsd +0 -67
  790. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-2018.xsd +0 -14
  791. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -20
  792. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -13
  793. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
  794. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -8
  795. package/skills/documents/docx/scripts/office/soffice.py +0 -183
  796. package/skills/documents/docx/scripts/office/unpack.py +0 -132
  797. package/skills/documents/docx/scripts/office/validate.py +0 -111
  798. package/skills/documents/docx/scripts/office/validators/__init__.py +0 -15
  799. package/skills/documents/docx/scripts/office/validators/base.py +0 -847
  800. package/skills/documents/docx/scripts/office/validators/docx.py +0 -446
  801. package/skills/documents/docx/scripts/office/validators/pptx.py +0 -275
  802. package/skills/documents/docx/scripts/office/validators/redlining.py +0 -247
  803. package/skills/documents/docx/scripts/templates/comments.xml +0 -3
  804. package/skills/documents/docx/scripts/templates/commentsExtended.xml +0 -3
  805. package/skills/documents/docx/scripts/templates/commentsExtensible.xml +0 -3
  806. package/skills/documents/docx/scripts/templates/commentsIds.xml +0 -3
  807. package/skills/documents/docx/scripts/templates/people.xml +0 -3
  808. package/skills/documents/pdf/LICENSE.txt +0 -30
  809. package/skills/documents/pdf/SKILL-zh.md +0 -314
  810. package/skills/documents/pdf/SKILL.md +0 -314
  811. package/skills/documents/pdf/forms.md +0 -294
  812. package/skills/documents/pdf/reference.md +0 -612
  813. package/skills/documents/pdf/scripts/check_bounding_boxes.py +0 -65
  814. package/skills/documents/pdf/scripts/check_fillable_fields.py +0 -11
  815. package/skills/documents/pdf/scripts/convert_pdf_to_images.py +0 -33
  816. package/skills/documents/pdf/scripts/create_validation_image.py +0 -37
  817. package/skills/documents/pdf/scripts/extract_form_field_info.py +0 -122
  818. package/skills/documents/pdf/scripts/extract_form_structure.py +0 -115
  819. package/skills/documents/pdf/scripts/fill_fillable_fields.py +0 -98
  820. package/skills/documents/pdf/scripts/fill_pdf_form_with_annotations.py +0 -107
  821. package/skills/documents/pptx/LICENSE.txt +0 -30
  822. package/skills/documents/pptx/SKILL-zh.md +0 -232
  823. package/skills/documents/pptx/SKILL.md +0 -232
  824. package/skills/documents/pptx/editing.md +0 -205
  825. package/skills/documents/pptx/pptxgenjs.md +0 -420
  826. package/skills/documents/pptx/scripts/__init__.py +0 -0
  827. package/skills/documents/pptx/scripts/add_slide.py +0 -195
  828. package/skills/documents/pptx/scripts/clean.py +0 -286
  829. package/skills/documents/pptx/scripts/office/helpers/__init__.py +0 -0
  830. package/skills/documents/pptx/scripts/office/helpers/merge_runs.py +0 -199
  831. package/skills/documents/pptx/scripts/office/helpers/simplify_redlines.py +0 -197
  832. package/skills/documents/pptx/scripts/office/pack.py +0 -159
  833. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
  834. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
  835. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
  836. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
  837. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
  838. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
  839. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
  840. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
  841. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
  842. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
  843. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
  844. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
  845. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
  846. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
  847. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
  848. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
  849. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
  850. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
  851. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
  852. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
  853. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
  854. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
  855. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
  856. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
  857. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
  858. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
  859. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
  860. package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
  861. package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
  862. package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
  863. package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
  864. package/skills/documents/pptx/scripts/office/schemas/mce/mc.xsd +0 -75
  865. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-2010.xsd +0 -560
  866. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-2012.xsd +0 -67
  867. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-2018.xsd +0 -14
  868. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -20
  869. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -13
  870. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
  871. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -8
  872. package/skills/documents/pptx/scripts/office/soffice.py +0 -183
  873. package/skills/documents/pptx/scripts/office/unpack.py +0 -132
  874. package/skills/documents/pptx/scripts/office/validate.py +0 -111
  875. package/skills/documents/pptx/scripts/office/validators/__init__.py +0 -15
  876. package/skills/documents/pptx/scripts/office/validators/base.py +0 -847
  877. package/skills/documents/pptx/scripts/office/validators/docx.py +0 -446
  878. package/skills/documents/pptx/scripts/office/validators/pptx.py +0 -275
  879. package/skills/documents/pptx/scripts/office/validators/redlining.py +0 -247
  880. package/skills/documents/pptx/scripts/thumbnail.py +0 -289
  881. package/skills/documents/xlsx/SKILL-zh.md +0 -292
  882. package/skills/engineering/diagnose/SKILL-zh.md +0 -117
  883. package/skills/engineering/grill-with-docs/ADR-FORMAT.md +0 -47
  884. package/skills/engineering/grill-with-docs/CONTEXT-FORMAT.md +0 -77
  885. package/skills/engineering/grill-with-docs/SKILL-zh.md +0 -88
  886. package/skills/engineering/grill-with-docs/SKILL.md +0 -88
  887. package/skills/engineering/improve-codebase-architecture/DEEPENING.md +0 -37
  888. package/skills/engineering/improve-codebase-architecture/INTERFACE-DESIGN.md +0 -44
  889. package/skills/engineering/improve-codebase-architecture/LANGUAGE.md +0 -53
  890. package/skills/engineering/improve-codebase-architecture/SKILL-zh.md +0 -71
  891. package/skills/engineering/improve-codebase-architecture/SKILL.md +0 -71
  892. package/skills/engineering/tdd/SKILL-zh.md +0 -109
  893. package/skills/engineering/to-issues/SKILL-zh.md +0 -81
  894. package/skills/engineering/to-issues/SKILL.md +0 -81
  895. package/skills/engineering/to-prd/SKILL-zh.md +0 -76
  896. package/skills/engineering/to-prd/SKILL.md +0 -74
  897. package/skills/engineering/zoom-out/SKILL-zh.md +0 -7
  898. package/skills/engineering/zoom-out/SKILL.md +0 -7
  899. package/skills/tools/find-skills/SKILL-zh.md +0 -440
  900. package/skills/tools/github/SKILL-zh.md +0 -48
  901. package/skills/tools/internal-comms/LICENSE.txt +0 -202
  902. package/skills/tools/internal-comms/SKILL-zh.md +0 -32
  903. package/skills/tools/internal-comms/SKILL.md +0 -32
  904. package/skills/tools/internal-comms/examples/3p-updates.md +0 -47
  905. package/skills/tools/internal-comms/examples/company-newsletter.md +0 -65
  906. package/skills/tools/internal-comms/examples/faq-answers.md +0 -30
  907. package/skills/tools/internal-comms/examples/general-comms.md +0 -16
  908. package/skills/tools/skill-creator/LICENSE.txt +0 -202
  909. package/skills/tools/skill-creator/SKILL-zh.md +0 -483
  910. package/skills/tools/skill-creator/SKILL.md +0 -485
  911. package/skills/tools/skill-creator/agents/analyzer.md +0 -274
  912. package/skills/tools/skill-creator/agents/comparator.md +0 -202
  913. package/skills/tools/skill-creator/agents/grader.md +0 -223
  914. package/skills/tools/skill-creator/assets/eval_review.html +0 -146
  915. package/skills/tools/skill-creator/eval-viewer/generate_review.py +0 -471
  916. package/skills/tools/skill-creator/eval-viewer/viewer.html +0 -1325
  917. package/skills/tools/skill-creator/references/schemas.md +0 -430
  918. package/skills/tools/skill-creator/scripts/__init__.py +0 -0
  919. package/skills/tools/skill-creator/scripts/aggregate_benchmark.py +0 -401
  920. package/skills/tools/skill-creator/scripts/generate_report.py +0 -326
  921. package/skills/tools/skill-creator/scripts/improve_description.py +0 -247
  922. package/skills/tools/skill-creator/scripts/package_skill.py +0 -136
  923. package/skills/tools/skill-creator/scripts/quick_validate.py +0 -103
  924. package/skills/tools/skill-creator/scripts/run_eval.py +0 -310
  925. package/skills/tools/skill-creator/scripts/run_loop.py +0 -328
  926. package/skills/tools/skill-creator/scripts/utils.py +0 -47
  927. package/skills/tools/summarize/SKILL-zh.md +0 -47
  928. package/skills/tools/weather/SKILL-zh.md +0 -46
  929. package/skills/tools/weather/SKILL.md +0 -46
  930. package/skills/tools/webapp-testing/SKILL-zh.md +0 -96
@@ -5,6 +5,9 @@ import { getRuntimeLogStats } from "../utils/logger/stats.js";
5
5
  import { createLogger } from "../utils/logger/index.js";
6
6
  import { init_logger } from "../utils/logger.js";
7
7
  import { init_paths, resolveAgentDir, resolveConfigPath, resolveCronJobsPath, resolveExtensionsDir } from "../config/paths.js";
8
+ import { areExtensionsGloballyDisabled } from "../extensions/discover-extensions.js";
9
+ import { buildExtensionMetadataSnapshot } from "../extensions/extension-metadata-snapshot.js";
10
+ import { buildChannelCatalogForConfig, buildChannelCatalogFromSnapshot, init_channel_catalog_service } from "../channels/catalog/channel-catalog-service.js";
8
11
  import { loadConfig, saveConfig } from "../config/loader.js";
9
12
  import { getDefaultAgentId, init_resolve_route } from "../routing/resolve-route.js";
10
13
  import { prewarmModelRegistry } from "../providers/model-registry.js";
@@ -16,18 +19,15 @@ import { disposeAllSessionMcpRuntimes } from "../agent/mcp/bundle-mcp-runtime.js
16
19
  import "../agent/mcp/bundle-mcp-tools.js";
17
20
  import { SessionIndex } from "../session/manager.js";
18
21
  import "../session/index.js";
19
- import { areExtensionsGloballyDisabled } from "../extensions/discover-extensions.js";
20
- import { registerClarifyBridge } from "./clarify-runtime.js";
21
- import { setPairingBroadcastSink } from "../channels/pairing/pairing-events.js";
22
- import { CHAT_CHANNEL_ORDER, getChatChannelMeta } from "../channels/registry.js";
23
- import { getWorkspacePath } from "../config/workspace-path-helpers.js";
24
22
  import { ExtensionLoader } from "../extensions/loader.js";
25
- import { buildExtensionMetadataSnapshot } from "../extensions/extension-metadata-snapshot.js";
26
23
  import "../extensions/index.js";
27
24
  import { MessageBus, MessageBusShutdownError } from "../infra/bus/queue.js";
28
25
  import "../infra/bus/index.js";
29
26
  import { AgentService } from "../agent/service.js";
27
+ import { registerClarifyBridge } from "./clarify-runtime.js";
28
+ import { setPairingBroadcastSink } from "../channels/pairing/pairing-events.js";
30
29
  import { ChannelManager } from "../channels/manager.js";
30
+ import { getWorkspacePath } from "../config/workspace-path-helpers.js";
31
31
  import "../config/index.js";
32
32
  import { CronService } from "../cron/service.js";
33
33
  import "../cron/index.js";
@@ -62,6 +62,7 @@ import { GatewayReadiness } from "./startup-readiness.js";
62
62
  import { createGatewayStartupTrace } from "./startup-trace.js";
63
63
  import crypto from "crypto";
64
64
  //#region src/gateway/service.ts
65
+ init_channel_catalog_service();
65
66
  init_providers();
66
67
  init_logger();
67
68
  init_paths();
@@ -90,6 +91,9 @@ var GatewayService = class {
90
91
  configCoordinator;
91
92
  auth;
92
93
  sse = new GatewaySseHub();
94
+ getConfig() {
95
+ return this.config;
96
+ }
93
97
  stopGatewayUpdateCheck = null;
94
98
  /** When set (e.g. by `GatewayServer`), `triggerGatewayProcessRestart` can stop HTTP then exit. */
95
99
  gatewayShutdownForRestart = null;
@@ -223,7 +227,7 @@ var GatewayService = class {
223
227
  const cronRef = { service: this.cronService };
224
228
  this._agentService = new AgentService(this.bus, {
225
229
  workspace: this.workspacePath,
226
- model: this.config.agents?.defaults?.model?.primary,
230
+ model: this.config.agents?.defaults?.models?.chat?.primary,
227
231
  config: this.config,
228
232
  sessionStore: this.sessionIndex.getStore(),
229
233
  onSessionMetadataUpdated: (sessionKey, patch) => {
@@ -346,6 +350,34 @@ var GatewayService = class {
346
350
  log.warn({ err }, "Failed to load startup-phase extensions");
347
351
  }
348
352
  }
353
+ findChannelContributionExtension(channelId) {
354
+ const normalized = channelId.trim().toLowerCase();
355
+ const registry = this.extensionLoader?.getManifestRegistry();
356
+ if (!registry) return void 0;
357
+ return registry.getAllEntries().find((entry) => Object.keys(entry.manifest.channelContributions ?? {}).some((id) => id.toLowerCase() === normalized));
358
+ }
359
+ async ensureChannelRuntimePlugin(channelId) {
360
+ if (this.channelManager.getPlugin(channelId)) {
361
+ await this.channelManager.initializeChannel(channelId);
362
+ return this.channelManager.getPlugin(channelId);
363
+ }
364
+ if (!this.extensionLoader || areExtensionsGloballyDisabled(this.config)) return;
365
+ const entry = this.findChannelContributionExtension(channelId);
366
+ if (!entry) return;
367
+ const extensionConfig = {
368
+ id: entry.id,
369
+ name: entry.manifest.name || entry.id,
370
+ source: entry.source,
371
+ path: entry.path,
372
+ enabled: true,
373
+ config: {}
374
+ };
375
+ await this.extensionLoader.loadExtension(extensionConfig);
376
+ this.registerExtensionChannelPlugins();
377
+ if (!this.channelManager.getPlugin(channelId)) return;
378
+ await this.channelManager.initializeChannel(channelId);
379
+ return this.channelManager.getPlugin(channelId);
380
+ }
349
381
  async loadDeferredExtensions() {
350
382
  if (!this.extensionLoader) return;
351
383
  try {
@@ -529,6 +561,7 @@ var GatewayService = class {
529
561
  await new Promise((resolve) => setTimeout(resolve, delayMs));
530
562
  }
531
563
  markGatewayReady() {
564
+ if (this.readiness.isReady()) return;
532
565
  this.readiness.markReady();
533
566
  this.startupTrace?.mark("ready");
534
567
  this.schedulePostReadySidecars();
@@ -543,12 +576,13 @@ var GatewayService = class {
543
576
  * opted into `meta.deferConnectUntilAfterListen`, then replays outbound queue.
544
577
  */
545
578
  async onHttpListening() {
579
+ await this.applyStartupReadyDelayForTesting();
580
+ this.markGatewayReady();
546
581
  await this.runExposureAutoStartIfConfigured();
547
582
  if (this.serviceConfig.deferChannelConnectUntilAfterHttp !== true) return;
548
583
  const listenStartedAt = performance.now();
549
584
  const trace = this.startupTrace;
550
585
  try {
551
- await this.applyStartupReadyDelayForTesting();
552
586
  const tDef = performance.now();
553
587
  if (trace) await trace.measure("channels.deferred-connect", () => this.channelManager.startDeferredConnects());
554
588
  else await this.channelManager.startDeferredConnects();
@@ -687,15 +721,19 @@ var GatewayService = class {
687
721
  host
688
722
  }, "Browser extension WS server started");
689
723
  } catch (err) {
690
- const code = err && typeof err === "object" && "code" in err ? err.code : void 0;
691
- log.error({
692
- err,
693
- phase: "browser_extension_ws",
694
- ...code === "EADDRINUSE" ? {
724
+ if ((err && typeof err === "object" && "code" in err ? err.code : void 0) === "EADDRINUSE") {
725
+ log.warn({
726
+ err,
727
+ phase: "browser_extension_ws",
695
728
  bindPort: port,
696
729
  bindHost: host,
697
730
  hint: "Another process holds this port (default 19820). Stop it or set agents.defaults.browser.extension.port."
698
- } : {}
731
+ }, `Browser extension WS server port is already in use: ${host}:${port}`);
732
+ return;
733
+ }
734
+ log.error({
735
+ err,
736
+ phase: "browser_extension_ws"
699
737
  }, `Failed to start browser extension WS server: ${err instanceof Error ? err.message : String(err)}`);
700
738
  }
701
739
  }
@@ -774,55 +812,33 @@ var GatewayService = class {
774
812
  getChannelsStatus() {
775
813
  const runningChannels = new Set(this.channelManager.getRunningChannels());
776
814
  const channels = this.config.channels;
777
- const builtinOrder = CHAT_CHANNEL_ORDER;
778
- const rows = CHAT_CHANNEL_ORDER.map((name) => ({
779
- name,
780
- enabled: !!channels?.[name]?.enabled,
781
- connected: runningChannels.has(name)
815
+ return (this.extensionMetadataSnapshot ? buildChannelCatalogFromSnapshot(this.extensionMetadataSnapshot) : buildChannelCatalogForConfig(this.config)).entries.map((entry) => ({
816
+ name: entry.id,
817
+ enabled: channels?.[entry.id]?.enabled === true,
818
+ connected: runningChannels.has(entry.id)
782
819
  }));
783
- const extraIds = (this.extensionLoader?.getRegistry())?.channelPlugins.map((p) => p.id).filter((id) => !builtinOrder.includes(id)) ?? [];
784
- if (extraIds.length === 0) return rows;
785
- const seen = new Set(builtinOrder);
786
- for (const name of extraIds) {
787
- if (seen.has(name)) continue;
788
- seen.add(name);
789
- rows.push({
790
- name,
791
- enabled: channels?.[name]?.enabled !== false,
792
- connected: runningChannels.has(name)
793
- });
794
- }
795
- return rows;
820
+ }
821
+ getRunningChannelIds() {
822
+ return this.channelManager.getRunningChannels();
823
+ }
824
+ getChannelRuntimePlugin(channelId) {
825
+ return this.channelManager.getPlugin(channelId);
826
+ }
827
+ async restartChannel(channelId) {
828
+ await this.channelManager.stopChannel(channelId);
829
+ await this.channelManager.startChannel(channelId);
796
830
  }
797
831
  /**
798
832
  * Hub metadata for gateway console (built-in registry + registered channel plugins).
799
833
  */
800
834
  getChannelsHubMeta() {
801
- const manageableIds = new Set([
802
- "telegram",
803
- "weixin",
804
- "feishu"
805
- ]);
806
- const byId = /* @__PURE__ */ new Map();
807
- for (const plugin of this.channelManager.getAllPlugins()) byId.set(plugin.id, {
808
- id: plugin.id,
809
- label: plugin.meta.label,
810
- description: plugin.meta.blurb,
811
- manageable: manageableIds.has(plugin.id),
812
- order: plugin.meta.order ?? 999
813
- });
814
- CHAT_CHANNEL_ORDER.forEach((id, index) => {
815
- if (byId.has(id)) return;
816
- const meta = getChatChannelMeta(id);
817
- byId.set(id, {
818
- id,
819
- label: meta.label,
820
- description: meta.description,
821
- manageable: true,
822
- order: index
823
- });
824
- });
825
- return Array.from(byId.values()).toSorted((a, b) => {
835
+ return (this.extensionMetadataSnapshot ? buildChannelCatalogFromSnapshot(this.extensionMetadataSnapshot) : buildChannelCatalogForConfig(this.config)).entries.map((entry) => ({
836
+ id: entry.id,
837
+ label: entry.label,
838
+ description: entry.description ?? "",
839
+ manageable: true,
840
+ order: entry.order
841
+ })).toSorted((a, b) => {
826
842
  if (a.order !== b.order) return a.order - b.order;
827
843
  return a.id.localeCompare(b.id);
828
844
  });
@@ -1 +1 @@
1
- {"version":3,"file":"service.js","names":["writeConfigToDisk"],"sources":["../../../src/gateway/service.ts"],"sourcesContent":["import crypto from 'crypto';\nimport { AgentService } from '../agent/service.js';\nimport { ChannelManager } from '../channels/manager.js';\nimport { CHAT_CHANNEL_ORDER, getChatChannelMeta } from '../channels/registry.js';\nimport { setPairingBroadcastSink } from '../channels/pairing/pairing-events.js';\nimport { MessageBus, MessageBusShutdownError } from '../infra/bus/index.js';\nimport { loadConfig, saveConfig as writeConfigToDisk } from '../config/index.js';\nimport { getWorkspacePath } from '../config/workspace-path-helpers.js';\nimport { CronService } from '../cron/index.js';\nimport { NotesService, NotesStore } from '../notes/index.js';\nimport { buildWorkflowChildTools } from '../agent/workflow/workflow-child-tools.js';\nimport { WorkflowRunService } from '../workflows/service/workflow-run-service.js';\nimport { WorkflowSessionBridge } from '../workflows/service/workflow-session-bridge.js';\nimport { ExtensionLoader, areExtensionsGloballyDisabled, buildExtensionMetadataSnapshot } from '../extensions/index.js';\nimport { HeartbeatService, heartbeatRunnerConfigFromConfig } from './heartbeat/index.js';\nimport { SessionIndex } from '../session/index.js';\nimport type { Config } from '../config/schema.js';\nimport { wireTunnelEventsToGateway } from '../tunnel/gateway-lifecycle.js';\nimport {\n stopTailscaleExposure,\n} from './tailscale-lifecycle.js';\nimport { getExposureManager } from '../remote-access/exposure-manager.js';\nimport { sanitizeTunnelConfig } from '../tunnel/tunnel-config.js';\nimport { resolveGatewayAuth, assertGatewayAuthConfigured, validateToken, extractToken, type ResolvedGatewayAuth } from './auth.js';\nimport { assertGatewayAuthNotKnownWeak } from './security/known-weak-secrets.js';\nimport { auditGatewayConfig } from './security/audit.js';\nimport { assertGatewayRuntimeConfig } from './runtime-config.js';\nimport { resolveEffectiveGatewayPort } from './host.js';\nimport { buckets, isGatewayStrictSecurityEnabled } from './rate-limit/index.js';\nimport { prewarmModelRegistry } from '../providers/index.js';\nimport { createLogger, getLogDir, getRuntimeLogStats } from '../utils/logger.js';\nimport {\n resolveConfigPath,\n resolveCronJobsPath,\n resolveAgentDir,\n resolveExtensionsDir,\n} from '../config/paths.js';\nimport { AgentRunRelay, type RelayEvent } from './agent-run-relay.js';\nimport { registerClarifyBridge } from './clarify-runtime.js';\nimport { PACKAGE_VERSION } from '../package-version.js';\n\nimport { disposeAllSessionMcpRuntimes } from '../agent/mcp/bundle-mcp-tools.js';\nimport { getDefaultAgentId } from '../routing/resolve-route.js';\nimport { scheduleGatewayUpdateCheck } from '../infra/update-startup.js';\nimport { resolveChannelConnectDeferSet } from './resolve-channel-connect-defer.js';\nimport { restartGatewayProcessWithFreshPid } from './respawn.js';\nimport { GatewaySessionsApi } from './service/sessions-api.js';\nimport { GatewayMarketplaceService } from './service/marketplace-service.js';\nimport { GatewayConfigCoordinator } from './service/config-coordinator.js';\nimport { GatewayAgentRunner } from './service/agent-runner.js';\nimport { GatewaySseHub } from './service/sse-hub.js';\nimport type {\n GatewayChannelStartupPhase1Metrics,\n GatewayChannelStartupPhase2Metrics,\n GatewayServiceConfig,\n ServiceEvent,\n} from './service/types.js';\nimport {\n GatewayReadiness,\n type GatewayReadinessSnapshot,\n} from './startup-readiness.js';\nimport { createGatewayStartupTrace, type GatewayStartupTrace } from './startup-trace.js';\nimport { closeXopcDatabase, openXopcDatabase } from '../storage/sqlite/index.js';\n\nexport type {\n GatewayChannelStartupPhase1Metrics,\n GatewayChannelStartupPhase2Metrics,\n GatewayServiceConfig,\n ServiceEvent,\n} from './service/types.js';\n\nconst log = createLogger('Gateway:Service');\n\nexport class GatewayService {\n private bus: MessageBus;\n private config: Config;\n private configPath: string;\n private _agentService: AgentService | null = null;\n private channelManager: ChannelManager;\n private cronService: CronService;\n private notesService: NotesService;\n private extensionLoader: ExtensionLoader | null = null;\n private extensionMetadataSnapshot: import('../extensions/extension-metadata-snapshot.js').ExtensionMetadataSnapshot | null = null;\n private browserExtensionProvider: import('../browser/providers/extension.js').ExtensionBrowserProvider | null = null;\n private browserExtensionRelease: (() => Promise<void>) | null = null;\n /** `${host}:${port}` when the gateway holds the extension bridge listener. */\n private browserExtensionBindKey: string | null = null;\n private heartbeatService: HeartbeatService | null = null;\n private sessionIndex: SessionIndex;\n private running = false;\n private startTime = Date.now();\n private workspacePath: string;\n private readonly configCoordinator: GatewayConfigCoordinator;\n\n // Authentication\n private auth: ResolvedGatewayAuth;\n\n private readonly sse = new GatewaySseHub();\n\n private stopGatewayUpdateCheck: (() => void) | null = null;\n\n /** When set (e.g. by `GatewayServer`), `triggerGatewayProcessRestart` can stop HTTP then exit. */\n private gatewayShutdownForRestart: (() => Promise<void>) | null = null;\n\n /** Snapshot for phase-2 metrics / logs (ids deferred at phase-1 `start()`). */\n private lastDeferredChannelConnectIds: string[] = [];\n private lastChannelConnectDeferMode: 'auto' | 'off' | 'explicit' = 'auto';\n private lastChannelConnectDeferSource: 'off' | 'explicit' | 'meta' = 'off';\n\n private readonly readiness = new GatewayReadiness();\n private startupTrace: GatewayStartupTrace | null = null;\n private workflowSessionBridge: WorkflowSessionBridge | null = null;\n private workflowRunServiceInstance: WorkflowRunService | null = null;\n\n /**\n * Webchat agent invocation surface (`runAgent`, `abortAgentRun`, `steer*`,\n * `submitClarifyResponse`, clarify-bridge dispatch). Owns the\n * `activeWebchatRunBySession` + `runAbortControllers` maps.\n */\n readonly agentRunner: GatewayAgentRunner;\n\n /** Read-only alias re-exported from `agentRunner.runRelay` for legacy callers. */\n get runRelay(): AgentRunRelay { return this.agentRunner.runRelay; }\n\n /**\n * Session CRUD / search / compaction / tag-archive-pin / stats — the gateway\n * REST surface for sessions. Routes should depend on this narrow service\n * rather than the full GatewayService composition root.\n */\n readonly sessions: GatewaySessionsApi;\n\n /**\n * Skills + extensions marketplace surface (browse / install / uninstall) plus\n * local-only managed-skill ops. Routes depend on this narrow service.\n */\n readonly marketplace: GatewayMarketplaceService;\n\n constructor(private serviceConfig: GatewayServiceConfig = {}) {\n this.bus = new MessageBus();\n this.configPath = serviceConfig.configPath || resolveConfigPath();\n this.config = loadConfig(this.configPath);\n if (sanitizeTunnelConfig(this.config)) {\n void writeConfigToDisk(this.config, this.configPath).catch((err) => {\n const em = err instanceof Error ? err.message : String(err);\n log.warn({ err, phase: 'tunnel_sanitize', errorMessage: em }, `Tunnel config sanitize persist failed: ${em}`);\n });\n }\n\n // Initialize authentication\n this.auth = resolveGatewayAuth({\n authConfig: this.config.gateway?.auth,\n });\n\n // Validate auth configuration\n assertGatewayAuthConfigured(this.auth);\n\n // Reject known weak / placeholder credentials at startup\n assertGatewayAuthNotKnownWeak(this.auth);\n\n const gatewayPort = this.getEffectiveListenPort();\n const runtimeConfig = assertGatewayRuntimeConfig({\n cfg: this.config,\n auth: this.auth,\n bindOverride: serviceConfig.listenBind,\n port: gatewayPort,\n });\n\n // Security audit: non-blocking warnings for remaining risk signals\n auditGatewayConfig({\n auth: this.auth,\n bindHost: runtimeConfig.bindHost,\n corsOrigins: runtimeConfig.corsOrigins,\n rateLimitEnabled: runtimeConfig.rateLimitEnabled,\n tlsEnabled: runtimeConfig.tlsEnabled,\n trustedProxies: this.config.gateway?.trustedProxies,\n allowRealIpFallback: this.config.gateway?.allowRealIpFallback === true,\n dangerouslyAllowHostHeaderOriginFallback: runtimeConfig.dangerouslyAllowHostHeaderOriginFallback,\n strictSecurityEnabled: isGatewayStrictSecurityEnabled(this.config),\n rateLimitConfigured: this.config.gateway?.auth?.rateLimit !== undefined,\n });\n\n // Log token info (not the token itself)\n if (this.auth.mode === 'token') {\n const tokenPreview = this.auth.token ? `${this.auth.token.slice(0, 4)}***` : 'none';\n log.info({ mode: this.auth.mode, token: tokenPreview }, 'Authentication configured');\n } else if (this.auth.mode === 'trusted-proxy') {\n log.info(\n {\n mode: this.auth.mode,\n userHeader: this.auth.trustedProxy?.userHeader,\n trustedProxyCount: this.config.gateway?.trustedProxies?.length ?? 0,\n },\n 'Trusted-proxy authentication configured',\n );\n } else {\n log.info({ mode: this.auth.mode }, 'Authentication configured');\n }\n\n // Initialize channel manager\n this.channelManager = new ChannelManager(this.config, this.bus);\n\n // Initialize extension loader (manifest snapshot only — code load in start()).\n this.workspacePath = getWorkspacePath(this.config) || './workspace';\n this.initializeExtensionLoader();\n\n // Session index + files shared with AgentService (webchat `/goal` metadata must match GET /api/goals/webchat).\n this.sessionIndex = new SessionIndex({\n config: this.config,\n });\n\n this.cronService = new CronService({\n filePath: resolveCronJobsPath(),\n });\n\n this.notesService = new NotesService(new NotesStore());\n\n this.agentRunner = new GatewayAgentRunner({\n bus: this.bus,\n sessionIndex: this.sessionIndex,\n getAgentService: () => this.ensureAgentService(),\n getChannelManager: () => this.channelManager,\n getConfig: () => this.config,\n emit: (type, payload) => this.sse.emit(type, payload),\n });\n\n this.sessions = new GatewaySessionsApi({\n sessionIndex: this.sessionIndex,\n getAgentService: () => this.ensureAgentService(),\n getActiveWebchatRunId: (sk) => this.agentRunner.getActiveRunId(sk),\n });\n\n this.marketplace = new GatewayMarketplaceService({\n getConfig: () => this.config,\n getAgentService: () => this.ensureAgentService(),\n getExtensionLoader: () => this.extensionLoader,\n getChannelManager: () => this.channelManager,\n saveConfig: (cfg) => this.saveConfig(cfg),\n emit: (type, payload) => this.emit(type, payload),\n });\n\n this.configCoordinator = new GatewayConfigCoordinator({\n configPath: this.configPath,\n bus: this.bus,\n enableHotReload: this.serviceConfig.enableHotReload !== false,\n getConfig: () => this.config,\n setConfig: (next) => { this.config = next; },\n getAgentService: () => this.ensureAgentService(),\n getChannelManager: () => this.channelManager,\n getCronService: () => this.cronService,\n getHeartbeatService: () => this.heartbeatService,\n getExtensionLoader: () => this.extensionLoader,\n reconcileBrowserExtensionServer: () => this.reconcileBrowserExtensionServer(),\n getChannelsStatus: () => this.getChannelsStatus(),\n emit: (type, payload) => this.emit(type, payload),\n });\n }\n\n /** Lazy AgentService — constructed on first use or during `start()`. */\n get agentService(): AgentService {\n return this.ensureAgentService();\n }\n\n private ensureAgentService(): AgentService {\n if (this._agentService) {\n return this._agentService;\n }\n\n const cronRef: { service?: CronService } = { service: this.cronService };\n this._agentService = new AgentService(this.bus, {\n workspace: this.workspacePath,\n model: this.config.agents?.defaults?.model?.primary,\n config: this.config,\n sessionStore: this.sessionIndex.getStore(),\n onSessionMetadataUpdated: (sessionKey, patch) => {\n this.sessionIndex.emit('sessionUpdated', { key: sessionKey, name: patch?.name });\n this.emit('session.updated', { key: sessionKey, name: patch?.name });\n },\n onSessionTranscriptUpdated: (sessionKey) => {\n this.emit('session.transcript_updated', { key: sessionKey });\n },\n extensionRegistry: this.extensionLoader?.getRegistry(),\n getCronService: () => cronRef.service,\n getWorkflowRunService: () => this.createWorkflowRunService(),\n gatewayClarify: {\n requestClarification: (sessionKey, request) =>\n this.agentRunner.requestClarification({\n sessionKey,\n request,\n publishSseFor: (_runId) => (e: RelayEvent) => {\n this._agentService!.turnDispatcher.enqueueWebchatSseEvent(sessionKey, e);\n },\n }),\n },\n });\n\n this._agentService.setChannelManager(this.channelManager);\n this.channelManager.setSessionModelHooks({\n getModelForSession: (sk) => this._agentService!.getModelForSession(sk),\n switchModelForSession: (sk, id) => this._agentService!.switchModelForSession(sk, id),\n });\n\n this.cronService.setDeps({\n agentService: this._agentService,\n messageBus: this.bus,\n heartbeatService: this.ensureHeartbeatService(),\n sessionStore: this.sessionIndex.getStore(),\n getDefaultCronAgentId: () => getDefaultAgentId(this.config),\n workflowRunService: this.createWorkflowRunService(),\n });\n cronRef.service = this.cronService;\n\n this._agentService.persistentGoals.setWebchatContinuationScheduler((sessionKey, message) => {\n const scheduleWhenIdle = () => {\n if (this._agentService!.getInboundTurnDepth(sessionKey) > 0) {\n setTimeout(scheduleWhenIdle, 50);\n return;\n }\n if (this.agentRunner.hasActiveRun(sessionKey)) {\n setTimeout(scheduleWhenIdle, 50);\n return;\n }\n void this.agentRunner.drainScheduledWebchatContinuation(sessionKey, message);\n };\n queueMicrotask(scheduleWhenIdle);\n });\n\n return this._agentService;\n }\n\n private ensureHeartbeatService(): HeartbeatService {\n if (this.heartbeatService) {\n return this.heartbeatService;\n }\n this.heartbeatService = new HeartbeatService({\n agentService: this.ensureAgentService(),\n messageBus: this.bus,\n cronService: this.cronService,\n sessionStore: this.sessionIndex.getStore(),\n getConfig: () => this.config,\n });\n return this.heartbeatService;\n }\n\n // ── Webchat agent runner (delegated to GatewayAgentRunner) ────────────\n\n enqueueWebchatPersistentGoalKickoff(sessionKey: string, goalText: string): void {\n this.agentRunner.enqueueWebchatPersistentGoalKickoff(sessionKey, goalText);\n }\n\n runAgent(\n ...args: Parameters<GatewayAgentRunner['runAgent']>\n ): ReturnType<GatewayAgentRunner['runAgent']> {\n return this.agentRunner.runAgent(...args);\n }\n\n abortAgentRun(runId: string): boolean {\n return this.agentRunner.abortAgentRun(runId);\n }\n\n steerWebchatAgent(\n chatId: string,\n message: string,\n ): ReturnType<GatewayAgentRunner['steerWebchatAgent']> {\n return this.agentRunner.steerWebchatAgent(chatId, message);\n }\n\n submitClarifyResponse(requestId: string, answer: string): boolean {\n return this.agentRunner.submitClarifyResponse(requestId, answer);\n }\n\n private initializeExtensionLoader(): void {\n try {\n if (areExtensionsGloballyDisabled(this.config)) {\n log.info('Extensions globally disabled — skipping loader initialization');\n return;\n }\n\n const loaderOptions = {\n workspaceDir: this.workspacePath,\n extensionsDir: resolveExtensionsDir(),\n };\n this.extensionMetadataSnapshot = buildExtensionMetadataSnapshot(loaderOptions, this.config);\n this.extensionLoader = new ExtensionLoader(loaderOptions);\n this.extensionLoader.setManifestSnapshot(this.extensionMetadataSnapshot);\n this.extensionLoader.setConfig(this.config as Parameters<ExtensionLoader['setConfig']>[0]);\n } catch (error) {\n log.warn({ error }, 'Failed to initialize extension loader');\n }\n }\n\n private registerExtensionChannelPlugins(): void {\n if (!this.extensionLoader) {\n return;\n }\n const reg = this.extensionLoader.getRegistry();\n for (const plugin of reg.channelPlugins) {\n this.channelManager.registerPlugin(plugin);\n }\n }\n\n /**\n * Load extensions and register SDK / full ChannelPlugin instances with ChannelManager.\n */\n private async loadExtensionsAndRegisterChannels(): Promise<void> {\n if (!this.extensionLoader) {\n return;\n }\n try {\n await this.extensionLoader.loadByActivationPlan({ phase: 'startup' });\n this.registerExtensionChannelPlugins();\n const reg = this.extensionLoader.getRegistry();\n log.debug(\n {\n extensionRecords: reg.extensions.size,\n channelPlugins: reg.channelPlugins.length,\n },\n 'Startup-phase extensions loaded and channel plugins registered',\n );\n } catch (err) {\n log.warn({ err }, 'Failed to load startup-phase extensions');\n }\n }\n\n private async loadDeferredExtensions(): Promise<void> {\n if (!this.extensionLoader) {\n return;\n }\n try {\n await this.extensionLoader.loadByActivationPlan({ phase: 'deferred' });\n this.registerExtensionChannelPlugins();\n log.debug('Deferred-phase extensions loaded');\n } catch (err) {\n log.warn({ err }, 'Failed to load deferred extensions');\n }\n }\n\n private schedulePostReadySidecars(): void {\n queueMicrotask(() => {\n void this.runPostReadySidecars();\n });\n }\n\n private async runPostReadySidecars(): Promise<void> {\n const trace = this.startupTrace;\n try {\n if (trace) {\n await trace.measure('sidecars.model-prewarm', () => prewarmModelRegistry());\n } else {\n await prewarmModelRegistry();\n }\n } catch (err) {\n const em = err instanceof Error ? err.message : String(err);\n log.warn({ err, errorMessage: em, phase: 'sidecars.model_prewarm' }, `Model registry prewarm failed: ${em}`);\n }\n\n if (!this.extensionLoader || areExtensionsGloballyDisabled(this.config)) {\n return;\n }\n\n try {\n if (trace) {\n await trace.measure('extensions.deferred-load', () => this.loadDeferredExtensions());\n } else {\n await this.loadDeferredExtensions();\n }\n } catch (err) {\n const em = err instanceof Error ? err.message : String(err);\n log.warn({ err, errorMessage: em, phase: 'extensions.deferred_load' }, `Deferred extension load failed: ${em}`);\n }\n }\n\n async start(): Promise<void> {\n if (this.running) return;\n\n setPairingBroadcastSink((type, payload) => {\n this.emit(type, payload);\n });\n\n log.debug('Starting gateway service...');\n openXopcDatabase();\n this.startTime = Date.now();\n this.running = true;\n this.startupTrace = createGatewayStartupTrace();\n this.readiness.markStarting(this.startTime);\n const trace = this.startupTrace;\n\n registerClarifyBridge(this.agentRunner.getClarifyBridge());\n\n this.ensureAgentService();\n\n this.channelManager.setOutboundHooks({\n runMessageSending: (to, content, channel) =>\n this.agentService.outboundCoordinator.invokeOutboundMessageSending(to, content, channel),\n runMessageSent: (to, content, success, error, channel) =>\n this.agentService.outboundCoordinator.invokeOutboundMessageSent(to, content, success, error, channel),\n });\n this.channelManager.enableOutboundPersistence(resolveAgentDir(this.config, getDefaultAgentId(this.config)));\n\n if (this.extensionLoader) {\n this.extensionLoader.setRuntimeContext({\n bus: this.bus,\n sessionManager: this.sessionIndex,\n scheduleWebchatContinuation: (sessionKey: string, continuationMessage: string) => {\n queueMicrotask(() => {\n void this.agentRunner.drainScheduledWebchatContinuation(sessionKey, continuationMessage);\n });\n },\n });\n }\n\n await trace.measure('extensions.load', () => this.loadExtensionsAndRegisterChannels());\n\n const skipChannels =\n process.env.XOPC_SKIP_CHANNELS === '1' ||\n process.env.XOPC_SKIP_CHANNELS === 'true' ||\n process.env.XOPC_SKIP_PROVIDERS === '1' ||\n process.env.XOPC_SKIP_PROVIDERS === 'true';\n\n // Start channels: init all; optional defer for meta.deferConnectUntilAfterListen (GatewayServer)\n const phase1StartedAt = performance.now();\n let channelInitMs = 0;\n let deferPlanMs = 0;\n let channelPhase1StartMs = 0;\n let replayOutboundMs: number | null = null;\n let deferConnect = new Set<string>();\n\n if (skipChannels) {\n log.info('Skipping channel startup (XOPC_SKIP_CHANNELS or XOPC_SKIP_PROVIDERS)');\n } else {\n const t0 = performance.now();\n await trace.measure('channels.initialize', () => this.channelManager.initialize());\n channelInitMs = performance.now() - t0;\n\n const t1 = performance.now();\n const deferResolution = resolveChannelConnectDeferSet({\n config: this.config,\n channelManager: this.channelManager,\n deferChannelConnectUntilAfterHttp: this.serviceConfig.deferChannelConnectUntilAfterHttp === true,\n });\n deferConnect = deferResolution.deferPluginIds;\n deferPlanMs = performance.now() - t1;\n this.lastDeferredChannelConnectIds = [...deferConnect];\n this.lastChannelConnectDeferMode = deferResolution.mode;\n this.lastChannelConnectDeferSource = deferResolution.source;\n\n if (deferConnect.size > 0) {\n log.info({ channels: [...deferConnect] }, 'Deferring channel outbound connect until HTTP listen');\n }\n\n const t2 = performance.now();\n await trace.measure('channels.start', () =>\n this.channelManager.start(\n deferConnect.size > 0 ? { deferConnectPluginIds: deferConnect } : undefined,\n ),\n );\n channelPhase1StartMs = performance.now() - t2;\n\n if (this.serviceConfig.deferChannelConnectUntilAfterHttp !== true) {\n const tr = performance.now();\n await trace.measure('channels.replay-outbound', () =>\n this.channelManager.replayPendingOutboundMessages(),\n );\n replayOutboundMs = performance.now() - tr;\n }\n }\n\n const channelStartupPhase1TotalMs = performance.now() - phase1StartedAt;\n const gwDeferMode = this.config.gateway?.channelConnectDeferMode ?? 'auto';\n const phase1Metrics: GatewayChannelStartupPhase1Metrics = {\n deferChannelConnectUntilAfterHttp: this.serviceConfig.deferChannelConnectUntilAfterHttp === true,\n channelConnectDeferMode: this.serviceConfig.deferChannelConnectUntilAfterHttp\n ? this.lastChannelConnectDeferMode\n : gwDeferMode,\n channelConnectDeferSource: this.lastChannelConnectDeferSource,\n deferredChannelIds: this.lastDeferredChannelConnectIds,\n deferredChannelCount: this.lastDeferredChannelConnectIds.length,\n channelInitMs: Math.round(channelInitMs),\n deferPlanMs: Math.round(deferPlanMs),\n channelPhase1StartMs: Math.round(channelPhase1StartMs),\n replayOutboundMs: replayOutboundMs === null ? null : Math.round(replayOutboundMs),\n channelStartupPhase1TotalMs: Math.round(channelStartupPhase1TotalMs),\n };\n log.info(\n { phase: 'gateway.channel_startup', stage: 'phase1', ...phase1Metrics },\n 'Gateway channel startup phase-1 complete',\n );\n\n // Initialize session manager\n await trace.measure('sessions.initialize', () => this.sessionIndex.initialize());\n log.debug('Session manager initialized');\n\n this.cronService.setDeps({\n agentService: this.agentService,\n messageBus: this.bus,\n heartbeatService: this.ensureHeartbeatService(),\n sessionStore: this.sessionIndex.getStore(),\n getDefaultCronAgentId: () => getDefaultAgentId(this.config),\n workflowRunService: this.createWorkflowRunService(),\n });\n\n this.sessionIndex.on('sessionUpdated', (data: { key: string; name?: string; tags?: string[] }) => {\n this.emit('session.updated', { key: data.key, name: data.name, tags: data.tags });\n });\n\n // Start cron service\n if (this.config.cron?.enabled !== false) {\n await trace.measure('cron.initialize', () => this.cronService.initialize());\n }\n\n await this.notesService.initialize();\n\n this.ensureHeartbeatService().start(heartbeatRunnerConfigFromConfig(this.config));\n\n void import('../browser/providers/browser-ext-install.js')\n .then(({ ensureBrowserExtensionOnStartup }) => ensureBrowserExtensionOnStartup(this.config))\n .catch((err) => log.warn({ err }, 'Browser extension artifact ensure failed'));\n\n // Start browser extension WS server if configured\n await trace.measure('browser-extension.start', () => this.startBrowserExtensionServerIfNeeded());\n\n // Start agent service (runs in background)\n this.agentService.start().catch((err) => {\n log.error({ err }, 'Agent service error');\n });\n\n // Outbound drain: after deferred channel connects when using HTTP lifecycle (avoid racing Telegram).\n if (this.serviceConfig.deferChannelConnectUntilAfterHttp !== true) {\n this.startOutboundProcessor().catch((err) => {\n log.error({ err }, 'Outbound processor error');\n });\n }\n\n // Setup config hot reload\n if (this.serviceConfig.enableHotReload !== false) {\n this.configCoordinator.startHotReloader();\n }\n\n this.stopGatewayUpdateCheck = scheduleGatewayUpdateCheck({\n config: this.config,\n onUpdateAvailableChange: (update) => {\n this.emit('update.available', update);\n },\n triggerInProcessRestart: () => this.triggerGatewayProcessRestart(),\n });\n\n wireTunnelEventsToGateway(this);\n\n // Drop orphan single-HTML site-share staging dirs left behind by a\n // process death between create and cleanup. Re-registers live ones into\n // the in-process map so post-restart revoke/expire still cleans them.\n void import('../share/share-auto.js')\n .then(({ runStagingSweep }) => runStagingSweep())\n .catch((err) => log.warn({ err }, 'Share staging sweep failed'));\n\n if (this.serviceConfig.deferChannelConnectUntilAfterHttp !== true) {\n this.markGatewayReady();\n } else {\n trace.mark('service.started-awaiting-http');\n }\n\n log.debug('Gateway service started');\n }\n\n /** Called when the HTTP listener is bound (before deferred channel work). */\n markHttpListening(): void {\n this.readiness.markHttpListening();\n this.startupTrace?.mark('http.listening');\n }\n\n isGatewayReady(): boolean {\n return this.readiness.isReady();\n }\n\n getGatewayReadiness(): GatewayReadinessSnapshot {\n return this.readiness.getSnapshot();\n }\n\n private async applyStartupReadyDelayForTesting(): Promise<void> {\n const raw = process.env.XOPC_GATEWAY_STARTUP_SLOW_MS?.trim();\n if (!raw) {\n return;\n }\n const delayMs = Number.parseInt(raw, 10);\n if (!Number.isFinite(delayMs) || delayMs <= 0) {\n return;\n }\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n\n private markGatewayReady(): void {\n this.readiness.markReady();\n this.startupTrace?.mark('ready');\n this.schedulePostReadySidecars();\n }\n\n /** After HTTP is listening: exposure auto-start (Tailscale, then FRP tunnel). */\n private async runExposureAutoStartIfConfigured(): Promise<void> {\n const port = this.getEffectiveListenPort();\n await getExposureManager().autoStart(this.config, port, this.getAuthToken());\n }\n\n /**\n * Called by `GatewayServer` when the HTTP listener is bound. Starts channels that\n * opted into `meta.deferConnectUntilAfterListen`, then replays outbound queue.\n */\n async onHttpListening(): Promise<void> {\n await this.runExposureAutoStartIfConfigured();\n\n if (this.serviceConfig.deferChannelConnectUntilAfterHttp !== true) {\n return;\n }\n const listenStartedAt = performance.now();\n const trace = this.startupTrace;\n try {\n await this.applyStartupReadyDelayForTesting();\n\n const tDef = performance.now();\n if (trace) {\n await trace.measure('channels.deferred-connect', () => this.channelManager.startDeferredConnects());\n } else {\n await this.channelManager.startDeferredConnects();\n }\n const channelPhase2DeferredMs = performance.now() - tDef;\n\n const tr = performance.now();\n if (trace) {\n await trace.measure('channels.replay-outbound', () =>\n this.channelManager.replayPendingOutboundMessages(),\n );\n } else {\n await this.channelManager.replayPendingOutboundMessages();\n }\n const replayOutboundMs = performance.now() - tr;\n\n this.startOutboundProcessor().catch((err) => {\n log.error({ err }, 'Outbound processor error');\n });\n this.emit('channels.status', { channels: this.getChannelsStatus() });\n\n const onHttpListeningTotalMs = performance.now() - listenStartedAt;\n const phase2Metrics: GatewayChannelStartupPhase2Metrics = {\n channelConnectDeferMode: this.lastChannelConnectDeferMode,\n channelConnectDeferSource: this.lastChannelConnectDeferSource,\n deferredChannelIds: this.lastDeferredChannelConnectIds,\n channelPhase2DeferredMs: Math.round(channelPhase2DeferredMs),\n replayOutboundMs: Math.round(replayOutboundMs),\n onHttpListeningTotalMs: Math.round(onHttpListeningTotalMs),\n };\n log.info(\n { phase: 'gateway.channel_startup', stage: 'phase2', ...phase2Metrics },\n 'Gateway channel startup phase-2 complete (HTTP listening)',\n );\n } catch (err) {\n const em = err instanceof Error ? err.message : String(err);\n log.error(\n {\n err,\n errorMessage: em,\n phase: 'gateway.channel_startup',\n stage: 'phase2',\n deferredChannelIds: this.lastDeferredChannelConnectIds,\n elapsedMs: Math.round(performance.now() - listenStartedAt),\n },\n `Deferred channel startup after HTTP listen failed: ${em}`,\n );\n } finally {\n this.markGatewayReady();\n }\n }\n\n async stop(): Promise<void> {\n if (!this.running) return;\n\n setPairingBroadcastSink(null);\n\n log.debug('Stopping gateway service...');\n this.readiness.markStarting();\n\n await stopTailscaleExposure().catch((err) => {\n log.warn({ err }, 'Tailscale exposure shutdown failed');\n });\n\n if (this.stopGatewayUpdateCheck) {\n this.stopGatewayUpdateCheck();\n this.stopGatewayUpdateCheck = null;\n }\n\n await this.configCoordinator.stopHotReloader();\n\n // Stop heartbeat service\n this.heartbeatService?.stop();\n\n // Stop browser extension WS server (shared acquire/release with BrowserManager)\n if (this.browserExtensionRelease) {\n await this.browserExtensionRelease();\n this.browserExtensionRelease = null;\n }\n this.browserExtensionProvider = null;\n this.browserExtensionBindKey = null;\n\n registerClarifyBridge(null);\n this.agentRunner.disposeClarifyBridge();\n await disposeAllSessionMcpRuntimes().catch((err) => {\n log.warn({ err }, 'MCP runtime shutdown failed');\n });\n this._agentService?.stop();\n\n // Unblock `consumeOutbound()` / `consumeInbound()` waiters before stopping channels (CLI agent does the same).\n this.running = false;\n this.bus.shutdown();\n\n this.lastDeferredChannelConnectIds = [];\n this.lastChannelConnectDeferMode = 'auto';\n this.lastChannelConnectDeferSource = 'off';\n\n await this.channelManager.stop();\n\n // Stop cron service\n await this.cronService.stop();\n\n // Flush notes to disk\n await this.notesService.flush();\n\n // Tear down rate-limit cleanup timers so the process can exit cleanly.\n buckets.destroyAll();\n\n closeXopcDatabase();\n\n log.debug('Gateway service stopped');\n }\n\n /** Start the browser extension WS server when backend is 'extension'. */\n private async startBrowserExtensionServerIfNeeded(): Promise<void> {\n await this.reconcileBrowserExtensionServer();\n }\n\n /** Release the gateway's hold on the shared extension bridge (does not restart). */\n async releaseBrowserExtensionBridge(): Promise<void> {\n if (!this.browserExtensionRelease) return;\n await this.browserExtensionRelease();\n this.browserExtensionRelease = null;\n this.browserExtensionProvider = null;\n this.browserExtensionBindKey = null;\n log.debug('Browser extension WS server released');\n }\n\n /**\n * Start/stop/rebind the Chrome extension bridge when `agents.defaults.browser` changes.\n * PATCH saves update config in memory without re-running gateway startup, so this must run on save too.\n */\n async reconcileBrowserExtensionServer(): Promise<void> {\n const { shouldRunExtensionBridgeServer } = await import('../browser/backend-from-config.js');\n const wantsExtension = shouldRunExtensionBridgeServer(this.config);\n\n if (!wantsExtension) {\n if (this.browserExtensionRelease) {\n await this.browserExtensionRelease();\n this.browserExtensionRelease = null;\n this.browserExtensionProvider = null;\n this.browserExtensionBindKey = null;\n log.debug('Browser extension WS server stopped (backend is not extension)');\n }\n return;\n }\n\n const browser = (this.config.agents?.defaults as Record<string, unknown> | undefined)?.browser as\n | Record<string, unknown>\n | undefined;\n const ext = browser?.extension as Record<string, unknown> | undefined;\n const port = typeof ext?.port === 'number' ? ext.port : 19820;\n const host = typeof ext?.host === 'string' && ext.host ? ext.host : '127.0.0.1';\n const connectionTimeout =\n typeof ext?.connectionTimeout === 'number' && ext.connectionTimeout >= 1000\n ? Math.floor(ext.connectionTimeout)\n : undefined;\n const cmdSec = browser?.commandTimeout;\n const commandTimeout =\n typeof cmdSec === 'number' && Number.isFinite(cmdSec) && cmdSec > 0\n ? Math.floor(cmdSec * 1000)\n : undefined;\n const bindKey = `${host}:${port}`;\n\n if (this.browserExtensionRelease && this.browserExtensionBindKey === bindKey) {\n return;\n }\n\n if (this.browserExtensionRelease) {\n await this.browserExtensionRelease();\n this.browserExtensionRelease = null;\n this.browserExtensionProvider = null;\n this.browserExtensionBindKey = null;\n }\n\n try {\n const { acquireExtensionBrowserServer } = await import('../browser/providers/extension-ws-acquire.js');\n const { provider, release } = await acquireExtensionBrowserServer({\n port,\n host,\n connectionTimeout,\n commandTimeout,\n });\n this.browserExtensionProvider = provider;\n this.browserExtensionRelease = release;\n this.browserExtensionBindKey = bindKey;\n log.info({ port, host }, 'Browser extension WS server started');\n } catch (err) {\n const code = err && typeof err === 'object' && 'code' in err ? (err as { code: unknown }).code : undefined;\n log.error(\n {\n err,\n phase: 'browser_extension_ws',\n ...(code === 'EADDRINUSE'\n ? {\n bindPort: port,\n bindHost: host,\n hint: 'Another process holds this port (default 19820). Stop it or set agents.defaults.browser.extension.port.',\n }\n : {}),\n },\n `Failed to start browser extension WS server: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n /**\n * Start processing outbound messages and send through channels\n */\n private async startOutboundProcessor(): Promise<void> {\n log.debug('Starting outbound message processor');\n while (this.running) {\n try {\n const msg = await this.bus.consumeOutbound();\n await this.channelManager.send(msg);\n } catch (error) {\n if (error instanceof MessageBusShutdownError) {\n break;\n }\n const em = error instanceof Error ? error.message : String(error);\n log.error(\n { err: error, errorMessage: em, phase: 'outbound_consume' },\n `Outbound pipeline failed (will retry in 1s): ${em}`,\n );\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n }\n }\n\n // ── Config persistence / hot reload (delegated to GatewayConfigCoordinator) ──\n\n reloadHeartbeatFromCurrentConfig(): void {\n this.configCoordinator.reloadHeartbeatFromCurrentConfig();\n }\n\n reloadConfig(): Promise<{ reloaded: boolean; error?: string }> {\n return this.configCoordinator.reloadConfig();\n }\n\n afterWeixinCredentialsPersisted(): Promise<void> {\n return this.configCoordinator.afterWeixinCredentialsPersisted();\n }\n\n afterFeishuCredentialsPersisted(): Promise<void> {\n return this.configCoordinator.afterFeishuCredentialsPersisted();\n }\n\n saveConfig(config: Config): Promise<{ saved: boolean; error?: string }> {\n return this.configCoordinator.saveConfig(config);\n }\n\n setBundledExtensionActivationTarget(\n extensionId: string,\n wanted: boolean,\n ): Promise<{ ok: boolean; error?: string; requiresGatewayRestart: boolean }> {\n return this.configCoordinator.setBundledExtensionActivationTarget(extensionId, wanted);\n }\n\n updateConfig(updates: Partial<Config>): Promise<{ updated: boolean; error?: string }> {\n return this.configCoordinator.updateConfig(updates);\n }\n\n /**\n * Send message through a channel\n */\n async sendMessage(\n channel: string,\n chatId: string,\n content: string\n ): Promise<{ sent: boolean; messageId?: string }> {\n try {\n await this.channelManager.send({\n channel,\n chat_id: chatId,\n content,\n });\n const messageId = `msg_${Date.now()}`;\n this.emit('message.sent', { channel, chatId, messageId });\n return { sent: true, messageId };\n } catch (error) {\n log.error({ channel, chatId, error }, 'Failed to send message');\n throw error;\n }\n }\n\n /**\n * Get channel statuses\n */\n getChannelsStatus(): Array<{\n name: string;\n enabled: boolean;\n connected: boolean;\n }> {\n const runningChannels = new Set(this.channelManager.getRunningChannels());\n const channels = this.config.channels as Record<string, { enabled?: boolean } | undefined> | undefined;\n const builtinOrder = CHAT_CHANNEL_ORDER as readonly string[];\n\n const rows: Array<{ name: string; enabled: boolean; connected: boolean }> = CHAT_CHANNEL_ORDER.map(\n (name) => ({\n name,\n enabled: !!channels?.[name]?.enabled,\n connected: runningChannels.has(name),\n }),\n );\n\n const extReg = this.extensionLoader?.getRegistry();\n const extraIds = extReg?.channelPlugins.map((p) => p.id).filter((id) => !builtinOrder.includes(id)) ?? [];\n if (extraIds.length === 0) {\n return rows;\n }\n\n const seen = new Set(builtinOrder);\n for (const name of extraIds) {\n if (seen.has(name)) continue;\n seen.add(name);\n rows.push({\n name,\n enabled: channels?.[name]?.enabled !== false,\n connected: runningChannels.has(name),\n });\n }\n\n return rows;\n }\n\n /**\n * Hub metadata for gateway console (built-in registry + registered channel plugins).\n */\n getChannelsHubMeta(): Array<{\n id: string;\n label: string;\n description: string;\n manageable: boolean;\n order: number;\n }> {\n const manageableIds = new Set<string>(['telegram', 'weixin', 'feishu']);\n const byId = new Map<\n string,\n { id: string; label: string; description: string; manageable: boolean; order: number }\n >();\n\n for (const plugin of this.channelManager.getAllPlugins()) {\n byId.set(plugin.id, {\n id: plugin.id,\n label: plugin.meta.label,\n description: plugin.meta.blurb,\n manageable: manageableIds.has(plugin.id),\n order: plugin.meta.order ?? 999,\n });\n }\n\n CHAT_CHANNEL_ORDER.forEach((id, index) => {\n if (byId.has(id)) return;\n const meta = getChatChannelMeta(id);\n byId.set(id, {\n id,\n label: meta.label,\n description: meta.description,\n manageable: true,\n order: index,\n });\n });\n\n return Array.from(byId.values()).toSorted((a, b) => {\n if (a.order !== b.order) return a.order - b.order;\n return a.id.localeCompare(b.id);\n });\n }\n\n /**\n * Request an immediate heartbeat run (coalesced like interval/cron wakes).\n */\n requestHeartbeatNow(opts?: { reason?: string }): void {\n this.heartbeatService?.requestNow({ reason: opts?.reason ?? 'manual' });\n }\n\n /**\n * Register graceful shutdown used after spawning a replacement gateway process (foreground CLI server).\n */\n registerGatewayShutdownForRestart(handler: () => Promise<void>): void {\n this.gatewayShutdownForRestart = handler;\n }\n\n /**\n * Respawn the gateway process when supported (spawn + exit, supervisor exit, or disabled when XOPC_NO_RESPAWN).\n */\n triggerGatewayProcessRestart(): { ok: boolean; mode: string; message?: string } {\n const result = restartGatewayProcessWithFreshPid();\n if (result.mode === 'failed') {\n return { ok: false, mode: result.mode, message: result.detail ?? 'spawn failed' };\n }\n if (result.mode === 'disabled') {\n return {\n ok: false,\n mode: 'disabled',\n message:\n 'Process respawn is disabled (XOPC_NO_RESPAWN). Restart the gateway manually (e.g. xopc gateway restart).',\n };\n }\n const shutdown = this.gatewayShutdownForRestart;\n if (!shutdown) {\n return {\n ok: false,\n mode: result.mode,\n message: 'Gateway restart is not available in this process.',\n };\n }\n setImmediate(() => {\n void shutdown().finally(() => {\n process.exit(0);\n });\n });\n return { ok: true, mode: result.mode };\n }\n\n /**\n * Get health status\n */\n getHealth(): {\n status: string;\n service: string;\n version: string;\n uptime: number;\n ready: boolean;\n httpListening: boolean;\n startupDurationMs: number | null;\n channels: { running: number; total: number };\n configPath: string;\n logs?: {\n dir: string;\n errors24h: number;\n stats: Record<string, number>;\n };\n } {\n const runningChannels = this.channelManager.getRunningChannels();\n const allChannels = this.channelManager.getAllChannels();\n const logStats = getRuntimeLogStats();\n const readiness = this.readiness.getSnapshot();\n\n return {\n status: 'ok',\n service: 'xopc-gateway',\n version: PACKAGE_VERSION,\n uptime: Math.floor((Date.now() - this.startTime) / 1000),\n ready: readiness.ready,\n httpListening: readiness.httpListening,\n startupDurationMs: readiness.startupDurationMs,\n channels: {\n running: runningChannels.length,\n total: allChannels.length,\n },\n configPath: this.configPath,\n logs: {\n dir: getLogDir(),\n errors24h: logStats.errorsLast24h,\n stats: logStats.byLevel,\n },\n };\n }\n\n get isRunning(): boolean {\n return this.running;\n }\n\n /**\n * Get extension registry for external access (HTTP routes, gateway methods)\n */\n getExtensionRegistry() {\n return this.extensionLoader?.getRegistry();\n }\n\n /** Extension loader for discovery and frontend asset APIs (may be null if extensions failed to init). */\n getExtensionLoader(): ExtensionLoader | null {\n return this.extensionLoader;\n }\n\n /**\n * Get model registry for external access (HTTP routes)\n */\n getModelRegistry() {\n const { getModelRegistry } = require('../providers/index.js');\n return getModelRegistry();\n }\n\n /**\n * Invoke a gateway method registered by extensions\n */\n async invokeGatewayMethod(method: string, params: Record<string, unknown>): Promise<unknown> {\n const registry = this.getExtensionRegistry();\n if (!registry) {\n throw new Error('Extension registry not available');\n }\n\n const handler = registry.getGatewayMethod(method);\n if (!handler) {\n throw new Error(`Gateway method not found: ${method}`);\n }\n\n return await handler(params);\n }\n\n get currentConfig(): Config {\n return this.config;\n }\n\n get currentWorkspacePath(): string {\n return this.workspacePath;\n }\n\n get messageBusInstance(): MessageBus {\n return this.bus;\n }\n\n /** Effective HTTP listen port (CLI `--port` override or config default). */\n getEffectiveListenPort(): number {\n return resolveEffectiveGatewayPort(this.config, this.serviceConfig.listenPort);\n }\n\n\n get cronServiceInstance(): CronService {\n return this.cronService;\n }\n\n get notesServiceInstance(): NotesService {\n return this.notesService;\n }\n\n get sessionIndexInstance(): SessionIndex {\n return this.sessionIndex;\n }\n\n /** Shared workflow run orchestrator + session bridge (one instance per gateway). */\n createWorkflowRunService(): WorkflowRunService {\n if (!this.workflowRunServiceInstance) {\n this.workflowSessionBridge = new WorkflowSessionBridge(this);\n this.workflowRunServiceInstance = new WorkflowRunService({\n service: this,\n sessionBridge: this.workflowSessionBridge,\n buildChildTools: buildWorkflowChildTools,\n });\n }\n return this.workflowRunServiceInstance;\n }\n\n /** Process a message directly through the agent (for CLI mode). */\n async processDirect(content: string, sessionKey = 'agent:main:main'): Promise<string> {\n return this.agentService.turnDispatcher.processDirect(content, sessionKey);\n }\n\n // ========== SSE Event System ==========\n\n subscribe(\n sessionId: string,\n listener: (event: ServiceEvent) => Promise<void> | void,\n ): () => void {\n return this.sse.subscribe(sessionId, listener);\n }\n\n emit(type: string, payload: unknown): void {\n this.sse.emit(type, payload);\n }\n\n /** Replay events since `lastEventId` for SSE reconnection. */\n getEventsSince(sessionId: string, lastEventId: string): ServiceEvent[] {\n return this.sse.getEventsSince(sessionId, lastEventId);\n }\n\n /**\n * Validate authentication token from request headers.\n * Returns true if auth is disabled (mode: 'none') or token is valid.\n */\n validateAuth(headers?: Record<string, string | string[] | undefined>): boolean {\n const token = extractToken(headers);\n return validateToken(this.auth, token);\n }\n\n /**\n * Get current auth mode.\n */\n getAuthMode(): 'none' | 'token' | 'password' | 'trusted-proxy' {\n return this.auth.mode;\n }\n\n /** Resolved gateway auth (mode, credentials, trusted-proxy config). */\n getResolvedAuth(): ResolvedGatewayAuth {\n return this.auth;\n }\n\n /**\n * Get current auth token (for CLI server integration).\n * Returns undefined if mode is not token.\n */\n getAuthToken(): string | undefined {\n return this.auth.mode === 'token' ? this.auth.token : undefined;\n }\n\n /**\n * Refresh (regenerate) the gateway auth token.\n * Returns the new token.\n */\n async refreshAuthToken(): Promise<string> {\n if (this.auth.mode !== 'token') {\n throw new Error('Cannot refresh token: auth mode is not token');\n }\n\n // Generate new token\n const newToken = crypto.randomBytes(24).toString('hex');\n \n // Update in-memory auth\n this.auth.token = newToken;\n \n // Update config\n this.config = {\n ...this.config,\n gateway: {\n ...this.config.gateway,\n auth: {\n ...this.config.gateway?.auth,\n mode: 'token',\n token: newToken,\n },\n },\n };\n \n await this.saveConfig(this.config);\n\n log.info({ tokenPreview: `${newToken.slice(0, 8)}...` }, 'Gateway token refreshed');\n \n return newToken;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"service.js","names":["writeConfigToDisk"],"sources":["../../../src/gateway/service.ts"],"sourcesContent":["import crypto from 'crypto';\nimport { AgentService } from '../agent/service.js';\nimport { ChannelManager } from '../channels/manager.js';\nimport {\n buildChannelCatalogForConfig,\n buildChannelCatalogFromSnapshot,\n} from '../channels/catalog/channel-catalog-service.js';\nimport { setPairingBroadcastSink } from '../channels/pairing/pairing-events.js';\nimport { MessageBus, MessageBusShutdownError } from '../infra/bus/index.js';\nimport { loadConfig, saveConfig as writeConfigToDisk } from '../config/index.js';\nimport { getWorkspacePath } from '../config/workspace-path-helpers.js';\nimport { CronService } from '../cron/index.js';\nimport { NotesService, NotesStore } from '../notes/index.js';\nimport { buildWorkflowChildTools } from '../agent/workflow/workflow-child-tools.js';\nimport { WorkflowRunService } from '../workflows/service/workflow-run-service.js';\nimport { WorkflowSessionBridge } from '../workflows/service/workflow-session-bridge.js';\nimport { ExtensionLoader, areExtensionsGloballyDisabled, buildExtensionMetadataSnapshot } from '../extensions/index.js';\nimport type { ManifestRegistryEntry } from '../extensions/manifest-registry.js';\nimport type { ResolvedExtensionConfig } from '../extensions/types/index.js';\nimport { HeartbeatService, heartbeatRunnerConfigFromConfig } from './heartbeat/index.js';\nimport { SessionIndex } from '../session/index.js';\nimport type { Config } from '../config/schema.js';\nimport { wireTunnelEventsToGateway } from '../tunnel/gateway-lifecycle.js';\nimport {\n stopTailscaleExposure,\n} from './tailscale-lifecycle.js';\nimport { getExposureManager } from '../remote-access/exposure-manager.js';\nimport { sanitizeTunnelConfig } from '../tunnel/tunnel-config.js';\nimport { resolveGatewayAuth, assertGatewayAuthConfigured, validateToken, extractToken, type ResolvedGatewayAuth } from './auth.js';\nimport { assertGatewayAuthNotKnownWeak } from './security/known-weak-secrets.js';\nimport { auditGatewayConfig } from './security/audit.js';\nimport { assertGatewayRuntimeConfig } from './runtime-config.js';\nimport { resolveEffectiveGatewayPort } from './host.js';\nimport { buckets, isGatewayStrictSecurityEnabled } from './rate-limit/index.js';\nimport { prewarmModelRegistry } from '../providers/index.js';\nimport { createLogger, getLogDir, getRuntimeLogStats } from '../utils/logger.js';\nimport {\n resolveConfigPath,\n resolveCronJobsPath,\n resolveAgentDir,\n resolveExtensionsDir,\n} from '../config/paths.js';\nimport { AgentRunRelay, type RelayEvent } from './agent-run-relay.js';\nimport { registerClarifyBridge } from './clarify-runtime.js';\nimport { PACKAGE_VERSION } from '../package-version.js';\n\nimport { disposeAllSessionMcpRuntimes } from '../agent/mcp/bundle-mcp-tools.js';\nimport { getDefaultAgentId } from '../routing/resolve-route.js';\nimport { scheduleGatewayUpdateCheck } from '../infra/update-startup.js';\nimport { resolveChannelConnectDeferSet } from './resolve-channel-connect-defer.js';\nimport { restartGatewayProcessWithFreshPid } from './respawn.js';\nimport { GatewaySessionsApi } from './service/sessions-api.js';\nimport { GatewayMarketplaceService } from './service/marketplace-service.js';\nimport { GatewayConfigCoordinator } from './service/config-coordinator.js';\nimport { GatewayAgentRunner } from './service/agent-runner.js';\nimport { GatewaySseHub } from './service/sse-hub.js';\nimport type {\n GatewayChannelStartupPhase1Metrics,\n GatewayChannelStartupPhase2Metrics,\n GatewayServiceConfig,\n ServiceEvent,\n} from './service/types.js';\nimport {\n GatewayReadiness,\n type GatewayReadinessSnapshot,\n} from './startup-readiness.js';\nimport { createGatewayStartupTrace, type GatewayStartupTrace } from './startup-trace.js';\nimport { closeXopcDatabase, openXopcDatabase } from '../storage/sqlite/index.js';\n\nexport type {\n GatewayChannelStartupPhase1Metrics,\n GatewayChannelStartupPhase2Metrics,\n GatewayServiceConfig,\n ServiceEvent,\n} from './service/types.js';\n\nconst log = createLogger('Gateway:Service');\n\nexport class GatewayService {\n private bus: MessageBus;\n private config: Config;\n private configPath: string;\n private _agentService: AgentService | null = null;\n private channelManager: ChannelManager;\n private cronService: CronService;\n private notesService: NotesService;\n private extensionLoader: ExtensionLoader | null = null;\n private extensionMetadataSnapshot: import('../extensions/extension-metadata-snapshot.js').ExtensionMetadataSnapshot | null = null;\n private browserExtensionProvider: import('../browser/providers/extension.js').ExtensionBrowserProvider | null = null;\n private browserExtensionRelease: (() => Promise<void>) | null = null;\n /** `${host}:${port}` when the gateway holds the extension bridge listener. */\n private browserExtensionBindKey: string | null = null;\n private heartbeatService: HeartbeatService | null = null;\n private sessionIndex: SessionIndex;\n private running = false;\n private startTime = Date.now();\n private workspacePath: string;\n private readonly configCoordinator: GatewayConfigCoordinator;\n\n // Authentication\n private auth: ResolvedGatewayAuth;\n\n private readonly sse = new GatewaySseHub();\n\n getConfig(): Config {\n return this.config;\n }\n\n private stopGatewayUpdateCheck: (() => void) | null = null;\n\n /** When set (e.g. by `GatewayServer`), `triggerGatewayProcessRestart` can stop HTTP then exit. */\n private gatewayShutdownForRestart: (() => Promise<void>) | null = null;\n\n /** Snapshot for phase-2 metrics / logs (ids deferred at phase-1 `start()`). */\n private lastDeferredChannelConnectIds: string[] = [];\n private lastChannelConnectDeferMode: 'auto' | 'off' | 'explicit' = 'auto';\n private lastChannelConnectDeferSource: 'off' | 'explicit' | 'meta' = 'off';\n\n private readonly readiness = new GatewayReadiness();\n private startupTrace: GatewayStartupTrace | null = null;\n private workflowSessionBridge: WorkflowSessionBridge | null = null;\n private workflowRunServiceInstance: WorkflowRunService | null = null;\n\n /**\n * Webchat agent invocation surface (`runAgent`, `abortAgentRun`, `steer*`,\n * `submitClarifyResponse`, clarify-bridge dispatch). Owns the\n * `activeWebchatRunBySession` + `runAbortControllers` maps.\n */\n readonly agentRunner: GatewayAgentRunner;\n\n /** Read-only alias re-exported from `agentRunner.runRelay` for legacy callers. */\n get runRelay(): AgentRunRelay { return this.agentRunner.runRelay; }\n\n /**\n * Session CRUD / search / compaction / tag-archive-pin / stats — the gateway\n * REST surface for sessions. Routes should depend on this narrow service\n * rather than the full GatewayService composition root.\n */\n readonly sessions: GatewaySessionsApi;\n\n /**\n * Skills + extensions marketplace surface (browse / install / uninstall) plus\n * local-only managed-skill ops. Routes depend on this narrow service.\n */\n readonly marketplace: GatewayMarketplaceService;\n\n constructor(private serviceConfig: GatewayServiceConfig = {}) {\n this.bus = new MessageBus();\n this.configPath = serviceConfig.configPath || resolveConfigPath();\n this.config = loadConfig(this.configPath);\n if (sanitizeTunnelConfig(this.config)) {\n void writeConfigToDisk(this.config, this.configPath).catch((err) => {\n const em = err instanceof Error ? err.message : String(err);\n log.warn({ err, phase: 'tunnel_sanitize', errorMessage: em }, `Tunnel config sanitize persist failed: ${em}`);\n });\n }\n\n // Initialize authentication\n this.auth = resolveGatewayAuth({\n authConfig: this.config.gateway?.auth,\n });\n\n // Validate auth configuration\n assertGatewayAuthConfigured(this.auth);\n\n // Reject known weak / placeholder credentials at startup\n assertGatewayAuthNotKnownWeak(this.auth);\n\n const gatewayPort = this.getEffectiveListenPort();\n const runtimeConfig = assertGatewayRuntimeConfig({\n cfg: this.config,\n auth: this.auth,\n bindOverride: serviceConfig.listenBind,\n port: gatewayPort,\n });\n\n // Security audit: non-blocking warnings for remaining risk signals\n auditGatewayConfig({\n auth: this.auth,\n bindHost: runtimeConfig.bindHost,\n corsOrigins: runtimeConfig.corsOrigins,\n rateLimitEnabled: runtimeConfig.rateLimitEnabled,\n tlsEnabled: runtimeConfig.tlsEnabled,\n trustedProxies: this.config.gateway?.trustedProxies,\n allowRealIpFallback: this.config.gateway?.allowRealIpFallback === true,\n dangerouslyAllowHostHeaderOriginFallback: runtimeConfig.dangerouslyAllowHostHeaderOriginFallback,\n strictSecurityEnabled: isGatewayStrictSecurityEnabled(this.config),\n rateLimitConfigured: this.config.gateway?.auth?.rateLimit !== undefined,\n });\n\n // Log token info (not the token itself)\n if (this.auth.mode === 'token') {\n const tokenPreview = this.auth.token ? `${this.auth.token.slice(0, 4)}***` : 'none';\n log.info({ mode: this.auth.mode, token: tokenPreview }, 'Authentication configured');\n } else if (this.auth.mode === 'trusted-proxy') {\n log.info(\n {\n mode: this.auth.mode,\n userHeader: this.auth.trustedProxy?.userHeader,\n trustedProxyCount: this.config.gateway?.trustedProxies?.length ?? 0,\n },\n 'Trusted-proxy authentication configured',\n );\n } else {\n log.info({ mode: this.auth.mode }, 'Authentication configured');\n }\n\n // Initialize channel manager\n this.channelManager = new ChannelManager(this.config, this.bus);\n\n // Initialize extension loader (manifest snapshot only — code load in start()).\n this.workspacePath = getWorkspacePath(this.config) || './workspace';\n this.initializeExtensionLoader();\n\n // Session index + files shared with AgentService (webchat `/goal` metadata must match GET /api/goals/webchat).\n this.sessionIndex = new SessionIndex({\n config: this.config,\n });\n\n this.cronService = new CronService({\n filePath: resolveCronJobsPath(),\n });\n\n this.notesService = new NotesService(new NotesStore());\n\n this.agentRunner = new GatewayAgentRunner({\n bus: this.bus,\n sessionIndex: this.sessionIndex,\n getAgentService: () => this.ensureAgentService(),\n getChannelManager: () => this.channelManager,\n getConfig: () => this.config,\n emit: (type, payload) => this.sse.emit(type, payload),\n });\n\n this.sessions = new GatewaySessionsApi({\n sessionIndex: this.sessionIndex,\n getAgentService: () => this.ensureAgentService(),\n getActiveWebchatRunId: (sk) => this.agentRunner.getActiveRunId(sk),\n });\n\n this.marketplace = new GatewayMarketplaceService({\n getConfig: () => this.config,\n getAgentService: () => this.ensureAgentService(),\n getExtensionLoader: () => this.extensionLoader,\n getChannelManager: () => this.channelManager,\n saveConfig: (cfg) => this.saveConfig(cfg),\n emit: (type, payload) => this.emit(type, payload),\n });\n\n this.configCoordinator = new GatewayConfigCoordinator({\n configPath: this.configPath,\n bus: this.bus,\n enableHotReload: this.serviceConfig.enableHotReload !== false,\n getConfig: () => this.config,\n setConfig: (next) => { this.config = next; },\n getAgentService: () => this.ensureAgentService(),\n getChannelManager: () => this.channelManager,\n getCronService: () => this.cronService,\n getHeartbeatService: () => this.heartbeatService,\n getExtensionLoader: () => this.extensionLoader,\n reconcileBrowserExtensionServer: () => this.reconcileBrowserExtensionServer(),\n getChannelsStatus: () => this.getChannelsStatus(),\n emit: (type, payload) => this.emit(type, payload),\n });\n }\n\n /** Lazy AgentService — constructed on first use or during `start()`. */\n get agentService(): AgentService {\n return this.ensureAgentService();\n }\n\n private ensureAgentService(): AgentService {\n if (this._agentService) {\n return this._agentService;\n }\n\n const cronRef: { service?: CronService } = { service: this.cronService };\n this._agentService = new AgentService(this.bus, {\n workspace: this.workspacePath,\n model: this.config.agents?.defaults?.models?.chat?.primary,\n config: this.config,\n sessionStore: this.sessionIndex.getStore(),\n onSessionMetadataUpdated: (sessionKey, patch) => {\n this.sessionIndex.emit('sessionUpdated', { key: sessionKey, name: patch?.name });\n this.emit('session.updated', { key: sessionKey, name: patch?.name });\n },\n onSessionTranscriptUpdated: (sessionKey) => {\n this.emit('session.transcript_updated', { key: sessionKey });\n },\n extensionRegistry: this.extensionLoader?.getRegistry(),\n getCronService: () => cronRef.service,\n getWorkflowRunService: () => this.createWorkflowRunService(),\n gatewayClarify: {\n requestClarification: (sessionKey, request) =>\n this.agentRunner.requestClarification({\n sessionKey,\n request,\n publishSseFor: (_runId) => (e: RelayEvent) => {\n this._agentService!.turnDispatcher.enqueueWebchatSseEvent(sessionKey, e);\n },\n }),\n },\n });\n\n this._agentService.setChannelManager(this.channelManager);\n this.channelManager.setSessionModelHooks({\n getModelForSession: (sk) => this._agentService!.getModelForSession(sk),\n switchModelForSession: (sk, id) => this._agentService!.switchModelForSession(sk, id),\n });\n\n this.cronService.setDeps({\n agentService: this._agentService,\n messageBus: this.bus,\n heartbeatService: this.ensureHeartbeatService(),\n sessionStore: this.sessionIndex.getStore(),\n getDefaultCronAgentId: () => getDefaultAgentId(this.config),\n workflowRunService: this.createWorkflowRunService(),\n });\n cronRef.service = this.cronService;\n\n this._agentService.persistentGoals.setWebchatContinuationScheduler((sessionKey, message) => {\n const scheduleWhenIdle = () => {\n if (this._agentService!.getInboundTurnDepth(sessionKey) > 0) {\n setTimeout(scheduleWhenIdle, 50);\n return;\n }\n if (this.agentRunner.hasActiveRun(sessionKey)) {\n setTimeout(scheduleWhenIdle, 50);\n return;\n }\n void this.agentRunner.drainScheduledWebchatContinuation(sessionKey, message);\n };\n queueMicrotask(scheduleWhenIdle);\n });\n\n return this._agentService;\n }\n\n private ensureHeartbeatService(): HeartbeatService {\n if (this.heartbeatService) {\n return this.heartbeatService;\n }\n this.heartbeatService = new HeartbeatService({\n agentService: this.ensureAgentService(),\n messageBus: this.bus,\n cronService: this.cronService,\n sessionStore: this.sessionIndex.getStore(),\n getConfig: () => this.config,\n });\n return this.heartbeatService;\n }\n\n // ── Webchat agent runner (delegated to GatewayAgentRunner) ────────────\n\n enqueueWebchatPersistentGoalKickoff(sessionKey: string, goalText: string): void {\n this.agentRunner.enqueueWebchatPersistentGoalKickoff(sessionKey, goalText);\n }\n\n runAgent(\n ...args: Parameters<GatewayAgentRunner['runAgent']>\n ): ReturnType<GatewayAgentRunner['runAgent']> {\n return this.agentRunner.runAgent(...args);\n }\n\n abortAgentRun(runId: string): boolean {\n return this.agentRunner.abortAgentRun(runId);\n }\n\n steerWebchatAgent(\n chatId: string,\n message: string,\n ): ReturnType<GatewayAgentRunner['steerWebchatAgent']> {\n return this.agentRunner.steerWebchatAgent(chatId, message);\n }\n\n submitClarifyResponse(requestId: string, answer: string): boolean {\n return this.agentRunner.submitClarifyResponse(requestId, answer);\n }\n\n private initializeExtensionLoader(): void {\n try {\n if (areExtensionsGloballyDisabled(this.config)) {\n log.info('Extensions globally disabled — skipping loader initialization');\n return;\n }\n\n const loaderOptions = {\n workspaceDir: this.workspacePath,\n extensionsDir: resolveExtensionsDir(),\n };\n this.extensionMetadataSnapshot = buildExtensionMetadataSnapshot(loaderOptions, this.config);\n this.extensionLoader = new ExtensionLoader(loaderOptions);\n this.extensionLoader.setManifestSnapshot(this.extensionMetadataSnapshot);\n this.extensionLoader.setConfig(this.config as Parameters<ExtensionLoader['setConfig']>[0]);\n } catch (error) {\n log.warn({ error }, 'Failed to initialize extension loader');\n }\n }\n\n private registerExtensionChannelPlugins(): void {\n if (!this.extensionLoader) {\n return;\n }\n const reg = this.extensionLoader.getRegistry();\n for (const plugin of reg.channelPlugins) {\n this.channelManager.registerPlugin(plugin);\n }\n }\n\n /**\n * Load extensions and register SDK / full ChannelPlugin instances with ChannelManager.\n */\n private async loadExtensionsAndRegisterChannels(): Promise<void> {\n if (!this.extensionLoader) {\n return;\n }\n try {\n await this.extensionLoader.loadByActivationPlan({ phase: 'startup' });\n this.registerExtensionChannelPlugins();\n const reg = this.extensionLoader.getRegistry();\n log.debug(\n {\n extensionRecords: reg.extensions.size,\n channelPlugins: reg.channelPlugins.length,\n },\n 'Startup-phase extensions loaded and channel plugins registered',\n );\n } catch (err) {\n log.warn({ err }, 'Failed to load startup-phase extensions');\n }\n }\n\n private findChannelContributionExtension(channelId: string): ManifestRegistryEntry | undefined {\n const normalized = channelId.trim().toLowerCase();\n const registry = this.extensionLoader?.getManifestRegistry();\n if (!registry) return undefined;\n return registry\n .getAllEntries()\n .find((entry) => Object.keys(entry.manifest.channelContributions ?? {}).some((id) => id.toLowerCase() === normalized));\n }\n\n async ensureChannelRuntimePlugin(channelId: string) {\n const existing = this.channelManager.getPlugin(channelId);\n if (existing) {\n await this.channelManager.initializeChannel(channelId);\n return this.channelManager.getPlugin(channelId);\n }\n\n if (!this.extensionLoader || areExtensionsGloballyDisabled(this.config)) {\n return undefined;\n }\n\n const entry = this.findChannelContributionExtension(channelId);\n if (!entry) {\n return undefined;\n }\n\n const extensionConfig: ResolvedExtensionConfig = {\n id: entry.id,\n name: entry.manifest.name || entry.id,\n source: entry.source,\n path: entry.path,\n enabled: true,\n config: {},\n };\n await this.extensionLoader.loadExtension(extensionConfig);\n this.registerExtensionChannelPlugins();\n const plugin = this.channelManager.getPlugin(channelId);\n if (!plugin) {\n return undefined;\n }\n await this.channelManager.initializeChannel(channelId);\n return this.channelManager.getPlugin(channelId);\n }\n\n private async loadDeferredExtensions(): Promise<void> {\n if (!this.extensionLoader) {\n return;\n }\n try {\n await this.extensionLoader.loadByActivationPlan({ phase: 'deferred' });\n this.registerExtensionChannelPlugins();\n log.debug('Deferred-phase extensions loaded');\n } catch (err) {\n log.warn({ err }, 'Failed to load deferred extensions');\n }\n }\n\n private schedulePostReadySidecars(): void {\n queueMicrotask(() => {\n void this.runPostReadySidecars();\n });\n }\n\n private async runPostReadySidecars(): Promise<void> {\n const trace = this.startupTrace;\n try {\n if (trace) {\n await trace.measure('sidecars.model-prewarm', () => prewarmModelRegistry());\n } else {\n await prewarmModelRegistry();\n }\n } catch (err) {\n const em = err instanceof Error ? err.message : String(err);\n log.warn({ err, errorMessage: em, phase: 'sidecars.model_prewarm' }, `Model registry prewarm failed: ${em}`);\n }\n\n if (!this.extensionLoader || areExtensionsGloballyDisabled(this.config)) {\n return;\n }\n\n try {\n if (trace) {\n await trace.measure('extensions.deferred-load', () => this.loadDeferredExtensions());\n } else {\n await this.loadDeferredExtensions();\n }\n } catch (err) {\n const em = err instanceof Error ? err.message : String(err);\n log.warn({ err, errorMessage: em, phase: 'extensions.deferred_load' }, `Deferred extension load failed: ${em}`);\n }\n }\n\n async start(): Promise<void> {\n if (this.running) return;\n\n setPairingBroadcastSink((type, payload) => {\n this.emit(type, payload);\n });\n\n log.debug('Starting gateway service...');\n openXopcDatabase();\n this.startTime = Date.now();\n this.running = true;\n this.startupTrace = createGatewayStartupTrace();\n this.readiness.markStarting(this.startTime);\n const trace = this.startupTrace;\n\n registerClarifyBridge(this.agentRunner.getClarifyBridge());\n\n this.ensureAgentService();\n\n this.channelManager.setOutboundHooks({\n runMessageSending: (to, content, channel) =>\n this.agentService.outboundCoordinator.invokeOutboundMessageSending(to, content, channel),\n runMessageSent: (to, content, success, error, channel) =>\n this.agentService.outboundCoordinator.invokeOutboundMessageSent(to, content, success, error, channel),\n });\n this.channelManager.enableOutboundPersistence(resolveAgentDir(this.config, getDefaultAgentId(this.config)));\n\n if (this.extensionLoader) {\n this.extensionLoader.setRuntimeContext({\n bus: this.bus,\n sessionManager: this.sessionIndex,\n scheduleWebchatContinuation: (sessionKey: string, continuationMessage: string) => {\n queueMicrotask(() => {\n void this.agentRunner.drainScheduledWebchatContinuation(sessionKey, continuationMessage);\n });\n },\n });\n }\n\n await trace.measure('extensions.load', () => this.loadExtensionsAndRegisterChannels());\n\n const skipChannels =\n process.env.XOPC_SKIP_CHANNELS === '1' ||\n process.env.XOPC_SKIP_CHANNELS === 'true' ||\n process.env.XOPC_SKIP_PROVIDERS === '1' ||\n process.env.XOPC_SKIP_PROVIDERS === 'true';\n\n // Start channels: init all; optional defer for meta.deferConnectUntilAfterListen (GatewayServer)\n const phase1StartedAt = performance.now();\n let channelInitMs = 0;\n let deferPlanMs = 0;\n let channelPhase1StartMs = 0;\n let replayOutboundMs: number | null = null;\n let deferConnect = new Set<string>();\n\n if (skipChannels) {\n log.info('Skipping channel startup (XOPC_SKIP_CHANNELS or XOPC_SKIP_PROVIDERS)');\n } else {\n const t0 = performance.now();\n await trace.measure('channels.initialize', () => this.channelManager.initialize());\n channelInitMs = performance.now() - t0;\n\n const t1 = performance.now();\n const deferResolution = resolveChannelConnectDeferSet({\n config: this.config,\n channelManager: this.channelManager,\n deferChannelConnectUntilAfterHttp: this.serviceConfig.deferChannelConnectUntilAfterHttp === true,\n });\n deferConnect = deferResolution.deferPluginIds;\n deferPlanMs = performance.now() - t1;\n this.lastDeferredChannelConnectIds = [...deferConnect];\n this.lastChannelConnectDeferMode = deferResolution.mode;\n this.lastChannelConnectDeferSource = deferResolution.source;\n\n if (deferConnect.size > 0) {\n log.info({ channels: [...deferConnect] }, 'Deferring channel outbound connect until HTTP listen');\n }\n\n const t2 = performance.now();\n await trace.measure('channels.start', () =>\n this.channelManager.start(\n deferConnect.size > 0 ? { deferConnectPluginIds: deferConnect } : undefined,\n ),\n );\n channelPhase1StartMs = performance.now() - t2;\n\n if (this.serviceConfig.deferChannelConnectUntilAfterHttp !== true) {\n const tr = performance.now();\n await trace.measure('channels.replay-outbound', () =>\n this.channelManager.replayPendingOutboundMessages(),\n );\n replayOutboundMs = performance.now() - tr;\n }\n }\n\n const channelStartupPhase1TotalMs = performance.now() - phase1StartedAt;\n const gwDeferMode = this.config.gateway?.channelConnectDeferMode ?? 'auto';\n const phase1Metrics: GatewayChannelStartupPhase1Metrics = {\n deferChannelConnectUntilAfterHttp: this.serviceConfig.deferChannelConnectUntilAfterHttp === true,\n channelConnectDeferMode: this.serviceConfig.deferChannelConnectUntilAfterHttp\n ? this.lastChannelConnectDeferMode\n : gwDeferMode,\n channelConnectDeferSource: this.lastChannelConnectDeferSource,\n deferredChannelIds: this.lastDeferredChannelConnectIds,\n deferredChannelCount: this.lastDeferredChannelConnectIds.length,\n channelInitMs: Math.round(channelInitMs),\n deferPlanMs: Math.round(deferPlanMs),\n channelPhase1StartMs: Math.round(channelPhase1StartMs),\n replayOutboundMs: replayOutboundMs === null ? null : Math.round(replayOutboundMs),\n channelStartupPhase1TotalMs: Math.round(channelStartupPhase1TotalMs),\n };\n log.info(\n { phase: 'gateway.channel_startup', stage: 'phase1', ...phase1Metrics },\n 'Gateway channel startup phase-1 complete',\n );\n\n // Initialize session manager\n await trace.measure('sessions.initialize', () => this.sessionIndex.initialize());\n log.debug('Session manager initialized');\n\n this.cronService.setDeps({\n agentService: this.agentService,\n messageBus: this.bus,\n heartbeatService: this.ensureHeartbeatService(),\n sessionStore: this.sessionIndex.getStore(),\n getDefaultCronAgentId: () => getDefaultAgentId(this.config),\n workflowRunService: this.createWorkflowRunService(),\n });\n\n this.sessionIndex.on('sessionUpdated', (data: { key: string; name?: string; tags?: string[] }) => {\n this.emit('session.updated', { key: data.key, name: data.name, tags: data.tags });\n });\n\n // Start cron service\n if (this.config.cron?.enabled !== false) {\n await trace.measure('cron.initialize', () => this.cronService.initialize());\n }\n\n await this.notesService.initialize();\n\n this.ensureHeartbeatService().start(heartbeatRunnerConfigFromConfig(this.config));\n\n void import('../browser/providers/browser-ext-install.js')\n .then(({ ensureBrowserExtensionOnStartup }) => ensureBrowserExtensionOnStartup(this.config))\n .catch((err) => log.warn({ err }, 'Browser extension artifact ensure failed'));\n\n // Start browser extension WS server if configured\n await trace.measure('browser-extension.start', () => this.startBrowserExtensionServerIfNeeded());\n\n // Start agent service (runs in background)\n this.agentService.start().catch((err) => {\n log.error({ err }, 'Agent service error');\n });\n\n // Outbound drain: after deferred channel connects when using HTTP lifecycle (avoid racing Telegram).\n if (this.serviceConfig.deferChannelConnectUntilAfterHttp !== true) {\n this.startOutboundProcessor().catch((err) => {\n log.error({ err }, 'Outbound processor error');\n });\n }\n\n // Setup config hot reload\n if (this.serviceConfig.enableHotReload !== false) {\n this.configCoordinator.startHotReloader();\n }\n\n this.stopGatewayUpdateCheck = scheduleGatewayUpdateCheck({\n config: this.config,\n onUpdateAvailableChange: (update) => {\n this.emit('update.available', update);\n },\n triggerInProcessRestart: () => this.triggerGatewayProcessRestart(),\n });\n\n wireTunnelEventsToGateway(this);\n\n // Drop orphan single-HTML site-share staging dirs left behind by a\n // process death between create and cleanup. Re-registers live ones into\n // the in-process map so post-restart revoke/expire still cleans them.\n void import('../share/share-auto.js')\n .then(({ runStagingSweep }) => runStagingSweep())\n .catch((err) => log.warn({ err }, 'Share staging sweep failed'));\n\n if (this.serviceConfig.deferChannelConnectUntilAfterHttp !== true) {\n this.markGatewayReady();\n } else {\n trace.mark('service.started-awaiting-http');\n }\n\n log.debug('Gateway service started');\n }\n\n /** Called when the HTTP listener is bound (before deferred channel work). */\n markHttpListening(): void {\n this.readiness.markHttpListening();\n this.startupTrace?.mark('http.listening');\n }\n\n isGatewayReady(): boolean {\n return this.readiness.isReady();\n }\n\n getGatewayReadiness(): GatewayReadinessSnapshot {\n return this.readiness.getSnapshot();\n }\n\n private async applyStartupReadyDelayForTesting(): Promise<void> {\n const raw = process.env.XOPC_GATEWAY_STARTUP_SLOW_MS?.trim();\n if (!raw) {\n return;\n }\n const delayMs = Number.parseInt(raw, 10);\n if (!Number.isFinite(delayMs) || delayMs <= 0) {\n return;\n }\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n\n private markGatewayReady(): void {\n if (this.readiness.isReady()) {\n return;\n }\n this.readiness.markReady();\n this.startupTrace?.mark('ready');\n this.schedulePostReadySidecars();\n }\n\n /** After HTTP is listening: exposure auto-start (Tailscale, then FRP tunnel). */\n private async runExposureAutoStartIfConfigured(): Promise<void> {\n const port = this.getEffectiveListenPort();\n await getExposureManager().autoStart(this.config, port, this.getAuthToken());\n }\n\n /**\n * Called by `GatewayServer` when the HTTP listener is bound. Starts channels that\n * opted into `meta.deferConnectUntilAfterListen`, then replays outbound queue.\n */\n async onHttpListening(): Promise<void> {\n await this.applyStartupReadyDelayForTesting();\n this.markGatewayReady();\n\n await this.runExposureAutoStartIfConfigured();\n\n if (this.serviceConfig.deferChannelConnectUntilAfterHttp !== true) {\n return;\n }\n const listenStartedAt = performance.now();\n const trace = this.startupTrace;\n try {\n const tDef = performance.now();\n if (trace) {\n await trace.measure('channels.deferred-connect', () => this.channelManager.startDeferredConnects());\n } else {\n await this.channelManager.startDeferredConnects();\n }\n const channelPhase2DeferredMs = performance.now() - tDef;\n\n const tr = performance.now();\n if (trace) {\n await trace.measure('channels.replay-outbound', () =>\n this.channelManager.replayPendingOutboundMessages(),\n );\n } else {\n await this.channelManager.replayPendingOutboundMessages();\n }\n const replayOutboundMs = performance.now() - tr;\n\n this.startOutboundProcessor().catch((err) => {\n log.error({ err }, 'Outbound processor error');\n });\n this.emit('channels.status', { channels: this.getChannelsStatus() });\n\n const onHttpListeningTotalMs = performance.now() - listenStartedAt;\n const phase2Metrics: GatewayChannelStartupPhase2Metrics = {\n channelConnectDeferMode: this.lastChannelConnectDeferMode,\n channelConnectDeferSource: this.lastChannelConnectDeferSource,\n deferredChannelIds: this.lastDeferredChannelConnectIds,\n channelPhase2DeferredMs: Math.round(channelPhase2DeferredMs),\n replayOutboundMs: Math.round(replayOutboundMs),\n onHttpListeningTotalMs: Math.round(onHttpListeningTotalMs),\n };\n log.info(\n { phase: 'gateway.channel_startup', stage: 'phase2', ...phase2Metrics },\n 'Gateway channel startup phase-2 complete (HTTP listening)',\n );\n } catch (err) {\n const em = err instanceof Error ? err.message : String(err);\n log.error(\n {\n err,\n errorMessage: em,\n phase: 'gateway.channel_startup',\n stage: 'phase2',\n deferredChannelIds: this.lastDeferredChannelConnectIds,\n elapsedMs: Math.round(performance.now() - listenStartedAt),\n },\n `Deferred channel startup after HTTP listen failed: ${em}`,\n );\n } finally {\n this.markGatewayReady();\n }\n }\n\n async stop(): Promise<void> {\n if (!this.running) return;\n\n setPairingBroadcastSink(null);\n\n log.debug('Stopping gateway service...');\n this.readiness.markStarting();\n\n await stopTailscaleExposure().catch((err) => {\n log.warn({ err }, 'Tailscale exposure shutdown failed');\n });\n\n if (this.stopGatewayUpdateCheck) {\n this.stopGatewayUpdateCheck();\n this.stopGatewayUpdateCheck = null;\n }\n\n await this.configCoordinator.stopHotReloader();\n\n // Stop heartbeat service\n this.heartbeatService?.stop();\n\n // Stop browser extension WS server (shared acquire/release with BrowserManager)\n if (this.browserExtensionRelease) {\n await this.browserExtensionRelease();\n this.browserExtensionRelease = null;\n }\n this.browserExtensionProvider = null;\n this.browserExtensionBindKey = null;\n\n registerClarifyBridge(null);\n this.agentRunner.disposeClarifyBridge();\n await disposeAllSessionMcpRuntimes().catch((err) => {\n log.warn({ err }, 'MCP runtime shutdown failed');\n });\n this._agentService?.stop();\n\n // Unblock `consumeOutbound()` / `consumeInbound()` waiters before stopping channels (CLI agent does the same).\n this.running = false;\n this.bus.shutdown();\n\n this.lastDeferredChannelConnectIds = [];\n this.lastChannelConnectDeferMode = 'auto';\n this.lastChannelConnectDeferSource = 'off';\n\n await this.channelManager.stop();\n\n // Stop cron service\n await this.cronService.stop();\n\n // Flush notes to disk\n await this.notesService.flush();\n\n // Tear down rate-limit cleanup timers so the process can exit cleanly.\n buckets.destroyAll();\n\n closeXopcDatabase();\n\n log.debug('Gateway service stopped');\n }\n\n /** Start the browser extension WS server when backend is 'extension'. */\n private async startBrowserExtensionServerIfNeeded(): Promise<void> {\n await this.reconcileBrowserExtensionServer();\n }\n\n /** Release the gateway's hold on the shared extension bridge (does not restart). */\n async releaseBrowserExtensionBridge(): Promise<void> {\n if (!this.browserExtensionRelease) return;\n await this.browserExtensionRelease();\n this.browserExtensionRelease = null;\n this.browserExtensionProvider = null;\n this.browserExtensionBindKey = null;\n log.debug('Browser extension WS server released');\n }\n\n /**\n * Start/stop/rebind the Chrome extension bridge when `agents.defaults.browser` changes.\n * PATCH saves update config in memory without re-running gateway startup, so this must run on save too.\n */\n async reconcileBrowserExtensionServer(): Promise<void> {\n const { shouldRunExtensionBridgeServer } = await import('../browser/backend-from-config.js');\n const wantsExtension = shouldRunExtensionBridgeServer(this.config);\n\n if (!wantsExtension) {\n if (this.browserExtensionRelease) {\n await this.browserExtensionRelease();\n this.browserExtensionRelease = null;\n this.browserExtensionProvider = null;\n this.browserExtensionBindKey = null;\n log.debug('Browser extension WS server stopped (backend is not extension)');\n }\n return;\n }\n\n const browser = (this.config.agents?.defaults as Record<string, unknown> | undefined)?.browser as\n | Record<string, unknown>\n | undefined;\n const ext = browser?.extension as Record<string, unknown> | undefined;\n const port = typeof ext?.port === 'number' ? ext.port : 19820;\n const host = typeof ext?.host === 'string' && ext.host ? ext.host : '127.0.0.1';\n const connectionTimeout =\n typeof ext?.connectionTimeout === 'number' && ext.connectionTimeout >= 1000\n ? Math.floor(ext.connectionTimeout)\n : undefined;\n const cmdSec = browser?.commandTimeout;\n const commandTimeout =\n typeof cmdSec === 'number' && Number.isFinite(cmdSec) && cmdSec > 0\n ? Math.floor(cmdSec * 1000)\n : undefined;\n const bindKey = `${host}:${port}`;\n\n if (this.browserExtensionRelease && this.browserExtensionBindKey === bindKey) {\n return;\n }\n\n if (this.browserExtensionRelease) {\n await this.browserExtensionRelease();\n this.browserExtensionRelease = null;\n this.browserExtensionProvider = null;\n this.browserExtensionBindKey = null;\n }\n\n try {\n const { acquireExtensionBrowserServer } = await import('../browser/providers/extension-ws-acquire.js');\n const { provider, release } = await acquireExtensionBrowserServer({\n port,\n host,\n connectionTimeout,\n commandTimeout,\n });\n this.browserExtensionProvider = provider;\n this.browserExtensionRelease = release;\n this.browserExtensionBindKey = bindKey;\n log.info({ port, host }, 'Browser extension WS server started');\n } catch (err) {\n const code = err && typeof err === 'object' && 'code' in err ? (err as { code: unknown }).code : undefined;\n if (code === 'EADDRINUSE') {\n log.warn(\n {\n err,\n phase: 'browser_extension_ws',\n bindPort: port,\n bindHost: host,\n hint: 'Another process holds this port (default 19820). Stop it or set agents.defaults.browser.extension.port.',\n },\n `Browser extension WS server port is already in use: ${host}:${port}`,\n );\n return;\n }\n\n log.error(\n { err, phase: 'browser_extension_ws' },\n `Failed to start browser extension WS server: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n /**\n * Start processing outbound messages and send through channels\n */\n private async startOutboundProcessor(): Promise<void> {\n log.debug('Starting outbound message processor');\n while (this.running) {\n try {\n const msg = await this.bus.consumeOutbound();\n await this.channelManager.send(msg);\n } catch (error) {\n if (error instanceof MessageBusShutdownError) {\n break;\n }\n const em = error instanceof Error ? error.message : String(error);\n log.error(\n { err: error, errorMessage: em, phase: 'outbound_consume' },\n `Outbound pipeline failed (will retry in 1s): ${em}`,\n );\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n }\n }\n\n // ── Config persistence / hot reload (delegated to GatewayConfigCoordinator) ──\n\n reloadHeartbeatFromCurrentConfig(): void {\n this.configCoordinator.reloadHeartbeatFromCurrentConfig();\n }\n\n reloadConfig(): Promise<{ reloaded: boolean; error?: string }> {\n return this.configCoordinator.reloadConfig();\n }\n\n afterWeixinCredentialsPersisted(): Promise<void> {\n return this.configCoordinator.afterWeixinCredentialsPersisted();\n }\n\n afterFeishuCredentialsPersisted(): Promise<void> {\n return this.configCoordinator.afterFeishuCredentialsPersisted();\n }\n\n saveConfig(config: Config): Promise<{ saved: boolean; error?: string }> {\n return this.configCoordinator.saveConfig(config);\n }\n\n setBundledExtensionActivationTarget(\n extensionId: string,\n wanted: boolean,\n ): Promise<{ ok: boolean; error?: string; requiresGatewayRestart: boolean }> {\n return this.configCoordinator.setBundledExtensionActivationTarget(extensionId, wanted);\n }\n\n updateConfig(updates: Partial<Config>): Promise<{ updated: boolean; error?: string }> {\n return this.configCoordinator.updateConfig(updates);\n }\n\n /**\n * Send message through a channel\n */\n async sendMessage(\n channel: string,\n chatId: string,\n content: string\n ): Promise<{ sent: boolean; messageId?: string }> {\n try {\n await this.channelManager.send({\n channel,\n chat_id: chatId,\n content,\n });\n const messageId = `msg_${Date.now()}`;\n this.emit('message.sent', { channel, chatId, messageId });\n return { sent: true, messageId };\n } catch (error) {\n log.error({ channel, chatId, error }, 'Failed to send message');\n throw error;\n }\n }\n\n /**\n * Get channel statuses\n */\n getChannelsStatus(): Array<{\n name: string;\n enabled: boolean;\n connected: boolean;\n }> {\n const runningChannels = new Set(this.channelManager.getRunningChannels());\n const channels = this.config.channels as Record<string, { enabled?: boolean } | undefined> | undefined;\n const catalog = this.extensionMetadataSnapshot\n ? buildChannelCatalogFromSnapshot(this.extensionMetadataSnapshot)\n : buildChannelCatalogForConfig(this.config);\n\n return catalog.entries.map((entry) => ({\n name: entry.id,\n enabled: channels?.[entry.id]?.enabled === true,\n connected: runningChannels.has(entry.id),\n }));\n }\n\n getRunningChannelIds(): string[] {\n return this.channelManager.getRunningChannels();\n }\n\n getChannelRuntimePlugin(channelId: string) {\n return this.channelManager.getPlugin(channelId);\n }\n\n async restartChannel(channelId: string): Promise<void> {\n await this.channelManager.stopChannel(channelId);\n await this.channelManager.startChannel(channelId);\n }\n\n /**\n * Hub metadata for gateway console (built-in registry + registered channel plugins).\n */\n getChannelsHubMeta(): Array<{\n id: string;\n label: string;\n description: string;\n manageable: boolean;\n order: number;\n }> {\n const catalog = this.extensionMetadataSnapshot\n ? buildChannelCatalogFromSnapshot(this.extensionMetadataSnapshot)\n : buildChannelCatalogForConfig(this.config);\n\n return catalog.entries.map((entry) => ({\n id: entry.id,\n label: entry.label,\n description: entry.description ?? '',\n manageable: true,\n order: entry.order,\n })).toSorted((a, b) => {\n if (a.order !== b.order) return a.order - b.order;\n return a.id.localeCompare(b.id);\n });\n }\n\n /**\n * Request an immediate heartbeat run (coalesced like interval/cron wakes).\n */\n requestHeartbeatNow(opts?: { reason?: string }): void {\n this.heartbeatService?.requestNow({ reason: opts?.reason ?? 'manual' });\n }\n\n /**\n * Register graceful shutdown used after spawning a replacement gateway process (foreground CLI server).\n */\n registerGatewayShutdownForRestart(handler: () => Promise<void>): void {\n this.gatewayShutdownForRestart = handler;\n }\n\n /**\n * Respawn the gateway process when supported (spawn + exit, supervisor exit, or disabled when XOPC_NO_RESPAWN).\n */\n triggerGatewayProcessRestart(): { ok: boolean; mode: string; message?: string } {\n const result = restartGatewayProcessWithFreshPid();\n if (result.mode === 'failed') {\n return { ok: false, mode: result.mode, message: result.detail ?? 'spawn failed' };\n }\n if (result.mode === 'disabled') {\n return {\n ok: false,\n mode: 'disabled',\n message:\n 'Process respawn is disabled (XOPC_NO_RESPAWN). Restart the gateway manually (e.g. xopc gateway restart).',\n };\n }\n const shutdown = this.gatewayShutdownForRestart;\n if (!shutdown) {\n return {\n ok: false,\n mode: result.mode,\n message: 'Gateway restart is not available in this process.',\n };\n }\n setImmediate(() => {\n void shutdown().finally(() => {\n process.exit(0);\n });\n });\n return { ok: true, mode: result.mode };\n }\n\n /**\n * Get health status\n */\n getHealth(): {\n status: string;\n service: string;\n version: string;\n uptime: number;\n ready: boolean;\n httpListening: boolean;\n startupDurationMs: number | null;\n channels: { running: number; total: number };\n configPath: string;\n logs?: {\n dir: string;\n errors24h: number;\n stats: Record<string, number>;\n };\n } {\n const runningChannels = this.channelManager.getRunningChannels();\n const allChannels = this.channelManager.getAllChannels();\n const logStats = getRuntimeLogStats();\n const readiness = this.readiness.getSnapshot();\n\n return {\n status: 'ok',\n service: 'xopc-gateway',\n version: PACKAGE_VERSION,\n uptime: Math.floor((Date.now() - this.startTime) / 1000),\n ready: readiness.ready,\n httpListening: readiness.httpListening,\n startupDurationMs: readiness.startupDurationMs,\n channels: {\n running: runningChannels.length,\n total: allChannels.length,\n },\n configPath: this.configPath,\n logs: {\n dir: getLogDir(),\n errors24h: logStats.errorsLast24h,\n stats: logStats.byLevel,\n },\n };\n }\n\n get isRunning(): boolean {\n return this.running;\n }\n\n /**\n * Get extension registry for external access (HTTP routes, gateway methods)\n */\n getExtensionRegistry() {\n return this.extensionLoader?.getRegistry();\n }\n\n /** Extension loader for discovery and frontend asset APIs (may be null if extensions failed to init). */\n getExtensionLoader(): ExtensionLoader | null {\n return this.extensionLoader;\n }\n\n /**\n * Get model registry for external access (HTTP routes)\n */\n getModelRegistry() {\n const { getModelRegistry } = require('../providers/index.js');\n return getModelRegistry();\n }\n\n /**\n * Invoke a gateway method registered by extensions\n */\n async invokeGatewayMethod(method: string, params: Record<string, unknown>): Promise<unknown> {\n const registry = this.getExtensionRegistry();\n if (!registry) {\n throw new Error('Extension registry not available');\n }\n\n const handler = registry.getGatewayMethod(method);\n if (!handler) {\n throw new Error(`Gateway method not found: ${method}`);\n }\n\n return await handler(params);\n }\n\n get currentConfig(): Config {\n return this.config;\n }\n\n get currentWorkspacePath(): string {\n return this.workspacePath;\n }\n\n get messageBusInstance(): MessageBus {\n return this.bus;\n }\n\n /** Effective HTTP listen port (CLI `--port` override or config default). */\n getEffectiveListenPort(): number {\n return resolveEffectiveGatewayPort(this.config, this.serviceConfig.listenPort);\n }\n\n\n get cronServiceInstance(): CronService {\n return this.cronService;\n }\n\n get notesServiceInstance(): NotesService {\n return this.notesService;\n }\n\n get sessionIndexInstance(): SessionIndex {\n return this.sessionIndex;\n }\n\n /** Shared workflow run orchestrator + session bridge (one instance per gateway). */\n createWorkflowRunService(): WorkflowRunService {\n if (!this.workflowRunServiceInstance) {\n this.workflowSessionBridge = new WorkflowSessionBridge(this);\n this.workflowRunServiceInstance = new WorkflowRunService({\n service: this,\n sessionBridge: this.workflowSessionBridge,\n buildChildTools: buildWorkflowChildTools,\n });\n }\n return this.workflowRunServiceInstance;\n }\n\n /** Process a message directly through the agent (for CLI mode). */\n async processDirect(content: string, sessionKey = 'agent:main:main'): Promise<string> {\n return this.agentService.turnDispatcher.processDirect(content, sessionKey);\n }\n\n // ========== SSE Event System ==========\n\n subscribe(\n sessionId: string,\n listener: (event: ServiceEvent) => Promise<void> | void,\n ): () => void {\n return this.sse.subscribe(sessionId, listener);\n }\n\n emit(type: string, payload: unknown): void {\n this.sse.emit(type, payload);\n }\n\n /** Replay events since `lastEventId` for SSE reconnection. */\n getEventsSince(sessionId: string, lastEventId: string): ServiceEvent[] {\n return this.sse.getEventsSince(sessionId, lastEventId);\n }\n\n /**\n * Validate authentication token from request headers.\n * Returns true if auth is disabled (mode: 'none') or token is valid.\n */\n validateAuth(headers?: Record<string, string | string[] | undefined>): boolean {\n const token = extractToken(headers);\n return validateToken(this.auth, token);\n }\n\n /**\n * Get current auth mode.\n */\n getAuthMode(): 'none' | 'token' | 'password' | 'trusted-proxy' {\n return this.auth.mode;\n }\n\n /** Resolved gateway auth (mode, credentials, trusted-proxy config). */\n getResolvedAuth(): ResolvedGatewayAuth {\n return this.auth;\n }\n\n /**\n * Get current auth token (for CLI server integration).\n * Returns undefined if mode is not token.\n */\n getAuthToken(): string | undefined {\n return this.auth.mode === 'token' ? this.auth.token : undefined;\n }\n\n /**\n * Refresh (regenerate) the gateway auth token.\n * Returns the new token.\n */\n async refreshAuthToken(): Promise<string> {\n if (this.auth.mode !== 'token') {\n throw new Error('Cannot refresh token: auth mode is not token');\n }\n\n // Generate new token\n const newToken = crypto.randomBytes(24).toString('hex');\n \n // Update in-memory auth\n this.auth.token = newToken;\n \n // Update config\n this.config = {\n ...this.config,\n gateway: {\n ...this.config.gateway,\n auth: {\n ...this.config.gateway?.auth,\n mode: 'token',\n token: newToken,\n },\n },\n };\n \n await this.saveConfig(this.config);\n\n log.info({ tokenPreview: `${newToken.slice(0, 8)}...` }, 'Gateway token refreshed');\n \n return newToken;\n }\n}\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { DEFAULT_ACK_MAX_CHARS, HEARTBEAT_OK, NO_REPLY, shouldSilence, stripHeartbeatToken } from "./tokens.js";
2
+ import { appendCronEventLines } from "./event-prompt.js";
2
3
  import { isWithinActiveHours } from "./active-hours.js";
3
4
  import { isHeartbeatContentEmpty } from "./content-check.js";
4
- import { appendCronEventLines } from "./event-prompt.js";
5
5
  import { createHeartbeatWake } from "./wake.js";
6
6
  export { DEFAULT_ACK_MAX_CHARS, HEARTBEAT_OK, NO_REPLY, appendCronEventLines, createHeartbeatWake, isHeartbeatContentEmpty, isWithinActiveHours, shouldSilence, stripHeartbeatToken };
@@ -1,9 +1,9 @@
1
1
  import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
3
  import { init_loader, loadConfig } from "../config/loader.js";
4
- import { loadUndiciRuntimeDeps } from "../infra/undici-fetch.js";
5
4
  import { toConversation } from "./channel-shared.js";
6
5
  import { createGatewayHttpClientFromConfig, resolveGatewayHttpBaseUrl } from "./gateway-http-client.js";
6
+ import { loadUndiciRuntimeDeps } from "../infra/undici-fetch.js";
7
7
  //#region src/mcp/channel-bridge.ts
8
8
  init_loader();
9
9
  init_logger();
@@ -0,0 +1,30 @@
1
+ export type ProjectTrustDecision = boolean | null;
2
+ export interface ProjectTrustStoreEntry {
3
+ path: string;
4
+ decision: boolean;
5
+ }
6
+ export interface ProjectTrustUpdate {
7
+ path: string;
8
+ decision: ProjectTrustDecision;
9
+ }
10
+ export interface ProjectTrustOption {
11
+ label: string;
12
+ trusted: boolean;
13
+ updates: ProjectTrustUpdate[];
14
+ savedPath?: string;
15
+ }
16
+ export declare function resolveProjectTrustStorePath(): string;
17
+ export declare function getProjectTrustParentPath(cwd: string): string | undefined;
18
+ export declare function getProjectTrustOptions(cwd: string, options?: {
19
+ includeSessionOnly?: boolean;
20
+ }): ProjectTrustOption[];
21
+ export declare function hasTrustRequiringProjectResources(cwd: string): boolean;
22
+ export declare class ProjectTrustStore {
23
+ private readonly trustPath;
24
+ constructor(trustPath?: string);
25
+ getPath(): string;
26
+ get(cwd: string): ProjectTrustDecision;
27
+ getEntry(cwd: string): ProjectTrustStoreEntry | null;
28
+ set(cwd: string, decision: ProjectTrustDecision): void;
29
+ setMany(decisions: ProjectTrustUpdate[]): void;
30
+ }