@xopcai/xopc 0.0.105 → 0.0.107

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 (430) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/dashscope/xopc.extension.json +7 -2
  3. package/dist/extensions/fal/xopc.extension.json +7 -2
  4. package/dist/extensions/feishu/src/adapters/gateway-setup.js +22 -26
  5. package/dist/extensions/feishu/src/adapters/gateway-setup.js.map +1 -1
  6. package/dist/extensions/feishu/src/directory/directory-adapter.js +1 -1
  7. package/dist/extensions/feishu/src/directory/directory-adapter.js.map +1 -1
  8. package/dist/extensions/feishu/src/outbound/media-load.js +1 -1
  9. package/dist/extensions/feishu/src/outbound/outbound-adapter.js +4 -3
  10. package/dist/extensions/feishu/src/outbound/outbound-adapter.js.map +1 -1
  11. package/dist/extensions/feishu/src/plugin.d.ts +6 -3
  12. package/dist/extensions/feishu/src/plugin.js +59 -40
  13. package/dist/extensions/feishu/src/plugin.js.map +1 -1
  14. package/dist/extensions/feishu/src/streaming/streaming-adapter.js +20 -16
  15. package/dist/extensions/feishu/src/streaming/streaming-adapter.js.map +1 -1
  16. package/dist/extensions/feishu/src/transport/socket-mode/monitor.js +1 -1
  17. package/dist/extensions/feishu/src/transport/webhook/monitor.js +1 -1
  18. package/dist/extensions/feishu/src/workflow-progress.d.ts +1 -1
  19. package/dist/extensions/feishu/src/workflow-progress.js +3 -3
  20. package/dist/extensions/feishu/src/workflow-progress.js.map +1 -1
  21. package/dist/extensions/feishu/xopc.extension.json +458 -26
  22. package/dist/extensions/google/xopc.extension.json +7 -2
  23. package/dist/extensions/minimax/xopc.extension.json +8 -2
  24. package/dist/extensions/openai/xopc.extension.json +7 -2
  25. package/dist/extensions/telegram/src/adapters/gateway-setup.js +8 -6
  26. package/dist/extensions/telegram/src/adapters/gateway-setup.js.map +1 -1
  27. package/dist/extensions/telegram/src/adapters/streaming-adapter.js +1 -1
  28. package/dist/extensions/telegram/src/command-handler.d.ts +1 -1
  29. package/dist/extensions/telegram/src/command-handler.js +11 -9
  30. package/dist/extensions/telegram/src/command-handler.js.map +1 -1
  31. package/dist/extensions/telegram/src/inbound-processor.js +2 -3
  32. package/dist/extensions/telegram/src/inbound-processor.js.map +1 -1
  33. package/dist/extensions/telegram/src/plugin.d.ts +1 -0
  34. package/dist/extensions/telegram/src/plugin.js +7 -7
  35. package/dist/extensions/telegram/src/plugin.js.map +1 -1
  36. package/dist/extensions/telegram/src/routing-integration.js +2 -2
  37. package/dist/extensions/telegram/src/update-offset-store.js +1 -1
  38. package/dist/extensions/telegram/src/workflow-progress.d.ts +1 -1
  39. package/dist/extensions/telegram/src/workflow-progress.js +1 -1
  40. package/dist/extensions/telegram/src/workflow-progress.js.map +1 -1
  41. package/dist/extensions/telegram/xopc.extension.json +10 -2
  42. package/dist/extensions/weixin/src/api/api.js +2 -2
  43. package/dist/extensions/weixin/src/auth/accounts.js +1 -1
  44. package/dist/extensions/weixin/src/cdn/upload.js +1 -1
  45. package/dist/extensions/weixin/src/cli/gateway-qr-login.d.ts +4 -0
  46. package/dist/extensions/weixin/src/cli/gateway-qr-login.js +34 -5
  47. package/dist/extensions/weixin/src/cli/gateway-qr-login.js.map +1 -1
  48. package/dist/extensions/weixin/src/cli/qr-login.js +4 -3
  49. package/dist/extensions/weixin/src/cli/qr-login.js.map +1 -1
  50. package/dist/extensions/weixin/src/media/data-url.js +1 -1
  51. package/dist/extensions/weixin/src/messaging/debug-mode.js +1 -1
  52. package/dist/extensions/weixin/src/messaging/inbound.js +1 -1
  53. package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
  54. package/dist/extensions/weixin/src/plugin.d.ts +1 -0
  55. package/dist/extensions/weixin/src/plugin.js +8 -7
  56. package/dist/extensions/weixin/src/plugin.js.map +1 -1
  57. package/dist/extensions/weixin/src/storage/sync-buf.js +1 -1
  58. package/dist/extensions/weixin/src/workflow-progress.d.ts +1 -1
  59. package/dist/extensions/weixin/src/workflow-progress.js +1 -1
  60. package/dist/extensions/weixin/src/workflow-progress.js.map +1 -1
  61. package/dist/extensions/weixin/xopc.extension.json +57 -14
  62. package/dist/gateway/static/root/apple-touch-icon.png +0 -0
  63. package/dist/gateway/static/root/assets/agents-BXg2_mE4.js +78 -0
  64. package/dist/gateway/static/root/assets/apps-page-CJqQ-7Ss.js +1 -0
  65. package/dist/gateway/static/root/assets/channels-settings-DvMZ6NAd.js +1 -0
  66. package/dist/gateway/static/root/assets/cron-page-BPBlvSl5.js +1 -0
  67. package/dist/gateway/static/root/assets/{dist-DJDkNhu5.js → dist-CZh0c-s8.js} +1 -1
  68. package/dist/gateway/static/root/assets/{extension-debug-page-DI1XJTJi.js → extension-debug-page-DyJQR0SR.js} +1 -1
  69. package/dist/gateway/static/root/assets/{extension-page-SuafGTT_.js → extension-page-CDTuUr9B.js} +1 -1
  70. package/dist/gateway/static/root/assets/{extension-settings-page-cKmGax9v.js → extension-settings-page-DszZ8zHD.js} +1 -1
  71. package/dist/gateway/static/root/assets/{fetch-CkvRO30i.js → fetch-CFdKBnE6.js} +1 -1
  72. package/dist/gateway/static/root/assets/{gateway-startup-retry-BkKyRDrF.js → gateway-startup-retry-DdngdObI.js} +1 -1
  73. package/dist/gateway/static/root/assets/{heartbeat-config-api-CRiDcxtt.js → heartbeat-config-api-U10wnPdc.js} +1 -1
  74. package/dist/gateway/static/root/assets/index-DBc-bVOQ.js +4845 -0
  75. package/dist/gateway/static/root/assets/index-DI5_GsZt.css +1 -0
  76. package/dist/gateway/static/root/assets/{logs-page-DM8o5-Bm.js → logs-page-B6js8Bfi.js} +2 -2
  77. package/dist/gateway/static/root/assets/{note-detail-page-j53jtvq9.js → note-detail-page-DFzAXR35.js} +4 -4
  78. package/dist/gateway/static/root/assets/{note-time-Ck2H2Qpw.js → note-time-DOiSU-10.js} +1 -1
  79. package/dist/gateway/static/root/assets/notes-page-DAuZJMT8.js +1 -0
  80. package/dist/gateway/static/root/assets/{schema-form-BvmGNxiJ.js → schema-form-zM36dvbY.js} +1 -1
  81. package/dist/gateway/static/root/assets/sessions-page-CAsV03BY.js +1 -0
  82. package/dist/gateway/static/root/assets/{settings-advanced-gate-DRdayl8P.js → settings-advanced-gate-BCvObK1y.js} +1 -1
  83. package/dist/gateway/static/root/assets/{settings-form-section-BlIYg2gZ.js → settings-form-section-Bvl-RInc.js} +1 -1
  84. package/dist/gateway/static/root/assets/settings-page-DuCJDd74.js +3 -0
  85. package/dist/gateway/static/root/assets/{share-preview-page-BlT6Akvk.js → share-preview-page-rpL4DDTO.js} +1 -1
  86. package/dist/gateway/static/root/assets/skills-page--BioR9J4.js +2 -0
  87. package/dist/gateway/static/root/assets/{theme-store-DYgVdRB4.js → theme-store-BZozwAeK.js} +1 -1
  88. package/dist/gateway/static/root/assets/url-DQRqHuL-.js +3 -0
  89. package/dist/gateway/static/root/assets/voice-api-key-field-D2RJaoj_.js +1 -0
  90. package/dist/gateway/static/root/assets/{workflow-page.utils-_sjXCMvi.js → workflow-page.utils-BxacHYen.js} +1 -1
  91. package/dist/gateway/static/root/assets/workflows-page-B1B-est-.js +18 -0
  92. package/dist/gateway/static/root/favicon-16.png +0 -0
  93. package/dist/gateway/static/root/favicon-32.png +0 -0
  94. package/dist/gateway/static/root/favicon.ico +0 -0
  95. package/dist/gateway/static/root/favicon.svg +18 -0
  96. package/dist/gateway/static/root/index.html +11 -10
  97. package/dist/package.js +1 -1
  98. package/dist/src/agent/agent-manager.js +7 -7
  99. package/dist/src/agent/agent-scope.js +1 -1
  100. package/dist/src/agent/bootstrap/load-bootstrap-files.js +1 -1
  101. package/dist/src/agent/context/workspace-seed.js +2 -2
  102. package/dist/src/agent/context/workspace-state.js +1 -1
  103. package/dist/src/agent/goals/goal-run-store.js +4 -4
  104. package/dist/src/agent/goals/persistent-goal-service.js +1 -1
  105. package/dist/src/agent/goals/post-turn.js +2 -2
  106. package/dist/src/agent/image/load-image-media.js +2 -2
  107. package/dist/src/agent/ipc/bus.js +1 -1
  108. package/dist/src/agent/ipc/inbox.js +2 -2
  109. package/dist/src/agent/ipc/socket.js +1 -1
  110. package/dist/src/agent/mcp/bundle-mcp-config.js +16 -8
  111. package/dist/src/agent/mcp/bundle-mcp-config.js.map +1 -1
  112. package/dist/src/agent/mcp/bundle-mcp-materialize.js +1 -1
  113. package/dist/src/agent/mcp/bundle-mcp-policy.js +2 -2
  114. package/dist/src/agent/mcp/bundle-mcp-policy.js.map +1 -1
  115. package/dist/src/agent/mcp/bundle-mcp-runtime.js +2 -2
  116. package/dist/src/agent/mcp/mcp-http.js +1 -1
  117. package/dist/src/agent/mcp/mcp-http.js.map +1 -1
  118. package/dist/src/agent/mcp/mcp-transport-config.js +3 -7
  119. package/dist/src/agent/mcp/mcp-transport-config.js.map +1 -1
  120. package/dist/src/agent/mcp/mcp-transport.js +1 -1
  121. package/dist/src/agent/memory/builtin-memory-store.js +1 -1
  122. package/dist/src/agent/memory/dreaming/deep-promotion.js +1 -1
  123. package/dist/src/agent/memory/dreaming/events.js +1 -1
  124. package/dist/src/agent/memory/dreaming/last-run.js +1 -1
  125. package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
  126. package/dist/src/agent/memory/dreaming/preview.js +1 -1
  127. package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
  128. package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
  129. package/dist/src/agent/memory/dreaming/utils.js +1 -1
  130. package/dist/src/agent/memory/memory-flush.js +1 -1
  131. package/dist/src/agent/memory/plugin-discovery.js +1 -1
  132. package/dist/src/agent/models/manager.js +1 -1
  133. package/dist/src/agent/prompt/service-prompt-builder.js +2 -2
  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 +2 -2
  137. package/dist/src/agent/service.js +4 -4
  138. package/dist/src/agent/session/session-inspector.js +1 -1
  139. package/dist/src/agent/skills/config.js +1 -1
  140. package/dist/src/agent/skills/hub-hash.js +2 -2
  141. package/dist/src/agent/skills/hub-lock.js +1 -1
  142. package/dist/src/agent/skills/hub-pull.js +2 -2
  143. package/dist/src/agent/skills/index.js +1 -1
  144. package/dist/src/agent/skills/managed-store.js +1 -1
  145. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.d.ts +4 -0
  146. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js +4 -2
  147. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js.map +1 -1
  148. package/dist/src/agent/skills/scanner.js +1 -1
  149. package/dist/src/agent/skills/skill-manage-ops.js +1 -1
  150. package/dist/src/agent/skills/skill-manager.js +1 -1
  151. package/dist/src/agent/starter-agents.d.ts +19 -0
  152. package/dist/src/agent/starter-agents.js +190 -0
  153. package/dist/src/agent/starter-agents.js.map +1 -0
  154. package/dist/src/agent/tools/dreaming-tool.js +1 -1
  155. package/dist/src/agent/tools/factory.js +1 -1
  156. package/dist/src/agent/tools/image-generate-tool.js +1 -1
  157. package/dist/src/agent/tools/send-media.js +1 -1
  158. package/dist/src/agent/tools/skill-manage-tool.js +1 -1
  159. package/dist/src/agent/tools/workflow-tool.js +1 -1
  160. package/dist/src/agent/tools/write.js +1 -1
  161. package/dist/src/agent/workflow/catalog.js +1 -1
  162. package/dist/src/agent/workflow/index.js +2 -1
  163. package/dist/src/agent/workflow/runtime.d.ts +2 -2
  164. package/dist/src/agent/workflow/runtime.js +50 -29
  165. package/dist/src/agent/workflow/runtime.js.map +1 -1
  166. package/dist/src/agent/workflow/snapshot-empty.d.ts +2 -0
  167. package/dist/src/agent/workflow/snapshot-empty.js +19 -0
  168. package/dist/src/agent/workflow/snapshot-empty.js.map +1 -0
  169. package/dist/src/agent/workflow/snapshot.js +1 -1
  170. package/dist/src/agent/workflow/snapshot.js.map +1 -1
  171. package/dist/src/agent/workflow/types.d.ts +11 -0
  172. package/dist/src/auth/credentials.js +3 -3
  173. package/dist/src/auth/profiles/store.js +2 -2
  174. package/dist/src/auth/sync-provider-auth.js +1 -1
  175. package/dist/src/browser/cache-dir-policy.js +1 -1
  176. package/dist/src/browser/cdp-local-launcher.js +2 -2
  177. package/dist/src/browser/providers/browser-ext-install.js +3 -3
  178. package/dist/src/browser/providers/cloakbrowser.js +4 -4
  179. package/dist/src/browser/providers/playwright-doctor.js +1 -1
  180. package/dist/src/browser/stealth.js +1 -1
  181. package/dist/src/channels/catalog/channel-catalog-service.js +13 -0
  182. package/dist/src/channels/catalog/channel-catalog-service.js.map +1 -1
  183. package/dist/src/channels/outbound/persist-store.js +1 -1
  184. package/dist/src/channels/pairing/allow-from-file.js +1 -1
  185. package/dist/src/channels/pairing/pairing-store.js +2 -2
  186. package/dist/src/channels/plugins/types.adapters.d.ts +2 -0
  187. package/dist/src/chat-commands/agent-edit.js +2 -2
  188. package/dist/src/chat-commands/builtins/config.js +2 -2
  189. package/dist/src/chat-commands/context.js +1 -1
  190. package/dist/src/cli/commands/config.js +1 -1
  191. package/dist/src/cli/commands/doctor/checks/config-health.js +1 -1
  192. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
  193. package/dist/src/cli/commands/doctor/checks/state-integrity.js +1 -1
  194. package/dist/src/cli/commands/doctor/checks/workspace-status.js +1 -1
  195. package/dist/src/cli/commands/extension-create.d.ts +2 -0
  196. package/dist/src/cli/commands/extension-create.js +165 -0
  197. package/dist/src/cli/commands/extension-create.js.map +1 -0
  198. package/dist/src/cli/commands/extension-dev.js +1 -3
  199. package/dist/src/cli/commands/extension-dev.js.map +1 -1
  200. package/dist/src/cli/commands/extension-marketplace.js +105 -81
  201. package/dist/src/cli/commands/extension-marketplace.js.map +1 -1
  202. package/dist/src/cli/commands/extension-pack.d.ts +13 -0
  203. package/dist/src/cli/commands/extension-pack.js +159 -91
  204. package/dist/src/cli/commands/extension-pack.js.map +1 -1
  205. package/dist/src/cli/commands/extension.d.ts +2 -0
  206. package/dist/src/cli/commands/extension.js +375 -3
  207. package/dist/src/cli/commands/extension.js.map +1 -1
  208. package/dist/src/cli/commands/gateway/logs.js +1 -1
  209. package/dist/src/cli/commands/gateway/run-foreground.js +1 -2
  210. package/dist/src/cli/commands/gateway/run-foreground.js.map +1 -1
  211. package/dist/src/cli/commands/image.js +1 -1
  212. package/dist/src/cli/commands/init.js +3 -3
  213. package/dist/src/cli/commands/models.js +1 -1
  214. package/dist/src/cli/commands/onboard/model.js +2 -2
  215. package/dist/src/cli/commands/onboard.js +0 -2
  216. package/dist/src/cli/commands/onboard.js.map +1 -1
  217. package/dist/src/cli/commands/setup.js +0 -2
  218. package/dist/src/cli/commands/setup.js.map +1 -1
  219. package/dist/src/cli/utils/init-workspace-core.js +10 -7
  220. package/dist/src/cli/utils/init-workspace-core.js.map +1 -1
  221. package/dist/src/config/agent-profile.js +1 -1
  222. package/dist/src/config/agent-typed-models.js +1 -1
  223. package/dist/src/config/gateway-bind.js +1 -1
  224. package/dist/src/config/index.js +5 -5
  225. package/dist/src/config/loader.js +2 -2
  226. package/dist/src/config/models-json.js +2 -2
  227. package/dist/src/config/paths-state.js +1 -1
  228. package/dist/src/config/paths.d.ts +2 -2
  229. package/dist/src/config/paths.js +6 -5
  230. package/dist/src/config/paths.js.map +1 -1
  231. package/dist/src/config/profile.js +2 -2
  232. package/dist/src/config/schema.d.ts +2 -0
  233. package/dist/src/config/schema.js +3 -1
  234. package/dist/src/config/schema.js.map +1 -1
  235. package/dist/src/config/workspace-path.js +1 -1
  236. package/dist/src/connectors/health.js +1 -1
  237. package/dist/src/connectors/install.js +1 -1
  238. package/dist/src/cron/executor.js +2 -2
  239. package/dist/src/cron/persistence.js +1 -1
  240. package/dist/src/daemon/constants.js +1 -1
  241. package/dist/src/daemon/install-plan.js +2 -2
  242. package/dist/src/daemon/launchd.js +2 -2
  243. package/dist/src/daemon/schtasks.js +2 -2
  244. package/dist/src/daemon/systemd.js +2 -2
  245. package/dist/src/extensions/api.d.ts +4 -2
  246. package/dist/src/extensions/api.js +31 -12
  247. package/dist/src/extensions/api.js.map +1 -1
  248. package/dist/src/extensions/bundle-mcp.js +1 -1
  249. package/dist/src/extensions/discover-extensions.js +2 -1
  250. package/dist/src/extensions/discover-extensions.js.map +1 -1
  251. package/dist/src/extensions/health.js +1 -1
  252. package/dist/src/extensions/install.d.ts +1 -0
  253. package/dist/src/extensions/install.js +51 -8
  254. package/dist/src/extensions/install.js.map +1 -1
  255. package/dist/src/extensions/loader.d.ts +0 -4
  256. package/dist/src/extensions/loader.js +55 -88
  257. package/dist/src/extensions/loader.js.map +1 -1
  258. package/dist/src/extensions/lockfile.d.ts +9 -1
  259. package/dist/src/extensions/lockfile.js +2 -2
  260. package/dist/src/extensions/lockfile.js.map +1 -1
  261. package/dist/src/extensions/normalize-manifest.js +20 -4
  262. package/dist/src/extensions/normalize-manifest.js.map +1 -1
  263. package/dist/src/extensions/package-contract.d.ts +12 -0
  264. package/dist/src/extensions/package-contract.js +59 -0
  265. package/dist/src/extensions/package-contract.js.map +1 -0
  266. package/dist/src/extensions/sdk/core.d.ts +1 -1
  267. package/dist/src/extensions/sdk/index.d.ts +1 -1
  268. package/dist/src/extensions/sdk/index.js.map +1 -1
  269. package/dist/src/extensions/types/manifest.d.ts +15 -0
  270. package/dist/src/extensions/update.js +1 -1
  271. package/dist/src/gateway/agents-admin.d.ts +0 -8
  272. package/dist/src/gateway/agents-admin.js +3 -28
  273. package/dist/src/gateway/agents-admin.js.map +1 -1
  274. package/dist/src/gateway/file-path-classifier.js +2 -2
  275. package/dist/src/gateway/heartbeat/service.js +1 -1
  276. package/dist/src/gateway/hono/lib/config-payload.js +1 -1
  277. package/dist/src/gateway/hono/lib/extension-store.js +2 -2
  278. package/dist/src/gateway/hono/lib/static-ui.js +2 -2
  279. package/dist/src/gateway/hono/oauth-async.js +1 -1
  280. package/dist/src/gateway/hono/oauth.js +1 -1
  281. package/dist/src/gateway/hono/routes/agents.js +2 -56
  282. package/dist/src/gateway/hono/routes/agents.js.map +1 -1
  283. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
  284. package/dist/src/gateway/hono/routes/channels.js +10 -1
  285. package/dist/src/gateway/hono/routes/channels.js.map +1 -1
  286. package/dist/src/gateway/hono/routes/config-patch/misc.js +1 -1
  287. package/dist/src/gateway/hono/routes/dreaming.js +1 -1
  288. package/dist/src/gateway/hono/routes/host-fs.js +2 -2
  289. package/dist/src/gateway/hono/routes/mcp.js +1 -1
  290. package/dist/src/gateway/hono/routes/models.js +1 -1
  291. package/dist/src/gateway/hono/routes/shares.js +1 -1
  292. package/dist/src/gateway/hono/routes/workflows.js +130 -0
  293. package/dist/src/gateway/hono/routes/workflows.js.map +1 -1
  294. package/dist/src/gateway/hono/routes/workspace.js +2 -2
  295. package/dist/src/gateway/lock.js +3 -3
  296. package/dist/src/gateway/ports.js +1 -1
  297. package/dist/src/gateway/service/agent-runner.js +2 -2
  298. package/dist/src/gateway/service/marketplace-service.js +2 -2
  299. package/dist/src/gateway/service.d.ts +2 -0
  300. package/dist/src/gateway/service.js +45 -1
  301. package/dist/src/gateway/service.js.map +1 -1
  302. package/dist/src/gateway/workspace-fs-file-list.js +1 -1
  303. package/dist/src/heartbeat/index.js +1 -1
  304. package/dist/src/infra/brew.js +1 -1
  305. package/dist/src/infra/package-json.js +1 -1
  306. package/dist/src/infra/package-update-steps.js +1 -1
  307. package/dist/src/infra/path-env.js +2 -2
  308. package/dist/src/infra/restart.js +2 -2
  309. package/dist/src/infra/stable-node-path.js +1 -1
  310. package/dist/src/infra/update-check.js +1 -1
  311. package/dist/src/infra/update-global.js +1 -1
  312. package/dist/src/infra/update-lock.js +3 -3
  313. package/dist/src/infra/update-runner.js +1 -1
  314. package/dist/src/infra/update-startup.js +2 -2
  315. package/dist/src/infra/write-file-atomic.js +2 -2
  316. package/dist/src/media/store.js +1 -1
  317. package/dist/src/notes/agent-context.d.ts +12 -4
  318. package/dist/src/notes/agent-context.js +1 -1
  319. package/dist/src/notes/agent-context.js.map +1 -1
  320. package/dist/src/notes/store.js +2 -2
  321. package/dist/src/project-trust/trust-store.js +2 -2
  322. package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
  323. package/dist/src/providers/index.js +2 -2
  324. package/dist/src/providers/model-registry.js +1 -1
  325. package/dist/src/session/init-session-turn.js +2 -2
  326. package/dist/src/session/resolve-session.js +3 -3
  327. package/dist/src/session/session-title.js +2 -2
  328. package/dist/src/session/store.js +2 -2
  329. package/dist/src/share/share-auto.js +2 -2
  330. package/dist/src/share/share-store.js +3 -3
  331. package/dist/src/share/share-thumbnail.js +2 -2
  332. package/dist/src/share/share-zip.js +1 -1
  333. package/dist/src/share/site-share-store.js +3 -3
  334. package/dist/src/share/site-static-serve.js +1 -1
  335. package/dist/src/storage/sqlite/connection.js +2 -2
  336. package/dist/src/storage/sqlite/memory-index-repository.js +2 -2
  337. package/dist/src/storage/sqlite/migrations/discover.js +1 -1
  338. package/dist/src/storage/sqlite/migrations/runner.js +1 -1
  339. package/dist/src/storage/sqlite/schema.js +1 -1
  340. package/dist/src/tui/backends/embedded-backend.js +1 -8
  341. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  342. package/dist/src/tui/backends/gateway-sse-backend.js +0 -7
  343. package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
  344. package/dist/src/tui/clipboard-image.js +3 -3
  345. package/dist/src/tui/theme-manager.js +1 -1
  346. package/dist/src/tui/tui-backend.d.ts +0 -1
  347. package/dist/src/tui/tui-command-formatters.js +3 -3
  348. package/dist/src/tui/tui-commands.js +3 -3
  349. package/dist/src/tui/tui-commands.js.map +1 -1
  350. package/dist/src/tui/tui-keybindings-file.js +1 -1
  351. package/dist/src/tui/tui-picker-overlay.js +1 -1
  352. package/dist/src/tui/tui-picker-overlay.js.map +1 -1
  353. package/dist/src/tui/tui-scoped-models.js +2 -2
  354. package/dist/src/tui/tui-settings.js +1 -1
  355. package/dist/src/tui/tui-startup-resources.js +2 -2
  356. package/dist/src/tui/tui.js +5 -5
  357. package/dist/src/tunnel/frpc-binary.js +3 -3
  358. package/dist/src/tunnel/frpc-config.js +1 -1
  359. package/dist/src/tunnel/frpc-extract.js +1 -1
  360. package/dist/src/tunnel/tunnel-state.js +1 -1
  361. package/dist/src/utils/logger/audit.js +1 -1
  362. package/dist/src/utils/logger/log-store.js +1 -1
  363. package/dist/src/utils/logger/rotation.js +1 -1
  364. package/dist/src/voice/stt/availability.d.ts +6 -0
  365. package/dist/src/voice/stt/availability.js +14 -6
  366. package/dist/src/voice/stt/availability.js.map +1 -1
  367. package/dist/src/voice/stt/index.js +2 -1
  368. package/dist/src/voice/stt/index.js.map +1 -1
  369. package/dist/src/voice/stt/mention.d.ts +2 -0
  370. package/dist/src/voice/stt/mention.js +20 -0
  371. package/dist/src/voice/stt/mention.js.map +1 -0
  372. package/dist/src/voice/stt/preflight.d.ts +1 -4
  373. package/dist/src/voice/stt/preflight.js +1 -18
  374. package/dist/src/voice/stt/preflight.js.map +1 -1
  375. package/dist/src/voice/tts/audio.js +1 -1
  376. package/dist/src/voice/tts/providers/edge-speech.js +2 -2
  377. package/dist/src/workflows/domain/definition-utils.d.ts +1 -0
  378. package/dist/src/workflows/domain/definition-utils.js +32 -2
  379. package/dist/src/workflows/domain/definition-utils.js.map +1 -1
  380. package/dist/src/workflows/domain/definition.d.ts +2 -0
  381. package/dist/src/workflows/domain/event.d.ts +2 -1
  382. package/dist/src/workflows/domain/index.d.ts +1 -0
  383. package/dist/src/workflows/domain/index.js +3 -2
  384. package/dist/src/workflows/domain/run.d.ts +27 -1
  385. package/dist/src/workflows/domain/run.js.map +1 -1
  386. package/dist/src/workflows/domain/schema-validation.d.ts +8 -0
  387. package/dist/src/workflows/domain/schema-validation.js +28 -0
  388. package/dist/src/workflows/domain/schema-validation.js.map +1 -0
  389. package/dist/src/workflows/draft/index.d.ts +3 -0
  390. package/dist/src/workflows/draft/index.js +3 -0
  391. package/dist/src/workflows/draft/workflow-draft-prompt.d.ts +23 -0
  392. package/dist/src/workflows/draft/workflow-draft-prompt.js +98 -0
  393. package/dist/src/workflows/draft/workflow-draft-prompt.js.map +1 -0
  394. package/dist/src/workflows/draft/workflow-draft-service.d.ts +12 -0
  395. package/dist/src/workflows/draft/workflow-draft-service.js +131 -0
  396. package/dist/src/workflows/draft/workflow-draft-service.js.map +1 -0
  397. package/dist/src/workflows/draft/workflow-draft-validator.d.ts +4 -0
  398. package/dist/src/workflows/draft/workflow-draft-validator.js +133 -0
  399. package/dist/src/workflows/draft/workflow-draft-validator.js.map +1 -0
  400. package/dist/src/workflows/draft/workflow-draft.types.d.ts +44 -0
  401. package/dist/src/workflows/draft/workflow-draft.types.js +1 -0
  402. package/dist/src/workflows/engine/projector.js +1 -0
  403. package/dist/src/workflows/engine/projector.js.map +1 -1
  404. package/dist/src/workflows/engine/workflow-engine.d.ts +18 -0
  405. package/dist/src/workflows/engine/workflow-engine.js +320 -11
  406. package/dist/src/workflows/engine/workflow-engine.js.map +1 -1
  407. package/dist/src/workflows/index.js +4 -3
  408. package/dist/src/workflows/service/workflow-run-service.d.ts +14 -3
  409. package/dist/src/workflows/service/workflow-run-service.js +227 -6
  410. package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
  411. package/dist/src/workflows/service/workflow-run-service.types.d.ts +7 -2
  412. package/dist/src/workflows/store/event-store.js +1 -1
  413. package/dist/src/workflows/store/run-store.js +1 -1
  414. package/package.json +5 -3
  415. package/dist/gateway/static/root/assets/agents-XzgIVKcI.js +0 -396
  416. package/dist/gateway/static/root/assets/apps-page-B7Us3RMl.js +0 -1
  417. package/dist/gateway/static/root/assets/channels-settings-BgeV6fzw.js +0 -1
  418. package/dist/gateway/static/root/assets/cron-page-DKGHEeAU.js +0 -1
  419. package/dist/gateway/static/root/assets/index-50FVtgXU.js +0 -4845
  420. package/dist/gateway/static/root/assets/index-BPYKW7FB.css +0 -1
  421. package/dist/gateway/static/root/assets/notes-page-CsWIw35Q.js +0 -1
  422. package/dist/gateway/static/root/assets/sessions-page-CLPsbyOW.js +0 -1
  423. package/dist/gateway/static/root/assets/settings-page-CRGHT_bm.js +0 -3
  424. package/dist/gateway/static/root/assets/skills-page-Ce-RIH2y.js +0 -2
  425. package/dist/gateway/static/root/assets/url-DPEStU4M.js +0 -3
  426. package/dist/gateway/static/root/assets/voice-api-key-field-CJGTidqc.js +0 -1
  427. package/dist/gateway/static/root/assets/workflows-page-o63aaARK.js +0 -27
  428. package/dist/src/agent/builtin-agent-ids.d.ts +0 -2
  429. package/dist/src/agent/builtin-agent-ids.js +0 -17
  430. package/dist/src/agent/builtin-agent-ids.js.map +0 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "manifest_version": 3,
3
3
  "name": "xopc Browser Bridge",
4
- "version": "0.0.105",
4
+ "version": "0.0.107",
5
5
  "description": "Browser automation bridge for xopc — executes commands in Chrome via the local xopc daemon.",
6
6
  "permissions": [
7
7
  "debugger",
@@ -4,6 +4,11 @@
4
4
  "description": "Image generation via Alibaba Model Studio (DashScope). Configure API keys and region under Settings → Images, or here — both edit the same providers.dashscope entry.",
5
5
  "version": "1.0.0",
6
6
  "kind": "image-generation",
7
- "main": "src/index.ts",
8
- "autoEnableWhenConfiguredProviders": ["dashscope"]
7
+ "main": "src/index.js",
8
+ "autoEnableWhenConfiguredProviders": [
9
+ "dashscope"
10
+ ],
11
+ "engines": {
12
+ "xopc": ">=0.0.106 <1.0.0"
13
+ }
9
14
  }
@@ -4,6 +4,11 @@
4
4
  "description": "Image generation via Fal.ai queue API. Configure API keys and queue base URL under Settings → Images, or here — both edit the same providers.fal entry.",
5
5
  "version": "1.0.0",
6
6
  "kind": "image-generation",
7
- "main": "src/index.ts",
8
- "autoEnableWhenConfiguredProviders": ["fal"]
7
+ "main": "src/index.js",
8
+ "autoEnableWhenConfiguredProviders": [
9
+ "fal"
10
+ ],
11
+ "engines": {
12
+ "xopc": ">=0.0.106 <1.0.0"
13
+ }
9
14
  }
@@ -1,8 +1,6 @@
1
- import { init_loader, loadConfig, saveConfig } from "../../../../src/config/loader.js";
2
1
  import { mergeDistinctSenderIds } from "../../../../src/channels/pairing/preseed-allow-from.js";
3
2
  import { beginAppRegistration, initAppRegistration, pollAppRegistration } from "../auth/app-registration.js";
4
3
  //#region extensions/feishu/src/adapters/gateway-setup.ts
5
- init_loader();
6
4
  const activeSessions = /* @__PURE__ */ new Map();
7
5
  const completedSessions = /* @__PURE__ */ new Map();
8
6
  function rememberCompleted(sessionKey, state) {
@@ -35,7 +33,7 @@ function buildFeishuConfig(config, result) {
35
33
  dmPolicy: existing?.dmPolicy ?? "open",
36
34
  groupPolicy: existing?.groupPolicy ?? "allowlist",
37
35
  allowFrom,
38
- groupAllowFrom: Array.isArray(existing?.groupAllowFrom) ? existing.groupAllowFrom : [],
36
+ groupAllowFrom: Array.isArray(existing?.groupAllowFrom) ? existing.groupAllowFrom : allowFrom,
39
37
  requireMention: typeof existing?.requireMention === "boolean" ? existing.requireMention : true,
40
38
  renderMode: existing?.renderMode ?? "auto",
41
39
  streaming: typeof existing?.streaming === "boolean" ? existing.streaming : false,
@@ -94,7 +92,11 @@ function statusPayload(state, active, locale) {
94
92
  configChanged: true
95
93
  };
96
94
  }
97
- const feishuGatewaySetupActions = { async runAction({ actionId, input, locale }) {
95
+ function completedNextConfig(cfg, state) {
96
+ if (!state || state.ok === false) return void 0;
97
+ return buildFeishuConfig(cfg, state.result);
98
+ }
99
+ const feishuGatewaySetupActions = { async runAction({ cfg, actionId, input, locale }) {
98
100
  const zh = isZh(locale);
99
101
  if (actionId === "setup.start") {
100
102
  const domain = normalizeDomain(readInput(input).domain);
@@ -149,22 +151,14 @@ const feishuGatewaySetupActions = { async runAction({ actionId, input, locale })
149
151
  });
150
152
  return;
151
153
  }
152
- try {
153
- await saveConfig(buildFeishuConfig(loadConfig(), outcome.result));
154
- rememberCompleted(sessionKey, {
155
- phase: "done",
156
- ok: true,
157
- accountId: "default",
158
- appId: outcome.result.appId,
159
- domain: outcome.result.domain
160
- });
161
- } catch (err) {
162
- rememberCompleted(sessionKey, {
163
- phase: "done",
164
- ok: false,
165
- message: `${zh ? "配置保存失败" : "Config save failed"}: ${String(err)}`
166
- });
167
- }
154
+ rememberCompleted(sessionKey, {
155
+ phase: "done",
156
+ ok: true,
157
+ accountId: "default",
158
+ appId: outcome.result.appId,
159
+ domain: outcome.result.domain,
160
+ result: outcome.result
161
+ });
168
162
  })();
169
163
  return {
170
164
  ok: true,
@@ -186,9 +180,11 @@ const feishuGatewaySetupActions = { async runAction({ actionId, input, locale })
186
180
  ok: false,
187
181
  message: zh ? "缺少配置 sessionKey" : "Missing setup sessionKey"
188
182
  };
183
+ const completed = completedSessions.get(sessionKey);
189
184
  return {
190
185
  ok: true,
191
- payload: statusPayload(completedSessions.get(sessionKey), activeSessions.get(sessionKey), locale)
186
+ payload: statusPayload(completed, activeSessions.get(sessionKey), locale),
187
+ nextConfig: completedNextConfig(cfg, completed)
192
188
  };
193
189
  }
194
190
  if (actionId === "setup.manual") {
@@ -200,13 +196,13 @@ const feishuGatewaySetupActions = { async runAction({ actionId, input, locale })
200
196
  ok: false,
201
197
  message: zh ? "App ID 和 App Secret 为必填项。" : "App ID and App Secret are required."
202
198
  };
203
- await saveConfig(buildFeishuConfig(loadConfig(), {
204
- appId,
205
- appSecret,
206
- domain
207
- }));
208
199
  return {
209
200
  ok: true,
201
+ nextConfig: buildFeishuConfig(cfg, {
202
+ appId,
203
+ appSecret,
204
+ domain
205
+ }),
210
206
  payload: {
211
207
  type: "ok",
212
208
  message: zh ? "飞书配置已保存。" : "Feishu configuration saved.",
@@ -1 +1 @@
1
- {"version":3,"file":"gateway-setup.js","names":[],"sources":["../../../../../extensions/feishu/src/adapters/gateway-setup.ts"],"sourcesContent":["import { loadConfig, saveConfig } from '@xopcai/xopc/config/loader.js';\nimport type { Config } from '@xopcai/xopc/config/schema.js';\nimport type {\n ChannelRuntimeActionAdapter,\n ChannelRuntimeActionPayload,\n} from '@xopcai/xopc/channels/plugins/types.adapters.js';\nimport { mergeDistinctSenderIds } from '@xopcai/xopc/channels/pairing/index.js';\n\nimport {\n beginAppRegistration,\n initAppRegistration,\n pollAppRegistration,\n type FeishuDomain,\n type AppRegistrationResult,\n} from '../auth/app-registration.js';\n\ntype FeishuGatewaySetupDone =\n | { phase: 'done'; ok: true; accountId: string; appId: string; domain: FeishuDomain }\n | { phase: 'done'; ok: false; message: string };\n\ntype FeishuGatewaySetupActive = {\n startedAt: number;\n qrPayload: string;\n};\n\nconst activeSessions = new Map<string, FeishuGatewaySetupActive>();\nconst completedSessions = new Map<string, FeishuGatewaySetupDone>();\n\nfunction rememberCompleted(sessionKey: string, state: FeishuGatewaySetupDone): void {\n activeSessions.delete(sessionKey);\n completedSessions.set(sessionKey, state);\n setTimeout(() => completedSessions.delete(sessionKey), 10 * 60_000);\n}\n\nfunction readInput(input: unknown): Record<string, unknown> {\n return input && typeof input === 'object' && !Array.isArray(input)\n ? (input as Record<string, unknown>)\n : {};\n}\n\nfunction normalizeDomain(input: unknown): FeishuDomain {\n return input === 'lark' ? 'lark' : 'feishu';\n}\n\nfunction buildFeishuConfig(config: Config, result: AppRegistrationResult): Config {\n const existing = config.channels?.feishu as Record<string, unknown> | undefined;\n const ownerOpenId = result.openId?.trim();\n const previousAllowFrom = Array.isArray(existing?.allowFrom)\n ? (existing.allowFrom as Array<string | number>)\n : [];\n const allowFrom = ownerOpenId\n ? mergeDistinctSenderIds(previousAllowFrom, [ownerOpenId])\n : previousAllowFrom;\n\n return {\n ...config,\n channels: {\n ...config.channels,\n feishu: {\n ...(existing ?? {}),\n enabled: true,\n appId: result.appId,\n appSecret: result.appSecret,\n domain: result.domain,\n connectionMode: 'websocket',\n dmPolicy: existing?.dmPolicy ?? 'open',\n groupPolicy: existing?.groupPolicy ?? 'allowlist',\n allowFrom,\n groupAllowFrom: Array.isArray(existing?.groupAllowFrom) ? existing.groupAllowFrom : [],\n requireMention: typeof existing?.requireMention === 'boolean' ? existing.requireMention : true,\n renderMode: existing?.renderMode ?? 'auto',\n streaming: typeof existing?.streaming === 'boolean' ? existing.streaming : false,\n reactionNotifications: existing?.reactionNotifications ?? 'own',\n actions: { ...(existing?.actions as Record<string, unknown> | undefined), reactions: true },\n tools: {\n doc: true,\n wiki: true,\n drive: true,\n perm: false,\n bitable: true,\n scopes: true,\n ...(existing?.tools as Record<string, unknown> | undefined),\n },\n historyLimit: typeof existing?.historyLimit === 'number' ? existing.historyLimit : 50,\n textChunkLimit: typeof existing?.textChunkLimit === 'number' ? existing.textChunkLimit : 4000,\n },\n },\n };\n}\n\nfunction isZh(locale: string | undefined): boolean {\n return locale?.toLowerCase().startsWith('zh') === true;\n}\n\nfunction statusPayload(\n state: FeishuGatewaySetupDone | undefined,\n active: FeishuGatewaySetupActive | undefined,\n locale?: string,\n): ChannelRuntimeActionPayload {\n const zh = isZh(locale);\n if (!state && active) {\n return {\n type: 'poll',\n phase: 'pending',\n ok: undefined,\n qrPayload: active.qrPayload,\n message: zh ? '等待飞书 / Lark 确认…' : 'Waiting for Feishu/Lark confirmation...',\n };\n }\n if (!state) {\n return {\n type: 'poll',\n phase: 'unknown',\n ok: false,\n message: zh ? '没有活动的飞书配置会话。请重新开始,二维码可能已过期。' : 'No active Feishu setup session. Start again or the QR may have expired.',\n };\n }\n if (state.ok === false) {\n return {\n type: 'poll',\n phase: 'done',\n ok: false,\n message: state.message,\n };\n }\n return {\n type: 'poll',\n phase: 'done',\n ok: true,\n accountId: state.accountId,\n appId: state.appId,\n domain: state.domain,\n message: zh ? '飞书配置完成。' : 'Feishu setup complete.',\n configChanged: true,\n };\n}\n\nexport const feishuGatewaySetupActions: ChannelRuntimeActionAdapter = {\n async runAction({ actionId, input, locale }) {\n const zh = isZh(locale);\n if (actionId === 'setup.start') {\n const raw = readInput(input);\n const domain = normalizeDomain(raw.domain);\n const supported = await initAppRegistration(domain);\n if (!supported) {\n return {\n ok: true,\n payload: {\n type: 'form',\n submitAction: 'setup.manual',\n message: zh ? '飞书扫码创建不可用。请在高级配置中手动填写应用凭据。' : 'Feishu scan-to-create is unavailable. Enter app credentials manually in Advanced configuration.',\n schema: {\n type: 'object',\n properties: {\n appId: { type: 'string', title: 'App ID' },\n appSecret: { type: 'string', title: 'App Secret', format: 'password' },\n domain: { type: 'string', enum: ['feishu', 'lark'], default: domain, title: zh ? '域名' : 'Domain' },\n },\n required: ['appId', 'appSecret'],\n },\n values: { domain },\n },\n };\n }\n\n const begin = await beginAppRegistration(domain);\n const sessionKey = begin.deviceCode;\n activeSessions.set(sessionKey, {\n startedAt: Date.now(),\n qrPayload: begin.qrUrl,\n });\n\n void (async () => {\n const outcome = await pollAppRegistration({\n deviceCode: begin.deviceCode,\n intervalSec: begin.intervalSec,\n expireInSec: begin.expireInSec,\n initialDomain: domain,\n });\n\n if (outcome.status !== 'success') {\n const message =\n outcome.status === 'access_denied'\n ? (zh ? '用户拒绝授权。' : 'User denied authorization.')\n : outcome.status === 'expired'\n ? (zh ? '配置会话已过期。' : 'Setup session expired.')\n : outcome.status === 'timeout'\n ? (zh ? '配置超时。' : 'Setup timed out.')\n : outcome.message ?? (zh ? '飞书配置失败。' : 'Feishu setup failed.');\n rememberCompleted(sessionKey, { phase: 'done', ok: false, message });\n return;\n }\n\n try {\n const current = loadConfig();\n await saveConfig(buildFeishuConfig(current, outcome.result));\n rememberCompleted(sessionKey, {\n phase: 'done',\n ok: true,\n accountId: 'default',\n appId: outcome.result.appId,\n domain: outcome.result.domain,\n });\n } catch (err) {\n rememberCompleted(sessionKey, {\n phase: 'done',\n ok: false,\n message: `${zh ? '配置保存失败' : 'Config save failed'}: ${String(err)}`,\n });\n }\n })();\n\n return {\n ok: true,\n payload: {\n type: 'qr',\n sessionKey,\n qrPayload: begin.qrUrl,\n statusAction: 'setup.status',\n pollIntervalMs: Math.max(1000, begin.intervalSec * 1000),\n expiresInSec: begin.expireInSec,\n message: zh ? '请使用飞书 / Lark 扫码创建并授权应用。' : 'Scan with Feishu/Lark to create and authorize an app.',\n },\n };\n }\n\n if (actionId === 'setup.status') {\n const raw = readInput(input);\n const sessionKey = typeof raw.sessionKey === 'string' ? raw.sessionKey : '';\n if (!sessionKey) return { ok: false, message: zh ? '缺少配置 sessionKey' : 'Missing setup sessionKey' };\n return { ok: true, payload: statusPayload(completedSessions.get(sessionKey), activeSessions.get(sessionKey), locale) };\n }\n\n if (actionId === 'setup.manual') {\n const raw = readInput(input);\n const appId = typeof raw.appId === 'string' ? raw.appId.trim() : '';\n const appSecret = typeof raw.appSecret === 'string' ? raw.appSecret.trim() : '';\n const domain = normalizeDomain(raw.domain);\n if (!appId || !appSecret) {\n return { ok: false, message: zh ? 'App ID 和 App Secret 为必填项。' : 'App ID and App Secret are required.' };\n }\n const current = loadConfig();\n await saveConfig(buildFeishuConfig(current, { appId, appSecret, domain }));\n return {\n ok: true,\n payload: {\n type: 'ok',\n message: zh ? '飞书配置已保存。' : 'Feishu configuration saved.',\n configChanged: true,\n },\n };\n }\n\n return { ok: false, message: `${zh ? '不支持的飞书操作' : 'Unsupported Feishu action'}: ${actionId}` };\n },\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"gateway-setup.js","names":[],"sources":["../../../../../extensions/feishu/src/adapters/gateway-setup.ts"],"sourcesContent":["import type { Config } from '@xopcai/xopc/config/schema.js';\nimport type {\n ChannelRuntimeActionAdapter,\n ChannelRuntimeActionPayload,\n} from '@xopcai/xopc/channels/plugins/types.adapters.js';\nimport { mergeDistinctSenderIds } from '@xopcai/xopc/channels/pairing/index.js';\n\nimport {\n beginAppRegistration,\n initAppRegistration,\n pollAppRegistration,\n type FeishuDomain,\n type AppRegistrationResult,\n} from '../auth/app-registration.js';\n\ntype FeishuGatewaySetupDone =\n | { phase: 'done'; ok: true; accountId: string; appId: string; domain: FeishuDomain; result: AppRegistrationResult }\n | { phase: 'done'; ok: false; message: string };\n\ntype FeishuGatewaySetupActive = {\n startedAt: number;\n qrPayload: string;\n};\n\nconst activeSessions = new Map<string, FeishuGatewaySetupActive>();\nconst completedSessions = new Map<string, FeishuGatewaySetupDone>();\n\nfunction rememberCompleted(sessionKey: string, state: FeishuGatewaySetupDone): void {\n activeSessions.delete(sessionKey);\n completedSessions.set(sessionKey, state);\n setTimeout(() => completedSessions.delete(sessionKey), 10 * 60_000);\n}\n\nfunction readInput(input: unknown): Record<string, unknown> {\n return input && typeof input === 'object' && !Array.isArray(input)\n ? (input as Record<string, unknown>)\n : {};\n}\n\nfunction normalizeDomain(input: unknown): FeishuDomain {\n return input === 'lark' ? 'lark' : 'feishu';\n}\n\nfunction buildFeishuConfig(config: Config, result: AppRegistrationResult): Config {\n const existing = config.channels?.feishu as Record<string, unknown> | undefined;\n const ownerOpenId = result.openId?.trim();\n const previousAllowFrom = Array.isArray(existing?.allowFrom)\n ? (existing.allowFrom as Array<string | number>)\n : [];\n const allowFrom = ownerOpenId\n ? mergeDistinctSenderIds(previousAllowFrom, [ownerOpenId])\n : previousAllowFrom;\n\n return {\n ...config,\n channels: {\n ...config.channels,\n feishu: {\n ...(existing ?? {}),\n enabled: true,\n appId: result.appId,\n appSecret: result.appSecret,\n domain: result.domain,\n connectionMode: 'websocket',\n dmPolicy: existing?.dmPolicy ?? 'open',\n groupPolicy: existing?.groupPolicy ?? 'allowlist',\n allowFrom,\n groupAllowFrom: Array.isArray(existing?.groupAllowFrom) ? existing.groupAllowFrom : allowFrom,\n requireMention: typeof existing?.requireMention === 'boolean' ? existing.requireMention : true,\n renderMode: existing?.renderMode ?? 'auto',\n streaming: typeof existing?.streaming === 'boolean' ? existing.streaming : false,\n reactionNotifications: existing?.reactionNotifications ?? 'own',\n actions: { ...(existing?.actions as Record<string, unknown> | undefined), reactions: true },\n tools: {\n doc: true,\n wiki: true,\n drive: true,\n perm: false,\n bitable: true,\n scopes: true,\n ...(existing?.tools as Record<string, unknown> | undefined),\n },\n historyLimit: typeof existing?.historyLimit === 'number' ? existing.historyLimit : 50,\n textChunkLimit: typeof existing?.textChunkLimit === 'number' ? existing.textChunkLimit : 4000,\n },\n },\n };\n}\n\nfunction isZh(locale: string | undefined): boolean {\n return locale?.toLowerCase().startsWith('zh') === true;\n}\n\nfunction statusPayload(\n state: FeishuGatewaySetupDone | undefined,\n active: FeishuGatewaySetupActive | undefined,\n locale?: string,\n): ChannelRuntimeActionPayload {\n const zh = isZh(locale);\n if (!state && active) {\n return {\n type: 'poll',\n phase: 'pending',\n ok: undefined,\n qrPayload: active.qrPayload,\n message: zh ? '等待飞书 / Lark 确认…' : 'Waiting for Feishu/Lark confirmation...',\n };\n }\n if (!state) {\n return {\n type: 'poll',\n phase: 'unknown',\n ok: false,\n message: zh ? '没有活动的飞书配置会话。请重新开始,二维码可能已过期。' : 'No active Feishu setup session. Start again or the QR may have expired.',\n };\n }\n if (state.ok === false) {\n return {\n type: 'poll',\n phase: 'done',\n ok: false,\n message: state.message,\n };\n }\n return {\n type: 'poll',\n phase: 'done',\n ok: true,\n accountId: state.accountId,\n appId: state.appId,\n domain: state.domain,\n message: zh ? '飞书配置完成。' : 'Feishu setup complete.',\n configChanged: true,\n };\n}\n\nfunction completedNextConfig(cfg: Config, state: FeishuGatewaySetupDone | undefined): Config | undefined {\n if (!state || state.ok === false) return undefined;\n return buildFeishuConfig(cfg, state.result);\n}\n\nexport const feishuGatewaySetupActions: ChannelRuntimeActionAdapter = {\n async runAction({ cfg, actionId, input, locale }) {\n const zh = isZh(locale);\n if (actionId === 'setup.start') {\n const raw = readInput(input);\n const domain = normalizeDomain(raw.domain);\n const supported = await initAppRegistration(domain);\n if (!supported) {\n return {\n ok: true,\n payload: {\n type: 'form',\n submitAction: 'setup.manual',\n message: zh ? '飞书扫码创建不可用。请在高级配置中手动填写应用凭据。' : 'Feishu scan-to-create is unavailable. Enter app credentials manually in Advanced configuration.',\n schema: {\n type: 'object',\n properties: {\n appId: { type: 'string', title: 'App ID' },\n appSecret: { type: 'string', title: 'App Secret', format: 'password' },\n domain: { type: 'string', enum: ['feishu', 'lark'], default: domain, title: zh ? '域名' : 'Domain' },\n },\n required: ['appId', 'appSecret'],\n },\n values: { domain },\n },\n };\n }\n\n const begin = await beginAppRegistration(domain);\n const sessionKey = begin.deviceCode;\n activeSessions.set(sessionKey, {\n startedAt: Date.now(),\n qrPayload: begin.qrUrl,\n });\n\n void (async () => {\n const outcome = await pollAppRegistration({\n deviceCode: begin.deviceCode,\n intervalSec: begin.intervalSec,\n expireInSec: begin.expireInSec,\n initialDomain: domain,\n });\n\n if (outcome.status !== 'success') {\n const message =\n outcome.status === 'access_denied'\n ? (zh ? '用户拒绝授权。' : 'User denied authorization.')\n : outcome.status === 'expired'\n ? (zh ? '配置会话已过期。' : 'Setup session expired.')\n : outcome.status === 'timeout'\n ? (zh ? '配置超时。' : 'Setup timed out.')\n : outcome.message ?? (zh ? '飞书配置失败。' : 'Feishu setup failed.');\n rememberCompleted(sessionKey, { phase: 'done', ok: false, message });\n return;\n }\n\n rememberCompleted(sessionKey, {\n phase: 'done',\n ok: true,\n accountId: 'default',\n appId: outcome.result.appId,\n domain: outcome.result.domain,\n result: outcome.result,\n });\n })();\n\n return {\n ok: true,\n payload: {\n type: 'qr',\n sessionKey,\n qrPayload: begin.qrUrl,\n statusAction: 'setup.status',\n pollIntervalMs: Math.max(1000, begin.intervalSec * 1000),\n expiresInSec: begin.expireInSec,\n message: zh ? '请使用飞书 / Lark 扫码创建并授权应用。' : 'Scan with Feishu/Lark to create and authorize an app.',\n },\n };\n }\n\n if (actionId === 'setup.status') {\n const raw = readInput(input);\n const sessionKey = typeof raw.sessionKey === 'string' ? raw.sessionKey : '';\n if (!sessionKey) return { ok: false, message: zh ? '缺少配置 sessionKey' : 'Missing setup sessionKey' };\n const completed = completedSessions.get(sessionKey);\n return {\n ok: true,\n payload: statusPayload(completed, activeSessions.get(sessionKey), locale),\n nextConfig: completedNextConfig(cfg, completed),\n };\n }\n\n if (actionId === 'setup.manual') {\n const raw = readInput(input);\n const appId = typeof raw.appId === 'string' ? raw.appId.trim() : '';\n const appSecret = typeof raw.appSecret === 'string' ? raw.appSecret.trim() : '';\n const domain = normalizeDomain(raw.domain);\n if (!appId || !appSecret) {\n return { ok: false, message: zh ? 'App ID 和 App Secret 为必填项。' : 'App ID and App Secret are required.' };\n }\n return {\n ok: true,\n nextConfig: buildFeishuConfig(cfg, { appId, appSecret, domain }),\n payload: {\n type: 'ok',\n message: zh ? '飞书配置已保存。' : 'Feishu configuration saved.',\n configChanged: true,\n },\n };\n }\n\n return { ok: false, message: `${zh ? '不支持的飞书操作' : 'Unsupported Feishu action'}: ${actionId}` };\n },\n};\n"],"mappings":"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"}
@@ -1,5 +1,4 @@
1
1
  import { resolveFeishuAccount } from "../state/accounts.js";
2
- import { createFeishuClient } from "../transport/client/client.js";
3
2
  //#region extensions/feishu/src/directory/directory-adapter.ts
4
3
  function createFeishuDirectoryAdapter() {
5
4
  return { resolveDisplayName: async (params) => {
@@ -8,6 +7,7 @@ function createFeishuDirectoryAdapter() {
8
7
  if (!id.startsWith("ou_") && !id.startsWith("on_")) return;
9
8
  const account = resolveFeishuAccount(params.cfg, "default");
10
9
  if (!account.configured) return void 0;
10
+ const { createFeishuClient } = await import("../transport/client/client.js");
11
11
  const { api } = createFeishuClient(account);
12
12
  try {
13
13
  const res = await api.contact.user.get({
@@ -1 +1 @@
1
- {"version":3,"file":"directory-adapter.js","names":[],"sources":["../../../../../extensions/feishu/src/directory/directory-adapter.ts"],"sourcesContent":["import type { ChannelDirectoryAdapter } from '@xopcai/xopc/channels/plugins/types.adapters.js';\nimport type { Config } from '@xopcai/xopc/config/schema.js';\n\nimport { resolveFeishuAccount } from '../state/accounts.js';\nimport { createFeishuClient } from '../transport/client/client.js';\n\nexport function createFeishuDirectoryAdapter(): ChannelDirectoryAdapter {\n return {\n resolveDisplayName: async (params: { cfg: Config; id: string }) => {\n const id = params.id.trim();\n if (!id) return undefined;\n\n // Best-effort: if this looks like an open_id, try resolve user name.\n if (!id.startsWith('ou_') && !id.startsWith('on_')) {\n return undefined;\n }\n\n // Use default account for directory lookups for now.\n const account = resolveFeishuAccount(params.cfg, 'default');\n if (!account.configured) return undefined;\n\n const { api } = createFeishuClient(account);\n try {\n const res = await (api as any).contact.user.get({\n path: { user_id: id },\n params: { user_id_type: 'open_id' },\n });\n const name = res?.data?.user?.name ?? res?.data?.name;\n return typeof name === 'string' && name.trim() ? name.trim() : undefined;\n } catch {\n return undefined;\n }\n },\n };\n}\n\n"],"mappings":";;;AAMA,SAAgB,+BAAwD;AACtE,QAAO,EACL,oBAAoB,OAAO,WAAwC;EACjE,MAAM,KAAK,OAAO,GAAG,MAAM;AAC3B,MAAI,CAAC,GAAI,QAAO,KAAA;AAGhB,MAAI,CAAC,GAAG,WAAW,MAAM,IAAI,CAAC,GAAG,WAAW,MAAM,CAChD;EAIF,MAAM,UAAU,qBAAqB,OAAO,KAAK,UAAU;AAC3D,MAAI,CAAC,QAAQ,WAAY,QAAO,KAAA;EAEhC,MAAM,EAAE,QAAQ,mBAAmB,QAAQ;AAC3C,MAAI;GACF,MAAM,MAAM,MAAO,IAAY,QAAQ,KAAK,IAAI;IAC9C,MAAM,EAAE,SAAS,IAAI;IACrB,QAAQ,EAAE,cAAc,WAAW;IACpC,CAAC;GACF,MAAM,OAAO,KAAK,MAAM,MAAM,QAAQ,KAAK,MAAM;AACjD,UAAO,OAAO,SAAS,YAAY,KAAK,MAAM,GAAG,KAAK,MAAM,GAAG,KAAA;UACzD;AACN;;IAGL"}
1
+ {"version":3,"file":"directory-adapter.js","names":[],"sources":["../../../../../extensions/feishu/src/directory/directory-adapter.ts"],"sourcesContent":["import type { ChannelDirectoryAdapter } from '@xopcai/xopc/channels/plugins/types.adapters.js';\nimport type { Config } from '@xopcai/xopc/config/schema.js';\n\nimport { resolveFeishuAccount } from '../state/accounts.js';\n\nexport function createFeishuDirectoryAdapter(): ChannelDirectoryAdapter {\n return {\n resolveDisplayName: async (params: { cfg: Config; id: string }) => {\n const id = params.id.trim();\n if (!id) return undefined;\n\n // Best-effort: if this looks like an open_id, try resolve user name.\n if (!id.startsWith('ou_') && !id.startsWith('on_')) {\n return undefined;\n }\n\n // Use default account for directory lookups for now.\n const account = resolveFeishuAccount(params.cfg, 'default');\n if (!account.configured) return undefined;\n\n const { createFeishuClient } = await import('../transport/client/client.js');\n const { api } = createFeishuClient(account);\n try {\n const res = await (api as any).contact.user.get({\n path: { user_id: id },\n params: { user_id_type: 'open_id' },\n });\n const name = res?.data?.user?.name ?? res?.data?.name;\n return typeof name === 'string' && name.trim() ? name.trim() : undefined;\n } catch {\n return undefined;\n }\n },\n };\n}\n\n"],"mappings":";;AAKA,SAAgB,+BAAwD;AACtE,QAAO,EACL,oBAAoB,OAAO,WAAwC;EACjE,MAAM,KAAK,OAAO,GAAG,MAAM;AAC3B,MAAI,CAAC,GAAI,QAAO,KAAA;AAGhB,MAAI,CAAC,GAAG,WAAW,MAAM,IAAI,CAAC,GAAG,WAAW,MAAM,CAChD;EAIF,MAAM,UAAU,qBAAqB,OAAO,KAAK,UAAU;AAC3D,MAAI,CAAC,QAAQ,WAAY,QAAO,KAAA;EAEhC,MAAM,EAAE,uBAAuB,MAAM,OAAO;EAC5C,MAAM,EAAE,QAAQ,mBAAmB,QAAQ;AAC3C,MAAI;GACF,MAAM,MAAM,MAAO,IAAY,QAAQ,KAAK,IAAI;IAC9C,MAAM,EAAE,SAAS,IAAI;IACrB,QAAQ,EAAE,cAAc,WAAW;IACpC,CAAC;GACF,MAAM,OAAO,KAAK,MAAM,MAAM,QAAQ,KAAK,MAAM;AACjD,UAAO,OAAO,SAAS,YAAY,KAAK,MAAM,GAAG,KAAK,MAAM,GAAG,KAAA;UACzD;AACN;;IAGL"}
@@ -1,8 +1,8 @@
1
1
  import { checkFileSafety } from "../../../../src/agent/prompt/safety.js";
2
2
  import { getMimeType } from "../../../../src/channels/media.js";
3
3
  import { getWorkspacePath } from "../../../../src/config/workspace-path-helpers.js";
4
- import { promises } from "node:fs";
5
4
  import path from "node:path";
5
+ import { promises } from "node:fs";
6
6
  import { Readable } from "node:stream";
7
7
  //#region extensions/feishu/src/outbound/media-load.ts
8
8
  function isPathUnderRoots(resolved, roots) {
@@ -1,8 +1,6 @@
1
- import { formatFeishuOutboundText } from "../format.js";
2
1
  import { resolveFeishuAccount } from "../state/accounts.js";
3
- import { createFeishuClient } from "../transport/client/client.js";
4
- import { getFeishuBindingByMessageId, recordFeishuMessageBinding } from "../state/message-bindings.js";
5
2
  import { loadMediaForFeishu } from "./media-load.js";
3
+ import { getFeishuBindingByMessageId, recordFeishuMessageBinding } from "../state/message-bindings.js";
6
4
  //#region extensions/feishu/src/outbound/outbound-adapter.ts
7
5
  function createFeishuOutboundAdapter() {
8
6
  return {
@@ -18,11 +16,13 @@ function createFeishuOutboundAdapter() {
18
16
  chatId: ctx.to,
19
17
  error: "Feishu account is not configured"
20
18
  };
19
+ const { createFeishuClient } = await import("../transport/client/client.js");
21
20
  const { api } = createFeishuClient(account);
22
21
  const to = ctx.to;
23
22
  const raw = ctx.text ?? "";
24
23
  const renderMode = account.renderMode ?? "auto";
25
24
  const preferCard = renderMode === "card" || renderMode === "auto";
25
+ const { formatFeishuOutboundText } = await import("../format.js");
26
26
  const cardBody = formatFeishuOutboundText({
27
27
  text: raw,
28
28
  renderMode,
@@ -100,6 +100,7 @@ function createFeishuOutboundAdapter() {
100
100
  maxBytes: 20 * 1024 * 1024,
101
101
  localRoots: ctx.mediaLocalRoots
102
102
  });
103
+ const { createFeishuClient } = await import("../transport/client/client.js");
103
104
  const { api } = createFeishuClient(account);
104
105
  if (loaded.mimeType.startsWith("image/")) {
105
106
  const up = await api.im.v1.image.create({ data: {
@@ -1 +1 @@
1
- {"version":3,"file":"outbound-adapter.js","names":[],"sources":["../../../../../extensions/feishu/src/outbound/outbound-adapter.ts"],"sourcesContent":["import type {\n ChannelOutboundAdapter,\n ChannelOutboundContext,\n OutboundDeliveryResult,\n} from '@xopcai/xopc/channels/plugin-types.js';\nimport type { Config } from '@xopcai/xopc/config/schema.js';\n\nimport { resolveFeishuAccount } from '../state/accounts.js';\nimport { createFeishuClient } from '../transport/client/client.js';\nimport { formatFeishuOutboundText } from '../format.js';\nimport { loadMediaForFeishu } from './media-load.js';\nimport { getFeishuBindingByMessageId, recordFeishuMessageBinding } from '../state/message-bindings.js';\n\nexport function createFeishuOutboundAdapter(): ChannelOutboundAdapter {\n return {\n deliveryMode: 'direct',\n chunkerMode: 'text',\n textChunkLimit: 4000,\n\n async sendText(ctx: ChannelOutboundContext): Promise<OutboundDeliveryResult> {\n const cfg = ctx.cfg as Config;\n const account = resolveFeishuAccount(cfg, ctx.accountId ?? 'default');\n if (!account.configured) {\n return { success: false, messageId: '', chatId: ctx.to, error: 'Feishu account is not configured' };\n }\n\n const { api } = createFeishuClient(account);\n const to = ctx.to;\n const raw = ctx.text ?? '';\n const renderMode = account.renderMode ?? 'auto';\n const preferCard = renderMode === 'card' || renderMode === 'auto';\n\n const cardBody = formatFeishuOutboundText({\n text: raw,\n renderMode,\n forCardMarkdown: true,\n });\n const plainBody = formatFeishuOutboundText({\n text: raw,\n renderMode,\n forCardMarkdown: false,\n });\n\n const receive_id_type = isProbablyOpenId(to) ? 'open_id' : 'chat_id';\n const payloadText = {\n msg_type: 'text',\n content: JSON.stringify({ text: plainBody }),\n };\n const payloadCard = {\n msg_type: 'interactive',\n content: JSON.stringify({\n schema: '2.0',\n config: { update_multi: true },\n body: {\n elements: [\n {\n tag: 'markdown',\n element_id: 'md_1',\n content: cardBody,\n },\n ],\n },\n }),\n };\n\n const send = async (useCard: boolean) => {\n const p = useCard ? payloadCard : payloadText;\n return ctx.replyToId\n ? await (api as any).im.message.reply({\n path: { message_id: ctx.replyToId },\n data: {\n ...p,\n ...(ctx.threadId ? { reply_in_thread: true } : {}),\n },\n })\n : await (api as any).im.message.create({\n params: { receive_id_type },\n data: {\n receive_id: to,\n ...p,\n },\n });\n };\n\n const res = preferCard\n ? await send(true).catch(async () => await send(false))\n : await send(false);\n\n const messageId = res?.data?.message_id ?? res?.message_id ?? '';\n if (messageId && ctx.replyToId) {\n const parent = getFeishuBindingByMessageId(ctx.replyToId);\n if (parent) {\n recordFeishuMessageBinding({\n ...parent,\n messageId,\n });\n }\n }\n return { success: true, messageId, chatId: to };\n },\n\n async sendMedia(ctx: ChannelOutboundContext): Promise<OutboundDeliveryResult> {\n const cfg = ctx.cfg as Config;\n const account = resolveFeishuAccount(cfg, ctx.accountId ?? 'default');\n if (!account.configured) {\n return { success: false, messageId: '', chatId: ctx.to, error: 'Feishu account is not configured' };\n }\n if (!ctx.mediaUrl?.trim()) {\n return { success: false, messageId: '', chatId: ctx.to, error: 'Feishu sendMedia requires mediaUrl' };\n }\n\n const loaded = await loadMediaForFeishu(cfg, ctx.mediaUrl, {\n maxBytes: 20 * 1024 * 1024,\n localRoots: ctx.mediaLocalRoots,\n });\n\n const { api } = createFeishuClient(account);\n\n const isImage = loaded.mimeType.startsWith('image/');\n if (isImage) {\n const up = await (api as any).im.v1.image.create({\n data: {\n image_type: 'message',\n image: loaded.stream,\n },\n });\n const imageKey = up?.data?.image_key ?? up?.image_key;\n if (!imageKey) {\n return { success: false, messageId: '', chatId: ctx.to, error: 'Feishu image upload failed' };\n }\n\n const res = ctx.replyToId\n ? await (api as any).im.message.reply({\n path: { message_id: ctx.replyToId },\n data: {\n msg_type: 'image',\n content: JSON.stringify({ image_key: imageKey }),\n ...(ctx.threadId ? { reply_in_thread: true } : {}),\n },\n })\n : await (api as any).im.message.create({\n params: { receive_id_type: isProbablyOpenId(ctx.to) ? 'open_id' : 'chat_id' },\n data: {\n receive_id: ctx.to,\n msg_type: 'image',\n content: JSON.stringify({ image_key: imageKey }),\n },\n });\n const messageId = res?.data?.message_id ?? res?.message_id ?? '';\n if (messageId && ctx.replyToId) {\n const parent = getFeishuBindingByMessageId(ctx.replyToId);\n if (parent) {\n recordFeishuMessageBinding({ ...parent, messageId });\n }\n }\n return { success: true, messageId, chatId: ctx.to };\n }\n\n const fileType = guessFileType(loaded.filename);\n const up = await (api as any).im.v1.file.create({\n data: {\n file_type: fileType,\n file_name: loaded.filename,\n file: loaded.stream,\n },\n });\n const fileKey = up?.data?.file_key ?? up?.file_key;\n if (!fileKey) {\n return { success: false, messageId: '', chatId: ctx.to, error: 'Feishu file upload failed' };\n }\n\n const res = ctx.replyToId\n ? await (api as any).im.message.reply({\n path: { message_id: ctx.replyToId },\n data: {\n msg_type: 'file',\n content: JSON.stringify({ file_key: fileKey }),\n ...(ctx.threadId ? { reply_in_thread: true } : {}),\n },\n })\n : await (api as any).im.message.create({\n params: { receive_id_type: isProbablyOpenId(ctx.to) ? 'open_id' : 'chat_id' },\n data: {\n receive_id: ctx.to,\n msg_type: 'file',\n content: JSON.stringify({ file_key: fileKey }),\n },\n });\n\n const messageId = res?.data?.message_id ?? res?.message_id ?? '';\n if (messageId && ctx.replyToId) {\n const parent = getFeishuBindingByMessageId(ctx.replyToId);\n if (parent) {\n recordFeishuMessageBinding({ ...parent, messageId });\n }\n }\n return { success: true, messageId, chatId: ctx.to };\n },\n };\n}\n\nfunction isProbablyOpenId(to: string): boolean {\n const t = to.trim();\n return t.startsWith('ou_') || t.startsWith('on_') || t.startsWith('open_id:') || t.startsWith('user:');\n}\n\nfunction guessFileType(filename: string): string {\n const ext = filename.split('.').pop()?.toLowerCase() ?? '';\n if (!ext) return 'stream';\n return ext;\n}\n\n"],"mappings":"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"}
1
+ {"version":3,"file":"outbound-adapter.js","names":[],"sources":["../../../../../extensions/feishu/src/outbound/outbound-adapter.ts"],"sourcesContent":["import type {\n ChannelOutboundAdapter,\n ChannelOutboundContext,\n OutboundDeliveryResult,\n} from '@xopcai/xopc/channels/plugin-types.js';\nimport type { Config } from '@xopcai/xopc/config/schema.js';\n\nimport { resolveFeishuAccount } from '../state/accounts.js';\nimport { loadMediaForFeishu } from './media-load.js';\nimport { getFeishuBindingByMessageId, recordFeishuMessageBinding } from '../state/message-bindings.js';\n\nexport function createFeishuOutboundAdapter(): ChannelOutboundAdapter {\n return {\n deliveryMode: 'direct',\n chunkerMode: 'text',\n textChunkLimit: 4000,\n\n async sendText(ctx: ChannelOutboundContext): Promise<OutboundDeliveryResult> {\n const cfg = ctx.cfg as Config;\n const account = resolveFeishuAccount(cfg, ctx.accountId ?? 'default');\n if (!account.configured) {\n return { success: false, messageId: '', chatId: ctx.to, error: 'Feishu account is not configured' };\n }\n\n const { createFeishuClient } = await import('../transport/client/client.js');\n const { api } = createFeishuClient(account);\n const to = ctx.to;\n const raw = ctx.text ?? '';\n const renderMode = account.renderMode ?? 'auto';\n const preferCard = renderMode === 'card' || renderMode === 'auto';\n\n const { formatFeishuOutboundText } = await import('../format.js');\n const cardBody = formatFeishuOutboundText({\n text: raw,\n renderMode,\n forCardMarkdown: true,\n });\n const plainBody = formatFeishuOutboundText({\n text: raw,\n renderMode,\n forCardMarkdown: false,\n });\n\n const receive_id_type = isProbablyOpenId(to) ? 'open_id' : 'chat_id';\n const payloadText = {\n msg_type: 'text',\n content: JSON.stringify({ text: plainBody }),\n };\n const payloadCard = {\n msg_type: 'interactive',\n content: JSON.stringify({\n schema: '2.0',\n config: { update_multi: true },\n body: {\n elements: [\n {\n tag: 'markdown',\n element_id: 'md_1',\n content: cardBody,\n },\n ],\n },\n }),\n };\n\n const send = async (useCard: boolean) => {\n const p = useCard ? payloadCard : payloadText;\n return ctx.replyToId\n ? await (api as any).im.message.reply({\n path: { message_id: ctx.replyToId },\n data: {\n ...p,\n ...(ctx.threadId ? { reply_in_thread: true } : {}),\n },\n })\n : await (api as any).im.message.create({\n params: { receive_id_type },\n data: {\n receive_id: to,\n ...p,\n },\n });\n };\n\n const res = preferCard\n ? await send(true).catch(async () => await send(false))\n : await send(false);\n\n const messageId = res?.data?.message_id ?? res?.message_id ?? '';\n if (messageId && ctx.replyToId) {\n const parent = getFeishuBindingByMessageId(ctx.replyToId);\n if (parent) {\n recordFeishuMessageBinding({\n ...parent,\n messageId,\n });\n }\n }\n return { success: true, messageId, chatId: to };\n },\n\n async sendMedia(ctx: ChannelOutboundContext): Promise<OutboundDeliveryResult> {\n const cfg = ctx.cfg as Config;\n const account = resolveFeishuAccount(cfg, ctx.accountId ?? 'default');\n if (!account.configured) {\n return { success: false, messageId: '', chatId: ctx.to, error: 'Feishu account is not configured' };\n }\n if (!ctx.mediaUrl?.trim()) {\n return { success: false, messageId: '', chatId: ctx.to, error: 'Feishu sendMedia requires mediaUrl' };\n }\n\n const loaded = await loadMediaForFeishu(cfg, ctx.mediaUrl, {\n maxBytes: 20 * 1024 * 1024,\n localRoots: ctx.mediaLocalRoots,\n });\n\n const { createFeishuClient } = await import('../transport/client/client.js');\n const { api } = createFeishuClient(account);\n\n const isImage = loaded.mimeType.startsWith('image/');\n if (isImage) {\n const up = await (api as any).im.v1.image.create({\n data: {\n image_type: 'message',\n image: loaded.stream,\n },\n });\n const imageKey = up?.data?.image_key ?? up?.image_key;\n if (!imageKey) {\n return { success: false, messageId: '', chatId: ctx.to, error: 'Feishu image upload failed' };\n }\n\n const res = ctx.replyToId\n ? await (api as any).im.message.reply({\n path: { message_id: ctx.replyToId },\n data: {\n msg_type: 'image',\n content: JSON.stringify({ image_key: imageKey }),\n ...(ctx.threadId ? { reply_in_thread: true } : {}),\n },\n })\n : await (api as any).im.message.create({\n params: { receive_id_type: isProbablyOpenId(ctx.to) ? 'open_id' : 'chat_id' },\n data: {\n receive_id: ctx.to,\n msg_type: 'image',\n content: JSON.stringify({ image_key: imageKey }),\n },\n });\n const messageId = res?.data?.message_id ?? res?.message_id ?? '';\n if (messageId && ctx.replyToId) {\n const parent = getFeishuBindingByMessageId(ctx.replyToId);\n if (parent) {\n recordFeishuMessageBinding({ ...parent, messageId });\n }\n }\n return { success: true, messageId, chatId: ctx.to };\n }\n\n const fileType = guessFileType(loaded.filename);\n const up = await (api as any).im.v1.file.create({\n data: {\n file_type: fileType,\n file_name: loaded.filename,\n file: loaded.stream,\n },\n });\n const fileKey = up?.data?.file_key ?? up?.file_key;\n if (!fileKey) {\n return { success: false, messageId: '', chatId: ctx.to, error: 'Feishu file upload failed' };\n }\n\n const res = ctx.replyToId\n ? await (api as any).im.message.reply({\n path: { message_id: ctx.replyToId },\n data: {\n msg_type: 'file',\n content: JSON.stringify({ file_key: fileKey }),\n ...(ctx.threadId ? { reply_in_thread: true } : {}),\n },\n })\n : await (api as any).im.message.create({\n params: { receive_id_type: isProbablyOpenId(ctx.to) ? 'open_id' : 'chat_id' },\n data: {\n receive_id: ctx.to,\n msg_type: 'file',\n content: JSON.stringify({ file_key: fileKey }),\n },\n });\n\n const messageId = res?.data?.message_id ?? res?.message_id ?? '';\n if (messageId && ctx.replyToId) {\n const parent = getFeishuBindingByMessageId(ctx.replyToId);\n if (parent) {\n recordFeishuMessageBinding({ ...parent, messageId });\n }\n }\n return { success: true, messageId, chatId: ctx.to };\n },\n };\n}\n\nfunction isProbablyOpenId(to: string): boolean {\n const t = to.trim();\n return t.startsWith('ou_') || t.startsWith('on_') || t.startsWith('open_id:') || t.startsWith('user:');\n}\n\nfunction guessFileType(filename: string): string {\n const ext = filename.split('.').pop()?.toLowerCase() ?? '';\n if (!ext) return 'stream';\n return ext;\n}\n\n"],"mappings":"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"}
@@ -6,7 +6,7 @@
6
6
  */
7
7
  import type { Config } from '@xopcai/xopc/config/schema.js';
8
8
  import type { ChannelCapabilities, ChannelDoctorAdapter, ChannelMessageActionAdapter, ChannelOutboundAdapter, ChannelPlugin, ChannelPluginDefaults, ChannelPluginInitOptions, ChannelPluginReloadMeta, ChannelPluginStartOptions, ChannelSecurityAdapter, ChannelStatusAdapter } from '@xopcai/xopc/channels/plugin-types.js';
9
- import type { ChannelCliLoginAdapter, ChannelRuntimeActionAdapter } from '@xopcai/xopc/channels/plugins/types.adapters.js';
9
+ import type { ChannelCliLoginAdapter, ChannelRuntimeActionAdapter, ChannelOnboardAdapter } from '@xopcai/xopc/channels/plugins/types.adapters.js';
10
10
  import { type ResolvedFeishuAccount } from './state/accounts.js';
11
11
  export declare class FeishuChannelPlugin implements ChannelPlugin<ResolvedFeishuAccount> {
12
12
  readonly id: "feishu";
@@ -34,7 +34,7 @@ export declare class FeishuChannelPlugin implements ChannelPlugin<ResolvedFeishu
34
34
  };
35
35
  readonly configSurface: import("@xopcai/xopc/channels/plugins/types.adapters.js").ChannelConfigSurfaceAdapter;
36
36
  readonly pairing: import("@xopcai/xopc/channels/plugins/types.adapters.js").ChannelPairingAdapter;
37
- onboard: import("@xopcai/xopc/channels/plugins/types.adapters.js").ChannelOnboardAdapter;
37
+ onboard: ChannelOnboardAdapter;
38
38
  readonly cliLogin: ChannelCliLoginAdapter;
39
39
  readonly runtimeActions: ChannelRuntimeActionAdapter;
40
40
  private bus;
@@ -60,7 +60,9 @@ export declare class FeishuChannelPlugin implements ChannelPlugin<ResolvedFeishu
60
60
  streaming: import("@xopcai/xopc/channels/plugin-types.js").ChannelStreamingAdapter;
61
61
  status: ChannelStatusAdapter<ResolvedFeishuAccount>;
62
62
  doctor: ChannelDoctorAdapter;
63
- directory: import("@xopcai/xopc/channels/plugins/types.adapters.js").ChannelDirectoryAdapter;
63
+ directory: {
64
+ resolveDisplayName: (params: any) => Promise<string>;
65
+ };
64
66
  actions: ChannelMessageActionAdapter;
65
67
  agentTools: {
66
68
  name: string;
@@ -68,6 +70,7 @@ export declare class FeishuChannelPlugin implements ChannelPlugin<ResolvedFeishu
68
70
  execute: (toolCtx: any, args: any) => Promise<any>;
69
71
  }[];
70
72
  init(options: ChannelPluginInitOptions): Promise<void>;
73
+ private registerWorkflowProgressCapability;
71
74
  start(options?: ChannelPluginStartOptions): Promise<void>;
72
75
  stop(accountId?: string): Promise<void>;
73
76
  channelIsRunning(cfg: Config): boolean;
@@ -1,28 +1,18 @@
1
1
  import { createLogger } from "../../../src/utils/logger/index.js";
2
2
  import { init_logger } from "../../../src/utils/logger.js";
3
- import { getWorkflowProgressBroker } from "../../../src/agent/workflow/progress-broker.js";
4
- import "../../../src/agent/workflow/index.js";
5
3
  import { evaluateAccess, resolveDmPolicy, resolveGroupPolicy } from "../../../src/channels/security.js";
6
4
  import { createStandardPairingAdapter } from "../../../src/channels/pairing/pairing-store-adapter.js";
7
5
  import { FeishuConfigSchema } from "./schema/config-schema.js";
8
6
  import { listFeishuAccountIds, resolveFeishuAccount } from "./state/accounts.js";
9
- import { createFeishuSocketModeMonitor } from "./transport/socket-mode/monitor.js";
10
- import { createFeishuWebhookMonitor } from "./transport/webhook/monitor.js";
11
7
  import { createFeishuOutboundAdapter } from "./outbound/outbound-adapter.js";
12
8
  import { createFeishuStatusAdapter } from "./status/status-adapter.js";
13
9
  import { createFeishuDoctorAdapter } from "./status/doctor.js";
14
10
  import { feishuConfigSurface } from "./ui/config-surface.js";
15
11
  import { createFeishuStreamingAdapter } from "./streaming/streaming-adapter.js";
16
12
  import { readFrameworkAllowFromList } from "./auth/pairing.js";
17
- import { addReactionFeishu, editMessageFeishu, getMessageFeishu, listPinsFeishu, listReactionsFeishu, pinMessageFeishu, removeReactionFeishu, unpinMessageFeishu } from "./outbound/actions.js";
18
- import { createFeishuDirectoryAdapter } from "./directory/directory-adapter.js";
19
- import { feishuWhoAmI } from "./tools/tools.js";
20
- import { feishuCliLoginAdapter } from "./adapters/cli-login.js";
21
- import { feishuOnboardAdapter } from "./adapters/onboard-cli.js";
22
13
  import { feishuGatewaySetupActions } from "./adapters/gateway-setup.js";
23
14
  import { handleFeishuChannelMessageAction } from "./actions/message-action-handler.js";
24
15
  import { createFeishuInboundPipeline } from "./transport/reliability/inbound-pipeline.js";
25
- import { createFeishuWorkflowProgressCapability } from "./workflow-progress.js";
26
16
  import { isDeepStrictEqual } from "node:util";
27
17
  //#region extensions/feishu/src/plugin.ts
28
18
  /**
@@ -76,8 +66,22 @@ var FeishuChannelPlugin = class {
76
66
  };
77
67
  configSurface = feishuConfigSurface;
78
68
  pairing = createStandardPairingAdapter("feishu");
79
- onboard = feishuOnboardAdapter;
80
- cliLogin = feishuCliLoginAdapter;
69
+ onboard = {
70
+ isConfigured: (config) => {
71
+ const feishu = config.channels?.feishu;
72
+ const appId = typeof feishu?.appId === "string" ? feishu.appId.trim() : "";
73
+ const appSecret = typeof feishu?.appSecret === "string" ? feishu.appSecret.trim() : "";
74
+ return feishu?.enabled === true && Boolean(appId && appSecret);
75
+ },
76
+ configure: async (config) => {
77
+ const { feishuOnboardAdapter } = await import("./adapters/onboard-cli.js");
78
+ return feishuOnboardAdapter.configure(config);
79
+ }
80
+ };
81
+ cliLogin = { runLogin: async (params) => {
82
+ const { feishuCliLoginAdapter } = await import("./adapters/cli-login.js");
83
+ return feishuCliLoginAdapter.runLogin(params);
84
+ } };
81
85
  runtimeActions = feishuGatewaySetupActions;
82
86
  bus;
83
87
  cfg;
@@ -136,7 +140,10 @@ var FeishuChannelPlugin = class {
136
140
  streaming = createFeishuStreamingAdapter(() => this.cfg);
137
141
  status = createFeishuStatusAdapter();
138
142
  doctor = createFeishuDoctorAdapter();
139
- directory = createFeishuDirectoryAdapter();
143
+ directory = { resolveDisplayName: async (params) => {
144
+ const { createFeishuDirectoryAdapter } = await import("./directory/directory-adapter.js");
145
+ return createFeishuDirectoryAdapter().resolveDisplayName?.(params);
146
+ } };
140
147
  actions = { handleAction: handleFeishuChannelMessageAction };
141
148
  agentTools = [
142
149
  {
@@ -145,6 +152,7 @@ var FeishuChannelPlugin = class {
145
152
  execute: async (toolCtx, args) => {
146
153
  const messageId = typeof args?.messageId === "string" ? args.messageId : toolCtx.messageId;
147
154
  if (!messageId) throw new Error("feishu_read requires messageId");
155
+ const { getMessageFeishu } = await import("./outbound/actions.js");
148
156
  return await getMessageFeishu({
149
157
  cfg: this.cfg,
150
158
  accountId: toolCtx.accountId,
@@ -160,6 +168,7 @@ var FeishuChannelPlugin = class {
160
168
  const text = typeof args?.text === "string" ? args.text : "";
161
169
  if (!messageId) throw new Error("feishu_edit requires messageId");
162
170
  if (!text.trim()) throw new Error("feishu_edit requires text");
171
+ const { editMessageFeishu } = await import("./outbound/actions.js");
163
172
  return await editMessageFeishu({
164
173
  cfg: this.cfg,
165
174
  accountId: toolCtx.accountId,
@@ -172,6 +181,7 @@ var FeishuChannelPlugin = class {
172
181
  name: "feishu_scopes_probe",
173
182
  description: "Probe Feishu credentials/scopes (placeholder for full docs/wiki/drive tools).",
174
183
  execute: async (toolCtx) => {
184
+ const { feishuWhoAmI } = await import("./tools/tools.js");
175
185
  return await feishuWhoAmI({
176
186
  cfg: this.cfg,
177
187
  accountId: toolCtx.accountId
@@ -186,15 +196,19 @@ var FeishuChannelPlugin = class {
186
196
  const messageId = typeof a?.messageId === "string" ? a.messageId : toolCtx.messageId;
187
197
  if (!messageId) throw new Error("feishu_react requires messageId");
188
198
  if (!(resolveFeishuAccount(this.cfg, toolCtx.accountId ?? "default").actions?.reactions !== false)) throw new Error("Feishu reactions are disabled via channels.feishu.actions.reactions");
189
- if (a?.list === true) return await listReactionsFeishu({
190
- cfg: this.cfg,
191
- accountId: toolCtx.accountId,
192
- messageId,
193
- emojiType: typeof a?.emojiType === "string" ? a.emojiType : void 0
194
- });
199
+ if (a?.list === true) {
200
+ const { listReactionsFeishu } = await import("./outbound/actions.js");
201
+ return await listReactionsFeishu({
202
+ cfg: this.cfg,
203
+ accountId: toolCtx.accountId,
204
+ messageId,
205
+ emojiType: typeof a?.emojiType === "string" ? a.emojiType : void 0
206
+ });
207
+ }
195
208
  if (a?.remove === true) {
196
209
  const reactionId = typeof a?.reactionId === "string" ? a.reactionId : "";
197
210
  if (!reactionId) throw new Error("feishu_react remove requires reactionId");
211
+ const { removeReactionFeishu } = await import("./outbound/actions.js");
198
212
  return await removeReactionFeishu({
199
213
  cfg: this.cfg,
200
214
  accountId: toolCtx.accountId,
@@ -204,6 +218,7 @@ var FeishuChannelPlugin = class {
204
218
  }
205
219
  const emojiType = typeof a?.emojiType === "string" ? a.emojiType : "";
206
220
  if (!emojiType) throw new Error("feishu_react requires emojiType");
221
+ const { addReactionFeishu } = await import("./outbound/actions.js");
207
222
  return await addReactionFeishu({
208
223
  cfg: this.cfg,
209
224
  accountId: toolCtx.accountId,
@@ -221,6 +236,7 @@ var FeishuChannelPlugin = class {
221
236
  if (action === "list") {
222
237
  const chatId = typeof a?.chatId === "string" ? a.chatId : toolCtx.chatId;
223
238
  if (!chatId) throw new Error("feishu_pins list requires chatId");
239
+ const { listPinsFeishu } = await import("./outbound/actions.js");
224
240
  return await listPinsFeishu({
225
241
  cfg: this.cfg,
226
242
  accountId: toolCtx.accountId,
@@ -233,16 +249,22 @@ var FeishuChannelPlugin = class {
233
249
  }
234
250
  const messageId = typeof a?.messageId === "string" ? a.messageId : toolCtx.messageId;
235
251
  if (!messageId) throw new Error("feishu_pins requires messageId");
236
- if (action === "pin") return await pinMessageFeishu({
237
- cfg: this.cfg,
238
- accountId: toolCtx.accountId,
239
- messageId
240
- });
241
- if (action === "unpin") return await unpinMessageFeishu({
242
- cfg: this.cfg,
243
- accountId: toolCtx.accountId,
244
- messageId
245
- });
252
+ if (action === "pin") {
253
+ const { pinMessageFeishu } = await import("./outbound/actions.js");
254
+ return await pinMessageFeishu({
255
+ cfg: this.cfg,
256
+ accountId: toolCtx.accountId,
257
+ messageId
258
+ });
259
+ }
260
+ if (action === "unpin") {
261
+ const { unpinMessageFeishu } = await import("./outbound/actions.js");
262
+ return await unpinMessageFeishu({
263
+ cfg: this.cfg,
264
+ accountId: toolCtx.accountId,
265
+ messageId
266
+ });
267
+ }
246
268
  throw new Error("feishu_pins requires action: pin | unpin | list");
247
269
  }
248
270
  }
@@ -261,9 +283,13 @@ var FeishuChannelPlugin = class {
261
283
  }, "Feishu inbound pipeline flush failed");
262
284
  }
263
285
  });
264
- this.workflowProgressUnregister = getWorkflowProgressBroker().registerChannel(createFeishuWorkflowProgressCapability({ getConfig: () => this.cfg }));
286
+ await this.registerWorkflowProgressCapability();
265
287
  log.debug("Feishu plugin initialized");
266
288
  }
289
+ async registerWorkflowProgressCapability() {
290
+ const [{ getWorkflowProgressBroker }, { createFeishuWorkflowProgressCapability }] = await Promise.all([import("../../../src/agent/workflow/progress-broker.js"), import("./workflow-progress.js")]);
291
+ this.workflowProgressUnregister = getWorkflowProgressBroker().registerChannel(createFeishuWorkflowProgressCapability({ getConfig: () => this.cfg }));
292
+ }
267
293
  async start(options) {
268
294
  const section = this.cfg.channels?.feishu;
269
295
  if (!section || section.enabled !== true) return;
@@ -280,22 +306,15 @@ var FeishuChannelPlugin = class {
280
306
  if (!p) return this.bus.publishInbound(work.inbound);
281
307
  return p.enqueue(work);
282
308
  };
283
- const monitor = createFeishuSocketModeMonitor({
309
+ const monitorDeps = {
284
310
  account,
285
311
  config: this.cfg,
286
312
  enqueueInbound,
287
313
  inboundDebounceDefaultMs: defaultDebounce,
288
314
  abortSignal: ac.signal,
289
315
  security: { checkAccess: (ctx) => this.security.checkAccess?.(ctx, account, this.cfg) }
290
- });
291
- (account.connectionMode === "webhook" ? createFeishuWebhookMonitor({
292
- account,
293
- config: this.cfg,
294
- enqueueInbound,
295
- inboundDebounceDefaultMs: defaultDebounce,
296
- abortSignal: ac.signal,
297
- security: { checkAccess: (ctx) => this.security.checkAccess?.(ctx, account, this.cfg) }
298
- }) : monitor).run().catch((err) => {
316
+ };
317
+ (account.connectionMode === "webhook" ? (await import("./transport/webhook/monitor.js")).createFeishuWebhookMonitor(monitorDeps) : (await import("./transport/socket-mode/monitor.js")).createFeishuSocketModeMonitor(monitorDeps)).run().catch((err) => {
299
318
  if (err?.name === "AbortError") {
300
319
  log.debug({ accountId }, "Feishu monitor stopped");
301
320
  return;