@inkeep/agents-core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +51 -0
- package/README.md +464 -0
- package/dist/__tests__/integration/helpers.d.ts +5 -0
- package/dist/__tests__/integration/helpers.d.ts.map +1 -0
- package/dist/__tests__/integration/helpers.js +37 -0
- package/dist/__tests__/integration/helpers.js.map +1 -0
- package/dist/__tests__/setup.d.ts +3 -0
- package/dist/__tests__/setup.d.ts.map +1 -0
- package/dist/__tests__/setup.js +29 -0
- package/dist/__tests__/setup.js.map +1 -0
- package/dist/client-exports.d.ts +301 -0
- package/dist/client-exports.d.ts.map +1 -0
- package/dist/client-exports.js +251 -0
- package/dist/client-exports.js.map +1 -0
- package/dist/context/ContextConfig.d.ts +55 -0
- package/dist/context/ContextConfig.d.ts.map +1 -0
- package/dist/context/ContextConfig.js +302 -0
- package/dist/context/ContextConfig.js.map +1 -0
- package/dist/context/ContextFetcher.d.ts +64 -0
- package/dist/context/ContextFetcher.d.ts.map +1 -0
- package/dist/context/ContextFetcher.js +325 -0
- package/dist/context/ContextFetcher.js.map +1 -0
- package/dist/context/ContextResolver.d.ts +52 -0
- package/dist/context/ContextResolver.d.ts.map +1 -0
- package/dist/context/ContextResolver.js +298 -0
- package/dist/context/ContextResolver.js.map +1 -0
- package/dist/context/TemplateEngine.d.ts +46 -0
- package/dist/context/TemplateEngine.d.ts.map +1 -0
- package/dist/context/TemplateEngine.js +175 -0
- package/dist/context/TemplateEngine.js.map +1 -0
- package/dist/context/context.d.ts +7 -0
- package/dist/context/context.d.ts.map +1 -0
- package/dist/context/context.js +157 -0
- package/dist/context/context.js.map +1 -0
- package/dist/context/contextCache.d.ts +50 -0
- package/dist/context/contextCache.d.ts.map +1 -0
- package/dist/context/contextCache.js +175 -0
- package/dist/context/contextCache.js.map +1 -0
- package/dist/context/index.d.ts +11 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +8 -0
- package/dist/context/index.js.map +1 -0
- package/dist/credential-stores/index.d.ts +4 -0
- package/dist/credential-stores/index.d.ts.map +1 -0
- package/dist/credential-stores/index.js +4 -0
- package/dist/credential-stores/index.js.map +1 -0
- package/dist/credential-stores/keychain-store.d.ts +100 -0
- package/dist/credential-stores/keychain-store.d.ts.map +1 -0
- package/dist/credential-stores/keychain-store.js +225 -0
- package/dist/credential-stores/keychain-store.js.map +1 -0
- package/dist/credential-stores/memory-store.d.ts +39 -0
- package/dist/credential-stores/memory-store.d.ts.map +1 -0
- package/dist/credential-stores/memory-store.js +58 -0
- package/dist/credential-stores/memory-store.js.map +1 -0
- package/dist/credential-stores/nango-store.d.ts +59 -0
- package/dist/credential-stores/nango-store.d.ts.map +1 -0
- package/dist/credential-stores/nango-store.js +264 -0
- package/dist/credential-stores/nango-store.js.map +1 -0
- package/dist/credential-stuffer/CredentialStuffer.d.ts +80 -0
- package/dist/credential-stuffer/CredentialStuffer.d.ts.map +1 -0
- package/dist/credential-stuffer/CredentialStuffer.js +186 -0
- package/dist/credential-stuffer/CredentialStuffer.js.map +1 -0
- package/dist/credential-stuffer/index.d.ts +2 -0
- package/dist/credential-stuffer/index.d.ts.map +1 -0
- package/dist/credential-stuffer/index.js +2 -0
- package/dist/credential-stuffer/index.js.map +1 -0
- package/dist/data-access/agentDataComponents.d.ts +1 -0
- package/dist/data-access/agentDataComponents.d.ts.map +1 -0
- package/dist/data-access/agentDataComponents.js +2 -0
- package/dist/data-access/agentDataComponents.js.map +1 -0
- package/dist/data-access/agentGraphs.d.ts +406 -0
- package/dist/data-access/agentGraphs.d.ts.map +1 -0
- package/dist/data-access/agentGraphs.js +551 -0
- package/dist/data-access/agentGraphs.js.map +1 -0
- package/dist/data-access/agentRelations.d.ts +456 -0
- package/dist/data-access/agentRelations.d.ts.map +1 -0
- package/dist/data-access/agentRelations.js +471 -0
- package/dist/data-access/agentRelations.js.map +1 -0
- package/dist/data-access/agents.d.ts +218 -0
- package/dist/data-access/agents.d.ts.map +1 -0
- package/dist/data-access/agents.js +130 -0
- package/dist/data-access/agents.js.map +1 -0
- package/dist/data-access/apiKeys.d.ts +114 -0
- package/dist/data-access/apiKeys.d.ts.map +1 -0
- package/dist/data-access/apiKeys.js +185 -0
- package/dist/data-access/apiKeys.js.map +1 -0
- package/dist/data-access/artifactComponents.d.ts +152 -0
- package/dist/data-access/artifactComponents.d.ts.map +1 -0
- package/dist/data-access/artifactComponents.js +214 -0
- package/dist/data-access/artifactComponents.js.map +1 -0
- package/dist/data-access/contextCache.d.ts +68 -0
- package/dist/data-access/contextCache.d.ts.map +1 -0
- package/dist/data-access/contextCache.js +160 -0
- package/dist/data-access/contextCache.js.map +1 -0
- package/dist/data-access/contextConfigs.d.ts +110 -0
- package/dist/data-access/contextConfigs.d.ts.map +1 -0
- package/dist/data-access/contextConfigs.js +156 -0
- package/dist/data-access/contextConfigs.js.map +1 -0
- package/dist/data-access/conversations.d.ts +125 -0
- package/dist/data-access/conversations.d.ts.map +1 -0
- package/dist/data-access/conversations.js +244 -0
- package/dist/data-access/conversations.js.map +1 -0
- package/dist/data-access/credentialReferences.d.ts +86 -0
- package/dist/data-access/credentialReferences.d.ts.map +1 -0
- package/dist/data-access/credentialReferences.js +175 -0
- package/dist/data-access/credentialReferences.js.map +1 -0
- package/dist/data-access/dataComponents.d.ts +129 -0
- package/dist/data-access/dataComponents.d.ts.map +1 -0
- package/dist/data-access/dataComponents.js +213 -0
- package/dist/data-access/dataComponents.js.map +1 -0
- package/dist/data-access/externalAgents.d.ts +83 -0
- package/dist/data-access/externalAgents.d.ts.map +1 -0
- package/dist/data-access/externalAgents.js +163 -0
- package/dist/data-access/externalAgents.js.map +1 -0
- package/dist/data-access/graphFull.d.ts +32 -0
- package/dist/data-access/graphFull.d.ts.map +1 -0
- package/dist/data-access/graphFull.js +995 -0
- package/dist/data-access/graphFull.js.map +1 -0
- package/dist/data-access/index.d.ts +21 -0
- package/dist/data-access/index.d.ts.map +1 -0
- package/dist/data-access/index.js +22 -0
- package/dist/data-access/index.js.map +1 -0
- package/dist/data-access/ledgerArtifacts.d.ts +50 -0
- package/dist/data-access/ledgerArtifacts.d.ts.map +1 -0
- package/dist/data-access/ledgerArtifacts.js +112 -0
- package/dist/data-access/ledgerArtifacts.js.map +1 -0
- package/dist/data-access/messages.d.ts +209 -0
- package/dist/data-access/messages.d.ts.map +1 -0
- package/dist/data-access/messages.js +100 -0
- package/dist/data-access/messages.js.map +1 -0
- package/dist/data-access/projects.d.ts +67 -0
- package/dist/data-access/projects.d.ts.map +1 -0
- package/dist/data-access/projects.js +336 -0
- package/dist/data-access/projects.js.map +1 -0
- package/dist/data-access/tasks.d.ts +37 -0
- package/dist/data-access/tasks.d.ts.map +1 -0
- package/dist/data-access/tasks.js +40 -0
- package/dist/data-access/tasks.js.map +1 -0
- package/dist/data-access/tools.d.ts +277 -0
- package/dist/data-access/tools.d.ts.map +1 -0
- package/dist/data-access/tools.js +183 -0
- package/dist/data-access/tools.js.map +1 -0
- package/dist/data-access/validation.d.ts +17 -0
- package/dist/data-access/validation.d.ts.map +1 -0
- package/dist/data-access/validation.js +52 -0
- package/dist/data-access/validation.js.map +1 -0
- package/dist/db/clean.d.ts +6 -0
- package/dist/db/clean.d.ts.map +1 -0
- package/dist/db/clean.js +81 -0
- package/dist/db/clean.js.map +1 -0
- package/dist/db/client.d.ts +19 -0
- package/dist/db/client.d.ts.map +1 -0
- package/dist/db/client.js +24 -0
- package/dist/db/client.js.map +1 -0
- package/dist/db/schema.d.ts +4337 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +696 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/db/test-client.d.ts +25 -0
- package/dist/db/test-client.d.ts.map +1 -0
- package/dist/db/test-client.js +136 -0
- package/dist/db/test-client.js.map +1 -0
- package/dist/env.d.ts +17 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +48 -0
- package/dist/env.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/contextValidation.d.ts +48 -0
- package/dist/middleware/contextValidation.d.ts.map +1 -0
- package/dist/middleware/contextValidation.js +469 -0
- package/dist/middleware/contextValidation.js.map +1 -0
- package/dist/middleware/index.d.ts +2 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +2 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/server/BaseServer.d.ts +83 -0
- package/dist/server/BaseServer.d.ts.map +1 -0
- package/dist/server/BaseServer.js +218 -0
- package/dist/server/BaseServer.js.map +1 -0
- package/dist/types/a2a.d.ts +373 -0
- package/dist/types/a2a.d.ts.map +1 -0
- package/dist/types/a2a.js +14 -0
- package/dist/types/a2a.js.map +1 -0
- package/dist/types/entities.d.ts +147 -0
- package/dist/types/entities.d.ts.map +1 -0
- package/dist/types/entities.js +2 -0
- package/dist/types/entities.js.map +1 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +6 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/server.d.ts +116 -0
- package/dist/types/server.d.ts.map +1 -0
- package/dist/types/server.js +2 -0
- package/dist/types/server.js.map +1 -0
- package/dist/types/utility.d.ts +214 -0
- package/dist/types/utility.d.ts.map +1 -0
- package/dist/types/utility.js +9 -0
- package/dist/types/utility.js.map +1 -0
- package/dist/utils/apiKeys.d.ts +32 -0
- package/dist/utils/apiKeys.d.ts.map +1 -0
- package/dist/utils/apiKeys.js +117 -0
- package/dist/utils/apiKeys.js.map +1 -0
- package/dist/utils/auth-detection.d.ts +23 -0
- package/dist/utils/auth-detection.d.ts.map +1 -0
- package/dist/utils/auth-detection.js +148 -0
- package/dist/utils/auth-detection.js.map +1 -0
- package/dist/utils/credential-store-utils.d.ts +11 -0
- package/dist/utils/credential-store-utils.d.ts.map +1 -0
- package/dist/utils/credential-store-utils.js +19 -0
- package/dist/utils/credential-store-utils.js.map +1 -0
- package/dist/utils/error.d.ts +526 -0
- package/dist/utils/error.d.ts.map +1 -0
- package/dist/utils/error.js +282 -0
- package/dist/utils/error.js.map +1 -0
- package/dist/utils/execution.d.ts +18 -0
- package/dist/utils/execution.d.ts.map +1 -0
- package/dist/utils/execution.js +25 -0
- package/dist/utils/execution.js.map +1 -0
- package/dist/utils/index.d.ts +9 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +9 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +79 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +102 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/logging.d.ts +11 -0
- package/dist/utils/logging.d.ts.map +1 -0
- package/dist/utils/logging.js +6 -0
- package/dist/utils/logging.js.map +1 -0
- package/dist/utils/mcp-client.d.ts +48 -0
- package/dist/utils/mcp-client.d.ts.map +1 -0
- package/dist/utils/mcp-client.js +171 -0
- package/dist/utils/mcp-client.js.map +1 -0
- package/dist/utils/tracer.d.ts +24 -0
- package/dist/utils/tracer.d.ts.map +1 -0
- package/dist/utils/tracer.js +98 -0
- package/dist/utils/tracer.js.map +1 -0
- package/dist/validation/graphFull.d.ts +36 -0
- package/dist/validation/graphFull.d.ts.map +1 -0
- package/dist/validation/graphFull.js +128 -0
- package/dist/validation/graphFull.js.map +1 -0
- package/dist/validation/id-validation.d.ts +38 -0
- package/dist/validation/id-validation.d.ts.map +1 -0
- package/dist/validation/id-validation.js +60 -0
- package/dist/validation/id-validation.js.map +1 -0
- package/dist/validation/index.d.ts +4 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +5 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/schemas.d.ts +7233 -0
- package/dist/validation/schemas.d.ts.map +1 -0
- package/dist/validation/schemas.js +525 -0
- package/dist/validation/schemas.js.map +1 -0
- package/package.json +89 -0
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
2
|
+
import { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';
|
|
3
|
+
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
4
|
+
import { DEFAULT_REQUEST_TIMEOUT_MSEC } from '@modelcontextprotocol/sdk/shared/protocol.js';
|
|
5
|
+
import { CallToolResultSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
6
|
+
import { tool } from 'ai';
|
|
7
|
+
import { asyncExitHook, gracefulExit } from 'exit-hook';
|
|
8
|
+
import { match } from 'ts-pattern';
|
|
9
|
+
import { z } from 'zod';
|
|
10
|
+
///////////////////////////////////////////////////////////////////
|
|
11
|
+
export class McpClient {
|
|
12
|
+
name;
|
|
13
|
+
client;
|
|
14
|
+
timeout;
|
|
15
|
+
transport;
|
|
16
|
+
serverConfig;
|
|
17
|
+
connected = false;
|
|
18
|
+
constructor(opts) {
|
|
19
|
+
this.name = opts.name;
|
|
20
|
+
this.timeout = opts.timeout || DEFAULT_REQUEST_TIMEOUT_MSEC;
|
|
21
|
+
this.serverConfig = opts.server;
|
|
22
|
+
this.client = new Client({ name: opts.name, version: opts.version || '1.0.0' }, { capabilities: opts.capabilities || {} });
|
|
23
|
+
}
|
|
24
|
+
async connect() {
|
|
25
|
+
if (this.connected)
|
|
26
|
+
return;
|
|
27
|
+
await match(this.serverConfig)
|
|
28
|
+
.with({ type: 'streamable_http' }, (config) => this.connectHttp(config))
|
|
29
|
+
.with({ type: 'sse' }, (config) => this.connectSSE(config))
|
|
30
|
+
.exhaustive();
|
|
31
|
+
this.connected = true;
|
|
32
|
+
const close = this.client.onclose;
|
|
33
|
+
this.client.onclose = () => {
|
|
34
|
+
this.connected = false;
|
|
35
|
+
if (typeof close === 'function') {
|
|
36
|
+
close();
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
asyncExitHook(() => this.disconnect(), { wait: 5000 });
|
|
40
|
+
process.on('SIGTERM', () => gracefulExit());
|
|
41
|
+
}
|
|
42
|
+
async connectSSE(config) {
|
|
43
|
+
const url = typeof config.url === 'string' ? config.url : config.url.toString();
|
|
44
|
+
this.transport = new SSEClientTransport(new URL(url), {
|
|
45
|
+
eventSourceInit: config.eventSourceInit,
|
|
46
|
+
});
|
|
47
|
+
await this.client.connect(this.transport, {
|
|
48
|
+
timeout: config.timeout ?? this.timeout,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
async connectHttp(config) {
|
|
52
|
+
const { url, requestInit } = config;
|
|
53
|
+
const mergedRequestInit = {
|
|
54
|
+
...requestInit,
|
|
55
|
+
headers: {
|
|
56
|
+
...(requestInit?.headers || {}),
|
|
57
|
+
...(config.headers || {}),
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
const urlObj = new URL(url);
|
|
61
|
+
this.transport = new StreamableHTTPClientTransport(urlObj, {
|
|
62
|
+
requestInit: mergedRequestInit,
|
|
63
|
+
reconnectionOptions: {
|
|
64
|
+
maxRetries: 3,
|
|
65
|
+
maxReconnectionDelay: 30000,
|
|
66
|
+
initialReconnectionDelay: 1000,
|
|
67
|
+
reconnectionDelayGrowFactor: 1.5,
|
|
68
|
+
...config.reconnectionOptions,
|
|
69
|
+
},
|
|
70
|
+
sessionId: config.sessionId,
|
|
71
|
+
});
|
|
72
|
+
await this.client.connect(this.transport, { timeout: 3000 });
|
|
73
|
+
}
|
|
74
|
+
async disconnect() {
|
|
75
|
+
if (!this.transport) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
try {
|
|
79
|
+
await this.transport.close();
|
|
80
|
+
}
|
|
81
|
+
catch (e) {
|
|
82
|
+
console.error(e);
|
|
83
|
+
throw e;
|
|
84
|
+
}
|
|
85
|
+
finally {
|
|
86
|
+
this.transport = undefined;
|
|
87
|
+
this.connected = false;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
validateSelectedTools(tools, activeTools) {
|
|
91
|
+
if (!activeTools)
|
|
92
|
+
return;
|
|
93
|
+
for (const item of activeTools) {
|
|
94
|
+
if (tools.includes(item))
|
|
95
|
+
continue;
|
|
96
|
+
throw new Error(`[Tools] Tool ${item} not found in tools`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
async selectTools() {
|
|
100
|
+
const { tools } = await this.client.listTools({ timeout: this.timeout });
|
|
101
|
+
const { activeTools } = this.serverConfig;
|
|
102
|
+
if (!activeTools)
|
|
103
|
+
return tools;
|
|
104
|
+
const toolNames = tools.map((tool) => tool.name);
|
|
105
|
+
this.validateSelectedTools(toolNames, activeTools);
|
|
106
|
+
return tools.filter((tool) => activeTools.includes(tool.name));
|
|
107
|
+
}
|
|
108
|
+
async tools() {
|
|
109
|
+
const tools = await this.selectTools();
|
|
110
|
+
const results = {};
|
|
111
|
+
for (const def of tools) {
|
|
112
|
+
try {
|
|
113
|
+
// Convert JSON Schema to Zod schema
|
|
114
|
+
const createZodSchema = (inputSchema) => {
|
|
115
|
+
if (!inputSchema || !inputSchema.properties) {
|
|
116
|
+
return z.object({});
|
|
117
|
+
}
|
|
118
|
+
const zodProperties = {};
|
|
119
|
+
for (const [key, prop] of Object.entries(inputSchema.properties)) {
|
|
120
|
+
const propDef = prop;
|
|
121
|
+
let zodType;
|
|
122
|
+
switch (propDef.type) {
|
|
123
|
+
case 'string':
|
|
124
|
+
zodType = z.string();
|
|
125
|
+
break;
|
|
126
|
+
case 'number':
|
|
127
|
+
zodType = z.number();
|
|
128
|
+
break;
|
|
129
|
+
case 'boolean':
|
|
130
|
+
zodType = z.boolean();
|
|
131
|
+
break;
|
|
132
|
+
case 'array':
|
|
133
|
+
zodType = z.array(z.any());
|
|
134
|
+
break;
|
|
135
|
+
default:
|
|
136
|
+
zodType = z.any();
|
|
137
|
+
}
|
|
138
|
+
if (propDef.description) {
|
|
139
|
+
zodType = zodType.describe(propDef.description);
|
|
140
|
+
}
|
|
141
|
+
// Make field optional if not in required array
|
|
142
|
+
const isRequired = inputSchema.required?.includes(key);
|
|
143
|
+
if (!isRequired) {
|
|
144
|
+
zodType = zodType.optional();
|
|
145
|
+
}
|
|
146
|
+
zodProperties[key] = zodType;
|
|
147
|
+
}
|
|
148
|
+
return z.object(zodProperties);
|
|
149
|
+
};
|
|
150
|
+
const schema = createZodSchema(def.inputSchema);
|
|
151
|
+
const createdTool = tool({
|
|
152
|
+
id: `${this.name}.${def.name}`,
|
|
153
|
+
description: def.description || '',
|
|
154
|
+
inputSchema: schema,
|
|
155
|
+
execute: async (context) => {
|
|
156
|
+
const result = await this.client.callTool({ name: def.name, arguments: context }, CallToolResultSchema, { timeout: this.timeout });
|
|
157
|
+
return result;
|
|
158
|
+
},
|
|
159
|
+
});
|
|
160
|
+
if (def.name) {
|
|
161
|
+
results[def.name] = createdTool;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
catch (e) {
|
|
165
|
+
console.error(`Error creating tool ${def.name}:`, e);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return results;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=mcp-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-client.js","sourceRoot":"","sources":["../../src/utils/mcp-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type Span, type Tracer } from '@opentelemetry/api';
|
|
2
|
+
export declare const BASE = "inkeep-chat";
|
|
3
|
+
export declare const SERVICE_NAME = "inkeep-chat";
|
|
4
|
+
export declare const SERVICE_VERSION = "1.0.0";
|
|
5
|
+
export declare const createSpanName: (suffix: string) => string;
|
|
6
|
+
/**
|
|
7
|
+
* Helper function to handle span errors consistently
|
|
8
|
+
* Records the exception, sets error status, and optionally logs
|
|
9
|
+
*/
|
|
10
|
+
export declare function handleSpanError(span: Span, error: unknown, logger?: {
|
|
11
|
+
error: (obj: any, msg?: string) => void;
|
|
12
|
+
}, logMessage?: string): void;
|
|
13
|
+
/**
|
|
14
|
+
* Get the global tracer instance
|
|
15
|
+
* This creates a single tracer for the entire application
|
|
16
|
+
*/
|
|
17
|
+
export declare function getGlobalTracer(): Tracer;
|
|
18
|
+
/**
|
|
19
|
+
* Force flush the tracer provider to ensure critical spans are sent immediately
|
|
20
|
+
* This is useful for critical operations where we want to ensure telemetry data
|
|
21
|
+
* is sent before the operation completes or fails
|
|
22
|
+
*/
|
|
23
|
+
export declare function forceFlushTracer(): Promise<void>;
|
|
24
|
+
//# sourceMappingURL=tracer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracer.d.ts","sourceRoot":"","sources":["../../src/utils/tracer.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,IAAI,EAGT,KAAK,MAAM,EAEZ,MAAM,oBAAoB,CAAC;AAM5B,eAAO,MAAM,IAAI,gBAAgB,CAAC;AAGlC,eAAO,MAAM,YAAY,gBAAgB,CAAC;AAC1C,eAAO,MAAM,eAAe,UAAU,CAAC;AAGvC,eAAO,MAAM,cAAc,GAAI,QAAQ,MAAM,WAAwB,CAAC;AAyCtE;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,OAAO,EACd,MAAM,CAAC,EAAE;IAAE,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,EACpD,UAAU,CAAC,EAAE,MAAM,GAClB,IAAI,CAgBN;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAaxC;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAatD"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { SpanStatusCode, trace, } from '@opentelemetry/api';
|
|
2
|
+
import { getLogger } from './logger.js';
|
|
3
|
+
const logger = getLogger('tracer');
|
|
4
|
+
// Base prefix for all span names - export this to use in other files
|
|
5
|
+
export const BASE = 'inkeep-chat';
|
|
6
|
+
// Service name and version constants for consistent tracer identification
|
|
7
|
+
export const SERVICE_NAME = 'inkeep-chat';
|
|
8
|
+
export const SERVICE_VERSION = '1.0.0';
|
|
9
|
+
// Helper function to create prefixed span names
|
|
10
|
+
export const createSpanName = (suffix) => `${BASE}.${suffix}`;
|
|
11
|
+
// No-op span implementation for when OpenTelemetry is not available
|
|
12
|
+
const createNoOpSpan = () => ({
|
|
13
|
+
setAttributes: () => ({}),
|
|
14
|
+
recordException: () => ({}),
|
|
15
|
+
setStatus: () => ({}),
|
|
16
|
+
addEvent: () => ({}),
|
|
17
|
+
end: () => { },
|
|
18
|
+
isRecording: () => false,
|
|
19
|
+
setAttribute: () => ({}),
|
|
20
|
+
updateName: () => ({}),
|
|
21
|
+
spanContext: () => ({
|
|
22
|
+
traceId: '00000000000000000000000000000000',
|
|
23
|
+
spanId: '0000000000000000',
|
|
24
|
+
traceFlags: 0,
|
|
25
|
+
}),
|
|
26
|
+
addLink: () => ({}),
|
|
27
|
+
addLinks: () => ({}),
|
|
28
|
+
});
|
|
29
|
+
// No-op tracer implementation for when OpenTelemetry is not available
|
|
30
|
+
const noopTracer = {
|
|
31
|
+
startActiveSpan(name, arg1, arg2, arg3) {
|
|
32
|
+
const fn = typeof arg1 === 'function' ? arg1 : typeof arg2 === 'function' ? arg2 : arg3;
|
|
33
|
+
if (!fn)
|
|
34
|
+
throw new Error('No callback function provided');
|
|
35
|
+
return fn(createNoOpSpan());
|
|
36
|
+
},
|
|
37
|
+
startSpan(name, options) {
|
|
38
|
+
return createNoOpSpan();
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
// Global tracer instance - singleton pattern
|
|
42
|
+
let globalTracerInstance = null;
|
|
43
|
+
/**
|
|
44
|
+
* Helper function to handle span errors consistently
|
|
45
|
+
* Records the exception, sets error status, and optionally logs
|
|
46
|
+
*/
|
|
47
|
+
export function handleSpanError(span, error, logger, logMessage) {
|
|
48
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
49
|
+
// Record the exception in the span
|
|
50
|
+
span.recordException(error);
|
|
51
|
+
// Set error status
|
|
52
|
+
span.setStatus({
|
|
53
|
+
code: SpanStatusCode.ERROR,
|
|
54
|
+
message: errorMessage,
|
|
55
|
+
});
|
|
56
|
+
// Optionally log the error
|
|
57
|
+
if (logger && logMessage) {
|
|
58
|
+
logger.error({ error: errorMessage }, logMessage);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Get the global tracer instance
|
|
63
|
+
* This creates a single tracer for the entire application
|
|
64
|
+
*/
|
|
65
|
+
export function getGlobalTracer() {
|
|
66
|
+
if (!globalTracerInstance) {
|
|
67
|
+
try {
|
|
68
|
+
globalTracerInstance = trace.getTracer(SERVICE_NAME, SERVICE_VERSION);
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
logger.debug({ error: error instanceof Error ? error.message : 'Unknown error' }, 'OpenTelemetry tracer not available, using no-op tracer');
|
|
72
|
+
globalTracerInstance = noopTracer;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return globalTracerInstance;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Force flush the tracer provider to ensure critical spans are sent immediately
|
|
79
|
+
* This is useful for critical operations where we want to ensure telemetry data
|
|
80
|
+
* is sent before the operation completes or fails
|
|
81
|
+
*/
|
|
82
|
+
export async function forceFlushTracer() {
|
|
83
|
+
try {
|
|
84
|
+
// Get the tracer provider and force flush if available
|
|
85
|
+
const tracerProvider = trace.getTracerProvider();
|
|
86
|
+
if (tracerProvider && 'forceFlush' in tracerProvider && typeof tracerProvider.forceFlush === 'function') {
|
|
87
|
+
await tracerProvider.forceFlush();
|
|
88
|
+
logger.debug({ message: 'Tracer provider force flush completed' }, 'Tracer provider force flush completed');
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
logger.debug({ message: 'Tracer provider does not support force flush or is not available' }, 'Tracer provider does not support force flush or is not available');
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
logger.warn({ error }, 'Failed to force flush tracer');
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=tracer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracer.js","sourceRoot":"","sources":["../../src/utils/tracer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { AgentDefinition, ExternalAgentApiInsert, InternalAgentDefinition, FullGraphDefinition } from '../types/entities';
|
|
2
|
+
import { FullGraphDefinitionSchema } from '../validation/schemas.js';
|
|
3
|
+
import type { z } from 'zod';
|
|
4
|
+
export declare function isInternalAgent(agent: AgentDefinition): agent is InternalAgentDefinition;
|
|
5
|
+
export declare function isExternalAgent(agent: AgentDefinition): agent is ExternalAgentApiInsert;
|
|
6
|
+
export declare function validateAndTypeGraphData(data: unknown): z.infer<typeof FullGraphDefinitionSchema>;
|
|
7
|
+
/**
|
|
8
|
+
* Validates that all tool IDs referenced in agents exist in the tools record
|
|
9
|
+
*/
|
|
10
|
+
export declare function validateToolReferences(graphData: FullGraphDefinition): void;
|
|
11
|
+
/**
|
|
12
|
+
* Validates that all dataComponent IDs referenced in agents exist in the dataComponents record
|
|
13
|
+
*/
|
|
14
|
+
export declare function validateDataComponentReferences(graphData: FullGraphDefinition): void;
|
|
15
|
+
/**
|
|
16
|
+
* Validates that all artifactComponent IDs referenced in agents exist in the artifactComponents record.
|
|
17
|
+
* Ensures referential integrity between agents and their associated artifact components.
|
|
18
|
+
*
|
|
19
|
+
* @param graphData - The validated graph data containing agents and artifact components
|
|
20
|
+
* @throws {Error} When agents reference non-existent artifact components
|
|
21
|
+
* @example
|
|
22
|
+
* ```typescript
|
|
23
|
+
* const graphData = validateAndTypeGraphData(rawGraphData);
|
|
24
|
+
* validateArtifactComponentReferences(graphData); // Throws if invalid references found
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export declare function validateArtifactComponentReferences(graphData: FullGraphDefinition): void;
|
|
28
|
+
/**
|
|
29
|
+
* Validates agent relationships (handoff and delegation targets exist)
|
|
30
|
+
*/
|
|
31
|
+
export declare function validateAgentRelationships(graphData: FullGraphDefinition): void;
|
|
32
|
+
/**
|
|
33
|
+
* Validates the graph structure before creation/update
|
|
34
|
+
*/
|
|
35
|
+
export declare function validateGraphStructure(graphData: FullGraphDefinition): void;
|
|
36
|
+
//# sourceMappingURL=graphFull.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphFull.d.ts","sourceRoot":"","sources":["../../src/validation/graphFull.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,sBAAsB,EACtB,uBAAuB,EACvB,mBAAmB,EACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAG7B,wBAAgB,eAAe,CAAC,KAAK,EAAE,eAAe,GAAG,KAAK,IAAI,uBAAuB,CAExF;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,eAAe,GAAG,KAAK,IAAI,sBAAsB,CAEvF;AAGD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAEjG;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,mBAAmB,GAAG,IAAI,CAkB3E;AAED;;GAEG;AACH,wBAAgB,+BAA+B,CAAC,SAAS,EAAE,mBAAmB,GAAG,IAAI,CAoBpF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mCAAmC,CAAC,SAAS,EAAE,mBAAmB,GAAG,IAAI,CAoBxF;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,mBAAmB,GAAG,IAAI,CAkC/E;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,mBAAmB,GAAG,IAAI,CAe3E"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { FullGraphDefinitionSchema } from '../validation/schemas.js';
|
|
2
|
+
// Type guard functions
|
|
3
|
+
export function isInternalAgent(agent) {
|
|
4
|
+
return 'instructions' in agent;
|
|
5
|
+
}
|
|
6
|
+
export function isExternalAgent(agent) {
|
|
7
|
+
return 'baseUrl' in agent;
|
|
8
|
+
}
|
|
9
|
+
// Zod-based validation and typing using the existing schema
|
|
10
|
+
export function validateAndTypeGraphData(data) {
|
|
11
|
+
return FullGraphDefinitionSchema.parse(data);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Validates that all tool IDs referenced in agents exist in the tools record
|
|
15
|
+
*/
|
|
16
|
+
export function validateToolReferences(graphData) {
|
|
17
|
+
const errors = [];
|
|
18
|
+
const availableToolIds = new Set(Object.keys(graphData.tools));
|
|
19
|
+
for (const [agentId, agentData] of Object.entries(graphData.agents)) {
|
|
20
|
+
// Only internal agents have tools
|
|
21
|
+
if (isInternalAgent(agentData) && agentData.tools && Array.isArray(agentData.tools)) {
|
|
22
|
+
for (const toolId of agentData.tools) {
|
|
23
|
+
if (!availableToolIds.has(toolId)) {
|
|
24
|
+
errors.push(`Agent '${agentId}' references non-existent tool '${toolId}'`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
if (errors.length > 0) {
|
|
30
|
+
throw new Error(`Tool reference validation failed:\n${errors.join('\n')}`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Validates that all dataComponent IDs referenced in agents exist in the dataComponents record
|
|
35
|
+
*/
|
|
36
|
+
export function validateDataComponentReferences(graphData) {
|
|
37
|
+
const errors = [];
|
|
38
|
+
const availableDataComponentIds = new Set(Object.keys(graphData.dataComponents || {}));
|
|
39
|
+
for (const [agentId, agentData] of Object.entries(graphData.agents)) {
|
|
40
|
+
// Only internal agents have dataComponents
|
|
41
|
+
if (isInternalAgent(agentData) && agentData.dataComponents) {
|
|
42
|
+
for (const dataComponentId of agentData.dataComponents) {
|
|
43
|
+
if (!availableDataComponentIds.has(dataComponentId)) {
|
|
44
|
+
errors.push(`Agent '${agentId}' references non-existent dataComponent '${dataComponentId}'`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (errors.length > 0) {
|
|
50
|
+
throw new Error(`DataComponent reference validation failed:\n${errors.join('\n')}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Validates that all artifactComponent IDs referenced in agents exist in the artifactComponents record.
|
|
55
|
+
* Ensures referential integrity between agents and their associated artifact components.
|
|
56
|
+
*
|
|
57
|
+
* @param graphData - The validated graph data containing agents and artifact components
|
|
58
|
+
* @throws {Error} When agents reference non-existent artifact components
|
|
59
|
+
* @example
|
|
60
|
+
* ```typescript
|
|
61
|
+
* const graphData = validateAndTypeGraphData(rawGraphData);
|
|
62
|
+
* validateArtifactComponentReferences(graphData); // Throws if invalid references found
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
export function validateArtifactComponentReferences(graphData) {
|
|
66
|
+
const errors = [];
|
|
67
|
+
const availableArtifactComponentIds = new Set(Object.keys(graphData.artifactComponents || {}));
|
|
68
|
+
for (const [agentId, agentData] of Object.entries(graphData.agents)) {
|
|
69
|
+
// Only internal agents have artifactComponents
|
|
70
|
+
if (isInternalAgent(agentData) && agentData.artifactComponents) {
|
|
71
|
+
for (const artifactComponentId of agentData.artifactComponents) {
|
|
72
|
+
if (!availableArtifactComponentIds.has(artifactComponentId)) {
|
|
73
|
+
errors.push(`Agent '${agentId}' references non-existent artifactComponent '${artifactComponentId}'`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (errors.length > 0) {
|
|
79
|
+
throw new Error(`ArtifactComponent reference validation failed:\n${errors.join('\n')}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Validates agent relationships (handoff and delegation targets exist)
|
|
84
|
+
*/
|
|
85
|
+
export function validateAgentRelationships(graphData) {
|
|
86
|
+
const errors = [];
|
|
87
|
+
const availableAgentIds = new Set(Object.keys(graphData.agents));
|
|
88
|
+
for (const [agentId, agentData] of Object.entries(graphData.agents)) {
|
|
89
|
+
// Only internal agents have relationship properties
|
|
90
|
+
if (isInternalAgent(agentData)) {
|
|
91
|
+
// Validate handoff targets
|
|
92
|
+
if (agentData.canHandOffTo && Array.isArray(agentData.canHandOffTo)) {
|
|
93
|
+
for (const targetId of agentData.canHandOffTo) {
|
|
94
|
+
if (!availableAgentIds.has(targetId)) {
|
|
95
|
+
errors.push(`Agent '${agentId}' has handoff target '${targetId}' that doesn't exist in graph`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// Validate delegation targets
|
|
100
|
+
if (agentData.canDelegateTo && Array.isArray(agentData.canDelegateTo)) {
|
|
101
|
+
for (const targetId of agentData.canDelegateTo) {
|
|
102
|
+
if (!availableAgentIds.has(targetId)) {
|
|
103
|
+
errors.push(`Agent '${agentId}' has delegation target '${targetId}' that doesn't exist in graph`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if (errors.length > 0) {
|
|
110
|
+
throw new Error(`Agent relationship validation failed:\n${errors.join('\n')}`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Validates the graph structure before creation/update
|
|
115
|
+
*/
|
|
116
|
+
export function validateGraphStructure(graphData) {
|
|
117
|
+
// Validate default agent exists
|
|
118
|
+
if (!graphData.agents[graphData.defaultAgentId]) {
|
|
119
|
+
throw new Error(`Default agent '${graphData.defaultAgentId}' does not exist in agents`);
|
|
120
|
+
}
|
|
121
|
+
// Validate tool references
|
|
122
|
+
validateToolReferences(graphData);
|
|
123
|
+
validateDataComponentReferences(graphData);
|
|
124
|
+
validateArtifactComponentReferences(graphData);
|
|
125
|
+
// Validate agent relationships
|
|
126
|
+
validateAgentRelationships(graphData);
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=graphFull.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphFull.js","sourceRoot":"","sources":["../../src/validation/graphFull.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Valid URL-safe characters for resource IDs based on RFC 3986.
|
|
3
|
+
*
|
|
4
|
+
* Allowed characters:
|
|
5
|
+
* - Letters: a-z, A-Z
|
|
6
|
+
* - Numbers: 0-9
|
|
7
|
+
* - Hyphens: -
|
|
8
|
+
* - Underscores: _
|
|
9
|
+
*
|
|
10
|
+
* Note: While dots (.) and tildes (~) are technically URL-safe,
|
|
11
|
+
* we exclude them for consistency with existing patterns in the codebase.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Helper function to validate if a string is a valid resource ID
|
|
15
|
+
*/
|
|
16
|
+
export declare function isValidResourceId(id: string): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Helper function to generate a URL-safe ID from a name or title.
|
|
19
|
+
* Converts to lowercase and replaces invalid characters with hyphens.
|
|
20
|
+
*/
|
|
21
|
+
export declare function generateIdFromName(name: string): string;
|
|
22
|
+
/**
|
|
23
|
+
* Example valid IDs:
|
|
24
|
+
* - "qa-agent"
|
|
25
|
+
* - "customer_support_123"
|
|
26
|
+
* - "router"
|
|
27
|
+
* - "tool-executor-v2"
|
|
28
|
+
* - "PRODUCTION_CONFIG"
|
|
29
|
+
*
|
|
30
|
+
* Example invalid IDs:
|
|
31
|
+
* - "my.agent" (contains dot)
|
|
32
|
+
* - "agent@123" (contains @)
|
|
33
|
+
* - "agent/router" (contains slash)
|
|
34
|
+
* - "my agent" (contains space)
|
|
35
|
+
* - "agent#1" (contains hash)
|
|
36
|
+
* - "" (empty string)
|
|
37
|
+
*/
|
|
38
|
+
//# sourceMappingURL=id-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"id-validation.d.ts","sourceRoot":"","sources":["../../src/validation/id-validation.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;GAWG;AAEH;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAGrD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAsBvD;AAED;;;;;;;;;;;;;;;GAeG"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { resourceIdSchema, MAX_ID_LENGTH } from './schemas.js';
|
|
2
|
+
/**
|
|
3
|
+
* Valid URL-safe characters for resource IDs based on RFC 3986.
|
|
4
|
+
*
|
|
5
|
+
* Allowed characters:
|
|
6
|
+
* - Letters: a-z, A-Z
|
|
7
|
+
* - Numbers: 0-9
|
|
8
|
+
* - Hyphens: -
|
|
9
|
+
* - Underscores: _
|
|
10
|
+
*
|
|
11
|
+
* Note: While dots (.) and tildes (~) are technically URL-safe,
|
|
12
|
+
* we exclude them for consistency with existing patterns in the codebase.
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Helper function to validate if a string is a valid resource ID
|
|
16
|
+
*/
|
|
17
|
+
export function isValidResourceId(id) {
|
|
18
|
+
const result = resourceIdSchema.safeParse(id);
|
|
19
|
+
return result.success;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Helper function to generate a URL-safe ID from a name or title.
|
|
23
|
+
* Converts to lowercase and replaces invalid characters with hyphens.
|
|
24
|
+
*/
|
|
25
|
+
export function generateIdFromName(name) {
|
|
26
|
+
const id = name
|
|
27
|
+
.toLowerCase()
|
|
28
|
+
.replace(/[^a-z0-9_-]+/g, '-') // Replace invalid chars with hyphens
|
|
29
|
+
.replace(/^-+|-+$/g, '') // Remove leading/trailing hyphens
|
|
30
|
+
.replace(/-{2,}/g, '-'); // Replace multiple consecutive hyphens with single hyphen
|
|
31
|
+
// Ensure the generated ID is not empty
|
|
32
|
+
if (!id) {
|
|
33
|
+
throw new Error('Cannot generate valid ID from provided name');
|
|
34
|
+
}
|
|
35
|
+
// Truncate if necessary
|
|
36
|
+
const truncatedId = id.substring(0, MAX_ID_LENGTH);
|
|
37
|
+
// Validate the generated ID
|
|
38
|
+
const result = resourceIdSchema.safeParse(truncatedId);
|
|
39
|
+
if (!result.success) {
|
|
40
|
+
throw new Error(`Generated ID "${truncatedId}" is not valid: ${result.error.message}`);
|
|
41
|
+
}
|
|
42
|
+
return truncatedId;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Example valid IDs:
|
|
46
|
+
* - "qa-agent"
|
|
47
|
+
* - "customer_support_123"
|
|
48
|
+
* - "router"
|
|
49
|
+
* - "tool-executor-v2"
|
|
50
|
+
* - "PRODUCTION_CONFIG"
|
|
51
|
+
*
|
|
52
|
+
* Example invalid IDs:
|
|
53
|
+
* - "my.agent" (contains dot)
|
|
54
|
+
* - "agent@123" (contains @)
|
|
55
|
+
* - "agent/router" (contains slash)
|
|
56
|
+
* - "my agent" (contains space)
|
|
57
|
+
* - "agent#1" (contains hash)
|
|
58
|
+
* - "" (empty string)
|
|
59
|
+
*/
|
|
60
|
+
//# sourceMappingURL=id-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"id-validation.js","sourceRoot":"","sources":["../../src/validation/id-validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC/D;;;;;;;;;;;GAWG;AAEH;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,EAAU;IAC1C,MAAM,MAAM,GAAG,gBAAgB,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAC9C,OAAO,MAAM,CAAC,OAAO,CAAC;AACxB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,MAAM,EAAE,GAAG,IAAI;SACZ,WAAW,EAAE;SACb,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC,qCAAqC;SACnE,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,kCAAkC;SAC1D,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,0DAA0D;IAErF,uCAAuC;IACvC,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IAED,wBAAwB;IACxB,MAAM,WAAW,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;IAEnD,4BAA4B;IAC5B,MAAM,MAAM,GAAG,gBAAgB,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACvD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,iBAAiB,WAAW,mBAAmB,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACzF,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;;;;;;;;;;;;;;GAeG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/validation/index.ts"],"names":[],"mappings":"AACA,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/validation/index.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC"}
|