feat(automation): add isolated job delivery mode

This commit is contained in:
William Valentin
2026-02-15 19:23:15 -08:00
parent 0470647ee7
commit 421942f66d
13 changed files with 183 additions and 11 deletions
+15 -2
View File
@@ -2,12 +2,15 @@ import { Cron } from 'croner';
import type { CronJobConfig } from '../config/schema.js';
import type { ChannelAdapter, ChannelStatus, InboundMessage, OutboundMessage } from '../channels/types.js';
import { auditLogger } from '../audit/index.js';
import { randomUUID } from 'crypto';
/** Minimal interface for the parts of ChannelRegistry we need. */
interface ChannelLookup {
get(name: string): { send(peerId: string, message: OutboundMessage): Promise<void> } | undefined;
}
type DeliveryMode = 'shared_session' | 'isolated_job';
export class CronScheduler implements ChannelAdapter {
readonly name = 'cron';
private _status: ChannelStatus = 'disconnected';
@@ -18,6 +21,7 @@ export class CronScheduler implements ChannelAdapter {
constructor(
private readonly jobConfigs: CronJobConfig[],
private readonly channelLookup: ChannelLookup,
private readonly deliveryMode: DeliveryMode = 'shared_session',
) {
for (const job of jobConfigs) {
this.jobs.set(job.name, job);
@@ -85,15 +89,24 @@ export class CronScheduler implements ChannelAdapter {
triggerJob(jobName: string): void {
const job = this.jobs.get(jobName);
if (!job) {return;}
const runId = `run-${randomUUID()}`;
const senderId = this.deliveryMode === 'isolated_job' ? `${jobName}:${runId}` : jobName;
const msg: InboundMessage = {
id: `cron-${jobName}-${Date.now()}`,
channel: 'cron',
senderId: jobName,
senderId,
senderName: `cron:${jobName}`,
text: job.message,
timestamp: Date.now(),
metadata: { cronJob: jobName, scheduled: true, modelTier: job.model_tier },
metadata: {
cronJob: jobName,
scheduled: true,
modelTier: job.model_tier,
deliveryMode: this.deliveryMode,
runId,
replyPeerId: jobName,
},
};
auditLogger?.cronTrigger({