@artinet/fleet 0.1.0-alpha.1
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 +257 -0
- package/dist/src/default.d.ts +696 -0
- package/dist/src/default.js +17 -0
- package/dist/src/index.d.ts +6 -0
- package/dist/src/index.js +6 -0
- package/dist/src/routes/create/index.d.ts +1317 -0
- package/dist/src/routes/create/index.js +3 -0
- package/dist/src/routes/index.d.ts +2 -0
- package/dist/src/routes/index.js +2 -0
- package/dist/src/routes/request/implementation/index.d.ts +4 -0
- package/dist/src/routes/request/implementation/index.js +4 -0
- package/dist/src/routes/request/implementation/invoke.d.ts +8 -0
- package/dist/src/routes/request/implementation/invoke.js +150 -0
- package/dist/src/routes/request/implementation/load.d.ts +2 -0
- package/dist/src/routes/request/implementation/load.js +50 -0
- package/dist/src/routes/request/implementation/request.d.ts +2 -0
- package/dist/src/routes/request/implementation/request.js +28 -0
- package/dist/src/routes/request/implementation/test-invoke.d.ts +3 -0
- package/dist/src/routes/request/implementation/test-invoke.js +42 -0
- package/dist/src/routes/request/index.d.ts +4 -0
- package/dist/src/routes/request/index.js +4 -0
- package/dist/src/routes/request/interceptors/fetch-agent.d.ts +2 -0
- package/dist/src/routes/request/interceptors/fetch-agent.js +26 -0
- package/dist/src/routes/request/interceptors/get-agents.d.ts +2 -0
- package/dist/src/routes/request/interceptors/get-agents.js +38 -0
- package/dist/src/routes/request/interceptors/index.d.ts +2 -0
- package/dist/src/routes/request/interceptors/index.js +2 -0
- package/dist/src/routes/request/request.d.ts +8 -0
- package/dist/src/routes/request/request.js +16 -0
- package/dist/src/routes/request/types/definitions.d.ts +733 -0
- package/dist/src/routes/request/types/definitions.js +11 -0
- package/dist/src/routes/request/types/index.d.ts +1 -0
- package/dist/src/routes/request/types/index.js +1 -0
- package/dist/src/server/express/agent-request.d.ts +26 -0
- package/dist/src/server/express/agent-request.js +44 -0
- package/dist/src/server/express/deploy-request.d.ts +14 -0
- package/dist/src/server/express/deploy-request.js +19 -0
- package/dist/src/server/express/fleet.d.ts +3 -0
- package/dist/src/server/express/fleet.js +2 -0
- package/dist/src/server/express/index.d.ts +4 -0
- package/dist/src/server/express/index.js +4 -0
- package/dist/src/server/express/rpc.d.ts +12 -0
- package/dist/src/server/express/rpc.js +38 -0
- package/dist/src/server/express/server.d.ts +26 -0
- package/dist/src/server/express/server.js +115 -0
- package/dist/src/server/express/test-request.d.ts +14 -0
- package/dist/src/server/express/test-request.js +47 -0
- package/dist/src/server/express/utils.d.ts +5 -0
- package/dist/src/server/express/utils.js +11 -0
- package/dist/src/server/index.d.ts +1 -0
- package/dist/src/server/index.js +1 -0
- package/dist/src/settings.d.ts +14 -0
- package/dist/src/settings.js +1 -0
- package/dist/src/ship.d.ts +2 -0
- package/dist/src/ship.js +15 -0
- package/dist/src/storage.d.ts +5 -0
- package/dist/src/storage.js +8 -0
- package/dist/src/types.d.ts +14 -0
- package/dist/src/types.js +1 -0
- package/package.json +90 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as armada from "@artinet/armada";
|
|
2
|
+
import * as sdk from "@artinet/sdk";
|
|
3
|
+
import { z } from "zod/v4";
|
|
4
|
+
export const TestRequestSchema = armada.CreateAgentRequestSchema.extend({
|
|
5
|
+
/**
|
|
6
|
+
* All the requested test tasks
|
|
7
|
+
*/
|
|
8
|
+
tests: z
|
|
9
|
+
.array(sdk.A2A.MessageSendParamsSchema)
|
|
10
|
+
.describe("All the requested test tasks"),
|
|
11
|
+
}).describe("The test deployment parameters");
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./definitions.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./definitions.js";
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import express from "express";
|
|
2
|
+
import { RequestAgentRoute, RequestContext } from "../../routes/request/index.js";
|
|
3
|
+
export declare const AGENT_FIELD_NAME = "agentId";
|
|
4
|
+
export type handler = (req: express.Request, res: express.Response, next: express.NextFunction, context: RequestContext, request?: RequestAgentRoute["implementation"]) => Promise<void>;
|
|
5
|
+
export declare function handle(req: express.Request, res: express.Response, _next: express.NextFunction, context: RequestContext, request?: RequestAgentRoute["implementation"]): Promise<void>;
|
|
6
|
+
export declare const factory: (request?: RequestAgentRoute["implementation"]) => handler;
|
|
7
|
+
/**
|
|
8
|
+
* Handler utilities for agent HTTP requests.
|
|
9
|
+
*
|
|
10
|
+
* Exports a reusable handler function for routing requests to agent instances,
|
|
11
|
+
* verifying agentId route param, and returning agent metadata
|
|
12
|
+
* or dispatching to JSON-RPC middleware as appropriate.
|
|
13
|
+
*
|
|
14
|
+
* Used by the deployment server to provide a standard agent endpoint interface.
|
|
15
|
+
*
|
|
16
|
+
* @module server/handlers/agent
|
|
17
|
+
*/
|
|
18
|
+
export interface Params {
|
|
19
|
+
request: express.Request;
|
|
20
|
+
response: express.Response;
|
|
21
|
+
next: express.NextFunction;
|
|
22
|
+
context: Omit<RequestContext, "agentId">;
|
|
23
|
+
handler: handler;
|
|
24
|
+
user: (request: express.Request) => Promise<string>;
|
|
25
|
+
}
|
|
26
|
+
export declare function request({ request: req, response: res, next, context, handler, user, }: Params): Promise<void>;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { INVALID_REQUEST } from "@artinet/sdk";
|
|
2
|
+
import { RequestAgent, } from "../../routes/request/index.js";
|
|
3
|
+
import * as sdk from "@artinet/sdk";
|
|
4
|
+
import { handleJSONRPCResponse } from "./rpc.js";
|
|
5
|
+
import { generateRequestId } from "./utils.js";
|
|
6
|
+
export const AGENT_FIELD_NAME = "agentId";
|
|
7
|
+
export async function handle(req, res, _next, context, request = RequestAgent) {
|
|
8
|
+
const requestId = generateRequestId(context, req);
|
|
9
|
+
let parsed;
|
|
10
|
+
if (req?.path?.endsWith("agent-card.json") ||
|
|
11
|
+
req?.path?.endsWith("agent.json")) {
|
|
12
|
+
parsed = {
|
|
13
|
+
jsonrpc: "2.0",
|
|
14
|
+
id: requestId,
|
|
15
|
+
method: "agentcard/get",
|
|
16
|
+
params: null,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
parsed = await sdk.validateSchema(sdk.A2A.A2ARequestSchema, req?.body ?? {});
|
|
21
|
+
}
|
|
22
|
+
const params = await sdk.validateSchema(sdk.A2A.RequestParamSchema, parsed.params);
|
|
23
|
+
const agentRequest = {
|
|
24
|
+
method: parsed.method,
|
|
25
|
+
params: params,
|
|
26
|
+
};
|
|
27
|
+
const response = await request(agentRequest, context);
|
|
28
|
+
sdk.logger.info(`handle agent request completed:${parsed.method}:response:${JSON.stringify(response, null, 2)}`);
|
|
29
|
+
await handleJSONRPCResponse(res, requestId, parsed.method, response);
|
|
30
|
+
}
|
|
31
|
+
export const factory = (request = RequestAgent) => async (req, res, next, context) => await handle(req, res, next, context, request);
|
|
32
|
+
export async function request({ request: req, response: res, next, context, handler = handle, user, }) {
|
|
33
|
+
const agentId = req?.params?.[AGENT_FIELD_NAME];
|
|
34
|
+
if (!agentId) {
|
|
35
|
+
return next(INVALID_REQUEST({ message: `${AGENT_FIELD_NAME} is required` }));
|
|
36
|
+
}
|
|
37
|
+
const requestContext = {
|
|
38
|
+
...context,
|
|
39
|
+
agentId,
|
|
40
|
+
requestId: generateRequestId(context, req),
|
|
41
|
+
userId: await user?.(req),
|
|
42
|
+
};
|
|
43
|
+
await handler(req, res, next, requestContext);
|
|
44
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import express from "express";
|
|
2
|
+
import { CreateAgentRoute } from "../../routes/create/index.js";
|
|
3
|
+
export type handler = (req: express.Request, res: express.Response, next: express.NextFunction, context: CreateAgentRoute["context"], deploy?: CreateAgentRoute["implementation"]) => Promise<void>;
|
|
4
|
+
export declare function handle(req: express.Request, res: express.Response, _next: express.NextFunction, context: CreateAgentRoute["context"], deploy?: CreateAgentRoute["implementation"]): Promise<void>;
|
|
5
|
+
export declare const factory: (deploy?: CreateAgentRoute["implementation"]) => handler;
|
|
6
|
+
export interface Params {
|
|
7
|
+
request: express.Request;
|
|
8
|
+
response: express.Response;
|
|
9
|
+
next: express.NextFunction;
|
|
10
|
+
context: CreateAgentRoute["context"];
|
|
11
|
+
handler: handler;
|
|
12
|
+
user: (req: express.Request) => Promise<string>;
|
|
13
|
+
}
|
|
14
|
+
export declare function request({ request: req, response: res, next, context, handler, user, }: Params): Promise<void>;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { CreateAgent, CreateAgentRequestSchema, } from "../../routes/create/index.js";
|
|
2
|
+
import { generateRequestId, generateRegistrationId } from "./utils.js";
|
|
3
|
+
import { logger, validateSchema } from "@artinet/sdk";
|
|
4
|
+
export async function handle(req, res, _next, context, deploy = CreateAgent) {
|
|
5
|
+
logger.warn(`handle deploy request with body: ${JSON.stringify(req.body)}`);
|
|
6
|
+
const request = await validateSchema(CreateAgentRequestSchema, req?.body ?? {});
|
|
7
|
+
context.registrationId = generateRegistrationId(request.config.uri);
|
|
8
|
+
const result = await deploy(request, context);
|
|
9
|
+
res.json(result);
|
|
10
|
+
}
|
|
11
|
+
export const factory = (deploy = CreateAgent) => async (req, res, next, context) => await handle(req, res, next, context, deploy);
|
|
12
|
+
export async function request({ request: req, response: res, next, context, handler = handle, user, }) {
|
|
13
|
+
const requestContext = {
|
|
14
|
+
...context,
|
|
15
|
+
requestId: generateRequestId(context, req),
|
|
16
|
+
userId: await user?.(req),
|
|
17
|
+
};
|
|
18
|
+
return await handler(req, res, next, requestContext);
|
|
19
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import express from "express";
|
|
2
|
+
import { ResultOrError } from "../../types.js";
|
|
3
|
+
export declare function toJSONRPCResponse(id: string, result_or_error: ResultOrError): {
|
|
4
|
+
jsonrpc: "2.0";
|
|
5
|
+
id: string;
|
|
6
|
+
result: unknown;
|
|
7
|
+
} | {
|
|
8
|
+
jsonrpc: "2.0";
|
|
9
|
+
id: string;
|
|
10
|
+
error: unknown;
|
|
11
|
+
};
|
|
12
|
+
export declare function handleJSONRPCResponse(res: express.Response, id: string, method: string, response: ResultOrError): Promise<void>;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import * as sdk from "@artinet/sdk";
|
|
2
|
+
export function toJSONRPCResponse(id, result_or_error) {
|
|
3
|
+
if (result_or_error.type === "success") {
|
|
4
|
+
return { jsonrpc: "2.0", id, result: result_or_error.result };
|
|
5
|
+
}
|
|
6
|
+
if (result_or_error.type === "error") {
|
|
7
|
+
return { jsonrpc: "2.0", id, error: result_or_error.error };
|
|
8
|
+
}
|
|
9
|
+
throw new Error("Invalid response type");
|
|
10
|
+
}
|
|
11
|
+
export async function handleJSONRPCResponse(res, id, method, response) {
|
|
12
|
+
if (response.type === "success" && method === "agentcard/get") {
|
|
13
|
+
res.json(response.result);
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
if (response.type === "success") {
|
|
17
|
+
res.json(toJSONRPCResponse(String(id), response));
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
if (response.type === "error") {
|
|
21
|
+
res.status(500).json(toJSONRPCResponse(String(id), response));
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
if (response.type === "stream") {
|
|
25
|
+
res.writeHead(200, {
|
|
26
|
+
"Content-Type": "text/event-stream",
|
|
27
|
+
"Cache-Control": "no-cache",
|
|
28
|
+
Connection: "keep-alive",
|
|
29
|
+
});
|
|
30
|
+
const stream = response.stream;
|
|
31
|
+
for await (const data of stream) {
|
|
32
|
+
res.write(`data: ${JSON.stringify({ jsonrpc: "2.0", id, result: data })}\n\n`);
|
|
33
|
+
}
|
|
34
|
+
res.end();
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
throw sdk.INTERNAL_ERROR({ message: "Unknown response type" });
|
|
38
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Server } from "http";
|
|
2
|
+
import express from "express";
|
|
3
|
+
import { CreateAgentRoute } from "../../routes/create/index.js";
|
|
4
|
+
import { Settings as FleetSettings } from "../../settings.js";
|
|
5
|
+
import * as agent from "./agent-request.js";
|
|
6
|
+
import * as testing from "./test-request.js";
|
|
7
|
+
import * as deployment from "./deploy-request.js";
|
|
8
|
+
export type Settings = FleetSettings & {
|
|
9
|
+
user?: (req: express.Request) => Promise<string>;
|
|
10
|
+
retrieve?: agent.handler;
|
|
11
|
+
deploy?: deployment.handler;
|
|
12
|
+
evaluate?: testing.handler;
|
|
13
|
+
auth?: (req: express.Request, res: express.Response, next: express.NextFunction) => Promise<void>;
|
|
14
|
+
};
|
|
15
|
+
export interface Options {
|
|
16
|
+
app?: express.Application;
|
|
17
|
+
authOnRetrieve?: boolean;
|
|
18
|
+
enableTesting?: boolean;
|
|
19
|
+
}
|
|
20
|
+
export declare function fleet(settings?: Partial<Settings>, { app, authOnRetrieve, enableTesting, }?: Options): {
|
|
21
|
+
app: express.Application;
|
|
22
|
+
launch: (port: number) => Server;
|
|
23
|
+
ship: (agents: CreateAgentRoute["request"][]) => Promise<{
|
|
24
|
+
launch: (port?: number) => Server;
|
|
25
|
+
}>;
|
|
26
|
+
};
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import * as sdk from "@artinet/sdk";
|
|
2
|
+
import express from "express";
|
|
3
|
+
import { DEFAULTS } from "../../default.js";
|
|
4
|
+
import * as agent from "./agent-request.js";
|
|
5
|
+
import * as testing from "./test-request.js";
|
|
6
|
+
import * as deployment from "./deploy-request.js";
|
|
7
|
+
import { AGENT_FIELD_NAME } from "./agent-request.js";
|
|
8
|
+
const createContext = (settings) => {
|
|
9
|
+
const _settings = {
|
|
10
|
+
...DEFAULTS,
|
|
11
|
+
...settings,
|
|
12
|
+
retrieve: agent.factory(settings.get ?? DEFAULTS.get),
|
|
13
|
+
deploy: deployment.factory(settings.set ?? DEFAULTS.set),
|
|
14
|
+
evaluate: testing.factory(settings.test ?? DEFAULTS.test),
|
|
15
|
+
user: settings.user
|
|
16
|
+
? settings.user
|
|
17
|
+
: (_req) => Promise.resolve(settings.userId ?? "default"),
|
|
18
|
+
};
|
|
19
|
+
return _settings;
|
|
20
|
+
};
|
|
21
|
+
const createRequestContext = (context) => {
|
|
22
|
+
//clear session data between requests
|
|
23
|
+
return {
|
|
24
|
+
...context,
|
|
25
|
+
headers: undefined,
|
|
26
|
+
userId: undefined,
|
|
27
|
+
found: undefined,
|
|
28
|
+
target: undefined,
|
|
29
|
+
defaultInstructions: undefined,
|
|
30
|
+
agentId: undefined,
|
|
31
|
+
agents: undefined,
|
|
32
|
+
requestId: undefined,
|
|
33
|
+
timestamp: undefined,
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
export function fleet(settings = DEFAULTS, { app = express(), authOnRetrieve = false, enableTesting = true, } = {}) {
|
|
37
|
+
const context = createContext(settings);
|
|
38
|
+
const { basePath, agentPath, fallbackPath, deploymentPath, testPath, auth, user, evaluate, deploy, retrieve, set, } = context;
|
|
39
|
+
const router = express.Router();
|
|
40
|
+
router.use(express.json());
|
|
41
|
+
if (auth) {
|
|
42
|
+
router.use(testPath, auth);
|
|
43
|
+
router.use(deploymentPath, auth);
|
|
44
|
+
if (authOnRetrieve) {
|
|
45
|
+
router.use(agentPath, auth);
|
|
46
|
+
router.use(fallbackPath, auth);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (enableTesting === true && evaluate !== undefined) {
|
|
50
|
+
router.post(testPath, async (req, res, next) => await testing.request({
|
|
51
|
+
request: req,
|
|
52
|
+
response: res,
|
|
53
|
+
next,
|
|
54
|
+
context: createRequestContext(context),
|
|
55
|
+
handler: evaluate,
|
|
56
|
+
user,
|
|
57
|
+
}), sdk.errorHandler);
|
|
58
|
+
}
|
|
59
|
+
router.post(deploymentPath, async (req, res, next) => await deployment.request({
|
|
60
|
+
request: req,
|
|
61
|
+
response: res,
|
|
62
|
+
next,
|
|
63
|
+
context: createRequestContext(context),
|
|
64
|
+
handler: deploy,
|
|
65
|
+
user,
|
|
66
|
+
}));
|
|
67
|
+
router.use(`${agentPath}/:${AGENT_FIELD_NAME}`, async (req, res, next) => await agent.request({
|
|
68
|
+
request: req,
|
|
69
|
+
response: res,
|
|
70
|
+
next,
|
|
71
|
+
context: createRequestContext(context),
|
|
72
|
+
handler: retrieve,
|
|
73
|
+
user,
|
|
74
|
+
}), sdk.errorHandler);
|
|
75
|
+
router.use(`${fallbackPath}/:${AGENT_FIELD_NAME}`, async (req, res, next) => await agent.request({
|
|
76
|
+
request: req,
|
|
77
|
+
response: res,
|
|
78
|
+
next,
|
|
79
|
+
context: createRequestContext(context),
|
|
80
|
+
handler: retrieve,
|
|
81
|
+
user,
|
|
82
|
+
}), sdk.errorHandler);
|
|
83
|
+
app.use(basePath, router);
|
|
84
|
+
const launch = (port = 3000) => {
|
|
85
|
+
return app.listen(port, () => {
|
|
86
|
+
sdk.logger.info(`Fleet server running on http://localhost:${port}`);
|
|
87
|
+
});
|
|
88
|
+
};
|
|
89
|
+
const ship = async (agents) => {
|
|
90
|
+
for (const agent of agents) {
|
|
91
|
+
const response = await set(agent, context);
|
|
92
|
+
if (response.success) {
|
|
93
|
+
sdk.logger.info(`Agent shipped: ${response.agentId}`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return { launch };
|
|
97
|
+
};
|
|
98
|
+
return { app, launch, ship };
|
|
99
|
+
}
|
|
100
|
+
// const swarm = await fleet().ship([
|
|
101
|
+
// {
|
|
102
|
+
// config: {
|
|
103
|
+
// uri: "my-agent",
|
|
104
|
+
// name: "my-agent",
|
|
105
|
+
// description: "A helpful assistant",
|
|
106
|
+
// modelId: "gpt-4",
|
|
107
|
+
// instructions: "You are a helpful assistant.",
|
|
108
|
+
// version: "1.0.0",
|
|
109
|
+
// skills: [],
|
|
110
|
+
// capabilities: {},
|
|
111
|
+
// services: [],
|
|
112
|
+
// },
|
|
113
|
+
// },
|
|
114
|
+
// ]);
|
|
115
|
+
// swarm.launch(3000);
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import express from "express";
|
|
2
|
+
import { TestAgentRoute } from "../../routes/request/index.js";
|
|
3
|
+
export type handler = (req: express.Request, res: express.Response, next: express.NextFunction, context: TestAgentRoute["context"], test?: TestAgentRoute["implementation"]) => Promise<void>;
|
|
4
|
+
export declare function handle(req: express.Request, res: express.Response, _next: express.NextFunction, context: TestAgentRoute["context"], test?: TestAgentRoute["implementation"]): Promise<void>;
|
|
5
|
+
export declare const factory: (test?: TestAgentRoute["implementation"]) => handler;
|
|
6
|
+
export interface Params {
|
|
7
|
+
request: express.Request;
|
|
8
|
+
response: express.Response;
|
|
9
|
+
next: express.NextFunction;
|
|
10
|
+
context: Omit<TestAgentRoute["context"], "agentId">;
|
|
11
|
+
handler: handler;
|
|
12
|
+
user: (request: express.Request) => Promise<string>;
|
|
13
|
+
}
|
|
14
|
+
export declare function request({ request: req, response: res, next, context, handler, user, }: Params): Promise<void>;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import * as sdk from "@artinet/sdk";
|
|
2
|
+
import { TestAgent, TestRequestSchema, } from "../../routes/request/index.js";
|
|
3
|
+
import { v4 as uuidv4 } from "uuid";
|
|
4
|
+
import { handleJSONRPCResponse } from "./rpc.js";
|
|
5
|
+
import { generateRequestId } from "./utils.js";
|
|
6
|
+
export async function handle(req, res, _next, context, test = TestAgent) {
|
|
7
|
+
let parsed = await sdk.validateSchema(TestRequestSchema, req?.body ?? {});
|
|
8
|
+
let id = parsed.id ?? uuidv4();
|
|
9
|
+
parsed.id = id;
|
|
10
|
+
let request = parsed;
|
|
11
|
+
context.target = parsed.config;
|
|
12
|
+
request.method = "test/invoke";
|
|
13
|
+
request.params = null;
|
|
14
|
+
const response = await test(request, context);
|
|
15
|
+
await handleJSONRPCResponse(res, String(id), request.method, response);
|
|
16
|
+
}
|
|
17
|
+
export const factory = (test = TestAgent) => async (req, res, next, context) => await handle(req, res, next, context, test);
|
|
18
|
+
const MAX_TEST_ID_ATTEMPTS = 10;
|
|
19
|
+
const getTestId = async (context) => {
|
|
20
|
+
let testId = uuidv4();
|
|
21
|
+
let free = false;
|
|
22
|
+
for (let i = 0; i < MAX_TEST_ID_ATTEMPTS; i++) {
|
|
23
|
+
if (await context.storage.get(testId)) {
|
|
24
|
+
testId = uuidv4();
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
free = true;
|
|
28
|
+
break;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
if (!free) {
|
|
32
|
+
throw sdk.INTERNAL_ERROR({
|
|
33
|
+
message: `Failed to find a free test agent ID after ${MAX_TEST_ID_ATTEMPTS} attempts`,
|
|
34
|
+
id: testId,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
return testId;
|
|
38
|
+
};
|
|
39
|
+
export async function request({ request: req, response: res, next, context, handler = handle, user, }) {
|
|
40
|
+
const requestContext = {
|
|
41
|
+
...context,
|
|
42
|
+
agentId: await getTestId(context),
|
|
43
|
+
requestId: generateRequestId(context, req),
|
|
44
|
+
userId: await user?.(req),
|
|
45
|
+
};
|
|
46
|
+
return await handler(req, res, next, requestContext);
|
|
47
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { v4 as uuidv4 } from "uuid";
|
|
2
|
+
import slugify from "@sindresorhus/slugify";
|
|
3
|
+
export function generateRequestId(context, req) {
|
|
4
|
+
return (context.requestId ??
|
|
5
|
+
req?.headers?.["x-request-id"] ??
|
|
6
|
+
req?.body?.id ??
|
|
7
|
+
uuidv4());
|
|
8
|
+
}
|
|
9
|
+
export const generateRegistrationId = (uri) => {
|
|
10
|
+
return slugify(uri.replace(/^(agent|registration):/i, ""));
|
|
11
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * as exp from "./express/index.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * as exp from "./express/index.js";
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { RequestAgentRoute, TestAgentRoute } from "./routes/index.js";
|
|
2
|
+
import { CreateAgentRoute } from "./routes/create/index.js";
|
|
3
|
+
import { Configuration } from "./types.js";
|
|
4
|
+
export interface Params extends Configuration {
|
|
5
|
+
basePath?: string;
|
|
6
|
+
fallbackPath?: string;
|
|
7
|
+
deploymentPath?: string;
|
|
8
|
+
testPath?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface Settings extends Params {
|
|
11
|
+
get: RequestAgentRoute["implementation"];
|
|
12
|
+
set: CreateAgentRoute["implementation"];
|
|
13
|
+
test?: TestAgentRoute["implementation"];
|
|
14
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/src/ship.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import * as sdk from "@artinet/sdk";
|
|
2
|
+
import * as armada from "@artinet/armada";
|
|
3
|
+
import { API } from "@artinet/types";
|
|
4
|
+
export async function ship(fleetUrl = "http://localhost:3000", request) {
|
|
5
|
+
const requestBody = await sdk.validateSchema(armada.CreateAgentRequestSchema, request);
|
|
6
|
+
sdk.logger.warn(`deployAgent request: ${JSON.stringify(requestBody)}`);
|
|
7
|
+
const response = await fetch(`${fleetUrl}/deploy`, {
|
|
8
|
+
method: "POST",
|
|
9
|
+
headers: {
|
|
10
|
+
"Content-Type": "application/json",
|
|
11
|
+
},
|
|
12
|
+
body: JSON.stringify(requestBody),
|
|
13
|
+
});
|
|
14
|
+
return await sdk.validateSchema(API.CreateAgentResponseSchema, response.json());
|
|
15
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import * as SDK from "@artinet/sdk";
|
|
2
|
+
export class InMemoryStore extends SDK.Manager {
|
|
3
|
+
async search(query) {
|
|
4
|
+
return Array.from(this.data.values()).filter((value) => value.agentId.includes(query) ||
|
|
5
|
+
value.name.includes(query) ||
|
|
6
|
+
value.prompt.includes(query));
|
|
7
|
+
}
|
|
8
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { RequestAgentRoute, TestAgentRoute } from "./routes/index.js";
|
|
2
|
+
import { CreateAgentRoute } from "./routes/create/index.js";
|
|
3
|
+
export type Config = RequestAgentRoute["context"] & CreateAgentRoute["context"] & TestAgentRoute["context"];
|
|
4
|
+
export type Configuration = Omit<Config, "agentId">;
|
|
5
|
+
export type ResultOrError<Result = unknown, Error = unknown, Stream = unknown> = {
|
|
6
|
+
type: "success";
|
|
7
|
+
result: Result;
|
|
8
|
+
} | {
|
|
9
|
+
type: "error";
|
|
10
|
+
error: Error;
|
|
11
|
+
} | {
|
|
12
|
+
type: "stream";
|
|
13
|
+
stream: AsyncIterable<Stream>;
|
|
14
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/package.json
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@artinet/fleet",
|
|
3
|
+
"version": "0.1.0-alpha.1",
|
|
4
|
+
"description": "A an agentic orchestration server for on premise deployment.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js",
|
|
13
|
+
"default": "./dist/index.js"
|
|
14
|
+
},
|
|
15
|
+
"./express": {
|
|
16
|
+
"types": "./dist/server/express/fleet.d.ts",
|
|
17
|
+
"import": "./dist/server/express/fleet.js",
|
|
18
|
+
"default": "./dist/server/express/fleet.js"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "tsc --project tsconfig.json",
|
|
23
|
+
"test": "NODE_OPTIONS=--experimental-vm-modules jest",
|
|
24
|
+
"lint": "eslint .",
|
|
25
|
+
"clean": "rimraf dist",
|
|
26
|
+
"prepublishOnly": "npm run build && npm test"
|
|
27
|
+
},
|
|
28
|
+
"keywords": [
|
|
29
|
+
"artinet",
|
|
30
|
+
"a2a",
|
|
31
|
+
"mcp",
|
|
32
|
+
"agent",
|
|
33
|
+
"deployment",
|
|
34
|
+
"orchestration",
|
|
35
|
+
"artificial intelligence"
|
|
36
|
+
],
|
|
37
|
+
"author": "artinet",
|
|
38
|
+
"license": "Apache-2.0",
|
|
39
|
+
"repository": {
|
|
40
|
+
"type": "git",
|
|
41
|
+
"url": "git+https://github.com/the-artinet-project/artinet.git"
|
|
42
|
+
},
|
|
43
|
+
"bugs": {
|
|
44
|
+
"url": "https://github.com/the-artinet-project/artinet/issues"
|
|
45
|
+
},
|
|
46
|
+
"homepage": "https://github.com/the-artinet-project/artinet#readme",
|
|
47
|
+
"files": [
|
|
48
|
+
"dist",
|
|
49
|
+
"package.json",
|
|
50
|
+
"README.md",
|
|
51
|
+
"LICENSE"
|
|
52
|
+
],
|
|
53
|
+
"rootDir": ".",
|
|
54
|
+
"dependencies": {
|
|
55
|
+
"@artinet/armada": "^0.1.0-alpha.1",
|
|
56
|
+
"@artinet/sdk": "^0.6.0-preview.2",
|
|
57
|
+
"@artinet/types": "^0.0.9-alpha.4",
|
|
58
|
+
"@sindresorhus/slugify": "^3.0.0",
|
|
59
|
+
"agent-def": "^0.0.2-alpha.1",
|
|
60
|
+
"orc8": "^0.0.20-alpha.2",
|
|
61
|
+
"zod": "^3.25"
|
|
62
|
+
},
|
|
63
|
+
"peerDependencies": {
|
|
64
|
+
"@modelcontextprotocol/sdk": "^1.24.3",
|
|
65
|
+
"@opentelemetry/api": "^1.9.0",
|
|
66
|
+
"express": "^5.2.1",
|
|
67
|
+
"openai": "^6.15.0"
|
|
68
|
+
},
|
|
69
|
+
"devDependencies": {
|
|
70
|
+
"@artinet/loader": "^0.0.1",
|
|
71
|
+
"@eslint/js": "^9.25.1",
|
|
72
|
+
"@types/express": "^5.0.0",
|
|
73
|
+
"@types/jest": "^29.5.14",
|
|
74
|
+
"@types/node": "^22.15.3",
|
|
75
|
+
"@types/supertest": "^6.0.3",
|
|
76
|
+
"eslint": "^9.25.1",
|
|
77
|
+
"globals": "^16.0.0",
|
|
78
|
+
"jest": "^29.7.0",
|
|
79
|
+
"pino": "^10.1.0",
|
|
80
|
+
"rimraf": "^5.0.5",
|
|
81
|
+
"supertest": "latest",
|
|
82
|
+
"ts-jest": "^29.3.2",
|
|
83
|
+
"ts-node": "^10.9.2",
|
|
84
|
+
"typescript": "^5.8.3",
|
|
85
|
+
"typescript-eslint": "^8.31.1"
|
|
86
|
+
},
|
|
87
|
+
"engines": {
|
|
88
|
+
"node": ">=18.9.1"
|
|
89
|
+
}
|
|
90
|
+
}
|