@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.
Files changed (203) hide show
  1. package/LICENSE +76 -0
  2. package/README.md +178 -0
  3. package/dist/cli.d.ts +15 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +401 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/index.d.ts +9 -0
  8. package/dist/commands/index.d.ts.map +1 -0
  9. package/dist/commands/index.js +9 -0
  10. package/dist/commands/index.js.map +1 -0
  11. package/dist/commands/mcp.d.ts +16 -0
  12. package/dist/commands/mcp.d.ts.map +1 -0
  13. package/dist/commands/mcp.js +19 -0
  14. package/dist/commands/mcp.js.map +1 -0
  15. package/dist/commands/setup.d.ts +20 -0
  16. package/dist/commands/setup.d.ts.map +1 -0
  17. package/dist/commands/setup.js +585 -0
  18. package/dist/commands/setup.js.map +1 -0
  19. package/dist/commands/start.d.ts +16 -0
  20. package/dist/commands/start.d.ts.map +1 -0
  21. package/dist/commands/start.js +638 -0
  22. package/dist/commands/start.js.map +1 -0
  23. package/dist/commands/status.d.ts +5 -0
  24. package/dist/commands/status.d.ts.map +1 -0
  25. package/dist/commands/status.js +63 -0
  26. package/dist/commands/status.js.map +1 -0
  27. package/dist/commands/stop.d.ts +5 -0
  28. package/dist/commands/stop.d.ts.map +1 -0
  29. package/dist/commands/stop.js +85 -0
  30. package/dist/commands/stop.js.map +1 -0
  31. package/dist/execution/direct-strategy.d.ts +18 -0
  32. package/dist/execution/direct-strategy.d.ts.map +1 -0
  33. package/dist/execution/direct-strategy.js +156 -0
  34. package/dist/execution/direct-strategy.js.map +1 -0
  35. package/dist/execution/docker-strategy.d.ts +26 -0
  36. package/dist/execution/docker-strategy.d.ts.map +1 -0
  37. package/dist/execution/docker-strategy.js +222 -0
  38. package/dist/execution/docker-strategy.js.map +1 -0
  39. package/dist/execution/index.d.ts +14 -0
  40. package/dist/execution/index.d.ts.map +1 -0
  41. package/dist/execution/index.js +13 -0
  42. package/dist/execution/index.js.map +1 -0
  43. package/dist/execution/kubernetes-exec-strategy.d.ts +23 -0
  44. package/dist/execution/kubernetes-exec-strategy.d.ts.map +1 -0
  45. package/dist/execution/kubernetes-exec-strategy.js +232 -0
  46. package/dist/execution/kubernetes-exec-strategy.js.map +1 -0
  47. package/dist/execution/registry.d.ts +41 -0
  48. package/dist/execution/registry.d.ts.map +1 -0
  49. package/dist/execution/registry.js +84 -0
  50. package/dist/execution/registry.js.map +1 -0
  51. package/dist/execution/slurm-strategy.d.ts +22 -0
  52. package/dist/execution/slurm-strategy.d.ts.map +1 -0
  53. package/dist/execution/slurm-strategy.js +219 -0
  54. package/dist/execution/slurm-strategy.js.map +1 -0
  55. package/dist/execution/types.d.ts +72 -0
  56. package/dist/execution/types.d.ts.map +1 -0
  57. package/dist/execution/types.js +10 -0
  58. package/dist/execution/types.js.map +1 -0
  59. package/dist/index.d.ts +22 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +22 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/lib/api-client.d.ts +35 -0
  64. package/dist/lib/api-client.d.ts.map +1 -0
  65. package/dist/lib/api-client.js +126 -0
  66. package/dist/lib/api-client.js.map +1 -0
  67. package/dist/lib/config.d.ts +174 -0
  68. package/dist/lib/config.d.ts.map +1 -0
  69. package/dist/lib/config.js +399 -0
  70. package/dist/lib/config.js.map +1 -0
  71. package/dist/lib/copy-worktree.d.ts +73 -0
  72. package/dist/lib/copy-worktree.d.ts.map +1 -0
  73. package/dist/lib/copy-worktree.js +374 -0
  74. package/dist/lib/copy-worktree.js.map +1 -0
  75. package/dist/lib/git-pr.d.ts +63 -0
  76. package/dist/lib/git-pr.d.ts.map +1 -0
  77. package/dist/lib/git-pr.js +224 -0
  78. package/dist/lib/git-pr.js.map +1 -0
  79. package/dist/lib/hardware-id.d.ts +25 -0
  80. package/dist/lib/hardware-id.d.ts.map +1 -0
  81. package/dist/lib/hardware-id.js +186 -0
  82. package/dist/lib/hardware-id.js.map +1 -0
  83. package/dist/lib/hpc-context.d.ts +35 -0
  84. package/dist/lib/hpc-context.d.ts.map +1 -0
  85. package/dist/lib/hpc-context.js +167 -0
  86. package/dist/lib/hpc-context.js.map +1 -0
  87. package/dist/lib/prompt-templates.d.ts +195 -0
  88. package/dist/lib/prompt-templates.d.ts.map +1 -0
  89. package/dist/lib/prompt-templates.js +353 -0
  90. package/dist/lib/prompt-templates.js.map +1 -0
  91. package/dist/lib/providers.d.ts +27 -0
  92. package/dist/lib/providers.d.ts.map +1 -0
  93. package/dist/lib/providers.js +372 -0
  94. package/dist/lib/providers.js.map +1 -0
  95. package/dist/lib/repo-context.d.ts +18 -0
  96. package/dist/lib/repo-context.d.ts.map +1 -0
  97. package/dist/lib/repo-context.js +61 -0
  98. package/dist/lib/repo-context.js.map +1 -0
  99. package/dist/lib/repo-utils.d.ts +35 -0
  100. package/dist/lib/repo-utils.d.ts.map +1 -0
  101. package/dist/lib/repo-utils.js +222 -0
  102. package/dist/lib/repo-utils.js.map +1 -0
  103. package/dist/lib/resources.d.ts +17 -0
  104. package/dist/lib/resources.d.ts.map +1 -0
  105. package/dist/lib/resources.js +227 -0
  106. package/dist/lib/resources.js.map +1 -0
  107. package/dist/lib/slurm-detect.d.ts +15 -0
  108. package/dist/lib/slurm-detect.d.ts.map +1 -0
  109. package/dist/lib/slurm-detect.js +148 -0
  110. package/dist/lib/slurm-detect.js.map +1 -0
  111. package/dist/lib/slurm-executor.d.ts +70 -0
  112. package/dist/lib/slurm-executor.d.ts.map +1 -0
  113. package/dist/lib/slurm-executor.js +402 -0
  114. package/dist/lib/slurm-executor.js.map +1 -0
  115. package/dist/lib/slurm-job-monitor.d.ts +52 -0
  116. package/dist/lib/slurm-job-monitor.d.ts.map +1 -0
  117. package/dist/lib/slurm-job-monitor.js +212 -0
  118. package/dist/lib/slurm-job-monitor.js.map +1 -0
  119. package/dist/lib/ssh-discovery.d.ts +17 -0
  120. package/dist/lib/ssh-discovery.d.ts.map +1 -0
  121. package/dist/lib/ssh-discovery.js +287 -0
  122. package/dist/lib/ssh-discovery.js.map +1 -0
  123. package/dist/lib/ssh-installer.d.ts +69 -0
  124. package/dist/lib/ssh-installer.d.ts.map +1 -0
  125. package/dist/lib/ssh-installer.js +230 -0
  126. package/dist/lib/ssh-installer.js.map +1 -0
  127. package/dist/lib/streaming-prompt.d.ts +48 -0
  128. package/dist/lib/streaming-prompt.d.ts.map +1 -0
  129. package/dist/lib/streaming-prompt.js +91 -0
  130. package/dist/lib/streaming-prompt.js.map +1 -0
  131. package/dist/lib/task-executor.d.ts +114 -0
  132. package/dist/lib/task-executor.d.ts.map +1 -0
  133. package/dist/lib/task-executor.js +753 -0
  134. package/dist/lib/task-executor.js.map +1 -0
  135. package/dist/lib/websocket-client.d.ts +200 -0
  136. package/dist/lib/websocket-client.d.ts.map +1 -0
  137. package/dist/lib/websocket-client.js +781 -0
  138. package/dist/lib/websocket-client.js.map +1 -0
  139. package/dist/lib/workdir-safety.d.ts +63 -0
  140. package/dist/lib/workdir-safety.d.ts.map +1 -0
  141. package/dist/lib/workdir-safety.js +247 -0
  142. package/dist/lib/workdir-safety.js.map +1 -0
  143. package/dist/lib/worktree-include.d.ts +14 -0
  144. package/dist/lib/worktree-include.d.ts.map +1 -0
  145. package/dist/lib/worktree-include.js +68 -0
  146. package/dist/lib/worktree-include.js.map +1 -0
  147. package/dist/lib/worktree-setup.d.ts +18 -0
  148. package/dist/lib/worktree-setup.d.ts.map +1 -0
  149. package/dist/lib/worktree-setup.js +60 -0
  150. package/dist/lib/worktree-setup.js.map +1 -0
  151. package/dist/lib/worktree.d.ts +37 -0
  152. package/dist/lib/worktree.d.ts.map +1 -0
  153. package/dist/lib/worktree.js +411 -0
  154. package/dist/lib/worktree.js.map +1 -0
  155. package/dist/mcp/index.d.ts +8 -0
  156. package/dist/mcp/index.d.ts.map +1 -0
  157. package/dist/mcp/index.js +8 -0
  158. package/dist/mcp/index.js.map +1 -0
  159. package/dist/mcp/server.d.ts +45 -0
  160. package/dist/mcp/server.d.ts.map +1 -0
  161. package/dist/mcp/server.js +153 -0
  162. package/dist/mcp/server.js.map +1 -0
  163. package/dist/mcp/session-bridge.d.ts +87 -0
  164. package/dist/mcp/session-bridge.d.ts.map +1 -0
  165. package/dist/mcp/session-bridge.js +317 -0
  166. package/dist/mcp/session-bridge.js.map +1 -0
  167. package/dist/mcp/tools.d.ts +70 -0
  168. package/dist/mcp/tools.d.ts.map +1 -0
  169. package/dist/mcp/tools.js +234 -0
  170. package/dist/mcp/tools.js.map +1 -0
  171. package/dist/mcp/types.d.ts +197 -0
  172. package/dist/mcp/types.d.ts.map +1 -0
  173. package/dist/mcp/types.js +16 -0
  174. package/dist/mcp/types.js.map +1 -0
  175. package/dist/providers/base-adapter.d.ts +56 -0
  176. package/dist/providers/base-adapter.d.ts.map +1 -0
  177. package/dist/providers/base-adapter.js +5 -0
  178. package/dist/providers/base-adapter.js.map +1 -0
  179. package/dist/providers/claude-code-adapter.d.ts +27 -0
  180. package/dist/providers/claude-code-adapter.d.ts.map +1 -0
  181. package/dist/providers/claude-code-adapter.js +298 -0
  182. package/dist/providers/claude-code-adapter.js.map +1 -0
  183. package/dist/providers/claude-sdk-adapter.d.ts +60 -0
  184. package/dist/providers/claude-sdk-adapter.d.ts.map +1 -0
  185. package/dist/providers/claude-sdk-adapter.js +632 -0
  186. package/dist/providers/claude-sdk-adapter.js.map +1 -0
  187. package/dist/providers/codex-adapter.d.ts +21 -0
  188. package/dist/providers/codex-adapter.d.ts.map +1 -0
  189. package/dist/providers/codex-adapter.js +197 -0
  190. package/dist/providers/codex-adapter.js.map +1 -0
  191. package/dist/providers/index.d.ts +26 -0
  192. package/dist/providers/index.d.ts.map +1 -0
  193. package/dist/providers/index.js +58 -0
  194. package/dist/providers/index.js.map +1 -0
  195. package/dist/providers/slurm-adapter.d.ts +26 -0
  196. package/dist/providers/slurm-adapter.d.ts.map +1 -0
  197. package/dist/providers/slurm-adapter.js +146 -0
  198. package/dist/providers/slurm-adapter.js.map +1 -0
  199. package/dist/types.d.ts +592 -0
  200. package/dist/types.d.ts.map +1 -0
  201. package/dist/types.js +5 -0
  202. package/dist/types.js.map +1 -0
  203. 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"}