@witqq/agent-sdk 0.7.0 → 0.9.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/{types-CqvUAYxt.d.ts → agent-C6H2CgJA.d.cts} +139 -102
- package/dist/{types-CqvUAYxt.d.cts → agent-F7oB6eKp.d.ts} +139 -102
- package/dist/auth/index.cjs +72 -1
- package/dist/auth/index.cjs.map +1 -1
- package/dist/auth/index.d.cts +21 -154
- package/dist/auth/index.d.ts +21 -154
- package/dist/auth/index.js +72 -1
- package/dist/auth/index.js.map +1 -1
- package/dist/backends/claude.cjs +480 -261
- package/dist/backends/claude.cjs.map +1 -1
- package/dist/backends/claude.d.cts +3 -1
- package/dist/backends/claude.d.ts +3 -1
- package/dist/backends/claude.js +480 -261
- package/dist/backends/claude.js.map +1 -1
- package/dist/backends/copilot.cjs +337 -112
- package/dist/backends/copilot.cjs.map +1 -1
- package/dist/backends/copilot.d.cts +12 -4
- package/dist/backends/copilot.d.ts +12 -4
- package/dist/backends/copilot.js +337 -112
- package/dist/backends/copilot.js.map +1 -1
- package/dist/backends/mock-llm.cjs +719 -0
- package/dist/backends/mock-llm.cjs.map +1 -0
- package/dist/backends/mock-llm.d.cts +37 -0
- package/dist/backends/mock-llm.d.ts +37 -0
- package/dist/backends/mock-llm.js +717 -0
- package/dist/backends/mock-llm.js.map +1 -0
- package/dist/backends/vercel-ai.cjs +301 -61
- package/dist/backends/vercel-ai.cjs.map +1 -1
- package/dist/backends/vercel-ai.d.cts +3 -1
- package/dist/backends/vercel-ai.d.ts +3 -1
- package/dist/backends/vercel-ai.js +301 -61
- package/dist/backends/vercel-ai.js.map +1 -1
- package/dist/backends-Cno0gZjy.d.cts +114 -0
- package/dist/backends-Cno0gZjy.d.ts +114 -0
- package/dist/chat/accumulator.cjs +1 -1
- package/dist/chat/accumulator.cjs.map +1 -1
- package/dist/chat/accumulator.d.cts +5 -2
- package/dist/chat/accumulator.d.ts +5 -2
- package/dist/chat/accumulator.js +1 -1
- package/dist/chat/accumulator.js.map +1 -1
- package/dist/chat/backends.cjs +1084 -821
- package/dist/chat/backends.cjs.map +1 -1
- package/dist/chat/backends.d.cts +10 -6
- package/dist/chat/backends.d.ts +10 -6
- package/dist/chat/backends.js +1082 -800
- package/dist/chat/backends.js.map +1 -1
- package/dist/chat/context.cjs +50 -0
- package/dist/chat/context.cjs.map +1 -1
- package/dist/chat/context.d.cts +27 -3
- package/dist/chat/context.d.ts +27 -3
- package/dist/chat/context.js +50 -0
- package/dist/chat/context.js.map +1 -1
- package/dist/chat/core.cjs +60 -27
- package/dist/chat/core.cjs.map +1 -1
- package/dist/chat/core.d.cts +41 -382
- package/dist/chat/core.d.ts +41 -382
- package/dist/chat/core.js +58 -28
- package/dist/chat/core.js.map +1 -1
- package/dist/chat/errors.cjs +48 -26
- package/dist/chat/errors.cjs.map +1 -1
- package/dist/chat/errors.d.cts +6 -31
- package/dist/chat/errors.d.ts +6 -31
- package/dist/chat/errors.js +48 -25
- package/dist/chat/errors.js.map +1 -1
- package/dist/chat/events.cjs.map +1 -1
- package/dist/chat/events.d.cts +6 -2
- package/dist/chat/events.d.ts +6 -2
- package/dist/chat/events.js.map +1 -1
- package/dist/chat/index.cjs +1612 -1125
- package/dist/chat/index.cjs.map +1 -1
- package/dist/chat/index.d.cts +35 -10
- package/dist/chat/index.d.ts +35 -10
- package/dist/chat/index.js +1600 -1097
- package/dist/chat/index.js.map +1 -1
- package/dist/chat/react/theme.css +2517 -0
- package/dist/chat/react.cjs +2212 -1158
- package/dist/chat/react.cjs.map +1 -1
- package/dist/chat/react.d.cts +665 -122
- package/dist/chat/react.d.ts +665 -122
- package/dist/chat/react.js +2191 -1156
- package/dist/chat/react.js.map +1 -1
- package/dist/chat/runtime.cjs +405 -186
- package/dist/chat/runtime.cjs.map +1 -1
- package/dist/chat/runtime.d.cts +92 -28
- package/dist/chat/runtime.d.ts +92 -28
- package/dist/chat/runtime.js +405 -186
- package/dist/chat/runtime.js.map +1 -1
- package/dist/chat/server.cjs +2247 -212
- package/dist/chat/server.cjs.map +1 -1
- package/dist/chat/server.d.cts +451 -90
- package/dist/chat/server.d.ts +451 -90
- package/dist/chat/server.js +2234 -213
- package/dist/chat/server.js.map +1 -1
- package/dist/chat/sessions.cjs +64 -66
- package/dist/chat/sessions.cjs.map +1 -1
- package/dist/chat/sessions.d.cts +37 -118
- package/dist/chat/sessions.d.ts +37 -118
- package/dist/chat/sessions.js +65 -67
- package/dist/chat/sessions.js.map +1 -1
- package/dist/chat/sqlite.cjs +536 -0
- package/dist/chat/sqlite.cjs.map +1 -0
- package/dist/chat/sqlite.d.cts +164 -0
- package/dist/chat/sqlite.d.ts +164 -0
- package/dist/chat/sqlite.js +527 -0
- package/dist/chat/sqlite.js.map +1 -0
- package/dist/chat/state.cjs +14 -1
- package/dist/chat/state.cjs.map +1 -1
- package/dist/chat/state.d.cts +5 -2
- package/dist/chat/state.d.ts +5 -2
- package/dist/chat/state.js +14 -1
- package/dist/chat/state.js.map +1 -1
- package/dist/chat/storage.cjs +58 -33
- package/dist/chat/storage.cjs.map +1 -1
- package/dist/chat/storage.d.cts +18 -8
- package/dist/chat/storage.d.ts +18 -8
- package/dist/chat/storage.js +59 -34
- package/dist/chat/storage.js.map +1 -1
- package/dist/errors-C-so0M4t.d.cts +33 -0
- package/dist/errors-C-so0M4t.d.ts +33 -0
- package/dist/errors-CmVvczxZ.d.cts +28 -0
- package/dist/errors-CmVvczxZ.d.ts +28 -0
- package/dist/{in-process-transport-C2oPTYs6.d.ts → in-process-transport-7EIit9Xk.d.ts} +72 -33
- package/dist/{in-process-transport-DG-w5G6k.d.cts → in-process-transport-Ct9YcX8I.d.cts} +72 -33
- package/dist/index.cjs +354 -60
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +294 -123
- package/dist/index.d.ts +294 -123
- package/dist/index.js +347 -60
- package/dist/index.js.map +1 -1
- package/dist/provider-types-PTSlRPNB.d.cts +39 -0
- package/dist/provider-types-PTSlRPNB.d.ts +39 -0
- package/dist/refresh-manager-B81PpYBr.d.cts +153 -0
- package/dist/refresh-manager-Dlv_iNZi.d.ts +153 -0
- package/dist/testing.cjs +1107 -0
- package/dist/testing.cjs.map +1 -0
- package/dist/testing.d.cts +144 -0
- package/dist/testing.d.ts +144 -0
- package/dist/testing.js +1101 -0
- package/dist/testing.js.map +1 -0
- package/dist/token-store-CSUBgYwn.d.ts +48 -0
- package/dist/token-store-CuC4hB9Z.d.cts +48 -0
- package/dist/{transport-DX1Nhm4N.d.cts → transport-DLWCN18G.d.cts} +5 -4
- package/dist/{transport-D1OaUgRk.d.ts → transport-DsuS-GeM.d.ts} +5 -4
- package/dist/{types-CGF7AEX1.d.cts → types-4vbcmPTp.d.cts} +4 -2
- package/dist/{types-Bh5AhqD-.d.ts → types-BxggH0Yh.d.ts} +4 -2
- package/dist/types-DgtI1hzh.d.ts +364 -0
- package/dist/types-DkSXALKg.d.cts +364 -0
- package/package.json +41 -5
- package/LICENSE +0 -21
- package/README.md +0 -948
- package/dist/errors-BDLbNu9w.d.cts +0 -13
- package/dist/errors-BDLbNu9w.d.ts +0 -13
- package/dist/types-DLZzlJxt.d.ts +0 -39
- package/dist/types-tE0CXwBl.d.cts +0 -39
package/dist/chat/storage.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { existsSync,
|
|
1
|
+
import { existsSync, mkdirSync } from 'fs';
|
|
2
|
+
import { readdir, unlink, mkdir, access, readFile, writeFile } from 'fs/promises';
|
|
2
3
|
import { join } from 'path';
|
|
3
4
|
|
|
4
5
|
// src/chat/storage.ts
|
|
@@ -7,9 +8,18 @@ import { join } from 'path';
|
|
|
7
8
|
var AgentSDKError = class extends Error {
|
|
8
9
|
/** @internal Marker for cross-bundle identity checks */
|
|
9
10
|
_agentSDKError = true;
|
|
11
|
+
/** Machine-readable error code. Prefer values from the ErrorCode enum. */
|
|
12
|
+
code;
|
|
13
|
+
/** Whether this error is safe to retry */
|
|
14
|
+
retryable;
|
|
15
|
+
/** HTTP status code hint for error classification */
|
|
16
|
+
httpStatus;
|
|
10
17
|
constructor(message, options) {
|
|
11
18
|
super(message, options);
|
|
12
19
|
this.name = "AgentSDKError";
|
|
20
|
+
this.code = options?.code;
|
|
21
|
+
this.retryable = options?.retryable ?? false;
|
|
22
|
+
this.httpStatus = options?.httpStatus;
|
|
13
23
|
}
|
|
14
24
|
/** Check if an error is an AgentSDKError (works across bundled copies) */
|
|
15
25
|
static is(error) {
|
|
@@ -19,7 +29,7 @@ var AgentSDKError = class extends Error {
|
|
|
19
29
|
|
|
20
30
|
// src/chat/storage.ts
|
|
21
31
|
var StorageError = class extends AgentSDKError {
|
|
22
|
-
/** Machine-readable error code */
|
|
32
|
+
/** Machine-readable error code from the unified ErrorCode enum */
|
|
23
33
|
code;
|
|
24
34
|
constructor(message, code) {
|
|
25
35
|
super(message);
|
|
@@ -56,7 +66,7 @@ var InMemoryStorage = class {
|
|
|
56
66
|
if (this.data.has(key)) {
|
|
57
67
|
throw new StorageError(
|
|
58
68
|
`Item with key "${key}" already exists`,
|
|
59
|
-
"
|
|
69
|
+
"STORAGE_DUPLICATE_KEY" /* STORAGE_DUPLICATE_KEY */
|
|
60
70
|
);
|
|
61
71
|
}
|
|
62
72
|
this.data.set(key, structuredClone(item));
|
|
@@ -66,7 +76,7 @@ var InMemoryStorage = class {
|
|
|
66
76
|
if (!this.data.has(key)) {
|
|
67
77
|
throw new StorageError(
|
|
68
78
|
`Item with key "${key}" not found`,
|
|
69
|
-
"
|
|
79
|
+
"STORAGE_NOT_FOUND" /* STORAGE_NOT_FOUND */
|
|
70
80
|
);
|
|
71
81
|
}
|
|
72
82
|
this.data.set(key, structuredClone(item));
|
|
@@ -76,7 +86,7 @@ var InMemoryStorage = class {
|
|
|
76
86
|
if (!this.data.has(key)) {
|
|
77
87
|
throw new StorageError(
|
|
78
88
|
`Item with key "${key}" not found`,
|
|
79
|
-
"
|
|
89
|
+
"STORAGE_NOT_FOUND" /* STORAGE_NOT_FOUND */
|
|
80
90
|
);
|
|
81
91
|
}
|
|
82
92
|
this.data.delete(key);
|
|
@@ -100,25 +110,25 @@ var FileStorage = class {
|
|
|
100
110
|
constructor(options) {
|
|
101
111
|
this.directory = options.directory;
|
|
102
112
|
this.extension = options.extension ?? ".json";
|
|
103
|
-
this.
|
|
113
|
+
this.ensureDirectorySync();
|
|
104
114
|
}
|
|
105
115
|
/** @inheritdoc */
|
|
106
116
|
async get(key) {
|
|
107
117
|
const filePath = this.keyToPath(key);
|
|
108
|
-
if (!
|
|
118
|
+
if (!await this.fileExists(filePath)) {
|
|
109
119
|
return null;
|
|
110
120
|
}
|
|
111
|
-
return this.
|
|
121
|
+
return this.readJsonFile(filePath);
|
|
112
122
|
}
|
|
113
123
|
/** @inheritdoc */
|
|
114
124
|
async list(options) {
|
|
115
|
-
this.
|
|
116
|
-
const files =
|
|
125
|
+
await this.ensureDirectoryAsync();
|
|
126
|
+
const files = (await readdir(this.directory)).filter(
|
|
117
127
|
(f) => f.endsWith(this.extension)
|
|
118
128
|
);
|
|
119
129
|
let items = [];
|
|
120
130
|
for (const file of files) {
|
|
121
|
-
const item = this.
|
|
131
|
+
const item = await this.readJsonFile(join(this.directory, file));
|
|
122
132
|
items.push(item);
|
|
123
133
|
}
|
|
124
134
|
if (options?.filter) {
|
|
@@ -138,55 +148,55 @@ var FileStorage = class {
|
|
|
138
148
|
/** @inheritdoc */
|
|
139
149
|
async create(key, item) {
|
|
140
150
|
const filePath = this.keyToPath(key);
|
|
141
|
-
if (
|
|
151
|
+
if (await this.fileExists(filePath)) {
|
|
142
152
|
throw new StorageError(
|
|
143
153
|
`Item with key "${key}" already exists`,
|
|
144
|
-
"
|
|
154
|
+
"STORAGE_DUPLICATE_KEY" /* STORAGE_DUPLICATE_KEY */
|
|
145
155
|
);
|
|
146
156
|
}
|
|
147
|
-
this.
|
|
157
|
+
await this.writeJsonFile(filePath, item);
|
|
148
158
|
}
|
|
149
159
|
/** @inheritdoc */
|
|
150
160
|
async update(key, item) {
|
|
151
161
|
const filePath = this.keyToPath(key);
|
|
152
|
-
if (!
|
|
162
|
+
if (!await this.fileExists(filePath)) {
|
|
153
163
|
throw new StorageError(
|
|
154
164
|
`Item with key "${key}" not found`,
|
|
155
|
-
"
|
|
165
|
+
"STORAGE_NOT_FOUND" /* STORAGE_NOT_FOUND */
|
|
156
166
|
);
|
|
157
167
|
}
|
|
158
|
-
this.
|
|
168
|
+
await this.writeJsonFile(filePath, item);
|
|
159
169
|
}
|
|
160
170
|
/** @inheritdoc */
|
|
161
171
|
async delete(key) {
|
|
162
172
|
const filePath = this.keyToPath(key);
|
|
163
|
-
if (!
|
|
173
|
+
if (!await this.fileExists(filePath)) {
|
|
164
174
|
throw new StorageError(
|
|
165
175
|
`Item with key "${key}" not found`,
|
|
166
|
-
"
|
|
176
|
+
"STORAGE_NOT_FOUND" /* STORAGE_NOT_FOUND */
|
|
167
177
|
);
|
|
168
178
|
}
|
|
169
|
-
|
|
179
|
+
await unlink(filePath);
|
|
170
180
|
}
|
|
171
181
|
/** @inheritdoc */
|
|
172
182
|
async has(key) {
|
|
173
|
-
return
|
|
183
|
+
return this.fileExists(this.keyToPath(key));
|
|
174
184
|
}
|
|
175
185
|
/** @inheritdoc */
|
|
176
186
|
async count() {
|
|
177
|
-
this.
|
|
178
|
-
return
|
|
187
|
+
await this.ensureDirectoryAsync();
|
|
188
|
+
return (await readdir(this.directory)).filter(
|
|
179
189
|
(f) => f.endsWith(this.extension)
|
|
180
190
|
).length;
|
|
181
191
|
}
|
|
182
192
|
/** @inheritdoc */
|
|
183
193
|
async clear() {
|
|
184
|
-
this.
|
|
185
|
-
const files =
|
|
194
|
+
await this.ensureDirectoryAsync();
|
|
195
|
+
const files = (await readdir(this.directory)).filter(
|
|
186
196
|
(f) => f.endsWith(this.extension)
|
|
187
197
|
);
|
|
188
198
|
for (const file of files) {
|
|
189
|
-
|
|
199
|
+
await unlink(join(this.directory, file));
|
|
190
200
|
}
|
|
191
201
|
}
|
|
192
202
|
keyToPath(key) {
|
|
@@ -196,36 +206,51 @@ var FileStorage = class {
|
|
|
196
206
|
);
|
|
197
207
|
return join(this.directory, `${safeKey}${this.extension}`);
|
|
198
208
|
}
|
|
199
|
-
|
|
209
|
+
/** Sync directory init — used only in constructor (one-time). */
|
|
210
|
+
ensureDirectorySync() {
|
|
200
211
|
if (!existsSync(this.directory)) {
|
|
201
212
|
mkdirSync(this.directory, { recursive: true });
|
|
202
213
|
}
|
|
203
214
|
}
|
|
204
|
-
|
|
215
|
+
/** Async directory init — used in operations. */
|
|
216
|
+
async ensureDirectoryAsync() {
|
|
217
|
+
if (!await this.fileExists(this.directory)) {
|
|
218
|
+
await mkdir(this.directory, { recursive: true });
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
async fileExists(filePath) {
|
|
222
|
+
try {
|
|
223
|
+
await access(filePath);
|
|
224
|
+
return true;
|
|
225
|
+
} catch {
|
|
226
|
+
return false;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
async readJsonFile(filePath) {
|
|
205
230
|
try {
|
|
206
|
-
const content =
|
|
231
|
+
const content = await readFile(filePath, "utf-8");
|
|
207
232
|
return JSON.parse(content);
|
|
208
233
|
} catch (error) {
|
|
209
234
|
if (error instanceof SyntaxError) {
|
|
210
235
|
throw new StorageError(
|
|
211
236
|
`Failed to parse file: ${filePath}`,
|
|
212
|
-
"
|
|
237
|
+
"STORAGE_SERIALIZATION_ERROR" /* STORAGE_SERIALIZATION_ERROR */
|
|
213
238
|
);
|
|
214
239
|
}
|
|
215
240
|
throw new StorageError(
|
|
216
241
|
`Failed to read file: ${filePath}`,
|
|
217
|
-
"
|
|
242
|
+
"STORAGE_IO_ERROR" /* STORAGE_IO_ERROR */
|
|
218
243
|
);
|
|
219
244
|
}
|
|
220
245
|
}
|
|
221
|
-
|
|
246
|
+
async writeJsonFile(filePath, item) {
|
|
222
247
|
try {
|
|
223
248
|
const content = JSON.stringify(item, null, 2);
|
|
224
|
-
|
|
249
|
+
await writeFile(filePath, content, "utf-8");
|
|
225
250
|
} catch {
|
|
226
251
|
throw new StorageError(
|
|
227
252
|
`Failed to write file: ${filePath}`,
|
|
228
|
-
"
|
|
253
|
+
"STORAGE_IO_ERROR" /* STORAGE_IO_ERROR */
|
|
229
254
|
);
|
|
230
255
|
}
|
|
231
256
|
}
|
package/dist/chat/storage.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/errors.ts","../../src/chat/storage.ts"],"names":[],"mappings":"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","file":"storage.js","sourcesContent":["/** Base error class for agent-sdk.\n *\n * Use `AgentSDKError.is(err)` for reliable cross-module `instanceof` checks\n * (works across separately bundled entry points where `instanceof` may fail). */\nexport class AgentSDKError extends Error {\n /** @internal Marker for cross-bundle identity checks */\n readonly _agentSDKError = true as const;\n\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = \"AgentSDKError\";\n }\n\n /** Check if an error is an AgentSDKError (works across bundled copies) */\n static is(error: unknown): error is AgentSDKError {\n return (\n error instanceof Error &&\n \"_agentSDKError\" in error &&\n (error as AgentSDKError)._agentSDKError === true\n );\n }\n}\n\n/** Thrown when agent.run() is called while already running (M8 re-entrancy guard) */\nexport class ReentrancyError extends AgentSDKError {\n constructor() {\n super(\"Agent is already running. Await the current run before starting another.\");\n this.name = \"ReentrancyError\";\n }\n}\n\n/** Thrown when an operation is attempted on a disposed agent/service */\nexport class DisposedError extends AgentSDKError {\n constructor(entity: string) {\n super(`${entity} has been disposed and cannot be used.`);\n this.name = \"DisposedError\";\n }\n}\n\n/** Thrown when a backend is not found in the registry */\nexport class BackendNotFoundError extends AgentSDKError {\n constructor(backend: string) {\n super(\n `Unknown backend: \"${backend}\". ` +\n `Built-in: copilot, claude, vercel-ai. ` +\n `Custom: use registerBackend() first.`,\n );\n this.name = \"BackendNotFoundError\";\n }\n}\n\n/** Thrown when a backend is already registered */\nexport class BackendAlreadyRegisteredError extends AgentSDKError {\n constructor(backend: string) {\n super(`Backend \"${backend}\" is already registered. Use a different name or unregister first.`);\n this.name = \"BackendAlreadyRegisteredError\";\n }\n}\n\n/** Thrown when subprocess management fails */\nexport class SubprocessError extends AgentSDKError {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = \"SubprocessError\";\n }\n}\n\n/** Thrown when a required peer dependency is not installed */\nexport class DependencyError extends AgentSDKError {\n public readonly packageName: string;\n\n constructor(packageName: string) {\n super(`${packageName} is not installed. Install it: npm install ${packageName}`);\n this.name = \"DependencyError\";\n this.packageName = packageName;\n }\n}\n\n/** Thrown when an agent run is aborted */\nexport class AbortError extends AgentSDKError {\n constructor() {\n super(\"Agent run was aborted.\");\n this.name = \"AbortError\";\n }\n}\n\n/** Thrown when a tool execution fails */\nexport class ToolExecutionError extends AgentSDKError {\n public readonly toolName: string;\n\n constructor(toolName: string, message: string, options?: ErrorOptions) {\n super(`Tool \"${toolName}\" failed: ${message}`, options);\n this.name = \"ToolExecutionError\";\n this.toolName = toolName;\n }\n}\n\n/** Thrown when structured output parsing fails */\nexport class StructuredOutputError extends AgentSDKError {\n constructor(message: string, options?: ErrorOptions) {\n super(`Structured output error: ${message}`, options);\n this.name = \"StructuredOutputError\";\n }\n}\n","/**\n * @witqq/agent-sdk/chat/storage\n *\n * Generic storage adapter layer with pluggable backends.\n * Provides CRUD operations for any data type via `IStorageAdapter<T>`.\n * Implementations: `InMemoryStorage` (Map-based) and `FileStorage` (JSON files).\n */\n\nimport { existsSync, mkdirSync, readFileSync, readdirSync, unlinkSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { AgentSDKError } from \"../errors.js\";\n\n// ─── Storage Errors ────────────────────────────────────────────\n\n/**\n * Error thrown by storage operations.\n *\n * @example\n * ```typescript\n * try {\n * await store.get(\"missing-id\");\n * } catch (e) {\n * if (e instanceof StorageError && e.code === \"NOT_FOUND\") {\n * // handle missing item\n * }\n * }\n * ```\n */\nexport class StorageError extends AgentSDKError {\n /** Machine-readable error code */\n readonly code: StorageErrorCode;\n\n constructor(message: string, code: StorageErrorCode) {\n super(message);\n this.name = \"StorageError\";\n this.code = code;\n }\n}\n\n/** Possible storage error codes */\nexport type StorageErrorCode =\n | \"NOT_FOUND\"\n | \"DUPLICATE_KEY\"\n | \"IO_ERROR\"\n | \"SERIALIZATION_ERROR\";\n\n// ─── Storage Adapter Interface ─────────────────────────────────\n\n/**\n * Options for listing stored items.\n *\n * @typeParam T - The type of stored items\n */\nexport interface ListOptions<T> {\n /** Filter predicate — return `true` to include the item */\n filter?: (item: T) => boolean;\n /** Sort comparator — standard Array.sort semantics */\n sort?: (a: T, b: T) => number;\n /** Maximum number of items to return */\n limit?: number;\n /** Number of items to skip (for pagination) */\n offset?: number;\n}\n\n/**\n * Generic storage adapter for CRUD operations on any data type.\n * Items are identified by a string key.\n *\n * @typeParam T - The type of stored items\n *\n * @example\n * ```typescript\n * const store: IStorageAdapter<{ name: string }> = new InMemoryStorage();\n * await store.create(\"key1\", { name: \"Alice\" });\n * const item = await store.get(\"key1\"); // { name: \"Alice\" }\n * ```\n */\nexport interface IStorageAdapter<T> {\n /**\n * Retrieve an item by key.\n * @param key - Unique identifier\n * @returns The item, or `null` if not found\n */\n get(key: string): Promise<T | null>;\n\n /**\n * List items with optional filtering, sorting, and pagination.\n * @param options - Filter, sort, limit, offset options\n * @returns Array of matching items\n */\n list(options?: ListOptions<T>): Promise<T[]>;\n\n /**\n * Create a new item. Throws `StorageError` with code `DUPLICATE_KEY` if key exists.\n * @param key - Unique identifier\n * @param item - Data to store\n */\n create(key: string, item: T): Promise<void>;\n\n /**\n * Update an existing item. Throws `StorageError` with code `NOT_FOUND` if key missing.\n * @param key - Unique identifier\n * @param item - Updated data\n */\n update(key: string, item: T): Promise<void>;\n\n /**\n * Delete an item by key. Throws `StorageError` with code `NOT_FOUND` if key missing.\n * @param key - Unique identifier\n */\n delete(key: string): Promise<void>;\n\n /**\n * Check whether a key exists.\n * @param key - Unique identifier\n * @returns `true` if key exists\n */\n has(key: string): Promise<boolean>;\n\n /**\n * Return the number of stored items.\n * @returns Count of items\n */\n count(): Promise<number>;\n\n /**\n * Remove all items from storage.\n */\n clear(): Promise<void>;\n}\n\n// ─── InMemoryStorage ───────────────────────────────────────────\n\n/**\n * In-memory storage adapter backed by a `Map`.\n * Suitable for development, testing, and short-lived processes.\n * Data is lost when the process exits.\n *\n * @typeParam T - The type of stored items\n *\n * @example\n * ```typescript\n * const store = new InMemoryStorage<{ name: string }>();\n * await store.create(\"k1\", { name: \"Alice\" });\n * await store.create(\"k2\", { name: \"Bob\" });\n * const items = await store.list({ filter: i => i.name.startsWith(\"A\") });\n * // [{ name: \"Alice\" }]\n * ```\n */\nexport class InMemoryStorage<T> implements IStorageAdapter<T> {\n private readonly data = new Map<string, T>();\n\n /** @inheritdoc */\n async get(key: string): Promise<T | null> {\n const item = this.data.get(key);\n return item !== undefined ? structuredClone(item) : null;\n }\n\n /** @inheritdoc */\n async list(options?: ListOptions<T>): Promise<T[]> {\n let items = Array.from(this.data.values()).map((item) => structuredClone(item));\n\n if (options?.filter) {\n items = items.filter(options.filter);\n }\n if (options?.sort) {\n items.sort(options.sort);\n }\n if (options?.offset !== undefined) {\n items = items.slice(options.offset);\n }\n if (options?.limit !== undefined) {\n items = items.slice(0, options.limit);\n }\n\n return items;\n }\n\n /** @inheritdoc */\n async create(key: string, item: T): Promise<void> {\n if (this.data.has(key)) {\n throw new StorageError(\n `Item with key \"${key}\" already exists`,\n \"DUPLICATE_KEY\",\n );\n }\n this.data.set(key, structuredClone(item));\n }\n\n /** @inheritdoc */\n async update(key: string, item: T): Promise<void> {\n if (!this.data.has(key)) {\n throw new StorageError(\n `Item with key \"${key}\" not found`,\n \"NOT_FOUND\",\n );\n }\n this.data.set(key, structuredClone(item));\n }\n\n /** @inheritdoc */\n async delete(key: string): Promise<void> {\n if (!this.data.has(key)) {\n throw new StorageError(\n `Item with key \"${key}\" not found`,\n \"NOT_FOUND\",\n );\n }\n this.data.delete(key);\n }\n\n /** @inheritdoc */\n async has(key: string): Promise<boolean> {\n return this.data.has(key);\n }\n\n /** @inheritdoc */\n async count(): Promise<number> {\n return this.data.size;\n }\n\n /** @inheritdoc */\n async clear(): Promise<void> {\n this.data.clear();\n }\n}\n\n// ─── FileStorage ───────────────────────────────────────────────\n\n/**\n * Options for configuring `FileStorage`.\n */\nexport interface FileStorageOptions {\n /** Directory path where JSON files are stored */\n directory: string;\n /** File extension (default: `.json`) */\n extension?: string;\n}\n\n/**\n * File-based storage adapter that persists each item as a JSON file.\n * Suitable for local applications, CLI tools, and development.\n * Creates the storage directory if it doesn't exist.\n *\n * @typeParam T - The type of stored items (must be JSON-serializable)\n *\n * @example\n * ```typescript\n * const store = new FileStorage<ChatSession>({\n * directory: \"./data/sessions\",\n * });\n * await store.create(\"session-1\", mySession);\n * ```\n */\nexport class FileStorage<T> implements IStorageAdapter<T> {\n private readonly directory: string;\n private readonly extension: string;\n\n constructor(options: FileStorageOptions) {\n this.directory = options.directory;\n this.extension = options.extension ?? \".json\";\n this.ensureDirectory();\n }\n\n /** @inheritdoc */\n async get(key: string): Promise<T | null> {\n const filePath = this.keyToPath(key);\n if (!existsSync(filePath)) {\n return null;\n }\n return this.readFile(filePath);\n }\n\n /** @inheritdoc */\n async list(options?: ListOptions<T>): Promise<T[]> {\n this.ensureDirectory();\n const files = readdirSync(this.directory).filter((f) =>\n f.endsWith(this.extension),\n );\n\n let items: T[] = [];\n for (const file of files) {\n const item = this.readFile(join(this.directory, file));\n items.push(item);\n }\n\n if (options?.filter) {\n items = items.filter(options.filter);\n }\n if (options?.sort) {\n items.sort(options.sort);\n }\n if (options?.offset !== undefined) {\n items = items.slice(options.offset);\n }\n if (options?.limit !== undefined) {\n items = items.slice(0, options.limit);\n }\n\n return items;\n }\n\n /** @inheritdoc */\n async create(key: string, item: T): Promise<void> {\n const filePath = this.keyToPath(key);\n if (existsSync(filePath)) {\n throw new StorageError(\n `Item with key \"${key}\" already exists`,\n \"DUPLICATE_KEY\",\n );\n }\n this.writeFile(filePath, item);\n }\n\n /** @inheritdoc */\n async update(key: string, item: T): Promise<void> {\n const filePath = this.keyToPath(key);\n if (!existsSync(filePath)) {\n throw new StorageError(\n `Item with key \"${key}\" not found`,\n \"NOT_FOUND\",\n );\n }\n this.writeFile(filePath, item);\n }\n\n /** @inheritdoc */\n async delete(key: string): Promise<void> {\n const filePath = this.keyToPath(key);\n if (!existsSync(filePath)) {\n throw new StorageError(\n `Item with key \"${key}\" not found`,\n \"NOT_FOUND\",\n );\n }\n unlinkSync(filePath);\n }\n\n /** @inheritdoc */\n async has(key: string): Promise<boolean> {\n return existsSync(this.keyToPath(key));\n }\n\n /** @inheritdoc */\n async count(): Promise<number> {\n this.ensureDirectory();\n return readdirSync(this.directory).filter((f) =>\n f.endsWith(this.extension),\n ).length;\n }\n\n /** @inheritdoc */\n async clear(): Promise<void> {\n this.ensureDirectory();\n const files = readdirSync(this.directory).filter((f) =>\n f.endsWith(this.extension),\n );\n for (const file of files) {\n unlinkSync(join(this.directory, file));\n }\n }\n\n private keyToPath(key: string): string {\n const safeKey = key.replace(/[^a-zA-Z0-9_-]/g, (c) =>\n \"%\" + c.charCodeAt(0).toString(16).padStart(2, \"0\"),\n );\n return join(this.directory, `${safeKey}${this.extension}`);\n }\n\n private ensureDirectory(): void {\n if (!existsSync(this.directory)) {\n mkdirSync(this.directory, { recursive: true });\n }\n }\n\n private readFile(filePath: string): T {\n try {\n const content = readFileSync(filePath, \"utf-8\");\n return JSON.parse(content) as T;\n } catch (error) {\n if (error instanceof SyntaxError) {\n throw new StorageError(\n `Failed to parse file: ${filePath}`,\n \"SERIALIZATION_ERROR\",\n );\n }\n throw new StorageError(\n `Failed to read file: ${filePath}`,\n \"IO_ERROR\",\n );\n }\n }\n\n private writeFile(filePath: string, item: T): void {\n try {\n const content = JSON.stringify(item, null, 2);\n writeFileSync(filePath, content, \"utf-8\");\n } catch {\n throw new StorageError(\n `Failed to write file: ${filePath}`,\n \"IO_ERROR\",\n );\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/errors.ts","../../src/chat/storage.ts"],"names":[],"mappings":"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","file":"storage.js","sourcesContent":["import { ErrorCode } from \"./types/errors.js\";\n\n/** Options for constructing an AgentSDKError */\nexport interface AgentSDKErrorOptions extends ErrorOptions {\n /** Machine-readable error code */\n code?: string;\n /** Whether this error is retryable (default: false) */\n retryable?: boolean;\n /** HTTP status code hint (e.g. 401, 429, 500) */\n httpStatus?: number;\n}\n\n/** Base error class for agent-sdk.\n *\n * Use `AgentSDKError.is(err)` for reliable cross-module `instanceof` checks\n * (works across separately bundled entry points where `instanceof` may fail). */\nexport class AgentSDKError extends Error {\n /** @internal Marker for cross-bundle identity checks */\n readonly _agentSDKError = true as const;\n /** Machine-readable error code. Prefer values from the ErrorCode enum. */\n readonly code?: string;\n /** Whether this error is safe to retry */\n readonly retryable: boolean;\n /** HTTP status code hint for error classification */\n readonly httpStatus?: number;\n\n constructor(message: string, options?: AgentSDKErrorOptions) {\n super(message, options);\n this.name = \"AgentSDKError\";\n this.code = options?.code;\n this.retryable = options?.retryable ?? false;\n this.httpStatus = options?.httpStatus;\n }\n\n /** Check if an error is an AgentSDKError (works across bundled copies) */\n static is(error: unknown): error is AgentSDKError {\n return (\n error instanceof Error &&\n \"_agentSDKError\" in error &&\n (error as AgentSDKError)._agentSDKError === true\n );\n }\n}\n\n/** Thrown when agent.run() is called while already running (M8 re-entrancy guard) */\nexport class ReentrancyError extends AgentSDKError {\n constructor() {\n super(\"Agent is already running. Await the current run before starting another.\", {\n code: ErrorCode.REENTRANCY,\n });\n this.name = \"ReentrancyError\";\n }\n}\n\n/** Thrown when an operation is attempted on a disposed agent/service */\nexport class DisposedError extends AgentSDKError {\n constructor(entity: string) {\n super(`${entity} has been disposed and cannot be used.`, {\n code: ErrorCode.DISPOSED,\n });\n this.name = \"DisposedError\";\n }\n}\n\n/** Thrown when a backend is not found in the registry */\nexport class BackendNotFoundError extends AgentSDKError {\n constructor(backend: string) {\n super(\n `Unknown backend: \"${backend}\". ` +\n `Built-in: copilot, claude, vercel-ai. ` +\n `Custom: use registerBackend() first.`,\n { code: ErrorCode.BACKEND_NOT_INSTALLED },\n );\n this.name = \"BackendNotFoundError\";\n }\n}\n\n/** Thrown when a backend is already registered */\nexport class BackendAlreadyRegisteredError extends AgentSDKError {\n constructor(backend: string) {\n super(`Backend \"${backend}\" is already registered. Use a different name or unregister first.`);\n this.name = \"BackendAlreadyRegisteredError\";\n }\n}\n\n/** Thrown when subprocess management fails */\nexport class SubprocessError extends AgentSDKError {\n constructor(message: string, options?: ErrorOptions) {\n super(message, { ...options, code: ErrorCode.DEPENDENCY_MISSING });\n this.name = \"SubprocessError\";\n }\n}\n\n/** Thrown when a required peer dependency is not installed */\nexport class DependencyError extends AgentSDKError {\n public readonly packageName: string;\n\n constructor(packageName: string) {\n super(`${packageName} is not installed. Install it: npm install ${packageName}`, {\n code: ErrorCode.DEPENDENCY_MISSING,\n });\n this.name = \"DependencyError\";\n this.packageName = packageName;\n }\n}\n\n/** Thrown when an agent run is aborted */\nexport class AbortError extends AgentSDKError {\n constructor() {\n super(\"Agent run was aborted.\", { code: ErrorCode.ABORTED });\n this.name = \"AbortError\";\n }\n}\n\n/** Thrown when a tool execution fails */\nexport class ToolExecutionError extends AgentSDKError {\n public readonly toolName: string;\n\n constructor(toolName: string, message: string, options?: ErrorOptions) {\n super(`Tool \"${toolName}\" failed: ${message}`, { ...options, code: ErrorCode.TOOL_EXECUTION });\n this.name = \"ToolExecutionError\";\n this.toolName = toolName;\n }\n}\n\n/** Thrown when a stream has no activity within the configured timeout */\nexport class ActivityTimeoutError extends AgentSDKError {\n constructor(timeoutMs: number) {\n super(`Stream activity timeout: no event received within ${timeoutMs}ms.`, {\n code: ErrorCode.TIMEOUT,\n retryable: true,\n });\n this.name = \"ActivityTimeoutError\";\n }\n}\n\n/** Thrown when structured output parsing fails */\nexport class StructuredOutputError extends AgentSDKError {\n constructor(message: string, options?: ErrorOptions) {\n super(`Structured output error: ${message}`, { ...options, code: ErrorCode.INVALID_RESPONSE });\n this.name = \"StructuredOutputError\";\n }\n}\n","/**\n * @witqq/agent-sdk/chat/storage\n *\n * Generic storage adapter layer with pluggable backends.\n * Provides CRUD operations for any data type via `IStorageAdapter<T>`.\n * Implementations: `InMemoryStorage` (Map-based) and `FileStorage` (JSON files).\n */\n\nimport { existsSync, mkdirSync } from \"node:fs\";\nimport { access, mkdir, readdir, readFile, unlink, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { AgentSDKError } from \"../errors.js\";\nimport { ErrorCode } from \"../types/errors.js\";\n\n// ─── Storage Errors ────────────────────────────────────────────\n\n/**\n * Error thrown by storage operations.\n *\n * @example\n * ```typescript\n * try {\n * await store.get(\"missing-id\");\n * } catch (e) {\n * if (e instanceof StorageError && e.code === ErrorCode.STORAGE_NOT_FOUND) {\n * // handle missing item\n * }\n * }\n * ```\n */\nexport class StorageError extends AgentSDKError {\n /** Machine-readable error code from the unified ErrorCode enum */\n readonly code: StorageErrorCode;\n\n constructor(message: string, code: StorageErrorCode) {\n super(message);\n this.name = \"StorageError\";\n this.code = code;\n }\n}\n\n/** Storage-specific subset of ErrorCode */\nexport type StorageErrorCode =\n | ErrorCode.STORAGE_NOT_FOUND\n | ErrorCode.STORAGE_DUPLICATE_KEY\n | ErrorCode.STORAGE_IO_ERROR\n | ErrorCode.STORAGE_SERIALIZATION_ERROR;\n\n// ─── Storage Adapter Interface ─────────────────────────────────\n\n/**\n * Options for listing stored items.\n *\n * @typeParam T - The type of stored items\n */\nexport interface ListOptions<T> {\n /** Filter predicate — return `true` to include the item */\n filter?: (item: T) => boolean;\n /** Sort comparator — standard Array.sort semantics */\n sort?: (a: T, b: T) => number;\n /** Maximum number of items to return */\n limit?: number;\n /** Number of items to skip (for pagination) */\n offset?: number;\n}\n\n/**\n * Generic storage adapter for CRUD operations on any data type.\n * Items are identified by a string key.\n *\n * @typeParam T - The type of stored items\n *\n * @example\n * ```typescript\n * const store: IStorageAdapter<{ name: string }> = new InMemoryStorage();\n * await store.create(\"key1\", { name: \"Alice\" });\n * const item = await store.get(\"key1\"); // { name: \"Alice\" }\n * ```\n */\nexport interface IStorageAdapter<T> {\n /**\n * Retrieve an item by key.\n * @param key - Unique identifier\n * @returns The item, or `null` if not found\n */\n get(key: string): Promise<T | null>;\n\n /**\n * List items with optional filtering, sorting, and pagination.\n * @param options - Filter, sort, limit, offset options\n * @returns Array of matching items\n */\n list(options?: ListOptions<T>): Promise<T[]>;\n\n /**\n * Create a new item. Throws `StorageError` with code `DUPLICATE_KEY` if key exists.\n * @param key - Unique identifier\n * @param item - Data to store\n */\n create(key: string, item: T): Promise<void>;\n\n /**\n * Update an existing item. Throws `StorageError` with code `NOT_FOUND` if key missing.\n * @param key - Unique identifier\n * @param item - Updated data\n */\n update(key: string, item: T): Promise<void>;\n\n /**\n * Delete an item by key. Throws `StorageError` with code `NOT_FOUND` if key missing.\n * @param key - Unique identifier\n */\n delete(key: string): Promise<void>;\n\n /**\n * Check whether a key exists.\n * @param key - Unique identifier\n * @returns `true` if key exists\n */\n has(key: string): Promise<boolean>;\n\n /**\n * Return the number of stored items.\n * @returns Count of items\n */\n count(): Promise<number>;\n\n /**\n * Remove all items from storage.\n */\n clear(): Promise<void>;\n\n /**\n * Release any resources held by this adapter (DB connections, file handles).\n * Optional — adapters that don't hold resources need not implement this.\n */\n dispose?(): Promise<void>;\n}\n\n// ─── InMemoryStorage ───────────────────────────────────────────\n\n/**\n * In-memory storage adapter backed by a `Map`.\n * Suitable for development, testing, and short-lived processes.\n * Data is lost when the process exits.\n *\n * @typeParam T - The type of stored items\n *\n * @example\n * ```typescript\n * const store = new InMemoryStorage<{ name: string }>();\n * await store.create(\"k1\", { name: \"Alice\" });\n * await store.create(\"k2\", { name: \"Bob\" });\n * const items = await store.list({ filter: i => i.name.startsWith(\"A\") });\n * // [{ name: \"Alice\" }]\n * ```\n */\nexport class InMemoryStorage<T> implements IStorageAdapter<T> {\n private readonly data = new Map<string, T>();\n\n /** @inheritdoc */\n async get(key: string): Promise<T | null> {\n const item = this.data.get(key);\n return item !== undefined ? structuredClone(item) : null;\n }\n\n /** @inheritdoc */\n async list(options?: ListOptions<T>): Promise<T[]> {\n let items = Array.from(this.data.values()).map((item) => structuredClone(item));\n\n if (options?.filter) {\n items = items.filter(options.filter);\n }\n if (options?.sort) {\n items.sort(options.sort);\n }\n if (options?.offset !== undefined) {\n items = items.slice(options.offset);\n }\n if (options?.limit !== undefined) {\n items = items.slice(0, options.limit);\n }\n\n return items;\n }\n\n /** @inheritdoc */\n async create(key: string, item: T): Promise<void> {\n if (this.data.has(key)) {\n throw new StorageError(\n `Item with key \"${key}\" already exists`,\n ErrorCode.STORAGE_DUPLICATE_KEY,\n );\n }\n this.data.set(key, structuredClone(item));\n }\n\n /** @inheritdoc */\n async update(key: string, item: T): Promise<void> {\n if (!this.data.has(key)) {\n throw new StorageError(\n `Item with key \"${key}\" not found`,\n ErrorCode.STORAGE_NOT_FOUND,\n );\n }\n this.data.set(key, structuredClone(item));\n }\n\n /** @inheritdoc */\n async delete(key: string): Promise<void> {\n if (!this.data.has(key)) {\n throw new StorageError(\n `Item with key \"${key}\" not found`,\n ErrorCode.STORAGE_NOT_FOUND,\n );\n }\n this.data.delete(key);\n }\n\n /** @inheritdoc */\n async has(key: string): Promise<boolean> {\n return this.data.has(key);\n }\n\n /** @inheritdoc */\n async count(): Promise<number> {\n return this.data.size;\n }\n\n /** @inheritdoc */\n async clear(): Promise<void> {\n this.data.clear();\n }\n}\n\n// ─── FileStorage ───────────────────────────────────────────────\n\n/**\n * Options for configuring `FileStorage`.\n */\nexport interface FileStorageOptions {\n /** Directory path where JSON files are stored */\n directory: string;\n /** File extension (default: `.json`) */\n extension?: string;\n}\n\n/**\n * File-based storage adapter that persists each item as a JSON file.\n * Suitable for local applications, CLI tools, and development.\n * Creates the storage directory if it doesn't exist.\n *\n * @typeParam T - The type of stored items (must be JSON-serializable)\n *\n * @example\n * ```typescript\n * const store = new FileStorage<ChatSession>({\n * directory: \"./data/sessions\",\n * });\n * await store.create(\"session-1\", mySession);\n * ```\n */\nexport class FileStorage<T> implements IStorageAdapter<T> {\n private readonly directory: string;\n private readonly extension: string;\n\n constructor(options: FileStorageOptions) {\n this.directory = options.directory;\n this.extension = options.extension ?? \".json\";\n this.ensureDirectorySync();\n }\n\n /** @inheritdoc */\n async get(key: string): Promise<T | null> {\n const filePath = this.keyToPath(key);\n if (!(await this.fileExists(filePath))) {\n return null;\n }\n return this.readJsonFile(filePath);\n }\n\n /** @inheritdoc */\n async list(options?: ListOptions<T>): Promise<T[]> {\n await this.ensureDirectoryAsync();\n const files = (await readdir(this.directory)).filter((f) =>\n f.endsWith(this.extension),\n );\n\n let items: T[] = [];\n for (const file of files) {\n const item = await this.readJsonFile(join(this.directory, file));\n items.push(item);\n }\n\n if (options?.filter) {\n items = items.filter(options.filter);\n }\n if (options?.sort) {\n items.sort(options.sort);\n }\n if (options?.offset !== undefined) {\n items = items.slice(options.offset);\n }\n if (options?.limit !== undefined) {\n items = items.slice(0, options.limit);\n }\n\n return items;\n }\n\n /** @inheritdoc */\n async create(key: string, item: T): Promise<void> {\n const filePath = this.keyToPath(key);\n if (await this.fileExists(filePath)) {\n throw new StorageError(\n `Item with key \"${key}\" already exists`,\n ErrorCode.STORAGE_DUPLICATE_KEY,\n );\n }\n await this.writeJsonFile(filePath, item);\n }\n\n /** @inheritdoc */\n async update(key: string, item: T): Promise<void> {\n const filePath = this.keyToPath(key);\n if (!(await this.fileExists(filePath))) {\n throw new StorageError(\n `Item with key \"${key}\" not found`,\n ErrorCode.STORAGE_NOT_FOUND,\n );\n }\n await this.writeJsonFile(filePath, item);\n }\n\n /** @inheritdoc */\n async delete(key: string): Promise<void> {\n const filePath = this.keyToPath(key);\n if (!(await this.fileExists(filePath))) {\n throw new StorageError(\n `Item with key \"${key}\" not found`,\n ErrorCode.STORAGE_NOT_FOUND,\n );\n }\n await unlink(filePath);\n }\n\n /** @inheritdoc */\n async has(key: string): Promise<boolean> {\n return this.fileExists(this.keyToPath(key));\n }\n\n /** @inheritdoc */\n async count(): Promise<number> {\n await this.ensureDirectoryAsync();\n return (await readdir(this.directory)).filter((f) =>\n f.endsWith(this.extension),\n ).length;\n }\n\n /** @inheritdoc */\n async clear(): Promise<void> {\n await this.ensureDirectoryAsync();\n const files = (await readdir(this.directory)).filter((f) =>\n f.endsWith(this.extension),\n );\n for (const file of files) {\n await unlink(join(this.directory, file));\n }\n }\n\n private keyToPath(key: string): string {\n const safeKey = key.replace(/[^a-zA-Z0-9_-]/g, (c) =>\n \"%\" + c.charCodeAt(0).toString(16).padStart(2, \"0\"),\n );\n return join(this.directory, `${safeKey}${this.extension}`);\n }\n\n /** Sync directory init — used only in constructor (one-time). */\n private ensureDirectorySync(): void {\n if (!existsSync(this.directory)) {\n mkdirSync(this.directory, { recursive: true });\n }\n }\n\n /** Async directory init — used in operations. */\n private async ensureDirectoryAsync(): Promise<void> {\n if (!(await this.fileExists(this.directory))) {\n await mkdir(this.directory, { recursive: true });\n }\n }\n\n private async fileExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath);\n return true;\n } catch {\n return false;\n }\n }\n\n private async readJsonFile(filePath: string): Promise<T> {\n try {\n const content = await readFile(filePath, \"utf-8\");\n return JSON.parse(content) as T;\n } catch (error) {\n if (error instanceof SyntaxError) {\n throw new StorageError(\n `Failed to parse file: ${filePath}`,\n ErrorCode.STORAGE_SERIALIZATION_ERROR,\n );\n }\n throw new StorageError(\n `Failed to read file: ${filePath}`,\n ErrorCode.STORAGE_IO_ERROR,\n );\n }\n }\n\n private async writeJsonFile(filePath: string, item: T): Promise<void> {\n try {\n const content = JSON.stringify(item, null, 2);\n await writeFile(filePath, content, \"utf-8\");\n } catch {\n throw new StorageError(\n `Failed to write file: ${filePath}`,\n ErrorCode.STORAGE_IO_ERROR,\n );\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/** Unified error codes for all SDK errors — single source of truth. */
|
|
2
|
+
declare enum ErrorCode {
|
|
3
|
+
AUTH_EXPIRED = "AUTH_EXPIRED",
|
|
4
|
+
AUTH_INVALID = "AUTH_INVALID",
|
|
5
|
+
RATE_LIMIT = "RATE_LIMIT",
|
|
6
|
+
NETWORK = "NETWORK",
|
|
7
|
+
TIMEOUT = "TIMEOUT",
|
|
8
|
+
PROVIDER_ERROR = "PROVIDER_ERROR",
|
|
9
|
+
MODEL_NOT_FOUND = "MODEL_NOT_FOUND",
|
|
10
|
+
MODEL_OVERLOADED = "MODEL_OVERLOADED",
|
|
11
|
+
CONTEXT_OVERFLOW = "CONTEXT_OVERFLOW",
|
|
12
|
+
INVALID_INPUT = "INVALID_INPUT",
|
|
13
|
+
INVALID_RESPONSE = "INVALID_RESPONSE",
|
|
14
|
+
REENTRANCY = "REENTRANCY",
|
|
15
|
+
DISPOSED = "DISPOSED",
|
|
16
|
+
ABORTED = "ABORTED",
|
|
17
|
+
INVALID_TRANSITION = "INVALID_TRANSITION",
|
|
18
|
+
DEPENDENCY_MISSING = "DEPENDENCY_MISSING",
|
|
19
|
+
BACKEND_NOT_INSTALLED = "BACKEND_NOT_INSTALLED",
|
|
20
|
+
TOOL_EXECUTION = "TOOL_EXECUTION",
|
|
21
|
+
PERMISSION_DENIED = "PERMISSION_DENIED",
|
|
22
|
+
SESSION_NOT_FOUND = "SESSION_NOT_FOUND",
|
|
23
|
+
SESSION_EXPIRED = "SESSION_EXPIRED",
|
|
24
|
+
PROVIDER_NOT_FOUND = "PROVIDER_NOT_FOUND",
|
|
25
|
+
AUTH_REQUIRED = "AUTH_REQUIRED",
|
|
26
|
+
STORAGE_ERROR = "STORAGE_ERROR",
|
|
27
|
+
STORAGE_NOT_FOUND = "STORAGE_NOT_FOUND",
|
|
28
|
+
STORAGE_DUPLICATE_KEY = "STORAGE_DUPLICATE_KEY",
|
|
29
|
+
STORAGE_IO_ERROR = "STORAGE_IO_ERROR",
|
|
30
|
+
STORAGE_SERIALIZATION_ERROR = "STORAGE_SERIALIZATION_ERROR"
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export { ErrorCode as E };
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/** Unified error codes for all SDK errors — single source of truth. */
|
|
2
|
+
declare enum ErrorCode {
|
|
3
|
+
AUTH_EXPIRED = "AUTH_EXPIRED",
|
|
4
|
+
AUTH_INVALID = "AUTH_INVALID",
|
|
5
|
+
RATE_LIMIT = "RATE_LIMIT",
|
|
6
|
+
NETWORK = "NETWORK",
|
|
7
|
+
TIMEOUT = "TIMEOUT",
|
|
8
|
+
PROVIDER_ERROR = "PROVIDER_ERROR",
|
|
9
|
+
MODEL_NOT_FOUND = "MODEL_NOT_FOUND",
|
|
10
|
+
MODEL_OVERLOADED = "MODEL_OVERLOADED",
|
|
11
|
+
CONTEXT_OVERFLOW = "CONTEXT_OVERFLOW",
|
|
12
|
+
INVALID_INPUT = "INVALID_INPUT",
|
|
13
|
+
INVALID_RESPONSE = "INVALID_RESPONSE",
|
|
14
|
+
REENTRANCY = "REENTRANCY",
|
|
15
|
+
DISPOSED = "DISPOSED",
|
|
16
|
+
ABORTED = "ABORTED",
|
|
17
|
+
INVALID_TRANSITION = "INVALID_TRANSITION",
|
|
18
|
+
DEPENDENCY_MISSING = "DEPENDENCY_MISSING",
|
|
19
|
+
BACKEND_NOT_INSTALLED = "BACKEND_NOT_INSTALLED",
|
|
20
|
+
TOOL_EXECUTION = "TOOL_EXECUTION",
|
|
21
|
+
PERMISSION_DENIED = "PERMISSION_DENIED",
|
|
22
|
+
SESSION_NOT_FOUND = "SESSION_NOT_FOUND",
|
|
23
|
+
SESSION_EXPIRED = "SESSION_EXPIRED",
|
|
24
|
+
PROVIDER_NOT_FOUND = "PROVIDER_NOT_FOUND",
|
|
25
|
+
AUTH_REQUIRED = "AUTH_REQUIRED",
|
|
26
|
+
STORAGE_ERROR = "STORAGE_ERROR",
|
|
27
|
+
STORAGE_NOT_FOUND = "STORAGE_NOT_FOUND",
|
|
28
|
+
STORAGE_DUPLICATE_KEY = "STORAGE_DUPLICATE_KEY",
|
|
29
|
+
STORAGE_IO_ERROR = "STORAGE_IO_ERROR",
|
|
30
|
+
STORAGE_SERIALIZATION_ERROR = "STORAGE_SERIALIZATION_ERROR"
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export { ErrorCode as E };
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/** Options for constructing an AgentSDKError */
|
|
2
|
+
interface AgentSDKErrorOptions extends ErrorOptions {
|
|
3
|
+
/** Machine-readable error code */
|
|
4
|
+
code?: string;
|
|
5
|
+
/** Whether this error is retryable (default: false) */
|
|
6
|
+
retryable?: boolean;
|
|
7
|
+
/** HTTP status code hint (e.g. 401, 429, 500) */
|
|
8
|
+
httpStatus?: number;
|
|
9
|
+
}
|
|
10
|
+
/** Base error class for agent-sdk.
|
|
11
|
+
*
|
|
12
|
+
* Use `AgentSDKError.is(err)` for reliable cross-module `instanceof` checks
|
|
13
|
+
* (works across separately bundled entry points where `instanceof` may fail). */
|
|
14
|
+
declare class AgentSDKError extends Error {
|
|
15
|
+
/** @internal Marker for cross-bundle identity checks */
|
|
16
|
+
readonly _agentSDKError: true;
|
|
17
|
+
/** Machine-readable error code. Prefer values from the ErrorCode enum. */
|
|
18
|
+
readonly code?: string;
|
|
19
|
+
/** Whether this error is safe to retry */
|
|
20
|
+
readonly retryable: boolean;
|
|
21
|
+
/** HTTP status code hint for error classification */
|
|
22
|
+
readonly httpStatus?: number;
|
|
23
|
+
constructor(message: string, options?: AgentSDKErrorOptions);
|
|
24
|
+
/** Check if an error is an AgentSDKError (works across bundled copies) */
|
|
25
|
+
static is(error: unknown): error is AgentSDKError;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export { AgentSDKError as A };
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/** Options for constructing an AgentSDKError */
|
|
2
|
+
interface AgentSDKErrorOptions extends ErrorOptions {
|
|
3
|
+
/** Machine-readable error code */
|
|
4
|
+
code?: string;
|
|
5
|
+
/** Whether this error is retryable (default: false) */
|
|
6
|
+
retryable?: boolean;
|
|
7
|
+
/** HTTP status code hint (e.g. 401, 429, 500) */
|
|
8
|
+
httpStatus?: number;
|
|
9
|
+
}
|
|
10
|
+
/** Base error class for agent-sdk.
|
|
11
|
+
*
|
|
12
|
+
* Use `AgentSDKError.is(err)` for reliable cross-module `instanceof` checks
|
|
13
|
+
* (works across separately bundled entry points where `instanceof` may fail). */
|
|
14
|
+
declare class AgentSDKError extends Error {
|
|
15
|
+
/** @internal Marker for cross-bundle identity checks */
|
|
16
|
+
readonly _agentSDKError: true;
|
|
17
|
+
/** Machine-readable error code. Prefer values from the ErrorCode enum. */
|
|
18
|
+
readonly code?: string;
|
|
19
|
+
/** Whether this error is safe to retry */
|
|
20
|
+
readonly retryable: boolean;
|
|
21
|
+
/** HTTP status code hint for error classification */
|
|
22
|
+
readonly httpStatus?: number;
|
|
23
|
+
constructor(message: string, options?: AgentSDKErrorOptions);
|
|
24
|
+
/** Check if an error is an AgentSDKError (works across bundled copies) */
|
|
25
|
+
static is(error: unknown): error is AgentSDKError;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export { AgentSDKError as A };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { I as
|
|
4
|
-
import { I as IChatTransport } from './transport-
|
|
1
|
+
import { F as FullAgentConfig, I as IAgentService, c as IAgent, d as Message, M as ModelInfo } from './agent-F7oB6eKp.js';
|
|
2
|
+
import { C as CopilotBackendOptions, a as ClaudeBackendOptions, V as VercelAIBackendOptions, M as MockLLMBackendOptions } from './backends-Cno0gZjy.js';
|
|
3
|
+
import { I as IChatBackend, B as BackendAdapterOptions, g as ChatSession, S as SendMessageOptions, c as ChatMessage, a as ChatEvent, d as IResumableBackend } from './types-DgtI1hzh.js';
|
|
4
|
+
import { I as IChatTransport } from './transport-DsuS-GeM.js';
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* @witqq/agent-sdk/chat/backends/base
|
|
@@ -11,23 +11,28 @@ import { I as IChatTransport } from './transport-D1OaUgRk.js';
|
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
|
-
* Abstract base for backend adapters.
|
|
15
|
-
* Subclasses implement createService()
|
|
14
|
+
* Abstract base for backend adapters implementing IChatBackend (core only).
|
|
15
|
+
* Subclasses implement createService() for backend-specific service creation.
|
|
16
|
+
* Resume support is NOT required — subclasses can implement IResumableBackend separately.
|
|
16
17
|
*/
|
|
17
|
-
declare abstract class BaseBackendAdapter implements
|
|
18
|
+
declare abstract class BaseBackendAdapter implements IChatBackend {
|
|
18
19
|
readonly name: string;
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
protected readonly _agentConfig:
|
|
23
|
-
private
|
|
20
|
+
private _agentService;
|
|
21
|
+
private _agentServiceFactory;
|
|
22
|
+
private _disposed;
|
|
23
|
+
protected readonly _agentConfig: FullAgentConfig;
|
|
24
|
+
private _ownsService;
|
|
25
|
+
private _currentAgent;
|
|
24
26
|
constructor(name: string, options: BackendAdapterOptions);
|
|
25
27
|
/** Subclasses create their specific IAgentService */
|
|
26
28
|
protected abstract createService(): IAgentService;
|
|
27
29
|
get agentService(): IAgentService;
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
30
|
+
get currentModel(): string | undefined;
|
|
31
|
+
/**
|
|
32
|
+
* @deprecated No-op. Tools are passed per-call via SendMessageOptions.tools.
|
|
33
|
+
* Kept for backward compatibility with code that calls setTools() directly.
|
|
34
|
+
*/
|
|
35
|
+
setTools(): void;
|
|
31
36
|
sendMessage(session: ChatSession, message: string, options?: SendMessageOptions): Promise<ChatMessage>;
|
|
32
37
|
streamMessage(session: ChatSession, message: string, options?: SendMessageOptions): AsyncIterable<ChatEvent>;
|
|
33
38
|
/**
|
|
@@ -41,13 +46,37 @@ declare abstract class BaseBackendAdapter implements IBackendAdapter {
|
|
|
41
46
|
errors: string[];
|
|
42
47
|
}>;
|
|
43
48
|
dispose(): Promise<void>;
|
|
44
|
-
/** Get or create an agent
|
|
49
|
+
/** Get or create an agent. Model is passed per-call via RunOptions.
|
|
50
|
+
* Tools are passed per-call via SendMessageOptions — not baked into config.
|
|
51
|
+
* For persistent sessions, reuses agent when model matches. */
|
|
45
52
|
protected getOrCreateAgent(options?: SendMessageOptions): IAgent;
|
|
46
53
|
/** Subclasses capture backend session ID from agent after streaming */
|
|
47
54
|
protected abstract captureSessionId(agent: IAgent): void;
|
|
48
55
|
protected assertNotDisposed(): void;
|
|
49
56
|
}
|
|
50
57
|
|
|
58
|
+
/**
|
|
59
|
+
* @witqq/agent-sdk/chat/backends/resumable
|
|
60
|
+
*
|
|
61
|
+
* Abstract base for CLI-backed adapters with session resume support.
|
|
62
|
+
* Shared by CopilotChatAdapter and ClaudeChatAdapter — the only
|
|
63
|
+
* difference between them is createService() and constructor options.
|
|
64
|
+
*/
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Abstract base for backend adapters that support session resume.
|
|
68
|
+
* Handles backendSessionId tracking, canResume(), resume(), captureSessionId().
|
|
69
|
+
* Subclasses only define constructor (with backend-specific options) and createService().
|
|
70
|
+
*/
|
|
71
|
+
declare abstract class ResumableChatAdapter extends BaseBackendAdapter implements IResumableBackend {
|
|
72
|
+
private _backendSessionId;
|
|
73
|
+
constructor(name: string, options: BackendAdapterOptions);
|
|
74
|
+
get backendSessionId(): string | null;
|
|
75
|
+
canResume(): boolean;
|
|
76
|
+
resume(session: ChatSession, backendSessionId: string, options?: SendMessageOptions): AsyncIterable<ChatEvent>;
|
|
77
|
+
protected captureSessionId(agent: IAgent): void;
|
|
78
|
+
}
|
|
79
|
+
|
|
51
80
|
/**
|
|
52
81
|
* @witqq/agent-sdk/chat/backends/copilot
|
|
53
82
|
*
|
|
@@ -64,15 +93,10 @@ interface CopilotChatAdapterOptions extends BackendAdapterOptions {
|
|
|
64
93
|
* Backend adapter for GitHub Copilot CLI.
|
|
65
94
|
* Uses persistent session mode for session resume via CLI session ID.
|
|
66
95
|
*/
|
|
67
|
-
declare class CopilotChatAdapter extends
|
|
68
|
-
private _backendSessionId;
|
|
96
|
+
declare class CopilotChatAdapter extends ResumableChatAdapter {
|
|
69
97
|
private readonly _copilotOptions?;
|
|
70
98
|
constructor(options: CopilotChatAdapterOptions);
|
|
71
99
|
protected createService(): IAgentService;
|
|
72
|
-
get backendSessionId(): string | null;
|
|
73
|
-
canResume(): boolean;
|
|
74
|
-
resume(session: ChatSession, backendSessionId: string, options?: SendMessageOptions): AsyncIterable<ChatEvent>;
|
|
75
|
-
protected captureSessionId(agent: IAgent): void;
|
|
76
100
|
}
|
|
77
101
|
|
|
78
102
|
/**
|
|
@@ -91,22 +115,17 @@ interface ClaudeChatAdapterOptions extends BackendAdapterOptions {
|
|
|
91
115
|
* Backend adapter for Claude CLI.
|
|
92
116
|
* Uses persistent session mode for session resume via Claude's session_id.
|
|
93
117
|
*/
|
|
94
|
-
declare class ClaudeChatAdapter extends
|
|
95
|
-
private _backendSessionId;
|
|
118
|
+
declare class ClaudeChatAdapter extends ResumableChatAdapter {
|
|
96
119
|
private readonly _claudeOptions?;
|
|
97
120
|
constructor(options: ClaudeChatAdapterOptions);
|
|
98
121
|
protected createService(): IAgentService;
|
|
99
|
-
get backendSessionId(): string | null;
|
|
100
|
-
canResume(): boolean;
|
|
101
|
-
resume(session: ChatSession, backendSessionId: string, options?: SendMessageOptions): AsyncIterable<ChatEvent>;
|
|
102
|
-
protected captureSessionId(agent: IAgent): void;
|
|
103
122
|
}
|
|
104
123
|
|
|
105
124
|
/**
|
|
106
125
|
* @witqq/agent-sdk/chat/backends/vercel-ai
|
|
107
126
|
*
|
|
108
127
|
* VercelAIChatAdapter wraps VercelAIAgentService for chat use.
|
|
109
|
-
* Stateless adapter —
|
|
128
|
+
* Stateless adapter — implements IChatBackend only (no resume support).
|
|
110
129
|
* Each streamMessage/sendMessage creates a fresh agent (per-call session mode).
|
|
111
130
|
*/
|
|
112
131
|
|
|
@@ -118,14 +137,34 @@ interface VercelAIChatAdapterOptions extends BackendAdapterOptions {
|
|
|
118
137
|
/**
|
|
119
138
|
* Backend adapter for Vercel AI SDK (API-based).
|
|
120
139
|
* Stateless — each call creates a fresh agent. Does not support resume.
|
|
140
|
+
* Implements IChatBackend only (no IResumableBackend).
|
|
121
141
|
*/
|
|
122
142
|
declare class VercelAIChatAdapter extends BaseBackendAdapter {
|
|
123
143
|
private readonly _vercelOptions?;
|
|
124
144
|
constructor(options: VercelAIChatAdapterOptions);
|
|
125
145
|
protected createService(): IAgentService;
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
146
|
+
protected captureSessionId(_agent: IAgent): void;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* @witqq/agent-sdk/chat/backends/mock-llm
|
|
151
|
+
*
|
|
152
|
+
* MockLLMChatAdapter wraps MockLLMService for chat use.
|
|
153
|
+
* No auth, no credentials — fully deterministic testing backend.
|
|
154
|
+
*/
|
|
155
|
+
|
|
156
|
+
/** Options for creating a MockLLMChatAdapter */
|
|
157
|
+
interface MockLLMChatAdapterOptions extends BackendAdapterOptions {
|
|
158
|
+
/** MockLLM backend options (mode, latency, streaming, etc.) */
|
|
159
|
+
mockOptions?: MockLLMBackendOptions;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Backend adapter for Mock LLM.
|
|
163
|
+
* Zero-auth, deterministic, fully configurable for E2E testing.
|
|
164
|
+
*/
|
|
165
|
+
declare class MockLLMChatAdapter extends BaseBackendAdapter {
|
|
166
|
+
constructor(options: MockLLMChatAdapterOptions);
|
|
167
|
+
protected createService(): IAgentService;
|
|
129
168
|
protected captureSessionId(_agent: IAgent): void;
|
|
130
169
|
}
|
|
131
170
|
|
|
@@ -220,4 +259,4 @@ declare class InProcessChatTransport implements IChatTransport {
|
|
|
220
259
|
[Symbol.asyncIterator](): AsyncIterator<ChatEvent>;
|
|
221
260
|
}
|
|
222
261
|
|
|
223
|
-
export { BaseBackendAdapter as B, ClaudeChatAdapter as C, InProcessChatTransport as I, VercelAIChatAdapter as V,
|
|
262
|
+
export { BaseBackendAdapter as B, ClaudeChatAdapter as C, InProcessChatTransport as I, MockLLMChatAdapter as M, ResumableChatAdapter as R, VercelAIChatAdapter as V, WS_READY_STATE as W, type ClaudeChatAdapterOptions as a, CopilotChatAdapter as b, type CopilotChatAdapterOptions as c, type MockLLMChatAdapterOptions as d, type VercelAIChatAdapterOptions as e, type WebSocketLike as f, WsChatTransport as g, type WsTransportOptions as h };
|