@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
@@ -0,0 +1,545 @@
1
+ import { __require } from "../../../_virtual/rolldown_runtime.js";
2
+ import { getLogger as getLogger$1 } from "../../../logger.js";
3
+ import { env } from "../../../env.js";
4
+ import manageDbPool_default from "../../../data/db/manageDbPool.js";
5
+ import runDbClient_default from "../../../data/db/runDbClient.js";
6
+ import { tracer } from "../utils/tracer.js";
7
+ import { flushBatchProcessor } from "../../../instrumentation.js";
8
+ import { createSSEStreamHelper } from "../utils/stream-helpers.js";
9
+ import { ExecutionHandler } from "../handlers/executionHandler.js";
10
+ import { DEFAULT_NANGO_STORE_ID, JsonTransformer, createKeyChainStore, createMessage, createNangoCredentialStore, createOrGetConversation, createTriggerInvocation, generateId, getConversationId, getCredentialReference, getCredentialStoreLookupKeyFromRetrievalParams, getFullProjectWithRelationIds, getTriggerById, interpolateTemplate, setActiveAgentForConversation, updateTriggerInvocationStatus, verifySignatureWithConfig, verifyTriggerAuth, withRef } from "@inkeep/agents-core";
11
+ import { SpanStatusCode, context, propagation } from "@opentelemetry/api";
12
+ import Ajv from "ajv";
13
+
14
+ //#region src/domains/run/services/TriggerService.ts
15
+ let waitUntil;
16
+ if (process.env.VERCEL) try {
17
+ ({waitUntil} = __require("@vercel/functions"));
18
+ } catch {}
19
+ const logger = getLogger$1("TriggerService");
20
+ const ajv = new Ajv({ allErrors: true });
21
+ const credentialCache = /* @__PURE__ */ new Map();
22
+ const CACHE_TTL_MS = 300 * 1e3;
23
+ /**
24
+ * Process a trigger webhook request.
25
+ * Handles validation, transformation, and dispatches async execution.
26
+ */
27
+ async function processWebhook(params) {
28
+ const { tenantId, projectId, agentId, triggerId, resolvedRef, rawBody, honoContext } = params;
29
+ const trigger = await loadTrigger({
30
+ tenantId,
31
+ projectId,
32
+ agentId,
33
+ triggerId,
34
+ resolvedRef
35
+ });
36
+ if (!trigger) return {
37
+ success: false,
38
+ error: `Trigger ${triggerId} not found`,
39
+ status: 404
40
+ };
41
+ if (!trigger.enabled) return {
42
+ success: false,
43
+ error: "Trigger is disabled",
44
+ status: 404
45
+ };
46
+ const payload = rawBody ? JSON.parse(rawBody) : {};
47
+ const authResult = await verifyAuthentication(trigger, honoContext);
48
+ if (!authResult.success) return authResult;
49
+ const signatureResult = await verifySignature({
50
+ trigger,
51
+ tenantId,
52
+ projectId,
53
+ resolvedRef,
54
+ honoContext,
55
+ rawBody
56
+ });
57
+ if (!signatureResult.success) return signatureResult;
58
+ const validationResult = validatePayload(trigger, payload);
59
+ if (!validationResult.success) return validationResult;
60
+ const transformResult = await transformPayload(trigger, payload, {
61
+ tenantId,
62
+ projectId,
63
+ triggerId
64
+ });
65
+ if (!transformResult.success) return transformResult;
66
+ const transformedPayload = transformResult.payload;
67
+ const { messageParts, userMessageText } = buildMessage(trigger, transformedPayload, triggerId);
68
+ const { invocationId, conversationId } = await dispatchExecution({
69
+ tenantId,
70
+ projectId,
71
+ agentId,
72
+ triggerId,
73
+ resolvedRef,
74
+ payload,
75
+ transformedPayload,
76
+ messageParts,
77
+ userMessageText
78
+ });
79
+ return {
80
+ success: true,
81
+ invocationId,
82
+ conversationId
83
+ };
84
+ }
85
+ async function loadTrigger(params) {
86
+ const { tenantId, projectId, agentId, triggerId, resolvedRef } = params;
87
+ return await withRef(manageDbPool_default, resolvedRef, (db) => getTriggerById(db)({
88
+ scopes: {
89
+ tenantId,
90
+ projectId,
91
+ agentId
92
+ },
93
+ triggerId
94
+ }));
95
+ }
96
+ async function verifyAuthentication(trigger, honoContext) {
97
+ if (!trigger.authentication) return { success: true };
98
+ const authResult = await verifyTriggerAuth(honoContext, trigger.authentication);
99
+ if (!authResult.success) {
100
+ if (authResult.status === 401) return {
101
+ success: false,
102
+ error: authResult.message || "Unauthorized",
103
+ status: 401
104
+ };
105
+ return {
106
+ success: false,
107
+ error: authResult.message || "Forbidden",
108
+ status: 403
109
+ };
110
+ }
111
+ return { success: true };
112
+ }
113
+ /**
114
+ * Resolve signing secret from credential reference with caching
115
+ */
116
+ async function resolveSigningSecret(params) {
117
+ const { tenantId, projectId, credentialReferenceId, resolvedRef } = params;
118
+ const cacheKey = `${tenantId}:${projectId}:${credentialReferenceId}`;
119
+ const cached = credentialCache.get(cacheKey);
120
+ if (cached && cached.expiresAt > Date.now()) return cached.secret;
121
+ const credentialRef = await withRef(manageDbPool_default, resolvedRef, (db) => getCredentialReference(db)({
122
+ scopes: {
123
+ tenantId,
124
+ projectId
125
+ },
126
+ id: credentialReferenceId
127
+ }));
128
+ if (!credentialRef) {
129
+ logger.warn({
130
+ tenantId,
131
+ projectId,
132
+ credentialReferenceId
133
+ }, "Credential reference not found");
134
+ return null;
135
+ }
136
+ const lookupKey = getCredentialStoreLookupKeyFromRetrievalParams({
137
+ retrievalParams: credentialRef.retrievalParams ?? {},
138
+ credentialStoreType: credentialRef.type
139
+ });
140
+ if (!lookupKey) {
141
+ logger.warn({
142
+ tenantId,
143
+ projectId,
144
+ credentialReferenceId,
145
+ retrievalParams: credentialRef.retrievalParams
146
+ }, "Could not determine lookup key from credential reference");
147
+ return null;
148
+ }
149
+ let secret = null;
150
+ if (credentialRef.type === "keychain" || credentialRef.credentialStoreId?.startsWith("keychain")) secret = await createKeyChainStore(credentialRef.credentialStoreId ?? "keychain-default").get(lookupKey);
151
+ else if (credentialRef.type === "nango" || credentialRef.credentialStoreId?.startsWith("nango")) {
152
+ const nangoSecretKey = process.env.NANGO_SECRET_KEY;
153
+ if (!nangoSecretKey) {
154
+ logger.warn({
155
+ tenantId,
156
+ projectId,
157
+ credentialReferenceId
158
+ }, "NANGO_SECRET_KEY not configured, cannot resolve Nango credential");
159
+ return null;
160
+ }
161
+ try {
162
+ secret = await createNangoCredentialStore(credentialRef.credentialStoreId ?? DEFAULT_NANGO_STORE_ID, {
163
+ secretKey: nangoSecretKey,
164
+ apiUrl: process.env.NANGO_SERVER_URL || "https://api.nango.dev"
165
+ }).get(lookupKey);
166
+ } catch (error) {
167
+ logger.error({
168
+ tenantId,
169
+ projectId,
170
+ credentialReferenceId,
171
+ error: error instanceof Error ? error.message : "Unknown error"
172
+ }, "Failed to create or fetch from Nango credential store");
173
+ return null;
174
+ }
175
+ } else {
176
+ logger.warn({
177
+ credentialStoreType: credentialRef.type,
178
+ credentialStoreId: credentialRef.credentialStoreId
179
+ }, "Unsupported credential store type for signing secret");
180
+ return null;
181
+ }
182
+ if (!secret) {
183
+ logger.warn({
184
+ tenantId,
185
+ projectId,
186
+ credentialReferenceId,
187
+ lookupKey
188
+ }, "No secret found in credential store");
189
+ return null;
190
+ }
191
+ if (secret.startsWith("{")) try {
192
+ const parsed = JSON.parse(secret);
193
+ const extractedSecret = parsed.access_token || parsed.secret || parsed.value || parsed.token || parsed.key;
194
+ if (extractedSecret && typeof extractedSecret === "string") secret = extractedSecret;
195
+ } catch {}
196
+ credentialCache.set(cacheKey, {
197
+ secret,
198
+ expiresAt: Date.now() + CACHE_TTL_MS
199
+ });
200
+ return secret;
201
+ }
202
+ async function verifySignature(params) {
203
+ const { trigger, tenantId, projectId, resolvedRef, honoContext, rawBody } = params;
204
+ if (!trigger.signatureVerification || !trigger.signingSecretCredentialReferenceId) return { success: true };
205
+ try {
206
+ const secret = await resolveSigningSecret({
207
+ tenantId,
208
+ projectId,
209
+ credentialReferenceId: trigger.signingSecretCredentialReferenceId,
210
+ resolvedRef
211
+ });
212
+ if (!secret) return {
213
+ success: false,
214
+ error: "Failed to resolve signing secret from credential reference",
215
+ status: 500
216
+ };
217
+ const result = verifySignatureWithConfig(honoContext, trigger.signatureVerification, secret, rawBody);
218
+ if (!result.success) return {
219
+ success: false,
220
+ error: result.message || "Invalid signature",
221
+ status: 403
222
+ };
223
+ return { success: true };
224
+ } catch (error) {
225
+ const errorMessage = error instanceof Error ? error.message : String(error);
226
+ logger.error({
227
+ error: errorMessage,
228
+ tenantId,
229
+ projectId
230
+ }, "Error during signature verification");
231
+ return {
232
+ success: false,
233
+ error: "Signature verification failed",
234
+ status: 500
235
+ };
236
+ }
237
+ }
238
+ function validatePayload(trigger, payload) {
239
+ if (!trigger.inputSchema) return { success: true };
240
+ const validate = ajv.compile(trigger.inputSchema);
241
+ if (!validate(payload)) return {
242
+ success: false,
243
+ error: "Payload validation failed",
244
+ status: 400,
245
+ validationErrors: validate.errors?.map((err) => `${err.instancePath} ${err.message}`)
246
+ };
247
+ return { success: true };
248
+ }
249
+ async function transformPayload(trigger, payload, context$1) {
250
+ if (!trigger.outputTransform) return {
251
+ success: true,
252
+ payload
253
+ };
254
+ try {
255
+ const transformedPayload = await JsonTransformer.transformWithConfig(payload, trigger.outputTransform);
256
+ logger.debug(context$1, "Payload transformation successful");
257
+ return {
258
+ success: true,
259
+ payload: transformedPayload
260
+ };
261
+ } catch (error) {
262
+ const errorMessage = error instanceof Error ? error.message : String(error);
263
+ logger.error({
264
+ ...context$1,
265
+ error: errorMessage
266
+ }, "Payload transformation failed");
267
+ return {
268
+ success: false,
269
+ error: `Payload transformation failed: ${errorMessage}`,
270
+ status: 422
271
+ };
272
+ }
273
+ }
274
+ function buildMessage(trigger, transformedPayload, triggerId) {
275
+ const messageParts = [];
276
+ if (trigger.messageTemplate) {
277
+ const payloadForTemplate = typeof transformedPayload === "object" && transformedPayload !== null && !Array.isArray(transformedPayload) ? transformedPayload : {};
278
+ const interpolatedMessage = interpolateTemplate(trigger.messageTemplate, payloadForTemplate);
279
+ messageParts.push({
280
+ kind: "text",
281
+ text: interpolatedMessage
282
+ });
283
+ }
284
+ if (transformedPayload != null) messageParts.push({
285
+ kind: "data",
286
+ data: transformedPayload,
287
+ metadata: {
288
+ source: "trigger",
289
+ triggerId
290
+ }
291
+ });
292
+ return {
293
+ messageParts,
294
+ userMessageText: trigger.messageTemplate ? (() => {
295
+ const payloadForTemplate = typeof transformedPayload === "object" && transformedPayload !== null && !Array.isArray(transformedPayload) ? transformedPayload : {};
296
+ return interpolateTemplate(trigger.messageTemplate, payloadForTemplate);
297
+ })() : JSON.stringify(transformedPayload)
298
+ };
299
+ }
300
+ async function dispatchExecution(params) {
301
+ const { tenantId, projectId, agentId, triggerId, resolvedRef, payload, transformedPayload, messageParts, userMessageText } = params;
302
+ const conversationId = getConversationId();
303
+ const invocationId = generateId();
304
+ await createTriggerInvocation(runDbClient_default)({
305
+ id: invocationId,
306
+ triggerId,
307
+ tenantId,
308
+ projectId,
309
+ agentId,
310
+ conversationId,
311
+ status: "pending",
312
+ requestPayload: payload,
313
+ transformedPayload
314
+ });
315
+ logger.info({
316
+ tenantId,
317
+ projectId,
318
+ agentId,
319
+ triggerId,
320
+ invocationId,
321
+ conversationId
322
+ }, "Trigger invocation created");
323
+ const executionPromise = executeAgentAsync({
324
+ tenantId,
325
+ projectId,
326
+ agentId,
327
+ triggerId,
328
+ invocationId,
329
+ conversationId,
330
+ userMessage: userMessageText,
331
+ messageParts,
332
+ resolvedRef
333
+ });
334
+ if (waitUntil) waitUntil(executionPromise);
335
+ else executionPromise.catch((error) => {
336
+ const errorMessage = error instanceof Error ? error.message : String(error);
337
+ const errorStack = error instanceof Error ? error.stack : void 0;
338
+ logger.error({
339
+ err: errorMessage,
340
+ errorStack,
341
+ tenantId,
342
+ projectId,
343
+ agentId,
344
+ triggerId,
345
+ invocationId
346
+ }, "Background trigger execution failed");
347
+ });
348
+ logger.info({
349
+ tenantId,
350
+ projectId,
351
+ agentId,
352
+ triggerId,
353
+ invocationId,
354
+ conversationId
355
+ }, "Async execution dispatched");
356
+ return {
357
+ invocationId,
358
+ conversationId
359
+ };
360
+ }
361
+ /**
362
+ * Execute the agent asynchronously.
363
+ * This runs after the webhook response is sent.
364
+ */
365
+ async function executeAgentAsync(params) {
366
+ const { tenantId, projectId, agentId, triggerId, invocationId, conversationId, userMessage, messageParts, resolvedRef } = params;
367
+ const project = await withRef(manageDbPool_default, resolvedRef, async (db) => {
368
+ return await getFullProjectWithRelationIds(db)({ scopes: {
369
+ tenantId,
370
+ projectId
371
+ } });
372
+ });
373
+ if (!project) throw new Error(`Project ${projectId} not found`);
374
+ const agent = project.agents?.[agentId];
375
+ if (!agent) throw new Error(`Agent ${agentId} not found in project`);
376
+ const defaultSubAgentId = agent.defaultSubAgentId;
377
+ if (!defaultSubAgentId) throw new Error(`Agent ${agentId} has no default sub-agent configured`);
378
+ const agentName = agent.name;
379
+ const baggage = propagation.createBaggage().setEntry("conversation.id", { value: conversationId }).setEntry("tenant.id", { value: tenantId }).setEntry("project.id", { value: projectId }).setEntry("agent.id", { value: agentId }).setEntry("agent.name", { value: agentName });
380
+ const ctxWithBaggage = propagation.setBaggage(context.active(), baggage);
381
+ return tracer.startActiveSpan("trigger.execute_async", {
382
+ root: true,
383
+ attributes: {
384
+ "tenant.id": tenantId,
385
+ "project.id": projectId,
386
+ "agent.id": agentId,
387
+ "agent.name": agentName,
388
+ "trigger.id": triggerId,
389
+ "trigger.invocation.id": invocationId,
390
+ "conversation.id": conversationId,
391
+ "invocation.type": "trigger"
392
+ }
393
+ }, ctxWithBaggage, async (span) => {
394
+ tracer.startSpan("trigger.message_received", { attributes: {
395
+ "tenant.id": tenantId,
396
+ "project.id": projectId,
397
+ "agent.id": agentId,
398
+ "agent.name": agentName,
399
+ "trigger.id": triggerId,
400
+ "trigger.invocation.id": invocationId,
401
+ "conversation.id": conversationId,
402
+ "invocation.type": "trigger",
403
+ "message.content": userMessage,
404
+ "message.timestamp": (/* @__PURE__ */ new Date()).toISOString(),
405
+ "message.parts": JSON.stringify(messageParts)
406
+ } }, context.active()).end();
407
+ await flushBatchProcessor();
408
+ logger.info({
409
+ tenantId,
410
+ projectId,
411
+ agentId,
412
+ triggerId,
413
+ invocationId,
414
+ conversationId
415
+ }, "Starting async trigger execution");
416
+ try {
417
+ await createOrGetConversation(runDbClient_default)({
418
+ id: conversationId,
419
+ tenantId,
420
+ projectId,
421
+ agentId,
422
+ activeSubAgentId: defaultSubAgentId,
423
+ ref: resolvedRef
424
+ });
425
+ await setActiveAgentForConversation(runDbClient_default)({
426
+ scopes: {
427
+ tenantId,
428
+ projectId
429
+ },
430
+ conversationId,
431
+ subAgentId: defaultSubAgentId,
432
+ agentId,
433
+ ref: resolvedRef
434
+ });
435
+ await createMessage(runDbClient_default)({
436
+ id: generateId(),
437
+ tenantId,
438
+ projectId,
439
+ conversationId,
440
+ role: "user",
441
+ content: {
442
+ text: userMessage,
443
+ parts: messageParts
444
+ },
445
+ metadata: { a2a_metadata: {
446
+ triggerId,
447
+ invocationId
448
+ } }
449
+ });
450
+ const executionContext = {
451
+ tenantId,
452
+ projectId,
453
+ agentId,
454
+ baseUrl: env.INKEEP_AGENTS_API_URL || "http://localhost:3002",
455
+ apiKey: env.INKEEP_AGENTS_RUN_API_BYPASS_SECRET || "",
456
+ apiKeyId: "trigger-invocation",
457
+ resolvedRef,
458
+ project,
459
+ metadata: { initiatedBy: {
460
+ type: "api_key",
461
+ id: triggerId
462
+ } }
463
+ };
464
+ const requestId = `trigger-${invocationId}`;
465
+ const noOpStreamHelper = createSSEStreamHelper({
466
+ writeSSE: async () => {},
467
+ sleep: async () => {}
468
+ }, requestId, Math.floor(Date.now() / 1e3));
469
+ await new ExecutionHandler().execute({
470
+ executionContext,
471
+ conversationId,
472
+ userMessage,
473
+ messageParts,
474
+ initialAgentId: agentId,
475
+ requestId,
476
+ sseHelper: noOpStreamHelper,
477
+ emitOperations: false
478
+ });
479
+ await updateTriggerInvocationStatus(runDbClient_default)({
480
+ scopes: {
481
+ tenantId,
482
+ projectId,
483
+ agentId
484
+ },
485
+ triggerId,
486
+ invocationId,
487
+ data: { status: "success" }
488
+ });
489
+ span.setStatus({ code: SpanStatusCode.OK });
490
+ logger.info({
491
+ tenantId,
492
+ projectId,
493
+ agentId,
494
+ triggerId,
495
+ invocationId,
496
+ conversationId
497
+ }, "Async trigger execution completed successfully");
498
+ } catch (error) {
499
+ const errorMessage = error instanceof Error ? error.message : String(error);
500
+ const errorStack = error instanceof Error ? error.stack : void 0;
501
+ span.setStatus({
502
+ code: SpanStatusCode.ERROR,
503
+ message: errorMessage
504
+ });
505
+ span.recordException(error instanceof Error ? error : new Error(errorMessage));
506
+ logger.error({
507
+ err: errorMessage,
508
+ errorStack,
509
+ tenantId,
510
+ projectId,
511
+ agentId,
512
+ triggerId,
513
+ invocationId
514
+ }, "Async trigger execution failed");
515
+ try {
516
+ await updateTriggerInvocationStatus(runDbClient_default)({
517
+ scopes: {
518
+ tenantId,
519
+ projectId,
520
+ agentId
521
+ },
522
+ triggerId,
523
+ invocationId,
524
+ data: {
525
+ status: "failed",
526
+ errorMessage
527
+ }
528
+ });
529
+ } catch (updateError) {
530
+ const updateErrorMessage = updateError instanceof Error ? updateError.message : String(updateError);
531
+ logger.error({
532
+ err: updateErrorMessage,
533
+ invocationId
534
+ }, "Failed to update invocation status to failed");
535
+ }
536
+ throw error;
537
+ } finally {
538
+ span.end();
539
+ await flushBatchProcessor();
540
+ }
541
+ });
542
+ }
543
+
544
+ //#endregion
545
+ export { processWebhook };
@@ -13,10 +13,11 @@ interface FunctionToolConfig {
13
13
  declare class NativeSandboxExecutor {
14
14
  private tempDir;
15
15
  private sandboxPool;
16
- private static instance;
17
16
  private executionSemaphores;
17
+ private poolCleanupInterval;
18
+ private sandboxInitPromises;
18
19
  constructor();
19
- static getInstance(): NativeSandboxExecutor;
20
+ cleanup(): Promise<void>;
20
21
  private getSemaphore;
21
22
  getExecutionStats(): Record<string, {
22
23
  availablePermits: number;