@tidblink/server 0.0.0-stage → 0.3.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.
Files changed (83) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +993 -2
  3. package/dist/audio.d.ts +63 -0
  4. package/dist/audio.d.ts.map +1 -0
  5. package/dist/audio.js +163 -0
  6. package/dist/audio.js.map +1 -0
  7. package/dist/client-tools.d.ts +46 -0
  8. package/dist/client-tools.d.ts.map +1 -0
  9. package/dist/client-tools.js +114 -0
  10. package/dist/client-tools.js.map +1 -0
  11. package/dist/control.d.ts +17 -0
  12. package/dist/control.d.ts.map +1 -0
  13. package/dist/control.js +52 -0
  14. package/dist/control.js.map +1 -0
  15. package/dist/errors.d.ts +80 -0
  16. package/dist/errors.d.ts.map +1 -0
  17. package/dist/errors.js +87 -0
  18. package/dist/errors.js.map +1 -0
  19. package/dist/files.d.ts +129 -0
  20. package/dist/files.d.ts.map +1 -0
  21. package/dist/files.js +388 -0
  22. package/dist/files.js.map +1 -0
  23. package/dist/history.d.ts +242 -0
  24. package/dist/history.d.ts.map +1 -0
  25. package/dist/history.js +91 -0
  26. package/dist/history.js.map +1 -0
  27. package/dist/http.d.ts +64 -0
  28. package/dist/http.d.ts.map +1 -0
  29. package/dist/http.js +282 -0
  30. package/dist/http.js.map +1 -0
  31. package/dist/index.d.ts +26 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +12 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/organization.d.ts +70 -0
  36. package/dist/organization.d.ts.map +1 -0
  37. package/dist/organization.js +118 -0
  38. package/dist/organization.js.map +1 -0
  39. package/dist/progress.d.ts +34 -0
  40. package/dist/progress.d.ts.map +1 -0
  41. package/dist/progress.js +154 -0
  42. package/dist/progress.js.map +1 -0
  43. package/dist/realtime.d.ts +91 -0
  44. package/dist/realtime.d.ts.map +1 -0
  45. package/dist/realtime.js +112 -0
  46. package/dist/realtime.js.map +1 -0
  47. package/dist/schedulers.d.ts +129 -0
  48. package/dist/schedulers.d.ts.map +1 -0
  49. package/dist/schedulers.js +91 -0
  50. package/dist/schedulers.js.map +1 -0
  51. package/dist/session.d.ts +136 -0
  52. package/dist/session.d.ts.map +1 -0
  53. package/dist/session.js +226 -0
  54. package/dist/session.js.map +1 -0
  55. package/dist/sse.d.ts +7 -0
  56. package/dist/sse.d.ts.map +1 -0
  57. package/dist/sse.js +45 -0
  58. package/dist/sse.js.map +1 -0
  59. package/dist/turn.d.ts +43 -0
  60. package/dist/turn.d.ts.map +1 -0
  61. package/dist/turn.js +206 -0
  62. package/dist/turn.js.map +1 -0
  63. package/dist/usage.d.ts +462 -0
  64. package/dist/usage.d.ts.map +1 -0
  65. package/dist/usage.js +20 -0
  66. package/dist/usage.js.map +1 -0
  67. package/dist/user.d.ts +96 -0
  68. package/dist/user.d.ts.map +1 -0
  69. package/dist/user.js +139 -0
  70. package/dist/user.js.map +1 -0
  71. package/examples/answer-client-tool.mjs +69 -0
  72. package/examples/control-turn.mjs +48 -0
  73. package/examples/create-session.mjs +69 -0
  74. package/examples/observe-message.mjs +44 -0
  75. package/examples/organization-session.mjs +66 -0
  76. package/examples/prepare-realtime-connection.mjs +61 -0
  77. package/examples/provision-user.mjs +83 -0
  78. package/examples/read-usage.mjs +62 -0
  79. package/examples/schedule-task.mjs +67 -0
  80. package/examples/send-message.mjs +43 -0
  81. package/examples/submit-audio.mjs +52 -0
  82. package/examples/upload-file.mjs +53 -0
  83. package/package.json +65 -4
@@ -0,0 +1,63 @@
1
+ import { HttpClient } from "./http.js";
2
+ import { OutcomeUnknownError } from "./errors.js";
3
+ import type { BillingTag, ClarificationItem } from "./session.js";
4
+ import type { OperationRecord, TurnFailure } from "./history.js";
5
+ import type { RequestOptions } from "./organization.js";
6
+ export interface AudioTurnInput extends RequestOptions {
7
+ bytes: Uint8Array;
8
+ filename: string;
9
+ contentType?: string;
10
+ /** Omit to inherit, null to clear the Session's default for this audio Turn. */
11
+ billingTag?: BillingTag | null;
12
+ }
13
+ type AudioEnvelope<Name extends string, Payload> = {
14
+ event: Name;
15
+ sessionId: string;
16
+ turnId: string;
17
+ agentRunId?: string;
18
+ seq: number;
19
+ createdAt: string;
20
+ payload: Payload;
21
+ };
22
+ export type AudioTurnEvent = AudioEnvelope<"turn_started", {
23
+ execution?: {
24
+ model: string;
25
+ };
26
+ inputId?: string;
27
+ }> | AudioEnvelope<"progress", {
28
+ text: string;
29
+ }> | AudioEnvelope<"assistant_draft", {
30
+ text: string;
31
+ }> | AudioEnvelope<"operation_step", {
32
+ operationId: string;
33
+ status: OperationRecord["status"];
34
+ label: string;
35
+ category?: OperationRecord["category"];
36
+ skill?: OperationRecord["skill"];
37
+ source?: OperationRecord["source"];
38
+ }> | AudioEnvelope<"assistant_message", {
39
+ messageId: string;
40
+ text: string;
41
+ clarificationItem?: ClarificationItem;
42
+ }> | AudioEnvelope<"turn_error", TurnFailure> | AudioEnvelope<"turn_finished", {
43
+ status: "succeeded" | "failed" | "interrupted";
44
+ }>;
45
+ export type AudioTurnResult = {
46
+ sessionId: string;
47
+ turnId: string;
48
+ messageId: string;
49
+ text: string;
50
+ } & ({
51
+ type: "answer";
52
+ } | {
53
+ type: "clarification";
54
+ clarification: ClarificationItem;
55
+ });
56
+ /** Audio owns its response: losing or closing it may request remote interruption. */
57
+ export declare class AudioTurnStoppedError extends OutcomeUnknownError {
58
+ constructor(sessionId: string, turnId?: string, requestId?: string, cause?: unknown);
59
+ }
60
+ export declare function streamAudio(http: HttpClient, sessionId: string, input: AudioTurnInput): AsyncGenerator<AudioTurnEvent>;
61
+ export declare function audioTurn(http: HttpClient, sessionId: string, input: AudioTurnInput): Promise<AudioTurnResult>;
62
+ export {};
63
+ //# sourceMappingURL=audio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audio.d.ts","sourceRoot":"","sources":["../src/audio.ts"],"names":[],"mappings":"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"}
package/dist/audio.js ADDED
@@ -0,0 +1,163 @@
1
+ import { HttpClient, requireKnownKeys } from "./http.js";
2
+ import { OutcomeUnknownError, TiDBLinkApiError, TurnFailedError, TurnInterruptedError, TiDBLinkError, } from "./errors.js";
3
+ import { decodeSse } from "./sse.js";
4
+ import { validClarification } from "./turn.js";
5
+ /** Audio owns its response: losing or closing it may request remote interruption. */
6
+ export class AudioTurnStoppedError extends OutcomeUnknownError {
7
+ constructor(sessionId, turnId, requestId, cause) {
8
+ super("Audio response stopped before a confirmed terminal outcome; closing it may request interruption. Inspect saved history before submitting audio again.", {
9
+ sessionId,
10
+ ...(turnId ? { turnId } : {}),
11
+ ...(requestId ? { requestId } : {}),
12
+ ...(cause ? { cause } : {}),
13
+ });
14
+ }
15
+ }
16
+ const multipart = (input) => {
17
+ requireKnownKeys(input, ["bytes", "filename", "contentType", "billingTag", "signal", "requestId"], "Audio input");
18
+ if (!(input.bytes instanceof Uint8Array) ||
19
+ input.bytes.byteLength < 1 ||
20
+ input.bytes.byteLength > 25 * 1024 * 1024)
21
+ throw new TypeError("Audio requires 1 byte to 25 MiB of prerecorded data");
22
+ if (typeof input.filename !== "string" ||
23
+ !input.filename.trim() ||
24
+ input.filename.length > 255)
25
+ throw new TypeError("Audio requires a filename of 1-255 characters");
26
+ const contentType = input.contentType ?? "application/octet-stream";
27
+ if (!/^[A-Za-z0-9!#$&^_.+-]+\/[A-Za-z0-9!#$&^_.+-]+$/.test(contentType))
28
+ throw new TypeError("Audio contentType must be a media type without parameters");
29
+ const boundary = `tidb-link-audio-${crypto.randomUUID()}`;
30
+ const filename = input.filename
31
+ .replace(/\r/g, "%0D")
32
+ .replace(/\n/g, "%0A")
33
+ .replace(/"/g, "%22");
34
+ const parts = [];
35
+ if (input.billingTag !== undefined)
36
+ parts.push(`--${boundary}\r\nContent-Disposition: form-data; name="billingTag"\r\nContent-Type: application/json\r\n\r\n${JSON.stringify(input.billingTag)}\r\n`);
37
+ parts.push(`--${boundary}\r\nContent-Disposition: form-data; name="file"; filename="${filename}"\r\nContent-Type: ${contentType}\r\n\r\n`, Uint8Array.from(input.bytes), `\r\n--${boundary}--\r\n`);
38
+ return {
39
+ body: new Blob(parts),
40
+ contentType: `multipart/form-data; boundary=${boundary}`,
41
+ };
42
+ };
43
+ export async function* streamAudio(http, sessionId, input) {
44
+ const upload = multipart(input);
45
+ input.signal?.throwIfAborted();
46
+ let turnId;
47
+ let requestId;
48
+ let sequence = -1;
49
+ let response;
50
+ try {
51
+ ({ response, requestId } = await http.rawResponse(`/api/v1/user/sessions/${encodeURIComponent(sessionId)}/turns/audio`, {
52
+ method: "POST",
53
+ body: upload.body,
54
+ headers: {
55
+ accept: "text/event-stream",
56
+ "content-type": upload.contentType,
57
+ },
58
+ ...(input.signal ? { signal: input.signal } : {}),
59
+ ...(input.requestId ? { requestId: input.requestId } : {}),
60
+ }));
61
+ if (response.status !== 201 ||
62
+ response.headers
63
+ .get("content-type")
64
+ ?.split(";")[0]
65
+ ?.trim()
66
+ .toLowerCase() !== "text/event-stream" ||
67
+ !response.body)
68
+ throw new TiDBLinkError("Audio response omitted its event stream");
69
+ for await (const frame of decodeSse(response.body)) {
70
+ const event = JSON.parse(frame.data);
71
+ if (!event ||
72
+ event.sessionId !== sessionId ||
73
+ typeof event.turnId !== "string" ||
74
+ !event.turnId ||
75
+ (turnId && event.turnId !== turnId) ||
76
+ !Number.isSafeInteger(event.seq) ||
77
+ event.seq <= sequence ||
78
+ typeof event.createdAt !== "string" ||
79
+ !event.payload ||
80
+ typeof event.payload !== "object" ||
81
+ Array.isArray(event.payload) ||
82
+ frame.event !== event.event ||
83
+ ![
84
+ "turn_started",
85
+ "progress",
86
+ "assistant_draft",
87
+ "operation_step",
88
+ "assistant_message",
89
+ "turn_error",
90
+ "turn_finished",
91
+ ].includes(event.event))
92
+ throw new TiDBLinkError("Audio response returned an invalid or mismatched event envelope");
93
+ turnId = event.turnId;
94
+ sequence = event.seq;
95
+ if ((event.event === "assistant_draft" || event.event === "progress") &&
96
+ typeof event.payload.text !== "string")
97
+ throw new TiDBLinkError("Audio response returned invalid text");
98
+ if (event.event === "assistant_message" &&
99
+ (typeof event.payload.messageId !== "string" ||
100
+ !event.payload.messageId ||
101
+ typeof event.payload.text !== "string" ||
102
+ (event.payload.clarificationItem !== undefined &&
103
+ !validClarification(event.payload.clarificationItem))))
104
+ throw new TiDBLinkError("Audio response returned an invalid final Message");
105
+ if (event.event === "turn_finished" &&
106
+ !["succeeded", "failed", "interrupted"].includes(event.payload.status))
107
+ throw new TiDBLinkError("Audio response returned an invalid terminal status");
108
+ yield event;
109
+ if (event.event === "turn_finished")
110
+ return;
111
+ }
112
+ throw new AudioTurnStoppedError(sessionId, turnId, requestId);
113
+ }
114
+ catch (cause) {
115
+ if (cause instanceof TiDBLinkApiError ||
116
+ cause instanceof AudioTurnStoppedError)
117
+ throw cause;
118
+ throw new AudioTurnStoppedError(sessionId, turnId, requestId ??
119
+ (cause instanceof TiDBLinkError ? cause.requestId : input.requestId), cause);
120
+ }
121
+ finally {
122
+ if (response?.body && !response.body.locked)
123
+ await response.body.cancel().catch(() => undefined);
124
+ }
125
+ }
126
+ export async function audioTurn(http, sessionId, input) {
127
+ let message;
128
+ let failure;
129
+ for await (const event of streamAudio(http, sessionId, input)) {
130
+ if (event.event === "assistant_message")
131
+ message = event;
132
+ if (event.event === "turn_error")
133
+ failure = event.payload;
134
+ if (event.event === "turn_finished") {
135
+ if (event.payload.status === "failed")
136
+ throw new TurnFailedError({
137
+ sessionId,
138
+ turnId: event.turnId,
139
+ code: failure?.code ?? "turn_failed",
140
+ message: failure?.message ?? "Audio Turn failed",
141
+ });
142
+ if (event.payload.status === "interrupted")
143
+ throw new TurnInterruptedError(event.turnId, "Audio Turn was interrupted", sessionId);
144
+ if (!message)
145
+ throw new AudioTurnStoppedError(sessionId, event.turnId);
146
+ const identity = {
147
+ sessionId,
148
+ turnId: event.turnId,
149
+ messageId: message.payload.messageId,
150
+ text: message.payload.text,
151
+ };
152
+ return message.payload.clarificationItem
153
+ ? {
154
+ ...identity,
155
+ type: "clarification",
156
+ clarification: message.payload.clarificationItem,
157
+ }
158
+ : { ...identity, type: "answer" };
159
+ }
160
+ }
161
+ throw new AudioTurnStoppedError(sessionId);
162
+ }
163
+ //# sourceMappingURL=audio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audio.js","sourceRoot":"","sources":["../src/audio.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import { type SessionInteraction } from "./history.js";
2
+ import { HttpClient } from "./http.js";
3
+ import type { RequestOptions } from "./organization.js";
4
+ export interface ClientToolDeclaration {
5
+ type: "function";
6
+ name: string;
7
+ description: string;
8
+ parameters: Record<string, unknown>;
9
+ }
10
+ export interface ClientToolSet {
11
+ revision: number;
12
+ tools: ClientToolDeclaration[];
13
+ /** Pass this exact value when replacing the complete set. */
14
+ etag: string;
15
+ }
16
+ export interface ReplaceClientToolsOptions extends RequestOptions {
17
+ ifMatch: string;
18
+ }
19
+ export declare function validateClientTools(tools: readonly ClientToolDeclaration[]): void;
20
+ export declare function getClientTools(http: HttpClient, sessionId: string, options?: RequestOptions): Promise<ClientToolSet>;
21
+ export declare function replaceClientTools(http: HttpClient, sessionId: string, tools: readonly ClientToolDeclaration[], options: ReplaceClientToolsOptions): Promise<ClientToolSet>;
22
+ export interface PendingClientToolCall {
23
+ callId: string;
24
+ turnId: string;
25
+ name: string;
26
+ arguments: Record<string, unknown>;
27
+ publishedAt: string;
28
+ deadlineAt: string;
29
+ }
30
+ export type ClientToolOutputInput = RequestOptions & {
31
+ /** Persist a separate command identity; callId identifies the call, not this submission. */
32
+ clientEventId: string;
33
+ turnId: string;
34
+ callId: string;
35
+ } & ({
36
+ output: string;
37
+ error?: never;
38
+ } | {
39
+ error: {
40
+ message: string;
41
+ };
42
+ output?: never;
43
+ });
44
+ export declare function listPendingClientToolCalls(http: HttpClient, sessionId: string, options?: RequestOptions): Promise<PendingClientToolCall[]>;
45
+ export declare function submitClientToolOutput(http: HttpClient, sessionId: string, input: ClientToolOutputInput): Promise<SessionInteraction>;
46
+ //# sourceMappingURL=client-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-tools.d.ts","sourceRoot":"","sources":["../src/client-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAE3E,OAAO,EACL,UAAU,EAKX,MAAM,WAAW,CAAC;AACnB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,qBAAqB,EAAE,CAAC;IAC/B,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,yBAA0B,SAAQ,cAAc;IAC/D,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,SAAS,qBAAqB,EAAE,GACtC,IAAI,CAuBN;AAkBD,wBAAsB,cAAc,CAClC,IAAI,EAAE,UAAU,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,aAAa,CAAC,CAQxB;AAED,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,UAAU,EAChB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,SAAS,qBAAqB,EAAE,EACvC,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,aAAa,CAAC,CAqBxB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,qBAAqB,GAAG,cAAc,GAAG;IACnD,4FAA4F;IAC5F,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,CACE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CAAE,GACjC;IAAE,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,MAAM,CAAC,EAAE,KAAK,CAAA;CAAE,CACjD,CAAC;AAEJ,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,UAAU,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAYlC;AAED,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,UAAU,EAChB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,qBAAqB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,CAkF7B"}
@@ -0,0 +1,114 @@
1
+ import { requireInteraction } from "./history.js";
2
+ import { OutcomeUnknownError, TiDBLinkError } from "./errors.js";
3
+ import { HttpClient, requireEtag, requireKnownKeys, requireCreationKey, } from "./http.js";
4
+ export function validateClientTools(tools) {
5
+ if (!Array.isArray(tools) || tools.length > 64)
6
+ throw new TypeError("tools must be an array of at most 64 declarations");
7
+ for (const tool of tools) {
8
+ requireKnownKeys(tool, ["type", "name", "description", "parameters"], "Client Tool declaration");
9
+ if (tool.type !== "function" ||
10
+ typeof tool.name !== "string" ||
11
+ !tool.name ||
12
+ typeof tool.description !== "string" ||
13
+ !tool.description ||
14
+ typeof tool.parameters !== "object" ||
15
+ tool.parameters === null ||
16
+ Array.isArray(tool.parameters))
17
+ throw new TypeError("Client Tools require a function name, description and JSON Schema parameters");
18
+ }
19
+ }
20
+ const toolSet = (result) => {
21
+ if (!Number.isSafeInteger(result.data?.revision) ||
22
+ result.data.revision < 0 ||
23
+ !Array.isArray(result.data.tools))
24
+ throw new TiDBLinkError("TiDB Link returned an invalid Client Tool set", {
25
+ requestId: result.requestId,
26
+ });
27
+ return { ...result.data, etag: requireEtag(result) };
28
+ };
29
+ const toolsPath = (sessionId) => `/api/v1/user/sessions/${encodeURIComponent(sessionId)}/tools`;
30
+ export async function getClientTools(http, sessionId, options) {
31
+ if (options)
32
+ requireKnownKeys(options, ["signal", "requestId"], "Client Tool read options");
33
+ return toolSet(await http.getResponse(toolsPath(sessionId), options));
34
+ }
35
+ export async function replaceClientTools(http, sessionId, tools, options) {
36
+ validateClientTools(tools);
37
+ requireKnownKeys(options, ["ifMatch", "signal", "requestId"], "Client Tool replacement options");
38
+ if (typeof options.ifMatch !== "string" || !options.ifMatch)
39
+ throw new TypeError("Client Tool replacement requires ifMatch");
40
+ const result = await http.response(toolsPath(sessionId), { method: "PUT", body: { tools }, outcomeUnknown: true, ...options });
41
+ try {
42
+ return toolSet(result);
43
+ }
44
+ catch (cause) {
45
+ throw new OutcomeUnknownError("Client Tool replacement returned no usable receipt; read the current set before retrying", { sessionId, requestId: result.requestId, cause });
46
+ }
47
+ }
48
+ export async function listPendingClientToolCalls(http, sessionId, options) {
49
+ if (options)
50
+ requireKnownKeys(options, ["signal", "requestId"], "Pending Client Tool call options");
51
+ const result = await http.get(`/api/v1/user/sessions/${encodeURIComponent(sessionId)}/client-tool-calls`, options);
52
+ return result.calls;
53
+ }
54
+ export async function submitClientToolOutput(http, sessionId, input) {
55
+ requireKnownKeys(input, [
56
+ "clientEventId",
57
+ "turnId",
58
+ "callId",
59
+ "output",
60
+ "error",
61
+ "signal",
62
+ "requestId",
63
+ ], "Client Tool output");
64
+ requireCreationKey(input.clientEventId);
65
+ for (const id of [input.turnId, input.callId])
66
+ if (typeof id !== "string" || !id || id.length > 64)
67
+ throw new TypeError("Client Tool output requires turnId and callId containing 1-64 characters");
68
+ if (Object.hasOwn(input, "output") === Object.hasOwn(input, "error"))
69
+ throw new TypeError("Provide exactly one Client Tool output or error");
70
+ if ("output" in input) {
71
+ if (typeof input.output !== "string" || input.output.length > 65536)
72
+ throw new TypeError("Client Tool output must be a string of at most 65536 characters");
73
+ }
74
+ else {
75
+ requireKnownKeys(input.error, ["message"], "Client Tool error");
76
+ if (typeof input.error.message !== "string" ||
77
+ !input.error.message ||
78
+ input.error.message.length > 4096)
79
+ throw new TypeError("Client Tool error.message must contain 1-4096 characters");
80
+ }
81
+ const { clientEventId, signal, requestId, ...data } = input;
82
+ const turnId = data.turnId;
83
+ signal?.throwIfAborted();
84
+ try {
85
+ const result = await http.postResponse(`/api/v1/user/sessions/${encodeURIComponent(sessionId)}/events`, { type: "agent.session.input.client_tool_output", clientEventId, data }, {
86
+ outcomeUnknown: true,
87
+ ...(signal ? { signal } : {}),
88
+ ...(requestId ? { requestId } : {}),
89
+ });
90
+ try {
91
+ const receipt = requireInteraction(result.data?.interaction, clientEventId, result.requestId);
92
+ if (receipt.kind !== "client_tool_output" ||
93
+ receipt.turnId !== turnId ||
94
+ receipt.message !== null)
95
+ throw new TiDBLinkError("Client Tool output receipt identifies a different command");
96
+ return receipt;
97
+ }
98
+ catch (cause) {
99
+ throw new OutcomeUnknownError("Client Tool output returned no usable receipt; query the original input", { requestId: result.requestId, cause });
100
+ }
101
+ }
102
+ catch (cause) {
103
+ if (!(cause instanceof OutcomeUnknownError))
104
+ throw cause;
105
+ throw new OutcomeUnknownError(cause.message, {
106
+ sessionId,
107
+ inputId: clientEventId,
108
+ turnId,
109
+ ...(cause.requestId ? { requestId: cause.requestId } : {}),
110
+ cause,
111
+ });
112
+ }
113
+ }
114
+ //# sourceMappingURL=client-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-tools.js","sourceRoot":"","sources":["../src/client-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { HttpClient } from "./http.js";
2
+ import { type SessionInteraction } from "./history.js";
3
+ import type { RequestOptions } from "./organization.js";
4
+ export interface TurnCommandInput extends RequestOptions {
5
+ /** Persist this new Session-local command identity before dispatch. */
6
+ clientEventId: string;
7
+ turnId: string;
8
+ }
9
+ export interface RetryReceipt {
10
+ clientEventId: string;
11
+ sessionId: string;
12
+ turnId: string;
13
+ disposition: "retrying";
14
+ }
15
+ export declare function submitTurnCommand(http: HttpClient, sessionId: string, kind: "cancel", input: TurnCommandInput): Promise<SessionInteraction>;
16
+ export declare function submitTurnCommand(http: HttpClient, sessionId: string, kind: "retry", input: TurnCommandInput): Promise<RetryReceipt>;
17
+ //# sourceMappingURL=control.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"control.d.ts","sourceRoot":"","sources":["../src/control.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAwC,MAAM,WAAW,CAAC;AAC7E,OAAO,EAAsB,KAAK,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAC3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,MAAM,WAAW,gBAAiB,SAAQ,cAAc;IACtD,uEAAuE;IACvE,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,UAAU,CAAC;CACzB;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,UAAU,EAChB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAC/B,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,UAAU,EAChB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,YAAY,CAAC,CAAC"}
@@ -0,0 +1,52 @@
1
+ import { OutcomeUnknownError } from "./errors.js";
2
+ import { HttpClient, requireCreationKey, requireKnownKeys } from "./http.js";
3
+ import { requireInteraction } from "./history.js";
4
+ export async function submitTurnCommand(http, sessionId, kind, input) {
5
+ requireKnownKeys(input, ["clientEventId", "turnId", "signal", "requestId"], "Turn command");
6
+ requireCreationKey(input.clientEventId);
7
+ if (typeof input.turnId !== "string" ||
8
+ !input.turnId ||
9
+ input.turnId.length > 64)
10
+ throw new TypeError("Turn command requires a turnId containing 1-64 characters");
11
+ const { clientEventId, turnId, signal, requestId } = input;
12
+ signal?.throwIfAborted();
13
+ try {
14
+ const result = await http.postResponse(`/api/v1/user/sessions/${encodeURIComponent(sessionId)}/events`, { type: `agent.session.input.${kind}`, clientEventId, data: { turnId } }, {
15
+ outcomeUnknown: true,
16
+ ...(signal ? { signal } : {}),
17
+ ...(requestId ? { requestId } : {}),
18
+ });
19
+ try {
20
+ if (kind === "cancel") {
21
+ const receipt = requireInteraction(result.data?.interaction, clientEventId, result.requestId);
22
+ if (receipt.kind !== kind ||
23
+ receipt.turnId !== turnId ||
24
+ receipt.message !== null)
25
+ throw new Error("Cancellation receipt identifies a different command");
26
+ return receipt;
27
+ }
28
+ const receipt = result.data?.event;
29
+ if (receipt?.clientEventId !== clientEventId ||
30
+ receipt.sessionId !== sessionId ||
31
+ receipt.turnId !== turnId ||
32
+ receipt.disposition !== "retrying")
33
+ throw new Error("Retry receipt identifies a different command");
34
+ return receipt;
35
+ }
36
+ catch (cause) {
37
+ throw new OutcomeUnknownError("Turn command returned no usable receipt; query its original identity", { requestId: result.requestId, cause });
38
+ }
39
+ }
40
+ catch (cause) {
41
+ if (!(cause instanceof OutcomeUnknownError))
42
+ throw cause;
43
+ throw new OutcomeUnknownError(cause.message, {
44
+ sessionId,
45
+ inputId: clientEventId,
46
+ turnId,
47
+ ...(cause.requestId ? { requestId: cause.requestId } : {}),
48
+ cause,
49
+ });
50
+ }
51
+ }
52
+ //# sourceMappingURL=control.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"control.js","sourceRoot":"","sources":["../src/control.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ export declare class TiDBLinkError extends Error {
2
+ readonly requestId: string | undefined;
3
+ constructor(message: string, options?: {
4
+ requestId?: string;
5
+ cause?: unknown;
6
+ });
7
+ }
8
+ export declare class TiDBLinkApiError extends TiDBLinkError {
9
+ readonly status: number;
10
+ readonly code: string;
11
+ readonly details?: unknown;
12
+ readonly retryAfter: string | undefined;
13
+ constructor(input: {
14
+ status: number;
15
+ code: string;
16
+ message: string;
17
+ requestId?: string;
18
+ details?: unknown;
19
+ retryAfter?: string;
20
+ });
21
+ }
22
+ export declare class ConflictError extends TiDBLinkApiError {
23
+ }
24
+ export declare class ConnectionError extends TiDBLinkError {
25
+ }
26
+ /** The request may have succeeded, so repeating it could create another effect. */
27
+ export declare class OutcomeUnknownError extends TiDBLinkError {
28
+ readonly turnId: string | undefined;
29
+ readonly sessionId: string | undefined;
30
+ readonly inputId: string | undefined;
31
+ constructor(message: string, options?: {
32
+ requestId?: string;
33
+ turnId?: string;
34
+ sessionId?: string;
35
+ inputId?: string;
36
+ cause?: unknown;
37
+ });
38
+ }
39
+ export declare class TurnWaitTimeoutError extends OutcomeUnknownError {
40
+ }
41
+ export declare class InputNotAppliedError extends TiDBLinkError {
42
+ readonly sessionId: string;
43
+ readonly inputId: string;
44
+ readonly turnId: string;
45
+ constructor(sessionId: string, inputId: string, turnId: string);
46
+ }
47
+ export declare class TurnFailedError extends TiDBLinkError {
48
+ readonly code: string;
49
+ readonly turnId: string;
50
+ readonly sessionId: string | undefined;
51
+ readonly inputId: string | undefined;
52
+ constructor(input: {
53
+ code: string;
54
+ message: string;
55
+ turnId: string;
56
+ sessionId?: string;
57
+ inputId?: string;
58
+ });
59
+ }
60
+ export declare class TurnInterruptedError extends TiDBLinkError {
61
+ readonly sessionId?: string | undefined;
62
+ readonly inputId?: string | undefined;
63
+ readonly turnId: string;
64
+ constructor(turnId: string, message?: string, sessionId?: string | undefined, inputId?: string | undefined);
65
+ }
66
+ /** Observation stopped locally; the original command can still be queried or observed. */
67
+ export declare class ObservationStoppedError extends OutcomeUnknownError {
68
+ readonly cursor: string | undefined;
69
+ readonly timedOut: boolean;
70
+ constructor(message: string, options: {
71
+ sessionId: string;
72
+ inputId: string;
73
+ turnId?: string;
74
+ cursor?: string;
75
+ requestId?: string;
76
+ timedOut?: boolean;
77
+ cause?: unknown;
78
+ });
79
+ }
80
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}