@inkeep/agents-run-api 0.39.4 → 0.40.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/_virtual/_raw_/home/runner/work/agents/agents/agents-run-api/templates/v1/phase1/system-prompt.js +5 -0
- package/dist/_virtual/_raw_/home/runner/work/agents/agents/agents-run-api/templates/v1/phase1/thinking-preparation.js +5 -0
- package/dist/_virtual/_raw_/home/runner/work/agents/agents/agents-run-api/templates/v1/phase1/tool.js +5 -0
- package/dist/_virtual/_raw_/home/runner/work/agents/agents/agents-run-api/templates/v1/phase2/data-component.js +5 -0
- package/dist/_virtual/_raw_/home/runner/work/agents/agents/agents-run-api/templates/v1/phase2/data-components.js +5 -0
- package/dist/_virtual/_raw_/home/runner/work/agents/agents/agents-run-api/templates/v1/phase2/system-prompt.js +5 -0
- package/dist/_virtual/_raw_/home/runner/work/agents/agents/agents-run-api/templates/v1/shared/artifact-retrieval-guidance.js +5 -0
- package/dist/_virtual/_raw_/home/runner/work/agents/agents/agents-run-api/templates/v1/shared/artifact.js +5 -0
- package/dist/a2a/client.d.ts +184 -0
- package/dist/a2a/client.js +510 -0
- package/dist/a2a/handlers.d.ts +7 -0
- package/dist/a2a/handlers.js +560 -0
- package/dist/a2a/transfer.d.ts +22 -0
- package/dist/a2a/transfer.js +46 -0
- package/dist/a2a/types.d.ts +79 -0
- package/dist/a2a/types.js +22 -0
- package/dist/agents/Agent.d.ts +266 -0
- package/dist/agents/Agent.js +1927 -0
- package/dist/agents/ModelFactory.d.ts +63 -0
- package/dist/agents/ModelFactory.js +194 -0
- package/dist/agents/SystemPromptBuilder.d.ts +21 -0
- package/dist/agents/SystemPromptBuilder.js +48 -0
- package/dist/agents/ToolSessionManager.d.ts +63 -0
- package/dist/agents/ToolSessionManager.js +146 -0
- package/dist/agents/generateTaskHandler.d.ts +49 -0
- package/dist/agents/generateTaskHandler.js +521 -0
- package/dist/agents/relationTools.d.ts +57 -0
- package/dist/agents/relationTools.js +262 -0
- package/dist/agents/types.d.ts +28 -0
- package/dist/agents/types.js +1 -0
- package/dist/agents/versions/v1/Phase1Config.d.ts +27 -0
- package/dist/agents/versions/v1/Phase1Config.js +424 -0
- package/dist/agents/versions/v1/Phase2Config.d.ts +31 -0
- package/dist/agents/versions/v1/Phase2Config.js +330 -0
- package/dist/constants/execution-limits/defaults.d.ts +51 -0
- package/dist/constants/execution-limits/defaults.js +52 -0
- package/dist/constants/execution-limits/index.d.ts +6 -0
- package/dist/constants/execution-limits/index.js +21 -0
- package/dist/create-app.d.ts +9 -0
- package/dist/create-app.js +195 -0
- package/dist/data/agent.d.ts +7 -0
- package/dist/data/agent.js +72 -0
- package/dist/data/agents.d.ts +34 -0
- package/dist/data/agents.js +139 -0
- package/dist/data/conversations.d.ts +128 -0
- package/dist/data/conversations.js +522 -0
- package/dist/data/db/dbClient.d.ts +6 -0
- package/dist/data/db/dbClient.js +17 -0
- package/dist/env.d.ts +57 -0
- package/dist/env.js +1 -2
- package/dist/handlers/executionHandler.d.ts +39 -0
- package/dist/handlers/executionHandler.js +456 -0
- package/dist/index.d.ts +8 -29
- package/dist/index.js +5 -11235
- package/dist/instrumentation.d.ts +1 -2
- package/dist/instrumentation.js +66 -3
- package/dist/{logger2.js → logger.d.ts} +1 -2
- package/dist/logger.js +1 -1
- package/dist/middleware/api-key-auth.d.ts +26 -0
- package/dist/middleware/api-key-auth.js +240 -0
- package/dist/middleware/index.d.ts +2 -0
- package/dist/middleware/index.js +3 -0
- package/dist/openapi.d.ts +4 -0
- package/dist/openapi.js +54 -0
- package/dist/routes/agents.d.ts +12 -0
- package/dist/routes/agents.js +147 -0
- package/dist/routes/chat.d.ts +13 -0
- package/dist/routes/chat.js +293 -0
- package/dist/routes/chatDataStream.d.ts +13 -0
- package/dist/routes/chatDataStream.js +352 -0
- package/dist/routes/mcp.d.ts +13 -0
- package/dist/routes/mcp.js +495 -0
- package/dist/services/AgentSession.d.ts +356 -0
- package/dist/services/AgentSession.js +1208 -0
- package/dist/services/ArtifactParser.d.ts +105 -0
- package/dist/services/ArtifactParser.js +338 -0
- package/dist/services/ArtifactService.d.ts +123 -0
- package/dist/services/ArtifactService.js +612 -0
- package/dist/services/BaseCompressor.d.ts +183 -0
- package/dist/services/BaseCompressor.js +504 -0
- package/dist/services/ConversationCompressor.d.ts +32 -0
- package/dist/services/ConversationCompressor.js +91 -0
- package/dist/services/IncrementalStreamParser.d.ts +98 -0
- package/dist/services/IncrementalStreamParser.js +327 -0
- package/dist/services/MidGenerationCompressor.d.ts +63 -0
- package/dist/services/MidGenerationCompressor.js +104 -0
- package/dist/services/PendingToolApprovalManager.d.ts +62 -0
- package/dist/services/PendingToolApprovalManager.js +133 -0
- package/dist/services/ResponseFormatter.d.ts +39 -0
- package/dist/services/ResponseFormatter.js +152 -0
- package/dist/tools/NativeSandboxExecutor.d.ts +38 -0
- package/dist/tools/NativeSandboxExecutor.js +432 -0
- package/dist/tools/SandboxExecutorFactory.d.ts +36 -0
- package/dist/tools/SandboxExecutorFactory.js +80 -0
- package/dist/tools/VercelSandboxExecutor.d.ts +71 -0
- package/dist/tools/VercelSandboxExecutor.js +340 -0
- package/dist/tools/distill-conversation-history-tool.d.ts +62 -0
- package/dist/tools/distill-conversation-history-tool.js +206 -0
- package/dist/tools/distill-conversation-tool.d.ts +41 -0
- package/dist/tools/distill-conversation-tool.js +141 -0
- package/dist/tools/sandbox-utils.d.ts +18 -0
- package/dist/tools/sandbox-utils.js +53 -0
- package/dist/types/chat.d.ts +27 -0
- package/dist/types/chat.js +1 -0
- package/dist/types/execution-context.d.ts +46 -0
- package/dist/types/execution-context.js +27 -0
- package/dist/types/xml.d.ts +5 -0
- package/dist/utils/SchemaProcessor.d.ts +52 -0
- package/dist/utils/SchemaProcessor.js +182 -0
- package/dist/utils/agent-operations.d.ts +62 -0
- package/dist/utils/agent-operations.js +53 -0
- package/dist/utils/artifact-component-schema.d.ts +42 -0
- package/dist/utils/artifact-component-schema.js +186 -0
- package/dist/utils/cleanup.d.ts +21 -0
- package/dist/utils/cleanup.js +59 -0
- package/dist/utils/data-component-schema.d.ts +2 -0
- package/dist/utils/data-component-schema.js +3 -0
- package/dist/utils/default-status-schemas.d.ts +20 -0
- package/dist/utils/default-status-schemas.js +24 -0
- package/dist/utils/json-postprocessor.d.ts +13 -0
- package/dist/{json-postprocessor.cjs → utils/json-postprocessor.js} +1 -2
- package/dist/utils/model-context-utils.d.ts +39 -0
- package/dist/utils/model-context-utils.js +181 -0
- package/dist/utils/model-resolver.d.ts +6 -0
- package/dist/utils/model-resolver.js +34 -0
- package/dist/utils/schema-validation.d.ts +44 -0
- package/dist/utils/schema-validation.js +97 -0
- package/dist/utils/stream-helpers.d.ts +197 -0
- package/dist/utils/stream-helpers.js +518 -0
- package/dist/utils/stream-registry.d.ts +22 -0
- package/dist/utils/stream-registry.js +34 -0
- package/dist/utils/token-estimator.d.ts +69 -0
- package/dist/utils/token-estimator.js +53 -0
- package/dist/utils/tracer.d.ts +7 -0
- package/dist/utils/tracer.js +7 -0
- package/package.json +5 -20
- package/dist/SandboxExecutorFactory.cjs +0 -895
- package/dist/SandboxExecutorFactory.js +0 -893
- package/dist/SandboxExecutorFactory.js.map +0 -1
- package/dist/chunk-VBDAOXYI.cjs +0 -927
- package/dist/chunk-VBDAOXYI.js +0 -832
- package/dist/chunk-VBDAOXYI.js.map +0 -1
- package/dist/chunk.cjs +0 -34
- package/dist/conversations.cjs +0 -7
- package/dist/conversations.js +0 -7
- package/dist/conversations2.cjs +0 -209
- package/dist/conversations2.js +0 -180
- package/dist/conversations2.js.map +0 -1
- package/dist/dbClient.cjs +0 -9676
- package/dist/dbClient.js +0 -9670
- package/dist/dbClient.js.map +0 -1
- package/dist/dbClient2.cjs +0 -5
- package/dist/dbClient2.js +0 -5
- package/dist/env.cjs +0 -59
- package/dist/env.js.map +0 -1
- package/dist/execution-limits.cjs +0 -260
- package/dist/execution-limits.js +0 -63
- package/dist/execution-limits.js.map +0 -1
- package/dist/index.cjs +0 -11260
- package/dist/index.d.cts +0 -36
- package/dist/index.d.cts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/instrumentation.cjs +0 -12
- package/dist/instrumentation.d.cts +0 -18
- package/dist/instrumentation.d.cts.map +0 -1
- package/dist/instrumentation.d.ts.map +0 -1
- package/dist/instrumentation2.cjs +0 -116
- package/dist/instrumentation2.js +0 -69
- package/dist/instrumentation2.js.map +0 -1
- package/dist/json-postprocessor.js +0 -20
- package/dist/json-postprocessor.js.map +0 -1
- package/dist/logger.cjs +0 -5
- package/dist/logger2.cjs +0 -1
- package/dist/nodefs.cjs +0 -29
- package/dist/nodefs.js +0 -27
- package/dist/nodefs.js.map +0 -1
- package/dist/opfs-ahp.cjs +0 -367
- package/dist/opfs-ahp.js +0 -368
- package/dist/opfs-ahp.js.map +0 -1
|
@@ -0,0 +1,560 @@
|
|
|
1
|
+
import { getLogger } from "../logger.js";
|
|
2
|
+
import dbClient_default from "../data/db/dbClient.js";
|
|
3
|
+
import { TaskState, createMessage, createTask, generateId, getRequestExecutionContext, updateTask } from "@inkeep/agents-core";
|
|
4
|
+
import { streamSSE } from "hono/streaming";
|
|
5
|
+
|
|
6
|
+
//#region src/a2a/handlers.ts
|
|
7
|
+
const logger = getLogger("a2aHandler");
|
|
8
|
+
async function a2aHandler(c, agent) {
|
|
9
|
+
try {
|
|
10
|
+
const rpcRequest = c.get("requestBody");
|
|
11
|
+
if (rpcRequest.jsonrpc !== "2.0") return c.json({
|
|
12
|
+
jsonrpc: "2.0",
|
|
13
|
+
error: {
|
|
14
|
+
code: -32600,
|
|
15
|
+
message: "Invalid Request - must be JSON-RPC 2.0"
|
|
16
|
+
},
|
|
17
|
+
id: rpcRequest.id
|
|
18
|
+
});
|
|
19
|
+
switch (rpcRequest.method) {
|
|
20
|
+
case "message/send": return await handleMessageSend(c, agent, rpcRequest);
|
|
21
|
+
case "message/stream": return await handleMessageStream(c, agent, rpcRequest);
|
|
22
|
+
case "tasks/get": return await handleTasksGet(c, agent, rpcRequest);
|
|
23
|
+
case "tasks/cancel": return await handleTasksCancel(c, agent, rpcRequest);
|
|
24
|
+
case "tasks/resubscribe": return await handleTasksResubscribe(c, agent, rpcRequest);
|
|
25
|
+
case "agent.invoke": return await handleAgentInvoke(c, agent, rpcRequest);
|
|
26
|
+
case "agent.getCapabilities": return await handleGetCapabilities(c, agent, rpcRequest);
|
|
27
|
+
case "agent.getStatus": return await handleGetStatus(c, agent, rpcRequest);
|
|
28
|
+
default: return c.json({
|
|
29
|
+
jsonrpc: "2.0",
|
|
30
|
+
error: {
|
|
31
|
+
code: -32601,
|
|
32
|
+
message: `Method not found: ${rpcRequest.method}`
|
|
33
|
+
},
|
|
34
|
+
id: rpcRequest.id
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
} catch (error) {
|
|
38
|
+
console.error("A2A Handler Error:", error);
|
|
39
|
+
return c.json({
|
|
40
|
+
jsonrpc: "2.0",
|
|
41
|
+
error: {
|
|
42
|
+
code: -32700,
|
|
43
|
+
message: "Parse error"
|
|
44
|
+
},
|
|
45
|
+
id: null
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
async function handleMessageSend(c, agent, request) {
|
|
50
|
+
try {
|
|
51
|
+
const params = request.params;
|
|
52
|
+
const { agentId } = getRequestExecutionContext(c);
|
|
53
|
+
const task = {
|
|
54
|
+
id: generateId(),
|
|
55
|
+
input: { parts: params.message.parts.map((part) => ({
|
|
56
|
+
kind: part.kind,
|
|
57
|
+
text: part.kind === "text" ? part.text : void 0,
|
|
58
|
+
data: part.kind === "data" ? part.data : void 0
|
|
59
|
+
})) },
|
|
60
|
+
context: {
|
|
61
|
+
conversationId: params.message.contextId,
|
|
62
|
+
metadata: {
|
|
63
|
+
blocking: params.configuration?.blocking ?? false,
|
|
64
|
+
custom: { agent_id: agentId || "" },
|
|
65
|
+
...params.message.metadata
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
let effectiveContextId = params.message?.contextId;
|
|
70
|
+
if (!effectiveContextId || effectiveContextId === "default") effectiveContextId = task.context?.conversationId;
|
|
71
|
+
if (!effectiveContextId || effectiveContextId === "default") {
|
|
72
|
+
if (params.message?.metadata?.conversationId && params.message.metadata.conversationId !== "default") effectiveContextId = params.message.metadata.conversationId;
|
|
73
|
+
}
|
|
74
|
+
if (!effectiveContextId || effectiveContextId === "default") effectiveContextId = "default";
|
|
75
|
+
try {
|
|
76
|
+
if (params.message && Object.keys(params.message).length > 0) JSON.stringify(params.message);
|
|
77
|
+
else {
|
|
78
|
+
JSON.stringify({
|
|
79
|
+
role: "agent",
|
|
80
|
+
parts: [{
|
|
81
|
+
text: "Delegation task",
|
|
82
|
+
kind: "text"
|
|
83
|
+
}],
|
|
84
|
+
contextId: effectiveContextId,
|
|
85
|
+
messageId: task.id,
|
|
86
|
+
kind: "message"
|
|
87
|
+
});
|
|
88
|
+
logger.warn({
|
|
89
|
+
taskId: task.id,
|
|
90
|
+
subAgentId: agent.subAgentId,
|
|
91
|
+
originalMessage: params.message
|
|
92
|
+
}, "Created fallback message content for empty delegation message");
|
|
93
|
+
}
|
|
94
|
+
} catch (error) {
|
|
95
|
+
logger.error({
|
|
96
|
+
error,
|
|
97
|
+
taskId: task.id
|
|
98
|
+
}, "Failed to serialize message");
|
|
99
|
+
JSON.stringify({
|
|
100
|
+
error: "Failed to serialize message",
|
|
101
|
+
taskId: task.id,
|
|
102
|
+
contextId: effectiveContextId,
|
|
103
|
+
parts: [{
|
|
104
|
+
text: "Error in delegation",
|
|
105
|
+
kind: "text"
|
|
106
|
+
}]
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
logger.info({
|
|
110
|
+
originalContextId: params.message.contextId,
|
|
111
|
+
taskContextId: task.context?.conversationId,
|
|
112
|
+
metadataContextId: params.message.metadata?.conversationId,
|
|
113
|
+
finalContextId: effectiveContextId,
|
|
114
|
+
subAgentId: agent.subAgentId
|
|
115
|
+
}, "A2A contextId resolution for delegation");
|
|
116
|
+
await createTask(dbClient_default)({
|
|
117
|
+
id: task.id,
|
|
118
|
+
tenantId: agent.tenantId,
|
|
119
|
+
projectId: agent.projectId,
|
|
120
|
+
agentId: agentId || "",
|
|
121
|
+
contextId: effectiveContextId,
|
|
122
|
+
status: "working",
|
|
123
|
+
metadata: {
|
|
124
|
+
conversation_id: effectiveContextId,
|
|
125
|
+
message_id: params.message.messageId || "",
|
|
126
|
+
created_at: (/* @__PURE__ */ new Date()).toISOString(),
|
|
127
|
+
updated_at: (/* @__PURE__ */ new Date()).toISOString(),
|
|
128
|
+
sub_agent_id: agent.subAgentId,
|
|
129
|
+
agent_id: agentId || "",
|
|
130
|
+
stream_request_id: params.message.metadata?.stream_request_id
|
|
131
|
+
},
|
|
132
|
+
subAgentId: agent.subAgentId,
|
|
133
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
134
|
+
updatedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
135
|
+
});
|
|
136
|
+
logger.info({ metadata: params.message.metadata }, "message metadata");
|
|
137
|
+
if (params.message.metadata?.fromSubAgentId || params.message.metadata?.fromExternalAgentId || params.message.metadata?.fromTeamAgentId) {
|
|
138
|
+
const messageText = params.message.parts.filter((part) => part.kind === "text" && "text" in part && part.text).map((part) => part.text).join(" ");
|
|
139
|
+
try {
|
|
140
|
+
const messageData = {
|
|
141
|
+
id: generateId(),
|
|
142
|
+
tenantId: agent.tenantId,
|
|
143
|
+
projectId: agent.projectId,
|
|
144
|
+
conversationId: effectiveContextId,
|
|
145
|
+
role: "agent",
|
|
146
|
+
content: { text: messageText },
|
|
147
|
+
visibility: params.message.metadata?.fromExternalAgentId ? "external" : "internal",
|
|
148
|
+
messageType: "a2a-request",
|
|
149
|
+
taskId: task.id
|
|
150
|
+
};
|
|
151
|
+
if (params.message.metadata?.fromSubAgentId) {
|
|
152
|
+
messageData.fromSubAgentId = params.message.metadata.fromSubAgentId;
|
|
153
|
+
messageData.toSubAgentId = agent.subAgentId;
|
|
154
|
+
} else if (params.message.metadata?.fromExternalAgentId) {
|
|
155
|
+
messageData.fromExternalAgentId = params.message.metadata.fromExternalAgentId;
|
|
156
|
+
messageData.toSubAgentId = agent.subAgentId;
|
|
157
|
+
} else if (params.message.metadata?.fromTeamAgentId) {
|
|
158
|
+
messageData.fromTeamAgentId = params.message.metadata.fromTeamAgentId;
|
|
159
|
+
messageData.toTeamAgentId = agent.subAgentId;
|
|
160
|
+
}
|
|
161
|
+
await createMessage(dbClient_default)(messageData);
|
|
162
|
+
logger.info({
|
|
163
|
+
fromSubAgentId: params.message.metadata.fromSubAgentId,
|
|
164
|
+
fromExternalAgentId: params.message.metadata.fromExternalAgentId,
|
|
165
|
+
fromTeamAgentId: params.message.metadata.fromTeamAgentId,
|
|
166
|
+
toSubAgentId: agent.subAgentId,
|
|
167
|
+
toTeamAgentId: params.message.metadata.fromTeamAgentId ? agent.subAgentId : void 0,
|
|
168
|
+
conversationId: effectiveContextId,
|
|
169
|
+
messageType: "a2a-request",
|
|
170
|
+
taskId: task.id
|
|
171
|
+
}, "A2A message stored in database");
|
|
172
|
+
} catch (error) {
|
|
173
|
+
logger.error({
|
|
174
|
+
error,
|
|
175
|
+
fromSubAgentId: params.message.metadata.fromSubAgentId,
|
|
176
|
+
fromExternalAgentId: params.message.metadata.fromExternalAgentId,
|
|
177
|
+
fromTeamAgentId: params.message.metadata.fromTeamAgentId,
|
|
178
|
+
toSubAgentId: agent.subAgentId,
|
|
179
|
+
conversationId: effectiveContextId
|
|
180
|
+
}, "Failed to store A2A message in database");
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
const result = await agent.taskHandler(task);
|
|
184
|
+
await updateTask(dbClient_default)({
|
|
185
|
+
taskId: task.id,
|
|
186
|
+
data: {
|
|
187
|
+
status: result.status.state.toLowerCase(),
|
|
188
|
+
metadata: {
|
|
189
|
+
conversation_id: params.message.contextId || "",
|
|
190
|
+
message_id: params.message.messageId || "",
|
|
191
|
+
created_at: (/* @__PURE__ */ new Date()).toISOString(),
|
|
192
|
+
updated_at: (/* @__PURE__ */ new Date()).toISOString(),
|
|
193
|
+
sub_agent_id: agent.subAgentId,
|
|
194
|
+
agent_id: agentId || ""
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
const transferArtifact = result.artifacts?.find((artifact) => artifact.parts?.some((part) => part.kind === "data" && part.data && typeof part.data === "object" && part.data.type === "transfer"));
|
|
199
|
+
if (transferArtifact) {
|
|
200
|
+
const transferPart = transferArtifact.parts?.find((part) => part.kind === "data" && part.data && typeof part.data === "object" && part.data.type === "transfer");
|
|
201
|
+
if (transferPart && transferPart.kind === "data" && transferPart.data) {
|
|
202
|
+
logger.info({ transferPart }, "transferPart");
|
|
203
|
+
return c.json({
|
|
204
|
+
jsonrpc: "2.0",
|
|
205
|
+
result: {
|
|
206
|
+
kind: "task",
|
|
207
|
+
contextId: params.message.contextId,
|
|
208
|
+
id: task.id,
|
|
209
|
+
status: {
|
|
210
|
+
state: TaskState.Completed,
|
|
211
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
212
|
+
},
|
|
213
|
+
artifacts: [{
|
|
214
|
+
artifactId: generateId(),
|
|
215
|
+
parts: [{
|
|
216
|
+
kind: "data",
|
|
217
|
+
data: {
|
|
218
|
+
type: "transfer",
|
|
219
|
+
targetSubAgentId: transferPart.data.targetSubAgentId,
|
|
220
|
+
fromSubAgentId: transferPart.data.fromSubAgentId
|
|
221
|
+
}
|
|
222
|
+
}, {
|
|
223
|
+
kind: "text",
|
|
224
|
+
text: transferPart.data.reason || "Agent requested transfer"
|
|
225
|
+
}]
|
|
226
|
+
}]
|
|
227
|
+
},
|
|
228
|
+
id: request.id
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
if (result.status.state === TaskState.Failed) {
|
|
233
|
+
if (result.status.type === "connection_refused") return c.json({
|
|
234
|
+
jsonrpc: "2.0",
|
|
235
|
+
error: {
|
|
236
|
+
code: -32603,
|
|
237
|
+
message: result.status.message || "Agent execution failed",
|
|
238
|
+
data: { type: "connection_refused" }
|
|
239
|
+
}
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
const taskStatus = {
|
|
243
|
+
state: result.status.state,
|
|
244
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
245
|
+
};
|
|
246
|
+
if (params.configuration?.blocking === false) {
|
|
247
|
+
const taskResponse = {
|
|
248
|
+
id: task.id,
|
|
249
|
+
contextId: params.message.contextId || generateId(),
|
|
250
|
+
status: taskStatus,
|
|
251
|
+
artifacts: result.artifacts,
|
|
252
|
+
kind: "task"
|
|
253
|
+
};
|
|
254
|
+
return c.json({
|
|
255
|
+
jsonrpc: "2.0",
|
|
256
|
+
result: taskResponse,
|
|
257
|
+
id: request.id
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
const messageResponse = {
|
|
261
|
+
messageId: generateId(),
|
|
262
|
+
parts: result.artifacts?.[0]?.parts || [{
|
|
263
|
+
kind: "text",
|
|
264
|
+
text: "Task completed successfully"
|
|
265
|
+
}],
|
|
266
|
+
role: "agent",
|
|
267
|
+
taskId: task.id,
|
|
268
|
+
contextId: params.message.contextId,
|
|
269
|
+
kind: "message"
|
|
270
|
+
};
|
|
271
|
+
return c.json({
|
|
272
|
+
jsonrpc: "2.0",
|
|
273
|
+
result: messageResponse,
|
|
274
|
+
id: request.id
|
|
275
|
+
});
|
|
276
|
+
} catch (error) {
|
|
277
|
+
return c.json({
|
|
278
|
+
jsonrpc: "2.0",
|
|
279
|
+
error: {
|
|
280
|
+
code: -32603,
|
|
281
|
+
message: "Internal error during message send",
|
|
282
|
+
data: error instanceof Error ? error.message : "Unknown error"
|
|
283
|
+
},
|
|
284
|
+
id: request.id
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
async function handleMessageStream(c, agent, request) {
|
|
289
|
+
try {
|
|
290
|
+
const params = request.params;
|
|
291
|
+
const { agentId } = getRequestExecutionContext(c);
|
|
292
|
+
if (!agent.agentCard.capabilities.streaming) return c.json({
|
|
293
|
+
jsonrpc: "2.0",
|
|
294
|
+
error: {
|
|
295
|
+
code: -32604,
|
|
296
|
+
message: "Agent does not support streaming"
|
|
297
|
+
},
|
|
298
|
+
id: request.id
|
|
299
|
+
});
|
|
300
|
+
const task = {
|
|
301
|
+
id: generateId(),
|
|
302
|
+
input: { parts: params.message.parts.map((part) => ({
|
|
303
|
+
kind: part.kind,
|
|
304
|
+
text: part.kind === "text" ? part.text : void 0,
|
|
305
|
+
data: part.kind === "data" ? part.data : void 0
|
|
306
|
+
})) },
|
|
307
|
+
context: {
|
|
308
|
+
conversationId: params.message.contextId,
|
|
309
|
+
metadata: {
|
|
310
|
+
blocking: false,
|
|
311
|
+
custom: { agent_id: agentId || "" }
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
};
|
|
315
|
+
return streamSSE(c, async (stream$1) => {
|
|
316
|
+
try {
|
|
317
|
+
const initialTask = {
|
|
318
|
+
id: task.id,
|
|
319
|
+
contextId: params.message.contextId || generateId(),
|
|
320
|
+
status: {
|
|
321
|
+
state: TaskState.Working,
|
|
322
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
323
|
+
},
|
|
324
|
+
artifacts: [],
|
|
325
|
+
kind: "task"
|
|
326
|
+
};
|
|
327
|
+
await stream$1.writeSSE({ data: JSON.stringify({
|
|
328
|
+
jsonrpc: "2.0",
|
|
329
|
+
result: initialTask,
|
|
330
|
+
id: request.id
|
|
331
|
+
}) });
|
|
332
|
+
const result = await agent.taskHandler(task);
|
|
333
|
+
const transferArtifact = result.artifacts?.find((artifact) => artifact.parts?.some((part) => part.kind === "data" && part.data && typeof part.data === "object" && part.data.type === "transfer"));
|
|
334
|
+
if (transferArtifact) {
|
|
335
|
+
const transferPart = transferArtifact.parts?.find((part) => part.kind === "data" && part.data && typeof part.data === "object" && part.data.type === "transfer");
|
|
336
|
+
if (transferPart && transferPart.kind === "data" && transferPart.data) {
|
|
337
|
+
await stream$1.writeSSE({ data: JSON.stringify({
|
|
338
|
+
jsonrpc: "2.0",
|
|
339
|
+
result: {
|
|
340
|
+
type: "transfer",
|
|
341
|
+
target: transferPart.data.targetSubAgentId,
|
|
342
|
+
task_id: task.id,
|
|
343
|
+
reason: transferPart.data.reason || "Agent requested transfer",
|
|
344
|
+
original_message: transferPart.data.original_message,
|
|
345
|
+
context: {
|
|
346
|
+
conversationId: params.message.contextId,
|
|
347
|
+
tenantId: agent.tenantId,
|
|
348
|
+
transfer_context: result.artifacts
|
|
349
|
+
}
|
|
350
|
+
},
|
|
351
|
+
id: request.id
|
|
352
|
+
}) });
|
|
353
|
+
return;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
const messageResponse = {
|
|
357
|
+
messageId: generateId(),
|
|
358
|
+
parts: result.artifacts?.[0]?.parts || [{
|
|
359
|
+
kind: "text",
|
|
360
|
+
text: "Task completed successfully"
|
|
361
|
+
}],
|
|
362
|
+
role: "agent",
|
|
363
|
+
taskId: task.id,
|
|
364
|
+
contextId: params.message.contextId,
|
|
365
|
+
kind: "message"
|
|
366
|
+
};
|
|
367
|
+
await stream$1.writeSSE({ data: JSON.stringify({
|
|
368
|
+
jsonrpc: "2.0",
|
|
369
|
+
result: messageResponse,
|
|
370
|
+
id: request.id
|
|
371
|
+
}) });
|
|
372
|
+
const completedTask = {
|
|
373
|
+
...initialTask,
|
|
374
|
+
status: {
|
|
375
|
+
state: TaskState.Completed,
|
|
376
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
377
|
+
},
|
|
378
|
+
artifacts: result.artifacts
|
|
379
|
+
};
|
|
380
|
+
await stream$1.writeSSE({ data: JSON.stringify({
|
|
381
|
+
jsonrpc: "2.0",
|
|
382
|
+
result: completedTask,
|
|
383
|
+
id: request.id
|
|
384
|
+
}) });
|
|
385
|
+
} catch (error) {
|
|
386
|
+
console.error("Error in stream execution:", error);
|
|
387
|
+
await stream$1.writeSSE({ data: JSON.stringify({
|
|
388
|
+
jsonrpc: "2.0",
|
|
389
|
+
error: {
|
|
390
|
+
code: -32603,
|
|
391
|
+
message: "Internal error during streaming execution",
|
|
392
|
+
data: error instanceof Error ? error.message : "Unknown error"
|
|
393
|
+
},
|
|
394
|
+
id: request.id
|
|
395
|
+
}) });
|
|
396
|
+
}
|
|
397
|
+
});
|
|
398
|
+
} catch (error) {
|
|
399
|
+
return c.json({
|
|
400
|
+
jsonrpc: "2.0",
|
|
401
|
+
error: {
|
|
402
|
+
code: -32603,
|
|
403
|
+
message: "Internal error during message stream setup",
|
|
404
|
+
data: error instanceof Error ? error.message : "Unknown error"
|
|
405
|
+
},
|
|
406
|
+
id: request.id
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
async function handleTasksGet(c, _agent, request) {
|
|
411
|
+
try {
|
|
412
|
+
const params = request.params;
|
|
413
|
+
const task = {
|
|
414
|
+
id: params.id,
|
|
415
|
+
contextId: generateId(),
|
|
416
|
+
status: {
|
|
417
|
+
state: TaskState.Completed,
|
|
418
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
419
|
+
},
|
|
420
|
+
artifacts: [{
|
|
421
|
+
artifactId: generateId(),
|
|
422
|
+
parts: [{
|
|
423
|
+
kind: "text",
|
|
424
|
+
text: `Task ${params.id} completed successfully`
|
|
425
|
+
}],
|
|
426
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
427
|
+
}],
|
|
428
|
+
kind: "task"
|
|
429
|
+
};
|
|
430
|
+
return c.json({
|
|
431
|
+
jsonrpc: "2.0",
|
|
432
|
+
result: task,
|
|
433
|
+
id: request.id
|
|
434
|
+
});
|
|
435
|
+
} catch (error) {
|
|
436
|
+
return c.json({
|
|
437
|
+
jsonrpc: "2.0",
|
|
438
|
+
error: {
|
|
439
|
+
code: -32603,
|
|
440
|
+
message: "Internal error getting task",
|
|
441
|
+
data: error instanceof Error ? error.message : "Unknown error"
|
|
442
|
+
},
|
|
443
|
+
id: request.id
|
|
444
|
+
});
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
async function handleTasksCancel(c, _agent, request) {
|
|
448
|
+
try {
|
|
449
|
+
request.params;
|
|
450
|
+
return c.json({
|
|
451
|
+
jsonrpc: "2.0",
|
|
452
|
+
result: { success: true },
|
|
453
|
+
id: request.id
|
|
454
|
+
});
|
|
455
|
+
} catch (error) {
|
|
456
|
+
return c.json({
|
|
457
|
+
jsonrpc: "2.0",
|
|
458
|
+
error: {
|
|
459
|
+
code: -32603,
|
|
460
|
+
message: "Internal error canceling task",
|
|
461
|
+
data: error instanceof Error ? error.message : "Unknown error"
|
|
462
|
+
},
|
|
463
|
+
id: request.id
|
|
464
|
+
});
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
async function handleAgentInvoke(c, agent, request) {
|
|
468
|
+
try {
|
|
469
|
+
const task = request.params;
|
|
470
|
+
const result = await agent.taskHandler(task);
|
|
471
|
+
return c.json({
|
|
472
|
+
jsonrpc: "2.0",
|
|
473
|
+
result,
|
|
474
|
+
id: request.id
|
|
475
|
+
});
|
|
476
|
+
} catch (error) {
|
|
477
|
+
return c.json({
|
|
478
|
+
jsonrpc: "2.0",
|
|
479
|
+
error: {
|
|
480
|
+
code: -32603,
|
|
481
|
+
message: "Internal error during agent invocation",
|
|
482
|
+
data: error instanceof Error ? error.message : "Unknown error"
|
|
483
|
+
},
|
|
484
|
+
id: request.id
|
|
485
|
+
});
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
async function handleGetCapabilities(c, agent, request) {
|
|
489
|
+
return c.json({
|
|
490
|
+
jsonrpc: "2.0",
|
|
491
|
+
result: agent.agentCard.capabilities,
|
|
492
|
+
id: request.id
|
|
493
|
+
});
|
|
494
|
+
}
|
|
495
|
+
async function handleGetStatus(c, agent, request) {
|
|
496
|
+
return c.json({
|
|
497
|
+
jsonrpc: "2.0",
|
|
498
|
+
result: {
|
|
499
|
+
status: "ready",
|
|
500
|
+
subAgentId: agent.subAgentId
|
|
501
|
+
},
|
|
502
|
+
id: request.id
|
|
503
|
+
});
|
|
504
|
+
}
|
|
505
|
+
async function handleTasksResubscribe(c, agent, request) {
|
|
506
|
+
try {
|
|
507
|
+
const params = request.params;
|
|
508
|
+
if (!agent.agentCard.capabilities.streaming) return c.json({
|
|
509
|
+
jsonrpc: "2.0",
|
|
510
|
+
error: {
|
|
511
|
+
code: -32604,
|
|
512
|
+
message: "Agent does not support streaming for resubscription"
|
|
513
|
+
},
|
|
514
|
+
id: request.id
|
|
515
|
+
});
|
|
516
|
+
return streamSSE(c, async (stream$1) => {
|
|
517
|
+
try {
|
|
518
|
+
const task = {
|
|
519
|
+
id: params.taskId,
|
|
520
|
+
contextId: generateId(),
|
|
521
|
+
status: {
|
|
522
|
+
state: TaskState.Completed,
|
|
523
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
524
|
+
},
|
|
525
|
+
artifacts: [],
|
|
526
|
+
kind: "task"
|
|
527
|
+
};
|
|
528
|
+
await stream$1.writeSSE({ data: JSON.stringify({
|
|
529
|
+
jsonrpc: "2.0",
|
|
530
|
+
result: task,
|
|
531
|
+
id: request.id
|
|
532
|
+
}) });
|
|
533
|
+
} catch (error) {
|
|
534
|
+
console.error("Error in task resubscription:", error);
|
|
535
|
+
await stream$1.writeSSE({ data: JSON.stringify({
|
|
536
|
+
jsonrpc: "2.0",
|
|
537
|
+
error: {
|
|
538
|
+
code: -32603,
|
|
539
|
+
message: "Internal error during task resubscription",
|
|
540
|
+
data: error instanceof Error ? error.message : "Unknown error"
|
|
541
|
+
},
|
|
542
|
+
id: request.id
|
|
543
|
+
}) });
|
|
544
|
+
}
|
|
545
|
+
});
|
|
546
|
+
} catch (error) {
|
|
547
|
+
return c.json({
|
|
548
|
+
jsonrpc: "2.0",
|
|
549
|
+
error: {
|
|
550
|
+
code: -32603,
|
|
551
|
+
message: "Internal error during task resubscription setup",
|
|
552
|
+
data: error instanceof Error ? error.message : "Unknown error"
|
|
553
|
+
},
|
|
554
|
+
id: request.id
|
|
555
|
+
});
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
//#endregion
|
|
560
|
+
export { a2aHandler };
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { extractTransferData, isTransferTask } from "./types.js";
|
|
2
|
+
|
|
3
|
+
//#region src/a2a/transfer.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Executes a transfer by sending the original message to the target agent
|
|
6
|
+
*/
|
|
7
|
+
declare function executeTransfer({
|
|
8
|
+
tenantId,
|
|
9
|
+
threadId,
|
|
10
|
+
projectId,
|
|
11
|
+
targetSubAgentId
|
|
12
|
+
}: {
|
|
13
|
+
tenantId: string;
|
|
14
|
+
threadId: string;
|
|
15
|
+
projectId: string;
|
|
16
|
+
targetSubAgentId: string;
|
|
17
|
+
}): Promise<{
|
|
18
|
+
success: boolean;
|
|
19
|
+
targetSubAgentId: string;
|
|
20
|
+
}>;
|
|
21
|
+
//#endregion
|
|
22
|
+
export { executeTransfer, extractTransferData, isTransferTask as isTransferResponse };
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { getLogger } from "../logger.js";
|
|
2
|
+
import dbClient_default from "../data/db/dbClient.js";
|
|
3
|
+
import { extractTransferData, isTransferTask } from "./types.js";
|
|
4
|
+
import { setActiveAgentForThread } from "@inkeep/agents-core";
|
|
5
|
+
|
|
6
|
+
//#region src/a2a/transfer.ts
|
|
7
|
+
const logger = getLogger("Transfer");
|
|
8
|
+
/**
|
|
9
|
+
* Executes a transfer by sending the original message to the target agent
|
|
10
|
+
*/
|
|
11
|
+
async function executeTransfer({ tenantId, threadId, projectId, targetSubAgentId }) {
|
|
12
|
+
logger.info({
|
|
13
|
+
targetAgent: targetSubAgentId,
|
|
14
|
+
threadId,
|
|
15
|
+
tenantId,
|
|
16
|
+
projectId
|
|
17
|
+
}, "Executing transfer - calling setActiveAgentForThread");
|
|
18
|
+
try {
|
|
19
|
+
await setActiveAgentForThread(dbClient_default)({
|
|
20
|
+
scopes: {
|
|
21
|
+
tenantId,
|
|
22
|
+
projectId
|
|
23
|
+
},
|
|
24
|
+
threadId,
|
|
25
|
+
subAgentId: targetSubAgentId
|
|
26
|
+
});
|
|
27
|
+
logger.info({
|
|
28
|
+
targetAgent: targetSubAgentId,
|
|
29
|
+
threadId
|
|
30
|
+
}, "Successfully updated active_sub_agent_id in database");
|
|
31
|
+
} catch (error) {
|
|
32
|
+
logger.error({
|
|
33
|
+
error,
|
|
34
|
+
targetAgent: targetSubAgentId,
|
|
35
|
+
threadId
|
|
36
|
+
}, "Failed to update active_sub_agent_id");
|
|
37
|
+
throw error;
|
|
38
|
+
}
|
|
39
|
+
return {
|
|
40
|
+
success: true,
|
|
41
|
+
targetSubAgentId
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
//#endregion
|
|
46
|
+
export { executeTransfer, extractTransferData, isTransferTask as isTransferResponse };
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { AgentCard, Artifact, Message, Task, TaskState } from "@inkeep/agents-core";
|
|
2
|
+
|
|
3
|
+
//#region src/a2a/types.d.ts
|
|
4
|
+
interface RegisteredAgent {
|
|
5
|
+
subAgentId: string;
|
|
6
|
+
tenantId: string;
|
|
7
|
+
projectId: string;
|
|
8
|
+
agentId: string;
|
|
9
|
+
agentCard: AgentCard;
|
|
10
|
+
taskHandler: (task: A2ATask) => Promise<A2ATaskResult>;
|
|
11
|
+
}
|
|
12
|
+
interface A2ATask {
|
|
13
|
+
id: string;
|
|
14
|
+
input: {
|
|
15
|
+
parts: Array<{
|
|
16
|
+
kind: string;
|
|
17
|
+
text?: string;
|
|
18
|
+
data?: any;
|
|
19
|
+
}>;
|
|
20
|
+
};
|
|
21
|
+
context?: {
|
|
22
|
+
conversationId?: string;
|
|
23
|
+
userId?: string;
|
|
24
|
+
metadata?: Record<string, any>;
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
type A2ATaskErrorType = 'connection_refused' | 'unknown';
|
|
28
|
+
interface A2ATaskResult {
|
|
29
|
+
status: {
|
|
30
|
+
state: TaskState;
|
|
31
|
+
message?: string;
|
|
32
|
+
type?: A2ATaskErrorType;
|
|
33
|
+
};
|
|
34
|
+
artifacts?: Artifact[];
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Transfer data structure - what the transfer tool returns
|
|
38
|
+
* This gets wrapped into a DataPart by the AI SDK
|
|
39
|
+
*/
|
|
40
|
+
interface TransferData {
|
|
41
|
+
type: 'transfer';
|
|
42
|
+
targetSubAgentId: string;
|
|
43
|
+
fromSubAgentId?: string;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Full transfer response following A2A protocol
|
|
47
|
+
* The TransferData is wrapped in artifacts[0].parts[0].data
|
|
48
|
+
*/
|
|
49
|
+
interface TransferTask extends Task {
|
|
50
|
+
artifacts: Artifact[];
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Type guard to check if a Task contains transfer data
|
|
54
|
+
*/
|
|
55
|
+
declare function isTransferTask(result: Task | Message): result is TransferTask;
|
|
56
|
+
/**
|
|
57
|
+
* Helper to safely extract transfer data from a TransferTask
|
|
58
|
+
* Returns null if no transfer data found
|
|
59
|
+
*/
|
|
60
|
+
declare function extractTransferData(task: TransferTask): TransferData | null;
|
|
61
|
+
interface JsonRpcRequest {
|
|
62
|
+
jsonrpc: '2.0';
|
|
63
|
+
method: string;
|
|
64
|
+
params?: any;
|
|
65
|
+
id?: string | number | null;
|
|
66
|
+
}
|
|
67
|
+
interface JsonRpcResponse {
|
|
68
|
+
jsonrpc: '2.0';
|
|
69
|
+
result?: any;
|
|
70
|
+
error?: {
|
|
71
|
+
code: number;
|
|
72
|
+
message: string;
|
|
73
|
+
data?: any;
|
|
74
|
+
};
|
|
75
|
+
id?: string | number | null;
|
|
76
|
+
}
|
|
77
|
+
type A2AMethod = 'agent.invoke' | 'agent.getCapabilities' | 'agent.getStatus';
|
|
78
|
+
//#endregion
|
|
79
|
+
export { A2AMethod, A2ATask, A2ATaskErrorType, A2ATaskResult, type AgentCard, JsonRpcRequest, JsonRpcResponse, RegisteredAgent, TransferData, TransferTask, extractTransferData, isTransferTask };
|