@inkeep/agents-core 0.0.0-dev-20251124223719 → 0.0.0-dev-20251124234228
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auth/auth.d.ts +3 -3
- package/dist/auth/auth.js +4 -3
- package/dist/{auth-detection-CGqhPDnj.d.ts → auth-detection-7G0Dxt55.d.ts} +11 -0
- package/dist/{chunk-32YRH2S7.js → chunk-6XW4J5LI.js} +1 -1
- package/dist/{chunk-SLQW43IV.js → chunk-ATWIYWOU.js} +1 -1
- package/dist/chunk-CMNLBV2A.js +39 -0
- package/dist/{chunk-ICZLNCX7.js → chunk-K3UNCRSA.js} +330 -40
- package/dist/{chunk-SG75RA63.js → chunk-K54FZSDH.js} +1 -1
- package/dist/{chunk-TGESM3JG.js → chunk-MQMMFK2K.js} +14 -3
- package/dist/{chunk-VQXQOGJU.js → chunk-N7TIJHWC.js} +6 -6
- package/dist/{chunk-Q5U2SVA6.js → chunk-NMBNWFIZ.js} +4 -1
- package/dist/{chunk-NFYCSHD3.js → chunk-OHZDHXP7.js} +1 -0
- package/dist/{client-CnpNkGsH.d.ts → client-B_3j-V4-.d.ts} +1 -1
- package/dist/client-exports.d.ts +6 -3
- package/dist/client-exports.js +3 -3
- package/dist/constants/schema-validation/index.js +1 -1
- package/dist/credential-stores/index.d.ts +3 -3
- package/dist/db/schema.d.ts +2 -2
- package/dist/db/schema.js +1 -1
- package/dist/db/test-client.d.ts +3 -3
- package/dist/db/test-client.js +1 -1
- package/dist/index.d.ts +126 -9
- package/dist/index.js +275 -57
- package/dist/{schema-Cgkp_geg.d.ts → schema-DKbG39on.d.ts} +24 -1
- package/dist/server-BXoUiBMg.d.ts +127 -0
- package/dist/types/index.d.ts +33 -113
- package/dist/types/index.js +1 -1
- package/dist/{utility-C_tTZ7-k.d.ts → utility-Lo5NoRHK.d.ts} +141 -11
- package/dist/validation/index.d.ts +2 -2
- package/dist/validation/index.js +2 -2
- package/drizzle/{0001_fair_malice.sql → 0001_calm_sheva_callister.sql} +1 -16
- package/drizzle/meta/0001_snapshot.json +7 -1
- package/drizzle/meta/_journal.json +2 -2
- package/package.json +7 -1
- package/dist/chunk-H2F72PDA.js +0 -15
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { loadEnvironmentFiles, env } from './chunk-
|
|
1
|
+
import { loadEnvironmentFiles, env } from './chunk-NMBNWFIZ.js';
|
|
2
2
|
import { getLogger } from './chunk-DN4B564Y.js';
|
|
3
3
|
import { CredentialStoreType, MCPTransportType } from './chunk-YFHT5M2R.js';
|
|
4
4
|
import { external_exports } from './chunk-OUXC23J7.js';
|
|
@@ -14,6 +14,12 @@ import { CallToolResultSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
|
14
14
|
import { tool } from 'ai';
|
|
15
15
|
import { asyncExitHook, gracefulExit } from 'exit-hook';
|
|
16
16
|
import { match } from 'ts-pattern';
|
|
17
|
+
import { createAnthropic, anthropic } from '@ai-sdk/anthropic';
|
|
18
|
+
import { createGateway, gateway } from '@ai-sdk/gateway';
|
|
19
|
+
import { createGoogleGenerativeAI, google } from '@ai-sdk/google';
|
|
20
|
+
import { createOpenAI, openai } from '@ai-sdk/openai';
|
|
21
|
+
import { createOpenAICompatible } from '@ai-sdk/openai-compatible';
|
|
22
|
+
import { createOpenRouter, openrouter } from '@openrouter/ai-sdk-provider';
|
|
17
23
|
import * as jose from 'jose';
|
|
18
24
|
import { SignJWT, jwtVerify } from 'jose';
|
|
19
25
|
import { Composio } from '@composio/core';
|
|
@@ -179,10 +185,17 @@ function normalizeDateString(dateString) {
|
|
|
179
185
|
}
|
|
180
186
|
const pgTimestampPattern = /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}(\.\d{1,3})?$/;
|
|
181
187
|
if (pgTimestampPattern.test(dateString)) {
|
|
182
|
-
return dateString.replace(" ", "T")
|
|
188
|
+
return `${dateString.replace(" ", "T")}Z`;
|
|
183
189
|
}
|
|
184
190
|
return dateString;
|
|
185
191
|
}
|
|
192
|
+
function toISODateString(dateValue) {
|
|
193
|
+
if (typeof dateValue === "string") {
|
|
194
|
+
const normalized = normalizeDateString(dateValue);
|
|
195
|
+
return typeof normalized === "string" ? normalized : normalized.toISOString();
|
|
196
|
+
}
|
|
197
|
+
return dateValue.toISOString();
|
|
198
|
+
}
|
|
186
199
|
var ErrorCode = external_exports.enum([
|
|
187
200
|
"bad_request",
|
|
188
201
|
"unauthorized",
|
|
@@ -462,6 +475,28 @@ function getRequestExecutionContext(c) {
|
|
|
462
475
|
}
|
|
463
476
|
return executionContext;
|
|
464
477
|
}
|
|
478
|
+
|
|
479
|
+
// src/utils/format-messages.ts
|
|
480
|
+
function formatMessagesForLLM(messages) {
|
|
481
|
+
return messages.map((message) => {
|
|
482
|
+
const role = message.role === "user" ? "user" : message.role === "agent" ? "assistant" : "system";
|
|
483
|
+
const content = typeof message.content === "object" && message.content && "text" in message.content ? message.content.text : String(message.content || "");
|
|
484
|
+
return {
|
|
485
|
+
role,
|
|
486
|
+
content,
|
|
487
|
+
timestamp: message.createdAt,
|
|
488
|
+
fromSubAgentId: message.fromSubAgentId
|
|
489
|
+
};
|
|
490
|
+
});
|
|
491
|
+
}
|
|
492
|
+
function formatMessagesForLLMContext(messages) {
|
|
493
|
+
const formattedMessages = formatMessagesForLLM(messages);
|
|
494
|
+
return formattedMessages.map((msg) => {
|
|
495
|
+
const roleLabel = msg.role === "user" ? "User" : msg.role === "assistant" ? "Agent" : "System";
|
|
496
|
+
const agentInfo = msg.fromSubAgentId ? ` (${msg.fromSubAgentId})` : "";
|
|
497
|
+
return `${roleLabel}${agentInfo}: ${msg.content}`;
|
|
498
|
+
}).join("\n\n");
|
|
499
|
+
}
|
|
465
500
|
var McpClient = class {
|
|
466
501
|
name;
|
|
467
502
|
client;
|
|
@@ -598,6 +633,9 @@ var McpClient = class {
|
|
|
598
633
|
case "array":
|
|
599
634
|
zodType = external_exports.array(external_exports.any());
|
|
600
635
|
break;
|
|
636
|
+
case "object":
|
|
637
|
+
zodType = createZodSchema(propDef);
|
|
638
|
+
break;
|
|
601
639
|
default:
|
|
602
640
|
zodType = external_exports.any();
|
|
603
641
|
}
|
|
@@ -636,7 +674,259 @@ var McpClient = class {
|
|
|
636
674
|
return results;
|
|
637
675
|
}
|
|
638
676
|
};
|
|
639
|
-
var logger2 = getLogger("
|
|
677
|
+
var logger2 = getLogger("ModelFactory");
|
|
678
|
+
var nimDefault = createOpenAICompatible({
|
|
679
|
+
name: "nim",
|
|
680
|
+
baseURL: "https://integrate.api.nvidia.com/v1",
|
|
681
|
+
headers: {
|
|
682
|
+
Authorization: `Bearer ${process.env.NIM_API_KEY}`
|
|
683
|
+
}
|
|
684
|
+
});
|
|
685
|
+
var ModelFactory = class _ModelFactory {
|
|
686
|
+
/**
|
|
687
|
+
* Create a provider instance with custom configuration
|
|
688
|
+
*/
|
|
689
|
+
static createProvider(provider, config) {
|
|
690
|
+
switch (provider) {
|
|
691
|
+
case "anthropic":
|
|
692
|
+
return createAnthropic(config);
|
|
693
|
+
case "openai":
|
|
694
|
+
return createOpenAI(config);
|
|
695
|
+
case "google":
|
|
696
|
+
return createGoogleGenerativeAI(config);
|
|
697
|
+
case "openrouter":
|
|
698
|
+
return {
|
|
699
|
+
...createOpenRouter(config),
|
|
700
|
+
textEmbeddingModel: () => {
|
|
701
|
+
throw new Error("OpenRouter does not support text embeddings");
|
|
702
|
+
},
|
|
703
|
+
imageModel: () => {
|
|
704
|
+
throw new Error("OpenRouter does not support image generation");
|
|
705
|
+
}
|
|
706
|
+
};
|
|
707
|
+
case "gateway":
|
|
708
|
+
return createGateway(config);
|
|
709
|
+
case "nim": {
|
|
710
|
+
const nimConfig = {
|
|
711
|
+
name: "nim",
|
|
712
|
+
baseURL: "https://integrate.api.nvidia.com/v1",
|
|
713
|
+
headers: {
|
|
714
|
+
Authorization: `Bearer ${process.env.NIM_API_KEY}`
|
|
715
|
+
},
|
|
716
|
+
...config
|
|
717
|
+
};
|
|
718
|
+
return createOpenAICompatible(nimConfig);
|
|
719
|
+
}
|
|
720
|
+
case "custom": {
|
|
721
|
+
if (!config.baseURL && !config.baseUrl) {
|
|
722
|
+
throw new Error(
|
|
723
|
+
"Custom provider requires baseURL. Please provide it in providerOptions.baseURL or providerOptions.baseUrl"
|
|
724
|
+
);
|
|
725
|
+
}
|
|
726
|
+
const customConfig = {
|
|
727
|
+
name: "custom",
|
|
728
|
+
baseURL: config.baseURL || config.baseUrl,
|
|
729
|
+
headers: {
|
|
730
|
+
...process.env.CUSTOM_LLM_API_KEY && {
|
|
731
|
+
Authorization: `Bearer ${process.env.CUSTOM_LLM_API_KEY}`
|
|
732
|
+
},
|
|
733
|
+
...config.headers || {}
|
|
734
|
+
},
|
|
735
|
+
...config
|
|
736
|
+
};
|
|
737
|
+
logger2.info(
|
|
738
|
+
{
|
|
739
|
+
config: {
|
|
740
|
+
baseURL: customConfig.baseURL,
|
|
741
|
+
hasApiKey: !!process.env.CUSTOM_LLM_API_KEY,
|
|
742
|
+
apiKeyPrefix: `${process.env.CUSTOM_LLM_API_KEY?.substring(0, 10)}...`,
|
|
743
|
+
headers: Object.keys(customConfig.headers || {})
|
|
744
|
+
}
|
|
745
|
+
},
|
|
746
|
+
"Creating custom OpenAI-compatible provider"
|
|
747
|
+
);
|
|
748
|
+
return createOpenAICompatible(customConfig);
|
|
749
|
+
}
|
|
750
|
+
default:
|
|
751
|
+
throw new Error(`Unsupported provider: ${provider}`);
|
|
752
|
+
}
|
|
753
|
+
}
|
|
754
|
+
/**
|
|
755
|
+
* Extract provider configuration from providerOptions
|
|
756
|
+
* Only includes settings that go to the provider constructor (baseURL, apiKey, etc.)
|
|
757
|
+
*/
|
|
758
|
+
static extractProviderConfig(providerOptions) {
|
|
759
|
+
if (!providerOptions) {
|
|
760
|
+
return {};
|
|
761
|
+
}
|
|
762
|
+
const providerConfig = {};
|
|
763
|
+
if (providerOptions.baseUrl || providerOptions.baseURL) {
|
|
764
|
+
providerConfig.baseURL = providerOptions.baseUrl || providerOptions.baseURL;
|
|
765
|
+
}
|
|
766
|
+
if (providerOptions.headers) {
|
|
767
|
+
providerConfig.headers = providerOptions.headers;
|
|
768
|
+
}
|
|
769
|
+
if (providerOptions.gateway) {
|
|
770
|
+
Object.assign(providerConfig, providerOptions.gateway);
|
|
771
|
+
}
|
|
772
|
+
if (providerOptions.nim) {
|
|
773
|
+
Object.assign(providerConfig, providerOptions.nim);
|
|
774
|
+
}
|
|
775
|
+
if (providerOptions.custom) {
|
|
776
|
+
Object.assign(providerConfig, providerOptions.custom);
|
|
777
|
+
}
|
|
778
|
+
return providerConfig;
|
|
779
|
+
}
|
|
780
|
+
/**
|
|
781
|
+
* Create a language model instance from configuration
|
|
782
|
+
* Throws error if no config provided - models must be configured at project level
|
|
783
|
+
*/
|
|
784
|
+
static createModel(config) {
|
|
785
|
+
if (!config?.model?.trim()) {
|
|
786
|
+
throw new Error(
|
|
787
|
+
"Model configuration is required. Please configure models at the project level."
|
|
788
|
+
);
|
|
789
|
+
}
|
|
790
|
+
const modelSettings = config;
|
|
791
|
+
if (!modelSettings.model) {
|
|
792
|
+
throw new Error("Model configuration is required");
|
|
793
|
+
}
|
|
794
|
+
const modelString = modelSettings.model.trim();
|
|
795
|
+
const { provider, modelName } = _ModelFactory.parseModelString(modelString);
|
|
796
|
+
logger2.debug(
|
|
797
|
+
{
|
|
798
|
+
provider,
|
|
799
|
+
model: modelName,
|
|
800
|
+
fullModelString: modelSettings.model,
|
|
801
|
+
hasProviderOptions: !!modelSettings.providerOptions
|
|
802
|
+
},
|
|
803
|
+
"Creating language model from config"
|
|
804
|
+
);
|
|
805
|
+
const providerConfig = _ModelFactory.extractProviderConfig(modelSettings.providerOptions);
|
|
806
|
+
if (Object.keys(providerConfig).length > 0) {
|
|
807
|
+
logger2.info({ config: providerConfig }, `Applying custom ${provider} provider configuration`);
|
|
808
|
+
const customProvider = _ModelFactory.createProvider(provider, providerConfig);
|
|
809
|
+
return customProvider.languageModel(modelName);
|
|
810
|
+
}
|
|
811
|
+
switch (provider) {
|
|
812
|
+
case "anthropic":
|
|
813
|
+
return anthropic(modelName);
|
|
814
|
+
case "openai":
|
|
815
|
+
return openai(modelName);
|
|
816
|
+
case "google":
|
|
817
|
+
return google(modelName);
|
|
818
|
+
case "openrouter":
|
|
819
|
+
return openrouter(modelName);
|
|
820
|
+
case "gateway":
|
|
821
|
+
return gateway(modelName);
|
|
822
|
+
case "nim":
|
|
823
|
+
return nimDefault(modelName);
|
|
824
|
+
case "custom":
|
|
825
|
+
throw new Error(
|
|
826
|
+
"Custom provider requires configuration. Please provide baseURL in providerOptions.custom.baseURL or providerOptions.baseURL"
|
|
827
|
+
);
|
|
828
|
+
default:
|
|
829
|
+
throw new Error(
|
|
830
|
+
`Unsupported provider: ${provider}. Supported providers are: ${_ModelFactory.BUILT_IN_PROVIDERS.join(", ")}. To access other models, use OpenRouter (openrouter/model-id), Vercel AI Gateway (gateway/model-id), NVIDIA NIM (nim/model-id), or Custom OpenAI-compatible (custom/model-id).`
|
|
831
|
+
);
|
|
832
|
+
}
|
|
833
|
+
}
|
|
834
|
+
/**
|
|
835
|
+
* Built-in providers that have special handling
|
|
836
|
+
*/
|
|
837
|
+
static BUILT_IN_PROVIDERS = [
|
|
838
|
+
"anthropic",
|
|
839
|
+
"openai",
|
|
840
|
+
"google",
|
|
841
|
+
"openrouter",
|
|
842
|
+
"gateway",
|
|
843
|
+
"nim",
|
|
844
|
+
"custom"
|
|
845
|
+
];
|
|
846
|
+
/**
|
|
847
|
+
* Parse model string to extract provider and model name
|
|
848
|
+
* Examples: "anthropic/claude-sonnet-4" -> { provider: "anthropic", modelName: "claude-sonnet-4" }
|
|
849
|
+
* "openrouter/anthropic/claude-sonnet-4" -> { provider: "openrouter", modelName: "anthropic/claude-sonnet-4" }
|
|
850
|
+
* "claude-sonnet-4" -> { provider: "anthropic", modelName: "claude-sonnet-4" } (default to anthropic)
|
|
851
|
+
*/
|
|
852
|
+
static parseModelString(modelString) {
|
|
853
|
+
if (modelString.includes("/")) {
|
|
854
|
+
const [provider, ...modelParts] = modelString.split("/");
|
|
855
|
+
const normalizedProvider = provider.toLowerCase();
|
|
856
|
+
if (!_ModelFactory.BUILT_IN_PROVIDERS.includes(normalizedProvider)) {
|
|
857
|
+
throw new Error(
|
|
858
|
+
`Unsupported provider: ${normalizedProvider}. Supported providers are: ${_ModelFactory.BUILT_IN_PROVIDERS.join(", ")}. To access other models, use OpenRouter (openrouter/model-id), Vercel AI Gateway (gateway/model-id), NVIDIA NIM (nim/model-id), or Custom OpenAI-compatible (custom/model-id).`
|
|
859
|
+
);
|
|
860
|
+
}
|
|
861
|
+
return {
|
|
862
|
+
provider: normalizedProvider,
|
|
863
|
+
modelName: modelParts.join("/")
|
|
864
|
+
};
|
|
865
|
+
}
|
|
866
|
+
throw new Error(`No provider specified in model string: ${modelString}`);
|
|
867
|
+
}
|
|
868
|
+
/**
|
|
869
|
+
* Get generation parameters from provider options
|
|
870
|
+
* These are parameters that get passed to generateText/streamText calls
|
|
871
|
+
*/
|
|
872
|
+
static getGenerationParams(providerOptions) {
|
|
873
|
+
if (!providerOptions) {
|
|
874
|
+
return {};
|
|
875
|
+
}
|
|
876
|
+
const excludedKeys = ["apiKey", "baseURL", "baseUrl", "maxDuration", "headers", "gateway", "nim", "custom"];
|
|
877
|
+
const params = {};
|
|
878
|
+
for (const [key, value] of Object.entries(providerOptions)) {
|
|
879
|
+
if (!excludedKeys.includes(key) && value !== void 0) {
|
|
880
|
+
params[key] = value;
|
|
881
|
+
}
|
|
882
|
+
}
|
|
883
|
+
return params;
|
|
884
|
+
}
|
|
885
|
+
/**
|
|
886
|
+
* Prepare complete generation configuration from model settings
|
|
887
|
+
* Returns model instance and generation parameters ready to spread into generateText/streamText
|
|
888
|
+
* Includes maxDuration if specified in provider options (in seconds, following Vercel standard)
|
|
889
|
+
*/
|
|
890
|
+
static prepareGenerationConfig(modelSettings) {
|
|
891
|
+
const modelString = modelSettings?.model?.trim();
|
|
892
|
+
const model = _ModelFactory.createModel({
|
|
893
|
+
model: modelString,
|
|
894
|
+
providerOptions: modelSettings?.providerOptions
|
|
895
|
+
});
|
|
896
|
+
const generationParams = _ModelFactory.getGenerationParams(modelSettings?.providerOptions);
|
|
897
|
+
const maxDuration = modelSettings?.providerOptions?.maxDuration;
|
|
898
|
+
return {
|
|
899
|
+
model,
|
|
900
|
+
...generationParams,
|
|
901
|
+
...maxDuration !== void 0 && { maxDuration }
|
|
902
|
+
};
|
|
903
|
+
}
|
|
904
|
+
/**
|
|
905
|
+
* Validate model settingsuration
|
|
906
|
+
* Basic validation only - let AI SDK handle parameter-specific validation
|
|
907
|
+
*/
|
|
908
|
+
static validateConfig(config) {
|
|
909
|
+
const errors = [];
|
|
910
|
+
if (!config.model) {
|
|
911
|
+
errors.push("Model name is required");
|
|
912
|
+
}
|
|
913
|
+
if (config.providerOptions) {
|
|
914
|
+
if (config.providerOptions.apiKey) {
|
|
915
|
+
errors.push(
|
|
916
|
+
"API keys should not be stored in provider options. Use environment variables (ANTHROPIC_API_KEY, OPENAI_API_KEY) or credential store instead."
|
|
917
|
+
);
|
|
918
|
+
}
|
|
919
|
+
if (config.providerOptions.maxDuration !== void 0) {
|
|
920
|
+
const maxDuration = config.providerOptions.maxDuration;
|
|
921
|
+
if (typeof maxDuration !== "number" || maxDuration <= 0) {
|
|
922
|
+
errors.push("maxDuration must be a positive number (in seconds)");
|
|
923
|
+
}
|
|
924
|
+
}
|
|
925
|
+
}
|
|
926
|
+
return errors;
|
|
927
|
+
}
|
|
928
|
+
};
|
|
929
|
+
var logger3 = getLogger("service-token-auth");
|
|
640
930
|
function getJwtSecret() {
|
|
641
931
|
const secret = env.INKEEP_AGENTS_JWT_SIGNING_SECRET;
|
|
642
932
|
const dev_secret = "insecure-dev-secret-change-in-production-min-32-chars";
|
|
@@ -646,7 +936,7 @@ function getJwtSecret() {
|
|
|
646
936
|
"INKEEP_AGENTS_JWT_SIGNING_SECRET environment variable is required in production"
|
|
647
937
|
);
|
|
648
938
|
}
|
|
649
|
-
|
|
939
|
+
logger3.warn(
|
|
650
940
|
{},
|
|
651
941
|
"INKEEP_AGENTS_JWT_SIGNING_SECRET not set, using insecure default. DO NOT USE IN PRODUCTION!"
|
|
652
942
|
);
|
|
@@ -661,7 +951,7 @@ async function generateServiceToken(params) {
|
|
|
661
951
|
tenantId: params.tenantId,
|
|
662
952
|
projectId: params.projectId
|
|
663
953
|
}).setProtectedHeader({ alg: "HS256", typ: "JWT" }).setIssuer("inkeep-agents").setSubject(params.originAgentId).setAudience(params.targetAgentId).setIssuedAt().setExpirationTime("5m").sign(secret);
|
|
664
|
-
|
|
954
|
+
logger3.debug(
|
|
665
955
|
{
|
|
666
956
|
originAgentId: params.originAgentId,
|
|
667
957
|
targetAgentId: params.targetAgentId,
|
|
@@ -671,7 +961,7 @@ async function generateServiceToken(params) {
|
|
|
671
961
|
);
|
|
672
962
|
return token;
|
|
673
963
|
} catch (error) {
|
|
674
|
-
|
|
964
|
+
logger3.error({ error }, "Failed to generate service token");
|
|
675
965
|
throw new Error("Failed to generate service token");
|
|
676
966
|
}
|
|
677
967
|
}
|
|
@@ -683,7 +973,7 @@ async function verifyServiceToken(token) {
|
|
|
683
973
|
algorithms: ["HS256"]
|
|
684
974
|
});
|
|
685
975
|
if (typeof payload.sub !== "string" || typeof payload.aud !== "string" || typeof payload.tenantId !== "string" || typeof payload.projectId !== "string") {
|
|
686
|
-
|
|
976
|
+
logger3.warn({ payload }, "Invalid service token: missing required claims");
|
|
687
977
|
return {
|
|
688
978
|
valid: false,
|
|
689
979
|
error: "Invalid token: missing required claims"
|
|
@@ -698,7 +988,7 @@ async function verifyServiceToken(token) {
|
|
|
698
988
|
iat: payload.iat,
|
|
699
989
|
exp: payload.exp
|
|
700
990
|
};
|
|
701
|
-
|
|
991
|
+
logger3.debug(
|
|
702
992
|
{
|
|
703
993
|
originAgentId: validPayload.sub,
|
|
704
994
|
targetAgentId: validPayload.aud,
|
|
@@ -712,13 +1002,13 @@ async function verifyServiceToken(token) {
|
|
|
712
1002
|
};
|
|
713
1003
|
} catch (error) {
|
|
714
1004
|
if (error instanceof Error) {
|
|
715
|
-
|
|
1005
|
+
logger3.warn({ error: error.message }, "Team agent token verification failed");
|
|
716
1006
|
return {
|
|
717
1007
|
valid: false,
|
|
718
1008
|
error: error.message
|
|
719
1009
|
};
|
|
720
1010
|
}
|
|
721
|
-
|
|
1011
|
+
logger3.warn({ error }, "Team agent token verification failed with unknown error");
|
|
722
1012
|
return {
|
|
723
1013
|
valid: false,
|
|
724
1014
|
error: "Token verification failed"
|
|
@@ -727,7 +1017,7 @@ async function verifyServiceToken(token) {
|
|
|
727
1017
|
}
|
|
728
1018
|
function validateTenantId(payload, expectedTenantId) {
|
|
729
1019
|
if (payload.tenantId !== expectedTenantId) {
|
|
730
|
-
|
|
1020
|
+
logger3.warn(
|
|
731
1021
|
{
|
|
732
1022
|
tokenTenantId: payload.tenantId,
|
|
733
1023
|
expectedTenantId,
|
|
@@ -742,7 +1032,7 @@ function validateTenantId(payload, expectedTenantId) {
|
|
|
742
1032
|
}
|
|
743
1033
|
function validateTargetAgent(payload, expectedTargetAgentId) {
|
|
744
1034
|
if (payload.aud !== expectedTargetAgentId) {
|
|
745
|
-
|
|
1035
|
+
logger3.warn(
|
|
746
1036
|
{
|
|
747
1037
|
tokenTargetAgentId: payload.aud,
|
|
748
1038
|
expectedTargetAgentId,
|
|
@@ -793,7 +1083,7 @@ async function verifyTempToken(publicKeyPem, token) {
|
|
|
793
1083
|
}
|
|
794
1084
|
return payload;
|
|
795
1085
|
}
|
|
796
|
-
var
|
|
1086
|
+
var logger4 = getLogger("composio-client");
|
|
797
1087
|
var TOOLKIT_TO_CATEGORY = {
|
|
798
1088
|
github: "development",
|
|
799
1089
|
gitlab: "development",
|
|
@@ -867,21 +1157,21 @@ function addUserIdToUrl(url, userId) {
|
|
|
867
1157
|
async function deleteComposioConnectedAccount(accountId) {
|
|
868
1158
|
const composioInstance = getComposioInstance();
|
|
869
1159
|
if (!composioInstance) {
|
|
870
|
-
|
|
1160
|
+
logger4.info({}, "Composio not configured, skipping account deletion");
|
|
871
1161
|
return false;
|
|
872
1162
|
}
|
|
873
1163
|
try {
|
|
874
1164
|
await composioInstance.connectedAccounts.delete(accountId);
|
|
875
1165
|
return true;
|
|
876
1166
|
} catch (error) {
|
|
877
|
-
|
|
1167
|
+
logger4.warn({ error }, "Error deleting Composio connected account");
|
|
878
1168
|
return false;
|
|
879
1169
|
}
|
|
880
1170
|
}
|
|
881
1171
|
async function fetchComposioConnectedAccounts(derivedUserId) {
|
|
882
1172
|
const composioInstance = getComposioInstance();
|
|
883
1173
|
if (!composioInstance) {
|
|
884
|
-
|
|
1174
|
+
logger4.info({}, "Composio not configured, skipping connected accounts fetch");
|
|
885
1175
|
return null;
|
|
886
1176
|
}
|
|
887
1177
|
try {
|
|
@@ -890,25 +1180,25 @@ async function fetchComposioConnectedAccounts(derivedUserId) {
|
|
|
890
1180
|
});
|
|
891
1181
|
return connectedAccounts;
|
|
892
1182
|
} catch (error) {
|
|
893
|
-
|
|
1183
|
+
logger4.error({ error }, "Error fetching Composio connected accounts");
|
|
894
1184
|
return null;
|
|
895
1185
|
}
|
|
896
1186
|
}
|
|
897
1187
|
async function isComposioMCPServerAuthenticated(tenantId, projectId, mcpServerUrl) {
|
|
898
1188
|
const composioApiKey = process.env.COMPOSIO_API_KEY;
|
|
899
1189
|
if (!composioApiKey) {
|
|
900
|
-
|
|
1190
|
+
logger4.info({}, "Composio API key not configured, skipping auth check");
|
|
901
1191
|
return false;
|
|
902
1192
|
}
|
|
903
1193
|
const serverId = extractComposioServerId(mcpServerUrl);
|
|
904
1194
|
if (!serverId) {
|
|
905
|
-
|
|
1195
|
+
logger4.info({ mcpServerUrl }, "Could not extract Composio server ID from URL");
|
|
906
1196
|
return false;
|
|
907
1197
|
}
|
|
908
1198
|
const derivedUserId = deriveComposioUserId(tenantId, projectId);
|
|
909
1199
|
const composioInstance = getComposioInstance();
|
|
910
1200
|
if (!composioInstance) {
|
|
911
|
-
|
|
1201
|
+
logger4.info({}, "Composio not configured, skipping auth check");
|
|
912
1202
|
return false;
|
|
913
1203
|
}
|
|
914
1204
|
try {
|
|
@@ -926,7 +1216,7 @@ async function isComposioMCPServerAuthenticated(tenantId, projectId, mcpServerUr
|
|
|
926
1216
|
);
|
|
927
1217
|
return !!activeAccount;
|
|
928
1218
|
} catch (error) {
|
|
929
|
-
|
|
1219
|
+
logger4.error({ error, mcpServerUrl }, "Error checking Composio authentication status");
|
|
930
1220
|
return false;
|
|
931
1221
|
}
|
|
932
1222
|
}
|
|
@@ -950,7 +1240,7 @@ function transformComposioServerData(composioMcpServer, isAuthenticated, url, th
|
|
|
950
1240
|
async function ensureComposioAccount(composioMcpServer, derivedUserId, initiatedAccounts) {
|
|
951
1241
|
const firstAuthConfigId = composioMcpServer.authConfigIds[0];
|
|
952
1242
|
if (!firstAuthConfigId) {
|
|
953
|
-
|
|
1243
|
+
logger4.error({ serverId: composioMcpServer.id }, "No auth config ID found for MCP server");
|
|
954
1244
|
return null;
|
|
955
1245
|
}
|
|
956
1246
|
const existingInitiatedAccount = initiatedAccounts.find(
|
|
@@ -962,7 +1252,7 @@ async function ensureComposioAccount(composioMcpServer, derivedUserId, initiated
|
|
|
962
1252
|
try {
|
|
963
1253
|
const composioInstance = getComposioInstance();
|
|
964
1254
|
if (!composioInstance) {
|
|
965
|
-
|
|
1255
|
+
logger4.error({ serverId: composioMcpServer.id }, "Composio not configured");
|
|
966
1256
|
return null;
|
|
967
1257
|
}
|
|
968
1258
|
const createAccountResponse = await composioInstance.connectedAccounts.link(
|
|
@@ -971,7 +1261,7 @@ async function ensureComposioAccount(composioMcpServer, derivedUserId, initiated
|
|
|
971
1261
|
);
|
|
972
1262
|
return createAccountResponse.redirectUrl ?? null;
|
|
973
1263
|
} catch (error) {
|
|
974
|
-
|
|
1264
|
+
logger4.error(
|
|
975
1265
|
{ serverId: composioMcpServer.id, error },
|
|
976
1266
|
"Error creating connected account for MCP server"
|
|
977
1267
|
);
|
|
@@ -1008,13 +1298,13 @@ async function transformComposioServer(composioMcpServer, authenticatedAuthConfi
|
|
|
1008
1298
|
async function fetchComposioServers(tenantId, projectId) {
|
|
1009
1299
|
const composioApiKey = process.env.COMPOSIO_API_KEY;
|
|
1010
1300
|
if (!composioApiKey) {
|
|
1011
|
-
|
|
1301
|
+
logger4.info({}, "COMPOSIO_API_KEY not configured, skipping Composio servers");
|
|
1012
1302
|
return [];
|
|
1013
1303
|
}
|
|
1014
1304
|
const derivedUserId = deriveComposioUserId(tenantId, projectId);
|
|
1015
1305
|
const composioInstance = getComposioInstance();
|
|
1016
1306
|
if (!composioInstance) {
|
|
1017
|
-
|
|
1307
|
+
logger4.info({}, "Composio not configured, returning empty list");
|
|
1018
1308
|
return [];
|
|
1019
1309
|
}
|
|
1020
1310
|
try {
|
|
@@ -1051,26 +1341,26 @@ async function fetchComposioServers(tenantId, projectId) {
|
|
|
1051
1341
|
);
|
|
1052
1342
|
return validServers;
|
|
1053
1343
|
} catch (error) {
|
|
1054
|
-
|
|
1344
|
+
logger4.error({ error }, "Failed to fetch Composio servers");
|
|
1055
1345
|
return [];
|
|
1056
1346
|
}
|
|
1057
1347
|
}
|
|
1058
1348
|
async function fetchSingleComposioServer(tenantId, projectId, mcpServerUrl) {
|
|
1059
1349
|
const composioApiKey = process.env.COMPOSIO_API_KEY;
|
|
1060
1350
|
if (!composioApiKey) {
|
|
1061
|
-
|
|
1351
|
+
logger4.debug({}, "COMPOSIO_API_KEY not configured");
|
|
1062
1352
|
return null;
|
|
1063
1353
|
}
|
|
1064
1354
|
const derivedUserId = deriveComposioUserId(tenantId, projectId);
|
|
1065
1355
|
const composioInstance = getComposioInstance();
|
|
1066
1356
|
if (!composioInstance) {
|
|
1067
|
-
|
|
1357
|
+
logger4.info({}, "Composio not configured, returning null");
|
|
1068
1358
|
return null;
|
|
1069
1359
|
}
|
|
1070
1360
|
try {
|
|
1071
1361
|
const serverId = extractComposioServerId(mcpServerUrl);
|
|
1072
1362
|
if (!serverId) {
|
|
1073
|
-
|
|
1363
|
+
logger4.error({ mcpServerUrl }, "Could not extract Composio server ID from URL");
|
|
1074
1364
|
return null;
|
|
1075
1365
|
}
|
|
1076
1366
|
const composioMcpServer = await composioInstance.mcp.get(serverId);
|
|
@@ -1094,23 +1384,23 @@ async function fetchSingleComposioServer(tenantId, projectId, mcpServerUrl) {
|
|
|
1094
1384
|
);
|
|
1095
1385
|
return transformedServer;
|
|
1096
1386
|
} catch (error) {
|
|
1097
|
-
|
|
1387
|
+
logger4.error({ error, mcpServerUrl }, "Failed to fetch single Composio server");
|
|
1098
1388
|
return null;
|
|
1099
1389
|
}
|
|
1100
1390
|
}
|
|
1101
1391
|
|
|
1102
1392
|
// src/utils/third-party-mcp-servers/third-party-check.ts
|
|
1103
|
-
var
|
|
1393
|
+
var logger5 = getLogger("third-party-check");
|
|
1104
1394
|
async function isThirdPartyMCPServerAuthenticated(tenantId, projectId, mcpServerUrl) {
|
|
1105
1395
|
const composioServerId = extractComposioServerId(mcpServerUrl);
|
|
1106
1396
|
if (composioServerId) {
|
|
1107
|
-
|
|
1397
|
+
logger5.debug({ mcpServerUrl }, "Detected Composio MCP server, checking auth status");
|
|
1108
1398
|
return isComposioMCPServerAuthenticated(tenantId, projectId, mcpServerUrl);
|
|
1109
1399
|
}
|
|
1110
|
-
|
|
1400
|
+
logger5.info({ mcpServerUrl }, "Unknown third-party MCP server provider");
|
|
1111
1401
|
return false;
|
|
1112
1402
|
}
|
|
1113
|
-
var
|
|
1403
|
+
var logger6 = getLogger("tracer");
|
|
1114
1404
|
var createNoOpSpan = () => ({
|
|
1115
1405
|
setAttributes: () => ({}),
|
|
1116
1406
|
recordException: () => ({}),
|
|
@@ -1139,23 +1429,23 @@ var noopTracer = {
|
|
|
1139
1429
|
return createNoOpSpan();
|
|
1140
1430
|
}
|
|
1141
1431
|
};
|
|
1142
|
-
function setSpanWithError(span, error,
|
|
1432
|
+
function setSpanWithError(span, error, logger7, logMessage) {
|
|
1143
1433
|
span.recordException(error);
|
|
1144
1434
|
span.setStatus({
|
|
1145
1435
|
code: SpanStatusCode.ERROR,
|
|
1146
1436
|
message: error.message
|
|
1147
1437
|
});
|
|
1148
|
-
if (
|
|
1149
|
-
|
|
1438
|
+
if (logger7 && logMessage) {
|
|
1439
|
+
logger7.error({ error: error.message }, logMessage);
|
|
1150
1440
|
}
|
|
1151
1441
|
}
|
|
1152
1442
|
function getTracer(serviceName, serviceVersion) {
|
|
1153
1443
|
try {
|
|
1154
1444
|
return trace.getTracer(serviceName, serviceVersion);
|
|
1155
1445
|
} catch (_error) {
|
|
1156
|
-
|
|
1446
|
+
logger6.debug({}, "OpenTelemetry tracer not available, using no-op tracer");
|
|
1157
1447
|
return noopTracer;
|
|
1158
1448
|
}
|
|
1159
1449
|
}
|
|
1160
1450
|
|
|
1161
|
-
export { CONVERSATION_HISTORY_DEFAULT_LIMIT, CONVERSATION_HISTORY_MAX_OUTPUT_TOKENS_DEFAULT, ERROR_DOCS_BASE_URL, ErrorCode, MCP_TOOL_CONNECTION_TIMEOUT_MS, MCP_TOOL_INITIAL_RECONNECTION_DELAY_MS, MCP_TOOL_MAX_RECONNECTION_DELAY_MS, MCP_TOOL_MAX_RETRIES, MCP_TOOL_RECONNECTION_DELAY_GROWTH_FACTOR, McpClient, commonCreateErrorResponses, commonDeleteErrorResponses, commonGetErrorResponses, commonUpdateErrorResponses, createApiError, createExecutionContext, errorResponseSchema, errorSchemaFactory, executionLimitsSharedDefaults, extractComposioServerId, extractPublicId, fetchComposioServers, fetchSingleComposioServer, generateApiKey, generateId, generateServiceToken, getConversationId, getCredentialStoreLookupKeyFromRetrievalParams, getRequestExecutionContext, getTracer, handleApiError, hashApiKey, isApiKeyExpired, isComposioMCPServerAuthenticated, isThirdPartyMCPServerAuthenticated, maskApiKey, normalizeDateString, problemDetailsSchema, setSpanWithError, signTempToken, validateApiKey, validateTargetAgent, validateTenantId, verifyAuthorizationHeader, verifyServiceToken, verifyTempToken };
|
|
1451
|
+
export { CONVERSATION_HISTORY_DEFAULT_LIMIT, CONVERSATION_HISTORY_MAX_OUTPUT_TOKENS_DEFAULT, ERROR_DOCS_BASE_URL, ErrorCode, MCP_TOOL_CONNECTION_TIMEOUT_MS, MCP_TOOL_INITIAL_RECONNECTION_DELAY_MS, MCP_TOOL_MAX_RECONNECTION_DELAY_MS, MCP_TOOL_MAX_RETRIES, MCP_TOOL_RECONNECTION_DELAY_GROWTH_FACTOR, McpClient, ModelFactory, commonCreateErrorResponses, commonDeleteErrorResponses, commonGetErrorResponses, commonUpdateErrorResponses, createApiError, createExecutionContext, errorResponseSchema, errorSchemaFactory, executionLimitsSharedDefaults, extractComposioServerId, extractPublicId, fetchComposioServers, fetchSingleComposioServer, formatMessagesForLLM, formatMessagesForLLMContext, generateApiKey, generateId, generateServiceToken, getConversationId, getCredentialStoreLookupKeyFromRetrievalParams, getRequestExecutionContext, getTracer, handleApiError, hashApiKey, isApiKeyExpired, isComposioMCPServerAuthenticated, isThirdPartyMCPServerAuthenticated, maskApiKey, normalizeDateString, problemDetailsSchema, setSpanWithError, signTempToken, toISODateString, validateApiKey, validateTargetAgent, validateTenantId, verifyAuthorizationHeader, verifyServiceToken, verifyTempToken };
|
|
@@ -10,7 +10,10 @@ var SPAN_NAMES = {
|
|
|
10
10
|
CONTEXT_HANDLE: "context.handle_context_resolution",
|
|
11
11
|
AGENT_GENERATION: "agent.generate",
|
|
12
12
|
CONTEXT_FETCHER: "context-fetcher.http-request",
|
|
13
|
-
ARTIFACT_PROCESSING: "agent_session.process_artifact"
|
|
13
|
+
ARTIFACT_PROCESSING: "agent_session.process_artifact",
|
|
14
|
+
TOOL_APPROVAL_REQUESTED: "tool.approval_requested",
|
|
15
|
+
TOOL_APPROVAL_APPROVED: "tool.approval_approved",
|
|
16
|
+
TOOL_APPROVAL_DENIED: "tool.approval_denied"
|
|
14
17
|
};
|
|
15
18
|
var AI_OPERATIONS = {
|
|
16
19
|
GENERATE_TEXT: "ai.generateText.doGenerate",
|
|
@@ -55,6 +58,8 @@ var SPAN_KEYS = {
|
|
|
55
58
|
AI_TOOL_CALL_ID: "ai.toolCall.id",
|
|
56
59
|
AI_TOOL_TYPE: "ai.toolType",
|
|
57
60
|
TOOL_PURPOSE: "tool.purpose",
|
|
61
|
+
TOOL_NAME: "tool.name",
|
|
62
|
+
TOOL_CALL_ID: "tool.callId",
|
|
58
63
|
// Token usage
|
|
59
64
|
GEN_AI_USAGE_INPUT_TOKENS: "gen_ai.usage.input_tokens",
|
|
60
65
|
GEN_AI_USAGE_OUTPUT_TOKENS: "gen_ai.usage.output_tokens",
|
|
@@ -99,7 +104,10 @@ var ACTIVITY_TYPES = {
|
|
|
99
104
|
USER_MESSAGE: "user_message",
|
|
100
105
|
AI_ASSISTANT_MESSAGE: "ai_assistant_message",
|
|
101
106
|
AI_MODEL_STREAMED_TEXT: "ai_model_streamed_text",
|
|
102
|
-
AI_MODEL_STREAMED_OBJECT: "ai_model_streamed_object"
|
|
107
|
+
AI_MODEL_STREAMED_OBJECT: "ai_model_streamed_object",
|
|
108
|
+
TOOL_APPROVAL_REQUESTED: "tool_approval_requested",
|
|
109
|
+
TOOL_APPROVAL_APPROVED: "tool_approval_approved",
|
|
110
|
+
TOOL_APPROVAL_DENIED: "tool_approval_denied"
|
|
103
111
|
};
|
|
104
112
|
var ACTIVITY_STATUS = {
|
|
105
113
|
SUCCESS: "success",
|
|
@@ -231,7 +239,10 @@ var QUERY_EXPRESSIONS = {
|
|
|
231
239
|
DURATION_SPANS: "durationSpans",
|
|
232
240
|
AGENT_GENERATIONS: "agentGenerations",
|
|
233
241
|
SPANS_WITH_ERRORS: "spansWithErrors",
|
|
234
|
-
ARTIFACT_PROCESSING: "artifactProcessing"
|
|
242
|
+
ARTIFACT_PROCESSING: "artifactProcessing",
|
|
243
|
+
TOOL_APPROVAL_REQUESTED: "toolApprovalRequested",
|
|
244
|
+
TOOL_APPROVAL_APPROVED: "toolApprovalApproved",
|
|
245
|
+
TOOL_APPROVAL_DENIED: "toolApprovalDenied"
|
|
235
246
|
};
|
|
236
247
|
var REDUCE_OPERATIONS = {
|
|
237
248
|
SUM: "sum",
|