mirror of
https://github.com/Ark0N/Codeman.git
synced 2026-10-03 14:09:42 +02:00
- Reject multi-line prompts end-to-end: schema refines on promptText/ launchCommand, runtime check in resolvePrompt (prompt-file content; trailing newlines tolerated), matching cron-ui form validation — delivery is single-line only, so multi-line was silently corrupted (typed mode fused lines, paste mode submitted partials) - Close the workingDir confinement bypass (arbitrary server-side file read, e.g. workingDir=/proc + /proc/self/environ): realpath-resolve workingDir before the containment check, reject '/' and blocked/pseudo-fs trees (/proc, /sys, /dev + the attachment-guard blocklist) at fire time AND at job create/update (workingDir must exist and be a directory) - Session lifecycle: new per-job autoClosePreviousSession (default true, recurring schedules only; ignored for 'once') — the previous run's still-open session is closed via the normal cleanupSession path when the next run fires; UI switch added; 50-session cap math documented in docs/cron-guide.md §8 - skip_if_same_agent_running: count only live sessions (exclude stopped/error dead tabs), exclude sessions created by this job's own runs (fixes the fire-once-then-skip-forever self-deadlock), and a skipped 'once' job stays armed and retries next tick instead of being consumed; liveness filter mirrored in cron-ui _countActiveAgents - Wire launchCommand (was accepted+documented but dead): shell mode sends it via writeViaMux as the first input line after startShell readiness (single-line, schema-enforced); form field shown for shell agent type - Record delivery failures: a false writeViaMux result now fails the run instead of recording a false 'prompt_sent' - Cap saved jobs at MAX_CRON_JOBS (100) to bound state.json growth - Surface field-specific schema messages (drop parseBody custom errorMessage on cron create/update) - Tests: workingDir create/update validation, /proc bypass regression, single-line enforcement (schema+runtime+trailing-newline tolerance), live/own-session skip filtering, once-skip re-arm, auto-close on/off/once, job-count cap Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
33 lines
1021 B
TypeScript
33 lines
1021 B
TypeScript
/**
|
|
* @fileoverview Input shape for creating/updating a cron job. This is the
|
|
* user-settable subset of `CronJob` (server-maintained bookkeeping fields
|
|
* such as nextRunAt / lastStatus are excluded). Produced by the zod schema.
|
|
*/
|
|
|
|
import type { ConcurrencyPolicy, InputMode, PromptMode, ScheduleType } from '../types/cron.js';
|
|
import type { SessionMode } from '../types/session.js';
|
|
|
|
export type { CronJob, CronJobRun, CronJobRunStatus, TriggerType } from '../types/cron.js';
|
|
|
|
export interface CronJobInput {
|
|
name: string;
|
|
agentType: SessionMode;
|
|
workingDir: string;
|
|
launchCommand?: string;
|
|
promptMode: PromptMode;
|
|
promptText?: string;
|
|
promptFilePath?: string;
|
|
inputMode: InputMode;
|
|
scheduleType: ScheduleType;
|
|
runAt?: number;
|
|
intervalMinutes?: number;
|
|
dailyTime?: string;
|
|
weeklyDays?: number[];
|
|
weeklyTime?: string;
|
|
enabled: boolean;
|
|
notes?: string;
|
|
concurrencyPolicy: ConcurrencyPolicy;
|
|
/** Default true. Ignored for 'once' schedules. */
|
|
autoClosePreviousSession?: boolean;
|
|
}
|