@memberjunction/telephony-adapters 0.0.0 → 6.1.0-edge.7

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 (115) hide show
  1. package/LICENSE +183 -0
  2. package/dist/index.d.ts +33 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +83 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/resolvers/RingCentralTelephonyResolver.d.ts +20 -0
  7. package/dist/resolvers/RingCentralTelephonyResolver.d.ts.map +1 -0
  8. package/dist/resolvers/RingCentralTelephonyResolver.js +83 -0
  9. package/dist/resolvers/RingCentralTelephonyResolver.js.map +1 -0
  10. package/dist/resolvers/TeamsMeetingsResolver.d.ts +21 -0
  11. package/dist/resolvers/TeamsMeetingsResolver.d.ts.map +1 -0
  12. package/dist/resolvers/TeamsMeetingsResolver.js +87 -0
  13. package/dist/resolvers/TeamsMeetingsResolver.js.map +1 -0
  14. package/dist/resolvers/TelephonyResolver.d.ts +20 -0
  15. package/dist/resolvers/TelephonyResolver.d.ts.map +1 -0
  16. package/dist/resolvers/TelephonyResolver.js +83 -0
  17. package/dist/resolvers/TelephonyResolver.js.map +1 -0
  18. package/dist/resolvers/VonageTelephonyResolver.d.ts +20 -0
  19. package/dist/resolvers/VonageTelephonyResolver.d.ts.map +1 -0
  20. package/dist/resolvers/VonageTelephonyResolver.js +83 -0
  21. package/dist/resolvers/VonageTelephonyResolver.js.map +1 -0
  22. package/dist/resolvers/index.d.ts +10 -0
  23. package/dist/resolvers/index.d.ts.map +1 -0
  24. package/dist/resolvers/index.js +10 -0
  25. package/dist/resolvers/index.js.map +1 -0
  26. package/dist/server-extensions/RingCentralTelephonyExtension.d.ts +14 -0
  27. package/dist/server-extensions/RingCentralTelephonyExtension.d.ts.map +1 -0
  28. package/dist/server-extensions/RingCentralTelephonyExtension.js +81 -0
  29. package/dist/server-extensions/RingCentralTelephonyExtension.js.map +1 -0
  30. package/dist/server-extensions/TeamsMeetingsExtension.d.ts +17 -0
  31. package/dist/server-extensions/TeamsMeetingsExtension.d.ts.map +1 -0
  32. package/dist/server-extensions/TeamsMeetingsExtension.js +109 -0
  33. package/dist/server-extensions/TeamsMeetingsExtension.js.map +1 -0
  34. package/dist/server-extensions/TwilioTelephonyExtension.d.ts +14 -0
  35. package/dist/server-extensions/TwilioTelephonyExtension.d.ts.map +1 -0
  36. package/dist/server-extensions/TwilioTelephonyExtension.js +88 -0
  37. package/dist/server-extensions/TwilioTelephonyExtension.js.map +1 -0
  38. package/dist/server-extensions/VonageTelephonyExtension.d.ts +14 -0
  39. package/dist/server-extensions/VonageTelephonyExtension.d.ts.map +1 -0
  40. package/dist/server-extensions/VonageTelephonyExtension.js +89 -0
  41. package/dist/server-extensions/VonageTelephonyExtension.js.map +1 -0
  42. package/dist/sessionManager.d.ts +26 -0
  43. package/dist/sessionManager.d.ts.map +1 -0
  44. package/dist/sessionManager.js +38 -0
  45. package/dist/sessionManager.js.map +1 -0
  46. package/dist/telephony/RingCentralTelephonyService.d.ts +79 -0
  47. package/dist/telephony/RingCentralTelephonyService.d.ts.map +1 -0
  48. package/dist/telephony/RingCentralTelephonyService.js +225 -0
  49. package/dist/telephony/RingCentralTelephonyService.js.map +1 -0
  50. package/dist/telephony/TeamsMeetingsRouter.d.ts +21 -0
  51. package/dist/telephony/TeamsMeetingsRouter.d.ts.map +1 -0
  52. package/dist/telephony/TeamsMeetingsRouter.js +84 -0
  53. package/dist/telephony/TeamsMeetingsRouter.js.map +1 -0
  54. package/dist/telephony/TeamsMeetingsService.d.ts +76 -0
  55. package/dist/telephony/TeamsMeetingsService.d.ts.map +1 -0
  56. package/dist/telephony/TeamsMeetingsService.js +157 -0
  57. package/dist/telephony/TeamsMeetingsService.js.map +1 -0
  58. package/dist/telephony/TwilioTelephonyRouter.d.ts +30 -0
  59. package/dist/telephony/TwilioTelephonyRouter.d.ts.map +1 -0
  60. package/dist/telephony/TwilioTelephonyRouter.js +137 -0
  61. package/dist/telephony/TwilioTelephonyRouter.js.map +1 -0
  62. package/dist/telephony/TwilioTelephonyService.d.ts +91 -0
  63. package/dist/telephony/TwilioTelephonyService.d.ts.map +1 -0
  64. package/dist/telephony/TwilioTelephonyService.js +191 -0
  65. package/dist/telephony/TwilioTelephonyService.js.map +1 -0
  66. package/dist/telephony/VonageTelephonyRouter.d.ts +24 -0
  67. package/dist/telephony/VonageTelephonyRouter.d.ts.map +1 -0
  68. package/dist/telephony/VonageTelephonyRouter.js +175 -0
  69. package/dist/telephony/VonageTelephonyRouter.js.map +1 -0
  70. package/dist/telephony/VonageTelephonyService.d.ts +62 -0
  71. package/dist/telephony/VonageTelephonyService.d.ts.map +1 -0
  72. package/dist/telephony/VonageTelephonyService.js +162 -0
  73. package/dist/telephony/VonageTelephonyService.js.map +1 -0
  74. package/dist/telephony/calendar-scheduler.d.ts +41 -0
  75. package/dist/telephony/calendar-scheduler.d.ts.map +1 -0
  76. package/dist/telephony/calendar-scheduler.js +98 -0
  77. package/dist/telephony/calendar-scheduler.js.map +1 -0
  78. package/dist/telephony/index.d.ts +21 -0
  79. package/dist/telephony/index.d.ts.map +1 -0
  80. package/dist/telephony/index.js +26 -0
  81. package/dist/telephony/index.js.map +1 -0
  82. package/dist/telephony/ringcentral-runtime.d.ts +11 -0
  83. package/dist/telephony/ringcentral-runtime.d.ts.map +1 -0
  84. package/dist/telephony/ringcentral-runtime.js +20 -0
  85. package/dist/telephony/ringcentral-runtime.js.map +1 -0
  86. package/dist/telephony/teams-meetings-runtime.d.ts +11 -0
  87. package/dist/telephony/teams-meetings-runtime.d.ts.map +1 -0
  88. package/dist/telephony/teams-meetings-runtime.js +20 -0
  89. package/dist/telephony/teams-meetings-runtime.js.map +1 -0
  90. package/dist/telephony/teamsAcsMediaRegistry.d.ts +35 -0
  91. package/dist/telephony/teamsAcsMediaRegistry.d.ts.map +1 -0
  92. package/dist/telephony/teamsAcsMediaRegistry.js +86 -0
  93. package/dist/telephony/teamsAcsMediaRegistry.js.map +1 -0
  94. package/dist/telephony/telephony-runtime.d.ts +14 -0
  95. package/dist/telephony/telephony-runtime.d.ts.map +1 -0
  96. package/dist/telephony/telephony-runtime.js +23 -0
  97. package/dist/telephony/telephony-runtime.js.map +1 -0
  98. package/dist/telephony/twilioMediaRegistry.d.ts +60 -0
  99. package/dist/telephony/twilioMediaRegistry.d.ts.map +1 -0
  100. package/dist/telephony/twilioMediaRegistry.js +109 -0
  101. package/dist/telephony/twilioMediaRegistry.js.map +1 -0
  102. package/dist/telephony/vonage-runtime.d.ts +11 -0
  103. package/dist/telephony/vonage-runtime.d.ts.map +1 -0
  104. package/dist/telephony/vonage-runtime.js +20 -0
  105. package/dist/telephony/vonage-runtime.js.map +1 -0
  106. package/dist/telephony/vonageMediaRegistry.d.ts +38 -0
  107. package/dist/telephony/vonageMediaRegistry.d.ts.map +1 -0
  108. package/dist/telephony/vonageMediaRegistry.js +113 -0
  109. package/dist/telephony/vonageMediaRegistry.js.map +1 -0
  110. package/dist/types.d.ts +123 -0
  111. package/dist/types.d.ts.map +1 -0
  112. package/dist/types.js +27 -0
  113. package/dist/types.js.map +1 -0
  114. package/package.json +48 -8
  115. package/README.md +0 -45
@@ -0,0 +1,26 @@
1
+ import { IMetadataProvider, UserInfo } from '@memberjunction/core';
2
+ import { MJAIAgentSessionEntity } from '@memberjunction/core-entities';
3
+ /**
4
+ * Parameters for creating an agent session.
5
+ */
6
+ export interface CreateSessionInput {
7
+ agentID: string;
8
+ userID: string;
9
+ conversationID?: string;
10
+ lastSessionID?: string;
11
+ config?: string;
12
+ }
13
+ /**
14
+ * Interface for managing agent session lifecycle from telephony services.
15
+ */
16
+ export interface IAgentSessionManager {
17
+ CreateSession(input: CreateSessionInput, contextUser: UserInfo, provider: IMetadataProvider): Promise<MJAIAgentSessionEntity>;
18
+ }
19
+ /**
20
+ * Default agent session manager for telephony services when no custom host session manager is provided.
21
+ * Directly manages conversation creation and active session record creation.
22
+ */
23
+ export declare class DefaultAgentSessionManager implements IAgentSessionManager {
24
+ CreateSession(input: CreateSessionInput, contextUser: UserInfo, provider: IMetadataProvider): Promise<MJAIAgentSessionEntity>;
25
+ }
26
+ //# sourceMappingURL=sessionManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionManager.d.ts","sourceRoot":"","sources":["../src/sessionManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAwB,MAAM,+BAA+B,CAAC;AAE7F;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACjC,aAAa,CACT,KAAK,EAAE,kBAAkB,EACzB,WAAW,EAAE,QAAQ,EACrB,QAAQ,EAAE,iBAAiB,GAC5B,OAAO,CAAC,sBAAsB,CAAC,CAAC;CACtC;AAED;;;GAGG;AACH,qBAAa,0BAA2B,YAAW,oBAAoB;IACtD,aAAa,CACtB,KAAK,EAAE,kBAAkB,EACzB,WAAW,EAAE,QAAQ,EACrB,QAAQ,EAAE,iBAAiB,GAC5B,OAAO,CAAC,sBAAsB,CAAC;CAoCrC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Default agent session manager for telephony services when no custom host session manager is provided.
3
+ * Directly manages conversation creation and active session record creation.
4
+ */
5
+ export class DefaultAgentSessionManager {
6
+ async CreateSession(input, contextUser, provider) {
7
+ let conversationID = input.conversationID;
8
+ if (!conversationID) {
9
+ const conversation = await provider.GetEntityObject('MJ: Conversations', contextUser);
10
+ conversation.NewRecord();
11
+ conversation.UserID = input.userID;
12
+ conversation.Name = 'Agent Session';
13
+ const savedConv = await conversation.Save();
14
+ if (!savedConv) {
15
+ throw new Error(`Failed to create Conversation for agent session: ${conversation.LatestResult?.CompleteMessage ?? 'unknown error'}`);
16
+ }
17
+ conversationID = conversation.ID;
18
+ }
19
+ const session = await provider.GetEntityObject('MJ: AI Agent Sessions', contextUser);
20
+ session.NewRecord();
21
+ session.AgentID = input.agentID;
22
+ session.UserID = input.userID;
23
+ session.ConversationID = conversationID;
24
+ session.Status = 'Active';
25
+ if (input.config) {
26
+ session.Config_ = input.config;
27
+ }
28
+ if (input.lastSessionID) {
29
+ session.LastSessionID = input.lastSessionID;
30
+ }
31
+ const savedSession = await session.Save();
32
+ if (!savedSession) {
33
+ throw new Error(`Failed to create agent session record: ${session.LatestResult?.CompleteMessage ?? 'unknown error'}`);
34
+ }
35
+ return session;
36
+ }
37
+ }
38
+ //# sourceMappingURL=sessionManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionManager.js","sourceRoot":"","sources":["../src/sessionManager.ts"],"names":[],"mappings":"AAyBA;;;GAGG;AACH,MAAM,OAAO,0BAA0B;IAC5B,KAAK,CAAC,aAAa,CACtB,KAAyB,EACzB,WAAqB,EACrB,QAA2B;QAE3B,IAAI,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC;QAC1C,IAAI,CAAC,cAAc,EAAE,CAAC;YAClB,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAuB,mBAAmB,EAAE,WAAW,CAAC,CAAC;YAC5G,YAAY,CAAC,SAAS,EAAE,CAAC;YACzB,YAAY,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;YACnC,YAAY,CAAC,IAAI,GAAG,eAAe,CAAC;YACpC,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC;YAC5C,IAAI,CAAC,SAAS,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CACX,oDAAoD,YAAY,CAAC,YAAY,EAAE,eAAe,IAAI,eAAe,EAAE,CACtH,CAAC;YACN,CAAC;YACD,cAAc,GAAG,YAAY,CAAC,EAAE,CAAC;QACrC,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAyB,uBAAuB,EAAE,WAAW,CAAC,CAAC;QAC7G,OAAO,CAAC,SAAS,EAAE,CAAC;QACpB,OAAO,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAChC,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC9B,OAAO,CAAC,cAAc,GAAG,cAAc,CAAC;QACxC,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC;QAC1B,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACf,OAAO,CAAC,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC;QACnC,CAAC;QACD,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;YACtB,OAAO,CAAC,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC;QAChD,CAAC;QACD,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QAC1C,IAAI,CAAC,YAAY,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CACX,0CAA0C,OAAO,CAAC,YAAY,EAAE,eAAe,IAAI,eAAe,EAAE,CACvG,CAAC;QACN,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;CACJ"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * @fileoverview Orchestrates RingCentral telephony bridge sessions (inbound + outbound) for MJAPI over the
3
+ * **SIP softphone** transport.
4
+ *
5
+ * @module @memberjunction/telephony-adapters
6
+ */
7
+ import { UserInfo, IMetadataProvider } from '@memberjunction/core';
8
+ import { AIBridgeEngine } from '@memberjunction/ai-bridge-server';
9
+ import { CreateBridgeRealtimeSession } from '@memberjunction/ai-agents';
10
+ import { type BridgeNativeSdkBinding } from '@memberjunction/ai-bridge-base';
11
+ import { createRingCentralSoftphone } from '@memberjunction/ai-bridge-ringcentral';
12
+ import type { RingCentralTelephonyConfig } from '../types.js';
13
+ import { IAgentSessionManager } from '../sessionManager.js';
14
+ /** A resolved inbound call's identifying fields (mapped from a RingCentral SIP INVITE). */
15
+ export interface InboundCallInput {
16
+ /** The SIP `Call-ID` (the per-call id the handle parked the INVITE under + the bridge's inbound id). */
17
+ sessionId: string;
18
+ /** The caller's number (the INVITE's `From`). */
19
+ from: string;
20
+ /** The dialed DID (the INVITE's `To`) — resolved to an agent identity. */
21
+ to: string;
22
+ }
23
+ /** Result of starting an inbound bridge session. */
24
+ export interface InboundCallResult {
25
+ /** Whether a pinned agent was resolved + a bridge session started. */
26
+ accepted: boolean;
27
+ /** Why it was rejected (no agent identity for the DID, provider missing, etc.). */
28
+ reason?: string;
29
+ }
30
+ /** Injectable collaborators (production defaults wired in the constructor; fakes in tests). */
31
+ export interface RingCentralTelephonyServiceDeps {
32
+ engine?: Pick<AIBridgeEngine, 'ProviderByName' | 'ProviderByDriverClass' | 'StartBridgeSession' | 'Config'>;
33
+ sessionFactory?: typeof CreateBridgeRealtimeSession;
34
+ sessionManager?: IAgentSessionManager;
35
+ /** Test seam: a factory that builds the softphone handle (inject a fake to avoid the real SIP SDK). */
36
+ createHandle?: typeof createRingCentralSoftphone;
37
+ }
38
+ /**
39
+ * Starts RingCentral bridge sessions over a shared SIP-softphone registration.
40
+ */
41
+ export declare class RingCentralTelephonyService {
42
+ private readonly config;
43
+ private readonly engine;
44
+ private readonly sessionFactory;
45
+ private readonly sessionManager;
46
+ private readonly createHandle;
47
+ /** The shared SIP registration — created + registered by {@link start}; null until then. */
48
+ private handle;
49
+ /** The carrier PCM16 rate for the negotiated codec (set in {@link start}). */
50
+ private carrierSampleRate;
51
+ constructor(config: RingCentralTelephonyConfig, deps?: RingCentralTelephonyServiceDeps);
52
+ /**
53
+ * Creates + registers the shared SIP softphone and wires inbound INVITE handling.
54
+ */
55
+ start(): Promise<void>;
56
+ /** Best-effort teardown of the SIP registration (server shutdown). */
57
+ dispose(): void;
58
+ /**
59
+ * Resolves the dialed DID to a pinned agent and starts an INBOUND bridge session.
60
+ */
61
+ HandleInboundCall(input: InboundCallInput, contextUser: UserInfo, provider: IMetadataProvider): Promise<InboundCallResult>;
62
+ /**
63
+ * Places an OUTBOUND call from a given agent identity to a destination number.
64
+ */
65
+ PlaceOutboundCall(agentIdentityId: string, toNumber: string, contextUser: UserInfo, provider: IMetadataProvider): Promise<string>;
66
+ /** Inbound INVITE coordinator: resolve the server principal, start a bridge, decline if no agent matched. */
67
+ private onInboundInvite;
68
+ /** Shared inbound/outbound bridge-start: resolve provider, open the realtime session, bind the SDK, start. */
69
+ private startBridge;
70
+ private resolveProvider;
71
+ buildBindSdk(): BridgeNativeSdkBinding;
72
+ private requireHandle;
73
+ private buildSessionConfiguration;
74
+ private toSoftphoneConfig;
75
+ private resolveServerContext;
76
+ private resolveAgentIdentityByPhone;
77
+ private loadAgentIdentity;
78
+ }
79
+ //# sourceMappingURL=RingCentralTelephonyService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RingCentralTelephonyService.d.ts","sourceRoot":"","sources":["../../src/telephony/RingCentralTelephonyService.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAW,QAAQ,EAAE,iBAAiB,EAAiC,MAAM,sBAAsB,CAAC;AAI3G,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,EAEH,KAAK,sBAAsB,EAK9B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACH,0BAA0B,EAK7B,MAAM,uCAAuC,CAAC;AAC/C,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAA8B,MAAM,sBAAsB,CAAC;AAaxF,2FAA2F;AAC3F,MAAM,WAAW,gBAAgB;IAC7B,wGAAwG;IACxG,SAAS,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,0EAA0E;IAC1E,EAAE,EAAE,MAAM,CAAC;CACd;AAED,oDAAoD;AACpD,MAAM,WAAW,iBAAiB;IAC9B,sEAAsE;IACtE,QAAQ,EAAE,OAAO,CAAC;IAClB,mFAAmF;IACnF,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,+FAA+F;AAC/F,MAAM,WAAW,+BAA+B;IAC5C,MAAM,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,gBAAgB,GAAG,uBAAuB,GAAG,oBAAoB,GAAG,QAAQ,CAAC,CAAC;IAC5G,cAAc,CAAC,EAAE,OAAO,2BAA2B,CAAC;IACpD,cAAc,CAAC,EAAE,oBAAoB,CAAC;IACtC,uGAAuG;IACvG,YAAY,CAAC,EAAE,OAAO,0BAA0B,CAAC;CACpD;AAED;;GAEG;AACH,qBAAa,2BAA2B;IAahC,OAAO,CAAC,QAAQ,CAAC,MAAM;IAZ3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqG;IAC5H,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqC;IACpE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAuB;IACtD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAoC;IAEjE,4FAA4F;IAC5F,OAAO,CAAC,MAAM,CAA2C;IAEzD,8EAA8E;IAC9E,OAAO,CAAC,iBAAiB,CAA4C;gBAGhD,MAAM,EAAE,0BAA0B,EACnD,IAAI,GAAE,+BAAoC;IAQ9C;;OAEG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAanC,sEAAsE;IAC/D,OAAO,IAAI,IAAI;IAKtB;;OAEG;IACU,iBAAiB,CAAC,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAuBvI;;OAEG;IACU,iBAAiB,CAAC,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;IAkB9I,6GAA6G;YAC/F,eAAe;IAc7B,8GAA8G;YAChG,WAAW;IAsCzB,OAAO,CAAC,eAAe;IAQhB,YAAY,IAAI,sBAAsB;IAO7C,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,yBAAyB;IAcjC,OAAO,CAAC,iBAAiB;IAYzB,OAAO,CAAC,oBAAoB;YASd,2BAA2B;YAsB3B,iBAAiB;CAQlC"}
@@ -0,0 +1,225 @@
1
+ /**
2
+ * @fileoverview Orchestrates RingCentral telephony bridge sessions (inbound + outbound) for MJAPI over the
3
+ * **SIP softphone** transport.
4
+ *
5
+ * @module @memberjunction/telephony-adapters
6
+ */
7
+ import { RunView, Metadata, LogError, LogStatus } from '@memberjunction/core';
8
+ import { EscapeSQLString } from '@memberjunction/global';
9
+ import { UserCache } from '@memberjunction/generic-database-provider';
10
+ import { AIBridgeEngine } from '@memberjunction/ai-bridge-server';
11
+ import { CreateBridgeRealtimeSession } from '@memberjunction/ai-agents';
12
+ import { CARRIER_SAMPLE_RATE_CONFIG_KEY, DIRECTION_CONFIG_KEY, FROM_NUMBER_CONFIG_KEY, INBOUND_CALL_ID_CONFIG_KEY, } from '@memberjunction/ai-bridge-base';
13
+ import { createRingCentralSoftphone, RingCentralSoftphoneCallSdk, } from '@memberjunction/ai-bridge-ringcentral';
14
+ import { DefaultAgentSessionManager } from '../sessionManager.js';
15
+ const RINGCENTRAL_PROVIDER_DRIVER = 'RingCentralBridge';
16
+ const AGENT_IDENTITY_ENTITY = 'MJ: AI Bridge Agent Identities';
17
+ const PHONE_IDENTITY_TYPE = 'PhoneNumber';
18
+ /** PCM16 carrier rate (Hz) per softphone codec — the rate the bridge resamples to/from the model rate. */
19
+ const CODEC_CARRIER_RATE = {
20
+ 'OPUS/16000': 16000,
21
+ 'OPUS/48000/2': 48000,
22
+ 'PCMU/8000': 8000,
23
+ };
24
+ /**
25
+ * Starts RingCentral bridge sessions over a shared SIP-softphone registration.
26
+ */
27
+ export class RingCentralTelephonyService {
28
+ constructor(config, deps = {}) {
29
+ this.config = config;
30
+ /** The shared SIP registration — created + registered by {@link start}; null until then. */
31
+ this.handle = null;
32
+ /** The carrier PCM16 rate for the negotiated codec (set in {@link start}). */
33
+ this.carrierSampleRate = CODEC_CARRIER_RATE['OPUS/16000'];
34
+ this.engine = deps.engine ?? AIBridgeEngine.Instance;
35
+ this.sessionFactory = deps.sessionFactory ?? CreateBridgeRealtimeSession;
36
+ this.sessionManager = deps.sessionManager ?? new DefaultAgentSessionManager();
37
+ this.createHandle = deps.createHandle ?? createRingCentralSoftphone;
38
+ }
39
+ /**
40
+ * Creates + registers the shared SIP softphone and wires inbound INVITE handling.
41
+ */
42
+ async start() {
43
+ try {
44
+ this.carrierSampleRate = CODEC_CARRIER_RATE[this.config.codec ?? 'OPUS/16000'];
45
+ this.handle = await this.createHandle(this.toSoftphoneConfig());
46
+ this.handle.onInvite((info) => void this.onInboundInvite(info));
47
+ await this.handle.register();
48
+ LogStatus('[Telephony][RingCentral] softphone telephony started (inbound + outbound ready).');
49
+ }
50
+ catch (e) {
51
+ this.handle = null;
52
+ LogError(`[Telephony][RingCentral] softphone start failed: ${e instanceof Error ? e.message : String(e)}`);
53
+ }
54
+ }
55
+ /** Best-effort teardown of the SIP registration (server shutdown). */
56
+ dispose() {
57
+ this.handle?.dispose();
58
+ this.handle = null;
59
+ }
60
+ /**
61
+ * Resolves the dialed DID to a pinned agent and starts an INBOUND bridge session.
62
+ */
63
+ async HandleInboundCall(input, contextUser, provider) {
64
+ try {
65
+ await this.engine.Config(false, contextUser, provider);
66
+ const ringCentralProvider = this.resolveProvider();
67
+ const identity = await this.resolveAgentIdentityByPhone(input.to, ringCentralProvider.ID, contextUser);
68
+ if (!identity) {
69
+ return { accepted: false, reason: `No active agent identity for dialed number '${input.to}'.` };
70
+ }
71
+ await this.startBridge({
72
+ agentID: identity.AgentID,
73
+ direction: 'Inbound',
74
+ address: input.from,
75
+ inboundCallId: input.sessionId,
76
+ contextUser,
77
+ provider,
78
+ });
79
+ return { accepted: true };
80
+ }
81
+ catch (e) {
82
+ LogError(`[Telephony][RingCentral] inbound call ${input.sessionId} failed: ${e instanceof Error ? e.message : String(e)}`);
83
+ return { accepted: false, reason: 'Internal error starting the agent.' };
84
+ }
85
+ }
86
+ /**
87
+ * Places an OUTBOUND call from a given agent identity to a destination number.
88
+ */
89
+ async PlaceOutboundCall(agentIdentityId, toNumber, contextUser, provider) {
90
+ const identity = await this.loadAgentIdentity(agentIdentityId, contextUser, provider);
91
+ if (!identity) {
92
+ throw new Error(`Agent identity '${agentIdentityId}' not found or inactive.`);
93
+ }
94
+ const session = await this.startBridge({
95
+ agentID: identity.AgentID,
96
+ direction: 'Outbound',
97
+ address: toNumber,
98
+ fromNumber: identity.IdentityValue,
99
+ contextUser,
100
+ provider,
101
+ });
102
+ return session.RoomKey ?? '';
103
+ }
104
+ // ── internals ────────────────────────────────────────────────────────────────
105
+ /** Inbound INVITE coordinator: resolve the server principal, start a bridge, decline if no agent matched. */
106
+ async onInboundInvite(info) {
107
+ const context = this.resolveServerContext();
108
+ if (!context) {
109
+ LogError('[Telephony][RingCentral] no server context user available; declining inbound call.');
110
+ await this.handle?.declineCall(info.callId);
111
+ return;
112
+ }
113
+ const result = await this.HandleInboundCall({ sessionId: info.callId, from: info.from, to: info.to }, context.user, context.provider);
114
+ if (!result.accepted) {
115
+ LogStatus(`[Telephony][RingCentral] inbound ${info.callId} not accepted: ${result.reason ?? 'unknown'}; declining.`);
116
+ await this.handle?.declineCall(info.callId);
117
+ }
118
+ }
119
+ /** Shared inbound/outbound bridge-start: resolve provider, open the realtime session, bind the SDK, start. */
120
+ async startBridge(args) {
121
+ await this.engine.Config(false, args.contextUser, args.provider);
122
+ const ringCentralProvider = this.resolveProvider();
123
+ const agentSession = await this.sessionManager.CreateSession({ agentID: args.agentID, userID: args.contextUser.ID }, args.contextUser, args.provider);
124
+ const realtimeSession = await this.sessionFactory({
125
+ AgentID: args.agentID,
126
+ TargetAgentID: args.agentID,
127
+ ContextUser: args.contextUser,
128
+ MetadataProvider: args.provider,
129
+ AgentSessionID: agentSession.ID,
130
+ RoomName: args.address,
131
+ });
132
+ const active = await this.engine.StartBridgeSession({
133
+ AgentSessionID: agentSession.ID,
134
+ AgentID: args.agentID,
135
+ TargetAgentID: args.agentID,
136
+ Provider: ringCentralProvider,
137
+ RealtimeSession: realtimeSession,
138
+ Address: args.address,
139
+ Direction: args.direction,
140
+ Configuration: this.buildSessionConfiguration(args.direction, args.fromNumber, args.inboundCallId),
141
+ BindSdk: this.buildBindSdk(),
142
+ ContextUser: args.contextUser,
143
+ MetadataProvider: args.provider,
144
+ });
145
+ return { RoomKey: active.RoomKey };
146
+ }
147
+ resolveProvider() {
148
+ const provider = this.engine.ProviderByDriverClass(RINGCENTRAL_PROVIDER_DRIVER) ?? this.engine.ProviderByName('RingCentral');
149
+ if (!provider) {
150
+ throw new Error(`No active 'MJ: AI Bridge Providers' row for the RingCentral bridge (DriverClass '${RINGCENTRAL_PROVIDER_DRIVER}').`);
151
+ }
152
+ return provider;
153
+ }
154
+ buildBindSdk() {
155
+ return (driver) => {
156
+ const telephony = driver;
157
+ telephony.SetSdkFactory(() => new RingCentralSoftphoneCallSdk(this.requireHandle()));
158
+ };
159
+ }
160
+ requireHandle() {
161
+ if (!this.handle) {
162
+ throw new Error('[Telephony][RingCentral] softphone not registered yet (start() pending or failed).');
163
+ }
164
+ return this.handle;
165
+ }
166
+ buildSessionConfiguration(direction, fromNumber, inboundCallId) {
167
+ const config = {
168
+ [DIRECTION_CONFIG_KEY]: direction,
169
+ [CARRIER_SAMPLE_RATE_CONFIG_KEY]: this.carrierSampleRate,
170
+ };
171
+ if (fromNumber) {
172
+ config[FROM_NUMBER_CONFIG_KEY] = fromNumber;
173
+ }
174
+ if (inboundCallId) {
175
+ config[INBOUND_CALL_ID_CONFIG_KEY] = inboundCallId;
176
+ }
177
+ return config;
178
+ }
179
+ toSoftphoneConfig() {
180
+ return {
181
+ domain: this.config.sipDomain,
182
+ outboundProxy: this.config.sipOutboundProxy,
183
+ username: this.config.sipUsername,
184
+ password: this.config.sipPassword,
185
+ authorizationId: this.config.sipAuthorizationId,
186
+ codec: this.config.codec,
187
+ ignoreTlsCertErrors: this.config.ignoreTlsCertErrors,
188
+ };
189
+ }
190
+ resolveServerContext() {
191
+ const user = UserCache.Instance.GetSystemUser() ?? UserCache.Users.find((u) => u.IsActive && u.Type?.trim().toLowerCase() === 'owner') ?? null;
192
+ const provider = Metadata.Provider; // global-provider-ok: inbound telephony webhook runs in server-global provider context
193
+ if (!user || !provider) {
194
+ return null;
195
+ }
196
+ return { user, provider };
197
+ }
198
+ async resolveAgentIdentityByPhone(dialedNumber, providerId, contextUser) {
199
+ const normalized = (dialedNumber ?? '').trim();
200
+ if (!normalized) {
201
+ return null;
202
+ }
203
+ const rv = new RunView();
204
+ const result = await rv.RunView({
205
+ EntityName: AGENT_IDENTITY_ENTITY,
206
+ ExtraFilter: `IdentityType='${PHONE_IDENTITY_TYPE}' AND IdentityValue='${EscapeSQLString(normalized)}' AND ProviderID='${EscapeSQLString(providerId)}' AND IsActive=1`,
207
+ MaxRows: 1,
208
+ ResultType: 'entity_object',
209
+ }, contextUser);
210
+ if (!result.Success) {
211
+ LogError(`[Telephony][RingCentral] agent-identity lookup failed: ${result.ErrorMessage}`);
212
+ return null;
213
+ }
214
+ return result.Results?.[0] ?? null;
215
+ }
216
+ async loadAgentIdentity(agentIdentityId, contextUser, provider) {
217
+ const entity = await provider.GetEntityObject(AGENT_IDENTITY_ENTITY, contextUser);
218
+ const loaded = await entity.Load(agentIdentityId);
219
+ if (!loaded || !entity.IsActive) {
220
+ return null;
221
+ }
222
+ return entity;
223
+ }
224
+ }
225
+ //# sourceMappingURL=RingCentralTelephonyService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RingCentralTelephonyService.js","sourceRoot":"","sources":["../../src/telephony/RingCentralTelephonyService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * @fileoverview Express wiring for the Teams meetings ingress — the Microsoft Graph change-notification webhook.
3
+ *
4
+ * @module @memberjunction/telephony-adapters
5
+ */
6
+ import { Router } from 'express';
7
+ import type { TeamsMeetingsConfig } from '../types.js';
8
+ import { TeamsAcsMediaRegistry } from './teamsAcsMediaRegistry.js';
9
+ import { TeamsMeetingsService } from './TeamsMeetingsService.js';
10
+ /** The mount path for the Teams meetings public router. */
11
+ export declare const TEAMS_MEETINGS_MOUNT_PATH = "/meetings/teams";
12
+ /**
13
+ * Builds the Teams meetings handler: the public Graph change-notification router + the shared ACS media
14
+ * registry + the meetings service.
15
+ */
16
+ export declare function createTeamsMeetingsHandler(config: TeamsMeetingsConfig): {
17
+ publicRouter: Router;
18
+ registry: TeamsAcsMediaRegistry;
19
+ service: TeamsMeetingsService;
20
+ };
21
+ //# sourceMappingURL=TeamsMeetingsRouter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TeamsMeetingsRouter.d.ts","sourceRoot":"","sources":["../../src/telephony/TeamsMeetingsRouter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAqC,MAAM,SAAS,CAAC;AAOpE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEjE,2DAA2D;AAC3D,eAAO,MAAM,yBAAyB,oBAAoB,CAAC;AAO3D;;;GAGG;AACH,wBAAgB,0BAA0B,CACtC,MAAM,EAAE,mBAAmB,GAC5B;IACC,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,qBAAqB,CAAC;IAChC,OAAO,EAAE,oBAAoB,CAAC;CACjC,CAUA"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * @fileoverview Express wiring for the Teams meetings ingress — the Microsoft Graph change-notification webhook.
3
+ *
4
+ * @module @memberjunction/telephony-adapters
5
+ */
6
+ import { Router, json } from 'express';
7
+ import { LogError, LogStatus } from '@memberjunction/core';
8
+ import { validateGraphNotification, parseCallNotification, } from '@memberjunction/ai-bridge-teams';
9
+ import { TeamsAcsMediaRegistry } from './teamsAcsMediaRegistry.js';
10
+ import { TeamsMeetingsService } from './TeamsMeetingsService.js';
11
+ /** The mount path for the Teams meetings public router. */
12
+ export const TEAMS_MEETINGS_MOUNT_PATH = '/meetings/teams';
13
+ /**
14
+ * Builds the Teams meetings handler: the public Graph change-notification router + the shared ACS media
15
+ * registry + the meetings service.
16
+ */
17
+ export function createTeamsMeetingsHandler(config) {
18
+ const registry = new TeamsAcsMediaRegistry(config.acsSampleRate);
19
+ const service = new TeamsMeetingsService(config, registry);
20
+ const publicRouter = Router();
21
+ publicRouter.post('/notifications', json({ type: () => true }), (req, res) => {
22
+ handleGraphNotification(service, config, req, res);
23
+ });
24
+ return { publicRouter, registry, service };
25
+ }
26
+ /** Handles the Graph webhook: echo the validation token, else verify clientState + drive the service. */
27
+ function handleGraphNotification(service, config, req, res) {
28
+ const validationToken = readValidationToken(req);
29
+ if (validationToken !== undefined && validationToken.length > 0 && !isWellFormedValidationToken(validationToken)) {
30
+ LogStatus('[Meetings][Teams] notification rejected: malformed-validation-token');
31
+ res.status(400).type('text/plain').send('Rejected.');
32
+ return;
33
+ }
34
+ const batch = (req.body ?? {});
35
+ const notifications = Array.isArray(batch.value) ? batch.value : [];
36
+ const clientStates = notifications.map((n) => n.clientState);
37
+ const verdict = validateGraphNotification(validationToken, config.notificationClientState ?? '', clientStates);
38
+ if (verdict.Kind === 'validation') {
39
+ res.status(200).type('text/plain').set('X-Content-Type-Options', 'nosniff').send(verdict.ValidationToken);
40
+ return;
41
+ }
42
+ if (verdict.Kind === 'reject') {
43
+ LogStatus(`[Meetings][Teams] notification rejected: ${verdict.Reason}`);
44
+ res.status(verdict.Reason === 'empty-validation-token' ? 400 : 403).type('text/plain').send('Rejected.');
45
+ return;
46
+ }
47
+ dispatchNotifications(service, notifications);
48
+ res.status(202).end();
49
+ }
50
+ /** Maps each Graph call/participant notification to the meetings service's roster / call-ended drive helpers. */
51
+ function dispatchNotifications(service, notifications) {
52
+ for (const notification of notifications) {
53
+ try {
54
+ const normalized = parseCallNotification(notification);
55
+ if (normalized.state === 'terminated') {
56
+ service.DriveCallEnded(normalized.callId);
57
+ }
58
+ else if (normalized.participants.length > 0) {
59
+ service.DriveParticipantsUpdated(normalized.callId, normalized.participants);
60
+ }
61
+ }
62
+ catch (e) {
63
+ LogError(`[Meetings][Teams] failed to process notification: ${e instanceof Error ? e.message : String(e)}`);
64
+ }
65
+ }
66
+ }
67
+ /** Upper bound for a Graph validation token. */
68
+ const MAX_VALIDATION_TOKEN_LENGTH = 1024;
69
+ /** Graph validation tokens are printable ASCII only. */
70
+ const PRINTABLE_ASCII = /^[\x20-\x7E]+$/;
71
+ function isWellFormedValidationToken(token) {
72
+ return token.length <= MAX_VALIDATION_TOKEN_LENGTH && PRINTABLE_ASCII.test(token);
73
+ }
74
+ function readValidationToken(req) {
75
+ const raw = req.query?.validationToken;
76
+ if (typeof raw === 'string') {
77
+ return raw;
78
+ }
79
+ if (Array.isArray(raw) && typeof raw[0] === 'string') {
80
+ return raw[0];
81
+ }
82
+ return undefined;
83
+ }
84
+ //# sourceMappingURL=TeamsMeetingsRouter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TeamsMeetingsRouter.js","sourceRoot":"","sources":["../../src/telephony/TeamsMeetingsRouter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * @fileoverview Orchestrates Teams meeting bridge sessions (join-by-URL) for MJAPI.
3
+ *
4
+ * @module @memberjunction/telephony-adapters
5
+ */
6
+ import { UserInfo, IMetadataProvider } from '@memberjunction/core';
7
+ import { AIBridgeEngine, type StartBridgeSessionParams } from '@memberjunction/ai-bridge-server';
8
+ import { CreateBridgeRealtimeSession } from '@memberjunction/ai-agents';
9
+ import { type BridgeNativeSdkBinding } from '@memberjunction/ai-bridge-base';
10
+ import { RealGraphCallsClient } from '@memberjunction/ai-bridge-teams';
11
+ import type { TeamsMeetingsConfig } from '../types.js';
12
+ import { IAgentSessionManager } from '../sessionManager.js';
13
+ import { TeamsAcsMediaRegistry } from './teamsAcsMediaRegistry.js';
14
+ /** Result of starting a Teams meeting bridge session. */
15
+ export interface JoinMeetingResult {
16
+ /** Whether a bridge session was started for the meeting. */
17
+ accepted: boolean;
18
+ /** The Graph call id the bot joined (the bridge's external connection id), when accepted. */
19
+ callId?: string;
20
+ /** Why it was rejected (no agent identity, provider missing, unparseable join URL, etc.). */
21
+ reason?: string;
22
+ }
23
+ /** Injectable collaborators (production defaults wired in the constructor; fakes in tests). */
24
+ export interface TeamsMeetingsServiceDeps {
25
+ engine?: Pick<AIBridgeEngine, 'ProviderByName' | 'ProviderByDriverClass' | 'StartBridgeSession' | 'Config'>;
26
+ sessionFactory?: typeof CreateBridgeRealtimeSession;
27
+ sessionManager?: IAgentSessionManager;
28
+ /** Constructs the Graph control-plane client for a session (default: the real lazy-SDK client). */
29
+ graphClientFactory?: (accessToken: string, tenantId?: string) => RealGraphCallsClient;
30
+ }
31
+ /**
32
+ * Starts Teams meeting bridge sessions. One instance per server, constructed alongside the meetings router and
33
+ * sharing the {@link TeamsAcsMediaRegistry} with the server's ACS media adapter.
34
+ */
35
+ export declare class TeamsMeetingsService {
36
+ private readonly config;
37
+ private readonly registry;
38
+ private readonly engine;
39
+ private readonly sessionFactory;
40
+ private readonly sessionManager;
41
+ private readonly graphClientFactory;
42
+ /** Live Graph clients keyed by call id, so the webhook ingress can drive their roster/ended handlers. */
43
+ private readonly graphClientsByCall;
44
+ constructor(config: TeamsMeetingsConfig, registry: TeamsAcsMediaRegistry, deps?: TeamsMeetingsServiceDeps);
45
+ get Config(): TeamsMeetingsConfig;
46
+ /**
47
+ * Joins a Teams meeting by URL for a given agent identity and starts the bridge session.
48
+ */
49
+ JoinMeetingByUrl(agentIdentityId: string, joinUrl: string, contextUser: UserInfo, provider: IMetadataProvider): Promise<JoinMeetingResult>;
50
+ /**
51
+ * Drives the retained Graph roster handler for a call from a Graph change notification.
52
+ */
53
+ DriveParticipantsUpdated(callId: string, participants: {
54
+ id: string;
55
+ displayName?: string;
56
+ role?: string;
57
+ }[]): void;
58
+ /** Drives the call-ended handler for a call from a Graph change notification, then tears the call down. */
59
+ DriveCallEnded(callId: string): void;
60
+ /**
61
+ * Builds the {@link StartBridgeSessionParams} for a SCHEDULED Teams join.
62
+ */
63
+ BuildScheduledStartParams(args: {
64
+ agentID: string;
65
+ joinUrl: string;
66
+ agentSessionID: string;
67
+ contextUser: UserInfo;
68
+ provider: IMetadataProvider;
69
+ }): Promise<StartBridgeSessionParams>;
70
+ private startBridge;
71
+ private resolveProvider;
72
+ buildBindSdk(graphClient: RealGraphCallsClient): BridgeNativeSdkBinding;
73
+ private buildSessionConfiguration;
74
+ private loadAgentIdentity;
75
+ }
76
+ //# sourceMappingURL=TeamsMeetingsService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TeamsMeetingsService.d.ts","sourceRoot":"","sources":["../../src/telephony/TeamsMeetingsService.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAW,QAAQ,EAAE,iBAAiB,EAAY,MAAM,sBAAsB,CAAC;AAEtF,OAAO,EAAE,cAAc,EAAE,KAAK,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AACjG,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,EAAsB,KAAK,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACjG,OAAO,EAAqB,oBAAoB,EAAwC,MAAM,iCAAiC,CAAC;AAChI,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAA8B,MAAM,sBAAsB,CAAC;AACxF,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAKnE,yDAAyD;AACzD,MAAM,WAAW,iBAAiB;IAC9B,4DAA4D;IAC5D,QAAQ,EAAE,OAAO,CAAC;IAClB,6FAA6F;IAC7F,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6FAA6F;IAC7F,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,+FAA+F;AAC/F,MAAM,WAAW,wBAAwB;IACrC,MAAM,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,gBAAgB,GAAG,uBAAuB,GAAG,oBAAoB,GAAG,QAAQ,CAAC,CAAC;IAC5G,cAAc,CAAC,EAAE,OAAO,2BAA2B,CAAC;IACpD,cAAc,CAAC,EAAE,oBAAoB,CAAC;IACtC,mGAAmG;IACnG,kBAAkB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,oBAAoB,CAAC;CACzF;AAED;;;GAGG;AACH,qBAAa,oBAAoB;IASzB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAT7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqG;IAC5H,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqC;IACpE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAuB;IACtD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAmE;IACtG,yGAAyG;IACzG,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA2C;gBAGzD,MAAM,EAAE,mBAAmB,EAC3B,QAAQ,EAAE,qBAAqB,EAChD,IAAI,GAAE,wBAA6B;IASvC,IAAW,MAAM,IAAI,mBAAmB,CAEvC;IAED;;OAEG;IACU,gBAAgB,CACzB,eAAe,EAAE,MAAM,EACvB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,QAAQ,EACrB,QAAQ,EAAE,iBAAiB,GAC5B,OAAO,CAAC,iBAAiB,CAAC;IAc7B;;OAEG;IACI,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,GAAG,IAAI;IAI1H,2GAA2G;IACpG,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAM3C;;OAEG;IACU,yBAAyB,CAAC,IAAI,EAAE;QACzC,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,cAAc,EAAE,MAAM,CAAC;QACvB,WAAW,EAAE,QAAQ,CAAC;QACtB,QAAQ,EAAE,iBAAiB,CAAC;KAC/B,GAAG,OAAO,CAAC,wBAAwB,CAAC;YA6BvB,WAAW;IA+CzB,OAAO,CAAC,eAAe;IAQhB,YAAY,CAAC,WAAW,EAAE,oBAAoB,GAAG,sBAAsB;IAc9E,OAAO,CAAC,yBAAyB;YAQnB,iBAAiB;CAYlC"}