feat(automation): add isolated job delivery mode
This commit is contained in:
+15
-2
@@ -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({
|
||||
|
||||
Reference in New Issue
Block a user