@agentscope-ai/agentscope 0.0.3 → 0.0.5

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 (65) hide show
  1. package/dist/agent/index.d.mts +7 -7
  2. package/dist/agent/index.d.ts +7 -7
  3. package/dist/agent/index.js +14 -7
  4. package/dist/agent/index.js.map +1 -1
  5. package/dist/agent/index.mjs +14 -7
  6. package/dist/agent/index.mjs.map +1 -1
  7. package/dist/{base-Dh5vEBQD.d.mts → base-BB9eTlit.d.mts} +1 -1
  8. package/dist/{base-D9uCcDjZ.d.mts → base-BDyDUIhj.d.mts} +3 -3
  9. package/dist/{base-Bo8TzBQq.d.mts → base-BI5s2ksj.d.mts} +2 -2
  10. package/dist/{base-t7G4uaR_.d.ts → base-CFDeoJRe.d.ts} +2 -2
  11. package/dist/{base-Co-MzdN5.d.ts → base-DHtZCg94.d.ts} +1 -1
  12. package/dist/{base-TYjCCv7T.d.ts → base-qmU135_k.d.ts} +3 -3
  13. package/dist/{block-7fd6byyN.d.mts → block-BqWf-Qcb.d.mts} +19 -3
  14. package/dist/{block-7fd6byyN.d.ts → block-BqWf-Qcb.d.ts} +19 -3
  15. package/dist/event/index.d.mts +1 -14
  16. package/dist/event/index.d.ts +1 -14
  17. package/dist/formatter/index.d.mts +4 -3
  18. package/dist/formatter/index.d.ts +4 -3
  19. package/dist/formatter/index.js.map +1 -1
  20. package/dist/formatter/index.mjs.map +1 -1
  21. package/dist/{index-DaopL-Vp.d.ts → index-9YC8onn7.d.ts} +1 -1
  22. package/dist/{index-BVNbIN62.d.mts → index-DpRGxYeT.d.mts} +1 -1
  23. package/dist/mcp/index.d.mts +2 -2
  24. package/dist/mcp/index.d.ts +2 -2
  25. package/dist/message/index.d.mts +3 -2
  26. package/dist/message/index.d.ts +3 -2
  27. package/dist/message/index.js +181 -0
  28. package/dist/message/index.js.map +1 -1
  29. package/dist/message/index.mjs +180 -0
  30. package/dist/message/index.mjs.map +1 -1
  31. package/dist/{message-CYnHiEVt.d.mts → message-D-LObC06.d.mts} +13 -2
  32. package/dist/{message-DZN7LetB.d.ts → message-DU0_qm3u.d.ts} +13 -2
  33. package/dist/model/index.d.mts +6 -5
  34. package/dist/model/index.d.ts +6 -5
  35. package/dist/model/index.js +22 -11
  36. package/dist/model/index.js.map +1 -1
  37. package/dist/model/index.mjs +22 -11
  38. package/dist/model/index.mjs.map +1 -1
  39. package/dist/storage/index.d.mts +4 -3
  40. package/dist/storage/index.d.ts +4 -3
  41. package/dist/tool/index.d.mts +4 -4
  42. package/dist/tool/index.d.ts +4 -4
  43. package/dist/{toolkit-BuMTkbGg.d.ts → toolkit-CLGa-xW0.d.ts} +2 -2
  44. package/dist/{toolkit-CH9qKAy9.d.mts → toolkit-DvER4yhm.d.mts} +2 -2
  45. package/package.json +1 -1
  46. package/src/agent/agent.test.ts +41 -8
  47. package/src/agent/agent.ts +15 -9
  48. package/src/formatter/dashscope-chat-formatter.test.ts +3 -0
  49. package/src/formatter/openai-chat-formatter.test.ts +9 -1
  50. package/src/mcp/http.test.ts +2 -0
  51. package/src/mcp/stdio.test.ts +1 -0
  52. package/src/message/append-event.test.ts +783 -0
  53. package/src/message/block.ts +9 -2
  54. package/src/message/index.ts +3 -0
  55. package/src/message/message.test.ts +2 -0
  56. package/src/message/message.ts +227 -0
  57. package/src/model/dashscope-model.test.ts +4 -0
  58. package/src/model/dashscope-model.ts +3 -0
  59. package/src/model/deepseek-model.test.ts +2 -0
  60. package/src/model/deepseek-model.ts +3 -0
  61. package/src/model/ollama-model.test.ts +1 -0
  62. package/src/model/ollama-model.ts +2 -0
  63. package/src/model/openai-model.ts +3 -0
  64. package/src/storage/file-system.test.ts +1 -0
  65. package/src/tool/toolkit.test.ts +12 -0
@@ -49,6 +49,185 @@ function getContentBlocks(msg, blockType) {
49
49
  if (!blockType) return msg.content;
50
50
  return msg.content.filter((block) => block.type === blockType);
51
51
  }
52
+ function findBlock(msg, blockType, blockId) {
53
+ return msg.content.find((block) => block.type === blockType && block.id === blockId);
54
+ }
55
+ function appendEvent(msg, event) {
56
+ if (!("reply_id" in event)) return msg;
57
+ if (event.reply_id !== msg.id) {
58
+ console.warn(
59
+ `Event reply_id "${event.reply_id}" does not match message id "${msg.id}", skipping.`
60
+ );
61
+ return msg;
62
+ }
63
+ switch (event.type) {
64
+ case "REPLY_END" /* REPLY_END */:
65
+ msg.finished_at = event.created_at;
66
+ break;
67
+ case "TEXT_BLOCK_START" /* TEXT_BLOCK_START */:
68
+ msg.content.push({ type: "text", id: event.block_id, text: "" });
69
+ break;
70
+ case "TEXT_BLOCK_DELTA" /* TEXT_BLOCK_DELTA */: {
71
+ const block = findBlock(msg, "text", event.block_id);
72
+ if (!block) {
73
+ console.warn(`TextBlock "${event.block_id}" not found, skipping.`);
74
+ } else {
75
+ block.text += event.delta;
76
+ }
77
+ break;
78
+ }
79
+ case "TEXT_BLOCK_END" /* TEXT_BLOCK_END */:
80
+ break;
81
+ case "THINKING_BLOCK_START" /* THINKING_BLOCK_START */:
82
+ msg.content.push({ type: "thinking", id: event.block_id, thinking: "" });
83
+ break;
84
+ case "THINKING_BLOCK_DELTA" /* THINKING_BLOCK_DELTA */: {
85
+ const block = findBlock(msg, "thinking", event.block_id);
86
+ if (!block) {
87
+ console.warn(`ThinkingBlock "${event.block_id}" not found, skipping.`);
88
+ } else {
89
+ block.thinking += event.delta;
90
+ }
91
+ break;
92
+ }
93
+ case "THINKING_BLOCK_END" /* THINKING_BLOCK_END */:
94
+ break;
95
+ case "DATA_BLOCK_START" /* DATA_BLOCK_START */:
96
+ msg.content.push({
97
+ type: "data",
98
+ id: event.block_id,
99
+ source: { type: "base64", data: "", media_type: event.media_type }
100
+ });
101
+ break;
102
+ case "DATA_BLOCK_DELTA" /* DATA_BLOCK_DELTA */: {
103
+ const block = findBlock(msg, "data", event.block_id);
104
+ if (!block) {
105
+ console.warn(`DataBlock "${event.block_id}" not found, skipping.`);
106
+ } else {
107
+ block.source.data += event.data;
108
+ }
109
+ break;
110
+ }
111
+ case "DATA_BLOCK_END" /* DATA_BLOCK_END */:
112
+ break;
113
+ case "TOOL_CALL_START" /* TOOL_CALL_START */:
114
+ msg.content.push({
115
+ type: "tool_call",
116
+ id: event.tool_call_id,
117
+ name: event.tool_call_name,
118
+ input: "",
119
+ state: "pending"
120
+ });
121
+ break;
122
+ case "TOOL_CALL_DELTA" /* TOOL_CALL_DELTA */: {
123
+ const block = findBlock(msg, "tool_call", event.tool_call_id);
124
+ if (!block) {
125
+ console.warn(`ToolCallBlock "${event.tool_call_id}" not found, skipping.`);
126
+ } else {
127
+ block.input += event.delta;
128
+ }
129
+ break;
130
+ }
131
+ case "TOOL_CALL_END" /* TOOL_CALL_END */:
132
+ break;
133
+ case "TOOL_RESULT_START" /* TOOL_RESULT_START */:
134
+ msg.content.push({
135
+ type: "tool_result",
136
+ id: event.tool_call_id,
137
+ name: event.tool_call_name,
138
+ output: [],
139
+ state: "running"
140
+ });
141
+ break;
142
+ case "TOOL_RESULT_TEXT_DELTA" /* TOOL_RESULT_TEXT_DELTA */: {
143
+ const block = findBlock(msg, "tool_result", event.tool_call_id);
144
+ if (!block) {
145
+ console.warn(`ToolResultBlock "${event.tool_call_id}" not found, skipping.`);
146
+ } else {
147
+ const trb = block;
148
+ if (typeof trb.output === "string") {
149
+ trb.output = [{ type: "text", id: crypto.randomUUID(), text: trb.output }];
150
+ }
151
+ const last = trb.output[trb.output.length - 1];
152
+ if (!last || last.type !== "text") {
153
+ trb.output.push({
154
+ type: "text",
155
+ id: event.block_id ?? crypto.randomUUID(),
156
+ text: event.delta
157
+ });
158
+ } else {
159
+ last.text += event.delta;
160
+ }
161
+ }
162
+ break;
163
+ }
164
+ case "TOOL_RESULT_DATA_DELTA" /* TOOL_RESULT_DATA_DELTA */: {
165
+ const block = findBlock(msg, "tool_result", event.tool_call_id);
166
+ if (!block) {
167
+ console.warn(`ToolResultBlock "${event.tool_call_id}" not found, skipping.`);
168
+ } else {
169
+ const trb = block;
170
+ if (typeof trb.output === "string") {
171
+ trb.output = [{ type: "text", id: crypto.randomUUID(), text: trb.output }];
172
+ }
173
+ const source = event.data != null ? { type: "base64", data: event.data, media_type: event.media_type } : { type: "url", url: event.url, media_type: event.media_type };
174
+ trb.output.push({ type: "data", id: event.block_id, source });
175
+ }
176
+ break;
177
+ }
178
+ case "TOOL_RESULT_END" /* TOOL_RESULT_END */: {
179
+ const block = findBlock(msg, "tool_result", event.tool_call_id);
180
+ if (!block) {
181
+ console.warn(`ToolResultBlock "${event.tool_call_id}" not found, skipping.`);
182
+ } else {
183
+ block.state = event.state;
184
+ }
185
+ break;
186
+ }
187
+ case "MODEL_CALL_END" /* MODEL_CALL_END */:
188
+ if (msg.usage) {
189
+ msg.usage.inputTokens += event.input_tokens;
190
+ msg.usage.outputTokens += event.output_tokens;
191
+ } else {
192
+ msg.usage = {
193
+ inputTokens: event.input_tokens,
194
+ outputTokens: event.output_tokens
195
+ };
196
+ }
197
+ break;
198
+ case "REQUIRE_USER_CONFIRM" /* REQUIRE_USER_CONFIRM */:
199
+ for (const tc of event.tool_calls) {
200
+ const b = findBlock(msg, "tool_call", tc.id);
201
+ if (b) {
202
+ b.state = "asking";
203
+ if (tc.suggested_rules !== void 0) {
204
+ b.suggested_rules = tc.suggested_rules;
205
+ }
206
+ }
207
+ }
208
+ break;
209
+ case "USER_CONFIRM_RESULT" /* USER_CONFIRM_RESULT */:
210
+ for (const result of event.confirm_results) {
211
+ const b = findBlock(msg, "tool_call", result.tool_call.id);
212
+ if (b) {
213
+ b.state = result.confirmed ? "allowed" : "finished";
214
+ }
215
+ }
216
+ break;
217
+ case "REQUIRE_EXTERNAL_EXECUTION" /* REQUIRE_EXTERNAL_EXECUTION */:
218
+ for (const tc of event.tool_calls) {
219
+ const b = findBlock(msg, "tool_call", tc.id);
220
+ if (b) b.state = "submitted";
221
+ }
222
+ break;
223
+ case "EXTERNAL_EXECUTION_RESULT" /* EXTERNAL_EXECUTION_RESULT */:
224
+ for (const result of event.execution_results) {
225
+ msg.content.push(result);
226
+ }
227
+ break;
228
+ }
229
+ return msg;
230
+ }
52
231
 
53
232
  // src/message/enums.ts
54
233
  var GenerateReason = /* @__PURE__ */ ((GenerateReason2) => {
@@ -61,6 +240,7 @@ export {
61
240
  GenerateReason,
62
241
  SystemMsg,
63
242
  UserMsg,
243
+ appendEvent,
64
244
  createMsg,
65
245
  getContentBlocks,
66
246
  getTextContent
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/message/message.ts","../../src/message/enums.ts"],"sourcesContent":["import { JSONSerializableObject } from '../type';\nimport {\n ContentBlock,\n TextBlock,\n ThinkingBlock,\n ToolResultBlock,\n ToolCallBlock,\n DataBlock,\n} from './block';\n\n/** A chat message exchanged between agents or between an agent and a model. */\nexport interface Msg {\n /** Unique identifier for the message. */\n id: string;\n /** Display name of the message sender. */\n name: string;\n /** Conversation role of the sender. */\n role: 'user' | 'assistant' | 'system';\n /** Message body. */\n content: ContentBlock[];\n /** Arbitrary key-value metadata attached to the message. */\n metadata: Record<string, JSONSerializableObject>;\n /** ISO-8601 creation timestamp. */\n created_at: string;\n /** ISO-8601 finished timestamp. */\n finished_at?: string | null;\n /** Usage information for the message, such as token counts. */\n usage?: {\n inputTokens: number;\n outputTokens: number;\n };\n}\n\n/**\n * Create a new {@link Msg} object, filling in `id` and `created_at` when omitted.\n * A plain string `content` is automatically wrapped in a single {@link TextBlock}.\n * @param root0\n * @param root0.name\n * @param root0.content\n * @param root0.role\n * @param root0.metadata\n * @param root0.id\n * @param root0.created_at\n * @param root0.finished_at\n * @param root0.usage\n * @returns A Msg object.\n */\nexport function createMsg({\n name,\n content,\n role,\n metadata = {},\n id = crypto.randomUUID(),\n created_at = new Date().toISOString(),\n finished_at,\n usage,\n}: Omit<Msg, 'id' | 'created_at' | 'metadata' | 'content'> &\n Partial<Pick<Msg, 'id' | 'created_at' | 'metadata'>> & {\n content: string | ContentBlock[];\n }): Msg {\n const contentBlocks: ContentBlock[] =\n typeof content === 'string'\n ? [{ id: crypto.randomUUID(), type: 'text', text: content } as TextBlock]\n : content;\n return { id, name, role, content: contentBlocks, metadata, created_at, finished_at, usage };\n}\n\n/**\n * Create a user {@link Msg}.\n * @param root0\n * @param root0.name\n * @param root0.content\n * @param root0.metadata\n * @param root0.id\n * @param root0.created_at\n * @returns A Msg object with role 'user'.\n */\nexport function UserMsg({\n name,\n content,\n metadata = {},\n id = crypto.randomUUID(),\n created_at = new Date().toISOString(),\n}: {\n name: string;\n content: string | ContentBlock[];\n metadata?: Record<string, JSONSerializableObject>;\n id?: string;\n created_at?: string;\n}): Msg {\n return createMsg({ name, content, role: 'user', metadata, id, created_at });\n}\n\n/**\n * Create an assistant {@link Msg}.\n * @param root0\n * @param root0.name\n * @param root0.content\n * @param root0.metadata\n * @param root0.id\n * @param root0.created_at\n * @param root0.usage\n * @returns A Msg object with role 'assistant'.\n */\nexport function AssistantMsg({\n name,\n content,\n metadata = {},\n id = crypto.randomUUID(),\n created_at = new Date().toISOString(),\n usage,\n}: {\n name: string;\n content: string | ContentBlock[];\n metadata?: Record<string, JSONSerializableObject>;\n id?: string;\n created_at?: string;\n usage?: Msg['usage'];\n}): Msg {\n return createMsg({ name, content, role: 'assistant', metadata, id, created_at, usage });\n}\n\n/**\n * Create a system {@link Msg}.\n * @param root0\n * @param root0.name\n * @param root0.content\n * @param root0.metadata\n * @param root0.id\n * @param root0.created_at\n * @returns A Msg object with role 'system'.\n */\nexport function SystemMsg({\n name,\n content,\n metadata = {},\n id = crypto.randomUUID(),\n created_at = new Date().toISOString(),\n}: {\n name: string;\n content: string | ContentBlock[];\n metadata?: Record<string, JSONSerializableObject>;\n id?: string;\n created_at?: string;\n}): Msg {\n return createMsg({ name, content, role: 'system', metadata, id, created_at });\n}\n\n/**\n * Extract the plain-text content from a message.\n *\n * When `content` is a string it is returned as-is. When it is an array of\n * content blocks, all {@link TextBlock} texts are joined with `separator`.\n *\n * @param msg - The message to read.\n * @param separator - String inserted between consecutive text blocks. Defaults to `'\\n'`.\n * @returns The concatenated text, or `null` when no text blocks are present.\n */\nexport function getTextContent(msg: Msg, separator: string = '\\n'): string | null {\n const textBlocks = msg.content.filter(block => block.type === 'text');\n if (textBlocks.length === 0) return null;\n return textBlocks.map(block => (block as TextBlock).text).join(separator);\n}\n\n/**\n * Return all content blocks from a message, regardless of type.\n *\n * When `content` is a plain string it is wrapped in a single {@link TextBlock}.\n *\n * @param msg - The message to read.\n * @returns An array of all {@link ContentBlock} objects.\n */\nexport function getContentBlocks(msg: Msg): ContentBlock[];\nexport function getContentBlocks(msg: Msg, blockType: 'text'): TextBlock[];\nexport function getContentBlocks(msg: Msg, blockType: 'thinking'): ThinkingBlock[];\nexport function getContentBlocks(msg: Msg, blockType: 'data'): DataBlock[];\nexport function getContentBlocks(msg: Msg, blockType: 'tool_call'): ToolCallBlock[];\nexport function getContentBlocks(msg: Msg, blockType: 'tool_result'): ToolResultBlock[];\nexport function getContentBlocks(\n msg: Msg,\n blockType?: 'text' | 'thinking' | 'data' | 'tool_call' | 'tool_result'\n): ContentBlock[] {\n if (!blockType) return msg.content;\n return msg.content.filter(block => block.type === blockType);\n}\n","export enum GenerateReason {\n AWAITING_TOOL_RESULT = 'AWAITING_TOOL_RESULT',\n AWAITING_USER_CONFIRMATION = 'AWAITING_USER_CONFIRMATION',\n}\n"],"mappings":";AA+CO,SAAS,UAAU;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW,CAAC;AAAA,EACZ,KAAK,OAAO,WAAW;AAAA,EACvB,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC;AAAA,EACA;AACJ,GAGY;AACR,QAAM,gBACF,OAAO,YAAY,WACb,CAAC,EAAE,IAAI,OAAO,WAAW,GAAG,MAAM,QAAQ,MAAM,QAAQ,CAAc,IACtE;AACV,SAAO,EAAE,IAAI,MAAM,MAAM,SAAS,eAAe,UAAU,YAAY,aAAa,MAAM;AAC9F;AAYO,SAAS,QAAQ;AAAA,EACpB;AAAA,EACA;AAAA,EACA,WAAW,CAAC;AAAA,EACZ,KAAK,OAAO,WAAW;AAAA,EACvB,cAAa,oBAAI,KAAK,GAAE,YAAY;AACxC,GAMQ;AACJ,SAAO,UAAU,EAAE,MAAM,SAAS,MAAM,QAAQ,UAAU,IAAI,WAAW,CAAC;AAC9E;AAaO,SAAS,aAAa;AAAA,EACzB;AAAA,EACA;AAAA,EACA,WAAW,CAAC;AAAA,EACZ,KAAK,OAAO,WAAW;AAAA,EACvB,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC;AACJ,GAOQ;AACJ,SAAO,UAAU,EAAE,MAAM,SAAS,MAAM,aAAa,UAAU,IAAI,YAAY,MAAM,CAAC;AAC1F;AAYO,SAAS,UAAU;AAAA,EACtB;AAAA,EACA;AAAA,EACA,WAAW,CAAC;AAAA,EACZ,KAAK,OAAO,WAAW;AAAA,EACvB,cAAa,oBAAI,KAAK,GAAE,YAAY;AACxC,GAMQ;AACJ,SAAO,UAAU,EAAE,MAAM,SAAS,MAAM,UAAU,UAAU,IAAI,WAAW,CAAC;AAChF;AAYO,SAAS,eAAe,KAAU,YAAoB,MAAqB;AAC9E,QAAM,aAAa,IAAI,QAAQ,OAAO,WAAS,MAAM,SAAS,MAAM;AACpE,MAAI,WAAW,WAAW,EAAG,QAAO;AACpC,SAAO,WAAW,IAAI,WAAU,MAAoB,IAAI,EAAE,KAAK,SAAS;AAC5E;AAgBO,SAAS,iBACZ,KACA,WACc;AACd,MAAI,CAAC,UAAW,QAAO,IAAI;AAC3B,SAAO,IAAI,QAAQ,OAAO,WAAS,MAAM,SAAS,SAAS;AAC/D;;;ACxLO,IAAK,iBAAL,kBAAKA,oBAAL;AACH,EAAAA,gBAAA,0BAAuB;AACvB,EAAAA,gBAAA,gCAA6B;AAFrB,SAAAA;AAAA,GAAA;","names":["GenerateReason"]}
1
+ {"version":3,"sources":["../../src/message/message.ts","../../src/message/enums.ts"],"sourcesContent":["import { JSONSerializableObject } from '../type';\nimport {\n ContentBlock,\n TextBlock,\n ThinkingBlock,\n ToolResultBlock,\n ToolCallBlock,\n DataBlock,\n Base64Source,\n URLSource,\n} from './block';\nimport { AgentEvent, EventType } from '../event';\n\n/** A chat message exchanged between agents or between an agent and a model. */\nexport interface Msg {\n /** Unique identifier for the message. */\n id: string;\n /** Display name of the message sender. */\n name: string;\n /** Conversation role of the sender. */\n role: 'user' | 'assistant' | 'system';\n /** Message body. */\n content: ContentBlock[];\n /** Arbitrary key-value metadata attached to the message. */\n metadata: Record<string, JSONSerializableObject>;\n /** ISO-8601 creation timestamp. */\n created_at: string;\n /** ISO-8601 finished timestamp. */\n finished_at?: string | null;\n /** Usage information for the message, such as token counts. */\n usage?: {\n inputTokens: number;\n outputTokens: number;\n };\n}\n\n/**\n * Create a new {@link Msg} object, filling in `id` and `created_at` when omitted.\n * A plain string `content` is automatically wrapped in a single {@link TextBlock}.\n * @param root0\n * @param root0.name\n * @param root0.content\n * @param root0.role\n * @param root0.metadata\n * @param root0.id\n * @param root0.created_at\n * @param root0.finished_at\n * @param root0.usage\n * @returns A Msg object.\n */\nexport function createMsg({\n name,\n content,\n role,\n metadata = {},\n id = crypto.randomUUID(),\n created_at = new Date().toISOString(),\n finished_at,\n usage,\n}: Omit<Msg, 'id' | 'created_at' | 'metadata' | 'content'> &\n Partial<Pick<Msg, 'id' | 'created_at' | 'metadata'>> & {\n content: string | ContentBlock[];\n }): Msg {\n const contentBlocks: ContentBlock[] =\n typeof content === 'string'\n ? [{ id: crypto.randomUUID(), type: 'text', text: content } as TextBlock]\n : content;\n return { id, name, role, content: contentBlocks, metadata, created_at, finished_at, usage };\n}\n\n/**\n * Create a user {@link Msg}.\n * @param root0\n * @param root0.name\n * @param root0.content\n * @param root0.metadata\n * @param root0.id\n * @param root0.created_at\n * @returns A Msg object with role 'user'.\n */\nexport function UserMsg({\n name,\n content,\n metadata = {},\n id = crypto.randomUUID(),\n created_at = new Date().toISOString(),\n}: {\n name: string;\n content: string | ContentBlock[];\n metadata?: Record<string, JSONSerializableObject>;\n id?: string;\n created_at?: string;\n}): Msg {\n return createMsg({ name, content, role: 'user', metadata, id, created_at });\n}\n\n/**\n * Create an assistant {@link Msg}.\n * @param root0\n * @param root0.name\n * @param root0.content\n * @param root0.metadata\n * @param root0.id\n * @param root0.created_at\n * @param root0.usage\n * @returns A Msg object with role 'assistant'.\n */\nexport function AssistantMsg({\n name,\n content,\n metadata = {},\n id = crypto.randomUUID(),\n created_at = new Date().toISOString(),\n usage,\n}: {\n name: string;\n content: string | ContentBlock[];\n metadata?: Record<string, JSONSerializableObject>;\n id?: string;\n created_at?: string;\n usage?: Msg['usage'];\n}): Msg {\n return createMsg({ name, content, role: 'assistant', metadata, id, created_at, usage });\n}\n\n/**\n * Create a system {@link Msg}.\n * @param root0\n * @param root0.name\n * @param root0.content\n * @param root0.metadata\n * @param root0.id\n * @param root0.created_at\n * @returns A Msg object with role 'system'.\n */\nexport function SystemMsg({\n name,\n content,\n metadata = {},\n id = crypto.randomUUID(),\n created_at = new Date().toISOString(),\n}: {\n name: string;\n content: string | ContentBlock[];\n metadata?: Record<string, JSONSerializableObject>;\n id?: string;\n created_at?: string;\n}): Msg {\n return createMsg({ name, content, role: 'system', metadata, id, created_at });\n}\n\n/**\n * Extract the plain-text content from a message.\n *\n * When `content` is a string it is returned as-is. When it is an array of\n * content blocks, all {@link TextBlock} texts are joined with `separator`.\n *\n * @param msg - The message to read.\n * @param separator - String inserted between consecutive text blocks. Defaults to `'\\n'`.\n * @returns The concatenated text, or `null` when no text blocks are present.\n */\nexport function getTextContent(msg: Msg, separator: string = '\\n'): string | null {\n const textBlocks = msg.content.filter(block => block.type === 'text');\n if (textBlocks.length === 0) return null;\n return textBlocks.map(block => (block as TextBlock).text).join(separator);\n}\n\n/**\n * Return all content blocks from a message, regardless of type.\n *\n * When `content` is a plain string it is wrapped in a single {@link TextBlock}.\n *\n * @param msg - The message to read.\n * @returns An array of all {@link ContentBlock} objects.\n */\nexport function getContentBlocks(msg: Msg): ContentBlock[];\nexport function getContentBlocks(msg: Msg, blockType: 'text'): TextBlock[];\nexport function getContentBlocks(msg: Msg, blockType: 'thinking'): ThinkingBlock[];\nexport function getContentBlocks(msg: Msg, blockType: 'data'): DataBlock[];\nexport function getContentBlocks(msg: Msg, blockType: 'tool_call'): ToolCallBlock[];\nexport function getContentBlocks(msg: Msg, blockType: 'tool_result'): ToolResultBlock[];\nexport function getContentBlocks(\n msg: Msg,\n blockType?: 'text' | 'thinking' | 'data' | 'tool_call' | 'tool_result'\n): ContentBlock[] {\n if (!blockType) return msg.content;\n return msg.content.filter(block => block.type === blockType);\n}\n\n/**\n * Find a content block by type and id within a message.\n * @param msg\n * @param blockType\n * @param blockId\n * @returns The matching {@link ContentBlock}, or `undefined` if not found.\n */\nfunction findBlock(msg: Msg, blockType: string, blockId: string): ContentBlock | undefined {\n return msg.content.find(block => block.type === blockType && block.id === blockId);\n}\n\n/**\n * Apply a streaming {@link AgentEvent} to a {@link Msg}, mutating it in place.\n *\n * Only `content` and `finished_at` are ever modified. Events whose\n * `reply_id` does not match `msg.id` are skipped with a warning.\n * @param msg\n * @param event\n * @returns The mutated {@link Msg} object.\n */\nexport function appendEvent(msg: Msg, event: AgentEvent): Msg {\n if (!('reply_id' in event)) return msg;\n if (event.reply_id !== msg.id) {\n console.warn(\n `Event reply_id \"${event.reply_id}\" does not match message id \"${msg.id}\", skipping.`\n );\n return msg;\n }\n\n switch (event.type) {\n case EventType.REPLY_END:\n msg.finished_at = event.created_at;\n break;\n\n case EventType.TEXT_BLOCK_START:\n msg.content.push({ type: 'text', id: event.block_id, text: '' });\n break;\n\n case EventType.TEXT_BLOCK_DELTA: {\n const block = findBlock(msg, 'text', event.block_id);\n if (!block) {\n console.warn(`TextBlock \"${event.block_id}\" not found, skipping.`);\n } else {\n (block as TextBlock).text += event.delta;\n }\n break;\n }\n\n case EventType.TEXT_BLOCK_END:\n break;\n\n case EventType.THINKING_BLOCK_START:\n msg.content.push({ type: 'thinking', id: event.block_id, thinking: '' });\n break;\n\n case EventType.THINKING_BLOCK_DELTA: {\n const block = findBlock(msg, 'thinking', event.block_id);\n if (!block) {\n console.warn(`ThinkingBlock \"${event.block_id}\" not found, skipping.`);\n } else {\n (block as ThinkingBlock).thinking += event.delta;\n }\n break;\n }\n\n case EventType.THINKING_BLOCK_END:\n break;\n\n case EventType.DATA_BLOCK_START:\n msg.content.push({\n type: 'data',\n id: event.block_id,\n source: { type: 'base64', data: '', media_type: event.media_type },\n });\n break;\n\n case EventType.DATA_BLOCK_DELTA: {\n const block = findBlock(msg, 'data', event.block_id);\n if (!block) {\n console.warn(`DataBlock \"${event.block_id}\" not found, skipping.`);\n } else {\n ((block as DataBlock).source as Base64Source).data += event.data;\n }\n break;\n }\n\n case EventType.DATA_BLOCK_END:\n break;\n\n case EventType.TOOL_CALL_START:\n msg.content.push({\n type: 'tool_call',\n id: event.tool_call_id,\n name: event.tool_call_name,\n input: '',\n state: 'pending',\n });\n break;\n\n case EventType.TOOL_CALL_DELTA: {\n const block = findBlock(msg, 'tool_call', event.tool_call_id);\n if (!block) {\n console.warn(`ToolCallBlock \"${event.tool_call_id}\" not found, skipping.`);\n } else {\n (block as ToolCallBlock).input += event.delta;\n }\n break;\n }\n\n case EventType.TOOL_CALL_END:\n break;\n\n case EventType.TOOL_RESULT_START:\n msg.content.push({\n type: 'tool_result',\n id: event.tool_call_id,\n name: event.tool_call_name,\n output: [],\n state: 'running',\n });\n break;\n\n case EventType.TOOL_RESULT_TEXT_DELTA: {\n const block = findBlock(msg, 'tool_result', event.tool_call_id);\n if (!block) {\n console.warn(`ToolResultBlock \"${event.tool_call_id}\" not found, skipping.`);\n } else {\n const trb = block as ToolResultBlock;\n if (typeof trb.output === 'string') {\n trb.output = [{ type: 'text', id: crypto.randomUUID(), text: trb.output }];\n }\n const last = trb.output[trb.output.length - 1];\n if (!last || last.type !== 'text') {\n trb.output.push({\n type: 'text',\n id: event.block_id ?? crypto.randomUUID(),\n text: event.delta,\n });\n } else {\n (last as TextBlock).text += event.delta;\n }\n }\n break;\n }\n\n case EventType.TOOL_RESULT_DATA_DELTA: {\n const block = findBlock(msg, 'tool_result', event.tool_call_id);\n if (!block) {\n console.warn(`ToolResultBlock \"${event.tool_call_id}\" not found, skipping.`);\n } else {\n const trb = block as ToolResultBlock;\n if (typeof trb.output === 'string') {\n trb.output = [{ type: 'text', id: crypto.randomUUID(), text: trb.output }];\n }\n const source: Base64Source | URLSource =\n event.data != null\n ? { type: 'base64', data: event.data, media_type: event.media_type }\n : { type: 'url', url: event.url!, media_type: event.media_type };\n trb.output.push({ type: 'data', id: event.block_id, source });\n }\n break;\n }\n\n case EventType.TOOL_RESULT_END: {\n const block = findBlock(msg, 'tool_result', event.tool_call_id);\n if (!block) {\n console.warn(`ToolResultBlock \"${event.tool_call_id}\" not found, skipping.`);\n } else {\n (block as ToolResultBlock).state = event.state;\n }\n break;\n }\n\n case EventType.MODEL_CALL_END:\n // Accumulated the input and output tokens here.\n if (msg.usage) {\n msg.usage.inputTokens += event.input_tokens;\n msg.usage.outputTokens += event.output_tokens;\n } else {\n msg.usage = {\n inputTokens: event.input_tokens,\n outputTokens: event.output_tokens,\n };\n }\n break;\n\n case EventType.REQUIRE_USER_CONFIRM:\n for (const tc of event.tool_calls) {\n const b = findBlock(msg, 'tool_call', tc.id);\n if (b) {\n (b as ToolCallBlock).state = 'asking';\n if (tc.suggested_rules !== undefined) {\n (b as ToolCallBlock).suggested_rules = tc.suggested_rules;\n }\n }\n }\n break;\n\n case EventType.USER_CONFIRM_RESULT:\n for (const result of event.confirm_results) {\n const b = findBlock(msg, 'tool_call', result.tool_call.id);\n if (b) {\n (b as ToolCallBlock).state = result.confirmed ? 'allowed' : 'finished';\n }\n }\n break;\n\n case EventType.REQUIRE_EXTERNAL_EXECUTION:\n for (const tc of event.tool_calls) {\n const b = findBlock(msg, 'tool_call', tc.id);\n if (b) (b as ToolCallBlock).state = 'submitted';\n }\n break;\n\n case EventType.EXTERNAL_EXECUTION_RESULT:\n for (const result of event.execution_results) {\n msg.content.push(result);\n }\n break;\n }\n\n return msg;\n}\n","export enum GenerateReason {\n AWAITING_TOOL_RESULT = 'AWAITING_TOOL_RESULT',\n AWAITING_USER_CONFIRMATION = 'AWAITING_USER_CONFIRMATION',\n}\n"],"mappings":"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","names":["GenerateReason"]}
@@ -1,5 +1,6 @@
1
1
  import { J as JSONSerializableObject } from './index-CAxQAkiP.mjs';
2
- import { C as ContentBlock, T as TextBlock, a as ThinkingBlock, D as DataBlock, b as ToolCallBlock, c as ToolResultBlock } from './block-7fd6byyN.mjs';
2
+ import { C as ContentBlock, T as TextBlock, a as ThinkingBlock, D as DataBlock, b as ToolCallBlock, d as ToolResultBlock } from './block-BqWf-Qcb.mjs';
3
+ import { AgentEvent } from './event/index.mjs';
3
4
 
4
5
  /** A chat message exchanged between agents or between an agent and a model. */
5
6
  interface Msg {
@@ -118,5 +119,15 @@ declare function getContentBlocks(msg: Msg, blockType: 'thinking'): ThinkingBloc
118
119
  declare function getContentBlocks(msg: Msg, blockType: 'data'): DataBlock[];
119
120
  declare function getContentBlocks(msg: Msg, blockType: 'tool_call'): ToolCallBlock[];
120
121
  declare function getContentBlocks(msg: Msg, blockType: 'tool_result'): ToolResultBlock[];
122
+ /**
123
+ * Apply a streaming {@link AgentEvent} to a {@link Msg}, mutating it in place.
124
+ *
125
+ * Only `content` and `finished_at` are ever modified. Events whose
126
+ * `reply_id` does not match `msg.id` are skipped with a warning.
127
+ * @param msg
128
+ * @param event
129
+ * @returns The mutated {@link Msg} object.
130
+ */
131
+ declare function appendEvent(msg: Msg, event: AgentEvent): Msg;
121
132
 
122
- export { AssistantMsg as A, type Msg as M, SystemMsg as S, UserMsg as U, getTextContent as a, createMsg as c, getContentBlocks as g };
133
+ export { AssistantMsg as A, type Msg as M, SystemMsg as S, UserMsg as U, appendEvent as a, getTextContent as b, createMsg as c, getContentBlocks as g };
@@ -1,5 +1,6 @@
1
1
  import { J as JSONSerializableObject } from './index-CAxQAkiP.js';
2
- import { C as ContentBlock, T as TextBlock, a as ThinkingBlock, D as DataBlock, b as ToolCallBlock, c as ToolResultBlock } from './block-7fd6byyN.js';
2
+ import { C as ContentBlock, T as TextBlock, a as ThinkingBlock, D as DataBlock, b as ToolCallBlock, d as ToolResultBlock } from './block-BqWf-Qcb.js';
3
+ import { AgentEvent } from './event/index.js';
3
4
 
4
5
  /** A chat message exchanged between agents or between an agent and a model. */
5
6
  interface Msg {
@@ -118,5 +119,15 @@ declare function getContentBlocks(msg: Msg, blockType: 'thinking'): ThinkingBloc
118
119
  declare function getContentBlocks(msg: Msg, blockType: 'data'): DataBlock[];
119
120
  declare function getContentBlocks(msg: Msg, blockType: 'tool_call'): ToolCallBlock[];
120
121
  declare function getContentBlocks(msg: Msg, blockType: 'tool_result'): ToolResultBlock[];
122
+ /**
123
+ * Apply a streaming {@link AgentEvent} to a {@link Msg}, mutating it in place.
124
+ *
125
+ * Only `content` and `finished_at` are ever modified. Events whose
126
+ * `reply_id` does not match `msg.id` are skipped with a warning.
127
+ * @param msg
128
+ * @param event
129
+ * @returns The mutated {@link Msg} object.
130
+ */
131
+ declare function appendEvent(msg: Msg, event: AgentEvent): Msg;
121
132
 
122
- export { AssistantMsg as A, type Msg as M, SystemMsg as S, UserMsg as U, getTextContent as a, createMsg as c, getContentBlocks as g };
133
+ export { AssistantMsg as A, type Msg as M, SystemMsg as S, UserMsg as U, appendEvent as a, getTextContent as b, createMsg as c, getContentBlocks as g };
@@ -1,13 +1,14 @@
1
- import { C as ChatModelBase, c as ChatModelOptions, d as ChatModelRequestOptions, b as ChatResponse } from '../base-D9uCcDjZ.mjs';
2
- export { a as ChatUsage } from '../base-D9uCcDjZ.mjs';
1
+ import { C as ChatModelBase, c as ChatModelOptions, d as ChatModelRequestOptions, b as ChatResponse } from '../base-BDyDUIhj.mjs';
2
+ export { a as ChatUsage } from '../base-BDyDUIhj.mjs';
3
3
  import { a as ToolChoice, T as ToolSchema } from '../index-CAxQAkiP.mjs';
4
- import { b as ToolCallBlock, T as TextBlock, a as ThinkingBlock } from '../block-7fd6byyN.mjs';
4
+ import { b as ToolCallBlock, T as TextBlock, a as ThinkingBlock } from '../block-BqWf-Qcb.mjs';
5
5
  import { Ollama, AbortableAsyncIterator, ChatResponse as ChatResponse$1 } from 'ollama';
6
6
  import { OpenAI } from 'openai';
7
7
  import { ChatCompletionMessageParam, ChatCompletionToolChoiceOption } from 'openai/resources/chat/completions';
8
8
  import 'zod';
9
- import '../base-Bo8TzBQq.mjs';
10
- import '../message-CYnHiEVt.mjs';
9
+ import '../base-BI5s2ksj.mjs';
10
+ import '../message-D-LObC06.mjs';
11
+ import '../event/index.mjs';
11
12
 
12
13
  interface DashScopeThinkingConfig {
13
14
  /**
@@ -1,13 +1,14 @@
1
- import { C as ChatModelBase, c as ChatModelOptions, d as ChatModelRequestOptions, b as ChatResponse } from '../base-TYjCCv7T.js';
2
- export { a as ChatUsage } from '../base-TYjCCv7T.js';
1
+ import { C as ChatModelBase, c as ChatModelOptions, d as ChatModelRequestOptions, b as ChatResponse } from '../base-qmU135_k.js';
2
+ export { a as ChatUsage } from '../base-qmU135_k.js';
3
3
  import { a as ToolChoice, T as ToolSchema } from '../index-CAxQAkiP.js';
4
- import { b as ToolCallBlock, T as TextBlock, a as ThinkingBlock } from '../block-7fd6byyN.js';
4
+ import { b as ToolCallBlock, T as TextBlock, a as ThinkingBlock } from '../block-BqWf-Qcb.js';
5
5
  import { Ollama, AbortableAsyncIterator, ChatResponse as ChatResponse$1 } from 'ollama';
6
6
  import { OpenAI } from 'openai';
7
7
  import { ChatCompletionMessageParam, ChatCompletionToolChoiceOption } from 'openai/resources/chat/completions';
8
8
  import 'zod';
9
- import '../base-t7G4uaR_.js';
10
- import '../message-DZN7LetB.js';
9
+ import '../base-CFDeoJRe.js';
10
+ import '../message-DU0_qm3u.js';
11
+ import '../event/index.js';
11
12
 
12
13
  interface DashScopeThinkingConfig {
13
14
  /**
@@ -938,7 +938,8 @@ var DashScopeChatModel = class extends ChatModelBase {
938
938
  type: "tool_call",
939
939
  id: String(toolCall.id),
940
940
  name: String(toolCall.function.name),
941
- input: inputString
941
+ input: inputString,
942
+ state: "pending"
942
943
  });
943
944
  }
944
945
  });
@@ -1037,7 +1038,8 @@ var DashScopeChatModel = class extends ChatModelBase {
1037
1038
  type: "tool_call",
1038
1039
  id: meta.id,
1039
1040
  name: meta.name,
1040
- input: deltaArgs
1041
+ input: deltaArgs,
1042
+ state: "pending"
1041
1043
  });
1042
1044
  }
1043
1045
  });
@@ -1064,7 +1066,8 @@ var DashScopeChatModel = class extends ChatModelBase {
1064
1066
  type: "tool_call",
1065
1067
  id: meta.id,
1066
1068
  name: meta.name,
1067
- input: accToolInputs.get(index) || "{}"
1069
+ input: accToolInputs.get(index) || "{}",
1070
+ state: "pending"
1068
1071
  });
1069
1072
  });
1070
1073
  const blocks = this._dataToBlocks(accText, accThinking, finalToolCalls);
@@ -1212,7 +1215,8 @@ var DeepSeekChatModel = class extends ChatModelBase {
1212
1215
  type: "tool_call",
1213
1216
  id: String(toolCall.id),
1214
1217
  name: String(toolCall.function.name),
1215
- input: inputString
1218
+ input: inputString,
1219
+ state: "pending"
1216
1220
  });
1217
1221
  }
1218
1222
  });
@@ -1309,7 +1313,8 @@ var DeepSeekChatModel = class extends ChatModelBase {
1309
1313
  type: "tool_call",
1310
1314
  id: meta.id,
1311
1315
  name: meta.name,
1312
- input: deltaArgs
1316
+ input: deltaArgs,
1317
+ state: "pending"
1313
1318
  });
1314
1319
  }
1315
1320
  });
@@ -1336,7 +1341,8 @@ var DeepSeekChatModel = class extends ChatModelBase {
1336
1341
  type: "tool_call",
1337
1342
  id: meta.id,
1338
1343
  name: meta.name,
1339
- input: accToolInputs.get(index) || "{}"
1344
+ input: accToolInputs.get(index) || "{}",
1345
+ state: "pending"
1340
1346
  });
1341
1347
  });
1342
1348
  const blocks = this._accDataToBlocks(accText, accThinking, finalToolCalls);
@@ -1509,7 +1515,8 @@ var OllamaChatModel = class extends ChatModelBase {
1509
1515
  type: "tool_call",
1510
1516
  id: toolId,
1511
1517
  name: func.name,
1512
- input: JSON.stringify(func.arguments)
1518
+ input: JSON.stringify(func.arguments),
1519
+ state: "pending"
1513
1520
  };
1514
1521
  toolCalls.set(toolId, toolCallBlock);
1515
1522
  deltaToolCalls.set(toolId, toolCallBlock);
@@ -1569,7 +1576,8 @@ var OllamaChatModel = class extends ChatModelBase {
1569
1576
  type: "tool_call",
1570
1577
  id: `${idx}_${toolCall.function.name}`,
1571
1578
  name: toolCall.function.name,
1572
- input: JSON.stringify(toolCall.function.arguments)
1579
+ input: JSON.stringify(toolCall.function.arguments),
1580
+ state: "pending"
1573
1581
  });
1574
1582
  }
1575
1583
  }
@@ -1706,7 +1714,8 @@ var OpenAIChatModel = class extends ChatModelBase {
1706
1714
  type: "tool_call",
1707
1715
  id: toolCall.id,
1708
1716
  name: toolCall.function.name,
1709
- input: toolCall.function.arguments
1717
+ input: toolCall.function.arguments,
1718
+ state: "pending"
1710
1719
  });
1711
1720
  }
1712
1721
  });
@@ -1800,7 +1809,8 @@ var OpenAIChatModel = class extends ChatModelBase {
1800
1809
  type: "tool_call",
1801
1810
  id: meta.id,
1802
1811
  name: meta.name,
1803
- input: deltaArgs
1812
+ input: deltaArgs,
1813
+ state: "pending"
1804
1814
  });
1805
1815
  }
1806
1816
  });
@@ -1829,7 +1839,8 @@ var OpenAIChatModel = class extends ChatModelBase {
1829
1839
  type: "tool_call",
1830
1840
  id: meta.id,
1831
1841
  name: meta.name,
1832
- input: accToolInputs.get(index) || "{}"
1842
+ input: accToolInputs.get(index) || "{}",
1843
+ state: "pending"
1833
1844
  });
1834
1845
  });
1835
1846
  const blocks = this._accDataToBlocks(accText, finalToolCalls);