@turingfocus/chat-gateway-tfrobot 0.1.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.
@@ -0,0 +1,335 @@
1
+ import { chatErrorSchema, compareTimelineItems, createGatewayDeadlineExceededError, isGatewayDeadlineExceeded, } from "@turingfocus/chat-protocol";
2
+ import { awaitBounded } from "./bounded.js";
3
+ import { conversationPageDtoSchema, historyDtoSchema, interruptDtoSchema, outboundMessageCreatorSchema, sendTextDtoSchema, statusDtoSchema, } from "./dto.js";
4
+ import { TFRobotHttpClient } from "./http.js";
5
+ import { mapConversation, mapSnapshot, syntheticRunId, TFROBOT_CAPABILITIES, } from "./mapper.js";
6
+ import { TFRobotSocketClient } from "./socket.js";
7
+ const DEFAULT_PAGE_SIZE = 20;
8
+ const MAX_PAGE_SIZE = 100;
9
+ const RECONNECT_STATUS_TIMEOUT_MS = 10_000;
10
+ const limitOf = (limit) => Math.min(limit ?? DEFAULT_PAGE_SIZE, MAX_PAGE_SIZE);
11
+ const conversationPath = (conversationId, suffix) => `v1/chat/conversations/${encodeURIComponent(conversationId)}/${suffix}`;
12
+ export class TFRobotChatGateway {
13
+ #conversations = new Map();
14
+ #disposed = false;
15
+ #http;
16
+ #lifecycle = new AbortController();
17
+ #now;
18
+ #options;
19
+ #socket;
20
+ constructor(options) {
21
+ for (const endpoint of [options.baseUrl, options.socketNamespaceUrl]) {
22
+ if (endpoint === undefined)
23
+ continue;
24
+ const url = new URL(endpoint);
25
+ if (url.username.length > 0 || url.password.length > 0) {
26
+ throw new TypeError("TFRobot Gateway endpoints must not contain URL credentials");
27
+ }
28
+ }
29
+ this.#options = options;
30
+ this.#http = new TFRobotHttpClient(options);
31
+ this.#now = options.now ?? Date.now;
32
+ this.#socket = new TFRobotSocketClient(options, (conversationId) => this.#http.request({
33
+ method: "GET",
34
+ path: conversationPath(conversationId, "status"),
35
+ operation: "read",
36
+ options: {
37
+ deadlineAt: this.#now() + RECONNECT_STATUS_TIMEOUT_MS,
38
+ },
39
+ conversationId,
40
+ schema: statusDtoSchema,
41
+ }));
42
+ }
43
+ async listConversations(input) {
44
+ const disposed = this.#disposedResult();
45
+ if (disposed !== undefined)
46
+ return disposed;
47
+ const result = await this.#http.request({
48
+ method: "GET",
49
+ path: "v1/chat/conversations",
50
+ operation: "read",
51
+ options: input,
52
+ query: {
53
+ count: limitOf(input.limit),
54
+ cursor: input.cursor,
55
+ platformId: this.#options.platformId,
56
+ },
57
+ schema: conversationPageDtoSchema,
58
+ });
59
+ const requestDeadline = this.#deadlineResult(input);
60
+ if (requestDeadline !== undefined)
61
+ return requestDeadline;
62
+ if (!result.ok)
63
+ return result;
64
+ let conversations;
65
+ try {
66
+ conversations = (result.value.conversations ?? []).map(mapConversation);
67
+ }
68
+ catch {
69
+ return this.#mappingError("TFRobot conversation data could not be normalized");
70
+ }
71
+ const mappingDeadline = this.#deadlineResult(input);
72
+ if (mappingDeadline !== undefined)
73
+ return mappingDeadline;
74
+ for (const conversation of conversations) {
75
+ this.#conversations.set(conversation.id, conversation);
76
+ }
77
+ return {
78
+ ok: true,
79
+ value: {
80
+ conversations,
81
+ ...(result.value.cursor == null || result.value.cursor.length === 0
82
+ ? {}
83
+ : { nextCursor: result.value.cursor }),
84
+ },
85
+ };
86
+ }
87
+ async loadConversation(input) {
88
+ const disposed = this.#disposedResult(input.conversationId);
89
+ if (disposed !== undefined)
90
+ return disposed;
91
+ if (!this.#conversations.has(input.conversationId)) {
92
+ await this.listConversations({
93
+ deadlineAt: input.deadlineAt,
94
+ limit: MAX_PAGE_SIZE,
95
+ });
96
+ }
97
+ const [history, status] = await Promise.all([
98
+ this.#http.request({
99
+ method: "GET",
100
+ path: conversationPath(input.conversationId, "messages"),
101
+ operation: "read",
102
+ options: input,
103
+ conversationId: input.conversationId,
104
+ query: {
105
+ count: -limitOf(input.limit),
106
+ cursor: input.previousCursor,
107
+ },
108
+ schema: historyDtoSchema,
109
+ }),
110
+ this.#http.request({
111
+ method: "GET",
112
+ path: conversationPath(input.conversationId, "status"),
113
+ operation: "read",
114
+ options: input,
115
+ conversationId: input.conversationId,
116
+ schema: statusDtoSchema,
117
+ }),
118
+ ]);
119
+ const requestDeadline = this.#deadlineResult(input, input.conversationId);
120
+ if (requestDeadline !== undefined)
121
+ return requestDeadline;
122
+ if (!history.ok)
123
+ return history;
124
+ if (!status.ok)
125
+ return status;
126
+ let snapshot;
127
+ try {
128
+ const conversation = this.#conversations.get(input.conversationId) ??
129
+ mapConversation({
130
+ conversationId: input.conversationId,
131
+ title: input.conversationId,
132
+ });
133
+ snapshot = mapSnapshot(conversation, history.value, status.value);
134
+ this.#socket.rememberRun(input.conversationId, snapshot.run);
135
+ }
136
+ catch {
137
+ return this.#mappingError("TFRobot conversation snapshot could not be normalized", input.conversationId);
138
+ }
139
+ const mappingDeadline = this.#deadlineResult(input, input.conversationId);
140
+ if (mappingDeadline !== undefined)
141
+ return mappingDeadline;
142
+ return {
143
+ ok: true,
144
+ value: input.previousCursor === undefined
145
+ ? snapshot
146
+ : {
147
+ ...snapshot,
148
+ timeline: [...snapshot.timeline].sort(compareTimelineItems),
149
+ },
150
+ };
151
+ }
152
+ subscribe(input, observer) {
153
+ const disposed = this.#disposedResult(input.conversationId);
154
+ return disposed === undefined
155
+ ? this.#socket.subscribe(input.conversationId, input, observer)
156
+ : Promise.resolve(disposed);
157
+ }
158
+ async sendText(input) {
159
+ const disposed = this.#disposedResult(input.conversationId);
160
+ if (disposed !== undefined)
161
+ return disposed;
162
+ const creator = await this.#resolveMessageCreator(input);
163
+ const creatorDeadline = this.#deadlineResult(input, input.conversationId);
164
+ if (creatorDeadline !== undefined)
165
+ return creatorDeadline;
166
+ if (!creator.ok)
167
+ return creator;
168
+ const result = await this.#http.request({
169
+ method: "POST",
170
+ path: conversationPath(input.conversationId, "messages"),
171
+ operation: "send",
172
+ options: input,
173
+ conversationId: input.conversationId,
174
+ body: {
175
+ msgId: input.clientMessageId ?? null,
176
+ content: input.text,
177
+ additionalKwargs: {},
178
+ attachments: null,
179
+ createTimestamp: 0,
180
+ creator: creator.value,
181
+ conversationId: input.conversationId,
182
+ role: "user",
183
+ msgType: "text",
184
+ },
185
+ schema: sendTextDtoSchema,
186
+ });
187
+ const requestDeadline = this.#deadlineResult(input, input.conversationId);
188
+ if (requestDeadline !== undefined)
189
+ return requestDeadline;
190
+ return result.ok
191
+ ? { ok: true, value: { runId: String(result.value.taskId) } }
192
+ : result;
193
+ }
194
+ async interrupt(input) {
195
+ const disposed = this.#disposedResult(input.conversationId);
196
+ if (disposed !== undefined)
197
+ return disposed;
198
+ if (input.runId === undefined ||
199
+ input.runId === syntheticRunId(input.conversationId)) {
200
+ return {
201
+ ok: false,
202
+ error: chatErrorSchema.parse({
203
+ code: "conflict",
204
+ message: "Interrupt requires a real active TFRobot taskId",
205
+ retryable: false,
206
+ conversationId: input.conversationId,
207
+ }),
208
+ };
209
+ }
210
+ const result = await this.#http.request({
211
+ method: "POST",
212
+ path: conversationPath(input.conversationId, "interrupt"),
213
+ operation: "send",
214
+ options: input,
215
+ conversationId: input.conversationId,
216
+ body: { taskId: input.runId },
217
+ schema: interruptDtoSchema,
218
+ });
219
+ const requestDeadline = this.#deadlineResult(input, input.conversationId);
220
+ if (requestDeadline !== undefined)
221
+ return requestDeadline;
222
+ return result.ok
223
+ ? {
224
+ ok: true,
225
+ value: {
226
+ cancellationId: String(result.value.taskId),
227
+ interruptedRunId: input.runId,
228
+ },
229
+ }
230
+ : result;
231
+ }
232
+ dispose(options) {
233
+ if (this.#disposed)
234
+ return;
235
+ this.#disposed = true;
236
+ this.#lifecycle.abort();
237
+ this.#socket.dispose();
238
+ this.#http.dispose();
239
+ this.#conversations.clear();
240
+ if (isGatewayDeadlineExceeded(options, this.#now()))
241
+ return;
242
+ }
243
+ #deadlineResult(options, conversationId) {
244
+ return isGatewayDeadlineExceeded(options, this.#now())
245
+ ? {
246
+ ok: false,
247
+ error: createGatewayDeadlineExceededError(conversationId),
248
+ }
249
+ : undefined;
250
+ }
251
+ #disposedResult(conversationId) {
252
+ if (!this.#disposed)
253
+ return undefined;
254
+ return {
255
+ ok: false,
256
+ error: chatErrorSchema.parse({
257
+ code: "conflict",
258
+ message: "TFRobot Gateway is disposed",
259
+ retryable: false,
260
+ ...(conversationId === undefined ? {} : { conversationId }),
261
+ }),
262
+ };
263
+ }
264
+ #mappingError(message, conversationId) {
265
+ return {
266
+ ok: false,
267
+ error: chatErrorSchema.parse({
268
+ code: "validation",
269
+ message,
270
+ retryable: false,
271
+ ...(conversationId === undefined ? {} : { conversationId }),
272
+ }),
273
+ };
274
+ }
275
+ async #resolveMessageCreator(input) {
276
+ if (isGatewayDeadlineExceeded(input, this.#now())) {
277
+ return {
278
+ ok: false,
279
+ error: createGatewayDeadlineExceededError(input.conversationId),
280
+ };
281
+ }
282
+ const outcome = await awaitBounded(() => this.#options.messageCreatorProvider({
283
+ conversationId: input.conversationId,
284
+ }), {
285
+ deadlineAt: input.deadlineAt,
286
+ now: this.#now,
287
+ signal: this.#lifecycle.signal,
288
+ });
289
+ switch (outcome.kind) {
290
+ case "aborted": {
291
+ return (this.#disposedResult(input.conversationId) ?? {
292
+ ok: false,
293
+ error: createGatewayDeadlineExceededError(input.conversationId),
294
+ });
295
+ }
296
+ case "deadline": {
297
+ return {
298
+ ok: false,
299
+ error: createGatewayDeadlineExceededError(input.conversationId),
300
+ };
301
+ }
302
+ case "error": {
303
+ return {
304
+ ok: false,
305
+ error: chatErrorSchema.parse({
306
+ code: "validation",
307
+ message: "Unable to obtain the current TFRobot message creator",
308
+ retryable: false,
309
+ conversationId: input.conversationId,
310
+ }),
311
+ };
312
+ }
313
+ case "value": {
314
+ const parsed = outboundMessageCreatorSchema.safeParse(outcome.value);
315
+ if (!parsed.success) {
316
+ return {
317
+ ok: false,
318
+ error: chatErrorSchema.parse({
319
+ code: "validation",
320
+ message: "messageCreatorProvider returned an invalid creator",
321
+ retryable: false,
322
+ conversationId: input.conversationId,
323
+ }),
324
+ };
325
+ }
326
+ const disposed = this.#disposedResult(input.conversationId);
327
+ return (disposed ??
328
+ this.#deadlineResult(input, input.conversationId) ?? { ok: true, value: parsed.data });
329
+ }
330
+ }
331
+ }
332
+ }
333
+ export const createTFRobotChatGateway = (options) => new TFRobotChatGateway(options);
334
+ export { TFROBOT_CAPABILITIES };
335
+ //# sourceMappingURL=gateway.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway.js","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"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"}
package/dist/http.d.ts ADDED
@@ -0,0 +1,21 @@
1
+ import { type GatewayRequestOptions, type GatewayResult, type SessionOperation } from "@turingfocus/chat-protocol";
2
+ import type { z } from "zod/v4";
3
+ import type { TFRobotGatewayOptions } from "./types.js";
4
+ interface RequestInput<T> {
5
+ readonly body?: unknown;
6
+ readonly conversationId?: string | undefined;
7
+ readonly method: "GET" | "POST";
8
+ readonly operation: SessionOperation;
9
+ readonly options: GatewayRequestOptions;
10
+ readonly path: string;
11
+ readonly query?: Readonly<Record<string, number | string | undefined>>;
12
+ readonly schema: z.ZodType<T>;
13
+ }
14
+ export declare class TFRobotHttpClient {
15
+ #private;
16
+ constructor(options: TFRobotGatewayOptions);
17
+ request<T>(input: RequestInput<T>): Promise<GatewayResult<T>>;
18
+ dispose(): void;
19
+ }
20
+ export {};
21
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAClB,KAAK,gBAAgB,EAEtB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAKhC,OAAO,KAAK,EAAE,qBAAqB,EAAkB,MAAM,YAAY,CAAC;AAoDxE,UAAU,YAAY,CAAC,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7C,QAAQ,CAAC,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAAC;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IACvE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;CAC/B;AAED,qBAAa,iBAAiB;;gBAQhB,OAAO,EAAE,qBAAqB;IASpC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAsOnE,OAAO,IAAI,IAAI;CAsChB"}