@controlvector/cv-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/dist/bundle.cjs +4822 -0
- package/dist/bundle.cjs.map +7 -0
- package/dist/commands/agent-git.d.ts +59 -0
- package/dist/commands/agent-git.d.ts.map +1 -0
- package/dist/commands/agent-git.js +234 -0
- package/dist/commands/agent-git.js.map +1 -0
- package/dist/commands/agent.d.ts +20 -0
- package/dist/commands/agent.d.ts.map +1 -0
- package/dist/commands/agent.js +506 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/auth.d.ts +8 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +104 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/remote.d.ts +8 -0
- package/dist/commands/remote.d.ts.map +1 -0
- package/dist/commands/remote.js +100 -0
- package/dist/commands/remote.js.map +1 -0
- package/dist/commands/status.d.ts +8 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +75 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/task.d.ts +8 -0
- package/dist/commands/task.d.ts.map +1 -0
- package/dist/commands/task.js +122 -0
- package/dist/commands/task.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/api.d.ts +31 -0
- package/dist/utils/api.d.ts.map +1 -0
- package/dist/utils/api.js +169 -0
- package/dist/utils/api.js.map +1 -0
- package/dist/utils/config.d.ts +13 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +29 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/credentials.d.ts +46 -0
- package/dist/utils/credentials.d.ts.map +1 -0
- package/dist/utils/credentials.js +176 -0
- package/dist/utils/credentials.js.map +1 -0
- package/dist/utils/display.d.ts +8 -0
- package/dist/utils/display.d.ts.map +1 -0
- package/dist/utils/display.js +50 -0
- package/dist/utils/display.js.map +1 -0
- package/dist/utils/retry.d.ts +5 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +26 -0
- package/dist/utils/retry.js.map +1 -0
- package/package.json +38 -0
|
@@ -0,0 +1,506 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* cva agent command
|
|
4
|
+
*
|
|
5
|
+
* Listens for tasks dispatched from Claude.ai via CV-Hub and executes them
|
|
6
|
+
* with Claude Code. The agent registers as an executor, polls for tasks,
|
|
7
|
+
* and reports results back.
|
|
8
|
+
*
|
|
9
|
+
* Two execution modes:
|
|
10
|
+
* --auto-approve: Uses Claude Code -p mode with --allowedTools (proven)
|
|
11
|
+
* Default (relay): Spawns interactive Claude Code, relays permission prompts
|
|
12
|
+
*
|
|
13
|
+
* Usage:
|
|
14
|
+
* cva agent # Start in relay mode
|
|
15
|
+
* cva agent --auto-approve # Start in auto-approve mode
|
|
16
|
+
* cva agent --machine z840-primary # Override machine name
|
|
17
|
+
* cva agent --poll-interval 10 # Check every 10 seconds
|
|
18
|
+
*/
|
|
19
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
20
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
21
|
+
};
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
exports.agentCommand = agentCommand;
|
|
24
|
+
const commander_1 = require("commander");
|
|
25
|
+
const node_child_process_1 = require("node:child_process");
|
|
26
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
27
|
+
const credentials_js_1 = require("../utils/credentials.js");
|
|
28
|
+
const api_js_1 = require("../utils/api.js");
|
|
29
|
+
const agent_git_js_1 = require("./agent-git.js");
|
|
30
|
+
const display_js_1 = require("../utils/display.js");
|
|
31
|
+
const retry_js_1 = require("../utils/retry.js");
|
|
32
|
+
// ============================================================================
|
|
33
|
+
// Claude Code launcher
|
|
34
|
+
// ============================================================================
|
|
35
|
+
function buildClaudePrompt(task) {
|
|
36
|
+
let prompt = '';
|
|
37
|
+
prompt += `You are executing a task dispatched from Claude.ai via CV-Hub.\n\n`;
|
|
38
|
+
prompt += `## Task: ${task.title}\n`;
|
|
39
|
+
prompt += `Task ID: ${task.id}\n`;
|
|
40
|
+
prompt += `Priority: ${task.priority}\n`;
|
|
41
|
+
if (task.branch)
|
|
42
|
+
prompt += `Branch: ${task.branch}\n`;
|
|
43
|
+
if (task.file_paths?.length)
|
|
44
|
+
prompt += `Focus files: ${task.file_paths.join(', ')}\n`;
|
|
45
|
+
prompt += `\n`;
|
|
46
|
+
// Main instructions
|
|
47
|
+
if (task.description) {
|
|
48
|
+
prompt += task.description;
|
|
49
|
+
}
|
|
50
|
+
else if (task.input?.description) {
|
|
51
|
+
prompt += task.input.description;
|
|
52
|
+
}
|
|
53
|
+
if (task.input?.context) {
|
|
54
|
+
prompt += `\n\n## Context\n${task.input.context}`;
|
|
55
|
+
}
|
|
56
|
+
if (task.input?.instructions?.length) {
|
|
57
|
+
prompt += `\n\n## Instructions\n`;
|
|
58
|
+
task.input.instructions.forEach((i, idx) => {
|
|
59
|
+
prompt += `${idx + 1}. ${i}\n`;
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
if (task.input?.constraints?.length) {
|
|
63
|
+
prompt += `\n\n## Constraints\n`;
|
|
64
|
+
task.input.constraints.forEach(c => {
|
|
65
|
+
prompt += `- ${c}\n`;
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
// Git remote instructions for CV-Hub push
|
|
69
|
+
if (task.owner && task.repo) {
|
|
70
|
+
prompt += `\n\n## Git Remote Instructions\n`;
|
|
71
|
+
prompt += `This repository has a \`cvhub\` remote pointing to CV-Hub.\n`;
|
|
72
|
+
prompt += `When committing and pushing, push to the \`cvhub\` remote:\n`;
|
|
73
|
+
prompt += ` git push cvhub <branch>\n`;
|
|
74
|
+
prompt += `\n`;
|
|
75
|
+
prompt += `IMPORTANT: Use only standard \`git\` commands. Do NOT use \`cv\`, \`cva\`, or \`cv-git\` commands.\n`;
|
|
76
|
+
}
|
|
77
|
+
prompt += `\n\n---\n`;
|
|
78
|
+
prompt += `When complete, provide a brief summary of what you accomplished.\n`;
|
|
79
|
+
return prompt;
|
|
80
|
+
}
|
|
81
|
+
/** Shared reference to current child process so signal handlers can kill it */
|
|
82
|
+
let _activeChild = null;
|
|
83
|
+
/** Signal handling state */
|
|
84
|
+
let _sigintCount = 0;
|
|
85
|
+
let _sigintTimer = null;
|
|
86
|
+
let _signalHandlerInstalled = false;
|
|
87
|
+
function installSignalHandlers(getState, cleanup) {
|
|
88
|
+
if (_signalHandlerInstalled)
|
|
89
|
+
return;
|
|
90
|
+
_signalHandlerInstalled = true;
|
|
91
|
+
process.on('SIGINT', async () => {
|
|
92
|
+
if (!_activeChild) {
|
|
93
|
+
console.log('\n' + chalk_1.default.gray('Agent stopped.'));
|
|
94
|
+
await cleanup();
|
|
95
|
+
process.exit(0);
|
|
96
|
+
}
|
|
97
|
+
_sigintCount++;
|
|
98
|
+
if (_sigintCount === 1) {
|
|
99
|
+
console.log(`\n${chalk_1.default.yellow('!')} Press Ctrl+C again within 3s to abort task.`);
|
|
100
|
+
_sigintTimer = setTimeout(() => { _sigintCount = 0; }, 3000);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
if (_sigintTimer)
|
|
104
|
+
clearTimeout(_sigintTimer);
|
|
105
|
+
console.log(`\n${chalk_1.default.red('X')} Aborting task...`);
|
|
106
|
+
try {
|
|
107
|
+
_activeChild.kill('SIGKILL');
|
|
108
|
+
}
|
|
109
|
+
catch { }
|
|
110
|
+
_activeChild = null;
|
|
111
|
+
_sigintCount = 0;
|
|
112
|
+
});
|
|
113
|
+
process.on('SIGTERM', async () => {
|
|
114
|
+
console.log(`\n${chalk_1.default.gray('Received SIGTERM, shutting down...')}`);
|
|
115
|
+
if (_activeChild) {
|
|
116
|
+
try {
|
|
117
|
+
_activeChild.kill('SIGKILL');
|
|
118
|
+
}
|
|
119
|
+
catch { }
|
|
120
|
+
_activeChild = null;
|
|
121
|
+
}
|
|
122
|
+
await cleanup();
|
|
123
|
+
process.exit(0);
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
// ============================================================================
|
|
127
|
+
// Permission handling
|
|
128
|
+
// ============================================================================
|
|
129
|
+
/** Tools to pre-approve when --auto-approve is active */
|
|
130
|
+
const ALLOWED_TOOLS = [
|
|
131
|
+
'Bash(*)', 'Read(*)', 'Write(*)', 'Edit(*)',
|
|
132
|
+
'Glob(*)', 'Grep(*)', 'WebFetch(*)', 'WebSearch(*)',
|
|
133
|
+
'NotebookEdit(*)', 'TodoWrite(*)',
|
|
134
|
+
];
|
|
135
|
+
/** Permission prompt patterns to detect in relay mode */
|
|
136
|
+
const PERMISSION_PATTERNS = [
|
|
137
|
+
/Allow .+ to .+\? \(y\/n\)/,
|
|
138
|
+
/Do you want to proceed\? \(y\/n\)/,
|
|
139
|
+
/\? \(y\/n\)/,
|
|
140
|
+
];
|
|
141
|
+
// ============================================================================
|
|
142
|
+
// Auto-approve mode launcher (proven, -p + --allowedTools)
|
|
143
|
+
// ============================================================================
|
|
144
|
+
async function launchAutoApproveMode(prompt, options) {
|
|
145
|
+
return new Promise((resolve, reject) => {
|
|
146
|
+
const args = ['-p', prompt, '--allowedTools', ...ALLOWED_TOOLS];
|
|
147
|
+
const child = (0, node_child_process_1.spawn)('claude', args, {
|
|
148
|
+
cwd: options.cwd,
|
|
149
|
+
stdio: ['inherit', 'inherit', 'pipe'],
|
|
150
|
+
env: { ...process.env },
|
|
151
|
+
});
|
|
152
|
+
_activeChild = child;
|
|
153
|
+
let stderr = '';
|
|
154
|
+
child.stderr?.on('data', (data) => {
|
|
155
|
+
const text = data.toString();
|
|
156
|
+
stderr += text;
|
|
157
|
+
process.stderr.write(data);
|
|
158
|
+
});
|
|
159
|
+
child.on('close', (code, signal) => {
|
|
160
|
+
_activeChild = null;
|
|
161
|
+
if (signal === 'SIGKILL') {
|
|
162
|
+
resolve({ exitCode: 137, stderr });
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
resolve({ exitCode: code ?? 1, stderr });
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
child.on('error', (err) => {
|
|
169
|
+
_activeChild = null;
|
|
170
|
+
reject(err);
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
// ============================================================================
|
|
175
|
+
// Relay mode launcher (interactive, permission prompts relayed to CV-Hub)
|
|
176
|
+
// ============================================================================
|
|
177
|
+
async function launchRelayMode(prompt, options) {
|
|
178
|
+
return new Promise((resolve, reject) => {
|
|
179
|
+
// Spawn Claude Code in interactive mode (no -p flag)
|
|
180
|
+
const child = (0, node_child_process_1.spawn)('claude', [], {
|
|
181
|
+
cwd: options.cwd,
|
|
182
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
183
|
+
env: { ...process.env },
|
|
184
|
+
});
|
|
185
|
+
_activeChild = child;
|
|
186
|
+
let stderr = '';
|
|
187
|
+
let stdoutBuffer = '';
|
|
188
|
+
// Send the task prompt as initial input
|
|
189
|
+
child.stdin?.write(prompt + '\n');
|
|
190
|
+
// Tee stdout to terminal while scanning for permission patterns
|
|
191
|
+
child.stdout?.on('data', async (data) => {
|
|
192
|
+
const text = data.toString();
|
|
193
|
+
process.stdout.write(data); // Tee to terminal
|
|
194
|
+
stdoutBuffer += text;
|
|
195
|
+
// Check for permission prompts
|
|
196
|
+
for (const pattern of PERMISSION_PATTERNS) {
|
|
197
|
+
const match = stdoutBuffer.match(pattern);
|
|
198
|
+
if (match) {
|
|
199
|
+
const promptText = match[0];
|
|
200
|
+
stdoutBuffer = ''; // Reset buffer after match
|
|
201
|
+
try {
|
|
202
|
+
// Log the approval request
|
|
203
|
+
await (0, api_js_1.sendTaskLog)(options.creds, options.executorId, options.taskId, 'info', `Permission prompt: ${promptText}`, { prompt_text: promptText });
|
|
204
|
+
// Create prompt on CV-Hub for user response
|
|
205
|
+
const { prompt_id } = await (0, api_js_1.createTaskPrompt)(options.creds, options.executorId, options.taskId, promptText, 'approval', ['y', 'n']);
|
|
206
|
+
// Poll for user response (2s interval, 5min timeout)
|
|
207
|
+
const timeoutMs = 5 * 60 * 1000;
|
|
208
|
+
const startPoll = Date.now();
|
|
209
|
+
let answered = false;
|
|
210
|
+
while (Date.now() - startPoll < timeoutMs) {
|
|
211
|
+
await new Promise(r => setTimeout(r, 2000));
|
|
212
|
+
try {
|
|
213
|
+
const { response } = await (0, api_js_1.pollPromptResponse)(options.creds, options.executorId, options.taskId, prompt_id);
|
|
214
|
+
if (response !== null) {
|
|
215
|
+
const answer = response.toLowerCase().startsWith('y') ? 'y' : 'n';
|
|
216
|
+
child.stdin?.write(answer + '\n');
|
|
217
|
+
answered = true;
|
|
218
|
+
console.log(chalk_1.default.gray(` [relay] User responded: ${answer}`));
|
|
219
|
+
break;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
catch {
|
|
223
|
+
// Poll error — continue
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
if (!answered) {
|
|
227
|
+
// Timeout — deny
|
|
228
|
+
child.stdin?.write('n\n');
|
|
229
|
+
console.log(chalk_1.default.yellow(` [relay] Prompt timed out, denying.`));
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
catch (err) {
|
|
233
|
+
// If prompt relay fails, deny to be safe
|
|
234
|
+
child.stdin?.write('n\n');
|
|
235
|
+
console.log(chalk_1.default.yellow(` [relay] Prompt relay error: ${err.message}, denying.`));
|
|
236
|
+
}
|
|
237
|
+
break; // Only handle one match per data chunk
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
// Keep buffer manageable (only last 2KB)
|
|
241
|
+
if (stdoutBuffer.length > 2048) {
|
|
242
|
+
stdoutBuffer = stdoutBuffer.slice(-1024);
|
|
243
|
+
}
|
|
244
|
+
});
|
|
245
|
+
child.stderr?.on('data', (data) => {
|
|
246
|
+
const text = data.toString();
|
|
247
|
+
stderr += text;
|
|
248
|
+
process.stderr.write(data);
|
|
249
|
+
});
|
|
250
|
+
child.on('close', (code, signal) => {
|
|
251
|
+
_activeChild = null;
|
|
252
|
+
if (signal === 'SIGKILL') {
|
|
253
|
+
resolve({ exitCode: 137, stderr });
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
resolve({ exitCode: code ?? 1, stderr });
|
|
257
|
+
}
|
|
258
|
+
});
|
|
259
|
+
child.on('error', (err) => {
|
|
260
|
+
_activeChild = null;
|
|
261
|
+
reject(err);
|
|
262
|
+
});
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
// ============================================================================
|
|
266
|
+
// Main agent loop
|
|
267
|
+
// ============================================================================
|
|
268
|
+
async function runAgent(options) {
|
|
269
|
+
const creds = await (0, credentials_js_1.readCredentials)();
|
|
270
|
+
if (!creds.CV_HUB_API) {
|
|
271
|
+
creds.CV_HUB_API = 'https://api.hub.controlvector.io';
|
|
272
|
+
}
|
|
273
|
+
if (!creds.CV_HUB_PAT) {
|
|
274
|
+
console.log();
|
|
275
|
+
console.log(chalk_1.default.red('Not authenticated.') + ' Run ' + chalk_1.default.cyan('cva auth login') + ' first.');
|
|
276
|
+
console.log();
|
|
277
|
+
console.log(chalk_1.default.bold('Quick setup:'));
|
|
278
|
+
console.log(` ${chalk_1.default.cyan('cva auth login')} # Authenticate`);
|
|
279
|
+
console.log(` ${chalk_1.default.cyan('cd ~/project/my-project')} # Go to your project`);
|
|
280
|
+
console.log(` ${chalk_1.default.cyan('cva agent')} # Start listening`);
|
|
281
|
+
console.log();
|
|
282
|
+
process.exit(1);
|
|
283
|
+
}
|
|
284
|
+
// Claude Code check
|
|
285
|
+
try {
|
|
286
|
+
(0, node_child_process_1.execSync)('claude --version', { stdio: 'pipe', timeout: 5000 });
|
|
287
|
+
}
|
|
288
|
+
catch {
|
|
289
|
+
console.log();
|
|
290
|
+
console.log(chalk_1.default.red('Claude Code CLI not found.') + ' Install it first:');
|
|
291
|
+
console.log(` ${chalk_1.default.cyan('npm install -g @anthropic-ai/claude-code')}`);
|
|
292
|
+
console.log();
|
|
293
|
+
process.exit(1);
|
|
294
|
+
}
|
|
295
|
+
const machineName = options.machine || await (0, credentials_js_1.getMachineName)();
|
|
296
|
+
const pollInterval = Math.max(3, parseInt(options.pollInterval, 10)) * 1000;
|
|
297
|
+
const workingDir = options.workingDir;
|
|
298
|
+
if (!options.machine) {
|
|
299
|
+
const credCheck = await (0, credentials_js_1.readCredentials)();
|
|
300
|
+
if (!credCheck.CV_HUB_MACHINE_NAME) {
|
|
301
|
+
console.log();
|
|
302
|
+
console.log(chalk_1.default.yellow('!') + ` No machine name set. Registering as "${chalk_1.default.bold(machineName)}".`);
|
|
303
|
+
console.log(chalk_1.default.gray(` Use --machine <name> to override.`));
|
|
304
|
+
console.log();
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
// Register executor
|
|
308
|
+
const executor = await (0, retry_js_1.withRetry)(() => (0, api_js_1.registerExecutor)(creds, machineName, workingDir), 'Executor registration');
|
|
309
|
+
// Display banner
|
|
310
|
+
const mode = options.autoApprove ? 'auto-approve' : 'relay';
|
|
311
|
+
console.log();
|
|
312
|
+
console.log(chalk_1.default.bold('CVA — CV-Hub Agent'));
|
|
313
|
+
console.log(` Machine: ${chalk_1.default.cyan(machineName)}`);
|
|
314
|
+
console.log(` Executor: ${chalk_1.default.gray(executor.id)}`);
|
|
315
|
+
console.log(` API: ${chalk_1.default.gray(creds.CV_HUB_API)}`);
|
|
316
|
+
console.log(` Dir: ${chalk_1.default.gray(workingDir)}`);
|
|
317
|
+
console.log(` Polling: every ${options.pollInterval}s`);
|
|
318
|
+
console.log(` Mode: ${chalk_1.default.cyan(mode)}`);
|
|
319
|
+
console.log(` Ctrl+C to stop`);
|
|
320
|
+
console.log();
|
|
321
|
+
console.log(chalk_1.default.cyan('Listening for tasks...'));
|
|
322
|
+
console.log();
|
|
323
|
+
const state = {
|
|
324
|
+
executorId: executor.id,
|
|
325
|
+
currentTaskId: null,
|
|
326
|
+
completedCount: 0,
|
|
327
|
+
failedCount: 0,
|
|
328
|
+
lastPoll: Date.now(),
|
|
329
|
+
lastTaskEnd: Date.now(),
|
|
330
|
+
running: true,
|
|
331
|
+
};
|
|
332
|
+
installSignalHandlers(() => state, async () => {
|
|
333
|
+
state.running = false;
|
|
334
|
+
await (0, api_js_1.markOffline)(creds, state.executorId);
|
|
335
|
+
});
|
|
336
|
+
// Main loop
|
|
337
|
+
while (state.running) {
|
|
338
|
+
try {
|
|
339
|
+
const task = await (0, retry_js_1.withRetry)(() => (0, api_js_1.pollForTask)(creds, state.executorId), 'Task poll');
|
|
340
|
+
state.lastPoll = Date.now();
|
|
341
|
+
if (task) {
|
|
342
|
+
await executeTask(task, state, creds, options);
|
|
343
|
+
}
|
|
344
|
+
else {
|
|
345
|
+
(0, display_js_1.updateStatusLine)((0, display_js_1.formatDuration)(Date.now() - state.lastTaskEnd), (0, display_js_1.formatDuration)(Date.now() - state.lastPoll), state.completedCount, state.failedCount);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
catch (err) {
|
|
349
|
+
console.log(`\n${chalk_1.default.red('!')} Error: ${err.message}`);
|
|
350
|
+
}
|
|
351
|
+
await new Promise(r => setTimeout(r, pollInterval));
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
async function executeTask(task, state, creds, options) {
|
|
355
|
+
const startTime = Date.now();
|
|
356
|
+
state.currentTaskId = task.id;
|
|
357
|
+
// Clear status line
|
|
358
|
+
process.stdout.write('\r\x1b[K');
|
|
359
|
+
// Task header
|
|
360
|
+
console.log(chalk_1.default.bold('┌─────────────────────────────────────────────────────────────┐'));
|
|
361
|
+
console.log(chalk_1.default.bold(`│ Task: ${(task.title || '').substring(0, 53).padEnd(53)}│`));
|
|
362
|
+
console.log(chalk_1.default.bold(`│ ID: ${task.id.padEnd(55)}│`));
|
|
363
|
+
console.log(chalk_1.default.bold(`│ Priority: ${task.priority.padEnd(49)}│`));
|
|
364
|
+
console.log(chalk_1.default.bold('└─────────────────────────────────────────────────────────────┘'));
|
|
365
|
+
console.log();
|
|
366
|
+
// Mark task as running
|
|
367
|
+
try {
|
|
368
|
+
await (0, api_js_1.startTask)(creds, state.executorId, task.id);
|
|
369
|
+
(0, display_js_1.setTerminalTitle)(`cva: ${task.title} (starting...)`);
|
|
370
|
+
(0, api_js_1.sendTaskLog)(creds, state.executorId, task.id, 'lifecycle', 'Task started, launching Claude Code');
|
|
371
|
+
}
|
|
372
|
+
catch (err) {
|
|
373
|
+
console.log(chalk_1.default.red(`Failed to start task: ${err.message}`));
|
|
374
|
+
state.currentTaskId = null;
|
|
375
|
+
return;
|
|
376
|
+
}
|
|
377
|
+
// Heartbeat timer
|
|
378
|
+
const heartbeatTimer = setInterval(async () => {
|
|
379
|
+
try {
|
|
380
|
+
const elapsed = (0, display_js_1.formatDuration)(Date.now() - startTime);
|
|
381
|
+
(0, display_js_1.setTerminalTitle)(`cva: ${task.title} (${elapsed})`);
|
|
382
|
+
await (0, api_js_1.sendHeartbeat)(creds, state.executorId, task.id, `Claude Code running (${elapsed} elapsed)`);
|
|
383
|
+
}
|
|
384
|
+
catch { }
|
|
385
|
+
}, 30_000);
|
|
386
|
+
// Timeout timer
|
|
387
|
+
let timeoutTimer;
|
|
388
|
+
if (task.timeout_at) {
|
|
389
|
+
const timeoutMs = new Date(task.timeout_at).getTime() - Date.now();
|
|
390
|
+
if (timeoutMs > 0) {
|
|
391
|
+
timeoutTimer = setTimeout(() => {
|
|
392
|
+
console.log(`\n${chalk_1.default.red('Timeout')} Task timed out after ${(0, display_js_1.formatDuration)(timeoutMs)}`);
|
|
393
|
+
}, timeoutMs);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
// Capture pre-task git state
|
|
397
|
+
const preGitState = (0, agent_git_js_1.capturePreTaskState)(options.workingDir);
|
|
398
|
+
// Verify/fix git remote
|
|
399
|
+
const gitHost = (creds.CV_HUB_API || 'https://api.hub.controlvector.io')
|
|
400
|
+
.replace(/^https?:\/\//, '')
|
|
401
|
+
.replace(/^api\./, 'git.');
|
|
402
|
+
const remoteInfo = (0, agent_git_js_1.verifyGitRemote)(options.workingDir, task, gitHost);
|
|
403
|
+
if (remoteInfo) {
|
|
404
|
+
console.log(chalk_1.default.gray(` Git remote: ${remoteInfo.remoteName} -> ${remoteInfo.remoteUrl}`));
|
|
405
|
+
}
|
|
406
|
+
// Build prompt and launch
|
|
407
|
+
const prompt = buildClaudePrompt(task);
|
|
408
|
+
try {
|
|
409
|
+
const mode = options.autoApprove ? 'auto-approve' : 'relay';
|
|
410
|
+
console.log(chalk_1.default.cyan('Launching Claude Code') + ` (${mode} mode)...`);
|
|
411
|
+
if (options.autoApprove) {
|
|
412
|
+
console.log(chalk_1.default.gray(' Allowed tools: ') + ALLOWED_TOOLS.join(', '));
|
|
413
|
+
}
|
|
414
|
+
console.log(chalk_1.default.gray('-'.repeat(60)));
|
|
415
|
+
let result;
|
|
416
|
+
if (options.autoApprove) {
|
|
417
|
+
result = await launchAutoApproveMode(prompt, { cwd: options.workingDir });
|
|
418
|
+
}
|
|
419
|
+
else {
|
|
420
|
+
result = await launchRelayMode(prompt, {
|
|
421
|
+
cwd: options.workingDir,
|
|
422
|
+
creds,
|
|
423
|
+
executorId: state.executorId,
|
|
424
|
+
taskId: task.id,
|
|
425
|
+
});
|
|
426
|
+
}
|
|
427
|
+
console.log(chalk_1.default.gray('\n' + '-'.repeat(60)));
|
|
428
|
+
// Capture post-task git state
|
|
429
|
+
const postGitState = (0, agent_git_js_1.capturePostTaskState)(options.workingDir, preGitState);
|
|
430
|
+
const payload = (0, agent_git_js_1.buildCompletionPayload)(result.exitCode, preGitState, postGitState, startTime);
|
|
431
|
+
const elapsed = (0, display_js_1.formatDuration)(Date.now() - startTime);
|
|
432
|
+
const allChangedFiles = [
|
|
433
|
+
...postGitState.filesAdded,
|
|
434
|
+
...postGitState.filesModified,
|
|
435
|
+
...postGitState.filesDeleted,
|
|
436
|
+
];
|
|
437
|
+
if (result.exitCode === 0) {
|
|
438
|
+
if (allChangedFiles.length > 0) {
|
|
439
|
+
(0, api_js_1.sendTaskLog)(creds, state.executorId, task.id, 'git', `${allChangedFiles.length} file(s) changed (+${postGitState.linesAdded}/-${postGitState.linesDeleted})`, { added: postGitState.filesAdded.slice(0, 10), modified: postGitState.filesModified.slice(0, 10), deleted: postGitState.filesDeleted.slice(0, 10) });
|
|
440
|
+
}
|
|
441
|
+
(0, api_js_1.sendTaskLog)(creds, state.executorId, task.id, 'lifecycle', `Claude Code completed successfully (${elapsed})`, undefined, 100);
|
|
442
|
+
console.log();
|
|
443
|
+
(0, display_js_1.printBanner)('COMPLETED', elapsed, allChangedFiles, postGitState.headSha);
|
|
444
|
+
await (0, retry_js_1.withRetry)(() => (0, api_js_1.completeTask)(creds, state.executorId, task.id, payload), 'Report completion');
|
|
445
|
+
state.completedCount++;
|
|
446
|
+
console.log(chalk_1.default.gray(' Reported to CV-Hub.'));
|
|
447
|
+
}
|
|
448
|
+
else if (result.exitCode === 137) {
|
|
449
|
+
(0, api_js_1.sendTaskLog)(creds, state.executorId, task.id, 'lifecycle', 'Task aborted by user (Ctrl+C)');
|
|
450
|
+
console.log();
|
|
451
|
+
(0, display_js_1.printBanner)('ABORTED', elapsed, [], null);
|
|
452
|
+
try {
|
|
453
|
+
await (0, api_js_1.failTask)(creds, state.executorId, task.id, 'Aborted by user (Ctrl+C)');
|
|
454
|
+
}
|
|
455
|
+
catch { }
|
|
456
|
+
state.failedCount++;
|
|
457
|
+
}
|
|
458
|
+
else {
|
|
459
|
+
const stderrTail = result.stderr.trim().slice(-500);
|
|
460
|
+
(0, api_js_1.sendTaskLog)(creds, state.executorId, task.id, 'lifecycle', `Claude Code exited with code ${result.exitCode} (${elapsed})`, stderrTail ? { stderr_tail: stderrTail } : undefined);
|
|
461
|
+
console.log();
|
|
462
|
+
(0, display_js_1.printBanner)('FAILED', elapsed, allChangedFiles, postGitState.headSha);
|
|
463
|
+
const errorDetail = result.stderr.trim()
|
|
464
|
+
? `${result.stderr.trim().slice(-1500)}\n\nExit code ${result.exitCode} after ${elapsed}.`
|
|
465
|
+
: `Claude Code exited with code ${result.exitCode} after ${elapsed}.`;
|
|
466
|
+
await (0, retry_js_1.withRetry)(() => (0, api_js_1.failTask)(creds, state.executorId, task.id, errorDetail), 'Report failure');
|
|
467
|
+
state.failedCount++;
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
catch (err) {
|
|
471
|
+
console.log(`\n${chalk_1.default.red('!')} Task error: ${err.message}`);
|
|
472
|
+
(0, api_js_1.sendTaskLog)(creds, state.executorId, task.id, 'error', `Agent error: ${err.message}`);
|
|
473
|
+
try {
|
|
474
|
+
await (0, api_js_1.failTask)(creds, state.executorId, task.id, err.message);
|
|
475
|
+
}
|
|
476
|
+
catch { }
|
|
477
|
+
state.failedCount++;
|
|
478
|
+
}
|
|
479
|
+
finally {
|
|
480
|
+
clearInterval(heartbeatTimer);
|
|
481
|
+
if (timeoutTimer)
|
|
482
|
+
clearTimeout(timeoutTimer);
|
|
483
|
+
state.currentTaskId = null;
|
|
484
|
+
state.lastTaskEnd = Date.now();
|
|
485
|
+
}
|
|
486
|
+
(0, display_js_1.setTerminalTitle)('cva: listening...');
|
|
487
|
+
console.log();
|
|
488
|
+
console.log(chalk_1.default.cyan('Listening for tasks...'));
|
|
489
|
+
console.log();
|
|
490
|
+
}
|
|
491
|
+
// ============================================================================
|
|
492
|
+
// Command definition
|
|
493
|
+
// ============================================================================
|
|
494
|
+
function agentCommand() {
|
|
495
|
+
const cmd = new commander_1.Command('agent');
|
|
496
|
+
cmd.description('Listen for tasks dispatched from Claude.ai and execute them with Claude Code');
|
|
497
|
+
cmd.option('--machine <name>', 'Machine name override');
|
|
498
|
+
cmd.option('--poll-interval <seconds>', 'How often to check for tasks', '5');
|
|
499
|
+
cmd.option('--working-dir <path>', 'Working directory for Claude Code', process.cwd());
|
|
500
|
+
cmd.option('--auto-approve', 'Pre-approve all tool permissions (uses -p mode)', false);
|
|
501
|
+
cmd.action(async (opts) => {
|
|
502
|
+
await runAgent(opts);
|
|
503
|
+
});
|
|
504
|
+
return cmd;
|
|
505
|
+
}
|
|
506
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/commands/agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6FpC,wBAAgB,WAAW,IAAI,OAAO,CAiBrC"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* cva auth login / cva auth status
|
|
4
|
+
*
|
|
5
|
+
* Manages CV-Hub authentication credentials.
|
|
6
|
+
*/
|
|
7
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
8
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
9
|
+
};
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.authCommand = authCommand;
|
|
12
|
+
const commander_1 = require("commander");
|
|
13
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
14
|
+
const credentials_js_1 = require("../utils/credentials.js");
|
|
15
|
+
async function authLogin(opts) {
|
|
16
|
+
const token = opts.token || await promptForToken();
|
|
17
|
+
const apiUrl = opts.apiUrl || 'https://api.hub.controlvector.io';
|
|
18
|
+
// Validate the token
|
|
19
|
+
console.log(chalk_1.default.gray('Validating token...'));
|
|
20
|
+
try {
|
|
21
|
+
const res = await fetch(`${apiUrl}/api/v1/user/me`, {
|
|
22
|
+
headers: { 'Authorization': `Bearer ${token}` },
|
|
23
|
+
});
|
|
24
|
+
if (!res.ok) {
|
|
25
|
+
console.log(chalk_1.default.red('Invalid token.') + ` API returned ${res.status}`);
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
const data = await res.json();
|
|
29
|
+
const username = data.user?.username || data.user?.email || 'unknown';
|
|
30
|
+
// Save credentials
|
|
31
|
+
await (0, credentials_js_1.writeCredentialField)('CV_HUB_PAT', token);
|
|
32
|
+
await (0, credentials_js_1.writeCredentialField)('CV_HUB_API', apiUrl);
|
|
33
|
+
console.log(chalk_1.default.green('Authenticated') + ` as ${chalk_1.default.bold(username)}`);
|
|
34
|
+
console.log(chalk_1.default.gray(`Token saved to ~/.config/cv-hub/credentials`));
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
console.log(chalk_1.default.red('Connection failed:') + ` ${err.message}`);
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
async function promptForToken() {
|
|
42
|
+
// Simple stdin read for token
|
|
43
|
+
const readline = await import('node:readline');
|
|
44
|
+
const rl = readline.createInterface({
|
|
45
|
+
input: process.stdin,
|
|
46
|
+
output: process.stdout,
|
|
47
|
+
});
|
|
48
|
+
return new Promise((resolve) => {
|
|
49
|
+
rl.question('Enter your CV-Hub PAT token: ', (answer) => {
|
|
50
|
+
rl.close();
|
|
51
|
+
const token = answer.trim();
|
|
52
|
+
if (!token) {
|
|
53
|
+
console.log(chalk_1.default.red('No token provided.'));
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
resolve(token);
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
async function authStatus() {
|
|
61
|
+
const creds = await (0, credentials_js_1.readCredentials)();
|
|
62
|
+
if (!creds.CV_HUB_PAT) {
|
|
63
|
+
console.log(chalk_1.default.yellow('Not authenticated.') + ' Run ' + chalk_1.default.cyan('cva auth login') + ' first.');
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
const apiUrl = creds.CV_HUB_API || 'https://api.hub.controlvector.io';
|
|
67
|
+
const maskedToken = creds.CV_HUB_PAT.substring(0, 8) + '...' + creds.CV_HUB_PAT.slice(-4);
|
|
68
|
+
console.log(`API: ${chalk_1.default.cyan(apiUrl)}`);
|
|
69
|
+
console.log(`Token: ${chalk_1.default.gray(maskedToken)}`);
|
|
70
|
+
// Verify token
|
|
71
|
+
try {
|
|
72
|
+
const res = await fetch(`${apiUrl}/api/v1/user/me`, {
|
|
73
|
+
headers: { 'Authorization': `Bearer ${creds.CV_HUB_PAT}` },
|
|
74
|
+
});
|
|
75
|
+
if (res.ok) {
|
|
76
|
+
const data = await res.json();
|
|
77
|
+
const username = data.user?.username || data.user?.email || 'unknown';
|
|
78
|
+
console.log(`User: ${chalk_1.default.green(username)}`);
|
|
79
|
+
console.log(`Status: ${chalk_1.default.green('valid')}`);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
console.log(`Status: ${chalk_1.default.red('invalid')} (${res.status})`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
console.log(`Status: ${chalk_1.default.red('unreachable')} (${err.message})`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
function authCommand() {
|
|
90
|
+
const cmd = new commander_1.Command('auth');
|
|
91
|
+
cmd.description('Manage CV-Hub authentication');
|
|
92
|
+
cmd
|
|
93
|
+
.command('login')
|
|
94
|
+
.description('Authenticate with CV-Hub using a PAT token')
|
|
95
|
+
.option('--token <token>', 'PAT token (or enter interactively)')
|
|
96
|
+
.option('--api-url <url>', 'CV-Hub API URL', 'https://api.hub.controlvector.io')
|
|
97
|
+
.action(authLogin);
|
|
98
|
+
cmd
|
|
99
|
+
.command('status')
|
|
100
|
+
.description('Show current authentication status')
|
|
101
|
+
.action(authStatus);
|
|
102
|
+
return cmd;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=auth.js.map
|