@astroanywhere/agent 0.1.16 → 0.1.18
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/dist/cli.d.ts +4 -4
- package/dist/cli.js +25 -59
- package/dist/cli.js.map +1 -1
- package/dist/commands/index.d.ts +1 -1
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +1 -1
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/logs.d.ts +10 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +90 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/setup.js +9 -2
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +88 -4
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/status.js +1 -1
- package/dist/commands/status.js.map +1 -1
- package/dist/lib/providers.d.ts.map +1 -1
- package/dist/lib/providers.js +195 -1
- package/dist/lib/providers.js.map +1 -1
- package/dist/lib/ssh-installer.d.ts +5 -0
- package/dist/lib/ssh-installer.d.ts.map +1 -1
- package/dist/lib/ssh-installer.js +13 -0
- package/dist/lib/ssh-installer.js.map +1 -1
- package/dist/lib/task-executor.d.ts.map +1 -1
- package/dist/lib/task-executor.js +11 -0
- package/dist/lib/task-executor.js.map +1 -1
- package/dist/lib/workdir-safety.js +20 -20
- package/dist/lib/workdir-safety.js.map +1 -1
- package/dist/providers/claude-code-adapter.d.ts +2 -0
- package/dist/providers/claude-code-adapter.d.ts.map +1 -1
- package/dist/providers/claude-code-adapter.js +22 -2
- package/dist/providers/claude-code-adapter.js.map +1 -1
- package/dist/providers/codex-adapter.d.ts +48 -0
- package/dist/providers/codex-adapter.d.ts.map +1 -1
- package/dist/providers/codex-adapter.js +294 -12
- package/dist/providers/codex-adapter.js.map +1 -1
- package/dist/providers/index.d.ts +2 -0
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +10 -0
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/openclaw-adapter.d.ts +48 -0
- package/dist/providers/openclaw-adapter.d.ts.map +1 -0
- package/dist/providers/openclaw-adapter.js +324 -0
- package/dist/providers/openclaw-adapter.js.map +1 -0
- package/dist/providers/opencode-adapter.d.ts +46 -0
- package/dist/providers/opencode-adapter.d.ts.map +1 -0
- package/dist/providers/opencode-adapter.js +329 -0
- package/dist/providers/opencode-adapter.js.map +1 -0
- package/dist/types.d.ts +3 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/commands/plan.d.ts +0 -67
- package/dist/commands/plan.d.ts.map +0 -1
- package/dist/commands/plan.js +0 -374
- package/dist/commands/plan.js.map +0 -1
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenClaw provider adapter
|
|
3
|
+
*
|
|
4
|
+
* Executes tasks using the OpenClaw CLI in RPC/JSON streaming mode.
|
|
5
|
+
*
|
|
6
|
+
* CLI invocation:
|
|
7
|
+
* openclaw agent --mode rpc --json --prompt "<task>"
|
|
8
|
+
*
|
|
9
|
+
* Output: JSONL streaming to stdout with event types:
|
|
10
|
+
* session.start, content.text, tool_use.start, tool_use.end,
|
|
11
|
+
* file.change, message.start, message.end, session.end
|
|
12
|
+
*/
|
|
13
|
+
import { spawn } from 'node:child_process';
|
|
14
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
15
|
+
import { join } from 'node:path';
|
|
16
|
+
import { homedir } from 'node:os';
|
|
17
|
+
import { getProvider } from '../lib/providers.js';
|
|
18
|
+
export class OpenClawAdapter {
|
|
19
|
+
type = 'openclaw';
|
|
20
|
+
name = 'OpenClaw';
|
|
21
|
+
activeTasks = 0;
|
|
22
|
+
maxTasks = 1;
|
|
23
|
+
lastError;
|
|
24
|
+
openclawPath = null;
|
|
25
|
+
configModel = null;
|
|
26
|
+
async isAvailable() {
|
|
27
|
+
const provider = await getProvider('openclaw');
|
|
28
|
+
if (provider?.available) {
|
|
29
|
+
this.openclawPath = provider.path;
|
|
30
|
+
this.configModel = this.readConfigModel();
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Read the default model from ~/.openclaw/config.json
|
|
37
|
+
*/
|
|
38
|
+
readConfigModel() {
|
|
39
|
+
try {
|
|
40
|
+
const configPath = join(homedir(), '.openclaw', 'config.json');
|
|
41
|
+
if (!existsSync(configPath))
|
|
42
|
+
return null;
|
|
43
|
+
const content = readFileSync(configPath, 'utf-8');
|
|
44
|
+
const config = JSON.parse(content);
|
|
45
|
+
return config.model ?? null;
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async execute(task, stream, signal) {
|
|
52
|
+
if (!this.openclawPath) {
|
|
53
|
+
const available = await this.isAvailable();
|
|
54
|
+
if (!available) {
|
|
55
|
+
return {
|
|
56
|
+
taskId: task.id,
|
|
57
|
+
status: 'failed',
|
|
58
|
+
error: 'OpenClaw not available',
|
|
59
|
+
startedAt: new Date().toISOString(),
|
|
60
|
+
completedAt: new Date().toISOString(),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
this.activeTasks++;
|
|
65
|
+
const startedAt = new Date().toISOString();
|
|
66
|
+
try {
|
|
67
|
+
stream.status('running', 0, 'Starting OpenClaw');
|
|
68
|
+
const result = await this.runOpenClaw(task, stream, signal);
|
|
69
|
+
return {
|
|
70
|
+
taskId: task.id,
|
|
71
|
+
status: result.exitCode === 0 ? 'completed' : 'failed',
|
|
72
|
+
exitCode: result.exitCode,
|
|
73
|
+
output: result.output,
|
|
74
|
+
error: result.error,
|
|
75
|
+
startedAt,
|
|
76
|
+
completedAt: new Date().toISOString(),
|
|
77
|
+
artifacts: result.artifacts,
|
|
78
|
+
metrics: result.metrics,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
83
|
+
this.lastError = errorMsg;
|
|
84
|
+
if (signal.aborted) {
|
|
85
|
+
return {
|
|
86
|
+
taskId: task.id,
|
|
87
|
+
status: 'cancelled',
|
|
88
|
+
error: 'Task cancelled',
|
|
89
|
+
startedAt,
|
|
90
|
+
completedAt: new Date().toISOString(),
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
return {
|
|
94
|
+
taskId: task.id,
|
|
95
|
+
status: 'failed',
|
|
96
|
+
error: errorMsg,
|
|
97
|
+
startedAt,
|
|
98
|
+
completedAt: new Date().toISOString(),
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
finally {
|
|
102
|
+
this.activeTasks--;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
async getStatus() {
|
|
106
|
+
const available = await this.isAvailable();
|
|
107
|
+
const provider = await getProvider('openclaw');
|
|
108
|
+
return {
|
|
109
|
+
available,
|
|
110
|
+
version: provider?.version ?? null,
|
|
111
|
+
activeTasks: this.activeTasks,
|
|
112
|
+
maxTasks: this.maxTasks,
|
|
113
|
+
lastError: this.lastError,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
runOpenClaw(task, stream, signal) {
|
|
117
|
+
return new Promise((resolve, reject) => {
|
|
118
|
+
// OpenClaw CLI: agent --mode rpc --json
|
|
119
|
+
// --mode rpc: Non-interactive RPC mode (no TUI)
|
|
120
|
+
// --json: JSONL streaming output to stdout
|
|
121
|
+
const model = task.model || this.configModel;
|
|
122
|
+
const args = [
|
|
123
|
+
'agent',
|
|
124
|
+
'--mode', 'rpc',
|
|
125
|
+
'--json',
|
|
126
|
+
...(model ? ['--model', model] : []),
|
|
127
|
+
'--prompt', task.prompt,
|
|
128
|
+
];
|
|
129
|
+
const env = {
|
|
130
|
+
...process.env,
|
|
131
|
+
...task.environment,
|
|
132
|
+
};
|
|
133
|
+
// Validate working directory exists before spawning
|
|
134
|
+
if (task.workingDirectory && !existsSync(task.workingDirectory)) {
|
|
135
|
+
reject(new Error(`Working directory does not exist: ${task.workingDirectory}. ` +
|
|
136
|
+
`Ensure the directory exists on this machine before dispatching.`));
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
let proc;
|
|
140
|
+
try {
|
|
141
|
+
proc = spawn(this.openclawPath, args, {
|
|
142
|
+
cwd: task.workingDirectory || undefined,
|
|
143
|
+
env,
|
|
144
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
reject(error);
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
let stdout = '';
|
|
152
|
+
let stderr = '';
|
|
153
|
+
let lastMetrics;
|
|
154
|
+
const artifacts = [];
|
|
155
|
+
const abortHandler = () => {
|
|
156
|
+
proc.kill('SIGTERM');
|
|
157
|
+
setTimeout(() => {
|
|
158
|
+
if (!proc.killed) {
|
|
159
|
+
proc.kill('SIGKILL');
|
|
160
|
+
}
|
|
161
|
+
}, 5000);
|
|
162
|
+
};
|
|
163
|
+
signal.addEventListener('abort', abortHandler);
|
|
164
|
+
// Line buffer for incomplete JSONL lines
|
|
165
|
+
let lineBuf = '';
|
|
166
|
+
proc.stdout?.on('data', (data) => {
|
|
167
|
+
const text = data.toString();
|
|
168
|
+
stdout += text;
|
|
169
|
+
lineBuf += text;
|
|
170
|
+
const lines = lineBuf.split('\n');
|
|
171
|
+
lineBuf = lines.pop() || '';
|
|
172
|
+
for (const line of lines) {
|
|
173
|
+
if (line.trim()) {
|
|
174
|
+
const metrics = this.handleStreamLine(line, stream, artifacts);
|
|
175
|
+
if (metrics) {
|
|
176
|
+
lastMetrics = metrics;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
proc.stderr?.on('data', (data) => {
|
|
182
|
+
const text = data.toString();
|
|
183
|
+
stderr += text;
|
|
184
|
+
stream.stderr(text);
|
|
185
|
+
});
|
|
186
|
+
proc.on('error', (error) => {
|
|
187
|
+
signal.removeEventListener('abort', abortHandler);
|
|
188
|
+
reject(error);
|
|
189
|
+
});
|
|
190
|
+
proc.on('close', (code) => {
|
|
191
|
+
// Flush remaining buffer
|
|
192
|
+
if (lineBuf.trim()) {
|
|
193
|
+
const metrics = this.handleStreamLine(lineBuf, stream, artifacts);
|
|
194
|
+
if (metrics) {
|
|
195
|
+
lastMetrics = metrics;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
signal.removeEventListener('abort', abortHandler);
|
|
199
|
+
resolve({
|
|
200
|
+
exitCode: code ?? 1,
|
|
201
|
+
output: stdout,
|
|
202
|
+
error: stderr || undefined,
|
|
203
|
+
artifacts: artifacts.length > 0 ? artifacts : undefined,
|
|
204
|
+
metrics: lastMetrics,
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
if (task.timeout) {
|
|
208
|
+
setTimeout(() => {
|
|
209
|
+
if (!proc.killed) {
|
|
210
|
+
proc.kill('SIGTERM');
|
|
211
|
+
setTimeout(() => {
|
|
212
|
+
if (!proc.killed) {
|
|
213
|
+
proc.kill('SIGKILL');
|
|
214
|
+
}
|
|
215
|
+
}, 5000);
|
|
216
|
+
}
|
|
217
|
+
}, task.timeout);
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Handle a single JSONL line from OpenClaw's RPC output.
|
|
223
|
+
*
|
|
224
|
+
* OpenClaw JSONL event types:
|
|
225
|
+
* - session.start → sessionInit
|
|
226
|
+
* - content.text → text output
|
|
227
|
+
* - tool_use.start → toolUse
|
|
228
|
+
* - tool_use.end → toolResult
|
|
229
|
+
* - file.change → fileChange
|
|
230
|
+
* - message.start → status update (agent thinking)
|
|
231
|
+
* - message.end → status update (turn complete)
|
|
232
|
+
* - session.end → metrics extraction
|
|
233
|
+
*
|
|
234
|
+
* Returns metrics if a session.end event is processed.
|
|
235
|
+
*/
|
|
236
|
+
handleStreamLine(line, stream, artifacts) {
|
|
237
|
+
try {
|
|
238
|
+
const event = JSON.parse(line);
|
|
239
|
+
const type = event.type;
|
|
240
|
+
switch (type) {
|
|
241
|
+
case 'session.start': {
|
|
242
|
+
const sessionId = event.session_id;
|
|
243
|
+
const model = event.model;
|
|
244
|
+
if (sessionId) {
|
|
245
|
+
stream.sessionInit(sessionId, model);
|
|
246
|
+
}
|
|
247
|
+
break;
|
|
248
|
+
}
|
|
249
|
+
case 'message.start': {
|
|
250
|
+
stream.status('running', undefined, 'Agent thinking...');
|
|
251
|
+
break;
|
|
252
|
+
}
|
|
253
|
+
case 'content.text': {
|
|
254
|
+
const text = event.text;
|
|
255
|
+
if (text) {
|
|
256
|
+
stream.text(text);
|
|
257
|
+
}
|
|
258
|
+
break;
|
|
259
|
+
}
|
|
260
|
+
case 'tool_use.start': {
|
|
261
|
+
const toolName = event.tool_name || 'unknown';
|
|
262
|
+
const toolInput = event.tool_input ?? {};
|
|
263
|
+
stream.toolUse(toolName, toolInput);
|
|
264
|
+
break;
|
|
265
|
+
}
|
|
266
|
+
case 'tool_use.end': {
|
|
267
|
+
const toolName = event.tool_name || 'unknown';
|
|
268
|
+
const result = event.result;
|
|
269
|
+
const success = event.success !== false;
|
|
270
|
+
stream.toolResult(toolName, result, success);
|
|
271
|
+
break;
|
|
272
|
+
}
|
|
273
|
+
case 'file.change': {
|
|
274
|
+
const path = event.path;
|
|
275
|
+
const action = event.action || 'modified';
|
|
276
|
+
const linesAdded = event.lines_added;
|
|
277
|
+
const linesRemoved = event.lines_removed;
|
|
278
|
+
if (path) {
|
|
279
|
+
stream.fileChange(path, action, linesAdded, linesRemoved);
|
|
280
|
+
if (!artifacts.some((a) => a.path === path)) {
|
|
281
|
+
artifacts.push({ type: 'file', name: path, path });
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
break;
|
|
285
|
+
}
|
|
286
|
+
case 'message.end': {
|
|
287
|
+
stream.status('running', undefined, 'Turn complete');
|
|
288
|
+
break;
|
|
289
|
+
}
|
|
290
|
+
case 'session.end': {
|
|
291
|
+
const cost = event.cost;
|
|
292
|
+
const inputTokens = event.input_tokens;
|
|
293
|
+
const outputTokens = event.output_tokens;
|
|
294
|
+
const turns = event.turns;
|
|
295
|
+
const model = event.model;
|
|
296
|
+
const durationMs = event.duration_ms;
|
|
297
|
+
if (cost !== undefined) {
|
|
298
|
+
stream.status('running', 100, `Completed (${turns ?? 0} turns, $${cost.toFixed(4)})`);
|
|
299
|
+
}
|
|
300
|
+
else {
|
|
301
|
+
stream.status('running', 100, 'Completed');
|
|
302
|
+
}
|
|
303
|
+
return {
|
|
304
|
+
totalCost: cost,
|
|
305
|
+
inputTokens,
|
|
306
|
+
outputTokens,
|
|
307
|
+
numTurns: turns,
|
|
308
|
+
model,
|
|
309
|
+
durationMs,
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
default:
|
|
313
|
+
// Unknown event type — skip silently
|
|
314
|
+
break;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
catch {
|
|
318
|
+
// Not valid JSON — send as raw stdout
|
|
319
|
+
stream.stdout(line + '\n');
|
|
320
|
+
}
|
|
321
|
+
return undefined;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
//# sourceMappingURL=openclaw-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openclaw-adapter.js","sourceRoot":"","sources":["../../src/providers/openclaw-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenCode provider adapter
|
|
3
|
+
*
|
|
4
|
+
* Executes tasks using the OpenCode CLI in headless/print mode.
|
|
5
|
+
*
|
|
6
|
+
* CLI invocation:
|
|
7
|
+
* opencode run --print --output-format json "<task>"
|
|
8
|
+
*
|
|
9
|
+
* Output: JSONL streaming to stdout with event types similar to Claude Code:
|
|
10
|
+
* system, assistant, tool_result, result
|
|
11
|
+
*/
|
|
12
|
+
import type { Task, TaskResult } from '../types.js';
|
|
13
|
+
import type { ProviderAdapter, TaskOutputStream, ProviderStatus } from './base-adapter.js';
|
|
14
|
+
export declare class OpenCodeAdapter implements ProviderAdapter {
|
|
15
|
+
readonly type = "opencode";
|
|
16
|
+
readonly name = "OpenCode";
|
|
17
|
+
private activeTasks;
|
|
18
|
+
private maxTasks;
|
|
19
|
+
private lastError?;
|
|
20
|
+
private opencodePath;
|
|
21
|
+
private configModel;
|
|
22
|
+
private lastResultMetrics?;
|
|
23
|
+
/** Maps tool_use_id → tool name for correlating tool_use with tool_result */
|
|
24
|
+
private toolIdToName;
|
|
25
|
+
isAvailable(): Promise<boolean>;
|
|
26
|
+
/**
|
|
27
|
+
* Read the default model from ~/.opencode/config.json
|
|
28
|
+
*/
|
|
29
|
+
private readConfigModel;
|
|
30
|
+
execute(task: Task, stream: TaskOutputStream, signal: AbortSignal): Promise<TaskResult>;
|
|
31
|
+
getStatus(): Promise<ProviderStatus>;
|
|
32
|
+
private runOpenCode;
|
|
33
|
+
/**
|
|
34
|
+
* Handle a single JSONL line from OpenCode's streaming output.
|
|
35
|
+
*
|
|
36
|
+
* OpenCode events follow a pattern similar to Claude Code's stream-json:
|
|
37
|
+
* - system → sessionInit (session_id, model)
|
|
38
|
+
* - assistant → text + tool_use content blocks
|
|
39
|
+
* - tool_result → tool results
|
|
40
|
+
* - result → final metrics (cost, tokens, turns)
|
|
41
|
+
*/
|
|
42
|
+
/** Extract tool_result content blocks from an event and emit toolResult calls. */
|
|
43
|
+
handleToolResultBlocks(event: Record<string, unknown>, stream: TaskOutputStream): void;
|
|
44
|
+
handleStreamLine(line: string, stream: TaskOutputStream): void;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=opencode-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode-adapter.d.ts","sourceRoot":"","sources":["../../src/providers/opencode-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAgB,MAAM,aAAa,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAG3F,qBAAa,eAAgB,YAAW,eAAe;IACrD,QAAQ,CAAC,IAAI,cAAc;IAC3B,QAAQ,CAAC,IAAI,cAAc;IAE3B,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,iBAAiB,CAAC,CAAwB;IAClD,6EAA6E;IAC7E,OAAO,CAAC,YAAY,CAA6B;IAE3C,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAUrC;;OAEG;IACH,OAAO,CAAC,eAAe;IAYjB,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IA6DvF,SAAS,IAAI,OAAO,CAAC,cAAc,CAAC;IAa1C,OAAO,CAAC,WAAW;IA2HnB;;;;;;;;OAQG;IACH,kFAAkF;IAClF,sBAAsB,CACpB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,MAAM,EAAE,gBAAgB,GACvB,IAAI;IAgCP,gBAAgB,CACd,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,gBAAgB,GACvB,IAAI;CA2GR"}
|