@memberjunction/server 5.43.0 → 5.45.0

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 (309) hide show
  1. package/dist/agentSessions/ReturningVisitorRecap.d.ts +39 -0
  2. package/dist/agentSessions/ReturningVisitorRecap.d.ts.map +1 -0
  3. package/dist/agentSessions/ReturningVisitorRecap.js +198 -0
  4. package/dist/agentSessions/ReturningVisitorRecap.js.map +1 -0
  5. package/dist/agentSessions/SessionJanitor.d.ts +13 -0
  6. package/dist/agentSessions/SessionJanitor.d.ts.map +1 -1
  7. package/dist/agentSessions/SessionJanitor.js +65 -7
  8. package/dist/agentSessions/SessionJanitor.js.map +1 -1
  9. package/dist/agentSessions/SessionManager.d.ts.map +1 -1
  10. package/dist/agentSessions/SessionManager.js +40 -0
  11. package/dist/agentSessions/SessionManager.js.map +1 -1
  12. package/dist/agentSessions/index.d.ts.map +1 -1
  13. package/dist/agentSessions/index.js +3 -1
  14. package/dist/agentSessions/index.js.map +1 -1
  15. package/dist/auth/magicLink/MagicLinkRouter.d.ts +10 -0
  16. package/dist/auth/magicLink/MagicLinkRouter.d.ts.map +1 -1
  17. package/dist/auth/magicLink/MagicLinkRouter.js +16 -0
  18. package/dist/auth/magicLink/MagicLinkRouter.js.map +1 -1
  19. package/dist/auth/magicLink/index.d.ts +1 -1
  20. package/dist/auth/magicLink/index.d.ts.map +1 -1
  21. package/dist/auth/magicLink/index.js +1 -1
  22. package/dist/auth/magicLink/index.js.map +1 -1
  23. package/dist/auth/magicLink/types.d.ts +26 -0
  24. package/dist/auth/magicLink/types.d.ts.map +1 -1
  25. package/dist/config.d.ts +1883 -144
  26. package/dist/config.d.ts.map +1 -1
  27. package/dist/config.js +160 -36
  28. package/dist/config.js.map +1 -1
  29. package/dist/context.d.ts.map +1 -1
  30. package/dist/context.js +45 -2
  31. package/dist/context.js.map +1 -1
  32. package/dist/generated/generated.d.ts +1684 -54
  33. package/dist/generated/generated.d.ts.map +1 -1
  34. package/dist/generated/generated.js +57105 -48029
  35. package/dist/generated/generated.js.map +1 -1
  36. package/dist/generic/ResolverBase.d.ts +13 -0
  37. package/dist/generic/ResolverBase.d.ts.map +1 -1
  38. package/dist/generic/ResolverBase.js +22 -0
  39. package/dist/generic/ResolverBase.js.map +1 -1
  40. package/dist/generic/RunViewResolver.d.ts.map +1 -1
  41. package/dist/generic/RunViewResolver.js +4 -0
  42. package/dist/generic/RunViewResolver.js.map +1 -1
  43. package/dist/index.d.ts +2 -2
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +110 -3
  46. package/dist/index.js.map +1 -1
  47. package/dist/integration/CustomColumnPromoter.d.ts.map +1 -1
  48. package/dist/integration/CustomColumnPromoter.js +6 -0
  49. package/dist/integration/CustomColumnPromoter.js.map +1 -1
  50. package/dist/realtimeWidget/WidgetRouter.d.ts +26 -0
  51. package/dist/realtimeWidget/WidgetRouter.d.ts.map +1 -0
  52. package/dist/realtimeWidget/WidgetRouter.js +182 -0
  53. package/dist/realtimeWidget/WidgetRouter.js.map +1 -0
  54. package/dist/realtimeWidget/WidgetSessionService.d.ts +265 -0
  55. package/dist/realtimeWidget/WidgetSessionService.d.ts.map +1 -0
  56. package/dist/realtimeWidget/WidgetSessionService.js +477 -0
  57. package/dist/realtimeWidget/WidgetSessionService.js.map +1 -0
  58. package/dist/realtimeWidget/host-identity.d.ts +40 -0
  59. package/dist/realtimeWidget/host-identity.d.ts.map +1 -0
  60. package/dist/realtimeWidget/host-identity.js +58 -0
  61. package/dist/realtimeWidget/host-identity.js.map +1 -0
  62. package/dist/realtimeWidget/index.d.ts +10 -0
  63. package/dist/realtimeWidget/index.d.ts.map +1 -0
  64. package/dist/realtimeWidget/index.js +9 -0
  65. package/dist/realtimeWidget/index.js.map +1 -0
  66. package/dist/realtimeWidget/visitorIdentity.d.ts +76 -0
  67. package/dist/realtimeWidget/visitorIdentity.d.ts.map +1 -0
  68. package/dist/realtimeWidget/visitorIdentity.js +202 -0
  69. package/dist/realtimeWidget/visitorIdentity.js.map +1 -0
  70. package/dist/realtimeWidget/widgetCore.d.ts +106 -0
  71. package/dist/realtimeWidget/widgetCore.d.ts.map +1 -0
  72. package/dist/realtimeWidget/widgetCore.js +173 -0
  73. package/dist/realtimeWidget/widgetCore.js.map +1 -0
  74. package/dist/realtimeWidget/widgetGuestElevation.d.ts +51 -0
  75. package/dist/realtimeWidget/widgetGuestElevation.d.ts.map +1 -0
  76. package/dist/realtimeWidget/widgetGuestElevation.js +79 -0
  77. package/dist/realtimeWidget/widgetGuestElevation.js.map +1 -0
  78. package/dist/resolvers/ComponentRegistryResolver.d.ts +7 -0
  79. package/dist/resolvers/ComponentRegistryResolver.d.ts.map +1 -1
  80. package/dist/resolvers/ComponentRegistryResolver.js +31 -8
  81. package/dist/resolvers/ComponentRegistryResolver.js.map +1 -1
  82. package/dist/resolvers/EntityPermissionResolver.d.ts.map +1 -1
  83. package/dist/resolvers/EntityPermissionResolver.js +1 -2
  84. package/dist/resolvers/EntityPermissionResolver.js.map +1 -1
  85. package/dist/resolvers/FileResolver.d.ts +74 -0
  86. package/dist/resolvers/FileResolver.d.ts.map +1 -1
  87. package/dist/resolvers/FileResolver.js +211 -2
  88. package/dist/resolvers/FileResolver.js.map +1 -1
  89. package/dist/resolvers/QueryResolver.d.ts +6 -4
  90. package/dist/resolvers/QueryResolver.d.ts.map +1 -1
  91. package/dist/resolvers/QueryResolver.js +29 -14
  92. package/dist/resolvers/QueryResolver.js.map +1 -1
  93. package/dist/resolvers/QuerySystemUserResolver.d.ts +9 -6
  94. package/dist/resolvers/QuerySystemUserResolver.d.ts.map +1 -1
  95. package/dist/resolvers/QuerySystemUserResolver.js +15 -13
  96. package/dist/resolvers/QuerySystemUserResolver.js.map +1 -1
  97. package/dist/resolvers/RealtimeBridgeResolver.d.ts +8 -1
  98. package/dist/resolvers/RealtimeBridgeResolver.d.ts.map +1 -1
  99. package/dist/resolvers/RealtimeBridgeResolver.js +28 -4
  100. package/dist/resolvers/RealtimeBridgeResolver.js.map +1 -1
  101. package/dist/resolvers/RealtimeClientSessionResolver.d.ts +91 -2
  102. package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
  103. package/dist/resolvers/RealtimeClientSessionResolver.js +337 -17
  104. package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -1
  105. package/dist/resolvers/RemoteBrowserActionResolver.d.ts.map +1 -1
  106. package/dist/resolvers/RemoteBrowserActionResolver.js +17 -2
  107. package/dist/resolvers/RemoteBrowserActionResolver.js.map +1 -1
  108. package/dist/resolvers/RingCentralTelephonyResolver.d.ts +27 -0
  109. package/dist/resolvers/RingCentralTelephonyResolver.d.ts.map +1 -0
  110. package/dist/resolvers/RingCentralTelephonyResolver.js +87 -0
  111. package/dist/resolvers/RingCentralTelephonyResolver.js.map +1 -0
  112. package/dist/resolvers/RunAIAgentResolver.d.ts +12 -3
  113. package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
  114. package/dist/resolvers/RunAIAgentResolver.js +50 -17
  115. package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
  116. package/dist/resolvers/SearchKnowledgeResolver.d.ts.map +1 -1
  117. package/dist/resolvers/SearchKnowledgeResolver.js +2 -0
  118. package/dist/resolvers/SearchKnowledgeResolver.js.map +1 -1
  119. package/dist/resolvers/TeamsMeetingsResolver.d.ts +28 -0
  120. package/dist/resolvers/TeamsMeetingsResolver.d.ts.map +1 -0
  121. package/dist/resolvers/TeamsMeetingsResolver.js +91 -0
  122. package/dist/resolvers/TeamsMeetingsResolver.js.map +1 -0
  123. package/dist/resolvers/TelephonyResolver.d.ts +26 -0
  124. package/dist/resolvers/TelephonyResolver.d.ts.map +1 -0
  125. package/dist/resolvers/TelephonyResolver.js +86 -0
  126. package/dist/resolvers/TelephonyResolver.js.map +1 -0
  127. package/dist/resolvers/TestQuerySQLResolver.d.ts +1 -1
  128. package/dist/resolvers/TestQuerySQLResolver.d.ts.map +1 -1
  129. package/dist/resolvers/TestQuerySQLResolver.js +2 -3
  130. package/dist/resolvers/TestQuerySQLResolver.js.map +1 -1
  131. package/dist/resolvers/VonageTelephonyResolver.d.ts +26 -0
  132. package/dist/resolvers/VonageTelephonyResolver.d.ts.map +1 -0
  133. package/dist/resolvers/VonageTelephonyResolver.js +86 -0
  134. package/dist/resolvers/VonageTelephonyResolver.js.map +1 -0
  135. package/dist/resolvers/meetingRecordingRegistration.d.ts +124 -0
  136. package/dist/resolvers/meetingRecordingRegistration.d.ts.map +1 -0
  137. package/dist/resolvers/meetingRecordingRegistration.js +311 -0
  138. package/dist/resolvers/meetingRecordingRegistration.js.map +1 -0
  139. package/dist/resolvers/peaksSidecar.d.ts +30 -0
  140. package/dist/resolvers/peaksSidecar.d.ts.map +1 -0
  141. package/dist/resolvers/peaksSidecar.js +51 -0
  142. package/dist/resolvers/peaksSidecar.js.map +1 -0
  143. package/dist/rest/MediaAccessKeys.d.ts +68 -0
  144. package/dist/rest/MediaAccessKeys.d.ts.map +1 -0
  145. package/dist/rest/MediaAccessKeys.js +96 -0
  146. package/dist/rest/MediaAccessKeys.js.map +1 -0
  147. package/dist/rest/MediaStreamHandler.d.ts +26 -0
  148. package/dist/rest/MediaStreamHandler.d.ts.map +1 -0
  149. package/dist/rest/MediaStreamHandler.js +195 -0
  150. package/dist/rest/MediaStreamHandler.js.map +1 -0
  151. package/dist/rest/mediaRange.d.ts +41 -0
  152. package/dist/rest/mediaRange.d.ts.map +1 -0
  153. package/dist/rest/mediaRange.js +60 -0
  154. package/dist/rest/mediaRange.js.map +1 -0
  155. package/dist/telephony/RingCentralTelephonyService.d.ts +115 -0
  156. package/dist/telephony/RingCentralTelephonyService.d.ts.map +1 -0
  157. package/dist/telephony/RingCentralTelephonyService.js +262 -0
  158. package/dist/telephony/RingCentralTelephonyService.js.map +1 -0
  159. package/dist/telephony/TeamsMeetingsRouter.d.ts +40 -0
  160. package/dist/telephony/TeamsMeetingsRouter.d.ts.map +1 -0
  161. package/dist/telephony/TeamsMeetingsRouter.js +96 -0
  162. package/dist/telephony/TeamsMeetingsRouter.js.map +1 -0
  163. package/dist/telephony/TeamsMeetingsService.d.ts +113 -0
  164. package/dist/telephony/TeamsMeetingsService.d.ts.map +1 -0
  165. package/dist/telephony/TeamsMeetingsService.js +196 -0
  166. package/dist/telephony/TeamsMeetingsService.js.map +1 -0
  167. package/dist/telephony/TwilioTelephonyRouter.d.ts +36 -0
  168. package/dist/telephony/TwilioTelephonyRouter.d.ts.map +1 -0
  169. package/dist/telephony/TwilioTelephonyRouter.js +143 -0
  170. package/dist/telephony/TwilioTelephonyRouter.js.map +1 -0
  171. package/dist/telephony/TwilioTelephonyService.d.ts +95 -0
  172. package/dist/telephony/TwilioTelephonyService.d.ts.map +1 -0
  173. package/dist/telephony/TwilioTelephonyService.js +193 -0
  174. package/dist/telephony/TwilioTelephonyService.js.map +1 -0
  175. package/dist/telephony/VonageTelephonyRouter.d.ts +41 -0
  176. package/dist/telephony/VonageTelephonyRouter.d.ts.map +1 -0
  177. package/dist/telephony/VonageTelephonyRouter.js +201 -0
  178. package/dist/telephony/VonageTelephonyRouter.js.map +1 -0
  179. package/dist/telephony/VonageTelephonyService.d.ts +90 -0
  180. package/dist/telephony/VonageTelephonyService.d.ts.map +1 -0
  181. package/dist/telephony/VonageTelephonyService.js +191 -0
  182. package/dist/telephony/VonageTelephonyService.js.map +1 -0
  183. package/dist/telephony/calendar-scheduler.d.ts +67 -0
  184. package/dist/telephony/calendar-scheduler.d.ts.map +1 -0
  185. package/dist/telephony/calendar-scheduler.js +133 -0
  186. package/dist/telephony/calendar-scheduler.js.map +1 -0
  187. package/dist/telephony/index.d.ts +29 -0
  188. package/dist/telephony/index.d.ts.map +1 -0
  189. package/dist/telephony/index.js +38 -0
  190. package/dist/telephony/index.js.map +1 -0
  191. package/dist/telephony/media-upgrade-router.d.ts +33 -0
  192. package/dist/telephony/media-upgrade-router.d.ts.map +1 -0
  193. package/dist/telephony/media-upgrade-router.js +56 -0
  194. package/dist/telephony/media-upgrade-router.js.map +1 -0
  195. package/dist/telephony/ringcentral-runtime.d.ts +14 -0
  196. package/dist/telephony/ringcentral-runtime.d.ts.map +1 -0
  197. package/dist/telephony/ringcentral-runtime.js +18 -0
  198. package/dist/telephony/ringcentral-runtime.js.map +1 -0
  199. package/dist/telephony/teams-meetings-runtime.d.ts +16 -0
  200. package/dist/telephony/teams-meetings-runtime.d.ts.map +1 -0
  201. package/dist/telephony/teams-meetings-runtime.js +20 -0
  202. package/dist/telephony/teams-meetings-runtime.js.map +1 -0
  203. package/dist/telephony/teamsAcsMediaRegistry.d.ts +69 -0
  204. package/dist/telephony/teamsAcsMediaRegistry.d.ts.map +1 -0
  205. package/dist/telephony/teamsAcsMediaRegistry.js +118 -0
  206. package/dist/telephony/teamsAcsMediaRegistry.js.map +1 -0
  207. package/dist/telephony/telephony-runtime.d.ts +14 -0
  208. package/dist/telephony/telephony-runtime.d.ts.map +1 -0
  209. package/dist/telephony/telephony-runtime.js +18 -0
  210. package/dist/telephony/telephony-runtime.js.map +1 -0
  211. package/dist/telephony/twilioMediaRegistry.d.ts +60 -0
  212. package/dist/telephony/twilioMediaRegistry.d.ts.map +1 -0
  213. package/dist/telephony/twilioMediaRegistry.js +106 -0
  214. package/dist/telephony/twilioMediaRegistry.js.map +1 -0
  215. package/dist/telephony/vonage-runtime.d.ts +14 -0
  216. package/dist/telephony/vonage-runtime.d.ts.map +1 -0
  217. package/dist/telephony/vonage-runtime.js +18 -0
  218. package/dist/telephony/vonage-runtime.js.map +1 -0
  219. package/dist/telephony/vonageMediaRegistry.d.ts +78 -0
  220. package/dist/telephony/vonageMediaRegistry.d.ts.map +1 -0
  221. package/dist/telephony/vonageMediaRegistry.js +158 -0
  222. package/dist/telephony/vonageMediaRegistry.js.map +1 -0
  223. package/package.json +88 -82
  224. package/src/__tests__/FileResolverPeaks.test.ts +64 -0
  225. package/src/__tests__/MediaAccessKeys.test.ts +68 -0
  226. package/src/__tests__/MediaStreamHandler.test.ts +91 -0
  227. package/src/__tests__/RealtimeBridgeResolver.test.ts +10 -1
  228. package/src/__tests__/RealtimeClientSessionResolver.test.ts +69 -0
  229. package/src/__tests__/RealtimeCoAgentAppAwareness.integration.test.ts +191 -0
  230. package/src/__tests__/RemoteBrowserSnapshot.test.ts +123 -0
  231. package/src/__tests__/SessionManager.test.ts +2 -0
  232. package/src/__tests__/meetingRecordingRegistration.test.ts +248 -0
  233. package/src/__tests__/search-knowledge-tags.test.ts +9 -9
  234. package/src/__tests__/teams-meetings-service.test.ts +65 -0
  235. package/src/__tests__/teamsAcsMediaRegistry.test.ts +82 -0
  236. package/src/__tests__/twilio-telephony-service.test.ts +23 -0
  237. package/src/__tests__/twilioMediaRegistry.test.ts +103 -0
  238. package/src/__tests__/vonageMediaRegistry.test.ts +180 -0
  239. package/src/__tests__/widget.test.ts +204 -0
  240. package/src/__tests__/widgetGuestElevation.test.ts +57 -0
  241. package/src/__tests__/widgetHostIdentity.test.ts +117 -0
  242. package/src/agentSessions/ReturningVisitorRecap.ts +242 -0
  243. package/src/agentSessions/SessionJanitor.ts +66 -6
  244. package/src/agentSessions/SessionManager.ts +41 -0
  245. package/src/agentSessions/index.ts +3 -1
  246. package/src/auth/magicLink/MagicLinkRouter.ts +17 -0
  247. package/src/auth/magicLink/index.ts +1 -0
  248. package/src/auth/magicLink/types.ts +26 -0
  249. package/src/config.ts +172 -38
  250. package/src/context.ts +50 -3
  251. package/src/generated/generated.ts +26726 -20464
  252. package/src/generic/ResolverBase.ts +28 -0
  253. package/src/generic/RunViewResolver.ts +4 -0
  254. package/src/index.ts +119 -3
  255. package/src/integration/CustomColumnPromoter.ts +6 -0
  256. package/src/realtimeWidget/WidgetRouter.ts +204 -0
  257. package/src/realtimeWidget/WidgetSessionService.ts +714 -0
  258. package/src/realtimeWidget/host-identity.ts +84 -0
  259. package/src/realtimeWidget/index.ts +15 -0
  260. package/src/realtimeWidget/visitorIdentity.ts +258 -0
  261. package/src/realtimeWidget/widgetCore.ts +231 -0
  262. package/src/realtimeWidget/widgetGuestElevation.ts +115 -0
  263. package/src/resolvers/ComponentRegistryResolver.ts +36 -10
  264. package/src/resolvers/EntityPermissionResolver.ts +1 -2
  265. package/src/resolvers/FileResolver.ts +199 -1
  266. package/src/resolvers/QueryResolver.ts +33 -19
  267. package/src/resolvers/QuerySystemUserResolver.ts +14 -10
  268. package/src/resolvers/RealtimeBridgeResolver.ts +36 -4
  269. package/src/resolvers/RealtimeClientSessionResolver.ts +383 -9
  270. package/src/resolvers/RemoteBrowserActionResolver.ts +18 -2
  271. package/src/resolvers/RingCentralTelephonyResolver.ts +64 -0
  272. package/src/resolvers/RunAIAgentResolver.ts +60 -15
  273. package/src/resolvers/SearchKnowledgeResolver.ts +2 -0
  274. package/src/resolvers/TeamsMeetingsResolver.ts +68 -0
  275. package/src/resolvers/TelephonyResolver.ts +63 -0
  276. package/src/resolvers/TestQuerySQLResolver.ts +2 -3
  277. package/src/resolvers/VonageTelephonyResolver.ts +63 -0
  278. package/src/resolvers/meetingRecordingRegistration.ts +432 -0
  279. package/src/resolvers/peaksSidecar.ts +52 -0
  280. package/src/rest/MediaAccessKeys.ts +121 -0
  281. package/src/rest/MediaStreamHandler.ts +223 -0
  282. package/src/rest/mediaRange.ts +76 -0
  283. package/src/telephony/RingCentralTelephonyService.ts +342 -0
  284. package/src/telephony/TeamsMeetingsRouter.ts +124 -0
  285. package/src/telephony/TeamsMeetingsService.ts +268 -0
  286. package/src/telephony/TwilioTelephonyRouter.ts +184 -0
  287. package/src/telephony/TwilioTelephonyService.ts +261 -0
  288. package/src/telephony/VonageTelephonyRouter.ts +239 -0
  289. package/src/telephony/VonageTelephonyService.ts +259 -0
  290. package/src/telephony/calendar-scheduler.ts +176 -0
  291. package/src/telephony/index.ts +43 -0
  292. package/src/telephony/media-upgrade-router.ts +62 -0
  293. package/src/telephony/ringcentral-runtime.ts +22 -0
  294. package/src/telephony/teams-meetings-runtime.ts +24 -0
  295. package/src/telephony/teamsAcsMediaRegistry.ts +152 -0
  296. package/src/telephony/telephony-runtime.ts +22 -0
  297. package/src/telephony/twilioMediaRegistry.ts +137 -0
  298. package/src/telephony/vonage-runtime.ts +22 -0
  299. package/src/telephony/vonageMediaRegistry.ts +200 -0
  300. package/dist/agents/skip-agent.d.ts +0 -111
  301. package/dist/agents/skip-agent.d.ts.map +0 -1
  302. package/dist/agents/skip-agent.js +0 -1487
  303. package/dist/agents/skip-agent.js.map +0 -1
  304. package/dist/agents/skip-sdk.d.ts +0 -261
  305. package/dist/agents/skip-sdk.d.ts.map +0 -1
  306. package/dist/agents/skip-sdk.js +0 -909
  307. package/dist/agents/skip-sdk.js.map +0 -1
  308. package/src/agents/skip-agent.ts +0 -1594
  309. package/src/agents/skip-sdk.ts +0 -1210
@@ -0,0 +1,152 @@
1
+ /**
2
+ * @fileoverview Per-call ACS application-hosted-media pump registry for the Teams meetings ingress.
3
+ *
4
+ * This is the server half of the Teams audio plane — the analogue of {@link TwilioCallMediaRegistry} for
5
+ * telephony. It implements the Teams provider package's `IAcsMediaPump` seam (which `PumpBackedAcsMedia` →
6
+ * `RealTeamsBindings` drive) on top of the live ACS application-hosted-media audio socket(s) the server owns.
7
+ *
8
+ * Like telephony, there is a lifecycle gap: when a meeting bridge session starts, `RealTeamsBindings`
9
+ * registers its inbound-audio handler before the ACS media socket has connected its inbound stream. The
10
+ * registry bridges that gap by buffering handler registrations + outbound PCM per call id and binding them to
11
+ * the media transport once it attaches (the server's native ACS media adapter calls {@link AttachTransport}
12
+ * when the application-hosted-media socket is up for the call).
13
+ *
14
+ * Pure + unit-testable: the media transport is injected as the minimal {@link IAcsMediaTransport} surface, so
15
+ * the registry's buffering / dispatch logic is exercised with a fake transport and no ACS install or network.
16
+ *
17
+ * @module @memberjunction/server/telephony
18
+ */
19
+
20
+ import type { AcsInboundAudioFrame, IAcsMediaPump } from '@memberjunction/ai-bridge-teams';
21
+
22
+ /**
23
+ * The minimal ACS media-transport surface the registry drives — a structural subset of the server's native
24
+ * application-hosted-media socket adapter, so the registry never imports the ACS SDK and is testable with a
25
+ * fake. Outbound frames are raw PCM16 `ArrayBuffer`s for the call.
26
+ */
27
+ export interface IAcsMediaTransport {
28
+ /** Sends one outbound PCM16 frame on the call's application-hosted-media outbound audio socket. */
29
+ sendAudioFrame(pcm: ArrayBuffer): void;
30
+ /** Closes the call's media transport (best-effort; called on call end). */
31
+ close(): void;
32
+ }
33
+
34
+ /** One call's audio channel: its transport (once attached), inbound handlers, hand-raise handlers, pending sends. */
35
+ interface CallAudioChannel {
36
+ transport?: IAcsMediaTransport;
37
+ /** Inbound per-participant audio handlers registered by RealTeamsBindings (may predate the transport). */
38
+ frameHandlers: Array<(frame: AcsInboundAudioFrame) => void>;
39
+ /** Raised-hand handlers (Teams hand-raise is partial; may never fire). */
40
+ handRaiseHandlers: Array<(participantId: string, raised: boolean) => void>;
41
+ /** Outbound PCM produced before the transport attached — flushed on AttachTransport. */
42
+ outboundBuffer: ArrayBuffer[];
43
+ }
44
+
45
+ /**
46
+ * Coordinates ACS application-hosted-media transports with the bridge bindings, keyed by Graph call id. One
47
+ * instance per server, shared between the meetings service (which binds `PumpBackedAcsMedia` over this as the
48
+ * `IAcsMediaPump`) and the server's native ACS media adapter (which attaches transports + dispatches inbound
49
+ * audio).
50
+ */
51
+ export class TeamsAcsMediaRegistry implements IAcsMediaPump {
52
+ private readonly channels = new Map<string, CallAudioChannel>();
53
+
54
+ /**
55
+ * @param SampleRate The ACS audio-socket sample rate in Hz (the application-hosted-media PCM rate the
56
+ * server negotiates). Drives T0 resampling in `RealTeamsBindings`. Defaults to 16000.
57
+ */
58
+ constructor(public readonly SampleRate = 16000) {}
59
+
60
+ /** Ensures a channel exists for a call (called when a meeting bridge session for the call starts). */
61
+ public RegisterCall(callId: string): void {
62
+ this.ensureChannel(callId);
63
+ }
64
+
65
+ // ── IAcsMediaPump ─────────────────────────────────────────────────────────────
66
+
67
+ /** @inheritdoc — buffers when the transport has not yet attached; sends immediately once it has. */
68
+ public Send(callId: string, pcm: ArrayBuffer): void {
69
+ const channel = this.ensureChannel(callId);
70
+ if (channel.transport) {
71
+ channel.transport.sendAudioFrame(pcm);
72
+ } else {
73
+ channel.outboundBuffer.push(pcm);
74
+ }
75
+ }
76
+
77
+ /** @inheritdoc — stores the handler so frames delivered before AND after transport attach reach it. */
78
+ public OnFrame(callId: string, handler: (frame: AcsInboundAudioFrame) => void): void {
79
+ this.ensureChannel(callId).frameHandlers.push(handler);
80
+ }
81
+
82
+ /** @inheritdoc — stores the hand-raise handler (Teams hand-raise is partial; tolerated if it never fires). */
83
+ public OnHandRaise(callId: string, handler: (participantId: string, raised: boolean) => void): void {
84
+ this.ensureChannel(callId).handRaiseHandlers.push(handler);
85
+ }
86
+
87
+ // ── native-adapter side ─────────────────────────────────────────────────────
88
+
89
+ /**
90
+ * Binds a connected ACS media transport to a call, flushing any outbound PCM produced while the transport
91
+ * was still connecting. Called by the server's native ACS media adapter once the application-hosted-media
92
+ * socket is up for the call.
93
+ */
94
+ public AttachTransport(callId: string, transport: IAcsMediaTransport): void {
95
+ const channel = this.ensureChannel(callId);
96
+ channel.transport = transport;
97
+ const buffered = channel.outboundBuffer.splice(0, channel.outboundBuffer.length);
98
+ for (const pcm of buffered) {
99
+ transport.sendAudioFrame(pcm);
100
+ }
101
+ }
102
+
103
+ /** Dispatches one inbound per-participant audio frame to all registered handlers for the call. */
104
+ public DispatchInbound(callId: string, frame: AcsInboundAudioFrame): void {
105
+ const channel = this.channels.get(callId);
106
+ if (!channel) {
107
+ return;
108
+ }
109
+ for (const handler of channel.frameHandlers) {
110
+ handler(frame);
111
+ }
112
+ }
113
+
114
+ /** Dispatches one raised-hand signal to all registered hand-raise handlers for the call. */
115
+ public DispatchHandRaise(callId: string, participantId: string, raised: boolean): void {
116
+ const channel = this.channels.get(callId);
117
+ if (!channel) {
118
+ return;
119
+ }
120
+ for (const handler of channel.handRaiseHandlers) {
121
+ handler(participantId, raised);
122
+ }
123
+ }
124
+
125
+ /** Tears down a call's channel and closes its transport (called on call end / meeting ended). */
126
+ public EndCall(callId: string): void {
127
+ const channel = this.channels.get(callId);
128
+ if (!channel) {
129
+ return;
130
+ }
131
+ try {
132
+ channel.transport?.close();
133
+ } catch {
134
+ /* best-effort */
135
+ }
136
+ this.channels.delete(callId);
137
+ }
138
+
139
+ /** Whether a channel is currently tracked for the call (test/observability helper). */
140
+ public HasCall(callId: string): boolean {
141
+ return this.channels.has(callId);
142
+ }
143
+
144
+ private ensureChannel(callId: string): CallAudioChannel {
145
+ let channel = this.channels.get(callId);
146
+ if (!channel) {
147
+ channel = { frameHandlers: [], handRaiseHandlers: [], outboundBuffer: [] };
148
+ this.channels.set(callId, channel);
149
+ }
150
+ return channel;
151
+ }
152
+ }
@@ -0,0 +1,22 @@
1
+ /**
2
+ * @fileoverview Process-wide holder for the startup-constructed telephony service, so the
3
+ * outbound `PlaceTwilioCall` GraphQL resolver reaches the SAME {@link TwilioTelephonyService}
4
+ * (and thus the same {@link TwilioCallMediaRegistry} the Media-Streams WSS attaches sockets to)
5
+ * that the inbound webhook router uses. Set once during server boot; read by the resolver.
6
+ *
7
+ * @module @memberjunction/server/telephony
8
+ */
9
+
10
+ import type { TwilioTelephonyService } from './TwilioTelephonyService.js';
11
+
12
+ let twilioService: TwilioTelephonyService | undefined;
13
+
14
+ /** Binds the startup-constructed Twilio telephony service (called from server boot). */
15
+ export function SetTwilioTelephonyService(service: TwilioTelephonyService): void {
16
+ twilioService = service;
17
+ }
18
+
19
+ /** Returns the bound Twilio telephony service, or `undefined` when telephony is not configured. */
20
+ export function GetTwilioTelephonyService(): TwilioTelephonyService | undefined {
21
+ return twilioService;
22
+ }
@@ -0,0 +1,137 @@
1
+ /**
2
+ * @fileoverview Per-call Media-Streams pump registry for the Twilio telephony ingress.
3
+ *
4
+ * This is the server half of the Twilio media plane: it implements the provider package's
5
+ * `ITwilioMediaPump` seam (which `RealTwilioBindings` drives) on top of the live Media-Streams
6
+ * websockets MJAPI accepts at `WSS /telephony/twilio/media`. It exists because of a lifecycle gap:
7
+ * when an INBOUND call's webhook fires, the bridge session starts and `RealTwilioBindings` registers
8
+ * its inbound-audio handler — but Twilio has not yet opened the media websocket (it does so only AFTER
9
+ * the webhook's `<Connect><Stream>` TwiML response). The registry bridges that gap by buffering
10
+ * handler registrations + outbound frames per Call SID and binding them to the socket once it connects
11
+ * (matched on the `start` frame's Call SID).
12
+ *
13
+ * Pure + unit-testable: the websocket is injected as the minimal {@link ITelephonyMediaSocket} surface,
14
+ * so the registry's buffering / dispatch / stream-SID capture logic is exercised with a fake socket and
15
+ * no `ws` install or network.
16
+ *
17
+ * @module @memberjunction/server/telephony
18
+ */
19
+
20
+ import type { TwilioMediaFrame } from '@memberjunction/ai-bridge-twilio';
21
+ import type { ITwilioMediaPump } from '@memberjunction/ai-bridge-twilio';
22
+
23
+ /**
24
+ * The minimal websocket surface the registry drives — a structural subset of a `ws` socket, so the
25
+ * registry never imports `ws` and is testable with a fake. Outbound frames are sent as JSON strings.
26
+ */
27
+ export interface ITelephonyMediaSocket {
28
+ /** Sends a serialized outbound Media-Streams frame on the call's socket. */
29
+ send(data: string): void;
30
+ /** Closes the socket (best-effort; called on call end). */
31
+ close(): void;
32
+ }
33
+
34
+ /** One call's media channel: its socket (once connected), captured stream SID, handlers, and pending sends. */
35
+ interface CallMediaChannel {
36
+ socket?: ITelephonyMediaSocket;
37
+ streamSid?: string;
38
+ /** Inbound-frame handlers registered by RealTwilioBindings (may predate the socket). */
39
+ frameHandlers: Array<(frame: TwilioMediaFrame) => void>;
40
+ /** Outbound frames produced before the socket connected — flushed on AttachSocket. */
41
+ outboundBuffer: TwilioMediaFrame[];
42
+ }
43
+
44
+ /**
45
+ * Coordinates Media-Streams sockets with the bridge bindings, keyed by Call SID. One instance per
46
+ * server, shared between the inbound-webhook service (which binds `RealTwilioBindings` over this as the
47
+ * `ITwilioMediaPump`) and the WSS server (which attaches sockets + dispatches inbound frames).
48
+ */
49
+ export class TwilioCallMediaRegistry implements ITwilioMediaPump {
50
+ private readonly channels = new Map<string, CallMediaChannel>();
51
+
52
+ /** Ensures a channel exists for a call (called when a bridge session for the call starts). */
53
+ public RegisterCall(callSid: string): void {
54
+ this.ensureChannel(callSid);
55
+ }
56
+
57
+ // ── ITwilioMediaPump ─────────────────────────────────────────────────────────
58
+
59
+ /** @inheritdoc — buffers when the socket has not yet connected; sends immediately once it has. */
60
+ public Send(callSid: string, frame: TwilioMediaFrame): void {
61
+ const channel = this.ensureChannel(callSid);
62
+ if (channel.socket) {
63
+ channel.socket.send(JSON.stringify(frame));
64
+ } else {
65
+ channel.outboundBuffer.push(frame);
66
+ }
67
+ }
68
+
69
+ /** @inheritdoc — stores the handler so frames delivered before AND after socket connect reach it. */
70
+ public OnFrame(callSid: string, handler: (frame: TwilioMediaFrame) => void): void {
71
+ this.ensureChannel(callSid).frameHandlers.push(handler);
72
+ }
73
+
74
+ /** @inheritdoc — the captured stream SID, or `''` until the `start` frame arrives. */
75
+ public GetStreamSid(callSid: string): string {
76
+ return this.channels.get(callSid)?.streamSid ?? '';
77
+ }
78
+
79
+ // ── WSS-server side ─────────────────────────────────────────────────────────
80
+
81
+ /**
82
+ * Binds a connected Media-Streams socket (and its captured stream SID) to a call, flushing any
83
+ * outbound frames produced while the socket was still connecting. Called by the WSS server on the
84
+ * `start` frame.
85
+ */
86
+ public AttachSocket(callSid: string, socket: ITelephonyMediaSocket, streamSid: string): void {
87
+ const channel = this.ensureChannel(callSid);
88
+ channel.socket = socket;
89
+ channel.streamSid = streamSid;
90
+ const buffered = channel.outboundBuffer.splice(0, channel.outboundBuffer.length);
91
+ for (const frame of buffered) {
92
+ socket.send(JSON.stringify(frame));
93
+ }
94
+ }
95
+
96
+ /** Dispatches one inbound Media-Streams frame to all registered handlers for the call. */
97
+ public DispatchInbound(callSid: string, frame: TwilioMediaFrame): void {
98
+ const channel = this.channels.get(callSid);
99
+ if (!channel) {
100
+ return;
101
+ }
102
+ if (frame.event === 'start' && frame.streamSid) {
103
+ channel.streamSid = frame.streamSid;
104
+ }
105
+ for (const handler of channel.frameHandlers) {
106
+ handler(frame);
107
+ }
108
+ }
109
+
110
+ /** Tears down a call's channel and closes its socket (called on socket close / call end). */
111
+ public EndCall(callSid: string): void {
112
+ const channel = this.channels.get(callSid);
113
+ if (!channel) {
114
+ return;
115
+ }
116
+ try {
117
+ channel.socket?.close();
118
+ } catch {
119
+ /* best-effort */
120
+ }
121
+ this.channels.delete(callSid);
122
+ }
123
+
124
+ /** Whether a channel is currently tracked for the call (test/observability helper). */
125
+ public HasCall(callSid: string): boolean {
126
+ return this.channels.has(callSid);
127
+ }
128
+
129
+ private ensureChannel(callSid: string): CallMediaChannel {
130
+ let channel = this.channels.get(callSid);
131
+ if (!channel) {
132
+ channel = { frameHandlers: [], outboundBuffer: [] };
133
+ this.channels.set(callSid, channel);
134
+ }
135
+ return channel;
136
+ }
137
+ }
@@ -0,0 +1,22 @@
1
+ /**
2
+ * @fileoverview Process-wide holder for the startup-constructed Vonage telephony service, so the
3
+ * outbound `PlaceVonageCall` GraphQL resolver reaches the SAME {@link VonageTelephonyService}
4
+ * (and thus the same {@link VonageCallMediaRegistry} the media WSS attaches sockets to) that the
5
+ * inbound webhook router uses. Set once during server boot; read by the resolver.
6
+ *
7
+ * @module @memberjunction/server/telephony
8
+ */
9
+
10
+ import type { VonageTelephonyService } from './VonageTelephonyService.js';
11
+
12
+ let vonageService: VonageTelephonyService | undefined;
13
+
14
+ /** Binds the startup-constructed Vonage telephony service (called from server boot). */
15
+ export function SetVonageTelephonyService(service: VonageTelephonyService): void {
16
+ vonageService = service;
17
+ }
18
+
19
+ /** Returns the bound Vonage telephony service, or `undefined` when Vonage telephony is not configured. */
20
+ export function GetVonageTelephonyService(): VonageTelephonyService | undefined {
21
+ return vonageService;
22
+ }
@@ -0,0 +1,200 @@
1
+ /**
2
+ * @fileoverview Per-call WebSocket-media pump registry for the Vonage telephony ingress.
3
+ *
4
+ * This is the server half of the Vonage media plane: it implements the provider package's
5
+ * `IVonageMediaPump` seam (which `RealVonageBindings` drives) on top of the live bidirectional media
6
+ * websockets MJAPI accepts at `WSS /telephony/vonage/media`. It exists because of the same lifecycle
7
+ * gap the Twilio ingress has: when an INBOUND call's answer webhook fires, the bridge session starts and
8
+ * `RealVonageBindings` registers its inbound-audio handler — but Vonage has not yet opened the media
9
+ * websocket (it does so only AFTER the answer-webhook's `connect`-websocket NCCO response). The registry
10
+ * bridges that gap by buffering handler registrations + outbound frames per call UUID and binding them to
11
+ * the socket once it connects (matched on the call UUID Vonage forwards on the websocket handshake).
12
+ *
13
+ * Pure + unit-testable: the websocket is injected as the minimal {@link ITelephonyMediaSocket} surface,
14
+ * so the registry's buffering / dispatch logic is exercised with a fake socket and no `ws` install or
15
+ * network.
16
+ *
17
+ * @module @memberjunction/server/telephony
18
+ */
19
+
20
+ import type { VonageControlEvent, IVonageMediaPump } from '@memberjunction/ai-bridge-vonage';
21
+
22
+ /**
23
+ * The minimal websocket surface the registry drives — a structural subset of a `ws` socket, so the
24
+ * registry never imports `ws` and is testable with a fake. Vonage audio is sent as BINARY frames (raw
25
+ * L16 PCM); the registry never sends text frames outbound (Vonage's media socket only accepts audio).
26
+ */
27
+ export interface ITelephonyMediaSocket {
28
+ /** Sends one outbound BINARY audio frame (raw L16 PCM) on the call's socket. */
29
+ sendBinary(data: Uint8Array): void;
30
+ /** Sends one outbound TEXT control frame (JSON command, e.g. `{"action":"clear"}`) on the call's socket. */
31
+ sendText(data: string): void;
32
+ /** Closes the socket (best-effort; called on call end). */
33
+ close(): void;
34
+ }
35
+
36
+ /**
37
+ * The exact byte size of one outbound audio frame Vonage expects on the `audio/l16;rate=8000` leg: a
38
+ * 20 ms slice = 8000 Hz × 0.020 s = 160 samples × 2 bytes = **320 bytes**. The realtime model emits audio
39
+ * in arbitrary-size deltas; the bridge resamples each whole delta to 8 kHz, so the registry MUST re-slice
40
+ * into these fixed frames before sending. Handing Vonage one oversized blob per delta garbles playback and
41
+ * (worse) defeats barge-in: `{"action":"clear"}` can drop QUEUED frames but not a giant in-flight one.
42
+ */
43
+ const OUTBOUND_FRAME_BYTES = 320;
44
+
45
+ /** One call's media channel: its socket (once connected), handlers, and pending outbound audio. */
46
+ interface CallMediaChannel {
47
+ socket?: ITelephonyMediaSocket;
48
+ /** Inbound audio handlers registered by RealVonageBindings (may predate the socket). */
49
+ audioHandlers: Array<(pcm: ArrayBuffer) => void>;
50
+ /** Inbound control-event handlers (DTMF / connected / close) registered by RealVonageBindings. */
51
+ eventHandlers: Array<(event: VonageControlEvent) => void>;
52
+ /** Whole 20 ms (320-byte) outbound frames produced before the socket connected — flushed on AttachSocket. */
53
+ outboundBuffer: Uint8Array[];
54
+ /** Carry-over outbound bytes that didn't fill a whole 320-byte frame yet (prepended to the next delta). */
55
+ partial: Uint8Array;
56
+ }
57
+
58
+ /**
59
+ * Coordinates Vonage media websockets with the bridge bindings, keyed by call UUID. One instance per
60
+ * server, shared between the inbound-webhook service (which binds `RealVonageBindings` over this as the
61
+ * `IVonageMediaPump`) and the WSS server (which attaches sockets + dispatches inbound audio/events).
62
+ *
63
+ * Models Vonage's wire split: outbound audio → binary frames; inbound binary frames → audio handlers;
64
+ * inbound JSON text frames → parsed {@link VonageControlEvent}s → event handlers. There is no base64
65
+ * envelope or μ-law transcode — that's the Twilio path, not Vonage's.
66
+ */
67
+ export class VonageCallMediaRegistry implements IVonageMediaPump {
68
+ private readonly channels = new Map<string, CallMediaChannel>();
69
+
70
+ /** Ensures a channel exists for a call (called when a bridge session for the call starts). */
71
+ public RegisterCall(callUuid: string): void {
72
+ this.ensureChannel(callUuid);
73
+ }
74
+
75
+ // ── IVonageMediaPump ─────────────────────────────────────────────────────────
76
+
77
+ /**
78
+ * @inheritdoc — re-slices the (already-8 kHz) delta into fixed 320-byte / 20 ms frames before sending,
79
+ * carrying any sub-frame remainder into the next delta so the stream stays continuous (no silence gaps).
80
+ * Each whole frame is sent immediately if the socket is live, else buffered for {@link AttachSocket}.
81
+ */
82
+ public SendAudio(callUuid: string, pcm: ArrayBuffer): void {
83
+ const channel = this.ensureChannel(callUuid);
84
+ const incoming = new Uint8Array(pcm);
85
+ const data = channel.partial.length > 0 ? concatBytes(channel.partial, incoming) : incoming;
86
+
87
+ let offset = 0;
88
+ while (data.length - offset >= OUTBOUND_FRAME_BYTES) {
89
+ // `.slice` returns a fresh copy, so a buffered frame never retains the larger backing buffer.
90
+ const frame = data.slice(offset, offset + OUTBOUND_FRAME_BYTES);
91
+ offset += OUTBOUND_FRAME_BYTES;
92
+ if (channel.socket) {
93
+ channel.socket.sendBinary(frame);
94
+ } else {
95
+ channel.outboundBuffer.push(frame);
96
+ }
97
+ }
98
+
99
+ channel.partial = offset < data.length ? data.slice(offset) : new Uint8Array(0);
100
+ }
101
+
102
+ /** @inheritdoc — stores the audio handler so frames delivered before AND after socket connect reach it. */
103
+ public OnAudio(callUuid: string, handler: (pcm: ArrayBuffer) => void): void {
104
+ this.ensureChannel(callUuid).audioHandlers.push(handler);
105
+ }
106
+
107
+ /** @inheritdoc — stores the control-event handler (DTMF / connected / close). */
108
+ public OnEvent(callUuid: string, handler: (event: VonageControlEvent) => void): void {
109
+ this.ensureChannel(callUuid).eventHandlers.push(handler);
110
+ }
111
+
112
+ /**
113
+ * @inheritdoc — barge-in flush: drop any outbound audio buffered locally (socket not yet connected) AND,
114
+ * if the socket is live, send Vonage's `{"action":"clear"}` text command to discard its playback queue.
115
+ * Safe to call for an unknown/uninitialized call (no-op).
116
+ */
117
+ public Clear(callUuid: string): void {
118
+ const channel = this.channels.get(callUuid);
119
+ if (!channel) {
120
+ return;
121
+ }
122
+ channel.outboundBuffer.length = 0;
123
+ channel.partial = new Uint8Array(0); // drop the half-built frame too, or it would prepend to the next turn
124
+ channel.socket?.sendText(JSON.stringify({ action: 'clear' }));
125
+ }
126
+
127
+ // ── WSS-server side ─────────────────────────────────────────────────────────
128
+
129
+ /**
130
+ * Binds a connected media socket to a call, flushing any outbound audio produced while the socket
131
+ * was still connecting. Called by the WSS server once it resolves the call UUID for the socket (from
132
+ * the `call_uuid` query param the answer NCCO embedded on the media URL).
133
+ */
134
+ public AttachSocket(callUuid: string, socket: ITelephonyMediaSocket): void {
135
+ const channel = this.ensureChannel(callUuid);
136
+ channel.socket = socket;
137
+ const buffered = channel.outboundBuffer.splice(0, channel.outboundBuffer.length);
138
+ for (const frame of buffered) {
139
+ socket.sendBinary(frame);
140
+ }
141
+ }
142
+
143
+ /** Dispatches one inbound binary audio frame (raw L16 PCM) to all audio handlers for the call. */
144
+ public DispatchInboundAudio(callUuid: string, pcm: ArrayBuffer): void {
145
+ const channel = this.channels.get(callUuid);
146
+ if (!channel) {
147
+ return;
148
+ }
149
+ for (const handler of channel.audioHandlers) {
150
+ handler(pcm);
151
+ }
152
+ }
153
+
154
+ /** Dispatches one inbound control event (parsed from a JSON text frame) to all event handlers for the call. */
155
+ public DispatchInboundEvent(callUuid: string, event: VonageControlEvent): void {
156
+ const channel = this.channels.get(callUuid);
157
+ if (!channel) {
158
+ return;
159
+ }
160
+ for (const handler of channel.eventHandlers) {
161
+ handler(event);
162
+ }
163
+ }
164
+
165
+ /** Tears down a call's channel and closes its socket (called on socket close / call end). */
166
+ public EndCall(callUuid: string): void {
167
+ const channel = this.channels.get(callUuid);
168
+ if (!channel) {
169
+ return;
170
+ }
171
+ try {
172
+ channel.socket?.close();
173
+ } catch {
174
+ /* best-effort */
175
+ }
176
+ this.channels.delete(callUuid);
177
+ }
178
+
179
+ /** Whether a channel is currently tracked for the call (test/observability helper). */
180
+ public HasCall(callUuid: string): boolean {
181
+ return this.channels.has(callUuid);
182
+ }
183
+
184
+ private ensureChannel(callUuid: string): CallMediaChannel {
185
+ let channel = this.channels.get(callUuid);
186
+ if (!channel) {
187
+ channel = { audioHandlers: [], eventHandlers: [], outboundBuffer: [], partial: new Uint8Array(0) };
188
+ this.channels.set(callUuid, channel);
189
+ }
190
+ return channel;
191
+ }
192
+ }
193
+
194
+ /** Concatenates two byte arrays into a fresh `Uint8Array` (the carry-over remainder + the next delta). */
195
+ function concatBytes(a: Uint8Array, b: Uint8Array): Uint8Array {
196
+ const out = new Uint8Array(a.length + b.length);
197
+ out.set(a, 0);
198
+ out.set(b, a.length);
199
+ return out;
200
+ }
@@ -1,111 +0,0 @@
1
- /**
2
- * Skip Proxy Agent
3
- *
4
- * A proxy agent that integrates Skip SaaS API into the MemberJunction agent framework.
5
- * This agent acts as a bridge, allowing Skip to be invoked like any other MJ agent
6
- * while maintaining compatibility with the existing Skip infrastructure.
7
- */
8
- import { BaseAgent } from "@memberjunction/ai-agents";
9
- import { ExecuteAgentParams, AgentConfiguration, BaseAgentNextStep } from "@memberjunction/ai-core-plus";
10
- import { SkipAPIResponse } from "@memberjunction/skip-types";
11
- import { DataContext } from "@memberjunction/data-context";
12
- /**
13
- * Context type for Skip agent execution
14
- */
15
- export interface SkipAgentContext {
16
- /**
17
- * Optional data context ID to load
18
- */
19
- dataContextId?: string;
20
- /**
21
- * Optional pre-loaded data context
22
- */
23
- dataContext?: DataContext;
24
- /**
25
- * Conversation ID for tracking Skip conversations
26
- */
27
- conversationId?: string;
28
- /**
29
- * Force entity metadata refresh
30
- */
31
- forceEntityRefresh?: boolean;
32
- /**
33
- * Database connection (injected by caller)
34
- */
35
- dataSource?: any;
36
- }
37
- /**
38
- * Payload returned from Skip agent execution
39
- * Contains the full Skip API response for downstream consumers
40
- */
41
- export interface SkipAgentPayload {
42
- /**
43
- * The full Skip API response
44
- */
45
- skipResponse: SkipAPIResponse;
46
- /**
47
- * Response phase from Skip
48
- */
49
- responsePhase: string;
50
- /**
51
- * Conversation ID
52
- */
53
- conversationId: string;
54
- /**
55
- * User-facing message (title or clarifying question)
56
- */
57
- message?: string;
58
- }
59
- /**
60
- * Skip Proxy Agent
61
- *
62
- * This agent provides a simple proxy to the Skip SaaS API, allowing Skip to be
63
- * invoked through the standard MJ agent framework. It handles:
64
- * - Converting MJ conversation messages to Skip format
65
- * - Streaming progress updates from Skip
66
- * - Mapping Skip responses to MJ agent next steps
67
- * - Returning full Skip responses in the payload
68
- */
69
- export declare class SkipProxyAgent extends BaseAgent {
70
- private skipSDK;
71
- constructor();
72
- /**
73
- * Execute the Skip agent - proxies to Skip SaaS API
74
- */
75
- protected executeAgentInternal<P = SkipAgentPayload>(params: ExecuteAgentParams<SkipAgentContext, P>, config: AgentConfiguration): Promise<{
76
- finalStep: BaseAgentNextStep<P>;
77
- stepCount: number;
78
- }>;
79
- /**
80
- * Load conversation messages from database with real UUIDs using MemberJunction's RunView pattern
81
- * This is the preferred method as it ensures all messages have proper conversationDetailIDs
82
- */
83
- private loadMessagesFromDatabase;
84
- /**
85
- * Convert MJ ChatMessage format to Skip SkipMessage format
86
- * This is a fallback method when database loading is not available
87
- */
88
- private convertMessagesToSkipFormat;
89
- /**
90
- * Map Skip API response to MJ agent next step.
91
- *
92
- * Checks for Skip-level errors first, then delegates to phase-specific handlers.
93
- */
94
- private mapSkipResponseToNextStep;
95
- /**
96
- * Handle Skip error responses — extracts the most descriptive error available
97
- */
98
- private handleSkipError;
99
- /**
100
- * Handle analysis_complete phase — supports both component-bearing responses
101
- * (componentOptions populated) and analysis-only responses (markdown in `analysis`
102
- * with no component, produced by Skip's Analysis Agent path).
103
- */
104
- private handleAnalysisComplete;
105
- /**
106
- * Handle clarifying_question phase
107
- */
108
- private handleClarifyingQuestion;
109
- private tempHack;
110
- }
111
- //# sourceMappingURL=skip-agent.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"skip-agent.d.ts","sourceRoot":"","sources":["../../src/agents/skip-agent.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EACH,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACpB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACH,eAAe,EAIlB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAM3D;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC7B;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC;IAE1B;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B;;OAEG;IACH,UAAU,CAAC,EAAE,GAAG,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC7B;;OAEG;IACH,YAAY,EAAE,eAAe,CAAC;IAE9B;;OAEG;IACH,aAAa,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,cAAc,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;GASG;AACH,qBACa,cAAe,SAAQ,SAAS;IACzC,OAAO,CAAC,OAAO,CAAU;;IAOzB;;OAEG;cACsB,oBAAoB,CAAC,CAAC,GAAG,gBAAgB,EAC9D,MAAM,EAAE,kBAAkB,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAC/C,MAAM,EAAE,kBAAkB,GAC3B,OAAO,CAAC;QAAE,SAAS,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;KAAE,CAAC;IA4FnE;;;OAGG;YACW,wBAAwB;IA2DtC;;;OAGG;IACH,OAAO,CAAC,2BAA2B;IAsBnC;;;;OAIG;IACH,OAAO,CAAC,yBAAyB;IA8BjC;;OAEG;IACH,OAAO,CAAC,eAAe;IAqBvB;;;;OAIG;IACH,OAAO,CAAC,sBAAsB;IAqD9B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAYhC,OAAO,CAAC,QAAQ;CAQnB"}