* fix(app): schedules UI speaks the user's timezone * refactor(server): require explicit agent placement and bind create-agent command * fix(server): scheduled agents get a workspace and show in the sidebar * fix(server): loop agents get a workspace and show in the sidebar * fix(server): preserve scheduled and loop run semantics through the create command * fix(server): serialize all schedule record writes through the per-schedule queue * fix(server): tighten create-agent dependency contracts * fix(server): handle schedule restamps and loop cancellations * fix(server): preserve scheduled and loop create semantics * refactor(server): schedule store owns atomic mutations * fix(server): keep schedule stamp reuse deterministic * fix(server): handle loop workspace stamp rejection * refactor(server): schedule store owns typed identity upsert * fix(server): keep schedule workspace stamps server-owned * fix(server): preserve scheduled run semantics * refactor: required nullable workspaceId replaces placement union; pure cadence policy * fix(server): tighten scheduled and loop agent edges * fix(server): fail canceled scheduled runs * fix(server): close schedule and loop cwd edges * fix(server): refresh schedule workspace stamps * fix(server): preserve schedule timezone on replace * fix(server): close loop stop and cadence reset edges
181 lines
4.8 KiB
TypeScript
181 lines
4.8 KiB
TypeScript
import { z } from "zod";
|
|
import {
|
|
ScheduleCadenceSchema,
|
|
ScheduleRunSchema,
|
|
ScheduleSummarySchema,
|
|
StoredScheduleSchema,
|
|
ScheduleTargetSchema,
|
|
} from "./types.js";
|
|
|
|
const ScheduleCreateNewAgentConfigSchema = ScheduleTargetSchema.options[1].shape.config.omit({
|
|
workspaceId: true,
|
|
});
|
|
|
|
const ScheduleCreateTargetSchema = z.discriminatedUnion("type", [
|
|
z.object({
|
|
type: z.literal("self"),
|
|
agentId: z.guid(),
|
|
}),
|
|
z.object({
|
|
type: z.literal("agent"),
|
|
agentId: z.guid(),
|
|
}),
|
|
z.object({
|
|
type: z.literal("new-agent"),
|
|
config: ScheduleCreateNewAgentConfigSchema,
|
|
}),
|
|
]);
|
|
|
|
export const ScheduleCreateRequestSchema = z.object({
|
|
type: z.literal("schedule/create"),
|
|
requestId: z.string(),
|
|
prompt: z.string().min(1),
|
|
name: z.string().optional(),
|
|
cadence: ScheduleCadenceSchema,
|
|
target: ScheduleCreateTargetSchema,
|
|
maxRuns: z.number().int().positive().optional(),
|
|
expiresAt: z.string().optional(),
|
|
runOnCreate: z.boolean().optional(),
|
|
});
|
|
|
|
export const ScheduleListRequestSchema = z.object({
|
|
type: z.literal("schedule/list"),
|
|
requestId: z.string(),
|
|
});
|
|
|
|
export const ScheduleInspectRequestSchema = z.object({
|
|
type: z.literal("schedule/inspect"),
|
|
requestId: z.string(),
|
|
scheduleId: z.string(),
|
|
});
|
|
|
|
export const ScheduleLogsRequestSchema = z.object({
|
|
type: z.literal("schedule/logs"),
|
|
requestId: z.string(),
|
|
scheduleId: z.string(),
|
|
});
|
|
|
|
export const SchedulePauseRequestSchema = z.object({
|
|
type: z.literal("schedule/pause"),
|
|
requestId: z.string(),
|
|
scheduleId: z.string(),
|
|
});
|
|
|
|
export const ScheduleResumeRequestSchema = z.object({
|
|
type: z.literal("schedule/resume"),
|
|
requestId: z.string(),
|
|
scheduleId: z.string(),
|
|
});
|
|
|
|
export const ScheduleDeleteRequestSchema = z.object({
|
|
type: z.literal("schedule/delete"),
|
|
requestId: z.string(),
|
|
scheduleId: z.string(),
|
|
});
|
|
|
|
export const ScheduleRunOnceRequestSchema = z.object({
|
|
type: z.literal("schedule/run-once"),
|
|
requestId: z.string(),
|
|
scheduleId: z.string(),
|
|
});
|
|
|
|
const ScheduleUpdateNewAgentConfigSchema = z.object({
|
|
provider: z.string().trim().min(1).optional(),
|
|
model: z.string().trim().min(1).nullable().optional(),
|
|
modeId: z.string().trim().min(1).nullable().optional(),
|
|
cwd: z.string().trim().min(1).optional(),
|
|
});
|
|
|
|
export const ScheduleUpdateRequestSchema = z.object({
|
|
type: z.literal("schedule/update"),
|
|
requestId: z.string(),
|
|
scheduleId: z.string(),
|
|
name: z.string().nullable().optional(),
|
|
prompt: z.string().min(1).optional(),
|
|
cadence: ScheduleCadenceSchema.optional(),
|
|
newAgentConfig: ScheduleUpdateNewAgentConfigSchema.optional(),
|
|
maxRuns: z.number().int().positive().nullable().optional(),
|
|
expiresAt: z.string().nullable().optional(),
|
|
});
|
|
|
|
export const ScheduleCreateResponseSchema = z.object({
|
|
type: z.literal("schedule/create/response"),
|
|
payload: z.object({
|
|
requestId: z.string(),
|
|
schedule: ScheduleSummarySchema.nullable(),
|
|
error: z.string().nullable(),
|
|
}),
|
|
});
|
|
|
|
export const ScheduleListResponseSchema = z.object({
|
|
type: z.literal("schedule/list/response"),
|
|
payload: z.object({
|
|
requestId: z.string(),
|
|
schedules: z.array(ScheduleSummarySchema),
|
|
error: z.string().nullable(),
|
|
}),
|
|
});
|
|
|
|
export const ScheduleInspectResponseSchema = z.object({
|
|
type: z.literal("schedule/inspect/response"),
|
|
payload: z.object({
|
|
requestId: z.string(),
|
|
schedule: StoredScheduleSchema.nullable(),
|
|
error: z.string().nullable(),
|
|
}),
|
|
});
|
|
|
|
export const ScheduleLogsResponseSchema = z.object({
|
|
type: z.literal("schedule/logs/response"),
|
|
payload: z.object({
|
|
requestId: z.string(),
|
|
runs: z.array(ScheduleRunSchema),
|
|
error: z.string().nullable(),
|
|
}),
|
|
});
|
|
|
|
export const SchedulePauseResponseSchema = z.object({
|
|
type: z.literal("schedule/pause/response"),
|
|
payload: z.object({
|
|
requestId: z.string(),
|
|
schedule: ScheduleSummarySchema.nullable(),
|
|
error: z.string().nullable(),
|
|
}),
|
|
});
|
|
|
|
export const ScheduleResumeResponseSchema = z.object({
|
|
type: z.literal("schedule/resume/response"),
|
|
payload: z.object({
|
|
requestId: z.string(),
|
|
schedule: ScheduleSummarySchema.nullable(),
|
|
error: z.string().nullable(),
|
|
}),
|
|
});
|
|
|
|
export const ScheduleDeleteResponseSchema = z.object({
|
|
type: z.literal("schedule/delete/response"),
|
|
payload: z.object({
|
|
requestId: z.string(),
|
|
scheduleId: z.string(),
|
|
error: z.string().nullable(),
|
|
}),
|
|
});
|
|
|
|
export const ScheduleRunOnceResponseSchema = z.object({
|
|
type: z.literal("schedule/run-once/response"),
|
|
payload: z.object({
|
|
requestId: z.string(),
|
|
schedule: StoredScheduleSchema.nullable(),
|
|
error: z.string().nullable(),
|
|
}),
|
|
});
|
|
|
|
export const ScheduleUpdateResponseSchema = z.object({
|
|
type: z.literal("schedule/update/response"),
|
|
payload: z.object({
|
|
requestId: z.string(),
|
|
schedule: StoredScheduleSchema.nullable(),
|
|
error: z.string().nullable(),
|
|
}),
|
|
});
|