warden-code 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +190 -0
- package/README.md +82 -0
- package/dist/cli/commands/clear.d.ts +3 -0
- package/dist/cli/commands/clear.d.ts.map +1 -0
- package/dist/cli/commands/clear.js +10 -0
- package/dist/cli/commands/clear.js.map +1 -0
- package/dist/cli/commands/exit.d.ts +3 -0
- package/dist/cli/commands/exit.d.ts.map +1 -0
- package/dist/cli/commands/exit.js +12 -0
- package/dist/cli/commands/exit.js.map +1 -0
- package/dist/cli/commands/help.d.ts +4 -0
- package/dist/cli/commands/help.d.ts.map +1 -0
- package/dist/cli/commands/help.js +44 -0
- package/dist/cli/commands/help.js.map +1 -0
- package/dist/cli/commands/index.d.ts +6 -0
- package/dist/cli/commands/index.d.ts.map +1 -0
- package/dist/cli/commands/index.js +6 -0
- package/dist/cli/commands/index.js.map +1 -0
- package/dist/cli/commands/new.d.ts +3 -0
- package/dist/cli/commands/new.d.ts.map +1 -0
- package/dist/cli/commands/new.js +184 -0
- package/dist/cli/commands/new.js.map +1 -0
- package/dist/cli/commands/registry.d.ts +12 -0
- package/dist/cli/commands/registry.d.ts.map +1 -0
- package/dist/cli/commands/registry.js +53 -0
- package/dist/cli/commands/registry.js.map +1 -0
- package/dist/cli/context.d.ts +3 -0
- package/dist/cli/context.d.ts.map +1 -0
- package/dist/cli/context.js +19 -0
- package/dist/cli/context.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +59 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/services/project.d.ts +8 -0
- package/dist/cli/services/project.d.ts.map +1 -0
- package/dist/cli/services/project.js +57 -0
- package/dist/cli/services/project.js.map +1 -0
- package/dist/cli/services/scaffolder.d.ts +10 -0
- package/dist/cli/services/scaffolder.d.ts.map +1 -0
- package/dist/cli/services/scaffolder.js +125 -0
- package/dist/cli/services/scaffolder.js.map +1 -0
- package/dist/cli/types.d.ts +37 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +2 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/cli/ui/format.d.ts +4 -0
- package/dist/cli/ui/format.d.ts.map +1 -0
- package/dist/cli/ui/format.js +23 -0
- package/dist/cli/ui/format.js.map +1 -0
- package/dist/templates/blank-multiturn/agent.ts.template +62 -0
- package/dist/templates/blank-streaming/agent.ts.template +62 -0
- package/dist/templates/openai-multiturn/agent.ts.template +99 -0
- package/dist/templates/openai-streaming/agent.ts.template +103 -0
- package/package.json +62 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
export class CommandRegistry {
|
|
2
|
+
commands = new Map();
|
|
3
|
+
aliases = new Map();
|
|
4
|
+
register(command) {
|
|
5
|
+
this.commands.set(command.name, command);
|
|
6
|
+
if (command.aliases) {
|
|
7
|
+
for (const alias of command.aliases) {
|
|
8
|
+
this.aliases.set(alias, command.name);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
get(name) {
|
|
13
|
+
const resolvedName = this.aliases.get(name) ?? name;
|
|
14
|
+
return this.commands.get(resolvedName);
|
|
15
|
+
}
|
|
16
|
+
has(name) {
|
|
17
|
+
return this.commands.has(name) || this.aliases.has(name);
|
|
18
|
+
}
|
|
19
|
+
all() {
|
|
20
|
+
return Array.from(this.commands.values()).sort((a, b) => (a.order ?? 100) - (b.order ?? 100));
|
|
21
|
+
}
|
|
22
|
+
async execute(input, context) {
|
|
23
|
+
const parsed = this.parseInput(input);
|
|
24
|
+
if (!parsed) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
const { commandName, args } = parsed;
|
|
28
|
+
const command = this.get(commandName);
|
|
29
|
+
if (!command) {
|
|
30
|
+
context.log.error(`Unknown command: /${commandName}`);
|
|
31
|
+
context.log.dim("Type /help to see available commands");
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
await command.handler(args, context);
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
parseInput(input) {
|
|
38
|
+
const trimmed = input.trim();
|
|
39
|
+
if (!trimmed.startsWith("/")) {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
const parts = trimmed.slice(1).split(/\s+/);
|
|
43
|
+
const commandName = parts[0]?.toLowerCase();
|
|
44
|
+
if (!commandName) {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
commandName,
|
|
49
|
+
args: parts.slice(1),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/cli/commands/registry.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,eAAe;IAClB,QAAQ,GAA8B,IAAI,GAAG,EAAE,CAAC;IAChD,OAAO,GAAwB,IAAI,GAAG,EAAE,CAAC;IAEjD,QAAQ,CAAC,OAAqB;QAC5B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACzC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;IACH,CAAC;IAED,GAAG,CAAC,IAAY;QACd,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;QACpD,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACzC,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC3D,CAAC;IAED,GAAG;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAC5C,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,CAC9C,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,KAAa,EAAE,OAAmB;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAEtC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,qBAAqB,WAAW,EAAE,CAAC,CAAC;YACtD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;YACxD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,UAAU,CAChB,KAAa;QAEb,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5C,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;QAC5C,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO;YACL,WAAW;YACX,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;SACrB,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/cli/context.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAU,MAAM,YAAY,CAAC;AAYrD,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAMrD"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import ora from "ora";
|
|
3
|
+
function createLogger() {
|
|
4
|
+
return {
|
|
5
|
+
info: (msg) => console.log(chalk.blue("ℹ"), msg),
|
|
6
|
+
success: (msg) => console.log(chalk.green("✓"), msg),
|
|
7
|
+
error: (msg) => console.log(chalk.red("✗"), msg),
|
|
8
|
+
warn: (msg) => console.log(chalk.yellow("⚠"), msg),
|
|
9
|
+
dim: (msg) => console.log(chalk.dim(msg)),
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export function createContext(cwd) {
|
|
13
|
+
return {
|
|
14
|
+
cwd,
|
|
15
|
+
log: createLogger(),
|
|
16
|
+
spinner: (msg) => ora(msg),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/cli/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AAGtB,SAAS,YAAY;IACnB,OAAO;QACL,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;QACxD,OAAO,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;QAC5D,KAAK,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;QACxD,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;QAC1D,GAAG,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;KAClD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,OAAO;QACL,GAAG;QACH,GAAG,EAAE,YAAY,EAAE;QACnB,OAAO,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC;KACnC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import * as readline from "node:readline";
|
|
3
|
+
import { createContext } from "./context.js";
|
|
4
|
+
import { CommandRegistry, createHelpCommand, clearCommand, exitCommand, newCommand, } from "./commands/index.js";
|
|
5
|
+
import { banner, prompt } from "./ui/format.js";
|
|
6
|
+
async function main() {
|
|
7
|
+
const context = createContext(process.cwd());
|
|
8
|
+
const registry = new CommandRegistry();
|
|
9
|
+
// Register commands
|
|
10
|
+
registry.register(createHelpCommand(registry));
|
|
11
|
+
registry.register(clearCommand);
|
|
12
|
+
registry.register(exitCommand);
|
|
13
|
+
registry.register(newCommand);
|
|
14
|
+
// Display welcome banner and available commands
|
|
15
|
+
console.log(banner());
|
|
16
|
+
await registry.execute("/help", context);
|
|
17
|
+
const createRl = () => readline.createInterface({
|
|
18
|
+
input: process.stdin,
|
|
19
|
+
output: process.stdout,
|
|
20
|
+
});
|
|
21
|
+
let rl = createRl();
|
|
22
|
+
let pausedForCommand = false;
|
|
23
|
+
const handleClose = () => {
|
|
24
|
+
if (pausedForCommand)
|
|
25
|
+
return;
|
|
26
|
+
console.log("\nGoodbye!");
|
|
27
|
+
process.exit(0);
|
|
28
|
+
};
|
|
29
|
+
rl.on("close", handleClose);
|
|
30
|
+
const promptUser = () => {
|
|
31
|
+
rl.question(prompt(), async (input) => {
|
|
32
|
+
const trimmed = input.trim();
|
|
33
|
+
if (!trimmed) {
|
|
34
|
+
promptUser();
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
if (trimmed.startsWith("/")) {
|
|
38
|
+
// Close readline before running command (Inquirer needs stdin)
|
|
39
|
+
pausedForCommand = true;
|
|
40
|
+
rl.close();
|
|
41
|
+
await registry.execute(trimmed, context);
|
|
42
|
+
// Recreate readline after command completes
|
|
43
|
+
rl = createRl();
|
|
44
|
+
pausedForCommand = false;
|
|
45
|
+
rl.on("close", handleClose);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
context.log.dim("Commands start with /. Type /help for available commands.");
|
|
49
|
+
}
|
|
50
|
+
promptUser();
|
|
51
|
+
});
|
|
52
|
+
};
|
|
53
|
+
promptUser();
|
|
54
|
+
}
|
|
55
|
+
main().catch((err) => {
|
|
56
|
+
console.error("Fatal error:", err);
|
|
57
|
+
process.exit(1);
|
|
58
|
+
});
|
|
59
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,WAAW,EACX,UAAU,GACX,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAEhD,KAAK,UAAU,IAAI;IACjB,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;IAEvC,oBAAoB;IACpB,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC/C,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IAChC,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC/B,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAE9B,gDAAgD;IAChD,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IACtB,MAAM,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAEzC,MAAM,QAAQ,GAAG,GAAG,EAAE,CACpB,QAAQ,CAAC,eAAe,CAAC;QACvB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEL,IAAI,EAAE,GAAG,QAAQ,EAAE,CAAC;IACpB,IAAI,gBAAgB,GAAG,KAAK,CAAC;IAE7B,MAAM,WAAW,GAAG,GAAG,EAAE;QACvB,IAAI,gBAAgB;YAAE,OAAO;QAC7B,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAE5B,MAAM,UAAU,GAAG,GAAG,EAAE;QACtB,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YACpC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;YAE7B,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,UAAU,EAAE,CAAC;gBACb,OAAO;YACT,CAAC;YAED,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC5B,+DAA+D;gBAC/D,gBAAgB,GAAG,IAAI,CAAC;gBACxB,EAAE,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBACzC,4CAA4C;gBAC5C,EAAE,GAAG,QAAQ,EAAE,CAAC;gBAChB,gBAAgB,GAAG,KAAK,CAAC;gBACzB,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YAC9B,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,GAAG,CACb,2DAA2D,CAC5D,CAAC;YACJ,CAAC;YAED,UAAU,EAAE,CAAC;QACf,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,UAAU,EAAE,CAAC;AACf,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare function isDirectoryEmpty(dirPath: string): Promise<boolean>;
|
|
2
|
+
export declare function directoryExists(dirPath: string): Promise<boolean>;
|
|
3
|
+
export declare function fileExists(filePath: string): Promise<boolean>;
|
|
4
|
+
export declare function createDirectory(dirPath: string): Promise<void>;
|
|
5
|
+
export declare function writeFile(filePath: string, content: string): Promise<void>;
|
|
6
|
+
export declare function readFile(filePath: string): Promise<string>;
|
|
7
|
+
export declare function copyDirectory(src: string, dest: string): Promise<void>;
|
|
8
|
+
//# sourceMappingURL=project.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../../src/cli/services/project.ts"],"names":[],"mappings":"AAGA,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CASxE;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOvE;AAED,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOnE;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpE;AAED,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEhE;AAED,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAc5E"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import * as fs from "node:fs/promises";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
export async function isDirectoryEmpty(dirPath) {
|
|
4
|
+
try {
|
|
5
|
+
const entries = await fs.readdir(dirPath);
|
|
6
|
+
// Ignore hidden files like .git, .claude, etc.
|
|
7
|
+
const visibleEntries = entries.filter((e) => !e.startsWith("."));
|
|
8
|
+
return visibleEntries.length === 0;
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return true;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export async function directoryExists(dirPath) {
|
|
15
|
+
try {
|
|
16
|
+
const stat = await fs.stat(dirPath);
|
|
17
|
+
return stat.isDirectory();
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export async function fileExists(filePath) {
|
|
24
|
+
try {
|
|
25
|
+
const stat = await fs.stat(filePath);
|
|
26
|
+
return stat.isFile();
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export async function createDirectory(dirPath) {
|
|
33
|
+
await fs.mkdir(dirPath, { recursive: true });
|
|
34
|
+
}
|
|
35
|
+
export async function writeFile(filePath, content) {
|
|
36
|
+
const dir = path.dirname(filePath);
|
|
37
|
+
await createDirectory(dir);
|
|
38
|
+
await fs.writeFile(filePath, content, "utf-8");
|
|
39
|
+
}
|
|
40
|
+
export async function readFile(filePath) {
|
|
41
|
+
return fs.readFile(filePath, "utf-8");
|
|
42
|
+
}
|
|
43
|
+
export async function copyDirectory(src, dest) {
|
|
44
|
+
await createDirectory(dest);
|
|
45
|
+
const entries = await fs.readdir(src, { withFileTypes: true });
|
|
46
|
+
for (const entry of entries) {
|
|
47
|
+
const srcPath = path.join(src, entry.name);
|
|
48
|
+
const destPath = path.join(dest, entry.name);
|
|
49
|
+
if (entry.isDirectory()) {
|
|
50
|
+
await copyDirectory(srcPath, destPath);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
await fs.copyFile(srcPath, destPath);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../../src/cli/services/project.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAAe;IACpD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC1C,+CAA+C;QAC/C,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QACjE,OAAO,cAAc,CAAC,MAAM,KAAK,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAe;IACnD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB;IAC/C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAe;IACnD,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,QAAgB,EAChB,OAAe;IAEf,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,eAAe,CAAC,GAAG,CAAC,CAAC;IAC3B,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,QAAgB;IAC7C,OAAO,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAW,EAAE,IAAY;IAC3D,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;IAC5B,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAE/D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAE7C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { AgentConfig } from "../types.js";
|
|
2
|
+
export declare function getTemplateDir(template: string): Promise<string>;
|
|
3
|
+
export declare function readTemplate(template: string, filename: string): Promise<string>;
|
|
4
|
+
export declare function processTemplate(content: string, config: AgentConfig): string;
|
|
5
|
+
export declare function scaffoldAgent(targetDir: string, config: AgentConfig): Promise<void>;
|
|
6
|
+
/**
|
|
7
|
+
* Check if a template exists.
|
|
8
|
+
*/
|
|
9
|
+
export declare function templateExists(template: string): Promise<boolean>;
|
|
10
|
+
//# sourceMappingURL=scaffolder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffolder.d.ts","sourceRoot":"","sources":["../../../src/cli/services/scaffolder.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAK/C,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGtE;AAED,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CAIjB;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,MAAM,CAY5E;AAiFD,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,IAAI,CAAC,CA8Bf;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQvE"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import * as fs from "node:fs/promises";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { writeFile } from "./project.js";
|
|
5
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
6
|
+
export async function getTemplateDir(template) {
|
|
7
|
+
// Navigate from dist/cli/services to dist/templates
|
|
8
|
+
return path.resolve(__dirname, "../../templates", template);
|
|
9
|
+
}
|
|
10
|
+
export async function readTemplate(template, filename) {
|
|
11
|
+
const templateDir = await getTemplateDir(template);
|
|
12
|
+
const filePath = path.join(templateDir, filename);
|
|
13
|
+
return fs.readFile(filePath, "utf-8");
|
|
14
|
+
}
|
|
15
|
+
export function processTemplate(content, config) {
|
|
16
|
+
const skillsStr = config.skills
|
|
17
|
+
.map((s) => `{\n id: "${s.id}",\n name: "${s.name}",\n description: "${s.description}",\n tags: [],\n }`)
|
|
18
|
+
.join(",\n ");
|
|
19
|
+
return content
|
|
20
|
+
.replace(/\{\{name\}\}/g, config.name)
|
|
21
|
+
.replace(/\{\{description\}\}/g, config.description)
|
|
22
|
+
.replace(/\{\{skills\}\}/g, skillsStr);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Get the template directory name based on base template and capability.
|
|
26
|
+
*/
|
|
27
|
+
function getTemplateDirName(config) {
|
|
28
|
+
const capability = config.capabilities.streaming ? "streaming" : "multiturn";
|
|
29
|
+
return `${config.template}-${capability}`;
|
|
30
|
+
}
|
|
31
|
+
function generatePackageJson(config) {
|
|
32
|
+
const pkg = {
|
|
33
|
+
name: config.name,
|
|
34
|
+
version: "0.1.0",
|
|
35
|
+
type: "module",
|
|
36
|
+
main: "dist/agent.js",
|
|
37
|
+
scripts: {
|
|
38
|
+
build: "tsc",
|
|
39
|
+
dev: "tsc --watch",
|
|
40
|
+
agent: "node dist/agent.js",
|
|
41
|
+
},
|
|
42
|
+
dependencies: {
|
|
43
|
+
"@wardenprotocol/agent-kit": "^0.2.0",
|
|
44
|
+
dotenv: "^16.4.0",
|
|
45
|
+
},
|
|
46
|
+
devDependencies: {
|
|
47
|
+
"@types/node": "^22.8.1",
|
|
48
|
+
typescript: "^5.6.3",
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
// Add OpenAI dependency if using OpenAI template
|
|
52
|
+
if (config.template === "openai") {
|
|
53
|
+
pkg.dependencies["openai"] = "^4.69.0";
|
|
54
|
+
}
|
|
55
|
+
return JSON.stringify(pkg, null, 2);
|
|
56
|
+
}
|
|
57
|
+
function generateTsConfig() {
|
|
58
|
+
const tsconfig = {
|
|
59
|
+
compilerOptions: {
|
|
60
|
+
target: "ES2022",
|
|
61
|
+
module: "NodeNext",
|
|
62
|
+
moduleResolution: "NodeNext",
|
|
63
|
+
lib: ["ES2022"],
|
|
64
|
+
outDir: "./dist",
|
|
65
|
+
rootDir: "./src",
|
|
66
|
+
strict: true,
|
|
67
|
+
esModuleInterop: true,
|
|
68
|
+
skipLibCheck: true,
|
|
69
|
+
forceConsistentCasingInFileNames: true,
|
|
70
|
+
declaration: true,
|
|
71
|
+
sourceMap: true,
|
|
72
|
+
},
|
|
73
|
+
include: ["src/**/*"],
|
|
74
|
+
exclude: ["node_modules", "dist"],
|
|
75
|
+
};
|
|
76
|
+
return JSON.stringify(tsconfig, null, 2);
|
|
77
|
+
}
|
|
78
|
+
const GITIGNORE = `node_modules/
|
|
79
|
+
dist/
|
|
80
|
+
coverage/
|
|
81
|
+
*.log
|
|
82
|
+
.DS_Store
|
|
83
|
+
.env
|
|
84
|
+
.env.local
|
|
85
|
+
`;
|
|
86
|
+
const ENV_EXAMPLE_BLANK = `HOST=localhost
|
|
87
|
+
PORT=3000
|
|
88
|
+
`;
|
|
89
|
+
const ENV_EXAMPLE_OPENAI = `HOST=localhost
|
|
90
|
+
PORT=3000
|
|
91
|
+
OPENAI_API_KEY=your-api-key-here
|
|
92
|
+
OPENAI_MODEL=gpt-4o-mini
|
|
93
|
+
`;
|
|
94
|
+
export async function scaffoldAgent(targetDir, config) {
|
|
95
|
+
// Get the appropriate template directory based on template + capability
|
|
96
|
+
const templateDirName = getTemplateDirName(config);
|
|
97
|
+
// Read and process the agent template
|
|
98
|
+
const templateContent = await readTemplate(templateDirName, "agent.ts.template");
|
|
99
|
+
const processedContent = processTemplate(templateContent, config);
|
|
100
|
+
// Write the agent file
|
|
101
|
+
await writeFile(path.join(targetDir, "src", "agent.ts"), processedContent);
|
|
102
|
+
// Write package.json
|
|
103
|
+
await writeFile(path.join(targetDir, "package.json"), generatePackageJson(config));
|
|
104
|
+
// Write tsconfig.json
|
|
105
|
+
await writeFile(path.join(targetDir, "tsconfig.json"), generateTsConfig());
|
|
106
|
+
// Write .gitignore
|
|
107
|
+
await writeFile(path.join(targetDir, ".gitignore"), GITIGNORE);
|
|
108
|
+
// Write .env.example
|
|
109
|
+
const envExample = config.template === "openai" ? ENV_EXAMPLE_OPENAI : ENV_EXAMPLE_BLANK;
|
|
110
|
+
await writeFile(path.join(targetDir, ".env.example"), envExample);
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Check if a template exists.
|
|
114
|
+
*/
|
|
115
|
+
export async function templateExists(template) {
|
|
116
|
+
try {
|
|
117
|
+
const dir = await getTemplateDir(template);
|
|
118
|
+
await fs.access(dir);
|
|
119
|
+
return true;
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=scaffolder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffolder.js","sourceRoot":"","sources":["../../../src/cli/services/scaffolder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { Ora } from "ora";
|
|
2
|
+
export interface SlashCommand {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
aliases?: string[];
|
|
6
|
+
usage?: string;
|
|
7
|
+
order?: number;
|
|
8
|
+
handler: (args: string[], context: CliContext) => Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
export interface Logger {
|
|
11
|
+
info: (msg: string) => void;
|
|
12
|
+
success: (msg: string) => void;
|
|
13
|
+
error: (msg: string) => void;
|
|
14
|
+
warn: (msg: string) => void;
|
|
15
|
+
dim: (msg: string) => void;
|
|
16
|
+
}
|
|
17
|
+
export interface CliContext {
|
|
18
|
+
cwd: string;
|
|
19
|
+
log: Logger;
|
|
20
|
+
spinner: (msg: string) => Ora;
|
|
21
|
+
}
|
|
22
|
+
export interface AgentConfig {
|
|
23
|
+
name: string;
|
|
24
|
+
description: string;
|
|
25
|
+
template: "blank" | "openai";
|
|
26
|
+
capabilities: {
|
|
27
|
+
streaming: boolean;
|
|
28
|
+
multiTurn: boolean;
|
|
29
|
+
};
|
|
30
|
+
skills: AgentSkill[];
|
|
31
|
+
}
|
|
32
|
+
export interface AgentSkill {
|
|
33
|
+
id: string;
|
|
34
|
+
name: string;
|
|
35
|
+
description: string;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE/B,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACjE;AAED,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,GAAG,CAAC;CAC/B;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC7B,YAAY,EAAE;QACZ,SAAS,EAAE,OAAO,CAAC;QACnB,SAAS,EAAE,OAAO,CAAC;KACpB,CAAC;IACF,MAAM,EAAE,UAAU,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../../src/cli/ui/format.ts"],"names":[],"mappings":"AAEA,wBAAgB,MAAM,IAAI,MAAM,CAS/B;AAED,wBAAgB,MAAM,IAAI,MAAM,CAE/B;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAOrF"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
export function banner() {
|
|
3
|
+
return chalk.cyan(`
|
|
4
|
+
__ __ _
|
|
5
|
+
\\ \\ / /_ _ _ __ __| | ___ _ __
|
|
6
|
+
\\ \\ /\\ / / _\` | '__/ _\` |/ _ \\ '_ \\
|
|
7
|
+
\\ V V / (_| | | | (_| | __/ | | |
|
|
8
|
+
\\_/\\_/ \\__,_|_| \\__,_|\\___|_| |_|
|
|
9
|
+
|
|
10
|
+
`) + chalk.dim(" Agent Development CLI\n");
|
|
11
|
+
}
|
|
12
|
+
export function prompt() {
|
|
13
|
+
return chalk.green("warden") + chalk.dim("> ");
|
|
14
|
+
}
|
|
15
|
+
export function commandHelp(name, description, usage) {
|
|
16
|
+
let output = ` ${chalk.cyan("/" + name)}`;
|
|
17
|
+
output += chalk.dim(` - ${description}`);
|
|
18
|
+
if (usage) {
|
|
19
|
+
output += `\n ${chalk.dim("Usage:")} ${usage}`;
|
|
20
|
+
}
|
|
21
|
+
return output;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/cli/ui/format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,UAAU,MAAM;IACpB,OAAO,KAAK,CAAC,IAAI,CAAC;;;;;;;CAOnB,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,MAAM;IACpB,OAAO,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,WAAmB,EAAE,KAAc;IAC3E,IAAI,MAAM,GAAG,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC;IAC3C,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,WAAW,EAAE,CAAC,CAAC;IACzC,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,IAAI,SAAS,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,KAAK,EAAE,CAAC;IACpD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import "dotenv/config";
|
|
2
|
+
import { AgentServer } from "@wardenprotocol/agent-kit";
|
|
3
|
+
import type { TaskContext, TaskYieldUpdate } from "@wardenprotocol/agent-kit";
|
|
4
|
+
|
|
5
|
+
const PORT = Number(process.env.PORT) || 3000;
|
|
6
|
+
const HOST = process.env.HOST || "localhost";
|
|
7
|
+
const BASE_URL = `http://${HOST}:${PORT}`;
|
|
8
|
+
|
|
9
|
+
const server = new AgentServer({
|
|
10
|
+
agentCard: {
|
|
11
|
+
name: "{{name}}",
|
|
12
|
+
description: "{{description}}",
|
|
13
|
+
url: BASE_URL,
|
|
14
|
+
version: "0.1.0",
|
|
15
|
+
capabilities: {
|
|
16
|
+
streaming: false,
|
|
17
|
+
multiTurn: true,
|
|
18
|
+
},
|
|
19
|
+
skills: [{{skills}}],
|
|
20
|
+
},
|
|
21
|
+
handler: async function* (context: TaskContext): AsyncGenerator<TaskYieldUpdate> {
|
|
22
|
+
const userMessage = context.message.parts
|
|
23
|
+
?.filter((p) => p.type === "text")
|
|
24
|
+
.map((p) => p.text)
|
|
25
|
+
.join("\n");
|
|
26
|
+
|
|
27
|
+
if (!userMessage) {
|
|
28
|
+
yield {
|
|
29
|
+
state: "completed",
|
|
30
|
+
message: {
|
|
31
|
+
role: "agent",
|
|
32
|
+
parts: [{ type: "text", text: "No message provided." }],
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// TODO: Implement your agent logic here
|
|
39
|
+
yield {
|
|
40
|
+
state: "completed",
|
|
41
|
+
message: {
|
|
42
|
+
role: "agent",
|
|
43
|
+
parts: [{ type: "text", text: `Echo: ${userMessage}` }],
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
server.listen(PORT).then(() => {
|
|
50
|
+
console.log(`{{name}} (Dual Protocol)`);
|
|
51
|
+
console.log(`Server: ${BASE_URL}`);
|
|
52
|
+
console.log();
|
|
53
|
+
console.log("A2A Protocol:");
|
|
54
|
+
console.log(` Agent Card: ${BASE_URL}/.well-known/agent-card.json`);
|
|
55
|
+
console.log(` JSON-RPC: POST ${BASE_URL}/`);
|
|
56
|
+
console.log();
|
|
57
|
+
console.log("LangGraph Protocol:");
|
|
58
|
+
console.log(` Info: ${BASE_URL}/info`);
|
|
59
|
+
console.log(` Assistants: ${BASE_URL}/assistants`);
|
|
60
|
+
console.log(` Threads: ${BASE_URL}/threads`);
|
|
61
|
+
console.log(` Runs: ${BASE_URL}/runs`);
|
|
62
|
+
});
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import "dotenv/config";
|
|
2
|
+
import { AgentServer } from "@wardenprotocol/agent-kit";
|
|
3
|
+
import type { TaskContext, TaskYieldUpdate } from "@wardenprotocol/agent-kit";
|
|
4
|
+
|
|
5
|
+
const PORT = Number(process.env.PORT) || 3000;
|
|
6
|
+
const HOST = process.env.HOST || "localhost";
|
|
7
|
+
const BASE_URL = `http://${HOST}:${PORT}`;
|
|
8
|
+
|
|
9
|
+
const server = new AgentServer({
|
|
10
|
+
agentCard: {
|
|
11
|
+
name: "{{name}}",
|
|
12
|
+
description: "{{description}}",
|
|
13
|
+
url: BASE_URL,
|
|
14
|
+
version: "0.1.0",
|
|
15
|
+
capabilities: {
|
|
16
|
+
streaming: true,
|
|
17
|
+
multiTurn: false,
|
|
18
|
+
},
|
|
19
|
+
skills: [{{skills}}],
|
|
20
|
+
},
|
|
21
|
+
handler: async function* (context: TaskContext): AsyncGenerator<TaskYieldUpdate> {
|
|
22
|
+
const userMessage = context.message.parts
|
|
23
|
+
?.filter((p) => p.type === "text")
|
|
24
|
+
.map((p) => p.text)
|
|
25
|
+
.join("\n");
|
|
26
|
+
|
|
27
|
+
if (!userMessage) {
|
|
28
|
+
yield {
|
|
29
|
+
state: "completed",
|
|
30
|
+
message: {
|
|
31
|
+
role: "agent",
|
|
32
|
+
parts: [{ type: "text", text: "No message provided." }],
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// TODO: Implement your agent logic here
|
|
39
|
+
yield {
|
|
40
|
+
state: "completed",
|
|
41
|
+
message: {
|
|
42
|
+
role: "agent",
|
|
43
|
+
parts: [{ type: "text", text: `Echo: ${userMessage}` }],
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
server.listen(PORT).then(() => {
|
|
50
|
+
console.log(`{{name}} (Dual Protocol)`);
|
|
51
|
+
console.log(`Server: ${BASE_URL}`);
|
|
52
|
+
console.log();
|
|
53
|
+
console.log("A2A Protocol:");
|
|
54
|
+
console.log(` Agent Card: ${BASE_URL}/.well-known/agent-card.json`);
|
|
55
|
+
console.log(` JSON-RPC: POST ${BASE_URL}/`);
|
|
56
|
+
console.log();
|
|
57
|
+
console.log("LangGraph Protocol:");
|
|
58
|
+
console.log(` Info: ${BASE_URL}/info`);
|
|
59
|
+
console.log(` Assistants: ${BASE_URL}/assistants`);
|
|
60
|
+
console.log(` Threads: ${BASE_URL}/threads`);
|
|
61
|
+
console.log(` Runs: ${BASE_URL}/runs`);
|
|
62
|
+
});
|