@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.
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 -11235
  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 +5 -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 -11260
  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,456 @@
1
+ import { getLogger } from "../logger.js";
2
+ import { flushBatchProcessor } from "../instrumentation.js";
3
+ import dbClient_default from "../data/db/dbClient.js";
4
+ import { AGENT_EXECUTION_MAX_CONSECUTIVE_ERRORS } from "../constants/execution-limits/index.js";
5
+ import { tracer } from "../utils/tracer.js";
6
+ import { registerStreamHelper, unregisterStreamHelper } from "../utils/stream-registry.js";
7
+ import { agentSessionManager } from "../services/AgentSession.js";
8
+ import { resolveModelConfig } from "../utils/model-resolver.js";
9
+ import { agentInitializingOp, completionOp, errorOp } from "../utils/agent-operations.js";
10
+ import { A2AClient } from "../a2a/client.js";
11
+ import { extractTransferData, isTransferTask } from "../a2a/types.js";
12
+ import { executeTransfer } from "../a2a/transfer.js";
13
+ import { BufferingStreamHelper } from "../utils/stream-helpers.js";
14
+ import { AGENT_EXECUTION_TRANSFER_COUNT_DEFAULT, createMessage, createTask, generateId, getActiveAgentForConversation, getAgentWithDefaultSubAgent, getFullAgent, getTask, setSpanWithError, updateTask } from "@inkeep/agents-core";
15
+
16
+ //#region src/handlers/executionHandler.ts
17
+ const logger = getLogger("ExecutionHandler");
18
+ var ExecutionHandler = class {
19
+ MAX_ERRORS = AGENT_EXECUTION_MAX_CONSECUTIVE_ERRORS;
20
+ /**
21
+ * performs exeuction loop
22
+ *
23
+ * Do up to limit of MAX_ITERATIONS
24
+ *
25
+ * 1. lookup active agent for thread
26
+ * 2. Send A2A message to selected agent
27
+ * 3. Parse A2A message response
28
+ * 4. Handle transfer messages (if any)
29
+ * 5. Handle completion messages (if any)
30
+ * 6. If no valid response or transfer, return error
31
+ * @param params
32
+ * @returns
33
+ */
34
+ async execute(params) {
35
+ const { executionContext, conversationId, userMessage, initialAgentId, requestId, sseHelper, emitOperations } = params;
36
+ const { tenantId, projectId, agentId, apiKey, baseUrl } = executionContext;
37
+ registerStreamHelper(requestId, sseHelper);
38
+ agentSessionManager.createSession(requestId, agentId, tenantId, projectId, conversationId);
39
+ if (emitOperations) agentSessionManager.enableEmitOperations(requestId);
40
+ logger.info({
41
+ sessionId: requestId,
42
+ agentId,
43
+ conversationId,
44
+ emitOperations
45
+ }, "Created AgentSession for message execution");
46
+ let agentConfig = null;
47
+ try {
48
+ agentConfig = await getFullAgent(dbClient_default)({ scopes: {
49
+ tenantId,
50
+ projectId,
51
+ agentId
52
+ } });
53
+ if (agentConfig?.statusUpdates && agentConfig.statusUpdates.enabled !== false) try {
54
+ const agentWithDefault = await getAgentWithDefaultSubAgent(dbClient_default)({ scopes: {
55
+ tenantId,
56
+ projectId,
57
+ agentId
58
+ } });
59
+ if (agentWithDefault?.defaultSubAgent) {
60
+ const resolvedModels = await resolveModelConfig(agentId, agentWithDefault.defaultSubAgent);
61
+ agentSessionManager.initializeStatusUpdates(requestId, agentConfig.statusUpdates, resolvedModels.summarizer, resolvedModels.base);
62
+ } else agentSessionManager.initializeStatusUpdates(requestId, agentConfig.statusUpdates, agentConfig.models?.summarizer);
63
+ } catch (modelError) {
64
+ logger.warn({
65
+ error: modelError instanceof Error ? modelError.message : "Unknown error",
66
+ agentId
67
+ }, "Failed to resolve models for status updates, using agent-level config");
68
+ agentSessionManager.initializeStatusUpdates(requestId, agentConfig.statusUpdates, agentConfig.models?.summarizer);
69
+ }
70
+ } catch (error) {
71
+ logger.error({
72
+ error: error instanceof Error ? error.message : "Unknown error",
73
+ stack: error instanceof Error ? error.stack : void 0
74
+ }, "❌ Failed to initialize status updates, continuing without them");
75
+ }
76
+ let currentAgentId = initialAgentId;
77
+ let iterations = 0;
78
+ let errorCount = 0;
79
+ let task = null;
80
+ let fromSubAgentId;
81
+ try {
82
+ await sseHelper.writeOperation(agentInitializingOp(requestId, agentId));
83
+ const taskId = `task_${conversationId}-${requestId}`;
84
+ logger.info({
85
+ taskId,
86
+ currentAgentId,
87
+ conversationId,
88
+ requestId
89
+ }, "Attempting to create or reuse existing task");
90
+ try {
91
+ task = await createTask(dbClient_default)({
92
+ id: taskId,
93
+ tenantId,
94
+ projectId,
95
+ agentId,
96
+ subAgentId: currentAgentId,
97
+ contextId: conversationId,
98
+ status: "pending",
99
+ metadata: {
100
+ conversation_id: conversationId,
101
+ message_id: requestId,
102
+ stream_request_id: requestId,
103
+ created_at: (/* @__PURE__ */ new Date()).toISOString(),
104
+ updated_at: (/* @__PURE__ */ new Date()).toISOString(),
105
+ root_sub_agent_id: initialAgentId,
106
+ sub_agent_id: currentAgentId
107
+ }
108
+ });
109
+ logger.info({
110
+ taskId,
111
+ createdTaskMetadata: Array.isArray(task) ? task[0]?.metadata : task?.metadata
112
+ }, "Task created with metadata");
113
+ } catch (error) {
114
+ if (error?.cause?.code === "23505") {
115
+ logger.info({
116
+ taskId,
117
+ error: error.message
118
+ }, "Task already exists, fetching existing task");
119
+ const existingTask = await getTask(dbClient_default)({ id: taskId });
120
+ if (existingTask) {
121
+ task = existingTask;
122
+ logger.info({
123
+ taskId,
124
+ existingTask
125
+ }, "Successfully reused existing task from race condition");
126
+ } else {
127
+ logger.error({
128
+ taskId,
129
+ error
130
+ }, "Task constraint failed but task not found");
131
+ throw error;
132
+ }
133
+ } else {
134
+ logger.error({
135
+ taskId,
136
+ error
137
+ }, "Failed to create task due to non-constraint error");
138
+ throw error;
139
+ }
140
+ }
141
+ logger.debug({
142
+ timestamp: /* @__PURE__ */ new Date(),
143
+ executionType: "create_initial_task",
144
+ conversationId,
145
+ agentId,
146
+ requestId,
147
+ currentAgentId,
148
+ taskId: Array.isArray(task) ? task[0]?.id : task?.id,
149
+ userMessage: userMessage.substring(0, 100)
150
+ }, "ExecutionHandler: Initial task created");
151
+ if (Array.isArray(task)) task = task[0];
152
+ let currentMessage = userMessage;
153
+ const maxTransfers = agentConfig?.stopWhen?.transferCountIs ?? AGENT_EXECUTION_TRANSFER_COUNT_DEFAULT;
154
+ while (iterations < maxTransfers) {
155
+ iterations++;
156
+ logger.info({
157
+ iterations,
158
+ currentAgentId,
159
+ agentId,
160
+ conversationId,
161
+ fromSubAgentId
162
+ }, `Execution loop iteration ${iterations} with agent ${currentAgentId}, transfer from: ${fromSubAgentId || "none"}`);
163
+ const activeAgent = await getActiveAgentForConversation(dbClient_default)({
164
+ scopes: {
165
+ tenantId,
166
+ projectId
167
+ },
168
+ conversationId
169
+ });
170
+ logger.info({ activeAgent }, "activeAgent");
171
+ if (activeAgent && activeAgent.activeSubAgentId !== currentAgentId) {
172
+ currentAgentId = activeAgent.activeSubAgentId;
173
+ logger.info({ currentAgentId }, `Updated current agent to: ${currentAgentId}`);
174
+ }
175
+ const a2aClient = new A2AClient(`${baseUrl}/agents`, { headers: {
176
+ Authorization: `Bearer ${apiKey}`,
177
+ "x-inkeep-tenant-id": tenantId,
178
+ "x-inkeep-project-id": projectId,
179
+ "x-inkeep-agent-id": agentId,
180
+ "x-inkeep-sub-agent-id": currentAgentId
181
+ } });
182
+ let messageResponse = null;
183
+ const messageMetadata = { stream_request_id: requestId };
184
+ if (fromSubAgentId) messageMetadata.fromSubAgentId = fromSubAgentId;
185
+ messageResponse = await a2aClient.sendMessage({
186
+ message: {
187
+ role: "user",
188
+ parts: [{
189
+ kind: "text",
190
+ text: currentMessage
191
+ }],
192
+ messageId: `${requestId}-iter-${iterations}`,
193
+ kind: "message",
194
+ contextId: conversationId,
195
+ metadata: messageMetadata
196
+ },
197
+ configuration: {
198
+ acceptedOutputModes: ["text", "text/plain"],
199
+ blocking: false
200
+ }
201
+ });
202
+ if (!messageResponse?.result) {
203
+ errorCount++;
204
+ logger.error({
205
+ currentAgentId,
206
+ iterations,
207
+ errorCount
208
+ }, `No response from agent ${currentAgentId} on iteration ${iterations} (error ${errorCount}/${this.MAX_ERRORS})`);
209
+ if (errorCount >= this.MAX_ERRORS) {
210
+ const errorMessage$1 = `Maximum error limit (${this.MAX_ERRORS}) reached`;
211
+ logger.error({
212
+ maxErrors: this.MAX_ERRORS,
213
+ errorCount
214
+ }, errorMessage$1);
215
+ await sseHelper.writeOperation(errorOp(errorMessage$1, currentAgentId || "system"));
216
+ if (task) await updateTask(dbClient_default)({
217
+ taskId: task.id,
218
+ data: {
219
+ status: "failed",
220
+ metadata: {
221
+ ...task.metadata,
222
+ failed_at: (/* @__PURE__ */ new Date()).toISOString(),
223
+ error: errorMessage$1
224
+ }
225
+ }
226
+ });
227
+ await agentSessionManager.endSession(requestId);
228
+ unregisterStreamHelper(requestId);
229
+ return {
230
+ success: false,
231
+ error: errorMessage$1,
232
+ iterations
233
+ };
234
+ }
235
+ continue;
236
+ }
237
+ if (isTransferTask(messageResponse.result)) {
238
+ const transferData = extractTransferData(messageResponse.result);
239
+ if (!transferData) {
240
+ logger.error({ result: messageResponse.result }, "Transfer detected but no transfer data found");
241
+ continue;
242
+ }
243
+ const { targetSubAgentId, fromSubAgentId: transferFromAgent } = transferData;
244
+ const firstArtifact = messageResponse.result.artifacts[0];
245
+ const transferReason = firstArtifact?.parts[1]?.kind === "text" ? firstArtifact.parts[1].text : "Transfer initiated";
246
+ logger.info({
247
+ targetSubAgentId,
248
+ transferReason,
249
+ transferFromAgent
250
+ }, "Transfer response");
251
+ await createMessage(dbClient_default)({
252
+ id: generateId(),
253
+ tenantId,
254
+ projectId,
255
+ conversationId,
256
+ role: "agent",
257
+ content: {
258
+ text: transferReason,
259
+ parts: [{
260
+ kind: "text",
261
+ text: transferReason
262
+ }]
263
+ },
264
+ visibility: "user-facing",
265
+ messageType: "chat",
266
+ fromSubAgentId: currentAgentId,
267
+ taskId: task.id
268
+ });
269
+ currentMessage = currentMessage + "\n\nPlease continue this conversation seamlessly. The previous response in conversation history was from another internal agent, but you must continue as if YOU made that response. All responses must appear as one unified agent - do not repeat what was already communicated.";
270
+ const { success, targetSubAgentId: newAgentId } = await executeTransfer({
271
+ projectId,
272
+ tenantId,
273
+ threadId: conversationId,
274
+ targetSubAgentId
275
+ });
276
+ if (success) {
277
+ fromSubAgentId = currentAgentId;
278
+ currentAgentId = newAgentId;
279
+ logger.info({
280
+ transferFrom: fromSubAgentId,
281
+ transferTo: currentAgentId,
282
+ reason: transferReason
283
+ }, "Transfer executed, tracking fromSubAgentId for next iteration");
284
+ }
285
+ continue;
286
+ }
287
+ let responseParts = [];
288
+ if (messageResponse.result.streamedContent?.parts) {
289
+ responseParts = messageResponse.result.streamedContent.parts;
290
+ logger.info({ partsCount: responseParts.length }, "Using streamed content for conversation history");
291
+ } else {
292
+ responseParts = messageResponse.result.artifacts?.flatMap((artifact) => artifact.parts || []) || [];
293
+ logger.info({ partsCount: responseParts.length }, "Using artifacts for conversation history (fallback)");
294
+ }
295
+ if (responseParts && responseParts.length > 0) {
296
+ const agentSessionData = agentSessionManager.getSession(requestId);
297
+ if (agentSessionData) {
298
+ const sessionSummary = agentSessionData.getSummary();
299
+ logger.info(sessionSummary, "AgentSession data after completion");
300
+ }
301
+ let textContent = "";
302
+ for (const part of responseParts) if ((part.kind === "text" || part.type === "text") && part.text) textContent += part.text;
303
+ return tracer.startActiveSpan("execution_handler.execute", {}, async (span) => {
304
+ try {
305
+ span.setAttributes({
306
+ "ai.response.content": textContent || "No response content",
307
+ "ai.response.timestamp": (/* @__PURE__ */ new Date()).toISOString(),
308
+ "subAgent.name": agentConfig?.subAgents[currentAgentId]?.name,
309
+ "subAgent.id": currentAgentId
310
+ });
311
+ await createMessage(dbClient_default)({
312
+ id: generateId(),
313
+ tenantId,
314
+ projectId,
315
+ conversationId,
316
+ role: "agent",
317
+ content: {
318
+ text: textContent || void 0,
319
+ parts: responseParts.map((part) => ({
320
+ type: part.kind === "text" ? "text" : "data",
321
+ text: part.kind === "text" ? part.text : void 0,
322
+ data: part.kind === "data" ? JSON.stringify(part.data) : void 0
323
+ }))
324
+ },
325
+ visibility: "user-facing",
326
+ messageType: "chat",
327
+ fromSubAgentId: currentAgentId,
328
+ taskId: task.id
329
+ });
330
+ const updateTaskStart = Date.now();
331
+ await updateTask(dbClient_default)({
332
+ taskId: task.id,
333
+ data: {
334
+ status: "completed",
335
+ metadata: {
336
+ ...task.metadata,
337
+ completed_at: /* @__PURE__ */ new Date(),
338
+ response: {
339
+ text: textContent,
340
+ parts: responseParts,
341
+ hasText: !!textContent,
342
+ hasData: responseParts.some((p) => p.kind === "data")
343
+ }
344
+ }
345
+ }
346
+ });
347
+ const updateTaskEnd = Date.now();
348
+ logger.info({ duration: updateTaskEnd - updateTaskStart }, "Completed updateTask operation");
349
+ await sseHelper.writeOperation(completionOp(currentAgentId, iterations));
350
+ await sseHelper.complete();
351
+ logger.info({}, "Ending AgentSession and cleaning up");
352
+ await agentSessionManager.endSession(requestId);
353
+ logger.info({}, "Cleaning up streamHelper");
354
+ unregisterStreamHelper(requestId);
355
+ let response;
356
+ if (sseHelper instanceof BufferingStreamHelper) response = sseHelper.getCapturedResponse().text || "No response content";
357
+ logger.info({}, "ExecutionHandler returning success");
358
+ return {
359
+ success: true,
360
+ iterations,
361
+ response
362
+ };
363
+ } catch (error) {
364
+ setSpanWithError(span, error instanceof Error ? error : new Error(String(error)));
365
+ throw error;
366
+ } finally {
367
+ span.end();
368
+ await new Promise((resolve) => setImmediate(resolve));
369
+ await flushBatchProcessor();
370
+ }
371
+ });
372
+ }
373
+ errorCount++;
374
+ logger.warn({
375
+ iterations,
376
+ errorCount
377
+ }, `No valid response or transfer on iteration ${iterations} (error ${errorCount}/${this.MAX_ERRORS})`);
378
+ if (errorCount >= this.MAX_ERRORS) {
379
+ const errorMessage$1 = `Maximum error limit (${this.MAX_ERRORS}) reached`;
380
+ logger.error({
381
+ maxErrors: this.MAX_ERRORS,
382
+ errorCount
383
+ }, errorMessage$1);
384
+ await sseHelper.writeOperation(errorOp(errorMessage$1, currentAgentId || "system"));
385
+ if (task) await updateTask(dbClient_default)({
386
+ taskId: task.id,
387
+ data: {
388
+ status: "failed",
389
+ metadata: {
390
+ ...task.metadata,
391
+ failed_at: /* @__PURE__ */ new Date(),
392
+ error: errorMessage$1
393
+ }
394
+ }
395
+ });
396
+ await agentSessionManager.endSession(requestId);
397
+ unregisterStreamHelper(requestId);
398
+ return {
399
+ success: false,
400
+ error: errorMessage$1,
401
+ iterations
402
+ };
403
+ }
404
+ }
405
+ const errorMessage = `Maximum transfer limit (${maxTransfers}) reached without completion`;
406
+ logger.error({
407
+ maxTransfers,
408
+ iterations
409
+ }, errorMessage);
410
+ await sseHelper.writeOperation(errorOp(errorMessage, currentAgentId || "system"));
411
+ if (task) await updateTask(dbClient_default)({
412
+ taskId: task.id,
413
+ data: {
414
+ status: "failed",
415
+ metadata: {
416
+ ...task.metadata,
417
+ failed_at: /* @__PURE__ */ new Date(),
418
+ error: errorMessage
419
+ }
420
+ }
421
+ });
422
+ await agentSessionManager.endSession(requestId);
423
+ unregisterStreamHelper(requestId);
424
+ return {
425
+ success: false,
426
+ error: errorMessage,
427
+ iterations
428
+ };
429
+ } catch (error) {
430
+ logger.error({ error }, "Error in execution handler");
431
+ const errorMessage = error instanceof Error ? error.message : "Unknown execution error";
432
+ await sseHelper.writeOperation(errorOp(`Execution error: ${errorMessage}`, currentAgentId || "system"));
433
+ if (task) await updateTask(dbClient_default)({
434
+ taskId: task.id,
435
+ data: {
436
+ status: "failed",
437
+ metadata: {
438
+ ...task.metadata,
439
+ failed_at: /* @__PURE__ */ new Date(),
440
+ error: errorMessage
441
+ }
442
+ }
443
+ });
444
+ await agentSessionManager.endSession(requestId);
445
+ unregisterStreamHelper(requestId);
446
+ return {
447
+ success: false,
448
+ error: errorMessage,
449
+ iterations
450
+ };
451
+ }
452
+ }
453
+ };
454
+
455
+ //#endregion
456
+ export { ExecutionHandler };
package/dist/index.d.ts CHANGED
@@ -1,37 +1,16 @@
1
- import { z } from "@hono/zod-openapi";
2
- import { CredentialStore, CredentialStoreRegistry, ServerConfig } from "@inkeep/agents-core";
3
- import * as hono0 from "hono";
1
+ import { NativeSandboxConfig, SandboxConfig, VercelSandboxConfig } from "./types/execution-context.js";
2
+ import { createExecutionHono } from "./create-app.js";
3
+ import "./env.js";
4
+ import { CredentialStore, ServerConfig } from "@inkeep/agents-core";
4
5
  import { Hono } from "hono";
5
- import * as hono_types3 from "hono/types";
6
+ import * as hono_types1 from "hono/types";
6
7
 
7
- //#region src/types/execution-context.d.ts
8
-
9
- interface CommonSandboxConfig {
10
- runtime: 'node22' | 'typescript';
11
- timeout?: number;
12
- vcpus?: number;
13
- }
14
- interface NativeSandboxConfig extends CommonSandboxConfig {
15
- provider: 'native';
16
- }
17
- interface VercelSandboxConfig extends CommonSandboxConfig {
18
- provider: 'vercel';
19
- teamId: string;
20
- projectId: string;
21
- token: string;
22
- }
23
- type SandboxConfig = NativeSandboxConfig | VercelSandboxConfig;
24
- //#endregion
25
- //#region src/app.d.ts
26
- declare function createExecutionHono(serverConfig: ServerConfig, credentialStores: CredentialStoreRegistry, sandboxConfig?: SandboxConfig): Hono<hono_types3.BlankEnv, hono_types3.BlankSchema, "/">;
27
- //#endregion
28
8
  //#region src/index.d.ts
29
- declare const app: hono0.Hono<hono_types3.BlankEnv, hono_types3.BlankSchema, "/">;
9
+ declare const app: Hono<hono_types1.BlankEnv, hono_types1.BlankSchema, "/">;
30
10
  declare function createExecutionApp(config?: {
31
11
  serverConfig?: ServerConfig;
32
12
  credentialStores?: CredentialStore[];
33
13
  sandboxConfig?: SandboxConfig;
34
- }): hono0.Hono<hono_types3.BlankEnv, hono_types3.BlankSchema, "/">;
14
+ }): Hono<hono_types1.BlankEnv, hono_types1.BlankSchema, "/">;
35
15
  //#endregion
36
- export { type NativeSandboxConfig, type SandboxConfig, type VercelSandboxConfig, createExecutionApp, createExecutionHono, app as default };
37
- //# sourceMappingURL=index.d.ts.map
16
+ export { Hono, type NativeSandboxConfig, type SandboxConfig, type VercelSandboxConfig, createExecutionApp, createExecutionHono, app as default };