@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,372 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent provider detection and management
|
|
3
|
+
*/
|
|
4
|
+
import { exec } from 'node:child_process';
|
|
5
|
+
import { promisify } from 'node:util';
|
|
6
|
+
import { access, constants, readFile } from 'node:fs/promises';
|
|
7
|
+
import { join } from 'node:path';
|
|
8
|
+
import { homedir } from 'node:os';
|
|
9
|
+
import { detectSlurm } from './slurm-detect.js';
|
|
10
|
+
const execAsync = promisify(exec);
|
|
11
|
+
/**
|
|
12
|
+
* Check if a command exists in PATH
|
|
13
|
+
*/
|
|
14
|
+
async function commandExists(command) {
|
|
15
|
+
try {
|
|
16
|
+
const platform = process.platform;
|
|
17
|
+
const checkCommand = platform === 'win32' ? `where ${command}` : `which ${command}`;
|
|
18
|
+
await execAsync(checkCommand, { timeout: 5000 });
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Check if a file exists and is executable
|
|
27
|
+
*/
|
|
28
|
+
async function fileExecutable(path) {
|
|
29
|
+
try {
|
|
30
|
+
await access(path, constants.X_OK);
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Get the version of a command
|
|
39
|
+
*/
|
|
40
|
+
async function getCommandVersion(command, versionArg = '--version') {
|
|
41
|
+
try {
|
|
42
|
+
const { stdout } = await execAsync(`${command} ${versionArg}`, { timeout: 5000 });
|
|
43
|
+
// Extract version number from output
|
|
44
|
+
const versionMatch = stdout.match(/(\d+\.\d+(?:\.\d+)?)/);
|
|
45
|
+
return versionMatch?.[1] ?? stdout.trim().split('\n')[0] ?? null;
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Get the path of a command
|
|
53
|
+
*/
|
|
54
|
+
async function getCommandPath(command) {
|
|
55
|
+
try {
|
|
56
|
+
const platform = process.platform;
|
|
57
|
+
const whichCommand = platform === 'win32' ? 'where' : 'which';
|
|
58
|
+
const { stdout } = await execAsync(`${whichCommand} ${command}`, { timeout: 5000 });
|
|
59
|
+
return stdout.trim().split('\n')[0] ?? null;
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Common installation paths for Claude Code
|
|
67
|
+
* These are checked if 'which claude' fails (e.g., ~/.local/bin not in PATH)
|
|
68
|
+
*/
|
|
69
|
+
function getClaudeCodePaths() {
|
|
70
|
+
const home = homedir();
|
|
71
|
+
const platform = process.platform;
|
|
72
|
+
const paths = [];
|
|
73
|
+
// Standard installation path for Claude Code
|
|
74
|
+
paths.push(join(home, '.local', 'bin', 'claude'));
|
|
75
|
+
// npm global installs
|
|
76
|
+
paths.push(join(home, '.npm', 'bin', 'claude'));
|
|
77
|
+
paths.push(join(home, '.npm-global', 'bin', 'claude'));
|
|
78
|
+
// Platform-specific paths
|
|
79
|
+
if (platform === 'darwin') {
|
|
80
|
+
// macOS: Homebrew and user local
|
|
81
|
+
paths.push('/usr/local/bin/claude');
|
|
82
|
+
paths.push('/opt/homebrew/bin/claude');
|
|
83
|
+
paths.push(join(home, 'Library', 'Application Support', 'claude', 'bin', 'claude'));
|
|
84
|
+
}
|
|
85
|
+
else if (platform === 'win32') {
|
|
86
|
+
// Windows: AppData locations
|
|
87
|
+
const appData = process.env.APPDATA ?? join(home, 'AppData', 'Roaming');
|
|
88
|
+
const localAppData = process.env.LOCALAPPDATA ?? join(home, 'AppData', 'Local');
|
|
89
|
+
paths.push(join(appData, 'claude', 'bin', 'claude.exe'));
|
|
90
|
+
paths.push(join(localAppData, 'claude', 'bin', 'claude.exe'));
|
|
91
|
+
paths.push(join(appData, 'npm', 'claude.cmd'));
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
// Linux: Standard locations
|
|
95
|
+
paths.push('/usr/local/bin/claude');
|
|
96
|
+
paths.push('/usr/bin/claude');
|
|
97
|
+
paths.push(join(home, '.local', 'share', 'claude', 'bin', 'claude'));
|
|
98
|
+
}
|
|
99
|
+
return paths;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Detect Claude Code installation
|
|
103
|
+
*/
|
|
104
|
+
async function detectClaudeCode() {
|
|
105
|
+
// First, check if 'claude' is in PATH
|
|
106
|
+
const existsInPath = await commandExists('claude');
|
|
107
|
+
if (existsInPath) {
|
|
108
|
+
const path = await getCommandPath('claude');
|
|
109
|
+
const version = await getCommandVersion('claude', '--version');
|
|
110
|
+
return {
|
|
111
|
+
type: 'claude-code',
|
|
112
|
+
name: 'Claude Code',
|
|
113
|
+
version,
|
|
114
|
+
path: path ?? 'claude',
|
|
115
|
+
available: true,
|
|
116
|
+
capabilities: {
|
|
117
|
+
streaming: true,
|
|
118
|
+
tools: true,
|
|
119
|
+
multiTurn: true,
|
|
120
|
+
maxConcurrentTasks: 1, // Claude Code runs one task at a time per instance
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
// If not in PATH, check common installation locations
|
|
125
|
+
const commonPaths = getClaudeCodePaths();
|
|
126
|
+
for (const claudePath of commonPaths) {
|
|
127
|
+
const isExecutable = await fileExecutable(claudePath);
|
|
128
|
+
if (isExecutable) {
|
|
129
|
+
// Found Claude Code at this path, get version
|
|
130
|
+
const version = await getCommandVersion(claudePath, '--version');
|
|
131
|
+
return {
|
|
132
|
+
type: 'claude-code',
|
|
133
|
+
name: 'Claude Code',
|
|
134
|
+
version,
|
|
135
|
+
path: claudePath,
|
|
136
|
+
available: true,
|
|
137
|
+
capabilities: {
|
|
138
|
+
streaming: true,
|
|
139
|
+
tools: true,
|
|
140
|
+
multiTurn: true,
|
|
141
|
+
maxConcurrentTasks: 1,
|
|
142
|
+
},
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Common installation paths for Codex CLI
|
|
150
|
+
*/
|
|
151
|
+
function getCodexPaths() {
|
|
152
|
+
const home = homedir();
|
|
153
|
+
const platform = process.platform;
|
|
154
|
+
const paths = [];
|
|
155
|
+
// npm global installs (most common for Codex)
|
|
156
|
+
paths.push(join(home, '.npm', 'bin', 'codex'));
|
|
157
|
+
paths.push(join(home, '.npm-global', 'bin', 'codex'));
|
|
158
|
+
paths.push(join(home, '.local', 'bin', 'codex'));
|
|
159
|
+
// npx / pnpm / yarn global locations
|
|
160
|
+
paths.push(join(home, '.yarn', 'bin', 'codex'));
|
|
161
|
+
paths.push(join(home, '.pnpm-global', 'bin', 'codex'));
|
|
162
|
+
if (platform === 'darwin') {
|
|
163
|
+
paths.push('/usr/local/bin/codex');
|
|
164
|
+
paths.push('/opt/homebrew/bin/codex');
|
|
165
|
+
}
|
|
166
|
+
else if (platform === 'win32') {
|
|
167
|
+
const appData = process.env.APPDATA ?? join(home, 'AppData', 'Roaming');
|
|
168
|
+
paths.push(join(appData, 'npm', 'codex.cmd'));
|
|
169
|
+
paths.push(join(appData, 'npm', 'codex'));
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
paths.push('/usr/local/bin/codex');
|
|
173
|
+
paths.push('/usr/bin/codex');
|
|
174
|
+
}
|
|
175
|
+
return paths;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Detect OpenAI Codex CLI installation
|
|
179
|
+
*/
|
|
180
|
+
async function detectCodex() {
|
|
181
|
+
// First, check if 'codex' is in PATH
|
|
182
|
+
const exists = await commandExists('codex');
|
|
183
|
+
if (exists) {
|
|
184
|
+
const path = await getCommandPath('codex');
|
|
185
|
+
const version = await getCommandVersion('codex', '--version');
|
|
186
|
+
return {
|
|
187
|
+
type: 'codex',
|
|
188
|
+
name: 'OpenAI Codex',
|
|
189
|
+
version,
|
|
190
|
+
path: path ?? 'codex',
|
|
191
|
+
available: true,
|
|
192
|
+
capabilities: {
|
|
193
|
+
streaming: true,
|
|
194
|
+
tools: true,
|
|
195
|
+
multiTurn: true,
|
|
196
|
+
maxConcurrentTasks: 1,
|
|
197
|
+
},
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
// If not in PATH, check common installation locations
|
|
201
|
+
const commonPaths = getCodexPaths();
|
|
202
|
+
for (const codexPath of commonPaths) {
|
|
203
|
+
const isExecutable = await fileExecutable(codexPath);
|
|
204
|
+
if (isExecutable) {
|
|
205
|
+
const version = await getCommandVersion(codexPath, '--version');
|
|
206
|
+
return {
|
|
207
|
+
type: 'codex',
|
|
208
|
+
name: 'OpenAI Codex',
|
|
209
|
+
version,
|
|
210
|
+
path: codexPath,
|
|
211
|
+
available: true,
|
|
212
|
+
capabilities: {
|
|
213
|
+
streaming: true,
|
|
214
|
+
tools: true,
|
|
215
|
+
multiTurn: true,
|
|
216
|
+
maxConcurrentTasks: 1,
|
|
217
|
+
},
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
return null;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Check for custom provider configuration
|
|
225
|
+
*/
|
|
226
|
+
async function detectCustomProviders() {
|
|
227
|
+
const configPath = join(homedir(), '.astro', 'providers.json');
|
|
228
|
+
try {
|
|
229
|
+
const content = await readFile(configPath, 'utf-8');
|
|
230
|
+
const config = JSON.parse(content);
|
|
231
|
+
const providers = [];
|
|
232
|
+
for (const provider of config) {
|
|
233
|
+
const executable = await fileExecutable(provider.path);
|
|
234
|
+
providers.push({
|
|
235
|
+
type: 'custom',
|
|
236
|
+
name: provider.name,
|
|
237
|
+
version: provider.version ?? null,
|
|
238
|
+
path: provider.path,
|
|
239
|
+
available: executable,
|
|
240
|
+
capabilities: provider.capabilities ?? {
|
|
241
|
+
streaming: false,
|
|
242
|
+
tools: false,
|
|
243
|
+
multiTurn: false,
|
|
244
|
+
maxConcurrentTasks: 1,
|
|
245
|
+
},
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
return providers;
|
|
249
|
+
}
|
|
250
|
+
catch {
|
|
251
|
+
// No custom provider config or invalid config
|
|
252
|
+
return [];
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Detect HPC capability (Slurm on this machine).
|
|
257
|
+
* Returns metadata to annotate Claude provider rather than registering
|
|
258
|
+
* Slurm as a standalone provider.
|
|
259
|
+
*/
|
|
260
|
+
async function detectHpcCapability() {
|
|
261
|
+
try {
|
|
262
|
+
const info = await detectSlurm();
|
|
263
|
+
if (!info.available)
|
|
264
|
+
return null;
|
|
265
|
+
return {
|
|
266
|
+
clusterName: info.clusterName,
|
|
267
|
+
partitions: info.partitions,
|
|
268
|
+
defaultPartition: info.defaultPartition,
|
|
269
|
+
accounts: info.accounts,
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
catch {
|
|
273
|
+
return null;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Detect Claude Agent SDK availability (in-process, uses OAuth from claude CLI login)
|
|
278
|
+
*/
|
|
279
|
+
async function detectClaudeSdk() {
|
|
280
|
+
try {
|
|
281
|
+
// Try dynamic import to check if SDK is available
|
|
282
|
+
await import('@anthropic-ai/claude-agent-sdk');
|
|
283
|
+
return {
|
|
284
|
+
type: 'claude-sdk',
|
|
285
|
+
name: 'Claude Agent SDK',
|
|
286
|
+
version: null,
|
|
287
|
+
path: '@anthropic-ai/claude-agent-sdk',
|
|
288
|
+
available: true,
|
|
289
|
+
capabilities: {
|
|
290
|
+
streaming: true,
|
|
291
|
+
tools: true,
|
|
292
|
+
multiTurn: true,
|
|
293
|
+
maxConcurrentTasks: 4,
|
|
294
|
+
},
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
catch {
|
|
298
|
+
return null;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Detect all available providers on the system.
|
|
303
|
+
* Slurm is no longer a standalone provider — when detected, it annotates
|
|
304
|
+
* the Claude provider with hpcCapability metadata instead.
|
|
305
|
+
*/
|
|
306
|
+
export async function detectProviders() {
|
|
307
|
+
const detectionResults = await Promise.all([
|
|
308
|
+
detectClaudeSdk(),
|
|
309
|
+
detectClaudeCode(),
|
|
310
|
+
detectCodex(),
|
|
311
|
+
detectHpcCapability(),
|
|
312
|
+
detectCustomProviders(),
|
|
313
|
+
]);
|
|
314
|
+
const providers = [];
|
|
315
|
+
const [claudeSdk, claudeCode, codex, hpcCapability, customProviders] = detectionResults;
|
|
316
|
+
// Add Claude provider (SDK preferred over CLI — runs in-process with lower overhead)
|
|
317
|
+
if (claudeSdk) {
|
|
318
|
+
if (hpcCapability) {
|
|
319
|
+
claudeSdk.hpcCapability = hpcCapability;
|
|
320
|
+
}
|
|
321
|
+
providers.push(claudeSdk);
|
|
322
|
+
}
|
|
323
|
+
else if (claudeCode) {
|
|
324
|
+
if (hpcCapability) {
|
|
325
|
+
claudeCode.hpcCapability = hpcCapability;
|
|
326
|
+
}
|
|
327
|
+
providers.push(claudeCode);
|
|
328
|
+
}
|
|
329
|
+
if (codex) {
|
|
330
|
+
providers.push(codex);
|
|
331
|
+
}
|
|
332
|
+
// Add custom providers
|
|
333
|
+
providers.push(...customProviders);
|
|
334
|
+
return providers;
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Get a specific provider by type
|
|
338
|
+
*/
|
|
339
|
+
export async function getProvider(type) {
|
|
340
|
+
const providers = await detectProviders();
|
|
341
|
+
return providers.find((p) => p.type === type) ?? null;
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Check if a specific provider is available
|
|
345
|
+
*/
|
|
346
|
+
export async function isProviderAvailable(type) {
|
|
347
|
+
const provider = await getProvider(type);
|
|
348
|
+
return provider?.available ?? false;
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Format provider info for display
|
|
352
|
+
*/
|
|
353
|
+
export function formatProviderInfo(provider) {
|
|
354
|
+
const status = provider.available ? '✓' : '✗';
|
|
355
|
+
const version = provider.version ? `v${provider.version}` : 'unknown version';
|
|
356
|
+
return `${status} ${provider.name} (${version}) - ${provider.path}`;
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Format all providers summary
|
|
360
|
+
*/
|
|
361
|
+
export function formatProvidersSummary(providers) {
|
|
362
|
+
if (providers.length === 0) {
|
|
363
|
+
return 'No agent providers detected. Install Claude Code or Codex to get started.';
|
|
364
|
+
}
|
|
365
|
+
const lines = ['Detected Agent Providers:', ''];
|
|
366
|
+
for (const provider of providers) {
|
|
367
|
+
lines.push(` ${formatProviderInfo(provider)}`);
|
|
368
|
+
lines.push(` Capabilities: streaming=${provider.capabilities.streaming}, tools=${provider.capabilities.tools}, maxTasks=${provider.capabilities.maxConcurrentTasks}`);
|
|
369
|
+
}
|
|
370
|
+
return lines.join('\n');
|
|
371
|
+
}
|
|
372
|
+
//# sourceMappingURL=providers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providers.js","sourceRoot":"","sources":["../../src/lib/providers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Repo Context Reader
|
|
3
|
+
*
|
|
4
|
+
* Reads key files from a working directory and returns their contents
|
|
5
|
+
* for injection into plan generation prompts.
|
|
6
|
+
*/
|
|
7
|
+
export interface RepoContextResult {
|
|
8
|
+
claudeMd?: string;
|
|
9
|
+
readmeMd?: string;
|
|
10
|
+
packageInfo?: string;
|
|
11
|
+
fileTreeSummary?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Read key files from a working directory for context injection.
|
|
15
|
+
* When workingDirectory is empty/falsy, only the file tree is used (remote repo case).
|
|
16
|
+
*/
|
|
17
|
+
export declare function readRepoContext(workingDirectory: string, fileTree?: string[]): RepoContextResult;
|
|
18
|
+
//# sourceMappingURL=repo-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-context.d.ts","sourceRoot":"","sources":["../../src/lib/repo-context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAeD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,gBAAgB,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,iBAAiB,CAmChG"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Repo Context Reader
|
|
3
|
+
*
|
|
4
|
+
* Reads key files from a working directory and returns their contents
|
|
5
|
+
* for injection into plan generation prompts.
|
|
6
|
+
*/
|
|
7
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
8
|
+
import { join } from 'node:path';
|
|
9
|
+
const FILE_CAP = 15_000; // 15KB cap for CLAUDE.md and README
|
|
10
|
+
const PKG_CAP = 5_000; // 5KB cap for package metadata
|
|
11
|
+
const FILE_TREE_CAP = 200; // max files to show in tree summary
|
|
12
|
+
function readFileCapped(path, cap) {
|
|
13
|
+
if (!existsSync(path))
|
|
14
|
+
return undefined;
|
|
15
|
+
try {
|
|
16
|
+
const content = readFileSync(path, 'utf-8');
|
|
17
|
+
if (content.length > cap) {
|
|
18
|
+
return content.slice(0, cap) + '\n\n[... truncated ...]';
|
|
19
|
+
}
|
|
20
|
+
return content;
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Read key files from a working directory for context injection.
|
|
28
|
+
* When workingDirectory is empty/falsy, only the file tree is used (remote repo case).
|
|
29
|
+
*/
|
|
30
|
+
export function readRepoContext(workingDirectory, fileTree) {
|
|
31
|
+
const result = {};
|
|
32
|
+
// Only read files if we have a valid local working directory
|
|
33
|
+
if (workingDirectory && existsSync(workingDirectory)) {
|
|
34
|
+
// Read CLAUDE.md
|
|
35
|
+
result.claudeMd = readFileCapped(join(workingDirectory, 'CLAUDE.md'), FILE_CAP);
|
|
36
|
+
// Read README.md (try both cases)
|
|
37
|
+
result.readmeMd =
|
|
38
|
+
readFileCapped(join(workingDirectory, 'README.md'), FILE_CAP) ??
|
|
39
|
+
readFileCapped(join(workingDirectory, 'readme.md'), FILE_CAP);
|
|
40
|
+
// Read first package metadata found
|
|
41
|
+
const packageFiles = ['package.json', 'pyproject.toml', 'Cargo.toml', 'go.mod'];
|
|
42
|
+
for (const pkg of packageFiles) {
|
|
43
|
+
const content = readFileCapped(join(workingDirectory, pkg), PKG_CAP);
|
|
44
|
+
if (content) {
|
|
45
|
+
result.packageInfo = `# ${pkg}\n${content}`;
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Format file tree summary
|
|
51
|
+
if (fileTree && fileTree.length > 0) {
|
|
52
|
+
const total = fileTree.length;
|
|
53
|
+
const shown = fileTree.slice(0, FILE_TREE_CAP);
|
|
54
|
+
const lines = shown.join('\n');
|
|
55
|
+
result.fileTreeSummary = total > FILE_TREE_CAP
|
|
56
|
+
? `${lines}\n\n... and ${total - FILE_TREE_CAP} more files (${total} total)`
|
|
57
|
+
: lines;
|
|
58
|
+
}
|
|
59
|
+
return result;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=repo-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-context.js","sourceRoot":"","sources":["../../src/lib/repo-context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,MAAM,QAAQ,GAAG,MAAM,CAAA,CAAC,oCAAoC;AAC5D,MAAM,OAAO,GAAG,KAAK,CAAA,CAAG,+BAA+B;AACvD,MAAM,aAAa,GAAG,GAAG,CAAA,CAAC,oCAAoC;AAS9D,SAAS,cAAc,CAAC,IAAY,EAAE,GAAW;IAC/C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAA;IACvC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QAC3C,IAAI,OAAO,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;YACzB,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,yBAAyB,CAAA;QAC1D,CAAC;QACD,OAAO,OAAO,CAAA;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,gBAAwB,EAAE,QAAmB;IAC3E,MAAM,MAAM,GAAsB,EAAE,CAAA;IAEpC,6DAA6D;IAC7D,IAAI,gBAAgB,IAAI,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACrD,iBAAiB;QACjB,MAAM,CAAC,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,gBAAgB,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,CAAA;QAE/E,kCAAkC;QAClC,MAAM,CAAC,QAAQ;YACb,cAAc,CAAC,IAAI,CAAC,gBAAgB,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC;gBAC7D,cAAc,CAAC,IAAI,CAAC,gBAAgB,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,CAAA;QAE/D,oCAAoC;QACpC,MAAM,YAAY,GAAG,CAAC,cAAc,EAAE,gBAAgB,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAA;QAC/E,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;YAC/B,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,gBAAgB,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,CAAA;YACpE,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,CAAC,WAAW,GAAG,KAAK,GAAG,KAAK,OAAO,EAAE,CAAA;gBAC3C,MAAK;YACP,CAAC;QACH,CAAC;IACH,CAAC;IAED,2BAA2B;IAC3B,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAA;QAC7B,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CAAA;QAC9C,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC9B,MAAM,CAAC,eAAe,GAAG,KAAK,GAAG,aAAa;YAC5C,CAAC,CAAC,GAAG,KAAK,eAAe,KAAK,GAAG,aAAa,gBAAgB,KAAK,SAAS;YAC5E,CAAC,CAAC,KAAK,CAAA;IACX,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Repo utilities for agent runner.
|
|
3
|
+
*
|
|
4
|
+
* Lightweight versions of the core repo setup logic (isGitRepo, getFileTree,
|
|
5
|
+
* getGitRemoteUrl) that run on remote machines. Skips .gitignore/CLAUDE.md
|
|
6
|
+
* generation since the repo already exists on the remote machine.
|
|
7
|
+
*/
|
|
8
|
+
export declare function isGitRepo(dir: string): boolean;
|
|
9
|
+
export declare function getFileTree(dir: string): string[];
|
|
10
|
+
export declare function getGitRemoteUrl(dir: string): string | undefined;
|
|
11
|
+
/** Key file contents read from the repo for context injection */
|
|
12
|
+
export interface RepoKeyFiles {
|
|
13
|
+
claudeMd?: string;
|
|
14
|
+
readmeMd?: string;
|
|
15
|
+
packageInfo?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface LocalRepoSetupResult {
|
|
18
|
+
success: boolean;
|
|
19
|
+
workingDirectory?: string;
|
|
20
|
+
fileTree?: string[];
|
|
21
|
+
repository?: string;
|
|
22
|
+
needsGitInit?: boolean;
|
|
23
|
+
keyFiles?: RepoKeyFiles;
|
|
24
|
+
error?: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Run repo setup locally on the agent runner's machine.
|
|
28
|
+
* Handles existing directories and cloning repos from URL.
|
|
29
|
+
*/
|
|
30
|
+
export declare function localRepoSetup(options: {
|
|
31
|
+
workingDirectory?: string;
|
|
32
|
+
repository?: string;
|
|
33
|
+
projectId?: string;
|
|
34
|
+
}): LocalRepoSetupResult;
|
|
35
|
+
//# sourceMappingURL=repo-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-utils.d.ts","sourceRoot":"","sources":["../../src/lib/repo-utils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAY9C;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAcjD;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAY/D;AAED,iEAAiE;AACjE,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA2ED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE;IACtC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,oBAAoB,CA8FvB"}
|