@copilotkit/runtime 1.75.1 → 1.76.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/converters/aisdk.cjs +68 -10
- package/dist/agent/converters/aisdk.cjs.map +1 -1
- package/dist/agent/converters/aisdk.d.cts.map +1 -1
- package/dist/agent/converters/aisdk.d.mts.map +1 -1
- package/dist/agent/converters/aisdk.mjs +67 -11
- package/dist/agent/converters/aisdk.mjs.map +1 -1
- package/dist/agent/converters/tanstack.cjs +8 -6
- package/dist/agent/converters/tanstack.cjs.map +1 -1
- package/dist/agent/converters/tanstack.d.cts.map +1 -1
- package/dist/agent/converters/tanstack.d.mts.map +1 -1
- package/dist/agent/converters/tanstack.mjs +9 -7
- package/dist/agent/converters/tanstack.mjs.map +1 -1
- package/dist/agent/converters/usage.cjs +8 -2
- package/dist/agent/converters/usage.cjs.map +1 -1
- package/dist/agent/converters/usage.d.cts +3 -1
- package/dist/agent/converters/usage.d.cts.map +1 -1
- package/dist/agent/converters/usage.d.mts +3 -1
- package/dist/agent/converters/usage.d.mts.map +1 -1
- package/dist/agent/converters/usage.mjs +8 -2
- package/dist/agent/converters/usage.mjs.map +1 -1
- package/dist/agent/index.cjs +164 -34
- package/dist/agent/index.cjs.map +1 -1
- package/dist/agent/index.d.cts +18 -6
- package/dist/agent/index.d.cts.map +1 -1
- package/dist/agent/index.d.mts +18 -6
- package/dist/agent/index.d.mts.map +1 -1
- package/dist/agent/index.mjs +166 -36
- package/dist/agent/index.mjs.map +1 -1
- package/dist/agent/mcp-tool-names.cjs +84 -0
- package/dist/agent/mcp-tool-names.cjs.map +1 -0
- package/dist/agent/mcp-tool-names.mjs +81 -0
- package/dist/agent/mcp-tool-names.mjs.map +1 -0
- package/dist/lib/runtime/copilot-runtime.cjs +20 -9
- package/dist/lib/runtime/copilot-runtime.cjs.map +1 -1
- package/dist/lib/runtime/copilot-runtime.d.cts.map +1 -1
- package/dist/lib/runtime/copilot-runtime.d.mts.map +1 -1
- package/dist/lib/runtime/copilot-runtime.mjs +20 -9
- package/dist/lib/runtime/copilot-runtime.mjs.map +1 -1
- package/dist/package.cjs +6 -7
- package/dist/package.mjs +6 -7
- package/dist/v2/runtime/handlers/intelligence/connect.cjs +1 -0
- package/dist/v2/runtime/handlers/intelligence/connect.cjs.map +1 -1
- package/dist/v2/runtime/handlers/intelligence/connect.mjs +1 -0
- package/dist/v2/runtime/handlers/intelligence/connect.mjs.map +1 -1
- package/dist/v2/runtime/handlers/shared/agent-utils.cjs +90 -4
- package/dist/v2/runtime/handlers/shared/agent-utils.cjs.map +1 -1
- package/dist/v2/runtime/handlers/shared/agent-utils.mjs +90 -4
- package/dist/v2/runtime/handlers/shared/agent-utils.mjs.map +1 -1
- package/dist/v2/runtime/runner/in-memory.cjs +16 -1
- package/dist/v2/runtime/runner/in-memory.cjs.map +1 -1
- package/dist/v2/runtime/runner/in-memory.d.cts.map +1 -1
- package/dist/v2/runtime/runner/in-memory.d.mts.map +1 -1
- package/dist/v2/runtime/runner/in-memory.mjs +16 -1
- package/dist/v2/runtime/runner/in-memory.mjs.map +1 -1
- package/dist/v2/runtime/runner/intelligence.cjs +5 -2
- package/dist/v2/runtime/runner/intelligence.cjs.map +1 -1
- package/dist/v2/runtime/runner/intelligence.d.cts.map +1 -1
- package/dist/v2/runtime/runner/intelligence.d.mts.map +1 -1
- package/dist/v2/runtime/runner/intelligence.mjs +6 -3
- package/dist/v2/runtime/runner/intelligence.mjs.map +1 -1
- package/package.json +7 -10
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":[],"sources":["../../src/agent/index.ts"],"mappings":";;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../../src/agent/index.ts"],"mappings":"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"}
|
package/dist/agent/index.d.mts
CHANGED
|
@@ -31,6 +31,15 @@ type ModelSpecifier = string | LanguageModel;
|
|
|
31
31
|
interface MCPClientConfigHTTP {
|
|
32
32
|
/** Type of MCP client */
|
|
33
33
|
type: "http";
|
|
34
|
+
/**
|
|
35
|
+
* Optional name for this server. When a tool name collides with another
|
|
36
|
+
* MCP server's tool or with an app tool, the MCP tool is exposed as
|
|
37
|
+
* `<name>_<tool>`. Without a name, the prefix is `mcp<N>`, where N is the
|
|
38
|
+
* server's position among `mcpClients` and then `mcpServers`, from 1.
|
|
39
|
+
* Give each server a different name: if a prefixed name is already in use,
|
|
40
|
+
* a number is added (`<name>_<tool>_2`).
|
|
41
|
+
*/
|
|
42
|
+
name?: string;
|
|
34
43
|
/** URL of the MCP server */
|
|
35
44
|
url: string;
|
|
36
45
|
/**
|
|
@@ -47,6 +56,15 @@ interface MCPClientConfigHTTP {
|
|
|
47
56
|
interface MCPClientConfigSSE {
|
|
48
57
|
/** Type of MCP client */
|
|
49
58
|
type: "sse";
|
|
59
|
+
/**
|
|
60
|
+
* Optional name for this server. When a tool name collides with another
|
|
61
|
+
* MCP server's tool or with an app tool, the MCP tool is exposed as
|
|
62
|
+
* `<name>_<tool>`. Without a name, the prefix is `mcp<N>`, where N is the
|
|
63
|
+
* server's position among `mcpClients` and then `mcpServers`, from 1.
|
|
64
|
+
* Give each server a different name: if a prefixed name is already in use,
|
|
65
|
+
* a number is added (`<name>_<tool>_2`).
|
|
66
|
+
*/
|
|
67
|
+
name?: string;
|
|
50
68
|
/** URL of the MCP server */
|
|
51
69
|
url: string;
|
|
52
70
|
/** Optional HTTP headers (e.g., for authentication) */
|
|
@@ -68,12 +86,6 @@ interface MCPClientProvider {
|
|
|
68
86
|
/** Return tools to be merged into the agent's tool set. */
|
|
69
87
|
tools(): Promise<ToolSet>;
|
|
70
88
|
}
|
|
71
|
-
/**
|
|
72
|
-
* Resolves a model specifier to a LanguageModel instance
|
|
73
|
-
* @param spec - Model string (e.g., "openai/gpt-4o") or LanguageModel instance
|
|
74
|
-
* @param apiKey - Optional API key to use instead of environment variables
|
|
75
|
-
* @returns LanguageModel instance
|
|
76
|
-
*/
|
|
77
89
|
declare function resolveModel(spec: ModelSpecifier, apiKey?: string): LanguageModel;
|
|
78
90
|
/**
|
|
79
91
|
* Which vendor a model specifier will actually reach, as a closed vocabulary.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/agent/index.ts"],"mappings":";;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/agent/index.ts"],"mappings":"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"}
|
package/dist/agent/index.mjs
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import "reflect-metadata";
|
|
2
2
|
import { createStateEventNormalizer } from "./state-delta.mjs";
|
|
3
3
|
import { collectStandardRunFinishedDetails, getNonEmptyString, isRecord } from "./converters/usage.mjs";
|
|
4
|
-
import { convertAISDKStream, getAISDKRunFinishedDetails } from "./converters/aisdk.mjs";
|
|
4
|
+
import { convertAISDKStream, formatToolError, getAISDKRunFinishedDetails, resolveStreamPartMessageId } from "./converters/aisdk.mjs";
|
|
5
5
|
import { convertInputToTanStackAI, convertTanStackStream } from "./converters/tanstack.mjs";
|
|
6
6
|
import { SkillRegistry } from "../v2/runtime/intelligence-platform/skill-registry/registry.mjs";
|
|
7
7
|
import { assertNoSkillToolConflicts, prepareLearnedSkills } from "./learned-skills.mjs";
|
|
8
|
+
import { mergeMCPTools, toToolNamePrefix } from "./mcp-tool-names.mjs";
|
|
8
9
|
import { createOpenAI } from "@ai-sdk/openai";
|
|
9
10
|
import { classifyModelHost, randomUUID, safeParseToolArgs, schemaToJsonSchema } from "@copilotkit/shared";
|
|
10
11
|
import { createGoogleGenerativeAI } from "@ai-sdk/google";
|
|
11
12
|
import { Observable } from "rxjs";
|
|
12
|
-
import { AbstractAgent, EventType } from "@ag-ui/client";
|
|
13
|
+
import { AbstractAgent, EventType, PROTOCOL_VERSION } from "@ag-ui/client";
|
|
13
14
|
import { RENDER_A2UI_TOOL } from "@ag-ui/a2ui-middleware";
|
|
14
15
|
import { Validator } from "@cfworker/json-schema";
|
|
15
16
|
import { jsonSchema, stepCountIs, streamText, tool } from "ai";
|
|
@@ -26,6 +27,64 @@ import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/
|
|
|
26
27
|
* @param apiKey - Optional API key to use instead of environment variables
|
|
27
28
|
* @returns LanguageModel instance
|
|
28
29
|
*/
|
|
30
|
+
/**
|
|
31
|
+
* An AG-UI tool result as the AI SDK's tool result output.
|
|
32
|
+
*
|
|
33
|
+
* Providers hold one response per tool call, and the Google adapter emits one
|
|
34
|
+
* functionResponse per text entry of a content list, so all of a result's text
|
|
35
|
+
* is collected into a single entry: text parts run together, and a
|
|
36
|
+
* URL-referenced part contributes the URL it carries on a line of its own —
|
|
37
|
+
* the bytes are not here to hand over, and the reference is the content the
|
|
38
|
+
* tool actually returned. A result with no inline media is that text alone.
|
|
39
|
+
* One with inline media is a content list: the text entry first, when there is
|
|
40
|
+
* any, then each media part with its bytes and media type. A media-only result
|
|
41
|
+
* is media alone: a placeholder text would be content the tool never returned.
|
|
42
|
+
* Which adapters can place media inside a tool response is theirs to decide.
|
|
43
|
+
* A provider file handle (`file` source) is neither bytes nor a URL, and this
|
|
44
|
+
* path cannot hand it to the provider, so the part is dropped with a warning.
|
|
45
|
+
* A result whose parts were all dropped is the empty string, as AG-UI 1.0
|
|
46
|
+
* requires: the call must still be answered.
|
|
47
|
+
*/
|
|
48
|
+
function warnDroppedFileSource(what) {
|
|
49
|
+
console.warn(`[CopilotKit] Dropping a ${what} that references a provider file handle: it is not a URL or inline data, so it cannot be sent to the model here.`);
|
|
50
|
+
}
|
|
51
|
+
function toolResultOutput(content) {
|
|
52
|
+
if (typeof content === "string") return {
|
|
53
|
+
type: "text",
|
|
54
|
+
value: content
|
|
55
|
+
};
|
|
56
|
+
const segments = [];
|
|
57
|
+
const media = [];
|
|
58
|
+
let open = false;
|
|
59
|
+
for (const part of content) if (part.type === "text") {
|
|
60
|
+
if (open) segments[segments.length - 1] += part.text;
|
|
61
|
+
else segments.push(part.text);
|
|
62
|
+
open = true;
|
|
63
|
+
} else if (part.source.type === "file") warnDroppedFileSource(`${part.type} part in a tool result`);
|
|
64
|
+
else if (part.source.type === "url") {
|
|
65
|
+
segments.push(part.source.value);
|
|
66
|
+
open = false;
|
|
67
|
+
} else {
|
|
68
|
+
media.push({
|
|
69
|
+
type: "media",
|
|
70
|
+
data: part.source.value,
|
|
71
|
+
mediaType: part.source.mimeType
|
|
72
|
+
});
|
|
73
|
+
open = false;
|
|
74
|
+
}
|
|
75
|
+
const text = segments.join("\n");
|
|
76
|
+
if (media.length === 0) return {
|
|
77
|
+
type: "text",
|
|
78
|
+
value: text
|
|
79
|
+
};
|
|
80
|
+
return {
|
|
81
|
+
type: "content",
|
|
82
|
+
value: [...text.length > 0 ? [{
|
|
83
|
+
type: "text",
|
|
84
|
+
text
|
|
85
|
+
}] : [], ...media]
|
|
86
|
+
};
|
|
87
|
+
}
|
|
29
88
|
function resolveModel(spec, apiKey) {
|
|
30
89
|
if (typeof spec !== "string") return spec;
|
|
31
90
|
const parts = spec.replace("/", ":").trim().split(":");
|
|
@@ -150,6 +209,7 @@ function convertUserMessageContent(content) {
|
|
|
150
209
|
image: source.value,
|
|
151
210
|
mediaType: source.mimeType
|
|
152
211
|
});
|
|
212
|
+
else if (source.type === "file") warnDroppedFileSource("image part");
|
|
153
213
|
else if (source.type === "url") try {
|
|
154
214
|
parts.push({
|
|
155
215
|
type: "image",
|
|
@@ -171,6 +231,7 @@ function convertUserMessageContent(content) {
|
|
|
171
231
|
data: source.value,
|
|
172
232
|
mediaType: source.mimeType
|
|
173
233
|
});
|
|
234
|
+
else if (source.type === "file") warnDroppedFileSource(`${part.type} part`);
|
|
174
235
|
else if (source.type === "url") try {
|
|
175
236
|
parts.push({
|
|
176
237
|
type: "file",
|
|
@@ -276,10 +337,7 @@ function convertMessagesToVercelAISDKMessages(messages, options = {}) {
|
|
|
276
337
|
type: "tool-result",
|
|
277
338
|
toolCallId: message.toolCallId,
|
|
278
339
|
toolName,
|
|
279
|
-
output:
|
|
280
|
-
type: "text",
|
|
281
|
-
value: message.content
|
|
282
|
-
}
|
|
340
|
+
output: toolResultOutput(message.content)
|
|
283
341
|
}]
|
|
284
342
|
};
|
|
285
343
|
result.push(toolMsg);
|
|
@@ -457,7 +515,8 @@ var BuiltInAgent = class BuiltInAgent extends AbstractAgent {
|
|
|
457
515
|
const startEvent = {
|
|
458
516
|
type: EventType.RUN_STARTED,
|
|
459
517
|
threadId: input.threadId,
|
|
460
|
-
runId: input.runId
|
|
518
|
+
runId: input.runId,
|
|
519
|
+
protocolVersion: PROTOCOL_VERSION
|
|
461
520
|
};
|
|
462
521
|
subscriber.next(startEvent);
|
|
463
522
|
const model = resolveModel(config.model, config.apiKey);
|
|
@@ -626,16 +685,19 @@ This is state from the application that you can edit by calling AGUISendStateSna
|
|
|
626
685
|
}
|
|
627
686
|
})
|
|
628
687
|
};
|
|
629
|
-
|
|
688
|
+
const mcpToolSources = [];
|
|
689
|
+
const userMcpClients = config.mcpClients ?? [];
|
|
690
|
+
for (const [index, client] of userMcpClients.entries()) {
|
|
630
691
|
const mcpTools = await client.tools();
|
|
631
692
|
abortController.signal.throwIfAborted();
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
};
|
|
693
|
+
mcpToolSources.push({
|
|
694
|
+
label: `mcp${index + 1}`,
|
|
695
|
+
tools: mcpTools
|
|
696
|
+
});
|
|
636
697
|
}
|
|
637
698
|
const allMcpServers = [...config.mcpServers ?? []];
|
|
638
|
-
if (allMcpServers.length > 0) for (const serverConfig of allMcpServers) {
|
|
699
|
+
if (allMcpServers.length > 0) for (const [index, serverConfig] of allMcpServers.entries()) {
|
|
700
|
+
const label = serverConfig.name ? toToolNamePrefix(serverConfig.name) : `mcp${userMcpClients.length + index + 1}`;
|
|
639
701
|
let transport;
|
|
640
702
|
if (serverConfig.type === "http") transport = new StreamableHTTPClientTransport(new URL(serverConfig.url), serverConfig.options);
|
|
641
703
|
else if (serverConfig.type === "sse") {
|
|
@@ -660,16 +722,17 @@ This is state from the application that you can edit by calling AGUISendStateSna
|
|
|
660
722
|
try {
|
|
661
723
|
const mcpTools = await mcpClient.tools();
|
|
662
724
|
abortController.signal.throwIfAborted();
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
};
|
|
725
|
+
mcpToolSources.push({
|
|
726
|
+
label,
|
|
727
|
+
tools: mcpTools
|
|
728
|
+
});
|
|
667
729
|
} catch (err) {
|
|
668
730
|
abortController.signal.throwIfAborted();
|
|
669
731
|
console.error(`[CopilotKit] MCP server ${serverConfig.url} tools() failed — skipping its tools for this run:`, err);
|
|
670
732
|
}
|
|
671
733
|
}
|
|
672
734
|
}
|
|
735
|
+
if (mcpToolSources.length > 0) streamTextParams.tools = mergeMCPTools(streamTextParams.tools ?? {}, mcpToolSources);
|
|
673
736
|
if (this.skillRegistry) {
|
|
674
737
|
assertNoSkillToolConflicts(streamTextParams.tools ?? {});
|
|
675
738
|
streamTextParams.tools = {
|
|
@@ -702,6 +765,7 @@ This is state from the application that you can edit by calling AGUISendStateSna
|
|
|
702
765
|
}
|
|
703
766
|
return state;
|
|
704
767
|
};
|
|
768
|
+
const warnedUnknownPartTypes = /* @__PURE__ */ new Set();
|
|
705
769
|
for await (const part of response.fullStream) {
|
|
706
770
|
if (part.type !== "reasoning-delta") closeReasoningIfOpen();
|
|
707
771
|
switch (part.type) {
|
|
@@ -709,7 +773,8 @@ This is state from the application that you can edit by calling AGUISendStateSna
|
|
|
709
773
|
const abortEndEvent = {
|
|
710
774
|
type: EventType.RUN_FINISHED,
|
|
711
775
|
threadId: input.threadId,
|
|
712
|
-
runId: input.runId
|
|
776
|
+
runId: input.runId,
|
|
777
|
+
...input.protocolVersion !== void 0 ? { outcome: { type: "cancelled" } } : {}
|
|
713
778
|
};
|
|
714
779
|
subscriber.next(abortEndEvent);
|
|
715
780
|
terminalEventEmitted = true;
|
|
@@ -717,8 +782,7 @@ This is state from the application that you can edit by calling AGUISendStateSna
|
|
|
717
782
|
break;
|
|
718
783
|
}
|
|
719
784
|
case "reasoning-start": {
|
|
720
|
-
|
|
721
|
-
reasoningMessageId = !providedId || providedId === "0" || /^(txt|reasoning|msg)-0$/.test(providedId) ? randomUUID() : providedId;
|
|
785
|
+
reasoningMessageId = resolveStreamPartMessageId("id" in part ? part.id : void 0);
|
|
722
786
|
const reasoningStartEvent = {
|
|
723
787
|
type: EventType.REASONING_START,
|
|
724
788
|
messageId: reasoningMessageId
|
|
@@ -774,11 +838,9 @@ This is state from the application that you can edit by calling AGUISendStateSna
|
|
|
774
838
|
break;
|
|
775
839
|
}
|
|
776
840
|
case "tool-input-end": break;
|
|
777
|
-
case "text-start":
|
|
778
|
-
|
|
779
|
-
messageId = !providedId || providedId === "0" || /^(txt|reasoning|msg)-0$/.test(providedId) ? randomUUID() : providedId;
|
|
841
|
+
case "text-start":
|
|
842
|
+
messageId = resolveStreamPartMessageId("id" in part ? part.id : void 0);
|
|
780
843
|
break;
|
|
781
|
-
}
|
|
782
844
|
case "text-delta": {
|
|
783
845
|
const textDelta = "text" in part ? part.text : "";
|
|
784
846
|
const textEvent = {
|
|
@@ -885,6 +947,24 @@ This is state from the application that you can edit by calling AGUISendStateSna
|
|
|
885
947
|
subscriber.next(resultEvent);
|
|
886
948
|
break;
|
|
887
949
|
}
|
|
950
|
+
case "tool-error": {
|
|
951
|
+
const toolCallId = part.toolCallId;
|
|
952
|
+
const toolName = "toolName" in part && part.toolName || toolCallStates.get(toolCallId)?.toolName || "";
|
|
953
|
+
if (toolName && interruptToolNames.has(toolName)) {
|
|
954
|
+
toolCallStates.delete(toolCallId);
|
|
955
|
+
break;
|
|
956
|
+
}
|
|
957
|
+
toolCallStates.delete(toolCallId);
|
|
958
|
+
const resultEvent = {
|
|
959
|
+
type: EventType.TOOL_CALL_RESULT,
|
|
960
|
+
role: "tool",
|
|
961
|
+
messageId: randomUUID(),
|
|
962
|
+
toolCallId,
|
|
963
|
+
content: `Error: ${formatToolError(part.error)}`
|
|
964
|
+
};
|
|
965
|
+
subscriber.next(resultEvent);
|
|
966
|
+
break;
|
|
967
|
+
}
|
|
888
968
|
case "finish": {
|
|
889
969
|
const model = streamTextParams.model;
|
|
890
970
|
const finishedEvent = {
|
|
@@ -920,6 +1000,24 @@ This is state from the application that you can edit by calling AGUISendStateSna
|
|
|
920
1000
|
else subscriber.error(new Error(typeof err === "string" ? err : `AI SDK stream error`));
|
|
921
1001
|
break;
|
|
922
1002
|
}
|
|
1003
|
+
case "start":
|
|
1004
|
+
case "start-step":
|
|
1005
|
+
case "finish-step":
|
|
1006
|
+
case "text-end":
|
|
1007
|
+
case "source":
|
|
1008
|
+
case "file":
|
|
1009
|
+
case "tool-output-denied":
|
|
1010
|
+
case "tool-approval-request":
|
|
1011
|
+
case "raw": break;
|
|
1012
|
+
default: {
|
|
1013
|
+
const _exhaustive = part;
|
|
1014
|
+
const unknownType = String(_exhaustive.type);
|
|
1015
|
+
if (!warnedUnknownPartTypes.has(unknownType)) {
|
|
1016
|
+
warnedUnknownPartTypes.add(unknownType);
|
|
1017
|
+
console.warn(`[BuiltInAgent] Ignoring unhandled AI SDK stream part: ${unknownType}`);
|
|
1018
|
+
}
|
|
1019
|
+
break;
|
|
1020
|
+
}
|
|
923
1021
|
}
|
|
924
1022
|
}
|
|
925
1023
|
if (!terminalEventEmitted) {
|
|
@@ -973,7 +1071,8 @@ This is state from the application that you can edit by calling AGUISendStateSna
|
|
|
973
1071
|
const startEvent = {
|
|
974
1072
|
type: EventType.RUN_STARTED,
|
|
975
1073
|
threadId: input.threadId,
|
|
976
|
-
runId: input.runId
|
|
1074
|
+
runId: input.runId,
|
|
1075
|
+
protocolVersion: PROTOCOL_VERSION
|
|
977
1076
|
};
|
|
978
1077
|
subscriber.next(startEvent);
|
|
979
1078
|
const ctx = {
|
|
@@ -988,20 +1087,47 @@ This is state from the application that you can edit by calling AGUISendStateSna
|
|
|
988
1087
|
throw new InterruptSignal(interrupts);
|
|
989
1088
|
}
|
|
990
1089
|
};
|
|
991
|
-
const answeredToolCallIds = new Set(input.messages.filter((m) => m.role === "tool").map((m) => m.toolCallId).filter((id) => typeof id === "string"));
|
|
992
|
-
const resumeToolMessages = (input.resume ?? []).filter((entry) => !answeredToolCallIds.has(entry.interruptId)).map((entry) => ({
|
|
993
|
-
id: randomUUID(),
|
|
994
|
-
role: "tool",
|
|
995
|
-
toolCallId: entry.interruptId,
|
|
996
|
-
content: JSON.stringify(entry.status === "cancelled" ? { status: "cancelled" } : entry.payload ?? { status: "resolved" })
|
|
997
|
-
}));
|
|
998
|
-
const factoryInput = resumeToolMessages.length > 0 && config.type !== "custom" ? {
|
|
999
|
-
...input,
|
|
1000
|
-
messages: [...input.messages, ...resumeToolMessages]
|
|
1001
|
-
} : input;
|
|
1002
1090
|
(async () => {
|
|
1003
1091
|
const runFinishedDetails = {};
|
|
1004
1092
|
try {
|
|
1093
|
+
const toolCallIds = new Set(input.messages.flatMap((message) => message.role === "assistant" ? (message.toolCalls ?? []).map((call) => call.id) : []));
|
|
1094
|
+
const answeredToolMessages = input.messages.filter((message) => message.role === "tool");
|
|
1095
|
+
const answeredToolCallIds = new Set(answeredToolMessages.map((message) => message.toolCallId));
|
|
1096
|
+
const nativeResume = config.type === "custom" ? [] : input.resume ?? [];
|
|
1097
|
+
const resumeToolMessages = [];
|
|
1098
|
+
const decisionsByCall = /* @__PURE__ */ new Map();
|
|
1099
|
+
for (const entry of nativeResume) {
|
|
1100
|
+
if (!toolCallIds.has(entry.interruptId)) continue;
|
|
1101
|
+
const content = JSON.stringify(entry.status === "cancelled" ? { status: "cancelled" } : entry.payload ?? { status: "resolved" });
|
|
1102
|
+
if (decisionsByCall.has(entry.interruptId)) {
|
|
1103
|
+
if (decisionsByCall.get(entry.interruptId) !== content) throw new Error(`Conflicting decisions for resumed tool call ${entry.interruptId}`);
|
|
1104
|
+
continue;
|
|
1105
|
+
}
|
|
1106
|
+
decisionsByCall.set(entry.interruptId, content);
|
|
1107
|
+
if (answeredToolCallIds.has(entry.interruptId)) continue;
|
|
1108
|
+
resumeToolMessages.push({
|
|
1109
|
+
id: randomUUID(),
|
|
1110
|
+
role: "tool",
|
|
1111
|
+
toolCallId: entry.interruptId,
|
|
1112
|
+
content
|
|
1113
|
+
});
|
|
1114
|
+
}
|
|
1115
|
+
const resumedIds = new Set(nativeResume.map((entry) => entry.interruptId));
|
|
1116
|
+
const resumedResults = new Map([...answeredToolMessages, ...resumeToolMessages].filter((message) => resumedIds.has(message.toolCallId)).map((message) => [message.toolCallId, message.content]));
|
|
1117
|
+
for (const message of resumeToolMessages) {
|
|
1118
|
+
const event = {
|
|
1119
|
+
type: EventType.TOOL_CALL_RESULT,
|
|
1120
|
+
messageId: message.id,
|
|
1121
|
+
toolCallId: message.toolCallId,
|
|
1122
|
+
role: "tool",
|
|
1123
|
+
content: message.content
|
|
1124
|
+
};
|
|
1125
|
+
subscriber.next(event);
|
|
1126
|
+
}
|
|
1127
|
+
const factoryInput = resumeToolMessages.length > 0 && config.type !== "custom" ? {
|
|
1128
|
+
...input,
|
|
1129
|
+
messages: [...input.messages, ...resumeToolMessages]
|
|
1130
|
+
} : input;
|
|
1005
1131
|
const learnedSkills = await prepareLearnedSkills(this.skillRegistry, controller.signal);
|
|
1006
1132
|
controller.signal.throwIfAborted();
|
|
1007
1133
|
const factoryCtx = {
|
|
@@ -1028,6 +1154,10 @@ This is state from the application that you can edit by calling AGUISendStateSna
|
|
|
1028
1154
|
}
|
|
1029
1155
|
}
|
|
1030
1156
|
for await (const event of events) {
|
|
1157
|
+
if (event.type === EventType.TOOL_CALL_RESULT && "toolCallId" in event && typeof event.toolCallId === "string" && "content" in event && resumedResults.has(event.toolCallId)) {
|
|
1158
|
+
if (resumedResults.get(event.toolCallId) !== event.content) throw new Error(`Conflicting result for resumed tool call ${event.toolCallId}`);
|
|
1159
|
+
continue;
|
|
1160
|
+
}
|
|
1031
1161
|
if (config.type === "custom" && event.type === EventType.RUN_FINISHED) {
|
|
1032
1162
|
customRunFinishedEvent = event;
|
|
1033
1163
|
collectStandardRunFinishedDetails(event, runFinishedDetails);
|