agent-oven 0.1.0 → 0.2.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/CLAUDE.md +63 -66
- package/README.md +59 -43
- package/dist/cli/commands/add.d.ts.map +1 -1
- package/dist/cli/commands/add.js +29 -7
- package/dist/cli/commands/add.js.map +1 -1
- package/dist/cli/commands/daemon.d.ts.map +1 -1
- package/dist/cli/commands/daemon.js +16 -22
- package/dist/cli/commands/daemon.js.map +1 -1
- package/dist/cli/commands/down.d.ts +1 -1
- package/dist/cli/commands/down.d.ts.map +1 -1
- package/dist/cli/commands/down.js +12 -12
- package/dist/cli/commands/down.js.map +1 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +11 -9
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/up.d.ts +1 -1
- package/dist/cli/commands/up.d.ts.map +1 -1
- package/dist/cli/commands/up.js +17 -17
- package/dist/cli/commands/up.js.map +1 -1
- package/dist/cli.js +14 -1
- package/dist/cli.js.map +1 -1
- package/dist/core/auth.d.ts +4 -1
- package/dist/core/auth.d.ts.map +1 -1
- package/dist/core/auth.js +20 -2
- package/dist/core/auth.js.map +1 -1
- package/dist/core/config.d.ts +0 -4
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +0 -6
- package/dist/core/config.js.map +1 -1
- package/dist/core/docker.d.ts +1 -17
- package/dist/core/docker.d.ts.map +1 -1
- package/dist/core/docker.js +148 -119
- package/dist/core/docker.js.map +1 -1
- package/dist/core/index.d.ts +2 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +2 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/jobs.d.ts +1 -0
- package/dist/core/jobs.d.ts.map +1 -1
- package/dist/core/jobs.js +13 -1
- package/dist/core/jobs.js.map +1 -1
- package/dist/core/platform-darwin.d.ts +37 -0
- package/dist/core/platform-darwin.d.ts.map +1 -0
- package/dist/core/platform-darwin.js +236 -0
- package/dist/core/platform-darwin.js.map +1 -0
- package/dist/core/platform-linux.d.ts +37 -0
- package/dist/core/platform-linux.d.ts.map +1 -0
- package/dist/core/platform-linux.js +198 -0
- package/dist/core/platform-linux.js.map +1 -0
- package/dist/core/platform.d.ts +63 -0
- package/dist/core/platform.d.ts.map +1 -0
- package/dist/core/platform.js +31 -0
- package/dist/core/platform.js.map +1 -0
- package/dist/core/scheduler-runner.d.ts.map +1 -1
- package/dist/core/scheduler-runner.js +17 -10
- package/dist/core/scheduler-runner.js.map +1 -1
- package/dist/core/scheduler.d.ts +28 -2
- package/dist/core/scheduler.d.ts.map +1 -1
- package/dist/core/scheduler.js +126 -11
- package/dist/core/scheduler.js.map +1 -1
- package/dist/core/setup.d.ts +7 -32
- package/dist/core/setup.d.ts.map +1 -1
- package/dist/core/setup.js +14 -149
- package/dist/core/setup.js.map +1 -1
- package/dist/core/types.d.ts +17 -4
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/update-check.d.ts +22 -0
- package/dist/core/update-check.d.ts.map +1 -0
- package/dist/core/update-check.js +184 -0
- package/dist/core/update-check.js.map +1 -0
- package/dist/tui/components/Dashboard.d.ts.map +1 -1
- package/dist/tui/components/Dashboard.js +19 -2
- package/dist/tui/components/Dashboard.js.map +1 -1
- package/dist/tui/components/InitWizard.d.ts.map +1 -1
- package/dist/tui/components/InitWizard.js +68 -54
- package/dist/tui/components/InitWizard.js.map +1 -1
- package/dist/tui/components/JobDetail.d.ts.map +1 -1
- package/dist/tui/components/JobDetail.js +1 -1
- package/dist/tui/components/JobDetail.js.map +1 -1
- package/dist/tui/components/JobForm.d.ts.map +1 -1
- package/dist/tui/components/JobForm.js +40 -23
- package/dist/tui/components/JobForm.js.map +1 -1
- package/dist/tui/components/JobList.js +3 -1
- package/dist/tui/components/JobList.js.map +1 -1
- package/images/pipeline-runner/Dockerfile +5 -1
- package/images/pipeline-runner/entrypoint.sh +25 -2
- package/package.json +5 -3
- package/scheduler.sh +7 -2
package/dist/core/setup.js
CHANGED
|
@@ -7,77 +7,9 @@ import * as fs from 'node:fs';
|
|
|
7
7
|
import * as path from 'node:path';
|
|
8
8
|
import * as os from 'node:os';
|
|
9
9
|
import { fileURLToPath } from 'node:url';
|
|
10
|
-
import {
|
|
11
|
-
import { saveConfig
|
|
12
|
-
export {
|
|
13
|
-
/**
|
|
14
|
-
* Check if Homebrew is installed
|
|
15
|
-
*/
|
|
16
|
-
export async function checkHomebrew() {
|
|
17
|
-
try {
|
|
18
|
-
const { stdout } = await execa('brew', ['--version']);
|
|
19
|
-
const version = stdout.split('\n')[0]?.replace('Homebrew ', '').trim();
|
|
20
|
-
return { installed: true, version };
|
|
21
|
-
}
|
|
22
|
-
catch {
|
|
23
|
-
return { installed: false };
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Check if a command-line dependency exists
|
|
28
|
-
*/
|
|
29
|
-
export async function checkDependency(name) {
|
|
30
|
-
try {
|
|
31
|
-
await execa('command', ['-v', name], { shell: true });
|
|
32
|
-
// Try to get version
|
|
33
|
-
let version;
|
|
34
|
-
try {
|
|
35
|
-
const { stdout } = await execa(name, ['--version'], { reject: false });
|
|
36
|
-
version = stdout.split('\n')[0]?.trim();
|
|
37
|
-
}
|
|
38
|
-
catch {
|
|
39
|
-
// Some commands don't have --version
|
|
40
|
-
}
|
|
41
|
-
return { installed: true, version };
|
|
42
|
-
}
|
|
43
|
-
catch {
|
|
44
|
-
return { installed: false };
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Install a package via Homebrew
|
|
49
|
-
*/
|
|
50
|
-
export async function brewInstall(pkg, onOutput) {
|
|
51
|
-
try {
|
|
52
|
-
// Check if already installed
|
|
53
|
-
const check = await execa('brew', ['list', pkg], { reject: false });
|
|
54
|
-
if (check.exitCode === 0) {
|
|
55
|
-
return 'already-installed';
|
|
56
|
-
}
|
|
57
|
-
const proc = execa('brew', ['install', pkg]);
|
|
58
|
-
if (onOutput && proc.stdout) {
|
|
59
|
-
proc.stdout.on('data', (data) => {
|
|
60
|
-
const lines = data.toString().split('\n').filter(Boolean);
|
|
61
|
-
for (const line of lines) {
|
|
62
|
-
onOutput(line);
|
|
63
|
-
}
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
if (onOutput && proc.stderr) {
|
|
67
|
-
proc.stderr.on('data', (data) => {
|
|
68
|
-
const lines = data.toString().split('\n').filter(Boolean);
|
|
69
|
-
for (const line of lines) {
|
|
70
|
-
onOutput(line);
|
|
71
|
-
}
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
await proc;
|
|
75
|
-
return 'installed';
|
|
76
|
-
}
|
|
77
|
-
catch {
|
|
78
|
-
return 'failed';
|
|
79
|
-
}
|
|
80
|
-
}
|
|
10
|
+
import { isDockerAvailable } from './docker.js';
|
|
11
|
+
import { saveConfig } from './config.js';
|
|
12
|
+
export { isDockerAvailable };
|
|
81
13
|
/**
|
|
82
14
|
* Create required directories and files
|
|
83
15
|
*/
|
|
@@ -161,15 +93,16 @@ export function detectTimezone() {
|
|
|
161
93
|
return Intl.DateTimeFormat().resolvedOptions().timeZone;
|
|
162
94
|
}
|
|
163
95
|
/**
|
|
164
|
-
* Resolve the command array for the
|
|
96
|
+
* Resolve the command array for the daemon config (plist/systemd ExecStart).
|
|
165
97
|
*
|
|
166
98
|
* Strategy:
|
|
167
99
|
* 1. Pin to the currently-running CLI process where possible.
|
|
168
100
|
* 2. Fallback to project-local dist/cli.js (for built source checkouts).
|
|
169
101
|
* 3. Fallback to package-local dist/cli.js (for npm global installs).
|
|
170
|
-
* 4.
|
|
102
|
+
* 4. Optional final fallback: legacy scheduler.sh for unbuilt source checkouts.
|
|
171
103
|
*/
|
|
172
|
-
export async function resolveSchedulerCommand(projectDir) {
|
|
104
|
+
export async function resolveSchedulerCommand(projectDir, options) {
|
|
105
|
+
const allowLegacyFallback = options?.allowLegacyFallback ?? true;
|
|
173
106
|
// 1) Pin to the current CLI invocation path when possible.
|
|
174
107
|
const argv1 = process.argv[1];
|
|
175
108
|
if (argv1) {
|
|
@@ -191,85 +124,17 @@ export async function resolveSchedulerCommand(projectDir) {
|
|
|
191
124
|
if (fs.existsSync(packageCliJs)) {
|
|
192
125
|
return [process.execPath, packageCliJs, 'scheduler-tick'];
|
|
193
126
|
}
|
|
194
|
-
// 4)
|
|
127
|
+
// 4) Optional legacy fallback for source checkouts not yet built.
|
|
195
128
|
const legacyScheduler = path.resolve(projectDir, 'scheduler.sh');
|
|
196
|
-
if (fs.existsSync(legacyScheduler)) {
|
|
129
|
+
if (allowLegacyFallback && fs.existsSync(legacyScheduler)) {
|
|
197
130
|
return [legacyScheduler];
|
|
198
131
|
}
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
.replace(/&/g, '&')
|
|
204
|
-
.replace(/</g, '<')
|
|
205
|
-
.replace(/>/g, '>');
|
|
206
|
-
}
|
|
207
|
-
/**
|
|
208
|
-
* Generate launchd plist XML content
|
|
209
|
-
*/
|
|
210
|
-
export async function generatePlistContent(projectDir) {
|
|
211
|
-
const cmdArgs = await resolveSchedulerCommand(projectDir);
|
|
212
|
-
const programArgs = cmdArgs
|
|
213
|
-
.map((arg) => ` <string>${escapePlistString(arg)}</string>`)
|
|
214
|
-
.join('\n');
|
|
215
|
-
const schedulerLogPath = escapePlistString(path.join(projectDir, 'logs', 'scheduler.log'));
|
|
216
|
-
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
217
|
-
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
218
|
-
<plist version="1.0">
|
|
219
|
-
<dict>
|
|
220
|
-
<key>Label</key>
|
|
221
|
-
<string>com.agent-oven.scheduler</string>
|
|
222
|
-
|
|
223
|
-
<key>ProgramArguments</key>
|
|
224
|
-
<array>
|
|
225
|
-
${programArgs}
|
|
226
|
-
</array>
|
|
227
|
-
|
|
228
|
-
<key>StartInterval</key>
|
|
229
|
-
<integer>60</integer>
|
|
230
|
-
|
|
231
|
-
<key>RunAtLoad</key>
|
|
232
|
-
<true/>
|
|
233
|
-
|
|
234
|
-
<key>StandardOutPath</key>
|
|
235
|
-
<string>${schedulerLogPath}</string>
|
|
236
|
-
|
|
237
|
-
<key>StandardErrorPath</key>
|
|
238
|
-
<string>${schedulerLogPath}</string>
|
|
239
|
-
|
|
240
|
-
<key>EnvironmentVariables</key>
|
|
241
|
-
<dict>
|
|
242
|
-
<key>PATH</key>
|
|
243
|
-
<string>/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
|
|
244
|
-
</dict>
|
|
245
|
-
</dict>
|
|
246
|
-
</plist>
|
|
247
|
-
`;
|
|
248
|
-
}
|
|
249
|
-
/**
|
|
250
|
-
* Install the launchd agent
|
|
251
|
-
*/
|
|
252
|
-
export async function installLaunchd(projectDir) {
|
|
253
|
-
const plistPath = getLaunchdPlistPath();
|
|
254
|
-
const plistDir = path.dirname(plistPath);
|
|
255
|
-
try {
|
|
256
|
-
// Ensure LaunchAgents directory exists
|
|
257
|
-
if (!fs.existsSync(plistDir)) {
|
|
258
|
-
fs.mkdirSync(plistDir, { recursive: true });
|
|
259
|
-
}
|
|
260
|
-
// Write plist
|
|
261
|
-
const content = await generatePlistContent(projectDir);
|
|
262
|
-
fs.writeFileSync(plistPath, content);
|
|
263
|
-
// Unload if already loaded (ignore errors)
|
|
264
|
-
await execa('launchctl', ['unload', plistPath], { reject: false });
|
|
265
|
-
// Load the agent
|
|
266
|
-
await execa('launchctl', ['load', plistPath]);
|
|
267
|
-
return { success: true };
|
|
268
|
-
}
|
|
269
|
-
catch (err) {
|
|
270
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
271
|
-
return { success: false, error: message };
|
|
132
|
+
const lookedFor = `${projectCliJs}, ${packageCliJs}, and ${legacyScheduler}`;
|
|
133
|
+
if (!allowLegacyFallback) {
|
|
134
|
+
throw new Error(`Unable to resolve scheduler command for this platform. Looked for ${lookedFor}. ` +
|
|
135
|
+
'Build the project first so dist/cli.js exists (for example: npm run build).');
|
|
272
136
|
}
|
|
137
|
+
throw new Error(`Unable to resolve scheduler command. Looked for ${lookedFor}.`);
|
|
273
138
|
}
|
|
274
139
|
/**
|
|
275
140
|
* Verify Docker is available and get version
|
package/dist/core/setup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/core/setup.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/core/setup.ts"],"names":[],"mappings":"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"}
|
package/dist/core/types.d.ts
CHANGED
|
@@ -13,7 +13,17 @@ export interface OneTimeSchedule {
|
|
|
13
13
|
/** ISO 8601 datetime string (YYYY-MM-DDTHH:MM:SS) */
|
|
14
14
|
datetime: string;
|
|
15
15
|
}
|
|
16
|
-
|
|
16
|
+
/** Random-window schedule - runs once per day at a random time within a window */
|
|
17
|
+
export interface RandomWindowSchedule {
|
|
18
|
+
type: 'random-window';
|
|
19
|
+
/** Window start time in HH:MM 24-hour format */
|
|
20
|
+
start: string;
|
|
21
|
+
/** Window end time in HH:MM 24-hour format */
|
|
22
|
+
end: string;
|
|
23
|
+
/** Days of week using cron weekday syntax (0=Sun..6=Sat, 7=Sun), defaults to '*' */
|
|
24
|
+
days?: string;
|
|
25
|
+
}
|
|
26
|
+
export type Schedule = CronSchedule | OneTimeSchedule | RandomWindowSchedule;
|
|
17
27
|
/** Environment variables for a job */
|
|
18
28
|
export type EnvVars = Record<string, string>;
|
|
19
29
|
/** Auth mode for pipeline jobs */
|
|
@@ -127,13 +137,15 @@ export interface Config {
|
|
|
127
137
|
/** Auth configuration for pipeline jobs */
|
|
128
138
|
auth?: AuthConfig;
|
|
129
139
|
}
|
|
130
|
-
/** Status of Colima
|
|
131
|
-
export interface
|
|
140
|
+
/** Status of the container runtime (Colima on macOS, native Docker on Linux) */
|
|
141
|
+
export interface RuntimeStatus {
|
|
132
142
|
running: boolean;
|
|
133
143
|
cpu?: number;
|
|
134
144
|
memory?: number;
|
|
135
145
|
disk?: number;
|
|
136
146
|
}
|
|
147
|
+
/** @deprecated Use RuntimeStatus instead */
|
|
148
|
+
export type ColimaStatus = RuntimeStatus;
|
|
137
149
|
/** Status of the scheduler daemon */
|
|
138
150
|
export interface SchedulerStatus {
|
|
139
151
|
loaded: boolean;
|
|
@@ -162,13 +174,14 @@ export interface JobRunResult {
|
|
|
162
174
|
}
|
|
163
175
|
/** Overall system status */
|
|
164
176
|
export interface SystemStatus {
|
|
165
|
-
|
|
177
|
+
runtime: RuntimeStatus;
|
|
166
178
|
scheduler: SchedulerStatus;
|
|
167
179
|
jobs: {
|
|
168
180
|
total: number;
|
|
169
181
|
enabled: number;
|
|
170
182
|
cron: number;
|
|
171
183
|
oncePending: number;
|
|
184
|
+
randomWindow: number;
|
|
172
185
|
};
|
|
173
186
|
runningContainers: RunningContainer[];
|
|
174
187
|
recentExecutions: JobLogEntry[];
|
package/dist/core/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,mDAAmD;AACnD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC;CACd;AAED,2DAA2D;AAC3D,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,QAAQ,GAAG,YAAY,GAAG,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
|
package/dist/core/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AA8GH,iCAAiC;AACjC,MAAM,UAAU,WAAW,CAAC,GAAQ;IAClC,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC;AAC/B,CAAC;AAED,mCAAmC;AACnC,MAAM,UAAU,aAAa,CAAC,GAAQ;IACpC,OAAO,GAAG,CAAC,IAAI,KAAK,gBAAgB,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight update checker for agent-oven.
|
|
3
|
+
*
|
|
4
|
+
* Hits the npm registry at most once per 24 hours, caches the result
|
|
5
|
+
* to ~/.config/agent-oven/update-check.json, and never throws.
|
|
6
|
+
*/
|
|
7
|
+
export interface UpdateInfo {
|
|
8
|
+
currentVersion: string;
|
|
9
|
+
latestVersion: string;
|
|
10
|
+
updateAvailable: boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Check for an available update. Uses a 24-hour cache to avoid
|
|
14
|
+
* hitting the registry on every invocation. Never throws.
|
|
15
|
+
*/
|
|
16
|
+
export declare function checkForUpdate(): Promise<UpdateInfo | null>;
|
|
17
|
+
/**
|
|
18
|
+
* Synchronously read cached update info (for TUI use without async).
|
|
19
|
+
* Returns null if no cache exists or on any error.
|
|
20
|
+
*/
|
|
21
|
+
export declare function getCachedUpdateInfo(): UpdateInfo | null;
|
|
22
|
+
//# sourceMappingURL=update-check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-check.d.ts","sourceRoot":"","sources":["../../src/core/update-check.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,MAAM,WAAW,UAAU;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;CAC1B;AA6ID;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CA2BjE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,UAAU,GAAG,IAAI,CAQvD"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight update checker for agent-oven.
|
|
3
|
+
*
|
|
4
|
+
* Hits the npm registry at most once per 24 hours, caches the result
|
|
5
|
+
* to ~/.config/agent-oven/update-check.json, and never throws.
|
|
6
|
+
*/
|
|
7
|
+
import * as fs from 'node:fs';
|
|
8
|
+
import * as path from 'node:path';
|
|
9
|
+
import * as os from 'node:os';
|
|
10
|
+
import { createRequire } from 'node:module';
|
|
11
|
+
const CACHE_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours
|
|
12
|
+
const REGISTRY_URL = 'https://registry.npmjs.org/agent-oven/latest';
|
|
13
|
+
const FETCH_TIMEOUT_MS = 5000;
|
|
14
|
+
function getCacheDir() {
|
|
15
|
+
const xdgConfig = process.env.XDG_CONFIG_HOME;
|
|
16
|
+
if (xdgConfig) {
|
|
17
|
+
return path.join(xdgConfig, 'agent-oven');
|
|
18
|
+
}
|
|
19
|
+
return path.join(os.homedir(), '.config', 'agent-oven');
|
|
20
|
+
}
|
|
21
|
+
function getCachePath() {
|
|
22
|
+
return path.join(getCacheDir(), 'update-check.json');
|
|
23
|
+
}
|
|
24
|
+
function getCurrentVersion() {
|
|
25
|
+
try {
|
|
26
|
+
const require = createRequire(import.meta.url);
|
|
27
|
+
const { version } = require('../../package.json');
|
|
28
|
+
return version;
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return '0.0.0';
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function readCache() {
|
|
35
|
+
try {
|
|
36
|
+
const raw = fs.readFileSync(getCachePath(), 'utf-8');
|
|
37
|
+
return JSON.parse(raw);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function writeCache(latestVersion) {
|
|
44
|
+
try {
|
|
45
|
+
const dir = getCacheDir();
|
|
46
|
+
if (!fs.existsSync(dir)) {
|
|
47
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
48
|
+
}
|
|
49
|
+
const data = {
|
|
50
|
+
lastChecked: new Date().toISOString(),
|
|
51
|
+
latestVersion,
|
|
52
|
+
};
|
|
53
|
+
fs.writeFileSync(getCachePath(), JSON.stringify(data, null, 2) + '\n');
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
// Silently ignore write errors
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function isCacheFresh(cache) {
|
|
60
|
+
try {
|
|
61
|
+
const lastChecked = new Date(cache.lastChecked).getTime();
|
|
62
|
+
return Date.now() - lastChecked < CACHE_TTL_MS;
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function parseSemver(version) {
|
|
69
|
+
const normalized = version.trim().replace(/^v/, '');
|
|
70
|
+
const match = normalized.match(/^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z-.]+))?(?:\+[0-9A-Za-z-.]+)?$/);
|
|
71
|
+
if (!match)
|
|
72
|
+
return null;
|
|
73
|
+
const prerelease = match[4] ? match[4].split('.') : [];
|
|
74
|
+
return {
|
|
75
|
+
major: Number(match[1]),
|
|
76
|
+
minor: Number(match[2]),
|
|
77
|
+
patch: Number(match[3]),
|
|
78
|
+
prerelease,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
function comparePrereleaseIdentifier(a, b) {
|
|
82
|
+
const aNumeric = /^\d+$/.test(a);
|
|
83
|
+
const bNumeric = /^\d+$/.test(b);
|
|
84
|
+
if (aNumeric && bNumeric) {
|
|
85
|
+
const aNum = Number(a);
|
|
86
|
+
const bNum = Number(b);
|
|
87
|
+
return aNum === bNum ? 0 : aNum > bNum ? 1 : -1;
|
|
88
|
+
}
|
|
89
|
+
if (aNumeric && !bNumeric)
|
|
90
|
+
return -1;
|
|
91
|
+
if (!aNumeric && bNumeric)
|
|
92
|
+
return 1;
|
|
93
|
+
return a === b ? 0 : a > b ? 1 : -1;
|
|
94
|
+
}
|
|
95
|
+
function compareSemver(a, b) {
|
|
96
|
+
const parsedA = parseSemver(a);
|
|
97
|
+
const parsedB = parseSemver(b);
|
|
98
|
+
if (!parsedA || !parsedB)
|
|
99
|
+
return null;
|
|
100
|
+
if (parsedA.major !== parsedB.major)
|
|
101
|
+
return parsedA.major > parsedB.major ? 1 : -1;
|
|
102
|
+
if (parsedA.minor !== parsedB.minor)
|
|
103
|
+
return parsedA.minor > parsedB.minor ? 1 : -1;
|
|
104
|
+
if (parsedA.patch !== parsedB.patch)
|
|
105
|
+
return parsedA.patch > parsedB.patch ? 1 : -1;
|
|
106
|
+
const aPre = parsedA.prerelease;
|
|
107
|
+
const bPre = parsedB.prerelease;
|
|
108
|
+
if (aPre.length === 0 && bPre.length === 0)
|
|
109
|
+
return 0;
|
|
110
|
+
if (aPre.length === 0)
|
|
111
|
+
return 1;
|
|
112
|
+
if (bPre.length === 0)
|
|
113
|
+
return -1;
|
|
114
|
+
const maxLen = Math.max(aPre.length, bPre.length);
|
|
115
|
+
for (let i = 0; i < maxLen; i += 1) {
|
|
116
|
+
const aId = aPre[i];
|
|
117
|
+
const bId = bPre[i];
|
|
118
|
+
if (aId === undefined)
|
|
119
|
+
return -1;
|
|
120
|
+
if (bId === undefined)
|
|
121
|
+
return 1;
|
|
122
|
+
const comparison = comparePrereleaseIdentifier(aId, bId);
|
|
123
|
+
if (comparison !== 0)
|
|
124
|
+
return comparison;
|
|
125
|
+
}
|
|
126
|
+
return 0;
|
|
127
|
+
}
|
|
128
|
+
function buildUpdateInfo(latestVersion) {
|
|
129
|
+
const currentVersion = getCurrentVersion();
|
|
130
|
+
const comparison = compareSemver(latestVersion, currentVersion);
|
|
131
|
+
return {
|
|
132
|
+
currentVersion,
|
|
133
|
+
latestVersion,
|
|
134
|
+
updateAvailable: comparison === null ? false : comparison > 0,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Check for an available update. Uses a 24-hour cache to avoid
|
|
139
|
+
* hitting the registry on every invocation. Never throws.
|
|
140
|
+
*/
|
|
141
|
+
export async function checkForUpdate() {
|
|
142
|
+
try {
|
|
143
|
+
const cache = readCache();
|
|
144
|
+
if (cache && isCacheFresh(cache)) {
|
|
145
|
+
return buildUpdateInfo(cache.latestVersion);
|
|
146
|
+
}
|
|
147
|
+
const controller = new AbortController();
|
|
148
|
+
const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
|
|
149
|
+
timer.unref?.();
|
|
150
|
+
try {
|
|
151
|
+
const res = await fetch(REGISTRY_URL, { signal: controller.signal });
|
|
152
|
+
if (!res.ok)
|
|
153
|
+
return null;
|
|
154
|
+
const data = (await res.json());
|
|
155
|
+
const latestVersion = data.version;
|
|
156
|
+
if (!latestVersion)
|
|
157
|
+
return null;
|
|
158
|
+
writeCache(latestVersion);
|
|
159
|
+
return buildUpdateInfo(latestVersion);
|
|
160
|
+
}
|
|
161
|
+
finally {
|
|
162
|
+
clearTimeout(timer);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
return null;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Synchronously read cached update info (for TUI use without async).
|
|
171
|
+
* Returns null if no cache exists or on any error.
|
|
172
|
+
*/
|
|
173
|
+
export function getCachedUpdateInfo() {
|
|
174
|
+
try {
|
|
175
|
+
const cache = readCache();
|
|
176
|
+
if (!cache)
|
|
177
|
+
return null;
|
|
178
|
+
return buildUpdateInfo(cache.latestVersion);
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=update-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-check.js","sourceRoot":"","sources":["../../src/core/update-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Dashboard.d.ts","sourceRoot":"","sources":["../../../src/tui/components/Dashboard.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAgB,MAAM,qBAAqB,CAAC;AAChE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"Dashboard.d.ts","sourceRoot":"","sources":["../../../src/tui/components/Dashboard.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAgB,MAAM,qBAAqB,CAAC;AAChE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAO1C,UAAU,cAAc;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC;AAED,wBAAgB,SAAS,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,cAAc,2CA0I/D"}
|
|
@@ -4,29 +4,46 @@ import { Box, Text } from 'ink';
|
|
|
4
4
|
import Spinner from 'ink-spinner';
|
|
5
5
|
import { getSystemStatus } from '../../core/docker.js';
|
|
6
6
|
import { formatRelativeTime } from '../../core/scheduler.js';
|
|
7
|
+
import { platform } from '../../core/platform.js';
|
|
8
|
+
import { checkForUpdate } from '../../core/update-check.js';
|
|
7
9
|
export function Dashboard({ config, onNavigate }) {
|
|
8
10
|
const [status, setStatus] = useState(null);
|
|
9
11
|
const [loading, setLoading] = useState(true);
|
|
10
12
|
const [error, setError] = useState(null);
|
|
13
|
+
const [updateInfo, setUpdateInfo] = useState(null);
|
|
11
14
|
// Load status on mount
|
|
12
15
|
useEffect(() => {
|
|
16
|
+
let isMounted = true;
|
|
13
17
|
const loadStatus = async () => {
|
|
14
18
|
try {
|
|
15
19
|
const s = await getSystemStatus(config);
|
|
20
|
+
if (!isMounted)
|
|
21
|
+
return;
|
|
16
22
|
setStatus(s);
|
|
17
23
|
setError(null);
|
|
18
24
|
}
|
|
19
25
|
catch (err) {
|
|
26
|
+
if (!isMounted)
|
|
27
|
+
return;
|
|
20
28
|
setError(err instanceof Error ? err.message : 'Failed to load status');
|
|
21
29
|
}
|
|
22
30
|
finally {
|
|
31
|
+
if (!isMounted)
|
|
32
|
+
return;
|
|
23
33
|
setLoading(false);
|
|
24
34
|
}
|
|
25
35
|
};
|
|
26
36
|
loadStatus();
|
|
37
|
+
checkForUpdate().then((info) => {
|
|
38
|
+
if (isMounted && info?.updateAvailable)
|
|
39
|
+
setUpdateInfo(info);
|
|
40
|
+
});
|
|
27
41
|
// Refresh every 10 seconds
|
|
28
42
|
const interval = setInterval(loadStatus, 10000);
|
|
29
|
-
return () =>
|
|
43
|
+
return () => {
|
|
44
|
+
isMounted = false;
|
|
45
|
+
clearInterval(interval);
|
|
46
|
+
};
|
|
30
47
|
}, [config]);
|
|
31
48
|
if (loading && !status) {
|
|
32
49
|
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Header, {}), _jsxs(Box, { marginTop: 1, children: [_jsx(Text, { color: "cyan", children: _jsx(Spinner, { type: "dots" }) }), _jsx(Text, { children: " Loading status..." })] })] }));
|
|
@@ -34,7 +51,7 @@ export function Dashboard({ config, onNavigate }) {
|
|
|
34
51
|
if (error && !status) {
|
|
35
52
|
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Header, {}), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { color: "red", children: ["Error: ", error] }) }), _jsx(Shortcuts, {})] }));
|
|
36
53
|
}
|
|
37
|
-
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Header, {}), _jsxs(Box, { marginTop: 1, children: [_jsx(Text, { bold: true, children: "Status: " }), _jsx(StatusIndicator, { running: status?.
|
|
54
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Header, {}), updateInfo && (_jsx(Box, { marginTop: 1, children: _jsxs(Text, { color: "yellow", children: ["Update available: ", updateInfo.currentVersion, " \u2192 ", updateInfo.latestVersion, ". Run \"npm i -g agent-oven\" to update."] }) })), _jsxs(Box, { marginTop: 1, children: [_jsx(Text, { bold: true, children: "Status: " }), _jsx(StatusIndicator, { running: status?.runtime.running ?? false, label: platform.needsVM ? 'Colima' : 'Docker' }), _jsx(Text, { children: " " }), _jsx(StatusIndicator, { running: status?.scheduler.loaded ?? false, label: "Scheduler" })] }), _jsxs(Box, { marginTop: 1, children: [_jsx(Text, { bold: true, children: "Jobs: " }), _jsxs(Text, { children: [status?.jobs.total ?? 0, " total"] }), _jsx(Text, { dimColor: true, children: " | " }), _jsxs(Text, { children: [status?.jobs.cron ?? 0, " cron"] }), _jsx(Text, { dimColor: true, children: " | " }), _jsxs(Text, { children: [status?.jobs.randomWindow ?? 0, " random-window"] }), _jsx(Text, { dimColor: true, children: " | " }), _jsxs(Text, { children: [status?.jobs.oncePending ?? 0, " pending one-time"] })] }), _jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Text, { bold: true, underline: true, children: "Running Jobs" }), _jsx(Box, { borderStyle: "single", flexDirection: "column", paddingX: 1, children: (!status?.runningContainers || status.runningContainers.length === 0) ? (_jsx(Text, { dimColor: true, children: "No running jobs" })) : (status.runningContainers.map((container) => (_jsxs(Box, { children: [_jsx(Text, { color: "cyan", children: '◐ ' }), _jsx(Text, { children: (container.jobId || container.name).padEnd(20) }), _jsx(Text, { dimColor: true, children: container.image }), _jsxs(Text, { dimColor: true, children: [" ", container.status] })] }, container.name)))) })] }), _jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Text, { bold: true, underline: true, children: "Recent Runs" }), _jsx(Box, { borderStyle: "single", flexDirection: "column", paddingX: 1, children: (!status?.recentExecutions || status.recentExecutions.length === 0) ? (_jsx(Text, { dimColor: true, children: "No recent executions" })) : (status.recentExecutions.slice(0, 5).map((exec) => (_jsx(RecentExecution, { execution: exec }, `${exec.jobId}-${exec.timestamp}`)))) })] }), _jsx(Shortcuts, {})] }));
|
|
38
55
|
}
|
|
39
56
|
function Header() {
|
|
40
57
|
return (_jsxs(Box, { children: [_jsx(Text, { bold: true, color: "magenta", children: "Agent Oven" }), _jsx(Text, { dimColor: true, children: " - Job Scheduler" })] }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Dashboard.js","sourceRoot":"","sources":["../../../src/tui/components/Dashboard.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,OAAO,MAAM,aAAa,CAAC;AAGlC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"Dashboard.js","sourceRoot":"","sources":["../../../src/tui/components/Dashboard.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InitWizard.d.ts","sourceRoot":"","sources":["../../../src/tui/components/InitWizard.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"InitWizard.d.ts","sourceRoot":"","sources":["../../../src/tui/components/InitWizard.tsx"],"names":[],"mappings":"AAwCA,wBAAgB,UAAU,4CA2jBzB"}
|