@gt-fe/eap-sdk 0.0.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.
- package/README.md +370 -0
- package/dist/auth/index.d.ts +2 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +2 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/user-session.d.ts +23 -0
- package/dist/auth/user-session.d.ts.map +1 -0
- package/dist/auth/user-session.js +162 -0
- package/dist/auth/user-session.js.map +1 -0
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +2 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/project-runtime.d.ts +25 -0
- package/dist/config/project-runtime.d.ts.map +1 -0
- package/dist/config/project-runtime.js +80 -0
- package/dist/config/project-runtime.js.map +1 -0
- package/dist/digest.d.ts +6 -0
- package/dist/digest.d.ts.map +1 -0
- package/dist/digest.js +17 -0
- package/dist/digest.js.map +1 -0
- package/dist/discovery/agent-errors.d.ts +6 -0
- package/dist/discovery/agent-errors.d.ts.map +1 -0
- package/dist/discovery/agent-errors.js +9 -0
- package/dist/discovery/agent-errors.js.map +1 -0
- package/dist/discovery/find-agent-root.d.ts +7 -0
- package/dist/discovery/find-agent-root.d.ts.map +1 -0
- package/dist/discovery/find-agent-root.js +32 -0
- package/dist/discovery/find-agent-root.js.map +1 -0
- package/dist/discovery/index.d.ts +4 -0
- package/dist/discovery/index.d.ts.map +1 -0
- package/dist/discovery/index.js +4 -0
- package/dist/discovery/index.js.map +1 -0
- package/dist/discovery/resolve-agent-project.d.ts +10 -0
- package/dist/discovery/resolve-agent-project.d.ts.map +1 -0
- package/dist/discovery/resolve-agent-project.js +68 -0
- package/dist/discovery/resolve-agent-project.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/lockfile/index.d.ts +5 -0
- package/dist/lockfile/index.d.ts.map +1 -0
- package/dist/lockfile/index.js +5 -0
- package/dist/lockfile/index.js.map +1 -0
- package/dist/lockfile/read-lockfile.d.ts +4 -0
- package/dist/lockfile/read-lockfile.d.ts.map +1 -0
- package/dist/lockfile/read-lockfile.js +22 -0
- package/dist/lockfile/read-lockfile.js.map +1 -0
- package/dist/lockfile/resolve-dependencies.d.ts +22 -0
- package/dist/lockfile/resolve-dependencies.d.ts.map +1 -0
- package/dist/lockfile/resolve-dependencies.js +117 -0
- package/dist/lockfile/resolve-dependencies.js.map +1 -0
- package/dist/lockfile/types.d.ts +9 -0
- package/dist/lockfile/types.d.ts.map +1 -0
- package/dist/lockfile/types.js +2 -0
- package/dist/lockfile/types.js.map +1 -0
- package/dist/lockfile/write-lockfile.d.ts +5 -0
- package/dist/lockfile/write-lockfile.d.ts.map +1 -0
- package/dist/lockfile/write-lockfile.js +53 -0
- package/dist/lockfile/write-lockfile.js.map +1 -0
- package/dist/materialization/copy-resource-directory.d.ts +2 -0
- package/dist/materialization/copy-resource-directory.d.ts.map +1 -0
- package/dist/materialization/copy-resource-directory.js +49 -0
- package/dist/materialization/copy-resource-directory.js.map +1 -0
- package/dist/materialization/index.d.ts +4 -0
- package/dist/materialization/index.d.ts.map +1 -0
- package/dist/materialization/index.js +4 -0
- package/dist/materialization/index.js.map +1 -0
- package/dist/materialization/prepare-agent-runtime.d.ts +3 -0
- package/dist/materialization/prepare-agent-runtime.d.ts.map +1 -0
- package/dist/materialization/prepare-agent-runtime.js +248 -0
- package/dist/materialization/prepare-agent-runtime.js.map +1 -0
- package/dist/materialization/types.d.ts +16 -0
- package/dist/materialization/types.d.ts.map +1 -0
- package/dist/materialization/types.js +2 -0
- package/dist/materialization/types.js.map +1 -0
- package/dist/packaging/archive.d.ts +10 -0
- package/dist/packaging/archive.d.ts.map +1 -0
- package/dist/packaging/archive.js +129 -0
- package/dist/packaging/archive.js.map +1 -0
- package/dist/packaging/index.d.ts +4 -0
- package/dist/packaging/index.d.ts.map +1 -0
- package/dist/packaging/index.js +4 -0
- package/dist/packaging/index.js.map +1 -0
- package/dist/packaging/package-agent-project.d.ts +20 -0
- package/dist/packaging/package-agent-project.d.ts.map +1 -0
- package/dist/packaging/package-agent-project.js +100 -0
- package/dist/packaging/package-agent-project.js.map +1 -0
- package/dist/packaging/read-package.d.ts +8 -0
- package/dist/packaging/read-package.d.ts.map +1 -0
- package/dist/packaging/read-package.js +48 -0
- package/dist/packaging/read-package.js.map +1 -0
- package/dist/platform/client.d.ts +3 -0
- package/dist/platform/client.d.ts.map +1 -0
- package/dist/platform/client.js +256 -0
- package/dist/platform/client.js.map +1 -0
- package/dist/platform/index.d.ts +3 -0
- package/dist/platform/index.d.ts.map +1 -0
- package/dist/platform/index.js +3 -0
- package/dist/platform/index.js.map +1 -0
- package/dist/platform/types.d.ts +190 -0
- package/dist/platform/types.d.ts.map +1 -0
- package/dist/platform/types.js +2 -0
- package/dist/platform/types.js.map +1 -0
- package/dist/project/agent-project.d.ts +21 -0
- package/dist/project/agent-project.d.ts.map +1 -0
- package/dist/project/agent-project.js +74 -0
- package/dist/project/agent-project.js.map +1 -0
- package/dist/project/index.d.ts +2 -0
- package/dist/project/index.d.ts.map +1 -0
- package/dist/project/index.js +2 -0
- package/dist/project/index.js.map +1 -0
- package/dist/resources/extract-resource-package.d.ts +9 -0
- package/dist/resources/extract-resource-package.d.ts.map +1 -0
- package/dist/resources/extract-resource-package.js +165 -0
- package/dist/resources/extract-resource-package.js.map +1 -0
- package/dist/resources/index.d.ts +7 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +7 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/install-agent-dependencies.d.ts +3 -0
- package/dist/resources/install-agent-dependencies.d.ts.map +1 -0
- package/dist/resources/install-agent-dependencies.js +95 -0
- package/dist/resources/install-agent-dependencies.js.map +1 -0
- package/dist/resources/install-agent-resource.d.ts +3 -0
- package/dist/resources/install-agent-resource.d.ts.map +1 -0
- package/dist/resources/install-agent-resource.js +69 -0
- package/dist/resources/install-agent-resource.js.map +1 -0
- package/dist/resources/install-local-agent-resource.d.ts +9 -0
- package/dist/resources/install-local-agent-resource.d.ts.map +1 -0
- package/dist/resources/install-local-agent-resource.js +60 -0
- package/dist/resources/install-local-agent-resource.js.map +1 -0
- package/dist/resources/local-resource.d.ts +7 -0
- package/dist/resources/local-resource.d.ts.map +1 -0
- package/dist/resources/local-resource.js +36 -0
- package/dist/resources/local-resource.js.map +1 -0
- package/dist/resources/registry-resource-client.d.ts +16 -0
- package/dist/resources/registry-resource-client.d.ts.map +1 -0
- package/dist/resources/registry-resource-client.js +49 -0
- package/dist/resources/registry-resource-client.js.map +1 -0
- package/dist/resources/resource-files.d.ts +13 -0
- package/dist/resources/resource-files.d.ts.map +1 -0
- package/dist/resources/resource-files.js +123 -0
- package/dist/resources/resource-files.js.map +1 -0
- package/dist/resources/types.d.ts +32 -0
- package/dist/resources/types.d.ts.map +1 -0
- package/dist/resources/types.js +2 -0
- package/dist/resources/types.js.map +1 -0
- package/dist/resources/uninstall-agent-resource.d.ts +16 -0
- package/dist/resources/uninstall-agent-resource.d.ts.map +1 -0
- package/dist/resources/uninstall-agent-resource.js +64 -0
- package/dist/resources/uninstall-agent-resource.js.map +1 -0
- package/dist/schema/agent/index.d.ts +3 -0
- package/dist/schema/agent/index.d.ts.map +1 -0
- package/dist/schema/agent/index.js +3 -0
- package/dist/schema/agent/index.js.map +1 -0
- package/dist/schema/agent/manifest.d.ts +2256 -0
- package/dist/schema/agent/manifest.d.ts.map +1 -0
- package/dist/schema/agent/manifest.js +53 -0
- package/dist/schema/agent/manifest.js.map +1 -0
- package/dist/schema/agent/selector.d.ts +13 -0
- package/dist/schema/agent/selector.d.ts.map +1 -0
- package/dist/schema/agent/selector.js +6 -0
- package/dist/schema/agent/selector.js.map +1 -0
- package/dist/schema/common.d.ts +9 -0
- package/dist/schema/common.d.ts.map +1 -0
- package/dist/schema/common.js +40 -0
- package/dist/schema/common.js.map +1 -0
- package/dist/schema/dependencies-lock.d.ts +79 -0
- package/dist/schema/dependencies-lock.d.ts.map +1 -0
- package/dist/schema/dependencies-lock.js +18 -0
- package/dist/schema/dependencies-lock.js.map +1 -0
- package/dist/schema/graph.d.ts +2702 -0
- package/dist/schema/graph.d.ts.map +1 -0
- package/dist/schema/graph.js +143 -0
- package/dist/schema/graph.js.map +1 -0
- package/dist/schema/index.d.ts +11 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +11 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/json-schema.d.ts +4 -0
- package/dist/schema/json-schema.d.ts.map +1 -0
- package/dist/schema/json-schema.js +14 -0
- package/dist/schema/json-schema.js.map +1 -0
- package/dist/schema/lockfile.d.ts +215 -0
- package/dist/schema/lockfile.d.ts.map +1 -0
- package/dist/schema/lockfile.js +33 -0
- package/dist/schema/lockfile.js.map +1 -0
- package/dist/schema/package-manifest.d.ts +65 -0
- package/dist/schema/package-manifest.d.ts.map +1 -0
- package/dist/schema/package-manifest.js +48 -0
- package/dist/schema/package-manifest.js.map +1 -0
- package/dist/schema/project-config.d.ts +138 -0
- package/dist/schema/project-config.d.ts.map +1 -0
- package/dist/schema/project-config.js +29 -0
- package/dist/schema/project-config.js.map +1 -0
- package/dist/schema/skill/index.d.ts +2 -0
- package/dist/schema/skill/index.d.ts.map +1 -0
- package/dist/schema/skill/index.js +2 -0
- package/dist/schema/skill/index.js.map +1 -0
- package/dist/schema/skill/manifest.d.ts +156 -0
- package/dist/schema/skill/manifest.d.ts.map +1 -0
- package/dist/schema/skill/manifest.js +43 -0
- package/dist/schema/skill/manifest.js.map +1 -0
- package/dist/schema/tool/index.d.ts +3 -0
- package/dist/schema/tool/index.d.ts.map +1 -0
- package/dist/schema/tool/index.js +3 -0
- package/dist/schema/tool/index.js.map +1 -0
- package/dist/schema/tool/manifest.d.ts +1342 -0
- package/dist/schema/tool/manifest.d.ts.map +1 -0
- package/dist/schema/tool/manifest.js +127 -0
- package/dist/schema/tool/manifest.js.map +1 -0
- package/dist/schema/tool/read-tool-manifest.d.ts +7 -0
- package/dist/schema/tool/read-tool-manifest.d.ts.map +1 -0
- package/dist/schema/tool/read-tool-manifest.js +42 -0
- package/dist/schema/tool/read-tool-manifest.js.map +1 -0
- package/dist/service/create-agent-service.d.ts +12 -0
- package/dist/service/create-agent-service.d.ts.map +1 -0
- package/dist/service/create-agent-service.js +260 -0
- package/dist/service/create-agent-service.js.map +1 -0
- package/dist/service/events.d.ts +49 -0
- package/dist/service/events.d.ts.map +1 -0
- package/dist/service/events.js +2 -0
- package/dist/service/events.js.map +1 -0
- package/dist/service/http-server.d.ts +4 -0
- package/dist/service/http-server.d.ts.map +1 -0
- package/dist/service/http-server.js +89 -0
- package/dist/service/http-server.js.map +1 -0
- package/dist/service/index.d.ts +5 -0
- package/dist/service/index.d.ts.map +1 -0
- package/dist/service/index.js +4 -0
- package/dist/service/index.js.map +1 -0
- package/dist/service/runtime-adapter.d.ts +4 -0
- package/dist/service/runtime-adapter.d.ts.map +1 -0
- package/dist/service/runtime-adapter.js +6 -0
- package/dist/service/runtime-adapter.js.map +1 -0
- package/dist/service/types.d.ts +48 -0
- package/dist/service/types.d.ts.map +1 -0
- package/dist/service/types.js +2 -0
- package/dist/service/types.js.map +1 -0
- package/dist/validation/index.d.ts +5 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +5 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/types.d.ts +23 -0
- package/dist/validation/types.d.ts.map +1 -0
- package/dist/validation/types.js +2 -0
- package/dist/validation/types.js.map +1 -0
- package/dist/validation/validate-agent-directory.d.ts +8 -0
- package/dist/validation/validate-agent-directory.d.ts.map +1 -0
- package/dist/validation/validate-agent-directory.js +82 -0
- package/dist/validation/validate-agent-directory.js.map +1 -0
- package/dist/validation/validate-agent-project.d.ts +3 -0
- package/dist/validation/validate-agent-project.d.ts.map +1 -0
- package/dist/validation/validate-agent-project.js +99 -0
- package/dist/validation/validate-agent-project.js.map +1 -0
- package/dist/validation/validate-graph.d.ts +8 -0
- package/dist/validation/validate-graph.d.ts.map +1 -0
- package/dist/validation/validate-graph.js +127 -0
- package/dist/validation/validate-graph.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +5 -0
- package/dist/version.js.map +1 -0
- package/package.json +39 -0
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { createServer } from 'node:http';
|
|
2
|
+
export function createAgentHttpServer(service) {
|
|
3
|
+
return createServer(async (request, response) => {
|
|
4
|
+
try {
|
|
5
|
+
await handleRequest(service, request, response);
|
|
6
|
+
}
|
|
7
|
+
catch (error) {
|
|
8
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
9
|
+
if (response.headersSent) {
|
|
10
|
+
response.write(`event: error\ndata: ${JSON.stringify({ error: message })}\n\n`);
|
|
11
|
+
response.end();
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
writeJson(response, 500, { error: message });
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
async function handleRequest(service, request, response) {
|
|
20
|
+
const method = request.method ?? 'GET';
|
|
21
|
+
const pathname = new URL(request.url ?? '/', 'http://localhost').pathname;
|
|
22
|
+
if (method === 'GET' && pathname === '/health') {
|
|
23
|
+
writeJson(response, 200, {
|
|
24
|
+
status: 'ok',
|
|
25
|
+
agentCode: service.target.agentCode,
|
|
26
|
+
version: service.target.version,
|
|
27
|
+
});
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const route = /^\/api\/v1\/agents\/([^/]+)\/(invoke|stream)$/.exec(pathname);
|
|
31
|
+
if (!route || method !== 'POST') {
|
|
32
|
+
writeJson(response, 404, { error: 'Route not found' });
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const agentCode = decodeURIComponent(route[1]);
|
|
36
|
+
if (agentCode !== service.target.agentCode) {
|
|
37
|
+
writeJson(response, 404, { error: `Selected Agent is ${service.target.agentCode}` });
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const body = await readJsonBody(request);
|
|
41
|
+
if (typeof body.input !== 'string') {
|
|
42
|
+
writeJson(response, 400, { error: 'Request body requires string input' });
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const options = {
|
|
46
|
+
sessionId: stringValue(body.sessionId),
|
|
47
|
+
taskId: stringValue(body.taskId),
|
|
48
|
+
...(isRecord(body.config) ? { config: body.config } : {}),
|
|
49
|
+
...(isRecord(body.executionContext)
|
|
50
|
+
? { executionContext: body.executionContext }
|
|
51
|
+
: {}),
|
|
52
|
+
};
|
|
53
|
+
if (route[2] === 'invoke') {
|
|
54
|
+
writeJson(response, 200, await service.invoke(body.input, options));
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
response.writeHead(200, {
|
|
58
|
+
'Content-Type': 'text/event-stream; charset=utf-8',
|
|
59
|
+
'Cache-Control': 'no-cache, no-transform',
|
|
60
|
+
Connection: 'keep-alive',
|
|
61
|
+
});
|
|
62
|
+
for await (const event of service.stream(body.input, options)) {
|
|
63
|
+
response.write(`event: ${event.type}\ndata: ${JSON.stringify({ ...event.data, correlationId: event.correlationId, taskId: event.taskId, timestamp: event.timestamp })}\n\n`);
|
|
64
|
+
}
|
|
65
|
+
response.end();
|
|
66
|
+
}
|
|
67
|
+
async function readJsonBody(request) {
|
|
68
|
+
const chunks = [];
|
|
69
|
+
for await (const chunk of request)
|
|
70
|
+
chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
|
|
71
|
+
const raw = Buffer.concat(chunks).toString('utf8');
|
|
72
|
+
if (!raw)
|
|
73
|
+
return {};
|
|
74
|
+
const body = JSON.parse(raw);
|
|
75
|
+
if (!body || typeof body !== 'object' || Array.isArray(body))
|
|
76
|
+
throw new Error('Request body must be an object');
|
|
77
|
+
return body;
|
|
78
|
+
}
|
|
79
|
+
function stringValue(value) {
|
|
80
|
+
return typeof value === 'string' && value.length > 0 ? value : undefined;
|
|
81
|
+
}
|
|
82
|
+
function isRecord(value) {
|
|
83
|
+
return Boolean(value && typeof value === 'object' && !Array.isArray(value));
|
|
84
|
+
}
|
|
85
|
+
function writeJson(response, status, body) {
|
|
86
|
+
response.writeHead(status, { 'Content-Type': 'application/json; charset=utf-8' });
|
|
87
|
+
response.end(JSON.stringify(body));
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=http-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-server.js","sourceRoot":"","sources":["../../src/service/http-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export * from './types.js';
|
|
2
|
+
export * from './events.js';
|
|
3
|
+
export * from './create-agent-service.js';
|
|
4
|
+
export type { GraphMessage, MessageService, MessageRecord, RuntimeEvent, SessionRecord, SessionService, } from '@gt-fe/eap-runtime';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/service/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,2BAA2B,CAAC;AAC1C,YAAY,EACV,YAAY,EACZ,cAAc,EACd,aAAa,EACb,YAAY,EACZ,aAAa,EACb,cAAc,GACf,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/service/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type DevRuntime } from '@gt-fe/eap-runtime';
|
|
2
|
+
import type { PreparedAgentRuntime } from '../materialization/index.js';
|
|
3
|
+
export declare function createRuntimeForPrepared(_prepared: PreparedAgentRuntime, environment: Record<string, string>): DevRuntime;
|
|
4
|
+
//# sourceMappingURL=runtime-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-adapter.d.ts","sourceRoot":"","sources":["../../src/service/runtime-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,UAAU,EAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAExE,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,oBAAoB,EAC/B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAClC,UAAU,CAGZ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-adapter.js","sourceRoot":"","sources":["../../src/service/runtime-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,GAEjB,MAAM,oBAAoB,CAAC;AAG5B,MAAM,UAAU,wBAAwB,CACtC,SAA+B,EAC/B,WAAmC;IAEnC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IACxC,OAAO,gBAAgB,EAAE,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { DevRuntime, ExecuteParams, GraphMessage } from '@gt-fe/eap-runtime';
|
|
2
|
+
import type { ResolvedAgentProject } from '../discovery/index.js';
|
|
3
|
+
import type { PreparedAgentRuntime } from '../materialization/index.js';
|
|
4
|
+
import type { AgentProjectSelector } from '../schema/index.js';
|
|
5
|
+
import type { AgentServiceStreamEvent } from './events.js';
|
|
6
|
+
export type AgentServiceRequest = Omit<ExecuteParams, 'agentCode' | 'input'>;
|
|
7
|
+
export type AgentServiceStream = AsyncIterable<AgentServiceStreamEvent>;
|
|
8
|
+
export type AgentServiceInvokeResult = ReturnType<DevRuntime['agentRuntime']['execute']>;
|
|
9
|
+
export interface AgentServiceStartOptions {
|
|
10
|
+
host?: string;
|
|
11
|
+
port?: number;
|
|
12
|
+
}
|
|
13
|
+
export type AgentRuntimeFactory = (prepared: PreparedAgentRuntime, environment: Record<string, string>) => DevRuntime;
|
|
14
|
+
export type CreateAgentServiceOptions = AgentProjectSelector & {
|
|
15
|
+
runtimeFactory?: AgentRuntimeFactory;
|
|
16
|
+
messages?: GraphMessage[];
|
|
17
|
+
/**
|
|
18
|
+
* Enable file-backed Runtime sessions, messages, and checkpoints.
|
|
19
|
+
*
|
|
20
|
+
* SDK services default to in-memory storage so embedding an Agent does not
|
|
21
|
+
* create local conversation files. The CLI development surfaces opt in.
|
|
22
|
+
*/
|
|
23
|
+
sessionPersistence?: boolean;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Starts an Agent from a previously materialized Runtime tree. This is the
|
|
27
|
+
* production counterpart to createAgentService(): it never reads project
|
|
28
|
+
* source files or performs materialization.
|
|
29
|
+
*/
|
|
30
|
+
export interface CreateEmbeddedAgentServiceOptions {
|
|
31
|
+
runtimeRoot: string;
|
|
32
|
+
agentCode?: string;
|
|
33
|
+
version?: string;
|
|
34
|
+
runtimeFactory?: AgentRuntimeFactory;
|
|
35
|
+
environment?: Record<string, string>;
|
|
36
|
+
deploymentContext?: 'dev' | 'desktop' | 'server';
|
|
37
|
+
sessionPersistence?: boolean;
|
|
38
|
+
sessionDirectory?: string;
|
|
39
|
+
}
|
|
40
|
+
export interface AgentService {
|
|
41
|
+
readonly target: ResolvedAgentProject;
|
|
42
|
+
readonly runtime: DevRuntime;
|
|
43
|
+
invoke(input: string, options?: AgentServiceRequest): AgentServiceInvokeResult;
|
|
44
|
+
stream(input: string, options?: AgentServiceRequest): AgentServiceStream;
|
|
45
|
+
start(options: AgentServiceStartOptions): Promise<void>;
|
|
46
|
+
stop(): Promise<void>;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/service/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAE3D,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,aAAa,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC;AAC7E,MAAM,MAAM,kBAAkB,GAAG,aAAa,CAAC,uBAAuB,CAAC,CAAC;AACxE,MAAM,MAAM,wBAAwB,GAAG,UAAU,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AAEzF,MAAM,WAAW,wBAAwB;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,mBAAmB,GAAG,CAChC,QAAQ,EAAE,oBAAoB,EAC9B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAChC,UAAU,CAAC;AAEhB,MAAM,MAAM,yBAAyB,GAAG,oBAAoB,GAAG;IAC7D,cAAc,CAAC,EAAE,mBAAmB,CAAC;IACrC,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;IAC1B;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B,CAAC;AAEF;;;;GAIG;AACH,MAAM,WAAW,iCAAiC;IAChD,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,mBAAmB,CAAC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,iBAAiB,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,QAAQ,CAAC;IACjD,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7B,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,wBAAwB,CAAC;IAC/E,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,kBAAkB,CAAC;IACzE,KAAK,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/service/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/validation/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC;AACpC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,6BAA6B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/validation/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC;AACpC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,6BAA6B,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { AgentManifest, Graph } from '../schema/index.js';
|
|
2
|
+
import type { ResolvedAgentProject } from '../discovery/index.js';
|
|
3
|
+
export interface ValidationIssue {
|
|
4
|
+
severity: 'error' | 'warning';
|
|
5
|
+
code: string;
|
|
6
|
+
message: string;
|
|
7
|
+
filePath?: string;
|
|
8
|
+
jsonPath?: string;
|
|
9
|
+
agentCode?: string;
|
|
10
|
+
version?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface ValidatedAgentProject {
|
|
13
|
+
project: ResolvedAgentProject;
|
|
14
|
+
manifest: AgentManifest;
|
|
15
|
+
graph: Graph;
|
|
16
|
+
}
|
|
17
|
+
export interface AgentProjectValidationResult {
|
|
18
|
+
root: string;
|
|
19
|
+
valid: boolean;
|
|
20
|
+
issues: ValidationIssue[];
|
|
21
|
+
agent?: ValidatedAgentProject;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/validation/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAElE,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,oBAAoB,CAAC;IAC9B,QAAQ,EAAE,aAAa,CAAC;IACxB,KAAK,EAAE,KAAK,CAAC;CACd;AAED,MAAM,WAAW,4BAA4B;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,KAAK,CAAC,EAAE,qBAAqB,CAAC;CAC/B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/validation/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ResolvedAgentProject } from '../discovery/index.js';
|
|
2
|
+
import type { ValidatedAgentProject, ValidationIssue } from './types.js';
|
|
3
|
+
export interface AgentDirectoryValidationResult {
|
|
4
|
+
issues: ValidationIssue[];
|
|
5
|
+
agent?: ValidatedAgentProject;
|
|
6
|
+
}
|
|
7
|
+
export declare function validateAgentDirectory(project: ResolvedAgentProject): AgentDirectoryValidationResult;
|
|
8
|
+
//# sourceMappingURL=validate-agent-directory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-agent-directory.d.ts","sourceRoot":"","sources":["../../src/validation/validate-agent-directory.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAElE,OAAO,KAAK,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEzE,MAAM,WAAW,8BAA8B;IAC7C,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,KAAK,CAAC,EAAE,qBAAqB,CAAC;CAC/B;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,oBAAoB,GAAG,8BAA8B,CAmDpG"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { existsSync, readFileSync, readdirSync } from 'node:fs';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
import { AgentManifestSchema } from '../schema/index.js';
|
|
4
|
+
import { validateGraph } from './validate-graph.js';
|
|
5
|
+
export function validateAgentDirectory(project) {
|
|
6
|
+
const issues = [];
|
|
7
|
+
const manifestJson = readJson(project.manifestPath, 'agent.manifest.json', issues, project);
|
|
8
|
+
const graphJson = readJson(project.graphPath, 'graph.json', issues, project);
|
|
9
|
+
if (manifestJson === undefined || graphJson === undefined)
|
|
10
|
+
return { issues };
|
|
11
|
+
const manifest = AgentManifestSchema.safeParse(manifestJson);
|
|
12
|
+
if (!manifest.success) {
|
|
13
|
+
issues.push(...manifest.error.issues.map((issue) => ({
|
|
14
|
+
severity: 'error',
|
|
15
|
+
code: 'agent_manifest.schema.invalid',
|
|
16
|
+
message: issue.message,
|
|
17
|
+
filePath: project.manifestPath,
|
|
18
|
+
jsonPath: issue.path.join('.'),
|
|
19
|
+
agentCode: project.agentCode,
|
|
20
|
+
version: project.version,
|
|
21
|
+
})));
|
|
22
|
+
return { issues };
|
|
23
|
+
}
|
|
24
|
+
if (manifest.data.code !== project.agentCode || manifest.data.version !== project.version) {
|
|
25
|
+
issues.push({
|
|
26
|
+
severity: 'error',
|
|
27
|
+
code: 'agent_manifest.identity_mismatch',
|
|
28
|
+
message: `Manifest identity must match ${project.agentCode}@${project.version}`,
|
|
29
|
+
filePath: project.manifestPath,
|
|
30
|
+
agentCode: project.agentCode,
|
|
31
|
+
version: project.version,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
for (const name of readdirSync(project.root)) {
|
|
35
|
+
if ((name === 'graph.yaml' || name === 'graph.yml') || (name.startsWith('graph.') && name !== 'graph.json')) {
|
|
36
|
+
issues.push({
|
|
37
|
+
severity: 'error',
|
|
38
|
+
code: 'agent_graph.unsupported_file',
|
|
39
|
+
message: `Only graph.json is supported; found ${name}`,
|
|
40
|
+
filePath: resolve(project.root, name),
|
|
41
|
+
agentCode: project.agentCode,
|
|
42
|
+
version: project.version,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
const graphResult = validateGraph(graphJson, project.graphPath, manifest.data);
|
|
47
|
+
issues.push(...graphResult.issues.map((issue) => ({ ...issue, agentCode: project.agentCode, version: project.version })));
|
|
48
|
+
if (!graphResult.graph || issues.some((issue) => issue.severity === 'error'))
|
|
49
|
+
return { issues };
|
|
50
|
+
return {
|
|
51
|
+
issues,
|
|
52
|
+
agent: { project, manifest: manifest.data, graph: graphResult.graph },
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function readJson(path, label, issues, project) {
|
|
56
|
+
if (!existsSync(path)) {
|
|
57
|
+
issues.push({
|
|
58
|
+
severity: 'error',
|
|
59
|
+
code: 'agent_project.file_missing',
|
|
60
|
+
message: `Missing ${label}`,
|
|
61
|
+
filePath: path,
|
|
62
|
+
agentCode: project.agentCode,
|
|
63
|
+
version: project.version,
|
|
64
|
+
});
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
67
|
+
try {
|
|
68
|
+
return JSON.parse(readFileSync(path, 'utf8'));
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
issues.push({
|
|
72
|
+
severity: 'error',
|
|
73
|
+
code: 'agent_project.invalid_json',
|
|
74
|
+
message: error instanceof Error ? error.message : String(error),
|
|
75
|
+
filePath: path,
|
|
76
|
+
agentCode: project.agentCode,
|
|
77
|
+
version: project.version,
|
|
78
|
+
});
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=validate-agent-directory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-agent-directory.js","sourceRoot":"","sources":["../../src/validation/validate-agent-directory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-agent-project.d.ts","sourceRoot":"","sources":["../../src/validation/validate-agent-project.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,4BAA4B,EAAmB,MAAM,YAAY,CAAC;AAEhF,wBAAgB,oBAAoB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,4BAA4B,CA0BhF"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { existsSync, lstatSync } from 'node:fs';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
import { loadProjectRuntimeConfig } from '../config/index.js';
|
|
4
|
+
import { resolveAgentProject } from '../discovery/index.js';
|
|
5
|
+
import { declaredResourceCodes, findUndeclaredLockedResources, readEapLock, resolveLockedResources, } from '../lockfile/index.js';
|
|
6
|
+
import { validateAgentDirectory } from './validate-agent-directory.js';
|
|
7
|
+
export function validateAgentProject(root) {
|
|
8
|
+
const project = resolveAgentProject(root ? { root } : {});
|
|
9
|
+
const result = validateAgentDirectory(project);
|
|
10
|
+
const issues = [...result.issues];
|
|
11
|
+
try {
|
|
12
|
+
loadProjectRuntimeConfig({ root: project.root });
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
issues.push({
|
|
16
|
+
severity: 'error',
|
|
17
|
+
code: 'project_config.invalid',
|
|
18
|
+
message: error instanceof Error ? error.message : String(error),
|
|
19
|
+
filePath: resolve(project.root, 'eap.config.json'),
|
|
20
|
+
agentCode: project.agentCode,
|
|
21
|
+
version: project.version,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
if (result.agent)
|
|
25
|
+
validateLockResources(project.root, result.agent.manifest, issues);
|
|
26
|
+
return {
|
|
27
|
+
root: project.root,
|
|
28
|
+
valid: issues.every((issue) => issue.severity !== 'error'),
|
|
29
|
+
issues,
|
|
30
|
+
...(result.agent ? { agent: result.agent } : {}),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function validateLockResources(root, manifest, issues) {
|
|
34
|
+
const hasMaterializedDependencies = declaredResourceCodes(manifest, 'tools').length > 0
|
|
35
|
+
|| declaredResourceCodes(manifest, 'skills').length > 0;
|
|
36
|
+
let lock;
|
|
37
|
+
try {
|
|
38
|
+
lock = readEapLock(root);
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
issues.push(lockIssue('lockfile.invalid', error, resolve(root, 'eap.lock.yaml')));
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if (!lock) {
|
|
45
|
+
if (hasMaterializedDependencies) {
|
|
46
|
+
issues.push({
|
|
47
|
+
severity: 'error',
|
|
48
|
+
code: 'lockfile.missing',
|
|
49
|
+
message: 'eap.lock.yaml is required when Tool or Skill dependencies are declared',
|
|
50
|
+
filePath: resolve(root, 'eap.lock.yaml'),
|
|
51
|
+
agentCode: manifest.code,
|
|
52
|
+
version: manifest.version,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
try {
|
|
58
|
+
const resources = resolveLockedResources({ root, manifest, lock });
|
|
59
|
+
for (const resource of resources) {
|
|
60
|
+
if (resource.source !== 'registry')
|
|
61
|
+
continue;
|
|
62
|
+
const localPath = resolve(root, resource.kind, resource.code);
|
|
63
|
+
if (existsSync(localPath) && lstatSync(localPath).isDirectory()) {
|
|
64
|
+
issues.push({
|
|
65
|
+
severity: 'error',
|
|
66
|
+
code: 'lockfile.local_registry_conflict',
|
|
67
|
+
message: `Registry ${resource.kind.slice(0, -1)} ${resource.code} conflicts with local directory ${localPath}`,
|
|
68
|
+
filePath: localPath,
|
|
69
|
+
agentCode: manifest.code,
|
|
70
|
+
version: manifest.version,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
issues.push(lockIssue('lockfile.invalid_resource', error, resolve(root, 'eap.lock.yaml'), manifest.code, manifest.version));
|
|
77
|
+
}
|
|
78
|
+
for (const resource of findUndeclaredLockedResources(manifest, lock)) {
|
|
79
|
+
issues.push({
|
|
80
|
+
severity: 'warning',
|
|
81
|
+
code: 'lockfile.undeclared_resource',
|
|
82
|
+
message: `Locked ${resource.kind.slice(0, -1)} ${resource.code}@${resource.version} is not declared by agent.manifest.json`,
|
|
83
|
+
filePath: resolve(root, 'eap.lock.yaml'),
|
|
84
|
+
agentCode: manifest.code,
|
|
85
|
+
version: manifest.version,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
function lockIssue(code, error, filePath, agentCode, version) {
|
|
90
|
+
return {
|
|
91
|
+
severity: 'error',
|
|
92
|
+
code,
|
|
93
|
+
message: error instanceof Error ? error.message : String(error),
|
|
94
|
+
filePath,
|
|
95
|
+
agentCode,
|
|
96
|
+
version,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=validate-agent-project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-agent-project.js","sourceRoot":"","sources":["../../src/validation/validate-agent-project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EACL,qBAAqB,EACrB,6BAA6B,EAC7B,WAAW,EACX,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAGvE,MAAM,UAAU,oBAAoB,CAAC,IAAa;IAChD,MAAM,OAAO,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAElC,IAAI,CAAC;QACH,wBAAwB,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC;YACV,QAAQ,EAAE,OAAO;YACjB,IAAI,EAAE,wBAAwB;YAC9B,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;YAC/D,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,iBAAiB,CAAC;YAClD,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC,CAAC;IACL,CAAC;IAED,IAAI,MAAM,CAAC,KAAK;QAAE,qBAAqB,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAErF,OAAO;QACL,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,OAAO,CAAC;QAC1D,MAAM;QACN,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACjD,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAC5B,IAAY,EACZ,QAAuB,EACvB,MAAyB;IAEzB,MAAM,2BAA2B,GAAG,qBAAqB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC;WAClF,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IAC1D,IAAI,IAAI,CAAC;IACT,IAAI,CAAC;QACH,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;QAClF,OAAO;IACT,CAAC;IACD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,IAAI,2BAA2B,EAAE,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC;gBACV,QAAQ,EAAE,OAAO;gBACjB,IAAI,EAAE,kBAAkB;gBACxB,OAAO,EAAE,wEAAwE;gBACjF,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE,eAAe,CAAC;gBACxC,SAAS,EAAE,QAAQ,CAAC,IAAI;gBACxB,OAAO,EAAE,QAAQ,CAAC,OAAO;aAC1B,CAAC,CAAC;QACL,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,sBAAsB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACnE,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,IAAI,QAAQ,CAAC,MAAM,KAAK,UAAU;gBAAE,SAAS;YAC7C,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC9D,IAAI,UAAU,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;gBAChE,MAAM,CAAC,IAAI,CAAC;oBACV,QAAQ,EAAE,OAAO;oBACjB,IAAI,EAAE,kCAAkC;oBACxC,OAAO,EAAE,YAAY,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,IAAI,mCAAmC,SAAS,EAAE;oBAC9G,QAAQ,EAAE,SAAS;oBACnB,SAAS,EAAE,QAAQ,CAAC,IAAI;oBACxB,OAAO,EAAE,QAAQ,CAAC,OAAO;iBAC1B,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,2BAA2B,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9H,CAAC;IAED,KAAK,MAAM,QAAQ,IAAI,6BAA6B,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC;QACrE,MAAM,CAAC,IAAI,CAAC;YACV,QAAQ,EAAE,SAAS;YACnB,IAAI,EAAE,8BAA8B;YACpC,OAAO,EAAE,UAAU,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,OAAO,yCAAyC;YAC3H,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE,eAAe,CAAC;YACxC,SAAS,EAAE,QAAQ,CAAC,IAAI;YACxB,OAAO,EAAE,QAAQ,CAAC,OAAO;SAC1B,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAChB,IAAY,EACZ,KAAc,EACd,QAAgB,EAChB,SAAkB,EAClB,OAAgB;IAEhB,OAAO;QACL,QAAQ,EAAE,OAAO;QACjB,IAAI;QACJ,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;QAC/D,QAAQ;QACR,SAAS;QACT,OAAO;KACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AgentManifest, Graph } from '../schema/index.js';
|
|
2
|
+
import type { ValidationIssue } from './types.js';
|
|
3
|
+
export interface GraphValidationResult {
|
|
4
|
+
graph?: Graph;
|
|
5
|
+
issues: ValidationIssue[];
|
|
6
|
+
}
|
|
7
|
+
export declare function validateGraph(value: unknown, filePath: string, manifest?: AgentManifest): GraphValidationResult;
|
|
8
|
+
//# sourceMappingURL=validate-graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-graph.d.ts","sourceRoot":"","sources":["../../src/validation/validate-graph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,aAAa,GACvB,qBAAqB,CAsFvB"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { GraphSchema } from '../schema/index.js';
|
|
2
|
+
export function validateGraph(value, filePath, manifest) {
|
|
3
|
+
const parsed = GraphSchema.safeParse(value);
|
|
4
|
+
if (!parsed.success) {
|
|
5
|
+
return {
|
|
6
|
+
issues: parsed.error.issues.map((issue) => ({
|
|
7
|
+
severity: 'error',
|
|
8
|
+
code: 'graph.schema.invalid',
|
|
9
|
+
message: issue.message,
|
|
10
|
+
filePath,
|
|
11
|
+
jsonPath: toJsonPath(issue.path),
|
|
12
|
+
})),
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
const graph = parsed.data;
|
|
16
|
+
const issues = [];
|
|
17
|
+
const nodeIds = new Set();
|
|
18
|
+
for (const [index, node] of graph.nodes.entries()) {
|
|
19
|
+
if (nodeIds.has(node.id)) {
|
|
20
|
+
issues.push(error('graph.duplicate_node_id', `Duplicate node id: ${node.id}`, filePath, `nodes[${index}].id`));
|
|
21
|
+
}
|
|
22
|
+
nodeIds.add(node.id);
|
|
23
|
+
}
|
|
24
|
+
const validEndpoint = (id) => id === '__start__' || id === '__end__' || nodeIds.has(id);
|
|
25
|
+
const adjacency = new Map();
|
|
26
|
+
for (const id of nodeIds)
|
|
27
|
+
adjacency.set(id, new Set());
|
|
28
|
+
const addEdge = (from, to, path) => {
|
|
29
|
+
if (!validEndpoint(from))
|
|
30
|
+
issues.push(error('graph.invalid_edge_from', `Unknown edge source: ${from}`, filePath, `${path}.from`));
|
|
31
|
+
if (!validEndpoint(to))
|
|
32
|
+
issues.push(error('graph.invalid_edge_to', `Unknown edge target: ${to}`, filePath, `${path}.to`));
|
|
33
|
+
if (nodeIds.has(from) && nodeIds.has(to))
|
|
34
|
+
adjacency.get(from).add(to);
|
|
35
|
+
};
|
|
36
|
+
graph.edges.forEach((edge, index) => addEdge(edge.from, edge.to, `edges[${index}]`));
|
|
37
|
+
graph.conditionalEdges?.forEach((edge, index) => {
|
|
38
|
+
if (!nodeIds.has(edge.from)) {
|
|
39
|
+
issues.push(error('graph.invalid_conditional_source', `Unknown conditional source: ${edge.from}`, filePath, `conditionalEdges[${index}].from`));
|
|
40
|
+
}
|
|
41
|
+
edge.branches.forEach((branch, branchIndex) => {
|
|
42
|
+
addEdge(edge.from, branch.to, `conditionalEdges[${index}].branches[${branchIndex}]`);
|
|
43
|
+
});
|
|
44
|
+
if (edge.fallback)
|
|
45
|
+
addEdge(edge.from, edge.fallback, `conditionalEdges[${index}].fallback`);
|
|
46
|
+
});
|
|
47
|
+
const startNodes = new Set();
|
|
48
|
+
if (graph.entryPoint) {
|
|
49
|
+
if (!nodeIds.has(graph.entryPoint)) {
|
|
50
|
+
issues.push(error('graph.invalid_entry_point', `Unknown entry point: ${graph.entryPoint}`, filePath, 'entryPoint'));
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
startNodes.add(graph.entryPoint);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
for (const edge of graph.edges) {
|
|
58
|
+
if (edge.from === '__start__' && nodeIds.has(edge.to))
|
|
59
|
+
startNodes.add(edge.to);
|
|
60
|
+
}
|
|
61
|
+
if (startNodes.size === 0) {
|
|
62
|
+
issues.push(error('graph.missing_entry_point', 'Graph requires entryPoint or an edge from __start__', filePath));
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (graph.finishPoints?.length) {
|
|
66
|
+
graph.finishPoints.forEach((finishPoint, index) => {
|
|
67
|
+
if (finishPoint !== '__end__' && !nodeIds.has(finishPoint)) {
|
|
68
|
+
issues.push(error('graph.invalid_finish_point', `Unknown finish point: ${finishPoint}`, filePath, `finishPoints[${index}]`));
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
else if (!graph.edges.some((edge) => edge.to === '__end__')) {
|
|
73
|
+
issues.push(error('graph.missing_finish_point', 'Graph requires finishPoints or an edge to __end__', filePath));
|
|
74
|
+
}
|
|
75
|
+
const reachable = new Set();
|
|
76
|
+
const pending = [...startNodes];
|
|
77
|
+
while (pending.length > 0) {
|
|
78
|
+
const nodeId = pending.pop();
|
|
79
|
+
if (reachable.has(nodeId))
|
|
80
|
+
continue;
|
|
81
|
+
reachable.add(nodeId);
|
|
82
|
+
for (const next of adjacency.get(nodeId) ?? [])
|
|
83
|
+
pending.push(next);
|
|
84
|
+
}
|
|
85
|
+
for (const nodeId of nodeIds) {
|
|
86
|
+
if (!reachable.has(nodeId)) {
|
|
87
|
+
issues.push(error('graph.unreachable_node', `Node is unreachable: ${nodeId}`, filePath, `nodes[${graph.nodes.findIndex((node) => node.id === nodeId)}]`));
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (manifest)
|
|
91
|
+
validateManifestReferences(graph, manifest, filePath, issues);
|
|
92
|
+
return { graph, issues };
|
|
93
|
+
}
|
|
94
|
+
function validateManifestReferences(graph, manifest, filePath, issues) {
|
|
95
|
+
const toolRefs = graph.nodes
|
|
96
|
+
.filter((node) => node.type === 'tool')
|
|
97
|
+
.map((node) => node.config.tool);
|
|
98
|
+
for (const tool of toolRefs) {
|
|
99
|
+
// A Toolset intentionally stays opaque in the SDK. Runtime expands its
|
|
100
|
+
// tools[] entries, so their names cannot be checked here without crossing
|
|
101
|
+
// the module boundary.
|
|
102
|
+
if (manifest.toolRefs.length === 0) {
|
|
103
|
+
issues.push(error('graph.undeclared_tool', `Graph Tool ${tool} is not declared in agent.manifest.json`, filePath));
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
const skillRefs = graph.nodes
|
|
107
|
+
.filter((node) => node.type === 'subgraph')
|
|
108
|
+
.flatMap((node) => {
|
|
109
|
+
const skill = node.config.skillId ?? node.config.skillCode ?? node.subgraphId;
|
|
110
|
+
return skill ? [skill] : [];
|
|
111
|
+
});
|
|
112
|
+
for (const skill of skillRefs) {
|
|
113
|
+
const declaredSkills = new Set(manifest.skillRefs.flatMap((ref) => ref.skill ?? ref.skillId ?? []));
|
|
114
|
+
if (!declaredSkills.has(skill)) {
|
|
115
|
+
issues.push(error('graph.undeclared_skill', `Graph Skill ${skill} is not declared in agent.manifest.json`, filePath));
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
function error(code, message, filePath, jsonPath) {
|
|
120
|
+
return { severity: 'error', code, message, filePath, jsonPath };
|
|
121
|
+
}
|
|
122
|
+
function toJsonPath(path) {
|
|
123
|
+
if (path.length === 0)
|
|
124
|
+
return undefined;
|
|
125
|
+
return path.map((segment) => typeof segment === 'number' ? `[${segment}]` : segment).join('.').replace('.[', '[');
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=validate-graph.js.map
|