@xopcai/xopc 0.0.81 → 0.0.83

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 (709) hide show
  1. package/README.md +1 -1
  2. package/README.zh-CN.md +1 -1
  3. package/dist/browser-ext/manifest.json +1 -1
  4. package/dist/extensions/feishu/src/outbound/media-load.js +2 -3
  5. package/dist/extensions/feishu/src/outbound/media-load.js.map +1 -1
  6. package/dist/extensions/feishu/src/schema/config-schema.d.ts +6 -6
  7. package/dist/extensions/telegram/src/config-schema.d.ts +6 -6
  8. package/dist/extensions/telegram/src/plugin.d.ts +1 -1
  9. package/dist/extensions/telegram/src/plugin.js +1 -1
  10. package/dist/extensions/telegram/src/routing-integration.js +2 -2
  11. package/dist/extensions/telegram/xopc.extension.json +1 -1
  12. package/dist/extensions/weixin/src/api/api.js +3 -3
  13. package/dist/extensions/weixin/src/auth/accounts.js +1 -1
  14. package/dist/extensions/weixin/src/cdn/upload.js +1 -1
  15. package/dist/extensions/weixin/src/config-schema.d.ts +3 -3
  16. package/dist/extensions/weixin/src/media/data-url.js +1 -1
  17. package/dist/extensions/weixin/src/messaging/debug-mode.js +1 -1
  18. package/dist/extensions/weixin/src/messaging/inbound.js +1 -1
  19. package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
  20. package/dist/extensions/weixin/src/plugin.js +1 -1
  21. package/dist/extensions/weixin/src/storage/sync-buf.js +1 -1
  22. package/dist/gateway/static/root/assets/agents-CrpYTHJS.js +222 -0
  23. package/dist/gateway/static/root/assets/{apps-page-Ci17oA_o.js → apps-page-1mcKh5Rh.js} +1 -1
  24. package/dist/gateway/static/root/assets/channels-settings-zd6QNKPx.js +1 -0
  25. package/dist/gateway/static/root/assets/{channels-status-swr-CUU3faST.js → channels-status-swr-uRAuhiUo.js} +1 -1
  26. package/dist/gateway/static/root/assets/{cron-api-BVQ2n75R.js → cron-api-O2Q_ruV6.js} +1 -1
  27. package/dist/gateway/static/root/assets/{cron-page-x582Y6D5.js → cron-page-By09AQD-.js} +1 -1
  28. package/dist/gateway/static/root/assets/{dist-XT96cQdR.js → dist-BpQxde0t.js} +1 -1
  29. package/dist/gateway/static/root/assets/{extension-debug-page-Czzfrtt5.js → extension-debug-page-CY27wj_p.js} +1 -1
  30. package/dist/gateway/static/root/assets/{extension-page-B_c5UIqX.js → extension-page-C-Ed5ZmP.js} +1 -1
  31. package/dist/gateway/static/root/assets/{extension-settings-page-Ckvjgw0_.js → extension-settings-page-raLux7E7.js} +1 -1
  32. package/dist/gateway/static/root/assets/fetch-2iRFmd3n.js +3 -0
  33. package/dist/gateway/static/root/assets/{field-primitives-DQpT8iVa.js → field-primitives-fa_hiQcX.js} +1 -1
  34. package/dist/gateway/static/root/assets/{heartbeat-config-api-DKqOuQ0V.js → heartbeat-config-api-BVl5VHvL.js} +1 -1
  35. package/dist/gateway/static/root/assets/index-BuFldCsB.css +1 -0
  36. package/dist/gateway/static/root/assets/{index-Bq3Lg4bG.js → index-Y-iqo-gL.js} +95 -86
  37. package/dist/gateway/static/root/assets/{logs-page-B3CwJNBq.js → logs-page-BdH2n7ZW.js} +1 -1
  38. package/dist/gateway/static/root/assets/sessions-page-Vpchzdp-.js +1 -0
  39. package/dist/gateway/static/root/assets/{settings-form-section-CjjEpVYM.js → settings-form-section-Kk1yAGBl.js} +1 -1
  40. package/dist/gateway/static/root/assets/settings-page-KBm0u6Dz.js +3 -0
  41. package/dist/gateway/static/root/assets/skills-page-BjeXXaOn.js +2 -0
  42. package/dist/gateway/static/root/assets/{theme-store-DnwYutiX.js → theme-store-D01dJt95.js} +1 -1
  43. package/dist/gateway/static/root/assets/{utils-DQehHvlm.js → utils-DpTxN4AF.js} +1 -1
  44. package/dist/gateway/static/root/assets/voice-api-key-field-CwO8Cf01.js +1 -0
  45. package/dist/gateway/static/root/index.html +4 -4
  46. package/dist/package.js +1 -1
  47. package/dist/src/agent/agent-instance-gateway.d.ts +50 -0
  48. package/dist/src/agent/agent-instance-gateway.js +1 -0
  49. package/dist/src/agent/agent-manager.d.ts +20 -14
  50. package/dist/src/agent/agent-manager.js +74 -186
  51. package/dist/src/agent/agent-manager.js.map +1 -1
  52. package/dist/src/agent/background-review/coordinator.d.ts +61 -0
  53. package/dist/src/agent/background-review/coordinator.js +120 -0
  54. package/dist/src/agent/background-review/coordinator.js.map +1 -0
  55. package/dist/src/agent/bootstrap/load-bootstrap-files.js +1 -1
  56. package/dist/src/agent/child-agent-factory.d.ts +14 -0
  57. package/dist/src/agent/child-agent-factory.js +2 -8
  58. package/dist/src/agent/child-agent-factory.js.map +1 -1
  59. package/dist/src/agent/context/workspace-seed.js +3 -3
  60. package/dist/src/agent/embedded/index.d.ts +1 -2
  61. package/dist/src/agent/embedded/index.js +2 -3
  62. package/dist/src/agent/embedded/run-for-session.d.ts +2 -2
  63. package/dist/src/agent/embedded/run-for-session.js.map +1 -1
  64. package/dist/src/agent/embedded/runs.d.ts +32 -0
  65. package/dist/src/agent/embedded/runs.js +79 -19
  66. package/dist/src/agent/embedded/runs.js.map +1 -1
  67. package/dist/src/agent/embedded/session-manager-cache.d.ts +14 -0
  68. package/dist/src/agent/embedded/session-manager-cache.js +32 -11
  69. package/dist/src/agent/embedded/session-manager-cache.js.map +1 -1
  70. package/dist/src/agent/embedded/session-runner.d.ts +37 -7
  71. package/dist/src/agent/embedded/session-runner.js +184 -153
  72. package/dist/src/agent/embedded/session-runner.js.map +1 -1
  73. package/dist/src/agent/embedded/session-tool-result-guard.d.ts +57 -9
  74. package/dist/src/agent/embedded/session-tool-result-guard.js +159 -67
  75. package/dist/src/agent/embedded/session-tool-result-guard.js.map +1 -1
  76. package/dist/src/agent/goals/goal-run-store.js +4 -4
  77. package/dist/src/agent/goals/persistent-goal-service.d.ts +84 -0
  78. package/dist/src/agent/goals/persistent-goal-service.js +139 -0
  79. package/dist/src/agent/goals/persistent-goal-service.js.map +1 -0
  80. package/dist/src/agent/goals/post-turn.js +2 -2
  81. package/dist/src/agent/goals/state.d.ts +1 -1
  82. package/dist/src/agent/goals/state.js.map +1 -1
  83. package/dist/src/agent/image/load-image-media.js +1 -1
  84. package/dist/src/agent/inbound/inbound-loop.d.ts +77 -0
  85. package/dist/src/agent/inbound/inbound-loop.js +226 -0
  86. package/dist/src/agent/inbound/inbound-loop.js.map +1 -0
  87. package/dist/src/agent/inbound/turn-dispatcher.d.ts +80 -0
  88. package/dist/src/agent/inbound/turn-dispatcher.js +138 -0
  89. package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -0
  90. package/dist/src/agent/ipc/bus.js +1 -1
  91. package/dist/src/agent/ipc/inbox.js +2 -2
  92. package/dist/src/agent/ipc/socket.js +1 -1
  93. package/dist/src/agent/lifecycle/handlers/compaction.d.ts +1 -1
  94. package/dist/src/agent/lifecycle/handlers/compaction.js.map +1 -1
  95. package/dist/src/agent/lifecycle/manager.d.ts +1 -1
  96. package/dist/src/agent/lifecycle/manager.js.map +1 -1
  97. package/dist/src/agent/lifecycle/types.d.ts +1 -1
  98. package/dist/src/agent/memory/builtin-memory-store.js +1 -1
  99. package/dist/src/agent/memory/dreaming/deep-promotion.js +1 -1
  100. package/dist/src/agent/memory/dreaming/events.js +1 -1
  101. package/dist/src/agent/memory/dreaming/last-run.js +1 -1
  102. package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
  103. package/dist/src/agent/memory/dreaming/preview.js +1 -1
  104. package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
  105. package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
  106. package/dist/src/agent/memory/dreaming/utils.d.ts +12 -2
  107. package/dist/src/agent/memory/dreaming/utils.js +1 -1
  108. package/dist/src/agent/memory/dreaming/utils.js.map +1 -1
  109. package/dist/src/agent/memory/index.js +3 -3
  110. package/dist/src/agent/memory/plugin-discovery.js +1 -1
  111. package/dist/src/agent/memory/prefetch-coordinator.d.ts +37 -0
  112. package/dist/src/agent/memory/prefetch-coordinator.js +45 -0
  113. package/dist/src/agent/memory/prefetch-coordinator.js.map +1 -0
  114. package/dist/src/agent/messaging/command-handler.d.ts +5 -1
  115. package/dist/src/agent/messaging/command-handler.js +24 -96
  116. package/dist/src/agent/messaging/command-handler.js.map +1 -1
  117. package/dist/src/agent/messaging/index.d.ts +1 -0
  118. package/dist/src/agent/messaging/index.js +2 -1
  119. package/dist/src/agent/messaging/message-router.d.ts +1 -1
  120. package/dist/src/agent/messaging/message-router.js.map +1 -1
  121. package/dist/src/agent/messaging/outbound-coordinator.d.ts +82 -0
  122. package/dist/src/agent/messaging/outbound-coordinator.js +123 -0
  123. package/dist/src/agent/messaging/outbound-coordinator.js.map +1 -0
  124. package/dist/src/agent/models/manager.js +1 -1
  125. package/dist/src/agent/orchestration/agent-event-handler.d.ts +36 -33
  126. package/dist/src/agent/orchestration/agent-event-handler.js +212 -174
  127. package/dist/src/agent/orchestration/agent-event-handler.js.map +1 -1
  128. package/dist/src/agent/orchestration/agent-orchestrator.d.ts +4 -4
  129. package/dist/src/agent/orchestration/agent-orchestrator.js +4 -8
  130. package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
  131. package/dist/src/agent/orchestration/index.d.ts +1 -1
  132. package/dist/src/agent/orchestration/index.js +2 -2
  133. package/dist/src/agent/prompt/service-prompt-builder.js +4 -4
  134. package/dist/src/agent/reply/post-compaction-context.js +1 -1
  135. package/dist/src/agent/reply/workspace-boundary-read.js +1 -1
  136. package/dist/src/agent/sandbox/path-policy.js +1 -1
  137. package/dist/src/agent/service/async-queue.d.ts +20 -0
  138. package/dist/src/agent/service/async-queue.js +53 -0
  139. package/dist/src/agent/service/async-queue.js.map +1 -0
  140. package/dist/src/agent/service/build-direct-message-content.d.ts +2 -2
  141. package/dist/src/agent/service/build-direct-message-content.js.map +1 -1
  142. package/dist/src/agent/service/direct-turn-helpers.d.ts +70 -0
  143. package/dist/src/agent/service/direct-turn-helpers.js +90 -0
  144. package/dist/src/agent/service/direct-turn-helpers.js.map +1 -0
  145. package/dist/src/agent/service/process-direct-one-shot.d.ts +3 -3
  146. package/dist/src/agent/service/process-direct-one-shot.js +17 -34
  147. package/dist/src/agent/service/process-direct-one-shot.js.map +1 -1
  148. package/dist/src/agent/service/process-direct-streaming.d.ts +2 -2
  149. package/dist/src/agent/service/process-direct-streaming.js +133 -167
  150. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  151. package/dist/src/agent/service/webchat-tts.d.ts +2 -2
  152. package/dist/src/agent/service/webchat-tts.js +1 -1
  153. package/dist/src/agent/service/webchat-tts.js.map +1 -1
  154. package/dist/src/agent/service.d.ts +62 -167
  155. package/dist/src/agent/service.js +177 -786
  156. package/dist/src/agent/service.js.map +1 -1
  157. package/dist/src/agent/session/index.d.ts +4 -0
  158. package/dist/src/agent/session/index.js +5 -1
  159. package/dist/src/agent/session/session-config-service.d.ts +68 -0
  160. package/dist/src/agent/session/session-config-service.js +172 -0
  161. package/dist/src/agent/session/session-config-service.js.map +1 -0
  162. package/dist/src/agent/session/session-context.d.ts +27 -19
  163. package/dist/src/agent/session/session-context.js +39 -24
  164. package/dist/src/agent/session/session-context.js.map +1 -1
  165. package/dist/src/agent/session/session-hydrator.d.ts +42 -0
  166. package/dist/src/agent/session/session-hydrator.js +66 -0
  167. package/dist/src/agent/session/session-hydrator.js.map +1 -0
  168. package/dist/src/agent/session/session-inspector.d.ts +80 -0
  169. package/dist/src/agent/session/session-inspector.js +119 -0
  170. package/dist/src/agent/session/session-inspector.js.map +1 -0
  171. package/dist/src/agent/session/session-state-bag.d.ts +83 -0
  172. package/dist/src/agent/session/session-state-bag.js +192 -0
  173. package/dist/src/agent/session/session-state-bag.js.map +1 -0
  174. package/dist/src/agent/skills/config.js +1 -1
  175. package/dist/src/agent/skills/hub-hash.js +2 -2
  176. package/dist/src/agent/skills/hub-lock.js +1 -1
  177. package/dist/src/agent/skills/hub-pull.js +2 -2
  178. package/dist/src/agent/skills/index.d.ts +0 -2
  179. package/dist/src/agent/skills/index.js +3 -5
  180. package/dist/src/agent/skills/index.js.map +1 -1
  181. package/dist/src/agent/skills/managed-store.js +1 -1
  182. package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js +11 -6
  183. package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js.map +1 -1
  184. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js +35 -7
  185. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js.map +1 -1
  186. package/dist/src/agent/skills/scanner.js +1 -1
  187. package/dist/src/agent/skills/skill-manage-ops.js +2 -2
  188. package/dist/src/agent/skills/skill-manager.js +1 -1
  189. package/dist/src/agent/tools/browser/tool/browser-use-tool.d.ts +7 -0
  190. package/dist/src/agent/tools/browser/tool/browser-use-tool.js +37 -0
  191. package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +1 -1
  192. package/dist/src/agent/tools/delegate-tool.d.ts +7 -0
  193. package/dist/src/agent/tools/delegate-tool.js +2 -1
  194. package/dist/src/agent/tools/delegate-tool.js.map +1 -1
  195. package/dist/src/agent/tools/dreaming-tool.js +1 -1
  196. package/dist/src/agent/tools/executor.d.ts +34 -15
  197. package/dist/src/agent/tools/executor.js +44 -79
  198. package/dist/src/agent/tools/executor.js.map +1 -1
  199. package/dist/src/agent/tools/factory.d.ts +6 -0
  200. package/dist/src/agent/tools/factory.js +63 -4
  201. package/dist/src/agent/tools/factory.js.map +1 -1
  202. package/dist/src/agent/tools/image-generate-tool.js +1 -1
  203. package/dist/src/agent/tools/send-media.js +1 -1
  204. package/dist/src/agent/tools/skill-manage-tool.js +1 -1
  205. package/dist/src/agent/tools/skills-tools.js +1 -1
  206. package/dist/src/agent/tools/tts-tool.js +1 -1
  207. package/dist/src/agent/tools/write.js +1 -1
  208. package/dist/src/agent/workspace-runtime/registry.d.ts +48 -0
  209. package/dist/src/agent/workspace-runtime/registry.js +59 -0
  210. package/dist/src/agent/workspace-runtime/registry.js.map +1 -0
  211. package/dist/src/auth/credentials.js +3 -3
  212. package/dist/src/auth/profiles/store.js +1 -1
  213. package/dist/src/auth/sync-provider-auth.js +1 -1
  214. package/dist/src/browser/cdp-local-launcher.js +4 -3
  215. package/dist/src/browser/cdp-local-launcher.js.map +1 -1
  216. package/dist/src/browser/index.d.ts +1 -0
  217. package/dist/src/browser/index.js +2 -1
  218. package/dist/src/browser/manager.js +3 -2
  219. package/dist/src/browser/manager.js.map +1 -1
  220. package/dist/src/browser/providers/browser-ext-install.js +4 -4
  221. package/dist/src/browser/providers/browser-use.js +2 -1
  222. package/dist/src/browser/providers/browser-use.js.map +1 -1
  223. package/dist/src/browser/providers/browserbase.js +2 -1
  224. package/dist/src/browser/providers/browserbase.js.map +1 -1
  225. package/dist/src/browser/providers/cloakbrowser.js +7 -6
  226. package/dist/src/browser/providers/cloakbrowser.js.map +1 -1
  227. package/dist/src/browser/providers/playwright-doctor.d.ts +2 -0
  228. package/dist/src/browser/providers/playwright-doctor.js +7 -3
  229. package/dist/src/browser/providers/playwright-doctor.js.map +1 -1
  230. package/dist/src/browser/readiness.d.ts +33 -0
  231. package/dist/src/browser/readiness.js +138 -0
  232. package/dist/src/browser/readiness.js.map +1 -0
  233. package/dist/src/browser/stealth.js +2 -2
  234. package/dist/src/channels/attachments/inbound-persist.js +1 -1
  235. package/dist/src/channels/attachments/outbound-tts-persist.js +1 -1
  236. package/dist/src/channels/channel-domain.d.ts +1 -1
  237. package/dist/src/channels/config-helpers.d.ts +1 -1
  238. package/dist/src/channels/config-helpers.js.map +1 -1
  239. package/dist/src/channels/heartbeat-scheduler.d.ts +40 -0
  240. package/dist/src/channels/heartbeat-scheduler.js +94 -0
  241. package/dist/src/channels/heartbeat-scheduler.js.map +1 -0
  242. package/dist/src/channels/lifecycle-supervisor.d.ts +81 -0
  243. package/dist/src/channels/lifecycle-supervisor.js +263 -0
  244. package/dist/src/channels/lifecycle-supervisor.js.map +1 -0
  245. package/dist/src/channels/manager.d.ts +34 -68
  246. package/dist/src/channels/manager.js +107 -477
  247. package/dist/src/channels/manager.js.map +1 -1
  248. package/dist/src/channels/outbound/deliver.d.ts +1 -1
  249. package/dist/src/channels/outbound/deliver.js.map +1 -1
  250. package/dist/src/channels/outbound/persist-store.js +1 -1
  251. package/dist/src/channels/outbound-sender.d.ts +51 -0
  252. package/dist/src/channels/outbound-sender.js +125 -0
  253. package/dist/src/channels/outbound-sender.js.map +1 -0
  254. package/dist/src/channels/pairing/allow-from-file.js +1 -1
  255. package/dist/src/channels/pairing/pairing-service.d.ts +3 -10
  256. package/dist/src/channels/pairing/pairing-service.js.map +1 -1
  257. package/dist/src/channels/pairing/pairing-store.js +2 -2
  258. package/dist/src/channels/pairing/pairing-types.d.ts +15 -0
  259. package/dist/src/channels/pairing/pairing-types.js +1 -0
  260. package/dist/src/channels/plugin-registry.d.ts +22 -0
  261. package/dist/src/channels/plugin-registry.js +44 -0
  262. package/dist/src/channels/plugin-registry.js.map +1 -0
  263. package/dist/src/channels/plugin-types.d.ts +1 -1
  264. package/dist/src/channels/plugins/types.adapters.d.ts +2 -2
  265. package/dist/src/channels/security-helpers.d.ts +1 -1
  266. package/dist/src/channels/security-helpers.js.map +1 -1
  267. package/dist/src/channels/setup-wizard.d.ts +1 -1
  268. package/dist/src/chat-commands/builtins/config.js +2 -2
  269. package/dist/src/chat-commands/context.js +1 -1
  270. package/dist/src/cli/commands/agent/stream-renderer.js +1 -1
  271. package/dist/src/cli/commands/agent/stream-renderer.js.map +1 -1
  272. package/dist/src/cli/commands/agent.js +4 -4
  273. package/dist/src/cli/commands/agent.js.map +1 -1
  274. package/dist/src/cli/commands/browser-cli-helpers.js +2 -1
  275. package/dist/src/cli/commands/browser-cli-helpers.js.map +1 -1
  276. package/dist/src/cli/commands/doctor/checks/config-health.js +1 -1
  277. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
  278. package/dist/src/cli/commands/doctor/checks/session-integrity.js +1 -1
  279. package/dist/src/cli/commands/doctor/checks/state-integrity.js +1 -1
  280. package/dist/src/cli/commands/doctor/checks/workspace-status.js +1 -1
  281. package/dist/src/cli/commands/extension-dev.js +2 -2
  282. package/dist/src/cli/commands/extension-dev.js.map +1 -1
  283. package/dist/src/cli/commands/extension-marketplace.js +2 -2
  284. package/dist/src/cli/commands/extension-marketplace.js.map +1 -1
  285. package/dist/src/cli/commands/extension-pack.js +1 -1
  286. package/dist/src/cli/commands/gateway/call.js +1 -1
  287. package/dist/src/cli/commands/gateway/call.js.map +1 -1
  288. package/dist/src/cli/commands/gateway/health.js +1 -1
  289. package/dist/src/cli/commands/gateway/health.js.map +1 -1
  290. package/dist/src/cli/commands/gateway/lifecycle-core.d.ts +31 -12
  291. package/dist/src/cli/commands/gateway/lifecycle-core.js +167 -116
  292. package/dist/src/cli/commands/gateway/lifecycle-core.js.map +1 -1
  293. package/dist/src/cli/commands/gateway/lifecycle.d.ts +11 -0
  294. package/dist/src/cli/commands/gateway/lifecycle.js +102 -0
  295. package/dist/src/cli/commands/gateway/lifecycle.js.map +1 -0
  296. package/dist/src/cli/commands/gateway/logs.js +1 -1
  297. package/dist/src/cli/commands/gateway/logs.js.map +1 -1
  298. package/dist/src/cli/commands/gateway/probe.js +1 -1
  299. package/dist/src/cli/commands/gateway/probe.js.map +1 -1
  300. package/dist/src/cli/commands/gateway/restart-health.d.ts +12 -0
  301. package/dist/src/cli/commands/gateway/restart-health.js +45 -1
  302. package/dist/src/cli/commands/gateway/restart-health.js.map +1 -1
  303. package/dist/src/cli/commands/gateway/restart.js +3 -3
  304. package/dist/src/cli/commands/gateway/restart.js.map +1 -1
  305. package/dist/src/cli/commands/gateway/run-foreground.d.ts +0 -1
  306. package/dist/src/cli/commands/gateway/run-foreground.js +0 -35
  307. package/dist/src/cli/commands/gateway/run-foreground.js.map +1 -1
  308. package/dist/src/cli/commands/gateway/service.js +1 -1
  309. package/dist/src/cli/commands/gateway/service.js.map +1 -1
  310. package/dist/src/cli/commands/gateway/shared.d.ts +3 -0
  311. package/dist/src/cli/commands/gateway/shared.js +54 -0
  312. package/dist/src/cli/commands/gateway/shared.js.map +1 -0
  313. package/dist/src/cli/commands/gateway/status.js +1 -1
  314. package/dist/src/cli/commands/gateway/status.js.map +1 -1
  315. package/dist/src/cli/commands/gateway/stop.js +2 -2
  316. package/dist/src/cli/commands/gateway/stop.js.map +1 -1
  317. package/dist/src/cli/commands/gateway/token.js +1 -1
  318. package/dist/src/cli/commands/gateway/token.js.map +1 -1
  319. package/dist/src/cli/commands/gateway.js +5 -5
  320. package/dist/src/cli/commands/gateway.js.map +1 -1
  321. package/dist/src/cli/commands/image.js +2 -2
  322. package/dist/src/cli/commands/image.js.map +1 -1
  323. package/dist/src/cli/commands/init.js +4 -4
  324. package/dist/src/cli/commands/models.js +1 -1
  325. package/dist/src/cli/commands/models.js.map +1 -1
  326. package/dist/src/cli/commands/onboard/gateway.d.ts +0 -8
  327. package/dist/src/cli/commands/onboard/gateway.js +48 -49
  328. package/dist/src/cli/commands/onboard/gateway.js.map +1 -1
  329. package/dist/src/cli/commands/onboard.js +9 -64
  330. package/dist/src/cli/commands/onboard.js.map +1 -1
  331. package/dist/src/cli/commands/session/utils.js +1 -1
  332. package/dist/src/cli/commands/session/utils.js.map +1 -1
  333. package/dist/src/cli/commands/skills.js +1 -1
  334. package/dist/src/cli/commands/tailscale.js +1 -1
  335. package/dist/src/cli/commands/tailscale.js.map +1 -1
  336. package/dist/src/cli/context.d.ts +20 -0
  337. package/dist/src/cli/context.js +23 -0
  338. package/dist/src/cli/context.js.map +1 -0
  339. package/dist/src/cli/extension-cli-register.js +3 -3
  340. package/dist/src/cli/gateway-run-argv.js +1 -4
  341. package/dist/src/cli/gateway-run-argv.js.map +1 -1
  342. package/dist/src/cli/gateway-run-fast-path.js +1 -1
  343. package/dist/src/cli/gateway-run-fast-path.js.map +1 -1
  344. package/dist/src/cli/index.d.ts +1 -7
  345. package/dist/src/cli/index.js +4 -6
  346. package/dist/src/cli/index.js.map +1 -1
  347. package/dist/src/cli/utils/init-workspace-core.js +2 -2
  348. package/dist/src/config/commands.flags.d.ts +3 -0
  349. package/dist/src/config/commands.flags.js +11 -0
  350. package/dist/src/config/commands.flags.js.map +1 -0
  351. package/dist/src/config/index.d.ts +1 -0
  352. package/dist/src/config/index.js +6 -5
  353. package/dist/src/config/index.js.map +1 -1
  354. package/dist/src/config/loader.js +2 -2
  355. package/dist/src/config/models-json.js +2 -2
  356. package/dist/src/config/profile.js +2 -2
  357. package/dist/src/config/schema.d.ts +11 -4
  358. package/dist/src/config/schema.js +13 -12
  359. package/dist/src/config/schema.js.map +1 -1
  360. package/dist/src/config/workspace-path-helpers.d.ts +15 -0
  361. package/dist/src/config/workspace-path-helpers.js +14 -0
  362. package/dist/src/config/workspace-path-helpers.js.map +1 -0
  363. package/dist/src/cron/executor.js +4 -4
  364. package/dist/src/cron/executor.js.map +1 -1
  365. package/dist/src/cron/persistence.js +1 -1
  366. package/dist/src/cron/run-log-store.js +1 -1
  367. package/dist/src/daemon/index.d.ts +0 -1
  368. package/dist/src/daemon/index.js +1 -2
  369. package/dist/src/daemon/install-plan.js +3 -2
  370. package/dist/src/daemon/install-plan.js.map +1 -1
  371. package/dist/src/daemon/launchd.js +2 -2
  372. package/dist/src/daemon/systemd.js +2 -2
  373. package/dist/src/daemon/types.d.ts +0 -6
  374. package/dist/src/extensions/api.d.ts +1 -1
  375. package/dist/src/extensions/api.js +2 -2
  376. package/dist/src/extensions/api.js.map +1 -1
  377. package/dist/src/extensions/bundle-mcp.js +1 -1
  378. package/dist/src/extensions/discover-extensions.js +1 -1
  379. package/dist/src/extensions/extension-registry-impl.d.ts +51 -0
  380. package/dist/src/extensions/extension-registry-impl.js +117 -0
  381. package/dist/src/extensions/extension-registry-impl.js.map +1 -0
  382. package/dist/src/extensions/health.js +1 -1
  383. package/dist/src/extensions/index.js +3 -2
  384. package/dist/src/extensions/loader.d.ts +3 -43
  385. package/dist/src/extensions/loader.js +3 -110
  386. package/dist/src/extensions/loader.js.map +1 -1
  387. package/dist/src/extensions/lockfile.js +2 -2
  388. package/dist/src/extensions/sdk/index.js +2 -1
  389. package/dist/src/extensions/sdk/index.js.map +1 -1
  390. package/dist/src/extensions/types/events.d.ts +7 -1
  391. package/dist/src/gateway/agents-admin.js +2 -2
  392. package/dist/src/gateway/file-path-classifier.js +2 -2
  393. package/dist/src/gateway/heartbeat/service.js +2 -2
  394. package/dist/src/gateway/heartbeat/service.js.map +1 -1
  395. package/dist/src/gateway/hono/app.js +40 -37
  396. package/dist/src/gateway/hono/app.js.map +1 -1
  397. package/dist/src/gateway/hono/lib/extension-store.js +1 -1
  398. package/dist/src/gateway/hono/lib/static-ui.js +2 -2
  399. package/dist/src/gateway/hono/middleware/auth.d.ts +5 -14
  400. package/dist/src/gateway/hono/middleware/auth.js +92 -105
  401. package/dist/src/gateway/hono/middleware/auth.js.map +1 -1
  402. package/dist/src/gateway/hono/middleware/logger.d.ts +5 -1
  403. package/dist/src/gateway/hono/middleware/logger.js +41 -5
  404. package/dist/src/gateway/hono/middleware/logger.js.map +1 -1
  405. package/dist/src/gateway/hono/middleware/strict-rate-limit.d.ts +14 -0
  406. package/dist/src/gateway/hono/middleware/strict-rate-limit.js +62 -0
  407. package/dist/src/gateway/hono/middleware/strict-rate-limit.js.map +1 -0
  408. package/dist/src/gateway/hono/oauth.js +1 -1
  409. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +4 -4
  410. package/dist/src/gateway/hono/routes/auth-registry-extensions.js.map +1 -1
  411. package/dist/src/gateway/hono/routes/browser.d.ts +20 -0
  412. package/dist/src/gateway/hono/routes/browser.js +626 -0
  413. package/dist/src/gateway/hono/routes/browser.js.map +1 -0
  414. package/dist/src/gateway/hono/routes/commands-skills.js +13 -13
  415. package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
  416. package/dist/src/gateway/hono/routes/config-patch/agents.d.ts +18 -0
  417. package/dist/src/gateway/hono/routes/config-patch/agents.js +418 -0
  418. package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -0
  419. package/dist/src/gateway/hono/routes/config-patch/channels.d.ts +12 -0
  420. package/dist/src/gateway/hono/routes/config-patch/channels.js +186 -0
  421. package/dist/src/gateway/hono/routes/config-patch/channels.js.map +1 -0
  422. package/dist/src/gateway/hono/routes/config-patch/gateway.d.ts +18 -0
  423. package/dist/src/gateway/hono/routes/config-patch/gateway.js +264 -0
  424. package/dist/src/gateway/hono/routes/config-patch/gateway.js.map +1 -0
  425. package/dist/src/gateway/hono/routes/config-patch/index.d.ts +9 -0
  426. package/dist/src/gateway/hono/routes/config-patch/index.js +6 -0
  427. package/dist/src/gateway/hono/routes/config-patch/misc.d.ts +23 -0
  428. package/dist/src/gateway/hono/routes/config-patch/misc.js +139 -0
  429. package/dist/src/gateway/hono/routes/config-patch/misc.js.map +1 -0
  430. package/dist/src/gateway/hono/routes/config-patch/result.d.ts +18 -0
  431. package/dist/src/gateway/hono/routes/config-patch/result.js +13 -0
  432. package/dist/src/gateway/hono/routes/config-patch/result.js.map +1 -0
  433. package/dist/src/gateway/hono/routes/config.js +20 -1764
  434. package/dist/src/gateway/hono/routes/config.js.map +1 -1
  435. package/dist/src/gateway/hono/routes/dreaming.js +2 -3
  436. package/dist/src/gateway/hono/routes/dreaming.js.map +1 -1
  437. package/dist/src/gateway/hono/routes/exposure.js +2 -1
  438. package/dist/src/gateway/hono/routes/exposure.js.map +1 -1
  439. package/dist/src/gateway/hono/routes/host-fs.js +1 -1
  440. package/dist/src/gateway/hono/routes/lazy-bundles.js +10 -5
  441. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  442. package/dist/src/gateway/hono/routes/mcp.js +1 -2
  443. package/dist/src/gateway/hono/routes/mcp.js.map +1 -1
  444. package/dist/src/gateway/hono/routes/models.js +1 -1
  445. package/dist/src/gateway/hono/routes/sessions.js +32 -32
  446. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  447. package/dist/src/gateway/hono/routes/shares.js +4 -4
  448. package/dist/src/gateway/hono/routes/shares.js.map +1 -1
  449. package/dist/src/gateway/hono/routes/tunnel.js +1 -1
  450. package/dist/src/gateway/hono/routes/tunnel.js.map +1 -1
  451. package/dist/src/gateway/hono/routes/workspace.js +6 -7
  452. package/dist/src/gateway/hono/routes/workspace.js.map +1 -1
  453. package/dist/src/gateway/hono/sse.d.ts +1 -0
  454. package/dist/src/gateway/hono/sse.js +3 -2
  455. package/dist/src/gateway/hono/sse.js.map +1 -1
  456. package/dist/src/gateway/index.d.ts +1 -1
  457. package/dist/src/gateway/index.js +4 -2
  458. package/dist/src/gateway/lock.js +3 -3
  459. package/dist/src/gateway/rate-limit/auth-policy.d.ts +34 -0
  460. package/dist/src/gateway/rate-limit/auth-policy.js +49 -0
  461. package/dist/src/gateway/rate-limit/auth-policy.js.map +1 -0
  462. package/dist/src/gateway/rate-limit/buckets.d.ts +63 -0
  463. package/dist/src/gateway/rate-limit/buckets.js +143 -0
  464. package/dist/src/gateway/rate-limit/buckets.js.map +1 -0
  465. package/dist/src/gateway/rate-limit/env-flags.d.ts +13 -0
  466. package/dist/src/gateway/rate-limit/env-flags.js +16 -0
  467. package/dist/src/gateway/rate-limit/env-flags.js.map +1 -0
  468. package/dist/src/gateway/rate-limit/index.d.ts +3 -0
  469. package/dist/src/gateway/rate-limit/index.js +4 -0
  470. package/dist/src/gateway/run-loop.d.ts +1 -1
  471. package/dist/src/gateway/run-loop.js +24 -4
  472. package/dist/src/gateway/run-loop.js.map +1 -1
  473. package/dist/src/gateway/runtime-config.js +2 -1
  474. package/dist/src/gateway/runtime-config.js.map +1 -1
  475. package/dist/src/gateway/security/audit.js +2 -1
  476. package/dist/src/gateway/security/audit.js.map +1 -1
  477. package/dist/src/gateway/security/index.d.ts +0 -1
  478. package/dist/src/gateway/security/index.js +1 -2
  479. package/dist/src/gateway/security/loopback.d.ts +13 -0
  480. package/dist/src/gateway/security/loopback.js +45 -0
  481. package/dist/src/gateway/security/loopback.js.map +1 -0
  482. package/dist/src/gateway/service/agent-runner.d.ts +108 -0
  483. package/dist/src/gateway/service/agent-runner.js +184 -0
  484. package/dist/src/gateway/service/agent-runner.js.map +1 -0
  485. package/dist/src/gateway/service/config-coordinator.d.ts +119 -0
  486. package/dist/src/gateway/service/config-coordinator.js +351 -0
  487. package/dist/src/gateway/service/config-coordinator.js.map +1 -0
  488. package/dist/src/gateway/service/marketplace-service.d.ts +85 -0
  489. package/dist/src/gateway/service/marketplace-service.js +239 -0
  490. package/dist/src/gateway/service/marketplace-service.js.map +1 -0
  491. package/dist/src/gateway/service/run-gateway-agent.js +5 -5
  492. package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
  493. package/dist/src/gateway/service/sessions-api.d.ts +125 -0
  494. package/dist/src/gateway/service/sessions-api.js +135 -0
  495. package/dist/src/gateway/service/sessions-api.js.map +1 -0
  496. package/dist/src/gateway/service.d.ts +30 -360
  497. package/dist/src/gateway/service.js +122 -904
  498. package/dist/src/gateway/service.js.map +1 -1
  499. package/dist/src/gateway/workspace-fs-file-list.js +1 -1
  500. package/dist/src/gateway/workspace-heartbeat-path.js +1 -2
  501. package/dist/src/gateway/workspace-heartbeat-path.js.map +1 -1
  502. package/dist/src/heartbeat/index.js +1 -1
  503. package/dist/src/infra/gateway-process-argv.d.ts +4 -0
  504. package/dist/src/infra/gateway-process-argv.js +26 -0
  505. package/dist/src/infra/gateway-process-argv.js.map +1 -0
  506. package/dist/src/infra/gateway-processes.d.ts +5 -0
  507. package/dist/src/infra/gateway-processes.js +65 -0
  508. package/dist/src/infra/gateway-processes.js.map +1 -0
  509. package/dist/src/infra/rate-limit/failure-limiter.d.ts +50 -0
  510. package/dist/src/infra/rate-limit/failure-limiter.js +100 -0
  511. package/dist/src/infra/rate-limit/failure-limiter.js.map +1 -0
  512. package/dist/src/infra/rate-limit/index.d.ts +5 -0
  513. package/dist/src/infra/rate-limit/index.js +3 -0
  514. package/dist/src/infra/rate-limit/keyed-store.d.ts +34 -0
  515. package/dist/src/infra/rate-limit/keyed-store.js +44 -0
  516. package/dist/src/infra/rate-limit/keyed-store.js.map +1 -0
  517. package/dist/src/infra/rate-limit/rate-limiter.d.ts +39 -0
  518. package/dist/src/infra/rate-limit/rate-limiter.js +65 -0
  519. package/dist/src/infra/rate-limit/rate-limiter.js.map +1 -0
  520. package/dist/src/infra/restart.d.ts +21 -0
  521. package/dist/src/infra/restart.js +122 -0
  522. package/dist/src/infra/restart.js.map +1 -0
  523. package/dist/src/infra/update-check.js +1 -1
  524. package/dist/src/infra/update-lock.js +3 -3
  525. package/dist/src/infra/update-runner.js +1 -1
  526. package/dist/src/infra/update-startup.js +2 -2
  527. package/dist/src/infra/write-file-atomic.js +2 -2
  528. package/dist/src/mcp/channel-bridge.d.ts +0 -6
  529. package/dist/src/mcp/channel-bridge.js +1 -5
  530. package/dist/src/mcp/channel-bridge.js.map +1 -1
  531. package/dist/src/media-shared/http/ssrf-guard.js +1 -1
  532. package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
  533. package/dist/src/providers/index.js +2 -2
  534. package/dist/src/providers/model-registry.js +1 -1
  535. package/dist/src/session/config-store.js +2 -2
  536. package/dist/src/session/parity/jsonl-transcript-io.js +2 -2
  537. package/dist/src/session/parity/sessions-json-file-read.d.ts +2 -1
  538. package/dist/src/session/parity/sessions-json-file-read.js.map +1 -1
  539. package/dist/src/session/parity/sessions-json-file.js +1 -1
  540. package/dist/src/session/parity/transcript-file-lock.js +2 -2
  541. package/dist/src/session/parity/transcript-paths.js +1 -1
  542. package/dist/src/session/search-index-cache.js +1 -1
  543. package/dist/src/session/search-index.js +1 -1
  544. package/dist/src/session/session-title.js +1 -1
  545. package/dist/src/session/store.js +5 -5
  546. package/dist/src/share/share-rate-limit.d.ts +10 -2
  547. package/dist/src/share/share-rate-limit.js +39 -27
  548. package/dist/src/share/share-rate-limit.js.map +1 -1
  549. package/dist/src/share/share-store.js +3 -3
  550. package/dist/src/tui/backends/embedded-backend.js +16 -12
  551. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  552. package/dist/src/tui/clipboard-image.js +2 -2
  553. package/dist/src/tui/extension-host/load-extensions.js +1 -1
  554. package/dist/src/tui/format-tui-hotkeys.js +1 -1
  555. package/dist/src/tui/theme-manager.js +1 -1
  556. package/dist/src/tui/tui-keybindings-file.js +1 -1
  557. package/dist/src/tui/tui-scoped-models.js +1 -1
  558. package/dist/src/tui/tui-settings.js +1 -1
  559. package/dist/src/tui/tui-skills-autocomplete.js +1 -1
  560. package/dist/src/tui/tui.js +1 -2
  561. package/dist/src/tui/tui.js.map +1 -1
  562. package/dist/src/tui/xopc-tui-keybindings.d.ts +0 -1
  563. package/dist/src/tui/xopc-tui-keybindings.js +1 -2
  564. package/dist/src/tui/xopc-tui-keybindings.js.map +1 -1
  565. package/dist/src/tunnel/frpc-binary.js +2 -2
  566. package/dist/src/tunnel/frpc-config.js +1 -1
  567. package/dist/src/tunnel/frpc-extract.js +1 -1
  568. package/dist/src/tunnel/pairing-rate-limit.d.ts +10 -2
  569. package/dist/src/tunnel/pairing-rate-limit.js +19 -15
  570. package/dist/src/tunnel/pairing-rate-limit.js.map +1 -1
  571. package/dist/src/tunnel/tunnel-rate-limit.d.ts +6 -3
  572. package/dist/src/tunnel/tunnel-rate-limit.js +19 -18
  573. package/dist/src/tunnel/tunnel-rate-limit.js.map +1 -1
  574. package/dist/src/tunnel/tunnel-state.js +1 -1
  575. package/dist/src/utils/logger/audit.js +1 -1
  576. package/dist/src/utils/logger/log-store.js +1 -1
  577. package/dist/src/utils/logger/rotation.js +1 -1
  578. package/dist/src/utils/logger/stats.d.ts +1 -1
  579. package/dist/src/voice/tts/audio.js +1 -1
  580. package/dist/src/voice/tts/factory.js +1 -1
  581. package/dist/src/voice/tts/index.js +2 -2
  582. package/dist/src/voice/tts/merge-config.js +1 -1
  583. package/dist/src/voice/tts/providers/edge-speech.js +1 -1
  584. package/dist/src/voice/tts/service.js +1 -1
  585. package/dist/src/voice/tts/service.js.map +1 -1
  586. package/dist/src/voice/tts/speak-core.js +1 -1
  587. package/package.json +10 -5
  588. package/dist/gateway/static/root/assets/agents-DOONGaKz.js +0 -222
  589. package/dist/gateway/static/root/assets/channels-settings-CARdL-ys.js +0 -1
  590. package/dist/gateway/static/root/assets/fetch-BAAh_kXG.js +0 -3
  591. package/dist/gateway/static/root/assets/index-C8yHX-AA.css +0 -1
  592. package/dist/gateway/static/root/assets/sessions-page-BCNnhz9g.js +0 -1
  593. package/dist/gateway/static/root/assets/settings-page-B7_PjiHL.js +0 -3
  594. package/dist/gateway/static/root/assets/skills-page-VrL9TeVF.js +0 -2
  595. package/dist/gateway/static/root/assets/voice-api-key-field-k4FWwgkk.js +0 -1
  596. package/dist/src/agent/embedded/session-raw-append-message.d.ts +0 -11
  597. package/dist/src/agent/embedded/session-raw-append-message.js +0 -15
  598. package/dist/src/agent/embedded/session-raw-append-message.js.map +0 -1
  599. package/dist/src/agent/embedded/session-tool-result-guard-wrapper.d.ts +0 -15
  600. package/dist/src/agent/embedded/session-tool-result-guard-wrapper.js +0 -24
  601. package/dist/src/agent/embedded/session-tool-result-guard-wrapper.js.map +0 -1
  602. package/dist/src/agent/embedded/session-tool-result-state.d.ts +0 -17
  603. package/dist/src/agent/embedded/session-tool-result-state.js +0 -26
  604. package/dist/src/agent/embedded/session-tool-result-state.js.map +0 -1
  605. package/dist/src/daemon/launchd-restart-handoff.d.ts +0 -25
  606. package/dist/src/daemon/launchd-restart-handoff.js +0 -132
  607. package/dist/src/daemon/launchd-restart-handoff.js.map +0 -1
  608. package/dist/src/gateway/auth-rate-limit.d.ts +0 -71
  609. package/dist/src/gateway/auth-rate-limit.js +0 -192
  610. package/dist/src/gateway/auth-rate-limit.js.map +0 -1
  611. package/dist/src/gateway/restart-handler.d.ts +0 -14
  612. package/dist/src/gateway/restart-handler.js +0 -64
  613. package/dist/src/gateway/restart-handler.js.map +0 -1
  614. package/dist/src/gateway/security/flood-guard.d.ts +0 -28
  615. package/dist/src/gateway/security/flood-guard.js +0 -42
  616. package/dist/src/gateway/security/flood-guard.js.map +0 -1
  617. package/dist/src/infra/rate-limit.d.ts +0 -38
  618. package/dist/src/infra/rate-limit.js +0 -60
  619. package/dist/src/infra/rate-limit.js.map +0 -1
  620. package/dist/src/infra/restart-intent.d.ts +0 -13
  621. package/dist/src/infra/restart-intent.js +0 -40
  622. package/dist/src/infra/restart-intent.js.map +0 -1
  623. package/dist/src/infra/restart-sentinel.d.ts +0 -23
  624. package/dist/src/infra/restart-sentinel.js +0 -75
  625. package/dist/src/infra/restart-sentinel.js.map +0 -1
  626. package/skills/creative/canvas-design/LICENSE.txt +0 -202
  627. package/skills/creative/canvas-design/SKILL-zh.md +0 -130
  628. package/skills/creative/canvas-design/SKILL.md +0 -130
  629. package/skills/creative/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +0 -93
  630. package/skills/creative/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
  631. package/skills/creative/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
  632. package/skills/creative/canvas-design/canvas-fonts/BigShoulders-OFL.txt +0 -93
  633. package/skills/creative/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
  634. package/skills/creative/canvas-design/canvas-fonts/Boldonse-OFL.txt +0 -93
  635. package/skills/creative/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
  636. package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
  637. package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +0 -93
  638. package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
  639. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
  640. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
  641. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +0 -93
  642. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
  643. package/skills/creative/canvas-design/canvas-fonts/DMMono-OFL.txt +0 -93
  644. package/skills/creative/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
  645. package/skills/creative/canvas-design/canvas-fonts/EricaOne-OFL.txt +0 -94
  646. package/skills/creative/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
  647. package/skills/creative/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
  648. package/skills/creative/canvas-design/canvas-fonts/GeistMono-OFL.txt +0 -93
  649. package/skills/creative/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
  650. package/skills/creative/canvas-design/canvas-fonts/Gloock-OFL.txt +0 -93
  651. package/skills/creative/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
  652. package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
  653. package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +0 -93
  654. package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
  655. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
  656. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
  657. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
  658. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
  659. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
  660. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
  661. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
  662. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +0 -93
  663. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
  664. package/skills/creative/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
  665. package/skills/creative/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
  666. package/skills/creative/canvas-design/canvas-fonts/Italiana-OFL.txt +0 -93
  667. package/skills/creative/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
  668. package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
  669. package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +0 -93
  670. package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
  671. package/skills/creative/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
  672. package/skills/creative/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
  673. package/skills/creative/canvas-design/canvas-fonts/Jura-OFL.txt +0 -93
  674. package/skills/creative/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +0 -93
  675. package/skills/creative/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
  676. package/skills/creative/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
  677. package/skills/creative/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
  678. package/skills/creative/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
  679. package/skills/creative/canvas-design/canvas-fonts/Lora-OFL.txt +0 -93
  680. package/skills/creative/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
  681. package/skills/creative/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
  682. package/skills/creative/canvas-design/canvas-fonts/NationalPark-OFL.txt +0 -93
  683. package/skills/creative/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
  684. package/skills/creative/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +0 -93
  685. package/skills/creative/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
  686. package/skills/creative/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
  687. package/skills/creative/canvas-design/canvas-fonts/Outfit-OFL.txt +0 -93
  688. package/skills/creative/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
  689. package/skills/creative/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
  690. package/skills/creative/canvas-design/canvas-fonts/PixelifySans-OFL.txt +0 -93
  691. package/skills/creative/canvas-design/canvas-fonts/PoiretOne-OFL.txt +0 -93
  692. package/skills/creative/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
  693. package/skills/creative/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
  694. package/skills/creative/canvas-design/canvas-fonts/RedHatMono-OFL.txt +0 -93
  695. package/skills/creative/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
  696. package/skills/creative/canvas-design/canvas-fonts/Silkscreen-OFL.txt +0 -93
  697. package/skills/creative/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
  698. package/skills/creative/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
  699. package/skills/creative/canvas-design/canvas-fonts/SmoochSans-OFL.txt +0 -93
  700. package/skills/creative/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
  701. package/skills/creative/canvas-design/canvas-fonts/Tektur-OFL.txt +0 -93
  702. package/skills/creative/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
  703. package/skills/creative/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
  704. package/skills/creative/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
  705. package/skills/creative/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
  706. package/skills/creative/canvas-design/canvas-fonts/WorkSans-OFL.txt +0 -93
  707. package/skills/creative/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
  708. package/skills/creative/canvas-design/canvas-fonts/YoungSerif-OFL.txt +0 -93
  709. package/skills/creative/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
@@ -1,440 +1,100 @@
1
1
  import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
- import { mergeTtsConfigFromAppConfig } from "../voice/tts/merge-config.js";
4
- import { maybeApplyTtsToPayload } from "../voice/tts/payload.js";
5
- import "./internal-outbound.js";
6
3
  import { ChannelHealthMonitor } from "./health-monitor.js";
7
- import { deliverOutboundMessage } from "./outbound/deliver.js";
8
- import { OutboundPersistStore } from "./outbound/persist-store.js";
9
- import { syncChannelPluginsFromManager } from "./plugins/registry.js";
10
- import { CHANNEL_RESTART_POLICY, computeBackoff } from "./restart-policy.js";
4
+ import { ChannelHeartbeatScheduler } from "./heartbeat-scheduler.js";
5
+ import { ChannelPluginRegistry } from "./plugin-registry.js";
6
+ import { ChannelOutboundSender } from "./outbound-sender.js";
7
+ import { ChannelLifecycleSupervisor } from "./lifecycle-supervisor.js";
11
8
  //#region src/channels/manager.ts
12
9
  init_logger();
13
10
  const log = createLogger("ChannelManager");
14
- function asChannelConfig(raw) {
15
- if (raw && typeof raw === "object" && !Array.isArray(raw)) return raw;
16
- }
17
11
  var ChannelManager = class {
18
- plugins = /* @__PURE__ */ new Map();
19
- /** Plugins that completed `init()` successfully (skipped channels are not listed). */
20
- initializedPluginIds = /* @__PURE__ */ new Set();
21
- bus;
22
12
  config;
23
- initialized = false;
24
- running = false;
25
- restartAttempts = /* @__PURE__ */ new Map();
26
- /** When set, failed-start auto-restart is suppressed for that channel id. */
27
- manuallyStopped = /* @__PURE__ */ new Set();
28
- heartbeatTimers = /* @__PURE__ */ new Map();
29
- outboundHooks;
30
- persistStore;
31
- _lastHeartbeatRestartAt = /* @__PURE__ */ new Map();
13
+ registry = new ChannelPluginRegistry();
32
14
  healthMonitor = new ChannelHealthMonitor();
15
+ lifecycle;
16
+ heartbeat;
17
+ outbound;
33
18
  sessionModelHooks;
34
- /** Plugins that skipped `start()` until `startDeferredConnects()` (see `ChannelMeta.deferConnectUntilAfterListen`). */
35
- deferredConnectPending = /* @__PURE__ */ new Set();
36
19
  constructor(config, bus) {
37
- this.bus = bus;
38
20
  this.config = config;
21
+ this.heartbeat = new ChannelHeartbeatScheduler({
22
+ getConfig: () => this.config,
23
+ healthMonitor: this.healthMonitor,
24
+ requestSoftRestart: (channelId) => {
25
+ this.lifecycle.softRestart(channelId);
26
+ }
27
+ });
28
+ this.lifecycle = new ChannelLifecycleSupervisor({
29
+ bus,
30
+ registry: this.registry,
31
+ getConfig: () => this.config,
32
+ getSessionModelHooks: () => this.sessionModelHooks,
33
+ onPluginStarted: (plugin) => this.heartbeat.schedule(plugin),
34
+ onPluginStopped: (pluginId) => this.heartbeat.clear(pluginId)
35
+ });
36
+ this.outbound = new ChannelOutboundSender({
37
+ registry: this.registry,
38
+ getConfig: () => this.config
39
+ });
39
40
  }
40
41
  setOutboundHooks(hooks) {
41
- this.outboundHooks = hooks;
42
+ this.outbound.setHooks(hooks);
42
43
  }
43
- /** Call before `initialize()` so plugins can persist per-session model overrides (e.g. Telegram /models UI). */
44
+ /** Call before `initialize()` so plugins can persist per-session model overrides. */
44
45
  setSessionModelHooks(hooks) {
45
46
  this.sessionModelHooks = hooks;
46
47
  }
47
48
  enableOutboundPersistence(agentDir) {
48
- this.persistStore = new OutboundPersistStore(agentDir);
49
- }
50
- /**
51
- * Redeliver persisted outbound items (after channels are started). Best-effort; may duplicate if prior send succeeded but ack did not.
52
- */
53
- async replayPendingOutboundMessages() {
54
- if (!this.persistStore) return;
55
- const pending = [...this.persistStore.peek()];
56
- for (const p of pending) try {
57
- await this.send(p.message, { skipPersist: true });
58
- this.persistStore.ack(p.id);
59
- } catch (err) {
60
- log.error({
61
- id: p.id,
62
- err
63
- }, "Failed to replay outbound message");
64
- }
49
+ this.outbound.enablePersistence(agentDir);
65
50
  }
66
51
  registerPlugin(plugin) {
67
- if (this.plugins.has(plugin.id)) log.warn({ channel: plugin.id }, "Channel plugin already registered, overwriting");
68
- this.plugins.set(plugin.id, plugin);
69
- syncChannelPluginsFromManager(this.getAllPlugins());
70
- log.debug({ channel: plugin.id }, "Registered channel plugin");
52
+ this.registry.register(plugin);
71
53
  }
72
54
  getPlugin(id) {
73
- return this.plugins.get(id);
74
- }
75
- /**
76
- * Optional channel hook before AgentService consumes an inbound message (e.g. Feishu card actions).
77
- */
78
- async dispatchInboundMessageAction(msg) {
79
- const handle = this.plugins.get(msg.channel)?.actions?.handleAction;
80
- if (!handle) return;
81
- const meta = msg.metadata;
82
- if (msg.channel !== "feishu" || meta?.feishuEventType !== "card.action.trigger") return;
83
- const cardAction = meta.cardAction;
84
- const actionTag = cardAction && typeof cardAction.tag === "string" && cardAction.tag.trim() ? cardAction.tag.trim() : "feishu.card_action";
85
- const cardCtx = meta.cardContext;
86
- const openMsg = cardCtx && typeof cardCtx.open_message_id === "string" ? cardCtx.open_message_id.trim() : "";
87
- const fallbackMsgId = typeof meta.messageId === "string" ? meta.messageId.trim() : "";
88
- const messageId = openMsg || fallbackMsgId;
89
- const accountId = typeof meta.accountId === "string" && meta.accountId.trim() ? meta.accountId.trim() : "default";
90
- try {
91
- await handle({
92
- action: actionTag,
93
- data: JSON.stringify({
94
- cardAction: meta.cardAction,
95
- cardContext: meta.cardContext,
96
- cardActionText: meta.cardActionText
97
- }),
98
- messageId,
99
- senderId: msg.sender_id,
100
- chatId: msg.chat_id,
101
- accountId,
102
- metadata: {
103
- feishuEventType: meta.feishuEventType,
104
- raw: meta.raw,
105
- sessionKey: meta.sessionKey,
106
- userContent: msg.content
107
- }
108
- });
109
- } catch (err) {
110
- const em = err instanceof Error ? err.message : String(err);
111
- log.error({
112
- err,
113
- channel: msg.channel,
114
- accountId,
115
- em
116
- }, "dispatchInboundMessageAction failed");
117
- }
55
+ return this.registry.get(id);
118
56
  }
119
57
  getAllPlugins() {
120
- return Array.from(this.plugins.values());
58
+ return this.registry.all();
121
59
  }
122
- async initialize() {
123
- if (this.initialized) {
124
- log.warn({ pluginCount: this.plugins.size }, "initialize() called again; channels already initialized — skipping");
125
- return;
126
- }
127
- const initPromises = [];
128
- for (const [id, plugin] of this.plugins) {
129
- const channelConfig = asChannelConfig(this.config.channels?.[id]);
130
- const initPromise = this.initializePlugin(plugin, channelConfig ?? {});
131
- initPromises.push(initPromise);
132
- }
133
- await Promise.allSettled(initPromises);
134
- this.initialized = true;
135
- log.info("All channel plugins initialized");
136
- }
137
- /**
138
- * Builtin channels require `channels.<id>.enabled`. Extension-managed channels run unless explicitly disabled.
139
- */
140
- shouldRunChannelPlugin(plugin, channelConfig) {
141
- if (plugin.extensionManagedConfig) return channelConfig?.enabled !== false;
142
- return !!channelConfig?.enabled;
143
- }
144
- async initializePlugin(plugin, channelConfig) {
145
- try {
146
- const options = {
147
- bus: this.bus,
148
- config: this.config,
149
- channelConfig,
150
- sessionModel: this.sessionModelHooks
151
- };
152
- await plugin.init(options);
153
- this.initializedPluginIds.add(plugin.id);
154
- log.debug({ channel: plugin.id }, "Channel plugin initialized");
155
- } catch (err) {
156
- log.error({
157
- channel: plugin.id,
158
- err
159
- }, "Failed to initialize channel plugin");
160
- }
60
+ /** Backward-compat alias for `getAllPlugins`. */
61
+ getAllChannels() {
62
+ return this.registry.all();
161
63
  }
162
- /**
163
- * Channel ids that would run and declare `meta.deferConnectUntilAfterListen` (for logging / metrics).
164
- */
165
- listDeferConnectChannelIds(cfg) {
166
- const out = [];
167
- for (const [id, plugin] of this.plugins) {
168
- const channelConfig = asChannelConfig(cfg.channels?.[id]);
169
- if (!this.shouldRunChannelPlugin(plugin, channelConfig)) continue;
170
- if (plugin.meta.deferConnectUntilAfterListen === true) out.push(id);
171
- }
172
- return out;
64
+ /** Channel IDs whose runtime reports connected (e.g. Telegram polling active). */
65
+ getRunningChannels() {
66
+ return this.registry.runningChannelIds(this.config, (id) => this.lifecycle.isInitialized(id));
173
67
  }
174
- /**
175
- * Phase 1: start every enabled channel except those in `deferConnectPluginIds` (they stay pending).
176
- */
177
- async start(options) {
178
- if (!this.initialized) throw new Error("Channels not initialized");
179
- if (this.running) {
180
- log.warn({ pluginCount: this.plugins.size }, "start() called while channels already running — skipping");
181
- return;
182
- }
183
- const deferIds = options?.deferConnectPluginIds ?? /* @__PURE__ */ new Set();
184
- this.deferredConnectPending.clear();
185
- const startPromises = [];
186
- for (const [id, plugin] of this.plugins) {
187
- const channelConfig = asChannelConfig(this.config.channels?.[id]);
188
- if (!this.shouldRunChannelPlugin(plugin, channelConfig)) continue;
189
- if (deferIds.has(id)) {
190
- this.deferredConnectPending.add(id);
191
- log.info({ channel: id }, "Channel connect deferred until HTTP listen");
192
- continue;
193
- }
194
- const startPromise = this.startPlugin(plugin, {}).catch((err) => {
195
- log.error({
196
- channel: id,
197
- err
198
- }, "Failed to start channel plugin");
199
- });
200
- startPromises.push(startPromise);
201
- }
202
- await Promise.allSettled(startPromises);
203
- this.running = true;
204
- log.info({ deferred: [...this.deferredConnectPending] }, this.deferredConnectPending.size > 0 ? "Channel plugins started (deferred connects pending)" : "All channel plugins started");
68
+ initialize() {
69
+ return this.lifecycle.initialize();
205
70
  }
206
- /** Phase 2: run `start()` for channels deferred at `start()`. No-op if none pending. */
207
- async startDeferredConnects() {
208
- if (this.deferredConnectPending.size === 0) return;
209
- if (!this.running) {
210
- log.warn("startDeferredConnects called before channel phase-1 start; skipping");
211
- return;
212
- }
213
- const ids = [...this.deferredConnectPending];
214
- this.deferredConnectPending.clear();
215
- const startPromises = [];
216
- for (const id of ids) {
217
- const plugin = this.plugins.get(id);
218
- if (!plugin) continue;
219
- const channelConfig = asChannelConfig(this.config.channels?.[id]);
220
- if (!this.shouldRunChannelPlugin(plugin, channelConfig)) continue;
221
- startPromises.push(this.startPlugin(plugin, {}).catch((err) => {
222
- log.error({
223
- channel: id,
224
- err
225
- }, "Failed to start deferred channel plugin");
226
- }));
227
- }
228
- await Promise.allSettled(startPromises);
229
- log.info({ channels: ids }, "Deferred channel connects completed");
71
+ start(options) {
72
+ return this.lifecycle.start(options);
230
73
  }
231
- async startPlugin(plugin, opts) {
232
- const options = {};
233
- try {
234
- await plugin.start(options);
235
- if (!opts.preserveRestartAttempts) this.restartAttempts.delete(plugin.id);
236
- this._scheduleHeartbeat(plugin);
237
- log.debug({ channel: plugin.id }, "Channel plugin started");
238
- } catch (err) {
239
- const attempt = (this.restartAttempts.get(plugin.id) ?? 0) + 1;
240
- this.restartAttempts.set(plugin.id, attempt);
241
- if (attempt <= CHANNEL_RESTART_POLICY.maxAttempts) {
242
- const delayMs = computeBackoff(CHANNEL_RESTART_POLICY, attempt);
243
- log.warn({
244
- channel: plugin.id,
245
- attempt,
246
- delayMs,
247
- err
248
- }, "Channel failed to start, scheduling restart");
249
- setTimeout(() => {
250
- if (this.manuallyStopped.has(plugin.id)) {
251
- log.debug({ channel: plugin.id }, "Skipping scheduled restart (manual stop)");
252
- return;
253
- }
254
- this.startPlugin(plugin, { preserveRestartAttempts: true }).catch((e) => {
255
- log.error({
256
- channel: plugin.id,
257
- err: e
258
- }, "Channel restart attempt failed");
259
- });
260
- }, delayMs);
261
- } else log.error({
262
- channel: plugin.id,
263
- err
264
- }, "Channel exceeded max restart attempts");
265
- }
74
+ startDeferredConnects() {
75
+ return this.lifecycle.startDeferredConnects();
266
76
  }
267
77
  async stop() {
268
- if (!this.running) return;
269
- this.deferredConnectPending.clear();
270
- const stopPromises = [];
271
- for (const id of this.initializedPluginIds) {
272
- const plugin = this.plugins.get(id);
273
- if (!plugin) continue;
274
- const stopPromise = this.stopPlugin(plugin).catch((err) => {
275
- log.error({
276
- channel: id,
277
- err
278
- }, "Failed to stop channel plugin");
279
- });
280
- stopPromises.push(stopPromise);
281
- }
282
- await Promise.allSettled(stopPromises);
283
- this.running = false;
284
- log.info("All channel plugins stopped");
78
+ await this.lifecycle.stop();
79
+ this.heartbeat.clearAll();
285
80
  }
286
- async stopPlugin(plugin) {
287
- this._clearHeartbeatTimers(plugin.id);
288
- await plugin.stop();
289
- log.info({ channel: plugin.id }, "Channel plugin stopped");
81
+ stopChannel(channelId) {
82
+ return this.lifecycle.stopChannel(channelId);
290
83
  }
291
- _clearHeartbeatTimers(pluginId) {
292
- const prefix = `${pluginId}:`;
293
- for (const key of [...this.heartbeatTimers.keys()]) if (key.startsWith(prefix)) {
294
- clearInterval(this.heartbeatTimers.get(key));
295
- this.heartbeatTimers.delete(key);
296
- }
84
+ startChannel(channelId) {
85
+ return this.lifecycle.startChannel(channelId);
297
86
  }
298
- _scheduleHeartbeat(plugin) {
299
- const hb = plugin.heartbeat;
300
- if (!hb) return;
301
- this._clearHeartbeatTimers(plugin.id);
302
- let accountIds = [];
303
- try {
304
- accountIds = plugin.config.listAccountIds(this.config);
305
- } catch (e) {
306
- log.warn({
307
- channel: plugin.id,
308
- err: e
309
- }, "Heartbeat: failed to list accounts");
310
- return;
311
- }
312
- for (const accountId of accountIds) {
313
- const key = `${plugin.id}:${accountId}`;
314
- const timer = setInterval(() => {
315
- (async () => {
316
- try {
317
- const r = await hb.check({
318
- cfg: this.config,
319
- accountId
320
- });
321
- this.healthMonitor.set(plugin.id, accountId, {
322
- healthy: r.healthy,
323
- lastCheckAt: Date.now(),
324
- detail: typeof r.details === "string" ? r.details : r.details != null ? JSON.stringify(r.details) : void 0
325
- });
326
- if (!r.healthy) {
327
- log.warn({
328
- channel: plugin.id,
329
- accountId,
330
- detail: r.details
331
- }, "Channel heartbeat unhealthy");
332
- const now = Date.now();
333
- if (now - (this._lastHeartbeatRestartAt.get(plugin.id) ?? 0) < 6e4) return;
334
- this._lastHeartbeatRestartAt.set(plugin.id, now);
335
- this._softRestartChannel(plugin.id);
336
- }
337
- } catch (err) {
338
- this.healthMonitor.set(plugin.id, accountId, {
339
- healthy: false,
340
- lastCheckAt: Date.now(),
341
- detail: err instanceof Error ? err.message : String(err)
342
- });
343
- log.error({
344
- channel: plugin.id,
345
- accountId,
346
- err
347
- }, "Channel heartbeat check failed");
348
- }
349
- })();
350
- }, hb.intervalMs);
351
- this.heartbeatTimers.set(key, timer);
352
- }
87
+ listDeferConnectChannelIds(cfg) {
88
+ return this.lifecycle.listDeferConnectChannelIds(cfg);
353
89
  }
354
- async _softRestartChannel(channelId) {
355
- if (this.manuallyStopped.has(channelId)) return;
356
- const plugin = this.plugins.get(channelId);
357
- if (!plugin || !this.initializedPluginIds.has(channelId)) return;
358
- this._clearHeartbeatTimers(channelId);
359
- try {
360
- await plugin.stop();
361
- await this.startPlugin(plugin, {});
362
- } catch (err) {
363
- log.error({
364
- channel: channelId,
365
- err
366
- }, "Channel soft restart after heartbeat failed");
367
- }
90
+ send(msg, options) {
91
+ return this.outbound.send(msg, options);
368
92
  }
369
- cloneOutbound(m) {
370
- return structuredClone(m);
371
- }
372
- async send(msg, options) {
373
- log.debug({
374
- type: msg.type,
375
- channel: msg.channel,
376
- chatId: msg.chat_id
377
- }, "Received outbound message");
378
- let processedMsg = await this.applyTtsIfNeeded(msg);
379
- const queueId = !options?.skipPersist && this.persistStore ? this.persistStore.enqueue(this.cloneOutbound(processedMsg)) : null;
380
- try {
381
- if (this.outboundHooks) {
382
- const hookResult = await this.outboundHooks.runMessageSending(processedMsg.chat_id, processedMsg.content ?? "", processedMsg.channel);
383
- if (!hookResult.send) {
384
- if (queueId) this.persistStore.ack(queueId);
385
- return;
386
- }
387
- processedMsg = {
388
- ...processedMsg,
389
- content: hookResult.content ?? processedMsg.content
390
- };
391
- }
392
- if (processedMsg.channel === "__xopc_internal") {
393
- log.debug({ chatId: processedMsg.chat_id }, "Outbound dropped (internal session — not a real channel)");
394
- if (queueId) this.persistStore.ack(queueId);
395
- return;
396
- }
397
- const plugin = this.plugins.get(processedMsg.channel);
398
- if (!plugin?.outbound) {
399
- log.error({ channel: processedMsg.channel }, "Unknown channel or no outbound adapter");
400
- if (queueId) this.persistStore.ack(queueId);
401
- return;
402
- }
403
- const result = await deliverOutboundMessage({
404
- cfg: this.config,
405
- plugin,
406
- processedMsg
407
- });
408
- if (this.outboundHooks) {
409
- const err = result && !result.success ? result.error : void 0;
410
- await this.outboundHooks.runMessageSent(processedMsg.chat_id, processedMsg.content ?? "", result?.success ?? false, err, processedMsg.channel);
411
- }
412
- if (!result) {
413
- if (queueId) this.persistStore.ack(queueId);
414
- return;
415
- }
416
- if (result.success) log.info({
417
- channel: processedMsg.channel,
418
- chatId: processedMsg.chat_id,
419
- messageId: result.messageId
420
- }, "Message sent");
421
- else log.error({
422
- channel: processedMsg.channel,
423
- chatId: processedMsg.chat_id,
424
- error: result.error
425
- }, "Failed to send message");
426
- if (queueId) this.persistStore.ack(queueId);
427
- } catch (err) {
428
- log.error({
429
- channel: processedMsg.channel,
430
- chatId: processedMsg.chat_id,
431
- err
432
- }, "Outbound send threw");
433
- if (!queueId) throw err;
434
- }
93
+ replayPendingOutboundMessages() {
94
+ return this.outbound.replayPending();
435
95
  }
436
96
  startStream(channel, chatId, accountId, opts) {
437
- const plugin = this.plugins.get(channel);
97
+ const plugin = this.registry.get(channel);
438
98
  if (!plugin) {
439
99
  log.error({ channel }, "Unknown channel");
440
100
  return null;
@@ -447,7 +107,7 @@ var ChannelManager = class {
447
107
  }) ?? null;
448
108
  }
449
109
  async getChannelStatus(channel) {
450
- const plugin = this.plugins.get(channel);
110
+ const plugin = this.registry.get(channel);
451
111
  if (!plugin) return { error: "Unknown channel" };
452
112
  if (!plugin.status?.buildChannelSummary) return { status: "unknown" };
453
113
  try {
@@ -468,100 +128,70 @@ var ChannelManager = class {
468
128
  return { error: String(err) };
469
129
  }
470
130
  }
131
+ /**
132
+ * Optional channel hook before `AgentService` consumes an inbound message
133
+ * (e.g. Feishu card-action triggers).
134
+ */
135
+ async dispatchInboundMessageAction(msg) {
136
+ const handle = this.registry.get(msg.channel)?.actions?.handleAction;
137
+ if (!handle) return;
138
+ const meta = msg.metadata;
139
+ if (msg.channel !== "feishu" || meta?.feishuEventType !== "card.action.trigger") return;
140
+ const cardAction = meta.cardAction;
141
+ const actionTag = cardAction && typeof cardAction.tag === "string" && cardAction.tag.trim() ? cardAction.tag.trim() : "feishu.card_action";
142
+ const cardCtx = meta.cardContext;
143
+ const openMsg = cardCtx && typeof cardCtx.open_message_id === "string" ? cardCtx.open_message_id.trim() : "";
144
+ const fallbackMsgId = typeof meta.messageId === "string" ? meta.messageId.trim() : "";
145
+ const messageId = openMsg || fallbackMsgId;
146
+ const accountId = typeof meta.accountId === "string" && meta.accountId.trim() ? meta.accountId.trim() : "default";
147
+ try {
148
+ await handle({
149
+ action: actionTag,
150
+ data: JSON.stringify({
151
+ cardAction: meta.cardAction,
152
+ cardContext: meta.cardContext,
153
+ cardActionText: meta.cardActionText
154
+ }),
155
+ messageId,
156
+ senderId: msg.sender_id,
157
+ chatId: msg.chat_id,
158
+ accountId,
159
+ metadata: {
160
+ feishuEventType: meta.feishuEventType,
161
+ raw: meta.raw,
162
+ sessionKey: meta.sessionKey,
163
+ userContent: msg.content
164
+ }
165
+ });
166
+ } catch (err) {
167
+ const em = err instanceof Error ? err.message : String(err);
168
+ log.error({
169
+ err,
170
+ channel: msg.channel,
171
+ accountId,
172
+ em
173
+ }, "dispatchInboundMessageAction failed");
174
+ }
175
+ }
471
176
  async updateConfig(config) {
472
177
  this.config = config;
473
- for (const id of this.initializedPluginIds) {
474
- const plugin = this.plugins.get(id);
475
- if (plugin?.onConfigUpdated) await Promise.resolve(plugin.onConfigUpdated(config));
476
- }
178
+ await this.lifecycle.forwardConfigUpdate(config);
477
179
  log.info("Channel config updated");
478
180
  }
479
181
  /** Replace in-memory config without running plugin `onConfigUpdated` hooks. */
480
182
  setRuntimeConfig(config) {
481
183
  this.config = config;
482
184
  }
483
- async applyTtsIfNeeded(msg) {
484
- if (msg.type && msg.type !== "message") return msg;
485
- if (!msg.content?.trim()) return msg;
486
- if (msg.mediaUrl) return msg;
487
- const ttsConfig = mergeTtsConfigFromAppConfig(this.config.messages?.tts);
488
- if (!ttsConfig.enabled) return msg;
489
- const inboundAudio = msg.metadata?.transcribedVoice === true;
490
- return maybeApplyTtsToPayload(msg, {
491
- config: ttsConfig,
492
- channel: msg.channel,
493
- inboundAudio,
494
- appConfig: this.config
495
- });
496
- }
497
- /**
498
- * Stop a single channel and suppress automatic restart until `startChannel` is called.
499
- */
500
- async stopChannel(channelId) {
501
- this.manuallyStopped.add(channelId);
502
- const plugin = this.plugins.get(channelId);
503
- if (!plugin || !this.initializedPluginIds.has(channelId)) return;
504
- await this.stopPlugin(plugin).catch((err) => {
505
- log.error({
506
- channel: channelId,
507
- err
508
- }, "Failed to stop channel plugin");
509
- });
510
- }
511
- /**
512
- * Clear manual-stop and start one channel (requires prior `initialize()`).
513
- */
514
- async startChannel(channelId) {
515
- this.manuallyStopped.delete(channelId);
516
- const plugin = this.plugins.get(channelId);
517
- if (!plugin) {
518
- log.warn({ channel: channelId }, "Unknown channel");
519
- return;
520
- }
521
- if (!this.initialized) {
522
- log.warn({ channel: channelId }, "Channels not initialized");
523
- return;
524
- }
525
- const channelConfig = asChannelConfig(this.config.channels?.[channelId]);
526
- if (!this.shouldRunChannelPlugin(plugin, channelConfig)) {
527
- log.debug({ channel: channelId }, "Channel disabled in config, skipping start");
528
- return;
529
- }
530
- if (!this.initializedPluginIds.has(channelId)) {
531
- log.warn({ channel: channelId }, "Channel was never initialized; call initialize() first");
532
- return;
533
- }
534
- await this.startPlugin(plugin, {});
535
- }
536
185
  getRuntimeSnapshot() {
537
186
  return {
538
- initialized: this.initialized,
539
- running: this.running,
540
- pluginIds: [...this.plugins.keys()],
541
- initializedPluginIds: [...this.initializedPluginIds],
542
- manuallyStopped: [...this.manuallyStopped],
543
- restartAttempts: Object.fromEntries(this.restartAttempts),
187
+ ...this.lifecycle.snapshot(),
188
+ pluginIds: this.registry.ids(),
544
189
  channelHealth: this.healthMonitor.toJSON()
545
190
  };
546
191
  }
547
192
  getHealthMonitor() {
548
193
  return this.healthMonitor;
549
194
  }
550
- /**
551
- * Channel IDs whose runtime reports connected (e.g. Telegram polling active).
552
- */
553
- getRunningChannels() {
554
- const result = [];
555
- for (const id of this.initializedPluginIds) {
556
- const plugin = this.plugins.get(id);
557
- if (!plugin?.channelIsRunning) continue;
558
- if (plugin.channelIsRunning(this.config)) result.push(id);
559
- }
560
- return result;
561
- }
562
- getAllChannels() {
563
- return this.getAllPlugins();
564
- }
565
195
  };
566
196
  function createChannelManager(config, bus) {
567
197
  return new ChannelManager(config, bus);