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
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scheduler logic - cron parsing and schedule matching
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Cron field names for error messages
|
|
6
|
+
*/
|
|
7
|
+
const CRON_FIELDS = ['minute', 'hour', 'day', 'month', 'weekday'];
|
|
8
|
+
/**
|
|
9
|
+
* Parse a cron field value and check if it matches the current value
|
|
10
|
+
*/
|
|
11
|
+
function matchesCronField(field, currentValue) {
|
|
12
|
+
// Wildcard matches anything
|
|
13
|
+
if (field === '*') {
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
// Step values (*/n)
|
|
17
|
+
const stepMatch = field.match(/^\*\/(\d+)$/);
|
|
18
|
+
if (stepMatch) {
|
|
19
|
+
const step = parseInt(stepMatch[1], 10);
|
|
20
|
+
return currentValue % step === 0;
|
|
21
|
+
}
|
|
22
|
+
// Range with step (n-m/s)
|
|
23
|
+
const rangeStepMatch = field.match(/^(\d+)-(\d+)\/(\d+)$/);
|
|
24
|
+
if (rangeStepMatch) {
|
|
25
|
+
const start = parseInt(rangeStepMatch[1], 10);
|
|
26
|
+
const end = parseInt(rangeStepMatch[2], 10);
|
|
27
|
+
const step = parseInt(rangeStepMatch[3], 10);
|
|
28
|
+
if (currentValue < start || currentValue > end) {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
return (currentValue - start) % step === 0;
|
|
32
|
+
}
|
|
33
|
+
// Range (n-m)
|
|
34
|
+
const rangeMatch = field.match(/^(\d+)-(\d+)$/);
|
|
35
|
+
if (rangeMatch) {
|
|
36
|
+
const start = parseInt(rangeMatch[1], 10);
|
|
37
|
+
const end = parseInt(rangeMatch[2], 10);
|
|
38
|
+
return currentValue >= start && currentValue <= end;
|
|
39
|
+
}
|
|
40
|
+
// Comma-separated values
|
|
41
|
+
if (field.includes(',')) {
|
|
42
|
+
const values = field.split(',');
|
|
43
|
+
return values.some((v) => matchesCronField(v.trim(), currentValue));
|
|
44
|
+
}
|
|
45
|
+
// Exact value
|
|
46
|
+
const exactValue = parseInt(field, 10);
|
|
47
|
+
if (!isNaN(exactValue)) {
|
|
48
|
+
return currentValue === exactValue;
|
|
49
|
+
}
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Check if a weekday cron field matches, treating both 0 and 7 as Sunday.
|
|
54
|
+
* Standard cron: 0=Sunday, 1=Monday, ..., 6=Saturday, 7=Sunday.
|
|
55
|
+
* JS getDay(): 0=Sunday, 1=Monday, ..., 6=Saturday.
|
|
56
|
+
*/
|
|
57
|
+
function matchesWeekdayField(field, currentWeekday) {
|
|
58
|
+
if (field === '*') {
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
// Check if the field matches the current weekday directly
|
|
62
|
+
if (matchesCronField(field, currentWeekday)) {
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
// If today is Sunday (0), also check against 7
|
|
66
|
+
if (currentWeekday === 0 && matchesCronField(field, 7)) {
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
// If the field contains 7 and today is Sunday (0), already handled above.
|
|
70
|
+
// If the field contains 0 and today is Sunday, already handled by direct match.
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Check if a cron expression matches the current time
|
|
75
|
+
*/
|
|
76
|
+
export function cronMatches(cronExpr, date = new Date()) {
|
|
77
|
+
const parts = cronExpr.trim().split(/\s+/);
|
|
78
|
+
if (parts.length !== 5) {
|
|
79
|
+
throw new Error(`Invalid cron expression: expected 5 fields, got ${parts.length}`);
|
|
80
|
+
}
|
|
81
|
+
const [minute, hour, day, month, weekday] = parts;
|
|
82
|
+
// Get current time components
|
|
83
|
+
const currentMinute = date.getMinutes();
|
|
84
|
+
const currentHour = date.getHours();
|
|
85
|
+
const currentDay = date.getDate();
|
|
86
|
+
const currentMonth = date.getMonth() + 1; // JavaScript months are 0-indexed
|
|
87
|
+
const currentWeekday = date.getDay(); // 0=Sunday, 6=Saturday
|
|
88
|
+
return (matchesCronField(minute, currentMinute) &&
|
|
89
|
+
matchesCronField(hour, currentHour) &&
|
|
90
|
+
matchesCronField(day, currentDay) &&
|
|
91
|
+
matchesCronField(month, currentMonth) &&
|
|
92
|
+
matchesWeekdayField(weekday, currentWeekday));
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Check if a one-time schedule should run
|
|
96
|
+
*/
|
|
97
|
+
export function onceShouldRun(datetime, lastRun) {
|
|
98
|
+
// Already run
|
|
99
|
+
if (lastRun) {
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
const targetTime = new Date(datetime).getTime();
|
|
103
|
+
const now = Date.now();
|
|
104
|
+
return now >= targetTime;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Check if a schedule should run now
|
|
108
|
+
*/
|
|
109
|
+
export function shouldRunNow(schedule, lastRun) {
|
|
110
|
+
if (schedule.type === 'cron') {
|
|
111
|
+
return cronMatches(schedule.cron);
|
|
112
|
+
}
|
|
113
|
+
else if (schedule.type === 'once') {
|
|
114
|
+
return onceShouldRun(schedule.datetime, lastRun);
|
|
115
|
+
}
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Parse a cron expression and return human-readable description
|
|
120
|
+
*/
|
|
121
|
+
export function describeCron(cronExpr) {
|
|
122
|
+
const parts = cronExpr.trim().split(/\s+/);
|
|
123
|
+
if (parts.length !== 5) {
|
|
124
|
+
return 'Invalid cron expression';
|
|
125
|
+
}
|
|
126
|
+
const [minute, hour, day, month, weekday] = parts;
|
|
127
|
+
// Common patterns
|
|
128
|
+
if (minute === '*' && hour === '*' && day === '*' && month === '*' && weekday === '*') {
|
|
129
|
+
return 'Every minute';
|
|
130
|
+
}
|
|
131
|
+
if (minute.startsWith('*/') && hour === '*' && day === '*' && month === '*' && weekday === '*') {
|
|
132
|
+
const interval = minute.slice(2);
|
|
133
|
+
return `Every ${interval} minutes`;
|
|
134
|
+
}
|
|
135
|
+
if (hour.startsWith('*/') && day === '*' && month === '*' && weekday === '*') {
|
|
136
|
+
const interval = hour.slice(2);
|
|
137
|
+
const minPart = minute === '0' ? '' : ` at minute ${minute}`;
|
|
138
|
+
return `Every ${interval} hours${minPart}`;
|
|
139
|
+
}
|
|
140
|
+
if (minute !== '*' && hour !== '*' && day === '*' && month === '*' && weekday === '*') {
|
|
141
|
+
return `Every day at ${padTime(hour)}:${padTime(minute)}`;
|
|
142
|
+
}
|
|
143
|
+
if (minute !== '*' && hour !== '*' && day === '*' && month === '*' && weekday !== '*') {
|
|
144
|
+
const days = describeWeekday(weekday);
|
|
145
|
+
return `${days} at ${padTime(hour)}:${padTime(minute)}`;
|
|
146
|
+
}
|
|
147
|
+
if (minute !== '*' && hour !== '*' && day !== '*' && month === '*' && weekday === '*') {
|
|
148
|
+
return `Day ${day} of every month at ${padTime(hour)}:${padTime(minute)}`;
|
|
149
|
+
}
|
|
150
|
+
// Generic description
|
|
151
|
+
const desc = [];
|
|
152
|
+
if (minute !== '*')
|
|
153
|
+
desc.push(`minute ${minute}`);
|
|
154
|
+
if (hour !== '*')
|
|
155
|
+
desc.push(`hour ${hour}`);
|
|
156
|
+
if (day !== '*')
|
|
157
|
+
desc.push(`day ${day}`);
|
|
158
|
+
if (month !== '*')
|
|
159
|
+
desc.push(`month ${month}`);
|
|
160
|
+
if (weekday !== '*')
|
|
161
|
+
desc.push(`weekday ${weekday}`);
|
|
162
|
+
return desc.length > 0 ? `At ${desc.join(', ')}` : 'Every minute';
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Describe a weekday field
|
|
166
|
+
*/
|
|
167
|
+
function describeWeekday(field) {
|
|
168
|
+
// Support both 0=Sunday and 7=Sunday conventions
|
|
169
|
+
const names = {
|
|
170
|
+
0: 'Sun', 1: 'Mon', 2: 'Tue', 3: 'Wed', 4: 'Thu', 5: 'Fri', 6: 'Sat', 7: 'Sun',
|
|
171
|
+
};
|
|
172
|
+
if (field.includes(',')) {
|
|
173
|
+
const days = field.split(',').map((d) => names[parseInt(d, 10)] || d);
|
|
174
|
+
return days.join(', ');
|
|
175
|
+
}
|
|
176
|
+
if (field.includes('-')) {
|
|
177
|
+
const [start, end] = field.split('-').map((d) => parseInt(d, 10));
|
|
178
|
+
return `${names[start] || start} to ${names[end] || end}`;
|
|
179
|
+
}
|
|
180
|
+
const day = parseInt(field, 10);
|
|
181
|
+
if (day in names) {
|
|
182
|
+
return `Every ${names[day]}`;
|
|
183
|
+
}
|
|
184
|
+
return `Weekday ${field}`;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Pad time value to 2 digits
|
|
188
|
+
*/
|
|
189
|
+
function padTime(value) {
|
|
190
|
+
const num = parseInt(value, 10);
|
|
191
|
+
return isNaN(num) ? value : num.toString().padStart(2, '0');
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Describe a one-time schedule
|
|
195
|
+
*/
|
|
196
|
+
export function describeOnce(datetime) {
|
|
197
|
+
const date = new Date(datetime);
|
|
198
|
+
if (isNaN(date.getTime())) {
|
|
199
|
+
return 'Invalid datetime';
|
|
200
|
+
}
|
|
201
|
+
const now = new Date();
|
|
202
|
+
const diff = date.getTime() - now.getTime();
|
|
203
|
+
if (diff < 0) {
|
|
204
|
+
return `Scheduled for ${formatDateTime(date)} (past)`;
|
|
205
|
+
}
|
|
206
|
+
// Format relative time
|
|
207
|
+
const minutes = Math.floor(diff / 60000);
|
|
208
|
+
const hours = Math.floor(minutes / 60);
|
|
209
|
+
const days = Math.floor(hours / 24);
|
|
210
|
+
let relative;
|
|
211
|
+
if (days > 0) {
|
|
212
|
+
relative = `in ${days} day${days > 1 ? 's' : ''}`;
|
|
213
|
+
}
|
|
214
|
+
else if (hours > 0) {
|
|
215
|
+
relative = `in ${hours} hour${hours > 1 ? 's' : ''}`;
|
|
216
|
+
}
|
|
217
|
+
else if (minutes > 0) {
|
|
218
|
+
relative = `in ${minutes} minute${minutes > 1 ? 's' : ''}`;
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
relative = 'shortly';
|
|
222
|
+
}
|
|
223
|
+
return `${formatDateTime(date)} (${relative})`;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Format a date for display
|
|
227
|
+
*/
|
|
228
|
+
function formatDateTime(date) {
|
|
229
|
+
return date.toLocaleString('en-US', {
|
|
230
|
+
year: 'numeric',
|
|
231
|
+
month: 'short',
|
|
232
|
+
day: 'numeric',
|
|
233
|
+
hour: '2-digit',
|
|
234
|
+
minute: '2-digit',
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Describe any schedule type
|
|
239
|
+
*/
|
|
240
|
+
export function describeSchedule(schedule) {
|
|
241
|
+
if (schedule.type === 'cron') {
|
|
242
|
+
return describeCron(schedule.cron);
|
|
243
|
+
}
|
|
244
|
+
else {
|
|
245
|
+
return describeOnce(schedule.datetime);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Validate a cron expression
|
|
250
|
+
*/
|
|
251
|
+
export function validateCron(cronExpr) {
|
|
252
|
+
const parts = cronExpr.trim().split(/\s+/);
|
|
253
|
+
if (parts.length !== 5) {
|
|
254
|
+
return `Expected 5 fields, got ${parts.length}`;
|
|
255
|
+
}
|
|
256
|
+
const ranges = [
|
|
257
|
+
{ min: 0, max: 59 }, // minute
|
|
258
|
+
{ min: 0, max: 23 }, // hour
|
|
259
|
+
{ min: 1, max: 31 }, // day
|
|
260
|
+
{ min: 1, max: 12 }, // month
|
|
261
|
+
{ min: 0, max: 7 }, // weekday (0 and 7 are Sunday)
|
|
262
|
+
];
|
|
263
|
+
for (let i = 0; i < 5; i++) {
|
|
264
|
+
const field = parts[i];
|
|
265
|
+
const { min, max } = ranges[i];
|
|
266
|
+
const error = validateCronField(field, min, max);
|
|
267
|
+
if (error) {
|
|
268
|
+
return `${CRON_FIELDS[i]}: ${error}`;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
return null;
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Validate a single cron field
|
|
275
|
+
*/
|
|
276
|
+
function validateCronField(field, min, max) {
|
|
277
|
+
if (field === '*') {
|
|
278
|
+
return null;
|
|
279
|
+
}
|
|
280
|
+
// Handle comma-separated values
|
|
281
|
+
if (field.includes(',')) {
|
|
282
|
+
for (const part of field.split(',')) {
|
|
283
|
+
const error = validateCronField(part.trim(), min, max);
|
|
284
|
+
if (error)
|
|
285
|
+
return error;
|
|
286
|
+
}
|
|
287
|
+
return null;
|
|
288
|
+
}
|
|
289
|
+
// Handle step values
|
|
290
|
+
if (field.includes('/')) {
|
|
291
|
+
const [range, step] = field.split('/');
|
|
292
|
+
const stepNum = parseInt(step, 10);
|
|
293
|
+
if (isNaN(stepNum) || stepNum < 1) {
|
|
294
|
+
return `Invalid step value: ${step}`;
|
|
295
|
+
}
|
|
296
|
+
if (range !== '*') {
|
|
297
|
+
return validateCronField(range, min, max);
|
|
298
|
+
}
|
|
299
|
+
return null;
|
|
300
|
+
}
|
|
301
|
+
// Handle ranges
|
|
302
|
+
if (field.includes('-')) {
|
|
303
|
+
const [start, end] = field.split('-').map((s) => parseInt(s, 10));
|
|
304
|
+
if (isNaN(start) || isNaN(end)) {
|
|
305
|
+
return `Invalid range: ${field}`;
|
|
306
|
+
}
|
|
307
|
+
if (start < min || start > max) {
|
|
308
|
+
return `Start value ${start} out of range (${min}-${max})`;
|
|
309
|
+
}
|
|
310
|
+
if (end < min || end > max) {
|
|
311
|
+
return `End value ${end} out of range (${min}-${max})`;
|
|
312
|
+
}
|
|
313
|
+
if (start > end) {
|
|
314
|
+
return `Start value ${start} greater than end ${end}`;
|
|
315
|
+
}
|
|
316
|
+
return null;
|
|
317
|
+
}
|
|
318
|
+
// Handle single value
|
|
319
|
+
const value = parseInt(field, 10);
|
|
320
|
+
if (isNaN(value)) {
|
|
321
|
+
return `Invalid value: ${field}`;
|
|
322
|
+
}
|
|
323
|
+
if (value < min || value > max) {
|
|
324
|
+
return `Value ${value} out of range (${min}-${max})`;
|
|
325
|
+
}
|
|
326
|
+
return null;
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Get next run time for a cron expression (approximate)
|
|
330
|
+
*/
|
|
331
|
+
export function getNextRun(schedule) {
|
|
332
|
+
if (schedule.type === 'once') {
|
|
333
|
+
const date = new Date(schedule.datetime);
|
|
334
|
+
return isNaN(date.getTime()) ? null : date;
|
|
335
|
+
}
|
|
336
|
+
// For cron, find the next matching minute
|
|
337
|
+
const now = new Date();
|
|
338
|
+
const check = new Date(now);
|
|
339
|
+
check.setSeconds(0);
|
|
340
|
+
check.setMilliseconds(0);
|
|
341
|
+
// Check up to 1 week ahead
|
|
342
|
+
for (let i = 0; i < 60 * 24 * 7; i++) {
|
|
343
|
+
check.setMinutes(check.getMinutes() + 1);
|
|
344
|
+
if (cronMatches(schedule.cron, check)) {
|
|
345
|
+
return check;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
return null;
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Format relative time
|
|
352
|
+
*/
|
|
353
|
+
export function formatRelativeTime(date) {
|
|
354
|
+
const now = Date.now();
|
|
355
|
+
const diff = date.getTime() - now;
|
|
356
|
+
const absDiff = Math.abs(diff);
|
|
357
|
+
const minutes = Math.floor(absDiff / 60000);
|
|
358
|
+
const hours = Math.floor(minutes / 60);
|
|
359
|
+
const days = Math.floor(hours / 24);
|
|
360
|
+
const suffix = diff < 0 ? ' ago' : '';
|
|
361
|
+
const prefix = diff >= 0 ? 'in ' : '';
|
|
362
|
+
if (days > 0) {
|
|
363
|
+
return `${prefix}${days} day${days > 1 ? 's' : ''}${suffix}`;
|
|
364
|
+
}
|
|
365
|
+
if (hours > 0) {
|
|
366
|
+
return `${prefix}${hours} hour${hours > 1 ? 's' : ''}${suffix}`;
|
|
367
|
+
}
|
|
368
|
+
if (minutes > 0) {
|
|
369
|
+
return `${prefix}${minutes} min${minutes > 1 ? 's' : ''}${suffix}`;
|
|
370
|
+
}
|
|
371
|
+
return diff >= 0 ? 'now' : 'just now';
|
|
372
|
+
}
|
|
373
|
+
//# sourceMappingURL=scheduler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/core/scheduler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Setup logic for Agent Oven init wizard
|
|
3
|
+
* All functions are idempotent — they check state before acting.
|
|
4
|
+
*/
|
|
5
|
+
import { getColimaStatus, startColima, isDockerAvailable } from './docker.js';
|
|
6
|
+
import type { Config } from './types.js';
|
|
7
|
+
export { getColimaStatus, startColima, isDockerAvailable };
|
|
8
|
+
export interface DependencyStatus {
|
|
9
|
+
installed: boolean;
|
|
10
|
+
version?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Check if Homebrew is installed
|
|
14
|
+
*/
|
|
15
|
+
export declare function checkHomebrew(): Promise<DependencyStatus>;
|
|
16
|
+
/**
|
|
17
|
+
* Check if a command-line dependency exists
|
|
18
|
+
*/
|
|
19
|
+
export declare function checkDependency(name: string): Promise<DependencyStatus>;
|
|
20
|
+
/**
|
|
21
|
+
* Install a package via Homebrew
|
|
22
|
+
*/
|
|
23
|
+
export declare function brewInstall(pkg: string, onOutput?: (line: string) => void): Promise<'installed' | 'already-installed' | 'failed'>;
|
|
24
|
+
/**
|
|
25
|
+
* Create required directories and files
|
|
26
|
+
*/
|
|
27
|
+
export declare function setupFiles(projectDir: string): {
|
|
28
|
+
created: string[];
|
|
29
|
+
existed: string[];
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Scan images/ directory for subdirs containing Dockerfiles
|
|
33
|
+
*/
|
|
34
|
+
export declare function discoverImages(projectDir: string): string[];
|
|
35
|
+
/**
|
|
36
|
+
* Build a Docker image from the images/ directory
|
|
37
|
+
*/
|
|
38
|
+
export declare function buildImage(projectDir: string, imageName: string, onOutput?: (line: string) => void): Promise<{
|
|
39
|
+
success: boolean;
|
|
40
|
+
error?: string;
|
|
41
|
+
}>;
|
|
42
|
+
/**
|
|
43
|
+
* Detect the system timezone
|
|
44
|
+
*/
|
|
45
|
+
export declare function detectTimezone(): string;
|
|
46
|
+
/**
|
|
47
|
+
* Resolve the command array for the launchd plist ProgramArguments.
|
|
48
|
+
*
|
|
49
|
+
* Strategy:
|
|
50
|
+
* 1. Pin to the currently-running CLI process where possible.
|
|
51
|
+
* 2. Fallback to project-local dist/cli.js (for built source checkouts).
|
|
52
|
+
* 3. Fallback to package-local dist/cli.js (for npm global installs).
|
|
53
|
+
* 4. Final fallback: legacy scheduler.sh for unbuilt source checkouts.
|
|
54
|
+
*/
|
|
55
|
+
export declare function resolveSchedulerCommand(projectDir: string): Promise<string[]>;
|
|
56
|
+
/**
|
|
57
|
+
* Generate launchd plist XML content
|
|
58
|
+
*/
|
|
59
|
+
export declare function generatePlistContent(projectDir: string): Promise<string>;
|
|
60
|
+
/**
|
|
61
|
+
* Install the launchd agent
|
|
62
|
+
*/
|
|
63
|
+
export declare function installLaunchd(projectDir: string): Promise<{
|
|
64
|
+
success: boolean;
|
|
65
|
+
error?: string;
|
|
66
|
+
}>;
|
|
67
|
+
/**
|
|
68
|
+
* Verify Docker is available and get version
|
|
69
|
+
*/
|
|
70
|
+
export declare function verifyDocker(): Promise<{
|
|
71
|
+
available: boolean;
|
|
72
|
+
version?: string;
|
|
73
|
+
}>;
|
|
74
|
+
/**
|
|
75
|
+
* Build and save a full Config object from wizard selections
|
|
76
|
+
*/
|
|
77
|
+
export declare function buildConfig(opts: {
|
|
78
|
+
projectDir: string;
|
|
79
|
+
cpu: number;
|
|
80
|
+
memory: number;
|
|
81
|
+
disk: number;
|
|
82
|
+
timezone: string;
|
|
83
|
+
}): Config;
|
|
84
|
+
//# sourceMappingURL=setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/core/setup.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAE9E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,iBAAiB,EAAE,CAAC;AAE3D,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAQ/D;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAiB7E;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,GAAG,EAAE,MAAM,EACX,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAChC,OAAO,CAAC,WAAW,GAAG,mBAAmB,GAAG,QAAQ,CAAC,CAgCvD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CA2BvF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAY3D;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAChC,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA8B/C;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED;;;;;;;;GAQG;AACH,wBAAsB,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAkCnF;AASD;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAuC9E;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAyBtG;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAYtF;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,MAAM,CAsBT"}
|