@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.
Files changed (69) hide show
  1. package/.env.example +44 -0
  2. package/LICENSE +21 -0
  3. package/README.md +489 -0
  4. package/clawx.json.example +23 -0
  5. package/dist/cli/main.d.ts +21 -0
  6. package/dist/cli/main.d.ts.map +1 -0
  7. package/dist/cli/main.js +176 -0
  8. package/dist/cli/main.js.map +1 -0
  9. package/dist/cli/repl.d.ts +11 -0
  10. package/dist/cli/repl.d.ts.map +1 -0
  11. package/dist/cli/repl.js +119 -0
  12. package/dist/cli/repl.js.map +1 -0
  13. package/dist/cli/tui.d.ts +35 -0
  14. package/dist/cli/tui.d.ts.map +1 -0
  15. package/dist/cli/tui.js +92 -0
  16. package/dist/cli/tui.js.map +1 -0
  17. package/dist/config/index.d.ts +9 -0
  18. package/dist/config/index.d.ts.map +1 -0
  19. package/dist/config/index.js +106 -0
  20. package/dist/config/index.js.map +1 -0
  21. package/dist/core/agent.d.ts +53 -0
  22. package/dist/core/agent.d.ts.map +1 -0
  23. package/dist/core/agent.js +152 -0
  24. package/dist/core/agent.js.map +1 -0
  25. package/dist/core/provider.d.ts +30 -0
  26. package/dist/core/provider.d.ts.map +1 -0
  27. package/dist/core/provider.js +76 -0
  28. package/dist/core/provider.js.map +1 -0
  29. package/dist/core/session.d.ts +37 -0
  30. package/dist/core/session.d.ts.map +1 -0
  31. package/dist/core/session.js +87 -0
  32. package/dist/core/session.js.map +1 -0
  33. package/dist/core/streaming.d.ts +27 -0
  34. package/dist/core/streaming.d.ts.map +1 -0
  35. package/dist/core/streaming.js +137 -0
  36. package/dist/core/streaming.js.map +1 -0
  37. package/dist/index.d.ts +18 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +18 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/tools/gitDiff.d.ts +13 -0
  42. package/dist/tools/gitDiff.d.ts.map +1 -0
  43. package/dist/tools/gitDiff.js +50 -0
  44. package/dist/tools/gitDiff.js.map +1 -0
  45. package/dist/tools/gitStatus.d.ts +13 -0
  46. package/dist/tools/gitStatus.d.ts.map +1 -0
  47. package/dist/tools/gitStatus.js +43 -0
  48. package/dist/tools/gitStatus.js.map +1 -0
  49. package/dist/tools/searchFiles.d.ts +19 -0
  50. package/dist/tools/searchFiles.d.ts.map +1 -0
  51. package/dist/tools/searchFiles.js +101 -0
  52. package/dist/tools/searchFiles.js.map +1 -0
  53. package/dist/tools/sshRun.d.ts +26 -0
  54. package/dist/tools/sshRun.d.ts.map +1 -0
  55. package/dist/tools/sshRun.js +170 -0
  56. package/dist/tools/sshRun.js.map +1 -0
  57. package/dist/types/index.d.ts +35 -0
  58. package/dist/types/index.d.ts.map +1 -0
  59. package/dist/types/index.js +8 -0
  60. package/dist/types/index.js.map +1 -0
  61. package/dist/utils/logger.d.ts +19 -0
  62. package/dist/utils/logger.d.ts.map +1 -0
  63. package/dist/utils/logger.js +43 -0
  64. package/dist/utils/logger.js.map +1 -0
  65. package/dist/utils/system-prompt.d.ts +9 -0
  66. package/dist/utils/system-prompt.d.ts.map +1 -0
  67. package/dist/utils/system-prompt.js +49 -0
  68. package/dist/utils/system-prompt.js.map +1 -0
  69. package/package.json +71 -0
@@ -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"}
@@ -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":"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"}
@@ -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"}
@@ -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"}