warden-code 0.1.5 → 1.0.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 +16 -2
- package/dist/cli/commands/build.d.ts +3 -0
- package/dist/cli/commands/build.d.ts.map +1 -0
- package/dist/cli/commands/build.js +235 -0
- package/dist/cli/commands/build.js.map +1 -0
- package/dist/cli/commands/chat.d.ts +3 -0
- package/dist/cli/commands/chat.d.ts.map +1 -0
- package/dist/cli/commands/chat.js +214 -0
- package/dist/cli/commands/chat.js.map +1 -0
- package/dist/cli/commands/index.d.ts +2 -0
- package/dist/cli/commands/index.d.ts.map +1 -1
- package/dist/cli/commands/index.js +2 -0
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/new.d.ts.map +1 -1
- package/dist/cli/commands/new.js +24 -3
- package/dist/cli/commands/new.js.map +1 -1
- package/dist/cli/index.js +5 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/services/agent/a2a-client.d.ts +21 -0
- package/dist/cli/services/agent/a2a-client.d.ts.map +1 -0
- package/dist/cli/services/agent/a2a-client.js +78 -0
- package/dist/cli/services/agent/a2a-client.js.map +1 -0
- package/dist/cli/services/agent/langgraph-client.d.ts +10 -0
- package/dist/cli/services/agent/langgraph-client.d.ts.map +1 -0
- package/dist/cli/services/agent/langgraph-client.js +50 -0
- package/dist/cli/services/agent/langgraph-client.js.map +1 -0
- package/dist/cli/services/agent/probe.d.ts +3 -0
- package/dist/cli/services/agent/probe.d.ts.map +1 -0
- package/dist/cli/services/agent/probe.js +58 -0
- package/dist/cli/services/agent/probe.js.map +1 -0
- package/dist/cli/services/agent/types.d.ts +94 -0
- package/dist/cli/services/agent/types.d.ts.map +1 -0
- package/dist/cli/services/agent/types.js +2 -0
- package/dist/cli/services/agent/types.js.map +1 -0
- package/dist/cli/services/ai/anthropic.d.ts +8 -0
- package/dist/cli/services/ai/anthropic.d.ts.map +1 -0
- package/dist/cli/services/ai/anthropic.js +25 -0
- package/dist/cli/services/ai/anthropic.js.map +1 -0
- package/dist/cli/services/ai/context.d.ts +12 -0
- package/dist/cli/services/ai/context.d.ts.map +1 -0
- package/dist/cli/services/ai/context.js +72 -0
- package/dist/cli/services/ai/context.js.map +1 -0
- package/dist/cli/services/ai/openai.d.ts +8 -0
- package/dist/cli/services/ai/openai.d.ts.map +1 -0
- package/dist/cli/services/ai/openai.js +20 -0
- package/dist/cli/services/ai/openai.js.map +1 -0
- package/dist/cli/services/ai/provider.d.ts +15 -0
- package/dist/cli/services/ai/provider.d.ts.map +1 -0
- package/dist/cli/services/ai/provider.js +83 -0
- package/dist/cli/services/ai/provider.js.map +1 -0
- package/dist/cli/services/config.d.ts +8 -0
- package/dist/cli/services/config.d.ts.map +1 -0
- package/dist/cli/services/config.js +22 -0
- package/dist/cli/services/config.js.map +1 -0
- package/dist/templates/gitignore.template +1 -0
- package/package.json +3 -1
package/README.md
CHANGED
|
@@ -29,6 +29,8 @@ This launches an interactive CLI where you can create new agents.
|
|
|
29
29
|
| Command | Description |
|
|
30
30
|
|---------|-------------|
|
|
31
31
|
| `/new [path]` | Create a new agent interactively [optionally provide a path] |
|
|
32
|
+
| `/build [path]` | Enter AI-powered build mode to modify your agent via chat |
|
|
33
|
+
| `/chat <url>` | Chat with a running agent via A2A or LangGraph |
|
|
32
34
|
| `/help` | Show available commands |
|
|
33
35
|
| `/clear` | Clear the terminal |
|
|
34
36
|
| `/exit` | Exit the CLI |
|
|
@@ -55,8 +57,8 @@ After generation, your agent will be ready at `src/agent.ts`.
|
|
|
55
57
|
| **OpenAI + Multi-turn** | GPT-powered agent with conversation history |
|
|
56
58
|
|
|
57
59
|
All options use `AgentServer` from `@wardenprotocol/agent-kit`, which exposes both:
|
|
58
|
-
- **A2A Protocol**
|
|
59
|
-
- **LangGraph Protocol**
|
|
60
|
+
- **A2A Protocol**
|
|
61
|
+
- **LangGraph Protocol**
|
|
60
62
|
|
|
61
63
|
## Generated Project Structure
|
|
62
64
|
|
|
@@ -82,6 +84,18 @@ npm run agent
|
|
|
82
84
|
|
|
83
85
|
Your agent will be available at `http://localhost:3000`.
|
|
84
86
|
|
|
87
|
+
## Build Mode
|
|
88
|
+
|
|
89
|
+
Run `/build` inside a scaffolded project to enter an AI-powered chat session. Describe the changes you want and the LLM will modify your agent code directly. Requires an OpenAI or Anthropic API key (configured on first run).
|
|
90
|
+
|
|
91
|
+
## Chatting with an Agent
|
|
92
|
+
|
|
93
|
+
Run `/chat http://localhost:3000` to interact with a running agent. The CLI auto-detects whether the agent supports A2A, LangGraph, or both, and prompts you to choose when multiple protocols are available.
|
|
94
|
+
|
|
95
|
+
## Hosting Your Agent
|
|
96
|
+
|
|
97
|
+
To host your agent on a server, you can use a cloud provider like AWS, Google Cloud, or Azure. You can also use a containerization platform like [Render.com](https://render.com/) to deploy your agent as a Docker container.
|
|
98
|
+
|
|
85
99
|
## License
|
|
86
100
|
|
|
87
101
|
Apache-2.0
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/build.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAc,MAAM,aAAa,CAAC;AA2H5D,eAAO,MAAM,YAAY,EAAE,YA0J1B,CAAC"}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import * as readline from "node:readline";
|
|
2
|
+
import * as fs from "node:fs/promises";
|
|
3
|
+
import * as path from "node:path";
|
|
4
|
+
import { select, password, input } from "@inquirer/prompts";
|
|
5
|
+
import chalk from "chalk";
|
|
6
|
+
import ora from "ora";
|
|
7
|
+
import { readConfig, writeConfig, } from "../services/config.js";
|
|
8
|
+
import { createProvider, formatAPIError, isNonRecoverableError, } from "../services/ai/provider.js";
|
|
9
|
+
import { buildProjectContext, parseResponse, applyChanges, SYSTEM_PROMPT, } from "../services/ai/context.js";
|
|
10
|
+
const promptTheme = {
|
|
11
|
+
style: {
|
|
12
|
+
answer: (text) => chalk.rgb(199, 255, 142)(text),
|
|
13
|
+
highlight: (text) => chalk.rgb(199, 255, 142)(text),
|
|
14
|
+
description: (text) => chalk.rgb(199, 255, 142)(text),
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
async function projectExists(cwd) {
|
|
18
|
+
try {
|
|
19
|
+
await fs.access(path.join(cwd, "src", "agent.ts"));
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
const MODEL_CHOICES = {
|
|
27
|
+
openai: [
|
|
28
|
+
{
|
|
29
|
+
value: "gpt-5.2-codex",
|
|
30
|
+
name: "GPT-5.2 Codex",
|
|
31
|
+
description: "Latest — frontier coding with strong reasoning",
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
value: "gpt-5.1-codex",
|
|
35
|
+
name: "GPT-5.1 Codex",
|
|
36
|
+
description: "Stable — great balance of speed and quality",
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
value: "custom",
|
|
40
|
+
name: "Other",
|
|
41
|
+
description: "Enter a model name manually",
|
|
42
|
+
},
|
|
43
|
+
],
|
|
44
|
+
anthropic: [
|
|
45
|
+
{
|
|
46
|
+
value: "claude-opus-4-6",
|
|
47
|
+
name: "Claude Opus 4.6",
|
|
48
|
+
description: "Most intelligent — best for complex coding and reasoning",
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
value: "claude-sonnet-4-5-20250929",
|
|
52
|
+
name: "Claude Sonnet 4.5",
|
|
53
|
+
description: "Fast and capable — great balance of speed and quality",
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
value: "custom",
|
|
57
|
+
name: "Other",
|
|
58
|
+
description: "Enter a model name manually",
|
|
59
|
+
},
|
|
60
|
+
],
|
|
61
|
+
};
|
|
62
|
+
async function setupWizard(cwd) {
|
|
63
|
+
console.log();
|
|
64
|
+
console.log(chalk.bold("Build Mode Setup"));
|
|
65
|
+
console.log(chalk.dim("Configure your AI provider.\n"));
|
|
66
|
+
const provider = await select({
|
|
67
|
+
message: "Select AI provider:",
|
|
68
|
+
choices: [
|
|
69
|
+
{
|
|
70
|
+
value: "openai",
|
|
71
|
+
name: "OpenAI",
|
|
72
|
+
description: "GPT-5.2 Codex, GPT-5.1 Codex",
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
value: "anthropic",
|
|
76
|
+
name: "Anthropic",
|
|
77
|
+
description: "Claude Opus 4.6, Claude Sonnet 4.5",
|
|
78
|
+
},
|
|
79
|
+
],
|
|
80
|
+
theme: promptTheme,
|
|
81
|
+
});
|
|
82
|
+
let model = await select({
|
|
83
|
+
message: "Select model:",
|
|
84
|
+
choices: MODEL_CHOICES[provider].map((c) => ({ ...c })),
|
|
85
|
+
theme: promptTheme,
|
|
86
|
+
});
|
|
87
|
+
if (model === "custom") {
|
|
88
|
+
model = await input({
|
|
89
|
+
message: "Enter model name:",
|
|
90
|
+
validate: (value) => (value.trim() ? true : "Model name is required"),
|
|
91
|
+
theme: promptTheme,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
const apiKey = await password({
|
|
95
|
+
message: `Enter your ${provider === "openai" ? "OpenAI" : "Anthropic"} API key:`,
|
|
96
|
+
theme: promptTheme,
|
|
97
|
+
});
|
|
98
|
+
const config = { provider, model, apiKey };
|
|
99
|
+
await writeConfig(cwd, config);
|
|
100
|
+
return config;
|
|
101
|
+
}
|
|
102
|
+
function chatPrompt() {
|
|
103
|
+
return chalk.rgb(199, 255, 142)("build") + chalk.dim("> ");
|
|
104
|
+
}
|
|
105
|
+
export const buildCommand = {
|
|
106
|
+
name: "build",
|
|
107
|
+
description: "Enter AI-powered chat mode to build your agent",
|
|
108
|
+
usage: "/build [path]",
|
|
109
|
+
order: 5,
|
|
110
|
+
handler: async (args, context) => {
|
|
111
|
+
// Resolve project directory from optional path argument
|
|
112
|
+
const targetPath = args[0];
|
|
113
|
+
const projectDir = targetPath
|
|
114
|
+
? path.resolve(context.cwd, targetPath)
|
|
115
|
+
: context.cwd;
|
|
116
|
+
// Check for scaffolded project
|
|
117
|
+
const hasProject = await projectExists(projectDir);
|
|
118
|
+
if (!hasProject) {
|
|
119
|
+
context.log.error(targetPath
|
|
120
|
+
? `No agent project found in ${targetPath}. Run /new ${targetPath} to create one first.`
|
|
121
|
+
: "No agent project found. Run /new to create one first.");
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
// Get or create config
|
|
125
|
+
let config = await readConfig(projectDir);
|
|
126
|
+
if (!config) {
|
|
127
|
+
try {
|
|
128
|
+
config = await setupWizard(projectDir);
|
|
129
|
+
console.log();
|
|
130
|
+
context.log.success("Configuration saved to .warden/config.json");
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
if (error instanceof Error && error.name === "ExitPromptError") {
|
|
134
|
+
console.log();
|
|
135
|
+
context.log.dim("Cancelled.");
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
throw error;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// Create provider
|
|
142
|
+
const provider = createProvider(config);
|
|
143
|
+
console.log();
|
|
144
|
+
console.log(chalk.bold("Build Mode") + chalk.dim(` (${config.model})`));
|
|
145
|
+
console.log(chalk.dim("Describe what you want your agent to do. Type /exit to leave.\n"));
|
|
146
|
+
// Chat loop
|
|
147
|
+
const messages = [];
|
|
148
|
+
const rl = readline.createInterface({
|
|
149
|
+
input: process.stdin,
|
|
150
|
+
output: process.stdout,
|
|
151
|
+
});
|
|
152
|
+
const question = (prompt) => new Promise((resolve, reject) => {
|
|
153
|
+
const onClose = () => reject(new Error("closed"));
|
|
154
|
+
rl.once("close", onClose);
|
|
155
|
+
rl.question(prompt, (answer) => {
|
|
156
|
+
rl.removeListener("close", onClose);
|
|
157
|
+
resolve(answer);
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
let running = true;
|
|
161
|
+
// Handle Ctrl+C — exit build mode gracefully
|
|
162
|
+
rl.on("SIGINT", () => {
|
|
163
|
+
running = false;
|
|
164
|
+
rl.close();
|
|
165
|
+
console.log();
|
|
166
|
+
context.log.dim("Exited build mode.");
|
|
167
|
+
});
|
|
168
|
+
while (running) {
|
|
169
|
+
let userInput;
|
|
170
|
+
try {
|
|
171
|
+
userInput = await question(chatPrompt());
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
break;
|
|
175
|
+
}
|
|
176
|
+
const trimmed = userInput.trim();
|
|
177
|
+
if (!trimmed) {
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
if (trimmed === "/exit") {
|
|
181
|
+
rl.close();
|
|
182
|
+
console.log();
|
|
183
|
+
context.log.dim("Exited build mode.");
|
|
184
|
+
break;
|
|
185
|
+
}
|
|
186
|
+
// Build context from current project files
|
|
187
|
+
const projectContext = await buildProjectContext(projectDir);
|
|
188
|
+
// On first message, add system prompt with context
|
|
189
|
+
if (messages.length === 0) {
|
|
190
|
+
messages.push({
|
|
191
|
+
role: "system",
|
|
192
|
+
content: `${SYSTEM_PROMPT}\n\nCurrent project files:\n\n${projectContext}`,
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
// Update system prompt with latest project state
|
|
197
|
+
messages[0] = {
|
|
198
|
+
role: "system",
|
|
199
|
+
content: `${SYSTEM_PROMPT}\n\nCurrent project files:\n\n${projectContext}`,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
messages.push({ role: "user", content: trimmed });
|
|
203
|
+
const spinner = ora({ text: "Thinking...", discardStdin: false }).start();
|
|
204
|
+
try {
|
|
205
|
+
const response = await provider.chat(messages);
|
|
206
|
+
spinner.stop();
|
|
207
|
+
const { text, changes } = parseResponse(response);
|
|
208
|
+
// Apply file changes
|
|
209
|
+
if (changes.length > 0) {
|
|
210
|
+
const applied = await applyChanges(projectDir, changes);
|
|
211
|
+
console.log();
|
|
212
|
+
for (const file of applied) {
|
|
213
|
+
context.log.success(`Updated ${file}`);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
// Show explanation
|
|
217
|
+
if (text) {
|
|
218
|
+
console.log();
|
|
219
|
+
console.log(text);
|
|
220
|
+
}
|
|
221
|
+
console.log();
|
|
222
|
+
}
|
|
223
|
+
catch (error) {
|
|
224
|
+
spinner.fail("Request failed");
|
|
225
|
+
context.log.error(formatAPIError(error));
|
|
226
|
+
if (isNonRecoverableError(error)) {
|
|
227
|
+
rl.close();
|
|
228
|
+
break;
|
|
229
|
+
}
|
|
230
|
+
console.log();
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
},
|
|
234
|
+
};
|
|
235
|
+
//# sourceMappingURL=build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/cli/commands/build.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/chat.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAc,MAAM,aAAa,CAAC;AAuE5D,eAAO,MAAM,WAAW,EAAE,YAqLzB,CAAC"}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import * as readline from "node:readline";
|
|
2
|
+
import { select } from "@inquirer/prompts";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import ora from "ora";
|
|
5
|
+
import { probeAgent } from "../services/agent/probe.js";
|
|
6
|
+
import { A2AClient, AgentRequestError, AgentProtocolError, } from "../services/agent/a2a-client.js";
|
|
7
|
+
import { LangGraphClient } from "../services/agent/langgraph-client.js";
|
|
8
|
+
function chatPrompt() {
|
|
9
|
+
return chalk.rgb(199, 255, 142)("chat") + chalk.dim("> ");
|
|
10
|
+
}
|
|
11
|
+
function createClient(protocol, baseUrl) {
|
|
12
|
+
switch (protocol) {
|
|
13
|
+
case "a2a":
|
|
14
|
+
return new A2AClient(baseUrl);
|
|
15
|
+
case "langgraph":
|
|
16
|
+
return new LangGraphClient(baseUrl);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function displayAgentInfo(info) {
|
|
20
|
+
console.log();
|
|
21
|
+
console.log(chalk.bold(info.name) + chalk.dim(` (${info.protocol.toUpperCase()})`));
|
|
22
|
+
if (info.description) {
|
|
23
|
+
console.log(chalk.dim(info.description));
|
|
24
|
+
}
|
|
25
|
+
if (info.capabilities && info.capabilities.length > 0) {
|
|
26
|
+
console.log(chalk.dim("Capabilities: ") + info.capabilities.join(", "));
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function formatAgentError(error) {
|
|
30
|
+
if (error instanceof AgentRequestError) {
|
|
31
|
+
const { status, body } = error;
|
|
32
|
+
if (status === 404)
|
|
33
|
+
return "Agent endpoint not found. Is the agent running?";
|
|
34
|
+
if (status === 500)
|
|
35
|
+
return `Agent internal error: ${body.slice(0, 200)}`;
|
|
36
|
+
if (status === 502 || status === 503)
|
|
37
|
+
return "Agent is unavailable. Try again shortly.";
|
|
38
|
+
if (status === 408 || status === 504)
|
|
39
|
+
return "Agent timed out. Try a simpler request.";
|
|
40
|
+
return `Agent returned HTTP ${status}: ${body.slice(0, 200)}`;
|
|
41
|
+
}
|
|
42
|
+
if (error instanceof AgentProtocolError) {
|
|
43
|
+
return `Protocol error (${error.code}): ${error.detail}`;
|
|
44
|
+
}
|
|
45
|
+
if (error instanceof TypeError && String(error.message).includes("fetch")) {
|
|
46
|
+
return "Connection refused. Is the agent running?";
|
|
47
|
+
}
|
|
48
|
+
if (error instanceof Error && error.name === "TimeoutError") {
|
|
49
|
+
return "Request timed out. The agent may be overloaded.";
|
|
50
|
+
}
|
|
51
|
+
return String(error);
|
|
52
|
+
}
|
|
53
|
+
function isNonRecoverableError(error) {
|
|
54
|
+
if (error instanceof TypeError && String(error.message).includes("fetch")) {
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
export const chatCommand = {
|
|
60
|
+
name: "chat",
|
|
61
|
+
description: "Chat with a running agent via A2A or LangGraph",
|
|
62
|
+
usage: "/chat <url>",
|
|
63
|
+
order: 6,
|
|
64
|
+
handler: async (args, context) => {
|
|
65
|
+
// ── Validate URL argument ──────────────────────────────────
|
|
66
|
+
const rawUrl = args[0];
|
|
67
|
+
if (!rawUrl) {
|
|
68
|
+
context.log.error("Missing agent URL. Usage: /chat <url>");
|
|
69
|
+
context.log.dim("Example: /chat http://localhost:3000");
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
const baseUrl = rawUrl.replace(/\/+$/, "");
|
|
73
|
+
try {
|
|
74
|
+
new URL(baseUrl);
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
context.log.error(`Invalid URL: ${rawUrl}`);
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
// ── Probe agent ────────────────────────────────────────────
|
|
81
|
+
const spinner = ora({
|
|
82
|
+
text: "Connecting to agent...",
|
|
83
|
+
discardStdin: false,
|
|
84
|
+
}).start();
|
|
85
|
+
let probeResult;
|
|
86
|
+
try {
|
|
87
|
+
probeResult = await probeAgent(baseUrl);
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
spinner.fail("Could not reach agent");
|
|
91
|
+
context.log.error(`Connection failed. Is the agent running at ${baseUrl}?`);
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
const available = [probeResult.a2a, probeResult.langgraph].filter((info) => info !== null);
|
|
95
|
+
if (available.length === 0) {
|
|
96
|
+
spinner.fail("No supported protocol detected");
|
|
97
|
+
context.log.error(`The agent at ${baseUrl} does not appear to support A2A or LangGraph.`);
|
|
98
|
+
context.log.dim("Checked: /.well-known/agent-card.json (A2A) and /info (LangGraph)");
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
spinner.succeed("Agent detected");
|
|
102
|
+
// ── Select protocol ────────────────────────────────────────
|
|
103
|
+
let selectedInfo;
|
|
104
|
+
if (available.length === 1) {
|
|
105
|
+
selectedInfo = available[0];
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
try {
|
|
109
|
+
const protocol = await select({
|
|
110
|
+
message: "Select protocol:",
|
|
111
|
+
choices: available.map((info) => ({
|
|
112
|
+
value: info.protocol,
|
|
113
|
+
name: info.protocol === "a2a" ? "A2A (Agent-to-Agent)" : "LangGraph",
|
|
114
|
+
description: info.name,
|
|
115
|
+
})),
|
|
116
|
+
theme: {
|
|
117
|
+
style: {
|
|
118
|
+
answer: (text) => chalk.rgb(199, 255, 142)(text),
|
|
119
|
+
highlight: (text) => chalk.rgb(199, 255, 142)(text),
|
|
120
|
+
description: (text) => chalk.rgb(199, 255, 142)(text),
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
});
|
|
124
|
+
selectedInfo = available.find((i) => i.protocol === protocol);
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
if (error instanceof Error && error.name === "ExitPromptError") {
|
|
128
|
+
console.log();
|
|
129
|
+
context.log.dim("Cancelled.");
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
throw error;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// ── Display agent info ─────────────────────────────────────
|
|
136
|
+
displayAgentInfo(selectedInfo);
|
|
137
|
+
// ── Connect ────────────────────────────────────────────────
|
|
138
|
+
const client = createClient(selectedInfo.protocol, baseUrl);
|
|
139
|
+
const connectSpinner = ora({
|
|
140
|
+
text: "Starting session...",
|
|
141
|
+
discardStdin: false,
|
|
142
|
+
}).start();
|
|
143
|
+
try {
|
|
144
|
+
await client.connect();
|
|
145
|
+
connectSpinner.succeed("Session started");
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
connectSpinner.fail("Failed to start session");
|
|
149
|
+
context.log.error(formatAgentError(error));
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
console.log(chalk.dim("\nType your message. /exit to leave.\n"));
|
|
153
|
+
// ── Chat loop ──────────────────────────────────────────────
|
|
154
|
+
const rl = readline.createInterface({
|
|
155
|
+
input: process.stdin,
|
|
156
|
+
output: process.stdout,
|
|
157
|
+
});
|
|
158
|
+
const question = (prompt) => new Promise((resolve, reject) => {
|
|
159
|
+
const onClose = () => reject(new Error("closed"));
|
|
160
|
+
rl.once("close", onClose);
|
|
161
|
+
rl.question(prompt, (answer) => {
|
|
162
|
+
rl.removeListener("close", onClose);
|
|
163
|
+
resolve(answer);
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
let running = true;
|
|
167
|
+
rl.on("SIGINT", () => {
|
|
168
|
+
running = false;
|
|
169
|
+
rl.close();
|
|
170
|
+
console.log();
|
|
171
|
+
context.log.dim("Exited chat mode.");
|
|
172
|
+
});
|
|
173
|
+
while (running) {
|
|
174
|
+
let userInput;
|
|
175
|
+
try {
|
|
176
|
+
userInput = await question(chatPrompt());
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
break;
|
|
180
|
+
}
|
|
181
|
+
const trimmed = userInput.trim();
|
|
182
|
+
if (!trimmed) {
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
if (trimmed === "/exit") {
|
|
186
|
+
rl.close();
|
|
187
|
+
console.log();
|
|
188
|
+
context.log.dim("Exited chat mode.");
|
|
189
|
+
break;
|
|
190
|
+
}
|
|
191
|
+
const msgSpinner = ora({
|
|
192
|
+
text: "Thinking...",
|
|
193
|
+
discardStdin: false,
|
|
194
|
+
}).start();
|
|
195
|
+
try {
|
|
196
|
+
const response = await client.send(trimmed);
|
|
197
|
+
msgSpinner.stop();
|
|
198
|
+
console.log();
|
|
199
|
+
console.log(response);
|
|
200
|
+
console.log();
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
msgSpinner.fail("Request failed");
|
|
204
|
+
context.log.error(formatAgentError(error));
|
|
205
|
+
if (isNonRecoverableError(error)) {
|
|
206
|
+
rl.close();
|
|
207
|
+
break;
|
|
208
|
+
}
|
|
209
|
+
console.log();
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
},
|
|
213
|
+
};
|
|
214
|
+
//# sourceMappingURL=chat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../../src/cli/commands/chat.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
export { CommandRegistry } from "./registry.js";
|
|
2
2
|
export { newCommand } from "./new.js";
|
|
3
|
+
export { buildCommand } from "./build.js";
|
|
4
|
+
export { chatCommand } from "./chat.js";
|
|
3
5
|
export { createHelpCommand } from "./help.js";
|
|
4
6
|
export { clearCommand } from "./clear.js";
|
|
5
7
|
export { exitCommand } from "./exit.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
export { CommandRegistry } from "./registry.js";
|
|
2
2
|
export { newCommand } from "./new.js";
|
|
3
|
+
export { buildCommand } from "./build.js";
|
|
4
|
+
export { chatCommand } from "./chat.js";
|
|
3
5
|
export { createHelpCommand } from "./help.js";
|
|
4
6
|
export { clearCommand } from "./clear.js";
|
|
5
7
|
export { exitCommand } from "./exit.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"new.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/new.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,YAAY,EAIb,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"new.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/new.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,YAAY,EAIb,MAAM,aAAa,CAAC;AAoCrB,eAAO,MAAM,UAAU,EAAE,YAyPxB,CAAC"}
|
package/dist/cli/commands/new.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { execSync } from "node:child_process";
|
|
2
2
|
import * as path from "node:path";
|
|
3
|
-
import { input, select, confirm } from "@inquirer/prompts";
|
|
3
|
+
import { input, select, confirm, password } from "@inquirer/prompts";
|
|
4
4
|
import chalk from "chalk";
|
|
5
|
-
import { isDirectoryEmpty, createDirectory, directoryExists, } from "../services/project.js";
|
|
5
|
+
import { isDirectoryEmpty, createDirectory, directoryExists, writeFile, } from "../services/project.js";
|
|
6
6
|
import { scaffoldAgent } from "../services/scaffolder.js";
|
|
7
7
|
const promptTheme = {
|
|
8
8
|
style: {
|
|
@@ -90,6 +90,13 @@ export const newCommand = {
|
|
|
90
90
|
],
|
|
91
91
|
theme: promptTheme,
|
|
92
92
|
});
|
|
93
|
+
let openaiApiKey;
|
|
94
|
+
if (template === "openai") {
|
|
95
|
+
openaiApiKey = await password({
|
|
96
|
+
message: "Enter your OpenAI API key:",
|
|
97
|
+
theme: promptTheme,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
93
100
|
const capability = await select({
|
|
94
101
|
message: "Select capability:",
|
|
95
102
|
choices: [
|
|
@@ -184,6 +191,17 @@ export const newCommand = {
|
|
|
184
191
|
const spinner = context.spinner("Generating agent...").start();
|
|
185
192
|
try {
|
|
186
193
|
await scaffoldAgent(targetDir, config);
|
|
194
|
+
if (openaiApiKey) {
|
|
195
|
+
const envContent = [
|
|
196
|
+
"HOST=localhost",
|
|
197
|
+
"PORT=3000",
|
|
198
|
+
"AGENT_URL=http://localhost:3000",
|
|
199
|
+
`OPENAI_API_KEY=${openaiApiKey}`,
|
|
200
|
+
"OPENAI_MODEL=gpt-4o-mini",
|
|
201
|
+
"",
|
|
202
|
+
].join("\n");
|
|
203
|
+
await writeFile(path.join(targetDir, ".env"), envContent);
|
|
204
|
+
}
|
|
187
205
|
spinner.succeed("Agent generated!");
|
|
188
206
|
console.log();
|
|
189
207
|
context.log.success(`Agent files created successfully.`);
|
|
@@ -199,7 +217,10 @@ export const newCommand = {
|
|
|
199
217
|
context.log.dim(" Run npm install manually to install dependencies");
|
|
200
218
|
}
|
|
201
219
|
console.log();
|
|
202
|
-
context.log.dim("Next steps
|
|
220
|
+
context.log.dim("Next steps:");
|
|
221
|
+
context.log.dim(` /build${targetPath ? ` ${targetPath}` : ""} — enter AI chat mode to build your agent`);
|
|
222
|
+
console.log();
|
|
223
|
+
context.log.dim("Or build and run manually (in a new terminal):");
|
|
203
224
|
if (targetPath) {
|
|
204
225
|
context.log.dim(` cd ${targetPath}`);
|
|
205
226
|
}
|