@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.
Files changed (57) hide show
  1. package/dist/cli.d.ts +4 -4
  2. package/dist/cli.js +25 -59
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/index.d.ts +1 -1
  5. package/dist/commands/index.d.ts.map +1 -1
  6. package/dist/commands/index.js +1 -1
  7. package/dist/commands/index.js.map +1 -1
  8. package/dist/commands/logs.d.ts +10 -0
  9. package/dist/commands/logs.d.ts.map +1 -0
  10. package/dist/commands/logs.js +90 -0
  11. package/dist/commands/logs.js.map +1 -0
  12. package/dist/commands/setup.js +9 -2
  13. package/dist/commands/setup.js.map +1 -1
  14. package/dist/commands/start.d.ts.map +1 -1
  15. package/dist/commands/start.js +88 -4
  16. package/dist/commands/start.js.map +1 -1
  17. package/dist/commands/status.js +1 -1
  18. package/dist/commands/status.js.map +1 -1
  19. package/dist/lib/providers.d.ts.map +1 -1
  20. package/dist/lib/providers.js +195 -1
  21. package/dist/lib/providers.js.map +1 -1
  22. package/dist/lib/ssh-installer.d.ts +5 -0
  23. package/dist/lib/ssh-installer.d.ts.map +1 -1
  24. package/dist/lib/ssh-installer.js +13 -0
  25. package/dist/lib/ssh-installer.js.map +1 -1
  26. package/dist/lib/task-executor.d.ts.map +1 -1
  27. package/dist/lib/task-executor.js +11 -0
  28. package/dist/lib/task-executor.js.map +1 -1
  29. package/dist/lib/workdir-safety.js +20 -20
  30. package/dist/lib/workdir-safety.js.map +1 -1
  31. package/dist/providers/claude-code-adapter.d.ts +2 -0
  32. package/dist/providers/claude-code-adapter.d.ts.map +1 -1
  33. package/dist/providers/claude-code-adapter.js +22 -2
  34. package/dist/providers/claude-code-adapter.js.map +1 -1
  35. package/dist/providers/codex-adapter.d.ts +48 -0
  36. package/dist/providers/codex-adapter.d.ts.map +1 -1
  37. package/dist/providers/codex-adapter.js +294 -12
  38. package/dist/providers/codex-adapter.js.map +1 -1
  39. package/dist/providers/index.d.ts +2 -0
  40. package/dist/providers/index.d.ts.map +1 -1
  41. package/dist/providers/index.js +10 -0
  42. package/dist/providers/index.js.map +1 -1
  43. package/dist/providers/openclaw-adapter.d.ts +48 -0
  44. package/dist/providers/openclaw-adapter.d.ts.map +1 -0
  45. package/dist/providers/openclaw-adapter.js +324 -0
  46. package/dist/providers/openclaw-adapter.js.map +1 -0
  47. package/dist/providers/opencode-adapter.d.ts +46 -0
  48. package/dist/providers/opencode-adapter.d.ts.map +1 -0
  49. package/dist/providers/opencode-adapter.js +329 -0
  50. package/dist/providers/opencode-adapter.js.map +1 -0
  51. package/dist/types.d.ts +3 -1
  52. package/dist/types.d.ts.map +1 -1
  53. package/package.json +1 -1
  54. package/dist/commands/plan.d.ts +0 -67
  55. package/dist/commands/plan.d.ts.map +0 -1
  56. package/dist/commands/plan.js +0 -374
  57. 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"}