@inkeep/agents-run-api 0.1.1 → 0.1.3
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 +22 -17
- package/README.md +1 -1
- package/dist/AgentExecutionServer.d.ts +6 -1
- package/dist/AgentExecutionServer.d.ts.map +1 -1
- package/dist/AgentExecutionServer.js +10 -1
- package/dist/__tests__/setup.d.ts.map +1 -1
- package/dist/__tests__/setup.js +32 -2
- package/dist/__tests__/utils/testProject.js +1 -1
- package/dist/__tests__/utils/testRequest.js +1 -1
- package/dist/__tests__/utils/testTenant.d.ts +3 -3
- package/dist/__tests__/utils/testTenant.js +3 -3
- package/dist/a2a/client.d.ts.map +1 -1
- package/dist/a2a/client.js +1 -1
- package/dist/a2a/handlers.d.ts +1 -1
- package/dist/a2a/handlers.d.ts.map +1 -1
- package/dist/a2a/handlers.js +3 -4
- package/dist/a2a/transfer.d.ts +1 -1
- package/dist/a2a/transfer.d.ts.map +1 -1
- package/dist/a2a/transfer.js +2 -2
- package/dist/agents/Agent.d.ts +4 -4
- package/dist/agents/Agent.d.ts.map +1 -1
- package/dist/agents/Agent.js +31 -26
- package/dist/agents/ModelFactory.d.ts.map +1 -1
- package/dist/agents/ModelFactory.js +3 -3
- package/dist/agents/SystemPromptBuilder.d.ts +1 -1
- package/dist/agents/SystemPromptBuilder.d.ts.map +1 -1
- package/dist/agents/SystemPromptBuilder.js +2 -2
- package/dist/agents/ToolSessionManager.js +1 -1
- package/dist/agents/artifactTools.d.ts.map +1 -1
- package/dist/agents/artifactTools.js +4 -4
- package/dist/agents/generateTaskHandler.d.ts +3 -3
- package/dist/agents/generateTaskHandler.d.ts.map +1 -1
- package/dist/agents/generateTaskHandler.js +6 -6
- package/dist/agents/relationTools.d.ts +4 -2
- package/dist/agents/relationTools.d.ts.map +1 -1
- package/dist/agents/relationTools.js +13 -12
- package/dist/agents/types.d.ts +1 -1
- package/dist/agents/types.d.ts.map +1 -1
- package/dist/agents/versions/V1Config.d.ts +1 -1
- package/dist/agents/versions/V1Config.d.ts.map +1 -1
- package/dist/app.d.ts +11 -3
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +195 -173
- package/dist/data/agentGraph.d.ts +1 -1
- package/dist/data/agentGraph.d.ts.map +1 -1
- package/dist/data/agentGraph.js +2 -2
- package/dist/data/agents.d.ts +3 -3
- package/dist/data/agents.d.ts.map +1 -1
- package/dist/data/agents.js +11 -6
- package/dist/data/conversations.d.ts +1 -1
- package/dist/data/conversations.d.ts.map +1 -1
- package/dist/data/conversations.js +2 -2
- package/dist/data/db/clean.js +3 -3
- package/dist/data/db/dbClient.js +1 -1
- package/dist/env.d.ts +7 -5
- package/dist/env.d.ts.map +1 -1
- package/dist/env.js +1 -0
- package/dist/handlers/executionHandler.d.ts +1 -1
- package/dist/handlers/executionHandler.d.ts.map +1 -1
- package/dist/handlers/executionHandler.js +10 -13
- package/dist/index.d.ts +22 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -37
- package/dist/instrumentation.js +3 -3
- package/dist/logger.js +1 -1
- package/dist/middleware/api-key-auth.d.ts.map +1 -1
- package/dist/middleware/api-key-auth.js +4 -4
- package/dist/middleware/index.d.ts +1 -1
- package/dist/middleware/index.d.ts.map +1 -1
- package/dist/middleware/index.js +1 -1
- package/dist/openapi.js +1 -1
- package/dist/routes/agents.d.ts +7 -1
- package/dist/routes/agents.d.ts.map +1 -1
- package/dist/routes/agents.js +12 -9
- package/dist/routes/chat.d.ts +7 -1
- package/dist/routes/chat.d.ts.map +1 -1
- package/dist/routes/chat.js +7 -8
- package/dist/routes/chatDataStream.d.ts +7 -1
- package/dist/routes/chatDataStream.d.ts.map +1 -1
- package/dist/routes/chatDataStream.js +7 -7
- package/dist/routes/mcp.d.ts +7 -1
- package/dist/routes/mcp.d.ts.map +1 -1
- package/dist/routes/mcp.js +15 -15
- package/dist/server.d.ts +5 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +61 -0
- package/dist/tracer.d.ts.map +1 -1
- package/dist/tracer.js +11 -1
- package/dist/utils/agent-operations.d.ts +14 -1
- package/dist/utils/agent-operations.d.ts.map +1 -1
- package/dist/utils/agent-operations.js +11 -0
- package/dist/utils/artifact-component-schema.d.ts +1 -1
- package/dist/utils/artifact-component-schema.d.ts.map +1 -1
- package/dist/utils/artifact-component-schema.js +4 -4
- package/dist/utils/artifact-parser.js +2 -2
- package/dist/utils/cleanup.js +1 -1
- package/dist/utils/data-component-schema.js +1 -1
- package/dist/utils/graph-session.d.ts +1 -1
- package/dist/utils/graph-session.d.ts.map +1 -1
- package/dist/utils/graph-session.js +22 -15
- package/dist/utils/incremental-stream-parser.d.ts +2 -2
- package/dist/utils/incremental-stream-parser.d.ts.map +1 -1
- package/dist/utils/incremental-stream-parser.js +5 -3
- package/dist/utils/response-formatter.d.ts.map +1 -1
- package/dist/utils/response-formatter.js +3 -3
- package/dist/utils/stream-helpers.d.ts +13 -1
- package/dist/utils/stream-helpers.d.ts.map +1 -1
- package/dist/utils/stream-helpers.js +111 -30
- package/dist/utils/stream-registry.d.ts +1 -1
- package/dist/utils/stream-registry.d.ts.map +1 -1
- package/package.json +19 -12
- package/templates/v1/artifact.xml +7 -0
- package/templates/v1/data-component.xml +9 -0
- package/templates/v1/system-prompt.xml +52 -0
- package/templates/v1/thinking-preparation.xml +34 -0
- package/templates/v1/tool.xml +12 -0
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { type CredentialStoreRegistry } from '@inkeep/agents-core';
|
|
2
|
+
import type { AgentConfig, DelegateRelation } from './Agent';
|
|
2
3
|
export declare const createTransferToAgentTool: ({ transferConfig, callingAgentId, agent, streamRequestId, }: {
|
|
3
4
|
transferConfig: AgentConfig;
|
|
4
5
|
callingAgentId: string;
|
|
@@ -9,7 +10,7 @@ export declare const createTransferToAgentTool: ({ transferConfig, callingAgentI
|
|
|
9
10
|
target: string;
|
|
10
11
|
fromAgentId: string;
|
|
11
12
|
}>;
|
|
12
|
-
export declare function createDelegateToAgentTool({ delegateConfig, callingAgentId, tenantId, projectId, graphId, contextId, metadata, sessionId, agent, }: {
|
|
13
|
+
export declare function createDelegateToAgentTool({ delegateConfig, callingAgentId, tenantId, projectId, graphId, contextId, metadata, sessionId, agent, credentialStoreRegistry, }: {
|
|
13
14
|
delegateConfig: DelegateRelation;
|
|
14
15
|
callingAgentId: string;
|
|
15
16
|
tenantId: string;
|
|
@@ -24,6 +25,7 @@ export declare function createDelegateToAgentTool({ delegateConfig, callingAgent
|
|
|
24
25
|
};
|
|
25
26
|
sessionId?: string;
|
|
26
27
|
agent: any;
|
|
28
|
+
credentialStoreRegistry?: CredentialStoreRegistry;
|
|
27
29
|
}): import("ai").Tool<{
|
|
28
30
|
message: string;
|
|
29
31
|
}, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relationTools.d.ts","sourceRoot":"","sources":["../../src/agents/relationTools.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"relationTools.d.ts","sourceRoot":"","sources":["../../src/agents/relationTools.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,uBAAuB,EAK7B,MAAM,qBAAqB,CAAC;AAW7B,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AA2B7D,eAAO,MAAM,yBAAyB,GAAI,6DAKvC;IACD,cAAc,EAAE,WAAW,CAAC;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,GAAG,CAAC;IACX,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;;;;EAsCA,CAAC;AAEF,wBAAgB,yBAAyB,CAAC,EACxC,cAAc,EACd,cAAc,EACd,QAAQ,EACR,SAAS,EACT,OAAO,EACP,SAAS,EACT,QAAQ,EACR,SAAS,EACT,KAAK,EACL,uBAAuB,GACxB,EAAE;IACD,cAAc,EAAE,gBAAgB,CAAC;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE;QACR,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,EAAE,MAAM,CAAC;QACjB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,GAAG,CAAC;IACX,uBAAuB,CAAC,EAAE,uBAAuB,CAAC;CACnD;;;;;GAsNA"}
|
|
@@ -1,15 +1,14 @@
|
|
|
1
|
+
import { ContextResolver, CredentialStuffer, createMessage, getCredentialReference, getExternalAgent, } from '@inkeep/agents-core';
|
|
1
2
|
import { trace } from '@opentelemetry/api';
|
|
2
3
|
import { tool } from 'ai';
|
|
3
4
|
import { nanoid } from 'nanoid';
|
|
4
5
|
import z from 'zod';
|
|
5
|
-
import { A2AClient } from '../a2a/client
|
|
6
|
-
import {
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import { graphSessionManager } from '../utils/graph-session.js';
|
|
12
|
-
import { toolSessionManager } from './ToolSessionManager.js';
|
|
6
|
+
import { A2AClient } from '../a2a/client';
|
|
7
|
+
import { saveA2AMessageResponse } from '../data/conversations';
|
|
8
|
+
import dbClient from '../data/db/dbClient';
|
|
9
|
+
import { getLogger } from '../logger';
|
|
10
|
+
import { graphSessionManager } from '../utils/graph-session';
|
|
11
|
+
import { toolSessionManager } from './ToolSessionManager';
|
|
13
12
|
const logger = getLogger('relationships Tools');
|
|
14
13
|
const generateTransferToolDescription = (config) => {
|
|
15
14
|
return `Hand off the conversation to agent ${config.id}.
|
|
@@ -64,7 +63,7 @@ export const createTransferToAgentTool = ({ transferConfig, callingAgentId, agen
|
|
|
64
63
|
},
|
|
65
64
|
});
|
|
66
65
|
};
|
|
67
|
-
export function createDelegateToAgentTool({ delegateConfig, callingAgentId, tenantId, projectId, graphId, contextId, metadata, sessionId, agent, }) {
|
|
66
|
+
export function createDelegateToAgentTool({ delegateConfig, callingAgentId, tenantId, projectId, graphId, contextId, metadata, sessionId, agent, credentialStoreRegistry, }) {
|
|
68
67
|
return tool({
|
|
69
68
|
description: generateDelegateToolDescription(delegateConfig.config),
|
|
70
69
|
inputSchema: z.object({ message: z.string() }),
|
|
@@ -104,9 +103,11 @@ export function createDelegateToAgentTool({ delegateConfig, callingAgentId, tena
|
|
|
104
103
|
agentId: delegateConfig.config.id,
|
|
105
104
|
});
|
|
106
105
|
// If the external agent has a credential reference ID or headers, resolve them
|
|
107
|
-
if (externalAgent &&
|
|
108
|
-
|
|
109
|
-
|
|
106
|
+
if (externalAgent &&
|
|
107
|
+
(externalAgent.credentialReferenceId || externalAgent.headers) &&
|
|
108
|
+
credentialStoreRegistry) {
|
|
109
|
+
const contextResolver = new ContextResolver(tenantId, projectId, dbClient, credentialStoreRegistry);
|
|
110
|
+
const credentialStuffer = new CredentialStuffer(credentialStoreRegistry, contextResolver);
|
|
110
111
|
const credentialContext = {
|
|
111
112
|
tenantId,
|
|
112
113
|
projectId,
|
package/dist/agents/types.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Artifact, ArtifactComponentApiInsert, DataComponentApiInsert } from '@inkeep/agents-core';
|
|
2
2
|
export interface VersionConfig<TConfig> {
|
|
3
3
|
templateFiles: string[];
|
|
4
4
|
assemble(templates: Map<string, string>, config: TConfig): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/agents/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/agents/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EACR,0BAA0B,EAC1B,sBAAsB,EACvB,MAAM,qBAAqB,CAAC;AAG7B,MAAM,WAAW,aAAa,CAAC,OAAO;IACpC,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC;CACnE;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,cAAc,EAAE,sBAAsB,EAAE,CAAC;IACzC,kBAAkB,CAAC,EAAE,0BAA0B,EAAE,CAAC;IAClD,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { McpTool } from '@inkeep/agents-core';
|
|
2
|
-
import type { SystemPromptV1, ToolData, VersionConfig } from '../types
|
|
2
|
+
import type { SystemPromptV1, ToolData, VersionConfig } from '../types';
|
|
3
3
|
export declare class V1Config implements VersionConfig<SystemPromptV1> {
|
|
4
4
|
readonly templateFiles: string[];
|
|
5
5
|
static convertMcpToolsToToolData(mcpTools: McpTool[] | undefined): ToolData[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"V1Config.d.ts","sourceRoot":"","sources":["../../../src/agents/versions/V1Config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"V1Config.d.ts","sourceRoot":"","sources":["../../../src/agents/versions/V1Config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAoC,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACrF,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAExE,qBAAa,QAAS,YAAW,aAAa,CAAC,cAAc,CAAC;IAC5D,QAAQ,CAAC,aAAa,WAMpB;IAEF,MAAM,CAAC,yBAAyB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,SAAS,GAAG,QAAQ,EAAE;IAoB7E,OAAO,CAAC,eAAe;IAOvB,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,cAAc,GAAG,MAAM;IAwDxE,OAAO,CAAC,2BAA2B;IAWnC,OAAO,CAAC,kCAAkC;IAgB1C,OAAO,CAAC,4BAA4B;IAQpC,OAAO,CAAC,8BAA8B;IAQtC,OAAO,CAAC,2BAA2B;IAqEnC,OAAO,CAAC,wBAAwB;IA4BhC,OAAO,CAAC,mBAAmB;IAwB3B,OAAO,CAAC,oBAAoB;IAW5B,OAAO,CAAC,eAAe;IA0BvB,OAAO,CAAC,6BAA6B;IAiCrC,OAAO,CAAC,wBAAwB;IAyBhC,OAAO,CAAC,qBAAqB;CAqB9B"}
|
package/dist/app.d.ts
CHANGED
|
@@ -1,4 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { OpenAPIHono } from '@hono/zod-openapi';
|
|
2
|
+
import { type CredentialStoreRegistry, type ExecutionContext, type ServerConfig } from '@inkeep/agents-core';
|
|
3
|
+
type AppVariables = {
|
|
4
|
+
executionContext: ExecutionContext;
|
|
5
|
+
serverConfig: ServerConfig;
|
|
6
|
+
credentialStores: CredentialStoreRegistry;
|
|
7
|
+
};
|
|
8
|
+
declare function createExecutionHono(serverConfig: ServerConfig, credentialStores: CredentialStoreRegistry): OpenAPIHono<{
|
|
9
|
+
Variables: AppVariables;
|
|
10
|
+
}, {}, "/">;
|
|
11
|
+
export { createExecutionHono };
|
|
4
12
|
//# sourceMappingURL=app.d.ts.map
|
package/dist/app.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,EAErB,KAAK,YAAY,EAClB,MAAM,qBAAqB,CAAC;AAgB7B,KAAK,YAAY,GAAG;IAClB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,YAAY,EAAE,YAAY,CAAC;IAC3B,gBAAgB,EAAE,uBAAuB,CAAC;CAC3C,CAAC;AAEF,iBAAS,mBAAmB,CAC1B,YAAY,EAAE,YAAY,EAC1B,gBAAgB,EAAE,uBAAuB;eAEA,YAAY;YA4OtD;AAED,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
|
package/dist/app.js
CHANGED
|
@@ -1,194 +1,216 @@
|
|
|
1
|
-
import { createRoute } from '@hono/zod-openapi';
|
|
2
|
-
import {
|
|
1
|
+
import { createRoute, OpenAPIHono } from '@hono/zod-openapi';
|
|
2
|
+
import { handleApiError, } from '@inkeep/agents-core';
|
|
3
3
|
import { context as otelContext, propagation } from '@opentelemetry/api';
|
|
4
4
|
import { cors } from 'hono/cors';
|
|
5
5
|
import { HTTPException } from 'hono/http-exception';
|
|
6
6
|
import { requestId } from 'hono/request-id';
|
|
7
7
|
import { pinoLogger } from 'hono-pino';
|
|
8
|
-
import {
|
|
9
|
-
import { getLogger } from './logger
|
|
10
|
-
import { apiKeyAuth } from './middleware/api-key-auth
|
|
11
|
-
import { setupOpenAPIRoutes } from './openapi
|
|
12
|
-
import agentRoutes from './routes/agents
|
|
13
|
-
import chatRoutes from './routes/chat
|
|
14
|
-
import chatDataRoutes from './routes/chatDataStream
|
|
15
|
-
import mcpRoutes from './routes/mcp
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
bag = propagation.createBaggage();
|
|
25
|
-
}
|
|
26
|
-
bag = bag.setEntry('request.id', { value: String(reqId ?? 'unknown') });
|
|
27
|
-
const ctxWithBag = propagation.setBaggage(otelContext.active(), bag);
|
|
28
|
-
return otelContext.with(ctxWithBag, () => next());
|
|
29
|
-
});
|
|
30
|
-
// Baggage middleware for execution API - extracts context from API key authentication
|
|
31
|
-
app.use('*', async (c, next) => {
|
|
32
|
-
// Get the API key context if available (set by auth middleware)
|
|
33
|
-
const executionContext = c.get('executionContext');
|
|
34
|
-
if (!executionContext) {
|
|
35
|
-
// No API key context, skip baggage setup
|
|
8
|
+
import { pino } from 'pino';
|
|
9
|
+
import { getLogger } from './logger';
|
|
10
|
+
import { apiKeyAuth } from './middleware/api-key-auth';
|
|
11
|
+
import { setupOpenAPIRoutes } from './openapi';
|
|
12
|
+
import agentRoutes from './routes/agents';
|
|
13
|
+
import chatRoutes from './routes/chat';
|
|
14
|
+
import chatDataRoutes from './routes/chatDataStream';
|
|
15
|
+
import mcpRoutes from './routes/mcp';
|
|
16
|
+
function createExecutionHono(serverConfig, credentialStores) {
|
|
17
|
+
const app = new OpenAPIHono();
|
|
18
|
+
// Request ID middleware
|
|
19
|
+
app.use('*', requestId());
|
|
20
|
+
// Server config and credential stores middleware
|
|
21
|
+
app.use('*', async (c, next) => {
|
|
22
|
+
c.set('serverConfig', serverConfig);
|
|
23
|
+
c.set('credentialStores', credentialStores);
|
|
36
24
|
return next();
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
conversationId = body?.conversationId;
|
|
25
|
+
});
|
|
26
|
+
// OpenTelemetry baggage middleware
|
|
27
|
+
app.use('*', async (c, next) => {
|
|
28
|
+
const reqId = c.get('requestId');
|
|
29
|
+
let bag = propagation.getBaggage(otelContext.active());
|
|
30
|
+
if (!bag) {
|
|
31
|
+
bag = propagation.createBaggage();
|
|
45
32
|
}
|
|
46
|
-
|
|
47
|
-
|
|
33
|
+
// Safety check for test environment where createBaggage might return undefined
|
|
34
|
+
if (bag && typeof bag.setEntry === 'function') {
|
|
35
|
+
bag = bag.setEntry('request.id', { value: String(reqId ?? 'unknown') });
|
|
36
|
+
const ctxWithBag = propagation.setBaggage(otelContext.active(), bag);
|
|
37
|
+
return otelContext.with(ctxWithBag, () => next());
|
|
48
38
|
}
|
|
49
|
-
}
|
|
50
|
-
const entries = Object.fromEntries(Object.entries({
|
|
51
|
-
'graph.id': graphId,
|
|
52
|
-
'tenant.id': tenantId,
|
|
53
|
-
'project.id': projectId,
|
|
54
|
-
'conversation.id': conversationId,
|
|
55
|
-
}).filter((entry) => {
|
|
56
|
-
const [, v] = entry;
|
|
57
|
-
return typeof v === 'string' && v.length > 0;
|
|
58
|
-
}));
|
|
59
|
-
if (!Object.keys(entries).length) {
|
|
60
39
|
return next();
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
return 'error';
|
|
73
|
-
}
|
|
74
|
-
return 'info';
|
|
40
|
+
});
|
|
41
|
+
// Logging middleware
|
|
42
|
+
app.use(pinoLogger({
|
|
43
|
+
pino: getLogger() || pino({ level: 'debug' }),
|
|
44
|
+
http: {
|
|
45
|
+
onResLevel(c) {
|
|
46
|
+
if (c.res.status >= 500) {
|
|
47
|
+
return 'error';
|
|
48
|
+
}
|
|
49
|
+
return 'info';
|
|
50
|
+
},
|
|
75
51
|
},
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
52
|
+
}));
|
|
53
|
+
// Error handling
|
|
54
|
+
app.onError(async (err, c) => {
|
|
55
|
+
const isExpectedError = err instanceof HTTPException;
|
|
56
|
+
const status = isExpectedError ? err.status : 500;
|
|
57
|
+
const requestId = c.get('requestId') || 'unknown';
|
|
58
|
+
// Zod validation error detection
|
|
59
|
+
let zodIssues;
|
|
60
|
+
if (err && typeof err === 'object') {
|
|
61
|
+
if (err.cause && Array.isArray(err.cause.issues)) {
|
|
62
|
+
zodIssues = err.cause.issues;
|
|
63
|
+
}
|
|
64
|
+
else if (Array.isArray(err.issues)) {
|
|
65
|
+
zodIssues = err.issues;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (status === 400 && Array.isArray(zodIssues)) {
|
|
69
|
+
c.status(400);
|
|
70
|
+
c.header('Content-Type', 'application/problem+json');
|
|
71
|
+
c.header('X-Content-Type-Options', 'nosniff');
|
|
72
|
+
return c.json({
|
|
73
|
+
type: 'https://docs.inkeep.com/agents-api/errors#bad_request',
|
|
74
|
+
title: 'Validation Failed',
|
|
75
|
+
status: 400,
|
|
76
|
+
detail: 'Request validation failed',
|
|
77
|
+
errors: zodIssues.map((issue) => ({
|
|
78
|
+
detail: issue.message,
|
|
79
|
+
pointer: issue.path ? `/${issue.path.join('/')}` : undefined,
|
|
80
|
+
name: issue.path ? issue.path.join('.') : undefined,
|
|
81
|
+
reason: issue.message,
|
|
82
|
+
})),
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
if (status >= 500) {
|
|
86
|
+
if (!isExpectedError) {
|
|
87
|
+
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
88
|
+
const errorStack = err instanceof Error ? err.stack : undefined;
|
|
89
|
+
const logger = getLogger();
|
|
90
|
+
if (logger) {
|
|
91
|
+
logger.error({
|
|
92
|
+
error: err,
|
|
93
|
+
message: errorMessage,
|
|
94
|
+
stack: errorStack,
|
|
95
|
+
path: c.req.path,
|
|
96
|
+
requestId,
|
|
97
|
+
}, 'Unexpected server error occurred');
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
const logger = getLogger();
|
|
102
|
+
if (logger) {
|
|
103
|
+
logger.error({
|
|
104
|
+
error: err,
|
|
105
|
+
path: c.req.path,
|
|
106
|
+
requestId,
|
|
107
|
+
status,
|
|
108
|
+
}, 'Server error occurred');
|
|
109
|
+
}
|
|
110
|
+
}
|
|
88
111
|
}
|
|
89
|
-
|
|
90
|
-
|
|
112
|
+
if (isExpectedError) {
|
|
113
|
+
try {
|
|
114
|
+
const response = err.getResponse();
|
|
115
|
+
return response;
|
|
116
|
+
}
|
|
117
|
+
catch (responseError) {
|
|
118
|
+
const logger = getLogger();
|
|
119
|
+
if (logger) {
|
|
120
|
+
logger.error({ error: responseError }, 'Error while handling HTTPException response');
|
|
121
|
+
}
|
|
122
|
+
}
|
|
91
123
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
c.status(400);
|
|
124
|
+
const { status: respStatus, title, detail, instance } = await handleApiError(err, requestId);
|
|
125
|
+
c.status(respStatus);
|
|
95
126
|
c.header('Content-Type', 'application/problem+json');
|
|
96
127
|
c.header('X-Content-Type-Options', 'nosniff');
|
|
97
128
|
return c.json({
|
|
98
|
-
type: 'https://docs.inkeep.com/agents-api/errors#
|
|
99
|
-
title
|
|
100
|
-
status:
|
|
101
|
-
detail
|
|
102
|
-
|
|
103
|
-
detail: issue.message,
|
|
104
|
-
pointer: issue.path ? `/${issue.path.join('/')}` : undefined,
|
|
105
|
-
name: issue.path ? issue.path.join('.') : undefined,
|
|
106
|
-
reason: issue.message,
|
|
107
|
-
})),
|
|
129
|
+
type: 'https://docs.inkeep.com/agents-api/errors#internal_server_error',
|
|
130
|
+
title,
|
|
131
|
+
status: respStatus,
|
|
132
|
+
detail,
|
|
133
|
+
...(instance && { instance }),
|
|
108
134
|
});
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
135
|
+
});
|
|
136
|
+
// CORS middleware
|
|
137
|
+
app.use('*', cors({
|
|
138
|
+
origin: (origin) => {
|
|
139
|
+
if (!origin)
|
|
140
|
+
return origin;
|
|
141
|
+
return origin.startsWith('http://localhost:') || origin.startsWith('https://localhost:')
|
|
142
|
+
? origin
|
|
143
|
+
: null;
|
|
144
|
+
},
|
|
145
|
+
allowMethods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
|
|
146
|
+
allowHeaders: ['*'],
|
|
147
|
+
exposeHeaders: ['Content-Length'],
|
|
148
|
+
maxAge: 86400,
|
|
149
|
+
credentials: true,
|
|
150
|
+
}));
|
|
151
|
+
// Apply API key authentication to all routes except health and docs
|
|
152
|
+
app.use('/tenants/*', apiKeyAuth());
|
|
153
|
+
app.use('/agents/*', apiKeyAuth());
|
|
154
|
+
app.use('/v1/*', apiKeyAuth());
|
|
155
|
+
app.use('/api/*', apiKeyAuth());
|
|
156
|
+
// Baggage middleware for execution API - extracts context from API key authentication
|
|
157
|
+
app.use('*', async (c, next) => {
|
|
158
|
+
// Get the API key context if available (set by auth middleware)
|
|
159
|
+
const executionContext = c.get('executionContext');
|
|
160
|
+
if (!executionContext) {
|
|
161
|
+
// No API key context, skip baggage setup
|
|
162
|
+
return next();
|
|
129
163
|
}
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
164
|
+
const { tenantId, projectId, graphId } = executionContext;
|
|
165
|
+
// Extract conversation ID from JSON body if present
|
|
166
|
+
let conversationId;
|
|
167
|
+
if (c.req.header('content-type')?.includes('application/json')) {
|
|
168
|
+
try {
|
|
169
|
+
const body = await c.req.json();
|
|
170
|
+
conversationId = body?.conversationId;
|
|
171
|
+
}
|
|
172
|
+
catch (_) {
|
|
173
|
+
// Silently ignore parse errors for non-JSON bodies
|
|
174
|
+
}
|
|
135
175
|
}
|
|
136
|
-
|
|
137
|
-
|
|
176
|
+
const entries = Object.fromEntries(Object.entries({
|
|
177
|
+
'graph.id': graphId,
|
|
178
|
+
'tenant.id': tenantId,
|
|
179
|
+
'project.id': projectId,
|
|
180
|
+
'conversation.id': conversationId,
|
|
181
|
+
}).filter((entry) => {
|
|
182
|
+
const [, v] = entry;
|
|
183
|
+
return typeof v === 'string' && v.length > 0;
|
|
184
|
+
}));
|
|
185
|
+
if (!Object.keys(entries).length) {
|
|
186
|
+
return next();
|
|
138
187
|
}
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
c.header('Content-Type', 'application/problem+json');
|
|
143
|
-
c.header('X-Content-Type-Options', 'nosniff');
|
|
144
|
-
return c.json({
|
|
145
|
-
type: 'https://docs.inkeep.com/agents-api/errors#internal_server_error',
|
|
146
|
-
title,
|
|
147
|
-
status: respStatus,
|
|
148
|
-
detail,
|
|
149
|
-
...(instance && { instance }),
|
|
188
|
+
const bag = Object.entries(entries).reduce((b, [key, value]) => b.setEntry(key, { value: value || '' }), propagation.getBaggage(otelContext.active()) ?? propagation.createBaggage());
|
|
189
|
+
const ctxWithBag = propagation.setBaggage(otelContext.active(), bag);
|
|
190
|
+
return otelContext.with(ctxWithBag, () => next());
|
|
150
191
|
});
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
:
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
allowHeaders: ['*'],
|
|
163
|
-
exposeHeaders: ['Content-Length'],
|
|
164
|
-
maxAge: 86400,
|
|
165
|
-
credentials: true,
|
|
166
|
-
}));
|
|
167
|
-
// Apply API key authentication to all routes except health and docs
|
|
168
|
-
app.use('/tenants/*', apiKeyAuth());
|
|
169
|
-
app.use('/agents/*', apiKeyAuth());
|
|
170
|
-
app.use('/v1/*', apiKeyAuth());
|
|
171
|
-
app.use('/api/*', apiKeyAuth());
|
|
172
|
-
// Health check endpoint (no auth required)
|
|
173
|
-
app.openapi(createRoute({
|
|
174
|
-
method: 'get',
|
|
175
|
-
path: '/health',
|
|
176
|
-
tags: ['health'],
|
|
177
|
-
summary: 'Health check',
|
|
178
|
-
description: 'Check if the execution service is healthy',
|
|
179
|
-
responses: {
|
|
180
|
-
204: {
|
|
181
|
-
description: 'Service is healthy',
|
|
192
|
+
// Health check endpoint (no auth required)
|
|
193
|
+
app.openapi(createRoute({
|
|
194
|
+
method: 'get',
|
|
195
|
+
path: '/health',
|
|
196
|
+
tags: ['health'],
|
|
197
|
+
summary: 'Health check',
|
|
198
|
+
description: 'Check if the execution service is healthy',
|
|
199
|
+
responses: {
|
|
200
|
+
204: {
|
|
201
|
+
description: 'Service is healthy',
|
|
202
|
+
},
|
|
182
203
|
},
|
|
183
|
-
},
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
app.route('/
|
|
189
|
-
app.route('/
|
|
190
|
-
app.route('/
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
204
|
+
}), (c) => {
|
|
205
|
+
return c.body(null, 204);
|
|
206
|
+
});
|
|
207
|
+
// Mount execution routes - API key provides tenant, project, and graph context
|
|
208
|
+
app.route('/v1/chat', chatRoutes);
|
|
209
|
+
app.route('/api', chatDataRoutes);
|
|
210
|
+
app.route('/v1/mcp', mcpRoutes);
|
|
211
|
+
app.route('/agents', agentRoutes);
|
|
212
|
+
// Setup OpenAPI documentation endpoints (/openapi.json and /docs)
|
|
213
|
+
setupOpenAPIRoutes(app);
|
|
214
|
+
return app;
|
|
215
|
+
}
|
|
216
|
+
export { createExecutionHono };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { RegisteredAgent } from '../a2a/types.js';
|
|
2
1
|
import type { ExecutionContext } from '@inkeep/agents-core';
|
|
2
|
+
import type { RegisteredAgent } from '../a2a/types';
|
|
3
3
|
export declare function getRegisteredGraph(executionContext: ExecutionContext): Promise<RegisteredAgent | null>;
|
|
4
4
|
//# sourceMappingURL=agentGraph.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agentGraph.d.ts","sourceRoot":"","sources":["../../src/data/agentGraph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"agentGraph.d.ts","sourceRoot":"","sources":["../../src/data/agentGraph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AA6EpD,wBAAsB,kBAAkB,CACtC,gBAAgB,EAAE,gBAAgB,GACjC,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAUjC"}
|
package/dist/data/agentGraph.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { createTaskHandler, createTaskHandlerConfig } from '../agents/generateTaskHandler.js';
|
|
2
1
|
import { getAgentById, getAgentGraph } from '@inkeep/agents-core';
|
|
3
|
-
import
|
|
2
|
+
import { createTaskHandler, createTaskHandlerConfig } from '../agents/generateTaskHandler';
|
|
3
|
+
import dbClient from './db/dbClient';
|
|
4
4
|
// Hydrate graph function
|
|
5
5
|
async function hydrateGraph({ dbGraph, baseUrl, apiKey, }) {
|
|
6
6
|
try {
|
package/dist/data/agents.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
2
|
-
import {
|
|
3
|
-
export declare function getRegisteredAgent(executionContext: ExecutionContext): Promise<RegisteredAgent | null>;
|
|
1
|
+
import { type CredentialStoreRegistry, type ExecutionContext } from '@inkeep/agents-core';
|
|
2
|
+
import type { RegisteredAgent } from '../a2a/types';
|
|
3
|
+
export declare function getRegisteredAgent(executionContext: ExecutionContext, credentialStoreRegistry?: CredentialStoreRegistry): Promise<RegisteredAgent | null>;
|
|
4
4
|
//# sourceMappingURL=agents.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/data/agents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/data/agents.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,EAItB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAa,eAAe,EAAE,MAAM,cAAc,CAAC;AA2E/D,wBAAsB,kBAAkB,CACtC,gBAAgB,EAAE,gBAAgB,EAClC,uBAAuB,CAAC,EAAE,uBAAuB,GAChD,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAsBjC"}
|
package/dist/data/agents.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { createTaskHandler, createTaskHandlerConfig } from '../agents/generateTaskHandler.js';
|
|
2
|
-
import dbClient from './db/dbClient.js';
|
|
3
1
|
import { getAgentById, getLogger, } from '@inkeep/agents-core';
|
|
2
|
+
import { createTaskHandler, createTaskHandlerConfig } from '../agents/generateTaskHandler';
|
|
3
|
+
import dbClient from './db/dbClient';
|
|
4
4
|
// Agent hydration functions
|
|
5
5
|
const logger = getLogger('agents');
|
|
6
6
|
/**
|
|
7
7
|
* Create a RegisteredAgent from database agent data
|
|
8
8
|
* Hydrates agent directly from database schema using types from schema.ts
|
|
9
9
|
*/
|
|
10
|
-
async function hydrateAgent({ dbAgent, graphId, baseUrl, apiKey, }) {
|
|
10
|
+
async function hydrateAgent({ dbAgent, graphId, baseUrl, apiKey, credentialStoreRegistry, }) {
|
|
11
11
|
try {
|
|
12
12
|
// Create task handler for the agent
|
|
13
13
|
const taskHandlerConfig = await createTaskHandlerConfig({
|
|
@@ -18,7 +18,7 @@ async function hydrateAgent({ dbAgent, graphId, baseUrl, apiKey, }) {
|
|
|
18
18
|
baseUrl: baseUrl,
|
|
19
19
|
apiKey: apiKey,
|
|
20
20
|
});
|
|
21
|
-
const taskHandler = createTaskHandler(taskHandlerConfig);
|
|
21
|
+
const taskHandler = createTaskHandler(taskHandlerConfig, credentialStoreRegistry);
|
|
22
22
|
// Create AgentCard from database data using schema.ts types
|
|
23
23
|
const agentCard = {
|
|
24
24
|
name: dbAgent.name,
|
|
@@ -56,7 +56,7 @@ async function hydrateAgent({ dbAgent, graphId, baseUrl, apiKey, }) {
|
|
|
56
56
|
}
|
|
57
57
|
}
|
|
58
58
|
// A2A functions that hydrate agents on-demand
|
|
59
|
-
export async function getRegisteredAgent(executionContext) {
|
|
59
|
+
export async function getRegisteredAgent(executionContext, credentialStoreRegistry) {
|
|
60
60
|
const { tenantId, projectId, graphId, agentId, baseUrl } = executionContext;
|
|
61
61
|
if (!agentId) {
|
|
62
62
|
throw new Error('Agent ID is required');
|
|
@@ -69,5 +69,10 @@ export async function getRegisteredAgent(executionContext) {
|
|
|
69
69
|
return null;
|
|
70
70
|
}
|
|
71
71
|
const agentFrameworkBaseUrl = `${baseUrl}/agents`;
|
|
72
|
-
return hydrateAgent({
|
|
72
|
+
return hydrateAgent({
|
|
73
|
+
dbAgent,
|
|
74
|
+
graphId,
|
|
75
|
+
baseUrl: agentFrameworkBaseUrl,
|
|
76
|
+
credentialStoreRegistry,
|
|
77
|
+
});
|
|
73
78
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type AgentConversationHistoryConfig, type ConversationHistoryConfig, type ConversationScopeOptions } from '@inkeep/agents-core';
|
|
2
2
|
/**
|
|
3
3
|
* Creates default conversation history configuration
|
|
4
4
|
* @param mode - The conversation history mode ('full' | 'scoped' | 'none')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversations.d.ts","sourceRoot":"","sources":["../../src/data/conversations.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"conversations.d.ts","sourceRoot":"","sources":["../../src/data/conversations.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,8BAA8B,EACnC,KAAK,yBAAyB,EAC9B,KAAK,wBAAwB,EAG9B,MAAM,qBAAqB,CAAC;AAI7B;;;;GAIG;AACH,wBAAgB,sCAAsC,CACpD,IAAI,GAAE,MAAM,GAAG,QAAQ,GAAG,MAAe,GACxC,8BAA8B,CAQhC;AAYD;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,GAAG,EAAE,2BAA2B;AAC1C,MAAM,EAAE;IACN,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,cAAc,GAAG,aAAa,CAAC;IAC5C,UAAU,EAAE,UAAU,GAAG,UAAU,GAAG,aAAa,CAAC;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC,GACA,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAkDrB;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,EACrC,QAAQ,EACR,SAAS,EACT,cAAc,EACd,OAAO,EACP,OAAO,GACR,EAAE;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,wBAAwB,CAAC;IACnC,OAAO,CAAC,EAAE,yBAAyB,CAAC;CACrC,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAyDjB;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,EACtB,KAAK,SAAK,GACT,OAAO,CAAC,GAAG,EAAE,CAAC,CAUhB;AAED;;GAEG;AACH,wBAAsB,0BAA0B,CAC9C,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,EACtB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,GAAG,EAAE,CAAC,CAUhB;AAED;;GAEG;AACH,wBAAsB,+BAA+B,CAAC,EACpD,QAAQ,EACR,SAAS,EACT,cAAc,EACd,cAAc,EACd,OAAO,EACP,OAAO,GACR,EAAE;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,yBAAyB,CAAC;IACpC,OAAO,CAAC,EAAE,wBAAwB,CAAC;CACpC,GAAG,OAAO,CAAC,MAAM,CAAC,CAuDlB"}
|