@inkeep/agents-api 0.0.1
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/LICENSE.md +56 -0
- package/SUPPLEMENTAL_TERMS.md +40 -0
- package/dist/.well-known/workflow/v1/flow.cjs +46446 -0
- package/dist/.well-known/workflow/v1/flow.cjs.debug.json +8 -0
- package/dist/.well-known/workflow/v1/manifest.debug.json +93 -0
- package/dist/.well-known/workflow/v1/step.cjs +219923 -0
- package/dist/.well-known/workflow/v1/step.cjs.debug.json +8 -0
- package/dist/.well-known/workflow/v1/webhook.mjs +29 -0
- package/dist/createApp.d.ts +10 -0
- package/dist/createApp.js +170 -0
- package/dist/data/db/index.d.ts +4 -0
- package/dist/data/db/index.js +5 -0
- package/dist/data/db/manageDbClient.d.ts +6 -0
- package/dist/data/db/manageDbClient.js +9 -0
- package/dist/data/db/manageDbPool.d.ts +6 -0
- package/dist/data/db/manageDbPool.js +9 -0
- package/dist/data/db/runDbClient.d.ts +6 -0
- package/dist/data/db/runDbClient.js +9 -0
- package/dist/domains/evals/index.d.ts +13 -0
- package/dist/domains/evals/index.js +13 -0
- package/dist/domains/evals/routes/datasetTriggers.d.ts +7 -0
- package/dist/domains/evals/routes/datasetTriggers.js +65 -0
- package/dist/domains/evals/routes/evaluationTriggers.d.ts +11 -0
- package/dist/domains/evals/routes/evaluationTriggers.js +311 -0
- package/dist/domains/evals/routes/index.d.ts +7 -0
- package/dist/domains/evals/routes/index.js +12 -0
- package/dist/domains/evals/scripts/build-workflow.d.ts +1 -0
- package/dist/domains/evals/scripts/build-workflow.js +31 -0
- package/dist/domains/evals/services/EvaluationService.d.ts +96 -0
- package/dist/domains/evals/services/EvaluationService.js +863 -0
- package/dist/domains/evals/services/conversationEvaluation.d.ts +15 -0
- package/dist/domains/evals/services/conversationEvaluation.js +102 -0
- package/dist/domains/evals/services/datasetRun.d.ts +16 -0
- package/dist/domains/evals/services/datasetRun.js +43 -0
- package/dist/domains/evals/services/evaluationJob.d.ts +17 -0
- package/dist/domains/evals/services/evaluationJob.js +65 -0
- package/dist/domains/evals/services/startEvaluation.d.ts +19 -0
- package/dist/domains/evals/services/startEvaluation.js +18 -0
- package/dist/domains/evals/workflow/functions/evaluateConversation.d.ts +28 -0
- package/dist/domains/evals/workflow/functions/evaluateConversation.js +134 -0
- package/dist/domains/evals/workflow/functions/runDatasetItem.d.ts +36 -0
- package/dist/domains/evals/workflow/functions/runDatasetItem.js +204 -0
- package/dist/domains/evals/workflow/index.d.ts +4 -0
- package/dist/domains/evals/workflow/index.js +5 -0
- package/dist/domains/evals/workflow/routes.d.ts +7 -0
- package/dist/domains/evals/workflow/routes.js +106 -0
- package/dist/domains/evals/workflow/world.d.ts +4 -0
- package/dist/domains/evals/workflow/world.js +36 -0
- package/dist/domains/index.d.ts +4 -0
- package/dist/domains/index.js +5 -0
- package/dist/domains/manage/index.d.ts +12 -0
- package/dist/domains/manage/index.js +31 -0
- package/dist/domains/manage/routes/agent.d.ts +9 -0
- package/dist/domains/manage/routes/agent.js +264 -0
- package/dist/domains/manage/routes/agentFull.d.ts +9 -0
- package/dist/domains/manage/routes/agentFull.js +207 -0
- package/dist/domains/manage/routes/agentToolRelations.d.ts +9 -0
- package/dist/domains/manage/routes/agentToolRelations.js +289 -0
- package/dist/domains/manage/routes/apiKeys.d.ts +9 -0
- package/dist/domains/manage/routes/apiKeys.js +217 -0
- package/dist/domains/manage/routes/artifactComponents.d.ts +9 -0
- package/dist/domains/manage/routes/artifactComponents.js +210 -0
- package/dist/domains/manage/routes/branches.d.ts +9 -0
- package/dist/domains/manage/routes/branches.js +182 -0
- package/dist/domains/manage/routes/cliAuth.d.ts +9 -0
- package/dist/domains/manage/routes/cliAuth.js +60 -0
- package/dist/domains/manage/routes/contextConfigs.d.ts +9 -0
- package/dist/domains/manage/routes/contextConfigs.js +189 -0
- package/dist/domains/manage/routes/conversations.d.ts +7 -0
- package/dist/domains/manage/routes/conversations.js +59 -0
- package/dist/domains/manage/routes/credentialStores.d.ts +9 -0
- package/dist/domains/manage/routes/credentialStores.js +86 -0
- package/dist/domains/manage/routes/credentials.d.ts +9 -0
- package/dist/domains/manage/routes/credentials.js +207 -0
- package/dist/domains/manage/routes/dataComponents.d.ts +9 -0
- package/dist/domains/manage/routes/dataComponents.js +192 -0
- package/dist/domains/manage/routes/evals/datasetItems.d.ts +9 -0
- package/dist/domains/manage/routes/evals/datasetItems.js +310 -0
- package/dist/domains/manage/routes/evals/datasetRunConfigs.d.ts +9 -0
- package/dist/domains/manage/routes/evals/datasetRunConfigs.js +402 -0
- package/dist/domains/manage/routes/evals/datasetRuns.d.ts +9 -0
- package/dist/domains/manage/routes/evals/datasetRuns.js +256 -0
- package/dist/domains/manage/routes/evals/datasets.d.ts +9 -0
- package/dist/domains/manage/routes/evals/datasets.js +238 -0
- package/dist/domains/manage/routes/evals/evaluationJobConfigEvaluatorRelations.d.ts +9 -0
- package/dist/domains/manage/routes/evals/evaluationJobConfigEvaluatorRelations.js +146 -0
- package/dist/domains/manage/routes/evals/evaluationJobConfigs.d.ts +9 -0
- package/dist/domains/manage/routes/evals/evaluationJobConfigs.js +364 -0
- package/dist/domains/manage/routes/evals/evaluationResults.d.ts +7 -0
- package/dist/domains/manage/routes/evals/evaluationResults.js +192 -0
- package/dist/domains/manage/routes/evals/evaluationRunConfigs.d.ts +9 -0
- package/dist/domains/manage/routes/evals/evaluationRunConfigs.js +403 -0
- package/dist/domains/manage/routes/evals/evaluationSuiteConfigEvaluatorRelations.d.ts +9 -0
- package/dist/domains/manage/routes/evals/evaluationSuiteConfigEvaluatorRelations.js +146 -0
- package/dist/domains/manage/routes/evals/evaluationSuiteConfigs.d.ts +9 -0
- package/dist/domains/manage/routes/evals/evaluationSuiteConfigs.js +246 -0
- package/dist/domains/manage/routes/evals/evaluators.d.ts +9 -0
- package/dist/domains/manage/routes/evals/evaluators.js +281 -0
- package/dist/domains/manage/routes/evals/index.d.ts +9 -0
- package/dist/domains/manage/routes/evals/index.js +26 -0
- package/dist/domains/manage/routes/externalAgents.d.ts +9 -0
- package/dist/domains/manage/routes/externalAgents.js +199 -0
- package/dist/domains/manage/routes/functionTools.d.ts +9 -0
- package/dist/domains/manage/routes/functionTools.js +256 -0
- package/dist/domains/manage/routes/functions.d.ts +9 -0
- package/dist/domains/manage/routes/functions.js +285 -0
- package/dist/domains/manage/routes/index.d.ts +7 -0
- package/dist/domains/manage/routes/index.js +68 -0
- package/dist/domains/manage/routes/invitations.d.ts +9 -0
- package/dist/domains/manage/routes/invitations.js +41 -0
- package/dist/domains/manage/routes/mcp.d.ts +7 -0
- package/dist/domains/manage/routes/mcp.js +45 -0
- package/dist/domains/manage/routes/mcpCatalog.d.ts +9 -0
- package/dist/domains/manage/routes/mcpCatalog.js +454 -0
- package/dist/domains/manage/routes/oauth.d.ts +10 -0
- package/dist/domains/manage/routes/oauth.js +327 -0
- package/dist/domains/manage/routes/playgroundToken.d.ts +9 -0
- package/dist/domains/manage/routes/playgroundToken.js +127 -0
- package/dist/domains/manage/routes/projectFull.d.ts +9 -0
- package/dist/domains/manage/routes/projectFull.js +304 -0
- package/dist/domains/manage/routes/projectMembers.d.ts +9 -0
- package/dist/domains/manage/routes/projectMembers.js +201 -0
- package/dist/domains/manage/routes/projectPermissions.d.ts +9 -0
- package/dist/domains/manage/routes/projectPermissions.js +68 -0
- package/dist/domains/manage/routes/projects.d.ts +9 -0
- package/dist/domains/manage/routes/projects.js +279 -0
- package/dist/domains/manage/routes/ref.d.ts +9 -0
- package/dist/domains/manage/routes/ref.js +33 -0
- package/dist/domains/manage/routes/signoz.d.ts +10 -0
- package/dist/domains/manage/routes/signoz.js +159 -0
- package/dist/domains/manage/routes/subAgentArtifactComponents.d.ts +9 -0
- package/dist/domains/manage/routes/subAgentArtifactComponents.js +202 -0
- package/dist/domains/manage/routes/subAgentDataComponents.d.ts +9 -0
- package/dist/domains/manage/routes/subAgentDataComponents.js +201 -0
- package/dist/domains/manage/routes/subAgentExternalAgentRelations.d.ts +9 -0
- package/dist/domains/manage/routes/subAgentExternalAgentRelations.js +216 -0
- package/dist/domains/manage/routes/subAgentFunctionTools.d.ts +9 -0
- package/dist/domains/manage/routes/subAgentFunctionTools.js +205 -0
- package/dist/domains/manage/routes/subAgentRelations.d.ts +9 -0
- package/dist/domains/manage/routes/subAgentRelations.js +263 -0
- package/dist/domains/manage/routes/subAgentTeamAgentRelations.d.ts +9 -0
- package/dist/domains/manage/routes/subAgentTeamAgentRelations.js +216 -0
- package/dist/domains/manage/routes/subAgentToolRelations.d.ts +9 -0
- package/dist/domains/manage/routes/subAgentToolRelations.js +289 -0
- package/dist/domains/manage/routes/subAgents.d.ts +9 -0
- package/dist/domains/manage/routes/subAgents.js +220 -0
- package/dist/domains/manage/routes/thirdPartyMCPServers.d.ts +9 -0
- package/dist/domains/manage/routes/thirdPartyMCPServers.js +72 -0
- package/dist/domains/manage/routes/tools.d.ts +9 -0
- package/dist/domains/manage/routes/tools.js +261 -0
- package/dist/domains/manage/routes/triggers.d.ts +9 -0
- package/dist/domains/manage/routes/triggers.js +423 -0
- package/dist/domains/manage/routes/userOrganizations.d.ts +9 -0
- package/dist/domains/manage/routes/userOrganizations.js +58 -0
- package/dist/domains/run/a2a/client.d.ts +186 -0
- package/dist/domains/run/a2a/client.js +524 -0
- package/dist/domains/run/a2a/handlers.d.ts +7 -0
- package/dist/domains/run/a2a/handlers.js +582 -0
- package/dist/domains/run/a2a/transfer.d.ts +27 -0
- package/dist/domains/run/a2a/transfer.js +50 -0
- package/dist/domains/run/a2a/types.d.ts +79 -0
- package/dist/domains/run/a2a/types.js +22 -0
- package/dist/domains/run/agents/Agent.d.ts +273 -0
- package/dist/domains/run/agents/Agent.js +2104 -0
- package/dist/domains/run/agents/ModelFactory.d.ts +63 -0
- package/dist/domains/run/agents/ModelFactory.js +194 -0
- package/dist/domains/run/agents/SystemPromptBuilder.d.ts +21 -0
- package/dist/domains/run/agents/SystemPromptBuilder.js +48 -0
- package/dist/domains/run/agents/ToolSessionManager.d.ts +63 -0
- package/dist/domains/run/agents/ToolSessionManager.js +146 -0
- package/dist/domains/run/agents/generateTaskHandler.d.ts +44 -0
- package/dist/domains/run/agents/generateTaskHandler.js +384 -0
- package/dist/domains/run/agents/relationTools.d.ts +64 -0
- package/dist/domains/run/agents/relationTools.js +365 -0
- package/dist/domains/run/agents/types.d.ts +31 -0
- package/dist/domains/run/agents/types.js +1 -0
- package/dist/domains/run/agents/versions/v1/Phase1Config.d.ts +29 -0
- package/dist/domains/run/agents/versions/v1/Phase1Config.js +458 -0
- package/dist/domains/run/agents/versions/v1/Phase2Config.d.ts +33 -0
- package/dist/domains/run/agents/versions/v1/Phase2Config.js +341 -0
- package/dist/domains/run/constants/execution-limits/defaults.d.ts +51 -0
- package/dist/domains/run/constants/execution-limits/defaults.js +52 -0
- package/dist/domains/run/constants/execution-limits/index.d.ts +6 -0
- package/dist/domains/run/constants/execution-limits/index.js +21 -0
- package/dist/domains/run/context/ContextFetcher.d.ts +68 -0
- package/dist/domains/run/context/ContextFetcher.js +276 -0
- package/dist/domains/run/context/ContextResolver.d.ts +56 -0
- package/dist/domains/run/context/ContextResolver.js +273 -0
- package/dist/domains/run/context/context.d.ts +19 -0
- package/dist/domains/run/context/context.js +108 -0
- package/dist/domains/run/context/contextCache.d.ts +56 -0
- package/dist/domains/run/context/contextCache.js +174 -0
- package/dist/domains/run/context/index.d.ts +6 -0
- package/dist/domains/run/context/index.js +7 -0
- package/dist/domains/run/context/validation.d.ts +39 -0
- package/dist/domains/run/context/validation.js +255 -0
- package/dist/domains/run/data/agent.d.ts +7 -0
- package/dist/domains/run/data/agent.js +67 -0
- package/dist/domains/run/data/agents.d.ts +34 -0
- package/dist/domains/run/data/agents.js +131 -0
- package/dist/domains/run/data/conversations.d.ts +129 -0
- package/dist/domains/run/data/conversations.js +517 -0
- package/dist/domains/run/handlers/executionHandler.d.ts +42 -0
- package/dist/domains/run/handlers/executionHandler.js +484 -0
- package/dist/domains/run/index.d.ts +13 -0
- package/dist/domains/run/index.js +21 -0
- package/dist/domains/run/routes/agents.d.ts +13 -0
- package/dist/domains/run/routes/agents.js +141 -0
- package/dist/domains/run/routes/chat.d.ts +14 -0
- package/dist/domains/run/routes/chat.js +300 -0
- package/dist/domains/run/routes/chatDataStream.d.ts +14 -0
- package/dist/domains/run/routes/chatDataStream.js +381 -0
- package/dist/domains/run/routes/mcp.d.ts +14 -0
- package/dist/domains/run/routes/mcp.js +483 -0
- package/dist/domains/run/routes/webhooks.d.ts +15 -0
- package/dist/domains/run/routes/webhooks.js +396 -0
- package/dist/domains/run/services/AgentSession.d.ts +354 -0
- package/dist/domains/run/services/AgentSession.js +1203 -0
- package/dist/domains/run/services/ArtifactParser.d.ts +105 -0
- package/dist/domains/run/services/ArtifactParser.js +338 -0
- package/dist/domains/run/services/ArtifactService.d.ts +122 -0
- package/dist/domains/run/services/ArtifactService.js +629 -0
- package/dist/domains/run/services/BaseCompressor.d.ts +183 -0
- package/dist/domains/run/services/BaseCompressor.js +500 -0
- package/dist/domains/run/services/ConversationCompressor.d.ts +32 -0
- package/dist/domains/run/services/ConversationCompressor.js +91 -0
- package/dist/domains/run/services/IncrementalStreamParser.d.ts +98 -0
- package/dist/domains/run/services/IncrementalStreamParser.js +327 -0
- package/dist/domains/run/services/MidGenerationCompressor.d.ts +63 -0
- package/dist/domains/run/services/MidGenerationCompressor.js +104 -0
- package/dist/domains/run/services/PendingToolApprovalManager.d.ts +62 -0
- package/dist/domains/run/services/PendingToolApprovalManager.js +133 -0
- package/dist/domains/run/services/ResponseFormatter.d.ts +39 -0
- package/dist/domains/run/services/ResponseFormatter.js +152 -0
- package/dist/domains/run/services/evaluationRunConfigMatcher.d.ts +4 -0
- package/dist/domains/run/services/evaluationRunConfigMatcher.js +7 -0
- package/dist/domains/run/tools/NativeSandboxExecutor.d.ts +38 -0
- package/dist/domains/run/tools/NativeSandboxExecutor.js +432 -0
- package/dist/domains/run/tools/SandboxExecutorFactory.d.ts +36 -0
- package/dist/domains/run/tools/SandboxExecutorFactory.js +80 -0
- package/dist/domains/run/tools/VercelSandboxExecutor.d.ts +71 -0
- package/dist/domains/run/tools/VercelSandboxExecutor.js +340 -0
- package/dist/domains/run/tools/distill-conversation-history-tool.d.ts +62 -0
- package/dist/domains/run/tools/distill-conversation-history-tool.js +206 -0
- package/dist/domains/run/tools/distill-conversation-tool.d.ts +41 -0
- package/dist/domains/run/tools/distill-conversation-tool.js +141 -0
- package/dist/domains/run/tools/sandbox-utils.d.ts +18 -0
- package/dist/domains/run/tools/sandbox-utils.js +53 -0
- package/dist/domains/run/types/chat.d.ts +27 -0
- package/dist/domains/run/types/chat.js +1 -0
- package/dist/domains/run/types/executionContext.d.ts +40 -0
- package/dist/domains/run/types/executionContext.js +28 -0
- package/dist/domains/run/types/xml.d.ts +9 -0
- package/dist/domains/run/utils/SchemaProcessor.d.ts +52 -0
- package/dist/domains/run/utils/SchemaProcessor.js +182 -0
- package/dist/domains/run/utils/agent-operations.d.ts +62 -0
- package/dist/domains/run/utils/agent-operations.js +53 -0
- package/dist/domains/run/utils/artifact-component-schema.d.ts +42 -0
- package/dist/domains/run/utils/artifact-component-schema.js +186 -0
- package/dist/domains/run/utils/cleanup.d.ts +21 -0
- package/dist/domains/run/utils/cleanup.js +59 -0
- package/dist/domains/run/utils/data-component-schema.d.ts +2 -0
- package/dist/domains/run/utils/data-component-schema.js +3 -0
- package/dist/domains/run/utils/default-status-schemas.d.ts +20 -0
- package/dist/domains/run/utils/default-status-schemas.js +24 -0
- package/dist/domains/run/utils/json-postprocessor.d.ts +13 -0
- package/dist/domains/run/utils/json-postprocessor.js +19 -0
- package/dist/domains/run/utils/model-context-utils.d.ts +39 -0
- package/dist/domains/run/utils/model-context-utils.js +181 -0
- package/dist/domains/run/utils/model-resolver.d.ts +6 -0
- package/dist/domains/run/utils/model-resolver.js +24 -0
- package/dist/domains/run/utils/project.d.ts +207 -0
- package/dist/domains/run/utils/project.js +315 -0
- package/dist/domains/run/utils/schema-validation.d.ts +44 -0
- package/dist/domains/run/utils/schema-validation.js +97 -0
- package/dist/domains/run/utils/stream-helpers.d.ts +193 -0
- package/dist/domains/run/utils/stream-helpers.js +510 -0
- package/dist/domains/run/utils/stream-registry.d.ts +22 -0
- package/dist/domains/run/utils/stream-registry.js +33 -0
- package/dist/domains/run/utils/token-estimator.d.ts +23 -0
- package/dist/domains/run/utils/token-estimator.js +17 -0
- package/dist/domains/run/utils/tracer.d.ts +7 -0
- package/dist/domains/run/utils/tracer.js +7 -0
- package/dist/env.d.ts +89 -0
- package/dist/env.js +69 -0
- package/dist/factory.d.ts +1535 -0
- package/dist/factory.js +42 -0
- package/dist/index.d.ts +1530 -0
- package/dist/index.js +44 -0
- package/dist/initialization.d.ts +6 -0
- package/dist/initialization.js +65 -0
- package/dist/instrumentation.d.ts +17 -0
- package/dist/instrumentation.js +68 -0
- package/dist/logger.d.ts +2 -0
- package/dist/logger.js +3 -0
- package/dist/middleware/branchScopedDb.d.ts +31 -0
- package/dist/middleware/branchScopedDb.js +137 -0
- package/dist/middleware/cors.d.ts +36 -0
- package/dist/middleware/cors.js +131 -0
- package/dist/middleware/errorHandler.d.ts +12 -0
- package/dist/middleware/errorHandler.js +88 -0
- package/dist/middleware/evalsAuth.d.ts +16 -0
- package/dist/middleware/evalsAuth.js +52 -0
- package/dist/middleware/index.d.ts +8 -0
- package/dist/middleware/index.js +9 -0
- package/dist/middleware/manageAuth.d.ts +25 -0
- package/dist/middleware/manageAuth.js +80 -0
- package/dist/middleware/projectAccess.d.ts +31 -0
- package/dist/middleware/projectAccess.js +118 -0
- package/dist/middleware/projectConfig.d.ts +25 -0
- package/dist/middleware/projectConfig.js +89 -0
- package/dist/middleware/ref.d.ts +61 -0
- package/dist/middleware/ref.js +239 -0
- package/dist/middleware/requirePermission.d.ts +14 -0
- package/dist/middleware/requirePermission.js +80 -0
- package/dist/middleware/runAuth.d.ts +29 -0
- package/dist/middleware/runAuth.js +253 -0
- package/dist/middleware/sessionAuth.d.ts +17 -0
- package/dist/middleware/sessionAuth.js +58 -0
- package/dist/middleware/tenantAccess.d.ts +22 -0
- package/dist/middleware/tenantAccess.js +63 -0
- package/dist/middleware/tracing.d.ts +7 -0
- package/dist/middleware/tracing.js +50 -0
- package/dist/openapi.d.ts +7 -0
- package/dist/openapi.js +156 -0
- package/dist/ssoHelpers.d.ts +20 -0
- package/dist/ssoHelpers.js +51 -0
- package/dist/templates/v1/phase1/system-prompt.js +5 -0
- package/dist/templates/v1/phase1/thinking-preparation.js +5 -0
- package/dist/templates/v1/phase1/tool.js +5 -0
- package/dist/templates/v1/phase2/data-component.js +5 -0
- package/dist/templates/v1/phase2/data-components.js +5 -0
- package/dist/templates/v1/phase2/system-prompt.js +5 -0
- package/dist/templates/v1/shared/artifact-retrieval-guidance.js +5 -0
- package/dist/templates/v1/shared/artifact.js +5 -0
- package/dist/types/app.d.ts +64 -0
- package/dist/types/app.js +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.js +1 -0
- package/dist/types/runExecutionContext.d.ts +25 -0
- package/dist/types/runExecutionContext.js +28 -0
- package/dist/utils/oauthService.d.ts +71 -0
- package/dist/utils/oauthService.js +106 -0
- package/dist/utils/signozHelpers.d.ts +9 -0
- package/dist/utils/signozHelpers.js +33 -0
- package/dist/utils/speakeasy.d.ts +93 -0
- package/dist/utils/speakeasy.js +44 -0
- package/dist/utils/tempApiKeys.d.ts +17 -0
- package/dist/utils/tempApiKeys.js +26 -0
- package/dist/utils/workflowApiHelpers.d.ts +1 -0
- package/dist/utils/workflowApiHelpers.js +1 -0
- package/package.json +126 -0
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
import { validateAgainstJsonSchema } from "./validation.js";
|
|
2
|
+
import { CredentialStuffer, JsonTransformer, TemplateEngine, getLogger } from "@inkeep/agents-core";
|
|
3
|
+
|
|
4
|
+
//#region src/domains/run/context/ContextFetcher.ts
|
|
5
|
+
const logger = getLogger("context-fetcher");
|
|
6
|
+
var MissingRequiredVariableError = class extends Error {
|
|
7
|
+
constructor(variable) {
|
|
8
|
+
super(`Missing required variable: ${variable}`);
|
|
9
|
+
this.name = "MissingRequiredVariableError";
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* GraphQL error checker - validates response for GraphQL errors and throws if found
|
|
14
|
+
*/
|
|
15
|
+
const checkGraphQLErrors = (data) => {
|
|
16
|
+
if (data && typeof data === "object" && "errors" in data) {
|
|
17
|
+
const errorObj = data;
|
|
18
|
+
if (Array.isArray(errorObj.errors) && errorObj.errors.length > 0) {
|
|
19
|
+
const agentqlErrors = errorObj.errors;
|
|
20
|
+
const errorMessage = `GraphQL request failed with ${agentqlErrors.length} errors: ${agentqlErrors.map((e) => e.message || "Unknown error").join(", ")}`;
|
|
21
|
+
throw new Error(errorMessage);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
const responseErrorCheckers = [checkGraphQLErrors];
|
|
26
|
+
var ContextFetcher = class {
|
|
27
|
+
executionContext;
|
|
28
|
+
defaultTimeout;
|
|
29
|
+
credentialStuffer;
|
|
30
|
+
constructor(executionContext, credentialStoreRegistry, defaultTimeout = 1e4) {
|
|
31
|
+
this.executionContext = executionContext;
|
|
32
|
+
this.defaultTimeout = defaultTimeout;
|
|
33
|
+
if (credentialStoreRegistry) this.credentialStuffer = new CredentialStuffer(credentialStoreRegistry);
|
|
34
|
+
logger.info({
|
|
35
|
+
tenantId: this.executionContext.tenantId,
|
|
36
|
+
defaultTimeout: this.defaultTimeout,
|
|
37
|
+
hasCredentialSupport: !!this.credentialStuffer
|
|
38
|
+
}, "ContextFetcher initialized");
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Fetch data according to a fetch definition
|
|
42
|
+
*/
|
|
43
|
+
async fetch(definition, context) {
|
|
44
|
+
const startTime = Date.now();
|
|
45
|
+
logger.info({
|
|
46
|
+
definitionId: definition.id,
|
|
47
|
+
url: definition.fetchConfig.url
|
|
48
|
+
}, "Starting context fetch");
|
|
49
|
+
try {
|
|
50
|
+
const resolvedConfig = await this.resolveTemplateVariables(definition.fetchConfig, context, definition.credentialReferenceId);
|
|
51
|
+
const response = await this.performRequest(resolvedConfig);
|
|
52
|
+
let transformedData = response.data;
|
|
53
|
+
if (definition.fetchConfig.transform) transformedData = await this.transformResponse(response.data, definition.fetchConfig.transform);
|
|
54
|
+
if (definition.responseSchema) this.validateResponseWithJsonSchema(transformedData, definition.responseSchema, definition.id);
|
|
55
|
+
const durationMs = Date.now() - startTime;
|
|
56
|
+
logger.info({
|
|
57
|
+
definitionId: definition.id,
|
|
58
|
+
source: response.source,
|
|
59
|
+
durationMs
|
|
60
|
+
}, "Context fetch completed successfully");
|
|
61
|
+
return {
|
|
62
|
+
data: transformedData,
|
|
63
|
+
resolvedUrl: resolvedConfig.url
|
|
64
|
+
};
|
|
65
|
+
} catch (error) {
|
|
66
|
+
const durationMs = Date.now() - startTime;
|
|
67
|
+
const errorMessage = error instanceof Error ? error.message : "Unknown error";
|
|
68
|
+
if (error instanceof MissingRequiredVariableError) logger.error({
|
|
69
|
+
definitionId: definition.id,
|
|
70
|
+
error: errorMessage,
|
|
71
|
+
durationMs
|
|
72
|
+
}, "Context fetch skipped due to missing required variable");
|
|
73
|
+
logger.error({
|
|
74
|
+
definitionId: definition.id,
|
|
75
|
+
error: errorMessage,
|
|
76
|
+
durationMs
|
|
77
|
+
}, "Context fetch failed");
|
|
78
|
+
throw error;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
async getCredential(credentialReferenceId) {
|
|
82
|
+
const { project, tenantId, projectId } = this.executionContext;
|
|
83
|
+
try {
|
|
84
|
+
const credentialReference = project.credentialReferences?.[credentialReferenceId];
|
|
85
|
+
logger.info({ credentialReference }, "Credential reference");
|
|
86
|
+
if (!credentialReference || !this.credentialStuffer) throw new Error(`Credential store not found for reference ID: ${credentialReferenceId}`);
|
|
87
|
+
const credentialContext = {
|
|
88
|
+
tenantId,
|
|
89
|
+
projectId
|
|
90
|
+
};
|
|
91
|
+
const storeReference = {
|
|
92
|
+
credentialStoreId: credentialReference.credentialStoreId,
|
|
93
|
+
retrievalParams: credentialReference.retrievalParams || {}
|
|
94
|
+
};
|
|
95
|
+
return await this.credentialStuffer.getCredentials(credentialContext, storeReference);
|
|
96
|
+
} catch (error) {
|
|
97
|
+
logger.error({
|
|
98
|
+
credentialReferenceId,
|
|
99
|
+
error: error instanceof Error ? error.message : "Unknown error"
|
|
100
|
+
}, "Failed to resolve credentials for fetch request");
|
|
101
|
+
throw error;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Resolve template variables in fetch configuration and inject credential headers
|
|
106
|
+
*/
|
|
107
|
+
async resolveTemplateVariables(fetchConfig, context, credentialReferenceId) {
|
|
108
|
+
const resolved = { ...fetchConfig };
|
|
109
|
+
const filteredRequiredToFetch = fetchConfig.requiredToFetch?.filter((variable) => variable.startsWith("{{") && variable.endsWith("}}"));
|
|
110
|
+
if (filteredRequiredToFetch) for (const variable of filteredRequiredToFetch) {
|
|
111
|
+
let resolvedVariable;
|
|
112
|
+
try {
|
|
113
|
+
resolvedVariable = this.interpolateTemplate(variable, context);
|
|
114
|
+
} catch {
|
|
115
|
+
throw new MissingRequiredVariableError(variable);
|
|
116
|
+
}
|
|
117
|
+
if (resolvedVariable === "" || resolvedVariable === variable) throw new MissingRequiredVariableError(variable);
|
|
118
|
+
}
|
|
119
|
+
resolved.url = this.interpolateTemplate(fetchConfig.url, context);
|
|
120
|
+
logger.info({ resolvedUrl: resolved.url }, "Resolved URL");
|
|
121
|
+
if (fetchConfig.headers) {
|
|
122
|
+
resolved.headers = {};
|
|
123
|
+
for (const [key, value] of Object.entries(fetchConfig.headers)) resolved.headers[key] = this.interpolateTemplate(value, context);
|
|
124
|
+
}
|
|
125
|
+
if (fetchConfig.body) resolved.body = this.interpolateObjectTemplates(fetchConfig.body, context);
|
|
126
|
+
if (credentialReferenceId && this.credentialStuffer) try {
|
|
127
|
+
const credentialHeaders = (await this.getCredential(credentialReferenceId))?.headers;
|
|
128
|
+
if (credentialHeaders) {
|
|
129
|
+
resolved.headers = {
|
|
130
|
+
...resolved.headers,
|
|
131
|
+
...credentialHeaders
|
|
132
|
+
};
|
|
133
|
+
logger.info({ credentialReferenceId }, "Added credential headers to fetch request");
|
|
134
|
+
}
|
|
135
|
+
} catch (error) {
|
|
136
|
+
logger.error({
|
|
137
|
+
credentialReferenceId,
|
|
138
|
+
error: error instanceof Error ? error.message : "Unknown error"
|
|
139
|
+
}, "Failed to resolve credentials for fetch request");
|
|
140
|
+
throw error;
|
|
141
|
+
}
|
|
142
|
+
return resolved;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Interpolate template variables in a string using TemplateEngine
|
|
146
|
+
*/
|
|
147
|
+
interpolateTemplate(template, context) {
|
|
148
|
+
try {
|
|
149
|
+
return TemplateEngine.render(template, context, {
|
|
150
|
+
strict: false,
|
|
151
|
+
preserveUnresolved: true
|
|
152
|
+
});
|
|
153
|
+
} catch (error) {
|
|
154
|
+
logger.error({
|
|
155
|
+
template,
|
|
156
|
+
error: error instanceof Error ? error.message : "Unknown error"
|
|
157
|
+
}, "Failed to interpolate template variable");
|
|
158
|
+
return template;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Interpolate template variables in an object recursively using TemplateEngine
|
|
163
|
+
*/
|
|
164
|
+
interpolateObjectTemplates(obj, context) {
|
|
165
|
+
const result = {};
|
|
166
|
+
for (const [key, value] of Object.entries(obj)) if (typeof value === "string") result[key] = this.interpolateTemplate(value, context);
|
|
167
|
+
else if (value && typeof value === "object" && !Array.isArray(value)) result[key] = this.interpolateObjectTemplates(value, context);
|
|
168
|
+
else result[key] = value;
|
|
169
|
+
return result;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Perform HTTP request
|
|
173
|
+
*/
|
|
174
|
+
async performRequest(config) {
|
|
175
|
+
const startTime = Date.now();
|
|
176
|
+
try {
|
|
177
|
+
logger.debug({
|
|
178
|
+
url: config.url,
|
|
179
|
+
method: config.method
|
|
180
|
+
}, "Performing HTTP request");
|
|
181
|
+
const response = await fetch(config.url, {
|
|
182
|
+
method: config.method,
|
|
183
|
+
headers: config.headers,
|
|
184
|
+
body: config.body ? JSON.stringify(config.body) : void 0,
|
|
185
|
+
signal: AbortSignal.timeout(config.timeout || this.defaultTimeout)
|
|
186
|
+
});
|
|
187
|
+
if (!response.ok) {
|
|
188
|
+
const errorText = await response.text();
|
|
189
|
+
throw /* @__PURE__ */ new Error(`HTTP ${response.status}: ${response.statusText} - ${errorText}`);
|
|
190
|
+
}
|
|
191
|
+
const contentType = response.headers.get("content-type") || "";
|
|
192
|
+
let data;
|
|
193
|
+
if (contentType.includes("application/json")) data = await response.json();
|
|
194
|
+
else data = await response.text();
|
|
195
|
+
const durationMs = Date.now() - startTime;
|
|
196
|
+
for (const checker of responseErrorCheckers) checker(data);
|
|
197
|
+
return {
|
|
198
|
+
data,
|
|
199
|
+
source: config.url,
|
|
200
|
+
durationMs
|
|
201
|
+
};
|
|
202
|
+
} catch (error) {
|
|
203
|
+
const durationMs = Date.now() - startTime;
|
|
204
|
+
const requestError = error instanceof Error ? error : /* @__PURE__ */ new Error("Unknown error");
|
|
205
|
+
logger.warn({
|
|
206
|
+
url: config.url,
|
|
207
|
+
error: requestError.message,
|
|
208
|
+
durationMs
|
|
209
|
+
}, "HTTP request failed");
|
|
210
|
+
throw requestError;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Transform response data using JsonTransformer (JMESPath)
|
|
215
|
+
*/
|
|
216
|
+
async transformResponse(data, transform) {
|
|
217
|
+
try {
|
|
218
|
+
return await JsonTransformer.transform(data, transform);
|
|
219
|
+
} catch (error) {
|
|
220
|
+
logger.error({
|
|
221
|
+
transform,
|
|
222
|
+
error: error instanceof Error ? error.message : "Unknown error"
|
|
223
|
+
}, "Failed to transform response data");
|
|
224
|
+
return data;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Validate response against JSON Schema
|
|
229
|
+
*/
|
|
230
|
+
validateResponseWithJsonSchema(data, jsonSchema, definitionId) {
|
|
231
|
+
try {
|
|
232
|
+
if (!validateAgainstJsonSchema(jsonSchema, data)) throw new Error("Data does not match JSON Schema");
|
|
233
|
+
} catch (error) {
|
|
234
|
+
const errorMessage = error instanceof Error ? error.message : "Unknown validation error";
|
|
235
|
+
logger.error({
|
|
236
|
+
definitionId,
|
|
237
|
+
jsonSchema,
|
|
238
|
+
error: errorMessage
|
|
239
|
+
}, "JSON Schema response validation failed");
|
|
240
|
+
throw new Error(`Response validation failed: ${errorMessage}`);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Test a fetch definition without caching
|
|
245
|
+
*/
|
|
246
|
+
async test(definition, context) {
|
|
247
|
+
const startTime = Date.now();
|
|
248
|
+
try {
|
|
249
|
+
const result = await this.fetch(definition, context);
|
|
250
|
+
return {
|
|
251
|
+
success: true,
|
|
252
|
+
data: result.data,
|
|
253
|
+
resolvedUrl: result.resolvedUrl,
|
|
254
|
+
durationMs: Date.now() - startTime
|
|
255
|
+
};
|
|
256
|
+
} catch (error) {
|
|
257
|
+
return {
|
|
258
|
+
success: false,
|
|
259
|
+
error: error instanceof Error ? error.message : "Unknown error",
|
|
260
|
+
durationMs: Date.now() - startTime
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Get fetcher statistics
|
|
266
|
+
*/
|
|
267
|
+
getStats() {
|
|
268
|
+
return {
|
|
269
|
+
tenantId: this.executionContext.tenantId,
|
|
270
|
+
defaultTimeout: this.defaultTimeout
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
};
|
|
274
|
+
|
|
275
|
+
//#endregion
|
|
276
|
+
export { ContextFetcher, MissingRequiredVariableError };
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { ContextConfigApiSelect, CredentialStoreRegistry, FullExecutionContext } from "@inkeep/agents-core";
|
|
2
|
+
|
|
3
|
+
//#region src/domains/run/context/ContextResolver.d.ts
|
|
4
|
+
interface ResolvedContext {
|
|
5
|
+
[templateKey: string]: unknown;
|
|
6
|
+
}
|
|
7
|
+
interface ContextResolutionOptions {
|
|
8
|
+
triggerEvent: 'initialization' | 'invocation';
|
|
9
|
+
conversationId: string;
|
|
10
|
+
headers?: Record<string, unknown>;
|
|
11
|
+
tenantId: string;
|
|
12
|
+
}
|
|
13
|
+
interface ContextResolutionResult {
|
|
14
|
+
resolvedContext: ResolvedContext;
|
|
15
|
+
headers: Record<string, unknown>;
|
|
16
|
+
fetchedDefinitions: string[];
|
|
17
|
+
cacheHits: string[];
|
|
18
|
+
cacheMisses: string[];
|
|
19
|
+
errors: Array<{
|
|
20
|
+
definitionId: string;
|
|
21
|
+
error: string;
|
|
22
|
+
}>;
|
|
23
|
+
skipped: Array<{
|
|
24
|
+
definitionId: string;
|
|
25
|
+
reason: string;
|
|
26
|
+
}>;
|
|
27
|
+
totalDurationMs: number;
|
|
28
|
+
}
|
|
29
|
+
declare class ContextResolver {
|
|
30
|
+
private fetcher;
|
|
31
|
+
private cache;
|
|
32
|
+
private executionContext;
|
|
33
|
+
constructor(executionContext: FullExecutionContext, credentialStoreRegistry?: CredentialStoreRegistry);
|
|
34
|
+
/**
|
|
35
|
+
* Resolve all contexts for a given configuration and trigger event
|
|
36
|
+
*/
|
|
37
|
+
resolve(contextConfig: ContextConfigApiSelect, options: ContextResolutionOptions): Promise<ContextResolutionResult>;
|
|
38
|
+
/**
|
|
39
|
+
* Resolve a single context variable
|
|
40
|
+
*/
|
|
41
|
+
private resolveSingleFetchDefinition;
|
|
42
|
+
/**
|
|
43
|
+
* Resolve the headers for a given conversation
|
|
44
|
+
*/
|
|
45
|
+
resolveHeaders(conversationId: string, contextConfigId: string): Promise<Record<string, unknown>>;
|
|
46
|
+
/**
|
|
47
|
+
* Create a hash of the headers for cache invalidation
|
|
48
|
+
*/
|
|
49
|
+
private createRequestHash;
|
|
50
|
+
/**
|
|
51
|
+
* Clear cache
|
|
52
|
+
*/
|
|
53
|
+
clearCache(tenantId: string, projectId: string, conversationId: string): Promise<void>;
|
|
54
|
+
}
|
|
55
|
+
//#endregion
|
|
56
|
+
export { ContextResolutionOptions, ContextResolutionResult, ContextResolver, ResolvedContext };
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
import { ContextCache } from "./contextCache.js";
|
|
2
|
+
import { ContextFetcher, MissingRequiredVariableError } from "./ContextFetcher.js";
|
|
3
|
+
import { getLogger, getTracer, setSpanWithError } from "@inkeep/agents-core";
|
|
4
|
+
import { SpanStatusCode } from "@opentelemetry/api";
|
|
5
|
+
import crypto from "node:crypto";
|
|
6
|
+
|
|
7
|
+
//#region src/domains/run/context/ContextResolver.ts
|
|
8
|
+
const logger = getLogger("context-resolver");
|
|
9
|
+
const tracer = getTracer("context-resolver");
|
|
10
|
+
var ContextResolver = class {
|
|
11
|
+
fetcher;
|
|
12
|
+
cache;
|
|
13
|
+
executionContext;
|
|
14
|
+
constructor(executionContext, credentialStoreRegistry) {
|
|
15
|
+
this.executionContext = executionContext;
|
|
16
|
+
this.fetcher = new ContextFetcher(executionContext, credentialStoreRegistry);
|
|
17
|
+
this.cache = new ContextCache(executionContext);
|
|
18
|
+
logger.info({
|
|
19
|
+
tenantId: this.executionContext.tenantId,
|
|
20
|
+
hasCredentialSupport: !!credentialStoreRegistry
|
|
21
|
+
}, "ContextResolver initialized");
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Resolve all contexts for a given configuration and trigger event
|
|
25
|
+
*/
|
|
26
|
+
async resolve(contextConfig, options) {
|
|
27
|
+
const startTime = Date.now();
|
|
28
|
+
logger.info({
|
|
29
|
+
contextConfigId: contextConfig.id,
|
|
30
|
+
triggerEvent: options.triggerEvent,
|
|
31
|
+
conversationId: options.conversationId
|
|
32
|
+
}, "Starting context resolution");
|
|
33
|
+
return tracer.startActiveSpan("context.resolve", { attributes: {
|
|
34
|
+
"context.config_id": contextConfig.id,
|
|
35
|
+
"context.trigger_event": options.triggerEvent
|
|
36
|
+
} }, async (parentSpan) => {
|
|
37
|
+
try {
|
|
38
|
+
const result = {
|
|
39
|
+
resolvedContext: {},
|
|
40
|
+
headers: options.headers || {},
|
|
41
|
+
fetchedDefinitions: [],
|
|
42
|
+
cacheHits: [],
|
|
43
|
+
cacheMisses: [],
|
|
44
|
+
errors: [],
|
|
45
|
+
skipped: [],
|
|
46
|
+
totalDurationMs: 0
|
|
47
|
+
};
|
|
48
|
+
result.resolvedContext.headers = result.headers;
|
|
49
|
+
const currentHeaders = await this.cache.get({
|
|
50
|
+
conversationId: options.conversationId,
|
|
51
|
+
contextConfigId: contextConfig.id,
|
|
52
|
+
contextVariableKey: "headers"
|
|
53
|
+
});
|
|
54
|
+
if (options.headers && Object.keys(options.headers).length > 0) {
|
|
55
|
+
await this.cache.invalidateHeaders(this.executionContext.tenantId, this.executionContext.projectId, options.conversationId, contextConfig.id);
|
|
56
|
+
logger.info({
|
|
57
|
+
conversationId: options.conversationId,
|
|
58
|
+
contextConfigId: contextConfig.id
|
|
59
|
+
}, "Invalidated headers in cache");
|
|
60
|
+
await this.cache.set({
|
|
61
|
+
contextConfigId: contextConfig.id,
|
|
62
|
+
contextVariableKey: "headers",
|
|
63
|
+
conversationId: options.conversationId,
|
|
64
|
+
value: options.headers,
|
|
65
|
+
tenantId: this.executionContext.tenantId
|
|
66
|
+
});
|
|
67
|
+
logger.info({
|
|
68
|
+
conversationId: options.conversationId,
|
|
69
|
+
contextConfigId: contextConfig.id
|
|
70
|
+
}, "Headers set in cache");
|
|
71
|
+
} else if (currentHeaders) result.headers = currentHeaders.value;
|
|
72
|
+
else result.headers = {};
|
|
73
|
+
result.resolvedContext.headers = result.headers;
|
|
74
|
+
const contextVariables = contextConfig.contextVariables || {};
|
|
75
|
+
const contextVariableEntries = Object.entries(contextVariables);
|
|
76
|
+
if (contextVariableEntries.length === 0) {
|
|
77
|
+
logger.info({ contextConfigId: contextConfig.id }, "No context variables in context config");
|
|
78
|
+
result.totalDurationMs = Date.now() - startTime;
|
|
79
|
+
parentSpan.setStatus({ code: SpanStatusCode.OK });
|
|
80
|
+
return result;
|
|
81
|
+
}
|
|
82
|
+
contextVariableEntries.filter(([, def]) => def.trigger === "initialization");
|
|
83
|
+
const invocationDefs = contextVariableEntries.filter(([, def]) => def.trigger === "invocation");
|
|
84
|
+
if (options.triggerEvent === "invocation" && invocationDefs.length > 0) await this.cache.invalidateInvocationDefinitions(this.executionContext.tenantId, this.executionContext.projectId, options.conversationId, contextConfig.id, invocationDefs.map(([, def]) => def.id));
|
|
85
|
+
const requestHash = this.createRequestHash(result.headers);
|
|
86
|
+
const fetchPromises = contextVariableEntries.map(([templateKey, definition]) => this.resolveSingleFetchDefinition(contextConfig, definition, templateKey, options, requestHash, result).catch((error) => {
|
|
87
|
+
const errorMessage = error instanceof Error ? error.message : "Unknown error";
|
|
88
|
+
if (error instanceof MissingRequiredVariableError) {
|
|
89
|
+
logger.info({
|
|
90
|
+
contextConfigId: contextConfig.id,
|
|
91
|
+
definitionId: definition.id,
|
|
92
|
+
templateKey,
|
|
93
|
+
reason: errorMessage
|
|
94
|
+
}, "Context fetch skipped due to missing required variable");
|
|
95
|
+
result.skipped.push({
|
|
96
|
+
definitionId: definition.id,
|
|
97
|
+
reason: errorMessage
|
|
98
|
+
});
|
|
99
|
+
if (definition.defaultValue !== void 0) {
|
|
100
|
+
result.resolvedContext[templateKey] = definition.defaultValue;
|
|
101
|
+
logger.info({
|
|
102
|
+
contextConfigId: contextConfig.id,
|
|
103
|
+
definitionId: definition.id,
|
|
104
|
+
templateKey
|
|
105
|
+
}, "Using default value for skipped context variable");
|
|
106
|
+
}
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
logger.error({
|
|
110
|
+
contextConfigId: contextConfig.id,
|
|
111
|
+
definitionId: definition.id,
|
|
112
|
+
templateKey,
|
|
113
|
+
error: errorMessage
|
|
114
|
+
}, "Failed to resolve context variable");
|
|
115
|
+
result.errors.push({
|
|
116
|
+
definitionId: definition.id,
|
|
117
|
+
error: errorMessage
|
|
118
|
+
});
|
|
119
|
+
if (definition.defaultValue !== void 0) {
|
|
120
|
+
result.resolvedContext[templateKey] = definition.defaultValue;
|
|
121
|
+
logger.info({
|
|
122
|
+
contextConfigId: contextConfig.id,
|
|
123
|
+
definitionId: definition.id,
|
|
124
|
+
templateKey
|
|
125
|
+
}, "Using default value for failed context variable");
|
|
126
|
+
}
|
|
127
|
+
}));
|
|
128
|
+
await Promise.all(fetchPromises);
|
|
129
|
+
result.totalDurationMs = Date.now() - startTime;
|
|
130
|
+
parentSpan.addEvent("context.resolution.completed", {
|
|
131
|
+
resolved_keys: Object.keys(result.resolvedContext),
|
|
132
|
+
fetched_definitions: result.fetchedDefinitions,
|
|
133
|
+
skipped_definitions: result.skipped.map((s) => s.definitionId)
|
|
134
|
+
});
|
|
135
|
+
if (result.errors.length > 0) parentSpan.setStatus({
|
|
136
|
+
code: SpanStatusCode.ERROR,
|
|
137
|
+
message: `Context resolution completed with errors`
|
|
138
|
+
});
|
|
139
|
+
else parentSpan.setStatus({ code: SpanStatusCode.OK });
|
|
140
|
+
logger.info({
|
|
141
|
+
contextConfigId: contextConfig.id,
|
|
142
|
+
resolvedKeys: Object.keys(result.resolvedContext),
|
|
143
|
+
fetchedDefinitions: result.fetchedDefinitions.length,
|
|
144
|
+
cacheHits: result.cacheHits.length,
|
|
145
|
+
cacheMisses: result.cacheMisses.length,
|
|
146
|
+
errors: result.errors.length,
|
|
147
|
+
skipped: result.skipped.length,
|
|
148
|
+
totalDurationMs: result.totalDurationMs
|
|
149
|
+
}, "Context resolution completed");
|
|
150
|
+
return result;
|
|
151
|
+
} catch (error) {
|
|
152
|
+
const durationMs = Date.now() - startTime;
|
|
153
|
+
setSpanWithError(parentSpan, error instanceof Error ? error : new Error(String(error)));
|
|
154
|
+
logger.error({
|
|
155
|
+
contextConfigId: contextConfig.id,
|
|
156
|
+
error: error instanceof Error ? error.message : String(error),
|
|
157
|
+
durationMs
|
|
158
|
+
}, "Context resolution failed");
|
|
159
|
+
throw error;
|
|
160
|
+
} finally {
|
|
161
|
+
parentSpan.end();
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Resolve a single context variable
|
|
167
|
+
*/
|
|
168
|
+
async resolveSingleFetchDefinition(contextConfig, definition, templateKey, options, requestHash, result) {
|
|
169
|
+
const cachedEntry = await this.cache.get({
|
|
170
|
+
conversationId: options.conversationId,
|
|
171
|
+
contextConfigId: contextConfig.id,
|
|
172
|
+
contextVariableKey: templateKey,
|
|
173
|
+
requestHash
|
|
174
|
+
});
|
|
175
|
+
if (cachedEntry) {
|
|
176
|
+
result.resolvedContext[templateKey] = cachedEntry.value;
|
|
177
|
+
result.cacheHits.push(definition.id);
|
|
178
|
+
logger.debug({
|
|
179
|
+
definitionId: definition.id,
|
|
180
|
+
templateKey,
|
|
181
|
+
conversationId: options.conversationId
|
|
182
|
+
}, "Cache hit for context variable");
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
result.cacheMisses.push(definition.id);
|
|
186
|
+
logger.debug({
|
|
187
|
+
definitionId: definition.id,
|
|
188
|
+
templateKey,
|
|
189
|
+
conversationId: options.conversationId
|
|
190
|
+
}, "Cache miss for context variable, fetching data");
|
|
191
|
+
const definitionWithConversationId = {
|
|
192
|
+
...definition,
|
|
193
|
+
fetchConfig: {
|
|
194
|
+
...definition.fetchConfig,
|
|
195
|
+
conversationId: options.conversationId
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
const fetchedData = await tracer.startActiveSpan("context-resolver.resolve_single_fetch_definition", { attributes: {
|
|
199
|
+
"context.definition_id": definition.id,
|
|
200
|
+
"context.template_key": templateKey,
|
|
201
|
+
"context.url_template": definition.fetchConfig.url,
|
|
202
|
+
"context.method": definition.fetchConfig.method,
|
|
203
|
+
"context.trigger": definition.trigger
|
|
204
|
+
} }, async (parentSpan) => {
|
|
205
|
+
try {
|
|
206
|
+
const { data, resolvedUrl } = await this.fetcher.fetch(definitionWithConversationId, result.resolvedContext);
|
|
207
|
+
parentSpan.setStatus({ code: SpanStatusCode.OK });
|
|
208
|
+
parentSpan.addEvent("context.fetch_success", {
|
|
209
|
+
definition_id: definition.id,
|
|
210
|
+
template_key: templateKey,
|
|
211
|
+
source: resolvedUrl
|
|
212
|
+
});
|
|
213
|
+
return data;
|
|
214
|
+
} catch (error) {
|
|
215
|
+
if (error instanceof MissingRequiredVariableError) {
|
|
216
|
+
parentSpan.setStatus({ code: SpanStatusCode.OK });
|
|
217
|
+
parentSpan.addEvent("context.fetch_skipped", {
|
|
218
|
+
definition_id: definition.id,
|
|
219
|
+
template_key: templateKey,
|
|
220
|
+
reason: error.message
|
|
221
|
+
});
|
|
222
|
+
} else setSpanWithError(parentSpan, error instanceof Error ? error : new Error(String(error)));
|
|
223
|
+
throw error;
|
|
224
|
+
} finally {
|
|
225
|
+
parentSpan.end();
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
result.resolvedContext[templateKey] = fetchedData;
|
|
229
|
+
result.fetchedDefinitions.push(definition.id);
|
|
230
|
+
await this.cache.set({
|
|
231
|
+
contextConfigId: contextConfig.id,
|
|
232
|
+
contextVariableKey: templateKey,
|
|
233
|
+
conversationId: options.conversationId,
|
|
234
|
+
value: fetchedData,
|
|
235
|
+
requestHash,
|
|
236
|
+
tenantId: this.executionContext.tenantId
|
|
237
|
+
});
|
|
238
|
+
logger.debug({
|
|
239
|
+
definitionId: definition.id,
|
|
240
|
+
templateKey,
|
|
241
|
+
conversationId: options.conversationId
|
|
242
|
+
}, "Context variable resolved and cached");
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Resolve the headers for a given conversation
|
|
246
|
+
*/
|
|
247
|
+
async resolveHeaders(conversationId, contextConfigId) {
|
|
248
|
+
const cachedEntry = await this.cache.get({
|
|
249
|
+
conversationId,
|
|
250
|
+
contextConfigId,
|
|
251
|
+
contextVariableKey: "headers"
|
|
252
|
+
});
|
|
253
|
+
if (cachedEntry) return cachedEntry.value;
|
|
254
|
+
return {};
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Create a hash of the headers for cache invalidation
|
|
258
|
+
*/
|
|
259
|
+
createRequestHash(headers$1) {
|
|
260
|
+
const contextString = JSON.stringify(headers$1, Object.keys(headers$1).sort());
|
|
261
|
+
return crypto.createHash("sha256").update(contextString).digest("hex").substring(0, 16);
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Clear cache
|
|
265
|
+
*/
|
|
266
|
+
async clearCache(tenantId, projectId, conversationId) {
|
|
267
|
+
await this.cache.clearConversation(tenantId, projectId, conversationId);
|
|
268
|
+
logger.info({ conversationId }, "Context cache cleared for conversation");
|
|
269
|
+
}
|
|
270
|
+
};
|
|
271
|
+
|
|
272
|
+
//#endregion
|
|
273
|
+
export { ContextResolver };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ResolvedContext } from "./ContextResolver.js";
|
|
2
|
+
import { CredentialStoreRegistry, FullExecutionContext } from "@inkeep/agents-core";
|
|
3
|
+
|
|
4
|
+
//#region src/domains/run/context/context.d.ts
|
|
5
|
+
declare function determineContextTrigger(tenantId: string, projectId: string, conversationId: string): Promise<'initialization' | 'invocation'>;
|
|
6
|
+
declare function handleContextConfigChange(executionContext: FullExecutionContext, conversationId: string, newContextConfigId: string, credentialStores?: CredentialStoreRegistry): Promise<void>;
|
|
7
|
+
declare function handleContextResolution({
|
|
8
|
+
executionContext,
|
|
9
|
+
conversationId,
|
|
10
|
+
headers,
|
|
11
|
+
credentialStores
|
|
12
|
+
}: {
|
|
13
|
+
executionContext: FullExecutionContext;
|
|
14
|
+
conversationId: string;
|
|
15
|
+
headers: Record<string, unknown>;
|
|
16
|
+
credentialStores?: CredentialStoreRegistry;
|
|
17
|
+
}): Promise<ResolvedContext | null>;
|
|
18
|
+
//#endregion
|
|
19
|
+
export { determineContextTrigger, handleContextConfigChange, handleContextResolution };
|