@swarmify/agents-cli 1.9.1 → 1.10.1
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/CHANGELOG.md +11 -0
- package/README.md +8 -0
- package/dist/commands/cron.d.ts +3 -0
- package/dist/commands/cron.d.ts.map +1 -0
- package/dist/commands/cron.js +457 -0
- package/dist/commands/cron.js.map +1 -0
- package/dist/commands/daemon.d.ts.map +1 -1
- package/dist/commands/daemon.js +215 -1
- package/dist/commands/daemon.js.map +1 -1
- package/dist/commands/drive.d.ts +3 -0
- package/dist/commands/drive.d.ts.map +1 -0
- package/dist/commands/drive.js +112 -0
- package/dist/commands/drive.js.map +1 -0
- package/dist/commands/sessions.d.ts.map +1 -1
- package/dist/commands/sessions.js +1 -0
- package/dist/commands/sessions.js.map +1 -1
- package/dist/commands/view.d.ts.map +1 -1
- package/dist/commands/view.js +62 -30
- package/dist/commands/view.js.map +1 -1
- package/dist/index.js +38 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/agents.d.ts +10 -0
- package/dist/lib/agents.d.ts.map +1 -1
- package/dist/lib/agents.js +35 -6
- package/dist/lib/agents.js.map +1 -1
- package/dist/lib/cron.d.ts +70 -0
- package/dist/lib/cron.d.ts.map +1 -0
- package/dist/lib/cron.js +325 -0
- package/dist/lib/cron.js.map +1 -0
- package/dist/lib/drive-sync.d.ts +28 -0
- package/dist/lib/drive-sync.d.ts.map +1 -0
- package/dist/lib/drive-sync.js +193 -0
- package/dist/lib/drive-sync.js.map +1 -0
- package/dist/lib/factory.d.ts +57 -0
- package/dist/lib/factory.d.ts.map +1 -0
- package/dist/lib/factory.js +110 -0
- package/dist/lib/factory.js.map +1 -0
- package/dist/lib/session/discover.d.ts.map +1 -1
- package/dist/lib/session/discover.js +134 -2
- package/dist/lib/session/discover.js.map +1 -1
- package/dist/lib/session/parse.d.ts.map +1 -1
- package/dist/lib/session/parse.js +1 -0
- package/dist/lib/session/parse.js.map +1 -1
- package/dist/lib/session/types.d.ts +1 -1
- package/dist/lib/session/types.d.ts.map +1 -1
- package/dist/lib/session/types.js +1 -1
- package/dist/lib/session/types.js.map +1 -1
- package/dist/lib/state.d.ts +1 -0
- package/dist/lib/state.d.ts.map +1 -1
- package/dist/lib/state.js +7 -0
- package/dist/lib/state.js.map +1 -1
- package/package.json +1 -1
package/dist/lib/cron.js
ADDED
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import * as yaml from 'yaml';
|
|
4
|
+
import { Cron } from 'croner';
|
|
5
|
+
import { getCronDir, getRunsDir, ensureAgentsDir } from './state.js';
|
|
6
|
+
import { ALL_AGENT_IDS } from './agents.js';
|
|
7
|
+
const JOB_DEFAULTS = {
|
|
8
|
+
mode: 'plan',
|
|
9
|
+
effort: 'default',
|
|
10
|
+
timeout: '30m',
|
|
11
|
+
enabled: true,
|
|
12
|
+
};
|
|
13
|
+
export function listJobs() {
|
|
14
|
+
ensureAgentsDir();
|
|
15
|
+
const jobsDir = getCronDir();
|
|
16
|
+
if (!fs.existsSync(jobsDir))
|
|
17
|
+
return [];
|
|
18
|
+
const files = fs.readdirSync(jobsDir).filter((f) => f.endsWith('.yml') || f.endsWith('.yaml'));
|
|
19
|
+
const jobs = [];
|
|
20
|
+
for (const file of files) {
|
|
21
|
+
const job = readJobFile(path.join(jobsDir, file));
|
|
22
|
+
if (job)
|
|
23
|
+
jobs.push(job);
|
|
24
|
+
}
|
|
25
|
+
return jobs;
|
|
26
|
+
}
|
|
27
|
+
export function readJob(name) {
|
|
28
|
+
ensureAgentsDir();
|
|
29
|
+
const jobsDir = getCronDir();
|
|
30
|
+
for (const ext of ['.yml', '.yaml']) {
|
|
31
|
+
const filePath = path.join(jobsDir, name + ext);
|
|
32
|
+
if (fs.existsSync(filePath)) {
|
|
33
|
+
return readJobFile(filePath);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
function readJobFile(filePath) {
|
|
39
|
+
try {
|
|
40
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
41
|
+
const parsed = yaml.parse(content);
|
|
42
|
+
if (!parsed || typeof parsed !== 'object')
|
|
43
|
+
return null;
|
|
44
|
+
return {
|
|
45
|
+
...JOB_DEFAULTS,
|
|
46
|
+
...parsed,
|
|
47
|
+
name: parsed.name || path.basename(filePath).replace(/\.ya?ml$/, ''),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
export function writeJob(config) {
|
|
55
|
+
ensureAgentsDir();
|
|
56
|
+
const jobsDir = getCronDir();
|
|
57
|
+
const filePath = path.join(jobsDir, config.name + '.yml');
|
|
58
|
+
const output = { ...config };
|
|
59
|
+
if (output.mode === 'plan')
|
|
60
|
+
delete output.mode;
|
|
61
|
+
if (output.effort === 'default')
|
|
62
|
+
delete output.effort;
|
|
63
|
+
if (output.timeout === '30m')
|
|
64
|
+
delete output.timeout;
|
|
65
|
+
if (output.enabled === true)
|
|
66
|
+
delete output.enabled;
|
|
67
|
+
if (output.runOnce === false || output.runOnce === undefined)
|
|
68
|
+
delete output.runOnce;
|
|
69
|
+
fs.writeFileSync(filePath, yaml.stringify(output), 'utf-8');
|
|
70
|
+
}
|
|
71
|
+
export function deleteJob(name) {
|
|
72
|
+
const jobsDir = getCronDir();
|
|
73
|
+
for (const ext of ['.yml', '.yaml']) {
|
|
74
|
+
const filePath = path.join(jobsDir, name + ext);
|
|
75
|
+
if (fs.existsSync(filePath)) {
|
|
76
|
+
fs.unlinkSync(filePath);
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
export function setJobEnabled(name, enabled) {
|
|
83
|
+
const job = readJob(name);
|
|
84
|
+
if (!job)
|
|
85
|
+
throw new Error(`Job '${name}' not found`);
|
|
86
|
+
job.enabled = enabled;
|
|
87
|
+
writeJob(job);
|
|
88
|
+
}
|
|
89
|
+
export function validateJob(config) {
|
|
90
|
+
const errors = [];
|
|
91
|
+
if (!config.name || typeof config.name !== 'string') {
|
|
92
|
+
errors.push('name is required');
|
|
93
|
+
}
|
|
94
|
+
if (!config.schedule || typeof config.schedule !== 'string') {
|
|
95
|
+
errors.push('schedule (cron expression) is required');
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
// Validate cron expression is parseable
|
|
99
|
+
try {
|
|
100
|
+
new Cron(config.schedule);
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
errors.push(`invalid cron expression: "${config.schedule}"`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
if (!config.agent || typeof config.agent !== 'string') {
|
|
107
|
+
errors.push('agent is required');
|
|
108
|
+
}
|
|
109
|
+
if (config.agent && !ALL_AGENT_IDS.includes(config.agent)) {
|
|
110
|
+
errors.push(`agent must be one of: ${ALL_AGENT_IDS.join(', ')}`);
|
|
111
|
+
}
|
|
112
|
+
if (config.mode && !['plan', 'edit', 'full'].includes(config.mode)) {
|
|
113
|
+
errors.push('mode must be plan, edit, or full');
|
|
114
|
+
}
|
|
115
|
+
if (config.effort && !['fast', 'default', 'detailed'].includes(config.effort)) {
|
|
116
|
+
errors.push('effort must be fast, default, or detailed');
|
|
117
|
+
}
|
|
118
|
+
if (!config.prompt || typeof config.prompt !== 'string') {
|
|
119
|
+
errors.push('prompt is required');
|
|
120
|
+
}
|
|
121
|
+
if (config.timeout && !parseTimeout(config.timeout)) {
|
|
122
|
+
errors.push('timeout must be like 30m, 2h, 1h30m');
|
|
123
|
+
}
|
|
124
|
+
return errors;
|
|
125
|
+
}
|
|
126
|
+
export function resolveJobPrompt(config) {
|
|
127
|
+
const now = new Date();
|
|
128
|
+
const tz = config.timezone || Intl.DateTimeFormat().resolvedOptions().timeZone;
|
|
129
|
+
const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
|
|
130
|
+
// Compute date/day/time in the job's configured timezone
|
|
131
|
+
// Use Intl.DateTimeFormat to get the weekday name directly in the target timezone
|
|
132
|
+
const localDayName = new Intl.DateTimeFormat('en-US', { timeZone: tz, weekday: 'long' }).format(now);
|
|
133
|
+
const localDay = days.includes(localDayName) ? localDayName : days[now.getDay()];
|
|
134
|
+
const localDate = now.toLocaleDateString('en-CA', { timeZone: tz }); // en-CA gives YYYY-MM-DD
|
|
135
|
+
const localTime = now.toLocaleTimeString('en-GB', { timeZone: tz, hour12: false }); // HH:MM:SS
|
|
136
|
+
let prompt = config.prompt;
|
|
137
|
+
// Built-in variables (timezone-aware)
|
|
138
|
+
prompt = prompt.replace(/\{day\}/g, localDay);
|
|
139
|
+
prompt = prompt.replace(/\{date\}/g, localDate);
|
|
140
|
+
prompt = prompt.replace(/\{time\}/g, localTime);
|
|
141
|
+
prompt = prompt.replace(/\{job_name\}/g, config.name);
|
|
142
|
+
// User-defined variables
|
|
143
|
+
if (config.variables) {
|
|
144
|
+
for (const [key, value] of Object.entries(config.variables)) {
|
|
145
|
+
prompt = prompt.replace(new RegExp(`\\{${key}\\}`, 'g'), value);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// Last report (special handling)
|
|
149
|
+
const latestRun = getLatestRun(config.name);
|
|
150
|
+
if (latestRun) {
|
|
151
|
+
const reportPath = path.join(getRunsDir(), config.name, latestRun.runId, 'report.md');
|
|
152
|
+
if (fs.existsSync(reportPath)) {
|
|
153
|
+
const report = fs.readFileSync(reportPath, 'utf-8');
|
|
154
|
+
prompt = prompt.replace(/\{last_report\}/g, report);
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
prompt = prompt.replace(/\{last_report\}/g, '(no previous report)');
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
prompt = prompt.replace(/\{last_report\}/g, '(no previous report)');
|
|
162
|
+
}
|
|
163
|
+
return prompt;
|
|
164
|
+
}
|
|
165
|
+
export function parseTimeout(timeout) {
|
|
166
|
+
const match = timeout.match(/^(?:(\d+)h)?(?:(\d+)m)?$/);
|
|
167
|
+
if (!match)
|
|
168
|
+
return null;
|
|
169
|
+
const hours = parseInt(match[1] || '0', 10);
|
|
170
|
+
const minutes = parseInt(match[2] || '0', 10);
|
|
171
|
+
const ms = (hours * 60 + minutes) * 60 * 1000;
|
|
172
|
+
return ms > 0 ? ms : null;
|
|
173
|
+
}
|
|
174
|
+
export function listRuns(jobName) {
|
|
175
|
+
const runsDir = getRunsDir();
|
|
176
|
+
const jobRunsDir = path.join(runsDir, jobName);
|
|
177
|
+
if (!fs.existsSync(jobRunsDir))
|
|
178
|
+
return [];
|
|
179
|
+
const entries = fs.readdirSync(jobRunsDir, { withFileTypes: true })
|
|
180
|
+
.filter((e) => e.isDirectory())
|
|
181
|
+
.map((e) => e.name)
|
|
182
|
+
.sort();
|
|
183
|
+
const runs = [];
|
|
184
|
+
for (const runId of entries) {
|
|
185
|
+
const meta = readRunMeta(jobName, runId);
|
|
186
|
+
if (meta)
|
|
187
|
+
runs.push(meta);
|
|
188
|
+
}
|
|
189
|
+
return runs;
|
|
190
|
+
}
|
|
191
|
+
export function getLatestRun(jobName) {
|
|
192
|
+
const runs = listRuns(jobName);
|
|
193
|
+
return runs.length > 0 ? runs[runs.length - 1] : null;
|
|
194
|
+
}
|
|
195
|
+
export function writeRunMeta(meta) {
|
|
196
|
+
ensureAgentsDir();
|
|
197
|
+
const runDir = path.join(getRunsDir(), meta.jobName, meta.runId);
|
|
198
|
+
fs.mkdirSync(runDir, { recursive: true });
|
|
199
|
+
fs.writeFileSync(path.join(runDir, 'meta.json'), JSON.stringify(meta, null, 2), 'utf-8');
|
|
200
|
+
}
|
|
201
|
+
export function readRunMeta(jobName, runId) {
|
|
202
|
+
const metaPath = path.join(getRunsDir(), jobName, runId, 'meta.json');
|
|
203
|
+
if (!fs.existsSync(metaPath))
|
|
204
|
+
return null;
|
|
205
|
+
try {
|
|
206
|
+
return JSON.parse(fs.readFileSync(metaPath, 'utf-8'));
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
return null;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
export function getRunDir(jobName, runId) {
|
|
213
|
+
return path.join(getRunsDir(), jobName, runId);
|
|
214
|
+
}
|
|
215
|
+
export function discoverJobsFromRepo(repoPath) {
|
|
216
|
+
const jobsPath = path.join(repoPath, 'cron');
|
|
217
|
+
if (!fs.existsSync(jobsPath))
|
|
218
|
+
return [];
|
|
219
|
+
return fs.readdirSync(jobsPath)
|
|
220
|
+
.filter((f) => f.endsWith('.yml') || f.endsWith('.yaml'))
|
|
221
|
+
.map((f) => ({
|
|
222
|
+
name: f.replace(/\.ya?ml$/, ''),
|
|
223
|
+
path: path.join(jobsPath, f),
|
|
224
|
+
}));
|
|
225
|
+
}
|
|
226
|
+
export function jobExists(name) {
|
|
227
|
+
return readJob(name) !== null;
|
|
228
|
+
}
|
|
229
|
+
export function getJobPath(name) {
|
|
230
|
+
const jobsDir = getCronDir();
|
|
231
|
+
for (const ext of ['.yml', '.yaml']) {
|
|
232
|
+
const filePath = path.join(jobsDir, name + ext);
|
|
233
|
+
if (fs.existsSync(filePath)) {
|
|
234
|
+
return filePath;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
return null;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Parse an "at" time string into a one-shot cron expression.
|
|
241
|
+
* Supports formats like:
|
|
242
|
+
* - "9:00" or "09:00" - today at 9:00 AM (or tomorrow if past)
|
|
243
|
+
* - "14:30" - today at 2:30 PM
|
|
244
|
+
* - "2026-02-24 09:00" - specific date and time
|
|
245
|
+
* Returns null if invalid format.
|
|
246
|
+
*/
|
|
247
|
+
export function parseAtTime(atTime) {
|
|
248
|
+
// Try parsing as "HH:MM" format
|
|
249
|
+
const timeMatch = atTime.match(/^(\d{1,2}):(\d{2})$/);
|
|
250
|
+
if (timeMatch) {
|
|
251
|
+
const hour = parseInt(timeMatch[1], 10);
|
|
252
|
+
const minute = parseInt(timeMatch[2], 10);
|
|
253
|
+
if (hour < 0 || hour > 23 || minute < 0 || minute > 59)
|
|
254
|
+
return null;
|
|
255
|
+
const now = new Date();
|
|
256
|
+
let targetDate = new Date();
|
|
257
|
+
targetDate.setHours(hour, minute, 0, 0);
|
|
258
|
+
// If the time has already passed today, schedule for tomorrow
|
|
259
|
+
if (targetDate <= now) {
|
|
260
|
+
targetDate.setDate(targetDate.getDate() + 1);
|
|
261
|
+
}
|
|
262
|
+
const day = targetDate.getDate();
|
|
263
|
+
const month = targetDate.getMonth() + 1;
|
|
264
|
+
// Cron format: minute hour day month *
|
|
265
|
+
return { schedule: `${minute} ${hour} ${day} ${month} *`, runOnce: true };
|
|
266
|
+
}
|
|
267
|
+
// Try parsing as "YYYY-MM-DD HH:MM" format
|
|
268
|
+
const dateTimeMatch = atTime.match(/^(\d{4})-(\d{2})-(\d{2})\s+(\d{1,2}):(\d{2})$/);
|
|
269
|
+
if (dateTimeMatch) {
|
|
270
|
+
const year = parseInt(dateTimeMatch[1], 10);
|
|
271
|
+
const month = parseInt(dateTimeMatch[2], 10);
|
|
272
|
+
const day = parseInt(dateTimeMatch[3], 10);
|
|
273
|
+
const hour = parseInt(dateTimeMatch[4], 10);
|
|
274
|
+
const minute = parseInt(dateTimeMatch[5], 10);
|
|
275
|
+
if (month < 1 || month > 12 || day < 1 || day > 31)
|
|
276
|
+
return null;
|
|
277
|
+
if (hour < 0 || hour > 23 || minute < 0 || minute > 59)
|
|
278
|
+
return null;
|
|
279
|
+
// Note: croner doesn't support year, so we just use month/day
|
|
280
|
+
// The job will fire on that date each year unless removed
|
|
281
|
+
return { schedule: `${minute} ${hour} ${day} ${month} *`, runOnce: true };
|
|
282
|
+
}
|
|
283
|
+
return null;
|
|
284
|
+
}
|
|
285
|
+
export function jobContentMatches(name, sourcePath) {
|
|
286
|
+
const existing = readJob(name);
|
|
287
|
+
if (!existing)
|
|
288
|
+
return false;
|
|
289
|
+
try {
|
|
290
|
+
const sourceContent = fs.readFileSync(sourcePath, 'utf-8');
|
|
291
|
+
const sourceJob = yaml.parse(sourceContent);
|
|
292
|
+
if (!sourceJob)
|
|
293
|
+
return false;
|
|
294
|
+
const existingNormalized = yaml.stringify(existing);
|
|
295
|
+
const fullSource = { ...JOB_DEFAULTS, ...sourceJob, name: sourceJob.name || name };
|
|
296
|
+
const sourceNormalized = yaml.stringify(fullSource);
|
|
297
|
+
return existingNormalized === sourceNormalized;
|
|
298
|
+
}
|
|
299
|
+
catch {
|
|
300
|
+
return false;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
export function installJobFromSource(sourcePath, name) {
|
|
304
|
+
try {
|
|
305
|
+
const content = fs.readFileSync(sourcePath, 'utf-8');
|
|
306
|
+
const parsed = yaml.parse(content);
|
|
307
|
+
if (!parsed)
|
|
308
|
+
return { success: false, error: 'Invalid YAML' };
|
|
309
|
+
const config = {
|
|
310
|
+
...JOB_DEFAULTS,
|
|
311
|
+
...parsed,
|
|
312
|
+
name: parsed.name || name,
|
|
313
|
+
};
|
|
314
|
+
const errors = validateJob(config);
|
|
315
|
+
if (errors.length > 0) {
|
|
316
|
+
return { success: false, error: errors.join(', ') };
|
|
317
|
+
}
|
|
318
|
+
writeJob(config);
|
|
319
|
+
return { success: true };
|
|
320
|
+
}
|
|
321
|
+
catch (err) {
|
|
322
|
+
return { success: false, error: err.message };
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
//# sourceMappingURL=cron.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cron.js","sourceRoot":"","sources":["../../src/lib/cron.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export interface DriveConfig {
|
|
2
|
+
remote: string | null;
|
|
3
|
+
attached: boolean;
|
|
4
|
+
previousTargets: {
|
|
5
|
+
configDir: string;
|
|
6
|
+
homeFiles: Record<string, string>;
|
|
7
|
+
} | null;
|
|
8
|
+
lastPull: string | null;
|
|
9
|
+
lastPush: string | null;
|
|
10
|
+
}
|
|
11
|
+
export declare function readDriveConfig(): DriveConfig;
|
|
12
|
+
export declare function writeDriveConfig(config: DriveConfig): void;
|
|
13
|
+
export declare function setRemote(target: string): void;
|
|
14
|
+
export declare function pull(): Promise<void>;
|
|
15
|
+
export declare function push(): Promise<void>;
|
|
16
|
+
export declare function attach(): void;
|
|
17
|
+
export declare function detach(): void;
|
|
18
|
+
export interface DriveStatus {
|
|
19
|
+
remote: string | null;
|
|
20
|
+
attached: boolean;
|
|
21
|
+
lastPull: string | null;
|
|
22
|
+
lastPush: string | null;
|
|
23
|
+
driveDir: string;
|
|
24
|
+
configDirTarget: string | null;
|
|
25
|
+
homeFileTargets: Record<string, string | null>;
|
|
26
|
+
}
|
|
27
|
+
export declare function getDriveStatus(): DriveStatus;
|
|
28
|
+
//# sourceMappingURL=drive-sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drive-sync.d.ts","sourceRoot":"","sources":["../../src/lib/drive-sync.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,eAAe,EAAE;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACnC,GAAG,IAAI,CAAC;IACT,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAMD,wBAAgB,eAAe,IAAI,WAAW,CAU7C;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAM1D;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAO9C;AAED,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAW1C;AAED,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAa1C;AAED,wBAAgB,MAAM,IAAI,IAAI,CAmE7B;AAED,wBAAgB,MAAM,IAAI,IAAI,CA0B7B;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;CAChD;AAED,wBAAgB,cAAc,IAAI,WAAW,CAsC5C"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import * as os from 'os';
|
|
4
|
+
import { exec } from 'child_process';
|
|
5
|
+
import { promisify } from 'util';
|
|
6
|
+
import { getDriveDir } from './state.js';
|
|
7
|
+
import { AGENTS } from './agents.js';
|
|
8
|
+
const execAsync = promisify(exec);
|
|
9
|
+
const AGENT = 'claude';
|
|
10
|
+
function configPath() {
|
|
11
|
+
return path.join(getDriveDir(), 'config.json');
|
|
12
|
+
}
|
|
13
|
+
export function readDriveConfig() {
|
|
14
|
+
const p = configPath();
|
|
15
|
+
if (fs.existsSync(p)) {
|
|
16
|
+
try {
|
|
17
|
+
return JSON.parse(fs.readFileSync(p, 'utf-8'));
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
// Fall through to default
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return { remote: null, attached: false, previousTargets: null, lastPull: null, lastPush: null };
|
|
24
|
+
}
|
|
25
|
+
export function writeDriveConfig(config) {
|
|
26
|
+
const dir = getDriveDir();
|
|
27
|
+
if (!fs.existsSync(dir)) {
|
|
28
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
29
|
+
}
|
|
30
|
+
fs.writeFileSync(configPath(), JSON.stringify(config, null, 2));
|
|
31
|
+
}
|
|
32
|
+
export function setRemote(target) {
|
|
33
|
+
if (!target.match(/^[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+$/)) {
|
|
34
|
+
throw new Error(`Invalid remote: ${target}. Expected: user@host`);
|
|
35
|
+
}
|
|
36
|
+
const config = readDriveConfig();
|
|
37
|
+
config.remote = target;
|
|
38
|
+
writeDriveConfig(config);
|
|
39
|
+
}
|
|
40
|
+
export async function pull() {
|
|
41
|
+
const config = readDriveConfig();
|
|
42
|
+
if (!config.remote)
|
|
43
|
+
throw new Error('No remote configured. Run: agents drive remote <user@host>');
|
|
44
|
+
const localDir = getDriveDir() + '/';
|
|
45
|
+
const remote = `${config.remote}:~/.agents/drive/`;
|
|
46
|
+
await execAsync(`rsync -az --exclude='config.json' ${remote} ${localDir}`);
|
|
47
|
+
config.lastPull = new Date().toISOString();
|
|
48
|
+
writeDriveConfig(config);
|
|
49
|
+
}
|
|
50
|
+
export async function push() {
|
|
51
|
+
const config = readDriveConfig();
|
|
52
|
+
if (!config.remote)
|
|
53
|
+
throw new Error('No remote configured. Run: agents drive remote <user@host>');
|
|
54
|
+
const localDir = getDriveDir() + '/';
|
|
55
|
+
const remote = `${config.remote}:~/.agents/drive/`;
|
|
56
|
+
// Ensure remote directory exists
|
|
57
|
+
await execAsync(`ssh ${config.remote} 'mkdir -p ~/.agents/drive'`);
|
|
58
|
+
await execAsync(`rsync -az --exclude='config.json' ${localDir} ${remote}`);
|
|
59
|
+
config.lastPush = new Date().toISOString();
|
|
60
|
+
writeDriveConfig(config);
|
|
61
|
+
}
|
|
62
|
+
export function attach() {
|
|
63
|
+
const config = readDriveConfig();
|
|
64
|
+
if (config.attached)
|
|
65
|
+
throw new Error('Drive is already attached');
|
|
66
|
+
const home = os.homedir();
|
|
67
|
+
const agentConfig = AGENTS[AGENT];
|
|
68
|
+
const driveDir = getDriveDir();
|
|
69
|
+
const configDirPath = agentConfig.configDir; // ~/.claude
|
|
70
|
+
const driveConfigDir = path.join(driveDir, `.${AGENT}`); // ~/.agents/drive/.claude
|
|
71
|
+
// Read current symlink target
|
|
72
|
+
let prevConfigDir = null;
|
|
73
|
+
try {
|
|
74
|
+
const stat = fs.lstatSync(configDirPath);
|
|
75
|
+
if (stat.isSymbolicLink()) {
|
|
76
|
+
prevConfigDir = fs.readlinkSync(configDirPath);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// Path doesn't exist
|
|
81
|
+
}
|
|
82
|
+
if (!prevConfigDir) {
|
|
83
|
+
throw new Error(`${configDirPath} is not a symlink. Run 'agents use claude' first.`);
|
|
84
|
+
}
|
|
85
|
+
// Save previous targets for home files
|
|
86
|
+
const prevHomeFiles = {};
|
|
87
|
+
for (const hf of agentConfig.homeFiles || []) {
|
|
88
|
+
const hfPath = path.join(home, hf);
|
|
89
|
+
try {
|
|
90
|
+
const stat = fs.lstatSync(hfPath);
|
|
91
|
+
if (stat.isSymbolicLink()) {
|
|
92
|
+
prevHomeFiles[hf] = fs.readlinkSync(hfPath);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
// File doesn't exist
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
config.previousTargets = {
|
|
100
|
+
configDir: prevConfigDir,
|
|
101
|
+
homeFiles: prevHomeFiles,
|
|
102
|
+
};
|
|
103
|
+
// Ensure drive config dir exists
|
|
104
|
+
if (!fs.existsSync(driveConfigDir)) {
|
|
105
|
+
fs.mkdirSync(driveConfigDir, { recursive: true });
|
|
106
|
+
}
|
|
107
|
+
// Swap config dir symlink
|
|
108
|
+
fs.unlinkSync(configDirPath);
|
|
109
|
+
fs.symlinkSync(driveConfigDir, configDirPath);
|
|
110
|
+
// Swap home files
|
|
111
|
+
for (const hf of agentConfig.homeFiles || []) {
|
|
112
|
+
const hfPath = path.join(home, hf);
|
|
113
|
+
const driveHfPath = path.join(driveDir, hf);
|
|
114
|
+
if (!fs.existsSync(driveHfPath)) {
|
|
115
|
+
fs.writeFileSync(driveHfPath, '{}');
|
|
116
|
+
}
|
|
117
|
+
try {
|
|
118
|
+
fs.unlinkSync(hfPath);
|
|
119
|
+
}
|
|
120
|
+
catch { /* doesn't exist */ }
|
|
121
|
+
fs.symlinkSync(driveHfPath, hfPath);
|
|
122
|
+
}
|
|
123
|
+
config.attached = true;
|
|
124
|
+
writeDriveConfig(config);
|
|
125
|
+
}
|
|
126
|
+
export function detach() {
|
|
127
|
+
const config = readDriveConfig();
|
|
128
|
+
if (!config.attached)
|
|
129
|
+
throw new Error('Drive is not attached');
|
|
130
|
+
if (!config.previousTargets)
|
|
131
|
+
throw new Error('No previous targets saved');
|
|
132
|
+
const home = os.homedir();
|
|
133
|
+
const agentConfig = AGENTS[AGENT];
|
|
134
|
+
// Restore config dir symlink
|
|
135
|
+
const configDirPath = agentConfig.configDir;
|
|
136
|
+
fs.unlinkSync(configDirPath);
|
|
137
|
+
fs.symlinkSync(config.previousTargets.configDir, configDirPath);
|
|
138
|
+
// Restore home files
|
|
139
|
+
for (const hf of agentConfig.homeFiles || []) {
|
|
140
|
+
const hfPath = path.join(home, hf);
|
|
141
|
+
const prevTarget = config.previousTargets.homeFiles[hf];
|
|
142
|
+
if (prevTarget) {
|
|
143
|
+
try {
|
|
144
|
+
fs.unlinkSync(hfPath);
|
|
145
|
+
}
|
|
146
|
+
catch { /* doesn't exist */ }
|
|
147
|
+
fs.symlinkSync(prevTarget, hfPath);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
config.attached = false;
|
|
151
|
+
config.previousTargets = null;
|
|
152
|
+
writeDriveConfig(config);
|
|
153
|
+
}
|
|
154
|
+
export function getDriveStatus() {
|
|
155
|
+
const config = readDriveConfig();
|
|
156
|
+
const home = os.homedir();
|
|
157
|
+
const agentConfig = AGENTS[AGENT];
|
|
158
|
+
let configDirTarget = null;
|
|
159
|
+
try {
|
|
160
|
+
const stat = fs.lstatSync(agentConfig.configDir);
|
|
161
|
+
if (stat.isSymbolicLink()) {
|
|
162
|
+
configDirTarget = fs.readlinkSync(agentConfig.configDir);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
// Not a symlink or doesn't exist
|
|
167
|
+
}
|
|
168
|
+
const homeFileTargets = {};
|
|
169
|
+
for (const hf of agentConfig.homeFiles || []) {
|
|
170
|
+
try {
|
|
171
|
+
const stat = fs.lstatSync(path.join(home, hf));
|
|
172
|
+
if (stat.isSymbolicLink()) {
|
|
173
|
+
homeFileTargets[hf] = fs.readlinkSync(path.join(home, hf));
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
homeFileTargets[hf] = null;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
homeFileTargets[hf] = null;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return {
|
|
184
|
+
remote: config.remote,
|
|
185
|
+
attached: config.attached,
|
|
186
|
+
lastPull: config.lastPull,
|
|
187
|
+
lastPush: config.lastPush,
|
|
188
|
+
driveDir: getDriveDir(),
|
|
189
|
+
configDirTarget,
|
|
190
|
+
homeFileTargets,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=drive-sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drive-sync.js","sourceRoot":"","sources":["../../src/lib/drive-sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
export interface DaemonConfig {
|
|
2
|
+
nodeId?: string;
|
|
3
|
+
nodeToken?: string;
|
|
4
|
+
endpoint?: string;
|
|
5
|
+
lastSync?: number;
|
|
6
|
+
}
|
|
7
|
+
export declare function loadDaemonConfig(): DaemonConfig;
|
|
8
|
+
export declare function saveDaemonConfig(config: DaemonConfig): void;
|
|
9
|
+
export interface SessionData {
|
|
10
|
+
id: string;
|
|
11
|
+
agent: string;
|
|
12
|
+
version?: string;
|
|
13
|
+
project?: string;
|
|
14
|
+
branch?: string;
|
|
15
|
+
prompt?: string;
|
|
16
|
+
workingDir?: string;
|
|
17
|
+
pid?: number;
|
|
18
|
+
startedAt?: number;
|
|
19
|
+
summary?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface SyncRequest {
|
|
22
|
+
activeSessions: SessionData[];
|
|
23
|
+
completedSessions?: SessionData[];
|
|
24
|
+
machineStats?: {
|
|
25
|
+
cpuUsage?: number;
|
|
26
|
+
memoryUsage?: number;
|
|
27
|
+
agentVersions?: Record<string, string>;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export interface SyncResponse {
|
|
31
|
+
acknowledged: number;
|
|
32
|
+
commands?: Array<{
|
|
33
|
+
type: 'stop_session' | 'start_task';
|
|
34
|
+
sessionId?: string;
|
|
35
|
+
prompt?: string;
|
|
36
|
+
}>;
|
|
37
|
+
}
|
|
38
|
+
export interface RegisterResponse {
|
|
39
|
+
nodeId: string;
|
|
40
|
+
token: string;
|
|
41
|
+
message: string;
|
|
42
|
+
}
|
|
43
|
+
export declare class FactoryClient {
|
|
44
|
+
private endpoint;
|
|
45
|
+
private nodeToken;
|
|
46
|
+
private nodeId?;
|
|
47
|
+
constructor(endpoint: string, nodeToken: string, nodeId?: string);
|
|
48
|
+
register(): Promise<RegisterResponse>;
|
|
49
|
+
sync(nodeId: string, data: SyncRequest): Promise<SyncResponse>;
|
|
50
|
+
healthCheck(): Promise<boolean>;
|
|
51
|
+
}
|
|
52
|
+
export declare function getMachineStats(): {
|
|
53
|
+
cpuUsage?: number;
|
|
54
|
+
memoryUsage?: number;
|
|
55
|
+
};
|
|
56
|
+
export declare function getAgentVersions(): Promise<Record<string, string>>;
|
|
57
|
+
//# sourceMappingURL=factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/lib/factory.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAMD,wBAAgB,gBAAgB,IAAI,YAAY,CAU/C;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAG3D;AAID,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAID,MAAM,WAAW,WAAW;IAC1B,cAAc,EAAE,WAAW,EAAE,CAAC;IAC9B,iBAAiB,CAAC,EAAE,WAAW,EAAE,CAAC;IAClC,YAAY,CAAC,EAAE;QACb,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACxC,CAAC;CACH;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,KAAK,CAAC;QACf,IAAI,EAAE,cAAc,GAAG,YAAY,CAAC;QACpC,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,MAAM,CAAC,CAAS;gBAEZ,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAM1D,QAAQ,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAuBrC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAkB9D,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;CAQtC;AAGD,wBAAgB,eAAe,IAAI;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAS7E;AAGD,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAuBxE"}
|