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
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* macOS (Darwin) platform adapter.
|
|
3
|
+
*
|
|
4
|
+
* Daemon: launchd plist
|
|
5
|
+
* Runtime: Colima (Docker VM for macOS)
|
|
6
|
+
* Packages: Homebrew
|
|
7
|
+
*/
|
|
8
|
+
import { execa } from 'execa';
|
|
9
|
+
import * as fs from 'node:fs';
|
|
10
|
+
import * as path from 'node:path';
|
|
11
|
+
import * as os from 'node:os';
|
|
12
|
+
import { resolveSchedulerCommand } from './setup.js';
|
|
13
|
+
// ── Helpers ────────────────────────────────────────────────────
|
|
14
|
+
function escapePlistString(value) {
|
|
15
|
+
return value
|
|
16
|
+
.replace(/&/g, '&')
|
|
17
|
+
.replace(/</g, '<')
|
|
18
|
+
.replace(/>/g, '>');
|
|
19
|
+
}
|
|
20
|
+
// ── Adapter ────────────────────────────────────────────────────
|
|
21
|
+
export class DarwinAdapter {
|
|
22
|
+
// ── Daemon ──────────────────────────────────────────────────
|
|
23
|
+
getDaemonConfigPath() {
|
|
24
|
+
return path.join(os.homedir(), 'Library', 'LaunchAgents', 'com.agent-oven.scheduler.plist');
|
|
25
|
+
}
|
|
26
|
+
daemonConfigExists() {
|
|
27
|
+
return fs.existsSync(this.getDaemonConfigPath());
|
|
28
|
+
}
|
|
29
|
+
async getSchedulerStatus() {
|
|
30
|
+
try {
|
|
31
|
+
const { stdout } = await execa('launchctl', ['list'], { reject: false });
|
|
32
|
+
const loaded = stdout.includes('com.agent-oven.scheduler');
|
|
33
|
+
if (!loaded) {
|
|
34
|
+
return { loaded: false };
|
|
35
|
+
}
|
|
36
|
+
try {
|
|
37
|
+
const { stdout: detailOutput } = await execa('launchctl', ['list', 'com.agent-oven.scheduler'], { reject: false });
|
|
38
|
+
const exitMatch = detailOutput.match(/LastExitStatus\s*=\s*(\d+)/);
|
|
39
|
+
return {
|
|
40
|
+
loaded: true,
|
|
41
|
+
lastExitStatus: exitMatch ? parseInt(exitMatch[1], 10) : undefined,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return { loaded: true };
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return { loaded: false };
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
async installDaemon(projectDir) {
|
|
53
|
+
const plistPath = this.getDaemonConfigPath();
|
|
54
|
+
const plistDir = path.dirname(plistPath);
|
|
55
|
+
try {
|
|
56
|
+
if (!fs.existsSync(plistDir)) {
|
|
57
|
+
fs.mkdirSync(plistDir, { recursive: true });
|
|
58
|
+
}
|
|
59
|
+
const content = await this.generateDaemonConfig(projectDir);
|
|
60
|
+
fs.writeFileSync(plistPath, content);
|
|
61
|
+
// Unload if already loaded (ignore errors)
|
|
62
|
+
await execa('launchctl', ['unload', plistPath], { reject: false });
|
|
63
|
+
// Load the agent
|
|
64
|
+
await execa('launchctl', ['load', plistPath]);
|
|
65
|
+
return { success: true };
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
69
|
+
return { success: false, error: message };
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
async startDaemon() {
|
|
73
|
+
const plistPath = this.getDaemonConfigPath();
|
|
74
|
+
await execa('launchctl', ['load', plistPath]);
|
|
75
|
+
}
|
|
76
|
+
async stopDaemon() {
|
|
77
|
+
const plistPath = this.getDaemonConfigPath();
|
|
78
|
+
await execa('launchctl', ['unload', plistPath]);
|
|
79
|
+
}
|
|
80
|
+
async generateDaemonConfig(projectDir) {
|
|
81
|
+
const cmdArgs = await resolveSchedulerCommand(projectDir);
|
|
82
|
+
const programArgs = cmdArgs
|
|
83
|
+
.map((arg) => ` <string>${escapePlistString(arg)}</string>`)
|
|
84
|
+
.join('\n');
|
|
85
|
+
const schedulerLogPath = escapePlistString(path.join(projectDir, 'logs', 'scheduler.log'));
|
|
86
|
+
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
87
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
88
|
+
<plist version="1.0">
|
|
89
|
+
<dict>
|
|
90
|
+
<key>Label</key>
|
|
91
|
+
<string>com.agent-oven.scheduler</string>
|
|
92
|
+
|
|
93
|
+
<key>ProgramArguments</key>
|
|
94
|
+
<array>
|
|
95
|
+
${programArgs}
|
|
96
|
+
</array>
|
|
97
|
+
|
|
98
|
+
<key>StartInterval</key>
|
|
99
|
+
<integer>60</integer>
|
|
100
|
+
|
|
101
|
+
<key>RunAtLoad</key>
|
|
102
|
+
<true/>
|
|
103
|
+
|
|
104
|
+
<key>StandardOutPath</key>
|
|
105
|
+
<string>${schedulerLogPath}</string>
|
|
106
|
+
|
|
107
|
+
<key>StandardErrorPath</key>
|
|
108
|
+
<string>${schedulerLogPath}</string>
|
|
109
|
+
|
|
110
|
+
<key>EnvironmentVariables</key>
|
|
111
|
+
<dict>
|
|
112
|
+
<key>PATH</key>
|
|
113
|
+
<string>/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
|
|
114
|
+
<key>HOME</key>
|
|
115
|
+
<string>${escapePlistString(os.homedir())}</string>
|
|
116
|
+
</dict>
|
|
117
|
+
</dict>
|
|
118
|
+
</plist>
|
|
119
|
+
`;
|
|
120
|
+
}
|
|
121
|
+
// ── Runtime (Colima) ────────────────────────────────────────
|
|
122
|
+
async getRuntimeStatus() {
|
|
123
|
+
try {
|
|
124
|
+
const { stdout, stderr } = await execa('colima', ['status'], { reject: false });
|
|
125
|
+
const output = stdout + '\n' + stderr;
|
|
126
|
+
const running = output.includes('Running') || output.includes('is running');
|
|
127
|
+
if (!running) {
|
|
128
|
+
return { running: false };
|
|
129
|
+
}
|
|
130
|
+
// colima list --json provides structured resource info;
|
|
131
|
+
// colima status only outputs log-style lines without CPU/memory/disk fields.
|
|
132
|
+
let cpu;
|
|
133
|
+
let memory;
|
|
134
|
+
let disk;
|
|
135
|
+
try {
|
|
136
|
+
const { stdout: jsonOut } = await execa('colima', ['list', '--json'], { reject: false });
|
|
137
|
+
if (jsonOut) {
|
|
138
|
+
const info = JSON.parse(jsonOut);
|
|
139
|
+
cpu = info.cpu ?? undefined;
|
|
140
|
+
memory = info.memory ? Math.round(info.memory / (1024 * 1024 * 1024)) : undefined;
|
|
141
|
+
disk = info.disk ? Math.round(info.disk / (1024 * 1024 * 1024)) : undefined;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
// Resource info is informational only — not critical
|
|
146
|
+
}
|
|
147
|
+
return { running: true, cpu, memory, disk };
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
return { running: false };
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
async ensureRuntime(config) {
|
|
154
|
+
const status = await this.getRuntimeStatus();
|
|
155
|
+
if (status.running)
|
|
156
|
+
return;
|
|
157
|
+
await this.startRuntime(config);
|
|
158
|
+
}
|
|
159
|
+
async startRuntime(config) {
|
|
160
|
+
const { cpu, memory, disk } = config.colima;
|
|
161
|
+
await execa('colima', [
|
|
162
|
+
'start',
|
|
163
|
+
'--cpu', cpu.toString(),
|
|
164
|
+
'--memory', memory.toString(),
|
|
165
|
+
'--disk', disk.toString(),
|
|
166
|
+
]);
|
|
167
|
+
}
|
|
168
|
+
async stopRuntime() {
|
|
169
|
+
await execa('colima', ['stop']);
|
|
170
|
+
}
|
|
171
|
+
get needsVM() {
|
|
172
|
+
return true;
|
|
173
|
+
}
|
|
174
|
+
// ── Packages (Homebrew) ─────────────────────────────────────
|
|
175
|
+
async checkPackageManager() {
|
|
176
|
+
try {
|
|
177
|
+
const { stdout } = await execa('brew', ['--version']);
|
|
178
|
+
const version = stdout.split('\n')[0]?.replace('Homebrew ', '').trim();
|
|
179
|
+
return { available: true, version };
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
return { available: false };
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
async installPackage(pkg, onOutput) {
|
|
186
|
+
try {
|
|
187
|
+
const check = await execa('brew', ['list', pkg], { reject: false });
|
|
188
|
+
if (check.exitCode === 0) {
|
|
189
|
+
return 'already-installed';
|
|
190
|
+
}
|
|
191
|
+
const proc = execa('brew', ['install', pkg]);
|
|
192
|
+
if (onOutput && proc.stdout) {
|
|
193
|
+
proc.stdout.on('data', (data) => {
|
|
194
|
+
const lines = data.toString().split('\n').filter(Boolean);
|
|
195
|
+
for (const line of lines) {
|
|
196
|
+
onOutput(line);
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
if (onOutput && proc.stderr) {
|
|
201
|
+
proc.stderr.on('data', (data) => {
|
|
202
|
+
const lines = data.toString().split('\n').filter(Boolean);
|
|
203
|
+
for (const line of lines) {
|
|
204
|
+
onOutput(line);
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
await proc;
|
|
209
|
+
return 'installed';
|
|
210
|
+
}
|
|
211
|
+
catch {
|
|
212
|
+
return 'failed';
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
async checkDependency(name) {
|
|
216
|
+
try {
|
|
217
|
+
await execa('command', ['-v', name], { shell: true });
|
|
218
|
+
let version;
|
|
219
|
+
try {
|
|
220
|
+
const { stdout } = await execa(name, ['--version'], { reject: false });
|
|
221
|
+
version = stdout.split('\n')[0]?.trim();
|
|
222
|
+
}
|
|
223
|
+
catch {
|
|
224
|
+
// Some commands don't have --version
|
|
225
|
+
}
|
|
226
|
+
return { installed: true, version };
|
|
227
|
+
}
|
|
228
|
+
catch {
|
|
229
|
+
return { installed: false };
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
get prerequisites() {
|
|
233
|
+
return ['colima', 'docker', 'jq'];
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=platform-darwin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform-darwin.js","sourceRoot":"","sources":["../../src/core/platform-darwin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Linux platform adapter.
|
|
3
|
+
*
|
|
4
|
+
* Daemon: systemd user service + timer
|
|
5
|
+
* Runtime: Native Docker (no VM needed)
|
|
6
|
+
* Packages: No package manager integration (user pre-installs Docker)
|
|
7
|
+
*/
|
|
8
|
+
import type { PlatformAdapter } from './platform.js';
|
|
9
|
+
import type { Config, RuntimeStatus, SchedulerStatus } from './types.js';
|
|
10
|
+
export declare class LinuxAdapter implements PlatformAdapter {
|
|
11
|
+
getDaemonConfigPath(): string;
|
|
12
|
+
daemonConfigExists(): boolean;
|
|
13
|
+
getSchedulerStatus(): Promise<SchedulerStatus>;
|
|
14
|
+
installDaemon(projectDir: string): Promise<{
|
|
15
|
+
success: boolean;
|
|
16
|
+
error?: string;
|
|
17
|
+
}>;
|
|
18
|
+
startDaemon(): Promise<void>;
|
|
19
|
+
stopDaemon(): Promise<void>;
|
|
20
|
+
generateDaemonConfig(projectDir: string): Promise<string>;
|
|
21
|
+
getRuntimeStatus(): Promise<RuntimeStatus>;
|
|
22
|
+
ensureRuntime(_config: Config): Promise<void>;
|
|
23
|
+
startRuntime(_config: Config): Promise<void>;
|
|
24
|
+
stopRuntime(): Promise<void>;
|
|
25
|
+
get needsVM(): boolean;
|
|
26
|
+
checkPackageManager(): Promise<{
|
|
27
|
+
available: boolean;
|
|
28
|
+
version?: string;
|
|
29
|
+
}>;
|
|
30
|
+
installPackage(_pkg: string, _onOutput?: (line: string) => void): Promise<'installed' | 'already-installed' | 'failed'>;
|
|
31
|
+
checkDependency(name: string): Promise<{
|
|
32
|
+
installed: boolean;
|
|
33
|
+
version?: string;
|
|
34
|
+
}>;
|
|
35
|
+
get prerequisites(): string[];
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=platform-linux.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform-linux.d.ts","sourceRoot":"","sources":["../../src/core/platform-linux.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAuCzE,qBAAa,YAAa,YAAW,eAAe;IAGlD,mBAAmB,IAAI,MAAM;IAI7B,kBAAkB,IAAI,OAAO;IAQvB,kBAAkB,IAAI,OAAO,CAAC,eAAe,CAAC;IAkC9C,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IA0BhF,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAqCzD,gBAAgB,IAAI,OAAO,CAAC,aAAa,CAAC;IAS1C,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ7C,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW5C,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAKlC,IAAI,OAAO,IAAI,OAAO,CAErB;IAIK,mBAAmB,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAMxE,cAAc,CAClB,IAAI,EAAE,MAAM,EACZ,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GACjC,OAAO,CAAC,WAAW,GAAG,mBAAmB,GAAG,QAAQ,CAAC;IAOlD,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAkBtF,IAAI,aAAa,IAAI,MAAM,EAAE,CAE5B;CACF"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Linux platform adapter.
|
|
3
|
+
*
|
|
4
|
+
* Daemon: systemd user service + timer
|
|
5
|
+
* Runtime: Native Docker (no VM needed)
|
|
6
|
+
* Packages: No package manager integration (user pre-installs Docker)
|
|
7
|
+
*/
|
|
8
|
+
import { execa } from 'execa';
|
|
9
|
+
import * as fs from 'node:fs';
|
|
10
|
+
import * as path from 'node:path';
|
|
11
|
+
import * as os from 'node:os';
|
|
12
|
+
import { resolveSchedulerCommand } from './setup.js';
|
|
13
|
+
// ── Constants ──────────────────────────────────────────────────
|
|
14
|
+
const SERVICE_NAME = 'agent-oven-scheduler';
|
|
15
|
+
const TIMER_NAME = 'agent-oven-scheduler';
|
|
16
|
+
function getSystemdUserDir() {
|
|
17
|
+
const xdgConfig = process.env.XDG_CONFIG_HOME;
|
|
18
|
+
if (xdgConfig) {
|
|
19
|
+
return path.join(xdgConfig, 'systemd', 'user');
|
|
20
|
+
}
|
|
21
|
+
return path.join(os.homedir(), '.config', 'systemd', 'user');
|
|
22
|
+
}
|
|
23
|
+
function escapeSystemdArg(arg) {
|
|
24
|
+
// systemd treats % as a specifier marker; escape to preserve literal values.
|
|
25
|
+
const escaped = arg
|
|
26
|
+
.replace(/%/g, '%%')
|
|
27
|
+
.replace(/\\/g, '\\\\')
|
|
28
|
+
.replace(/"/g, '\\"');
|
|
29
|
+
if (escaped.length === 0 || /[\s"]/u.test(escaped)) {
|
|
30
|
+
return `"${escaped}"`;
|
|
31
|
+
}
|
|
32
|
+
return escaped;
|
|
33
|
+
}
|
|
34
|
+
function escapeSystemdValue(value) {
|
|
35
|
+
const escaped = value
|
|
36
|
+
.replace(/%/g, '%%')
|
|
37
|
+
.replace(/\\/g, '\\\\')
|
|
38
|
+
.replace(/"/g, '\\"');
|
|
39
|
+
return `"${escaped}"`;
|
|
40
|
+
}
|
|
41
|
+
// ── Adapter ────────────────────────────────────────────────────
|
|
42
|
+
export class LinuxAdapter {
|
|
43
|
+
// ── Daemon (systemd) ────────────────────────────────────────
|
|
44
|
+
getDaemonConfigPath() {
|
|
45
|
+
return path.join(getSystemdUserDir(), `${TIMER_NAME}.timer`);
|
|
46
|
+
}
|
|
47
|
+
daemonConfigExists() {
|
|
48
|
+
const dir = getSystemdUserDir();
|
|
49
|
+
return (fs.existsSync(path.join(dir, `${SERVICE_NAME}.service`)) &&
|
|
50
|
+
fs.existsSync(path.join(dir, `${TIMER_NAME}.timer`)));
|
|
51
|
+
}
|
|
52
|
+
async getSchedulerStatus() {
|
|
53
|
+
try {
|
|
54
|
+
const { stdout, exitCode } = await execa('systemctl', ['--user', 'is-active', `${TIMER_NAME}.timer`], { reject: false });
|
|
55
|
+
const isActive = exitCode === 0 && stdout.trim() === 'active';
|
|
56
|
+
if (!isActive) {
|
|
57
|
+
return { loaded: false };
|
|
58
|
+
}
|
|
59
|
+
// Try to get last service exit status
|
|
60
|
+
try {
|
|
61
|
+
const { stdout: showOutput } = await execa('systemctl', ['--user', 'show', `${SERVICE_NAME}.service`, '--property=ExecMainStatus'], { reject: false });
|
|
62
|
+
const match = showOutput.match(/ExecMainStatus=(\d+)/);
|
|
63
|
+
return {
|
|
64
|
+
loaded: true,
|
|
65
|
+
lastExitStatus: match ? parseInt(match[1], 10) : undefined,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return { loaded: true };
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return { loaded: false };
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async installDaemon(projectDir) {
|
|
77
|
+
const unitDir = getSystemdUserDir();
|
|
78
|
+
try {
|
|
79
|
+
if (!fs.existsSync(unitDir)) {
|
|
80
|
+
fs.mkdirSync(unitDir, { recursive: true });
|
|
81
|
+
}
|
|
82
|
+
// Generate and write both unit files
|
|
83
|
+
const config = await this.generateDaemonConfig(projectDir);
|
|
84
|
+
const [serviceContent, timerContent] = config.split('\n---\n');
|
|
85
|
+
fs.writeFileSync(path.join(unitDir, `${SERVICE_NAME}.service`), serviceContent);
|
|
86
|
+
fs.writeFileSync(path.join(unitDir, `${TIMER_NAME}.timer`), timerContent);
|
|
87
|
+
// Reload systemd, enable and start the timer
|
|
88
|
+
await execa('systemctl', ['--user', 'daemon-reload']);
|
|
89
|
+
await execa('systemctl', ['--user', 'enable', '--now', `${TIMER_NAME}.timer`]);
|
|
90
|
+
return { success: true };
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
94
|
+
return { success: false, error: message };
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
async startDaemon() {
|
|
98
|
+
await execa('systemctl', ['--user', 'start', `${TIMER_NAME}.timer`]);
|
|
99
|
+
}
|
|
100
|
+
async stopDaemon() {
|
|
101
|
+
await execa('systemctl', ['--user', 'stop', `${TIMER_NAME}.timer`]);
|
|
102
|
+
}
|
|
103
|
+
async generateDaemonConfig(projectDir) {
|
|
104
|
+
const cmdArgs = await resolveSchedulerCommand(projectDir, {
|
|
105
|
+
allowLegacyFallback: false,
|
|
106
|
+
});
|
|
107
|
+
const execStart = cmdArgs.map(escapeSystemdArg).join(' ');
|
|
108
|
+
const schedulerLogPath = path.join(projectDir, 'logs', 'scheduler.log');
|
|
109
|
+
const logOutput = escapeSystemdValue(`append:${schedulerLogPath}`);
|
|
110
|
+
const serviceUnit = `[Unit]
|
|
111
|
+
Description=Agent Oven Scheduler (one-shot tick)
|
|
112
|
+
|
|
113
|
+
[Service]
|
|
114
|
+
Type=oneshot
|
|
115
|
+
ExecStart=${execStart}
|
|
116
|
+
StandardOutput=${logOutput}
|
|
117
|
+
StandardError=${logOutput}
|
|
118
|
+
`;
|
|
119
|
+
const timerUnit = `[Unit]
|
|
120
|
+
Description=Agent Oven Scheduler Timer
|
|
121
|
+
|
|
122
|
+
[Timer]
|
|
123
|
+
OnBootSec=60s
|
|
124
|
+
OnUnitActiveSec=60s
|
|
125
|
+
AccuracySec=5s
|
|
126
|
+
|
|
127
|
+
[Install]
|
|
128
|
+
WantedBy=timers.target
|
|
129
|
+
`;
|
|
130
|
+
// Joined with a separator so both can be returned from a single call.
|
|
131
|
+
// installDaemon() splits on this separator.
|
|
132
|
+
return `${serviceUnit}\n---\n${timerUnit}`;
|
|
133
|
+
}
|
|
134
|
+
// ── Runtime (native Docker) ─────────────────────────────────
|
|
135
|
+
async getRuntimeStatus() {
|
|
136
|
+
try {
|
|
137
|
+
const { exitCode } = await execa('docker', ['info'], { reject: false });
|
|
138
|
+
return { running: exitCode === 0 };
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
return { running: false };
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
async ensureRuntime(_config) {
|
|
145
|
+
const status = await this.getRuntimeStatus();
|
|
146
|
+
if (status.running)
|
|
147
|
+
return;
|
|
148
|
+
throw new Error('Docker is not running. On Linux, start Docker with: sudo systemctl start docker');
|
|
149
|
+
}
|
|
150
|
+
async startRuntime(_config) {
|
|
151
|
+
// On Linux Docker is a system service — we can't start it without root.
|
|
152
|
+
// Just verify it's up.
|
|
153
|
+
const status = await this.getRuntimeStatus();
|
|
154
|
+
if (!status.running) {
|
|
155
|
+
throw new Error('Docker is not running. Start it with: sudo systemctl start docker');
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
async stopRuntime() {
|
|
159
|
+
// Docker on Linux is a system service — stopping it requires root
|
|
160
|
+
// and would affect all users. This is intentionally a no-op.
|
|
161
|
+
}
|
|
162
|
+
get needsVM() {
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
// ── Packages ────────────────────────────────────────────────
|
|
166
|
+
async checkPackageManager() {
|
|
167
|
+
// Linux has no single package manager we depend on.
|
|
168
|
+
// Always return available since install is a no-op.
|
|
169
|
+
return { available: true };
|
|
170
|
+
}
|
|
171
|
+
async installPackage(_pkg, _onOutput) {
|
|
172
|
+
// On Linux, users pre-install Docker themselves.
|
|
173
|
+
// Check if the package is available as a command.
|
|
174
|
+
const check = await this.checkDependency(_pkg);
|
|
175
|
+
return check.installed ? 'already-installed' : 'failed';
|
|
176
|
+
}
|
|
177
|
+
async checkDependency(name) {
|
|
178
|
+
try {
|
|
179
|
+
await execa('command', ['-v', name], { shell: true });
|
|
180
|
+
let version;
|
|
181
|
+
try {
|
|
182
|
+
const { stdout } = await execa(name, ['--version'], { reject: false });
|
|
183
|
+
version = stdout.split('\n')[0]?.trim();
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
// Some commands don't have --version
|
|
187
|
+
}
|
|
188
|
+
return { installed: true, version };
|
|
189
|
+
}
|
|
190
|
+
catch {
|
|
191
|
+
return { installed: false };
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
get prerequisites() {
|
|
195
|
+
return ['docker', 'jq'];
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=platform-linux.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform-linux.js","sourceRoot":"","sources":["../../src/core/platform-linux.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Platform adapter — abstracts OS-specific daemon, runtime, and package operations.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* import { platform } from './platform.js';
|
|
6
|
+
* await platform.startDaemon();
|
|
7
|
+
*
|
|
8
|
+
* For testing, use the factory directly:
|
|
9
|
+
* import { getPlatformAdapter } from './platform.js';
|
|
10
|
+
* const adapter = getPlatformAdapter('linux');
|
|
11
|
+
*/
|
|
12
|
+
import type { Config, RuntimeStatus, SchedulerStatus } from './types.js';
|
|
13
|
+
export interface PlatformAdapter {
|
|
14
|
+
/** Filesystem path to the daemon config (plist or systemd unit). */
|
|
15
|
+
getDaemonConfigPath(): string;
|
|
16
|
+
/** Whether the daemon config file exists on disk. */
|
|
17
|
+
daemonConfigExists(): boolean;
|
|
18
|
+
/** Query the daemon scheduler status. */
|
|
19
|
+
getSchedulerStatus(): Promise<SchedulerStatus>;
|
|
20
|
+
/** Write config files + load the daemon for the first time. */
|
|
21
|
+
installDaemon(projectDir: string): Promise<{
|
|
22
|
+
success: boolean;
|
|
23
|
+
error?: string;
|
|
24
|
+
}>;
|
|
25
|
+
/** Start (load) the daemon. */
|
|
26
|
+
startDaemon(): Promise<void>;
|
|
27
|
+
/** Stop (unload) the daemon. */
|
|
28
|
+
stopDaemon(): Promise<void>;
|
|
29
|
+
/** Generate the daemon config content (for inspection / testing). */
|
|
30
|
+
generateDaemonConfig(projectDir: string): Promise<string>;
|
|
31
|
+
/** Current runtime status. */
|
|
32
|
+
getRuntimeStatus(): Promise<RuntimeStatus>;
|
|
33
|
+
/** Ensure the runtime is available, starting it if needed. */
|
|
34
|
+
ensureRuntime(config: Config): Promise<void>;
|
|
35
|
+
/** Explicitly start the runtime. */
|
|
36
|
+
startRuntime(config: Config): Promise<void>;
|
|
37
|
+
/** Explicitly stop the runtime. */
|
|
38
|
+
stopRuntime(): Promise<void>;
|
|
39
|
+
/** Whether this platform needs a VM to run Docker. */
|
|
40
|
+
readonly needsVM: boolean;
|
|
41
|
+
/** Check whether the platform package manager is available. */
|
|
42
|
+
checkPackageManager(): Promise<{
|
|
43
|
+
available: boolean;
|
|
44
|
+
version?: string;
|
|
45
|
+
}>;
|
|
46
|
+
/** Install a package. */
|
|
47
|
+
installPackage(pkg: string, onOutput?: (line: string) => void): Promise<'installed' | 'already-installed' | 'failed'>;
|
|
48
|
+
/** Check if a CLI dependency is available. */
|
|
49
|
+
checkDependency(name: string): Promise<{
|
|
50
|
+
installed: boolean;
|
|
51
|
+
version?: string;
|
|
52
|
+
}>;
|
|
53
|
+
/** Prerequisite package names to check during init. */
|
|
54
|
+
readonly prerequisites: string[];
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Create the correct adapter for the given platform.
|
|
58
|
+
* Accepts an optional override for testing.
|
|
59
|
+
*/
|
|
60
|
+
export declare function getPlatformAdapter(platformOverride?: string): PlatformAdapter;
|
|
61
|
+
/** Module-level singleton for production use. */
|
|
62
|
+
export declare const platform: PlatformAdapter;
|
|
63
|
+
//# sourceMappingURL=platform.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../src/core/platform.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAIzE,MAAM,WAAW,eAAe;IAE9B,oEAAoE;IACpE,mBAAmB,IAAI,MAAM,CAAC;IAC9B,qDAAqD;IACrD,kBAAkB,IAAI,OAAO,CAAC;IAC9B,yCAAyC;IACzC,kBAAkB,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC;IAC/C,+DAA+D;IAC/D,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjF,+BAA+B;IAC/B,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,gCAAgC;IAChC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,qEAAqE;IACrE,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAG1D,8BAA8B;IAC9B,gBAAgB,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;IAC3C,8DAA8D;IAC9D,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,oCAAoC;IACpC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,mCAAmC;IACnC,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,sDAAsD;IACtD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAG1B,+DAA+D;IAC/D,mBAAmB,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzE,yBAAyB;IACzB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,WAAW,GAAG,mBAAmB,GAAG,QAAQ,CAAC,CAAC;IACtH,8CAA8C;IAC9C,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjF,uDAAuD;IACvD,QAAQ,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC;CAClC;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,eAAe,CAW7E;AAED,iDAAiD;AACjD,eAAO,MAAM,QAAQ,EAAE,eAAsC,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Platform adapter — abstracts OS-specific daemon, runtime, and package operations.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* import { platform } from './platform.js';
|
|
6
|
+
* await platform.startDaemon();
|
|
7
|
+
*
|
|
8
|
+
* For testing, use the factory directly:
|
|
9
|
+
* import { getPlatformAdapter } from './platform.js';
|
|
10
|
+
* const adapter = getPlatformAdapter('linux');
|
|
11
|
+
*/
|
|
12
|
+
import { DarwinAdapter } from './platform-darwin.js';
|
|
13
|
+
import { LinuxAdapter } from './platform-linux.js';
|
|
14
|
+
/**
|
|
15
|
+
* Create the correct adapter for the given platform.
|
|
16
|
+
* Accepts an optional override for testing.
|
|
17
|
+
*/
|
|
18
|
+
export function getPlatformAdapter(platformOverride) {
|
|
19
|
+
const plat = platformOverride ?? process.platform;
|
|
20
|
+
switch (plat) {
|
|
21
|
+
case 'darwin':
|
|
22
|
+
return new DarwinAdapter();
|
|
23
|
+
case 'linux':
|
|
24
|
+
return new LinuxAdapter();
|
|
25
|
+
default:
|
|
26
|
+
throw new Error(`Unsupported platform: ${plat}. Agent Oven supports macOS (darwin) and Linux.`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/** Module-level singleton for production use. */
|
|
30
|
+
export const platform = getPlatformAdapter();
|
|
31
|
+
//# sourceMappingURL=platform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/core/platform.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AA0CnD;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,gBAAyB;IAC1D,MAAM,IAAI,GAAG,gBAAgB,IAAI,OAAO,CAAC,QAAQ,CAAC;IAElD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ;YACX,OAAO,IAAI,aAAa,EAAE,CAAC;QAC7B,KAAK,OAAO;YACV,OAAO,IAAI,YAAY,EAAE,CAAC;QAC5B;YACE,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,iDAAiD,CAAC,CAAC;IACpG,CAAC;AACH,CAAC;AAED,iDAAiD;AACjD,MAAM,CAAC,MAAM,QAAQ,GAAoB,kBAAkB,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scheduler-runner.d.ts","sourceRoot":"","sources":["../../src/core/scheduler-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"scheduler-runner.d.ts","sourceRoot":"","sources":["../../src/core/scheduler-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AA2JzC;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA6EtE"}
|