@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.
Files changed (154) hide show
  1. package/dist/{types-CqvUAYxt.d.ts → agent-C6H2CgJA.d.cts} +139 -102
  2. package/dist/{types-CqvUAYxt.d.cts → agent-F7oB6eKp.d.ts} +139 -102
  3. package/dist/auth/index.cjs +72 -1
  4. package/dist/auth/index.cjs.map +1 -1
  5. package/dist/auth/index.d.cts +21 -154
  6. package/dist/auth/index.d.ts +21 -154
  7. package/dist/auth/index.js +72 -1
  8. package/dist/auth/index.js.map +1 -1
  9. package/dist/backends/claude.cjs +480 -261
  10. package/dist/backends/claude.cjs.map +1 -1
  11. package/dist/backends/claude.d.cts +3 -1
  12. package/dist/backends/claude.d.ts +3 -1
  13. package/dist/backends/claude.js +480 -261
  14. package/dist/backends/claude.js.map +1 -1
  15. package/dist/backends/copilot.cjs +337 -112
  16. package/dist/backends/copilot.cjs.map +1 -1
  17. package/dist/backends/copilot.d.cts +12 -4
  18. package/dist/backends/copilot.d.ts +12 -4
  19. package/dist/backends/copilot.js +337 -112
  20. package/dist/backends/copilot.js.map +1 -1
  21. package/dist/backends/mock-llm.cjs +719 -0
  22. package/dist/backends/mock-llm.cjs.map +1 -0
  23. package/dist/backends/mock-llm.d.cts +37 -0
  24. package/dist/backends/mock-llm.d.ts +37 -0
  25. package/dist/backends/mock-llm.js +717 -0
  26. package/dist/backends/mock-llm.js.map +1 -0
  27. package/dist/backends/vercel-ai.cjs +301 -61
  28. package/dist/backends/vercel-ai.cjs.map +1 -1
  29. package/dist/backends/vercel-ai.d.cts +3 -1
  30. package/dist/backends/vercel-ai.d.ts +3 -1
  31. package/dist/backends/vercel-ai.js +301 -61
  32. package/dist/backends/vercel-ai.js.map +1 -1
  33. package/dist/backends-Cno0gZjy.d.cts +114 -0
  34. package/dist/backends-Cno0gZjy.d.ts +114 -0
  35. package/dist/chat/accumulator.cjs +1 -1
  36. package/dist/chat/accumulator.cjs.map +1 -1
  37. package/dist/chat/accumulator.d.cts +5 -2
  38. package/dist/chat/accumulator.d.ts +5 -2
  39. package/dist/chat/accumulator.js +1 -1
  40. package/dist/chat/accumulator.js.map +1 -1
  41. package/dist/chat/backends.cjs +1084 -821
  42. package/dist/chat/backends.cjs.map +1 -1
  43. package/dist/chat/backends.d.cts +10 -6
  44. package/dist/chat/backends.d.ts +10 -6
  45. package/dist/chat/backends.js +1082 -800
  46. package/dist/chat/backends.js.map +1 -1
  47. package/dist/chat/context.cjs +50 -0
  48. package/dist/chat/context.cjs.map +1 -1
  49. package/dist/chat/context.d.cts +27 -3
  50. package/dist/chat/context.d.ts +27 -3
  51. package/dist/chat/context.js +50 -0
  52. package/dist/chat/context.js.map +1 -1
  53. package/dist/chat/core.cjs +60 -27
  54. package/dist/chat/core.cjs.map +1 -1
  55. package/dist/chat/core.d.cts +41 -382
  56. package/dist/chat/core.d.ts +41 -382
  57. package/dist/chat/core.js +58 -28
  58. package/dist/chat/core.js.map +1 -1
  59. package/dist/chat/errors.cjs +48 -26
  60. package/dist/chat/errors.cjs.map +1 -1
  61. package/dist/chat/errors.d.cts +6 -31
  62. package/dist/chat/errors.d.ts +6 -31
  63. package/dist/chat/errors.js +48 -25
  64. package/dist/chat/errors.js.map +1 -1
  65. package/dist/chat/events.cjs.map +1 -1
  66. package/dist/chat/events.d.cts +6 -2
  67. package/dist/chat/events.d.ts +6 -2
  68. package/dist/chat/events.js.map +1 -1
  69. package/dist/chat/index.cjs +1612 -1125
  70. package/dist/chat/index.cjs.map +1 -1
  71. package/dist/chat/index.d.cts +35 -10
  72. package/dist/chat/index.d.ts +35 -10
  73. package/dist/chat/index.js +1600 -1097
  74. package/dist/chat/index.js.map +1 -1
  75. package/dist/chat/react/theme.css +2517 -0
  76. package/dist/chat/react.cjs +2212 -1158
  77. package/dist/chat/react.cjs.map +1 -1
  78. package/dist/chat/react.d.cts +665 -122
  79. package/dist/chat/react.d.ts +665 -122
  80. package/dist/chat/react.js +2191 -1156
  81. package/dist/chat/react.js.map +1 -1
  82. package/dist/chat/runtime.cjs +405 -186
  83. package/dist/chat/runtime.cjs.map +1 -1
  84. package/dist/chat/runtime.d.cts +92 -28
  85. package/dist/chat/runtime.d.ts +92 -28
  86. package/dist/chat/runtime.js +405 -186
  87. package/dist/chat/runtime.js.map +1 -1
  88. package/dist/chat/server.cjs +2247 -212
  89. package/dist/chat/server.cjs.map +1 -1
  90. package/dist/chat/server.d.cts +451 -90
  91. package/dist/chat/server.d.ts +451 -90
  92. package/dist/chat/server.js +2234 -213
  93. package/dist/chat/server.js.map +1 -1
  94. package/dist/chat/sessions.cjs +64 -66
  95. package/dist/chat/sessions.cjs.map +1 -1
  96. package/dist/chat/sessions.d.cts +37 -118
  97. package/dist/chat/sessions.d.ts +37 -118
  98. package/dist/chat/sessions.js +65 -67
  99. package/dist/chat/sessions.js.map +1 -1
  100. package/dist/chat/sqlite.cjs +536 -0
  101. package/dist/chat/sqlite.cjs.map +1 -0
  102. package/dist/chat/sqlite.d.cts +164 -0
  103. package/dist/chat/sqlite.d.ts +164 -0
  104. package/dist/chat/sqlite.js +527 -0
  105. package/dist/chat/sqlite.js.map +1 -0
  106. package/dist/chat/state.cjs +14 -1
  107. package/dist/chat/state.cjs.map +1 -1
  108. package/dist/chat/state.d.cts +5 -2
  109. package/dist/chat/state.d.ts +5 -2
  110. package/dist/chat/state.js +14 -1
  111. package/dist/chat/state.js.map +1 -1
  112. package/dist/chat/storage.cjs +58 -33
  113. package/dist/chat/storage.cjs.map +1 -1
  114. package/dist/chat/storage.d.cts +18 -8
  115. package/dist/chat/storage.d.ts +18 -8
  116. package/dist/chat/storage.js +59 -34
  117. package/dist/chat/storage.js.map +1 -1
  118. package/dist/errors-C-so0M4t.d.cts +33 -0
  119. package/dist/errors-C-so0M4t.d.ts +33 -0
  120. package/dist/errors-CmVvczxZ.d.cts +28 -0
  121. package/dist/errors-CmVvczxZ.d.ts +28 -0
  122. package/dist/{in-process-transport-C2oPTYs6.d.ts → in-process-transport-7EIit9Xk.d.ts} +72 -33
  123. package/dist/{in-process-transport-DG-w5G6k.d.cts → in-process-transport-Ct9YcX8I.d.cts} +72 -33
  124. package/dist/index.cjs +354 -60
  125. package/dist/index.cjs.map +1 -1
  126. package/dist/index.d.cts +294 -123
  127. package/dist/index.d.ts +294 -123
  128. package/dist/index.js +347 -60
  129. package/dist/index.js.map +1 -1
  130. package/dist/provider-types-PTSlRPNB.d.cts +39 -0
  131. package/dist/provider-types-PTSlRPNB.d.ts +39 -0
  132. package/dist/refresh-manager-B81PpYBr.d.cts +153 -0
  133. package/dist/refresh-manager-Dlv_iNZi.d.ts +153 -0
  134. package/dist/testing.cjs +1107 -0
  135. package/dist/testing.cjs.map +1 -0
  136. package/dist/testing.d.cts +144 -0
  137. package/dist/testing.d.ts +144 -0
  138. package/dist/testing.js +1101 -0
  139. package/dist/testing.js.map +1 -0
  140. package/dist/token-store-CSUBgYwn.d.ts +48 -0
  141. package/dist/token-store-CuC4hB9Z.d.cts +48 -0
  142. package/dist/{transport-DX1Nhm4N.d.cts → transport-DLWCN18G.d.cts} +5 -4
  143. package/dist/{transport-D1OaUgRk.d.ts → transport-DsuS-GeM.d.ts} +5 -4
  144. package/dist/{types-CGF7AEX1.d.cts → types-4vbcmPTp.d.cts} +4 -2
  145. package/dist/{types-Bh5AhqD-.d.ts → types-BxggH0Yh.d.ts} +4 -2
  146. package/dist/types-DgtI1hzh.d.ts +364 -0
  147. package/dist/types-DkSXALKg.d.cts +364 -0
  148. package/package.json +41 -5
  149. package/LICENSE +0 -21
  150. package/README.md +0 -948
  151. package/dist/errors-BDLbNu9w.d.cts +0 -13
  152. package/dist/errors-BDLbNu9w.d.ts +0 -13
  153. package/dist/types-DLZzlJxt.d.ts +0 -39
  154. package/dist/types-tE0CXwBl.d.cts +0 -39
@@ -1,435 +1,94 @@
1
- import { T as ToolDefinition, d as ModelInfo, U as UsageData, A as AgentEvent, M as Message, e as ToolResult } from '../types-CqvUAYxt.js';
1
+ import { c as ChatMessage, v as ToolCallPart, a as ChatEvent, g as ChatSession, F as FilePart, p as MessagePart, q as ReasoningPart, t as SourcePart, u as TextPart, b as ChatId } from '../types-DgtI1hzh.js';
2
+ export { C as ChatEventType, f as ChatIdLike, k as ChatMessageMetadata, l as ChatMessageStatus, e as ChatMiddleware, m as ChatMiddlewareContext, n as ChatRole, j as ChatSessionConfig, A as ChatSessionMetadata, o as IChatProvider, M as MessageStatus, O as ObservableSession, P as PartStatus, h as RuntimeSendOptions, R as RuntimeStatus, S as SendMessageOptions, r as SessionInfo, s as SessionStatus, T as ToolCallStatus, w as createChatId, x as createTextMessage, y as isObservableSession, z as toChatId } from '../types-DgtI1hzh.js';
3
+ import { A as AgentEvent, d as Message, e as ToolResult } from '../agent-F7oB6eKp.js';
4
+ import '../errors-C-so0M4t.js';
5
+ import '../types-BxggH0Yh.js';
6
+ import '../errors-CmVvczxZ.js';
2
7
  import 'zod';
3
8
 
4
9
  /**
5
- * @witqq/agent-sdk/chat/core
6
- *
7
- * Foundational chat types and utilities: ChatMessage, ChatSession, ChatEvent,
8
- * IChatProvider, type guards, and AgentEvent↔ChatEvent bridge functions.
10
+ * @witqq/agent-sdk — Chat utility functions
9
11
  */
10
12
 
11
- /** Branded type for unique identifiers */
12
- type ChatId = string & {
13
- readonly __brand: "ChatId";
14
- };
15
- /**
16
- * Generate a new unique ChatId (crypto.randomUUID-based)
17
- * @returns Branded ChatId string
18
- */
19
- declare function createChatId(): ChatId;
20
- /**
21
- * Cast a string to ChatId with UUID format validation.
22
- * Use this instead of manual `as ChatId` type assertions.
23
- *
24
- * @param value - String to validate and cast
25
- * @returns Branded ChatId
26
- * @throws {TypeError} If value is not a valid UUID v4 format
27
- *
28
- * @example
29
- * ```ts
30
- * const id = toChatId("550e8400-e29b-41d4-a716-446655440000");
31
- * ```
32
- */
33
- declare function toChatId(value: string): ChatId;
34
- /**
35
- * Accepts either a plain string or branded ChatId for API convenience.
36
- * Use this in public API signatures so consumers don't need `as ChatId` casts.
37
- */
38
- type ChatIdLike = string | ChatId;
39
- /** Lifecycle status of a message part (text, reasoning, etc.) */
40
- type PartStatus = "pending" | "streaming" | "complete" | "error";
41
- /** Lifecycle status of a tool call within a message */
42
- type ToolCallStatus = "pending" | "running" | "requires_approval" | "complete" | "error" | "denied";
43
- /** Lifecycle status of an entire message */
44
- type MessageStatus = "pending" | "streaming" | "complete" | "error" | "cancelled";
45
- /** Lifecycle status of a chat session */
46
- type SessionStatus = "active" | "archived";
47
- /** Lifecycle status of the chat runtime */
48
- type RuntimeStatus = "idle" | "streaming" | "error" | "disposed";
49
- /** Plain text content part */
50
- interface TextPart {
51
- type: "text";
52
- text: string;
53
- status: PartStatus;
54
- }
55
- /** Model reasoning/thinking content part */
56
- interface ReasoningPart {
57
- type: "reasoning";
58
- text: string;
59
- status: PartStatus;
60
- }
61
- /** Tool invocation part with call ID, arguments, optional result */
62
- interface ToolCallPart {
63
- type: "tool_call";
64
- toolCallId: string;
65
- name: string;
66
- args: unknown;
67
- result?: unknown;
68
- status: ToolCallStatus;
69
- error?: string;
70
- }
71
- /** Source reference part (URL citation) */
72
- interface SourcePart {
73
- type: "source";
74
- url: string;
75
- title?: string;
76
- status: PartStatus;
77
- }
78
- /** File attachment part (base64-encoded data) */
79
- interface FilePart {
80
- type: "file";
81
- name: string;
82
- mimeType: string;
83
- data: string;
84
- status: PartStatus;
85
- }
86
- /** Union of all message part types */
87
- type MessagePart = TextPart | ReasoningPart | ToolCallPart | SourcePart | FilePart;
88
- /** Role of message author */
89
- type ChatRole = "user" | "assistant" | "system";
90
- /** Metadata attached to messages — useful preset for the TMetadata generic */
91
- interface ChatMessageMetadata {
92
- model?: string;
93
- backend?: string;
94
- usage?: UsageData;
95
- isSummary?: boolean;
96
- isArchived?: boolean;
97
- estimatedTokens?: number;
98
- custom?: Record<string, unknown>;
99
- }
100
- /** Message status */
101
- type ChatMessageStatus = MessageStatus;
102
- /** A single chat message — the fundamental unit of conversation */
103
- interface ChatMessage<TMetadata = unknown> {
104
- id: ChatId;
105
- role: ChatRole;
106
- parts: MessagePart[];
107
- metadata?: TMetadata;
108
- createdAt: string;
109
- updatedAt?: string;
110
- status: MessageStatus;
111
- }
112
13
  /**
113
14
  * Join all TextPart texts in a message
114
- * @param message - The chat message to extract text from
115
- * @returns Concatenated text content
116
15
  */
117
16
  declare function getMessageText(message: ChatMessage): string;
118
17
  /**
119
18
  * Filter all ToolCallParts from a message
120
- * @param message - The chat message to extract tool calls from
121
- * @returns Array of ToolCallPart
122
19
  */
123
20
  declare function getMessageToolCalls(message: ChatMessage): ToolCallPart[];
124
21
  /**
125
22
  * Join all ReasoningPart texts in a message
126
- * @param message - The chat message to extract reasoning from
127
- * @returns Concatenated reasoning content
128
23
  */
129
24
  declare function getMessageReasoning(message: ChatMessage): string;
130
- /** Options for sending a message */
131
- interface SendOpts {
132
- sessionId?: string;
133
- model?: string;
134
- signal?: AbortSignal;
135
- metadata?: Record<string, unknown>;
136
- }
137
- /** Options for creating a new session */
138
- interface CreateSessionOpts {
139
- id?: string;
140
- title?: string;
141
- model?: string;
142
- metadata?: Record<string, unknown>;
143
- }
144
- /** Options for listing sessions with pagination */
145
- interface ListOpts {
146
- limit?: number;
147
- offset?: number;
148
- status?: SessionStatus;
149
- }
150
- /** Options for backend execution (model, tokens, tools) */
151
- interface BackendOpts {
152
- model: string;
153
- signal?: AbortSignal;
154
- systemPrompt?: string;
155
- temperature?: number;
156
- maxTokens?: number;
157
- tools?: Record<string, unknown>;
158
- providerOptions?: Record<string, unknown>;
159
- }
160
- /** Context passed to tool execute functions */
161
- interface ToolContext {
162
- sessionId: string;
163
- userId?: string;
164
- signal: AbortSignal;
165
- }
166
- /** Configuration for creating a chat runtime */
167
- interface ChatRuntimeConfig {
168
- backend: string;
169
- model?: string;
170
- apiKey?: string;
171
- baseUrl?: string;
172
- context?: {
173
- maxTokens?: number;
174
- reserveTokens?: number;
175
- strategy?: "sliding" | "summarize" | "truncate";
176
- };
177
- retry?: {
178
- maxRetries?: number;
179
- initialDelay?: number;
180
- backoffFactor?: number;
181
- };
182
- providerOptions?: Record<string, unknown>;
183
- }
184
- /** Session configuration snapshot */
185
- interface ChatSessionConfig {
186
- model: string;
187
- backend: string;
188
- systemPrompt?: string;
189
- temperature?: number;
190
- maxTokens?: number;
191
- }
192
- /** Session metadata */
193
- interface ChatSessionMetadata<TCustom extends Record<string, unknown> = Record<string, unknown>> {
194
- messageCount: number;
195
- totalTokens: number;
196
- tags?: string[];
197
- custom?: TCustom;
198
- }
199
- /** Chat session — a conversation with ordered messages */
200
- interface ChatSession<TCustom extends Record<string, unknown> = Record<string, unknown>> {
201
- id: ChatId;
202
- title?: string;
203
- messages: ChatMessage[];
204
- config: ChatSessionConfig;
205
- metadata: ChatSessionMetadata<TCustom>;
206
- status: SessionStatus;
207
- createdAt: string;
208
- updatedAt: string;
209
- backendSessionId?: string;
210
- /** Subscribe to session changes (for React useSyncExternalStore) */
211
- subscribe?(callback: () => void): () => void;
212
- /** Get immutable snapshot of session state (for React useSyncExternalStore) */
213
- getSnapshot?(): ChatSession<TCustom>;
214
- /** Last message in the session */
215
- readonly lastMessage?: ChatMessage;
216
- }
217
- /** Lightweight session info for listing (without full message array) */
218
- interface SessionInfo {
219
- id: ChatId;
220
- title?: string;
221
- status: SessionStatus;
222
- messageCount: number;
223
- lastMessage?: ChatMessage;
224
- createdAt: string;
225
- updatedAt: string;
226
- }
227
- /** Events emitted during chat operation */
228
- type ChatEvent = {
229
- type: "message:start";
230
- messageId: ChatId;
231
- role: ChatRole;
232
- } | {
233
- type: "message:delta";
234
- messageId: ChatId;
235
- text: string;
236
- } | {
237
- type: "message:complete";
238
- messageId: ChatId;
239
- message: ChatMessage;
240
- } | {
241
- type: "tool:start";
242
- messageId: ChatId;
243
- toolCallId: string;
244
- toolName: string;
245
- args: Record<string, unknown>;
246
- } | {
247
- type: "tool:complete";
248
- messageId: ChatId;
249
- toolCallId: string;
250
- toolName: string;
251
- result: unknown;
252
- isError?: boolean;
253
- } | {
254
- type: "thinking:start";
255
- messageId: ChatId;
256
- } | {
257
- type: "thinking:delta";
258
- messageId: ChatId;
259
- text: string;
260
- } | {
261
- type: "thinking:end";
262
- messageId: ChatId;
263
- } | {
264
- type: "permission:request";
265
- messageId: ChatId;
266
- toolName: string;
267
- toolArgs: Record<string, unknown>;
268
- } | {
269
- type: "permission:response";
270
- messageId: ChatId;
271
- toolName: string;
272
- allowed: boolean;
273
- } | {
274
- type: "usage";
275
- promptTokens: number;
276
- completionTokens: number;
277
- model?: string;
278
- } | {
279
- type: "session:created";
280
- sessionId: ChatId;
281
- } | {
282
- type: "session:updated";
283
- sessionId: ChatId;
284
- } | {
285
- type: "error";
286
- error: string;
287
- recoverable: boolean;
288
- messageId?: ChatId;
289
- } | {
290
- type: "typing:start";
291
- } | {
292
- type: "typing:end";
293
- } | {
294
- type: "heartbeat";
295
- } | {
296
- type: "done";
297
- finalOutput?: string;
298
- };
299
- /** All possible ChatEvent type strings */
300
- type ChatEventType = ChatEvent["type"];
301
- /** Context passed to ChatMiddleware hooks */
302
- interface ChatMiddlewareContext {
303
- sessionId: ChatId;
304
- signal: AbortSignal;
305
- }
306
- /** Runtime-level middleware for the send/receive lifecycle.
307
- * Different from EventMiddleware which operates at the event bus level. */
308
- interface ChatMiddleware {
309
- /** Transform message before sending to backend */
310
- onBeforeSend?(message: ChatMessage, context: ChatMiddlewareContext): ChatMessage | Promise<ChatMessage>;
311
- /** Transform/intercept stream events */
312
- onEvent?(event: ChatEvent, context: ChatMiddlewareContext): ChatEvent | null | Promise<ChatEvent | null>;
313
- /** Transform completed message after receiving from backend */
314
- onAfterReceive?(message: ChatMessage, context: ChatMiddlewareContext): ChatMessage | Promise<ChatMessage>;
315
- /** Intercept errors — return null to suppress, return error to propagate */
316
- onError?(error: Error, context: ChatMiddlewareContext): Error | null | Promise<Error | null>;
317
- }
318
- /** Options for sending a message to a provider */
319
- interface SendMessageOptions {
320
- signal?: AbortSignal;
321
- model?: string;
322
- context?: Record<string, unknown>;
323
- /** Additional tools to include in this request */
324
- tools?: ToolDefinition[];
325
- }
326
- /** Abstract chat provider — wraps an IAgentService for chat use */
327
- interface IChatProvider {
328
- readonly name: string;
329
- sendMessage(session: ChatSession, message: string, options?: SendMessageOptions): Promise<ChatMessage>;
330
- streamMessage(session: ChatSession, message: string, options?: SendMessageOptions): AsyncIterable<ChatEvent>;
331
- listModels(): Promise<ModelInfo[]>;
332
- validate(): Promise<{
333
- valid: boolean;
334
- errors: string[];
335
- }>;
336
- dispose(): Promise<void>;
337
- }
25
+
338
26
  /**
339
- * Check if a value is a ChatMessage
340
- * @param value - Value to check
341
- * @returns True if value has ChatMessage shape
27
+ * @witqq/agent-sdk Chat type guards
342
28
  */
29
+
30
+ /** Check if a value is a ChatMessage */
343
31
  declare function isChatMessage(value: unknown): value is ChatMessage;
344
- /**
345
- * Check if a value is a ChatSession
346
- * @param value - Value to check
347
- * @returns True if value has ChatSession shape
348
- */
32
+ /** Check if a value is a ChatSession */
349
33
  declare function isChatSession(value: unknown): value is ChatSession;
350
- /**
351
- * Check if a value is a MessagePart
352
- * @param value - Value to check
353
- * @returns True if value has MessagePart shape
354
- */
34
+ /** Check if a value is a MessagePart */
355
35
  declare function isMessagePart(value: unknown): value is MessagePart;
356
- /**
357
- * Check if a value is a TextPart
358
- * @param value - Value to check
359
- * @returns True if value is a TextPart
360
- */
36
+ /** Check if a value is a TextPart */
361
37
  declare function isTextPart(value: unknown): value is TextPart;
362
- /**
363
- * Check if a value is a ToolCallPart
364
- * @param value - Value to check
365
- * @returns True if value is a ToolCallPart
366
- */
38
+ /** Check if a value is a ToolCallPart */
367
39
  declare function isToolCallPart(value: unknown): value is ToolCallPart;
368
- /**
369
- * Check if a value is a ReasoningPart
370
- * @param value - Value to check
371
- * @returns True if value is a ReasoningPart
372
- */
40
+ /** Check if a value is a ReasoningPart */
373
41
  declare function isReasoningPart(value: unknown): value is ReasoningPart;
374
- /**
375
- * Check if a value is a SourcePart
376
- * @param value - Value to check
377
- * @returns True if value is a SourcePart
378
- */
42
+ /** Check if a value is a SourcePart */
379
43
  declare function isSourcePart(value: unknown): value is SourcePart;
380
- /**
381
- * Check if a value is a FilePart
382
- * @param value - Value to check
383
- * @returns True if value is a FilePart
384
- */
44
+ /** Check if a value is a FilePart */
385
45
  declare function isFilePart(value: unknown): value is FilePart;
46
+ /** Check if a value is a ChatEvent */
47
+ declare function isChatEvent(value: unknown): value is ChatEvent;
48
+
386
49
  /**
387
- * Check if a value is a ChatEvent
388
- * @param value - Value to check
389
- * @returns True if value has a valid ChatEvent type
50
+ * @witqq/agent-sdk AgentEvent ChatEvent bridge
390
51
  */
391
- declare function isChatEvent(value: unknown): value is ChatEvent;
52
+
392
53
  /**
393
54
  * Map a single AgentEvent to a ChatEvent (or null if no mapping)
394
- * @param event - The AgentEvent to convert
395
- * @param messageId - ChatId to associate with the event
396
- * @returns Corresponding ChatEvent or null if unmappable
397
55
  */
398
56
  declare function agentEventToChatEvent(event: AgentEvent, messageId: ChatId): ChatEvent | null;
399
57
  /**
400
58
  * Convert AgentEvent async iterable to ChatEvent async iterable
401
- * @param events - Source agent events
402
- * @param messageId - ChatId to associate with converted events
403
- * @returns Async iterable of ChatEvent (nulls filtered out)
404
59
  */
405
60
  declare function adaptAgentEvents(events: AsyncIterable<AgentEvent>, messageId: ChatId): AsyncIterable<ChatEvent>;
406
61
  /**
407
62
  * Map a ChatEvent back to an AgentEvent for accumulator consumption.
408
- * Returns null for events that don't map to accumulator-relevant AgentEvents
409
- * (e.g. message:start, message:complete, usage, permission:*, heartbeat).
410
- *
411
- * @param event - The ChatEvent to convert
412
- * @returns Corresponding AgentEvent or null if not accumulator-relevant
63
+ * Returns null for events that don't map to accumulator-relevant AgentEvents.
413
64
  */
414
65
  declare function chatEventToAgentEvent(event: ChatEvent): AgentEvent | null;
66
+
67
+ /**
68
+ * @witqq/agent-sdk — ChatMessage ↔ agent-sdk Message conversion
69
+ */
70
+
415
71
  /**
416
- * Convert a ChatMessage to agent-sdk Message format
417
- * @param message - The ChatMessage to convert
418
- * @returns agent-sdk Message
72
+ * Convert a ChatMessage to agent-sdk Message format.
73
+ * @deprecated Use toAgentMessages() which correctly handles tool results.
74
+ * This function drops tool results for assistant messages with completed tool calls.
419
75
  */
420
76
  declare function toAgentMessage(message: ChatMessage): Message;
77
+ /**
78
+ * Convert a ChatMessage to one or more agent-sdk Messages.
79
+ * For assistant messages with completed tool calls, emits both:
80
+ * 1. {role: "assistant", toolCalls: [...]} — the tool invocation
81
+ * 2. {role: "tool", toolResults: [...]} — the tool results
82
+ * This preserves tool results when replaying conversation history to backends.
83
+ */
84
+ declare function toAgentMessages(message: ChatMessage): Message[];
421
85
  /**
422
86
  * Convert an agent-sdk Message to ChatMessage
423
- * @param message - The agent-sdk Message to convert
424
- * @param id - Optional ChatId (auto-generated if omitted)
425
- * @returns ChatMessage with status "complete"
426
87
  */
427
88
  declare function fromAgentMessage(message: Message, id?: ChatId): ChatMessage;
428
89
  /**
429
90
  * Extract ToolResults from ToolCallParts that have results
430
- * @param message - The ChatMessage to extract results from
431
- * @returns Array of ToolResult for completed tool calls
432
91
  */
433
92
  declare function extractToolResults(message: ChatMessage): ToolResult[];
434
93
 
435
- export { type BackendOpts, type ChatEvent, type ChatEventType, type ChatId, type ChatIdLike, type ChatMessage, type ChatMessageMetadata, type ChatMessageStatus, type ChatMiddleware, type ChatMiddlewareContext, type ChatRole, type ChatRuntimeConfig, type ChatSession, type ChatSessionConfig, type ChatSessionMetadata, type CreateSessionOpts, type FilePart, type IChatProvider, type ListOpts, type MessagePart, type MessageStatus, type PartStatus, type ReasoningPart, type RuntimeStatus, type SendMessageOptions, type SendOpts, type SessionInfo, type SessionStatus, type SourcePart, type TextPart, type ToolCallPart, type ToolCallStatus, type ToolContext, adaptAgentEvents, agentEventToChatEvent, chatEventToAgentEvent, createChatId, extractToolResults, fromAgentMessage, getMessageReasoning, getMessageText, getMessageToolCalls, isChatEvent, isChatMessage, isChatSession, isFilePart, isMessagePart, isReasoningPart, isSourcePart, isTextPart, isToolCallPart, toAgentMessage, toChatId };
94
+ export { ChatEvent, ChatId, ChatMessage, ChatSession, FilePart, MessagePart, ReasoningPart, SourcePart, TextPart, ToolCallPart, adaptAgentEvents, agentEventToChatEvent, chatEventToAgentEvent, extractToolResults, fromAgentMessage, getMessageReasoning, getMessageText, getMessageToolCalls, isChatEvent, isChatMessage, isChatSession, isFilePart, isMessagePart, isReasoningPart, isSourcePart, isTextPart, isToolCallPart, toAgentMessage, toAgentMessages };
package/dist/chat/core.js CHANGED
@@ -1,4 +1,4 @@
1
- // src/chat/core.ts
1
+ // src/chat/types.ts
2
2
  function createChatId() {
3
3
  return crypto.randomUUID();
4
4
  }
@@ -9,6 +9,20 @@ function toChatId(value) {
9
9
  }
10
10
  return value;
11
11
  }
12
+ function createTextMessage(text, role = "user") {
13
+ return {
14
+ id: createChatId(),
15
+ role,
16
+ parts: [{ type: "text", text, status: "complete" }],
17
+ createdAt: (/* @__PURE__ */ new Date()).toISOString(),
18
+ status: "complete"
19
+ };
20
+ }
21
+ function isObservableSession(session) {
22
+ return "subscribe" in session && typeof session.subscribe === "function" && "getSnapshot" in session && typeof session.getSnapshot === "function";
23
+ }
24
+
25
+ // src/chat/chat-utils.ts
12
26
  function getMessageText(message) {
13
27
  return message.parts.filter((p) => p.type === "text").map((p) => p.text).join("");
14
28
  }
@@ -18,6 +32,8 @@ function getMessageToolCalls(message) {
18
32
  function getMessageReasoning(message) {
19
33
  return message.parts.filter((p) => p.type === "reasoning").map((p) => p.text).join("");
20
34
  }
35
+
36
+ // src/chat/guards.ts
21
37
  function isChatMessage(value) {
22
38
  if (typeof value !== "object" || value === null) return false;
23
39
  const obj = value;
@@ -58,31 +74,33 @@ function isFilePart(value) {
58
74
  const obj = value;
59
75
  return obj.type === "file" && typeof obj.name === "string" && typeof obj.mimeType === "string";
60
76
  }
77
+ var VALID_CHAT_EVENT_TYPES = /* @__PURE__ */ new Set([
78
+ "message:start",
79
+ "message:delta",
80
+ "message:complete",
81
+ "tool:start",
82
+ "tool:complete",
83
+ "thinking:start",
84
+ "thinking:delta",
85
+ "thinking:end",
86
+ "permission:request",
87
+ "permission:response",
88
+ "usage",
89
+ "session:created",
90
+ "session:updated",
91
+ "error",
92
+ "typing:start",
93
+ "typing:end",
94
+ "heartbeat",
95
+ "done"
96
+ ]);
61
97
  function isChatEvent(value) {
62
98
  if (typeof value !== "object" || value === null) return false;
63
99
  const obj = value;
64
- const validTypes = [
65
- "message:start",
66
- "message:delta",
67
- "message:complete",
68
- "tool:start",
69
- "tool:complete",
70
- "thinking:start",
71
- "thinking:delta",
72
- "thinking:end",
73
- "permission:request",
74
- "permission:response",
75
- "usage",
76
- "session:created",
77
- "session:updated",
78
- "error",
79
- "typing:start",
80
- "typing:end",
81
- "heartbeat",
82
- "done"
83
- ];
84
- return validTypes.includes(obj.type);
100
+ return VALID_CHAT_EVENT_TYPES.has(obj.type);
85
101
  }
102
+
103
+ // src/chat/bridge.ts
86
104
  function agentEventToChatEvent(event, messageId) {
87
105
  switch (event.type) {
88
106
  case "text_delta":
@@ -135,6 +153,7 @@ function agentEventToChatEvent(event, messageId) {
135
153
  type: "error",
136
154
  error: event.error,
137
155
  recoverable: event.recoverable,
156
+ code: event.code,
138
157
  messageId
139
158
  };
140
159
  case "heartbeat":
@@ -142,8 +161,9 @@ function agentEventToChatEvent(event, messageId) {
142
161
  case "ask_user":
143
162
  case "ask_user_response":
144
163
  case "session_info":
145
- case "done":
146
164
  return null;
165
+ case "done":
166
+ return { type: "done", finalOutput: event.finalOutput ?? void 0, finishReason: event.finishReason };
147
167
  default:
148
168
  return null;
149
169
  }
@@ -181,27 +201,37 @@ function chatEventToAgentEvent(event) {
181
201
  result: event.result
182
202
  };
183
203
  case "error":
184
- return { type: "error", error: event.error, recoverable: event.recoverable };
204
+ return { type: "error", error: event.error, recoverable: event.recoverable, code: event.code };
185
205
  default:
186
206
  return null;
187
207
  }
188
208
  }
209
+
210
+ // src/chat/conversion.ts
189
211
  function toAgentMessage(message) {
212
+ return toAgentMessages(message)[0];
213
+ }
214
+ function toAgentMessages(message) {
190
215
  const textContent = getMessageText(message);
191
216
  const toolCallParts = getMessageToolCalls(message);
192
217
  switch (message.role) {
193
218
  case "user":
194
- return { role: "user", content: textContent };
219
+ return [{ role: "user", content: textContent }];
195
220
  case "assistant": {
196
221
  const toolCalls = toolCallParts.length > 0 ? toolCallParts.map((p) => ({ id: p.toolCallId, name: p.name, args: p.args })) : void 0;
197
- return {
222
+ const assistantMsg = {
198
223
  role: "assistant",
199
224
  content: textContent,
200
225
  toolCalls
201
226
  };
227
+ const toolResults = extractToolResults(message);
228
+ if (toolResults.length > 0) {
229
+ return [assistantMsg, { role: "tool", toolResults }];
230
+ }
231
+ return [assistantMsg];
202
232
  }
203
233
  case "system":
204
- return { role: "system", content: textContent };
234
+ return [{ role: "system", content: textContent }];
205
235
  }
206
236
  }
207
237
  function fromAgentMessage(message, id) {
@@ -256,6 +286,6 @@ function extractToolResults(message) {
256
286
  }));
257
287
  }
258
288
 
259
- export { adaptAgentEvents, agentEventToChatEvent, chatEventToAgentEvent, createChatId, extractToolResults, fromAgentMessage, getMessageReasoning, getMessageText, getMessageToolCalls, isChatEvent, isChatMessage, isChatSession, isFilePart, isMessagePart, isReasoningPart, isSourcePart, isTextPart, isToolCallPart, toAgentMessage, toChatId };
289
+ export { adaptAgentEvents, agentEventToChatEvent, chatEventToAgentEvent, createChatId, createTextMessage, extractToolResults, fromAgentMessage, getMessageReasoning, getMessageText, getMessageToolCalls, isChatEvent, isChatMessage, isChatSession, isFilePart, isMessagePart, isObservableSession, isReasoningPart, isSourcePart, isTextPart, isToolCallPart, toAgentMessage, toAgentMessages, toChatId };
260
290
  //# sourceMappingURL=core.js.map
261
291
  //# sourceMappingURL=core.js.map