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.
Files changed (146) hide show
  1. package/CLAUDE.md +164 -0
  2. package/LICENSE +21 -0
  3. package/README.md +447 -0
  4. package/dist/cli/commands/add.d.ts +6 -0
  5. package/dist/cli/commands/add.d.ts.map +1 -0
  6. package/dist/cli/commands/add.js +150 -0
  7. package/dist/cli/commands/add.js.map +1 -0
  8. package/dist/cli/commands/daemon.d.ts +6 -0
  9. package/dist/cli/commands/daemon.d.ts.map +1 -0
  10. package/dist/cli/commands/daemon.js +97 -0
  11. package/dist/cli/commands/daemon.js.map +1 -0
  12. package/dist/cli/commands/delete.d.ts +6 -0
  13. package/dist/cli/commands/delete.d.ts.map +1 -0
  14. package/dist/cli/commands/delete.js +34 -0
  15. package/dist/cli/commands/delete.js.map +1 -0
  16. package/dist/cli/commands/down.d.ts +6 -0
  17. package/dist/cli/commands/down.d.ts.map +1 -0
  18. package/dist/cli/commands/down.js +53 -0
  19. package/dist/cli/commands/down.js.map +1 -0
  20. package/dist/cli/commands/list.d.ts +6 -0
  21. package/dist/cli/commands/list.d.ts.map +1 -0
  22. package/dist/cli/commands/list.js +41 -0
  23. package/dist/cli/commands/list.js.map +1 -0
  24. package/dist/cli/commands/logs.d.ts +6 -0
  25. package/dist/cli/commands/logs.d.ts.map +1 -0
  26. package/dist/cli/commands/logs.js +124 -0
  27. package/dist/cli/commands/logs.js.map +1 -0
  28. package/dist/cli/commands/run.d.ts +6 -0
  29. package/dist/cli/commands/run.d.ts.map +1 -0
  30. package/dist/cli/commands/run.js +45 -0
  31. package/dist/cli/commands/run.js.map +1 -0
  32. package/dist/cli/commands/scheduler-tick.d.ts +8 -0
  33. package/dist/cli/commands/scheduler-tick.d.ts.map +1 -0
  34. package/dist/cli/commands/scheduler-tick.js +25 -0
  35. package/dist/cli/commands/scheduler-tick.js.map +1 -0
  36. package/dist/cli/commands/show.d.ts +6 -0
  37. package/dist/cli/commands/show.d.ts.map +1 -0
  38. package/dist/cli/commands/show.js +81 -0
  39. package/dist/cli/commands/show.js.map +1 -0
  40. package/dist/cli/commands/status.d.ts +6 -0
  41. package/dist/cli/commands/status.d.ts.map +1 -0
  42. package/dist/cli/commands/status.js +63 -0
  43. package/dist/cli/commands/status.js.map +1 -0
  44. package/dist/cli/commands/toggle.d.ts +6 -0
  45. package/dist/cli/commands/toggle.d.ts.map +1 -0
  46. package/dist/cli/commands/toggle.js +24 -0
  47. package/dist/cli/commands/toggle.js.map +1 -0
  48. package/dist/cli/commands/up.d.ts +6 -0
  49. package/dist/cli/commands/up.d.ts.map +1 -0
  50. package/dist/cli/commands/up.js +48 -0
  51. package/dist/cli/commands/up.js.map +1 -0
  52. package/dist/cli/utils/errors.d.ts +17 -0
  53. package/dist/cli/utils/errors.d.ts.map +1 -0
  54. package/dist/cli/utils/errors.js +37 -0
  55. package/dist/cli/utils/errors.js.map +1 -0
  56. package/dist/cli/utils/output.d.ts +17 -0
  57. package/dist/cli/utils/output.d.ts.map +1 -0
  58. package/dist/cli/utils/output.js +52 -0
  59. package/dist/cli/utils/output.js.map +1 -0
  60. package/dist/cli/utils/prompts.d.ts +8 -0
  61. package/dist/cli/utils/prompts.d.ts.map +1 -0
  62. package/dist/cli/utils/prompts.js +27 -0
  63. package/dist/cli/utils/prompts.js.map +1 -0
  64. package/dist/cli.d.ts +8 -0
  65. package/dist/cli.d.ts.map +1 -0
  66. package/dist/cli.js +71 -0
  67. package/dist/cli.js.map +1 -0
  68. package/dist/core/auth.d.ts +40 -0
  69. package/dist/core/auth.d.ts.map +1 -0
  70. package/dist/core/auth.js +114 -0
  71. package/dist/core/auth.js.map +1 -0
  72. package/dist/core/config.d.ts +43 -0
  73. package/dist/core/config.d.ts.map +1 -0
  74. package/dist/core/config.js +179 -0
  75. package/dist/core/config.js.map +1 -0
  76. package/dist/core/docker.d.ts +60 -0
  77. package/dist/core/docker.d.ts.map +1 -0
  78. package/dist/core/docker.js +507 -0
  79. package/dist/core/docker.js.map +1 -0
  80. package/dist/core/index.d.ts +10 -0
  81. package/dist/core/index.d.ts.map +1 -0
  82. package/dist/core/index.js +10 -0
  83. package/dist/core/index.js.map +1 -0
  84. package/dist/core/jobs.d.ts +53 -0
  85. package/dist/core/jobs.d.ts.map +1 -0
  86. package/dist/core/jobs.js +264 -0
  87. package/dist/core/jobs.js.map +1 -0
  88. package/dist/core/scheduler-runner.d.ts +15 -0
  89. package/dist/core/scheduler-runner.d.ts.map +1 -0
  90. package/dist/core/scheduler-runner.js +230 -0
  91. package/dist/core/scheduler-runner.js.map +1 -0
  92. package/dist/core/scheduler.d.ts +41 -0
  93. package/dist/core/scheduler.d.ts.map +1 -0
  94. package/dist/core/scheduler.js +373 -0
  95. package/dist/core/scheduler.js.map +1 -0
  96. package/dist/core/setup.d.ts +84 -0
  97. package/dist/core/setup.d.ts.map +1 -0
  98. package/dist/core/setup.js +315 -0
  99. package/dist/core/setup.js.map +1 -0
  100. package/dist/core/types.d.ts +181 -0
  101. package/dist/core/types.d.ts.map +1 -0
  102. package/dist/core/types.js +12 -0
  103. package/dist/core/types.js.map +1 -0
  104. package/dist/tui/App.d.ts +7 -0
  105. package/dist/tui/App.d.ts.map +1 -0
  106. package/dist/tui/App.js +103 -0
  107. package/dist/tui/App.js.map +1 -0
  108. package/dist/tui/components/Dashboard.d.ts +9 -0
  109. package/dist/tui/components/Dashboard.d.ts.map +1 -0
  110. package/dist/tui/components/Dashboard.js +70 -0
  111. package/dist/tui/components/Dashboard.js.map +1 -0
  112. package/dist/tui/components/InitWizard.d.ts +2 -0
  113. package/dist/tui/components/InitWizard.d.ts.map +1 -0
  114. package/dist/tui/components/InitWizard.js +522 -0
  115. package/dist/tui/components/InitWizard.js.map +1 -0
  116. package/dist/tui/components/JobDetail.d.ts +12 -0
  117. package/dist/tui/components/JobDetail.d.ts.map +1 -0
  118. package/dist/tui/components/JobDetail.js +137 -0
  119. package/dist/tui/components/JobDetail.js.map +1 -0
  120. package/dist/tui/components/JobForm.d.ts +10 -0
  121. package/dist/tui/components/JobForm.d.ts.map +1 -0
  122. package/dist/tui/components/JobForm.js +183 -0
  123. package/dist/tui/components/JobForm.js.map +1 -0
  124. package/dist/tui/components/JobList.d.ts +11 -0
  125. package/dist/tui/components/JobList.d.ts.map +1 -0
  126. package/dist/tui/components/JobList.js +136 -0
  127. package/dist/tui/components/JobList.js.map +1 -0
  128. package/dist/tui/components/LogViewer.d.ts +10 -0
  129. package/dist/tui/components/LogViewer.d.ts.map +1 -0
  130. package/dist/tui/components/LogViewer.js +184 -0
  131. package/dist/tui/components/LogViewer.js.map +1 -0
  132. package/dist/tui/index.d.ts +11 -0
  133. package/dist/tui/index.d.ts.map +1 -0
  134. package/dist/tui/index.js +11 -0
  135. package/dist/tui/index.js.map +1 -0
  136. package/dist/tui/types.d.ts +21 -0
  137. package/dist/tui/types.d.ts.map +1 -0
  138. package/dist/tui/types.js +5 -0
  139. package/dist/tui/types.js.map +1 -0
  140. package/images/base-tasks/Dockerfile +33 -0
  141. package/images/node-tasks/Dockerfile +36 -0
  142. package/images/pipeline-runner/Dockerfile +43 -0
  143. package/images/pipeline-runner/entrypoint.sh +60 -0
  144. package/images/python-tasks/Dockerfile +43 -0
  145. package/package.json +91 -0
  146. 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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.tsx"],"names":[],"mappings":"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"}
@@ -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":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAGlC,iCAAiC;AACjC,MAAM,CAAC,MAAM,mBAAmB,GAAe;IAC7C,WAAW,EAAE,YAAY;IACzB,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC;IAClD,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC;CACrD,CAAC;AAQF;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,GAAgB,EAAE,UAAsB;IACtE,OAAO,GAAG,CAAC,IAAI,IAAI,UAAU,CAAC,WAAW,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,QAAkB,EAClB,UAAsB,EACtB,MAA+B;IAE/B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,OAAO,GAA2B,EAAE,CAAC;IAE3C,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;QAC9B,4CAA4C;QAC5C,MAAM,UAAU,GAAG,UAAU,CAAC,cAAc,CAAC;QAC7C,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC;QAErC,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,GAAG,UAAU,mBAAmB,CAAC,CAAC;QACjD,CAAC;QACD,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,sBAAsB,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;SAAM,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAClC,4CAA4C;QAC5C,MAAM,YAAY,GAAG,MAAM,EAAE,iBAAiB,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;QAChF,MAAM,OAAO,GAAG,MAAM,EAAE,QAAQ,IAAI,MAAM,EAAE,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;QAE7G,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,CAAC,iBAAiB,GAAG,YAAY,CAAC;QAC3C,CAAC;QACD,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,UAAsB;IACpD,MAAM,UAAU,GAAG,UAAU,CAAC,cAAc,CAAC;IAC7C,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC;IAErC,MAAM,MAAM,GAAG,mBAAmB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAEzD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAC5B,CAAC;AAED,SAAS,mBAAmB,CAC1B,QAAgB,EAChB,KAAa;IAEb,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,KAAK,+BAA+B,QAAQ,EAAE,EAAE,CAAC;IACxF,CAAC;IAED,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,KAAK,wCAAwC,QAAQ,EAAE,EAAE,CAAC;QACjG,CAAC;QAED,MAAM,QAAQ,GAAG,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,KAAK,mCAAmC,QAAQ,EAAE,EAAE,CAAC;QAC5F,CAAC;QAED,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC7B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,KAAK,6BAA6B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;IAC9H,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAgB,EAAE,UAAsB;IACzE,MAAM,IAAI,GAAG,eAAe,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAE9C,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,kCAAkC,CAAC,CAAC;QACzE,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,kCAAkC,CAAC,CAAC;QACzE,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,mCAAmC,GAAG,CAAC,EAAE,SAAS,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC;SAAM,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QAC9B,MAAM,YAAY,GAAG,GAAG,CAAC,GAAG,EAAE,iBAAiB,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;QACjF,MAAM,OAAO,GAAG,GAAG,CAAC,GAAG,EAAE,QAAQ,IAAI,GAAG,CAAC,GAAG,EAAE,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;QAE/G,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;QACrE,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;QACzE,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,mCAAmC,GAAG,CAAC,EAAE,SAAS,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -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"}