@agent-native/core 0.2.7 → 0.3.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 +59 -26
- package/dist/a2a/agent-card.d.ts +3 -0
- package/dist/a2a/agent-card.d.ts.map +1 -0
- package/dist/a2a/agent-card.js +26 -0
- package/dist/a2a/agent-card.js.map +1 -0
- package/dist/a2a/client.d.ts +25 -0
- package/dist/a2a/client.d.ts.map +1 -0
- package/dist/a2a/client.js +119 -0
- package/dist/a2a/client.js.map +1 -0
- package/dist/a2a/handlers.d.ts +4 -0
- package/dist/a2a/handlers.d.ts.map +1 -0
- package/dist/a2a/handlers.js +252 -0
- package/dist/a2a/handlers.js.map +1 -0
- package/dist/a2a/index.d.ts +4 -0
- package/dist/a2a/index.d.ts.map +1 -0
- package/dist/a2a/index.js +5 -0
- package/dist/a2a/index.js.map +1 -0
- package/dist/a2a/middleware.d.ts +3 -0
- package/dist/a2a/middleware.d.ts.map +1 -0
- package/dist/a2a/middleware.js +36 -0
- package/dist/a2a/middleware.js.map +1 -0
- package/dist/a2a/server.d.ts +4 -0
- package/dist/a2a/server.d.ts.map +1 -0
- package/dist/a2a/server.js +18 -0
- package/dist/a2a/server.js.map +1 -0
- package/dist/a2a/task-store.d.ts +10 -0
- package/dist/a2a/task-store.d.ts.map +1 -0
- package/dist/a2a/task-store.js +73 -0
- package/dist/a2a/task-store.js.map +1 -0
- package/dist/a2a/types.d.ts +109 -0
- package/dist/a2a/types.d.ts.map +1 -0
- package/dist/a2a/types.js +3 -0
- package/dist/a2a/types.js.map +1 -0
- package/dist/adapters/cli/index.d.ts +4 -0
- package/dist/adapters/cli/index.d.ts.map +1 -0
- package/dist/adapters/cli/index.js +3 -0
- package/dist/adapters/cli/index.js.map +1 -0
- package/dist/adapters/cli/registry.d.ts +33 -0
- package/dist/adapters/cli/registry.d.ts.map +1 -0
- package/dist/adapters/cli/registry.js +62 -0
- package/dist/adapters/cli/registry.js.map +1 -0
- package/dist/adapters/cli/shell-adapter.d.ts +42 -0
- package/dist/adapters/cli/shell-adapter.d.ts.map +1 -0
- package/dist/adapters/cli/shell-adapter.js +57 -0
- package/dist/adapters/cli/shell-adapter.js.map +1 -0
- package/dist/adapters/cli/types.d.ts +24 -0
- package/dist/adapters/cli/types.d.ts.map +1 -0
- package/dist/adapters/cli/types.js +2 -0
- package/dist/adapters/cli/types.js.map +1 -0
- package/dist/adapters/firestore/adapter.d.ts.map +1 -1
- package/dist/adapters/firestore/adapter.js.map +1 -1
- package/dist/adapters/neon/adapter.d.ts.map +1 -1
- package/dist/adapters/neon/adapter.js +37 -21
- package/dist/adapters/neon/adapter.js.map +1 -1
- package/dist/adapters/supabase/adapter.d.ts.map +1 -1
- package/dist/adapters/supabase/adapter.js +10 -2
- package/dist/adapters/supabase/adapter.js.map +1 -1
- package/dist/adapters/sync/file-sync.d.ts.map +1 -1
- package/dist/adapters/sync/file-sync.js.map +1 -1
- package/dist/adapters/sync/index.d.ts +2 -2
- package/dist/adapters/sync/index.d.ts.map +1 -1
- package/dist/adapters/sync/index.js +1 -1
- package/dist/adapters/sync/index.js.map +1 -1
- package/dist/adapters/sync/merge.js +1 -2
- package/dist/adapters/sync/merge.js.map +1 -1
- package/dist/adapters/sync/types.d.ts.map +1 -1
- package/dist/cli/create.d.ts.map +1 -1
- package/dist/cli/create.js.map +1 -1
- package/dist/cli/index.js +15 -13
- package/dist/cli/index.js.map +1 -1
- package/dist/client/components/ApiKeySettings.d.ts +1 -1
- package/dist/client/components/ApiKeySettings.d.ts.map +1 -1
- package/dist/client/components/ApiKeySettings.js +9 -4
- package/dist/client/components/ApiKeySettings.js.map +1 -1
- package/dist/client/components/MissingKeyCard.d.ts +1 -1
- package/dist/client/components/MissingKeyCard.d.ts.map +1 -1
- package/dist/client/components/MissingKeyCard.js +1 -1
- package/dist/client/components/MissingKeyCard.js.map +1 -1
- package/dist/client/harness.d.ts +10 -0
- package/dist/client/harness.d.ts.map +1 -1
- package/dist/client/harness.js +27 -0
- package/dist/client/harness.js.map +1 -1
- package/dist/client/index.d.ts +1 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +1 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/use-file-watcher.d.ts.map +1 -1
- package/dist/client/use-file-watcher.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/scripts/utils.d.ts.map +1 -1
- package/dist/scripts/utils.js +3 -1
- package/dist/scripts/utils.js.map +1 -1
- package/dist/server/create-server.d.ts.map +1 -1
- package/dist/server/create-server.js +2 -1
- package/dist/server/create-server.js.map +1 -1
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +1 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/missing-key.d.ts.map +1 -1
- package/dist/server/missing-key.js.map +1 -1
- package/dist/server/production.d.ts.map +1 -1
- package/dist/server/production.js.map +1 -1
- package/dist/server/sse.d.ts +1 -1
- package/dist/server/sse.d.ts.map +1 -1
- package/dist/server/sse.js.map +1 -1
- package/dist/shared/agent-chat.d.ts +18 -0
- package/dist/shared/agent-chat.d.ts.map +1 -1
- package/dist/shared/agent-chat.js +35 -0
- package/dist/shared/agent-chat.js.map +1 -1
- package/dist/shared/index.d.ts +1 -1
- package/dist/shared/index.d.ts.map +1 -1
- package/dist/shared/index.js +1 -1
- package/dist/shared/index.js.map +1 -1
- package/package.json +127 -125
- package/src/templates/default/.agents/skills/capture-learnings/SKILL.md +50 -0
- package/src/templates/default/.agents/skills/create-skill/SKILL.md +167 -0
- package/src/templates/default/.agents/skills/delegate-to-agent/SKILL.md +90 -0
- package/src/templates/default/.agents/skills/files-as-database/SKILL.md +91 -0
- package/src/templates/default/.agents/skills/frontend-design/SKILL.md +69 -0
- package/src/templates/default/.agents/skills/scripts/SKILL.md +118 -0
- package/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +79 -0
- package/src/templates/default/.agents/skills/sse-file-watcher/SKILL.md +95 -0
- package/src/templates/default/.claude/settings.json +86 -68
- package/src/templates/default/.prettierrc +5 -5
- package/src/templates/default/AGENTS.md +86 -69
- package/src/templates/default/client/App.tsx +56 -54
- package/src/templates/default/client/global.css +75 -72
- package/src/templates/default/client/lib/utils.ts +1 -1
- package/src/templates/default/client/vite-env.d.ts +1 -1
- package/src/templates/default/components.json +20 -20
- package/src/templates/default/index.html +14 -14
- package/src/templates/default/package.json +43 -43
- package/src/templates/default/postcss.config.js +6 -6
- package/src/templates/default/scripts/hello.ts +20 -20
- package/src/templates/default/scripts/run.ts +9 -9
- package/src/templates/default/server/index.ts +22 -18
- package/src/templates/default/server/node-build.ts +4 -4
- package/src/templates/default/shared/api.ts +6 -6
- package/src/templates/default/tailwind.config.ts +7 -7
- package/src/templates/default/tsconfig.json +3 -3
- package/src/templates/default/vite.config.server.ts +3 -3
- package/src/templates/default/vite.config.ts +3 -3
- package/tsconfig.base.json +41 -41
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export function createAuthMiddleware(apiKeyEnv) {
|
|
2
|
+
return (req, res, next) => {
|
|
3
|
+
if (!apiKeyEnv) {
|
|
4
|
+
next();
|
|
5
|
+
return;
|
|
6
|
+
}
|
|
7
|
+
const expectedKey = process.env[apiKeyEnv];
|
|
8
|
+
if (!expectedKey) {
|
|
9
|
+
// No key configured — skip auth (dev mode)
|
|
10
|
+
next();
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
const authHeader = req.headers.authorization;
|
|
14
|
+
if (!authHeader || !authHeader.startsWith("Bearer ")) {
|
|
15
|
+
const error = {
|
|
16
|
+
jsonrpc: "2.0",
|
|
17
|
+
id: null,
|
|
18
|
+
error: { code: -32001, message: "Authentication required" },
|
|
19
|
+
};
|
|
20
|
+
res.status(401).json(error);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const token = authHeader.slice(7);
|
|
24
|
+
if (token !== expectedKey) {
|
|
25
|
+
const error = {
|
|
26
|
+
jsonrpc: "2.0",
|
|
27
|
+
id: null,
|
|
28
|
+
error: { code: -32001, message: "Invalid API key" },
|
|
29
|
+
};
|
|
30
|
+
res.status(401).json(error);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
next();
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/a2a/middleware.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,oBAAoB,CAAC,SAA6B;IAChE,OAAO,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAQ,EAAE;QAC/D,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,IAAI,EAAE,CAAC;YACP,OAAO;QACT,CAAC;QAED,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC3C,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,2CAA2C;YAC3C,IAAI,EAAE,CAAC;YACP,OAAO;QACT,CAAC;QAED,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC;QAC7C,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACrD,MAAM,KAAK,GAAoB;gBAC7B,OAAO,EAAE,KAAK;gBACd,EAAE,EAAE,IAAI;gBACR,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,yBAAyB,EAAE;aAC5D,CAAC;YACF,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC5B,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAClC,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAoB;gBAC7B,OAAO,EAAE,KAAK;gBACd,EAAE,EAAE,IAAI;gBACR,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE;aACpD,CAAC;YACF,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC5B,OAAO;QACT,CAAC;QAED,IAAI,EAAE,CAAC;IACT,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/a2a/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAK5C,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI,CAe/D"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { generateAgentCard } from "./agent-card.js";
|
|
2
|
+
import { createAuthMiddleware } from "./middleware.js";
|
|
3
|
+
import { handleJsonRpc } from "./handlers.js";
|
|
4
|
+
export function enableA2A(app, config) {
|
|
5
|
+
const auth = createAuthMiddleware(config.apiKeyEnv);
|
|
6
|
+
// Public agent card endpoint (no auth)
|
|
7
|
+
app.get("/.well-known/agent-card.json", (req, res) => {
|
|
8
|
+
const protocol = req.protocol;
|
|
9
|
+
const host = req.get("host") ?? "localhost";
|
|
10
|
+
const baseUrl = `${protocol}://${host}`;
|
|
11
|
+
res.json(generateAgentCard(config, baseUrl));
|
|
12
|
+
});
|
|
13
|
+
// JSON-RPC endpoint (with auth)
|
|
14
|
+
app.post("/a2a", auth, (req, res) => {
|
|
15
|
+
handleJsonRpc(req, res, config);
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/a2a/server.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,UAAU,SAAS,CAAC,GAAY,EAAE,MAAiB;IACvD,MAAM,IAAI,GAAG,oBAAoB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAEpD,uCAAuC;IACvC,GAAG,CAAC,GAAG,CAAC,8BAA8B,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACnD,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;QAC9B,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC;QAC5C,MAAM,OAAO,GAAG,GAAG,QAAQ,MAAM,IAAI,EAAE,CAAC;QACxC,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,gCAAgC;IAChC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAClC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Task, Message, TaskState } from "./types.js";
|
|
2
|
+
export declare function createTask(message: Message, contextId?: string): Task;
|
|
3
|
+
export declare function getTask(id: string): Task | null;
|
|
4
|
+
export declare function updateTask(id: string, update: {
|
|
5
|
+
state?: TaskState;
|
|
6
|
+
message?: Message;
|
|
7
|
+
artifacts?: Task["artifacts"];
|
|
8
|
+
}): Task | null;
|
|
9
|
+
export declare function listTasks(contextId?: string): Task[];
|
|
10
|
+
//# sourceMappingURL=task-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-store.d.ts","sourceRoot":"","sources":["../../src/a2a/task-store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAY3D,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAcrE;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAO/C;AAED,wBAAgB,UAAU,CACxB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE;IACN,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;CAC/B,GACA,IAAI,GAAG,IAAI,CAsBb;AAED,wBAAgB,SAAS,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,CAkBpD"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import crypto from "crypto";
|
|
4
|
+
const TASKS_DIR = path.join(process.cwd(), "data", "a2a-tasks");
|
|
5
|
+
function ensureDir() {
|
|
6
|
+
fs.mkdirSync(TASKS_DIR, { recursive: true });
|
|
7
|
+
}
|
|
8
|
+
function taskPath(id) {
|
|
9
|
+
return path.join(TASKS_DIR, `${id}.json`);
|
|
10
|
+
}
|
|
11
|
+
export function createTask(message, contextId) {
|
|
12
|
+
ensureDir();
|
|
13
|
+
const task = {
|
|
14
|
+
id: crypto.randomUUID(),
|
|
15
|
+
contextId,
|
|
16
|
+
status: {
|
|
17
|
+
state: "submitted",
|
|
18
|
+
timestamp: new Date().toISOString(),
|
|
19
|
+
},
|
|
20
|
+
history: [message],
|
|
21
|
+
artifacts: [],
|
|
22
|
+
};
|
|
23
|
+
fs.writeFileSync(taskPath(task.id), JSON.stringify(task, null, 2));
|
|
24
|
+
return task;
|
|
25
|
+
}
|
|
26
|
+
export function getTask(id) {
|
|
27
|
+
try {
|
|
28
|
+
const data = fs.readFileSync(taskPath(id), "utf-8");
|
|
29
|
+
return JSON.parse(data);
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export function updateTask(id, update) {
|
|
36
|
+
const task = getTask(id);
|
|
37
|
+
if (!task)
|
|
38
|
+
return null;
|
|
39
|
+
if (update.state) {
|
|
40
|
+
task.status = {
|
|
41
|
+
state: update.state,
|
|
42
|
+
message: update.message ?? task.status.message,
|
|
43
|
+
timestamp: new Date().toISOString(),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
if (update.message && task.history) {
|
|
47
|
+
task.history.push(update.message);
|
|
48
|
+
}
|
|
49
|
+
if (update.artifacts) {
|
|
50
|
+
task.artifacts = [...(task.artifacts ?? []), ...update.artifacts];
|
|
51
|
+
}
|
|
52
|
+
fs.writeFileSync(taskPath(id), JSON.stringify(task, null, 2));
|
|
53
|
+
return task;
|
|
54
|
+
}
|
|
55
|
+
export function listTasks(contextId) {
|
|
56
|
+
ensureDir();
|
|
57
|
+
const files = fs.readdirSync(TASKS_DIR).filter((f) => f.endsWith(".json"));
|
|
58
|
+
const tasks = [];
|
|
59
|
+
for (const file of files) {
|
|
60
|
+
try {
|
|
61
|
+
const data = fs.readFileSync(path.join(TASKS_DIR, file), "utf-8");
|
|
62
|
+
const task = JSON.parse(data);
|
|
63
|
+
if (!contextId || task.contextId === contextId) {
|
|
64
|
+
tasks.push(task);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
// Skip invalid files
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return tasks;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=task-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-store.js","sourceRoot":"","sources":["../../src/a2a/task-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
export interface TextPart {
|
|
2
|
+
type: "text";
|
|
3
|
+
text: string;
|
|
4
|
+
}
|
|
5
|
+
export interface FilePart {
|
|
6
|
+
type: "file";
|
|
7
|
+
file: {
|
|
8
|
+
name?: string;
|
|
9
|
+
mimeType?: string;
|
|
10
|
+
bytes?: string;
|
|
11
|
+
uri?: string;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
export interface DataPart {
|
|
15
|
+
type: "data";
|
|
16
|
+
data: Record<string, unknown>;
|
|
17
|
+
}
|
|
18
|
+
export type Part = TextPart | FilePart | DataPart;
|
|
19
|
+
export interface Message {
|
|
20
|
+
role: "user" | "agent";
|
|
21
|
+
parts: Part[];
|
|
22
|
+
metadata?: Record<string, unknown>;
|
|
23
|
+
}
|
|
24
|
+
export type TaskState = "submitted" | "working" | "completed" | "failed" | "canceled" | "input-required";
|
|
25
|
+
export interface TaskStatus {
|
|
26
|
+
state: TaskState;
|
|
27
|
+
message?: Message;
|
|
28
|
+
timestamp: string;
|
|
29
|
+
}
|
|
30
|
+
export interface Artifact {
|
|
31
|
+
name?: string;
|
|
32
|
+
description?: string;
|
|
33
|
+
parts: Part[];
|
|
34
|
+
metadata?: Record<string, unknown>;
|
|
35
|
+
}
|
|
36
|
+
export interface Task {
|
|
37
|
+
id: string;
|
|
38
|
+
contextId?: string;
|
|
39
|
+
status: TaskStatus;
|
|
40
|
+
history?: Message[];
|
|
41
|
+
artifacts?: Artifact[];
|
|
42
|
+
metadata?: Record<string, unknown>;
|
|
43
|
+
}
|
|
44
|
+
export interface AgentSkill {
|
|
45
|
+
id: string;
|
|
46
|
+
name: string;
|
|
47
|
+
description: string;
|
|
48
|
+
tags?: string[];
|
|
49
|
+
examples?: string[];
|
|
50
|
+
}
|
|
51
|
+
export interface AgentCapabilities {
|
|
52
|
+
streaming?: boolean;
|
|
53
|
+
pushNotifications?: boolean;
|
|
54
|
+
stateTransitionHistory?: boolean;
|
|
55
|
+
}
|
|
56
|
+
export interface AgentSecurityScheme {
|
|
57
|
+
type: string;
|
|
58
|
+
scheme?: string;
|
|
59
|
+
in?: string;
|
|
60
|
+
name?: string;
|
|
61
|
+
}
|
|
62
|
+
export interface AgentCard {
|
|
63
|
+
name: string;
|
|
64
|
+
description: string;
|
|
65
|
+
url: string;
|
|
66
|
+
version: string;
|
|
67
|
+
protocolVersion: "0.3";
|
|
68
|
+
capabilities: AgentCapabilities;
|
|
69
|
+
skills: AgentSkill[];
|
|
70
|
+
securitySchemes?: Record<string, AgentSecurityScheme>;
|
|
71
|
+
security?: Record<string, string[]>[];
|
|
72
|
+
}
|
|
73
|
+
export interface JsonRpcRequest {
|
|
74
|
+
jsonrpc: "2.0";
|
|
75
|
+
id: string | number;
|
|
76
|
+
method: string;
|
|
77
|
+
params?: Record<string, unknown>;
|
|
78
|
+
}
|
|
79
|
+
export interface JsonRpcError {
|
|
80
|
+
code: number;
|
|
81
|
+
message: string;
|
|
82
|
+
data?: unknown;
|
|
83
|
+
}
|
|
84
|
+
export interface JsonRpcResponse {
|
|
85
|
+
jsonrpc: "2.0";
|
|
86
|
+
id: string | number | null;
|
|
87
|
+
result?: unknown;
|
|
88
|
+
error?: JsonRpcError;
|
|
89
|
+
}
|
|
90
|
+
export interface A2AHandlerContext {
|
|
91
|
+
taskId: string;
|
|
92
|
+
contextId?: string;
|
|
93
|
+
writeArtifact: (name: string, content: string, mimeType?: string) => string;
|
|
94
|
+
}
|
|
95
|
+
export interface A2AHandlerResult {
|
|
96
|
+
message: Message;
|
|
97
|
+
artifacts?: Artifact[];
|
|
98
|
+
}
|
|
99
|
+
export type A2AHandler = (message: Message, context: A2AHandlerContext) => Promise<A2AHandlerResult> | AsyncGenerator<Message>;
|
|
100
|
+
export interface A2AConfig {
|
|
101
|
+
name: string;
|
|
102
|
+
description: string;
|
|
103
|
+
version?: string;
|
|
104
|
+
skills: AgentSkill[];
|
|
105
|
+
handler?: A2AHandler;
|
|
106
|
+
apiKeyEnv?: string;
|
|
107
|
+
streaming?: boolean;
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/a2a/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/a2a/types.ts"],"names":[],"mappings":"AAAA,0DAA0D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/cli/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EACL,eAAe,EACf,KAAK,sBAAsB,GAC5B,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/cli/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EACL,eAAe,GAEhB,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { CliAdapter } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Registry of CLI adapters available to the agent.
|
|
4
|
+
*
|
|
5
|
+
* Register adapters at app startup. The agent can then discover what
|
|
6
|
+
* CLIs are available and execute commands through them.
|
|
7
|
+
*/
|
|
8
|
+
export declare class CliRegistry {
|
|
9
|
+
private adapters;
|
|
10
|
+
/** Register an adapter. Replaces any existing adapter with the same name. */
|
|
11
|
+
register(adapter: CliAdapter): void;
|
|
12
|
+
/** Unregister an adapter by name. */
|
|
13
|
+
unregister(name: string): void;
|
|
14
|
+
/** Get an adapter by name. Returns undefined if not registered. */
|
|
15
|
+
get(name: string): CliAdapter | undefined;
|
|
16
|
+
/** List all registered adapters. */
|
|
17
|
+
list(): CliAdapter[];
|
|
18
|
+
/**
|
|
19
|
+
* List only adapters whose CLI is currently available (installed).
|
|
20
|
+
* Checks each adapter in parallel.
|
|
21
|
+
*/
|
|
22
|
+
listAvailable(): Promise<CliAdapter[]>;
|
|
23
|
+
/**
|
|
24
|
+
* Return a summary of all registered adapters for agent discovery.
|
|
25
|
+
* Includes availability status.
|
|
26
|
+
*/
|
|
27
|
+
describe(): Promise<{
|
|
28
|
+
name: string;
|
|
29
|
+
description: string;
|
|
30
|
+
available: boolean;
|
|
31
|
+
}[]>;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/adapters/cli/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C;;;;;GAKG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAiC;IAEjD,6EAA6E;IAC7E,QAAQ,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;IAInC,qCAAqC;IACrC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI9B,mEAAmE;IACnE,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAIzC,oCAAoC;IACpC,IAAI,IAAI,UAAU,EAAE;IAIpB;;;OAGG;IACG,aAAa,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAe5C;;;OAGG;IACG,QAAQ,IAAI,OAAO,CACvB;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE,EAAE,CAC5D;CAgBF"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry of CLI adapters available to the agent.
|
|
3
|
+
*
|
|
4
|
+
* Register adapters at app startup. The agent can then discover what
|
|
5
|
+
* CLIs are available and execute commands through them.
|
|
6
|
+
*/
|
|
7
|
+
export class CliRegistry {
|
|
8
|
+
adapters = new Map();
|
|
9
|
+
/** Register an adapter. Replaces any existing adapter with the same name. */
|
|
10
|
+
register(adapter) {
|
|
11
|
+
this.adapters.set(adapter.name, adapter);
|
|
12
|
+
}
|
|
13
|
+
/** Unregister an adapter by name. */
|
|
14
|
+
unregister(name) {
|
|
15
|
+
this.adapters.delete(name);
|
|
16
|
+
}
|
|
17
|
+
/** Get an adapter by name. Returns undefined if not registered. */
|
|
18
|
+
get(name) {
|
|
19
|
+
return this.adapters.get(name);
|
|
20
|
+
}
|
|
21
|
+
/** List all registered adapters. */
|
|
22
|
+
list() {
|
|
23
|
+
return [...this.adapters.values()];
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* List only adapters whose CLI is currently available (installed).
|
|
27
|
+
* Checks each adapter in parallel.
|
|
28
|
+
*/
|
|
29
|
+
async listAvailable() {
|
|
30
|
+
const entries = this.list();
|
|
31
|
+
const checks = await Promise.all(entries.map(async (adapter) => {
|
|
32
|
+
try {
|
|
33
|
+
const available = await adapter.isAvailable();
|
|
34
|
+
return available ? adapter : null;
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
}));
|
|
40
|
+
return checks.filter((a) => a !== null);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Return a summary of all registered adapters for agent discovery.
|
|
44
|
+
* Includes availability status.
|
|
45
|
+
*/
|
|
46
|
+
async describe() {
|
|
47
|
+
const entries = this.list();
|
|
48
|
+
return Promise.all(entries.map(async (adapter) => {
|
|
49
|
+
let available = false;
|
|
50
|
+
try {
|
|
51
|
+
available = await adapter.isAvailable();
|
|
52
|
+
}
|
|
53
|
+
catch { }
|
|
54
|
+
return {
|
|
55
|
+
name: adapter.name,
|
|
56
|
+
description: adapter.description,
|
|
57
|
+
available,
|
|
58
|
+
};
|
|
59
|
+
}));
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/adapters/cli/registry.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,OAAO,WAAW;IACd,QAAQ,GAAG,IAAI,GAAG,EAAsB,CAAC;IAEjD,6EAA6E;IAC7E,QAAQ,CAAC,OAAmB;QAC1B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,qCAAqC;IACrC,UAAU,CAAC,IAAY;QACrB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED,mEAAmE;IACnE,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,oCAAoC;IACpC,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACrC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,aAAa;QACjB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;YAC5B,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC;gBAC9C,OAAO,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;YACpC,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC,CAAC,CACH,CAAC;QACF,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAmB,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IAC3D,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,QAAQ;QAGZ,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,OAAO,OAAO,CAAC,GAAG,CAChB,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;YAC5B,IAAI,SAAS,GAAG,KAAK,CAAC;YACtB,IAAI,CAAC;gBACH,SAAS,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC;YAC1C,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;YACV,OAAO;gBACL,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,SAAS;aACV,CAAC;QACJ,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { CliAdapter, CliResult } from "./types.js";
|
|
2
|
+
export interface ShellCliAdapterOptions {
|
|
3
|
+
/** The CLI binary name or path (e.g. "gh", "/usr/local/bin/ffmpeg"). */
|
|
4
|
+
command: string;
|
|
5
|
+
/** Human-readable description for agent discovery. */
|
|
6
|
+
description: string;
|
|
7
|
+
/**
|
|
8
|
+
* Optional display name. Defaults to `command`.
|
|
9
|
+
* Use this when the binary name differs from how you want to reference it
|
|
10
|
+
* (e.g. command: "python3", name: "python").
|
|
11
|
+
*/
|
|
12
|
+
name?: string;
|
|
13
|
+
/** Environment variables to pass to the CLI process. Merged with process.env. */
|
|
14
|
+
env?: Record<string, string>;
|
|
15
|
+
/** Working directory for the CLI process. Defaults to process.cwd(). */
|
|
16
|
+
cwd?: string;
|
|
17
|
+
/** Timeout in milliseconds. Default: 30000 (30s). */
|
|
18
|
+
timeoutMs?: number;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Generic adapter that wraps any CLI binary. Use this to quickly register
|
|
22
|
+
* a CLI without writing a custom adapter class.
|
|
23
|
+
*
|
|
24
|
+
* ```ts
|
|
25
|
+
* const gh = new ShellCliAdapter({
|
|
26
|
+
* command: "gh",
|
|
27
|
+
* description: "GitHub CLI for repos, PRs, issues, and releases",
|
|
28
|
+
* });
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export declare class ShellCliAdapter implements CliAdapter {
|
|
32
|
+
readonly name: string;
|
|
33
|
+
readonly description: string;
|
|
34
|
+
private command;
|
|
35
|
+
private env;
|
|
36
|
+
private cwd;
|
|
37
|
+
private timeoutMs;
|
|
38
|
+
constructor(options: ShellCliAdapterOptions);
|
|
39
|
+
isAvailable(): Promise<boolean>;
|
|
40
|
+
execute(args: string[]): Promise<CliResult>;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=shell-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell-adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/cli/shell-adapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAExD,MAAM,WAAW,sBAAsB;IACrC,wEAAwE;IACxE,OAAO,EAAE,MAAM,CAAC;IAEhB,sDAAsD;IACtD,WAAW,EAAE,MAAM,CAAC;IAEpB;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,iFAAiF;IACjF,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE7B,wEAAwE;IACxE,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;GAUG;AACH,qBAAa,eAAgB,YAAW,UAAU;IAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,GAAG,CAAqC;IAChD,OAAO,CAAC,GAAG,CAAqB;IAChC,OAAO,CAAC,SAAS,CAAS;gBAEd,OAAO,EAAE,sBAAsB;IASrC,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IASrC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC;CAyB5C"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
/**
|
|
3
|
+
* Generic adapter that wraps any CLI binary. Use this to quickly register
|
|
4
|
+
* a CLI without writing a custom adapter class.
|
|
5
|
+
*
|
|
6
|
+
* ```ts
|
|
7
|
+
* const gh = new ShellCliAdapter({
|
|
8
|
+
* command: "gh",
|
|
9
|
+
* description: "GitHub CLI for repos, PRs, issues, and releases",
|
|
10
|
+
* });
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
export class ShellCliAdapter {
|
|
14
|
+
name;
|
|
15
|
+
description;
|
|
16
|
+
command;
|
|
17
|
+
env;
|
|
18
|
+
cwd;
|
|
19
|
+
timeoutMs;
|
|
20
|
+
constructor(options) {
|
|
21
|
+
this.name = options.name ?? options.command;
|
|
22
|
+
this.description = options.description;
|
|
23
|
+
this.command = options.command;
|
|
24
|
+
this.env = options.env;
|
|
25
|
+
this.cwd = options.cwd;
|
|
26
|
+
this.timeoutMs = options.timeoutMs ?? 30_000;
|
|
27
|
+
}
|
|
28
|
+
async isAvailable() {
|
|
29
|
+
try {
|
|
30
|
+
const result = await this.execute(["--version"]);
|
|
31
|
+
return result.exitCode === 0;
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
execute(args) {
|
|
38
|
+
return new Promise((resolve) => {
|
|
39
|
+
const child = execFile(this.command, args, {
|
|
40
|
+
env: this.env ? { ...process.env, ...this.env } : process.env,
|
|
41
|
+
cwd: this.cwd,
|
|
42
|
+
timeout: this.timeoutMs,
|
|
43
|
+
maxBuffer: 10 * 1024 * 1024, // 10MB
|
|
44
|
+
encoding: "utf-8",
|
|
45
|
+
}, (error, stdout, stderr) => {
|
|
46
|
+
resolve({
|
|
47
|
+
stdout: stdout ?? "",
|
|
48
|
+
stderr: stderr ?? "",
|
|
49
|
+
exitCode: error?.code === "ERR_CHILD_PROCESS_STDIO_MAXBUFFER"
|
|
50
|
+
? 1
|
|
51
|
+
: (error?.code ?? child.exitCode ?? 0),
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=shell-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell-adapter.js","sourceRoot":"","sources":["../../../src/adapters/cli/shell-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AA2B9C;;;;;;;;;;GAUG;AACH,MAAM,OAAO,eAAe;IACjB,IAAI,CAAS;IACb,WAAW,CAAS;IAErB,OAAO,CAAS;IAChB,GAAG,CAAqC;IACxC,GAAG,CAAqB;IACxB,SAAS,CAAS;IAE1B,YAAY,OAA+B;QACzC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;QAC5C,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;QACvC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;QACvB,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,WAAW;QACf,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;YACjD,OAAO,MAAM,CAAC,QAAQ,KAAK,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,OAAO,CAAC,IAAc;QACpB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,MAAM,KAAK,GAAG,QAAQ,CACpB,IAAI,CAAC,OAAO,EACZ,IAAI,EACJ;gBACE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG;gBAC7D,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,OAAO,EAAE,IAAI,CAAC,SAAS;gBACvB,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,OAAO;gBACpC,QAAQ,EAAE,OAAO;aAClB,EACD,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;gBACxB,OAAO,CAAC;oBACN,MAAM,EAAE,MAAM,IAAI,EAAE;oBACpB,MAAM,EAAE,MAAM,IAAI,EAAE;oBACpB,QAAQ,EACN,KAAK,EAAE,IAAI,KAAK,mCAAmC;wBACjD,CAAC,CAAC,CAAC;wBACH,CAAC,CAAC,CAAE,KAAa,EAAE,IAAI,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,CAAC;iBACpD,CAAC,CAAC;YACL,CAAC,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Result of executing a CLI command.
|
|
3
|
+
*/
|
|
4
|
+
export interface CliResult {
|
|
5
|
+
stdout: string;
|
|
6
|
+
stderr: string;
|
|
7
|
+
exitCode: number;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* A CLI adapter provides a standard interface for the agent to discover
|
|
11
|
+
* and execute CLI tools. Each adapter wraps a single CLI (gh, stripe,
|
|
12
|
+
* ffmpeg, etc.) and handles auth, output parsing, and error handling.
|
|
13
|
+
*/
|
|
14
|
+
export interface CliAdapter {
|
|
15
|
+
/** Short name used to invoke this adapter (e.g. "gh", "stripe", "ffmpeg"). */
|
|
16
|
+
name: string;
|
|
17
|
+
/** Human-readable description of what this CLI does — shown to the agent for discovery. */
|
|
18
|
+
description: string;
|
|
19
|
+
/** Check whether the CLI is installed and accessible. */
|
|
20
|
+
isAvailable(): Promise<boolean>;
|
|
21
|
+
/** Execute the CLI with the given arguments. */
|
|
22
|
+
execute(args: string[]): Promise<CliResult>;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/adapters/cli/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,8EAA8E;IAC9E,IAAI,EAAE,MAAM,CAAC;IAEb,2FAA2F;IAC3F,WAAW,EAAE,MAAM,CAAC;IAEpB,yDAAyD;IACzD,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAEhC,gDAAgD;IAChD,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;CAC7C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/adapters/cli/types.ts"],"names":[],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/firestore/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/firestore/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,UAAU,EACV,UAAU,EACV,WAAW,EACZ,MAAM,kBAAkB,CAAC;AAM1B,MAAM,WAAW,mBAAmB;IAClC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,eAAe,CAAC;IACjC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,cAAc,CAAC;CAC9D;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACrC,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC5D,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC;IACvB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB,CAAC;CAC/C;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,cAAc,CAAC;IAC7D,GAAG,IAAI,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACvC,UAAU,CACR,MAAM,EAAE,CAAC,QAAQ,EAAE,sBAAsB,KAAK,IAAI,EAClD,OAAO,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,GAC5B,MAAM,IAAI,CAAC;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,OAAO,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,IAAI,GAAG,CAAC;CACb;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,oBAAoB,EAAE,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,IAAI,KAAK,CAAC;QAClB,IAAI,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;QACvC,GAAG,EAAE,oBAAoB,CAAC;KAC3B,CAAC,CAAC;CACJ;AAMD,qBAAa,wBAAyB,YAAW,eAAe;IAClD,OAAO,CAAC,aAAa;gBAAb,aAAa,EAAE,MAAM,mBAAmB;IAEtD,KAAK,CACT,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,UAAU,CAAA;KAAE,EAAE,CAAC;IAYxC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,UAAU,CAAA;KAAE,GAAG,IAAI,CAAC;IAMjE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3D,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvC,SAAS,CACP,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,IAAI,EACzC,OAAO,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,GAC5B,WAAW;CAaf"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/adapters/firestore/adapter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/adapters/firestore/adapter.ts"],"names":[],"mappings":"AA+CA,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E,MAAM,OAAO,wBAAwB;IACf;IAApB,YAAoB,aAAwC;QAAxC,kBAAa,GAAb,aAAa,CAA2B;IAAG,CAAC;IAEhE,KAAK,CAAC,KAAK,CACT,KAAa,EACb,OAAe;QAEf,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE;aACxC,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC;aACzB,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC;aAC/B,GAAG,EAAE,CAAC;QAET,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACjC,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,IAAI,EAAE,GAAG,CAAC,IAAI,EAAgB;SAC/B,CAAC,CAAC,CAAC;IACN,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,EAAU;QAClB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;QACrD,IAAI,CAAC,GAAG,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QAC7B,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAgB,EAAE,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,EAAU,EAAE,MAA2B;QAC/C,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;IAC9C,CAAC;IAED,SAAS,CACP,KAAa,EACb,OAAe,EACf,QAAyC,EACzC,OAA6B;QAE7B,OAAO,IAAI,CAAC,aAAa,EAAE;aACxB,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC;aACzB,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC;aAC/B,UAAU,CAAC,CAAC,QAAQ,EAAE,EAAE;YACvB,MAAM,OAAO,GAAiB,QAAQ,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBACnE,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE;gBACjB,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,EAAgB;aACtC,CAAC,CAAC,CAAC;YACJ,QAAQ,CAAC,OAAO,CAAC,CAAC;QACpB,CAAC,EAAE,OAAO,CAAC,CAAC;IAChB,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/neon/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/neon/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,UAAU,EACV,UAAU,EACV,WAAW,EACZ,MAAM,kBAAkB,CAAC;AAM1B,UAAU,eAAe;IACvB,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,KAAK,OAAO,GAAG,CACb,OAAO,EAAE,oBAAoB,EAC7B,GAAG,MAAM,EAAE,GAAG,EAAE,KACb,OAAO,CAAC,eAAe,CAAC,CAAC;AA6B9B,MAAM,WAAW,kBAAkB;IACjC,4DAA4D;IAC5D,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,mBAAoB,YAAW,eAAe;IAIvD,OAAO,CAAC,GAAG;IAHb,OAAO,CAAC,cAAc,CAAS;gBAGrB,GAAG,EAAE,OAAO,EACpB,OAAO,CAAC,EAAE,kBAAkB;IAKxB,KAAK,CACT,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,UAAU,CAAA;KAAE,EAAE,CAAC;IAUxC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,UAAU,CAAA;KAAE,GAAG,IAAI,CAAC;IASjE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB3D,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvC,SAAS,CACP,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,IAAI,EACzC,OAAO,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,GAC5B,WAAW;CA8Ef"}
|