@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,239 @@
|
|
|
1
|
+
import manageDbClient_default from "../data/db/manageDbClient.js";
|
|
2
|
+
import "../data/db/index.js";
|
|
3
|
+
import { createApiError, ensureBranchExists, getLogger, getProjectScopedRef, getTenantScopedRef, isRefWritable, resolveRef } from "@inkeep/agents-core";
|
|
4
|
+
|
|
5
|
+
//#region src/middleware/ref.ts
|
|
6
|
+
const logger = getLogger("ref-middleware");
|
|
7
|
+
/**
|
|
8
|
+
* Default tenant ID extractor - extracts from /tenants/{tenantId} path pattern
|
|
9
|
+
*/
|
|
10
|
+
const defaultExtractTenantId = (c) => {
|
|
11
|
+
return c.req.path.match(/^\/(?:manage|run)\/tenants\/([^/]+)/)?.[1];
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Default project ID extractor - extracts from /tenants/{tenantId}/projects/{projectId} or
|
|
15
|
+
* /tenants/{tenantId}/project-full/{projectId} path patterns
|
|
16
|
+
*/
|
|
17
|
+
const defaultExtractProjectId = (c) => {
|
|
18
|
+
return c.req.path.match(/^\/(?:manage|run)\/tenants\/[^/]+\/(?:projects|project-full)(?:\/([^/]+))?/)?.[1];
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Extract tenantId from the executionContext set by apiKeyAuth middleware.
|
|
22
|
+
*/
|
|
23
|
+
const extractTenantIdFromExecutionContext = (c) => {
|
|
24
|
+
const executionContext = c.get("executionContext");
|
|
25
|
+
let tenantId;
|
|
26
|
+
if (executionContext) tenantId = executionContext.tenantId;
|
|
27
|
+
else tenantId = defaultExtractTenantId(c);
|
|
28
|
+
return tenantId;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Extract projectId from the executionContext set by apiKeyAuth middleware.
|
|
32
|
+
*/
|
|
33
|
+
const extractProjectIdFromExecutionContext = (c) => {
|
|
34
|
+
const executionContext = c.get("executionContext");
|
|
35
|
+
let projectId;
|
|
36
|
+
if (executionContext) projectId = executionContext.projectId;
|
|
37
|
+
else projectId = defaultExtractProjectId(c);
|
|
38
|
+
return projectId;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Creates a ref resolution middleware factory.
|
|
42
|
+
*
|
|
43
|
+
* This middleware:
|
|
44
|
+
* 1. Extracts tenantId and projectId from the request
|
|
45
|
+
* 2. Resolves the `ref` query parameter to a ResolvedRef
|
|
46
|
+
* 3. Creates branches if needed (tenant_main, project_main)
|
|
47
|
+
* 4. Sets `resolvedRef` in the Hono context for downstream handlers
|
|
48
|
+
*
|
|
49
|
+
* @param db - The Doltgres database client to use for ref resolution
|
|
50
|
+
* @param options - Optional configuration for extraction and validation
|
|
51
|
+
* @returns Hono middleware function
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```typescript
|
|
55
|
+
* import { createRefMiddleware } from '@inkeep/agents-core';
|
|
56
|
+
* import { manageDbClient } from './db';
|
|
57
|
+
*
|
|
58
|
+
* const refMiddleware = createRefMiddleware(manageDbClient);
|
|
59
|
+
* app.use('/tenants/*', refMiddleware);
|
|
60
|
+
* ```
|
|
61
|
+
*/
|
|
62
|
+
const createRefMiddleware = (db, options = {}) => {
|
|
63
|
+
const { extractTenantId = defaultExtractTenantId, extractProjectId = defaultExtractProjectId, allowProjectIdFromBody = true } = options;
|
|
64
|
+
return async (c, next) => {
|
|
65
|
+
const ref = c.req.query("ref");
|
|
66
|
+
const pathSplit = c.req.path.split("/");
|
|
67
|
+
const tenantId = extractTenantId(c);
|
|
68
|
+
let projectId = extractProjectId(c);
|
|
69
|
+
if (!projectId && allowProjectIdFromBody && [
|
|
70
|
+
"POST",
|
|
71
|
+
"PUT",
|
|
72
|
+
"PATCH"
|
|
73
|
+
].includes(c.req.method)) try {
|
|
74
|
+
const body = await c.req.json();
|
|
75
|
+
if (body && typeof body.projectId === "string") {
|
|
76
|
+
projectId = body.projectId;
|
|
77
|
+
logger.debug({ projectId }, "Extracted projectId from request body");
|
|
78
|
+
}
|
|
79
|
+
} catch {
|
|
80
|
+
logger.debug({}, "Could not extract projectId from body");
|
|
81
|
+
}
|
|
82
|
+
if (!tenantId) throw createApiError({
|
|
83
|
+
code: "bad_request",
|
|
84
|
+
message: "Missing tenantId"
|
|
85
|
+
});
|
|
86
|
+
if (process.env.ENVIRONMENT === "test") {
|
|
87
|
+
const defaultRef = {
|
|
88
|
+
type: "branch",
|
|
89
|
+
name: projectId ? getProjectScopedRef(tenantId, projectId, "main") : getTenantScopedRef(tenantId, "main"),
|
|
90
|
+
hash: "test-hash"
|
|
91
|
+
};
|
|
92
|
+
c.set("resolvedRef", defaultRef);
|
|
93
|
+
await next();
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
if (pathSplit.length < 4 && ref !== "main" && ref !== void 0) throw createApiError({
|
|
97
|
+
code: "bad_request",
|
|
98
|
+
message: "Ref is not supported for this path"
|
|
99
|
+
});
|
|
100
|
+
let resolvedRef;
|
|
101
|
+
if (projectId) resolvedRef = await resolveProjectRef(db, c, tenantId, projectId, ref);
|
|
102
|
+
else resolvedRef = await resolveTenantRef(db, tenantId, ref);
|
|
103
|
+
if (c.req.path.includes("/signoz/")) logger.debug({
|
|
104
|
+
resolvedRef,
|
|
105
|
+
projectId,
|
|
106
|
+
tenantId
|
|
107
|
+
}, "Resolved ref");
|
|
108
|
+
else logger.info({
|
|
109
|
+
resolvedRef,
|
|
110
|
+
projectId,
|
|
111
|
+
tenantId
|
|
112
|
+
}, "Resolved ref");
|
|
113
|
+
c.set("resolvedRef", resolvedRef);
|
|
114
|
+
await next();
|
|
115
|
+
};
|
|
116
|
+
};
|
|
117
|
+
/**
|
|
118
|
+
* Resolve ref for project-scoped requests
|
|
119
|
+
*/
|
|
120
|
+
async function resolveProjectRef(db, c, tenantId, projectId, ref) {
|
|
121
|
+
const projectMain = getProjectScopedRef(tenantId, projectId, "main");
|
|
122
|
+
const projectScopedRef = ref ? getProjectScopedRef(tenantId, projectId, ref) : projectMain;
|
|
123
|
+
if (ref && ref !== "main") {
|
|
124
|
+
let refResult$1 = await resolveRef(db)(projectScopedRef);
|
|
125
|
+
if (!refResult$1) refResult$1 = await resolveRef(db)(ref);
|
|
126
|
+
if (!refResult$1) throw createApiError({
|
|
127
|
+
code: "not_found",
|
|
128
|
+
message: `Unknown ref: ${ref}`
|
|
129
|
+
});
|
|
130
|
+
return refResult$1;
|
|
131
|
+
}
|
|
132
|
+
let refResult = null;
|
|
133
|
+
try {
|
|
134
|
+
refResult = await resolveRef(db)(projectMain);
|
|
135
|
+
} catch (error) {
|
|
136
|
+
logger.warn({
|
|
137
|
+
error,
|
|
138
|
+
projectMain
|
|
139
|
+
}, "Failed to resolve project main branch");
|
|
140
|
+
refResult = null;
|
|
141
|
+
}
|
|
142
|
+
if (!refResult) {
|
|
143
|
+
if (c.req.method === "PUT") {
|
|
144
|
+
const tenantMain = `${tenantId}_main`;
|
|
145
|
+
let tenantRefResult = await resolveRef(db)(tenantMain);
|
|
146
|
+
if (!tenantRefResult) {
|
|
147
|
+
await ensureBranchExists(db, tenantMain);
|
|
148
|
+
tenantRefResult = await resolveRef(db)(tenantMain);
|
|
149
|
+
}
|
|
150
|
+
if (tenantRefResult) return tenantRefResult;
|
|
151
|
+
throw createApiError({
|
|
152
|
+
code: "internal_server_error",
|
|
153
|
+
message: `Failed to create tenant main branch for upsert`
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
throw createApiError({
|
|
157
|
+
code: "not_found",
|
|
158
|
+
message: `Project not found: ${projectId}`
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
return refResult;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Resolve ref for tenant-level requests
|
|
165
|
+
*/
|
|
166
|
+
async function resolveTenantRef(db, tenantId, ref) {
|
|
167
|
+
const tenantMain = `${tenantId}_main`;
|
|
168
|
+
if (ref && ref !== "main") {
|
|
169
|
+
const tenantScopedRef = `${tenantId}_${ref}`;
|
|
170
|
+
let refResult$1 = await resolveRef(db)(tenantScopedRef);
|
|
171
|
+
if (!refResult$1) refResult$1 = await resolveRef(db)(ref);
|
|
172
|
+
if (!refResult$1) throw createApiError({
|
|
173
|
+
code: "not_found",
|
|
174
|
+
message: `Unknown ref: ${ref}`
|
|
175
|
+
});
|
|
176
|
+
return refResult$1;
|
|
177
|
+
}
|
|
178
|
+
let refResult = await resolveRef(db)(tenantMain);
|
|
179
|
+
if (!refResult) {
|
|
180
|
+
await ensureBranchExists(db, tenantMain);
|
|
181
|
+
refResult = await resolveRef(db)(tenantMain);
|
|
182
|
+
if (!refResult) throw createApiError({
|
|
183
|
+
code: "internal_server_error",
|
|
184
|
+
message: `Failed to create tenant main branch: ${tenantMain}`
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
return refResult;
|
|
188
|
+
}
|
|
189
|
+
const writeProtectionMiddleware = async (c, next) => {
|
|
190
|
+
if (process.env.ENVIRONMENT === "test") {
|
|
191
|
+
await next();
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
const resolvedRef = c.get("resolvedRef");
|
|
195
|
+
if (!resolvedRef) {
|
|
196
|
+
await next();
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
const method = c.req.method;
|
|
200
|
+
if ([
|
|
201
|
+
"POST",
|
|
202
|
+
"PUT",
|
|
203
|
+
"PATCH",
|
|
204
|
+
"DELETE"
|
|
205
|
+
].includes(method) && !isRefWritable(resolvedRef)) throw createApiError({
|
|
206
|
+
code: "bad_request",
|
|
207
|
+
message: `Cannot perform write operation on ${resolvedRef.type}. Tags and commits are immutable. Write to a branch instead.`
|
|
208
|
+
});
|
|
209
|
+
await next();
|
|
210
|
+
};
|
|
211
|
+
const manageRefMiddleware = createRefMiddleware(manageDbClient_default);
|
|
212
|
+
const runRefMiddleware = createRefMiddleware(manageDbClient_default, {
|
|
213
|
+
extractTenantId: extractTenantIdFromExecutionContext,
|
|
214
|
+
extractProjectId: extractProjectIdFromExecutionContext,
|
|
215
|
+
allowProjectIdFromBody: false
|
|
216
|
+
});
|
|
217
|
+
/**
|
|
218
|
+
* Extract tenantId from query parameters (for OAuth routes)
|
|
219
|
+
*/
|
|
220
|
+
const extractTenantIdFromQuery = (c) => {
|
|
221
|
+
return c.req.query("tenantId");
|
|
222
|
+
};
|
|
223
|
+
/**
|
|
224
|
+
* Extract projectId from query parameters (for OAuth routes)
|
|
225
|
+
*/
|
|
226
|
+
const extractProjectIdFromQuery = (c) => {
|
|
227
|
+
return c.req.query("projectId");
|
|
228
|
+
};
|
|
229
|
+
/**
|
|
230
|
+
* Ref middleware for OAuth routes - extracts tenant/project from query params
|
|
231
|
+
*/
|
|
232
|
+
const oauthRefMiddleware = createRefMiddleware(manageDbClient_default, {
|
|
233
|
+
extractTenantId: extractTenantIdFromQuery,
|
|
234
|
+
extractProjectId: extractProjectIdFromQuery,
|
|
235
|
+
allowProjectIdFromBody: false
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
//#endregion
|
|
239
|
+
export { createRefMiddleware, manageRefMiddleware, oauthRefMiddleware, runRefMiddleware, writeProtectionMiddleware };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ManageAppVariables } from "../types/app.js";
|
|
2
|
+
import * as hono0 from "hono";
|
|
3
|
+
|
|
4
|
+
//#region src/middleware/requirePermission.d.ts
|
|
5
|
+
type Permission = {
|
|
6
|
+
[resource: string]: string | string[];
|
|
7
|
+
};
|
|
8
|
+
declare const requirePermission: <Env$1 extends {
|
|
9
|
+
Variables: ManageAppVariables;
|
|
10
|
+
} = {
|
|
11
|
+
Variables: ManageAppVariables;
|
|
12
|
+
}>(permissions: Permission) => hono0.MiddlewareHandler<Env$1, string, {}, Response>;
|
|
13
|
+
//#endregion
|
|
14
|
+
export { requirePermission };
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { env } from "../env.js";
|
|
2
|
+
import { createApiError } from "@inkeep/agents-core";
|
|
3
|
+
import { createMiddleware } from "hono/factory";
|
|
4
|
+
import { HTTPException } from "hono/http-exception";
|
|
5
|
+
|
|
6
|
+
//#region src/middleware/requirePermission.ts
|
|
7
|
+
function formatPermissionsForDisplay(permissions) {
|
|
8
|
+
const formatted = [];
|
|
9
|
+
for (const [resource, actions] of Object.entries(permissions)) {
|
|
10
|
+
const actionList = Array.isArray(actions) ? actions : [actions];
|
|
11
|
+
for (const action of actionList) formatted.push(`${resource}:${action}`);
|
|
12
|
+
}
|
|
13
|
+
return formatted;
|
|
14
|
+
}
|
|
15
|
+
const requirePermission = (permissions) => createMiddleware(async (c, next) => {
|
|
16
|
+
const isTestEnvironment = process.env.ENVIRONMENT === "test";
|
|
17
|
+
const auth = c.get("auth");
|
|
18
|
+
if (env.DISABLE_AUTH || isTestEnvironment || !auth) {
|
|
19
|
+
await next();
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const userId = c.get("userId");
|
|
23
|
+
const tenantId = c.get("tenantId");
|
|
24
|
+
const tenantRole = c.get("tenantRole");
|
|
25
|
+
const requiredPermissions = formatPermissionsForDisplay(permissions);
|
|
26
|
+
if (userId === "system" || userId?.startsWith("apikey:")) {
|
|
27
|
+
await next();
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
if (!userId || !tenantId) throw createApiError({
|
|
31
|
+
code: "unauthorized",
|
|
32
|
+
message: "User or organization context not found. Ensure you are authenticated and belong to an organization.",
|
|
33
|
+
instance: c.req.path,
|
|
34
|
+
extensions: {
|
|
35
|
+
requiredPermissions,
|
|
36
|
+
context: {
|
|
37
|
+
hasUserId: !!userId,
|
|
38
|
+
hasTenantId: !!tenantId
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
try {
|
|
43
|
+
const result = await auth.api.hasPermission({
|
|
44
|
+
body: {
|
|
45
|
+
permissions,
|
|
46
|
+
organizationId: tenantId
|
|
47
|
+
},
|
|
48
|
+
headers: c.req.raw.headers
|
|
49
|
+
});
|
|
50
|
+
if (!result || !result.success) throw createApiError({
|
|
51
|
+
code: "forbidden",
|
|
52
|
+
message: `Permission denied. Required: ${requiredPermissions.join(", ")}`,
|
|
53
|
+
instance: c.req.path,
|
|
54
|
+
extensions: {
|
|
55
|
+
requiredPermissions,
|
|
56
|
+
context: {
|
|
57
|
+
userId,
|
|
58
|
+
organizationId: tenantId,
|
|
59
|
+
currentRole: tenantRole || "unknown"
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
await next();
|
|
64
|
+
} catch (error) {
|
|
65
|
+
if (error instanceof HTTPException) throw error;
|
|
66
|
+
const errorMessage = error instanceof Error ? error.message : "Unknown error";
|
|
67
|
+
throw createApiError({
|
|
68
|
+
code: "internal_server_error",
|
|
69
|
+
message: "Failed to verify permissions",
|
|
70
|
+
instance: c.req.path,
|
|
71
|
+
extensions: {
|
|
72
|
+
requiredPermissions,
|
|
73
|
+
internalError: errorMessage
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
//#endregion
|
|
80
|
+
export { requirePermission };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import * as hono3 from "hono";
|
|
2
|
+
import { BaseExecutionContext } from "@inkeep/agents-core";
|
|
3
|
+
|
|
4
|
+
//#region src/middleware/runAuth.d.ts
|
|
5
|
+
declare const runApiKeyAuth: () => hono3.MiddlewareHandler<{
|
|
6
|
+
Variables: {
|
|
7
|
+
executionContext: BaseExecutionContext;
|
|
8
|
+
};
|
|
9
|
+
}, string, {}, Response>;
|
|
10
|
+
/**
|
|
11
|
+
* Creates a middleware that applies API key authentication except for specified route patterns
|
|
12
|
+
* @param skipRouteCheck - Function that returns true if the route should skip authentication
|
|
13
|
+
*/
|
|
14
|
+
declare const runApiKeyAuthExcept: (skipRouteCheck: (path: string) => boolean) => hono3.MiddlewareHandler<{
|
|
15
|
+
Variables: {
|
|
16
|
+
executionContext: BaseExecutionContext;
|
|
17
|
+
};
|
|
18
|
+
}, string, {}, Response>;
|
|
19
|
+
/**
|
|
20
|
+
* Helper middleware for endpoints that optionally support API key authentication
|
|
21
|
+
* If no auth header is present, it continues without setting the executionContext
|
|
22
|
+
*/
|
|
23
|
+
declare const runOptionalAuth: () => hono3.MiddlewareHandler<{
|
|
24
|
+
Variables: {
|
|
25
|
+
executionContext?: BaseExecutionContext;
|
|
26
|
+
};
|
|
27
|
+
}, string, {}, Response>;
|
|
28
|
+
//#endregion
|
|
29
|
+
export { runApiKeyAuth, runApiKeyAuthExcept, runOptionalAuth };
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
import { getLogger as getLogger$1 } from "../logger.js";
|
|
2
|
+
import { env } from "../env.js";
|
|
3
|
+
import runDbClient_default from "../data/db/runDbClient.js";
|
|
4
|
+
import { createBaseExecutionContext } from "../types/runExecutionContext.js";
|
|
5
|
+
import { validateAndGetApiKey, validateTargetAgent, verifyServiceToken, verifyTempToken } from "@inkeep/agents-core";
|
|
6
|
+
import { createMiddleware } from "hono/factory";
|
|
7
|
+
import { HTTPException } from "hono/http-exception";
|
|
8
|
+
|
|
9
|
+
//#region src/middleware/runAuth.ts
|
|
10
|
+
const logger = getLogger$1("env-key-auth");
|
|
11
|
+
/**
|
|
12
|
+
* Extract common request data from the Hono context
|
|
13
|
+
*/
|
|
14
|
+
function extractRequestData(c) {
|
|
15
|
+
const authHeader = c.req.header("Authorization");
|
|
16
|
+
const tenantId = c.req.header("x-inkeep-tenant-id");
|
|
17
|
+
const projectId = c.req.header("x-inkeep-project-id");
|
|
18
|
+
const agentId = c.req.header("x-inkeep-agent-id");
|
|
19
|
+
const subAgentId = c.req.header("x-inkeep-sub-agent-id");
|
|
20
|
+
const proto = c.req.header("x-forwarded-proto")?.split(",")[0].trim();
|
|
21
|
+
const host = c.req.header("x-forwarded-host")?.split(",")[0].trim() ?? c.req.header("host");
|
|
22
|
+
const reqUrl = new URL(c.req.url);
|
|
23
|
+
const ref = c.req.query("ref");
|
|
24
|
+
const baseUrl = proto && host ? `${proto}://${host}` : host ? `${reqUrl.protocol}//${host}` : `${reqUrl.origin}`;
|
|
25
|
+
return {
|
|
26
|
+
authHeader,
|
|
27
|
+
apiKey: authHeader?.startsWith("Bearer ") ? authHeader.substring(7) : void 0,
|
|
28
|
+
tenantId,
|
|
29
|
+
projectId,
|
|
30
|
+
agentId,
|
|
31
|
+
subAgentId,
|
|
32
|
+
ref,
|
|
33
|
+
baseUrl
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Build the final execution context from auth result and request data
|
|
38
|
+
*/
|
|
39
|
+
function buildExecutionContext(authResult, reqData) {
|
|
40
|
+
return createBaseExecutionContext({
|
|
41
|
+
apiKey: authResult.apiKey,
|
|
42
|
+
tenantId: authResult.tenantId,
|
|
43
|
+
projectId: authResult.projectId,
|
|
44
|
+
agentId: authResult.agentId,
|
|
45
|
+
apiKeyId: authResult.apiKeyId,
|
|
46
|
+
baseUrl: reqData.baseUrl,
|
|
47
|
+
subAgentId: reqData.subAgentId,
|
|
48
|
+
ref: reqData.ref,
|
|
49
|
+
metadata: authResult.metadata
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Attempts to authenticate using a JWT temporary token
|
|
54
|
+
*/
|
|
55
|
+
async function tryTempJwtAuth(apiKey) {
|
|
56
|
+
if (!apiKey.startsWith("eyJ") || !env.INKEEP_AGENTS_TEMP_JWT_PUBLIC_KEY) return null;
|
|
57
|
+
try {
|
|
58
|
+
const payload = await verifyTempToken(Buffer.from(env.INKEEP_AGENTS_TEMP_JWT_PUBLIC_KEY, "base64").toString("utf-8"), apiKey);
|
|
59
|
+
logger.info({}, "JWT temp token authenticated successfully");
|
|
60
|
+
return {
|
|
61
|
+
apiKey,
|
|
62
|
+
tenantId: payload.tenantId,
|
|
63
|
+
projectId: payload.projectId,
|
|
64
|
+
agentId: payload.agentId,
|
|
65
|
+
apiKeyId: "temp-jwt",
|
|
66
|
+
metadata: { initiatedBy: payload.initiatedBy }
|
|
67
|
+
};
|
|
68
|
+
} catch (error) {
|
|
69
|
+
logger.debug({ error }, "JWT verification failed");
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Authenticate using a regular API key
|
|
75
|
+
*/
|
|
76
|
+
async function tryApiKeyAuth(apiKey) {
|
|
77
|
+
const apiKeyRecord = await validateAndGetApiKey(apiKey, runDbClient_default);
|
|
78
|
+
if (!apiKeyRecord) return null;
|
|
79
|
+
logger.debug({
|
|
80
|
+
tenantId: apiKeyRecord.tenantId,
|
|
81
|
+
projectId: apiKeyRecord.projectId,
|
|
82
|
+
agentId: apiKeyRecord.agentId
|
|
83
|
+
}, "API key authenticated successfully");
|
|
84
|
+
return {
|
|
85
|
+
apiKey,
|
|
86
|
+
tenantId: apiKeyRecord.tenantId,
|
|
87
|
+
projectId: apiKeyRecord.projectId,
|
|
88
|
+
agentId: apiKeyRecord.agentId,
|
|
89
|
+
apiKeyId: apiKeyRecord.id
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Authenticate using a team agent JWT token (for intra-tenant delegation)
|
|
94
|
+
*/
|
|
95
|
+
async function tryTeamAgentAuth(token, expectedSubAgentId) {
|
|
96
|
+
const result = await verifyServiceToken(token);
|
|
97
|
+
if (!result.valid || !result.payload) {
|
|
98
|
+
logger.warn({ error: result.error }, "Invalid team agent JWT token");
|
|
99
|
+
return {
|
|
100
|
+
authResult: null,
|
|
101
|
+
failureMessage: `Invalid team agent token: ${result.error || "Invalid token"}`
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
const payload = result.payload;
|
|
105
|
+
if (expectedSubAgentId && !validateTargetAgent(payload, expectedSubAgentId)) {
|
|
106
|
+
logger.error({
|
|
107
|
+
tokenTargetAgentId: payload.aud,
|
|
108
|
+
expectedSubAgentId,
|
|
109
|
+
originAgentId: payload.sub
|
|
110
|
+
}, "Team agent token target mismatch");
|
|
111
|
+
throw new HTTPException(403, { message: "Token not valid for the requested agent" });
|
|
112
|
+
}
|
|
113
|
+
logger.info({
|
|
114
|
+
originAgentId: payload.sub,
|
|
115
|
+
targetAgentId: payload.aud,
|
|
116
|
+
tenantId: payload.tenantId,
|
|
117
|
+
projectId: payload.projectId
|
|
118
|
+
}, "Team agent JWT token authenticated successfully");
|
|
119
|
+
return { authResult: {
|
|
120
|
+
apiKey: "team-agent-jwt",
|
|
121
|
+
tenantId: payload.tenantId,
|
|
122
|
+
projectId: payload.projectId,
|
|
123
|
+
agentId: payload.aud,
|
|
124
|
+
apiKeyId: "team-agent-token",
|
|
125
|
+
metadata: {
|
|
126
|
+
teamDelegation: true,
|
|
127
|
+
originAgentId: payload.sub
|
|
128
|
+
}
|
|
129
|
+
} };
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Authenticate using bypass secret (production mode bypass)
|
|
133
|
+
*/
|
|
134
|
+
function tryBypassAuth(apiKey, reqData) {
|
|
135
|
+
if (!env.INKEEP_AGENTS_RUN_API_BYPASS_SECRET) return null;
|
|
136
|
+
if (apiKey !== env.INKEEP_AGENTS_RUN_API_BYPASS_SECRET) return null;
|
|
137
|
+
if (!reqData.tenantId || !reqData.projectId || !reqData.agentId) throw new HTTPException(401, { message: "Missing or invalid tenant, project, or agent ID" });
|
|
138
|
+
logger.info({}, "Bypass secret authenticated successfully");
|
|
139
|
+
return {
|
|
140
|
+
apiKey,
|
|
141
|
+
tenantId: reqData.tenantId,
|
|
142
|
+
projectId: reqData.projectId,
|
|
143
|
+
agentId: reqData.agentId,
|
|
144
|
+
apiKeyId: "bypass"
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Create default development context
|
|
149
|
+
*/
|
|
150
|
+
function createDevContext(reqData) {
|
|
151
|
+
const result = {
|
|
152
|
+
apiKey: "development",
|
|
153
|
+
tenantId: reqData.tenantId || "test-tenant",
|
|
154
|
+
projectId: reqData.projectId || "test-project",
|
|
155
|
+
agentId: reqData.agentId || "test-agent",
|
|
156
|
+
apiKeyId: "test-key"
|
|
157
|
+
};
|
|
158
|
+
if (!reqData.tenantId || !reqData.projectId) logger.warn({
|
|
159
|
+
hasTenantId: !!reqData.tenantId,
|
|
160
|
+
hasProjectId: !!reqData.projectId,
|
|
161
|
+
hasApiKey: !!reqData.apiKey,
|
|
162
|
+
apiKeyPrefix: reqData.apiKey?.substring(0, 10),
|
|
163
|
+
resultTenantId: result.tenantId,
|
|
164
|
+
resultProjectId: result.projectId
|
|
165
|
+
}, "createDevContext: Using fallback test values due to missing tenant/project in request");
|
|
166
|
+
return result;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Try all auth strategies in order, returning the first successful result
|
|
170
|
+
*/
|
|
171
|
+
async function authenticateRequest(reqData) {
|
|
172
|
+
const { apiKey, subAgentId } = reqData;
|
|
173
|
+
if (!apiKey) return { authResult: null };
|
|
174
|
+
const jwtResult = await tryTempJwtAuth(apiKey);
|
|
175
|
+
if (jwtResult) return { authResult: jwtResult };
|
|
176
|
+
const bypassResult = tryBypassAuth(apiKey, reqData);
|
|
177
|
+
if (bypassResult) return { authResult: bypassResult };
|
|
178
|
+
const apiKeyResult = await tryApiKeyAuth(apiKey);
|
|
179
|
+
if (apiKeyResult) return { authResult: apiKeyResult };
|
|
180
|
+
const teamAttempt = await tryTeamAgentAuth(apiKey, subAgentId);
|
|
181
|
+
if (teamAttempt.authResult) return { authResult: teamAttempt.authResult };
|
|
182
|
+
return {
|
|
183
|
+
authResult: null,
|
|
184
|
+
failureMessage: teamAttempt.failureMessage
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Core authentication handler that can be reused across middleware
|
|
189
|
+
*/
|
|
190
|
+
async function runApiKeyAuthHandler(c, next) {
|
|
191
|
+
if (c.req.method === "OPTIONS") {
|
|
192
|
+
await next();
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
const reqData = extractRequestData(c);
|
|
196
|
+
if (process.env.ENVIRONMENT === "development" || process.env.ENVIRONMENT === "test") {
|
|
197
|
+
logger.info({}, "development environment");
|
|
198
|
+
const attempt$1 = await authenticateRequest(reqData);
|
|
199
|
+
if (attempt$1.authResult) c.set("executionContext", buildExecutionContext(attempt$1.authResult, reqData));
|
|
200
|
+
else {
|
|
201
|
+
logger.info({}, reqData.apiKey ? "Development/test environment - fallback to default context due to invalid API key" : "Development/test environment - no API key provided, using default context");
|
|
202
|
+
c.set("executionContext", buildExecutionContext(createDevContext(reqData), reqData));
|
|
203
|
+
}
|
|
204
|
+
await next();
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
if (!reqData.authHeader || !reqData.authHeader.startsWith("Bearer ")) throw new HTTPException(401, { message: "Missing or invalid authorization header. Expected: Bearer <api_key>" });
|
|
208
|
+
if (!reqData.apiKey || reqData.apiKey.length < 16) throw new HTTPException(401, { message: "Invalid API key format" });
|
|
209
|
+
let attempt = { authResult: null };
|
|
210
|
+
try {
|
|
211
|
+
attempt = await authenticateRequest(reqData);
|
|
212
|
+
} catch (error) {
|
|
213
|
+
if (error instanceof HTTPException) throw error;
|
|
214
|
+
logger.error({ error }, "Authentication failed");
|
|
215
|
+
throw new HTTPException(500, { message: "Authentication failed" });
|
|
216
|
+
}
|
|
217
|
+
if (!attempt.authResult) {
|
|
218
|
+
logger.error({}, "API key authentication error - no valid auth method found");
|
|
219
|
+
throw new HTTPException(401, { message: attempt.failureMessage || "Invalid Token" });
|
|
220
|
+
}
|
|
221
|
+
logger.debug({
|
|
222
|
+
tenantId: attempt.authResult.tenantId,
|
|
223
|
+
projectId: attempt.authResult.projectId,
|
|
224
|
+
agentId: attempt.authResult.agentId,
|
|
225
|
+
subAgentId: reqData.subAgentId
|
|
226
|
+
}, "API key authenticated successfully");
|
|
227
|
+
c.set("executionContext", buildExecutionContext(attempt.authResult, reqData));
|
|
228
|
+
await next();
|
|
229
|
+
}
|
|
230
|
+
const runApiKeyAuth = () => createMiddleware(runApiKeyAuthHandler);
|
|
231
|
+
/**
|
|
232
|
+
* Creates a middleware that applies API key authentication except for specified route patterns
|
|
233
|
+
* @param skipRouteCheck - Function that returns true if the route should skip authentication
|
|
234
|
+
*/
|
|
235
|
+
const runApiKeyAuthExcept = (skipRouteCheck) => createMiddleware(async (c, next) => {
|
|
236
|
+
if (skipRouteCheck(c.req.path)) return next();
|
|
237
|
+
return runApiKeyAuthHandler(c, next);
|
|
238
|
+
});
|
|
239
|
+
/**
|
|
240
|
+
* Helper middleware for endpoints that optionally support API key authentication
|
|
241
|
+
* If no auth header is present, it continues without setting the executionContext
|
|
242
|
+
*/
|
|
243
|
+
const runOptionalAuth = () => createMiddleware(async (c, next) => {
|
|
244
|
+
const authHeader = c.req.header("Authorization");
|
|
245
|
+
if (!authHeader || !authHeader.startsWith("Bearer ")) {
|
|
246
|
+
await next();
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
return runApiKeyAuthHandler(c, next);
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
//#endregion
|
|
253
|
+
export { runApiKeyAuth, runApiKeyAuthExcept, runOptionalAuth };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import * as hono10 from "hono";
|
|
2
|
+
|
|
3
|
+
//#region src/middleware/sessionAuth.d.ts
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Middleware to enforce session-based authentication.
|
|
7
|
+
* Requires that a user has already been authenticated via Better Auth session.
|
|
8
|
+
* Used primarily for manage routes that require an active user session.
|
|
9
|
+
*/
|
|
10
|
+
declare const sessionAuth: () => hono10.MiddlewareHandler<any, string, {}, Response>;
|
|
11
|
+
/**
|
|
12
|
+
* Global session middleware - sets user and session in context for all routes
|
|
13
|
+
* Used for all routes that require an active user session.
|
|
14
|
+
*/
|
|
15
|
+
declare const sessionContext: () => hono10.MiddlewareHandler<any, string, {}, Response>;
|
|
16
|
+
//#endregion
|
|
17
|
+
export { sessionAuth, sessionContext };
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { env } from "../env.js";
|
|
2
|
+
import { createApiError } from "@inkeep/agents-core";
|
|
3
|
+
import { createMiddleware } from "hono/factory";
|
|
4
|
+
import { HTTPException } from "hono/http-exception";
|
|
5
|
+
|
|
6
|
+
//#region src/middleware/sessionAuth.ts
|
|
7
|
+
/**
|
|
8
|
+
* Middleware to enforce session-based authentication.
|
|
9
|
+
* Requires that a user has already been authenticated via Better Auth session.
|
|
10
|
+
* Used primarily for manage routes that require an active user session.
|
|
11
|
+
*/
|
|
12
|
+
const sessionAuth = () => createMiddleware(async (c, next) => {
|
|
13
|
+
try {
|
|
14
|
+
const user = c.get("user");
|
|
15
|
+
if (!user) throw createApiError({
|
|
16
|
+
code: "unauthorized",
|
|
17
|
+
message: "Please log in to access this resource"
|
|
18
|
+
});
|
|
19
|
+
c.set("userId", user.id);
|
|
20
|
+
c.set("userEmail", user.email);
|
|
21
|
+
await next();
|
|
22
|
+
} catch (error) {
|
|
23
|
+
if (error instanceof HTTPException) throw error;
|
|
24
|
+
throw createApiError({
|
|
25
|
+
code: "unauthorized",
|
|
26
|
+
message: "Authentication failed"
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
/**
|
|
31
|
+
* Global session middleware - sets user and session in context for all routes
|
|
32
|
+
* Used for all routes that require an active user session.
|
|
33
|
+
*/
|
|
34
|
+
const sessionContext = () => createMiddleware(async (c, next) => {
|
|
35
|
+
const auth = c.get("auth");
|
|
36
|
+
if (env.DISABLE_AUTH || !auth) {
|
|
37
|
+
c.set("user", null);
|
|
38
|
+
c.set("session", null);
|
|
39
|
+
await next();
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const headers$1 = new Headers(c.req.raw.headers);
|
|
43
|
+
const forwardedCookie = headers$1.get("x-forwarded-cookie");
|
|
44
|
+
if (forwardedCookie && !headers$1.get("cookie")) headers$1.set("cookie", forwardedCookie);
|
|
45
|
+
const session = await auth.api.getSession({ headers: headers$1 });
|
|
46
|
+
if (!session) {
|
|
47
|
+
c.set("user", null);
|
|
48
|
+
c.set("session", null);
|
|
49
|
+
await next();
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
c.set("user", session.user);
|
|
53
|
+
c.set("session", session.session);
|
|
54
|
+
await next();
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
//#endregion
|
|
58
|
+
export { sessionAuth, sessionContext };
|