@astroanywhere/agent 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/LICENSE +76 -0
- package/README.md +178 -0
- package/dist/cli.d.ts +15 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +401 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/index.d.ts +9 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +9 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/mcp.d.ts +16 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +19 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/setup.d.ts +20 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +585 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/start.d.ts +16 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +638 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/status.d.ts +5 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +63 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/stop.d.ts +5 -0
- package/dist/commands/stop.d.ts.map +1 -0
- package/dist/commands/stop.js +85 -0
- package/dist/commands/stop.js.map +1 -0
- package/dist/execution/direct-strategy.d.ts +18 -0
- package/dist/execution/direct-strategy.d.ts.map +1 -0
- package/dist/execution/direct-strategy.js +156 -0
- package/dist/execution/direct-strategy.js.map +1 -0
- package/dist/execution/docker-strategy.d.ts +26 -0
- package/dist/execution/docker-strategy.d.ts.map +1 -0
- package/dist/execution/docker-strategy.js +222 -0
- package/dist/execution/docker-strategy.js.map +1 -0
- package/dist/execution/index.d.ts +14 -0
- package/dist/execution/index.d.ts.map +1 -0
- package/dist/execution/index.js +13 -0
- package/dist/execution/index.js.map +1 -0
- package/dist/execution/kubernetes-exec-strategy.d.ts +23 -0
- package/dist/execution/kubernetes-exec-strategy.d.ts.map +1 -0
- package/dist/execution/kubernetes-exec-strategy.js +232 -0
- package/dist/execution/kubernetes-exec-strategy.js.map +1 -0
- package/dist/execution/registry.d.ts +41 -0
- package/dist/execution/registry.d.ts.map +1 -0
- package/dist/execution/registry.js +84 -0
- package/dist/execution/registry.js.map +1 -0
- package/dist/execution/slurm-strategy.d.ts +22 -0
- package/dist/execution/slurm-strategy.d.ts.map +1 -0
- package/dist/execution/slurm-strategy.js +219 -0
- package/dist/execution/slurm-strategy.js.map +1 -0
- package/dist/execution/types.d.ts +72 -0
- package/dist/execution/types.d.ts.map +1 -0
- package/dist/execution/types.js +10 -0
- package/dist/execution/types.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api-client.d.ts +35 -0
- package/dist/lib/api-client.d.ts.map +1 -0
- package/dist/lib/api-client.js +126 -0
- package/dist/lib/api-client.js.map +1 -0
- package/dist/lib/config.d.ts +174 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +399 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/copy-worktree.d.ts +73 -0
- package/dist/lib/copy-worktree.d.ts.map +1 -0
- package/dist/lib/copy-worktree.js +374 -0
- package/dist/lib/copy-worktree.js.map +1 -0
- package/dist/lib/git-pr.d.ts +63 -0
- package/dist/lib/git-pr.d.ts.map +1 -0
- package/dist/lib/git-pr.js +224 -0
- package/dist/lib/git-pr.js.map +1 -0
- package/dist/lib/hardware-id.d.ts +25 -0
- package/dist/lib/hardware-id.d.ts.map +1 -0
- package/dist/lib/hardware-id.js +186 -0
- package/dist/lib/hardware-id.js.map +1 -0
- package/dist/lib/hpc-context.d.ts +35 -0
- package/dist/lib/hpc-context.d.ts.map +1 -0
- package/dist/lib/hpc-context.js +167 -0
- package/dist/lib/hpc-context.js.map +1 -0
- package/dist/lib/prompt-templates.d.ts +195 -0
- package/dist/lib/prompt-templates.d.ts.map +1 -0
- package/dist/lib/prompt-templates.js +353 -0
- package/dist/lib/prompt-templates.js.map +1 -0
- package/dist/lib/providers.d.ts +27 -0
- package/dist/lib/providers.d.ts.map +1 -0
- package/dist/lib/providers.js +372 -0
- package/dist/lib/providers.js.map +1 -0
- package/dist/lib/repo-context.d.ts +18 -0
- package/dist/lib/repo-context.d.ts.map +1 -0
- package/dist/lib/repo-context.js +61 -0
- package/dist/lib/repo-context.js.map +1 -0
- package/dist/lib/repo-utils.d.ts +35 -0
- package/dist/lib/repo-utils.d.ts.map +1 -0
- package/dist/lib/repo-utils.js +222 -0
- package/dist/lib/repo-utils.js.map +1 -0
- package/dist/lib/resources.d.ts +17 -0
- package/dist/lib/resources.d.ts.map +1 -0
- package/dist/lib/resources.js +227 -0
- package/dist/lib/resources.js.map +1 -0
- package/dist/lib/slurm-detect.d.ts +15 -0
- package/dist/lib/slurm-detect.d.ts.map +1 -0
- package/dist/lib/slurm-detect.js +148 -0
- package/dist/lib/slurm-detect.js.map +1 -0
- package/dist/lib/slurm-executor.d.ts +70 -0
- package/dist/lib/slurm-executor.d.ts.map +1 -0
- package/dist/lib/slurm-executor.js +402 -0
- package/dist/lib/slurm-executor.js.map +1 -0
- package/dist/lib/slurm-job-monitor.d.ts +52 -0
- package/dist/lib/slurm-job-monitor.d.ts.map +1 -0
- package/dist/lib/slurm-job-monitor.js +212 -0
- package/dist/lib/slurm-job-monitor.js.map +1 -0
- package/dist/lib/ssh-discovery.d.ts +17 -0
- package/dist/lib/ssh-discovery.d.ts.map +1 -0
- package/dist/lib/ssh-discovery.js +287 -0
- package/dist/lib/ssh-discovery.js.map +1 -0
- package/dist/lib/ssh-installer.d.ts +69 -0
- package/dist/lib/ssh-installer.d.ts.map +1 -0
- package/dist/lib/ssh-installer.js +230 -0
- package/dist/lib/ssh-installer.js.map +1 -0
- package/dist/lib/streaming-prompt.d.ts +48 -0
- package/dist/lib/streaming-prompt.d.ts.map +1 -0
- package/dist/lib/streaming-prompt.js +91 -0
- package/dist/lib/streaming-prompt.js.map +1 -0
- package/dist/lib/task-executor.d.ts +114 -0
- package/dist/lib/task-executor.d.ts.map +1 -0
- package/dist/lib/task-executor.js +753 -0
- package/dist/lib/task-executor.js.map +1 -0
- package/dist/lib/websocket-client.d.ts +200 -0
- package/dist/lib/websocket-client.d.ts.map +1 -0
- package/dist/lib/websocket-client.js +781 -0
- package/dist/lib/websocket-client.js.map +1 -0
- package/dist/lib/workdir-safety.d.ts +63 -0
- package/dist/lib/workdir-safety.d.ts.map +1 -0
- package/dist/lib/workdir-safety.js +247 -0
- package/dist/lib/workdir-safety.js.map +1 -0
- package/dist/lib/worktree-include.d.ts +14 -0
- package/dist/lib/worktree-include.d.ts.map +1 -0
- package/dist/lib/worktree-include.js +68 -0
- package/dist/lib/worktree-include.js.map +1 -0
- package/dist/lib/worktree-setup.d.ts +18 -0
- package/dist/lib/worktree-setup.d.ts.map +1 -0
- package/dist/lib/worktree-setup.js +60 -0
- package/dist/lib/worktree-setup.js.map +1 -0
- package/dist/lib/worktree.d.ts +37 -0
- package/dist/lib/worktree.d.ts.map +1 -0
- package/dist/lib/worktree.js +411 -0
- package/dist/lib/worktree.js.map +1 -0
- package/dist/mcp/index.d.ts +8 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +8 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server.d.ts +45 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +153 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/session-bridge.d.ts +87 -0
- package/dist/mcp/session-bridge.d.ts.map +1 -0
- package/dist/mcp/session-bridge.js +317 -0
- package/dist/mcp/session-bridge.js.map +1 -0
- package/dist/mcp/tools.d.ts +70 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +234 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/mcp/types.d.ts +197 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +16 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/providers/base-adapter.d.ts +56 -0
- package/dist/providers/base-adapter.d.ts.map +1 -0
- package/dist/providers/base-adapter.js +5 -0
- package/dist/providers/base-adapter.js.map +1 -0
- package/dist/providers/claude-code-adapter.d.ts +27 -0
- package/dist/providers/claude-code-adapter.d.ts.map +1 -0
- package/dist/providers/claude-code-adapter.js +298 -0
- package/dist/providers/claude-code-adapter.js.map +1 -0
- package/dist/providers/claude-sdk-adapter.d.ts +60 -0
- package/dist/providers/claude-sdk-adapter.d.ts.map +1 -0
- package/dist/providers/claude-sdk-adapter.js +632 -0
- package/dist/providers/claude-sdk-adapter.js.map +1 -0
- package/dist/providers/codex-adapter.d.ts +21 -0
- package/dist/providers/codex-adapter.d.ts.map +1 -0
- package/dist/providers/codex-adapter.js +197 -0
- package/dist/providers/codex-adapter.js.map +1 -0
- package/dist/providers/index.d.ts +26 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +58 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/slurm-adapter.d.ts +26 -0
- package/dist/providers/slurm-adapter.d.ts.map +1 -0
- package/dist/providers/slurm-adapter.js +146 -0
- package/dist/providers/slurm-adapter.js.map +1 -0
- package/dist/types.d.ts +592 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +77 -0
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Remote SSH installation utilities for local dev.
|
|
3
|
+
*
|
|
4
|
+
* Packs the agent-runner locally, SCPs it to the target host,
|
|
5
|
+
* installs via npm, and pushes pre-provisioned tokens so the
|
|
6
|
+
* remote host skips its own device auth entirely.
|
|
7
|
+
*/
|
|
8
|
+
import { execFile as execFileCb } from 'node:child_process';
|
|
9
|
+
import { promisify } from 'node:util';
|
|
10
|
+
import { networkInterfaces } from 'node:os';
|
|
11
|
+
import { resolve, dirname } from 'node:path';
|
|
12
|
+
import { fileURLToPath } from 'node:url';
|
|
13
|
+
const execFile = promisify(execFileCb);
|
|
14
|
+
// ============================================================================
|
|
15
|
+
// Network helpers
|
|
16
|
+
// ============================================================================
|
|
17
|
+
/**
|
|
18
|
+
* Detect the LAN IP of this machine so remote hosts can reach the dev server.
|
|
19
|
+
* Returns the first non-internal IPv4 address found.
|
|
20
|
+
*/
|
|
21
|
+
export function detectLocalIP() {
|
|
22
|
+
const nets = networkInterfaces();
|
|
23
|
+
for (const ifaces of Object.values(nets)) {
|
|
24
|
+
if (!ifaces)
|
|
25
|
+
continue;
|
|
26
|
+
for (const iface of ifaces) {
|
|
27
|
+
if (iface.family === 'IPv4' && !iface.internal) {
|
|
28
|
+
return iface.address;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return '127.0.0.1';
|
|
33
|
+
}
|
|
34
|
+
// ============================================================================
|
|
35
|
+
// Remote checks
|
|
36
|
+
// ============================================================================
|
|
37
|
+
/**
|
|
38
|
+
* SSH to a host and check whether Node.js ≥ 18 is available.
|
|
39
|
+
* Returns { available, version } or throws on SSH failure.
|
|
40
|
+
*/
|
|
41
|
+
export async function checkRemoteNode(host) {
|
|
42
|
+
try {
|
|
43
|
+
const { stdout } = await sshExec(host, 'node --version');
|
|
44
|
+
const ver = stdout.trim(); // e.g. "v20.11.0"
|
|
45
|
+
const major = parseInt(ver.replace(/^v/, ''), 10);
|
|
46
|
+
return { available: major >= 18, version: ver };
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return { available: false, version: null };
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Pack the local agent-runner, SCP it to the remote host, install, and configure.
|
|
54
|
+
*
|
|
55
|
+
* Steps:
|
|
56
|
+
* 1. `npm pack` in the agent-runner directory → tarball
|
|
57
|
+
* 2. `scp` tarball to remote ~/
|
|
58
|
+
* 3. `ssh npm install -g <tarball>` on remote
|
|
59
|
+
* 4. `ssh astro-agent setup --non-interactive --skip-auth` on remote
|
|
60
|
+
* 5. Push tokens via `ssh astro-agent config --set` commands
|
|
61
|
+
*/
|
|
62
|
+
export async function packAndInstall(opts, onProgress) {
|
|
63
|
+
const { host, apiUrl, relayUrl, accessToken, refreshToken, wsToken, machineId } = opts;
|
|
64
|
+
const log = onProgress ?? (() => { });
|
|
65
|
+
// 1. npm pack
|
|
66
|
+
const agentRunnerDir = resolve(dirname(fileURLToPath(import.meta.url)), '..', '..');
|
|
67
|
+
log('Packing agent-runner...');
|
|
68
|
+
const { stdout: packOut } = await execFile('npm', ['pack', '--pack-destination', '/tmp'], {
|
|
69
|
+
cwd: agentRunnerDir,
|
|
70
|
+
});
|
|
71
|
+
const tarball = `/tmp/${packOut.trim().split('\n').pop()}`;
|
|
72
|
+
// 2. SCP tarball to remote
|
|
73
|
+
log(`Copying to ${host.name}...`);
|
|
74
|
+
const scpArgs = buildScpArgs(host, tarball, '~/astro-agent.tgz');
|
|
75
|
+
await execFile('scp', scpArgs);
|
|
76
|
+
// 3. Install to user-local prefix to avoid EACCES on system dirs
|
|
77
|
+
log(`Installing on ${host.name}...`);
|
|
78
|
+
const npmPrefix = '~/.local';
|
|
79
|
+
await sshExec(host, `mkdir -p ${npmPrefix} && npm install -g --prefix ${npmPrefix} ~/astro-agent.tgz`);
|
|
80
|
+
// 4. Ensure ~/.local/bin is on PATH for this session and future logins
|
|
81
|
+
const binDir = `${npmPrefix}/bin`;
|
|
82
|
+
const pathExport = `export PATH="${binDir}:$PATH"`;
|
|
83
|
+
const pathSetup = [
|
|
84
|
+
`grep -qxF '${pathExport}' ~/.bashrc 2>/dev/null || echo '${pathExport}' >> ~/.bashrc`,
|
|
85
|
+
`grep -qxF '${pathExport}' ~/.profile 2>/dev/null || echo '${pathExport}' >> ~/.profile`,
|
|
86
|
+
].join(' && ');
|
|
87
|
+
await sshExec(host, pathSetup);
|
|
88
|
+
// 5. Run setup --non-interactive --skip-auth (with binDir on PATH)
|
|
89
|
+
log(`Running setup on ${host.name}...`);
|
|
90
|
+
await sshExec(host, `${pathExport} && astro-agent setup --non-interactive --skip-auth --api ${apiUrl} --relay ${relayUrl}`);
|
|
91
|
+
// 6. Push tokens via stdin to avoid exposing them in ps output
|
|
92
|
+
log(`Configuring tokens on ${host.name}...`);
|
|
93
|
+
const configJson = JSON.stringify({
|
|
94
|
+
apiUrl,
|
|
95
|
+
relayUrl,
|
|
96
|
+
accessToken,
|
|
97
|
+
refreshToken,
|
|
98
|
+
wsToken,
|
|
99
|
+
machineId,
|
|
100
|
+
});
|
|
101
|
+
// Pipe config as JSON via stdin to avoid shell argument exposure on shared machines
|
|
102
|
+
const configCmd = `${pathExport} && cat > /tmp/.astro-config-$$.json && ` +
|
|
103
|
+
`astro-agent config --import /tmp/.astro-config-$$.json && ` +
|
|
104
|
+
`rm -f /tmp/.astro-config-$$.json`;
|
|
105
|
+
const sshArgs = buildSshArgs(host, configCmd);
|
|
106
|
+
const { execFile: execFileCbInner } = await import('node:child_process');
|
|
107
|
+
const child = execFileCbInner('ssh', sshArgs);
|
|
108
|
+
child.stdin?.write(configJson);
|
|
109
|
+
child.stdin?.end();
|
|
110
|
+
await new Promise((resolve, reject) => {
|
|
111
|
+
child.on('close', (code) => code === 0 ? resolve() : reject(new Error(`ssh config push exited with code ${code}`)));
|
|
112
|
+
child.on('error', reject);
|
|
113
|
+
});
|
|
114
|
+
// Clean up remote tarball
|
|
115
|
+
await sshExec(host, 'rm -f ~/astro-agent.tgz').catch(() => { });
|
|
116
|
+
log(`Done — ${host.name} is configured`);
|
|
117
|
+
}
|
|
118
|
+
// ============================================================================
|
|
119
|
+
// SSH / SCP helpers
|
|
120
|
+
// ============================================================================
|
|
121
|
+
export function buildSshArgs(host, command) {
|
|
122
|
+
const args = [];
|
|
123
|
+
if (host.port && host.port !== 22) {
|
|
124
|
+
args.push('-p', String(host.port));
|
|
125
|
+
}
|
|
126
|
+
if (host.identityFile) {
|
|
127
|
+
args.push('-i', host.identityFile);
|
|
128
|
+
}
|
|
129
|
+
if (host.proxyJump) {
|
|
130
|
+
args.push('-J', host.proxyJump);
|
|
131
|
+
}
|
|
132
|
+
// Batch mode to avoid password prompts hanging
|
|
133
|
+
args.push('-o', 'BatchMode=yes', '-o', 'ConnectTimeout=10');
|
|
134
|
+
const target = host.user ? `${host.user}@${host.hostname}` : host.hostname;
|
|
135
|
+
args.push(target, command);
|
|
136
|
+
return args;
|
|
137
|
+
}
|
|
138
|
+
function buildScpArgs(host, localPath, remotePath) {
|
|
139
|
+
const args = [];
|
|
140
|
+
if (host.port && host.port !== 22) {
|
|
141
|
+
args.push('-P', String(host.port));
|
|
142
|
+
}
|
|
143
|
+
if (host.identityFile) {
|
|
144
|
+
args.push('-i', host.identityFile);
|
|
145
|
+
}
|
|
146
|
+
if (host.proxyJump) {
|
|
147
|
+
args.push('-o', `ProxyJump=${host.proxyJump}`);
|
|
148
|
+
}
|
|
149
|
+
args.push('-o', 'BatchMode=yes', '-o', 'ConnectTimeout=10');
|
|
150
|
+
const target = host.user ? `${host.user}@${host.hostname}` : host.hostname;
|
|
151
|
+
args.push(localPath, `${target}:${remotePath}`);
|
|
152
|
+
return args;
|
|
153
|
+
}
|
|
154
|
+
export async function sshExec(host, command) {
|
|
155
|
+
const args = buildSshArgs(host, command);
|
|
156
|
+
return execFile('ssh', args, { timeout: 60_000 });
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Start agent runners on remote hosts.
|
|
160
|
+
*
|
|
161
|
+
* For each host:
|
|
162
|
+
* 1. Check if an agent is already running (pgrep)
|
|
163
|
+
* 2. Start via nohup + disown
|
|
164
|
+
* 3. Verify after 2s with pgrep
|
|
165
|
+
*
|
|
166
|
+
* One failure does not block others.
|
|
167
|
+
*/
|
|
168
|
+
export async function startRemoteAgents(hosts, options = {}, onProgress) {
|
|
169
|
+
const results = [];
|
|
170
|
+
const log = (host, msg) => onProgress?.(host, msg);
|
|
171
|
+
for (const host of hosts) {
|
|
172
|
+
log(host.name, 'Checking for running agent...');
|
|
173
|
+
// 1. Check if already running
|
|
174
|
+
try {
|
|
175
|
+
const { stdout } = await sshExec(host, 'pgrep -f "astro-agent start"');
|
|
176
|
+
if (stdout.trim()) {
|
|
177
|
+
log(host.name, 'Agent already running');
|
|
178
|
+
results.push({ host, success: true, message: 'Already running', alreadyRunning: true });
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
// pgrep returns exit code 1 when no match — that's fine
|
|
184
|
+
}
|
|
185
|
+
// 2. Build start command with forwarded options
|
|
186
|
+
const binDir = '~/.local/bin';
|
|
187
|
+
const pathExport = `export PATH="${binDir}:$PATH"`;
|
|
188
|
+
const flags = ['--foreground'];
|
|
189
|
+
if (options.maxTasks)
|
|
190
|
+
flags.push(`--max-tasks ${options.maxTasks}`);
|
|
191
|
+
if (options.logLevel)
|
|
192
|
+
flags.push(`--log-level ${options.logLevel}`);
|
|
193
|
+
if (options.preserveWorktrees)
|
|
194
|
+
flags.push('--preserve-worktrees');
|
|
195
|
+
const startCmd = `astro-agent start ${flags.join(' ')}`;
|
|
196
|
+
log(host.name, 'Starting agent...');
|
|
197
|
+
try {
|
|
198
|
+
await sshExec(host, `${pathExport} && mkdir -p ~/.astro/logs && nohup ${startCmd} > ~/.astro/logs/agent-runner.log 2>&1 & disown`);
|
|
199
|
+
}
|
|
200
|
+
catch (err) {
|
|
201
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
202
|
+
results.push({ host, success: false, message: `Failed to start: ${msg}` });
|
|
203
|
+
continue;
|
|
204
|
+
}
|
|
205
|
+
// 3. Verify after 2s
|
|
206
|
+
await new Promise((r) => setTimeout(r, 2000));
|
|
207
|
+
try {
|
|
208
|
+
const { stdout } = await sshExec(host, 'pgrep -f "astro-agent start"');
|
|
209
|
+
if (stdout.trim()) {
|
|
210
|
+
log(host.name, 'Agent started successfully');
|
|
211
|
+
results.push({ host, success: true, message: 'Started' });
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
// Fallback: check log tail
|
|
215
|
+
try {
|
|
216
|
+
const { stdout: logTail } = await sshExec(host, 'tail -5 ~/.astro/logs/agent-runner.log 2>/dev/null');
|
|
217
|
+
results.push({ host, success: false, message: `Process not found after start. Log tail:\n${logTail}` });
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
results.push({ host, success: false, message: 'Process not found after start (no logs available)' });
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
catch {
|
|
225
|
+
results.push({ host, success: false, message: 'Could not verify agent start (pgrep failed)' });
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return results;
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=ssh-installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ssh-installer.js","sourceRoot":"","sources":["../../src/lib/ssh-installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* StreamingPrompt - Async iterator queue for injecting messages into a running SDK session.
|
|
3
|
+
*
|
|
4
|
+
* Ported from Cyrus's StreamingPrompt pattern. Enables mid-execution steering
|
|
5
|
+
* by allowing new user messages to be pushed into a running `query()` call.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* const prompt = new StreamingPrompt('initial task prompt');
|
|
9
|
+
* const gen = query({ prompt, options });
|
|
10
|
+
* // Later, inject a steer message:
|
|
11
|
+
* prompt.addMessage('Please also fix the tests');
|
|
12
|
+
* // When done:
|
|
13
|
+
* prompt.complete();
|
|
14
|
+
*/
|
|
15
|
+
interface SDKUserMessage {
|
|
16
|
+
role: 'user';
|
|
17
|
+
content: string;
|
|
18
|
+
}
|
|
19
|
+
export declare class StreamingPrompt {
|
|
20
|
+
private queue;
|
|
21
|
+
private resolve;
|
|
22
|
+
private done;
|
|
23
|
+
private sessionId?;
|
|
24
|
+
constructor(initialPrompt: string);
|
|
25
|
+
/**
|
|
26
|
+
* Add a new user message to the running session.
|
|
27
|
+
* The SDK will pick this up as the next turn's input.
|
|
28
|
+
*/
|
|
29
|
+
addMessage(content: string): void;
|
|
30
|
+
/**
|
|
31
|
+
* Signal that no more messages will be sent.
|
|
32
|
+
*/
|
|
33
|
+
complete(): void;
|
|
34
|
+
/**
|
|
35
|
+
* Update the session ID (called after first SDK init message).
|
|
36
|
+
*/
|
|
37
|
+
updateSessionId(id: string): void;
|
|
38
|
+
/**
|
|
39
|
+
* Get the current session ID.
|
|
40
|
+
*/
|
|
41
|
+
getSessionId(): string | undefined;
|
|
42
|
+
/**
|
|
43
|
+
* Async iterator protocol — used by the SDK's `query()` to consume messages.
|
|
44
|
+
*/
|
|
45
|
+
[Symbol.asyncIterator](): AsyncIterator<SDKUserMessage>;
|
|
46
|
+
}
|
|
47
|
+
export {};
|
|
48
|
+
//# sourceMappingURL=streaming-prompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streaming-prompt.d.ts","sourceRoot":"","sources":["../../src/lib/streaming-prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD,qBAAa,eAAe;IAC1B,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,OAAO,CAAmE;IAClF,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,SAAS,CAAC,CAAS;gBAEf,aAAa,EAAE,MAAM;IAOjC;;;OAGG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAgBjC;;OAEG;IACH,QAAQ,IAAI,IAAI;IAShB;;OAEG;IACH,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAIjC;;OAEG;IACH,YAAY,IAAI,MAAM,GAAG,SAAS;IAIlC;;OAEG;IACH,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,cAAc,CAAC;CAqBxD"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* StreamingPrompt - Async iterator queue for injecting messages into a running SDK session.
|
|
3
|
+
*
|
|
4
|
+
* Ported from Cyrus's StreamingPrompt pattern. Enables mid-execution steering
|
|
5
|
+
* by allowing new user messages to be pushed into a running `query()` call.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* const prompt = new StreamingPrompt('initial task prompt');
|
|
9
|
+
* const gen = query({ prompt, options });
|
|
10
|
+
* // Later, inject a steer message:
|
|
11
|
+
* prompt.addMessage('Please also fix the tests');
|
|
12
|
+
* // When done:
|
|
13
|
+
* prompt.complete();
|
|
14
|
+
*/
|
|
15
|
+
export class StreamingPrompt {
|
|
16
|
+
queue = [];
|
|
17
|
+
resolve = null;
|
|
18
|
+
done = false;
|
|
19
|
+
sessionId;
|
|
20
|
+
constructor(initialPrompt) {
|
|
21
|
+
// Seed the queue with the initial prompt as the first user message
|
|
22
|
+
this.queue.push({
|
|
23
|
+
value: { role: 'user', content: initialPrompt },
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Add a new user message to the running session.
|
|
28
|
+
* The SDK will pick this up as the next turn's input.
|
|
29
|
+
*/
|
|
30
|
+
addMessage(content) {
|
|
31
|
+
if (this.done)
|
|
32
|
+
return;
|
|
33
|
+
const message = { role: 'user', content };
|
|
34
|
+
if (this.resolve) {
|
|
35
|
+
// Consumer is waiting — deliver immediately
|
|
36
|
+
const r = this.resolve;
|
|
37
|
+
this.resolve = null;
|
|
38
|
+
r({ value: message, done: false });
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
// Consumer hasn't asked yet — buffer
|
|
42
|
+
this.queue.push({ value: message });
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Signal that no more messages will be sent.
|
|
47
|
+
*/
|
|
48
|
+
complete() {
|
|
49
|
+
this.done = true;
|
|
50
|
+
if (this.resolve) {
|
|
51
|
+
const r = this.resolve;
|
|
52
|
+
this.resolve = null;
|
|
53
|
+
r({ value: undefined, done: true });
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Update the session ID (called after first SDK init message).
|
|
58
|
+
*/
|
|
59
|
+
updateSessionId(id) {
|
|
60
|
+
this.sessionId = id;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Get the current session ID.
|
|
64
|
+
*/
|
|
65
|
+
getSessionId() {
|
|
66
|
+
return this.sessionId;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Async iterator protocol — used by the SDK's `query()` to consume messages.
|
|
70
|
+
*/
|
|
71
|
+
[Symbol.asyncIterator]() {
|
|
72
|
+
return {
|
|
73
|
+
next: () => {
|
|
74
|
+
// If there's buffered data, return it immediately
|
|
75
|
+
if (this.queue.length > 0) {
|
|
76
|
+
const item = this.queue.shift();
|
|
77
|
+
return Promise.resolve({ value: item.value, done: false });
|
|
78
|
+
}
|
|
79
|
+
// If stream is complete, signal done
|
|
80
|
+
if (this.done) {
|
|
81
|
+
return Promise.resolve({ value: undefined, done: true });
|
|
82
|
+
}
|
|
83
|
+
// Otherwise, wait for the next message
|
|
84
|
+
return new Promise((resolve) => {
|
|
85
|
+
this.resolve = resolve;
|
|
86
|
+
});
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=streaming-prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streaming-prompt.js","sourceRoot":"","sources":["../../src/lib/streaming-prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAWH,MAAM,OAAO,eAAe;IAClB,KAAK,GAAgB,EAAE,CAAC;IACxB,OAAO,GAA8D,IAAI,CAAC;IAC1E,IAAI,GAAG,KAAK,CAAC;IACb,SAAS,CAAU;IAE3B,YAAY,aAAqB;QAC/B,mEAAmE;QACnE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YACd,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE;SAChD,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,UAAU,CAAC,OAAe;QACxB,IAAI,IAAI,CAAC,IAAI;YAAE,OAAO;QAEtB,MAAM,OAAO,GAAmB,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;QAE1D,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,4CAA4C;YAC5C,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;YACvB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACrC,CAAC;aAAM,CAAC;YACN,qCAAqC;YACrC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;YACvB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,CAAC,CAAC,EAAE,KAAK,EAAE,SAAsC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,EAAU;QACxB,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,CAAC,MAAM,CAAC,aAAa,CAAC;QACpB,OAAO;YACL,IAAI,EAAE,GAA4C,EAAE;gBAClD,kDAAkD;gBAClD,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAG,CAAC;oBACjC,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC7D,CAAC;gBAED,qCAAqC;gBACrC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;oBACd,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,SAAsC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBACxF,CAAC;gBAED,uCAAuC;gBACvC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;oBAC7B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;gBACzB,CAAC,CAAC,CAAC;YACL,CAAC;SACF,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task executor with multiplexing support
|
|
3
|
+
*
|
|
4
|
+
* Handles concurrent task execution, routing to providers,
|
|
5
|
+
* and streaming output back over WebSocket
|
|
6
|
+
*/
|
|
7
|
+
import type { Task } from '../types.js';
|
|
8
|
+
import type { WebSocketClient } from './websocket-client.js';
|
|
9
|
+
export interface TaskExecutorOptions {
|
|
10
|
+
wsClient: WebSocketClient;
|
|
11
|
+
maxConcurrentTasks?: number;
|
|
12
|
+
defaultTimeout?: number;
|
|
13
|
+
useWorktree?: boolean;
|
|
14
|
+
worktreeRoot?: string;
|
|
15
|
+
preserveWorktrees?: boolean;
|
|
16
|
+
allowNonGit?: boolean;
|
|
17
|
+
useSandbox?: boolean;
|
|
18
|
+
maxSandboxSize?: number;
|
|
19
|
+
}
|
|
20
|
+
export declare class TaskExecutor {
|
|
21
|
+
private wsClient;
|
|
22
|
+
private runningTasks;
|
|
23
|
+
private taskQueue;
|
|
24
|
+
private maxConcurrentTasks;
|
|
25
|
+
private defaultTimeout;
|
|
26
|
+
private adapters;
|
|
27
|
+
private useWorktree;
|
|
28
|
+
private worktreeRoot?;
|
|
29
|
+
private preserveWorktrees;
|
|
30
|
+
private jobMonitor;
|
|
31
|
+
private allowNonGit;
|
|
32
|
+
private useSandbox;
|
|
33
|
+
private maxSandboxSize;
|
|
34
|
+
private gitAvailable;
|
|
35
|
+
private tasksByDirectory;
|
|
36
|
+
private pendingSafetyChecks;
|
|
37
|
+
constructor(options: TaskExecutorOptions);
|
|
38
|
+
/**
|
|
39
|
+
* Submit a task for execution (with safety checks)
|
|
40
|
+
*/
|
|
41
|
+
submitTask(task: Task): Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* Handle safety decision from user (via server)
|
|
44
|
+
*/
|
|
45
|
+
handleSafetyDecision(taskId: string, decision: 'proceed' | 'init-git' | 'sandbox' | 'cancel'): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* Cancel a running or queued task
|
|
48
|
+
*/
|
|
49
|
+
cancelTask(taskId: string): boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Get current task counts
|
|
52
|
+
*/
|
|
53
|
+
getTaskCounts(): {
|
|
54
|
+
running: number;
|
|
55
|
+
queued: number;
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Cancel all tasks and clear queue
|
|
59
|
+
*/
|
|
60
|
+
cancelAll(): void;
|
|
61
|
+
/**
|
|
62
|
+
* Update max concurrent tasks
|
|
63
|
+
*/
|
|
64
|
+
setMaxConcurrentTasks(max: number): void;
|
|
65
|
+
/**
|
|
66
|
+
* Steer a running task by injecting a message into the agent session.
|
|
67
|
+
* When interrupt=true, interrupts the current turn before injecting.
|
|
68
|
+
*
|
|
69
|
+
* For completed tasks with a preserved session, this triggers a full
|
|
70
|
+
* resume via the SDK's `resume` option for post-completion follow-up.
|
|
71
|
+
*/
|
|
72
|
+
steerTask(taskId: string, message: string, interrupt?: boolean): Promise<{
|
|
73
|
+
accepted: boolean;
|
|
74
|
+
reason?: string;
|
|
75
|
+
}>;
|
|
76
|
+
/**
|
|
77
|
+
* Find the ClaudeSdkAdapter that has a preserved session for the given task.
|
|
78
|
+
*/
|
|
79
|
+
private findAdapterWithSession;
|
|
80
|
+
/**
|
|
81
|
+
* Resume a completed task session for post-completion steering.
|
|
82
|
+
* Runs in the background, streaming output back through the WebSocket.
|
|
83
|
+
*/
|
|
84
|
+
private resumeCompletedTask;
|
|
85
|
+
/**
|
|
86
|
+
* Perform safety check on working directory
|
|
87
|
+
*/
|
|
88
|
+
private performSafetyCheck;
|
|
89
|
+
/**
|
|
90
|
+
* Request safety decision from user
|
|
91
|
+
*/
|
|
92
|
+
private requestSafetyDecision;
|
|
93
|
+
/**
|
|
94
|
+
* Initialize git repository in a directory
|
|
95
|
+
*/
|
|
96
|
+
private initializeGit;
|
|
97
|
+
/**
|
|
98
|
+
* Track task by directory for parallel execution safety
|
|
99
|
+
*/
|
|
100
|
+
private trackTaskDirectory;
|
|
101
|
+
/**
|
|
102
|
+
* Untrack task from directory
|
|
103
|
+
*/
|
|
104
|
+
private untrackTaskDirectory;
|
|
105
|
+
/**
|
|
106
|
+
* Get count of active tasks in a directory
|
|
107
|
+
*/
|
|
108
|
+
private getActiveTasksInDirectory;
|
|
109
|
+
private executeTask;
|
|
110
|
+
private prepareTaskWorkspace;
|
|
111
|
+
private getAdapter;
|
|
112
|
+
private processQueue;
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=task-executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-executor.d.ts","sourceRoot":"","sources":["../../src/lib/task-executor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,IAAI,EAA4B,MAAM,aAAa,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AA6B7D,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,eAAe,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,YAAY,CAAuC;IAC3D,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAiD;IACjE,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,YAAY,CAAC,CAAS;IAC9B,OAAO,CAAC,iBAAiB,CAAU;IACnC,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,YAAY,CAAkB;IAGtC,OAAO,CAAC,gBAAgB,CAAuC;IAC/D,OAAO,CAAC,mBAAmB,CAA8C;gBAE7D,OAAO,EAAE,mBAAmB;IAqBxC;;OAEG;IACG,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IA8C3C;;OAEG;IACG,oBAAoB,CACxB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,GACtD,OAAO,CAAC,IAAI,CAAC;IAWhB;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAuBnC;;OAEG;IACH,aAAa,IAAI;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAOpD;;OAEG;IACH,SAAS,IAAI,IAAI;IA0BjB;;OAEG;IACH,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAMxC;;;;;;OAMG;IACG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,UAAQ,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IA6BpH;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAU9B;;;OAGG;YACW,mBAAmB;IA2EjC;;OAEG;YACW,kBAAkB;IAKhC;;OAEG;YACW,qBAAqB;IA8FnC;;OAEG;YACW,aAAa;IAU3B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAM1B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAU5B;;OAEG;IACH,OAAO,CAAC,yBAAyB;YAKnB,WAAW;YA4OX,oBAAoB;YAkEpB,UAAU;IA6BxB,OAAO,CAAC,YAAY;CAUrB"}
|