@inkeep/agents-core 0.0.0-dev-20250910233133

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.
Files changed (263) hide show
  1. package/LICENSE.md +56 -0
  2. package/README.md +464 -0
  3. package/dist/__tests__/integration/helpers.d.ts +5 -0
  4. package/dist/__tests__/integration/helpers.d.ts.map +1 -0
  5. package/dist/__tests__/integration/helpers.js +37 -0
  6. package/dist/__tests__/integration/helpers.js.map +1 -0
  7. package/dist/__tests__/setup.d.ts +3 -0
  8. package/dist/__tests__/setup.d.ts.map +1 -0
  9. package/dist/__tests__/setup.js +29 -0
  10. package/dist/__tests__/setup.js.map +1 -0
  11. package/dist/client-exports.d.ts +299 -0
  12. package/dist/client-exports.d.ts.map +1 -0
  13. package/dist/client-exports.js +252 -0
  14. package/dist/client-exports.js.map +1 -0
  15. package/dist/context/ContextConfig.d.ts +54 -0
  16. package/dist/context/ContextConfig.d.ts.map +1 -0
  17. package/dist/context/ContextConfig.js +302 -0
  18. package/dist/context/ContextConfig.js.map +1 -0
  19. package/dist/context/ContextFetcher.d.ts +64 -0
  20. package/dist/context/ContextFetcher.d.ts.map +1 -0
  21. package/dist/context/ContextFetcher.js +325 -0
  22. package/dist/context/ContextFetcher.js.map +1 -0
  23. package/dist/context/ContextResolver.d.ts +52 -0
  24. package/dist/context/ContextResolver.d.ts.map +1 -0
  25. package/dist/context/ContextResolver.js +298 -0
  26. package/dist/context/ContextResolver.js.map +1 -0
  27. package/dist/context/TemplateEngine.d.ts +46 -0
  28. package/dist/context/TemplateEngine.d.ts.map +1 -0
  29. package/dist/context/TemplateEngine.js +175 -0
  30. package/dist/context/TemplateEngine.js.map +1 -0
  31. package/dist/context/context.d.ts +8 -0
  32. package/dist/context/context.d.ts.map +1 -0
  33. package/dist/context/context.js +157 -0
  34. package/dist/context/context.js.map +1 -0
  35. package/dist/context/contextCache.d.ts +50 -0
  36. package/dist/context/contextCache.d.ts.map +1 -0
  37. package/dist/context/contextCache.js +175 -0
  38. package/dist/context/contextCache.js.map +1 -0
  39. package/dist/context/index.d.ts +11 -0
  40. package/dist/context/index.d.ts.map +1 -0
  41. package/dist/context/index.js +8 -0
  42. package/dist/context/index.js.map +1 -0
  43. package/dist/credential-stores/CredentialStoreRegistry.d.ts +39 -0
  44. package/dist/credential-stores/CredentialStoreRegistry.d.ts.map +1 -0
  45. package/dist/credential-stores/CredentialStoreRegistry.js +65 -0
  46. package/dist/credential-stores/CredentialStoreRegistry.js.map +1 -0
  47. package/dist/credential-stores/defaults.d.ts +6 -0
  48. package/dist/credential-stores/defaults.d.ts.map +1 -0
  49. package/dist/credential-stores/defaults.js +22 -0
  50. package/dist/credential-stores/defaults.js.map +1 -0
  51. package/dist/credential-stores/index.d.ts +6 -0
  52. package/dist/credential-stores/index.d.ts.map +1 -0
  53. package/dist/credential-stores/index.js +6 -0
  54. package/dist/credential-stores/index.js.map +1 -0
  55. package/dist/credential-stores/keychain-store.d.ts +100 -0
  56. package/dist/credential-stores/keychain-store.d.ts.map +1 -0
  57. package/dist/credential-stores/keychain-store.js +225 -0
  58. package/dist/credential-stores/keychain-store.js.map +1 -0
  59. package/dist/credential-stores/memory-store.d.ts +39 -0
  60. package/dist/credential-stores/memory-store.d.ts.map +1 -0
  61. package/dist/credential-stores/memory-store.js +58 -0
  62. package/dist/credential-stores/memory-store.js.map +1 -0
  63. package/dist/credential-stores/nango-store.d.ts +59 -0
  64. package/dist/credential-stores/nango-store.d.ts.map +1 -0
  65. package/dist/credential-stores/nango-store.js +264 -0
  66. package/dist/credential-stores/nango-store.js.map +1 -0
  67. package/dist/credential-stuffer/CredentialStuffer.d.ts +80 -0
  68. package/dist/credential-stuffer/CredentialStuffer.d.ts.map +1 -0
  69. package/dist/credential-stuffer/CredentialStuffer.js +186 -0
  70. package/dist/credential-stuffer/CredentialStuffer.js.map +1 -0
  71. package/dist/credential-stuffer/index.d.ts +2 -0
  72. package/dist/credential-stuffer/index.d.ts.map +1 -0
  73. package/dist/credential-stuffer/index.js +2 -0
  74. package/dist/credential-stuffer/index.js.map +1 -0
  75. package/dist/data-access/agentDataComponents.d.ts +1 -0
  76. package/dist/data-access/agentDataComponents.d.ts.map +1 -0
  77. package/dist/data-access/agentDataComponents.js +2 -0
  78. package/dist/data-access/agentDataComponents.js.map +1 -0
  79. package/dist/data-access/agentGraphs.d.ts +399 -0
  80. package/dist/data-access/agentGraphs.d.ts.map +1 -0
  81. package/dist/data-access/agentGraphs.js +551 -0
  82. package/dist/data-access/agentGraphs.js.map +1 -0
  83. package/dist/data-access/agentRelations.d.ts +456 -0
  84. package/dist/data-access/agentRelations.d.ts.map +1 -0
  85. package/dist/data-access/agentRelations.js +471 -0
  86. package/dist/data-access/agentRelations.js.map +1 -0
  87. package/dist/data-access/agents.d.ts +218 -0
  88. package/dist/data-access/agents.d.ts.map +1 -0
  89. package/dist/data-access/agents.js +130 -0
  90. package/dist/data-access/agents.js.map +1 -0
  91. package/dist/data-access/apiKeys.d.ts +114 -0
  92. package/dist/data-access/apiKeys.d.ts.map +1 -0
  93. package/dist/data-access/apiKeys.js +185 -0
  94. package/dist/data-access/apiKeys.js.map +1 -0
  95. package/dist/data-access/artifactComponents.d.ts +152 -0
  96. package/dist/data-access/artifactComponents.d.ts.map +1 -0
  97. package/dist/data-access/artifactComponents.js +214 -0
  98. package/dist/data-access/artifactComponents.js.map +1 -0
  99. package/dist/data-access/contextCache.d.ts +68 -0
  100. package/dist/data-access/contextCache.d.ts.map +1 -0
  101. package/dist/data-access/contextCache.js +135 -0
  102. package/dist/data-access/contextCache.js.map +1 -0
  103. package/dist/data-access/contextConfigs.d.ts +110 -0
  104. package/dist/data-access/contextConfigs.d.ts.map +1 -0
  105. package/dist/data-access/contextConfigs.js +156 -0
  106. package/dist/data-access/contextConfigs.js.map +1 -0
  107. package/dist/data-access/conversations.d.ts +125 -0
  108. package/dist/data-access/conversations.d.ts.map +1 -0
  109. package/dist/data-access/conversations.js +244 -0
  110. package/dist/data-access/conversations.js.map +1 -0
  111. package/dist/data-access/credentialReferences.d.ts +86 -0
  112. package/dist/data-access/credentialReferences.d.ts.map +1 -0
  113. package/dist/data-access/credentialReferences.js +175 -0
  114. package/dist/data-access/credentialReferences.js.map +1 -0
  115. package/dist/data-access/dataComponents.d.ts +129 -0
  116. package/dist/data-access/dataComponents.d.ts.map +1 -0
  117. package/dist/data-access/dataComponents.js +213 -0
  118. package/dist/data-access/dataComponents.js.map +1 -0
  119. package/dist/data-access/externalAgents.d.ts +83 -0
  120. package/dist/data-access/externalAgents.d.ts.map +1 -0
  121. package/dist/data-access/externalAgents.js +163 -0
  122. package/dist/data-access/externalAgents.js.map +1 -0
  123. package/dist/data-access/graphFull.d.ts +32 -0
  124. package/dist/data-access/graphFull.d.ts.map +1 -0
  125. package/dist/data-access/graphFull.js +996 -0
  126. package/dist/data-access/graphFull.js.map +1 -0
  127. package/dist/data-access/index.d.ts +21 -0
  128. package/dist/data-access/index.d.ts.map +1 -0
  129. package/dist/data-access/index.js +22 -0
  130. package/dist/data-access/index.js.map +1 -0
  131. package/dist/data-access/ledgerArtifacts.d.ts +49 -0
  132. package/dist/data-access/ledgerArtifacts.d.ts.map +1 -0
  133. package/dist/data-access/ledgerArtifacts.js +112 -0
  134. package/dist/data-access/ledgerArtifacts.js.map +1 -0
  135. package/dist/data-access/messages.d.ts +209 -0
  136. package/dist/data-access/messages.d.ts.map +1 -0
  137. package/dist/data-access/messages.js +100 -0
  138. package/dist/data-access/messages.js.map +1 -0
  139. package/dist/data-access/projects.d.ts +67 -0
  140. package/dist/data-access/projects.d.ts.map +1 -0
  141. package/dist/data-access/projects.js +337 -0
  142. package/dist/data-access/projects.js.map +1 -0
  143. package/dist/data-access/tasks.d.ts +37 -0
  144. package/dist/data-access/tasks.d.ts.map +1 -0
  145. package/dist/data-access/tasks.js +40 -0
  146. package/dist/data-access/tasks.js.map +1 -0
  147. package/dist/data-access/tools.d.ts +277 -0
  148. package/dist/data-access/tools.d.ts.map +1 -0
  149. package/dist/data-access/tools.js +183 -0
  150. package/dist/data-access/tools.js.map +1 -0
  151. package/dist/data-access/validation.d.ts +17 -0
  152. package/dist/data-access/validation.d.ts.map +1 -0
  153. package/dist/data-access/validation.js +52 -0
  154. package/dist/data-access/validation.js.map +1 -0
  155. package/dist/db/clean.d.ts +6 -0
  156. package/dist/db/clean.d.ts.map +1 -0
  157. package/dist/db/clean.js +81 -0
  158. package/dist/db/clean.js.map +1 -0
  159. package/dist/db/client.d.ts +19 -0
  160. package/dist/db/client.d.ts.map +1 -0
  161. package/dist/db/client.js +24 -0
  162. package/dist/db/client.js.map +1 -0
  163. package/dist/db/schema.d.ts +4335 -0
  164. package/dist/db/schema.d.ts.map +1 -0
  165. package/dist/db/schema.js +696 -0
  166. package/dist/db/schema.js.map +1 -0
  167. package/dist/db/test-client.d.ts +25 -0
  168. package/dist/db/test-client.d.ts.map +1 -0
  169. package/dist/db/test-client.js +136 -0
  170. package/dist/db/test-client.js.map +1 -0
  171. package/dist/env.d.ts +19 -0
  172. package/dist/env.d.ts.map +1 -0
  173. package/dist/env.js +49 -0
  174. package/dist/env.js.map +1 -0
  175. package/dist/index.d.ts +12 -0
  176. package/dist/index.d.ts.map +1 -0
  177. package/dist/index.js +13 -0
  178. package/dist/index.js.map +1 -0
  179. package/dist/middleware/contextValidation.d.ts +49 -0
  180. package/dist/middleware/contextValidation.d.ts.map +1 -0
  181. package/dist/middleware/contextValidation.js +473 -0
  182. package/dist/middleware/contextValidation.js.map +1 -0
  183. package/dist/middleware/index.d.ts +2 -0
  184. package/dist/middleware/index.d.ts.map +1 -0
  185. package/dist/middleware/index.js +2 -0
  186. package/dist/middleware/index.js.map +1 -0
  187. package/dist/types/a2a.d.ts +373 -0
  188. package/dist/types/a2a.d.ts.map +1 -0
  189. package/dist/types/a2a.js +14 -0
  190. package/dist/types/a2a.js.map +1 -0
  191. package/dist/types/entities.d.ts +147 -0
  192. package/dist/types/entities.d.ts.map +1 -0
  193. package/dist/types/entities.js +2 -0
  194. package/dist/types/entities.js.map +1 -0
  195. package/dist/types/index.d.ts +5 -0
  196. package/dist/types/index.d.ts.map +1 -0
  197. package/dist/types/index.js +6 -0
  198. package/dist/types/index.js.map +1 -0
  199. package/dist/types/server.d.ts +116 -0
  200. package/dist/types/server.d.ts.map +1 -0
  201. package/dist/types/server.js +2 -0
  202. package/dist/types/server.js.map +1 -0
  203. package/dist/types/utility.d.ts +213 -0
  204. package/dist/types/utility.d.ts.map +1 -0
  205. package/dist/types/utility.js +9 -0
  206. package/dist/types/utility.js.map +1 -0
  207. package/dist/utils/apiKeys.d.ts +32 -0
  208. package/dist/utils/apiKeys.d.ts.map +1 -0
  209. package/dist/utils/apiKeys.js +117 -0
  210. package/dist/utils/apiKeys.js.map +1 -0
  211. package/dist/utils/auth-detection.d.ts +23 -0
  212. package/dist/utils/auth-detection.d.ts.map +1 -0
  213. package/dist/utils/auth-detection.js +148 -0
  214. package/dist/utils/auth-detection.js.map +1 -0
  215. package/dist/utils/credential-store-utils.d.ts +11 -0
  216. package/dist/utils/credential-store-utils.d.ts.map +1 -0
  217. package/dist/utils/credential-store-utils.js +19 -0
  218. package/dist/utils/credential-store-utils.js.map +1 -0
  219. package/dist/utils/error.d.ts +526 -0
  220. package/dist/utils/error.d.ts.map +1 -0
  221. package/dist/utils/error.js +282 -0
  222. package/dist/utils/error.js.map +1 -0
  223. package/dist/utils/execution.d.ts +18 -0
  224. package/dist/utils/execution.d.ts.map +1 -0
  225. package/dist/utils/execution.js +25 -0
  226. package/dist/utils/execution.js.map +1 -0
  227. package/dist/utils/index.d.ts +9 -0
  228. package/dist/utils/index.d.ts.map +1 -0
  229. package/dist/utils/index.js +9 -0
  230. package/dist/utils/index.js.map +1 -0
  231. package/dist/utils/logger.d.ts +79 -0
  232. package/dist/utils/logger.d.ts.map +1 -0
  233. package/dist/utils/logger.js +102 -0
  234. package/dist/utils/logger.js.map +1 -0
  235. package/dist/utils/logging.d.ts +11 -0
  236. package/dist/utils/logging.d.ts.map +1 -0
  237. package/dist/utils/logging.js +6 -0
  238. package/dist/utils/logging.js.map +1 -0
  239. package/dist/utils/mcp-client.d.ts +48 -0
  240. package/dist/utils/mcp-client.d.ts.map +1 -0
  241. package/dist/utils/mcp-client.js +174 -0
  242. package/dist/utils/mcp-client.js.map +1 -0
  243. package/dist/utils/tracer.d.ts +24 -0
  244. package/dist/utils/tracer.d.ts.map +1 -0
  245. package/dist/utils/tracer.js +110 -0
  246. package/dist/utils/tracer.js.map +1 -0
  247. package/dist/validation/graphFull.d.ts +36 -0
  248. package/dist/validation/graphFull.d.ts.map +1 -0
  249. package/dist/validation/graphFull.js +128 -0
  250. package/dist/validation/graphFull.js.map +1 -0
  251. package/dist/validation/id-validation.d.ts +38 -0
  252. package/dist/validation/id-validation.d.ts.map +1 -0
  253. package/dist/validation/id-validation.js +60 -0
  254. package/dist/validation/id-validation.js.map +1 -0
  255. package/dist/validation/index.d.ts +4 -0
  256. package/dist/validation/index.d.ts.map +1 -0
  257. package/dist/validation/index.js +5 -0
  258. package/dist/validation/index.js.map +1 -0
  259. package/dist/validation/schemas.d.ts +7213 -0
  260. package/dist/validation/schemas.d.ts.map +1 -0
  261. package/dist/validation/schemas.js +576 -0
  262. package/dist/validation/schemas.js.map +1 -0
  263. package/package.json +95 -0
@@ -0,0 +1,174 @@
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
+ requestInit: {
47
+ headers: config.headers || {},
48
+ },
49
+ });
50
+ await this.client.connect(this.transport, {
51
+ timeout: config.timeout ?? this.timeout,
52
+ });
53
+ }
54
+ async connectHttp(config) {
55
+ const { url, requestInit } = config;
56
+ const mergedRequestInit = {
57
+ ...requestInit,
58
+ headers: {
59
+ ...(requestInit?.headers || {}),
60
+ ...(config.headers || {}),
61
+ },
62
+ };
63
+ const urlObj = new URL(url);
64
+ this.transport = new StreamableHTTPClientTransport(urlObj, {
65
+ requestInit: mergedRequestInit,
66
+ reconnectionOptions: {
67
+ maxRetries: 3,
68
+ maxReconnectionDelay: 30000,
69
+ initialReconnectionDelay: 1000,
70
+ reconnectionDelayGrowFactor: 1.5,
71
+ ...config.reconnectionOptions,
72
+ },
73
+ sessionId: config.sessionId,
74
+ });
75
+ await this.client.connect(this.transport, { timeout: 3000 });
76
+ }
77
+ async disconnect() {
78
+ if (!this.transport) {
79
+ return;
80
+ }
81
+ try {
82
+ await this.transport.close();
83
+ }
84
+ catch (e) {
85
+ console.error(e);
86
+ throw e;
87
+ }
88
+ finally {
89
+ this.transport = undefined;
90
+ this.connected = false;
91
+ }
92
+ }
93
+ validateSelectedTools(tools, activeTools) {
94
+ if (!activeTools)
95
+ return;
96
+ for (const item of activeTools) {
97
+ if (tools.includes(item))
98
+ continue;
99
+ throw new Error(`[Tools] Tool ${item} not found in tools`);
100
+ }
101
+ }
102
+ async selectTools() {
103
+ const { tools } = await this.client.listTools({ timeout: this.timeout });
104
+ const { activeTools } = this.serverConfig;
105
+ if (!activeTools)
106
+ return tools;
107
+ const toolNames = tools.map((tool) => tool.name);
108
+ this.validateSelectedTools(toolNames, activeTools);
109
+ return tools.filter((tool) => activeTools.includes(tool.name));
110
+ }
111
+ async tools() {
112
+ const tools = await this.selectTools();
113
+ const results = {};
114
+ for (const def of tools) {
115
+ try {
116
+ // Convert JSON Schema to Zod schema
117
+ const createZodSchema = (inputSchema) => {
118
+ if (!inputSchema || !inputSchema.properties) {
119
+ return z.object({});
120
+ }
121
+ const zodProperties = {};
122
+ for (const [key, prop] of Object.entries(inputSchema.properties)) {
123
+ const propDef = prop;
124
+ let zodType;
125
+ switch (propDef.type) {
126
+ case 'string':
127
+ zodType = z.string();
128
+ break;
129
+ case 'number':
130
+ zodType = z.number();
131
+ break;
132
+ case 'boolean':
133
+ zodType = z.boolean();
134
+ break;
135
+ case 'array':
136
+ zodType = z.array(z.any());
137
+ break;
138
+ default:
139
+ zodType = z.any();
140
+ }
141
+ if (propDef.description) {
142
+ zodType = zodType.describe(propDef.description);
143
+ }
144
+ // Make field optional if not in required array
145
+ const isRequired = inputSchema.required?.includes(key);
146
+ if (!isRequired) {
147
+ zodType = zodType.optional();
148
+ }
149
+ zodProperties[key] = zodType;
150
+ }
151
+ return z.object(zodProperties);
152
+ };
153
+ const schema = createZodSchema(def.inputSchema);
154
+ const createdTool = tool({
155
+ id: `${this.name}.${def.name}`,
156
+ description: def.description || '',
157
+ inputSchema: schema,
158
+ execute: async (context) => {
159
+ const result = await this.client.callTool({ name: def.name, arguments: context }, CallToolResultSchema, { timeout: this.timeout });
160
+ return result;
161
+ },
162
+ });
163
+ if (def.name) {
164
+ results[def.name] = createdTool;
165
+ }
166
+ }
167
+ catch (e) {
168
+ console.error(`Error creating tool ${def.name}:`, e);
169
+ }
170
+ }
171
+ return results;
172
+ }
173
+ }
174
+ //# 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;AAU5B,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,CAkCtD"}
@@ -0,0 +1,110 @@
1
+ import { SpanStatusCode, trace, } from '@opentelemetry/api';
2
+ import { env } from '../env';
3
+ import { getLogger } from './logger';
4
+ const logger = getLogger('tracer');
5
+ // Environments where trace force flush should be enabled
6
+ const FORCE_FLUSH_ENVIRONMENTS = ['development'];
7
+ // Base prefix for all span names - export this to use in other files
8
+ export const BASE = 'inkeep-chat';
9
+ // Service name and version constants for consistent tracer identification
10
+ export const SERVICE_NAME = 'inkeep-chat';
11
+ export const SERVICE_VERSION = '1.0.0';
12
+ // Helper function to create prefixed span names
13
+ export const createSpanName = (suffix) => `${BASE}.${suffix}`;
14
+ // No-op span implementation for when OpenTelemetry is not available
15
+ const createNoOpSpan = () => ({
16
+ setAttributes: () => ({}),
17
+ recordException: () => ({}),
18
+ setStatus: () => ({}),
19
+ addEvent: () => ({}),
20
+ end: () => { },
21
+ isRecording: () => false,
22
+ setAttribute: () => ({}),
23
+ updateName: () => ({}),
24
+ spanContext: () => ({
25
+ traceId: '00000000000000000000000000000000',
26
+ spanId: '0000000000000000',
27
+ traceFlags: 0,
28
+ }),
29
+ addLink: () => ({}),
30
+ addLinks: () => ({}),
31
+ });
32
+ // No-op tracer implementation for when OpenTelemetry is not available
33
+ const noopTracer = {
34
+ startActiveSpan(_name, arg1, arg2, arg3) {
35
+ const fn = typeof arg1 === 'function' ? arg1 : typeof arg2 === 'function' ? arg2 : arg3;
36
+ if (!fn)
37
+ throw new Error('No callback function provided');
38
+ return fn(createNoOpSpan());
39
+ },
40
+ startSpan(_name, _options) {
41
+ return createNoOpSpan();
42
+ },
43
+ };
44
+ // Global tracer instance - singleton pattern
45
+ let globalTracerInstance = null;
46
+ /**
47
+ * Helper function to handle span errors consistently
48
+ * Records the exception, sets error status, and optionally logs
49
+ */
50
+ export function handleSpanError(span, error, logger, logMessage) {
51
+ const errorMessage = error instanceof Error ? error.message : String(error);
52
+ // Record the exception in the span
53
+ span.recordException(error);
54
+ // Set error status
55
+ span.setStatus({
56
+ code: SpanStatusCode.ERROR,
57
+ message: errorMessage,
58
+ });
59
+ // Optionally log the error
60
+ if (logger && logMessage) {
61
+ logger.error({ error: errorMessage }, logMessage);
62
+ }
63
+ }
64
+ /**
65
+ * Get the global tracer instance
66
+ * This creates a single tracer for the entire application
67
+ */
68
+ export function getGlobalTracer() {
69
+ if (!globalTracerInstance) {
70
+ try {
71
+ globalTracerInstance = trace.getTracer(SERVICE_NAME, SERVICE_VERSION);
72
+ }
73
+ catch (error) {
74
+ logger.debug({ error: error instanceof Error ? error.message : 'Unknown error' }, 'OpenTelemetry tracer not available, using no-op tracer');
75
+ globalTracerInstance = noopTracer;
76
+ }
77
+ }
78
+ return globalTracerInstance;
79
+ }
80
+ /**
81
+ * Force flush the tracer provider to ensure critical spans are sent immediately
82
+ * This is useful for critical operations where we want to ensure telemetry data
83
+ * is sent before the operation completes or fails
84
+ */
85
+ export async function forceFlushTracer() {
86
+ const isOtelTracesForceFlushEnabled = env.OTEL_TRACES_FORCE_FLUSH_ENABLED;
87
+ const isForceFlushEnvironment = env.ENVIRONMENT && FORCE_FLUSH_ENVIRONMENTS.includes(env.ENVIRONMENT);
88
+ const shouldForceFlush = isOtelTracesForceFlushEnabled === true ||
89
+ (isOtelTracesForceFlushEnabled == null && isForceFlushEnvironment);
90
+ if (!shouldForceFlush) {
91
+ return;
92
+ }
93
+ try {
94
+ // Get the tracer provider and force flush if available
95
+ const tracerProvider = trace.getTracerProvider();
96
+ if (tracerProvider &&
97
+ 'forceFlush' in tracerProvider &&
98
+ typeof tracerProvider.forceFlush === 'function') {
99
+ await tracerProvider.forceFlush();
100
+ logger.debug({ message: 'Tracer provider force flush completed' }, 'Tracer provider force flush completed');
101
+ }
102
+ else {
103
+ 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');
104
+ }
105
+ }
106
+ catch (error) {
107
+ logger.warn({ error }, 'Failed to force flush tracer');
108
+ }
109
+ }
110
+ //# 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 { z } from 'zod';
2
+ import type { AgentDefinition, ExternalAgentApiInsert, FullGraphDefinition, InternalAgentDefinition } from '../types/entities';
3
+ import { FullGraphDefinitionSchema } from '../validation/schemas';
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 (transfer 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,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EACV,eAAe,EACf,sBAAsB,EACtB,mBAAmB,EACnB,uBAAuB,EACxB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAGlE,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';
2
+ // Type guard functions
3
+ export function isInternalAgent(agent) {
4
+ return 'prompt' 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 (transfer 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 transfer targets
92
+ if (agentData.canTransferTo && Array.isArray(agentData.canTransferTo)) {
93
+ for (const targetId of agentData.canTransferTo) {
94
+ if (!availableAgentIds.has(targetId)) {
95
+ errors.push(`Agent '${agentId}' has transfer 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 { MAX_ID_LENGTH, resourceIdSchema } from './schemas';
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,aAAa,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC5D;;;;;;;;;;;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,4 @@
1
+ export * from './graphFull';
2
+ export * from './id-validation';
3
+ export * from './schemas';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/validation/index.ts"],"names":[],"mappings":"AAEA,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC"}
@@ -0,0 +1,5 @@
1
+ // Re-export all validation schemas for convenience
2
+ export * from './graphFull';
3
+ export * from './id-validation';
4
+ export * from './schemas';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/validation/index.ts"],"names":[],"mappings":"AAAA,mDAAmD;AAEnD,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC"}