@vogent/vogent-web-client 0.0.7 → 0.0.9

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.
@@ -0,0 +1,121 @@
1
+ /**
2
+ * @fileoverview VogentCall provides the main interface for managing voice calls with Vogent's AI system.
3
+ *
4
+ * This class handles:
5
+ * - Call lifecycle management (start, pause, hangup)
6
+ * - Audio connection setup
7
+ * - Real-time transcript monitoring
8
+ * - Status event handling
9
+ *
10
+ * Basic usage:
11
+ * ```typescript
12
+ * const call = new VogentCall({
13
+ * sessionId: "session_id",
14
+ * dialId: "dial_id",
15
+ * token: "auth_token"
16
+ * });
17
+ *
18
+ * // Start the call
19
+ * await call.start();
20
+ *
21
+ * // Connect audio
22
+ * const audioConn = await call.connectAudio();
23
+ *
24
+ * // Monitor transcripts
25
+ * const unsubscribe = call.monitorTranscript((transcript) => {
26
+ * console.log(transcript);
27
+ * });
28
+ *
29
+ * // Monitor status changes
30
+ * call.on('status', (status) => {
31
+ * console.log('Call status:', status);
32
+ * });
33
+ *
34
+ * // Later: cleanup
35
+ * unsubscribe();
36
+ * await call.hangup();
37
+ * ```
38
+ *
39
+ * @see {@link https://docs.vogent.ai} for complete server documentation
40
+ * @module VogentCall
41
+ */
42
+ import { VogentAudioConn } from './devices/VogentDevice';
43
+ export type Transcript = {
44
+ /** The text of the transcript */
45
+ text: string;
46
+ /** The speaker of the transcript currently either 'HUMAN' or 'AI', or 'IVR' if IVR detection is enabled */
47
+ speaker: string;
48
+ }[];
49
+ /**
50
+ * VogentCall manages the lifecycle and state of a voice call session
51
+ */
52
+ export declare class VogentCall {
53
+ /** Apollo GraphQL client instance for API communication */
54
+ private client;
55
+ /** Unique identifier for the current session */
56
+ private sessionId;
57
+ /** Unique identifier for the current dial/call */
58
+ private dialId;
59
+ /** GraphQL subscription handle */
60
+ private subscription?;
61
+ /** Base URL for the API endpoints */
62
+ private baseUrl;
63
+ /** Current dial/call state */
64
+ private dial?;
65
+ /** Array of event handlers for status changes */
66
+ private _handlers;
67
+ /**
68
+ * Creates a new VogentCall instance
69
+ * @param dialDetails - Object containing session details and authentication, retrieved from the Vogent server API
70
+ * @param dialDetails.sessionId - Unique session identifier
71
+ * @param dialDetails.dialId - Unique dial/call identifier
72
+ * @param dialDetails.token - Authentication token
73
+ * @param config - Configuration options
74
+ * @param config.baseUrl - API base URL (defaults to 'https://api.getelto.com')
75
+ */
76
+ constructor(dialDetails: {
77
+ sessionId: string;
78
+ dialId: string;
79
+ token: string;
80
+ }, config?: {
81
+ baseUrl: string;
82
+ });
83
+ /**
84
+ * Registers an event handler for status changes
85
+ * @param ev - Event type ('status')
86
+ * - status: called when the dial status changes, see docs.vogent.ai for more details
87
+ * @param fn - Callback function to handle the event
88
+ */
89
+ on(ev: 'status', fn: (...args: any[]) => void): void;
90
+ /**
91
+ * Subscribes to transcript updates for the current call
92
+ * @param fn - Callback function that receives transcript updates
93
+ * @returns Function to unsubscribe from transcript updates
94
+ */
95
+ monitorTranscript(fn: (transcript: Transcript) => void): () => void;
96
+ /**
97
+ * Internal method to update dial state and trigger status handlers
98
+ * @param dial - Updated dial information
99
+ */
100
+ private updateDial;
101
+ /**
102
+ * Establishes audio connection for the call
103
+ * @param liveListen - Whether to enable live listening mode. This should be set to true for monitoring legs (e.g. humans that are listening
104
+ * to the call who the AI should not interact with.)
105
+ * @returns Promise resolving to audio connection handle
106
+ */
107
+ connectAudio(liveListen?: boolean): Promise<VogentAudioConn>;
108
+ /**
109
+ * Starts the call session. Does not connect audio, you must call connectAudio() to do so.
110
+ */
111
+ start(): Promise<void>;
112
+ /**
113
+ * Sets the pause state of the AI
114
+ * @param paused - Whether to pause the AI or not.
115
+ */
116
+ setPaused(paused: boolean): Promise<void>;
117
+ /**
118
+ * Ends the current call
119
+ */
120
+ hangup(): Promise<void>;
121
+ }
@@ -0,0 +1,247 @@
1
+ /**
2
+ * @fileoverview VogentCall provides the main interface for managing voice calls with Vogent's AI system.
3
+ *
4
+ * This class handles:
5
+ * - Call lifecycle management (start, pause, hangup)
6
+ * - Audio connection setup
7
+ * - Real-time transcript monitoring
8
+ * - Status event handling
9
+ *
10
+ * Basic usage:
11
+ * ```typescript
12
+ * const call = new VogentCall({
13
+ * sessionId: "session_id",
14
+ * dialId: "dial_id",
15
+ * token: "auth_token"
16
+ * });
17
+ *
18
+ * // Start the call
19
+ * await call.start();
20
+ *
21
+ * // Connect audio
22
+ * const audioConn = await call.connectAudio();
23
+ *
24
+ * // Monitor transcripts
25
+ * const unsubscribe = call.monitorTranscript((transcript) => {
26
+ * console.log(transcript);
27
+ * });
28
+ *
29
+ * // Monitor status changes
30
+ * call.on('status', (status) => {
31
+ * console.log('Call status:', status);
32
+ * });
33
+ *
34
+ * // Later: cleanup
35
+ * unsubscribe();
36
+ * await call.hangup();
37
+ * ```
38
+ *
39
+ * @see {@link https://docs.vogent.ai} for complete server documentation
40
+ * @module VogentCall
41
+ */
42
+ import { ApolloClient, createHttpLink, InMemoryCache, split } from '@apollo/client';
43
+ import { setContext } from '@apollo/client/link/context';
44
+ import { GraphQLWsLink } from '@apollo/client/link/subscriptions';
45
+ import { getMainDefinition } from '@apollo/client/utilities';
46
+ import { BrowserDialTokenType, SessionMessageType, } from './__generated__/graphql';
47
+ import { AI_CONNECT_SESSION, AI_GET_TOKEN, AI_HANGUP_CALL, AI_START_DIAL_SESSION, AI_SET_PAUSED, REFRESH_TRANSCRIPT, } from './queries';
48
+ import { createClient } from 'graphql-ws';
49
+ import { VonageDevice } from './devices/VonageDevice';
50
+ import { dialStatusIsComplete } from './utils';
51
+ /**
52
+ * VogentCall manages the lifecycle and state of a voice call session
53
+ */
54
+ export class VogentCall {
55
+ /**
56
+ * Creates a new VogentCall instance
57
+ * @param dialDetails - Object containing session details and authentication, retrieved from the Vogent server API
58
+ * @param dialDetails.sessionId - Unique session identifier
59
+ * @param dialDetails.dialId - Unique dial/call identifier
60
+ * @param dialDetails.token - Authentication token
61
+ * @param config - Configuration options
62
+ * @param config.baseUrl - API base URL (defaults to 'https://api.getelto.com')
63
+ */
64
+ constructor(dialDetails, config = {
65
+ baseUrl: 'https://api.getelto.com',
66
+ }) {
67
+ this._handlers = [];
68
+ this.sessionId = dialDetails.sessionId;
69
+ this.dialId = dialDetails.dialId;
70
+ let token = dialDetails.token;
71
+ const authLink = setContext((_, { headers }) => {
72
+ return {
73
+ headers: {
74
+ ...headers,
75
+ Authorization: `Bearer ${token}`,
76
+ },
77
+ };
78
+ });
79
+ this.baseUrl = config.baseUrl;
80
+ const httpLink = createHttpLink({
81
+ uri: `${this.baseUrl}/query`,
82
+ headers: {
83
+ Authorization: `Bearer ${token}`,
84
+ }
85
+ });
86
+ const wsBaseUrl = this.baseUrl.replace('https://', 'wss://').replace("http://", "ws://");
87
+ const wsLink = new GraphQLWsLink(createClient({
88
+ url: `${wsBaseUrl}/query`,
89
+ connectionParams: () => ({
90
+ authToken: token,
91
+ }),
92
+ }));
93
+ const splitLink = split(({ query }) => {
94
+ const definition = getMainDefinition(query);
95
+ return definition.kind === 'OperationDefinition' && definition.operation === 'subscription';
96
+ }, wsLink,
97
+ // @ts-ignore
98
+ authLink.concat(httpLink));
99
+ this.client = new ApolloClient({
100
+ cache: new InMemoryCache(),
101
+ link: splitLink,
102
+ });
103
+ }
104
+ /**
105
+ * Registers an event handler for status changes
106
+ * @param ev - Event type ('status')
107
+ * - status: called when the dial status changes, see docs.vogent.ai for more details
108
+ * @param fn - Callback function to handle the event
109
+ */
110
+ on(ev, fn) {
111
+ this._handlers.push({
112
+ ev,
113
+ fn,
114
+ });
115
+ }
116
+ /**
117
+ * Subscribes to transcript updates for the current call
118
+ * @param fn - Callback function that receives transcript updates
119
+ * @returns Function to unsubscribe from transcript updates
120
+ */
121
+ monitorTranscript(fn) {
122
+ const subscription = this.client
123
+ .subscribe({
124
+ query: REFRESH_TRANSCRIPT,
125
+ variables: {
126
+ dialId: this.dialId,
127
+ },
128
+ })
129
+ .subscribe(({ data }) => {
130
+ console.log('monitorTranscript', data);
131
+ if (!data?.watchTranscript) {
132
+ return;
133
+ }
134
+ fn(data.watchTranscript.map((t) => ({
135
+ text: t.text,
136
+ speaker: t.speaker,
137
+ })));
138
+ });
139
+ return () => {
140
+ subscription.unsubscribe();
141
+ };
142
+ }
143
+ /**
144
+ * Internal method to update dial state and trigger status handlers
145
+ * @param dial - Updated dial information
146
+ */
147
+ updateDial(dial) {
148
+ if (!this.dial || dial.status !== this.dial.status) {
149
+ this._handlers.forEach((h) => {
150
+ h.fn(dial.status);
151
+ });
152
+ }
153
+ else {
154
+ return;
155
+ }
156
+ if (dialStatusIsComplete(dial.status)) {
157
+ this.subscription?.unsubscribe();
158
+ }
159
+ this.dial = {
160
+ ...this.dial,
161
+ ...dial,
162
+ };
163
+ }
164
+ /**
165
+ * Establishes audio connection for the call
166
+ * @param liveListen - Whether to enable live listening mode. This should be set to true for monitoring legs (e.g. humans that are listening
167
+ * to the call who the AI should not interact with.)
168
+ * @returns Promise resolving to audio connection handle
169
+ */
170
+ async connectAudio(liveListen = false) {
171
+ const token = await this.client.mutate({
172
+ mutation: AI_GET_TOKEN,
173
+ variables: {
174
+ input: {
175
+ type: BrowserDialTokenType.DialSession,
176
+ dialSessionId: this.sessionId,
177
+ },
178
+ },
179
+ });
180
+ const d = await VonageDevice.getDevice(token.data.browserDialToken.token, true);
181
+ const c = await d.connect({
182
+ params: { EltoDialSessionID: this.sessionId, LiveListen: liveListen, DialID: this.dialId },
183
+ });
184
+ return c;
185
+ }
186
+ /**
187
+ * Starts the call session. Does not connect audio, you must call connectAudio() to do so.
188
+ */
189
+ async start() {
190
+ this.subscription = this.client
191
+ .subscribe({
192
+ query: AI_CONNECT_SESSION,
193
+ variables: {
194
+ sessionId: this.sessionId,
195
+ },
196
+ })
197
+ .subscribe(({ data }) => {
198
+ switch (data?.connectSession.messageType) {
199
+ case SessionMessageType.GlobalCallConnect:
200
+ this.client.mutate({
201
+ mutation: AI_START_DIAL_SESSION,
202
+ variables: {
203
+ sessionId: this.sessionId,
204
+ },
205
+ });
206
+ break;
207
+ case SessionMessageType.SessionContactUpdate: {
208
+ const content = data?.connectSession.content;
209
+ if (content.dials.length != 1) {
210
+ break;
211
+ }
212
+ this.updateDial(content.dials[0]);
213
+ }
214
+ }
215
+ });
216
+ }
217
+ /**
218
+ * Sets the pause state of the AI
219
+ * @param paused - Whether to pause the AI or not.
220
+ */
221
+ async setPaused(paused) {
222
+ if (!this.dialId) {
223
+ return;
224
+ }
225
+ await this.client.mutate({
226
+ mutation: AI_SET_PAUSED,
227
+ variables: {
228
+ dialId: this.dialId,
229
+ pauseStatus: paused,
230
+ },
231
+ });
232
+ }
233
+ /**
234
+ * Ends the current call
235
+ */
236
+ async hangup() {
237
+ if (!this.dialId) {
238
+ return;
239
+ }
240
+ await this.client.mutate({
241
+ mutation: AI_HANGUP_CALL,
242
+ variables: {
243
+ dialId: this.dialId,
244
+ },
245
+ });
246
+ }
247
+ }
@@ -0,0 +1,82 @@
1
+ import * as types from './graphql';
2
+ import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';
3
+ /**
4
+ * Map of all GraphQL operations in the project.
5
+ *
6
+ * This map has several performance disadvantages:
7
+ * 1. It is not tree-shakeable, so it will include all operations in the project.
8
+ * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle.
9
+ * 3. It does not support dead code elimination, so it will add unused operations.
10
+ *
11
+ * Therefore it is highly recommended to use the babel or swc plugin for production.
12
+ * Learn more about it here: https://the-guild.dev/graphql/codegen/plugins/presets/preset-client#reducing-bundle-size
13
+ */
14
+ declare const documents: {
15
+ "\nmutation CreateAdHocDialSession($input: CreateAdHocDialSessionInput!) {\n createAdHocDialSession(input: $input) {\n id\n telephonyProvider\n }\n}": DocumentNode<types.CreateAdHocDialSessionMutation, types.Exact<{
16
+ input: types.CreateAdHocDialSessionInput;
17
+ }>>;
18
+ "\n mutation StartDialSession($sessionId: ID!) {\n startDialSession(dialSessionId: $sessionId)\n }\n": DocumentNode<types.StartDialSessionMutation, types.Exact<{
19
+ sessionId: types.Scalars["ID"]["input"];
20
+ }>>;
21
+ "\n mutation HangupCall($dialId: ID!, $dropVoicemail: Boolean, $transferNumber: String) {\n hangupCall(dialId: $dialId, dropVoicemail: $dropVoicemail, transferNumber: $transferNumber)\n }\n": DocumentNode<types.HangupCallMutation, types.Exact<{
22
+ dialId: types.Scalars["ID"]["input"];
23
+ dropVoicemail?: types.InputMaybe<types.Scalars["Boolean"]["input"]>;
24
+ transferNumber?: types.InputMaybe<types.Scalars["String"]["input"]>;
25
+ }>>;
26
+ "\n mutation SetPaused($dialId: ID!, $pauseStatus: Boolean!) {\n pauseAI(dialId: $dialId, pauseStatus: $pauseStatus) {\n id\n }\n }\n": DocumentNode<types.SetPausedMutation, types.Exact<{
27
+ dialId: types.Scalars["ID"]["input"];
28
+ pauseStatus: types.Scalars["Boolean"]["input"];
29
+ }>>;
30
+ "\n subscription RefreshTranscript($dialId: ID!) {\n watchTranscript(dialId: $dialId) {\n speaker\n text\n detailType\n }\n }\n": DocumentNode<types.RefreshTranscriptSubscription, types.Exact<{
31
+ dialId: types.Scalars["ID"]["input"];
32
+ }>>;
33
+ "\n mutation BrowserDialToken($input: BrowserDialTokenInput!) {\n browserDialToken(input: $input) {\n token\n iceConfig\n }\n }\n": DocumentNode<types.BrowserDialTokenMutation, types.Exact<{
34
+ input: types.BrowserDialTokenInput;
35
+ }>>;
36
+ "\n subscription ConnectSession($sessionId: ID!) {\n connectSession(sessionId: $sessionId) {\n messageType\n content {\n __typename\n ... on DialsUpdatedMessage {\n contactId\n dials {\n id\n status\n answerType\n phoneField\n callDispositionId\n systemResultType\n toNumber\n }\n contactComplete\n }\n ... on DialConnectMessage {\n dialId\n }\n ... on SessionUpdatedMessage {\n dialSession {\n id\n status\n }\n reason\n }\n }\n }\n }\n": DocumentNode<types.ConnectSessionSubscription, types.Exact<{
37
+ sessionId: types.Scalars["ID"]["input"];
38
+ }>>;
39
+ };
40
+ /**
41
+ * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
42
+ *
43
+ *
44
+ * @example
45
+ * ```ts
46
+ * const query = gql(`query GetUser($id: ID!) { user(id: $id) { name } }`);
47
+ * ```
48
+ *
49
+ * The query argument is unknown!
50
+ * Please regenerate the types.
51
+ */
52
+ export declare function gql(source: string): unknown;
53
+ /**
54
+ * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
55
+ */
56
+ export declare function gql(source: "\nmutation CreateAdHocDialSession($input: CreateAdHocDialSessionInput!) {\n createAdHocDialSession(input: $input) {\n id\n telephonyProvider\n }\n}"): (typeof documents)["\nmutation CreateAdHocDialSession($input: CreateAdHocDialSessionInput!) {\n createAdHocDialSession(input: $input) {\n id\n telephonyProvider\n }\n}"];
57
+ /**
58
+ * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
59
+ */
60
+ export declare function gql(source: "\n mutation StartDialSession($sessionId: ID!) {\n startDialSession(dialSessionId: $sessionId)\n }\n"): (typeof documents)["\n mutation StartDialSession($sessionId: ID!) {\n startDialSession(dialSessionId: $sessionId)\n }\n"];
61
+ /**
62
+ * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
63
+ */
64
+ export declare function gql(source: "\n mutation HangupCall($dialId: ID!, $dropVoicemail: Boolean, $transferNumber: String) {\n hangupCall(dialId: $dialId, dropVoicemail: $dropVoicemail, transferNumber: $transferNumber)\n }\n"): (typeof documents)["\n mutation HangupCall($dialId: ID!, $dropVoicemail: Boolean, $transferNumber: String) {\n hangupCall(dialId: $dialId, dropVoicemail: $dropVoicemail, transferNumber: $transferNumber)\n }\n"];
65
+ /**
66
+ * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
67
+ */
68
+ export declare function gql(source: "\n mutation SetPaused($dialId: ID!, $pauseStatus: Boolean!) {\n pauseAI(dialId: $dialId, pauseStatus: $pauseStatus) {\n id\n }\n }\n"): (typeof documents)["\n mutation SetPaused($dialId: ID!, $pauseStatus: Boolean!) {\n pauseAI(dialId: $dialId, pauseStatus: $pauseStatus) {\n id\n }\n }\n"];
69
+ /**
70
+ * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
71
+ */
72
+ export declare function gql(source: "\n subscription RefreshTranscript($dialId: ID!) {\n watchTranscript(dialId: $dialId) {\n speaker\n text\n detailType\n }\n }\n"): (typeof documents)["\n subscription RefreshTranscript($dialId: ID!) {\n watchTranscript(dialId: $dialId) {\n speaker\n text\n detailType\n }\n }\n"];
73
+ /**
74
+ * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
75
+ */
76
+ export declare function gql(source: "\n mutation BrowserDialToken($input: BrowserDialTokenInput!) {\n browserDialToken(input: $input) {\n token\n iceConfig\n }\n }\n"): (typeof documents)["\n mutation BrowserDialToken($input: BrowserDialTokenInput!) {\n browserDialToken(input: $input) {\n token\n iceConfig\n }\n }\n"];
77
+ /**
78
+ * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
79
+ */
80
+ export declare function gql(source: "\n subscription ConnectSession($sessionId: ID!) {\n connectSession(sessionId: $sessionId) {\n messageType\n content {\n __typename\n ... on DialsUpdatedMessage {\n contactId\n dials {\n id\n status\n answerType\n phoneField\n callDispositionId\n systemResultType\n toNumber\n }\n contactComplete\n }\n ... on DialConnectMessage {\n dialId\n }\n ... on SessionUpdatedMessage {\n dialSession {\n id\n status\n }\n reason\n }\n }\n }\n }\n"): (typeof documents)["\n subscription ConnectSession($sessionId: ID!) {\n connectSession(sessionId: $sessionId) {\n messageType\n content {\n __typename\n ... on DialsUpdatedMessage {\n contactId\n dials {\n id\n status\n answerType\n phoneField\n callDispositionId\n systemResultType\n toNumber\n }\n contactComplete\n }\n ... on DialConnectMessage {\n dialId\n }\n ... on SessionUpdatedMessage {\n dialSession {\n id\n status\n }\n reason\n }\n }\n }\n }\n"];
81
+ export type DocumentType<TDocumentNode extends DocumentNode<any, any>> = TDocumentNode extends DocumentNode<infer TType, any> ? TType : never;
82
+ export {};
@@ -0,0 +1,25 @@
1
+ /* eslint-disable */
2
+ import * as types from './graphql';
3
+ /**
4
+ * Map of all GraphQL operations in the project.
5
+ *
6
+ * This map has several performance disadvantages:
7
+ * 1. It is not tree-shakeable, so it will include all operations in the project.
8
+ * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle.
9
+ * 3. It does not support dead code elimination, so it will add unused operations.
10
+ *
11
+ * Therefore it is highly recommended to use the babel or swc plugin for production.
12
+ * Learn more about it here: https://the-guild.dev/graphql/codegen/plugins/presets/preset-client#reducing-bundle-size
13
+ */
14
+ const documents = {
15
+ "\nmutation CreateAdHocDialSession($input: CreateAdHocDialSessionInput!) {\n createAdHocDialSession(input: $input) {\n id\n telephonyProvider\n }\n}": types.CreateAdHocDialSessionDocument,
16
+ "\n mutation StartDialSession($sessionId: ID!) {\n startDialSession(dialSessionId: $sessionId)\n }\n": types.StartDialSessionDocument,
17
+ "\n mutation HangupCall($dialId: ID!, $dropVoicemail: Boolean, $transferNumber: String) {\n hangupCall(dialId: $dialId, dropVoicemail: $dropVoicemail, transferNumber: $transferNumber)\n }\n": types.HangupCallDocument,
18
+ "\n mutation SetPaused($dialId: ID!, $pauseStatus: Boolean!) {\n pauseAI(dialId: $dialId, pauseStatus: $pauseStatus) {\n id\n }\n }\n": types.SetPausedDocument,
19
+ "\n subscription RefreshTranscript($dialId: ID!) {\n watchTranscript(dialId: $dialId) {\n speaker\n text\n detailType\n }\n }\n": types.RefreshTranscriptDocument,
20
+ "\n mutation BrowserDialToken($input: BrowserDialTokenInput!) {\n browserDialToken(input: $input) {\n token\n iceConfig\n }\n }\n": types.BrowserDialTokenDocument,
21
+ "\n subscription ConnectSession($sessionId: ID!) {\n connectSession(sessionId: $sessionId) {\n messageType\n content {\n __typename\n ... on DialsUpdatedMessage {\n contactId\n dials {\n id\n status\n answerType\n phoneField\n callDispositionId\n systemResultType\n toNumber\n }\n contactComplete\n }\n ... on DialConnectMessage {\n dialId\n }\n ... on SessionUpdatedMessage {\n dialSession {\n id\n status\n }\n reason\n }\n }\n }\n }\n": types.ConnectSessionDocument,
22
+ };
23
+ export function gql(source) {
24
+ return documents[source] ?? {};
25
+ }