@inkeep/agents-api 0.42.0 → 0.44.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 (138) hide show
  1. package/dist/.well-known/workflow/v1/manifest.debug.json +6 -6
  2. package/dist/.well-known/workflow/v1/step.cjs +220467 -203416
  3. package/dist/_virtual/rolldown_runtime.js +7 -0
  4. package/dist/createApp.js +47 -17
  5. package/dist/domains/evals/api/.well-known/workflow/v1/flow.d.ts +4 -0
  6. package/dist/domains/evals/api/.well-known/workflow/v1/flow.js +12 -0
  7. package/dist/domains/evals/api/.well-known/workflow/v1/step.d.ts +4 -0
  8. package/dist/domains/evals/api/.well-known/workflow/v1/step.js +12 -0
  9. package/dist/domains/evals/routes/datasetTriggers.d.ts +2 -2
  10. package/dist/domains/evals/routes/index.d.ts +2 -2
  11. package/dist/domains/evals/scripts/build-workflow.js +2 -2
  12. package/dist/domains/evals/workflow/world.js +3 -2
  13. package/dist/domains/manage/index.js +6 -2
  14. package/dist/domains/manage/routes/agent.js +7 -4
  15. package/dist/domains/manage/routes/agentFull.js +9 -6
  16. package/dist/domains/manage/routes/apiKeys.js +1 -2
  17. package/dist/domains/manage/routes/artifactComponents.js +5 -5
  18. package/dist/domains/manage/routes/cliAuth.js +3 -3
  19. package/dist/domains/manage/routes/contextConfigs.js +5 -5
  20. package/dist/domains/manage/routes/conversations.d.ts +2 -2
  21. package/dist/domains/manage/routes/credentialStores.js +2 -2
  22. package/dist/domains/manage/routes/credentials.js +6 -7
  23. package/dist/domains/manage/routes/dataComponents.js +6 -7
  24. package/dist/domains/manage/routes/externalAgents.js +1 -2
  25. package/dist/domains/manage/routes/github.d.ts +16 -0
  26. package/dist/domains/manage/routes/github.js +511 -0
  27. package/dist/domains/manage/routes/index.d.ts +2 -2
  28. package/dist/domains/manage/routes/index.js +4 -0
  29. package/dist/domains/manage/routes/invitations.js +1 -1
  30. package/dist/domains/manage/routes/mcp.d.ts +2 -2
  31. package/dist/domains/manage/routes/{agentToolRelations.d.ts → mcpToolGithubAccess.d.ts} +1 -1
  32. package/dist/domains/manage/routes/mcpToolGithubAccess.js +205 -0
  33. package/dist/domains/manage/routes/playgroundToken.js +1 -2
  34. package/dist/domains/manage/routes/projectFull.js +33 -11
  35. package/dist/domains/manage/routes/projectGithubAccess.d.ts +9 -0
  36. package/dist/domains/manage/routes/projectGithubAccess.js +167 -0
  37. package/dist/domains/manage/routes/projectMembers.js +12 -44
  38. package/dist/domains/manage/routes/projectPermissions.js +11 -11
  39. package/dist/domains/manage/routes/projects.js +15 -18
  40. package/dist/domains/manage/routes/signoz.d.ts +2 -2
  41. package/dist/domains/manage/routes/signoz.js +7 -4
  42. package/dist/domains/manage/routes/subAgentArtifactComponents.js +5 -5
  43. package/dist/domains/manage/routes/subAgentDataComponents.js +5 -5
  44. package/dist/domains/manage/routes/subAgentExternalAgentRelations.js +5 -5
  45. package/dist/domains/manage/routes/subAgentFunctionTools.js +5 -5
  46. package/dist/domains/manage/routes/subAgentRelations.js +6 -6
  47. package/dist/domains/manage/routes/subAgentTeamAgentRelations.js +6 -6
  48. package/dist/domains/manage/routes/subAgentToolRelations.js +6 -6
  49. package/dist/domains/manage/routes/subAgents.js +5 -5
  50. package/dist/domains/manage/routes/tools.js +28 -5
  51. package/dist/domains/manage/routes/triggers.js +49 -24
  52. package/dist/domains/manage/routes/userOrganizations.js +4 -4
  53. package/dist/domains/manage/routes/userProjectMemberships.d.ts +9 -0
  54. package/dist/domains/manage/routes/userProjectMemberships.js +44 -0
  55. package/dist/domains/mcp/routes/mcp.d.ts +7 -0
  56. package/dist/domains/mcp/routes/mcp.js +45 -0
  57. package/dist/domains/run/agents/Agent.d.ts +1 -0
  58. package/dist/domains/run/agents/Agent.js +235 -45
  59. package/dist/domains/run/agents/relationTools.d.ts +2 -2
  60. package/dist/domains/run/constants/execution-limits/defaults.d.ts +1 -1
  61. package/dist/domains/run/constants/execution-limits/defaults.js +1 -1
  62. package/dist/domains/run/constants/execution-limits/index.d.ts +1 -1
  63. package/dist/domains/run/context/ContextFetcher.js +8 -7
  64. package/dist/domains/run/context/validation.d.ts +1 -1
  65. package/dist/domains/run/handlers/executionHandler.js +143 -79
  66. package/dist/domains/run/routes/agents.js +1 -1
  67. package/dist/domains/run/routes/chat.js +47 -1
  68. package/dist/domains/run/routes/chatDataStream.js +107 -14
  69. package/dist/domains/run/routes/webhooks.js +40 -348
  70. package/dist/domains/run/services/AgentSession.d.ts +3 -0
  71. package/dist/domains/run/services/AgentSession.js +14 -1
  72. package/dist/domains/run/services/ToolApprovalUiBus.d.ts +28 -0
  73. package/dist/domains/run/services/ToolApprovalUiBus.js +44 -0
  74. package/dist/domains/run/services/TriggerService.d.ts +31 -0
  75. package/dist/domains/run/services/TriggerService.js +545 -0
  76. package/dist/domains/run/tools/NativeSandboxExecutor.d.ts +3 -2
  77. package/dist/domains/run/tools/NativeSandboxExecutor.js +76 -48
  78. package/dist/domains/run/tools/SandboxExecutorFactory.d.ts +11 -1
  79. package/dist/domains/run/tools/SandboxExecutorFactory.js +27 -3
  80. package/dist/domains/run/tools/VercelSandboxExecutor.d.ts +3 -11
  81. package/dist/domains/run/tools/VercelSandboxExecutor.js +137 -127
  82. package/dist/domains/run/tools/sandbox-utils.js +1 -1
  83. package/dist/domains/run/types/executionContext.js +3 -1
  84. package/dist/domains/run/utils/stream-helpers.d.ts +134 -0
  85. package/dist/domains/run/utils/stream-helpers.js +182 -0
  86. package/dist/domains/run/utils/token-estimator.d.ts +2 -2
  87. package/dist/env.d.ts +12 -2
  88. package/dist/env.js +37 -32
  89. package/dist/factory.d.ts +31 -31
  90. package/dist/factory.js +4 -10
  91. package/dist/index.d.ts +30 -29
  92. package/dist/index.js +3 -5
  93. package/dist/middleware/branchScopedDb.d.ts +1 -1
  94. package/dist/middleware/cors.js +1 -1
  95. package/dist/middleware/evalsAuth.d.ts +2 -2
  96. package/dist/middleware/manageAuth.d.ts +2 -2
  97. package/dist/middleware/projectAccess.d.ts +4 -20
  98. package/dist/middleware/projectAccess.js +7 -49
  99. package/dist/middleware/projectConfig.d.ts +3 -3
  100. package/dist/middleware/ref.d.ts +1 -1
  101. package/dist/middleware/requirePermission.d.ts +2 -2
  102. package/dist/middleware/requirePermission.js +1 -2
  103. package/dist/middleware/runAuth.d.ts +4 -4
  104. package/dist/middleware/sessionAuth.d.ts +3 -3
  105. package/dist/middleware/sessionAuth.js +1 -2
  106. package/dist/middleware/tenantAccess.d.ts +2 -2
  107. package/dist/middleware/tenantAccess.js +4 -4
  108. package/dist/middleware/tracing.d.ts +3 -3
  109. package/dist/openapi.d.ts +36 -1
  110. package/dist/openapi.js +40 -95
  111. package/dist/routes/healthChecks.d.ts +10 -0
  112. package/dist/routes/healthChecks.js +75 -0
  113. package/dist/types/app.d.ts +2 -0
  114. package/dist/types/runExecutionContext.js +3 -1
  115. package/dist/utils/healthChecks.d.ts +8 -0
  116. package/dist/utils/healthChecks.js +38 -0
  117. package/dist/utils/signozHelpers.d.ts +2 -2
  118. package/dist/utils/signozHelpers.js +15 -3
  119. package/package.json +8 -9
  120. package/dist/domains/evals/services/startEvaluation.d.ts +0 -19
  121. package/dist/domains/evals/services/startEvaluation.js +0 -18
  122. package/dist/domains/index.d.ts +0 -4
  123. package/dist/domains/index.js +0 -5
  124. package/dist/domains/manage/routes/agentToolRelations.js +0 -289
  125. package/dist/domains/run/agents/ModelFactory.d.ts +0 -63
  126. package/dist/domains/run/agents/ModelFactory.js +0 -194
  127. package/dist/domains/run/data/agent.d.ts +0 -7
  128. package/dist/domains/run/data/agent.js +0 -67
  129. package/dist/domains/run/services/evaluationRunConfigMatcher.d.ts +0 -4
  130. package/dist/domains/run/services/evaluationRunConfigMatcher.js +0 -7
  131. package/dist/domains/run/utils/cleanup.d.ts +0 -21
  132. package/dist/domains/run/utils/cleanup.js +0 -59
  133. package/dist/initialization.d.ts +0 -6
  134. package/dist/initialization.js +0 -65
  135. package/dist/utils/tempApiKeys.d.ts +0 -17
  136. package/dist/utils/tempApiKeys.js +0 -26
  137. package/dist/utils/workflowApiHelpers.d.ts +0 -1
  138. package/dist/utils/workflowApiHelpers.js +0 -1
@@ -1,26 +1,18 @@
1
- import { getLogger as getLogger$1 } from "../../../logger.js";
2
- import { env } from "../../../env.js";
3
- import manageDbPool_default from "../../../data/db/manageDbPool.js";
4
- import runDbClient_default from "../../../data/db/runDbClient.js";
5
- import { createSSEStreamHelper } from "../utils/stream-helpers.js";
6
- import { ExecutionHandler } from "../handlers/executionHandler.js";
1
+ import { getLogger } from "../../../logger.js";
2
+ import { processWebhook } from "../services/TriggerService.js";
7
3
  import { OpenAPIHono, createRoute, z } from "@hono/zod-openapi";
8
- import { JsonTransformer, createApiError, createMessage, createOrGetConversation, createTriggerInvocation, generateId, getConversationId, getFullProjectWithRelationIds, getTriggerById, interpolateTemplate, setActiveAgentForConversation, updateTriggerInvocationStatus, verifySigningSecret, verifyTriggerAuth, withRef } from "@inkeep/agents-core";
9
- import { context, propagation, trace } from "@opentelemetry/api";
10
- import Ajv from "ajv";
11
4
 
12
5
  //#region src/domains/run/routes/webhooks.ts
13
6
  const app = new OpenAPIHono();
14
- const logger = getLogger$1("webhooks");
15
- const ajv = new Ajv({ allErrors: true });
7
+ const logger = getLogger("webhooks");
16
8
  /**
17
9
  * Webhook endpoint for trigger invocation
18
- * POST /tenants/:tenantId/projects/:projectId/agents/:agentId/triggers/:triggerId
10
+ * POST /tenants/{tenantId}/projects/{projectId}/agents/{agentId}/triggers/{triggerId}
19
11
  */
20
12
  const triggerWebhookRoute = createRoute({
21
13
  method: "post",
22
- path: "/tenants/:tenantId/projects/:projectId/agents/:agentId/triggers/:triggerId",
23
- tags: ["webhooks"],
14
+ path: "/tenants/{tenantId}/projects/{projectId}/agents/{agentId}/triggers/{triggerId}",
15
+ tags: ["Webhooks"],
24
16
  summary: "Invoke agent via trigger webhook",
25
17
  description: "Webhook endpoint for third-party services to invoke an agent via a configured trigger",
26
18
  request: {
@@ -37,7 +29,8 @@ const triggerWebhookRoute = createRoute({
37
29
  description: "Webhook accepted and trigger invoked",
38
30
  content: { "application/json": { schema: z.object({
39
31
  success: z.boolean(),
40
- invocationId: z.string()
32
+ invocationId: z.string(),
33
+ conversationId: z.string()
41
34
  }) } }
42
35
  },
43
36
  400: {
@@ -62,6 +55,10 @@ const triggerWebhookRoute = createRoute({
62
55
  422: {
63
56
  description: "Payload transformation failed",
64
57
  content: { "application/json": { schema: z.object({ error: z.string() }) } }
58
+ },
59
+ 500: {
60
+ description: "Internal server error",
61
+ content: { "application/json": { schema: z.object({ error: z.string() }) } }
65
62
  }
66
63
  }
67
64
  });
@@ -74,341 +71,36 @@ app.openapi(triggerWebhookRoute, async (c) => {
74
71
  agentId,
75
72
  triggerId
76
73
  }, "Processing trigger webhook");
77
- try {
78
- const trigger = await withRef(manageDbPool_default, resolvedRef, (db) => getTriggerById(db)({
79
- scopes: {
80
- tenantId,
81
- projectId,
82
- agentId
83
- },
84
- triggerId
85
- }));
86
- if (!trigger) throw createApiError({
87
- code: "not_found",
88
- message: `Trigger ${triggerId} not found`
89
- });
90
- if (!trigger.enabled) throw createApiError({
91
- code: "not_found",
92
- message: "Trigger is disabled"
93
- });
94
- const bodyText = await c.req.text();
95
- const payload = bodyText ? JSON.parse(bodyText) : {};
96
- if (trigger.authentication) {
97
- const authResult = await verifyTriggerAuth(c, trigger.authentication);
98
- if (!authResult.success) {
99
- if (authResult.status === 401) return c.json({ error: authResult.message || "Unauthorized" }, 401);
100
- return c.json({ error: authResult.message || "Forbidden" }, 403);
101
- }
102
- }
103
- if (trigger.signingSecret) {
104
- const signatureResult = verifySigningSecret(c, trigger.signingSecret, bodyText);
105
- if (!signatureResult.success) return c.json({ error: signatureResult.message || "Invalid signature" }, 403);
106
- }
107
- if (trigger.inputSchema) {
108
- const validate = ajv.compile(trigger.inputSchema);
109
- if (!validate(payload)) {
110
- const errors = validate.errors?.map((err) => `${err.instancePath} ${err.message}`);
111
- return c.json({
112
- error: "Payload validation failed",
113
- validationErrors: errors
114
- }, 400);
115
- }
116
- }
117
- let transformedPayload = payload;
118
- if (trigger.outputTransform) try {
119
- transformedPayload = await JsonTransformer.transformWithConfig(payload, trigger.outputTransform);
120
- logger.debug({
121
- triggerId,
122
- tenantId,
123
- projectId
124
- }, "Payload transformation successful");
125
- } catch (error) {
126
- const errorMessage = error instanceof Error ? error.message : String(error);
127
- logger.error({
128
- triggerId,
129
- tenantId,
130
- projectId,
131
- error: errorMessage
132
- }, "Payload transformation failed");
133
- return c.json({ error: `Payload transformation failed: ${errorMessage}` }, 422);
134
- }
135
- const messageParts = [];
136
- if (trigger.messageTemplate) {
137
- const interpolatedMessage = interpolateTemplate(trigger.messageTemplate, transformedPayload);
138
- messageParts.push({
139
- kind: "text",
140
- text: interpolatedMessage
141
- });
142
- }
143
- if (transformedPayload != null) messageParts.push({
144
- kind: "data",
145
- data: transformedPayload,
146
- metadata: {
147
- source: "trigger",
148
- triggerId
149
- }
150
- });
151
- const userMessageText = trigger.messageTemplate ? interpolateTemplate(trigger.messageTemplate, transformedPayload) : JSON.stringify(transformedPayload);
152
- const conversationId = getConversationId();
153
- const invocationId = generateId();
154
- await createTriggerInvocation(runDbClient_default)({
155
- id: invocationId,
156
- triggerId,
157
- tenantId,
158
- projectId,
159
- agentId,
160
- conversationId,
161
- status: "pending",
162
- requestPayload: payload,
163
- transformedPayload
164
- });
165
- logger.info({
166
- tenantId,
167
- projectId,
168
- agentId,
169
- triggerId,
170
- invocationId,
171
- conversationId
172
- }, "Trigger invocation created");
173
- invokeAgentAsync({
174
- tenantId,
175
- projectId,
176
- agentId,
177
- triggerId,
178
- invocationId,
179
- conversationId,
180
- userMessage: userMessageText,
181
- messageParts,
182
- resolvedRef
183
- }).catch((error) => {
184
- logger.error({
185
- error,
186
- tenantId,
187
- projectId,
188
- agentId,
189
- triggerId,
190
- invocationId
191
- }, "Async agent invocation failed");
192
- });
193
- logger.info({
194
- tenantId,
195
- projectId,
196
- agentId,
197
- triggerId,
198
- invocationId,
199
- conversationId
200
- }, "Trigger webhook accepted, agent invocation initiated");
201
- return c.json({
202
- success: true,
203
- invocationId
204
- }, 202);
205
- } catch (error) {
206
- logger.error({
207
- error,
208
- tenantId,
209
- projectId,
210
- agentId,
211
- triggerId
212
- }, "Webhook processing failed");
213
- throw error;
74
+ const result = await processWebhook({
75
+ tenantId,
76
+ projectId,
77
+ agentId,
78
+ triggerId,
79
+ resolvedRef,
80
+ rawBody: await c.req.text(),
81
+ honoContext: c
82
+ });
83
+ if (!result.success) {
84
+ if (result.validationErrors) return c.json({
85
+ error: result.error,
86
+ validationErrors: result.validationErrors
87
+ }, result.status);
88
+ return c.json({ error: result.error }, result.status);
214
89
  }
90
+ logger.info({
91
+ tenantId,
92
+ projectId,
93
+ agentId,
94
+ triggerId,
95
+ invocationId: result.invocationId,
96
+ conversationId: result.conversationId
97
+ }, "Trigger webhook accepted, workflow dispatched");
98
+ return c.json({
99
+ success: true,
100
+ invocationId: result.invocationId,
101
+ conversationId: result.conversationId
102
+ }, 202);
215
103
  });
216
- /**
217
- * Invokes an agent asynchronously for a trigger invocation.
218
- * This function creates a conversation, stores the user message,
219
- * and executes the agent using ExecutionHandler.
220
- * It updates the trigger invocation status based on success/failure.
221
- */
222
- async function invokeAgentAsync(params) {
223
- const { tenantId, projectId, agentId, triggerId, invocationId, conversationId, userMessage, messageParts, resolvedRef } = params;
224
- return await trace.getTracer("trigger-invocation").startActiveSpan("trigger.invocation", { attributes: {
225
- "conversation.id": conversationId,
226
- "tenant.id": tenantId,
227
- "project.id": projectId,
228
- "agent.id": agentId,
229
- "invocation.type": "trigger",
230
- "trigger.id": triggerId,
231
- "trigger.invocation.id": invocationId,
232
- "message.content": userMessage,
233
- "message.parts": JSON.stringify(messageParts),
234
- "message.timestamp": (/* @__PURE__ */ new Date()).toISOString()
235
- } }, async (span) => {
236
- let currentBag = propagation.getBaggage(context.active());
237
- if (!currentBag) currentBag = propagation.createBaggage();
238
- currentBag = currentBag.setEntry("conversation.id", { value: conversationId });
239
- currentBag = currentBag.setEntry("tenant.id", { value: tenantId });
240
- currentBag = currentBag.setEntry("project.id", { value: projectId });
241
- currentBag = currentBag.setEntry("agent.id", { value: agentId });
242
- currentBag = currentBag.setEntry("invocation.type", { value: "trigger" });
243
- currentBag = currentBag.setEntry("trigger.id", { value: triggerId });
244
- currentBag = currentBag.setEntry("trigger.invocation.id", { value: invocationId });
245
- const ctxWithBaggage = propagation.setBaggage(context.active(), currentBag);
246
- return await context.with(ctxWithBaggage, async () => {
247
- try {
248
- logger.info({
249
- tenantId,
250
- projectId,
251
- agentId,
252
- triggerId,
253
- invocationId,
254
- conversationId
255
- }, "Starting async agent invocation");
256
- const project = await withRef(manageDbPool_default, resolvedRef, async (db) => {
257
- return await getFullProjectWithRelationIds(db)({ scopes: {
258
- tenantId,
259
- projectId
260
- } });
261
- });
262
- if (!project) throw createApiError({
263
- code: "not_found",
264
- message: `Project ${projectId} not found`
265
- });
266
- const fullAgent = project.agents[agentId];
267
- if (!fullAgent) throw createApiError({
268
- code: "not_found",
269
- message: `Agent ${agentId} not found`
270
- });
271
- logger.debug({
272
- tenantId,
273
- projectId,
274
- agentId,
275
- defaultSubAgentId: fullAgent.defaultSubAgentId,
276
- subAgentKeys: Object.keys(fullAgent.subAgents || {}),
277
- subAgentsCount: Object.keys(fullAgent.subAgents || {}).length
278
- }, "Debug: Agent and sub-agent info");
279
- const agentKeys = Object.keys(fullAgent.subAgents || {});
280
- const firstAgentId = agentKeys.length > 0 ? agentKeys[0] : "";
281
- const defaultSubAgentId = fullAgent.defaultSubAgentId || firstAgentId;
282
- if (!defaultSubAgentId) throw createApiError({
283
- code: "not_found",
284
- message: "No default sub-agent found"
285
- });
286
- const executionContext = {
287
- tenantId,
288
- projectId,
289
- agentId,
290
- baseUrl: env.INKEEP_AGENTS_API_URL || "http://localhost:3002",
291
- apiKey: "",
292
- apiKeyId: "trigger-invocation",
293
- resolvedRef,
294
- project,
295
- metadata: { initiatedBy: {
296
- type: "api_key",
297
- id: triggerId
298
- } }
299
- };
300
- await createOrGetConversation(runDbClient_default)({
301
- tenantId,
302
- projectId,
303
- id: conversationId,
304
- agentId,
305
- activeSubAgentId: defaultSubAgentId,
306
- ref: executionContext.resolvedRef
307
- });
308
- await setActiveAgentForConversation(runDbClient_default)({
309
- scopes: {
310
- tenantId,
311
- projectId
312
- },
313
- conversationId,
314
- agentId,
315
- subAgentId: defaultSubAgentId,
316
- ref: executionContext.resolvedRef
317
- });
318
- logger.info({
319
- conversationId,
320
- agentId,
321
- defaultSubAgentId
322
- }, "Conversation created and agent set");
323
- await createMessage(runDbClient_default)({
324
- id: generateId(),
325
- tenantId,
326
- projectId,
327
- conversationId,
328
- role: "user",
329
- content: { parts: messageParts },
330
- visibility: "user-facing",
331
- messageType: "chat"
332
- });
333
- logger.info({
334
- conversationId,
335
- invocationId
336
- }, "User message created");
337
- const requestId = `trigger-${invocationId}`;
338
- const noOpStreamHelper = createSSEStreamHelper({
339
- writeSSE: async () => {},
340
- sleep: async () => {}
341
- }, requestId, Math.floor(Date.now() / 1e3));
342
- await new ExecutionHandler().execute({
343
- executionContext,
344
- conversationId,
345
- userMessage,
346
- messageParts,
347
- initialAgentId: agentId,
348
- requestId,
349
- sseHelper: noOpStreamHelper,
350
- emitOperations: false
351
- });
352
- await updateTriggerInvocationStatus(runDbClient_default)({
353
- scopes: {
354
- tenantId,
355
- projectId,
356
- agentId
357
- },
358
- triggerId,
359
- invocationId,
360
- data: { status: "success" }
361
- });
362
- logger.info({
363
- tenantId,
364
- projectId,
365
- agentId,
366
- triggerId,
367
- invocationId,
368
- conversationId
369
- }, "Agent invocation completed successfully");
370
- span.end();
371
- } catch (error) {
372
- const errorMessage = error instanceof Error ? error.message : String(error);
373
- logger.error({
374
- error,
375
- tenantId,
376
- projectId,
377
- agentId,
378
- triggerId,
379
- invocationId
380
- }, "Agent invocation failed");
381
- span.recordException(error instanceof Error ? error : new Error(errorMessage));
382
- span.setStatus({
383
- code: 2,
384
- message: errorMessage
385
- });
386
- try {
387
- await updateTriggerInvocationStatus(runDbClient_default)({
388
- scopes: {
389
- tenantId,
390
- projectId,
391
- agentId
392
- },
393
- triggerId,
394
- invocationId,
395
- data: {
396
- status: "failed",
397
- errorMessage
398
- }
399
- });
400
- } catch (updateError) {
401
- logger.error({
402
- updateError,
403
- invocationId
404
- }, "Failed to update trigger invocation status to failed");
405
- }
406
- span.end();
407
- throw error;
408
- }
409
- });
410
- });
411
- }
412
104
  var webhooks_default = app;
413
105
 
414
106
  //#endregion
@@ -112,6 +112,7 @@ interface ToolCallData {
112
112
  relationshipId?: string;
113
113
  needsApproval?: boolean;
114
114
  conversationId?: string;
115
+ inDelegatedAgent?: boolean;
115
116
  }
116
117
  interface ToolResultData {
117
118
  toolName: string;
@@ -121,6 +122,7 @@ interface ToolResultData {
121
122
  error?: string;
122
123
  relationshipId?: string;
123
124
  needsApproval?: boolean;
125
+ inDelegatedAgent?: boolean;
124
126
  }
125
127
  interface CompressionEventData {
126
128
  reason: 'manual' | 'automatic';
@@ -135,6 +137,7 @@ interface ErrorEventData {
135
137
  code?: string;
136
138
  severity?: 'error' | 'warning' | 'info';
137
139
  context?: any;
140
+ relationshipId?: string;
138
141
  }
139
142
  /**
140
143
  * Tracks all agent operations and interactions for a single message
@@ -345,6 +345,15 @@ var AgentSession = class {
345
345
  this.artifactProcessingErrors.clear();
346
346
  this.artifactCache.clear();
347
347
  if (this.sessionId) toolSessionManager.endSession(this.sessionId);
348
+ if (this.sessionId) try {
349
+ const { SandboxExecutorFactory } = await import("../tools/SandboxExecutorFactory.js");
350
+ await SandboxExecutorFactory.cleanupSession(this.sessionId);
351
+ } catch (error) {
352
+ logger.warn({
353
+ sessionId: this.sessionId,
354
+ error
355
+ }, "Failed to cleanup session-scoped sandbox executors");
356
+ }
348
357
  if (this.scheduledTimeouts) {
349
358
  for (const timeoutId of this.scheduledTimeouts) clearTimeout(timeoutId);
350
359
  this.scheduledTimeouts.clear();
@@ -1120,7 +1129,11 @@ var AgentSessionManager = class {
1120
1129
  recordEvent(sessionId, eventType, subAgentId, data) {
1121
1130
  const session = this.sessions.get(sessionId);
1122
1131
  if (!session) {
1123
- logger.warn({ sessionId }, "Attempted to record event in non-existent session");
1132
+ logger.warn({
1133
+ sessionId,
1134
+ eventType,
1135
+ subAgentId
1136
+ }, "Attempted to record event in non-existent session (likely session already ended)");
1124
1137
  return;
1125
1138
  }
1126
1139
  session.recordEvent(eventType, subAgentId, data);
@@ -0,0 +1,28 @@
1
+ //#region src/domains/run/services/ToolApprovalUiBus.d.ts
2
+ type ToolApprovalUiEvent = {
3
+ type: 'approval-needed';
4
+ toolCallId: string;
5
+ toolName: string;
6
+ input: any;
7
+ providerMetadata?: any;
8
+ approvalId: string;
9
+ } | {
10
+ type: 'approval-resolved';
11
+ toolCallId: string;
12
+ approved: boolean;
13
+ };
14
+ type Listener = (event: ToolApprovalUiEvent) => void | Promise<void>;
15
+ /**
16
+ * In-process event bus keyed by streamRequestId.
17
+ *
18
+ * Used to propagate approval UI events from delegated agents (who must not write to stream)
19
+ * up to the user-facing request handler, which can stream tool UI parts to the client.
20
+ */
21
+ declare class ToolApprovalUiBus {
22
+ private listeners;
23
+ subscribe(streamRequestId: string, listener: Listener): () => void;
24
+ publish(streamRequestId: string, event: ToolApprovalUiEvent): Promise<void>;
25
+ }
26
+ declare const toolApprovalUiBus: ToolApprovalUiBus;
27
+ //#endregion
28
+ export { ToolApprovalUiBus, ToolApprovalUiEvent, toolApprovalUiBus };
@@ -0,0 +1,44 @@
1
+ import { getLogger } from "../../../logger.js";
2
+
3
+ //#region src/domains/run/services/ToolApprovalUiBus.ts
4
+ const logger = getLogger("ToolApprovalUiBus");
5
+ /**
6
+ * In-process event bus keyed by streamRequestId.
7
+ *
8
+ * Used to propagate approval UI events from delegated agents (who must not write to stream)
9
+ * up to the user-facing request handler, which can stream tool UI parts to the client.
10
+ */
11
+ var ToolApprovalUiBus = class {
12
+ listeners = /* @__PURE__ */ new Map();
13
+ subscribe(streamRequestId, listener) {
14
+ if (!streamRequestId) return () => {};
15
+ const set = this.listeners.get(streamRequestId) ?? /* @__PURE__ */ new Set();
16
+ set.add(listener);
17
+ this.listeners.set(streamRequestId, set);
18
+ return () => {
19
+ const existing = this.listeners.get(streamRequestId);
20
+ if (!existing) return;
21
+ existing.delete(listener);
22
+ if (existing.size === 0) this.listeners.delete(streamRequestId);
23
+ };
24
+ }
25
+ async publish(streamRequestId, event) {
26
+ if (!streamRequestId) return;
27
+ const set = this.listeners.get(streamRequestId);
28
+ if (!set || set.size === 0) return;
29
+ for (const listener of set) try {
30
+ await listener(event);
31
+ } catch (error) {
32
+ logger.warn({
33
+ streamRequestId,
34
+ eventType: event.type,
35
+ toolCallId: event.toolCallId,
36
+ error: error instanceof Error ? error.message : String(error)
37
+ }, "ToolApprovalUiBus listener failed");
38
+ }
39
+ }
40
+ };
41
+ const toolApprovalUiBus = new ToolApprovalUiBus();
42
+
43
+ //#endregion
44
+ export { ToolApprovalUiBus, toolApprovalUiBus };
@@ -0,0 +1,31 @@
1
+ import { ResolvedRef } from "@inkeep/agents-core";
2
+ import { Context } from "hono";
3
+
4
+ //#region src/domains/run/services/TriggerService.d.ts
5
+
6
+ type TriggerWebhookParams = {
7
+ tenantId: string;
8
+ projectId: string;
9
+ agentId: string;
10
+ triggerId: string;
11
+ resolvedRef: ResolvedRef;
12
+ rawBody: string;
13
+ honoContext: Context;
14
+ };
15
+ type TriggerWebhookResult = {
16
+ success: true;
17
+ invocationId: string;
18
+ conversationId: string;
19
+ } | {
20
+ success: false;
21
+ error: string;
22
+ status: 400 | 401 | 403 | 404 | 422 | 500;
23
+ validationErrors?: string[];
24
+ };
25
+ /**
26
+ * Process a trigger webhook request.
27
+ * Handles validation, transformation, and dispatches async execution.
28
+ */
29
+ declare function processWebhook(params: TriggerWebhookParams): Promise<TriggerWebhookResult>;
30
+ //#endregion
31
+ export { TriggerWebhookParams, TriggerWebhookResult, processWebhook };