@messenger-box/platform-server 10.0.3-alpha.2 → 10.0.3-alpha.202

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 (303) hide show
  1. package/lib/channels/ack-reactions.d.ts +46 -0
  2. package/lib/channels/ack-reactions.js +48 -0
  3. package/lib/channels/ack-reactions.js.map +1 -0
  4. package/lib/channels/allowlist-match.d.ts +38 -0
  5. package/lib/channels/allowlist-match.js +67 -0
  6. package/lib/channels/allowlist-match.js.map +1 -0
  7. package/lib/channels/channel-config.d.ts +46 -0
  8. package/lib/channels/channel-config.js +63 -0
  9. package/lib/channels/channel-config.js.map +1 -0
  10. package/lib/channels/command-gating.d.ts +47 -0
  11. package/lib/channels/command-gating.js +52 -0
  12. package/lib/channels/command-gating.js.map +1 -0
  13. package/lib/channels/conversation-label.d.ts +23 -0
  14. package/lib/channels/conversation-label.js +43 -0
  15. package/lib/channels/conversation-label.js.map +1 -0
  16. package/lib/channels/index.d.ts +18 -0
  17. package/lib/channels/mention-gating.d.ts +50 -0
  18. package/lib/channels/mention-gating.js +72 -0
  19. package/lib/channels/mention-gating.js.map +1 -0
  20. package/lib/channels/registry.d.ts +23 -0
  21. package/lib/channels/registry.js +282 -0
  22. package/lib/channels/registry.js.map +1 -0
  23. package/lib/channels/sender-identity.d.ts +11 -0
  24. package/lib/channels/sender-identity.js +48 -0
  25. package/lib/channels/sender-identity.js.map +1 -0
  26. package/lib/channels/session.d.ts +63 -0
  27. package/lib/channels/session.js +29 -0
  28. package/lib/channels/session.js.map +1 -0
  29. package/lib/channels/types.d.ts +147 -0
  30. package/lib/channels/types.js +28 -0
  31. package/lib/channels/types.js.map +1 -0
  32. package/lib/channels/typing.d.ts +62 -0
  33. package/lib/channels/typing.js +37 -0
  34. package/lib/channels/typing.js.map +1 -0
  35. package/lib/channels/typing.test.d.ts +1 -0
  36. package/lib/config/env-config.d.ts +7 -0
  37. package/lib/config/env-config.js +21 -1
  38. package/lib/config/env-config.js.map +1 -1
  39. package/lib/constants/default-channel-props.d.ts +11 -0
  40. package/lib/constants/default-channel-props.js +32 -0
  41. package/lib/constants/default-channel-props.js.map +1 -0
  42. package/lib/constants/default-notify-props.js.map +1 -1
  43. package/lib/constants/index.d.ts +1 -0
  44. package/lib/constants/query.constants.js.map +1 -1
  45. package/lib/containers/containers.js +13 -7
  46. package/lib/containers/containers.js.map +1 -1
  47. package/lib/containers/context-services-from-container.d.ts +2 -2
  48. package/lib/containers/context-services-from-container.js +7 -7
  49. package/lib/containers/context-services-from-container.js.map +1 -1
  50. package/lib/gateway/channel-registry.d.ts +10 -0
  51. package/lib/gateway/gateway-service.d.ts +23 -0
  52. package/lib/gateway/index.d.ts +4 -0
  53. package/lib/gateway/message-router.d.ts +20 -0
  54. package/lib/gateway/types.d.ts +270 -0
  55. package/lib/graphql/resolvers/channel-capabilities.d.ts +13 -0
  56. package/lib/graphql/resolvers/channel-capabilities.js +179 -0
  57. package/lib/graphql/resolvers/channel-capabilities.js.map +1 -0
  58. package/lib/graphql/resolvers/channel-member.d.ts +3 -3
  59. package/lib/graphql/resolvers/channel-member.js +30 -5
  60. package/lib/graphql/resolvers/channel-member.js.map +1 -1
  61. package/lib/graphql/resolvers/channel.d.ts +3 -3
  62. package/lib/graphql/resolvers/channel.js +348 -55
  63. package/lib/graphql/resolvers/channel.js.map +1 -1
  64. package/lib/graphql/resolvers/chat-configuration.d.ts +59 -0
  65. package/lib/graphql/resolvers/chat-configuration.js +89 -0
  66. package/lib/graphql/resolvers/chat-configuration.js.map +1 -0
  67. package/lib/graphql/resolvers/extended-token-account.d.ts +3 -32
  68. package/lib/graphql/resolvers/extended-token-account.js +90 -23
  69. package/lib/graphql/resolvers/extended-token-account.js.map +1 -1
  70. package/lib/graphql/resolvers/gateway.d.ts +18 -0
  71. package/lib/graphql/resolvers/index.d.ts +47 -26
  72. package/lib/graphql/resolvers/index.js +1 -1
  73. package/lib/graphql/resolvers/index.js.map +1 -1
  74. package/lib/graphql/resolvers/post-thread.d.ts +2 -3
  75. package/lib/graphql/resolvers/post-thread.js +294 -132
  76. package/lib/graphql/resolvers/post-thread.js.map +1 -1
  77. package/lib/graphql/resolvers/post.d.ts +2 -3
  78. package/lib/graphql/resolvers/post.js +772 -238
  79. package/lib/graphql/resolvers/post.js.map +1 -1
  80. package/lib/graphql/resolvers/reaction.d.ts +3 -3
  81. package/lib/graphql/resolvers/reaction.js +96 -14
  82. package/lib/graphql/resolvers/reaction.js.map +1 -1
  83. package/lib/graphql/resolvers/streaming.d.ts +20 -0
  84. package/lib/graphql/resolvers/streaming.js +147 -0
  85. package/lib/graphql/resolvers/streaming.js.map +1 -0
  86. package/lib/graphql/schema/channel-capabilities.graphql +492 -0
  87. package/lib/graphql/schema/channel-capabilities.graphql.js +1 -0
  88. package/lib/graphql/schema/channel-capabilities.graphql.js.map +1 -0
  89. package/lib/graphql/schema/channel-member.graphql +110 -21
  90. package/lib/graphql/schema/channel-member.graphql.js +1 -1
  91. package/lib/graphql/schema/channel.graphql +465 -24
  92. package/lib/graphql/schema/channel.graphql.js +1 -1
  93. package/lib/graphql/schema/chat-configuration.graphql +77 -0
  94. package/lib/graphql/schema/chat-configuration.graphql.js +1 -0
  95. package/lib/graphql/schema/chat-configuration.graphql.js.map +1 -0
  96. package/lib/graphql/schema/gateway.graphql +363 -0
  97. package/lib/graphql/schema/index.js +2 -2
  98. package/lib/graphql/schema/index.js.map +1 -1
  99. package/lib/graphql/schema/post-thread.graphql +167 -21
  100. package/lib/graphql/schema/post-thread.graphql.js +1 -1
  101. package/lib/graphql/schema/post.graphql +440 -36
  102. package/lib/graphql/schema/post.graphql.js +1 -1
  103. package/lib/graphql/schema/preferences.graphql +190 -3
  104. package/lib/graphql/schema/preferences.graphql.js +1 -1
  105. package/lib/graphql/schema/reaction.graphql +71 -13
  106. package/lib/graphql/schema/reaction.graphql.js +1 -1
  107. package/lib/graphql/schema/services.graphql +18 -0
  108. package/lib/graphql/schema/streaming.graphql +224 -0
  109. package/lib/graphql/schema/streaming.graphql.js +1 -0
  110. package/lib/graphql/schema/streaming.graphql.js.map +1 -0
  111. package/lib/graphql/schema/users.graphql +76 -13
  112. package/lib/graphql/schema/users.graphql.js +1 -1
  113. package/lib/graphql/schema/workflow-service.graphql +82 -0
  114. package/lib/index.d.ts +3 -1
  115. package/lib/index.js +1 -1
  116. package/lib/index.js.map +1 -1
  117. package/lib/interfaces/index.d.ts +0 -2
  118. package/lib/interfaces/services.d.ts +1 -3
  119. package/lib/migrations/dbMigrations/AddChannelConfigurationsMigration.d.ts +42 -0
  120. package/lib/migrations/dbMigrations/AddChannelConfigurationsMigration.js +60 -0
  121. package/lib/migrations/dbMigrations/AddChannelConfigurationsMigration.js.map +1 -0
  122. package/lib/migrations/dbMigrations/AddChatConfigurationsMigration.d.ts +21 -0
  123. package/lib/migrations/dbMigrations/AddChatConfigurationsMigration.js +30 -0
  124. package/lib/migrations/dbMigrations/AddChatConfigurationsMigration.js.map +1 -0
  125. package/lib/migrations/dbMigrations/AddPostsConfigurationsMigration.d.ts +17 -0
  126. package/lib/migrations/dbMigrations/AddPostsConfigurationsMigration.js +44 -0
  127. package/lib/migrations/dbMigrations/AddPostsConfigurationsMigration.js.map +1 -0
  128. package/lib/migrations/dbMigrations/index.d.ts +3 -0
  129. package/lib/migrations/index.d.ts +1 -0
  130. package/lib/migrations/mail-template-migration.d.ts +3 -6
  131. package/lib/migrations/mail-template-migration.js +8 -21
  132. package/lib/migrations/mail-template-migration.js.map +1 -1
  133. package/lib/migrations/message-notification-template-migration.d.ts +4 -7
  134. package/lib/migrations/message-notification-template-migration.js +8 -25
  135. package/lib/migrations/message-notification-template-migration.js.map +1 -1
  136. package/lib/module.d.ts +1 -1
  137. package/lib/module.js +3 -10
  138. package/lib/module.js.map +1 -1
  139. package/lib/plugins/ChannelMoleculerService.d.ts +39 -0
  140. package/lib/plugins/ChannelMoleculerService.js +58 -0
  141. package/lib/plugins/ChannelMoleculerService.js.map +1 -0
  142. package/lib/plugins/ExtendedTokenAccountMoleculerService.d.ts +65 -0
  143. package/lib/plugins/ExtendedTokenAccountMoleculerService.js +88 -0
  144. package/lib/plugins/ExtendedTokenAccountMoleculerService.js.map +1 -0
  145. package/lib/plugins/MessengerNotificationMoleculerService.d.ts +52 -0
  146. package/lib/plugins/MessengerNotificationMoleculerService.js +84 -0
  147. package/lib/plugins/MessengerNotificationMoleculerService.js.map +1 -0
  148. package/lib/plugins/PostMoleculerService.d.ts +65 -0
  149. package/lib/plugins/PostMoleculerService.js +87 -0
  150. package/lib/plugins/PostMoleculerService.js.map +1 -0
  151. package/lib/plugins/PostThreadMoleculerService.d.ts +40 -0
  152. package/lib/plugins/PostThreadMoleculerService.js +59 -0
  153. package/lib/plugins/PostThreadMoleculerService.js.map +1 -0
  154. package/lib/plugins/ReactionMoleculerService.d.ts +37 -0
  155. package/lib/plugins/ReactionMoleculerService.js +56 -0
  156. package/lib/plugins/ReactionMoleculerService.js.map +1 -0
  157. package/lib/plugins/index.d.ts +18 -6
  158. package/lib/preferences/permissions/inbox-permission-contribution.js +58 -97
  159. package/lib/preferences/permissions/inbox-permission-contribution.js.map +1 -1
  160. package/lib/preferences/permissions/inbox-roles-permission-overwrite.js +144 -144
  161. package/lib/preferences/permissions/inbox-roles-permission-overwrite.js.map +1 -1
  162. package/lib/preferences/settings/channel-settings.d.ts +39 -0
  163. package/lib/preferences/settings/channel-settings.js +180 -0
  164. package/lib/preferences/settings/channel-settings.js.map +1 -0
  165. package/lib/preferences/settings/chat-settings.d.ts +248 -0
  166. package/lib/preferences/settings/chat-settings.js +1152 -0
  167. package/lib/preferences/settings/chat-settings.js.map +1 -0
  168. package/lib/preferences/settings/index.d.ts +3 -0
  169. package/lib/preferences/settings/messenger-channels-contribution.d.ts +39 -0
  170. package/lib/preferences/settings/messenger-channels-contribution.js +355 -0
  171. package/lib/preferences/settings/messenger-channels-contribution.js.map +1 -0
  172. package/lib/preferences/settings/post-settings.d.ts +16 -0
  173. package/lib/preferences/settings/post-settings.js +75 -3
  174. package/lib/preferences/settings/post-settings.js.map +1 -1
  175. package/lib/services/channel-service.d.ts +215 -34
  176. package/lib/services/channel-service.js +1058 -273
  177. package/lib/services/channel-service.js.map +1 -1
  178. package/lib/services/extended-token-account-service.d.ts +175 -20
  179. package/lib/services/extended-token-account-service.js +636 -56
  180. package/lib/services/extended-token-account-service.js.map +1 -1
  181. package/lib/services/messenger-notification-service.d.ts +177 -17
  182. package/lib/services/messenger-notification-service.js +975 -421
  183. package/lib/services/messenger-notification-service.js.map +1 -1
  184. package/lib/services/post-service.d.ts +245 -18
  185. package/lib/services/post-service.js +1027 -113
  186. package/lib/services/post-service.js.map +1 -1
  187. package/lib/services/post-thread-service.d.ts +153 -6
  188. package/lib/services/post-thread-service.js +475 -9
  189. package/lib/services/post-thread-service.js.map +1 -1
  190. package/lib/services/proxy-services/ChannelProxyService.d.ts +27 -0
  191. package/lib/services/proxy-services/ChannelProxyService.js +31 -0
  192. package/lib/services/proxy-services/ChannelProxyService.js.map +1 -0
  193. package/lib/services/proxy-services/ExtendedTokenAccountProxyService.d.ts +42 -0
  194. package/lib/services/proxy-services/ExtendedTokenAccountProxyService.js +46 -0
  195. package/lib/services/proxy-services/ExtendedTokenAccountProxyService.js.map +1 -0
  196. package/lib/services/proxy-services/MessengerNotificationProxyService.d.ts +44 -0
  197. package/lib/services/proxy-services/MessengerNotificationProxyService.js +54 -0
  198. package/lib/services/proxy-services/MessengerNotificationProxyService.js.map +1 -0
  199. package/lib/services/proxy-services/PostProxyService.d.ts +42 -0
  200. package/lib/services/proxy-services/PostProxyService.js +46 -0
  201. package/lib/services/proxy-services/PostProxyService.js.map +1 -0
  202. package/lib/services/proxy-services/PostThreadProxyService.d.ts +32 -0
  203. package/lib/services/proxy-services/PostThreadProxyService.js +36 -0
  204. package/lib/services/proxy-services/PostThreadProxyService.js.map +1 -0
  205. package/lib/services/proxy-services/ReactionProxyService.d.ts +41 -0
  206. package/lib/services/proxy-services/ReactionProxyService.js +45 -0
  207. package/lib/services/proxy-services/ReactionProxyService.js.map +1 -0
  208. package/lib/services/proxy-services/index.d.ts +17 -5
  209. package/lib/services/reaction-service.d.ts +124 -4
  210. package/lib/services/reaction-service.js +413 -3
  211. package/lib/services/reaction-service.js.map +1 -1
  212. package/lib/store/models/account-token-store.d.ts +1 -1
  213. package/lib/store/models/account-token-store.js.map +1 -1
  214. package/lib/store/models/channel.d.ts +2 -3
  215. package/lib/store/models/channel.js +216 -70
  216. package/lib/store/models/channel.js.map +1 -1
  217. package/lib/store/models/post-thread.d.ts +3 -3
  218. package/lib/store/models/post-thread.js +96 -14
  219. package/lib/store/models/post-thread.js.map +1 -1
  220. package/lib/store/models/post.d.ts +2 -3
  221. package/lib/store/models/post.js +143 -23
  222. package/lib/store/models/post.js.map +1 -1
  223. package/lib/store/models/reaction.d.ts +2 -3
  224. package/lib/store/models/reaction.js +67 -8
  225. package/lib/store/models/reaction.js.map +1 -1
  226. package/lib/store/repositories/__tests__/__fixtures__/team-repository.d.ts +3 -3
  227. package/lib/store/repositories/channel-repository.d.ts +6 -6
  228. package/lib/store/repositories/channel-repository.js +5 -2
  229. package/lib/store/repositories/channel-repository.js.map +1 -1
  230. package/lib/store/repositories/post-repository.d.ts +6 -6
  231. package/lib/store/repositories/post-repository.js +5 -2
  232. package/lib/store/repositories/post-repository.js.map +1 -1
  233. package/lib/store/repositories/post-thread-repository.d.ts +6 -6
  234. package/lib/store/repositories/post-thread-repository.js +5 -2
  235. package/lib/store/repositories/post-thread-repository.js.map +1 -1
  236. package/lib/store/repositories/reaction-repository.d.ts +6 -6
  237. package/lib/store/repositories/reaction-repository.js +5 -2
  238. package/lib/store/repositories/reaction-repository.js.map +1 -1
  239. package/lib/streaming/block-chunker.d.ts +40 -0
  240. package/lib/streaming/block-chunker.js +103 -0
  241. package/lib/streaming/block-chunker.js.map +1 -0
  242. package/lib/streaming/block-chunker.test.d.ts +1 -0
  243. package/lib/streaming/index.d.ts +4 -0
  244. package/lib/streaming/stream-service.d.ts +71 -0
  245. package/lib/streaming/stream-service.js +325 -0
  246. package/lib/streaming/stream-service.js.map +1 -0
  247. package/lib/streaming/stream-service.test.d.ts +16 -0
  248. package/lib/streaming/streaming-post.integration.test.d.ts +10 -0
  249. package/lib/streaming/types.d.ts +33 -0
  250. package/lib/streaming/types.js +37 -0
  251. package/lib/streaming/types.js.map +1 -0
  252. package/lib/templates/constants/CONTRIBUTION_POINTS.ts.template +78 -0
  253. package/lib/templates/constants/SERVER_TYPES.ts.template +1 -4
  254. package/lib/templates/constants/WorkflowNamespace.ts.template +10 -0
  255. package/lib/templates/repositories/ChannelRepository.ts.template +3 -3
  256. package/lib/templates/repositories/PostRepository.ts.template +3 -3
  257. package/lib/templates/repositories/PostThreadRepository.ts.template +3 -3
  258. package/lib/templates/repositories/ReactionRepository.ts.template +3 -4
  259. package/lib/templates/services/ChannelService.ts.template +290 -39
  260. package/lib/templates/services/ExtendedTokenAccountService.ts.template +107 -3
  261. package/lib/templates/services/MessengerNotificationService.ts.template +94 -19
  262. package/lib/templates/services/MessengerStreamService.ts.template +131 -0
  263. package/lib/templates/services/PostService.ts.template +228 -20
  264. package/lib/templates/services/PostThreadService.ts.template +151 -6
  265. package/lib/templates/services/ReactionService.ts.template +129 -3
  266. package/lib/templates/services/RedisCacheManager.ts.template +22 -0
  267. package/package.json +10 -6
  268. package/lib/interfaces/context.d.ts +0 -14
  269. package/lib/plugins/channel-moleculer-service.d.ts +0 -8
  270. package/lib/plugins/channel-moleculer-service.js +0 -129
  271. package/lib/plugins/channel-moleculer-service.js.map +0 -1
  272. package/lib/plugins/extended-token-account-moleculer-service.d.ts +0 -8
  273. package/lib/plugins/extended-token-account-moleculer-service.js +0 -47
  274. package/lib/plugins/extended-token-account-moleculer-service.js.map +0 -1
  275. package/lib/plugins/messenger-notification-moleculer-service.d.ts +0 -9
  276. package/lib/plugins/messenger-notification-moleculer-service.js +0 -116
  277. package/lib/plugins/messenger-notification-moleculer-service.js.map +0 -1
  278. package/lib/plugins/post-moleculer-service.d.ts +0 -35
  279. package/lib/plugins/post-moleculer-service.js +0 -393
  280. package/lib/plugins/post-moleculer-service.js.map +0 -1
  281. package/lib/plugins/post-thread-moleculer-service.d.ts +0 -8
  282. package/lib/plugins/post-thread-moleculer-service.js +0 -33
  283. package/lib/plugins/post-thread-moleculer-service.js.map +0 -1
  284. package/lib/plugins/reaction-moleculer-service.d.ts +0 -8
  285. package/lib/plugins/reaction-moleculer-service.js +0 -20
  286. package/lib/plugins/reaction-moleculer-service.js.map +0 -1
  287. package/lib/services/proxy-services/channel-microservice.d.ts +0 -44
  288. package/lib/services/proxy-services/channel-microservice.js +0 -199
  289. package/lib/services/proxy-services/channel-microservice.js.map +0 -1
  290. package/lib/services/proxy-services/messenger-notification-microservice.d.ts +0 -16
  291. package/lib/services/proxy-services/messenger-notification-microservice.js +0 -54
  292. package/lib/services/proxy-services/messenger-notification-microservice.js.map +0 -1
  293. package/lib/services/proxy-services/post-microservice.d.ts +0 -22
  294. package/lib/services/proxy-services/post-microservice.js +0 -64
  295. package/lib/services/proxy-services/post-microservice.js.map +0 -1
  296. package/lib/services/proxy-services/post-thread-microservice.d.ts +0 -10
  297. package/lib/services/proxy-services/post-thread-microservice.js +0 -15
  298. package/lib/services/proxy-services/post-thread-microservice.js.map +0 -1
  299. package/lib/services/proxy-services/reaction-microservice.d.ts +0 -9
  300. package/lib/services/proxy-services/reaction-microservice.js +0 -10
  301. package/lib/services/proxy-services/reaction-microservice.js.map +0 -1
  302. package/lib/store/models/common-options.js +0 -20
  303. package/lib/store/models/common-options.js.map +0 -1
@@ -0,0 +1,270 @@
1
+ /**
2
+ * Gateway Types — External messaging channel provider interfaces.
3
+ *
4
+ * Designed Go-portable: no Inversify decorators, no Mongoose, no Moleculer.
5
+ * Every interface maps 1:1 to a Go interface. Uses plain constructors,
6
+ * explicit error returns, and typed queues (via EventEmitter or NATS topics).
7
+ *
8
+ * Architecture mapping:
9
+ * openclaw → ChannelProvider / ChannelAccountManager → this file
10
+ * picoclaw → pkg/channels/channel.go → this file
11
+ * clockbook → BOT_TYPES.IChannelRegistry → this file
12
+ *
13
+ * Channel extensions register providers via `contributes.channels` in their
14
+ * package.json and call `channels.registerProvider()` during activation.
15
+ */
16
+ import type { IChannelCapabilities, IChannelDock, IChannelAccountSnapshot, IChannelStatusIssue } from '../channels/types';
17
+ /** Provider lifecycle state */
18
+ export type ProviderState = 'disconnected' | 'connecting' | 'connected' | 'reconnecting' | 'error';
19
+ /** Direction of a message relative to the gateway */
20
+ export type MessageDirection = 'inbound' | 'outbound';
21
+ /** Media attachment type */
22
+ export type MediaType = 'image' | 'audio' | 'video' | 'document' | 'sticker' | 'location' | 'contact';
23
+ export interface IMediaAttachment {
24
+ type: MediaType;
25
+ url?: string;
26
+ /** Raw bytes (base64 in JSON, []byte in Go) */
27
+ data?: string;
28
+ mimeType?: string;
29
+ filename?: string;
30
+ caption?: string;
31
+ /** Duration in seconds (audio/video) */
32
+ durationSec?: number;
33
+ /** Thumbnail URL or base64 */
34
+ thumbnail?: string;
35
+ }
36
+ /** An inbound message from an external channel into the gateway */
37
+ export interface IInboundMessage {
38
+ /** Unique message ID from the external platform */
39
+ externalId: string;
40
+ /** Channel provider identifier (e.g. 'whatsapp', 'telegram') */
41
+ channelType: string;
42
+ /** Account ID within the channel provider */
43
+ accountId: string;
44
+ /** Sender identifier on the external platform */
45
+ senderId: string;
46
+ /** Sender display name */
47
+ senderName?: string;
48
+ /** Chat/conversation identifier on the external platform */
49
+ chatId: string;
50
+ /** Chat type */
51
+ chatType?: 'direct' | 'group' | 'channel';
52
+ /** Text content */
53
+ text?: string;
54
+ /** Media attachments */
55
+ media?: IMediaAttachment[];
56
+ /** Whether this is a reply to another message */
57
+ replyToExternalId?: string;
58
+ /** Unix timestamp in ms */
59
+ timestamp: number;
60
+ /** Raw payload from the external platform (for debugging/passthrough) */
61
+ raw?: Record<string, unknown>;
62
+ }
63
+ /** An outbound message from the gateway to an external channel */
64
+ export interface IOutboundMessage {
65
+ /** Channel provider identifier */
66
+ channelType: string;
67
+ /** Account ID within the channel provider */
68
+ accountId: string;
69
+ /** Target chat/conversation identifier */
70
+ chatId: string;
71
+ /** Text content */
72
+ text?: string;
73
+ /** Media attachments */
74
+ media?: IMediaAttachment[];
75
+ /** Reply to a specific external message ID */
76
+ replyToExternalId?: string;
77
+ /** Arbitrary metadata */
78
+ metadata?: Record<string, unknown>;
79
+ }
80
+ /** Result of sending an outbound message */
81
+ export interface ISendResult {
82
+ success: boolean;
83
+ /** External message ID assigned by the platform */
84
+ externalId?: string;
85
+ /** Error message if failed */
86
+ error?: string;
87
+ /** Timestamp of delivery (Unix ms) */
88
+ timestamp?: number;
89
+ }
90
+ /** Configuration schema for a channel provider (declared in contributes.channels) */
91
+ export interface IChannelProviderConfig {
92
+ /** Unique provider type identifier (e.g. 'whatsapp', 'telegram') */
93
+ type: string;
94
+ /** Human-readable label */
95
+ label: string;
96
+ /** Provider description */
97
+ description?: string;
98
+ /** Icon name or URL */
99
+ icon?: string;
100
+ /** Provider capabilities */
101
+ capabilities: IChannelCapabilities;
102
+ /** Dock (outbound constraints, streaming, threading config) */
103
+ dock?: Partial<IChannelDock>;
104
+ /** JSON Schema for provider-specific configuration (API keys, tokens, etc.) */
105
+ configSchema?: Record<string, unknown>;
106
+ }
107
+ /**
108
+ * IExternalChannelProvider — the interface that channel extensions implement.
109
+ *
110
+ * Each extension contributes one provider. The gateway discovers providers
111
+ * via `contributes.channels` in the extension manifest and calls
112
+ * `channels.registerProvider(provider)` during extension activation.
113
+ *
114
+ * Go mapping:
115
+ * type ChannelProvider interface {
116
+ * Type() string
117
+ * Connect(ctx context.Context, accountId string, config map[string]any) error
118
+ * Disconnect(ctx context.Context, accountId string) error
119
+ * Send(ctx context.Context, msg OutboundMessage) (SendResult, error)
120
+ * State(accountId string) ProviderState
121
+ * OnMessage(handler func(InboundMessage))
122
+ * }
123
+ */
124
+ export interface IExternalChannelProvider {
125
+ /** Provider type identifier (e.g. 'whatsapp') */
126
+ readonly type: string;
127
+ /** Provider configuration */
128
+ readonly config: IChannelProviderConfig;
129
+ /**
130
+ * Connect an account to the external platform.
131
+ * @param accountId - Unique account identifier
132
+ * @param options - Provider-specific connection options (API keys, session data, etc.)
133
+ * @param signal - AbortSignal for cancellation (Go: context.Context)
134
+ */
135
+ connect(accountId: string, options: Record<string, unknown>, signal?: AbortSignal): Promise<void>;
136
+ /**
137
+ * Disconnect an account from the external platform.
138
+ * @param accountId - Account to disconnect
139
+ */
140
+ disconnect(accountId: string): Promise<void>;
141
+ /**
142
+ * Send a message to the external platform.
143
+ * @param message - Outbound message to send
144
+ * @returns Send result with external ID on success
145
+ */
146
+ send(message: IOutboundMessage): Promise<ISendResult>;
147
+ /**
148
+ * Get the current connection state for an account.
149
+ * @param accountId - Account identifier
150
+ */
151
+ getState(accountId: string): ProviderState;
152
+ /**
153
+ * Get a snapshot of account status (connection info, last message times, etc.)
154
+ * @param accountId - Account identifier
155
+ */
156
+ getAccountSnapshot(accountId: string): IChannelAccountSnapshot | undefined;
157
+ /**
158
+ * Get any status issues (config problems, auth failures, etc.)
159
+ * @param accountId - Account identifier
160
+ */
161
+ getStatusIssues(accountId: string): IChannelStatusIssue[];
162
+ /**
163
+ * Register a handler for inbound messages.
164
+ * The gateway calls this once during provider registration.
165
+ * @param handler - Callback invoked for each inbound message
166
+ */
167
+ onMessage(handler: (message: IInboundMessage) => void): void;
168
+ /**
169
+ * Register a handler for provider state changes.
170
+ * @param handler - Callback invoked when connection state changes
171
+ */
172
+ onStateChange?(handler: (accountId: string, state: ProviderState) => void): void;
173
+ /**
174
+ * Dispose all resources. Called when the extension is deactivated.
175
+ */
176
+ dispose(): Promise<void>;
177
+ }
178
+ /**
179
+ * IExternalChannelRegistry — tracks all registered external channel providers.
180
+ *
181
+ * Providers register themselves via extension activation; the gateway looks
182
+ * them up by type when routing messages.
183
+ *
184
+ * Go mapping:
185
+ * type ChannelRegistry struct { providers map[string]ChannelProvider }
186
+ */
187
+ export interface IExternalChannelRegistry {
188
+ /** Register a channel provider (called during extension activation) */
189
+ register(provider: IExternalChannelProvider): void;
190
+ /** Unregister a channel provider (called during extension deactivation) */
191
+ unregister(providerType: string): void;
192
+ /** Get a provider by type */
193
+ get(providerType: string): IExternalChannelProvider | undefined;
194
+ /** List all registered provider types */
195
+ listTypes(): string[];
196
+ /** List all providers with their configs */
197
+ listProviders(): IChannelProviderConfig[];
198
+ /** Check if a provider type is registered */
199
+ has(providerType: string): boolean;
200
+ }
201
+ /** Gateway status for a single provider/account pair */
202
+ export interface IGatewayChannelStatus {
203
+ channelType: string;
204
+ accountId: string;
205
+ state: ProviderState;
206
+ label: string;
207
+ snapshot?: IChannelAccountSnapshot;
208
+ issues: IChannelStatusIssue[];
209
+ }
210
+ /**
211
+ * IGatewayService — the top-level gateway orchestrator.
212
+ *
213
+ * Owns the channel registry, routes inbound messages to the platform,
214
+ * and dispatches outbound messages to the correct provider.
215
+ *
216
+ * Go mapping:
217
+ * type GatewayService struct {
218
+ * registry *ChannelRegistry
219
+ * router *MessageRouter
220
+ * eventBus *nats.Conn
221
+ * }
222
+ */
223
+ export interface IGatewayService {
224
+ /** Initialize the gateway (called once at startup) */
225
+ initialize(): Promise<void>;
226
+ /** Shut down the gateway gracefully */
227
+ shutdown(): Promise<void>;
228
+ /** Get the channel registry */
229
+ getRegistry(): IExternalChannelRegistry;
230
+ /** Connect an account on a specific channel */
231
+ connectChannel(channelType: string, accountId: string, options: Record<string, unknown>): Promise<void>;
232
+ /** Disconnect an account on a specific channel */
233
+ disconnectChannel(channelType: string, accountId: string): Promise<void>;
234
+ /** Send an outbound message via the appropriate provider */
235
+ sendMessage(message: IOutboundMessage): Promise<ISendResult>;
236
+ /** Get status for all connected channels/accounts */
237
+ getStatus(): IGatewayChannelStatus[];
238
+ /** Get status for a specific channel type */
239
+ getChannelStatus(channelType: string): IGatewayChannelStatus[];
240
+ /**
241
+ * Register a handler for inbound messages (gateway → platform).
242
+ * The resolver/microservice uses this to feed messages into the platform.
243
+ */
244
+ onInboundMessage(handler: (message: IInboundMessage) => void): void;
245
+ }
246
+ /**
247
+ * IMessageRouterService — routes inbound messages to the messenger platform.
248
+ *
249
+ * Sits between external channel providers and the platform's channel/post
250
+ * services. Translates IInboundMessage into platform Post creation.
251
+ *
252
+ * Go mapping:
253
+ * type MessageRouter struct { channelSvc ChannelService; postSvc PostService }
254
+ */
255
+ export interface IMessageRouterService {
256
+ /** Route an inbound message to the platform */
257
+ routeInbound(message: IInboundMessage): Promise<void>;
258
+ /** Route an outbound message from the platform to the external channel */
259
+ routeOutbound(message: IOutboundMessage): Promise<ISendResult>;
260
+ }
261
+ /** Topic for gateway inbound messages */
262
+ export declare const GATEWAY_INBOUND_TOPIC = "GATEWAY_INBOUND";
263
+ /** Topic for gateway outbound messages */
264
+ export declare const GATEWAY_OUTBOUND_TOPIC = "GATEWAY_OUTBOUND";
265
+ /** Topic for gateway channel status changes */
266
+ export declare const GATEWAY_STATUS_TOPIC = "GATEWAY_STATUS";
267
+ /** Build a scoped topic for a specific channel type */
268
+ export declare function gatewayInboundTopic(channelType: string): string;
269
+ export declare function gatewayOutboundTopic(channelType: string): string;
270
+ export declare function gatewayStatusTopic(channelType: string): string;
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Channel Capabilities Resolver
3
+ *
4
+ * Handles GraphQL queries, mutations, and subscriptions for
5
+ * the openclaw-inspired channel capabilities system.
6
+ *
7
+ * All channel feature configuration lives in Channel.settings
8
+ * (schema driven by ChannelSettings preferences). The resolver
9
+ * reads/writes through that single field.
10
+ */
11
+ import { IResolverOptions } from '@common-stack/server-core';
12
+ import { IResolvers } from 'common/server';
13
+ export declare const channelCapabilitiesResolvers: (options: IResolverOptions) => IResolvers;
@@ -0,0 +1,179 @@
1
+ import {listChannelDocks,listChannelTypes,normalizeChannelTypeId,getChannelTypeMeta,getChannelCapabilities,getChannelDock}from'../../channels/registry.js';import {TYPING_SUBSCRIPTION_TOPIC}from'../../channels/typing.js';import {validateSenderIdentity}from'../../channels/sender-identity.js';import {resolveAllowlistMatch}from'../../channels/allowlist-match.js';import'../../constants/default-channel-props.js';const PRESENCE_CHANGED_TOPIC = 'PRESENCE_CHANGED';
2
+ const channelCapabilitiesResolvers = options => ({
3
+ Query: {
4
+ channelCapabilities: (_, args) => {
5
+ options.logger.trace('(Query.channelCapabilities) channelType [%s]', args.channelType);
6
+ const typeId = normalizeChannelTypeId(args.channelType);
7
+ if (!typeId) return null;
8
+ return getChannelCapabilities(typeId);
9
+ },
10
+ channelTypeMeta: (_, args) => {
11
+ options.logger.trace('(Query.channelTypeMeta) channelType [%s]', args.channelType);
12
+ const typeId = normalizeChannelTypeId(args.channelType);
13
+ if (!typeId) return null;
14
+ return getChannelTypeMeta(typeId);
15
+ },
16
+ channelDock: (_, args) => {
17
+ options.logger.trace('(Query.channelDock) channelType [%s]', args.channelType);
18
+ const typeId = normalizeChannelTypeId(args.channelType);
19
+ if (!typeId) return null;
20
+ const dock = getChannelDock(typeId);
21
+ return {
22
+ id: dock.id,
23
+ capabilities: dock.capabilities,
24
+ textChunkLimit: dock.outbound?.textChunkLimit,
25
+ threading: dock.threading
26
+ };
27
+ },
28
+ availableChannelTypes: () => {
29
+ options.logger.trace('(Query.availableChannelTypes)');
30
+ return listChannelTypes();
31
+ },
32
+ availableChannelDocks: () => {
33
+ options.logger.trace('(Query.availableChannelDocks)');
34
+ return listChannelDocks().map(dock => ({
35
+ id: dock.id,
36
+ capabilities: dock.capabilities,
37
+ textChunkLimit: dock.outbound?.textChunkLimit,
38
+ threading: dock.threading
39
+ }));
40
+ },
41
+ checkAllowlist: (_, args) => {
42
+ options.logger.trace('(Query.checkAllowlist) channelId [%s], senderId [%s]', args.channelId, args.senderId);
43
+ // In a full implementation, load the channel then read allowlist from settings:
44
+ // const channel = await channelService.get(args.channelId);
45
+ // const allowlistSettings = getChannelSetting(channel, 'allowlist');
46
+ // For now, return allow-all.
47
+ return resolveAllowlistMatch({
48
+ allowFrom: ['*'],
49
+ senderId: args.senderId,
50
+ senderName: args.senderName,
51
+ senderEmail: args.senderEmail
52
+ });
53
+ },
54
+ validateSender: (_, args) => {
55
+ options.logger.trace('(Query.validateSender) senderId [%s]', args.senderId);
56
+ const issues = validateSenderIdentity({
57
+ chatType: args.chatType,
58
+ senderId: args.senderId,
59
+ senderName: args.senderName,
60
+ senderUsername: args.senderUsername,
61
+ senderEmail: args.senderEmail
62
+ });
63
+ return {
64
+ valid: issues.length === 0,
65
+ issues
66
+ };
67
+ },
68
+ channelPresence: (_, args) => {
69
+ options.logger.trace('(Query.channelPresence) channelId [%s]', args.channelId);
70
+ // Placeholder: would query active presence from Redis/in-memory store
71
+ return [];
72
+ },
73
+ typingUsers: (_, args) => {
74
+ options.logger.trace('(Query.typingUsers) channelId [%s]', args.channelId);
75
+ // Placeholder: would query active typing users from Redis/in-memory store
76
+ return [];
77
+ }
78
+ },
79
+ Mutation: {
80
+ sendTypingIndicator: async (_, args, context) => {
81
+ const userId = context.userContext?.userId || context.user?.id;
82
+ options.logger.trace('(Mutation.sendTypingIndicator) channelId [%s], userId [%s], action [%s]', args.channelId, userId, args.action);
83
+ if (!userId) return false;
84
+ const event = {
85
+ userId,
86
+ channelId: args.channelId,
87
+ threadId: args.threadId,
88
+ action: args.action,
89
+ timestamp: new Date()
90
+ };
91
+ try {
92
+ if (!options.pubsub) {
93
+ options.logger.error('PubSub not available for sendTypingIndicator');
94
+ return false;
95
+ }
96
+ await options.pubsub.publish(`${TYPING_SUBSCRIPTION_TOPIC}:${args.channelId}`, {
97
+ typingIndicator: event
98
+ });
99
+ return true;
100
+ } catch (error) {
101
+ options.logger.error('Error publishing typing indicator: %o', error);
102
+ return false;
103
+ }
104
+ },
105
+ updatePresence: async (_, args, context) => {
106
+ const userId = context.userContext?.userId || context.user?.id;
107
+ options.logger.trace('(Mutation.updatePresence) userId [%s], status [%s]', userId, args.status);
108
+ const presence = {
109
+ userId,
110
+ status: args.status,
111
+ statusMessage: args.statusMessage,
112
+ statusEmoji: args.statusEmoji,
113
+ lastActiveAt: new Date(),
114
+ expiresAt: args.expiresAt
115
+ };
116
+ try {
117
+ if (!options.pubsub) {
118
+ options.logger.error('PubSub not available for updatePresence');
119
+ return presence;
120
+ }
121
+ await options.pubsub.publish(PRESENCE_CHANGED_TOPIC, {
122
+ presenceChanged: presence
123
+ });
124
+ return presence;
125
+ } catch (error) {
126
+ options.logger.error('Error publishing presence update: %o', error);
127
+ return presence;
128
+ }
129
+ },
130
+ toggleAckReaction: async (_, args, _context) => {
131
+ options.logger.trace('(Mutation.toggleAckReaction) postId [%s], emoji [%s]', args.postId, args.emoji);
132
+ // In a full implementation:
133
+ // 1. Load the post
134
+ // 2. Read/write ackReaction inside post.props (via PostTypes.ackReaction key)
135
+ // 3. Check channel.settings.ackReaction for gating rules
136
+ return true;
137
+ },
138
+ updateChannelNotifyProps: async (_, args, _context) => {
139
+ options.logger.trace('(Mutation.updateChannelNotifyProps) channelId [%s]', args.channelId);
140
+ // In a full implementation:
141
+ // 1. Load the channel
142
+ // 2. Merge args into channel.settings (typing, ackReaction sub-keys)
143
+ // 3. Save channel
144
+ return true;
145
+ }
146
+ },
147
+ Subscription: {
148
+ typingIndicator: {
149
+ subscribe: (_, args) => {
150
+ options.logger.trace('(Subscription.typingIndicator) channelId [%s], threadId [%s]', args.channelId, args.threadId);
151
+ try {
152
+ if (!options.pubsub) {
153
+ options.logger.error('PubSub not available for subscription');
154
+ throw new Error('PubSub not configured');
155
+ }
156
+ return options.pubsub.asyncIterator([`${TYPING_SUBSCRIPTION_TOPIC}:${args.channelId}`]);
157
+ } catch (error) {
158
+ options.logger.error('Error setting up typingIndicator subscription: %o', error);
159
+ throw error;
160
+ }
161
+ }
162
+ },
163
+ presenceChanged: {
164
+ subscribe: (_, _args) => {
165
+ options.logger.trace('(Subscription.presenceChanged)');
166
+ try {
167
+ if (!options.pubsub) {
168
+ options.logger.error('PubSub not available for subscription');
169
+ throw new Error('PubSub not configured');
170
+ }
171
+ return options.pubsub.asyncIterator([PRESENCE_CHANGED_TOPIC]);
172
+ } catch (error) {
173
+ options.logger.error('Error setting up presenceChanged subscription: %o', error);
174
+ throw error;
175
+ }
176
+ }
177
+ }
178
+ }
179
+ });export{channelCapabilitiesResolvers};//# sourceMappingURL=channel-capabilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel-capabilities.js","sources":["../../../src/graphql/resolvers/channel-capabilities.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- import { IResolvers } from 'common';
2
- import { IContext } from '../../interfaces';
3
- export declare const channelMemberResolvers: () => IResolvers<IContext>;
1
+ import { IResolverOptions } from '@common-stack/server-core';
2
+ import { IResolvers } from 'common/server';
3
+ export declare const channelMemberResolvers: (options: IResolverOptions) => IResolvers;
@@ -1,16 +1,41 @@
1
- const channelMemberResolvers = () => ({
1
+ const channelMemberResolvers = options => ({
2
2
  Channel: {
3
3
  creator(src, args, {
4
- accountService
4
+ accountService,
5
+ accountUserDataLoader
5
6
  }) {
6
- return accountService.findAccountById(src.creator.toString());
7
+ options.logger.trace('(Channel.creator) src.creator [%s]', src.creator);
8
+ // Check if creator exists and is not null/undefined before calling service
9
+ if (!src.creator || src.creator === null || src.creator === undefined) {
10
+ return null;
11
+ }
12
+ return accountUserDataLoader.load(src.creator.toString());
7
13
  }
8
14
  },
9
15
  ChannelMember: {
16
+ id(src) {
17
+ // Handle both virtual 'id' and MongoDB '_id' fields
18
+ const memberId = src.id || src._id;
19
+ if (!memberId) {
20
+ // If neither exists, generate an id based on user and other properties
21
+ // This ensures we always have a unique identifier
22
+ if (src.user) {
23
+ return `${src.user.toString()}-${src.createdAt || Date.now()}`;
24
+ }
25
+ throw new Error('ChannelMember id is required but not provided');
26
+ }
27
+ return memberId.toString();
28
+ },
10
29
  user(src, args, {
11
- accountService
30
+ accountService,
31
+ accountUserDataLoader
12
32
  }) {
13
- return accountService.findAccountById(src.user.toString());
33
+ options.logger.trace('(ChannelMember.user) src.user [%s]', src.user);
34
+ // Check if user exists and is not null/undefined before calling service
35
+ if (!src.user || src.user === null || src.user === undefined) {
36
+ return null;
37
+ }
38
+ return accountUserDataLoader.load(src.user.toString());
14
39
  }
15
40
  },
16
41
  Query: {},
@@ -1 +1 @@
1
- {"version":3,"file":"channel-member.js","sources":["../../../src/graphql/resolvers/channel-member.ts"],"sourcesContent":[null],"names":[],"mappings":"AAGa,MAAA,sBAAsB,GAAG,OAA6B;AAC/D,EAAA,OAAA,EAAO;AACH,IAAA,OAAA,CAAA,GAAO,EAAI,IAAE;;;AAGhB,MAAA,OAAA,cAAA,CAAA,eAAA,CAAA,GAAA,CAAA,OAAA,CAAA,QAAA,EAAA,CAAA;AACD;AACI,GAAA;eACW,EAAA;QACX,CAAC,GAAA,EAAA,IAAA,EAAA;AACJ,MAAA;AACD,KAAA,EAAA;AACA,MAAA,qBAAY,CAAA,eAAA,CAAA,GAAA,CAAA,IAAA,CAAA,QAAA,EAAA,CAAA;AACf;;;;"}
1
+ {"version":3,"file":"channel-member.js","sources":["../../../src/graphql/resolvers/channel-member.ts"],"sourcesContent":[null],"names":[],"mappings":"MAIa,sBAAsB,GAAG,OAAC,KAAyC;AAC5E,EAAA,OAAA,EAAO;WACH,CAAA,GAAO,MAAM,EAAA;oBACD;;AAGR,KAAA,EAAA;AACI,MAAA,OAAA,CAAA,MAAA,CAAA,MAAW,oCAAC,EAAA,GAAA,CAAA,OAAA,CAAA;;cAGhB,CAAA,OAAO,IAAA,GAAA,CAAA,OAAA,KAAsB,IAAK,IAAI,GAAA,CAAA,OAAQ,KAAQ,SAAwC,EAAA;QAClG,OAAC,IAAA;AACJ,MAAA;AACD,MAAA,OAAA,qBAAe,CAAA,IAAA,CAAA,GAAA,CAAA,OAAA,CAAA,QAAA,EAAA,CAAA;AACX,IAAA;;eAEI,EAAA;YACA;;oBAEI,GAAA,GAAA,CAAA,EAAA,IAAA,GAAA,CAAA,GAAA;AACA,MAAA,IAAA,CAAA,QAAA,EAAI;AACA;;AAEJ,QAAA,IAAA,GAAA,CAAA,IAAA,EAAM;iBACT,CAAA,EAAA,GAAA,CAAA,IAAA,CAAA,QAAA,EAAA,CAAA,CAAA,EAAA,GAAA,CAAA,SAAA,IAAA,IAAA,CAAA,GAAA,EAAA,CAAA,CAAA;AACD,QAAA;QACJ,MAAC,IAAA,KAAA,CAAA,+CAAA,CAAA;;aAEG,QAAQ,CAAA,QAAO,EAAK;;AAGpB,IAAA,IAAA,CAAA,GAAA,EAAA,IAAK,EAAG;AACJ,MAAA,cAAA;;;aAIP,CAAA,MAAA,CAAA,KAAA,CAAA,oCAAA,EAAA,GAAA,CAAA,IAAA,CAAA;AACJ;AACD,MAAA,KAAO,GAAE,CAAA,IAAA,IAAA,GAAA,CAAA,IAAA,KAAA,IAAA,IAAA,GAAA,CAAA,IAAA,KAAA,SAAA,EAAA;AACT,QAAA,OAAU,IAAE;AACf,MAAE;;;;;;"}
@@ -1,3 +1,3 @@
1
- import { IResolvers } from 'common';
2
- import { IContext } from '../../interfaces';
3
- export declare const channelResolvers: () => IResolvers<IContext>;
1
+ import { IResolverOptions } from '@common-stack/server-core';
2
+ import { IResolvers } from 'common/server';
3
+ export declare const channelResolvers: (options: IResolverOptions) => IResolvers;