@inkeep/agents-run-api 0.39.5 → 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.
Files changed (180) hide show
  1. package/dist/_virtual/_raw_/home/runner/work/agents/agents/agents-run-api/templates/v1/phase1/system-prompt.js +5 -0
  2. package/dist/_virtual/_raw_/home/runner/work/agents/agents/agents-run-api/templates/v1/phase1/thinking-preparation.js +5 -0
  3. package/dist/_virtual/_raw_/home/runner/work/agents/agents/agents-run-api/templates/v1/phase1/tool.js +5 -0
  4. package/dist/_virtual/_raw_/home/runner/work/agents/agents/agents-run-api/templates/v1/phase2/data-component.js +5 -0
  5. package/dist/_virtual/_raw_/home/runner/work/agents/agents/agents-run-api/templates/v1/phase2/data-components.js +5 -0
  6. package/dist/_virtual/_raw_/home/runner/work/agents/agents/agents-run-api/templates/v1/phase2/system-prompt.js +5 -0
  7. package/dist/_virtual/_raw_/home/runner/work/agents/agents/agents-run-api/templates/v1/shared/artifact-retrieval-guidance.js +5 -0
  8. package/dist/_virtual/_raw_/home/runner/work/agents/agents/agents-run-api/templates/v1/shared/artifact.js +5 -0
  9. package/dist/a2a/client.d.ts +184 -0
  10. package/dist/a2a/client.js +510 -0
  11. package/dist/a2a/handlers.d.ts +7 -0
  12. package/dist/a2a/handlers.js +560 -0
  13. package/dist/a2a/transfer.d.ts +22 -0
  14. package/dist/a2a/transfer.js +46 -0
  15. package/dist/a2a/types.d.ts +79 -0
  16. package/dist/a2a/types.js +22 -0
  17. package/dist/agents/Agent.d.ts +266 -0
  18. package/dist/agents/Agent.js +1927 -0
  19. package/dist/agents/ModelFactory.d.ts +63 -0
  20. package/dist/agents/ModelFactory.js +194 -0
  21. package/dist/agents/SystemPromptBuilder.d.ts +21 -0
  22. package/dist/agents/SystemPromptBuilder.js +48 -0
  23. package/dist/agents/ToolSessionManager.d.ts +63 -0
  24. package/dist/agents/ToolSessionManager.js +146 -0
  25. package/dist/agents/generateTaskHandler.d.ts +49 -0
  26. package/dist/agents/generateTaskHandler.js +521 -0
  27. package/dist/agents/relationTools.d.ts +57 -0
  28. package/dist/agents/relationTools.js +262 -0
  29. package/dist/agents/types.d.ts +28 -0
  30. package/dist/agents/types.js +1 -0
  31. package/dist/agents/versions/v1/Phase1Config.d.ts +27 -0
  32. package/dist/agents/versions/v1/Phase1Config.js +424 -0
  33. package/dist/agents/versions/v1/Phase2Config.d.ts +31 -0
  34. package/dist/agents/versions/v1/Phase2Config.js +330 -0
  35. package/dist/constants/execution-limits/defaults.d.ts +51 -0
  36. package/dist/constants/execution-limits/defaults.js +52 -0
  37. package/dist/constants/execution-limits/index.d.ts +6 -0
  38. package/dist/constants/execution-limits/index.js +21 -0
  39. package/dist/create-app.d.ts +9 -0
  40. package/dist/create-app.js +195 -0
  41. package/dist/data/agent.d.ts +7 -0
  42. package/dist/data/agent.js +72 -0
  43. package/dist/data/agents.d.ts +34 -0
  44. package/dist/data/agents.js +139 -0
  45. package/dist/data/conversations.d.ts +128 -0
  46. package/dist/data/conversations.js +522 -0
  47. package/dist/data/db/dbClient.d.ts +6 -0
  48. package/dist/data/db/dbClient.js +17 -0
  49. package/dist/env.d.ts +57 -0
  50. package/dist/env.js +1 -2
  51. package/dist/handlers/executionHandler.d.ts +39 -0
  52. package/dist/handlers/executionHandler.js +456 -0
  53. package/dist/index.d.ts +8 -29
  54. package/dist/index.js +5 -11386
  55. package/dist/instrumentation.d.ts +1 -2
  56. package/dist/instrumentation.js +66 -3
  57. package/dist/{logger2.js → logger.d.ts} +1 -2
  58. package/dist/logger.js +1 -1
  59. package/dist/middleware/api-key-auth.d.ts +26 -0
  60. package/dist/middleware/api-key-auth.js +240 -0
  61. package/dist/middleware/index.d.ts +2 -0
  62. package/dist/middleware/index.js +3 -0
  63. package/dist/openapi.d.ts +4 -0
  64. package/dist/openapi.js +54 -0
  65. package/dist/routes/agents.d.ts +12 -0
  66. package/dist/routes/agents.js +147 -0
  67. package/dist/routes/chat.d.ts +13 -0
  68. package/dist/routes/chat.js +293 -0
  69. package/dist/routes/chatDataStream.d.ts +13 -0
  70. package/dist/routes/chatDataStream.js +352 -0
  71. package/dist/routes/mcp.d.ts +13 -0
  72. package/dist/routes/mcp.js +495 -0
  73. package/dist/services/AgentSession.d.ts +356 -0
  74. package/dist/services/AgentSession.js +1208 -0
  75. package/dist/services/ArtifactParser.d.ts +105 -0
  76. package/dist/services/ArtifactParser.js +338 -0
  77. package/dist/services/ArtifactService.d.ts +123 -0
  78. package/dist/services/ArtifactService.js +612 -0
  79. package/dist/services/BaseCompressor.d.ts +183 -0
  80. package/dist/services/BaseCompressor.js +504 -0
  81. package/dist/services/ConversationCompressor.d.ts +32 -0
  82. package/dist/services/ConversationCompressor.js +91 -0
  83. package/dist/services/IncrementalStreamParser.d.ts +98 -0
  84. package/dist/services/IncrementalStreamParser.js +327 -0
  85. package/dist/services/MidGenerationCompressor.d.ts +63 -0
  86. package/dist/services/MidGenerationCompressor.js +104 -0
  87. package/dist/services/PendingToolApprovalManager.d.ts +62 -0
  88. package/dist/services/PendingToolApprovalManager.js +133 -0
  89. package/dist/services/ResponseFormatter.d.ts +39 -0
  90. package/dist/services/ResponseFormatter.js +152 -0
  91. package/dist/tools/NativeSandboxExecutor.d.ts +38 -0
  92. package/dist/tools/NativeSandboxExecutor.js +432 -0
  93. package/dist/tools/SandboxExecutorFactory.d.ts +36 -0
  94. package/dist/tools/SandboxExecutorFactory.js +80 -0
  95. package/dist/tools/VercelSandboxExecutor.d.ts +71 -0
  96. package/dist/tools/VercelSandboxExecutor.js +340 -0
  97. package/dist/tools/distill-conversation-history-tool.d.ts +62 -0
  98. package/dist/tools/distill-conversation-history-tool.js +206 -0
  99. package/dist/tools/distill-conversation-tool.d.ts +41 -0
  100. package/dist/tools/distill-conversation-tool.js +141 -0
  101. package/dist/tools/sandbox-utils.d.ts +18 -0
  102. package/dist/tools/sandbox-utils.js +53 -0
  103. package/dist/types/chat.d.ts +27 -0
  104. package/dist/types/chat.js +1 -0
  105. package/dist/types/execution-context.d.ts +46 -0
  106. package/dist/types/execution-context.js +27 -0
  107. package/dist/types/xml.d.ts +5 -0
  108. package/dist/utils/SchemaProcessor.d.ts +52 -0
  109. package/dist/utils/SchemaProcessor.js +182 -0
  110. package/dist/utils/agent-operations.d.ts +62 -0
  111. package/dist/utils/agent-operations.js +53 -0
  112. package/dist/utils/artifact-component-schema.d.ts +42 -0
  113. package/dist/utils/artifact-component-schema.js +186 -0
  114. package/dist/utils/cleanup.d.ts +21 -0
  115. package/dist/utils/cleanup.js +59 -0
  116. package/dist/utils/data-component-schema.d.ts +2 -0
  117. package/dist/utils/data-component-schema.js +3 -0
  118. package/dist/utils/default-status-schemas.d.ts +20 -0
  119. package/dist/utils/default-status-schemas.js +24 -0
  120. package/dist/utils/json-postprocessor.d.ts +13 -0
  121. package/dist/{json-postprocessor.cjs → utils/json-postprocessor.js} +1 -2
  122. package/dist/utils/model-context-utils.d.ts +39 -0
  123. package/dist/utils/model-context-utils.js +181 -0
  124. package/dist/utils/model-resolver.d.ts +6 -0
  125. package/dist/utils/model-resolver.js +34 -0
  126. package/dist/utils/schema-validation.d.ts +44 -0
  127. package/dist/utils/schema-validation.js +97 -0
  128. package/dist/utils/stream-helpers.d.ts +197 -0
  129. package/dist/utils/stream-helpers.js +518 -0
  130. package/dist/utils/stream-registry.d.ts +22 -0
  131. package/dist/utils/stream-registry.js +34 -0
  132. package/dist/utils/token-estimator.d.ts +69 -0
  133. package/dist/utils/token-estimator.js +53 -0
  134. package/dist/utils/tracer.d.ts +7 -0
  135. package/dist/utils/tracer.js +7 -0
  136. package/package.json +4 -20
  137. package/dist/SandboxExecutorFactory.cjs +0 -895
  138. package/dist/SandboxExecutorFactory.js +0 -893
  139. package/dist/SandboxExecutorFactory.js.map +0 -1
  140. package/dist/chunk-VBDAOXYI.cjs +0 -927
  141. package/dist/chunk-VBDAOXYI.js +0 -832
  142. package/dist/chunk-VBDAOXYI.js.map +0 -1
  143. package/dist/chunk.cjs +0 -34
  144. package/dist/conversations.cjs +0 -7
  145. package/dist/conversations.js +0 -7
  146. package/dist/conversations2.cjs +0 -209
  147. package/dist/conversations2.js +0 -180
  148. package/dist/conversations2.js.map +0 -1
  149. package/dist/dbClient.cjs +0 -9676
  150. package/dist/dbClient.js +0 -9670
  151. package/dist/dbClient.js.map +0 -1
  152. package/dist/dbClient2.cjs +0 -5
  153. package/dist/dbClient2.js +0 -5
  154. package/dist/env.cjs +0 -59
  155. package/dist/env.js.map +0 -1
  156. package/dist/execution-limits.cjs +0 -260
  157. package/dist/execution-limits.js +0 -63
  158. package/dist/execution-limits.js.map +0 -1
  159. package/dist/index.cjs +0 -11411
  160. package/dist/index.d.cts +0 -36
  161. package/dist/index.d.cts.map +0 -1
  162. package/dist/index.d.ts.map +0 -1
  163. package/dist/index.js.map +0 -1
  164. package/dist/instrumentation.cjs +0 -12
  165. package/dist/instrumentation.d.cts +0 -18
  166. package/dist/instrumentation.d.cts.map +0 -1
  167. package/dist/instrumentation.d.ts.map +0 -1
  168. package/dist/instrumentation2.cjs +0 -116
  169. package/dist/instrumentation2.js +0 -69
  170. package/dist/instrumentation2.js.map +0 -1
  171. package/dist/json-postprocessor.js +0 -20
  172. package/dist/json-postprocessor.js.map +0 -1
  173. package/dist/logger.cjs +0 -5
  174. package/dist/logger2.cjs +0 -1
  175. package/dist/nodefs.cjs +0 -29
  176. package/dist/nodefs.js +0 -27
  177. package/dist/nodefs.js.map +0 -1
  178. package/dist/opfs-ahp.cjs +0 -367
  179. package/dist/opfs-ahp.js +0 -368
  180. 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 };