@inkeep/agents-run-api 0.1.3 → 0.1.6

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 (157) hide show
  1. package/LICENSE.md +7 -0
  2. package/SUPPLEMENTAL_TERMS.md +40 -0
  3. package/dist/chunk-P6IQZWFC.js +239 -0
  4. package/dist/conversations-EUPRCMQZ.js +1 -0
  5. package/dist/index.cjs +8992 -0
  6. package/dist/index.d.cts +15 -0
  7. package/dist/index.d.ts +13 -21
  8. package/dist/index.js +8644 -27
  9. package/package.json +8 -7
  10. package/dist/AgentExecutionServer.d.ts +0 -28
  11. package/dist/AgentExecutionServer.d.ts.map +0 -1
  12. package/dist/AgentExecutionServer.js +0 -41
  13. package/dist/__tests__/setup.d.ts +0 -4
  14. package/dist/__tests__/setup.d.ts.map +0 -1
  15. package/dist/__tests__/setup.js +0 -80
  16. package/dist/__tests__/utils/testProject.d.ts +0 -18
  17. package/dist/__tests__/utils/testProject.d.ts.map +0 -1
  18. package/dist/__tests__/utils/testProject.js +0 -26
  19. package/dist/__tests__/utils/testRequest.d.ts +0 -8
  20. package/dist/__tests__/utils/testRequest.d.ts.map +0 -1
  21. package/dist/__tests__/utils/testRequest.js +0 -32
  22. package/dist/__tests__/utils/testTenant.d.ts +0 -64
  23. package/dist/__tests__/utils/testTenant.d.ts.map +0 -1
  24. package/dist/__tests__/utils/testTenant.js +0 -71
  25. package/dist/a2a/client.d.ts +0 -182
  26. package/dist/a2a/client.d.ts.map +0 -1
  27. package/dist/a2a/client.js +0 -645
  28. package/dist/a2a/handlers.d.ts +0 -4
  29. package/dist/a2a/handlers.d.ts.map +0 -1
  30. package/dist/a2a/handlers.js +0 -656
  31. package/dist/a2a/transfer.d.ts +0 -18
  32. package/dist/a2a/transfer.d.ts.map +0 -1
  33. package/dist/a2a/transfer.js +0 -22
  34. package/dist/a2a/types.d.ts +0 -63
  35. package/dist/a2a/types.d.ts.map +0 -1
  36. package/dist/a2a/types.js +0 -1
  37. package/dist/agents/Agent.d.ts +0 -154
  38. package/dist/agents/Agent.d.ts.map +0 -1
  39. package/dist/agents/Agent.js +0 -1110
  40. package/dist/agents/ModelFactory.d.ts +0 -62
  41. package/dist/agents/ModelFactory.d.ts.map +0 -1
  42. package/dist/agents/ModelFactory.js +0 -208
  43. package/dist/agents/SystemPromptBuilder.d.ts +0 -14
  44. package/dist/agents/SystemPromptBuilder.d.ts.map +0 -1
  45. package/dist/agents/SystemPromptBuilder.js +0 -62
  46. package/dist/agents/ToolSessionManager.d.ts +0 -61
  47. package/dist/agents/ToolSessionManager.d.ts.map +0 -1
  48. package/dist/agents/ToolSessionManager.js +0 -143
  49. package/dist/agents/artifactTools.d.ts +0 -30
  50. package/dist/agents/artifactTools.d.ts.map +0 -1
  51. package/dist/agents/artifactTools.js +0 -463
  52. package/dist/agents/generateTaskHandler.d.ts +0 -41
  53. package/dist/agents/generateTaskHandler.d.ts.map +0 -1
  54. package/dist/agents/generateTaskHandler.js +0 -350
  55. package/dist/agents/relationTools.d.ts +0 -35
  56. package/dist/agents/relationTools.d.ts.map +0 -1
  57. package/dist/agents/relationTools.js +0 -246
  58. package/dist/agents/types.d.ts +0 -23
  59. package/dist/agents/types.d.ts.map +0 -1
  60. package/dist/agents/types.js +0 -1
  61. package/dist/agents/versions/V1Config.d.ts +0 -21
  62. package/dist/agents/versions/V1Config.d.ts.map +0 -1
  63. package/dist/agents/versions/V1Config.js +0 -285
  64. package/dist/app.d.ts +0 -12
  65. package/dist/app.d.ts.map +0 -1
  66. package/dist/app.js +0 -216
  67. package/dist/data/agentGraph.d.ts +0 -4
  68. package/dist/data/agentGraph.d.ts.map +0 -1
  69. package/dist/data/agentGraph.js +0 -73
  70. package/dist/data/agents.d.ts +0 -4
  71. package/dist/data/agents.d.ts.map +0 -1
  72. package/dist/data/agents.js +0 -78
  73. package/dist/data/conversations.d.ts +0 -59
  74. package/dist/data/conversations.d.ts.map +0 -1
  75. package/dist/data/conversations.js +0 -216
  76. package/dist/data/db/clean.d.ts +0 -6
  77. package/dist/data/db/clean.d.ts.map +0 -1
  78. package/dist/data/db/clean.js +0 -77
  79. package/dist/data/db/dbClient.d.ts +0 -3
  80. package/dist/data/db/dbClient.d.ts.map +0 -1
  81. package/dist/data/db/dbClient.js +0 -13
  82. package/dist/env.d.ts +0 -45
  83. package/dist/env.d.ts.map +0 -1
  84. package/dist/env.js +0 -64
  85. package/dist/handlers/executionHandler.d.ts +0 -36
  86. package/dist/handlers/executionHandler.d.ts.map +0 -1
  87. package/dist/handlers/executionHandler.js +0 -399
  88. package/dist/index.d.ts.map +0 -1
  89. package/dist/instrumentation.d.ts +0 -13
  90. package/dist/instrumentation.d.ts.map +0 -1
  91. package/dist/instrumentation.js +0 -66
  92. package/dist/logger.d.ts +0 -4
  93. package/dist/logger.d.ts.map +0 -1
  94. package/dist/logger.js +0 -32
  95. package/dist/middleware/api-key-auth.d.ts +0 -22
  96. package/dist/middleware/api-key-auth.d.ts.map +0 -1
  97. package/dist/middleware/api-key-auth.js +0 -139
  98. package/dist/middleware/index.d.ts +0 -2
  99. package/dist/middleware/index.d.ts.map +0 -1
  100. package/dist/middleware/index.js +0 -1
  101. package/dist/openapi.d.ts +0 -2
  102. package/dist/openapi.d.ts.map +0 -1
  103. package/dist/openapi.js +0 -36
  104. package/dist/routes/agents.d.ts +0 -10
  105. package/dist/routes/agents.d.ts.map +0 -1
  106. package/dist/routes/agents.js +0 -158
  107. package/dist/routes/chat.d.ts +0 -10
  108. package/dist/routes/chat.d.ts.map +0 -1
  109. package/dist/routes/chat.js +0 -307
  110. package/dist/routes/chatDataStream.d.ts +0 -10
  111. package/dist/routes/chatDataStream.d.ts.map +0 -1
  112. package/dist/routes/chatDataStream.js +0 -179
  113. package/dist/routes/mcp.d.ts +0 -10
  114. package/dist/routes/mcp.d.ts.map +0 -1
  115. package/dist/routes/mcp.js +0 -500
  116. package/dist/server.d.ts +0 -5
  117. package/dist/server.d.ts.map +0 -1
  118. package/dist/server.js +0 -61
  119. package/dist/tracer.d.ts +0 -24
  120. package/dist/tracer.d.ts.map +0 -1
  121. package/dist/tracer.js +0 -107
  122. package/dist/types/chat.d.ts +0 -25
  123. package/dist/types/chat.d.ts.map +0 -1
  124. package/dist/types/chat.js +0 -1
  125. package/dist/types/execution-context.d.ts +0 -14
  126. package/dist/types/execution-context.d.ts.map +0 -1
  127. package/dist/types/execution-context.js +0 -14
  128. package/dist/utils/agent-operations.d.ts +0 -92
  129. package/dist/utils/agent-operations.d.ts.map +0 -1
  130. package/dist/utils/agent-operations.js +0 -78
  131. package/dist/utils/artifact-component-schema.d.ts +0 -29
  132. package/dist/utils/artifact-component-schema.d.ts.map +0 -1
  133. package/dist/utils/artifact-component-schema.js +0 -119
  134. package/dist/utils/artifact-parser.d.ts +0 -71
  135. package/dist/utils/artifact-parser.d.ts.map +0 -1
  136. package/dist/utils/artifact-parser.js +0 -251
  137. package/dist/utils/cleanup.d.ts +0 -19
  138. package/dist/utils/cleanup.d.ts.map +0 -1
  139. package/dist/utils/cleanup.js +0 -66
  140. package/dist/utils/data-component-schema.d.ts +0 -6
  141. package/dist/utils/data-component-schema.d.ts.map +0 -1
  142. package/dist/utils/data-component-schema.js +0 -43
  143. package/dist/utils/graph-session.d.ts +0 -200
  144. package/dist/utils/graph-session.d.ts.map +0 -1
  145. package/dist/utils/graph-session.js +0 -1016
  146. package/dist/utils/incremental-stream-parser.d.ts +0 -57
  147. package/dist/utils/incremental-stream-parser.d.ts.map +0 -1
  148. package/dist/utils/incremental-stream-parser.js +0 -289
  149. package/dist/utils/response-formatter.d.ts +0 -27
  150. package/dist/utils/response-formatter.d.ts.map +0 -1
  151. package/dist/utils/response-formatter.js +0 -160
  152. package/dist/utils/stream-helpers.d.ts +0 -174
  153. package/dist/utils/stream-helpers.d.ts.map +0 -1
  154. package/dist/utils/stream-helpers.js +0 -466
  155. package/dist/utils/stream-registry.d.ts +0 -18
  156. package/dist/utils/stream-registry.d.ts.map +0 -1
  157. package/dist/utils/stream-registry.js +0 -33
@@ -1,399 +0,0 @@
1
- import { createMessage, createTask, getActiveAgentForConversation, getFullGraph, getTask, updateTask, } from '@inkeep/agents-core';
2
- import { trace } from '@opentelemetry/api';
3
- import { nanoid } from 'nanoid';
4
- import { A2AClient } from '../a2a/client';
5
- import { executeTransfer, isTransferResponse } from '../a2a/transfer';
6
- import dbClient from '../data/db/dbClient';
7
- import { getLogger } from '../logger';
8
- import { agentInitializingOp, agentReadyOp, agentThinkingOp, completionOp, errorOp, } from '../utils/agent-operations';
9
- import { graphSessionManager } from '../utils/graph-session';
10
- import { MCPStreamHelper } from '../utils/stream-helpers';
11
- import { registerStreamHelper, unregisterStreamHelper } from '../utils/stream-registry';
12
- const logger = getLogger('ExecutionHandler');
13
- export class ExecutionHandler {
14
- // Hardcoded error limit - separate from configurable stopWhen
15
- MAX_ERRORS = 3;
16
- /**
17
- * performs exeuction loop
18
- *
19
- * Do up to limit of MAX_ITERATIONS
20
- *
21
- * 1. lookup active agent for thread
22
- * 2. Send A2A message to selected agent
23
- * 3. Parse A2A message response
24
- * 4. Handle transfer messages (if any)
25
- * 5. Handle completion messages (if any)
26
- * 6. If no valid response or transfer, return error
27
- * @param params
28
- * @returns
29
- */
30
- async execute(params) {
31
- const { executionContext, conversationId, userMessage, initialAgentId, requestId, sseHelper } = params;
32
- const { tenantId, projectId, graphId, apiKey, baseUrl } = executionContext;
33
- // Register streamHelper so agents can access it via requestId
34
- registerStreamHelper(requestId, sseHelper);
35
- // Create GraphSession for this entire message execution using requestId as the session ID
36
- graphSessionManager.createSession(requestId, graphId, tenantId, projectId);
37
- logger.info({ sessionId: requestId, graphId }, 'Created GraphSession for message execution');
38
- // Initialize status updates if configured
39
- let graphConfig = null;
40
- try {
41
- graphConfig = await getFullGraph(dbClient)({ scopes: { tenantId, projectId }, graphId });
42
- if (graphConfig?.statusUpdates && graphConfig.statusUpdates.enabled !== false) {
43
- graphSessionManager.initializeStatusUpdates(requestId, graphConfig.statusUpdates, graphConfig.models?.summarizer);
44
- }
45
- }
46
- catch (error) {
47
- logger.error({
48
- error: error instanceof Error ? error.message : 'Unknown error',
49
- stack: error instanceof Error ? error.stack : undefined,
50
- }, '❌ Failed to initialize status updates, continuing without them');
51
- }
52
- let currentAgentId = initialAgentId;
53
- let iterations = 0;
54
- let errorCount = 0;
55
- let task = null;
56
- let fromAgentId; // Track the agent that executed a transfer
57
- try {
58
- // Send agent initializing and ready operations immediately to ensure UI rendering
59
- await sseHelper.writeOperation(agentInitializingOp(requestId, graphId));
60
- await sseHelper.writeOperation(agentReadyOp(requestId, graphId));
61
- // Send agent thinking operation after ready
62
- await sseHelper.writeOperation(agentThinkingOp('system'));
63
- // Check for existing task first to prevent race conditions
64
- const taskId = `task_${conversationId}-${requestId}`;
65
- const existingTask = await getTask(dbClient)({ id: taskId });
66
- if (existingTask) {
67
- // Task already exists, use it instead of creating a new one
68
- task = existingTask;
69
- logger.info({ taskId, existingTask }, 'Reusing existing task to prevent race condition');
70
- }
71
- else {
72
- // Task creation (data operations removed)
73
- // Create initial task
74
- logger.info({ taskId, currentAgentId, conversationId, requestId }, 'About to create task with streamRequestId');
75
- task = await createTask(dbClient)({
76
- id: taskId,
77
- tenantId,
78
- projectId,
79
- agentId: currentAgentId,
80
- contextId: conversationId,
81
- status: 'pending',
82
- metadata: {
83
- conversation_id: conversationId,
84
- message_id: requestId,
85
- stream_request_id: requestId, // This also serves as the GraphSession ID
86
- created_at: new Date().toISOString(),
87
- updated_at: new Date().toISOString(),
88
- root_agent_id: initialAgentId,
89
- agent_id: currentAgentId,
90
- },
91
- });
92
- logger.info({
93
- taskId,
94
- createdTaskMetadata: Array.isArray(task) ? task[0]?.metadata : task?.metadata,
95
- }, 'Task created with metadata');
96
- }
97
- // Debug logging for execution handler (structured logging only)
98
- logger.debug({
99
- timestamp: new Date().toISOString(),
100
- executionType: 'create_initial_task',
101
- conversationId,
102
- requestId,
103
- currentAgentId,
104
- taskId: Array.isArray(task) ? task[0]?.id : task?.id,
105
- userMessage: userMessage.substring(0, 100), // Truncate for security
106
- }, 'ExecutionHandler: Initial task created');
107
- // If createTask returns an array, get the first element
108
- if (Array.isArray(task))
109
- task = task[0];
110
- let currentMessage = userMessage;
111
- // Get transfer limit from graph configuration
112
- const maxTransfers = graphConfig?.stopWhen?.transferCountIs ?? 10;
113
- // Start execution loop
114
- while (iterations < maxTransfers) {
115
- iterations++;
116
- // Stream iteration start
117
- // Iteration start (data operations removed)
118
- logger.info({ iterations, currentAgentId, graphId, conversationId, fromAgentId }, `Execution loop iteration ${iterations} with agent ${currentAgentId}, transfer from: ${fromAgentId || 'none'}`);
119
- // Step 1: Determine which agent should handle the message
120
- const activeAgent = await getActiveAgentForConversation(dbClient)({
121
- scopes: { tenantId, projectId },
122
- conversationId,
123
- });
124
- logger.info({ activeAgent }, 'activeAgent');
125
- if (activeAgent && activeAgent.activeAgentId !== currentAgentId) {
126
- currentAgentId = activeAgent.activeAgentId;
127
- logger.info({ currentAgentId }, `Updated current agent to: ${currentAgentId}`);
128
- // Stream agent selection update
129
- // Agent selection (data operations removed)
130
- }
131
- // Step 2: Send A2A message to selected agent
132
- const agentBaseUrl = `${baseUrl}/agents`;
133
- const a2aClient = new A2AClient(agentBaseUrl, {
134
- headers: {
135
- Authorization: `Bearer ${apiKey}`,
136
- 'x-inkeep-tenant-id': tenantId,
137
- 'x-inkeep-project-id': projectId,
138
- 'x-inkeep-graph-id': graphId,
139
- 'x-inkeep-agent-id': currentAgentId,
140
- },
141
- });
142
- // Check if agent supports streaming
143
- // const agentCard = await a2aClient.getAgentCard();
144
- let messageResponse = null;
145
- // Build message metadata - include fromAgentId only if this is a transfer
146
- const messageMetadata = {
147
- stream_request_id: requestId, // This also serves as the GraphSession ID
148
- };
149
- if (fromAgentId) {
150
- messageMetadata.fromAgentId = fromAgentId;
151
- }
152
- messageResponse = await a2aClient.sendMessage({
153
- message: {
154
- role: 'user',
155
- parts: [
156
- {
157
- kind: 'text',
158
- text: currentMessage,
159
- },
160
- ],
161
- messageId: `${requestId}-iter-${iterations}`,
162
- kind: 'message',
163
- contextId: conversationId,
164
- metadata: messageMetadata,
165
- },
166
- configuration: {
167
- acceptedOutputModes: ['text', 'text/plain'],
168
- blocking: false,
169
- },
170
- });
171
- // Step 3: Parse A2A message response
172
- if (!messageResponse?.result) {
173
- errorCount++;
174
- logger.error({ currentAgentId, iterations, errorCount }, `No response from agent ${currentAgentId} on iteration ${iterations} (error ${errorCount}/${this.MAX_ERRORS})`);
175
- // Check if we've hit the error limit
176
- if (errorCount >= this.MAX_ERRORS) {
177
- const errorMessage = `Maximum error limit (${this.MAX_ERRORS}) reached`;
178
- logger.error({ maxErrors: this.MAX_ERRORS, errorCount }, errorMessage);
179
- await sseHelper.writeError(errorMessage);
180
- await sseHelper.writeOperation(errorOp(errorMessage, currentAgentId || 'system'));
181
- if (task) {
182
- await updateTask(dbClient)({
183
- taskId: task.id,
184
- data: {
185
- status: 'failed',
186
- metadata: {
187
- ...task.metadata,
188
- failed_at: new Date().toISOString(),
189
- error: errorMessage,
190
- },
191
- },
192
- });
193
- }
194
- graphSessionManager.endSession(requestId);
195
- unregisterStreamHelper(requestId);
196
- return { success: false, error: errorMessage, iterations };
197
- }
198
- continue;
199
- }
200
- // Step 4: Handle transfer messages
201
- if (isTransferResponse(messageResponse.result)) {
202
- const transferResponse = messageResponse.result;
203
- // Extract targetAgentId from transfer response artifacts
204
- const targetAgentId = transferResponse.artifacts?.[0]?.parts?.[0]?.data
205
- ?.targetAgentId;
206
- const transferReason = transferResponse.artifacts?.[0]?.parts?.[1]?.text;
207
- // Transfer operation (data operations removed)
208
- logger.info({ targetAgentId, transferReason }, 'transfer response');
209
- // Update the current message to the transfer reason so as not to duplicate the user message on every transfer
210
- // including the xml because the fromAgent does not always directly adress the toAgent in its text
211
- currentMessage = `<transfer_context> ${transferReason} </transfer_context>`;
212
- const { success, targetAgentId: newAgentId } = await executeTransfer({
213
- projectId,
214
- tenantId,
215
- threadId: conversationId,
216
- targetAgentId,
217
- });
218
- if (success) {
219
- // Set fromAgentId to track which agent executed this transfer
220
- fromAgentId = currentAgentId;
221
- currentAgentId = newAgentId;
222
- logger.info({
223
- transferFrom: fromAgentId,
224
- transferTo: currentAgentId,
225
- reason: transferReason,
226
- }, 'Transfer executed, tracking fromAgentId for next iteration');
227
- }
228
- // Continue to next iteration with new agent
229
- continue;
230
- }
231
- const responseParts = messageResponse.result.artifacts?.flatMap((artifact) => artifact.parts || []) || [];
232
- if (responseParts && responseParts.length > 0) {
233
- // Log graph session data after completion response
234
- const graphSessionData = graphSessionManager.getSession(requestId);
235
- if (graphSessionData) {
236
- const sessionSummary = graphSessionData.getSummary();
237
- logger.info(sessionSummary, 'GraphSession data after completion');
238
- }
239
- // Process response parts for database storage and A2A protocol
240
- // NOTE: Do NOT stream content here - agents handle their own streaming
241
- let textContent = '';
242
- for (const part of responseParts) {
243
- const isTextPart = (part.kind === 'text' || part.type === 'text') && part.text;
244
- if (isTextPart) {
245
- textContent += part.text;
246
- }
247
- // Data parts are already processed by the agent's streaming logic
248
- }
249
- // Stream completion operation
250
- // Completion operation (data operations removed)
251
- const activeSpan = trace.getActiveSpan();
252
- if (activeSpan) {
253
- activeSpan.setAttributes({
254
- 'ai.response.content': textContent || 'No response content',
255
- 'ai.response.timestamp': new Date().toISOString(),
256
- 'ai.agent.name': currentAgentId,
257
- });
258
- }
259
- // Store the agent response in the database with both text and parts
260
- await createMessage(dbClient)({
261
- id: nanoid(),
262
- tenantId,
263
- projectId,
264
- conversationId,
265
- role: 'agent',
266
- content: {
267
- text: textContent || undefined,
268
- parts: responseParts.map((part) => ({
269
- type: part.kind === 'text' ? 'text' : 'data',
270
- text: part.kind === 'text' ? part.text : undefined,
271
- data: part.kind === 'data' ? JSON.stringify(part.data) : undefined,
272
- })),
273
- },
274
- visibility: 'user-facing',
275
- messageType: 'chat',
276
- agentId: currentAgentId,
277
- fromAgentId: currentAgentId,
278
- taskId: task.id,
279
- });
280
- // Mark task as completed
281
- const updateTaskStart = Date.now();
282
- await updateTask(dbClient)({
283
- taskId: task.id,
284
- data: {
285
- status: 'completed',
286
- metadata: {
287
- ...task.metadata,
288
- completed_at: new Date().toISOString(),
289
- response: {
290
- text: textContent,
291
- parts: responseParts,
292
- hasText: !!textContent,
293
- hasData: responseParts.some((p) => p.kind === 'data'),
294
- },
295
- },
296
- },
297
- });
298
- const updateTaskEnd = Date.now();
299
- logger.info({ duration: updateTaskEnd - updateTaskStart }, 'Completed updateTask operation');
300
- // Send completion data operation before ending session
301
- await sseHelper.writeOperation(completionOp(currentAgentId, iterations));
302
- // End the GraphSession and clean up resources
303
- logger.info('Ending GraphSession and cleaning up');
304
- graphSessionManager.endSession(requestId);
305
- // Clean up streamHelper
306
- logger.info('Cleaning up streamHelper');
307
- unregisterStreamHelper(requestId);
308
- // Extract captured response if using MCPStreamHelper
309
- let response;
310
- if (sseHelper instanceof MCPStreamHelper) {
311
- const captured = sseHelper.getCapturedResponse();
312
- response = captured.text || 'No response content';
313
- }
314
- logger.info('ExecutionHandler returning success');
315
- return { success: true, iterations, response };
316
- }
317
- // If we get here, we didn't get a valid response or transfer
318
- errorCount++;
319
- logger.warn({ iterations, errorCount }, `No valid response or transfer on iteration ${iterations} (error ${errorCount}/${this.MAX_ERRORS})`);
320
- // Check if we've hit the error limit
321
- if (errorCount >= this.MAX_ERRORS) {
322
- const errorMessage = `Maximum error limit (${this.MAX_ERRORS}) reached`;
323
- logger.error({ maxErrors: this.MAX_ERRORS, errorCount }, errorMessage);
324
- await sseHelper.writeError(errorMessage);
325
- await sseHelper.writeOperation(errorOp(errorMessage, currentAgentId || 'system'));
326
- if (task) {
327
- await updateTask(dbClient)({
328
- taskId: task.id,
329
- data: {
330
- status: 'failed',
331
- metadata: {
332
- ...task.metadata,
333
- failed_at: new Date().toISOString(),
334
- error: errorMessage,
335
- },
336
- },
337
- });
338
- }
339
- graphSessionManager.endSession(requestId);
340
- unregisterStreamHelper(requestId);
341
- return { success: false, error: errorMessage, iterations };
342
- }
343
- }
344
- // Max transfers reached
345
- const errorMessage = `Maximum transfer limit (${maxTransfers}) reached without completion`;
346
- logger.error({ maxTransfers, iterations }, errorMessage);
347
- // Stream error operation
348
- // Error operation (data operations removed)
349
- await sseHelper.writeError(errorMessage);
350
- // Send error operation for max iterations reached
351
- await sseHelper.writeOperation(errorOp(errorMessage, currentAgentId || 'system'));
352
- // Mark task as failed
353
- if (task) {
354
- await updateTask(dbClient)({
355
- taskId: task.id,
356
- data: {
357
- status: 'failed',
358
- metadata: {
359
- ...task.metadata,
360
- failed_at: new Date().toISOString(),
361
- error: errorMessage,
362
- },
363
- },
364
- });
365
- }
366
- // Clean up GraphSession and streamHelper on error
367
- graphSessionManager.endSession(requestId);
368
- unregisterStreamHelper(requestId);
369
- return { success: false, error: errorMessage, iterations };
370
- }
371
- catch (error) {
372
- logger.error({ error }, 'Error in execution handler');
373
- const errorMessage = error instanceof Error ? error.message : 'Unknown execution error';
374
- // Stream error operation
375
- // Error operation (data operations removed)
376
- await sseHelper.writeError(`Execution error: ${errorMessage}`);
377
- // Send error operation for execution exception
378
- await sseHelper.writeOperation(errorOp(errorMessage, currentAgentId || 'system'));
379
- // Mark task as failed
380
- if (task) {
381
- await updateTask(dbClient)({
382
- taskId: task.id,
383
- data: {
384
- status: 'failed',
385
- metadata: {
386
- ...task.metadata,
387
- failed_at: new Date().toISOString(),
388
- error: errorMessage,
389
- },
390
- },
391
- });
392
- }
393
- // Clean up GraphSession and streamHelper on exception
394
- graphSessionManager.endSession(requestId);
395
- unregisterStreamHelper(requestId);
396
- return { success: false, error: errorMessage, iterations };
397
- }
398
- }
399
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,mBAAmB,CAAC;AAC3B,OAAO,EACL,KAAK,eAAe,EACpB,uBAAuB,EAEvB,KAAK,YAAY,EAClB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,OAAO,CAAC;AAiB5C,QAAA,MAAM,GAAG;;;;;;WAAsD,CAAC;AAGhE,eAAe,GAAG,CAAC;AAGnB,OAAO,EAAE,mBAAmB,EAAE,CAAC;AAG/B,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE;IAC1C,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAC;CACtC;;;;;;YAMA"}
@@ -1,13 +0,0 @@
1
- import { NodeSDK } from '@opentelemetry/sdk-node';
2
- declare class FanOutSpanProcessor {
3
- private inner;
4
- constructor(inner: any[]);
5
- onStart(span: any, parent: any): void;
6
- onEnd(span: any): void;
7
- forceFlush(): Promise<void>;
8
- shutdown(): Promise<void>;
9
- }
10
- declare const spanProcessor: FanOutSpanProcessor;
11
- export declare const sdk: NodeSDK;
12
- export { spanProcessor };
13
- //# sourceMappingURL=instrumentation.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../src/instrumentation.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAOlD,cAAM,mBAAmB;IACX,OAAO,CAAC,KAAK;gBAAL,KAAK,EAAE,GAAG,EAAE;IAChC,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG;IAG9B,KAAK,CAAC,IAAI,EAAE,GAAG;IAGf,UAAU;IAGV,QAAQ;CAGT;AAED,QAAA,MAAM,aAAa,qBAQjB,CAAC;AAEH,eAAO,MAAM,GAAG,SAyBd,CAAC;AAGH,OAAO,EAAE,aAAa,EAAE,CAAC"}
@@ -1,66 +0,0 @@
1
- import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';
2
- import { ALLOW_ALL_BAGGAGE_KEYS, BaggageSpanProcessor, } from '@opentelemetry/baggage-span-processor';
3
- import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-proto';
4
- import { NodeSDK } from '@opentelemetry/sdk-node';
5
- import { BatchSpanProcessor } from '@opentelemetry/sdk-trace-node';
6
- const otlpUrl = process.env.OTEL_EXPORTER_OTLP_ENDPOINT || 'http://localhost:14318/v1/traces';
7
- const otlpExporter = new OTLPTraceExporter({ url: otlpUrl });
8
- // Minimal fan-out so NodeSDK can accept ONE spanProcessor
9
- class FanOutSpanProcessor {
10
- inner;
11
- constructor(inner) {
12
- this.inner = inner;
13
- }
14
- onStart(span, parent) {
15
- this.inner.forEach((p) => p.onStart(span, parent));
16
- }
17
- onEnd(span) {
18
- this.inner.forEach((p) => p.onEnd(span));
19
- }
20
- forceFlush() {
21
- return Promise.all(this.inner.map((p) => p.forceFlush?.())).then(() => { });
22
- }
23
- shutdown() {
24
- return Promise.all(this.inner.map((p) => p.shutdown?.())).then(() => { });
25
- }
26
- }
27
- const spanProcessor = new FanOutSpanProcessor([
28
- new BaggageSpanProcessor(ALLOW_ALL_BAGGAGE_KEYS),
29
- new BatchSpanProcessor(otlpExporter, {
30
- maxExportBatchSize: 1, // Send immediately (vs 512)
31
- scheduledDelayMillis: 100, // 100ms delay (vs 5000ms)
32
- exportTimeoutMillis: 5000, // 5s timeout (vs 30s)
33
- maxQueueSize: 512, // Smaller queue
34
- }),
35
- ]);
36
- export const sdk = new NodeSDK({
37
- serviceName: 'inkeep-chat',
38
- spanProcessor,
39
- instrumentations: [
40
- getNodeAutoInstrumentations({
41
- '@opentelemetry/instrumentation-http': {
42
- enabled: true,
43
- requestHook: (span, request) => {
44
- const url = request?.url ?? request?.path;
45
- if (!url)
46
- return;
47
- const u = new URL(url, 'http://localhost');
48
- span.updateName(`${request?.method || 'UNKNOWN'} ${u.pathname}`);
49
- },
50
- },
51
- '@opentelemetry/instrumentation-undici': {
52
- requestHook: (span) => {
53
- const method = span.attributes?.['http.request.method'];
54
- const host = span.attributes?.['server.address'];
55
- const path = span.attributes?.['url.path'];
56
- if (method && path)
57
- span.updateName(host ? `${method} ${host}${path}` : `${method} ${path}`);
58
- },
59
- },
60
- }),
61
- ],
62
- });
63
- // Export the span processor for force flush access
64
- export { spanProcessor };
65
- // SDK starts automatically when imported
66
- sdk.start();
package/dist/logger.d.ts DELETED
@@ -1,4 +0,0 @@
1
- import type { Next } from 'hono';
2
- export declare function getLogger(name?: string): import("pino").Logger<never, boolean>;
3
- export declare function withRequestContext(reqId: string, fn: Next): Promise<void>;
4
- //# sourceMappingURL=logger.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAwBjC,wBAAgB,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,yCAOtC;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,iBAEzD"}
package/dist/logger.js DELETED
@@ -1,32 +0,0 @@
1
- import { AsyncLocalStorage } from 'node:async_hooks';
2
- import { pino } from 'pino';
3
- // import { createGcpLoggingPinoConfig } from '@google-cloud/pino-logging-gcp-config';
4
- import { env } from './env';
5
- const logger = pino({
6
- level: env.LOG_LEVEL,
7
- serializers: {
8
- obj: (value) => ({ ...value }),
9
- },
10
- redact: ['req.headers.authorization', 'req.headers["x-inkeep-admin-authentication"]'],
11
- transport: {
12
- target: 'pino-pretty',
13
- options: {
14
- sync: true,
15
- destination: 1, // stdout
16
- colorize: true,
17
- translateTime: 'SYS:standard',
18
- },
19
- },
20
- });
21
- const asyncLocalStorage = new AsyncLocalStorage();
22
- export function getLogger(name) {
23
- const store = asyncLocalStorage.getStore();
24
- const reqId = store?.get('requestId') || undefined;
25
- if (!reqId) {
26
- return logger.child({ name });
27
- }
28
- return logger.child({ reqId, name });
29
- }
30
- export function withRequestContext(reqId, fn) {
31
- return asyncLocalStorage.run(new Map([['requestId', reqId]]), fn);
32
- }
@@ -1,22 +0,0 @@
1
- import { type ExecutionContext } from '@inkeep/agents-core';
2
- /**
3
- * Middleware to authenticate API requests using Bearer token authentication
4
- * First checks if token matches INKEEP_AGENTS_RUN_BYPASS_SECRET, then falls back to API key validation
5
- * Extracts and validates API keys, then adds execution context to the request
6
- */
7
- export declare const apiKeyAuth: () => import("hono").MiddlewareHandler<{
8
- Variables: {
9
- executionContext: ExecutionContext;
10
- };
11
- }, string, {}>;
12
- export declare const extractContextFromApiKey: (apiKey: string) => Promise<ExecutionContext>;
13
- /**
14
- * Helper middleware for endpoints that optionally support API key authentication
15
- * If no auth header is present, it continues without setting the executionContext
16
- */
17
- export declare const optionalAuth: () => import("hono").MiddlewareHandler<{
18
- Variables: {
19
- executionContext?: ExecutionContext;
20
- };
21
- }, string, {}>;
22
- //# sourceMappingURL=api-key-auth.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"api-key-auth.d.ts","sourceRoot":"","sources":["../../src/middleware/api-key-auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,gBAAgB,EAAmC,MAAM,qBAAqB,CAAC;AAQ7F;;;;GAIG;AACH,eAAO,MAAM,UAAU;eAER;QACT,gBAAgB,EAAE,gBAAgB,CAAC;KACpC;cAoHD,CAAC;AAEL,eAAO,MAAM,wBAAwB,GAAU,QAAQ,MAAM,8BAgB5D,CAAC;AACF;;;GAGG;AACH,eAAO,MAAM,YAAY;eAEV;QACT,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;KACrC;cAYD,CAAC"}