@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.
package/dist/http.js ADDED
@@ -0,0 +1,314 @@
1
+ import { chatErrorSchema, createGatewayDeadlineExceededError, isGatewayDeadlineExceeded, sanitizeDiagnosticText, sanitizeRaw, } from "@turingfocus/chat-protocol";
2
+ import { awaitBounded } from "./bounded.js";
3
+ import { responseEnvelopeSchema } from "./dto.js";
4
+ import { isValidTFRobotSession } from "./types.js";
5
+ const HTTP_TIMEOUT_STATUS = 408;
6
+ const MAX_TIMER_DELAY = 2_147_483_647;
7
+ const sessionHeaders = (session) => {
8
+ const headers = new Headers({ Accept: "application/json" });
9
+ if (session.kind === "bearer") {
10
+ headers.set("Authorization", `Bearer ${session.token}`);
11
+ }
12
+ else {
13
+ headers.set("admin_key", session.adminKey);
14
+ }
15
+ return headers;
16
+ };
17
+ const statusErrorCode = (status) => {
18
+ if (status === 401)
19
+ return "authentication";
20
+ if (status === 403)
21
+ return "authorization";
22
+ if (status === 404)
23
+ return "not-found";
24
+ if (status === 409)
25
+ return "conflict";
26
+ if (status === 422)
27
+ return "validation";
28
+ if (status >= 500)
29
+ return "server";
30
+ return "unknown";
31
+ };
32
+ const isRetryableStatus = (status) => status === HTTP_TIMEOUT_STATUS || status === 429 || status >= 500;
33
+ const safeDetails = (value) => {
34
+ try {
35
+ return { details: sanitizeRaw(value) };
36
+ }
37
+ catch {
38
+ return {};
39
+ }
40
+ };
41
+ const responseMessage = (payload, fallback) => {
42
+ if (typeof payload === "string")
43
+ return sanitizeDiagnosticText(payload);
44
+ if (payload !== null && typeof payload === "object") {
45
+ const record = payload;
46
+ if (typeof record["detail"] === "string") {
47
+ return sanitizeDiagnosticText(record["detail"]);
48
+ }
49
+ if (typeof record["message"] === "string") {
50
+ return sanitizeDiagnosticText(record["message"]);
51
+ }
52
+ }
53
+ return fallback;
54
+ };
55
+ export class TFRobotHttpClient {
56
+ #baseUrl;
57
+ #fetch;
58
+ #inFlight = new Set();
59
+ #now;
60
+ #options;
61
+ #disposed = false;
62
+ constructor(options) {
63
+ this.#options = options;
64
+ this.#baseUrl = new URL(options.baseUrl.endsWith("/") ? options.baseUrl : `${options.baseUrl}/`);
65
+ this.#fetch = options.fetch ?? globalThis.fetch;
66
+ this.#now = options.now ?? Date.now;
67
+ }
68
+ async request(input) {
69
+ if (this.#disposed) {
70
+ return {
71
+ ok: false,
72
+ error: chatErrorSchema.parse({
73
+ code: "conflict",
74
+ message: "TFRobot Gateway is disposed",
75
+ retryable: false,
76
+ ...(input.conversationId === undefined
77
+ ? {}
78
+ : { conversationId: input.conversationId }),
79
+ }),
80
+ };
81
+ }
82
+ if (isGatewayDeadlineExceeded(input.options, this.#now())) {
83
+ return {
84
+ ok: false,
85
+ error: createGatewayDeadlineExceededError(input.conversationId),
86
+ };
87
+ }
88
+ const controller = new AbortController();
89
+ this.#inFlight.add(controller);
90
+ const timeout = setTimeout(() => controller.abort(), Math.min(MAX_TIMER_DELAY, Math.max(0, input.options.deadlineAt - this.#now())));
91
+ try {
92
+ const sessionRequest = {
93
+ purpose: "request",
94
+ operation: input.operation,
95
+ ...(input.conversationId === undefined
96
+ ? {}
97
+ : { conversationId: input.conversationId }),
98
+ };
99
+ let session;
100
+ const sessionOutcome = await awaitBounded(() => this.#options.sessionProvider.getSession(sessionRequest), {
101
+ deadlineAt: input.options.deadlineAt,
102
+ now: this.#now,
103
+ signal: controller.signal,
104
+ });
105
+ switch (sessionOutcome.kind) {
106
+ case "aborted":
107
+ case "deadline": {
108
+ return this.#interruptedResult(input.conversationId);
109
+ }
110
+ case "error": {
111
+ return {
112
+ ok: false,
113
+ error: chatErrorSchema.parse({
114
+ code: "authentication",
115
+ message: sessionOutcome.reason instanceof Error
116
+ ? sanitizeDiagnosticText(sessionOutcome.reason.message)
117
+ : "Unable to obtain a TFRobot session",
118
+ retryable: true,
119
+ ...(input.conversationId === undefined
120
+ ? {}
121
+ : { conversationId: input.conversationId }),
122
+ }),
123
+ };
124
+ }
125
+ case "value": {
126
+ session = sessionOutcome.value;
127
+ }
128
+ }
129
+ if (!isValidTFRobotSession(session)) {
130
+ return {
131
+ ok: false,
132
+ error: chatErrorSchema.parse({
133
+ code: "authentication",
134
+ message: "SessionProvider returned invalid TFRobot credentials",
135
+ retryable: true,
136
+ ...(input.conversationId === undefined
137
+ ? {}
138
+ : { conversationId: input.conversationId }),
139
+ }),
140
+ };
141
+ }
142
+ const url = new URL(input.path.replace(/^\//u, ""), this.#baseUrl);
143
+ for (const [key, value] of Object.entries(input.query ?? {})) {
144
+ if (value !== undefined)
145
+ url.searchParams.set(key, String(value));
146
+ }
147
+ const headers = sessionHeaders(session);
148
+ if (input.body !== undefined) {
149
+ headers.set("Content-Type", "application/json");
150
+ }
151
+ const responseOutcome = await awaitBounded(() => this.#fetch(url, {
152
+ method: input.method,
153
+ headers,
154
+ signal: controller.signal,
155
+ ...(input.body === undefined
156
+ ? {}
157
+ : { body: JSON.stringify(input.body) }),
158
+ }), {
159
+ deadlineAt: input.options.deadlineAt,
160
+ now: this.#now,
161
+ signal: controller.signal,
162
+ });
163
+ if (responseOutcome.kind === "aborted" ||
164
+ responseOutcome.kind === "deadline") {
165
+ return this.#interruptedResult(input.conversationId);
166
+ }
167
+ if (responseOutcome.kind === "error")
168
+ throw responseOutcome.reason;
169
+ const response = responseOutcome.value;
170
+ let payload;
171
+ const payloadOutcome = await awaitBounded(() => response.json(), {
172
+ deadlineAt: input.options.deadlineAt,
173
+ now: this.#now,
174
+ signal: controller.signal,
175
+ });
176
+ if (payloadOutcome.kind === "aborted" ||
177
+ payloadOutcome.kind === "deadline") {
178
+ return this.#interruptedResult(input.conversationId);
179
+ }
180
+ if (payloadOutcome.kind === "error") {
181
+ payload = undefined;
182
+ }
183
+ else {
184
+ payload = payloadOutcome.value;
185
+ }
186
+ if (!response.ok) {
187
+ const error = chatErrorSchema.parse({
188
+ code: statusErrorCode(response.status),
189
+ message: responseMessage(payload, `TFRobot request failed with HTTP ${response.status}`),
190
+ retryable: isRetryableStatus(response.status),
191
+ ...(input.conversationId === undefined
192
+ ? {}
193
+ : { conversationId: input.conversationId }),
194
+ ...safeDetails({
195
+ status: response.status,
196
+ payload,
197
+ }),
198
+ });
199
+ this.#invalidateSession(response.status, error);
200
+ return { ok: false, error };
201
+ }
202
+ const envelope = responseEnvelopeSchema.safeParse(payload);
203
+ if (!envelope.success || envelope.data.code !== 200) {
204
+ return {
205
+ ok: false,
206
+ error: chatErrorSchema.parse({
207
+ code: "validation",
208
+ message: envelope.success
209
+ ? sanitizeDiagnosticText(envelope.data.message)
210
+ : "TFRobot response envelope is invalid",
211
+ retryable: false,
212
+ ...(input.conversationId === undefined
213
+ ? {}
214
+ : { conversationId: input.conversationId }),
215
+ }),
216
+ };
217
+ }
218
+ const parsed = input.schema.safeParse(envelope.data.data);
219
+ if (!parsed.success) {
220
+ return {
221
+ ok: false,
222
+ error: chatErrorSchema.parse({
223
+ code: "validation",
224
+ message: "TFRobot response data is invalid",
225
+ retryable: false,
226
+ ...(input.conversationId === undefined
227
+ ? {}
228
+ : { conversationId: input.conversationId }),
229
+ ...safeDetails({
230
+ issues: parsed.error.issues.map(({ code, path }) => ({
231
+ code,
232
+ path,
233
+ })),
234
+ }),
235
+ }),
236
+ };
237
+ }
238
+ if (controller.signal.aborted ||
239
+ isGatewayDeadlineExceeded(input.options, this.#now())) {
240
+ return this.#interruptedResult(input.conversationId);
241
+ }
242
+ return { ok: true, value: parsed.data };
243
+ }
244
+ catch (reason) {
245
+ const injectedError = chatErrorSchema.safeParse(reason);
246
+ if (injectedError.success) {
247
+ return { ok: false, error: injectedError.data };
248
+ }
249
+ if (controller.signal.aborted ||
250
+ isGatewayDeadlineExceeded(input.options, this.#now())) {
251
+ return {
252
+ ok: false,
253
+ error: createGatewayDeadlineExceededError(input.conversationId),
254
+ };
255
+ }
256
+ return {
257
+ ok: false,
258
+ error: chatErrorSchema.parse({
259
+ code: "network",
260
+ message: reason instanceof Error
261
+ ? sanitizeDiagnosticText(reason.message)
262
+ : "TFRobot network request failed",
263
+ retryable: true,
264
+ ...(input.conversationId === undefined
265
+ ? {}
266
+ : { conversationId: input.conversationId }),
267
+ }),
268
+ };
269
+ }
270
+ finally {
271
+ clearTimeout(timeout);
272
+ this.#inFlight.delete(controller);
273
+ }
274
+ }
275
+ dispose() {
276
+ if (this.#disposed)
277
+ return;
278
+ this.#disposed = true;
279
+ for (const controller of this.#inFlight)
280
+ controller.abort();
281
+ this.#inFlight.clear();
282
+ }
283
+ #interruptedResult(conversationId) {
284
+ if (this.#disposed) {
285
+ return {
286
+ ok: false,
287
+ error: chatErrorSchema.parse({
288
+ code: "conflict",
289
+ message: "TFRobot Gateway is disposed",
290
+ retryable: false,
291
+ ...(conversationId === undefined ? {} : { conversationId }),
292
+ }),
293
+ };
294
+ }
295
+ return {
296
+ ok: false,
297
+ error: createGatewayDeadlineExceededError(conversationId),
298
+ };
299
+ }
300
+ #invalidateSession(status, error) {
301
+ if (status !== 401 && status !== 403)
302
+ return;
303
+ try {
304
+ void Promise.resolve(this.#options.sessionProvider.onSessionInvalid?.({
305
+ reason: status === 401 ? "expired" : "forbidden",
306
+ error,
307
+ })).catch(() => undefined);
308
+ }
309
+ catch {
310
+ // A host refresh failure must not replace the original request error.
311
+ }
312
+ }
313
+ }
314
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { TFRobotChatGateway, createTFRobotChatGateway, TFROBOT_CAPABILITIES, } from "./gateway.js";
2
+ export { createSocketIoFactory } from "./socket.js";
3
+ export type { TFRobotGatewayOptions, TFRobotMessageCreator, TFRobotMessageCreatorProvider, TFRobotMessageCreatorRequest, TFRobotSession, TFRobotSocket, TFRobotSocketAnyListener, TFRobotSocketAuth, TFRobotSocketFactory, TFRobotSocketFactoryInput, TFRobotSocketListener, } from "./types.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,YAAY,EACV,qBAAqB,EACrB,qBAAqB,EACrB,6BAA6B,EAC7B,4BAA4B,EAC5B,cAAc,EACd,aAAa,EACb,wBAAwB,EACxB,iBAAiB,EACjB,oBAAoB,EACpB,yBAAyB,EACzB,qBAAqB,GACtB,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { TFRobotChatGateway, createTFRobotChatGateway, TFROBOT_CAPABILITIES, } from "./gateway.js";
2
+ export { createSocketIoFactory } from "./socket.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { type AgentEvent, type ChatSnapshot, type ChatUpdate, type Conversation, type Message, type Run } from "@turingfocus/chat-protocol";
2
+ import type { ConversationDto, EventDto, HistoryDto, MessageDto, StatusDto } from "./dto.js";
3
+ export declare const TFROBOT_CAPABILITIES: Readonly<{
4
+ interrupt: true;
5
+ listConversations: true;
6
+ liveUpdates: true;
7
+ loadHistory: true;
8
+ sendText: true;
9
+ }>;
10
+ export declare const syntheticRunId: (conversationId: string) => string;
11
+ export declare const mapConversation: (dto: ConversationDto) => Conversation;
12
+ export declare const mapMessage: (dto: MessageDto) => Message;
13
+ export declare const mapEvent: (dto: EventDto) => AgentEvent;
14
+ export declare const mapRun: (conversationId: string, dto: StatusDto) => Run | null;
15
+ export declare const mapSnapshot: (conversation: Conversation, history: HistoryDto, status: StatusDto) => ChatSnapshot;
16
+ export declare const mapMessageUpdate: (dto: MessageDto) => ChatUpdate;
17
+ export declare const mapEventUpdate: (dto: EventDto) => ChatUpdate;
18
+ export declare const mapUnknownSocketEvent: (eventName: string, payload: unknown, conversationId: string, now: number) => ChatUpdate;
19
+ //# sourceMappingURL=mapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapper.d.ts","sourceRoot":"","sources":["../src/mapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAiBL,KAAK,UAAU,EAOf,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,OAAO,EAIZ,KAAK,GAAG,EAGT,MAAM,4BAA4B,CAAC;AAEpC,OAAO,KAAK,EACV,eAAe,EACf,QAAQ,EACR,UAAU,EACV,UAAU,EACV,SAAS,EACV,MAAM,UAAU,CAAC;AAElB,eAAO,MAAM,oBAAoB;;;;;;EAM/B,CAAC;AAIH,eAAO,MAAM,cAAc,GAAI,gBAAgB,MAAM,KAAG,MACxB,CAAC;AAuGjC,eAAO,MAAM,eAAe,GAAI,KAAK,eAAe,KAAG,YASnD,CAAC;AAoEL,eAAO,MAAM,UAAU,GAAI,KAAK,UAAU,KAAG,OA6B5C,CAAC;AAmWF,eAAO,MAAM,QAAQ,GAAI,KAAK,QAAQ,KAAG,UAsExC,CAAC;AAqCF,eAAO,MAAM,MAAM,GAAI,gBAAgB,MAAM,EAAE,KAAK,SAAS,KAAG,GAAG,GAAG,IAUrE,CAAC;AAEF,eAAO,MAAM,WAAW,GACtB,cAAc,YAAY,EAC1B,SAAS,UAAU,EACnB,QAAQ,SAAS,KAChB,YAiBF,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,KAAK,UAAU,KAAG,UAK/C,CAAC;AAEL,eAAO,MAAM,cAAc,GAAI,KAAK,QAAQ,KAAG,UAc9C,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAChC,WAAW,MAAM,EACjB,SAAS,OAAO,EAChB,gBAAgB,MAAM,EACtB,KAAK,MAAM,KACV,UAwDF,CAAC"}