@witqq/agent-sdk 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/README.md +433 -6
  2. package/dist/auth/index.cjs +188 -1
  3. package/dist/auth/index.cjs.map +1 -1
  4. package/dist/auth/index.d.cts +154 -138
  5. package/dist/auth/index.d.ts +154 -138
  6. package/dist/auth/index.js +188 -2
  7. package/dist/auth/index.js.map +1 -1
  8. package/dist/backends/claude.cjs +341 -22
  9. package/dist/backends/claude.cjs.map +1 -1
  10. package/dist/backends/claude.d.cts +2 -1
  11. package/dist/backends/claude.d.ts +2 -1
  12. package/dist/backends/claude.js +341 -22
  13. package/dist/backends/claude.js.map +1 -1
  14. package/dist/backends/copilot.cjs +133 -25
  15. package/dist/backends/copilot.cjs.map +1 -1
  16. package/dist/backends/copilot.d.cts +2 -1
  17. package/dist/backends/copilot.d.ts +2 -1
  18. package/dist/backends/copilot.js +133 -25
  19. package/dist/backends/copilot.js.map +1 -1
  20. package/dist/backends/vercel-ai.cjs +66 -19
  21. package/dist/backends/vercel-ai.cjs.map +1 -1
  22. package/dist/backends/vercel-ai.d.cts +1 -1
  23. package/dist/backends/vercel-ai.d.ts +1 -1
  24. package/dist/backends/vercel-ai.js +66 -19
  25. package/dist/backends/vercel-ai.js.map +1 -1
  26. package/dist/chat/accumulator.cjs +147 -0
  27. package/dist/chat/accumulator.cjs.map +1 -0
  28. package/dist/chat/accumulator.d.cts +61 -0
  29. package/dist/chat/accumulator.d.ts +61 -0
  30. package/dist/chat/accumulator.js +145 -0
  31. package/dist/chat/accumulator.js.map +1 -0
  32. package/dist/chat/backends.cjs +3534 -0
  33. package/dist/chat/backends.cjs.map +1 -0
  34. package/dist/chat/backends.d.cts +62 -0
  35. package/dist/chat/backends.d.ts +62 -0
  36. package/dist/chat/backends.js +3501 -0
  37. package/dist/chat/backends.js.map +1 -0
  38. package/dist/chat/context.cjs +230 -0
  39. package/dist/chat/context.cjs.map +1 -0
  40. package/dist/chat/context.d.cts +167 -0
  41. package/dist/chat/context.d.ts +167 -0
  42. package/dist/chat/context.js +227 -0
  43. package/dist/chat/context.js.map +1 -0
  44. package/dist/chat/core.cjs +282 -0
  45. package/dist/chat/core.cjs.map +1 -0
  46. package/dist/chat/core.d.cts +435 -0
  47. package/dist/chat/core.d.ts +435 -0
  48. package/dist/chat/core.js +261 -0
  49. package/dist/chat/core.js.map +1 -0
  50. package/dist/chat/errors.cjs +251 -0
  51. package/dist/chat/errors.cjs.map +1 -0
  52. package/dist/chat/errors.d.cts +122 -0
  53. package/dist/chat/errors.d.ts +122 -0
  54. package/dist/chat/errors.js +243 -0
  55. package/dist/chat/errors.js.map +1 -0
  56. package/dist/chat/events.cjs +203 -0
  57. package/dist/chat/events.cjs.map +1 -0
  58. package/dist/chat/events.d.cts +241 -0
  59. package/dist/chat/events.d.ts +241 -0
  60. package/dist/chat/events.js +196 -0
  61. package/dist/chat/events.js.map +1 -0
  62. package/dist/chat/index.cjs +5359 -0
  63. package/dist/chat/index.cjs.map +1 -0
  64. package/dist/chat/index.d.cts +52 -0
  65. package/dist/chat/index.d.ts +52 -0
  66. package/dist/chat/index.js +5296 -0
  67. package/dist/chat/index.js.map +1 -0
  68. package/dist/chat/react.cjs +2739 -0
  69. package/dist/chat/react.cjs.map +1 -0
  70. package/dist/chat/react.d.cts +619 -0
  71. package/dist/chat/react.d.ts +619 -0
  72. package/dist/chat/react.js +2714 -0
  73. package/dist/chat/react.js.map +1 -0
  74. package/dist/chat/runtime.cjs +1030 -0
  75. package/dist/chat/runtime.cjs.map +1 -0
  76. package/dist/chat/runtime.d.cts +118 -0
  77. package/dist/chat/runtime.d.ts +118 -0
  78. package/dist/chat/runtime.js +1028 -0
  79. package/dist/chat/runtime.js.map +1 -0
  80. package/dist/chat/server.cjs +643 -0
  81. package/dist/chat/server.cjs.map +1 -0
  82. package/dist/chat/server.d.cts +287 -0
  83. package/dist/chat/server.d.ts +287 -0
  84. package/dist/chat/server.js +617 -0
  85. package/dist/chat/server.js.map +1 -0
  86. package/dist/chat/sessions.cjs +398 -0
  87. package/dist/chat/sessions.cjs.map +1 -0
  88. package/dist/chat/sessions.d.cts +239 -0
  89. package/dist/chat/sessions.d.ts +239 -0
  90. package/dist/chat/sessions.js +394 -0
  91. package/dist/chat/sessions.js.map +1 -0
  92. package/dist/chat/state.cjs +177 -0
  93. package/dist/chat/state.cjs.map +1 -0
  94. package/dist/chat/state.d.cts +92 -0
  95. package/dist/chat/state.d.ts +92 -0
  96. package/dist/chat/state.js +167 -0
  97. package/dist/chat/state.js.map +1 -0
  98. package/dist/chat/storage.cjs +240 -0
  99. package/dist/chat/storage.cjs.map +1 -0
  100. package/dist/chat/storage.d.cts +191 -0
  101. package/dist/chat/storage.d.ts +191 -0
  102. package/dist/chat/storage.js +236 -0
  103. package/dist/chat/storage.js.map +1 -0
  104. package/dist/errors-BDLbNu9w.d.cts +13 -0
  105. package/dist/errors-BDLbNu9w.d.ts +13 -0
  106. package/dist/in-process-transport-C2oPTYs6.d.ts +223 -0
  107. package/dist/in-process-transport-DG-w5G6k.d.cts +223 -0
  108. package/dist/index.cjs +25 -13
  109. package/dist/index.cjs.map +1 -1
  110. package/dist/index.d.cts +32 -4
  111. package/dist/index.d.ts +32 -4
  112. package/dist/index.js +25 -13
  113. package/dist/index.js.map +1 -1
  114. package/dist/transport-D1OaUgRk.d.ts +67 -0
  115. package/dist/transport-DX1Nhm4N.d.cts +67 -0
  116. package/dist/types-Bh5AhqD-.d.ts +141 -0
  117. package/dist/types-CGF7AEX1.d.cts +141 -0
  118. package/dist/{types-BvwNzZCj.d.cts → types-CqvUAYxt.d.cts} +21 -3
  119. package/dist/{types-BvwNzZCj.d.ts → types-CqvUAYxt.d.ts} +21 -3
  120. package/dist/types-DLZzlJxt.d.ts +39 -0
  121. package/dist/types-tE0CXwBl.d.cts +39 -0
  122. package/package.json +149 -2
@@ -0,0 +1,236 @@
1
+ import { existsSync, readdirSync, unlinkSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
2
+ import { join } from 'path';
3
+
4
+ // src/chat/storage.ts
5
+
6
+ // src/errors.ts
7
+ var AgentSDKError = class extends Error {
8
+ /** @internal Marker for cross-bundle identity checks */
9
+ _agentSDKError = true;
10
+ constructor(message, options) {
11
+ super(message, options);
12
+ this.name = "AgentSDKError";
13
+ }
14
+ /** Check if an error is an AgentSDKError (works across bundled copies) */
15
+ static is(error) {
16
+ return error instanceof Error && "_agentSDKError" in error && error._agentSDKError === true;
17
+ }
18
+ };
19
+
20
+ // src/chat/storage.ts
21
+ var StorageError = class extends AgentSDKError {
22
+ /** Machine-readable error code */
23
+ code;
24
+ constructor(message, code) {
25
+ super(message);
26
+ this.name = "StorageError";
27
+ this.code = code;
28
+ }
29
+ };
30
+ var InMemoryStorage = class {
31
+ data = /* @__PURE__ */ new Map();
32
+ /** @inheritdoc */
33
+ async get(key) {
34
+ const item = this.data.get(key);
35
+ return item !== void 0 ? structuredClone(item) : null;
36
+ }
37
+ /** @inheritdoc */
38
+ async list(options) {
39
+ let items = Array.from(this.data.values()).map((item) => structuredClone(item));
40
+ if (options?.filter) {
41
+ items = items.filter(options.filter);
42
+ }
43
+ if (options?.sort) {
44
+ items.sort(options.sort);
45
+ }
46
+ if (options?.offset !== void 0) {
47
+ items = items.slice(options.offset);
48
+ }
49
+ if (options?.limit !== void 0) {
50
+ items = items.slice(0, options.limit);
51
+ }
52
+ return items;
53
+ }
54
+ /** @inheritdoc */
55
+ async create(key, item) {
56
+ if (this.data.has(key)) {
57
+ throw new StorageError(
58
+ `Item with key "${key}" already exists`,
59
+ "DUPLICATE_KEY"
60
+ );
61
+ }
62
+ this.data.set(key, structuredClone(item));
63
+ }
64
+ /** @inheritdoc */
65
+ async update(key, item) {
66
+ if (!this.data.has(key)) {
67
+ throw new StorageError(
68
+ `Item with key "${key}" not found`,
69
+ "NOT_FOUND"
70
+ );
71
+ }
72
+ this.data.set(key, structuredClone(item));
73
+ }
74
+ /** @inheritdoc */
75
+ async delete(key) {
76
+ if (!this.data.has(key)) {
77
+ throw new StorageError(
78
+ `Item with key "${key}" not found`,
79
+ "NOT_FOUND"
80
+ );
81
+ }
82
+ this.data.delete(key);
83
+ }
84
+ /** @inheritdoc */
85
+ async has(key) {
86
+ return this.data.has(key);
87
+ }
88
+ /** @inheritdoc */
89
+ async count() {
90
+ return this.data.size;
91
+ }
92
+ /** @inheritdoc */
93
+ async clear() {
94
+ this.data.clear();
95
+ }
96
+ };
97
+ var FileStorage = class {
98
+ directory;
99
+ extension;
100
+ constructor(options) {
101
+ this.directory = options.directory;
102
+ this.extension = options.extension ?? ".json";
103
+ this.ensureDirectory();
104
+ }
105
+ /** @inheritdoc */
106
+ async get(key) {
107
+ const filePath = this.keyToPath(key);
108
+ if (!existsSync(filePath)) {
109
+ return null;
110
+ }
111
+ return this.readFile(filePath);
112
+ }
113
+ /** @inheritdoc */
114
+ async list(options) {
115
+ this.ensureDirectory();
116
+ const files = readdirSync(this.directory).filter(
117
+ (f) => f.endsWith(this.extension)
118
+ );
119
+ let items = [];
120
+ for (const file of files) {
121
+ const item = this.readFile(join(this.directory, file));
122
+ items.push(item);
123
+ }
124
+ if (options?.filter) {
125
+ items = items.filter(options.filter);
126
+ }
127
+ if (options?.sort) {
128
+ items.sort(options.sort);
129
+ }
130
+ if (options?.offset !== void 0) {
131
+ items = items.slice(options.offset);
132
+ }
133
+ if (options?.limit !== void 0) {
134
+ items = items.slice(0, options.limit);
135
+ }
136
+ return items;
137
+ }
138
+ /** @inheritdoc */
139
+ async create(key, item) {
140
+ const filePath = this.keyToPath(key);
141
+ if (existsSync(filePath)) {
142
+ throw new StorageError(
143
+ `Item with key "${key}" already exists`,
144
+ "DUPLICATE_KEY"
145
+ );
146
+ }
147
+ this.writeFile(filePath, item);
148
+ }
149
+ /** @inheritdoc */
150
+ async update(key, item) {
151
+ const filePath = this.keyToPath(key);
152
+ if (!existsSync(filePath)) {
153
+ throw new StorageError(
154
+ `Item with key "${key}" not found`,
155
+ "NOT_FOUND"
156
+ );
157
+ }
158
+ this.writeFile(filePath, item);
159
+ }
160
+ /** @inheritdoc */
161
+ async delete(key) {
162
+ const filePath = this.keyToPath(key);
163
+ if (!existsSync(filePath)) {
164
+ throw new StorageError(
165
+ `Item with key "${key}" not found`,
166
+ "NOT_FOUND"
167
+ );
168
+ }
169
+ unlinkSync(filePath);
170
+ }
171
+ /** @inheritdoc */
172
+ async has(key) {
173
+ return existsSync(this.keyToPath(key));
174
+ }
175
+ /** @inheritdoc */
176
+ async count() {
177
+ this.ensureDirectory();
178
+ return readdirSync(this.directory).filter(
179
+ (f) => f.endsWith(this.extension)
180
+ ).length;
181
+ }
182
+ /** @inheritdoc */
183
+ async clear() {
184
+ this.ensureDirectory();
185
+ const files = readdirSync(this.directory).filter(
186
+ (f) => f.endsWith(this.extension)
187
+ );
188
+ for (const file of files) {
189
+ unlinkSync(join(this.directory, file));
190
+ }
191
+ }
192
+ keyToPath(key) {
193
+ const safeKey = key.replace(
194
+ /[^a-zA-Z0-9_-]/g,
195
+ (c) => "%" + c.charCodeAt(0).toString(16).padStart(2, "0")
196
+ );
197
+ return join(this.directory, `${safeKey}${this.extension}`);
198
+ }
199
+ ensureDirectory() {
200
+ if (!existsSync(this.directory)) {
201
+ mkdirSync(this.directory, { recursive: true });
202
+ }
203
+ }
204
+ readFile(filePath) {
205
+ try {
206
+ const content = readFileSync(filePath, "utf-8");
207
+ return JSON.parse(content);
208
+ } catch (error) {
209
+ if (error instanceof SyntaxError) {
210
+ throw new StorageError(
211
+ `Failed to parse file: ${filePath}`,
212
+ "SERIALIZATION_ERROR"
213
+ );
214
+ }
215
+ throw new StorageError(
216
+ `Failed to read file: ${filePath}`,
217
+ "IO_ERROR"
218
+ );
219
+ }
220
+ }
221
+ writeFile(filePath, item) {
222
+ try {
223
+ const content = JSON.stringify(item, null, 2);
224
+ writeFileSync(filePath, content, "utf-8");
225
+ } catch {
226
+ throw new StorageError(
227
+ `Failed to write file: ${filePath}`,
228
+ "IO_ERROR"
229
+ );
230
+ }
231
+ }
232
+ };
233
+
234
+ export { FileStorage, InMemoryStorage, StorageError };
235
+ //# sourceMappingURL=storage.js.map
236
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +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"]}
@@ -0,0 +1,13 @@
1
+ /** Base error class for agent-sdk.
2
+ *
3
+ * Use `AgentSDKError.is(err)` for reliable cross-module `instanceof` checks
4
+ * (works across separately bundled entry points where `instanceof` may fail). */
5
+ declare class AgentSDKError extends Error {
6
+ /** @internal Marker for cross-bundle identity checks */
7
+ readonly _agentSDKError: true;
8
+ constructor(message: string, options?: ErrorOptions);
9
+ /** Check if an error is an AgentSDKError (works across bundled copies) */
10
+ static is(error: unknown): error is AgentSDKError;
11
+ }
12
+
13
+ export { AgentSDKError as A };
@@ -0,0 +1,13 @@
1
+ /** Base error class for agent-sdk.
2
+ *
3
+ * Use `AgentSDKError.is(err)` for reliable cross-module `instanceof` checks
4
+ * (works across separately bundled entry points where `instanceof` may fail). */
5
+ declare class AgentSDKError extends Error {
6
+ /** @internal Marker for cross-bundle identity checks */
7
+ readonly _agentSDKError: true;
8
+ constructor(message: string, options?: ErrorOptions);
9
+ /** Check if an error is an AgentSDKError (works across bundled copies) */
10
+ static is(error: unknown): error is AgentSDKError;
11
+ }
12
+
13
+ export { AgentSDKError as A };
@@ -0,0 +1,223 @@
1
+ import { ChatSession, SendMessageOptions, ChatEvent, ChatMessage } from './chat/core.js';
2
+ import { I as IAgentService, b as IAgent, c as AgentConfig, M as Message, d as ModelInfo, C as CopilotBackendOptions, a as ClaudeBackendOptions, V as VercelAIBackendOptions } from './types-CqvUAYxt.js';
3
+ import { I as IBackendAdapter, B as BackendAdapterOptions } from './types-DLZzlJxt.js';
4
+ import { I as IChatTransport } from './transport-D1OaUgRk.js';
5
+
6
+ /**
7
+ * @witqq/agent-sdk/chat/backends/base
8
+ *
9
+ * Abstract base class for backend adapters. Provides shared lifecycle
10
+ * management, event bridge via adaptAgentEvents(), and tool forwarding.
11
+ */
12
+
13
+ /**
14
+ * Abstract base for backend adapters.
15
+ * Subclasses implement createService() and override resume behavior.
16
+ */
17
+ declare abstract class BaseBackendAdapter implements IBackendAdapter {
18
+ readonly name: string;
19
+ protected _agentService: IAgentService;
20
+ protected _agent: IAgent | null;
21
+ protected _disposed: boolean;
22
+ protected readonly _agentConfig: AgentConfig;
23
+ private readonly _ownsService;
24
+ constructor(name: string, options: BackendAdapterOptions);
25
+ /** Subclasses create their specific IAgentService */
26
+ protected abstract createService(): IAgentService;
27
+ get agentService(): IAgentService;
28
+ abstract get backendSessionId(): string | null;
29
+ abstract canResume(): boolean;
30
+ abstract resume(session: ChatSession, backendSessionId: string, options?: SendMessageOptions): AsyncIterable<ChatEvent>;
31
+ sendMessage(session: ChatSession, message: string, options?: SendMessageOptions): Promise<ChatMessage>;
32
+ streamMessage(session: ChatSession, message: string, options?: SendMessageOptions): AsyncIterable<ChatEvent>;
33
+ /**
34
+ * Shared streaming helper: bridges agent events to chat events.
35
+ * Used by both streamMessage() and resume() to avoid duplication.
36
+ */
37
+ protected streamAgentEvents(agent: IAgent, messages: Message[], options?: SendMessageOptions): AsyncIterable<ChatEvent>;
38
+ listModels(): Promise<ModelInfo[]>;
39
+ validate(): Promise<{
40
+ valid: boolean;
41
+ errors: string[];
42
+ }>;
43
+ dispose(): Promise<void>;
44
+ /** Get or create an agent, applying model override from options */
45
+ protected getOrCreateAgent(options?: SendMessageOptions): IAgent;
46
+ /** Subclasses capture backend session ID from agent after streaming */
47
+ protected abstract captureSessionId(agent: IAgent): void;
48
+ protected assertNotDisposed(): void;
49
+ }
50
+
51
+ /**
52
+ * @witqq/agent-sdk/chat/backends/copilot
53
+ *
54
+ * CopilotChatAdapter wraps CopilotAgentService for chat use.
55
+ * Supports persistent session mode for canResume/resume.
56
+ */
57
+
58
+ /** Options for creating a CopilotChatAdapter */
59
+ interface CopilotChatAdapterOptions extends BackendAdapterOptions {
60
+ /** Copilot backend options (cliPath, token, etc.) */
61
+ copilotOptions?: CopilotBackendOptions;
62
+ }
63
+ /**
64
+ * Backend adapter for GitHub Copilot CLI.
65
+ * Uses persistent session mode for session resume via CLI session ID.
66
+ */
67
+ declare class CopilotChatAdapter extends BaseBackendAdapter {
68
+ private _backendSessionId;
69
+ private readonly _copilotOptions?;
70
+ constructor(options: CopilotChatAdapterOptions);
71
+ 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
+ }
77
+
78
+ /**
79
+ * @witqq/agent-sdk/chat/backends/claude
80
+ *
81
+ * ClaudeChatAdapter wraps ClaudeAgentService for chat use.
82
+ * Supports persistent session mode with Claude's session_id for resume.
83
+ */
84
+
85
+ /** Options for creating a ClaudeChatAdapter */
86
+ interface ClaudeChatAdapterOptions extends BackendAdapterOptions {
87
+ /** Claude backend options (cliPath, model, etc.) */
88
+ claudeOptions?: ClaudeBackendOptions;
89
+ }
90
+ /**
91
+ * Backend adapter for Claude CLI.
92
+ * Uses persistent session mode for session resume via Claude's session_id.
93
+ */
94
+ declare class ClaudeChatAdapter extends BaseBackendAdapter {
95
+ private _backendSessionId;
96
+ private readonly _claudeOptions?;
97
+ constructor(options: ClaudeChatAdapterOptions);
98
+ 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
+ }
104
+
105
+ /**
106
+ * @witqq/agent-sdk/chat/backends/vercel-ai
107
+ *
108
+ * VercelAIChatAdapter wraps VercelAIAgentService for chat use.
109
+ * Stateless adapter — canResume() always returns false.
110
+ * Each streamMessage/sendMessage creates a fresh agent (per-call session mode).
111
+ */
112
+
113
+ /** Options for creating a VercelAIChatAdapter */
114
+ interface VercelAIChatAdapterOptions extends BackendAdapterOptions {
115
+ /** Vercel AI backend options (baseURL, apiKey, provider, etc.) */
116
+ vercelOptions?: VercelAIBackendOptions;
117
+ }
118
+ /**
119
+ * Backend adapter for Vercel AI SDK (API-based).
120
+ * Stateless — each call creates a fresh agent. Does not support resume.
121
+ */
122
+ declare class VercelAIChatAdapter extends BaseBackendAdapter {
123
+ private readonly _vercelOptions?;
124
+ constructor(options: VercelAIChatAdapterOptions);
125
+ protected createService(): IAgentService;
126
+ get backendSessionId(): string | null;
127
+ canResume(): boolean;
128
+ resume(_session: ChatSession, _backendSessionId: string, _options?: SendMessageOptions): AsyncIterable<ChatEvent>;
129
+ protected captureSessionId(_agent: IAgent): void;
130
+ }
131
+
132
+ /**
133
+ * @witqq/agent-sdk - WebSocket Chat Transport
134
+ *
135
+ * IChatTransport implementation over WebSocket connections.
136
+ * Accepts a WebSocket-like abstraction compatible with `ws`, native WebSocket, etc.
137
+ */
138
+
139
+ /** Ready states matching the WebSocket spec (ws, browser, Deno, Bun) */
140
+ declare const WS_READY_STATE: {
141
+ readonly CONNECTING: 0;
142
+ readonly OPEN: 1;
143
+ readonly CLOSING: 2;
144
+ readonly CLOSED: 3;
145
+ };
146
+ /**
147
+ * Minimal WebSocket interface compatible with `ws`, browser WebSocket, Deno, Bun.
148
+ * Only the methods/properties used by WsChatTransport.
149
+ */
150
+ interface WebSocketLike {
151
+ readonly readyState: number;
152
+ send(data: string): void;
153
+ close(code?: number, reason?: string): void;
154
+ addEventListener(type: "close", listener: () => void): void;
155
+ addEventListener(type: "error", listener: (err: unknown) => void): void;
156
+ }
157
+ /** Configuration options for WsChatTransport */
158
+ interface WsTransportOptions {
159
+ /** Heartbeat interval in ms. 0 or undefined disables heartbeat. */
160
+ heartbeatMs?: number;
161
+ /** Custom JSON serializer (defaults to JSON.stringify) */
162
+ serialize?: (event: ChatEvent) => string;
163
+ }
164
+ /**
165
+ * WebSocket transport for ChatEvent streaming.
166
+ * Sends events as JSON messages over a WebSocket connection.
167
+ */
168
+ declare class WsChatTransport implements IChatTransport {
169
+ private readonly ws;
170
+ private readonly serialize;
171
+ private _open;
172
+ private _heartbeatTimer;
173
+ constructor(ws: WebSocketLike, options?: WsTransportOptions);
174
+ get isOpen(): boolean;
175
+ send(event: ChatEvent): void;
176
+ close(): void;
177
+ error(err: Error): void;
178
+ private _cleanup;
179
+ private _clearHeartbeat;
180
+ }
181
+
182
+ /**
183
+ * @witqq/agent-sdk - In-Process Chat Transport
184
+ *
185
+ * IChatTransport implementation for zero-network communication.
186
+ * Events are pushed into an internal buffer and consumed via async iteration.
187
+ * Useful for testing, embedded runtimes, CLI tools, and in-process communication.
188
+ */
189
+
190
+ /**
191
+ * In-process transport for ChatEvent streaming.
192
+ * Producer pushes events via IChatTransport.send(), consumer reads via async iteration.
193
+ *
194
+ * @example
195
+ * ```ts
196
+ * const transport = new InProcessChatTransport();
197
+ *
198
+ * // Consumer side (async iteration)
199
+ * (async () => {
200
+ * for await (const event of transport) {
201
+ * console.log("Received:", event);
202
+ * }
203
+ * })();
204
+ *
205
+ * // Producer side (via streamToTransport or manual)
206
+ * transport.send({ type: "message:start", messageId, role: "assistant" });
207
+ * transport.send({ type: "message:delta", messageId, text: "Hello" });
208
+ * transport.close();
209
+ * ```
210
+ */
211
+ declare class InProcessChatTransport implements IChatTransport {
212
+ private _open;
213
+ private _buffer;
214
+ private _resolve;
215
+ private _error;
216
+ get isOpen(): boolean;
217
+ send(event: ChatEvent): void;
218
+ close(): void;
219
+ error(err: Error): void;
220
+ [Symbol.asyncIterator](): AsyncIterator<ChatEvent>;
221
+ }
222
+
223
+ export { BaseBackendAdapter as B, ClaudeChatAdapter as C, InProcessChatTransport as I, VercelAIChatAdapter as V, WsChatTransport as W, CopilotChatAdapter as a, type ClaudeChatAdapterOptions as b, type CopilotChatAdapterOptions as c, type VercelAIChatAdapterOptions as d, WS_READY_STATE as e, type WebSocketLike as f, type WsTransportOptions as g };