@astroanywhere/agent 0.1.34 → 0.1.36
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.js +8 -11
- package/dist/cli.js.map +1 -1
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +71 -51
- package/dist/commands/start.js.map +1 -1
- package/dist/lib/display.d.ts +24 -0
- package/dist/lib/display.d.ts.map +1 -0
- package/dist/lib/display.js +202 -0
- package/dist/lib/display.js.map +1 -0
- package/dist/lib/openclaw-bridge.d.ts +73 -0
- package/dist/lib/openclaw-bridge.d.ts.map +1 -0
- package/dist/lib/openclaw-bridge.js +457 -0
- package/dist/lib/openclaw-bridge.js.map +1 -0
- package/dist/lib/providers.d.ts.map +1 -1
- package/dist/lib/providers.js +46 -53
- package/dist/lib/providers.js.map +1 -1
- package/dist/lib/ssh-installer.d.ts +19 -10
- package/dist/lib/ssh-installer.d.ts.map +1 -1
- package/dist/lib/ssh-installer.js +18 -12
- package/dist/lib/ssh-installer.js.map +1 -1
- package/dist/lib/task-executor.d.ts +14 -1
- package/dist/lib/task-executor.d.ts.map +1 -1
- package/dist/lib/task-executor.js +154 -4
- package/dist/lib/task-executor.js.map +1 -1
- package/dist/lib/websocket-client.d.ts +5 -0
- package/dist/lib/websocket-client.d.ts.map +1 -1
- package/dist/lib/websocket-client.js +159 -0
- package/dist/lib/websocket-client.js.map +1 -1
- package/dist/mcp/tools.d.ts +1 -1
- package/dist/providers/claude-code-adapter.d.ts.map +1 -1
- package/dist/providers/claude-code-adapter.js +8 -0
- package/dist/providers/claude-code-adapter.js.map +1 -1
- package/dist/providers/claude-sdk-adapter.d.ts +4 -1
- package/dist/providers/claude-sdk-adapter.d.ts.map +1 -1
- package/dist/providers/claude-sdk-adapter.js +17 -6
- package/dist/providers/claude-sdk-adapter.js.map +1 -1
- package/dist/providers/codex-adapter.d.ts.map +1 -1
- package/dist/providers/codex-adapter.js +1 -0
- package/dist/providers/codex-adapter.js.map +1 -1
- package/dist/providers/openclaw-adapter.d.ts +46 -29
- package/dist/providers/openclaw-adapter.d.ts.map +1 -1
- package/dist/providers/openclaw-adapter.js +603 -215
- package/dist/providers/openclaw-adapter.js.map +1 -1
- package/dist/providers/opencode-adapter.d.ts +29 -0
- package/dist/providers/opencode-adapter.d.ts.map +1 -1
- package/dist/providers/opencode-adapter.js +153 -38
- package/dist/providers/opencode-adapter.js.map +1 -1
- package/dist/types.d.ts +83 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminal display utilities for structured, elegant output.
|
|
3
|
+
*
|
|
4
|
+
* Renders machine/provider information in bordered boxes with
|
|
5
|
+
* consistent formatting for both local and remote hosts.
|
|
6
|
+
*/
|
|
7
|
+
import chalk from 'chalk';
|
|
8
|
+
import { formatBytes } from './resources.js';
|
|
9
|
+
// ── Box-drawing helpers ──────────────────────────────────────────────
|
|
10
|
+
const BOX = {
|
|
11
|
+
tl: '╭', tr: '╮', bl: '╰', br: '╯',
|
|
12
|
+
h: '─', v: '│', sep: '├', sepR: '┤',
|
|
13
|
+
};
|
|
14
|
+
function boxLine(content, width) {
|
|
15
|
+
// Strip ANSI codes to measure visible length
|
|
16
|
+
const visible = content.replace(/\x1b\[[0-9;]*m/g, '');
|
|
17
|
+
const pad = Math.max(0, width - visible.length);
|
|
18
|
+
return `${BOX.v} ${content}${' '.repeat(pad)} ${BOX.v}`;
|
|
19
|
+
}
|
|
20
|
+
function boxTop(width) {
|
|
21
|
+
return `${BOX.tl}${BOX.h.repeat(width + 2)}${BOX.tr}`;
|
|
22
|
+
}
|
|
23
|
+
function boxBottom(width) {
|
|
24
|
+
return `${BOX.bl}${BOX.h.repeat(width + 2)}${BOX.br}`;
|
|
25
|
+
}
|
|
26
|
+
function boxSeparator(width) {
|
|
27
|
+
return `${BOX.sep}${BOX.h.repeat(width + 2)}${BOX.sepR}`;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Render lines inside a box. Each line is left-aligned within the box.
|
|
31
|
+
*/
|
|
32
|
+
function renderBox(lines, minWidth = 50) {
|
|
33
|
+
// Calculate width from longest visible line
|
|
34
|
+
const maxVisible = lines.reduce((max, line) => {
|
|
35
|
+
const visible = line.replace(/\x1b\[[0-9;]*m/g, '');
|
|
36
|
+
return Math.max(max, visible.length);
|
|
37
|
+
}, 0);
|
|
38
|
+
const width = Math.max(minWidth, maxVisible);
|
|
39
|
+
const output = [];
|
|
40
|
+
output.push(boxTop(width));
|
|
41
|
+
for (const line of lines) {
|
|
42
|
+
output.push(boxLine(line, width));
|
|
43
|
+
}
|
|
44
|
+
output.push(boxBottom(width));
|
|
45
|
+
return output.join('\n');
|
|
46
|
+
}
|
|
47
|
+
// ── Machine type classification ──────────────────────────────────────
|
|
48
|
+
function classifyMachine(resources) {
|
|
49
|
+
const hasNvidiaGpu = resources.gpu.some(g => g.vendor === 'NVIDIA');
|
|
50
|
+
const hasAppleGpu = resources.gpu.some(g => g.vendor === 'Apple');
|
|
51
|
+
const totalGpuMem = resources.gpu.reduce((sum, g) => sum + g.memoryTotal, 0);
|
|
52
|
+
const totalRamGB = resources.memory.total / (1024 ** 3);
|
|
53
|
+
if (hasNvidiaGpu && totalGpuMem > 16 * 1024 ** 3)
|
|
54
|
+
return 'GPU Workstation';
|
|
55
|
+
if (hasNvidiaGpu)
|
|
56
|
+
return 'GPU Machine';
|
|
57
|
+
if (hasAppleGpu && totalRamGB >= 32)
|
|
58
|
+
return 'Apple Silicon Workstation';
|
|
59
|
+
if (hasAppleGpu)
|
|
60
|
+
return 'Apple Silicon';
|
|
61
|
+
if (totalRamGB >= 64)
|
|
62
|
+
return 'High-Memory Server';
|
|
63
|
+
if (resources.cpu.cores >= 16)
|
|
64
|
+
return 'Multi-Core Server';
|
|
65
|
+
return 'Workstation';
|
|
66
|
+
}
|
|
67
|
+
// ── Format local machine box ─────────────────────────────────────────
|
|
68
|
+
export function formatLocalMachineBox(resources, providers, version, runnerId) {
|
|
69
|
+
const machineType = classifyMachine(resources);
|
|
70
|
+
const lines = [];
|
|
71
|
+
// Title
|
|
72
|
+
lines.push(chalk.bold.cyan(` ${resources.hostname}`) + chalk.dim(` (this device)`));
|
|
73
|
+
lines.push(chalk.dim(` ${machineType} · ${resources.platform}/${resources.arch} · v${version}`));
|
|
74
|
+
lines.push('');
|
|
75
|
+
// Hardware
|
|
76
|
+
lines.push(chalk.white(' Hardware'));
|
|
77
|
+
lines.push(` CPU ${chalk.white(resources.cpu.model)} ${chalk.dim(`(${resources.cpu.cores} cores)`)}`);
|
|
78
|
+
const totalRAM = formatBytes(resources.memory.total);
|
|
79
|
+
const freeRAM = formatBytes(resources.memory.free);
|
|
80
|
+
lines.push(` RAM ${chalk.white(totalRAM)} ${chalk.dim(`(${freeRAM} available)`)}`);
|
|
81
|
+
if (resources.gpu.length > 0) {
|
|
82
|
+
for (const gpu of resources.gpu) {
|
|
83
|
+
const gpuMem = formatBytes(gpu.memoryTotal);
|
|
84
|
+
const gpuLabel = 'GPU';
|
|
85
|
+
lines.push(` ${gpuLabel} ${chalk.white(gpu.name)} ${chalk.dim(`(${gpuMem})`)}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// Providers
|
|
89
|
+
lines.push('');
|
|
90
|
+
lines.push(chalk.white(' AI Providers'));
|
|
91
|
+
if (providers.length === 0) {
|
|
92
|
+
lines.push(chalk.yellow(' No providers detected'));
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
for (const p of providers) {
|
|
96
|
+
const ver = p.version ? chalk.dim(` v${p.version}`) : '';
|
|
97
|
+
const model = p.capabilities.defaultModel
|
|
98
|
+
? chalk.dim(` · model: ${p.capabilities.defaultModel}`)
|
|
99
|
+
: '';
|
|
100
|
+
const hpc = p.hpcCapability
|
|
101
|
+
? chalk.dim(` · HPC: ${p.hpcCapability.clusterName || 'Slurm'}`)
|
|
102
|
+
: '';
|
|
103
|
+
lines.push(` ${chalk.green('✓')} ${chalk.white(p.name)}${ver}${model}${hpc}`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// Runner ID (compact)
|
|
107
|
+
lines.push('');
|
|
108
|
+
lines.push(chalk.dim(` Runner: ${runnerId.slice(0, 8)}…`));
|
|
109
|
+
return renderBox(lines);
|
|
110
|
+
}
|
|
111
|
+
// ── Format remote host box ───────────────────────────────────────────
|
|
112
|
+
export function formatRemoteHostBox(host, status, message, agentStatus) {
|
|
113
|
+
const lines = [];
|
|
114
|
+
// Title
|
|
115
|
+
const statusIcon = status === 'running' ? chalk.green('●')
|
|
116
|
+
: status === 'failed' ? chalk.red('●')
|
|
117
|
+
: chalk.yellow('●');
|
|
118
|
+
const statusText = status === 'running' ? chalk.green('running')
|
|
119
|
+
: status === 'failed' ? chalk.red('failed')
|
|
120
|
+
: chalk.yellow('starting');
|
|
121
|
+
lines.push(` ${statusIcon} ${chalk.bold.cyan(host.name)} ${chalk.dim(`(${statusText})`)}`);
|
|
122
|
+
// Connection info
|
|
123
|
+
const userHost = host.user ? `${host.user}@${host.hostname}` : host.hostname;
|
|
124
|
+
const port = host.port && host.port !== 22 ? `:${host.port}` : '';
|
|
125
|
+
lines.push(chalk.dim(` ${userHost}${port}`));
|
|
126
|
+
// Hardware summary from agent status
|
|
127
|
+
if (agentStatus) {
|
|
128
|
+
const hwParts = [];
|
|
129
|
+
if (agentStatus.platform)
|
|
130
|
+
hwParts.push(`${agentStatus.platform}/${agentStatus.arch || 'unknown'}`);
|
|
131
|
+
if (agentStatus.cpuCores)
|
|
132
|
+
hwParts.push(`${agentStatus.cpuCores} cores`);
|
|
133
|
+
if (agentStatus.memoryGB)
|
|
134
|
+
hwParts.push(`${agentStatus.memoryGB} GB RAM`);
|
|
135
|
+
if (hwParts.length > 0) {
|
|
136
|
+
lines.push(chalk.dim(` ${hwParts.join(' · ')}`));
|
|
137
|
+
}
|
|
138
|
+
// GPU
|
|
139
|
+
if (agentStatus.gpu && agentStatus.gpu.length > 0) {
|
|
140
|
+
for (const g of agentStatus.gpu) {
|
|
141
|
+
lines.push(` ${chalk.white(g.name)} ${chalk.dim(`(${g.memoryGB} GB)`)}`);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// AI Providers
|
|
145
|
+
if (agentStatus.providers && agentStatus.providers.length > 0) {
|
|
146
|
+
lines.push('');
|
|
147
|
+
lines.push(chalk.white(' AI Providers'));
|
|
148
|
+
for (const p of agentStatus.providers) {
|
|
149
|
+
const ver = p.version ? chalk.dim(` v${p.version}`) : '';
|
|
150
|
+
const model = p.model ? chalk.dim(` · model: ${p.model}`) : '';
|
|
151
|
+
lines.push(` ${chalk.green('✓')} ${chalk.white(p.name)}${ver}${model}`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
if (message && status === 'failed') {
|
|
156
|
+
lines.push(` ${chalk.red('Error:')} ${chalk.dim(message.slice(0, 60))}`);
|
|
157
|
+
}
|
|
158
|
+
return renderBox(lines, 44);
|
|
159
|
+
}
|
|
160
|
+
// ── Summary banner ───────────────────────────────────────────────────
|
|
161
|
+
export function formatLaunchBanner(version) {
|
|
162
|
+
return [
|
|
163
|
+
'',
|
|
164
|
+
chalk.bold(` Astro Agent Runner ${chalk.dim(`v${version}`)}`),
|
|
165
|
+
'',
|
|
166
|
+
].join('\n');
|
|
167
|
+
}
|
|
168
|
+
export function formatSetupHint(hostCount) {
|
|
169
|
+
if (hostCount > 0) {
|
|
170
|
+
return chalk.dim(` Tip: Run with ${chalk.white('--force-setup')} to reconfigure SSH hosts or re-discover providers.`);
|
|
171
|
+
}
|
|
172
|
+
return chalk.dim(` Tip: Run with ${chalk.white('--force-setup')} to configure SSH remote hosts.`);
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Format "no providers" warning with install hints.
|
|
176
|
+
*/
|
|
177
|
+
export function formatNoProvidersWarning() {
|
|
178
|
+
return [
|
|
179
|
+
chalk.yellow(' No AI providers detected.'),
|
|
180
|
+
chalk.dim(' Install one of the following to get started:'),
|
|
181
|
+
chalk.dim(` • Claude Code ${chalk.white('npm i -g @anthropic-ai/claude-code')}`),
|
|
182
|
+
chalk.dim(` • OpenAI Codex ${chalk.white('npm i -g @openai/codex')}`),
|
|
183
|
+
chalk.dim(` • OpenClaw ${chalk.white('npm i -g openclaw')}`),
|
|
184
|
+
chalk.dim(` • OpenCode ${chalk.white('bun i -g opencode')}`),
|
|
185
|
+
].join('\n');
|
|
186
|
+
}
|
|
187
|
+
// ── Compact summary for background mode ──────────────────────────────
|
|
188
|
+
export function formatBackgroundSummary(providers, hostCount, runnerId) {
|
|
189
|
+
const provNames = providers.length > 0
|
|
190
|
+
? providers.map(p => p.name).join(', ')
|
|
191
|
+
: 'none';
|
|
192
|
+
const lines = [];
|
|
193
|
+
lines.push(chalk.dim(` Providers: ${provNames}`));
|
|
194
|
+
if (hostCount > 0) {
|
|
195
|
+
lines.push(chalk.dim(` Remote hosts: ${hostCount}`));
|
|
196
|
+
}
|
|
197
|
+
lines.push(chalk.dim(` Runner ID: ${runnerId.slice(0, 8)}…`));
|
|
198
|
+
return lines.join('\n');
|
|
199
|
+
}
|
|
200
|
+
// ── Box separator for visual grouping ────────────────────────────────
|
|
201
|
+
export { boxSeparator, renderBox };
|
|
202
|
+
//# sourceMappingURL=display.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"display.js","sourceRoot":"","sources":["../../src/lib/display.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenClaw Bridge — Persistent gateway connection for channel operations
|
|
3
|
+
*
|
|
4
|
+
* Unlike the per-task OpenClawAdapter (which creates a new connection per task),
|
|
5
|
+
* the bridge maintains a single long-lived WebSocket to the OpenClaw gateway
|
|
6
|
+
* for notification delivery, approval routing, and inbound message forwarding.
|
|
7
|
+
*
|
|
8
|
+
* This enables the relay-routed architecture:
|
|
9
|
+
* Server → Relay → Agent Runner (bridge) → OpenClaw Gateway → User channels
|
|
10
|
+
*/
|
|
11
|
+
import { EventEmitter } from 'node:events';
|
|
12
|
+
export declare class OpenClawBridge extends EventEmitter {
|
|
13
|
+
private ws;
|
|
14
|
+
private gatewayConfig;
|
|
15
|
+
private pendingRequests;
|
|
16
|
+
private pendingApprovals;
|
|
17
|
+
private _connected;
|
|
18
|
+
private _started;
|
|
19
|
+
private _connecting;
|
|
20
|
+
private reconnectTimer;
|
|
21
|
+
/** Default recipient for send (e.g., Telegram username, phone). Read from openclaw.json */
|
|
22
|
+
private defaultRecipient;
|
|
23
|
+
/** Telegram bot token, cached from config at start() */
|
|
24
|
+
private telegramBotToken;
|
|
25
|
+
get isConnected(): boolean;
|
|
26
|
+
start(): Promise<boolean>;
|
|
27
|
+
stop(): void;
|
|
28
|
+
private readGatewayConfig;
|
|
29
|
+
private connect;
|
|
30
|
+
private scheduleReconnect;
|
|
31
|
+
private sendRequest;
|
|
32
|
+
private handleResponse;
|
|
33
|
+
private handleEvent;
|
|
34
|
+
private resolveApproval;
|
|
35
|
+
sendNotification(notification: {
|
|
36
|
+
type: string;
|
|
37
|
+
projectId: string;
|
|
38
|
+
summary: string;
|
|
39
|
+
astroUrl?: string;
|
|
40
|
+
to?: string;
|
|
41
|
+
metadata?: Record<string, unknown>;
|
|
42
|
+
}): Promise<void>;
|
|
43
|
+
sendResponse(response: {
|
|
44
|
+
text: string;
|
|
45
|
+
channelId: string;
|
|
46
|
+
threadId?: string;
|
|
47
|
+
to?: string;
|
|
48
|
+
metadata?: Record<string, unknown>;
|
|
49
|
+
}): Promise<void>;
|
|
50
|
+
requestApproval(opts: {
|
|
51
|
+
approvalId: string;
|
|
52
|
+
projectId: string;
|
|
53
|
+
taskId: string;
|
|
54
|
+
question: string;
|
|
55
|
+
options?: string[];
|
|
56
|
+
to?: string;
|
|
57
|
+
}): Promise<string>;
|
|
58
|
+
private readTelegramBotToken;
|
|
59
|
+
/**
|
|
60
|
+
* Send approval via Telegram as a single poll.
|
|
61
|
+
*
|
|
62
|
+
* Sends one poll (no auto-close). Periodically calls stopPoll to check
|
|
63
|
+
* for votes. If no votes on first check, re-sends the poll once.
|
|
64
|
+
*
|
|
65
|
+
* Text replies are NOT supported via this path because they conflict
|
|
66
|
+
* with the OpenClaw agent session (the agent would also process the reply).
|
|
67
|
+
*/
|
|
68
|
+
private requestApprovalViaTelegram;
|
|
69
|
+
private telegramSendPoll;
|
|
70
|
+
private telegramStopPoll;
|
|
71
|
+
private getNotificationPrefix;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=openclaw-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openclaw-bridge.d.ts","sourceRoot":"","sources":["../../src/lib/openclaw-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AA+C3C,qBAAa,cAAe,SAAQ,YAAY;IAC9C,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,eAAe,CAAqC;IAC5D,OAAO,CAAC,gBAAgB,CAAqC;IAC7D,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,cAAc,CAA8C;IACpE,2FAA2F;IAC3F,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,wDAAwD;IACxD,OAAO,CAAC,gBAAgB,CAAuB;IAE/C,IAAI,WAAW,IAAI,OAAO,CAEzB;IAIK,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;IAsB/B,IAAI,IAAI,IAAI;IAkCZ,OAAO,CAAC,iBAAiB;IAwBzB,OAAO,CAAC,OAAO;IAyGf,OAAO,CAAC,iBAAiB;IAYzB,OAAO,CAAC,WAAW;IA8BnB,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,WAAW;IA6BnB,OAAO,CAAC,eAAe;IAYjB,gBAAgB,CAAC,YAAY,EAAE;QACnC,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACpC,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBX,YAAY,CAAC,QAAQ,EAAE;QAC3B,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACpC,GAAG,OAAO,CAAC,IAAI,CAAC;IAeX,eAAe,CAAC,IAAI,EAAE;QAC1B,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QACnB,EAAE,CAAC,EAAE,MAAM,CAAC;KACb,GAAG,OAAO,CAAC,MAAM,CAAC;IAsCnB,OAAO,CAAC,oBAAoB;IAW5B;;;;;;;;OAQG;YACW,0BAA0B;YAkD1B,gBAAgB;YAsBhB,gBAAgB;IAe9B,OAAO,CAAC,qBAAqB;CAS9B"}
|