@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,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent config at ~/.config/cva/config.json
|
|
3
|
+
*/
|
|
4
|
+
export interface CvaConfig {
|
|
5
|
+
defaultApiUrl?: string;
|
|
6
|
+
defaultPollInterval?: number;
|
|
7
|
+
autoApprove?: boolean;
|
|
8
|
+
[key: string]: unknown;
|
|
9
|
+
}
|
|
10
|
+
export declare function getConfigPath(): string;
|
|
11
|
+
export declare function readConfig(): Promise<CvaConfig>;
|
|
12
|
+
export declare function writeConfig(config: CvaConfig): Promise<void>;
|
|
13
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,MAAM,WAAW,SAAS;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,SAAS,CAAC,CAOrD;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAIlE"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Agent config at ~/.config/cva/config.json
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getConfigPath = getConfigPath;
|
|
7
|
+
exports.readConfig = readConfig;
|
|
8
|
+
exports.writeConfig = writeConfig;
|
|
9
|
+
const fs_1 = require("fs");
|
|
10
|
+
const os_1 = require("os");
|
|
11
|
+
const path_1 = require("path");
|
|
12
|
+
function getConfigPath() {
|
|
13
|
+
return (0, path_1.join)((0, os_1.homedir)(), '.config', 'cva', 'config.json');
|
|
14
|
+
}
|
|
15
|
+
async function readConfig() {
|
|
16
|
+
try {
|
|
17
|
+
const content = await fs_1.promises.readFile(getConfigPath(), 'utf-8');
|
|
18
|
+
return JSON.parse(content);
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return {};
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
async function writeConfig(config) {
|
|
25
|
+
const configPath = getConfigPath();
|
|
26
|
+
await fs_1.promises.mkdir((0, path_1.dirname)(configPath), { recursive: true });
|
|
27
|
+
await fs_1.promises.writeFile(configPath, JSON.stringify(config, null, 2) + '\n', { mode: 0o600 });
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAaH,sCAEC;AAED,gCAOC;AAED,kCAIC;AA5BD,2BAAoC;AACpC,2BAA6B;AAC7B,+BAAqC;AASrC,SAAgB,aAAa;IAC3B,OAAO,IAAA,WAAI,EAAC,IAAA,YAAO,GAAE,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC;AAC1D,CAAC;AAEM,KAAK,UAAU,UAAU;IAC9B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,aAAE,CAAC,QAAQ,CAAC,aAAa,EAAE,EAAE,OAAO,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,WAAW,CAAC,MAAiB;IACjD,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IACnC,MAAM,aAAE,CAAC,KAAK,CAAC,IAAA,cAAO,EAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,MAAM,aAAE,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAC1F,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CV-Hub credentials file utilities
|
|
3
|
+
*
|
|
4
|
+
* Reads/writes the CV-Hub credentials file (~/.config/cv-hub/credentials)
|
|
5
|
+
* which uses simple KEY=VALUE format (sourced by shell hooks).
|
|
6
|
+
*/
|
|
7
|
+
/** Standard paths to search for credentials, in priority order */
|
|
8
|
+
export declare const CREDENTIAL_PATHS: string[];
|
|
9
|
+
export interface CVHubCredentials {
|
|
10
|
+
CV_HUB_PAT?: string;
|
|
11
|
+
CV_HUB_API?: string;
|
|
12
|
+
CV_HUB_MACHINE_NAME?: string;
|
|
13
|
+
CV_HUB_ORG_OVERRIDE?: string;
|
|
14
|
+
CV_HUB_DEBUG?: string;
|
|
15
|
+
[key: string]: string | undefined;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Find the first existing credentials file path
|
|
19
|
+
*/
|
|
20
|
+
export declare function findCredentialFile(): Promise<string | null>;
|
|
21
|
+
/**
|
|
22
|
+
* Read and parse the CV-Hub credentials file.
|
|
23
|
+
* Parses KEY=VALUE lines, ignoring comments (#) and empty lines.
|
|
24
|
+
*/
|
|
25
|
+
export declare function readCredentials(): Promise<CVHubCredentials>;
|
|
26
|
+
/**
|
|
27
|
+
* Parse credential file content into key-value pairs.
|
|
28
|
+
*/
|
|
29
|
+
export declare function parseCredentials(content: string): CVHubCredentials;
|
|
30
|
+
/**
|
|
31
|
+
* Write or update a single field in the credentials file.
|
|
32
|
+
* Preserves existing fields, comments, and ordering.
|
|
33
|
+
* If the file doesn't exist, creates it with secure permissions.
|
|
34
|
+
*/
|
|
35
|
+
export declare function writeCredentialField(key: string, value: string): Promise<string>;
|
|
36
|
+
/**
|
|
37
|
+
* Get the machine name for this host.
|
|
38
|
+
* Priority: CV_HUB_MACHINE_NAME from credentials > os.hostname()
|
|
39
|
+
* Cleans the value: lowercase, trim, replace spaces with hyphens.
|
|
40
|
+
*/
|
|
41
|
+
export declare function getMachineName(): Promise<string>;
|
|
42
|
+
/**
|
|
43
|
+
* Clean a machine name: lowercase, trim, replace spaces with hyphens.
|
|
44
|
+
*/
|
|
45
|
+
export declare function cleanMachineName(name: string): string;
|
|
46
|
+
//# sourceMappingURL=credentials.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/utils/credentials.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,kEAAkE;AAClE,eAAO,MAAM,gBAAgB,UAG5B,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CACnC;AAED;;GAEG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAUjE;AAED;;;GAGG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAYjE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,CAgBlE;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAoDtF;AAED;;;;GAIG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAItD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAErD"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* CV-Hub credentials file utilities
|
|
4
|
+
*
|
|
5
|
+
* Reads/writes the CV-Hub credentials file (~/.config/cv-hub/credentials)
|
|
6
|
+
* which uses simple KEY=VALUE format (sourced by shell hooks).
|
|
7
|
+
*/
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
+
}) : function(o, v) {
|
|
22
|
+
o["default"] = v;
|
|
23
|
+
});
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.CREDENTIAL_PATHS = void 0;
|
|
43
|
+
exports.findCredentialFile = findCredentialFile;
|
|
44
|
+
exports.readCredentials = readCredentials;
|
|
45
|
+
exports.parseCredentials = parseCredentials;
|
|
46
|
+
exports.writeCredentialField = writeCredentialField;
|
|
47
|
+
exports.getMachineName = getMachineName;
|
|
48
|
+
exports.cleanMachineName = cleanMachineName;
|
|
49
|
+
const fs_1 = require("fs");
|
|
50
|
+
const os_1 = require("os");
|
|
51
|
+
const path_1 = require("path");
|
|
52
|
+
const os = __importStar(require("os"));
|
|
53
|
+
/** Standard paths to search for credentials, in priority order */
|
|
54
|
+
exports.CREDENTIAL_PATHS = [
|
|
55
|
+
(0, path_1.join)((0, os_1.homedir)(), '.config', 'cv-hub', 'credentials'),
|
|
56
|
+
'/root/.config/cv-hub/credentials',
|
|
57
|
+
];
|
|
58
|
+
/**
|
|
59
|
+
* Find the first existing credentials file path
|
|
60
|
+
*/
|
|
61
|
+
async function findCredentialFile() {
|
|
62
|
+
for (const p of exports.CREDENTIAL_PATHS) {
|
|
63
|
+
try {
|
|
64
|
+
await fs_1.promises.access(p);
|
|
65
|
+
return p;
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Read and parse the CV-Hub credentials file.
|
|
75
|
+
* Parses KEY=VALUE lines, ignoring comments (#) and empty lines.
|
|
76
|
+
*/
|
|
77
|
+
async function readCredentials() {
|
|
78
|
+
const credPath = await findCredentialFile();
|
|
79
|
+
if (!credPath) {
|
|
80
|
+
return {};
|
|
81
|
+
}
|
|
82
|
+
try {
|
|
83
|
+
const content = await fs_1.promises.readFile(credPath, 'utf-8');
|
|
84
|
+
return parseCredentials(content);
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return {};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Parse credential file content into key-value pairs.
|
|
92
|
+
*/
|
|
93
|
+
function parseCredentials(content) {
|
|
94
|
+
const result = {};
|
|
95
|
+
for (const line of content.split('\n')) {
|
|
96
|
+
const trimmed = line.trim();
|
|
97
|
+
if (!trimmed || trimmed.startsWith('#'))
|
|
98
|
+
continue;
|
|
99
|
+
const eqIdx = trimmed.indexOf('=');
|
|
100
|
+
if (eqIdx === -1)
|
|
101
|
+
continue;
|
|
102
|
+
const key = trimmed.slice(0, eqIdx).trim();
|
|
103
|
+
const value = trimmed.slice(eqIdx + 1).trim();
|
|
104
|
+
result[key] = value;
|
|
105
|
+
}
|
|
106
|
+
return result;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Write or update a single field in the credentials file.
|
|
110
|
+
* Preserves existing fields, comments, and ordering.
|
|
111
|
+
* If the file doesn't exist, creates it with secure permissions.
|
|
112
|
+
*/
|
|
113
|
+
async function writeCredentialField(key, value) {
|
|
114
|
+
let credPath = await findCredentialFile();
|
|
115
|
+
if (!credPath) {
|
|
116
|
+
// Create the default credentials file
|
|
117
|
+
credPath = exports.CREDENTIAL_PATHS[0];
|
|
118
|
+
await fs_1.promises.mkdir((0, path_1.dirname)(credPath), { recursive: true });
|
|
119
|
+
await fs_1.promises.writeFile(credPath, `${key}=${value}\n`, { mode: 0o600 });
|
|
120
|
+
return credPath;
|
|
121
|
+
}
|
|
122
|
+
let content;
|
|
123
|
+
try {
|
|
124
|
+
content = await fs_1.promises.readFile(credPath, 'utf-8');
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
content = '';
|
|
128
|
+
}
|
|
129
|
+
const lines = content.split('\n');
|
|
130
|
+
let found = false;
|
|
131
|
+
for (let i = 0; i < lines.length; i++) {
|
|
132
|
+
const trimmed = lines[i].trim();
|
|
133
|
+
if (trimmed.startsWith('#') || !trimmed)
|
|
134
|
+
continue;
|
|
135
|
+
const eqIdx = trimmed.indexOf('=');
|
|
136
|
+
if (eqIdx === -1)
|
|
137
|
+
continue;
|
|
138
|
+
const lineKey = trimmed.slice(0, eqIdx).trim();
|
|
139
|
+
if (lineKey === key) {
|
|
140
|
+
lines[i] = `${key}=${value}`;
|
|
141
|
+
found = true;
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
if (!found) {
|
|
146
|
+
// Append — ensure there's a trailing newline before adding
|
|
147
|
+
if (content.length > 0 && !content.endsWith('\n')) {
|
|
148
|
+
lines.push('');
|
|
149
|
+
}
|
|
150
|
+
lines.push(`${key}=${value}`);
|
|
151
|
+
}
|
|
152
|
+
// Ensure file ends with newline
|
|
153
|
+
let newContent = lines.join('\n');
|
|
154
|
+
if (!newContent.endsWith('\n')) {
|
|
155
|
+
newContent += '\n';
|
|
156
|
+
}
|
|
157
|
+
await fs_1.promises.writeFile(credPath, newContent, { mode: 0o600 });
|
|
158
|
+
return credPath;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Get the machine name for this host.
|
|
162
|
+
* Priority: CV_HUB_MACHINE_NAME from credentials > os.hostname()
|
|
163
|
+
* Cleans the value: lowercase, trim, replace spaces with hyphens.
|
|
164
|
+
*/
|
|
165
|
+
async function getMachineName() {
|
|
166
|
+
const creds = await readCredentials();
|
|
167
|
+
const raw = creds.CV_HUB_MACHINE_NAME || os.hostname();
|
|
168
|
+
return cleanMachineName(raw);
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Clean a machine name: lowercase, trim, replace spaces with hyphens.
|
|
172
|
+
*/
|
|
173
|
+
function cleanMachineName(name) {
|
|
174
|
+
return name.trim().toLowerCase().replace(/\s+/g, '-');
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/utils/credentials.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Display helpers for the cva agent.
|
|
3
|
+
*/
|
|
4
|
+
export declare function formatDuration(ms: number): string;
|
|
5
|
+
export declare function setTerminalTitle(title: string): void;
|
|
6
|
+
export declare function printBanner(status: 'COMPLETED' | 'FAILED' | 'ABORTED', elapsed: string, changedFiles: string[], commitSha: string | null): void;
|
|
7
|
+
export declare function updateStatusLine(idle: string, poll: string, completedCount: number, failedCount: number): void;
|
|
8
|
+
//# sourceMappingURL=display.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"display.d.ts","sourceRoot":"","sources":["../../src/utils/display.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAQjD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAIpD;AAED,wBAAgB,WAAW,CACzB,MAAM,EAAE,WAAW,GAAG,QAAQ,GAAG,SAAS,EAC1C,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EAAE,EACtB,SAAS,EAAE,MAAM,GAAG,IAAI,GACvB,IAAI,CAgBN;AAED,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,MAAM,GAClB,IAAI,CAGN"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Display helpers for the cva agent.
|
|
4
|
+
*/
|
|
5
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.formatDuration = formatDuration;
|
|
10
|
+
exports.setTerminalTitle = setTerminalTitle;
|
|
11
|
+
exports.printBanner = printBanner;
|
|
12
|
+
exports.updateStatusLine = updateStatusLine;
|
|
13
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
14
|
+
function formatDuration(ms) {
|
|
15
|
+
const s = Math.floor(ms / 1000);
|
|
16
|
+
if (s < 60)
|
|
17
|
+
return `${s}s`;
|
|
18
|
+
const m = Math.floor(s / 60);
|
|
19
|
+
const rem = s % 60;
|
|
20
|
+
if (m < 60)
|
|
21
|
+
return `${m}m ${rem}s`;
|
|
22
|
+
const h = Math.floor(m / 60);
|
|
23
|
+
return `${h}h ${m % 60}m`;
|
|
24
|
+
}
|
|
25
|
+
function setTerminalTitle(title) {
|
|
26
|
+
if (process.stdout.isTTY) {
|
|
27
|
+
process.stdout.write(`\x1b]0;${title}\x07`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function printBanner(status, elapsed, changedFiles, commitSha) {
|
|
31
|
+
const color = status === 'COMPLETED' ? chalk_1.default.green : status === 'ABORTED' ? chalk_1.default.yellow : chalk_1.default.red;
|
|
32
|
+
const icon = status === 'COMPLETED' ? '✅' : status === 'ABORTED' ? '⏹' : '❌';
|
|
33
|
+
console.log(color('┌─────────────────────────────────────────────────────────────┐'));
|
|
34
|
+
console.log(color(`│ ${icon} ${status.padEnd(57)}│`));
|
|
35
|
+
console.log(color(`│ Duration: ${elapsed.padEnd(49)}│`));
|
|
36
|
+
if (changedFiles.length > 0) {
|
|
37
|
+
const shown = changedFiles.slice(0, 3);
|
|
38
|
+
const fileStr = shown.join(', ') + (changedFiles.length > 3 ? ` and ${changedFiles.length - 3} more` : '');
|
|
39
|
+
console.log(color(`│ Files: ${fileStr.substring(0, 51).padEnd(51)}│`));
|
|
40
|
+
}
|
|
41
|
+
if (commitSha) {
|
|
42
|
+
console.log(color(`│ Commit: ${commitSha.substring(0, 8).padEnd(51)}│`));
|
|
43
|
+
}
|
|
44
|
+
console.log(color('└─────────────────────────────────────────────────────────────┘'));
|
|
45
|
+
}
|
|
46
|
+
function updateStatusLine(idle, poll, completedCount, failedCount) {
|
|
47
|
+
const line = `\r${chalk_1.default.cyan('🔄')} Listening... (${idle} idle) | Last poll: ${poll} ago | Completed: ${completedCount} | Failed: ${failedCount}`;
|
|
48
|
+
process.stdout.write(`\r\x1b[K${line}`);
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=display.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"display.js","sourceRoot":"","sources":["../../src/utils/display.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,wBAAsB,SAAS,CAAC,CAAC,EAC/B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,KAAK,EAAE,MAAM,EACb,UAAU,SAAI,GACb,OAAO,CAAC,CAAC,CAAC,CAYZ"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Retry logic for API calls.
|
|
4
|
+
*/
|
|
5
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.withRetry = withRetry;
|
|
10
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
11
|
+
async function withRetry(fn, label, maxRetries = 3) {
|
|
12
|
+
for (let i = 0; i < maxRetries; i++) {
|
|
13
|
+
try {
|
|
14
|
+
return await fn();
|
|
15
|
+
}
|
|
16
|
+
catch (err) {
|
|
17
|
+
if (i === maxRetries - 1)
|
|
18
|
+
throw err;
|
|
19
|
+
const delay = (i + 1) * 5;
|
|
20
|
+
console.log(`\n${chalk_1.default.yellow('⚠')} ${label} failed, retrying in ${delay}s... (${err.message})`);
|
|
21
|
+
await new Promise(r => setTimeout(r, delay * 1000));
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
throw new Error('unreachable');
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;AAIH,8BAgBC;AAlBD,kDAA0B;AAEnB,KAAK,UAAU,SAAS,CAC7B,EAAoB,EACpB,KAAa,EACb,UAAU,GAAG,CAAC;IAEd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAC;QACpB,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,KAAK,UAAU,GAAG,CAAC;gBAAE,MAAM,GAAG,CAAC;YACpC,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,KAAK,wBAAwB,KAAK,SAAS,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC;YACjG,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;AACjC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@controlvector/cv-agent",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Standalone agent daemon for CV-Hub — bridges Claude Code with CV-Hub task dispatch",
|
|
5
|
+
"bin": {
|
|
6
|
+
"cva": "./dist/bundle.cjs"
|
|
7
|
+
},
|
|
8
|
+
"main": "./dist/index.js",
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc && node esbuild.config.mjs",
|
|
12
|
+
"test": "vitest run",
|
|
13
|
+
"test:watch": "vitest",
|
|
14
|
+
"clean": "rm -rf dist",
|
|
15
|
+
"prepublishOnly": "npm run build"
|
|
16
|
+
},
|
|
17
|
+
"keywords": ["cv-hub", "claude-code", "agent", "controlvector"],
|
|
18
|
+
"author": "Control Vector LLC",
|
|
19
|
+
"license": "MIT",
|
|
20
|
+
"repository": {
|
|
21
|
+
"type": "git",
|
|
22
|
+
"url": "https://hub.controlvector.io/schmotz/cv-agent.git"
|
|
23
|
+
},
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
"@types/node": "^22.0.0",
|
|
26
|
+
"chalk": "^5.3.0",
|
|
27
|
+
"commander": "^12.1.0",
|
|
28
|
+
"esbuild": "^0.24.0",
|
|
29
|
+
"typescript": "^5.6.0",
|
|
30
|
+
"vitest": "^2.1.0"
|
|
31
|
+
},
|
|
32
|
+
"engines": {
|
|
33
|
+
"node": ">=20"
|
|
34
|
+
},
|
|
35
|
+
"files": [
|
|
36
|
+
"dist"
|
|
37
|
+
]
|
|
38
|
+
}
|