@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.
- package/dist/.well-known/workflow/v1/flow.cjs +43 -106
- package/dist/.well-known/workflow/v1/flow.cjs.debug.json +2 -4
- package/dist/.well-known/workflow/v1/manifest.debug.json +17 -55
- package/dist/.well-known/workflow/v1/step.cjs +45938 -45976
- package/dist/.well-known/workflow/v1/step.cjs.debug.json +2 -4
- package/dist/_virtual/rolldown_runtime.js +7 -0
- package/dist/createApp.js +40 -12
- package/dist/domains/evals/api/.well-known/workflow/v1/flow.d.ts +4 -0
- package/dist/domains/evals/api/.well-known/workflow/v1/flow.js +12 -0
- package/dist/domains/evals/api/.well-known/workflow/v1/step.d.ts +4 -0
- package/dist/domains/evals/api/.well-known/workflow/v1/step.js +12 -0
- package/dist/domains/evals/routes/datasetTriggers.d.ts +2 -2
- package/dist/domains/evals/routes/index.d.ts +2 -2
- package/dist/domains/evals/scripts/build-workflow.js +2 -2
- package/dist/domains/evals/workflow/functions/evaluateConversation.d.ts +4 -1
- package/dist/domains/evals/workflow/functions/evaluateConversation.js +2 -1
- package/dist/domains/evals/workflow/functions/runDatasetItem.d.ts +4 -1
- package/dist/domains/evals/workflow/functions/runDatasetItem.js +2 -1
- package/dist/domains/evals/workflow/routes.d.ts +2 -2
- package/dist/domains/evals/workflow/world.js +3 -2
- package/dist/domains/github/config.d.ts +14 -0
- package/dist/domains/github/config.js +47 -0
- package/dist/domains/github/index.d.ts +12 -0
- package/dist/domains/github/index.js +18 -0
- package/dist/domains/github/installation.d.ts +34 -0
- package/dist/domains/github/installation.js +172 -0
- package/dist/domains/github/jwks.d.ts +20 -0
- package/dist/domains/github/jwks.js +85 -0
- package/dist/domains/github/oidcToken.d.ts +22 -0
- package/dist/domains/github/oidcToken.js +140 -0
- package/dist/domains/github/routes/tokenExchange.d.ts +7 -0
- package/dist/domains/github/routes/tokenExchange.js +130 -0
- package/dist/domains/manage/index.js +0 -2
- package/dist/domains/manage/routes/agent.js +9 -4
- package/dist/domains/manage/routes/agentFull.js +9 -6
- package/dist/domains/manage/routes/apiKeys.js +1 -2
- package/dist/domains/manage/routes/artifactComponents.js +5 -5
- package/dist/domains/manage/routes/cliAuth.js +3 -3
- package/dist/domains/manage/routes/contextConfigs.js +5 -5
- package/dist/domains/manage/routes/conversations.d.ts +2 -2
- package/dist/domains/manage/routes/credentialStores.js +2 -2
- package/dist/domains/manage/routes/credentials.js +6 -7
- package/dist/domains/manage/routes/dataComponents.js +6 -7
- package/dist/domains/manage/routes/externalAgents.js +1 -2
- package/dist/domains/manage/routes/index.d.ts +2 -2
- package/dist/domains/manage/routes/index.js +4 -0
- package/dist/domains/manage/routes/invitations.js +1 -1
- package/dist/domains/manage/routes/mcp.d.ts +2 -2
- package/dist/domains/manage/routes/playgroundToken.js +1 -2
- package/dist/domains/manage/routes/projectFull.js +33 -11
- package/dist/domains/manage/routes/projectMembers.js +16 -35
- package/dist/domains/manage/routes/projectPermissions.js +17 -10
- package/dist/domains/manage/routes/projects.js +4 -5
- package/dist/domains/manage/routes/signoz.d.ts +2 -2
- package/dist/domains/manage/routes/signoz.js +6 -3
- package/dist/domains/manage/routes/subAgentArtifactComponents.js +5 -5
- package/dist/domains/manage/routes/subAgentDataComponents.js +5 -5
- package/dist/domains/manage/routes/subAgentExternalAgentRelations.js +5 -5
- package/dist/domains/manage/routes/subAgentFunctionTools.js +5 -5
- package/dist/domains/manage/routes/subAgentRelations.js +6 -6
- package/dist/domains/manage/routes/subAgentTeamAgentRelations.js +6 -6
- package/dist/domains/manage/routes/subAgentToolRelations.js +6 -6
- package/dist/domains/manage/routes/subAgents.js +5 -5
- package/dist/domains/manage/routes/tools.js +24 -3
- package/dist/domains/manage/routes/triggers.js +82 -25
- package/dist/domains/manage/routes/userOrganizations.js +4 -4
- package/dist/domains/manage/routes/{agentToolRelations.d.ts → userProjectMemberships.d.ts} +1 -1
- package/dist/domains/manage/routes/userProjectMemberships.js +45 -0
- package/dist/domains/mcp/routes/mcp.d.ts +7 -0
- package/dist/domains/mcp/routes/mcp.js +45 -0
- package/dist/domains/run/a2a/handlers.js +2 -10
- package/dist/domains/run/a2a/types.d.ts +2 -6
- package/dist/domains/run/agents/Agent.d.ts +1 -0
- package/dist/domains/run/agents/Agent.js +207 -44
- package/dist/domains/run/agents/generateTaskHandler.js +14 -2
- package/dist/domains/run/context/ContextFetcher.js +8 -7
- package/dist/domains/run/context/ContextResolver.js +1 -1
- package/dist/domains/run/handlers/executionHandler.d.ts +3 -1
- package/dist/domains/run/handlers/executionHandler.js +149 -84
- package/dist/domains/run/routes/agents.js +1 -1
- package/dist/domains/run/routes/chat.js +47 -1
- package/dist/domains/run/routes/chatDataStream.js +107 -14
- package/dist/domains/run/routes/webhooks.js +40 -329
- package/dist/domains/run/services/AgentSession.d.ts +3 -0
- package/dist/domains/run/services/AgentSession.js +9 -0
- package/dist/domains/run/services/BaseCompressor.js +1 -1
- package/dist/domains/run/services/ToolApprovalUiBus.d.ts +28 -0
- package/dist/domains/run/services/ToolApprovalUiBus.js +44 -0
- package/dist/domains/run/services/TriggerService.d.ts +31 -0
- package/dist/domains/run/services/TriggerService.js +543 -0
- package/dist/domains/run/tools/NativeSandboxExecutor.d.ts +3 -2
- package/dist/domains/run/tools/NativeSandboxExecutor.js +76 -48
- package/dist/domains/run/tools/SandboxExecutorFactory.d.ts +11 -1
- package/dist/domains/run/tools/SandboxExecutorFactory.js +27 -3
- package/dist/domains/run/tools/VercelSandboxExecutor.d.ts +3 -11
- package/dist/domains/run/tools/VercelSandboxExecutor.js +137 -127
- package/dist/domains/run/types/xml.d.ts +1 -5
- package/dist/domains/run/utils/stream-helpers.d.ts +134 -0
- package/dist/domains/run/utils/stream-helpers.js +182 -0
- package/dist/factory.d.ts +278 -272
- package/dist/index.d.ts +275 -269
- package/dist/index.js +16 -1
- package/dist/initialization.js +9 -2
- package/dist/middleware/cors.js +1 -1
- package/dist/middleware/evalsAuth.d.ts +2 -2
- package/dist/middleware/manageAuth.d.ts +2 -2
- package/dist/middleware/projectAccess.d.ts +4 -11
- package/dist/middleware/projectAccess.js +1 -17
- package/dist/middleware/projectConfig.d.ts +3 -3
- package/dist/middleware/requirePermission.d.ts +2 -2
- package/dist/middleware/runAuth.d.ts +4 -4
- package/dist/middleware/sessionAuth.d.ts +3 -3
- package/dist/middleware/tenantAccess.d.ts +2 -2
- package/dist/middleware/tenantAccess.js +4 -4
- package/dist/middleware/tracing.d.ts +3 -3
- package/dist/openapi.d.ts +35 -1
- package/dist/openapi.js +39 -95
- package/dist/routes/healthChecks.d.ts +10 -0
- package/dist/routes/healthChecks.js +75 -0
- package/dist/templates/v1/phase1/system-prompt.js +1 -1
- package/dist/templates/v1/phase1/thinking-preparation.js +1 -1
- package/dist/templates/v1/phase1/tool.js +1 -1
- package/dist/templates/v1/phase2/data-component.js +1 -1
- package/dist/templates/v1/phase2/data-components.js +1 -1
- package/dist/templates/v1/phase2/system-prompt.js +1 -1
- package/dist/templates/v1/shared/artifact-retrieval-guidance.js +1 -1
- package/dist/templates/v1/shared/artifact.js +1 -1
- package/dist/types/app.d.ts +2 -0
- package/dist/utils/healthChecks.d.ts +8 -0
- package/dist/utils/healthChecks.js +38 -0
- package/dist/utils/signozHelpers.d.ts +2 -2
- package/dist/utils/signozHelpers.js +15 -3
- package/package.json +25 -28
- package/dist/domains/evals/services/startEvaluation.d.ts +0 -19
- package/dist/domains/evals/services/startEvaluation.js +0 -18
- package/dist/domains/index.d.ts +0 -4
- package/dist/domains/index.js +0 -5
- package/dist/domains/manage/routes/agentToolRelations.js +0 -289
- package/dist/domains/run/agents/ModelFactory.d.ts +0 -63
- package/dist/domains/run/agents/ModelFactory.js +0 -194
- package/dist/domains/run/data/agent.d.ts +0 -7
- package/dist/domains/run/data/agent.js +0 -67
- package/dist/domains/run/services/evaluationRunConfigMatcher.d.ts +0 -4
- package/dist/domains/run/services/evaluationRunConfigMatcher.js +0 -7
- package/dist/domains/run/utils/cleanup.d.ts +0 -21
- package/dist/domains/run/utils/cleanup.js +0 -59
- package/dist/utils/tempApiKeys.d.ts +0 -17
- package/dist/utils/tempApiKeys.js +0 -26
- package/dist/utils/workflowApiHelpers.d.ts +0 -1
- 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
|
-
|
|
20
|
+
cleanup(): Promise<void>;
|
|
20
21
|
private getSemaphore;
|
|
21
22
|
getExecutionStats(): Record<string, {
|
|
22
23
|
availablePermits: number;
|