agent-oven 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +164 -0
- package/LICENSE +21 -0
- package/README.md +447 -0
- package/dist/cli/commands/add.d.ts +6 -0
- package/dist/cli/commands/add.d.ts.map +1 -0
- package/dist/cli/commands/add.js +150 -0
- package/dist/cli/commands/add.js.map +1 -0
- package/dist/cli/commands/daemon.d.ts +6 -0
- package/dist/cli/commands/daemon.d.ts.map +1 -0
- package/dist/cli/commands/daemon.js +97 -0
- package/dist/cli/commands/daemon.js.map +1 -0
- package/dist/cli/commands/delete.d.ts +6 -0
- package/dist/cli/commands/delete.d.ts.map +1 -0
- package/dist/cli/commands/delete.js +34 -0
- package/dist/cli/commands/delete.js.map +1 -0
- package/dist/cli/commands/down.d.ts +6 -0
- package/dist/cli/commands/down.d.ts.map +1 -0
- package/dist/cli/commands/down.js +53 -0
- package/dist/cli/commands/down.js.map +1 -0
- package/dist/cli/commands/list.d.ts +6 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js +41 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/logs.d.ts +6 -0
- package/dist/cli/commands/logs.d.ts.map +1 -0
- package/dist/cli/commands/logs.js +124 -0
- package/dist/cli/commands/logs.js.map +1 -0
- package/dist/cli/commands/run.d.ts +6 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/commands/run.js +45 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/scheduler-tick.d.ts +8 -0
- package/dist/cli/commands/scheduler-tick.d.ts.map +1 -0
- package/dist/cli/commands/scheduler-tick.js +25 -0
- package/dist/cli/commands/scheduler-tick.js.map +1 -0
- package/dist/cli/commands/show.d.ts +6 -0
- package/dist/cli/commands/show.d.ts.map +1 -0
- package/dist/cli/commands/show.js +81 -0
- package/dist/cli/commands/show.js.map +1 -0
- package/dist/cli/commands/status.d.ts +6 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +63 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/toggle.d.ts +6 -0
- package/dist/cli/commands/toggle.d.ts.map +1 -0
- package/dist/cli/commands/toggle.js +24 -0
- package/dist/cli/commands/toggle.js.map +1 -0
- package/dist/cli/commands/up.d.ts +6 -0
- package/dist/cli/commands/up.d.ts.map +1 -0
- package/dist/cli/commands/up.js +48 -0
- package/dist/cli/commands/up.js.map +1 -0
- package/dist/cli/utils/errors.d.ts +17 -0
- package/dist/cli/utils/errors.d.ts.map +1 -0
- package/dist/cli/utils/errors.js +37 -0
- package/dist/cli/utils/errors.js.map +1 -0
- package/dist/cli/utils/output.d.ts +17 -0
- package/dist/cli/utils/output.d.ts.map +1 -0
- package/dist/cli/utils/output.js +52 -0
- package/dist/cli/utils/output.js.map +1 -0
- package/dist/cli/utils/prompts.d.ts +8 -0
- package/dist/cli/utils/prompts.d.ts.map +1 -0
- package/dist/cli/utils/prompts.js +27 -0
- package/dist/cli/utils/prompts.js.map +1 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +71 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/auth.d.ts +40 -0
- package/dist/core/auth.d.ts.map +1 -0
- package/dist/core/auth.js +114 -0
- package/dist/core/auth.js.map +1 -0
- package/dist/core/config.d.ts +43 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +179 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/docker.d.ts +60 -0
- package/dist/core/docker.d.ts.map +1 -0
- package/dist/core/docker.js +507 -0
- package/dist/core/docker.js.map +1 -0
- package/dist/core/index.d.ts +10 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +10 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/jobs.d.ts +53 -0
- package/dist/core/jobs.d.ts.map +1 -0
- package/dist/core/jobs.js +264 -0
- package/dist/core/jobs.js.map +1 -0
- package/dist/core/scheduler-runner.d.ts +15 -0
- package/dist/core/scheduler-runner.d.ts.map +1 -0
- package/dist/core/scheduler-runner.js +230 -0
- package/dist/core/scheduler-runner.js.map +1 -0
- package/dist/core/scheduler.d.ts +41 -0
- package/dist/core/scheduler.d.ts.map +1 -0
- package/dist/core/scheduler.js +373 -0
- package/dist/core/scheduler.js.map +1 -0
- package/dist/core/setup.d.ts +84 -0
- package/dist/core/setup.d.ts.map +1 -0
- package/dist/core/setup.js +315 -0
- package/dist/core/setup.js.map +1 -0
- package/dist/core/types.d.ts +181 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +12 -0
- package/dist/core/types.js.map +1 -0
- package/dist/tui/App.d.ts +7 -0
- package/dist/tui/App.d.ts.map +1 -0
- package/dist/tui/App.js +103 -0
- package/dist/tui/App.js.map +1 -0
- package/dist/tui/components/Dashboard.d.ts +9 -0
- package/dist/tui/components/Dashboard.d.ts.map +1 -0
- package/dist/tui/components/Dashboard.js +70 -0
- package/dist/tui/components/Dashboard.js.map +1 -0
- package/dist/tui/components/InitWizard.d.ts +2 -0
- package/dist/tui/components/InitWizard.d.ts.map +1 -0
- package/dist/tui/components/InitWizard.js +522 -0
- package/dist/tui/components/InitWizard.js.map +1 -0
- package/dist/tui/components/JobDetail.d.ts +12 -0
- package/dist/tui/components/JobDetail.d.ts.map +1 -0
- package/dist/tui/components/JobDetail.js +137 -0
- package/dist/tui/components/JobDetail.js.map +1 -0
- package/dist/tui/components/JobForm.d.ts +10 -0
- package/dist/tui/components/JobForm.d.ts.map +1 -0
- package/dist/tui/components/JobForm.js +183 -0
- package/dist/tui/components/JobForm.js.map +1 -0
- package/dist/tui/components/JobList.d.ts +11 -0
- package/dist/tui/components/JobList.d.ts.map +1 -0
- package/dist/tui/components/JobList.js +136 -0
- package/dist/tui/components/JobList.js.map +1 -0
- package/dist/tui/components/LogViewer.d.ts +10 -0
- package/dist/tui/components/LogViewer.d.ts.map +1 -0
- package/dist/tui/components/LogViewer.js +184 -0
- package/dist/tui/components/LogViewer.js.map +1 -0
- package/dist/tui/index.d.ts +11 -0
- package/dist/tui/index.d.ts.map +1 -0
- package/dist/tui/index.js +11 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/types.d.ts +21 -0
- package/dist/tui/types.d.ts.map +1 -0
- package/dist/tui/types.js +5 -0
- package/dist/tui/types.js.map +1 -0
- package/images/base-tasks/Dockerfile +33 -0
- package/images/node-tasks/Dockerfile +36 -0
- package/images/pipeline-runner/Dockerfile +43 -0
- package/images/pipeline-runner/entrypoint.sh +60 -0
- package/images/python-tasks/Dockerfile +43 -0
- package/package.json +91 -0
- package/scheduler.sh +522 -0
package/dist/cli.js
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
/**
|
|
4
|
+
* Agent Oven CLI Entry Point
|
|
5
|
+
*
|
|
6
|
+
* Routes to commander subcommands, TUI, or init wizard.
|
|
7
|
+
*/
|
|
8
|
+
import { createRequire } from 'node:module';
|
|
9
|
+
import { Command } from 'commander';
|
|
10
|
+
const require = createRequire(import.meta.url);
|
|
11
|
+
const { version } = require('../package.json');
|
|
12
|
+
// If no arguments, skip commander entirely and launch TUI directly
|
|
13
|
+
if (process.argv.length <= 2) {
|
|
14
|
+
await launchTUI();
|
|
15
|
+
// launchTUI waits until exit, so this won't reach below
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
const program = new Command();
|
|
19
|
+
program
|
|
20
|
+
.name('agent-oven')
|
|
21
|
+
.description('macOS-native job scheduler for Docker containers')
|
|
22
|
+
.version(version);
|
|
23
|
+
// Register all CLI commands
|
|
24
|
+
const commandModules = [
|
|
25
|
+
() => import('./cli/commands/status.js'),
|
|
26
|
+
() => import('./cli/commands/list.js'),
|
|
27
|
+
() => import('./cli/commands/add.js'),
|
|
28
|
+
() => import('./cli/commands/show.js'),
|
|
29
|
+
() => import('./cli/commands/run.js'),
|
|
30
|
+
() => import('./cli/commands/delete.js'),
|
|
31
|
+
() => import('./cli/commands/toggle.js'),
|
|
32
|
+
() => import('./cli/commands/logs.js'),
|
|
33
|
+
() => import('./cli/commands/daemon.js'),
|
|
34
|
+
() => import('./cli/commands/up.js'),
|
|
35
|
+
() => import('./cli/commands/down.js'),
|
|
36
|
+
() => import('./cli/commands/scheduler-tick.js'),
|
|
37
|
+
];
|
|
38
|
+
for (const load of commandModules) {
|
|
39
|
+
const mod = await load();
|
|
40
|
+
mod.register(program);
|
|
41
|
+
}
|
|
42
|
+
// `agent-oven init` — interactive setup wizard
|
|
43
|
+
program
|
|
44
|
+
.command('init')
|
|
45
|
+
.description('Run the interactive setup wizard')
|
|
46
|
+
.action(async () => {
|
|
47
|
+
const React = (await import('react')).default;
|
|
48
|
+
const { render } = await import('ink');
|
|
49
|
+
const { InitWizard } = await import('./tui/components/InitWizard.js');
|
|
50
|
+
const { waitUntilExit } = render(_jsx(InitWizard, {}));
|
|
51
|
+
await waitUntilExit();
|
|
52
|
+
});
|
|
53
|
+
// `agent-oven tui` — explicit TUI launch
|
|
54
|
+
program
|
|
55
|
+
.command('tui')
|
|
56
|
+
.description('Launch the interactive terminal UI')
|
|
57
|
+
.action(async () => {
|
|
58
|
+
await launchTUI();
|
|
59
|
+
});
|
|
60
|
+
await program.parseAsync();
|
|
61
|
+
}
|
|
62
|
+
async function launchTUI() {
|
|
63
|
+
const React = (await import('react')).default;
|
|
64
|
+
const { render } = await import('ink');
|
|
65
|
+
const { App } = await import('./tui/App.js');
|
|
66
|
+
const { loadConfig } = await import('./core/config.js');
|
|
67
|
+
const config = loadConfig();
|
|
68
|
+
const { waitUntilExit } = render(_jsx(App, { config: config }));
|
|
69
|
+
await waitUntilExit();
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.tsx"],"names":[],"mappings":";;AACA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAE/C,mEAAmE;AACnE,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;IAC7B,MAAM,SAAS,EAAE,CAAC;IAClB,wDAAwD;AAC1D,CAAC;KAAM,CAAC;IACN,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,YAAY,CAAC;SAClB,WAAW,CAAC,kDAAkD,CAAC;SAC/D,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpB,4BAA4B;IAC5B,MAAM,cAAc,GAAG;QACrB,GAAG,EAAE,CAAC,MAAM,CAAC,0BAA0B,CAAC;QACxC,GAAG,EAAE,CAAC,MAAM,CAAC,wBAAwB,CAAC;QACtC,GAAG,EAAE,CAAC,MAAM,CAAC,uBAAuB,CAAC;QACrC,GAAG,EAAE,CAAC,MAAM,CAAC,wBAAwB,CAAC;QACtC,GAAG,EAAE,CAAC,MAAM,CAAC,uBAAuB,CAAC;QACrC,GAAG,EAAE,CAAC,MAAM,CAAC,0BAA0B,CAAC;QACxC,GAAG,EAAE,CAAC,MAAM,CAAC,0BAA0B,CAAC;QACxC,GAAG,EAAE,CAAC,MAAM,CAAC,wBAAwB,CAAC;QACtC,GAAG,EAAE,CAAC,MAAM,CAAC,0BAA0B,CAAC;QACxC,GAAG,EAAE,CAAC,MAAM,CAAC,sBAAsB,CAAC;QACpC,GAAG,EAAE,CAAC,MAAM,CAAC,wBAAwB,CAAC;QACtC,GAAG,EAAE,CAAC,MAAM,CAAC,kCAAkC,CAAC;KACjD,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,MAAM,IAAI,EAAE,CAAC;QACzB,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC;IAED,+CAA+C;IAC/C,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,kCAAkC,CAAC;SAC/C,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,KAAK,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QAC9C,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,gCAAgC,CAAC,CAAC;QACtE,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,CAAC,KAAC,UAAU,KAAG,CAAC,CAAC;QACjD,MAAM,aAAa,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;IAEL,yCAAyC;IACzC,OAAO;SACJ,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,oCAAoC,CAAC;SACjD,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,SAAS,EAAE,CAAC;IACpB,CAAC,CAAC,CAAC;IAEL,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;AAC7B,CAAC;AAED,KAAK,UAAU,SAAS;IACtB,MAAM,KAAK,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;IAC9C,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;IAC7C,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IACxD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,CAAC,KAAC,GAAG,IAAC,MAAM,EAAE,MAAM,GAAI,CAAC,CAAC;IAC1D,MAAM,aAAa,EAAE,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication management for pipeline jobs
|
|
3
|
+
* Handles credential mounting and validation for Claude and GitHub
|
|
4
|
+
*/
|
|
5
|
+
import type { AuthMode, AuthConfig, PipelineJob } from './types.js';
|
|
6
|
+
/** Default auth configuration */
|
|
7
|
+
export declare const DEFAULT_AUTH_CONFIG: AuthConfig;
|
|
8
|
+
/** Health status for individual credentials */
|
|
9
|
+
export interface AuthHealthStatus {
|
|
10
|
+
claude: {
|
|
11
|
+
available: boolean;
|
|
12
|
+
error?: string;
|
|
13
|
+
};
|
|
14
|
+
github: {
|
|
15
|
+
available: boolean;
|
|
16
|
+
error?: string;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Resolve which auth mode to use for a job.
|
|
21
|
+
* Job-level override takes precedence over default.
|
|
22
|
+
*/
|
|
23
|
+
export declare function resolveAuthMode(job: PipelineJob, authConfig: AuthConfig): AuthMode;
|
|
24
|
+
/**
|
|
25
|
+
* Generate Docker volume mounts and env vars for auth.
|
|
26
|
+
*/
|
|
27
|
+
export declare function generateAuthArgs(authMode: AuthMode, authConfig: AuthConfig, jobEnv?: Record<string, string>): {
|
|
28
|
+
volumes: string[];
|
|
29
|
+
envVars: Record<string, string>;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Check health of auth credentials on the host.
|
|
33
|
+
*/
|
|
34
|
+
export declare function checkAuthHealth(authConfig: AuthConfig): AuthHealthStatus;
|
|
35
|
+
/**
|
|
36
|
+
* Validate that auth requirements are met for a pipeline job.
|
|
37
|
+
* Throws if credentials are missing for the resolved auth mode.
|
|
38
|
+
*/
|
|
39
|
+
export declare function validateAuthForJob(job: PipelineJob, authConfig: AuthConfig): void;
|
|
40
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/core/auth.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEpE,iCAAiC;AACjC,eAAO,MAAM,mBAAmB,EAAE,UAIjC,CAAC;AAEF,+CAA+C;AAC/C,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C,MAAM,EAAE;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAChD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,GAAG,QAAQ,CAElF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,UAAU,EACtB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CA6BxD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,UAAU,GAAG,gBAAgB,CAQxE;AA2BD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,GAAG,IAAI,CAiCjF"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication management for pipeline jobs
|
|
3
|
+
* Handles credential mounting and validation for Claude and GitHub
|
|
4
|
+
*/
|
|
5
|
+
import * as fs from 'node:fs';
|
|
6
|
+
import * as os from 'node:os';
|
|
7
|
+
import * as path from 'node:path';
|
|
8
|
+
/** Default auth configuration */
|
|
9
|
+
export const DEFAULT_AUTH_CONFIG = {
|
|
10
|
+
defaultMode: 'host-login',
|
|
11
|
+
claudeCredPath: path.join(os.homedir(), '.claude'),
|
|
12
|
+
ghCredPath: path.join(os.homedir(), '.config', 'gh'),
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Resolve which auth mode to use for a job.
|
|
16
|
+
* Job-level override takes precedence over default.
|
|
17
|
+
*/
|
|
18
|
+
export function resolveAuthMode(job, authConfig) {
|
|
19
|
+
return job.auth ?? authConfig.defaultMode;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Generate Docker volume mounts and env vars for auth.
|
|
23
|
+
*/
|
|
24
|
+
export function generateAuthArgs(authMode, authConfig, jobEnv) {
|
|
25
|
+
const volumes = [];
|
|
26
|
+
const envVars = {};
|
|
27
|
+
if (authMode === 'host-login') {
|
|
28
|
+
// Mount credential directories as read-only
|
|
29
|
+
const claudePath = authConfig.claudeCredPath;
|
|
30
|
+
const ghPath = authConfig.ghCredPath;
|
|
31
|
+
if (fs.existsSync(claudePath)) {
|
|
32
|
+
volumes.push(`${claudePath}:/root/.claude:ro`);
|
|
33
|
+
}
|
|
34
|
+
if (fs.existsSync(ghPath)) {
|
|
35
|
+
volumes.push(`${ghPath}:/root/.config/gh:ro`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
else if (authMode === 'api-key') {
|
|
39
|
+
// Pass API keys from job env or process env
|
|
40
|
+
const anthropicKey = jobEnv?.ANTHROPIC_API_KEY ?? process.env.ANTHROPIC_API_KEY;
|
|
41
|
+
const ghToken = jobEnv?.GH_TOKEN ?? jobEnv?.GITHUB_TOKEN ?? process.env.GH_TOKEN ?? process.env.GITHUB_TOKEN;
|
|
42
|
+
if (anthropicKey) {
|
|
43
|
+
envVars.ANTHROPIC_API_KEY = anthropicKey;
|
|
44
|
+
}
|
|
45
|
+
if (ghToken) {
|
|
46
|
+
envVars.GH_TOKEN = ghToken;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return { volumes, envVars };
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Check health of auth credentials on the host.
|
|
53
|
+
*/
|
|
54
|
+
export function checkAuthHealth(authConfig) {
|
|
55
|
+
const claudePath = authConfig.claudeCredPath;
|
|
56
|
+
const ghPath = authConfig.ghCredPath;
|
|
57
|
+
const claude = checkCredentialPath(claudePath, 'Claude');
|
|
58
|
+
const github = checkCredentialPath(ghPath, 'GitHub CLI');
|
|
59
|
+
return { claude, github };
|
|
60
|
+
}
|
|
61
|
+
function checkCredentialPath(credPath, label) {
|
|
62
|
+
if (!fs.existsSync(credPath)) {
|
|
63
|
+
return { available: false, error: `${label} credential path not found: ${credPath}` };
|
|
64
|
+
}
|
|
65
|
+
try {
|
|
66
|
+
const stat = fs.statSync(credPath);
|
|
67
|
+
if (!stat.isDirectory()) {
|
|
68
|
+
return { available: false, error: `${label} credential path is not a directory: ${credPath}` };
|
|
69
|
+
}
|
|
70
|
+
const contents = fs.readdirSync(credPath);
|
|
71
|
+
if (contents.length === 0) {
|
|
72
|
+
return { available: false, error: `${label} credential directory is empty: ${credPath}` };
|
|
73
|
+
}
|
|
74
|
+
return { available: true };
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
return { available: false, error: `${label} credential check failed: ${err instanceof Error ? err.message : String(err)}` };
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Validate that auth requirements are met for a pipeline job.
|
|
82
|
+
* Throws if credentials are missing for the resolved auth mode.
|
|
83
|
+
*/
|
|
84
|
+
export function validateAuthForJob(job, authConfig) {
|
|
85
|
+
const mode = resolveAuthMode(job, authConfig);
|
|
86
|
+
if (mode === 'host-login') {
|
|
87
|
+
const health = checkAuthHealth(authConfig);
|
|
88
|
+
const errors = [];
|
|
89
|
+
if (!health.claude.available) {
|
|
90
|
+
errors.push(health.claude.error ?? 'Claude credentials not available');
|
|
91
|
+
}
|
|
92
|
+
if (!health.github.available) {
|
|
93
|
+
errors.push(health.github.error ?? 'GitHub credentials not available');
|
|
94
|
+
}
|
|
95
|
+
if (errors.length > 0) {
|
|
96
|
+
throw new Error(`Auth validation failed for job "${job.id}":\n ${errors.join('\n ')}`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
else if (mode === 'api-key') {
|
|
100
|
+
const anthropicKey = job.env?.ANTHROPIC_API_KEY ?? process.env.ANTHROPIC_API_KEY;
|
|
101
|
+
const ghToken = job.env?.GH_TOKEN ?? job.env?.GITHUB_TOKEN ?? process.env.GH_TOKEN ?? process.env.GITHUB_TOKEN;
|
|
102
|
+
const errors = [];
|
|
103
|
+
if (!anthropicKey) {
|
|
104
|
+
errors.push('ANTHROPIC_API_KEY not set in job env or process env');
|
|
105
|
+
}
|
|
106
|
+
if (!ghToken) {
|
|
107
|
+
errors.push('GH_TOKEN/GITHUB_TOKEN not set in job env or process env');
|
|
108
|
+
}
|
|
109
|
+
if (errors.length > 0) {
|
|
110
|
+
throw new Error(`Auth validation failed for job "${job.id}":\n ${errors.join('\n ')}`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/core/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration management for Agent Oven
|
|
3
|
+
* Follows XDG Base Directory Specification
|
|
4
|
+
*/
|
|
5
|
+
import type { Config } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Load configuration from disk
|
|
8
|
+
* Creates default config if none exists
|
|
9
|
+
*/
|
|
10
|
+
export declare function loadConfig(): Config;
|
|
11
|
+
/**
|
|
12
|
+
* Save configuration to disk
|
|
13
|
+
*/
|
|
14
|
+
export declare function saveConfig(config: Config): void;
|
|
15
|
+
/**
|
|
16
|
+
* Get the path to jobs.json
|
|
17
|
+
*/
|
|
18
|
+
export declare function getJobsFilePath(config: Config): string;
|
|
19
|
+
/**
|
|
20
|
+
* Get the path to the logs directory
|
|
21
|
+
*/
|
|
22
|
+
export declare function getLogsDir(config: Config): string;
|
|
23
|
+
/**
|
|
24
|
+
* Get the path to a specific job's log directory
|
|
25
|
+
*/
|
|
26
|
+
export declare function getJobLogsDir(config: Config, jobId: string): string;
|
|
27
|
+
/**
|
|
28
|
+
* Get the path to the scheduler log
|
|
29
|
+
*/
|
|
30
|
+
export declare function getSchedulerLogPath(config: Config): string;
|
|
31
|
+
/**
|
|
32
|
+
* Get the launchd plist path
|
|
33
|
+
*/
|
|
34
|
+
export declare function getLaunchdPlistPath(): string;
|
|
35
|
+
/**
|
|
36
|
+
* Update specific config values
|
|
37
|
+
*/
|
|
38
|
+
export declare function updateConfig(updates: Partial<Config>): Config;
|
|
39
|
+
/**
|
|
40
|
+
* Get default configuration (useful for initialization)
|
|
41
|
+
*/
|
|
42
|
+
export declare function getDefaultConfig(): Omit<Config, 'projectDir'>;
|
|
43
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,MAAM,EAA4C,MAAM,YAAY,CAAC;AAyFnF;;;GAGG;AACH,wBAAgB,UAAU,IAAI,MAAM,CA8BnC;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAU/C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAW7D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAE7D"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration management for Agent Oven
|
|
3
|
+
* Follows XDG Base Directory Specification
|
|
4
|
+
*/
|
|
5
|
+
import * as fs from 'node:fs';
|
|
6
|
+
import * as path from 'node:path';
|
|
7
|
+
import * as os from 'node:os';
|
|
8
|
+
/** Default Colima configuration */
|
|
9
|
+
const DEFAULT_COLIMA = {
|
|
10
|
+
cpu: 2,
|
|
11
|
+
memory: 4,
|
|
12
|
+
disk: 20,
|
|
13
|
+
};
|
|
14
|
+
/** Default Docker resource limits */
|
|
15
|
+
const DEFAULT_DOCKER = {
|
|
16
|
+
defaultCpus: 1,
|
|
17
|
+
defaultMemory: '512m',
|
|
18
|
+
};
|
|
19
|
+
/** Default auth configuration */
|
|
20
|
+
const DEFAULT_AUTH = {
|
|
21
|
+
defaultMode: 'host-login',
|
|
22
|
+
claudeCredPath: path.join(os.homedir(), '.claude'),
|
|
23
|
+
ghCredPath: path.join(os.homedir(), '.config', 'gh'),
|
|
24
|
+
};
|
|
25
|
+
/** Default configuration */
|
|
26
|
+
const DEFAULT_CONFIG = {
|
|
27
|
+
colima: DEFAULT_COLIMA,
|
|
28
|
+
docker: DEFAULT_DOCKER,
|
|
29
|
+
timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
|
|
30
|
+
auth: DEFAULT_AUTH,
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Get the XDG config directory
|
|
34
|
+
*/
|
|
35
|
+
function getConfigDir() {
|
|
36
|
+
const xdgConfig = process.env.XDG_CONFIG_HOME;
|
|
37
|
+
if (xdgConfig) {
|
|
38
|
+
return path.join(xdgConfig, 'agent-oven');
|
|
39
|
+
}
|
|
40
|
+
return path.join(os.homedir(), '.config', 'agent-oven');
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Get the config file path
|
|
44
|
+
*/
|
|
45
|
+
function getConfigPath() {
|
|
46
|
+
return path.join(getConfigDir(), 'config.json');
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Try to auto-detect the project directory
|
|
50
|
+
* Looks for common indicators of the agent-oven project
|
|
51
|
+
*/
|
|
52
|
+
function detectProjectDir() {
|
|
53
|
+
// Check if running from within the project
|
|
54
|
+
const cwd = process.cwd();
|
|
55
|
+
if (isProjectDir(cwd)) {
|
|
56
|
+
return cwd;
|
|
57
|
+
}
|
|
58
|
+
// Check common locations
|
|
59
|
+
const candidates = [
|
|
60
|
+
path.join(os.homedir(), 'agent-oven'),
|
|
61
|
+
path.join(os.homedir(), 'Developer', 'agent-oven'),
|
|
62
|
+
path.join(os.homedir(), 'Projects', 'agent-oven'),
|
|
63
|
+
'/opt/agent-oven',
|
|
64
|
+
];
|
|
65
|
+
for (const candidate of candidates) {
|
|
66
|
+
if (isProjectDir(candidate)) {
|
|
67
|
+
return candidate;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Check if a directory looks like the agent-oven project
|
|
74
|
+
*/
|
|
75
|
+
function isProjectDir(dir) {
|
|
76
|
+
try {
|
|
77
|
+
const hasJobsFile = fs.existsSync(path.join(dir, 'jobs.json'));
|
|
78
|
+
const hasScheduler = fs.existsSync(path.join(dir, 'scheduler.sh'));
|
|
79
|
+
return hasJobsFile || hasScheduler;
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Load configuration from disk
|
|
87
|
+
* Creates default config if none exists
|
|
88
|
+
*/
|
|
89
|
+
export function loadConfig() {
|
|
90
|
+
const configPath = getConfigPath();
|
|
91
|
+
let savedConfig = {};
|
|
92
|
+
if (fs.existsSync(configPath)) {
|
|
93
|
+
try {
|
|
94
|
+
const content = fs.readFileSync(configPath, 'utf-8');
|
|
95
|
+
savedConfig = JSON.parse(content);
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
console.error(`Warning: Failed to parse config at ${configPath}:`, err);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Determine project directory
|
|
102
|
+
let projectDir = savedConfig.projectDir;
|
|
103
|
+
if (!projectDir || !fs.existsSync(projectDir)) {
|
|
104
|
+
projectDir = detectProjectDir() ?? process.cwd();
|
|
105
|
+
}
|
|
106
|
+
// Merge with defaults
|
|
107
|
+
const config = {
|
|
108
|
+
projectDir,
|
|
109
|
+
colima: { ...DEFAULT_COLIMA, ...savedConfig.colima },
|
|
110
|
+
docker: { ...DEFAULT_DOCKER, ...savedConfig.docker },
|
|
111
|
+
timezone: savedConfig.timezone ?? DEFAULT_CONFIG.timezone,
|
|
112
|
+
auth: { ...DEFAULT_AUTH, ...savedConfig.auth },
|
|
113
|
+
};
|
|
114
|
+
return config;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Save configuration to disk
|
|
118
|
+
*/
|
|
119
|
+
export function saveConfig(config) {
|
|
120
|
+
const configDir = getConfigDir();
|
|
121
|
+
const configPath = getConfigPath();
|
|
122
|
+
// Ensure config directory exists
|
|
123
|
+
if (!fs.existsSync(configDir)) {
|
|
124
|
+
fs.mkdirSync(configDir, { recursive: true });
|
|
125
|
+
}
|
|
126
|
+
fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n');
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Get the path to jobs.json
|
|
130
|
+
*/
|
|
131
|
+
export function getJobsFilePath(config) {
|
|
132
|
+
return path.join(config.projectDir, 'jobs.json');
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Get the path to the logs directory
|
|
136
|
+
*/
|
|
137
|
+
export function getLogsDir(config) {
|
|
138
|
+
return path.join(config.projectDir, 'logs');
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Get the path to a specific job's log directory
|
|
142
|
+
*/
|
|
143
|
+
export function getJobLogsDir(config, jobId) {
|
|
144
|
+
return path.join(getLogsDir(config), 'jobs', jobId);
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Get the path to the scheduler log
|
|
148
|
+
*/
|
|
149
|
+
export function getSchedulerLogPath(config) {
|
|
150
|
+
return path.join(getLogsDir(config), 'scheduler.log');
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Get the launchd plist path
|
|
154
|
+
*/
|
|
155
|
+
export function getLaunchdPlistPath() {
|
|
156
|
+
return path.join(os.homedir(), 'Library', 'LaunchAgents', 'com.agent-oven.scheduler.plist');
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Update specific config values
|
|
160
|
+
*/
|
|
161
|
+
export function updateConfig(updates) {
|
|
162
|
+
const current = loadConfig();
|
|
163
|
+
const updated = {
|
|
164
|
+
...current,
|
|
165
|
+
...updates,
|
|
166
|
+
colima: { ...current.colima, ...updates.colima },
|
|
167
|
+
docker: { ...current.docker, ...updates.docker },
|
|
168
|
+
auth: { ...DEFAULT_AUTH, ...current.auth, ...updates.auth },
|
|
169
|
+
};
|
|
170
|
+
saveConfig(updated);
|
|
171
|
+
return updated;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Get default configuration (useful for initialization)
|
|
175
|
+
*/
|
|
176
|
+
export function getDefaultConfig() {
|
|
177
|
+
return { ...DEFAULT_CONFIG };
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Docker execution layer
|
|
3
|
+
* Handles container operations via Colima
|
|
4
|
+
*/
|
|
5
|
+
import type { Config, Job, ColimaStatus, SchedulerStatus, RunningContainer, JobLogEntry, JobRunResult, SystemStatus } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Check if Colima is running
|
|
8
|
+
*/
|
|
9
|
+
export declare function getColimaStatus(): Promise<ColimaStatus>;
|
|
10
|
+
/**
|
|
11
|
+
* Start Colima VM
|
|
12
|
+
*/
|
|
13
|
+
export declare function startColima(config: Config): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* Stop Colima VM
|
|
16
|
+
*/
|
|
17
|
+
export declare function stopColima(): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Check if the scheduler daemon is loaded
|
|
20
|
+
*/
|
|
21
|
+
export declare function getSchedulerStatus(): Promise<SchedulerStatus>;
|
|
22
|
+
/**
|
|
23
|
+
* Get list of running job containers
|
|
24
|
+
*/
|
|
25
|
+
export declare function getRunningContainers(): Promise<RunningContainer[]>;
|
|
26
|
+
/**
|
|
27
|
+
* Get recent job executions from log files
|
|
28
|
+
*/
|
|
29
|
+
export declare function getRecentExecutions(config: Config, limit?: number): JobLogEntry[];
|
|
30
|
+
/**
|
|
31
|
+
* Get complete system status
|
|
32
|
+
*/
|
|
33
|
+
export declare function getSystemStatus(config: Config): Promise<SystemStatus>;
|
|
34
|
+
/**
|
|
35
|
+
* Run a job immediately - routes to the appropriate handler based on job type.
|
|
36
|
+
*/
|
|
37
|
+
export declare function runJob(config: Config, job: Job, options?: {
|
|
38
|
+
detach?: boolean;
|
|
39
|
+
}): Promise<JobRunResult>;
|
|
40
|
+
/**
|
|
41
|
+
* Stop a running job
|
|
42
|
+
*/
|
|
43
|
+
export declare function stopJob(jobId: string): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* Read a job's log file
|
|
46
|
+
*/
|
|
47
|
+
export declare function readJobLog(logFile: string): string;
|
|
48
|
+
/**
|
|
49
|
+
* Get list of log files for a job
|
|
50
|
+
*/
|
|
51
|
+
export declare function getJobLogFiles(config: Config, jobId: string): string[];
|
|
52
|
+
/**
|
|
53
|
+
* Read scheduler log
|
|
54
|
+
*/
|
|
55
|
+
export declare function readSchedulerLog(config: Config, lines?: number): string;
|
|
56
|
+
/**
|
|
57
|
+
* Check if Docker is available
|
|
58
|
+
*/
|
|
59
|
+
export declare function isDockerAvailable(): Promise<boolean>;
|
|
60
|
+
//# sourceMappingURL=docker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../../src/core/docker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EACV,MAAM,EACN,GAAG,EAGH,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,YAAY,EACb,MAAM,YAAY,CAAC;AAgBpB;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,YAAY,CAAC,CAuB7D;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ/D;AAED;;GAEG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAEhD;AAED;;GAEG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,eAAe,CAAC,CA2BnE;AAED;;GAEG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAwBxE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,WAAW,EAAE,CAuD5E;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAiB3E;AAeD;;GAEG;AACH,wBAAsB,MAAM,CAC1B,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,GAAG,EACR,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GACjC,OAAO,CAAC,YAAY,CAAC,CAMvB;AAkSD;;GAEG;AACH,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE1D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAKlD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAYtE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,MAAM,CAUnE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC,CAO1D"}
|