@agentskit/adapters 0.13.12 → 0.13.16
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/README.md +33 -3
- package/dist/catalog/index.cjs +197 -60
- package/dist/catalog/index.cjs.map +1 -1
- package/dist/catalog/index.d.cts +1 -1
- package/dist/catalog/index.d.ts +1 -1
- package/dist/catalog/index.js +2 -1
- package/dist/catalog/index.js.map +1 -1
- package/dist/{chunk-77QS3QRT.js → chunk-4KZTWGRB.js} +249 -119
- package/dist/chunk-4KZTWGRB.js.map +1 -0
- package/dist/chunk-627FHZZY.js +101 -0
- package/dist/chunk-627FHZZY.js.map +1 -0
- package/dist/chunk-6CIB2QCH.js +81 -0
- package/dist/chunk-6CIB2QCH.js.map +1 -0
- package/dist/createAdapter-C-pKR1aO.d.cts +19 -0
- package/dist/createAdapter-C-pKR1aO.d.ts +19 -0
- package/dist/createAdapter.cjs +138 -15
- package/dist/createAdapter.cjs.map +1 -1
- package/dist/createAdapter.d.cts +1 -1
- package/dist/createAdapter.d.ts +1 -1
- package/dist/createAdapter.js +2 -1
- package/dist/index.cjs +1090 -319
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +33 -13
- package/dist/index.d.ts +33 -13
- package/dist/index.js +686 -191
- package/dist/index.js.map +1 -1
- package/package.json +11 -6
- package/dist/chunk-6FPLWOVE.js +0 -26
- package/dist/chunk-6FPLWOVE.js.map +0 -1
- package/dist/chunk-77QS3QRT.js.map +0 -1
- package/dist/createAdapter-Dfnf3Iio.d.cts +0 -14
- package/dist/createAdapter-Dfnf3Iio.d.ts +0 -14
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { raceAbort, adapterErrorChunk, isAbortError } from './chunk-6CIB2QCH.js';
|
|
2
|
+
|
|
3
|
+
// src/createAdapter.ts
|
|
4
|
+
function createAdapter(config) {
|
|
5
|
+
return {
|
|
6
|
+
createSource: (request) => {
|
|
7
|
+
const controller = new AbortController();
|
|
8
|
+
let activeStream = null;
|
|
9
|
+
let parseIter = null;
|
|
10
|
+
const cleanup = () => {
|
|
11
|
+
try {
|
|
12
|
+
void activeStream?.cancel();
|
|
13
|
+
} catch {
|
|
14
|
+
}
|
|
15
|
+
activeStream = null;
|
|
16
|
+
if (parseIter && typeof parseIter.return === "function") {
|
|
17
|
+
void parseIter.return(void 0).catch(() => {
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
parseIter = null;
|
|
21
|
+
try {
|
|
22
|
+
config.abort?.();
|
|
23
|
+
} catch {
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
return {
|
|
27
|
+
stream: async function* () {
|
|
28
|
+
if (controller.signal.aborted) return;
|
|
29
|
+
try {
|
|
30
|
+
const result = await raceAbort(config.send(request, controller.signal), controller.signal);
|
|
31
|
+
if (controller.signal.aborted) {
|
|
32
|
+
if (result instanceof Response) {
|
|
33
|
+
try {
|
|
34
|
+
await result.body?.cancel();
|
|
35
|
+
} catch {
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const stream = result instanceof Response ? result.body : result;
|
|
41
|
+
if (!stream) {
|
|
42
|
+
yield adapterErrorChunk("Adapter send() returned empty body");
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
activeStream = stream;
|
|
46
|
+
const response = result instanceof Response ? result : void 0;
|
|
47
|
+
const iterable = config.parse(stream, response);
|
|
48
|
+
parseIter = iterable[Symbol.asyncIterator]();
|
|
49
|
+
while (true) {
|
|
50
|
+
if (controller.signal.aborted) {
|
|
51
|
+
cleanup();
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
let next;
|
|
55
|
+
try {
|
|
56
|
+
next = await raceAbort(parseIter.next(), controller.signal);
|
|
57
|
+
} catch (err) {
|
|
58
|
+
if (isAbortError(err) || controller.signal.aborted) {
|
|
59
|
+
cleanup();
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
throw err;
|
|
63
|
+
}
|
|
64
|
+
if (next.done) break;
|
|
65
|
+
if (controller.signal.aborted) {
|
|
66
|
+
cleanup();
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
yield next.value;
|
|
70
|
+
if (next.value.type === "done" || next.value.type === "error") {
|
|
71
|
+
if (typeof parseIter.return === "function") {
|
|
72
|
+
await parseIter.return(void 0).catch(() => {
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
parseIter = null;
|
|
76
|
+
activeStream = null;
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
yield adapterErrorChunk("Adapter parser ended without a terminal chunk");
|
|
81
|
+
activeStream = null;
|
|
82
|
+
} catch (err) {
|
|
83
|
+
if (isAbortError(err) || controller.signal.aborted) return;
|
|
84
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
85
|
+
yield adapterErrorChunk(message, { cause: err });
|
|
86
|
+
} finally {
|
|
87
|
+
if (controller.signal.aborted) cleanup();
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
abort: () => {
|
|
91
|
+
if (!controller.signal.aborted) controller.abort();
|
|
92
|
+
cleanup();
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export { createAdapter };
|
|
100
|
+
//# sourceMappingURL=chunk-627FHZZY.js.map
|
|
101
|
+
//# sourceMappingURL=chunk-627FHZZY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/createAdapter.ts"],"names":[],"mappings":"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","file":"chunk-627FHZZY.js","sourcesContent":["import type { AdapterFactory, AdapterRequest, StreamChunk, StreamSource } from '@agentskit/core'\nimport type { CreateAdapterConfig } from './types'\nimport { adapterErrorChunk, isAbortError, raceAbort } from './stream-errors'\n\nexport function createAdapter(config: CreateAdapterConfig): AdapterFactory {\n return {\n createSource: (request: AdapterRequest): StreamSource => {\n const controller = new AbortController()\n let activeStream: ReadableStream | null = null\n let parseIter: AsyncIterator<StreamChunk> | null = null\n\n const cleanup = (): void => {\n try {\n void activeStream?.cancel()\n } catch {\n // ignore\n }\n activeStream = null\n if (parseIter && typeof parseIter.return === 'function') {\n void parseIter.return(undefined).catch(() => {})\n }\n parseIter = null\n try {\n config.abort?.()\n } catch {\n // ignore\n }\n }\n\n return {\n stream: async function* (): AsyncIterableIterator<StreamChunk> {\n if (controller.signal.aborted) return\n try {\n const result = await raceAbort(config.send(request, controller.signal), controller.signal)\n if (controller.signal.aborted) {\n if (result instanceof Response) {\n try {\n await result.body?.cancel()\n } catch {\n // ignore\n }\n }\n return\n }\n\n const stream =\n result instanceof Response\n ? result.body\n : result\n if (!stream) {\n yield adapterErrorChunk('Adapter send() returned empty body')\n return\n }\n activeStream = stream\n\n const response = result instanceof Response ? result : undefined\n const iterable = config.parse(stream, response)\n parseIter = iterable[Symbol.asyncIterator]()\n\n while (true) {\n if (controller.signal.aborted) {\n cleanup()\n return\n }\n let next: IteratorResult<StreamChunk>\n try {\n next = await raceAbort(parseIter.next(), controller.signal)\n } catch (err) {\n if (isAbortError(err) || controller.signal.aborted) {\n cleanup()\n return\n }\n throw err\n }\n if (next.done) break\n if (controller.signal.aborted) {\n cleanup()\n return\n }\n yield next.value\n if (next.value.type === 'done' || next.value.type === 'error') {\n if (typeof parseIter.return === 'function') {\n await parseIter.return(undefined).catch(() => {})\n }\n parseIter = null\n activeStream = null\n return\n }\n }\n yield adapterErrorChunk('Adapter parser ended without a terminal chunk')\n activeStream = null\n } catch (err) {\n if (isAbortError(err) || controller.signal.aborted) return\n const message = err instanceof Error ? err.message : String(err)\n yield adapterErrorChunk(message, { cause: err })\n } finally {\n if (controller.signal.aborted) cleanup()\n }\n },\n abort: () => {\n if (!controller.signal.aborted) controller.abort()\n cleanup()\n },\n }\n },\n }\n}\n"]}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { AdapterError, ErrorCodes } from '@agentskit/core';
|
|
2
|
+
|
|
3
|
+
// src/stream-errors.ts
|
|
4
|
+
function isAbortError(err) {
|
|
5
|
+
if (err instanceof DOMException && err.name === "AbortError") return true;
|
|
6
|
+
if (err instanceof Error && err.name === "AbortError") return true;
|
|
7
|
+
return false;
|
|
8
|
+
}
|
|
9
|
+
function adapterErrorChunk(message, options) {
|
|
10
|
+
const error = new AdapterError({
|
|
11
|
+
code: options?.code ?? ErrorCodes.AK_ADAPTER_STREAM_FAILED,
|
|
12
|
+
message,
|
|
13
|
+
cause: options?.cause
|
|
14
|
+
});
|
|
15
|
+
return {
|
|
16
|
+
type: "error",
|
|
17
|
+
content: message,
|
|
18
|
+
metadata: { error }
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
function parseCompleteToolArgs(args) {
|
|
22
|
+
const raw = args.length > 0 ? args : "{}";
|
|
23
|
+
try {
|
|
24
|
+
JSON.parse(raw);
|
|
25
|
+
return { ok: true, args: raw };
|
|
26
|
+
} catch (cause) {
|
|
27
|
+
return {
|
|
28
|
+
ok: false,
|
|
29
|
+
error: new AdapterError({
|
|
30
|
+
code: ErrorCodes.AK_ADAPTER_STREAM_FAILED,
|
|
31
|
+
message: "Incomplete or malformed tool-call arguments JSON",
|
|
32
|
+
cause
|
|
33
|
+
})
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function raceAbort(promise, signal) {
|
|
38
|
+
if (signal.aborted) {
|
|
39
|
+
return Promise.reject(new DOMException("Aborted", "AbortError"));
|
|
40
|
+
}
|
|
41
|
+
return new Promise((resolve, reject) => {
|
|
42
|
+
let settled = false;
|
|
43
|
+
const onAbort = () => {
|
|
44
|
+
if (settled) return;
|
|
45
|
+
settled = true;
|
|
46
|
+
signal.removeEventListener("abort", onAbort);
|
|
47
|
+
reject(new DOMException("Aborted", "AbortError"));
|
|
48
|
+
};
|
|
49
|
+
signal.addEventListener("abort", onAbort);
|
|
50
|
+
promise.then(
|
|
51
|
+
(value) => {
|
|
52
|
+
if (settled) return;
|
|
53
|
+
settled = true;
|
|
54
|
+
signal.removeEventListener("abort", onAbort);
|
|
55
|
+
resolve(value);
|
|
56
|
+
},
|
|
57
|
+
(err) => {
|
|
58
|
+
if (settled) return;
|
|
59
|
+
settled = true;
|
|
60
|
+
signal.removeEventListener("abort", onAbort);
|
|
61
|
+
reject(err);
|
|
62
|
+
}
|
|
63
|
+
);
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
async function abortableSleep(ms, signal, sleep) {
|
|
67
|
+
if (signal.aborted) throw new DOMException("Aborted", "AbortError");
|
|
68
|
+
await raceAbort(sleep(ms), signal);
|
|
69
|
+
if (signal.aborted) throw new DOMException("Aborted", "AbortError");
|
|
70
|
+
}
|
|
71
|
+
async function cancelBody(body) {
|
|
72
|
+
if (!body) return;
|
|
73
|
+
try {
|
|
74
|
+
await body.cancel();
|
|
75
|
+
} catch {
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export { abortableSleep, adapterErrorChunk, cancelBody, isAbortError, parseCompleteToolArgs, raceAbort };
|
|
80
|
+
//# sourceMappingURL=chunk-6CIB2QCH.js.map
|
|
81
|
+
//# sourceMappingURL=chunk-6CIB2QCH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/stream-errors.ts"],"names":[],"mappings":"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","file":"chunk-6CIB2QCH.js","sourcesContent":["import { AdapterError, ErrorCodes } from '@agentskit/core'\nimport type { StreamChunk } from '@agentskit/core'\n\n/** True when the error is a caller-initiated abort. */\nexport function isAbortError(err: unknown): boolean {\n if (err instanceof DOMException && err.name === 'AbortError') return true\n if (err instanceof Error && err.name === 'AbortError') return true\n return false\n}\n\n/**\n * Terminal adapter failure as a stream chunk (ADR 0001 A3/A9).\n * Always attaches `metadata.error` as an Error — prefer AdapterError.\n */\nexport function adapterErrorChunk(\n message: string,\n options?: { cause?: unknown; code?: string },\n): StreamChunk {\n const error = new AdapterError({\n code: options?.code ?? ErrorCodes.AK_ADAPTER_STREAM_FAILED,\n message,\n cause: options?.cause,\n })\n return {\n type: 'error',\n content: message,\n metadata: { error },\n }\n}\n\n/** Validate complete tool-call args JSON before emitting A5 tool_call. */\nexport function parseCompleteToolArgs(\n args: string,\n): { ok: true; args: string } | { ok: false; error: Error } {\n const raw = args.length > 0 ? args : '{}'\n try {\n JSON.parse(raw)\n return { ok: true, args: raw }\n } catch (cause) {\n return {\n ok: false,\n error: new AdapterError({\n code: ErrorCodes.AK_ADAPTER_STREAM_FAILED,\n message: 'Incomplete or malformed tool-call arguments JSON',\n cause,\n }),\n }\n }\n}\n\n/**\n * Race a promise against abort. Rejects promptly with AbortError when the\n * signal fires; cleans up the abort listener either way.\n */\nexport function raceAbort<T>(promise: Promise<T>, signal: AbortSignal): Promise<T> {\n if (signal.aborted) {\n return Promise.reject(new DOMException('Aborted', 'AbortError'))\n }\n return new Promise<T>((resolve, reject) => {\n let settled = false\n const onAbort = (): void => {\n if (settled) return\n settled = true\n signal.removeEventListener('abort', onAbort)\n reject(new DOMException('Aborted', 'AbortError'))\n }\n signal.addEventListener('abort', onAbort)\n promise.then(\n value => {\n if (settled) return\n settled = true\n signal.removeEventListener('abort', onAbort)\n resolve(value)\n },\n err => {\n if (settled) return\n settled = true\n signal.removeEventListener('abort', onAbort)\n reject(err)\n },\n )\n })\n}\n\n/** Abort-aware delay used by retry backoff. */\nexport async function abortableSleep(\n ms: number,\n signal: AbortSignal,\n sleep: (ms: number) => Promise<void>,\n): Promise<void> {\n if (signal.aborted) throw new DOMException('Aborted', 'AbortError')\n await raceAbort(sleep(ms), signal)\n if (signal.aborted) throw new DOMException('Aborted', 'AbortError')\n}\n\nexport async function cancelBody(body: ReadableStream | null | undefined): Promise<void> {\n if (!body) return\n try {\n await body.cancel()\n } catch {\n // ignore\n }\n}\n"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { AdapterRequest, StreamChunk, AdapterFactory } from '@agentskit/core';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Optional second AbortSignal keeps one-argument callbacks assignable
|
|
5
|
+
* (extra parameters are optional). createAdapter races send against abort
|
|
6
|
+
* and will not start work after pre-abort.
|
|
7
|
+
*/
|
|
8
|
+
interface CreateAdapterConfig {
|
|
9
|
+
send: (request: AdapterRequest, signal?: AbortSignal) => Promise<ReadableStream | Response>;
|
|
10
|
+
parse: (stream: ReadableStream, response?: Response) => AsyncIterableIterator<StreamChunk>;
|
|
11
|
+
abort?: () => void;
|
|
12
|
+
}
|
|
13
|
+
interface GenericAdapterConfig {
|
|
14
|
+
send: (request: AdapterRequest, signal?: AbortSignal) => Promise<ReadableStream>;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
declare function createAdapter(config: CreateAdapterConfig): AdapterFactory;
|
|
18
|
+
|
|
19
|
+
export { type CreateAdapterConfig as C, type GenericAdapterConfig as G, createAdapter as c };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { AdapterRequest, StreamChunk, AdapterFactory } from '@agentskit/core';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Optional second AbortSignal keeps one-argument callbacks assignable
|
|
5
|
+
* (extra parameters are optional). createAdapter races send against abort
|
|
6
|
+
* and will not start work after pre-abort.
|
|
7
|
+
*/
|
|
8
|
+
interface CreateAdapterConfig {
|
|
9
|
+
send: (request: AdapterRequest, signal?: AbortSignal) => Promise<ReadableStream | Response>;
|
|
10
|
+
parse: (stream: ReadableStream, response?: Response) => AsyncIterableIterator<StreamChunk>;
|
|
11
|
+
abort?: () => void;
|
|
12
|
+
}
|
|
13
|
+
interface GenericAdapterConfig {
|
|
14
|
+
send: (request: AdapterRequest, signal?: AbortSignal) => Promise<ReadableStream>;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
declare function createAdapter(config: CreateAdapterConfig): AdapterFactory;
|
|
18
|
+
|
|
19
|
+
export { type CreateAdapterConfig as C, type GenericAdapterConfig as G, createAdapter as c };
|
package/dist/createAdapter.cjs
CHANGED
|
@@ -1,25 +1,148 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var core = require('@agentskit/core');
|
|
4
|
+
|
|
5
|
+
// src/stream-errors.ts
|
|
6
|
+
function isAbortError(err) {
|
|
7
|
+
if (err instanceof DOMException && err.name === "AbortError") return true;
|
|
8
|
+
if (err instanceof Error && err.name === "AbortError") return true;
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
function adapterErrorChunk(message, options) {
|
|
12
|
+
const error = new core.AdapterError({
|
|
13
|
+
code: options?.code ?? core.ErrorCodes.AK_ADAPTER_STREAM_FAILED,
|
|
14
|
+
message,
|
|
15
|
+
cause: options?.cause
|
|
16
|
+
});
|
|
17
|
+
return {
|
|
18
|
+
type: "error",
|
|
19
|
+
content: message,
|
|
20
|
+
metadata: { error }
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function raceAbort(promise, signal) {
|
|
24
|
+
if (signal.aborted) {
|
|
25
|
+
return Promise.reject(new DOMException("Aborted", "AbortError"));
|
|
26
|
+
}
|
|
27
|
+
return new Promise((resolve, reject) => {
|
|
28
|
+
let settled = false;
|
|
29
|
+
const onAbort = () => {
|
|
30
|
+
if (settled) return;
|
|
31
|
+
settled = true;
|
|
32
|
+
signal.removeEventListener("abort", onAbort);
|
|
33
|
+
reject(new DOMException("Aborted", "AbortError"));
|
|
34
|
+
};
|
|
35
|
+
signal.addEventListener("abort", onAbort);
|
|
36
|
+
promise.then(
|
|
37
|
+
(value) => {
|
|
38
|
+
if (settled) return;
|
|
39
|
+
settled = true;
|
|
40
|
+
signal.removeEventListener("abort", onAbort);
|
|
41
|
+
resolve(value);
|
|
42
|
+
},
|
|
43
|
+
(err) => {
|
|
44
|
+
if (settled) return;
|
|
45
|
+
settled = true;
|
|
46
|
+
signal.removeEventListener("abort", onAbort);
|
|
47
|
+
reject(err);
|
|
48
|
+
}
|
|
49
|
+
);
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
|
|
3
53
|
// src/createAdapter.ts
|
|
4
54
|
function createAdapter(config) {
|
|
5
55
|
return {
|
|
6
|
-
createSource: (request) =>
|
|
7
|
-
|
|
56
|
+
createSource: (request) => {
|
|
57
|
+
const controller = new AbortController();
|
|
58
|
+
let activeStream = null;
|
|
59
|
+
let parseIter = null;
|
|
60
|
+
const cleanup = () => {
|
|
8
61
|
try {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
yield* config.parse(stream);
|
|
12
|
-
} catch (err) {
|
|
13
|
-
yield {
|
|
14
|
-
type: "error",
|
|
15
|
-
content: err instanceof Error ? err.message : String(err)
|
|
16
|
-
};
|
|
62
|
+
void activeStream?.cancel();
|
|
63
|
+
} catch {
|
|
17
64
|
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
65
|
+
activeStream = null;
|
|
66
|
+
if (parseIter && typeof parseIter.return === "function") {
|
|
67
|
+
void parseIter.return(void 0).catch(() => {
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
parseIter = null;
|
|
71
|
+
try {
|
|
72
|
+
config.abort?.();
|
|
73
|
+
} catch {
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
return {
|
|
77
|
+
stream: async function* () {
|
|
78
|
+
if (controller.signal.aborted) return;
|
|
79
|
+
try {
|
|
80
|
+
const result = await raceAbort(config.send(request, controller.signal), controller.signal);
|
|
81
|
+
if (controller.signal.aborted) {
|
|
82
|
+
if (result instanceof Response) {
|
|
83
|
+
try {
|
|
84
|
+
await result.body?.cancel();
|
|
85
|
+
} catch {
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const stream = result instanceof Response ? result.body : result;
|
|
91
|
+
if (!stream) {
|
|
92
|
+
yield adapterErrorChunk("Adapter send() returned empty body");
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
activeStream = stream;
|
|
96
|
+
const response = result instanceof Response ? result : void 0;
|
|
97
|
+
const iterable = config.parse(stream, response);
|
|
98
|
+
parseIter = iterable[Symbol.asyncIterator]();
|
|
99
|
+
while (true) {
|
|
100
|
+
if (controller.signal.aborted) {
|
|
101
|
+
cleanup();
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
let next;
|
|
105
|
+
try {
|
|
106
|
+
next = await raceAbort(parseIter.next(), controller.signal);
|
|
107
|
+
} catch (err) {
|
|
108
|
+
if (isAbortError(err) || controller.signal.aborted) {
|
|
109
|
+
cleanup();
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
throw err;
|
|
113
|
+
}
|
|
114
|
+
if (next.done) break;
|
|
115
|
+
if (controller.signal.aborted) {
|
|
116
|
+
cleanup();
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
yield next.value;
|
|
120
|
+
if (next.value.type === "done" || next.value.type === "error") {
|
|
121
|
+
if (typeof parseIter.return === "function") {
|
|
122
|
+
await parseIter.return(void 0).catch(() => {
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
parseIter = null;
|
|
126
|
+
activeStream = null;
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
yield adapterErrorChunk("Adapter parser ended without a terminal chunk");
|
|
131
|
+
activeStream = null;
|
|
132
|
+
} catch (err) {
|
|
133
|
+
if (isAbortError(err) || controller.signal.aborted) return;
|
|
134
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
135
|
+
yield adapterErrorChunk(message, { cause: err });
|
|
136
|
+
} finally {
|
|
137
|
+
if (controller.signal.aborted) cleanup();
|
|
138
|
+
}
|
|
139
|
+
},
|
|
140
|
+
abort: () => {
|
|
141
|
+
if (!controller.signal.aborted) controller.abort();
|
|
142
|
+
cleanup();
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
}
|
|
23
146
|
};
|
|
24
147
|
}
|
|
25
148
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/createAdapter.ts"],"names":[],"mappings":";;;AAGO,SAAS,cAAc,MAAA,EAA6C;AACzE,EAAA,OAAO;AAAA,IACL,YAAA,EAAc,CAAC,OAAA,MAA2C;AAAA,MACxD,QAAQ,mBAAuD;AAC7D,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AACxC,UAAA,MAAM,MAAA,GAAS,MAAA,YAAkB,QAAA,GAC7B,MAAA,CAAO,IAAA,GACP,MAAA;AACJ,UAAA,OAAO,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA,QAC5B,SAAS,GAAA,EAAK;AACZ,UAAA,MAAM;AAAA,YACJ,IAAA,EAAM,OAAA;AAAA,YACN,SAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG;AAAA,WAC1D;AAAA,QACF;AAAA,MACF,CAAA;AAAA,MACA,OAAO,MAAM;AACX,QAAA,MAAA,CAAO,KAAA,IAAQ;AAAA,MACjB;AAAA,KACF;AAAA,GACF;AACF","file":"createAdapter.cjs","sourcesContent":["import type { AdapterFactory, AdapterRequest, StreamChunk, StreamSource } from '@agentskit/core'\nimport type { CreateAdapterConfig } from './types'\n\nexport function createAdapter(config: CreateAdapterConfig): AdapterFactory {\n return {\n createSource: (request: AdapterRequest): StreamSource => ({\n stream: async function* (): AsyncIterableIterator<StreamChunk> {\n try {\n const result = await config.send(request)\n const stream = result instanceof Response\n ? result.body!\n : result\n yield* config.parse(stream)\n } catch (err) {\n yield {\n type: 'error',\n content: err instanceof Error ? err.message : String(err),\n }\n }\n },\n abort: () => {\n config.abort?.()\n },\n }),\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/stream-errors.ts","../src/createAdapter.ts"],"names":["AdapterError","ErrorCodes"],"mappings":"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","file":"createAdapter.cjs","sourcesContent":["import { AdapterError, ErrorCodes } from '@agentskit/core'\nimport type { StreamChunk } from '@agentskit/core'\n\n/** True when the error is a caller-initiated abort. */\nexport function isAbortError(err: unknown): boolean {\n if (err instanceof DOMException && err.name === 'AbortError') return true\n if (err instanceof Error && err.name === 'AbortError') return true\n return false\n}\n\n/**\n * Terminal adapter failure as a stream chunk (ADR 0001 A3/A9).\n * Always attaches `metadata.error` as an Error — prefer AdapterError.\n */\nexport function adapterErrorChunk(\n message: string,\n options?: { cause?: unknown; code?: string },\n): StreamChunk {\n const error = new AdapterError({\n code: options?.code ?? ErrorCodes.AK_ADAPTER_STREAM_FAILED,\n message,\n cause: options?.cause,\n })\n return {\n type: 'error',\n content: message,\n metadata: { error },\n }\n}\n\n/** Validate complete tool-call args JSON before emitting A5 tool_call. */\nexport function parseCompleteToolArgs(\n args: string,\n): { ok: true; args: string } | { ok: false; error: Error } {\n const raw = args.length > 0 ? args : '{}'\n try {\n JSON.parse(raw)\n return { ok: true, args: raw }\n } catch (cause) {\n return {\n ok: false,\n error: new AdapterError({\n code: ErrorCodes.AK_ADAPTER_STREAM_FAILED,\n message: 'Incomplete or malformed tool-call arguments JSON',\n cause,\n }),\n }\n }\n}\n\n/**\n * Race a promise against abort. Rejects promptly with AbortError when the\n * signal fires; cleans up the abort listener either way.\n */\nexport function raceAbort<T>(promise: Promise<T>, signal: AbortSignal): Promise<T> {\n if (signal.aborted) {\n return Promise.reject(new DOMException('Aborted', 'AbortError'))\n }\n return new Promise<T>((resolve, reject) => {\n let settled = false\n const onAbort = (): void => {\n if (settled) return\n settled = true\n signal.removeEventListener('abort', onAbort)\n reject(new DOMException('Aborted', 'AbortError'))\n }\n signal.addEventListener('abort', onAbort)\n promise.then(\n value => {\n if (settled) return\n settled = true\n signal.removeEventListener('abort', onAbort)\n resolve(value)\n },\n err => {\n if (settled) return\n settled = true\n signal.removeEventListener('abort', onAbort)\n reject(err)\n },\n )\n })\n}\n\n/** Abort-aware delay used by retry backoff. */\nexport async function abortableSleep(\n ms: number,\n signal: AbortSignal,\n sleep: (ms: number) => Promise<void>,\n): Promise<void> {\n if (signal.aborted) throw new DOMException('Aborted', 'AbortError')\n await raceAbort(sleep(ms), signal)\n if (signal.aborted) throw new DOMException('Aborted', 'AbortError')\n}\n\nexport async function cancelBody(body: ReadableStream | null | undefined): Promise<void> {\n if (!body) return\n try {\n await body.cancel()\n } catch {\n // ignore\n }\n}\n","import type { AdapterFactory, AdapterRequest, StreamChunk, StreamSource } from '@agentskit/core'\nimport type { CreateAdapterConfig } from './types'\nimport { adapterErrorChunk, isAbortError, raceAbort } from './stream-errors'\n\nexport function createAdapter(config: CreateAdapterConfig): AdapterFactory {\n return {\n createSource: (request: AdapterRequest): StreamSource => {\n const controller = new AbortController()\n let activeStream: ReadableStream | null = null\n let parseIter: AsyncIterator<StreamChunk> | null = null\n\n const cleanup = (): void => {\n try {\n void activeStream?.cancel()\n } catch {\n // ignore\n }\n activeStream = null\n if (parseIter && typeof parseIter.return === 'function') {\n void parseIter.return(undefined).catch(() => {})\n }\n parseIter = null\n try {\n config.abort?.()\n } catch {\n // ignore\n }\n }\n\n return {\n stream: async function* (): AsyncIterableIterator<StreamChunk> {\n if (controller.signal.aborted) return\n try {\n const result = await raceAbort(config.send(request, controller.signal), controller.signal)\n if (controller.signal.aborted) {\n if (result instanceof Response) {\n try {\n await result.body?.cancel()\n } catch {\n // ignore\n }\n }\n return\n }\n\n const stream =\n result instanceof Response\n ? result.body\n : result\n if (!stream) {\n yield adapterErrorChunk('Adapter send() returned empty body')\n return\n }\n activeStream = stream\n\n const response = result instanceof Response ? result : undefined\n const iterable = config.parse(stream, response)\n parseIter = iterable[Symbol.asyncIterator]()\n\n while (true) {\n if (controller.signal.aborted) {\n cleanup()\n return\n }\n let next: IteratorResult<StreamChunk>\n try {\n next = await raceAbort(parseIter.next(), controller.signal)\n } catch (err) {\n if (isAbortError(err) || controller.signal.aborted) {\n cleanup()\n return\n }\n throw err\n }\n if (next.done) break\n if (controller.signal.aborted) {\n cleanup()\n return\n }\n yield next.value\n if (next.value.type === 'done' || next.value.type === 'error') {\n if (typeof parseIter.return === 'function') {\n await parseIter.return(undefined).catch(() => {})\n }\n parseIter = null\n activeStream = null\n return\n }\n }\n yield adapterErrorChunk('Adapter parser ended without a terminal chunk')\n activeStream = null\n } catch (err) {\n if (isAbortError(err) || controller.signal.aborted) return\n const message = err instanceof Error ? err.message : String(err)\n yield adapterErrorChunk(message, { cause: err })\n } finally {\n if (controller.signal.aborted) cleanup()\n }\n },\n abort: () => {\n if (!controller.signal.aborted) controller.abort()\n cleanup()\n },\n }\n },\n }\n}\n"]}
|
package/dist/createAdapter.d.cts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import '@agentskit/core';
|
|
2
|
-
export { c as createAdapter } from './createAdapter-
|
|
2
|
+
export { c as createAdapter } from './createAdapter-C-pKR1aO.cjs';
|
package/dist/createAdapter.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import '@agentskit/core';
|
|
2
|
-
export { c as createAdapter } from './createAdapter-
|
|
2
|
+
export { c as createAdapter } from './createAdapter-C-pKR1aO.js';
|
package/dist/createAdapter.js
CHANGED