@tidblink/server 0.0.0-stage → 0.4.0-rc.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.
- package/LICENSE +201 -0
- package/README.md +1182 -2
- package/dist/audio.d.ts +72 -0
- package/dist/audio.d.ts.map +1 -0
- package/dist/audio.js +168 -0
- package/dist/audio.js.map +1 -0
- package/dist/backend-connection.d.ts +89 -0
- package/dist/backend-connection.d.ts.map +1 -0
- package/dist/backend-connection.js +300 -0
- package/dist/backend-connection.js.map +1 -0
- package/dist/backend-pool.d.ts +93 -0
- package/dist/backend-pool.d.ts.map +1 -0
- package/dist/backend-pool.js +419 -0
- package/dist/backend-pool.js.map +1 -0
- package/dist/client-tool-executor.d.ts +31 -0
- package/dist/client-tool-executor.d.ts.map +1 -0
- package/dist/client-tool-executor.js +190 -0
- package/dist/client-tool-executor.js.map +1 -0
- package/dist/client-tools.d.ts +21 -0
- package/dist/client-tools.d.ts.map +1 -0
- package/dist/client-tools.js +48 -0
- package/dist/client-tools.js.map +1 -0
- package/dist/connector-callback.d.ts +92 -0
- package/dist/connector-callback.d.ts.map +1 -0
- package/dist/connector-callback.js +155 -0
- package/dist/connector-callback.js.map +1 -0
- package/dist/connectors.d.ts +66 -0
- package/dist/connectors.d.ts.map +1 -0
- package/dist/connectors.js +71 -0
- package/dist/connectors.js.map +1 -0
- package/dist/control.d.ts +17 -0
- package/dist/control.d.ts.map +1 -0
- package/dist/control.js +52 -0
- package/dist/control.js.map +1 -0
- package/dist/errors.d.ts +103 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +115 -0
- package/dist/errors.js.map +1 -0
- package/dist/events.d.ts +158 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +110 -0
- package/dist/events.js.map +1 -0
- package/dist/files.d.ts +129 -0
- package/dist/files.d.ts.map +1 -0
- package/dist/files.js +388 -0
- package/dist/files.js.map +1 -0
- package/dist/history.d.ts +279 -0
- package/dist/history.d.ts.map +1 -0
- package/dist/history.js +91 -0
- package/dist/history.js.map +1 -0
- package/dist/http.d.ts +88 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +302 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +39 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/organization.d.ts +87 -0
- package/dist/organization.d.ts.map +1 -0
- package/dist/organization.js +112 -0
- package/dist/organization.js.map +1 -0
- package/dist/realtime.d.ts +90 -0
- package/dist/realtime.d.ts.map +1 -0
- package/dist/realtime.js +111 -0
- package/dist/realtime.js.map +1 -0
- package/dist/session-connection.d.ts +144 -0
- package/dist/session-connection.d.ts.map +1 -0
- package/dist/session-connection.js +334 -0
- package/dist/session-connection.js.map +1 -0
- package/dist/session-send.d.ts +49 -0
- package/dist/session-send.d.ts.map +1 -0
- package/dist/session-send.js +179 -0
- package/dist/session-send.js.map +1 -0
- package/dist/session.d.ts +165 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +253 -0
- package/dist/session.js.map +1 -0
- package/dist/skills.d.ts +103 -0
- package/dist/skills.d.ts.map +1 -0
- package/dist/skills.js +98 -0
- package/dist/skills.js.map +1 -0
- package/dist/sse.d.ts +10 -0
- package/dist/sse.d.ts.map +1 -0
- package/dist/sse.js +50 -0
- package/dist/sse.js.map +1 -0
- package/dist/template-switch.d.ts +51 -0
- package/dist/template-switch.d.ts.map +1 -0
- package/dist/template-switch.js +81 -0
- package/dist/template-switch.js.map +1 -0
- package/dist/templates.d.ts +129 -0
- package/dist/templates.d.ts.map +1 -0
- package/dist/templates.js +92 -0
- package/dist/templates.js.map +1 -0
- package/dist/turn.d.ts +47 -0
- package/dist/turn.d.ts.map +1 -0
- package/dist/turn.js +210 -0
- package/dist/turn.js.map +1 -0
- package/dist/usage.d.ts +278 -0
- package/dist/usage.d.ts.map +1 -0
- package/dist/usage.js +22 -0
- package/dist/usage.js.map +1 -0
- package/dist/user.d.ts +55 -0
- package/dist/user.d.ts.map +1 -0
- package/dist/user.js +52 -0
- package/dist/user.js.map +1 -0
- package/examples/control-turn.mjs +53 -0
- package/examples/create-session.mjs +82 -0
- package/examples/http-connector.mjs +127 -0
- package/examples/lamp-backend.mjs +175 -0
- package/examples/prepare-realtime-connection.mjs +72 -0
- package/examples/read-usage.mjs +44 -0
- package/examples/send-message.mjs +48 -0
- package/examples/submit-audio.mjs +57 -0
- package/examples/upload-file.mjs +58 -0
- package/package.json +59 -4
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
export type RealtimeLanguage = "zh-CN" | "en-US";
|
|
2
|
+
export type RealtimeEndpointingMode = "client" | "server";
|
|
3
|
+
export interface RealtimePcm16AudioFormat {
|
|
4
|
+
encoding: "pcm16";
|
|
5
|
+
sampleRate: number;
|
|
6
|
+
channels: 1;
|
|
7
|
+
}
|
|
8
|
+
export interface RealtimeOpusAudioFormat {
|
|
9
|
+
encoding: "opus";
|
|
10
|
+
sampleRate: number;
|
|
11
|
+
channels: 1;
|
|
12
|
+
packetDurationMs: number;
|
|
13
|
+
bitrate?: 16000 | 24000 | 32000;
|
|
14
|
+
}
|
|
15
|
+
export type RealtimeAudioFormat = RealtimePcm16AudioFormat | RealtimeOpusAudioFormat;
|
|
16
|
+
export interface RealtimeModel {
|
|
17
|
+
id: string;
|
|
18
|
+
label: string;
|
|
19
|
+
available: boolean;
|
|
20
|
+
isDefault: boolean;
|
|
21
|
+
languages: RealtimeLanguage[];
|
|
22
|
+
endpointingModes: RealtimeEndpointingMode[];
|
|
23
|
+
audio: {
|
|
24
|
+
input: RealtimeAudioFormat[];
|
|
25
|
+
output: RealtimeAudioFormat[];
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export interface RealtimeModelCatalog {
|
|
29
|
+
defaultModel: string | null;
|
|
30
|
+
models: RealtimeModel[];
|
|
31
|
+
}
|
|
32
|
+
export interface RealtimeVoiceSetting {
|
|
33
|
+
language: RealtimeLanguage;
|
|
34
|
+
}
|
|
35
|
+
export interface RealtimeModelSelection {
|
|
36
|
+
model: string | null;
|
|
37
|
+
revision: number;
|
|
38
|
+
etag: string;
|
|
39
|
+
voice: RealtimeVoiceSetting | null;
|
|
40
|
+
}
|
|
41
|
+
export interface RealtimeSessionSelectionFields {
|
|
42
|
+
realtimeModel: string | null;
|
|
43
|
+
realtimeModelRevision: number;
|
|
44
|
+
realtimeModelEtag: string;
|
|
45
|
+
realtimeVoice: RealtimeVoiceSetting | null;
|
|
46
|
+
}
|
|
47
|
+
export declare const realtimeModelSelectionFrom: (session: RealtimeSessionSelectionFields) => RealtimeModelSelection;
|
|
48
|
+
export interface RealtimeAudioFormats {
|
|
49
|
+
input: RealtimeAudioFormat;
|
|
50
|
+
output: RealtimeAudioFormat;
|
|
51
|
+
}
|
|
52
|
+
export interface OpenRealtimeConnectionInput {
|
|
53
|
+
audio?: Partial<RealtimeAudioFormats>;
|
|
54
|
+
metadata?: Record<string, string>;
|
|
55
|
+
}
|
|
56
|
+
export interface RealtimeConnection {
|
|
57
|
+
object: "realtime_connection";
|
|
58
|
+
id: string;
|
|
59
|
+
sessionId: string;
|
|
60
|
+
provider: {
|
|
61
|
+
name: string;
|
|
62
|
+
region: string | null;
|
|
63
|
+
model: string | null;
|
|
64
|
+
};
|
|
65
|
+
status: "connecting" | "active" | "paused" | "ended";
|
|
66
|
+
audio: RealtimeAudioFormats;
|
|
67
|
+
activeTaskTurnId: string | null;
|
|
68
|
+
usage: {
|
|
69
|
+
inputAudioSec: number;
|
|
70
|
+
outputAudioSec: number;
|
|
71
|
+
thoughtTokens: number;
|
|
72
|
+
textTokens: number;
|
|
73
|
+
};
|
|
74
|
+
metadata: Record<string, string>;
|
|
75
|
+
createdAt: string;
|
|
76
|
+
endedAt: string | null;
|
|
77
|
+
}
|
|
78
|
+
export interface RealtimeConnectGrant {
|
|
79
|
+
websocketUrl: string;
|
|
80
|
+
connectToken: string;
|
|
81
|
+
connectTokenExpiresAt: string;
|
|
82
|
+
}
|
|
83
|
+
export interface OpenRealtimeConnectionResult extends RealtimeConnectGrant {
|
|
84
|
+
realtimeConnection: RealtimeConnection;
|
|
85
|
+
}
|
|
86
|
+
export declare const requireRealtimeModelSelectionReceipt: (value: unknown, requestId: string) => RealtimeModelSelection;
|
|
87
|
+
export declare const requireOpenRealtimeConnectionReceipt: (value: unknown, requestId: string) => OpenRealtimeConnectionResult;
|
|
88
|
+
export declare const requireRealtimeConnectGrantReceipt: (value: unknown, requestId: string) => RealtimeConnectGrant;
|
|
89
|
+
export declare const requireRealtimeConnectionReceipt: (value: unknown, requestId: string) => RealtimeConnection;
|
|
90
|
+
//# sourceMappingURL=realtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"realtime.d.ts","sourceRoot":"","sources":["../src/realtime.ts"],"names":[],"mappings":"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"}
|
package/dist/realtime.js
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { OutcomeUnknownError } from "./errors.js";
|
|
2
|
+
export const realtimeModelSelectionFrom = (session) => ({
|
|
3
|
+
model: session.realtimeModel,
|
|
4
|
+
revision: session.realtimeModelRevision,
|
|
5
|
+
etag: session.realtimeModelEtag,
|
|
6
|
+
voice: session.realtimeVoice,
|
|
7
|
+
});
|
|
8
|
+
const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
9
|
+
const isString = (value) => typeof value === "string" && value.length > 0;
|
|
10
|
+
const isNullableString = (value) => value === null || typeof value === "string";
|
|
11
|
+
const isNumber = (value) => typeof value === "number" && Number.isFinite(value) && value >= 0;
|
|
12
|
+
const isDateTime = (value) => typeof value === "string" && Number.isFinite(Date.parse(value));
|
|
13
|
+
const isAudioFormat = (value) => {
|
|
14
|
+
if (!isRecord(value) ||
|
|
15
|
+
!isNumber(value.sampleRate) ||
|
|
16
|
+
value.sampleRate <= 0 ||
|
|
17
|
+
value.channels !== 1)
|
|
18
|
+
return false;
|
|
19
|
+
if (value.encoding === "pcm16")
|
|
20
|
+
return true;
|
|
21
|
+
return (value.encoding === "opus" &&
|
|
22
|
+
Number.isInteger(value.packetDurationMs) &&
|
|
23
|
+
isNumber(value.packetDurationMs) &&
|
|
24
|
+
value.packetDurationMs > 0 &&
|
|
25
|
+
(value.bitrate === undefined ||
|
|
26
|
+
value.bitrate === 16000 ||
|
|
27
|
+
value.bitrate === 24000 ||
|
|
28
|
+
value.bitrate === 32000));
|
|
29
|
+
};
|
|
30
|
+
const isRealtimeConnection = (value) => {
|
|
31
|
+
if (!isRecord(value))
|
|
32
|
+
return false;
|
|
33
|
+
const provider = value.provider;
|
|
34
|
+
const audio = value.audio;
|
|
35
|
+
const usage = value.usage;
|
|
36
|
+
const metadata = value.metadata;
|
|
37
|
+
return (value.object === "realtime_connection" &&
|
|
38
|
+
isString(value.id) &&
|
|
39
|
+
isString(value.sessionId) &&
|
|
40
|
+
isRecord(provider) &&
|
|
41
|
+
isString(provider.name) &&
|
|
42
|
+
isNullableString(provider.region) &&
|
|
43
|
+
isNullableString(provider.model) &&
|
|
44
|
+
["connecting", "active", "paused", "ended"].includes(String(value.status)) &&
|
|
45
|
+
isRecord(audio) &&
|
|
46
|
+
isAudioFormat(audio.input) &&
|
|
47
|
+
isAudioFormat(audio.output) &&
|
|
48
|
+
isNullableString(value.activeTaskTurnId) &&
|
|
49
|
+
isRecord(usage) &&
|
|
50
|
+
isNumber(usage.inputAudioSec) &&
|
|
51
|
+
isNumber(usage.outputAudioSec) &&
|
|
52
|
+
Number.isInteger(usage.thoughtTokens) &&
|
|
53
|
+
isNumber(usage.thoughtTokens) &&
|
|
54
|
+
Number.isInteger(usage.textTokens) &&
|
|
55
|
+
isNumber(usage.textTokens) &&
|
|
56
|
+
isRecord(metadata) &&
|
|
57
|
+
Object.values(metadata).every((entry) => typeof entry === "string") &&
|
|
58
|
+
isDateTime(value.createdAt) &&
|
|
59
|
+
(value.endedAt === null || isDateTime(value.endedAt)));
|
|
60
|
+
};
|
|
61
|
+
const isConnectGrant = (value) => {
|
|
62
|
+
if (!isRecord(value) || !isString(value.websocketUrl))
|
|
63
|
+
return false;
|
|
64
|
+
let protocol;
|
|
65
|
+
try {
|
|
66
|
+
protocol = new URL(value.websocketUrl).protocol;
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
return ((protocol === "ws:" || protocol === "wss:") &&
|
|
72
|
+
typeof value.connectToken === "string" &&
|
|
73
|
+
/^rct_[A-Za-z0-9_-]{43}$/u.test(value.connectToken) &&
|
|
74
|
+
isDateTime(value.connectTokenExpiresAt));
|
|
75
|
+
};
|
|
76
|
+
const unusableReceipt = (operation, requestId) => {
|
|
77
|
+
throw new OutcomeUnknownError(`TiDB Link accepted ${operation} but returned an unusable receipt`, { requestId });
|
|
78
|
+
};
|
|
79
|
+
export const requireRealtimeModelSelectionReceipt = (value, requestId) => {
|
|
80
|
+
if (!isRecord(value))
|
|
81
|
+
return unusableReceipt("the Realtime Model selection", requestId);
|
|
82
|
+
const voice = value.realtimeVoice;
|
|
83
|
+
if (!isNullableString(value.realtimeModel) ||
|
|
84
|
+
!Number.isInteger(value.realtimeModelRevision) ||
|
|
85
|
+
!isNumber(value.realtimeModelRevision) ||
|
|
86
|
+
value.realtimeModelRevision <= 0 ||
|
|
87
|
+
!isString(value.realtimeModelEtag) ||
|
|
88
|
+
(voice !== null &&
|
|
89
|
+
(!isRecord(voice) ||
|
|
90
|
+
(voice.language !== "zh-CN" && voice.language !== "en-US"))))
|
|
91
|
+
return unusableReceipt("the Realtime Model selection", requestId);
|
|
92
|
+
return realtimeModelSelectionFrom(value);
|
|
93
|
+
};
|
|
94
|
+
export const requireOpenRealtimeConnectionReceipt = (value, requestId) => {
|
|
95
|
+
if (!isRecord(value) ||
|
|
96
|
+
!isRealtimeConnection(value.realtimeConnection) ||
|
|
97
|
+
!isConnectGrant(value))
|
|
98
|
+
return unusableReceipt("the Realtime Connection request", requestId);
|
|
99
|
+
return value;
|
|
100
|
+
};
|
|
101
|
+
export const requireRealtimeConnectGrantReceipt = (value, requestId) => {
|
|
102
|
+
if (!isConnectGrant(value))
|
|
103
|
+
return unusableReceipt("the Realtime connect-token request", requestId);
|
|
104
|
+
return value;
|
|
105
|
+
};
|
|
106
|
+
export const requireRealtimeConnectionReceipt = (value, requestId) => {
|
|
107
|
+
if (!isRecord(value) || !isRealtimeConnection(value.realtimeConnection))
|
|
108
|
+
return unusableReceipt("the Realtime Connection mutation", requestId);
|
|
109
|
+
return value.realtimeConnection;
|
|
110
|
+
};
|
|
111
|
+
//# sourceMappingURL=realtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"realtime.js","sourceRoot":"","sources":["../src/realtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import type { BackendConnectionPool } from "./backend-pool.js";
|
|
2
|
+
import { type ClientToolDeclaration } from "./client-tools.js";
|
|
3
|
+
import { type RealtimeResponseEvent, type RealtimeTranscriptEvent, type SessionEvent } from "./events.js";
|
|
4
|
+
import { HttpClient } from "./http.js";
|
|
5
|
+
import { type OpenRealtimeConnectionInput, type RealtimeConnectGrant } from "./realtime.js";
|
|
6
|
+
import { type SendOptions } from "./session-send.js";
|
|
7
|
+
import type { TurnResult } from "./turn.js";
|
|
8
|
+
/** What a Client Tool handler learns about the call it runs. */
|
|
9
|
+
export interface ClientToolCallContext {
|
|
10
|
+
callId: string;
|
|
11
|
+
sessionId: string;
|
|
12
|
+
userId: string;
|
|
13
|
+
turnId: string;
|
|
14
|
+
/** The tool's name. */
|
|
15
|
+
name: string;
|
|
16
|
+
/** Submit the result before this time; the core then reports the effect as unknown. */
|
|
17
|
+
deadlineAt: Date;
|
|
18
|
+
/** Aborts when the deadline passes. */
|
|
19
|
+
signal: AbortSignal;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* One Client Tool: its declaration, which the model sees, and the function
|
|
23
|
+
* that executes it, usually by forwarding the call to a device.
|
|
24
|
+
*/
|
|
25
|
+
export interface ClientToolHandler {
|
|
26
|
+
description: string;
|
|
27
|
+
/** JSON Schema of the arguments. */
|
|
28
|
+
parameters: Record<string, unknown>;
|
|
29
|
+
/**
|
|
30
|
+
* Execute one call. Return the text the model receives; other values are
|
|
31
|
+
* sent as JSON. Throw to report a failure, whose message the model sees.
|
|
32
|
+
*/
|
|
33
|
+
run(args: Record<string, unknown>, context: ClientToolCallContext): unknown;
|
|
34
|
+
}
|
|
35
|
+
export type ClientToolHandlers = Record<string, ClientToolHandler>;
|
|
36
|
+
/** A completed Realtime user transcript. */
|
|
37
|
+
export type RealtimeTranscript = RealtimeTranscriptEvent["data"];
|
|
38
|
+
/** A completed Realtime model response. */
|
|
39
|
+
export type RealtimeResponse = RealtimeResponseEvent["data"];
|
|
40
|
+
export interface ConnectOptions {
|
|
41
|
+
/**
|
|
42
|
+
* The Session's Client Tools by name. Each attach replaces the Session's
|
|
43
|
+
* whole Client Tool set with these declarations, and this connection
|
|
44
|
+
* executes their calls. Omit to keep the stored set unchanged.
|
|
45
|
+
*/
|
|
46
|
+
tools?: ClientToolHandlers;
|
|
47
|
+
/**
|
|
48
|
+
* Receive events only, while another connection executes the Session's
|
|
49
|
+
* Client Tools. An observing connection never takes the Session from an
|
|
50
|
+
* executing one and cannot declare tools.
|
|
51
|
+
*/
|
|
52
|
+
observe?: boolean;
|
|
53
|
+
/**
|
|
54
|
+
* Resume after this event: the cursor of the last event you processed,
|
|
55
|
+
* saved through `onCursor`. Without it, delivery starts after the
|
|
56
|
+
* Session's latest event and history is not replayed.
|
|
57
|
+
*/
|
|
58
|
+
cursor?: string;
|
|
59
|
+
/** Called after each event's callbacks complete, with its cursor. Persist it to resume. */
|
|
60
|
+
onCursor?: (cursor: string) => void | Promise<void>;
|
|
61
|
+
/** Every event of the Session, in order, including types the SDK does not know. */
|
|
62
|
+
onEvent?: (event: SessionEvent) => void | Promise<void>;
|
|
63
|
+
/** Each completed Realtime user transcript. */
|
|
64
|
+
onTranscript?: (transcript: RealtimeTranscript) => void | Promise<void>;
|
|
65
|
+
/** Each completed Realtime model response. */
|
|
66
|
+
onResponse?: (response: RealtimeResponse) => void | Promise<void>;
|
|
67
|
+
/**
|
|
68
|
+
* Errors that do not end the connection: a callback that threw, an
|
|
69
|
+
* invalid event, a tool result the core did not accept. Without it they
|
|
70
|
+
* are rethrown asynchronously, which by default ends a Node.js process.
|
|
71
|
+
*/
|
|
72
|
+
onError?: (error: unknown) => void;
|
|
73
|
+
}
|
|
74
|
+
/** Why a Session connection ended. */
|
|
75
|
+
export type SessionConnectionEnd =
|
|
76
|
+
/** `close()` or `OrganizationClient.close()`. */
|
|
77
|
+
{
|
|
78
|
+
reason: "closed";
|
|
79
|
+
}
|
|
80
|
+
/** Another connection attached the Session for execution. */
|
|
81
|
+
| {
|
|
82
|
+
reason: "superseded";
|
|
83
|
+
}
|
|
84
|
+
/** The Session was deleted. */
|
|
85
|
+
| {
|
|
86
|
+
reason: "session_deleted";
|
|
87
|
+
}
|
|
88
|
+
/** The connection could not be restored, for example after the Organization API Key was revoked. */
|
|
89
|
+
| {
|
|
90
|
+
reason: "error";
|
|
91
|
+
error: unknown;
|
|
92
|
+
};
|
|
93
|
+
/**
|
|
94
|
+
* A Session attached over this process's Backend Connections. It receives
|
|
95
|
+
* the Session's events, in order and without gaps, across reconnects and
|
|
96
|
+
* replica moves, until `close()` or until `closed` reports why it ended.
|
|
97
|
+
*/
|
|
98
|
+
export declare class SessionConnection {
|
|
99
|
+
#private;
|
|
100
|
+
readonly sessionId: string;
|
|
101
|
+
readonly userId: string;
|
|
102
|
+
/** Resolves once, with why the connection ended. */
|
|
103
|
+
readonly closed: Promise<SessionConnectionEnd>;
|
|
104
|
+
/** @internal Use `session.connect()`. */
|
|
105
|
+
constructor(pool: BackendConnectionPool, http: HttpClient, userId: string, sessionId: string, options: ConnectOptions, declarations: ClientToolDeclaration[] | undefined);
|
|
106
|
+
/**
|
|
107
|
+
* Cursor of the last event whose callbacks completed, or the Session's
|
|
108
|
+
* position when the connection attached if none has arrived since.
|
|
109
|
+
*/
|
|
110
|
+
get cursor(): string | undefined;
|
|
111
|
+
/** The Session's attachment generation from the latest attach. */
|
|
112
|
+
get generation(): number | undefined;
|
|
113
|
+
/**
|
|
114
|
+
* Release the Session. Events stop, and calls published later go to no one
|
|
115
|
+
* until another connection attaches. Calls already running finish and
|
|
116
|
+
* their results are still submitted.
|
|
117
|
+
*/
|
|
118
|
+
close(): Promise<void>;
|
|
119
|
+
/**
|
|
120
|
+
* Send a user message over the connection and wait for the Turn it starts,
|
|
121
|
+
* or the active Turn it steers. `onProgress` receives the assistant's draft
|
|
122
|
+
* from the pushed events; the result is read once the Turn finished, with
|
|
123
|
+
* the same shape and errors as `session.turn()`. A message whose answer was
|
|
124
|
+
* lost to a reconnect is sent again with the same `clientEventId`, which
|
|
125
|
+
* the core deduplicates.
|
|
126
|
+
*/
|
|
127
|
+
send(text: string | [string, ...string[]], options?: SendOptions): Promise<TurnResult>;
|
|
128
|
+
/**
|
|
129
|
+
* Prepare the Session's Realtime connection and return what a device needs
|
|
130
|
+
* to join it directly: the WebSocket URL and a short-lived connect token.
|
|
131
|
+
* When a Realtime connection is already live, a new token for it is
|
|
132
|
+
* returned instead and `audio` is not applied.
|
|
133
|
+
*/
|
|
134
|
+
realtimeGrant(input?: OpenRealtimeConnectionInput, options?: {
|
|
135
|
+
signal?: AbortSignal;
|
|
136
|
+
}): Promise<RealtimeConnectGrant>;
|
|
137
|
+
/** @internal */
|
|
138
|
+
attach(): Promise<void>;
|
|
139
|
+
}
|
|
140
|
+
/** Check `connect()` options and turn tool handlers into declarations. */
|
|
141
|
+
export declare function connectDeclarations(options: ConnectOptions): ClientToolDeclaration[] | undefined;
|
|
142
|
+
/** Open a Session connection; resolves once the first attach took effect. */
|
|
143
|
+
export declare function connectSession(http: HttpClient, pool: BackendConnectionPool | undefined, userId: string | undefined, sessionId: string, options?: ConnectOptions): Promise<SessionConnection>;
|
|
144
|
+
//# sourceMappingURL=session-connection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-connection.d.ts","sourceRoot":"","sources":["../src/session-connection.ts"],"names":[],"mappings":"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"}
|