@swarmify/agents-cli 1.9.2 → 1.10.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/README.md +8 -0
  3. package/dist/commands/cron.d.ts +3 -0
  4. package/dist/commands/cron.d.ts.map +1 -0
  5. package/dist/commands/cron.js +457 -0
  6. package/dist/commands/cron.js.map +1 -0
  7. package/dist/commands/daemon.d.ts.map +1 -1
  8. package/dist/commands/daemon.js +215 -1
  9. package/dist/commands/daemon.js.map +1 -1
  10. package/dist/commands/sessions.d.ts.map +1 -1
  11. package/dist/commands/sessions.js +1 -0
  12. package/dist/commands/sessions.js.map +1 -1
  13. package/dist/commands/view.d.ts.map +1 -1
  14. package/dist/commands/view.js +62 -30
  15. package/dist/commands/view.js.map +1 -1
  16. package/dist/index.js +2 -0
  17. package/dist/index.js.map +1 -1
  18. package/dist/lib/agents.d.ts +10 -0
  19. package/dist/lib/agents.d.ts.map +1 -1
  20. package/dist/lib/agents.js +47 -6
  21. package/dist/lib/agents.js.map +1 -1
  22. package/dist/lib/cron.d.ts +70 -0
  23. package/dist/lib/cron.d.ts.map +1 -0
  24. package/dist/lib/cron.js +325 -0
  25. package/dist/lib/cron.js.map +1 -0
  26. package/dist/lib/factory.d.ts +57 -0
  27. package/dist/lib/factory.d.ts.map +1 -0
  28. package/dist/lib/factory.js +110 -0
  29. package/dist/lib/factory.js.map +1 -0
  30. package/dist/lib/session/discover.d.ts.map +1 -1
  31. package/dist/lib/session/discover.js +134 -2
  32. package/dist/lib/session/discover.js.map +1 -1
  33. package/dist/lib/session/parse.d.ts.map +1 -1
  34. package/dist/lib/session/parse.js +1 -0
  35. package/dist/lib/session/parse.js.map +1 -1
  36. package/dist/lib/session/types.d.ts +1 -1
  37. package/dist/lib/session/types.d.ts.map +1 -1
  38. package/dist/lib/session/types.js +1 -1
  39. package/dist/lib/session/types.js.map +1 -1
  40. package/package.json +1 -1
@@ -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,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"}
@@ -0,0 +1,110 @@
1
+ // Factory Floor API client for daemon reporting
2
+ // Reports local agent sessions to the Factory Floor at agents.427yosemite.com
3
+ import * as fs from 'fs';
4
+ import * as path from 'path';
5
+ import * as os from 'os';
6
+ import { getAgentsDir } from './state.js';
7
+ const CONFIG_FILE = 'daemon.json';
8
+ function getConfigPath() {
9
+ return path.join(getAgentsDir(), CONFIG_FILE);
10
+ }
11
+ export function loadDaemonConfig() {
12
+ const configPath = getConfigPath();
13
+ if (!fs.existsSync(configPath)) {
14
+ return {};
15
+ }
16
+ try {
17
+ return JSON.parse(fs.readFileSync(configPath, 'utf-8'));
18
+ }
19
+ catch {
20
+ return {};
21
+ }
22
+ }
23
+ export function saveDaemonConfig(config) {
24
+ const configPath = getConfigPath();
25
+ fs.writeFileSync(configPath, JSON.stringify(config, null, 2), 'utf-8');
26
+ }
27
+ export class FactoryClient {
28
+ endpoint;
29
+ nodeToken;
30
+ nodeId;
31
+ constructor(endpoint, nodeToken, nodeId) {
32
+ this.endpoint = endpoint.replace(/\/$/, ''); // Remove trailing slash
33
+ this.nodeToken = nodeToken;
34
+ this.nodeId = nodeId;
35
+ }
36
+ async register() {
37
+ const hostname = os.hostname();
38
+ const response = await fetch(`${this.endpoint}/nodes`, {
39
+ method: 'POST',
40
+ headers: {
41
+ 'Content-Type': 'application/json',
42
+ 'Authorization': `Bearer ${this.nodeToken}`,
43
+ },
44
+ body: JSON.stringify({
45
+ name: hostname,
46
+ os: os.platform(),
47
+ arch: os.arch(),
48
+ }),
49
+ });
50
+ if (!response.ok) {
51
+ const body = await response.text();
52
+ throw new Error(`Registration failed: ${response.status} ${body}`);
53
+ }
54
+ return response.json();
55
+ }
56
+ async sync(nodeId, data) {
57
+ const response = await fetch(`${this.endpoint}/nodes/${nodeId}/sync`, {
58
+ method: 'POST',
59
+ headers: {
60
+ 'Content-Type': 'application/json',
61
+ 'Authorization': `Bearer ${this.nodeToken}`,
62
+ },
63
+ body: JSON.stringify(data),
64
+ });
65
+ if (!response.ok) {
66
+ const body = await response.text();
67
+ throw new Error(`Sync failed: ${response.status} ${body}`);
68
+ }
69
+ return response.json();
70
+ }
71
+ async healthCheck() {
72
+ try {
73
+ const response = await fetch(`${this.endpoint}/health`);
74
+ return response.ok;
75
+ }
76
+ catch {
77
+ return false;
78
+ }
79
+ }
80
+ }
81
+ // Get machine stats (CPU and memory usage)
82
+ export function getMachineStats() {
83
+ const totalmem = os.totalmem();
84
+ const freemem = os.freemem();
85
+ const memoryUsage = ((totalmem - freemem) / totalmem) * 100;
86
+ // CPU usage requires sampling over time, so we just return memory for now
87
+ return {
88
+ memoryUsage: Math.round(memoryUsage * 10) / 10,
89
+ };
90
+ }
91
+ // Get installed agent versions (runs in parallel for efficiency)
92
+ export async function getAgentVersions() {
93
+ const { exec } = await import('child_process');
94
+ const { promisify } = await import('util');
95
+ const execAsync = promisify(exec);
96
+ const agents = ['claude', 'codex', 'gemini'];
97
+ const results = await Promise.allSettled(agents.map(async (agent) => {
98
+ const { stdout } = await execAsync(`${agent} --version 2>/dev/null`);
99
+ const match = stdout.trim().match(/(\d+\.\d+\.\d+)/);
100
+ return { agent, version: match?.[1] };
101
+ }));
102
+ const versions = {};
103
+ for (const result of results) {
104
+ if (result.status === 'fulfilled' && result.value.version) {
105
+ versions[result.value.agent] = result.value.version;
106
+ }
107
+ }
108
+ return versions;
109
+ }
110
+ //# sourceMappingURL=factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/lib/factory.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../../src/lib/session/discover.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAQ9D,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CA0CxF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE,CAO1F"}
1
+ {"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../../src/lib/session/discover.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAQ9D,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CA2CxF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE,CAO1F"}