@inkeep/agents-api 0.0.1 → 0.43.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 (150) hide show
  1. package/dist/.well-known/workflow/v1/flow.cjs +43 -106
  2. package/dist/.well-known/workflow/v1/flow.cjs.debug.json +2 -4
  3. package/dist/.well-known/workflow/v1/manifest.debug.json +17 -55
  4. package/dist/.well-known/workflow/v1/step.cjs +45938 -45976
  5. package/dist/.well-known/workflow/v1/step.cjs.debug.json +2 -4
  6. package/dist/_virtual/rolldown_runtime.js +7 -0
  7. package/dist/createApp.js +40 -12
  8. package/dist/domains/evals/api/.well-known/workflow/v1/flow.d.ts +4 -0
  9. package/dist/domains/evals/api/.well-known/workflow/v1/flow.js +12 -0
  10. package/dist/domains/evals/api/.well-known/workflow/v1/step.d.ts +4 -0
  11. package/dist/domains/evals/api/.well-known/workflow/v1/step.js +12 -0
  12. package/dist/domains/evals/routes/datasetTriggers.d.ts +2 -2
  13. package/dist/domains/evals/routes/index.d.ts +2 -2
  14. package/dist/domains/evals/scripts/build-workflow.js +2 -2
  15. package/dist/domains/evals/workflow/functions/evaluateConversation.d.ts +4 -1
  16. package/dist/domains/evals/workflow/functions/evaluateConversation.js +2 -1
  17. package/dist/domains/evals/workflow/functions/runDatasetItem.d.ts +4 -1
  18. package/dist/domains/evals/workflow/functions/runDatasetItem.js +2 -1
  19. package/dist/domains/evals/workflow/routes.d.ts +2 -2
  20. package/dist/domains/evals/workflow/world.js +3 -2
  21. package/dist/domains/github/config.d.ts +14 -0
  22. package/dist/domains/github/config.js +47 -0
  23. package/dist/domains/github/index.d.ts +12 -0
  24. package/dist/domains/github/index.js +18 -0
  25. package/dist/domains/github/installation.d.ts +34 -0
  26. package/dist/domains/github/installation.js +172 -0
  27. package/dist/domains/github/jwks.d.ts +20 -0
  28. package/dist/domains/github/jwks.js +85 -0
  29. package/dist/domains/github/oidcToken.d.ts +22 -0
  30. package/dist/domains/github/oidcToken.js +140 -0
  31. package/dist/domains/github/routes/tokenExchange.d.ts +7 -0
  32. package/dist/domains/github/routes/tokenExchange.js +130 -0
  33. package/dist/domains/manage/index.js +0 -2
  34. package/dist/domains/manage/routes/agent.js +9 -4
  35. package/dist/domains/manage/routes/agentFull.js +9 -6
  36. package/dist/domains/manage/routes/apiKeys.js +1 -2
  37. package/dist/domains/manage/routes/artifactComponents.js +5 -5
  38. package/dist/domains/manage/routes/cliAuth.js +3 -3
  39. package/dist/domains/manage/routes/contextConfigs.js +5 -5
  40. package/dist/domains/manage/routes/conversations.d.ts +2 -2
  41. package/dist/domains/manage/routes/credentialStores.js +2 -2
  42. package/dist/domains/manage/routes/credentials.js +6 -7
  43. package/dist/domains/manage/routes/dataComponents.js +6 -7
  44. package/dist/domains/manage/routes/externalAgents.js +1 -2
  45. package/dist/domains/manage/routes/index.d.ts +2 -2
  46. package/dist/domains/manage/routes/index.js +4 -0
  47. package/dist/domains/manage/routes/invitations.js +1 -1
  48. package/dist/domains/manage/routes/mcp.d.ts +2 -2
  49. package/dist/domains/manage/routes/playgroundToken.js +1 -2
  50. package/dist/domains/manage/routes/projectFull.js +33 -11
  51. package/dist/domains/manage/routes/projectMembers.js +16 -35
  52. package/dist/domains/manage/routes/projectPermissions.js +17 -10
  53. package/dist/domains/manage/routes/projects.js +4 -5
  54. package/dist/domains/manage/routes/signoz.d.ts +2 -2
  55. package/dist/domains/manage/routes/signoz.js +6 -3
  56. package/dist/domains/manage/routes/subAgentArtifactComponents.js +5 -5
  57. package/dist/domains/manage/routes/subAgentDataComponents.js +5 -5
  58. package/dist/domains/manage/routes/subAgentExternalAgentRelations.js +5 -5
  59. package/dist/domains/manage/routes/subAgentFunctionTools.js +5 -5
  60. package/dist/domains/manage/routes/subAgentRelations.js +6 -6
  61. package/dist/domains/manage/routes/subAgentTeamAgentRelations.js +6 -6
  62. package/dist/domains/manage/routes/subAgentToolRelations.js +6 -6
  63. package/dist/domains/manage/routes/subAgents.js +5 -5
  64. package/dist/domains/manage/routes/tools.js +24 -3
  65. package/dist/domains/manage/routes/triggers.js +82 -25
  66. package/dist/domains/manage/routes/userOrganizations.js +4 -4
  67. package/dist/domains/manage/routes/{agentToolRelations.d.ts → userProjectMemberships.d.ts} +1 -1
  68. package/dist/domains/manage/routes/userProjectMemberships.js +45 -0
  69. package/dist/domains/mcp/routes/mcp.d.ts +7 -0
  70. package/dist/domains/mcp/routes/mcp.js +45 -0
  71. package/dist/domains/run/a2a/handlers.js +2 -10
  72. package/dist/domains/run/a2a/types.d.ts +2 -6
  73. package/dist/domains/run/agents/Agent.d.ts +1 -0
  74. package/dist/domains/run/agents/Agent.js +207 -44
  75. package/dist/domains/run/agents/generateTaskHandler.js +14 -2
  76. package/dist/domains/run/context/ContextFetcher.js +8 -7
  77. package/dist/domains/run/context/ContextResolver.js +1 -1
  78. package/dist/domains/run/handlers/executionHandler.d.ts +3 -1
  79. package/dist/domains/run/handlers/executionHandler.js +149 -84
  80. package/dist/domains/run/routes/agents.js +1 -1
  81. package/dist/domains/run/routes/chat.js +47 -1
  82. package/dist/domains/run/routes/chatDataStream.js +107 -14
  83. package/dist/domains/run/routes/webhooks.js +40 -329
  84. package/dist/domains/run/services/AgentSession.d.ts +3 -0
  85. package/dist/domains/run/services/AgentSession.js +9 -0
  86. package/dist/domains/run/services/BaseCompressor.js +1 -1
  87. package/dist/domains/run/services/ToolApprovalUiBus.d.ts +28 -0
  88. package/dist/domains/run/services/ToolApprovalUiBus.js +44 -0
  89. package/dist/domains/run/services/TriggerService.d.ts +31 -0
  90. package/dist/domains/run/services/TriggerService.js +543 -0
  91. package/dist/domains/run/tools/NativeSandboxExecutor.d.ts +3 -2
  92. package/dist/domains/run/tools/NativeSandboxExecutor.js +76 -48
  93. package/dist/domains/run/tools/SandboxExecutorFactory.d.ts +11 -1
  94. package/dist/domains/run/tools/SandboxExecutorFactory.js +27 -3
  95. package/dist/domains/run/tools/VercelSandboxExecutor.d.ts +3 -11
  96. package/dist/domains/run/tools/VercelSandboxExecutor.js +137 -127
  97. package/dist/domains/run/types/xml.d.ts +1 -5
  98. package/dist/domains/run/utils/stream-helpers.d.ts +134 -0
  99. package/dist/domains/run/utils/stream-helpers.js +182 -0
  100. package/dist/factory.d.ts +278 -272
  101. package/dist/index.d.ts +275 -269
  102. package/dist/index.js +16 -1
  103. package/dist/initialization.js +9 -2
  104. package/dist/middleware/cors.js +1 -1
  105. package/dist/middleware/evalsAuth.d.ts +2 -2
  106. package/dist/middleware/manageAuth.d.ts +2 -2
  107. package/dist/middleware/projectAccess.d.ts +4 -11
  108. package/dist/middleware/projectAccess.js +1 -17
  109. package/dist/middleware/projectConfig.d.ts +3 -3
  110. package/dist/middleware/requirePermission.d.ts +2 -2
  111. package/dist/middleware/runAuth.d.ts +4 -4
  112. package/dist/middleware/sessionAuth.d.ts +3 -3
  113. package/dist/middleware/tenantAccess.d.ts +2 -2
  114. package/dist/middleware/tenantAccess.js +4 -4
  115. package/dist/middleware/tracing.d.ts +3 -3
  116. package/dist/openapi.d.ts +35 -1
  117. package/dist/openapi.js +39 -95
  118. package/dist/routes/healthChecks.d.ts +10 -0
  119. package/dist/routes/healthChecks.js +75 -0
  120. package/dist/templates/v1/phase1/system-prompt.js +1 -1
  121. package/dist/templates/v1/phase1/thinking-preparation.js +1 -1
  122. package/dist/templates/v1/phase1/tool.js +1 -1
  123. package/dist/templates/v1/phase2/data-component.js +1 -1
  124. package/dist/templates/v1/phase2/data-components.js +1 -1
  125. package/dist/templates/v1/phase2/system-prompt.js +1 -1
  126. package/dist/templates/v1/shared/artifact-retrieval-guidance.js +1 -1
  127. package/dist/templates/v1/shared/artifact.js +1 -1
  128. package/dist/types/app.d.ts +2 -0
  129. package/dist/utils/healthChecks.d.ts +8 -0
  130. package/dist/utils/healthChecks.js +38 -0
  131. package/dist/utils/signozHelpers.d.ts +2 -2
  132. package/dist/utils/signozHelpers.js +15 -3
  133. package/package.json +25 -28
  134. package/dist/domains/evals/services/startEvaluation.d.ts +0 -19
  135. package/dist/domains/evals/services/startEvaluation.js +0 -18
  136. package/dist/domains/index.d.ts +0 -4
  137. package/dist/domains/index.js +0 -5
  138. package/dist/domains/manage/routes/agentToolRelations.js +0 -289
  139. package/dist/domains/run/agents/ModelFactory.d.ts +0 -63
  140. package/dist/domains/run/agents/ModelFactory.js +0 -194
  141. package/dist/domains/run/data/agent.d.ts +0 -7
  142. package/dist/domains/run/data/agent.js +0 -67
  143. package/dist/domains/run/services/evaluationRunConfigMatcher.d.ts +0 -4
  144. package/dist/domains/run/services/evaluationRunConfigMatcher.js +0 -7
  145. package/dist/domains/run/utils/cleanup.d.ts +0 -21
  146. package/dist/domains/run/utils/cleanup.js +0 -59
  147. package/dist/utils/tempApiKeys.d.ts +0 -17
  148. package/dist/utils/tempApiKeys.js +0 -26
  149. package/dist/utils/workflowApiHelpers.d.ts +0 -1
  150. package/dist/utils/workflowApiHelpers.js +0 -1
@@ -0,0 +1,543 @@
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 baggage = propagation.createBaggage().setEntry("conversation.id", { value: conversationId }).setEntry("tenant.id", { value: tenantId }).setEntry("project.id", { value: projectId }).setEntry("agent.id", { value: agentId });
368
+ const ctxWithBaggage = propagation.setBaggage(context.active(), baggage);
369
+ return tracer.startActiveSpan("trigger.execute_async", {
370
+ root: true,
371
+ attributes: {
372
+ "tenant.id": tenantId,
373
+ "project.id": projectId,
374
+ "agent.id": agentId,
375
+ "trigger.id": triggerId,
376
+ "trigger.invocation.id": invocationId,
377
+ "conversation.id": conversationId,
378
+ "invocation.type": "trigger"
379
+ }
380
+ }, ctxWithBaggage, async (span) => {
381
+ tracer.startSpan("trigger.message_received", { attributes: {
382
+ "tenant.id": tenantId,
383
+ "project.id": projectId,
384
+ "agent.id": agentId,
385
+ "trigger.id": triggerId,
386
+ "trigger.invocation.id": invocationId,
387
+ "conversation.id": conversationId,
388
+ "invocation.type": "trigger",
389
+ "message.content": userMessage,
390
+ "message.timestamp": (/* @__PURE__ */ new Date()).toISOString(),
391
+ "message.parts": JSON.stringify(messageParts)
392
+ } }, context.active()).end();
393
+ await flushBatchProcessor();
394
+ logger.info({
395
+ tenantId,
396
+ projectId,
397
+ agentId,
398
+ triggerId,
399
+ invocationId,
400
+ conversationId
401
+ }, "Starting async trigger execution");
402
+ try {
403
+ const project = await withRef(manageDbPool_default, resolvedRef, async (db) => {
404
+ return await getFullProjectWithRelationIds(db)({ scopes: {
405
+ tenantId,
406
+ projectId
407
+ } });
408
+ });
409
+ if (!project) throw new Error(`Project ${projectId} not found`);
410
+ const agent = project.agents?.[agentId];
411
+ if (!agent) throw new Error(`Agent ${agentId} not found in project`);
412
+ const defaultSubAgentId = agent.defaultSubAgentId;
413
+ if (!defaultSubAgentId) throw new Error(`Agent ${agentId} has no default sub-agent configured`);
414
+ span.setAttribute("agent.name", agent.name || agentId);
415
+ await createOrGetConversation(runDbClient_default)({
416
+ id: conversationId,
417
+ tenantId,
418
+ projectId,
419
+ agentId,
420
+ activeSubAgentId: defaultSubAgentId,
421
+ ref: resolvedRef
422
+ });
423
+ await setActiveAgentForConversation(runDbClient_default)({
424
+ scopes: {
425
+ tenantId,
426
+ projectId
427
+ },
428
+ conversationId,
429
+ subAgentId: defaultSubAgentId,
430
+ agentId,
431
+ ref: resolvedRef
432
+ });
433
+ await createMessage(runDbClient_default)({
434
+ id: generateId(),
435
+ tenantId,
436
+ projectId,
437
+ conversationId,
438
+ role: "user",
439
+ content: {
440
+ text: userMessage,
441
+ parts: messageParts
442
+ },
443
+ metadata: { a2a_metadata: {
444
+ triggerId,
445
+ invocationId
446
+ } }
447
+ });
448
+ const executionContext = {
449
+ tenantId,
450
+ projectId,
451
+ agentId,
452
+ baseUrl: env.INKEEP_AGENTS_API_URL || "http://localhost:3002",
453
+ apiKey: env.INKEEP_AGENTS_RUN_API_BYPASS_SECRET || "",
454
+ apiKeyId: "trigger-invocation",
455
+ resolvedRef,
456
+ project,
457
+ metadata: { initiatedBy: {
458
+ type: "api_key",
459
+ id: triggerId
460
+ } }
461
+ };
462
+ const requestId = `trigger-${invocationId}`;
463
+ const noOpStreamHelper = createSSEStreamHelper({
464
+ writeSSE: async () => {},
465
+ sleep: async () => {}
466
+ }, requestId, Math.floor(Date.now() / 1e3));
467
+ await new ExecutionHandler().execute({
468
+ executionContext,
469
+ conversationId,
470
+ userMessage,
471
+ messageParts,
472
+ initialAgentId: agentId,
473
+ requestId,
474
+ sseHelper: noOpStreamHelper,
475
+ emitOperations: false
476
+ });
477
+ await updateTriggerInvocationStatus(runDbClient_default)({
478
+ scopes: {
479
+ tenantId,
480
+ projectId,
481
+ agentId
482
+ },
483
+ triggerId,
484
+ invocationId,
485
+ data: { status: "success" }
486
+ });
487
+ span.setStatus({ code: SpanStatusCode.OK });
488
+ logger.info({
489
+ tenantId,
490
+ projectId,
491
+ agentId,
492
+ triggerId,
493
+ invocationId,
494
+ conversationId
495
+ }, "Async trigger execution completed successfully");
496
+ } catch (error) {
497
+ const errorMessage = error instanceof Error ? error.message : String(error);
498
+ const errorStack = error instanceof Error ? error.stack : void 0;
499
+ span.setStatus({
500
+ code: SpanStatusCode.ERROR,
501
+ message: errorMessage
502
+ });
503
+ span.recordException(error instanceof Error ? error : new Error(errorMessage));
504
+ logger.error({
505
+ err: errorMessage,
506
+ errorStack,
507
+ tenantId,
508
+ projectId,
509
+ agentId,
510
+ triggerId,
511
+ invocationId
512
+ }, "Async trigger execution failed");
513
+ try {
514
+ await updateTriggerInvocationStatus(runDbClient_default)({
515
+ scopes: {
516
+ tenantId,
517
+ projectId,
518
+ agentId
519
+ },
520
+ triggerId,
521
+ invocationId,
522
+ data: {
523
+ status: "failed",
524
+ errorMessage
525
+ }
526
+ });
527
+ } catch (updateError) {
528
+ const updateErrorMessage = updateError instanceof Error ? updateError.message : String(updateError);
529
+ logger.error({
530
+ err: updateErrorMessage,
531
+ invocationId
532
+ }, "Failed to update invocation status to failed");
533
+ }
534
+ throw error;
535
+ } finally {
536
+ span.end();
537
+ await flushBatchProcessor();
538
+ }
539
+ });
540
+ }
541
+
542
+ //#endregion
543
+ 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;