@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,222 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Docker Execution Strategy
|
|
3
|
+
*
|
|
4
|
+
* Runs commands inside Docker containers via `docker run`.
|
|
5
|
+
*/
|
|
6
|
+
import { spawn, execFile as execFileCb } from 'node:child_process';
|
|
7
|
+
import { promisify } from 'node:util';
|
|
8
|
+
const execFileAsync = promisify(execFileCb);
|
|
9
|
+
/** Validate that a job ID is safe for use as a Docker container name */
|
|
10
|
+
function validateDockerName(jobId) {
|
|
11
|
+
if (!/^[a-zA-Z0-9][a-zA-Z0-9_.-]*$/.test(jobId)) {
|
|
12
|
+
throw new Error(`Invalid job ID for Docker container name: ${jobId}`);
|
|
13
|
+
}
|
|
14
|
+
return jobId;
|
|
15
|
+
}
|
|
16
|
+
const DEFAULT_IMAGE = 'node:22-slim';
|
|
17
|
+
export class DockerStrategy {
|
|
18
|
+
id = 'docker';
|
|
19
|
+
name = 'Docker';
|
|
20
|
+
isAsync = false;
|
|
21
|
+
/** Maps jobId → container ID */
|
|
22
|
+
containers = new Map();
|
|
23
|
+
processes = new Map();
|
|
24
|
+
async detect() {
|
|
25
|
+
try {
|
|
26
|
+
const { stdout } = await execFileAsync('docker', ['info', '--format', '{{.ServerVersion}}'], {
|
|
27
|
+
timeout: 10000,
|
|
28
|
+
});
|
|
29
|
+
const version = stdout.trim();
|
|
30
|
+
if (!version) {
|
|
31
|
+
return { available: false };
|
|
32
|
+
}
|
|
33
|
+
// Get additional metadata
|
|
34
|
+
let osArch;
|
|
35
|
+
try {
|
|
36
|
+
const { stdout: infoOut } = await execFileAsync('docker', ['info', '--format', '{{.OSType}}/{{.Architecture}}'], { timeout: 5000 });
|
|
37
|
+
osArch = infoOut.trim();
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// Ignore
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
available: true,
|
|
44
|
+
version,
|
|
45
|
+
metadata: {
|
|
46
|
+
osArch,
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return { available: false };
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
async buildContext() {
|
|
55
|
+
const sections = [];
|
|
56
|
+
sections.push('# Docker Execution Environment');
|
|
57
|
+
sections.push('');
|
|
58
|
+
sections.push('Commands may be executed inside Docker containers.');
|
|
59
|
+
sections.push('- Volume mounts map the working directory into the container');
|
|
60
|
+
sections.push('- Environment variables are passed through');
|
|
61
|
+
sections.push('- The default image is `node:22-slim` unless overridden');
|
|
62
|
+
sections.push('');
|
|
63
|
+
return sections.join('\n');
|
|
64
|
+
}
|
|
65
|
+
async execute(spec, callbacks, signal) {
|
|
66
|
+
if (signal.aborted) {
|
|
67
|
+
return { status: 'cancelled' };
|
|
68
|
+
}
|
|
69
|
+
const opts = (spec.options ?? {});
|
|
70
|
+
const image = opts.image || DEFAULT_IMAGE;
|
|
71
|
+
// Build docker run arguments
|
|
72
|
+
const args = ['run', '--rm'];
|
|
73
|
+
// Container name for tracking
|
|
74
|
+
const containerName = `astro-${validateDockerName(spec.jobId)}`;
|
|
75
|
+
args.push('--name', containerName);
|
|
76
|
+
// Volume mount: map cwd into container
|
|
77
|
+
args.push('-v', `${spec.cwd}:${spec.cwd}`);
|
|
78
|
+
args.push('-w', spec.cwd);
|
|
79
|
+
// Additional volumes
|
|
80
|
+
if (opts.volumes) {
|
|
81
|
+
for (const vol of opts.volumes) {
|
|
82
|
+
args.push('-v', vol);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// Network
|
|
86
|
+
if (opts.network) {
|
|
87
|
+
args.push('--network', opts.network);
|
|
88
|
+
}
|
|
89
|
+
// User
|
|
90
|
+
if (opts.user) {
|
|
91
|
+
args.push('--user', opts.user);
|
|
92
|
+
}
|
|
93
|
+
// Environment variables
|
|
94
|
+
if (spec.env) {
|
|
95
|
+
for (const [key, value] of Object.entries(spec.env)) {
|
|
96
|
+
args.push('-e', `${key}=${value}`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// Image
|
|
100
|
+
args.push(image);
|
|
101
|
+
// Command
|
|
102
|
+
if (typeof spec.command === 'string') {
|
|
103
|
+
args.push('sh', '-c', spec.command);
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
args.push(...spec.command);
|
|
107
|
+
}
|
|
108
|
+
return new Promise((resolve) => {
|
|
109
|
+
const child = spawn('docker', args, {
|
|
110
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
111
|
+
});
|
|
112
|
+
this.processes.set(spec.jobId, child);
|
|
113
|
+
this.containers.set(spec.jobId, containerName);
|
|
114
|
+
let stdout = '';
|
|
115
|
+
let stderr = '';
|
|
116
|
+
let settled = false;
|
|
117
|
+
const finish = (result) => {
|
|
118
|
+
if (settled)
|
|
119
|
+
return;
|
|
120
|
+
settled = true;
|
|
121
|
+
this.processes.delete(spec.jobId);
|
|
122
|
+
this.containers.delete(spec.jobId);
|
|
123
|
+
if (timeoutHandle)
|
|
124
|
+
clearTimeout(timeoutHandle);
|
|
125
|
+
resolve(result);
|
|
126
|
+
};
|
|
127
|
+
// Handle abort signal
|
|
128
|
+
const onAbort = () => {
|
|
129
|
+
if (!settled) {
|
|
130
|
+
// Stop the container gracefully
|
|
131
|
+
execFileAsync('docker', ['stop', containerName], { timeout: 15000 }).catch(() => {
|
|
132
|
+
// Container might already be stopped
|
|
133
|
+
});
|
|
134
|
+
finish({ status: 'cancelled', output: stdout, error: stderr, externalJobId: containerName });
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
138
|
+
// Handle timeout
|
|
139
|
+
let timeoutHandle;
|
|
140
|
+
if (spec.timeout && spec.timeout > 0) {
|
|
141
|
+
timeoutHandle = setTimeout(() => {
|
|
142
|
+
if (!settled) {
|
|
143
|
+
execFileAsync('docker', ['stop', containerName], { timeout: 15000 }).catch(() => { });
|
|
144
|
+
finish({ status: 'timeout', output: stdout, error: stderr, externalJobId: containerName });
|
|
145
|
+
}
|
|
146
|
+
}, spec.timeout);
|
|
147
|
+
timeoutHandle.unref();
|
|
148
|
+
}
|
|
149
|
+
child.stdout?.on('data', (data) => {
|
|
150
|
+
const text = data.toString();
|
|
151
|
+
stdout += text;
|
|
152
|
+
callbacks.onStdout(text);
|
|
153
|
+
});
|
|
154
|
+
child.stderr?.on('data', (data) => {
|
|
155
|
+
const text = data.toString();
|
|
156
|
+
stderr += text;
|
|
157
|
+
callbacks.onStderr(text);
|
|
158
|
+
});
|
|
159
|
+
child.on('error', (err) => {
|
|
160
|
+
finish({
|
|
161
|
+
status: 'failed',
|
|
162
|
+
error: err.message,
|
|
163
|
+
output: stdout,
|
|
164
|
+
externalJobId: containerName,
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
child.on('close', (code) => {
|
|
168
|
+
signal.removeEventListener('abort', onAbort);
|
|
169
|
+
const exitCode = code ?? 1;
|
|
170
|
+
finish({
|
|
171
|
+
status: exitCode === 0 ? 'completed' : 'failed',
|
|
172
|
+
exitCode,
|
|
173
|
+
output: stdout,
|
|
174
|
+
error: stderr || undefined,
|
|
175
|
+
externalJobId: containerName,
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
callbacks.onStatus('running', 0, `Container ${containerName} started (image: ${image})`);
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
async cancel(jobId) {
|
|
182
|
+
const containerName = this.containers.get(jobId);
|
|
183
|
+
if (containerName) {
|
|
184
|
+
try {
|
|
185
|
+
await execFileAsync('docker', ['stop', containerName], { timeout: 15000 });
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
// Container might already be stopped
|
|
189
|
+
}
|
|
190
|
+
try {
|
|
191
|
+
await execFileAsync('docker', ['rm', '-f', containerName], { timeout: 10000 });
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
// Ignore
|
|
195
|
+
}
|
|
196
|
+
this.containers.delete(jobId);
|
|
197
|
+
}
|
|
198
|
+
const child = this.processes.get(jobId);
|
|
199
|
+
if (child) {
|
|
200
|
+
child.kill('SIGTERM');
|
|
201
|
+
this.processes.delete(jobId);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
async getStatus(jobId) {
|
|
205
|
+
const containerName = this.containers.get(jobId);
|
|
206
|
+
if (!containerName)
|
|
207
|
+
return null;
|
|
208
|
+
try {
|
|
209
|
+
const { stdout } = await execFileAsync('docker', ['inspect', '--format', '{{.State.Status}}', containerName], { timeout: 5000 });
|
|
210
|
+
const state = stdout.trim();
|
|
211
|
+
return {
|
|
212
|
+
jobId,
|
|
213
|
+
externalJobId: containerName,
|
|
214
|
+
state,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
return null;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=docker-strategy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker-strategy.js","sourceRoot":"","sources":["../../src/execution/docker-strategy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Execution Strategy Module
|
|
3
|
+
*
|
|
4
|
+
* Barrel export for all execution strategy types, implementations, and registry.
|
|
5
|
+
*/
|
|
6
|
+
export type { ExecutionStrategyType, ExecutionStrategy, ExecutionStrategyDetection, ExecutionSpec, ExecutionCallbacks, ExecutionResult, ExecutionJobStatus, ExecutionStrategyInfo, } from './types.js';
|
|
7
|
+
export { DirectStrategy } from './direct-strategy.js';
|
|
8
|
+
export { SlurmStrategy } from './slurm-strategy.js';
|
|
9
|
+
export { DockerStrategy } from './docker-strategy.js';
|
|
10
|
+
export { K8sExecStrategy } from './kubernetes-exec-strategy.js';
|
|
11
|
+
export type { DockerExecOptions } from './docker-strategy.js';
|
|
12
|
+
export type { K8sExecOptions } from './kubernetes-exec-strategy.js';
|
|
13
|
+
export { ExecutionStrategyRegistry, executionStrategyRegistry } from './registry.js';
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/execution/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,YAAY,EACV,qBAAqB,EACrB,iBAAiB,EACjB,0BAA0B,EAC1B,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAGhE,YAAY,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,YAAY,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAGpE,OAAO,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Execution Strategy Module
|
|
3
|
+
*
|
|
4
|
+
* Barrel export for all execution strategy types, implementations, and registry.
|
|
5
|
+
*/
|
|
6
|
+
// Strategy implementations
|
|
7
|
+
export { DirectStrategy } from './direct-strategy.js';
|
|
8
|
+
export { SlurmStrategy } from './slurm-strategy.js';
|
|
9
|
+
export { DockerStrategy } from './docker-strategy.js';
|
|
10
|
+
export { K8sExecStrategy } from './kubernetes-exec-strategy.js';
|
|
11
|
+
// Registry
|
|
12
|
+
export { ExecutionStrategyRegistry, executionStrategyRegistry } from './registry.js';
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/execution/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAcH,2BAA2B;AAC3B,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAMhE,WAAW;AACX,OAAO,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kubernetes Exec Execution Strategy
|
|
3
|
+
*
|
|
4
|
+
* Runs commands on existing K8s pods via `kubectl exec`.
|
|
5
|
+
*/
|
|
6
|
+
import type { ExecutionStrategy, ExecutionSpec, ExecutionCallbacks, ExecutionResult, ExecutionStrategyDetection, ExecutionJobStatus } from './types.js';
|
|
7
|
+
export interface K8sExecOptions {
|
|
8
|
+
pod?: string;
|
|
9
|
+
namespace?: string;
|
|
10
|
+
container?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare class K8sExecStrategy implements ExecutionStrategy {
|
|
13
|
+
readonly id: "k8s-exec";
|
|
14
|
+
readonly name = "Kubernetes Exec";
|
|
15
|
+
readonly isAsync = false;
|
|
16
|
+
private processes;
|
|
17
|
+
detect(): Promise<ExecutionStrategyDetection>;
|
|
18
|
+
buildContext(): Promise<string>;
|
|
19
|
+
execute(spec: ExecutionSpec, callbacks: ExecutionCallbacks, signal: AbortSignal): Promise<ExecutionResult>;
|
|
20
|
+
cancel(jobId: string): Promise<void>;
|
|
21
|
+
getStatus(jobId: string): Promise<ExecutionJobStatus | null>;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=kubernetes-exec-strategy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kubernetes-exec-strategy.d.ts","sourceRoot":"","sources":["../../src/execution/kubernetes-exec-strategy.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EACV,iBAAiB,EACjB,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,0BAA0B,EAC1B,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAIpB,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,eAAgB,YAAW,iBAAiB;IACvD,QAAQ,CAAC,EAAE,EAAG,UAAU,CAAU;IAClC,QAAQ,CAAC,IAAI,qBAAqB;IAClC,QAAQ,CAAC,OAAO,SAAS;IAEzB,OAAO,CAAC,SAAS,CAAmC;IAE9C,MAAM,IAAI,OAAO,CAAC,0BAA0B,CAAC;IAmE7C,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IA4B/B,OAAO,CACX,IAAI,EAAE,aAAa,EACnB,SAAS,EAAE,kBAAkB,EAC7B,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,eAAe,CAAC;IA+HrB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcpC,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;CAWnE"}
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kubernetes Exec Execution Strategy
|
|
3
|
+
*
|
|
4
|
+
* Runs commands on existing K8s pods via `kubectl exec`.
|
|
5
|
+
*/
|
|
6
|
+
import { spawn, exec } from 'node:child_process';
|
|
7
|
+
import { promisify } from 'node:util';
|
|
8
|
+
const execAsync = promisify(exec);
|
|
9
|
+
export class K8sExecStrategy {
|
|
10
|
+
id = 'k8s-exec';
|
|
11
|
+
name = 'Kubernetes Exec';
|
|
12
|
+
isAsync = false;
|
|
13
|
+
processes = new Map();
|
|
14
|
+
async detect() {
|
|
15
|
+
// Check if kubectl is available
|
|
16
|
+
try {
|
|
17
|
+
await execAsync('which kubectl', { timeout: 5000 });
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return { available: false };
|
|
21
|
+
}
|
|
22
|
+
// Check if cluster is reachable
|
|
23
|
+
try {
|
|
24
|
+
const { stdout } = await execAsync('kubectl cluster-info --request-timeout=5s 2>/dev/null', {
|
|
25
|
+
timeout: 10000,
|
|
26
|
+
});
|
|
27
|
+
// Extract cluster URL
|
|
28
|
+
const urlMatch = stdout.match(/https?:\/\/[\w.:/-]+/);
|
|
29
|
+
// Get server version
|
|
30
|
+
let serverVersion;
|
|
31
|
+
try {
|
|
32
|
+
const { stdout: versionOut } = await execAsync('kubectl version --output=json --request-timeout=5s 2>/dev/null', { timeout: 10000 });
|
|
33
|
+
const versionData = JSON.parse(versionOut);
|
|
34
|
+
serverVersion = versionData.serverVersion?.gitVersion;
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
// Version detection failed
|
|
38
|
+
}
|
|
39
|
+
// Get available namespaces
|
|
40
|
+
let namespaces = [];
|
|
41
|
+
try {
|
|
42
|
+
const { stdout: nsOut } = await execAsync('kubectl get namespaces -o jsonpath=\'{.items[*].metadata.name}\' --request-timeout=5s 2>/dev/null', { timeout: 10000 });
|
|
43
|
+
namespaces = nsOut.trim().split(/\s+/).filter(Boolean);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
// Namespace listing failed — limited permissions
|
|
47
|
+
}
|
|
48
|
+
// Get current context
|
|
49
|
+
let currentContext;
|
|
50
|
+
try {
|
|
51
|
+
const { stdout: ctxOut } = await execAsync('kubectl config current-context', { timeout: 5000 });
|
|
52
|
+
currentContext = ctxOut.trim();
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
// No context
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
available: true,
|
|
59
|
+
version: serverVersion,
|
|
60
|
+
metadata: {
|
|
61
|
+
clusterUrl: urlMatch?.[0],
|
|
62
|
+
currentContext,
|
|
63
|
+
namespaces,
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return { available: false };
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
async buildContext() {
|
|
72
|
+
const detection = await this.detect();
|
|
73
|
+
if (!detection.available)
|
|
74
|
+
return '';
|
|
75
|
+
const meta = detection.metadata ?? {};
|
|
76
|
+
const sections = [];
|
|
77
|
+
sections.push('# Kubernetes Execution Environment');
|
|
78
|
+
sections.push('');
|
|
79
|
+
sections.push('You have `kubectl` access to a Kubernetes cluster.');
|
|
80
|
+
if (meta.currentContext) {
|
|
81
|
+
sections.push(`- Current context: \`${meta.currentContext}\``);
|
|
82
|
+
}
|
|
83
|
+
if (meta.clusterUrl) {
|
|
84
|
+
sections.push(`- Cluster: \`${meta.clusterUrl}\``);
|
|
85
|
+
}
|
|
86
|
+
if (Array.isArray(meta.namespaces) && meta.namespaces.length > 0) {
|
|
87
|
+
sections.push(`- Namespaces: ${meta.namespaces.join(', ')}`);
|
|
88
|
+
}
|
|
89
|
+
sections.push('');
|
|
90
|
+
sections.push('Commands are executed via `kubectl exec` on specified pods.');
|
|
91
|
+
sections.push('');
|
|
92
|
+
return sections.join('\n');
|
|
93
|
+
}
|
|
94
|
+
async execute(spec, callbacks, signal) {
|
|
95
|
+
if (signal.aborted) {
|
|
96
|
+
return { status: 'cancelled' };
|
|
97
|
+
}
|
|
98
|
+
const opts = (spec.options ?? {});
|
|
99
|
+
if (!opts.pod) {
|
|
100
|
+
return {
|
|
101
|
+
status: 'failed',
|
|
102
|
+
error: 'K8s exec requires options.pod to be specified',
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
// Build kubectl exec arguments
|
|
106
|
+
const args = ['exec'];
|
|
107
|
+
if (opts.namespace) {
|
|
108
|
+
args.push('-n', opts.namespace);
|
|
109
|
+
}
|
|
110
|
+
if (opts.container) {
|
|
111
|
+
args.push('-c', opts.container);
|
|
112
|
+
}
|
|
113
|
+
args.push(opts.pod, '--');
|
|
114
|
+
// Command
|
|
115
|
+
if (typeof spec.command === 'string') {
|
|
116
|
+
args.push('sh', '-c', spec.command);
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
args.push(...spec.command);
|
|
120
|
+
}
|
|
121
|
+
return new Promise((resolve) => {
|
|
122
|
+
const child = spawn('kubectl', args, {
|
|
123
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
124
|
+
});
|
|
125
|
+
this.processes.set(spec.jobId, child);
|
|
126
|
+
let stdout = '';
|
|
127
|
+
let stderr = '';
|
|
128
|
+
let settled = false;
|
|
129
|
+
const finish = (result) => {
|
|
130
|
+
if (settled)
|
|
131
|
+
return;
|
|
132
|
+
settled = true;
|
|
133
|
+
this.processes.delete(spec.jobId);
|
|
134
|
+
if (timeoutHandle)
|
|
135
|
+
clearTimeout(timeoutHandle);
|
|
136
|
+
resolve(result);
|
|
137
|
+
};
|
|
138
|
+
// Handle abort signal
|
|
139
|
+
const onAbort = () => {
|
|
140
|
+
if (!settled) {
|
|
141
|
+
child.kill('SIGTERM');
|
|
142
|
+
setTimeout(() => {
|
|
143
|
+
if (!settled)
|
|
144
|
+
child.kill('SIGKILL');
|
|
145
|
+
}, 5000).unref();
|
|
146
|
+
finish({
|
|
147
|
+
status: 'cancelled',
|
|
148
|
+
output: stdout,
|
|
149
|
+
error: stderr,
|
|
150
|
+
externalJobId: opts.pod,
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
155
|
+
// Handle timeout
|
|
156
|
+
let timeoutHandle;
|
|
157
|
+
if (spec.timeout && spec.timeout > 0) {
|
|
158
|
+
timeoutHandle = setTimeout(() => {
|
|
159
|
+
if (!settled) {
|
|
160
|
+
child.kill('SIGTERM');
|
|
161
|
+
setTimeout(() => {
|
|
162
|
+
if (!settled)
|
|
163
|
+
child.kill('SIGKILL');
|
|
164
|
+
}, 5000).unref();
|
|
165
|
+
finish({
|
|
166
|
+
status: 'timeout',
|
|
167
|
+
output: stdout,
|
|
168
|
+
error: stderr,
|
|
169
|
+
externalJobId: opts.pod,
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
}, spec.timeout);
|
|
173
|
+
timeoutHandle.unref();
|
|
174
|
+
}
|
|
175
|
+
child.stdout?.on('data', (data) => {
|
|
176
|
+
const text = data.toString();
|
|
177
|
+
stdout += text;
|
|
178
|
+
callbacks.onStdout(text);
|
|
179
|
+
});
|
|
180
|
+
child.stderr?.on('data', (data) => {
|
|
181
|
+
const text = data.toString();
|
|
182
|
+
stderr += text;
|
|
183
|
+
callbacks.onStderr(text);
|
|
184
|
+
});
|
|
185
|
+
child.on('error', (err) => {
|
|
186
|
+
finish({
|
|
187
|
+
status: 'failed',
|
|
188
|
+
error: err.message,
|
|
189
|
+
output: stdout,
|
|
190
|
+
externalJobId: opts.pod,
|
|
191
|
+
});
|
|
192
|
+
});
|
|
193
|
+
child.on('close', (code) => {
|
|
194
|
+
signal.removeEventListener('abort', onAbort);
|
|
195
|
+
const exitCode = code ?? 1;
|
|
196
|
+
finish({
|
|
197
|
+
status: exitCode === 0 ? 'completed' : 'failed',
|
|
198
|
+
exitCode,
|
|
199
|
+
output: stdout,
|
|
200
|
+
error: stderr || undefined,
|
|
201
|
+
externalJobId: opts.pod,
|
|
202
|
+
});
|
|
203
|
+
});
|
|
204
|
+
const podLabel = opts.namespace ? `${opts.namespace}/${opts.pod}` : opts.pod;
|
|
205
|
+
callbacks.onStatus('running', 0, `kubectl exec on pod ${podLabel}`);
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
async cancel(jobId) {
|
|
209
|
+
const child = this.processes.get(jobId);
|
|
210
|
+
if (!child)
|
|
211
|
+
return;
|
|
212
|
+
child.kill('SIGTERM');
|
|
213
|
+
setTimeout(() => {
|
|
214
|
+
if (!child.killed) {
|
|
215
|
+
child.kill('SIGKILL');
|
|
216
|
+
}
|
|
217
|
+
}, 5000).unref();
|
|
218
|
+
this.processes.delete(jobId);
|
|
219
|
+
}
|
|
220
|
+
async getStatus(jobId) {
|
|
221
|
+
const child = this.processes.get(jobId);
|
|
222
|
+
if (!child)
|
|
223
|
+
return null;
|
|
224
|
+
return {
|
|
225
|
+
jobId,
|
|
226
|
+
externalJobId: String(child.pid ?? ''),
|
|
227
|
+
state: child.exitCode !== null ? 'exited' : 'running',
|
|
228
|
+
exitCode: child.exitCode ?? undefined,
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=kubernetes-exec-strategy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kubernetes-exec-strategy.js","sourceRoot":"","sources":["../../src/execution/kubernetes-exec-strategy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Execution Strategy Registry
|
|
3
|
+
*
|
|
4
|
+
* Manages all available execution strategies. Provides detection, lookup,
|
|
5
|
+
* and listing of strategies.
|
|
6
|
+
*/
|
|
7
|
+
import type { ExecutionStrategy, ExecutionStrategyInfo, ExecutionStrategyType } from './types.js';
|
|
8
|
+
export declare class ExecutionStrategyRegistry {
|
|
9
|
+
private strategies;
|
|
10
|
+
private detectionResults;
|
|
11
|
+
private detected;
|
|
12
|
+
/**
|
|
13
|
+
* Detect all strategies in parallel.
|
|
14
|
+
* Instantiates each strategy, calls detect(), and stores available ones.
|
|
15
|
+
*/
|
|
16
|
+
detectAll(): Promise<ExecutionStrategyInfo[]>;
|
|
17
|
+
/**
|
|
18
|
+
* Get a specific strategy by ID.
|
|
19
|
+
* Returns null if the strategy hasn't been detected or isn't registered.
|
|
20
|
+
*/
|
|
21
|
+
get(id: ExecutionStrategyType): ExecutionStrategy | null;
|
|
22
|
+
/**
|
|
23
|
+
* Get the default strategy (always DirectStrategy).
|
|
24
|
+
*/
|
|
25
|
+
getDefault(): ExecutionStrategy;
|
|
26
|
+
/**
|
|
27
|
+
* List all detected strategies (available and unavailable).
|
|
28
|
+
*/
|
|
29
|
+
listAll(): ExecutionStrategyInfo[];
|
|
30
|
+
/**
|
|
31
|
+
* List only available strategies.
|
|
32
|
+
*/
|
|
33
|
+
listAvailable(): ExecutionStrategyInfo[];
|
|
34
|
+
/**
|
|
35
|
+
* Check if detection has been run.
|
|
36
|
+
*/
|
|
37
|
+
isDetected(): boolean;
|
|
38
|
+
}
|
|
39
|
+
/** Singleton registry instance */
|
|
40
|
+
export declare const executionStrategyRegistry: ExecutionStrategyRegistry;
|
|
41
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/execution/registry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAMlG,qBAAa,yBAAyB;IACpC,OAAO,CAAC,UAAU,CAAuD;IACzE,OAAO,CAAC,gBAAgB,CAA2D;IACnF,OAAO,CAAC,QAAQ,CAAS;IAEzB;;;OAGG;IACG,SAAS,IAAI,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAmCnD;;;OAGG;IACH,GAAG,CAAC,EAAE,EAAE,qBAAqB,GAAG,iBAAiB,GAAG,IAAI;IAIxD;;OAEG;IACH,UAAU,IAAI,iBAAiB;IAS/B;;OAEG;IACH,OAAO,IAAI,qBAAqB,EAAE;IAIlC;;OAEG;IACH,aAAa,IAAI,qBAAqB,EAAE;IAIxC;;OAEG;IACH,UAAU,IAAI,OAAO;CAGtB;AAED,kCAAkC;AAClC,eAAO,MAAM,yBAAyB,2BAAkC,CAAC"}
|