@halfagiraf/clawx 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/.env.example +44 -0
- package/LICENSE +21 -0
- package/README.md +489 -0
- package/clawx.json.example +23 -0
- package/dist/cli/main.d.ts +21 -0
- package/dist/cli/main.d.ts.map +1 -0
- package/dist/cli/main.js +176 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/repl.d.ts +11 -0
- package/dist/cli/repl.d.ts.map +1 -0
- package/dist/cli/repl.js +119 -0
- package/dist/cli/repl.js.map +1 -0
- package/dist/cli/tui.d.ts +35 -0
- package/dist/cli/tui.d.ts.map +1 -0
- package/dist/cli/tui.js +92 -0
- package/dist/cli/tui.js.map +1 -0
- package/dist/config/index.d.ts +9 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +106 -0
- package/dist/config/index.js.map +1 -0
- package/dist/core/agent.d.ts +53 -0
- package/dist/core/agent.d.ts.map +1 -0
- package/dist/core/agent.js +152 -0
- package/dist/core/agent.js.map +1 -0
- package/dist/core/provider.d.ts +30 -0
- package/dist/core/provider.d.ts.map +1 -0
- package/dist/core/provider.js +76 -0
- package/dist/core/provider.js.map +1 -0
- package/dist/core/session.d.ts +37 -0
- package/dist/core/session.d.ts.map +1 -0
- package/dist/core/session.js +87 -0
- package/dist/core/session.js.map +1 -0
- package/dist/core/streaming.d.ts +27 -0
- package/dist/core/streaming.d.ts.map +1 -0
- package/dist/core/streaming.js +137 -0
- package/dist/core/streaming.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/gitDiff.d.ts +13 -0
- package/dist/tools/gitDiff.d.ts.map +1 -0
- package/dist/tools/gitDiff.js +50 -0
- package/dist/tools/gitDiff.js.map +1 -0
- package/dist/tools/gitStatus.d.ts +13 -0
- package/dist/tools/gitStatus.d.ts.map +1 -0
- package/dist/tools/gitStatus.js +43 -0
- package/dist/tools/gitStatus.js.map +1 -0
- package/dist/tools/searchFiles.d.ts +19 -0
- package/dist/tools/searchFiles.d.ts.map +1 -0
- package/dist/tools/searchFiles.js +101 -0
- package/dist/tools/searchFiles.js.map +1 -0
- package/dist/tools/sshRun.d.ts +26 -0
- package/dist/tools/sshRun.d.ts.map +1 -0
- package/dist/tools/sshRun.js +170 -0
- package/dist/tools/sshRun.js.map +1 -0
- package/dist/types/index.d.ts +35 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/logger.d.ts +19 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +43 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/system-prompt.d.ts +9 -0
- package/dist/utils/system-prompt.d.ts.map +1 -0
- package/dist/utils/system-prompt.js +49 -0
- package/dist/utils/system-prompt.js.map +1 -0
- package/package.json +71 -0
package/dist/cli/main.js
ADDED
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Clawx CLI — terminal-first coding/execution agent.
|
|
4
|
+
*
|
|
5
|
+
* EXTRACTION NOTE:
|
|
6
|
+
* OpenClaw's CLI entry (openclaw.mjs → entry.ts → cli/) handles:
|
|
7
|
+
* - 40+ CLI commands (agent, channel, config, daemon, gateway, install, ...)
|
|
8
|
+
* - Channel initialization and routing
|
|
9
|
+
* - Plugin discovery and loading
|
|
10
|
+
* - Gateway server startup
|
|
11
|
+
* - Daemon management
|
|
12
|
+
* - Update checking
|
|
13
|
+
*
|
|
14
|
+
* We DISCARD all of that. Our CLI has these modes:
|
|
15
|
+
* 1. `clawx` — default: TUI mode (rich terminal UI from pi-coding-agent)
|
|
16
|
+
* 2. `clawx run "prompt"` — single-shot: run a task and exit
|
|
17
|
+
* 3. `clawx chat` — basic readline REPL (fallback)
|
|
18
|
+
* 4. `clawx continue` — resume the last session
|
|
19
|
+
*/
|
|
20
|
+
import { Command } from "commander";
|
|
21
|
+
import { loadConfig } from "../config/index.js";
|
|
22
|
+
import { runAgent } from "../core/agent.js";
|
|
23
|
+
import { createStreamRenderer } from "../core/streaming.js";
|
|
24
|
+
import { createSessionId, saveSession, getLatestSession, listSessions, } from "../core/session.js";
|
|
25
|
+
import { log } from "../utils/logger.js";
|
|
26
|
+
import { startRepl } from "./repl.js";
|
|
27
|
+
import { startTui } from "./tui.js";
|
|
28
|
+
const program = new Command();
|
|
29
|
+
program
|
|
30
|
+
.name("clawx")
|
|
31
|
+
.description("Lean coding/execution agent — extracted from OpenClaw core")
|
|
32
|
+
.version("0.1.0");
|
|
33
|
+
// Default action: launch TUI when no subcommand given
|
|
34
|
+
// e.g. `clawx` or `clawx "build me a flask app"`
|
|
35
|
+
program
|
|
36
|
+
.argument("[prompt]", "Optional initial message for TUI mode")
|
|
37
|
+
.option("-m, --model <model>", "Model to use")
|
|
38
|
+
.option("-p, --provider <provider>", "Provider")
|
|
39
|
+
.option("-u, --base-url <url>", "Provider base URL")
|
|
40
|
+
.option("-d, --work-dir <dir>", "Working directory")
|
|
41
|
+
.option("-v, --verbose", "Verbose logging")
|
|
42
|
+
.option("--basic", "Use basic readline REPL instead of TUI")
|
|
43
|
+
.action(async (prompt, opts) => {
|
|
44
|
+
if (opts.verbose)
|
|
45
|
+
log.setLogLevel("debug");
|
|
46
|
+
const config = loadConfig({
|
|
47
|
+
model: opts.model,
|
|
48
|
+
provider: opts.provider,
|
|
49
|
+
baseUrl: opts.baseUrl,
|
|
50
|
+
workDir: opts.workDir,
|
|
51
|
+
});
|
|
52
|
+
if (opts.basic) {
|
|
53
|
+
// Basic readline REPL fallback
|
|
54
|
+
const sessionId = createSessionId();
|
|
55
|
+
await startRepl(config, sessionId, []);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
// TUI mode (rich terminal UI)
|
|
59
|
+
try {
|
|
60
|
+
await startTui(config, {
|
|
61
|
+
initialMessage: prompt,
|
|
62
|
+
verbose: opts.verbose,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
catch (e) {
|
|
66
|
+
// If TUI fails (e.g. missing terminal capabilities), fall back to basic REPL
|
|
67
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
68
|
+
console.error(`TUI failed (${msg}), falling back to basic REPL...`);
|
|
69
|
+
const sessionId = createSessionId();
|
|
70
|
+
await startRepl(config, sessionId, []);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
program
|
|
74
|
+
.command("run")
|
|
75
|
+
.description("Run a task and exit")
|
|
76
|
+
.argument("<prompt>", "Task description for the agent")
|
|
77
|
+
.option("-m, --model <model>", "Model to use")
|
|
78
|
+
.option("-p, --provider <provider>", "Provider (openai-completions, anthropic, etc.)")
|
|
79
|
+
.option("-u, --base-url <url>", "Provider base URL")
|
|
80
|
+
.option("-d, --work-dir <dir>", "Working directory")
|
|
81
|
+
.option("-v, --verbose", "Verbose logging")
|
|
82
|
+
.action(async (prompt, opts) => {
|
|
83
|
+
if (opts.verbose)
|
|
84
|
+
log.setLogLevel("debug");
|
|
85
|
+
const config = loadConfig({
|
|
86
|
+
model: opts.model,
|
|
87
|
+
provider: opts.provider,
|
|
88
|
+
baseUrl: opts.baseUrl,
|
|
89
|
+
workDir: opts.workDir,
|
|
90
|
+
});
|
|
91
|
+
const sessionId = createSessionId();
|
|
92
|
+
const session = {
|
|
93
|
+
id: sessionId,
|
|
94
|
+
startedAt: Date.now(),
|
|
95
|
+
workDir: config.workDir,
|
|
96
|
+
model: config.model,
|
|
97
|
+
provider: config.provider,
|
|
98
|
+
};
|
|
99
|
+
const renderer = createStreamRenderer();
|
|
100
|
+
try {
|
|
101
|
+
const result = await runAgent(config, {
|
|
102
|
+
prompt,
|
|
103
|
+
onEvent: (event) => renderer.onEvent(event),
|
|
104
|
+
});
|
|
105
|
+
renderer.finish();
|
|
106
|
+
saveSession(config.sessionDir, session, result.messages);
|
|
107
|
+
process.exit(result.aborted ? 1 : 0);
|
|
108
|
+
}
|
|
109
|
+
catch (e) {
|
|
110
|
+
console.error(`Fatal: ${e instanceof Error ? e.message : e}`);
|
|
111
|
+
process.exit(1);
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
program
|
|
115
|
+
.command("chat")
|
|
116
|
+
.description("Interactive chat session")
|
|
117
|
+
.option("-m, --model <model>", "Model to use")
|
|
118
|
+
.option("-p, --provider <provider>", "Provider")
|
|
119
|
+
.option("-u, --base-url <url>", "Provider base URL")
|
|
120
|
+
.option("-d, --work-dir <dir>", "Working directory")
|
|
121
|
+
.option("-v, --verbose", "Verbose logging")
|
|
122
|
+
.option("-c, --continue", "Continue the last session")
|
|
123
|
+
.action(async (opts) => {
|
|
124
|
+
if (opts.verbose)
|
|
125
|
+
log.setLogLevel("debug");
|
|
126
|
+
const config = loadConfig({
|
|
127
|
+
model: opts.model,
|
|
128
|
+
provider: opts.provider,
|
|
129
|
+
baseUrl: opts.baseUrl,
|
|
130
|
+
workDir: opts.workDir,
|
|
131
|
+
});
|
|
132
|
+
let messages = [];
|
|
133
|
+
let sessionId = createSessionId();
|
|
134
|
+
if (opts.continue) {
|
|
135
|
+
const latest = getLatestSession(config.sessionDir);
|
|
136
|
+
if (latest) {
|
|
137
|
+
messages = latest.messages;
|
|
138
|
+
sessionId = latest.session.id;
|
|
139
|
+
log.info(`Resuming session ${sessionId}`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
await startRepl(config, sessionId, messages);
|
|
143
|
+
});
|
|
144
|
+
program
|
|
145
|
+
.command("continue")
|
|
146
|
+
.description("Continue the last session")
|
|
147
|
+
.option("-v, --verbose", "Verbose logging")
|
|
148
|
+
.action(async (opts) => {
|
|
149
|
+
if (opts.verbose)
|
|
150
|
+
log.setLogLevel("debug");
|
|
151
|
+
const config = loadConfig();
|
|
152
|
+
const latest = getLatestSession(config.sessionDir);
|
|
153
|
+
if (!latest) {
|
|
154
|
+
console.error("No previous session found.");
|
|
155
|
+
process.exit(1);
|
|
156
|
+
}
|
|
157
|
+
log.info(`Resuming session ${latest.session.id}`);
|
|
158
|
+
await startRepl(config, latest.session.id, latest.messages);
|
|
159
|
+
});
|
|
160
|
+
program
|
|
161
|
+
.command("sessions")
|
|
162
|
+
.description("List recent sessions")
|
|
163
|
+
.action(() => {
|
|
164
|
+
const config = loadConfig();
|
|
165
|
+
const sessions = listSessions(config.sessionDir);
|
|
166
|
+
if (sessions.length === 0) {
|
|
167
|
+
console.log("No sessions found.");
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
for (const s of sessions.slice(0, 20)) {
|
|
171
|
+
const date = new Date(s.startedAt).toLocaleString();
|
|
172
|
+
console.log(`${s.id} ${date} ${s.model} ${s.workDir}`);
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
program.parse();
|
|
176
|
+
//# sourceMappingURL=main.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interactive REPL for Clawx.
|
|
3
|
+
*
|
|
4
|
+
* Simple readline-based REPL that feeds user input to the agent loop
|
|
5
|
+
* and streams results back. Supports multi-turn conversations with
|
|
6
|
+
* session persistence.
|
|
7
|
+
*/
|
|
8
|
+
import type { AgentMessage } from "@mariozechner/pi-agent-core";
|
|
9
|
+
import type { ClawxConfig } from "../types/index.js";
|
|
10
|
+
export declare function startRepl(config: ClawxConfig, sessionId: string, existingMessages: AgentMessage[]): Promise<void>;
|
|
11
|
+
//# sourceMappingURL=repl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repl.d.ts","sourceRoot":"","sources":["../../src/cli/repl.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAgB,MAAM,mBAAmB,CAAC;AAMnE,wBAAsB,SAAS,CAC7B,MAAM,EAAE,WAAW,EACnB,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,YAAY,EAAE,GAC/B,OAAO,CAAC,IAAI,CAAC,CAwHf"}
|
package/dist/cli/repl.js
ADDED
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interactive REPL for Clawx.
|
|
3
|
+
*
|
|
4
|
+
* Simple readline-based REPL that feeds user input to the agent loop
|
|
5
|
+
* and streams results back. Supports multi-turn conversations with
|
|
6
|
+
* session persistence.
|
|
7
|
+
*/
|
|
8
|
+
import readline from "node:readline";
|
|
9
|
+
import chalk from "chalk";
|
|
10
|
+
import { runAgent } from "../core/agent.js";
|
|
11
|
+
import { createStreamRenderer } from "../core/streaming.js";
|
|
12
|
+
import { saveSession } from "../core/session.js";
|
|
13
|
+
export async function startRepl(config, sessionId, existingMessages) {
|
|
14
|
+
const rl = readline.createInterface({
|
|
15
|
+
input: process.stdin,
|
|
16
|
+
output: process.stderr,
|
|
17
|
+
prompt: chalk.green("clawx> "),
|
|
18
|
+
});
|
|
19
|
+
let messages = [...existingMessages];
|
|
20
|
+
let abortController = null;
|
|
21
|
+
const session = {
|
|
22
|
+
id: sessionId,
|
|
23
|
+
startedAt: Date.now(),
|
|
24
|
+
workDir: config.workDir,
|
|
25
|
+
model: config.model,
|
|
26
|
+
provider: config.provider,
|
|
27
|
+
};
|
|
28
|
+
console.error(chalk.bold("Clawx") + chalk.gray(` — ${config.model} @ ${config.provider}`));
|
|
29
|
+
console.error(chalk.gray(`Working directory: ${config.workDir}`));
|
|
30
|
+
console.error(chalk.gray(`Type your request. Ctrl+C to cancel, Ctrl+D or "exit" to quit.\n`));
|
|
31
|
+
rl.prompt();
|
|
32
|
+
rl.on("line", async (line) => {
|
|
33
|
+
const input = line.trim();
|
|
34
|
+
if (!input) {
|
|
35
|
+
rl.prompt();
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
// Commands
|
|
39
|
+
if (input === "exit" || input === "quit" || input === "/exit") {
|
|
40
|
+
saveSession(config.sessionDir, session, messages);
|
|
41
|
+
rl.close();
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if (input === "/clear") {
|
|
45
|
+
messages = [];
|
|
46
|
+
console.error(chalk.gray("Session cleared."));
|
|
47
|
+
rl.prompt();
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
if (input === "/save") {
|
|
51
|
+
saveSession(config.sessionDir, session, messages);
|
|
52
|
+
console.error(chalk.gray(`Session saved: ${sessionId}`));
|
|
53
|
+
rl.prompt();
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
if (input === "/info") {
|
|
57
|
+
console.error(chalk.gray(`Session: ${sessionId}`));
|
|
58
|
+
console.error(chalk.gray(`Model: ${config.model}`));
|
|
59
|
+
console.error(chalk.gray(`Provider: ${config.provider}`));
|
|
60
|
+
console.error(chalk.gray(`Base URL: ${config.baseUrl}`));
|
|
61
|
+
console.error(chalk.gray(`Messages: ${messages.length}`));
|
|
62
|
+
console.error(chalk.gray(`Work dir: ${config.workDir}`));
|
|
63
|
+
rl.prompt();
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
if (input.startsWith("/")) {
|
|
67
|
+
console.error(chalk.yellow(`Unknown command: ${input}`));
|
|
68
|
+
console.error(chalk.gray("Commands: /clear, /save, /info, /exit"));
|
|
69
|
+
rl.prompt();
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
// Run agent
|
|
73
|
+
abortController = new AbortController();
|
|
74
|
+
const renderer = createStreamRenderer();
|
|
75
|
+
try {
|
|
76
|
+
const result = await runAgent(config, {
|
|
77
|
+
prompt: input,
|
|
78
|
+
messages,
|
|
79
|
+
onEvent: (event) => renderer.onEvent(event),
|
|
80
|
+
signal: abortController.signal,
|
|
81
|
+
});
|
|
82
|
+
renderer.finish();
|
|
83
|
+
messages = result.messages;
|
|
84
|
+
// Auto-save after each turn
|
|
85
|
+
saveSession(config.sessionDir, session, messages);
|
|
86
|
+
}
|
|
87
|
+
catch (e) {
|
|
88
|
+
if (e.name === "AbortError") {
|
|
89
|
+
console.error(chalk.yellow("\n[aborted]"));
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
console.error(chalk.red(`\nError: ${e instanceof Error ? e.message : e}`));
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
abortController = null;
|
|
96
|
+
rl.prompt();
|
|
97
|
+
});
|
|
98
|
+
// Handle Ctrl+C — abort current run or exit
|
|
99
|
+
rl.on("SIGINT", () => {
|
|
100
|
+
if (abortController) {
|
|
101
|
+
abortController.abort();
|
|
102
|
+
abortController = null;
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
console.error(chalk.gray("\nUse Ctrl+D or 'exit' to quit."));
|
|
106
|
+
rl.prompt();
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
rl.on("close", () => {
|
|
110
|
+
saveSession(config.sessionDir, session, messages);
|
|
111
|
+
console.error(chalk.gray("\nSession saved. Goodbye."));
|
|
112
|
+
process.exit(0);
|
|
113
|
+
});
|
|
114
|
+
// Return a promise that resolves when the REPL closes
|
|
115
|
+
return new Promise((resolve) => {
|
|
116
|
+
rl.on("close", () => resolve());
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=repl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repl.js","sourceRoot":"","sources":["../../src/cli/repl.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,QAAQ,MAAM,eAAe,CAAC;AACrC,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,MAAmB,EACnB,SAAiB,EACjB,gBAAgC;IAEhC,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC;KAC/B,CAAC,CAAC;IAEH,IAAI,QAAQ,GAAG,CAAC,GAAG,gBAAgB,CAAC,CAAC;IACrC,IAAI,eAAe,GAA2B,IAAI,CAAC;IAEnD,MAAM,OAAO,GAAiB;QAC5B,EAAE,EAAE,SAAS;QACb,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;KAC1B,CAAC;IAEF,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,MAAM,CAAC,KAAK,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC3F,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAClE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC,CAAC;IAE9F,EAAE,CAAC,MAAM,EAAE,CAAC;IAEZ,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,IAAY,EAAE,EAAE;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC1B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,EAAE,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QAED,WAAW;QACX,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;YAC9D,WAAW,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;YAClD,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QAED,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;YACvB,QAAQ,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;YAC9C,EAAE,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QAED,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;YACtB,WAAW,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;YAClD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,SAAS,EAAE,CAAC,CAAC,CAAC;YACzD,EAAE,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QAED,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;YACtB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,SAAS,EAAE,CAAC,CAAC,CAAC;YACnD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACpD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YAC1D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACzD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAC1D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACzD,EAAE,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QAED,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,oBAAoB,KAAK,EAAE,CAAC,CAAC,CAAC;YACzD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC,CAAC;YACnE,EAAE,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QAED,YAAY;QACZ,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,oBAAoB,EAAE,CAAC;QAExC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE;gBACpC,MAAM,EAAE,KAAK;gBACb,QAAQ;gBACR,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC;gBAC3C,MAAM,EAAE,eAAe,CAAC,MAAM;aAC/B,CAAC,CAAC;YAEH,QAAQ,CAAC,MAAM,EAAE,CAAC;YAClB,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;YAE3B,4BAA4B;YAC5B,WAAW,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAK,CAAW,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBACvC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;YAC7C,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC7E,CAAC;QACH,CAAC;QAED,eAAe,GAAG,IAAI,CAAC;QACvB,EAAE,CAAC,MAAM,EAAE,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,4CAA4C;IAC5C,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACnB,IAAI,eAAe,EAAE,CAAC;YACpB,eAAe,CAAC,KAAK,EAAE,CAAC;YACxB,eAAe,GAAG,IAAI,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC,CAAC;YAC7D,EAAE,CAAC,MAAM,EAAE,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QAClB,WAAW,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QAClD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,CAAC;QACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,sDAAsD;IACtD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TUI mode for Clawx — uses pi-coding-agent's InteractiveMode.
|
|
3
|
+
*
|
|
4
|
+
* This provides the same rich terminal experience as OpenClaw/pi-coding-agent:
|
|
5
|
+
* - Syntax-highlighted code in tool results
|
|
6
|
+
* - Diff rendering for edit operations
|
|
7
|
+
* - Spinner animations during tool execution
|
|
8
|
+
* - Ctrl+P to cycle models
|
|
9
|
+
* - Ctrl+C to cancel, Ctrl+D to quit
|
|
10
|
+
* - Session branching and tree navigation
|
|
11
|
+
* - Markdown rendering in responses
|
|
12
|
+
* - /slash commands for settings, models, sessions, etc.
|
|
13
|
+
*
|
|
14
|
+
* EXTRACTION NOTE:
|
|
15
|
+
* This is the pi-coding-agent InteractiveMode used AS-IS.
|
|
16
|
+
* We create an AgentSession via the SDK, inject our custom tools
|
|
17
|
+
* (SSH, git, search), and let InteractiveMode handle all UI.
|
|
18
|
+
*
|
|
19
|
+
* OpenClaw wraps this same InteractiveMode with 3000+ lines of
|
|
20
|
+
* additional platform integration. We skip all of that.
|
|
21
|
+
*/
|
|
22
|
+
import type { ClawxConfig } from "../types/index.js";
|
|
23
|
+
/**
|
|
24
|
+
* Start the TUI mode.
|
|
25
|
+
*
|
|
26
|
+
* Creates an AgentSession via the pi-coding-agent SDK with our
|
|
27
|
+
* custom model and tools, then runs InteractiveMode for the full
|
|
28
|
+
* terminal UI experience.
|
|
29
|
+
*/
|
|
30
|
+
export declare function startTui(config: ClawxConfig, options?: {
|
|
31
|
+
initialMessage?: string;
|
|
32
|
+
continueSession?: boolean;
|
|
33
|
+
verbose?: boolean;
|
|
34
|
+
}): Promise<void>;
|
|
35
|
+
//# sourceMappingURL=tui.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../../src/cli/tui.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AASH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAwCrD;;;;;;GAMG;AACH,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,WAAW,EACnB,OAAO,GAAE;IACP,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;CACd,GACL,OAAO,CAAC,IAAI,CAAC,CAoCf"}
|
package/dist/cli/tui.js
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TUI mode for Clawx — uses pi-coding-agent's InteractiveMode.
|
|
3
|
+
*
|
|
4
|
+
* This provides the same rich terminal experience as OpenClaw/pi-coding-agent:
|
|
5
|
+
* - Syntax-highlighted code in tool results
|
|
6
|
+
* - Diff rendering for edit operations
|
|
7
|
+
* - Spinner animations during tool execution
|
|
8
|
+
* - Ctrl+P to cycle models
|
|
9
|
+
* - Ctrl+C to cancel, Ctrl+D to quit
|
|
10
|
+
* - Session branching and tree navigation
|
|
11
|
+
* - Markdown rendering in responses
|
|
12
|
+
* - /slash commands for settings, models, sessions, etc.
|
|
13
|
+
*
|
|
14
|
+
* EXTRACTION NOTE:
|
|
15
|
+
* This is the pi-coding-agent InteractiveMode used AS-IS.
|
|
16
|
+
* We create an AgentSession via the SDK, inject our custom tools
|
|
17
|
+
* (SSH, git, search), and let InteractiveMode handle all UI.
|
|
18
|
+
*
|
|
19
|
+
* OpenClaw wraps this same InteractiveMode with 3000+ lines of
|
|
20
|
+
* additional platform integration. We skip all of that.
|
|
21
|
+
*/
|
|
22
|
+
import { createAgentSession, InteractiveMode, AuthStorage, } from "@mariozechner/pi-coding-agent";
|
|
23
|
+
import { resolveModel } from "../core/provider.js";
|
|
24
|
+
import { createSshRunTool } from "../tools/sshRun.js";
|
|
25
|
+
import { createGitStatusTool } from "../tools/gitStatus.js";
|
|
26
|
+
import { createGitDiffTool } from "../tools/gitDiff.js";
|
|
27
|
+
import { createSearchFilesTool } from "../tools/searchFiles.js";
|
|
28
|
+
import { buildSystemPrompt } from "../utils/system-prompt.js";
|
|
29
|
+
import { log } from "../utils/logger.js";
|
|
30
|
+
/**
|
|
31
|
+
* Build custom tool definitions for registration with AgentSession.
|
|
32
|
+
*
|
|
33
|
+
* pi-coding-agent's extension system uses ToolDefinition objects
|
|
34
|
+
* that wrap AgentTool with additional metadata.
|
|
35
|
+
*/
|
|
36
|
+
function toolToDefinition(tool) {
|
|
37
|
+
return {
|
|
38
|
+
name: tool.name,
|
|
39
|
+
label: tool.label,
|
|
40
|
+
description: tool.description,
|
|
41
|
+
parameters: tool.parameters,
|
|
42
|
+
execute: tool.execute.bind(tool),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
function buildCustomTools(config) {
|
|
46
|
+
const cwd = config.workDir;
|
|
47
|
+
const tools = [];
|
|
48
|
+
tools.push(toolToDefinition(createSearchFilesTool(cwd)));
|
|
49
|
+
tools.push(toolToDefinition(createGitStatusTool(cwd)));
|
|
50
|
+
tools.push(toolToDefinition(createGitDiffTool(cwd)));
|
|
51
|
+
if (Object.keys(config.sshTargets).length > 0) {
|
|
52
|
+
tools.push(toolToDefinition(createSshRunTool(config.sshTargets)));
|
|
53
|
+
}
|
|
54
|
+
return tools;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Start the TUI mode.
|
|
58
|
+
*
|
|
59
|
+
* Creates an AgentSession via the pi-coding-agent SDK with our
|
|
60
|
+
* custom model and tools, then runs InteractiveMode for the full
|
|
61
|
+
* terminal UI experience.
|
|
62
|
+
*/
|
|
63
|
+
export async function startTui(config, options = {}) {
|
|
64
|
+
const model = resolveModel(config);
|
|
65
|
+
const customTools = buildCustomTools(config);
|
|
66
|
+
log.info(`Starting TUI with ${model.id} @ ${model.provider}`);
|
|
67
|
+
log.info(`Custom tools: ${customTools.map((t) => t.name).join(", ")}`);
|
|
68
|
+
// Create AuthStorage and inject our API key so pi-coding-agent
|
|
69
|
+
// doesn't reject local endpoints that have no env-var mapping
|
|
70
|
+
const authStorage = AuthStorage.create();
|
|
71
|
+
authStorage.setRuntimeApiKey(config.provider, config.apiKey);
|
|
72
|
+
// Create session via the SDK
|
|
73
|
+
const { session, extensionsResult, modelFallbackMessage } = await createAgentSession({
|
|
74
|
+
cwd: config.workDir,
|
|
75
|
+
model: model,
|
|
76
|
+
thinkingLevel: config.thinkingLevel === "off" ? undefined : config.thinkingLevel,
|
|
77
|
+
customTools,
|
|
78
|
+
authStorage,
|
|
79
|
+
});
|
|
80
|
+
// Override system prompt with our Clawx-specific one
|
|
81
|
+
// AgentSession exposes the underlying Agent which has setSystemPrompt()
|
|
82
|
+
const systemPrompt = buildSystemPrompt(config);
|
|
83
|
+
session.agent.setSystemPrompt(systemPrompt);
|
|
84
|
+
// Create and run the interactive mode
|
|
85
|
+
const mode = new InteractiveMode(session, {
|
|
86
|
+
modelFallbackMessage,
|
|
87
|
+
initialMessage: options.initialMessage,
|
|
88
|
+
verbose: options.verbose,
|
|
89
|
+
});
|
|
90
|
+
await mode.run();
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=tui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui.js","sourceRoot":"","sources":["../../src/cli/tui.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration loading for Clawx.
|
|
3
|
+
*
|
|
4
|
+
* Loads from environment variables (with .env support) and optional clawx.json.
|
|
5
|
+
* No complex config system — just env vars and a JSON file.
|
|
6
|
+
*/
|
|
7
|
+
import type { ClawxConfig } from "../types/index.js";
|
|
8
|
+
export declare function loadConfig(overrides?: Partial<ClawxConfig>): ClawxConfig;
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAa,MAAM,mBAAmB,CAAC;AAyChE,wBAAgB,UAAU,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,CA2ExE"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration loading for Clawx.
|
|
3
|
+
*
|
|
4
|
+
* Loads from environment variables (with .env support) and optional clawx.json.
|
|
5
|
+
* No complex config system — just env vars and a JSON file.
|
|
6
|
+
*/
|
|
7
|
+
import fs from "node:fs";
|
|
8
|
+
import path from "node:path";
|
|
9
|
+
import { config as loadDotenv } from "dotenv";
|
|
10
|
+
const DEFAULTS = {
|
|
11
|
+
provider: "openai-completions",
|
|
12
|
+
baseUrl: "http://localhost:8080/v1",
|
|
13
|
+
model: "qwen2.5-coder-14b-instruct",
|
|
14
|
+
apiKey: "not-needed",
|
|
15
|
+
workDir: process.cwd(),
|
|
16
|
+
shell: process.platform === "win32" ? "cmd.exe" : "/bin/bash",
|
|
17
|
+
execTimeout: 120_000,
|
|
18
|
+
thinkingLevel: "medium",
|
|
19
|
+
maxTokens: 16384,
|
|
20
|
+
sessionDir: path.join(process.env.HOME || process.env.USERPROFILE || ".", ".clawx", "sessions"),
|
|
21
|
+
sshTargets: {},
|
|
22
|
+
};
|
|
23
|
+
function parseSshTargets(raw) {
|
|
24
|
+
try {
|
|
25
|
+
const parsed = JSON.parse(raw);
|
|
26
|
+
if (typeof parsed !== "object" || parsed === null)
|
|
27
|
+
return {};
|
|
28
|
+
return parsed;
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return {};
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function loadJsonConfig(workDir) {
|
|
35
|
+
const configPath = path.join(workDir, "clawx.json");
|
|
36
|
+
if (!fs.existsSync(configPath))
|
|
37
|
+
return {};
|
|
38
|
+
try {
|
|
39
|
+
const raw = fs.readFileSync(configPath, "utf-8");
|
|
40
|
+
return JSON.parse(raw);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return {};
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export function loadConfig(overrides) {
|
|
47
|
+
// Load .env — first try cwd, then the clawx install directory
|
|
48
|
+
loadDotenv();
|
|
49
|
+
// If CLAWDEX_PROVIDER wasn't found in cwd's .env, try the package root
|
|
50
|
+
if (!process.env.CLAWDEX_PROVIDER) {
|
|
51
|
+
const packageRoot = path.resolve(new URL(import.meta.url).pathname.replace(/^\/([A-Z]:)/, "$1"), "../../..");
|
|
52
|
+
loadDotenv({ path: path.join(packageRoot, ".env") });
|
|
53
|
+
}
|
|
54
|
+
const env = process.env;
|
|
55
|
+
const workDir = env.CLAWDEX_WORK_DIR || overrides?.workDir || DEFAULTS.workDir;
|
|
56
|
+
const jsonConfig = loadJsonConfig(workDir);
|
|
57
|
+
const config = {
|
|
58
|
+
provider: overrides?.provider ||
|
|
59
|
+
env.CLAWDEX_PROVIDER ||
|
|
60
|
+
jsonConfig.provider ||
|
|
61
|
+
DEFAULTS.provider,
|
|
62
|
+
baseUrl: overrides?.baseUrl ||
|
|
63
|
+
env.CLAWDEX_BASE_URL ||
|
|
64
|
+
jsonConfig.baseUrl ||
|
|
65
|
+
DEFAULTS.baseUrl,
|
|
66
|
+
model: overrides?.model ||
|
|
67
|
+
env.CLAWDEX_MODEL ||
|
|
68
|
+
jsonConfig.model ||
|
|
69
|
+
DEFAULTS.model,
|
|
70
|
+
apiKey: overrides?.apiKey ||
|
|
71
|
+
env.CLAWDEX_API_KEY ||
|
|
72
|
+
env.OPENAI_API_KEY ||
|
|
73
|
+
env.ANTHROPIC_API_KEY ||
|
|
74
|
+
jsonConfig.apiKey ||
|
|
75
|
+
DEFAULTS.apiKey,
|
|
76
|
+
workDir,
|
|
77
|
+
shell: overrides?.shell ||
|
|
78
|
+
env.CLAWDEX_SHELL ||
|
|
79
|
+
env.SHELL ||
|
|
80
|
+
jsonConfig.shell ||
|
|
81
|
+
DEFAULTS.shell,
|
|
82
|
+
execTimeout: overrides?.execTimeout ||
|
|
83
|
+
(env.CLAWDEX_EXEC_TIMEOUT ? parseInt(env.CLAWDEX_EXEC_TIMEOUT, 10) : 0) ||
|
|
84
|
+
jsonConfig.execTimeout ||
|
|
85
|
+
DEFAULTS.execTimeout,
|
|
86
|
+
thinkingLevel: (overrides?.thinkingLevel ||
|
|
87
|
+
env.CLAWDEX_THINKING_LEVEL ||
|
|
88
|
+
jsonConfig.thinkingLevel ||
|
|
89
|
+
DEFAULTS.thinkingLevel),
|
|
90
|
+
maxTokens: overrides?.maxTokens ||
|
|
91
|
+
(env.CLAWDEX_MAX_TOKENS ? parseInt(env.CLAWDEX_MAX_TOKENS, 10) : 0) ||
|
|
92
|
+
jsonConfig.maxTokens ||
|
|
93
|
+
DEFAULTS.maxTokens,
|
|
94
|
+
sessionDir: overrides?.sessionDir ||
|
|
95
|
+
env.CLAWDEX_SESSION_DIR ||
|
|
96
|
+
jsonConfig.sessionDir ||
|
|
97
|
+
DEFAULTS.sessionDir,
|
|
98
|
+
sshTargets: overrides?.sshTargets ||
|
|
99
|
+
(env.CLAWDEX_SSH_TARGETS
|
|
100
|
+
? parseSshTargets(env.CLAWDEX_SSH_TARGETS)
|
|
101
|
+
: jsonConfig.sshTargets || DEFAULTS.sshTargets),
|
|
102
|
+
systemPrompt: overrides?.systemPrompt || jsonConfig.systemPrompt,
|
|
103
|
+
};
|
|
104
|
+
return config;
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Clawx Agent — the core orchestrator.
|
|
3
|
+
*
|
|
4
|
+
* EXTRACTION NOTE:
|
|
5
|
+
* OpenClaw's agent orchestration lives in pi-embedded-runner/run.ts (3000+ lines)
|
|
6
|
+
* which handles auth rotation, sandbox environments, context engines, plugin hooks,
|
|
7
|
+
* provider-specific quirks, compaction, failover, and channel integration.
|
|
8
|
+
*
|
|
9
|
+
* We DISCARD all of that and use the clean pi-agent-core agentLoop() directly.
|
|
10
|
+
* The agentLoop (agent-loop.js, 308 lines) handles:
|
|
11
|
+
* user message → model call → tool calls → tool execution → next model call → end
|
|
12
|
+
*
|
|
13
|
+
* Our orchestrator is a thin wrapper that:
|
|
14
|
+
* 1. Resolves the model from config
|
|
15
|
+
* 2. Assembles tools (pi-coding-agent builtins + our custom tools)
|
|
16
|
+
* 3. Builds the agent context (system prompt, messages, tools)
|
|
17
|
+
* 4. Calls agentLoop() and streams events to the terminal
|
|
18
|
+
* 5. Persists session state
|
|
19
|
+
*
|
|
20
|
+
* This replaces ~4000 lines of OpenClaw platform code with ~200 lines.
|
|
21
|
+
*/
|
|
22
|
+
import { type AgentMessage, type AgentEvent } from "@mariozechner/pi-agent-core";
|
|
23
|
+
import type { ClawxConfig } from "../types/index.js";
|
|
24
|
+
export interface AgentRunOptions {
|
|
25
|
+
/** User's message/prompt */
|
|
26
|
+
prompt: string;
|
|
27
|
+
/** Existing conversation messages (for multi-turn) */
|
|
28
|
+
messages?: AgentMessage[];
|
|
29
|
+
/** Callback for streaming events */
|
|
30
|
+
onEvent?: (event: AgentEvent) => void;
|
|
31
|
+
/** Abort signal */
|
|
32
|
+
signal?: AbortSignal;
|
|
33
|
+
/** Queued user messages to inject mid-run */
|
|
34
|
+
steeringQueue?: AgentMessage[];
|
|
35
|
+
}
|
|
36
|
+
export interface AgentRunResult {
|
|
37
|
+
messages: AgentMessage[];
|
|
38
|
+
aborted: boolean;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Run the Clawx agent loop.
|
|
42
|
+
*
|
|
43
|
+
* This is the main entry point. It:
|
|
44
|
+
* 1. Resolves the model
|
|
45
|
+
* 2. Builds tools
|
|
46
|
+
* 3. Creates the agent context
|
|
47
|
+
* 4. Runs agentLoop() from pi-agent-core
|
|
48
|
+
* 5. Streams events via callback
|
|
49
|
+
* 6. Returns the full message history
|
|
50
|
+
*/
|
|
51
|
+
export declare function runAgent(config: ClawxConfig, options: AgentRunOptions): Promise<AgentRunResult>;
|
|
52
|
+
export { type AgentEvent, type AgentMessage };
|
|
53
|
+
//# sourceMappingURL=agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/core/agent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAIL,KAAK,YAAY,EACjB,KAAK,UAAU,EAEhB,MAAM,6BAA6B,CAAC;AASrC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AASrD,MAAM,WAAW,eAAe;IAC9B,4BAA4B;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,sDAAsD;IACtD,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;IAC1B,oCAAoC;IACpC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IACtC,mBAAmB;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,6CAA6C;IAC7C,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,OAAO,EAAE,OAAO,CAAC;CAClB;AA8CD;;;;;;;;;;GAUG;AACH,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,cAAc,CAAC,CA4FzB;AAED,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,YAAY,EAAE,CAAC"}
|