@keystrokehq/scheduler 0.1.5 → 0.2.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/README.md +5 -3
- package/dist/contract-C5JvbyQ-.cjs.map +1 -1
- package/dist/{contract-BGjcxdxT.d.cts → contract-DyhRC8AI.d.cts} +30 -7
- package/dist/contract-DyhRC8AI.d.cts.map +1 -0
- package/dist/{contract-BGjcxdxT.d.mts → contract-DyhRC8AI.d.mts} +30 -7
- package/dist/contract-DyhRC8AI.d.mts.map +1 -0
- package/dist/contract-E1QJBH6_.mjs.map +1 -1
- package/dist/contract.d.cts +2 -2
- package/dist/contract.d.mts +2 -2
- package/dist/index.cjs +298 -121
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +55 -5
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +55 -5
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +294 -123
- package/dist/index.mjs.map +1 -1
- package/package.json +6 -6
- package/dist/contract-BGjcxdxT.d.cts.map +0 -1
- package/dist/contract-BGjcxdxT.d.mts.map +0 -1
package/README.md
CHANGED
|
@@ -11,7 +11,7 @@ Job queue and cron/poll schedule sync for [keystroke](../../README.md). Enqueues
|
|
|
11
11
|
- **`createMemoryJobQueue`** — in-process queue for tests (optional `sync: true` drain).
|
|
12
12
|
- **Job types** — `JobQueue`, `Scheduler`, `JobHandler`, `EnqueueInput`, `JobTrigger`, `StopFn` for server handlers and enqueue helpers.
|
|
13
13
|
- **Schedule sync** — `syncTriggerSchedules` (on `Scheduler`) upserts rows in `trigger_schedules` via `@keystrokehq/database`, resolving cron strings with **`resolveCronSchedule`** and next run times with **`nextTriggerRunAt`** from `@keystrokehq/trigger`.
|
|
14
|
-
- **
|
|
14
|
+
- **Trigger firing** — pluggable `TriggerScheduler`. pg-boss (Postgres) and BullMQ register native cron schedules on `sync`, so there is no per-second poll; the SQLite/self-host DB queue uses the **schedule ticker** (background loop claims due schedules and enqueues `kind: "trigger"` jobs). `trigger_schedules` stays the source of truth, reconciled into the firing backend on every `sync`.
|
|
15
15
|
|
|
16
16
|
Queue implementations (`database-queue`, `pg-boss-queue`) and standalone `syncTriggerSchedules` / `resolveTriggerSchedule` stay internal unless a consumer needs them in a follow-up.
|
|
17
17
|
|
|
@@ -69,11 +69,13 @@ Import from the package root (`@keystrokehq/scheduler`), not from `src/…`.
|
|
|
69
69
|
| `types.ts` | Job + scheduler types, retry backoff helper |
|
|
70
70
|
| `create-scheduler.ts` | `createScheduler`, `createJobQueue`, `wrapJobQueueAsScheduler` |
|
|
71
71
|
| `database-queue.ts` | SQLite / generic Postgres job table worker |
|
|
72
|
-
| `pg-boss-queue.ts` | Postgres pg-boss backend
|
|
72
|
+
| `pg-boss-queue.ts` | Postgres pg-boss backend (exposes `boss` for native scheduling) |
|
|
73
|
+
| `pg-boss-trigger-scheduler.ts` | pg-boss native cron `TriggerScheduler` (no poll loop) |
|
|
74
|
+
| `database-trigger-scheduler.ts` | DB-ticker `TriggerScheduler` for the polling/SQLite backend |
|
|
73
75
|
| `memory.ts` | In-memory `JobQueue` |
|
|
74
76
|
| `sync-trigger-schedules.ts` | DB upsert for discovered cron/poll attachments |
|
|
75
77
|
| `resolve-schedule.ts` | Override-aware cron string (uses trigger's `resolveCronSchedule`) |
|
|
76
|
-
| `schedule-ticker.ts` | Claim due schedules → enqueue trigger jobs
|
|
78
|
+
| `schedule-ticker.ts` | Claim due schedules → enqueue trigger jobs (polling backend) |
|
|
77
79
|
|
|
78
80
|
## Adding a feature?
|
|
79
81
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract-C5JvbyQ-.cjs","names":[],"sources":["../src/types.ts","../src/contract.ts"],"sourcesContent":["export type JobKind = \"workflow\" | \"agent\" | \"trigger\" | \"trigger-overview\" | \"runtime\";\n\nexport type JobTrigger = \"api\" | \"cron\" | \"webhook\" | \"poll\" | \"retry\" | \"prompt\";\n\nexport type JobPayload = {\n kind: JobKind;\n targetId: string;\n runId: string;\n trigger: JobTrigger;\n payload: unknown;\n attempt: number;\n maxAttempts: number;\n /** True when this delivery is the final retry attempt. */\n exhaustedRetries?: boolean;\n scheduledAt: Date;\n jobId: string;\n /** Project scope for org-wide worker queues. */\n projectId?: string;\n};\n\nexport type EnqueueInput = {\n kind: JobKind;\n targetId: string;\n runId: string;\n trigger: JobTrigger;\n payload?: unknown;\n scheduledAt?: Date;\n attempt?: number;\n maxAttempts?: number;\n /** Dedupe key — pg-boss singletonKey / BullMQ jobId. */\n dedupeKey?: string;\n /** Project scope for org-wide worker queues. */\n projectId?: string;\n};\n\nexport type JobHandler = (job: JobPayload) => Promise<void>;\n\nexport type CancelHandler = (runId: string) => void | Promise<void>;\n\nexport type StopFn = () => Promise<void> | void;\n\nexport type WorkerOptions = {\n workerId?: string;\n pollIntervalMs?: number;\n leaseSweepIntervalMs?: number;\n};\n\nexport type JobQueue = {\n enqueue(input: EnqueueInput): Promise<string>;\n startWorker(handler: JobHandler, options?: WorkerOptions): Promise<StopFn>;\n publishCancel(runId: string): Promise<void>;\n subscribeCancel(handler: CancelHandler): Promise<StopFn>;\n};\n\nimport type { SchedulerPlugin, SchedulerScope } from \"./contract\";\n\nexport type CreateJobQueueOptions = {\n url?: string;\n dialect?: \"postgres\" | \"sqlite\";\n adapter?: JobQueue;\n plugin?: SchedulerPlugin;\n scope?: SchedulerScope;\n projectId?: string;\n organizationId?: string;\n};\n\nexport type
|
|
1
|
+
{"version":3,"file":"contract-C5JvbyQ-.cjs","names":[],"sources":["../src/types.ts","../src/contract.ts"],"sourcesContent":["export type JobKind = \"workflow\" | \"agent\" | \"trigger\" | \"trigger-overview\" | \"runtime\";\n\nexport type JobTrigger = \"api\" | \"cron\" | \"webhook\" | \"poll\" | \"retry\" | \"prompt\";\n\nexport type JobPayload = {\n kind: JobKind;\n targetId: string;\n runId: string;\n trigger: JobTrigger;\n payload: unknown;\n attempt: number;\n maxAttempts: number;\n /** True when this delivery is the final retry attempt. */\n exhaustedRetries?: boolean;\n scheduledAt: Date;\n jobId: string;\n /** Project scope for org-wide worker queues. */\n projectId?: string;\n};\n\nexport type EnqueueInput = {\n kind: JobKind;\n targetId: string;\n runId: string;\n trigger: JobTrigger;\n payload?: unknown;\n scheduledAt?: Date;\n attempt?: number;\n maxAttempts?: number;\n /** Dedupe key — pg-boss singletonKey / BullMQ jobId. */\n dedupeKey?: string;\n /** Project scope for org-wide worker queues. */\n projectId?: string;\n};\n\nexport type JobHandler = (job: JobPayload) => Promise<void>;\n\nexport type CancelHandler = (runId: string) => void | Promise<void>;\n\nexport type StopFn = () => Promise<void> | void;\n\nexport type WorkerOptions = {\n workerId?: string;\n pollIntervalMs?: number;\n leaseSweepIntervalMs?: number;\n};\n\nexport type JobQueue = {\n enqueue(input: EnqueueInput): Promise<string>;\n startWorker(handler: JobHandler, options?: WorkerOptions): Promise<StopFn>;\n publishCancel(runId: string): Promise<void>;\n subscribeCancel(handler: CancelHandler): Promise<StopFn>;\n};\n\nimport type { SchedulerPlugin, SchedulerScope, TriggerScheduleSpec } from \"./contract\";\n\nexport type { TriggerScheduleSpec };\n\nexport type CreateJobQueueOptions = {\n url?: string;\n dialect?: \"postgres\" | \"sqlite\";\n adapter?: JobQueue;\n plugin?: SchedulerPlugin;\n scope?: SchedulerScope;\n projectId?: string;\n organizationId?: string;\n};\n\nexport type ScheduleSyncOptions = {\n schedules: TriggerScheduleSpec[];\n scheduleOverrides?: {\n global?: string;\n byTrigger?: Record<string, string>;\n };\n};\n\nexport type ScheduleTickerOptions = {\n pollIntervalMs?: number;\n batchSize?: number;\n /** When `organization`, claims due schedules across all projects in the org schema. */\n scope?: \"project\" | \"organization\";\n};\n\nexport type Scheduler = JobQueue & {\n syncTriggerSchedules(options: ScheduleSyncOptions): Promise<void>;\n startScheduleTicker(options?: ScheduleTickerOptions): Promise<StopFn>;\n fireDueSchedules(asOf?: Date): Promise<number>;\n upsertTriggerSchedule?(\n spec: TriggerScheduleSpec,\n overrides?: ScheduleSyncOptions[\"scheduleOverrides\"],\n ): Promise<void>;\n removeTriggerSchedule?(triggerSlug: string, projectId?: string): Promise<void>;\n};\n\nexport type CreateSchedulerOptions = CreateJobQueueOptions;\n\nexport const DEFAULT_RETRY_DELAY_MS = 5_000;\n\nexport function retryDelayMs(attempt: number): number {\n return DEFAULT_RETRY_DELAY_MS * 2 ** Math.max(0, attempt - 1);\n}\n","export type {\n JobKind,\n JobTrigger,\n JobPayload,\n EnqueueInput,\n JobHandler,\n CancelHandler,\n StopFn,\n WorkerOptions,\n JobQueue,\n} from \"./types\";\nexport { retryDelayMs, DEFAULT_RETRY_DELAY_MS } from \"./types\";\n\nimport type { JobQueue, StopFn } from \"./types\";\n\n/**\n * Inlined to keep the contract database-free — structurally identical to\n * `@keystrokehq/database`'s `DatabaseDialect`. Importing it from the database\n * package would re-introduce the dependency `./contract` exists to avoid.\n */\nexport type DatabaseDialect = \"postgres\" | \"sqlite\";\n\nexport type SchedulerScope = \"platform\" | \"project\" | \"organization\";\n\nexport type SchedulerPluginContext = {\n scope: SchedulerScope;\n url?: string;\n dialect?: DatabaseDialect;\n projectId?: string;\n organizationId?: string;\n};\n\nexport type TriggerScheduleSpec = {\n triggerSlug: string;\n kind: \"cron\" | \"poll\";\n schedule: string;\n /** Project scope for org-wide worker queues. */\n projectId?: string;\n};\n\nexport type TriggerScheduleSyncOptions = {\n schedules: TriggerScheduleSpec[];\n scheduleOverrides?: {\n global?: string;\n byTrigger?: Record<string, string>;\n };\n};\n\nexport type TriggerSchedulerStartOptions = {\n pollIntervalMs?: number;\n batchSize?: number;\n /** When `organization`, claims due schedules across all projects in the org schema. */\n scope?: \"project\" | \"organization\";\n};\n\nexport type TriggerScheduler = {\n sync(options: TriggerScheduleSyncOptions): Promise<void>;\n start(options?: TriggerSchedulerStartOptions): Promise<StopFn>;\n /** Register or refresh one trigger schedule in the firing backend. */\n upsert?(\n spec: TriggerScheduleSpec,\n overrides?: TriggerScheduleSyncOptions[\"scheduleOverrides\"],\n ): Promise<void>;\n remove?(triggerSlug: string, projectId?: string): Promise<void>;\n fireDue?(asOf?: Date): Promise<number>;\n};\n\nexport type SchedulerPlugin = {\n name: string;\n createJobQueue(ctx: SchedulerPluginContext): Promise<JobQueue>;\n createTriggerScheduler?(ctx: SchedulerPluginContext, queue: JobQueue): Promise<TriggerScheduler>;\n};\n\nexport function defineSchedulerPlugin(plugin: SchedulerPlugin): SchedulerPlugin {\n return plugin;\n}\n"],"mappings":";AAgGA,MAAa,yBAAyB;AAEtC,SAAgB,aAAa,SAAyB;CACpD,OAAO,yBAAyB,KAAK,KAAK,IAAI,GAAG,UAAU,CAAC;AAC9D;;;AC3BA,SAAgB,sBAAsB,QAA0C;CAC9E,OAAO;AACT"}
|
|
@@ -49,11 +49,6 @@ type CreateJobQueueOptions = {
|
|
|
49
49
|
projectId?: string;
|
|
50
50
|
organizationId?: string;
|
|
51
51
|
};
|
|
52
|
-
type TriggerScheduleSpec = {
|
|
53
|
-
triggerSlug: string;
|
|
54
|
-
kind: "cron" | "poll";
|
|
55
|
-
schedule: string;
|
|
56
|
-
};
|
|
57
52
|
type ScheduleSyncOptions = {
|
|
58
53
|
schedules: TriggerScheduleSpec[];
|
|
59
54
|
scheduleOverrides?: {
|
|
@@ -70,6 +65,8 @@ type Scheduler = JobQueue & {
|
|
|
70
65
|
syncTriggerSchedules(options: ScheduleSyncOptions): Promise<void>;
|
|
71
66
|
startScheduleTicker(options?: ScheduleTickerOptions): Promise<StopFn>;
|
|
72
67
|
fireDueSchedules(asOf?: Date): Promise<number>;
|
|
68
|
+
upsertTriggerSchedule?(spec: TriggerScheduleSpec, overrides?: ScheduleSyncOptions["scheduleOverrides"]): Promise<void>;
|
|
69
|
+
removeTriggerSchedule?(triggerSlug: string, projectId?: string): Promise<void>;
|
|
73
70
|
};
|
|
74
71
|
type CreateSchedulerOptions = CreateJobQueueOptions;
|
|
75
72
|
declare const DEFAULT_RETRY_DELAY_MS = 5000;
|
|
@@ -90,11 +87,37 @@ type SchedulerPluginContext = {
|
|
|
90
87
|
projectId?: string;
|
|
91
88
|
organizationId?: string;
|
|
92
89
|
};
|
|
90
|
+
type TriggerScheduleSpec = {
|
|
91
|
+
triggerSlug: string;
|
|
92
|
+
kind: "cron" | "poll";
|
|
93
|
+
schedule: string; /** Project scope for org-wide worker queues. */
|
|
94
|
+
projectId?: string;
|
|
95
|
+
};
|
|
96
|
+
type TriggerScheduleSyncOptions = {
|
|
97
|
+
schedules: TriggerScheduleSpec[];
|
|
98
|
+
scheduleOverrides?: {
|
|
99
|
+
global?: string;
|
|
100
|
+
byTrigger?: Record<string, string>;
|
|
101
|
+
};
|
|
102
|
+
};
|
|
103
|
+
type TriggerSchedulerStartOptions = {
|
|
104
|
+
pollIntervalMs?: number;
|
|
105
|
+
batchSize?: number; /** When `organization`, claims due schedules across all projects in the org schema. */
|
|
106
|
+
scope?: "project" | "organization";
|
|
107
|
+
};
|
|
108
|
+
type TriggerScheduler = {
|
|
109
|
+
sync(options: TriggerScheduleSyncOptions): Promise<void>;
|
|
110
|
+
start(options?: TriggerSchedulerStartOptions): Promise<StopFn>; /** Register or refresh one trigger schedule in the firing backend. */
|
|
111
|
+
upsert?(spec: TriggerScheduleSpec, overrides?: TriggerScheduleSyncOptions["scheduleOverrides"]): Promise<void>;
|
|
112
|
+
remove?(triggerSlug: string, projectId?: string): Promise<void>;
|
|
113
|
+
fireDue?(asOf?: Date): Promise<number>;
|
|
114
|
+
};
|
|
93
115
|
type SchedulerPlugin = {
|
|
94
116
|
name: string;
|
|
95
117
|
createJobQueue(ctx: SchedulerPluginContext): Promise<JobQueue>;
|
|
118
|
+
createTriggerScheduler?(ctx: SchedulerPluginContext, queue: JobQueue): Promise<TriggerScheduler>;
|
|
96
119
|
};
|
|
97
120
|
declare function defineSchedulerPlugin(plugin: SchedulerPlugin): SchedulerPlugin;
|
|
98
121
|
//#endregion
|
|
99
|
-
export {
|
|
100
|
-
//# sourceMappingURL=contract-
|
|
122
|
+
export { StopFn as C, Scheduler as S, retryDelayMs as T, JobPayload as _, TriggerScheduleSpec as a, ScheduleSyncOptions as b, TriggerSchedulerStartOptions as c, CreateJobQueueOptions as d, CreateSchedulerOptions as f, JobKind as g, JobHandler as h, SchedulerScope as i, defineSchedulerPlugin as l, EnqueueInput as m, SchedulerPlugin as n, TriggerScheduleSyncOptions as o, DEFAULT_RETRY_DELAY_MS as p, SchedulerPluginContext as r, TriggerScheduler as s, DatabaseDialect as t, CancelHandler as u, JobQueue as v, WorkerOptions as w, ScheduleTickerOptions as x, JobTrigger as y };
|
|
123
|
+
//# sourceMappingURL=contract-DyhRC8AI.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract-DyhRC8AI.d.cts","names":[],"sources":["../src/types.ts","../src/contract.ts"],"mappings":"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"}
|
|
@@ -49,11 +49,6 @@ type CreateJobQueueOptions = {
|
|
|
49
49
|
projectId?: string;
|
|
50
50
|
organizationId?: string;
|
|
51
51
|
};
|
|
52
|
-
type TriggerScheduleSpec = {
|
|
53
|
-
triggerSlug: string;
|
|
54
|
-
kind: "cron" | "poll";
|
|
55
|
-
schedule: string;
|
|
56
|
-
};
|
|
57
52
|
type ScheduleSyncOptions = {
|
|
58
53
|
schedules: TriggerScheduleSpec[];
|
|
59
54
|
scheduleOverrides?: {
|
|
@@ -70,6 +65,8 @@ type Scheduler = JobQueue & {
|
|
|
70
65
|
syncTriggerSchedules(options: ScheduleSyncOptions): Promise<void>;
|
|
71
66
|
startScheduleTicker(options?: ScheduleTickerOptions): Promise<StopFn>;
|
|
72
67
|
fireDueSchedules(asOf?: Date): Promise<number>;
|
|
68
|
+
upsertTriggerSchedule?(spec: TriggerScheduleSpec, overrides?: ScheduleSyncOptions["scheduleOverrides"]): Promise<void>;
|
|
69
|
+
removeTriggerSchedule?(triggerSlug: string, projectId?: string): Promise<void>;
|
|
73
70
|
};
|
|
74
71
|
type CreateSchedulerOptions = CreateJobQueueOptions;
|
|
75
72
|
declare const DEFAULT_RETRY_DELAY_MS = 5000;
|
|
@@ -90,11 +87,37 @@ type SchedulerPluginContext = {
|
|
|
90
87
|
projectId?: string;
|
|
91
88
|
organizationId?: string;
|
|
92
89
|
};
|
|
90
|
+
type TriggerScheduleSpec = {
|
|
91
|
+
triggerSlug: string;
|
|
92
|
+
kind: "cron" | "poll";
|
|
93
|
+
schedule: string; /** Project scope for org-wide worker queues. */
|
|
94
|
+
projectId?: string;
|
|
95
|
+
};
|
|
96
|
+
type TriggerScheduleSyncOptions = {
|
|
97
|
+
schedules: TriggerScheduleSpec[];
|
|
98
|
+
scheduleOverrides?: {
|
|
99
|
+
global?: string;
|
|
100
|
+
byTrigger?: Record<string, string>;
|
|
101
|
+
};
|
|
102
|
+
};
|
|
103
|
+
type TriggerSchedulerStartOptions = {
|
|
104
|
+
pollIntervalMs?: number;
|
|
105
|
+
batchSize?: number; /** When `organization`, claims due schedules across all projects in the org schema. */
|
|
106
|
+
scope?: "project" | "organization";
|
|
107
|
+
};
|
|
108
|
+
type TriggerScheduler = {
|
|
109
|
+
sync(options: TriggerScheduleSyncOptions): Promise<void>;
|
|
110
|
+
start(options?: TriggerSchedulerStartOptions): Promise<StopFn>; /** Register or refresh one trigger schedule in the firing backend. */
|
|
111
|
+
upsert?(spec: TriggerScheduleSpec, overrides?: TriggerScheduleSyncOptions["scheduleOverrides"]): Promise<void>;
|
|
112
|
+
remove?(triggerSlug: string, projectId?: string): Promise<void>;
|
|
113
|
+
fireDue?(asOf?: Date): Promise<number>;
|
|
114
|
+
};
|
|
93
115
|
type SchedulerPlugin = {
|
|
94
116
|
name: string;
|
|
95
117
|
createJobQueue(ctx: SchedulerPluginContext): Promise<JobQueue>;
|
|
118
|
+
createTriggerScheduler?(ctx: SchedulerPluginContext, queue: JobQueue): Promise<TriggerScheduler>;
|
|
96
119
|
};
|
|
97
120
|
declare function defineSchedulerPlugin(plugin: SchedulerPlugin): SchedulerPlugin;
|
|
98
121
|
//#endregion
|
|
99
|
-
export {
|
|
100
|
-
//# sourceMappingURL=contract-
|
|
122
|
+
export { StopFn as C, Scheduler as S, retryDelayMs as T, JobPayload as _, TriggerScheduleSpec as a, ScheduleSyncOptions as b, TriggerSchedulerStartOptions as c, CreateJobQueueOptions as d, CreateSchedulerOptions as f, JobKind as g, JobHandler as h, SchedulerScope as i, defineSchedulerPlugin as l, EnqueueInput as m, SchedulerPlugin as n, TriggerScheduleSyncOptions as o, DEFAULT_RETRY_DELAY_MS as p, SchedulerPluginContext as r, TriggerScheduler as s, DatabaseDialect as t, CancelHandler as u, JobQueue as v, WorkerOptions as w, ScheduleTickerOptions as x, JobTrigger as y };
|
|
123
|
+
//# sourceMappingURL=contract-DyhRC8AI.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract-DyhRC8AI.d.mts","names":[],"sources":["../src/types.ts","../src/contract.ts"],"mappings":";KAAY,OAAA;AAAA,KAEA,UAAA;AAAA,KAEA,UAAA;EACV,IAAA,EAAM,OAAA;EACN,QAAA;EACA,KAAA;EACA,OAAA,EAAS,UAAA;EACT,OAAA;EACA,OAAA;EACA,WAAA,UAToB;EAWpB,gBAAA;EACA,WAAA,EAAa,IAAA;EACb,KAAA,UAVM;EAYN,SAAA;AAAA;AAAA,KAGU,YAAA;EACV,IAAA,EAAM,OAAA;EACN,QAAA;EACA,KAAA;EACA,OAAA,EAAS,UAAA;EACT,OAAA;EACA,WAAA,GAAc,IAAA;EACd,OAAA;EACA,WAAA,WAlBA;EAoBA,SAAA,WAjBA;EAmBA,SAAA;AAAA;AAAA,KAGU,UAAA,IAAc,GAAA,EAAK,UAAA,KAAe,OAAO;AAAA,KAEzC,aAAA,IAAiB,KAAA,oBAAyB,OAAO;AAAA,KAEjD,MAAA,SAAe,OAAO;AAAA,KAEtB,aAAA;EACV,QAAA;EACA,cAAA;EACA,oBAAA;AAAA;AAAA,KAGU,QAAA;EACV,OAAA,CAAQ,KAAA,EAAO,YAAA,GAAe,OAAA;EAC9B,WAAA,CAAY,OAAA,EAAS,UAAA,EAAY,OAAA,GAAU,aAAA,GAAgB,OAAA,CAAQ,MAAA;EACnE,aAAA,CAAc,KAAA,WAAgB,OAAA;EAC9B,eAAA,CAAgB,OAAA,EAAS,aAAA,GAAgB,OAAA,CAAQ,MAAA;AAAA;AAAA,KAOvC,qBAAA;EACV,GAAA;EACA,OAAA;EACA,OAAA,GAAU,QAAA;EACV,MAAA,GAAS,eAAA;EACT,KAAA,GAAQ,cAAA;EACR,SAAA;EACA,cAAA;AAAA;AAAA,KAGU,mBAAA;EACV,SAAA,EAAW,mBAAA;EACX,iBAAA;IACE,MAAA;IACA,SAAA,GAAY,MAAM;EAAA;AAAA;AAAA,KAIV,qBAAA;EACV,cAAA;EACA,SAAA,WA3CmD;EA6CnD,KAAA;AAAA;AAAA,KAGU,SAAA,GAAY,QAAA;EACtB,oBAAA,CAAqB,OAAA,EAAS,mBAAA,GAAsB,OAAA;EACpD,mBAAA,CAAoB,OAAA,GAAU,qBAAA,GAAwB,OAAA,CAAQ,MAAA;EAC9D,gBAAA,CAAiB,IAAA,GAAO,IAAA,GAAO,OAAA;EAC/B,qBAAA,EACE,IAAA,EAAM,mBAAA,EACN,SAAA,GAAY,mBAAA,wBACX,OAAA;EACH,qBAAA,EAAuB,WAAA,UAAqB,SAAA,YAAqB,OAAA;AAAA;AAAA,KAGvD,sBAAA,GAAyB,qBAAqB;AAAA,cAE7C,sBAAA;AAAA,iBAEG,YAAA,CAAa,OAAe;;;;;AAlGzB;AAEnB;;KCkBY,eAAA;AAAA,KAEA,cAAA;AAAA,KAEA,sBAAA;EACV,KAAA,EAAO,cAAA;EACP,GAAA;EACA,OAAA,GAAU,eAAe;EACzB,SAAA;EACA,cAAA;AAAA;AAAA,KAGU,mBAAA;EACV,WAAA;EACA,IAAA;EACA,QAAA,UD7BA;EC+BA,SAAA;AAAA;AAAA,KAGU,0BAAA;EACV,SAAA,EAAW,mBAAA;EACX,iBAAA;IACE,MAAA;IACA,SAAA,GAAY,MAAM;EAAA;AAAA;AAAA,KAIV,4BAAA;EACV,cAAA;EACA,SAAA,WDjCS;ECmCT,KAAA;AAAA;AAAA,KAGU,gBAAA;EACV,IAAA,CAAK,OAAA,EAAS,0BAAA,GAA6B,OAAA;EAC3C,KAAA,CAAM,OAAA,GAAU,4BAAA,GAA+B,OAAA,CAAQ,MAAA,GD/BzC;ECiCd,MAAA,EACE,IAAA,EAAM,mBAAA,EACN,SAAA,GAAY,0BAAA,wBACX,OAAA;EACH,MAAA,EAAQ,WAAA,UAAqB,SAAA,YAAqB,OAAA;EAClD,OAAA,EAAS,IAAA,GAAO,IAAA,GAAO,OAAA;AAAA;AAAA,KAGb,eAAA;EACV,IAAA;EACA,cAAA,CAAe,GAAA,EAAK,sBAAA,GAAyB,OAAA,CAAQ,QAAA;EACrD,sBAAA,EAAwB,GAAA,EAAK,sBAAA,EAAwB,KAAA,EAAO,QAAA,GAAW,OAAA,CAAQ,gBAAA;AAAA;AAAA,iBAGjE,qBAAA,CAAsB,MAAA,EAAQ,eAAA,GAAkB,eAAe"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract-E1QJBH6_.mjs","names":[],"sources":["../src/types.ts","../src/contract.ts"],"sourcesContent":["export type JobKind = \"workflow\" | \"agent\" | \"trigger\" | \"trigger-overview\" | \"runtime\";\n\nexport type JobTrigger = \"api\" | \"cron\" | \"webhook\" | \"poll\" | \"retry\" | \"prompt\";\n\nexport type JobPayload = {\n kind: JobKind;\n targetId: string;\n runId: string;\n trigger: JobTrigger;\n payload: unknown;\n attempt: number;\n maxAttempts: number;\n /** True when this delivery is the final retry attempt. */\n exhaustedRetries?: boolean;\n scheduledAt: Date;\n jobId: string;\n /** Project scope for org-wide worker queues. */\n projectId?: string;\n};\n\nexport type EnqueueInput = {\n kind: JobKind;\n targetId: string;\n runId: string;\n trigger: JobTrigger;\n payload?: unknown;\n scheduledAt?: Date;\n attempt?: number;\n maxAttempts?: number;\n /** Dedupe key — pg-boss singletonKey / BullMQ jobId. */\n dedupeKey?: string;\n /** Project scope for org-wide worker queues. */\n projectId?: string;\n};\n\nexport type JobHandler = (job: JobPayload) => Promise<void>;\n\nexport type CancelHandler = (runId: string) => void | Promise<void>;\n\nexport type StopFn = () => Promise<void> | void;\n\nexport type WorkerOptions = {\n workerId?: string;\n pollIntervalMs?: number;\n leaseSweepIntervalMs?: number;\n};\n\nexport type JobQueue = {\n enqueue(input: EnqueueInput): Promise<string>;\n startWorker(handler: JobHandler, options?: WorkerOptions): Promise<StopFn>;\n publishCancel(runId: string): Promise<void>;\n subscribeCancel(handler: CancelHandler): Promise<StopFn>;\n};\n\nimport type { SchedulerPlugin, SchedulerScope } from \"./contract\";\n\nexport type CreateJobQueueOptions = {\n url?: string;\n dialect?: \"postgres\" | \"sqlite\";\n adapter?: JobQueue;\n plugin?: SchedulerPlugin;\n scope?: SchedulerScope;\n projectId?: string;\n organizationId?: string;\n};\n\nexport type
|
|
1
|
+
{"version":3,"file":"contract-E1QJBH6_.mjs","names":[],"sources":["../src/types.ts","../src/contract.ts"],"sourcesContent":["export type JobKind = \"workflow\" | \"agent\" | \"trigger\" | \"trigger-overview\" | \"runtime\";\n\nexport type JobTrigger = \"api\" | \"cron\" | \"webhook\" | \"poll\" | \"retry\" | \"prompt\";\n\nexport type JobPayload = {\n kind: JobKind;\n targetId: string;\n runId: string;\n trigger: JobTrigger;\n payload: unknown;\n attempt: number;\n maxAttempts: number;\n /** True when this delivery is the final retry attempt. */\n exhaustedRetries?: boolean;\n scheduledAt: Date;\n jobId: string;\n /** Project scope for org-wide worker queues. */\n projectId?: string;\n};\n\nexport type EnqueueInput = {\n kind: JobKind;\n targetId: string;\n runId: string;\n trigger: JobTrigger;\n payload?: unknown;\n scheduledAt?: Date;\n attempt?: number;\n maxAttempts?: number;\n /** Dedupe key — pg-boss singletonKey / BullMQ jobId. */\n dedupeKey?: string;\n /** Project scope for org-wide worker queues. */\n projectId?: string;\n};\n\nexport type JobHandler = (job: JobPayload) => Promise<void>;\n\nexport type CancelHandler = (runId: string) => void | Promise<void>;\n\nexport type StopFn = () => Promise<void> | void;\n\nexport type WorkerOptions = {\n workerId?: string;\n pollIntervalMs?: number;\n leaseSweepIntervalMs?: number;\n};\n\nexport type JobQueue = {\n enqueue(input: EnqueueInput): Promise<string>;\n startWorker(handler: JobHandler, options?: WorkerOptions): Promise<StopFn>;\n publishCancel(runId: string): Promise<void>;\n subscribeCancel(handler: CancelHandler): Promise<StopFn>;\n};\n\nimport type { SchedulerPlugin, SchedulerScope, TriggerScheduleSpec } from \"./contract\";\n\nexport type { TriggerScheduleSpec };\n\nexport type CreateJobQueueOptions = {\n url?: string;\n dialect?: \"postgres\" | \"sqlite\";\n adapter?: JobQueue;\n plugin?: SchedulerPlugin;\n scope?: SchedulerScope;\n projectId?: string;\n organizationId?: string;\n};\n\nexport type ScheduleSyncOptions = {\n schedules: TriggerScheduleSpec[];\n scheduleOverrides?: {\n global?: string;\n byTrigger?: Record<string, string>;\n };\n};\n\nexport type ScheduleTickerOptions = {\n pollIntervalMs?: number;\n batchSize?: number;\n /** When `organization`, claims due schedules across all projects in the org schema. */\n scope?: \"project\" | \"organization\";\n};\n\nexport type Scheduler = JobQueue & {\n syncTriggerSchedules(options: ScheduleSyncOptions): Promise<void>;\n startScheduleTicker(options?: ScheduleTickerOptions): Promise<StopFn>;\n fireDueSchedules(asOf?: Date): Promise<number>;\n upsertTriggerSchedule?(\n spec: TriggerScheduleSpec,\n overrides?: ScheduleSyncOptions[\"scheduleOverrides\"],\n ): Promise<void>;\n removeTriggerSchedule?(triggerSlug: string, projectId?: string): Promise<void>;\n};\n\nexport type CreateSchedulerOptions = CreateJobQueueOptions;\n\nexport const DEFAULT_RETRY_DELAY_MS = 5_000;\n\nexport function retryDelayMs(attempt: number): number {\n return DEFAULT_RETRY_DELAY_MS * 2 ** Math.max(0, attempt - 1);\n}\n","export type {\n JobKind,\n JobTrigger,\n JobPayload,\n EnqueueInput,\n JobHandler,\n CancelHandler,\n StopFn,\n WorkerOptions,\n JobQueue,\n} from \"./types\";\nexport { retryDelayMs, DEFAULT_RETRY_DELAY_MS } from \"./types\";\n\nimport type { JobQueue, StopFn } from \"./types\";\n\n/**\n * Inlined to keep the contract database-free — structurally identical to\n * `@keystrokehq/database`'s `DatabaseDialect`. Importing it from the database\n * package would re-introduce the dependency `./contract` exists to avoid.\n */\nexport type DatabaseDialect = \"postgres\" | \"sqlite\";\n\nexport type SchedulerScope = \"platform\" | \"project\" | \"organization\";\n\nexport type SchedulerPluginContext = {\n scope: SchedulerScope;\n url?: string;\n dialect?: DatabaseDialect;\n projectId?: string;\n organizationId?: string;\n};\n\nexport type TriggerScheduleSpec = {\n triggerSlug: string;\n kind: \"cron\" | \"poll\";\n schedule: string;\n /** Project scope for org-wide worker queues. */\n projectId?: string;\n};\n\nexport type TriggerScheduleSyncOptions = {\n schedules: TriggerScheduleSpec[];\n scheduleOverrides?: {\n global?: string;\n byTrigger?: Record<string, string>;\n };\n};\n\nexport type TriggerSchedulerStartOptions = {\n pollIntervalMs?: number;\n batchSize?: number;\n /** When `organization`, claims due schedules across all projects in the org schema. */\n scope?: \"project\" | \"organization\";\n};\n\nexport type TriggerScheduler = {\n sync(options: TriggerScheduleSyncOptions): Promise<void>;\n start(options?: TriggerSchedulerStartOptions): Promise<StopFn>;\n /** Register or refresh one trigger schedule in the firing backend. */\n upsert?(\n spec: TriggerScheduleSpec,\n overrides?: TriggerScheduleSyncOptions[\"scheduleOverrides\"],\n ): Promise<void>;\n remove?(triggerSlug: string, projectId?: string): Promise<void>;\n fireDue?(asOf?: Date): Promise<number>;\n};\n\nexport type SchedulerPlugin = {\n name: string;\n createJobQueue(ctx: SchedulerPluginContext): Promise<JobQueue>;\n createTriggerScheduler?(ctx: SchedulerPluginContext, queue: JobQueue): Promise<TriggerScheduler>;\n};\n\nexport function defineSchedulerPlugin(plugin: SchedulerPlugin): SchedulerPlugin {\n return plugin;\n}\n"],"mappings":";AAgGA,MAAa,yBAAyB;AAEtC,SAAgB,aAAa,SAAyB;CACpD,OAAO,yBAAyB,KAAK,KAAK,IAAI,GAAG,UAAU,CAAC;AAC9D;;;AC3BA,SAAgB,sBAAsB,QAA0C;CAC9E,OAAO;AACT"}
|
package/dist/contract.d.cts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export { type CancelHandler, DEFAULT_RETRY_DELAY_MS, DatabaseDialect, type EnqueueInput, type JobHandler, type JobKind, type JobPayload, type JobQueue, type JobTrigger, SchedulerPlugin, SchedulerPluginContext, SchedulerScope, type StopFn, type WorkerOptions, defineSchedulerPlugin, retryDelayMs };
|
|
1
|
+
import { C as StopFn, T as retryDelayMs, _ as JobPayload, a as TriggerScheduleSpec, c as TriggerSchedulerStartOptions, g as JobKind, h as JobHandler, i as SchedulerScope, l as defineSchedulerPlugin, m as EnqueueInput, n as SchedulerPlugin, o as TriggerScheduleSyncOptions, p as DEFAULT_RETRY_DELAY_MS, r as SchedulerPluginContext, s as TriggerScheduler, t as DatabaseDialect, u as CancelHandler, v as JobQueue, w as WorkerOptions, y as JobTrigger } from "./contract-DyhRC8AI.cjs";
|
|
2
|
+
export { type CancelHandler, DEFAULT_RETRY_DELAY_MS, DatabaseDialect, type EnqueueInput, type JobHandler, type JobKind, type JobPayload, type JobQueue, type JobTrigger, SchedulerPlugin, SchedulerPluginContext, SchedulerScope, type StopFn, TriggerScheduleSpec, TriggerScheduleSyncOptions, TriggerScheduler, TriggerSchedulerStartOptions, type WorkerOptions, defineSchedulerPlugin, retryDelayMs };
|
package/dist/contract.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export { type CancelHandler, DEFAULT_RETRY_DELAY_MS, DatabaseDialect, type EnqueueInput, type JobHandler, type JobKind, type JobPayload, type JobQueue, type JobTrigger, SchedulerPlugin, SchedulerPluginContext, SchedulerScope, type StopFn, type WorkerOptions, defineSchedulerPlugin, retryDelayMs };
|
|
1
|
+
import { C as StopFn, T as retryDelayMs, _ as JobPayload, a as TriggerScheduleSpec, c as TriggerSchedulerStartOptions, g as JobKind, h as JobHandler, i as SchedulerScope, l as defineSchedulerPlugin, m as EnqueueInput, n as SchedulerPlugin, o as TriggerScheduleSyncOptions, p as DEFAULT_RETRY_DELAY_MS, r as SchedulerPluginContext, s as TriggerScheduler, t as DatabaseDialect, u as CancelHandler, v as JobQueue, w as WorkerOptions, y as JobTrigger } from "./contract-DyhRC8AI.mjs";
|
|
2
|
+
export { type CancelHandler, DEFAULT_RETRY_DELAY_MS, DatabaseDialect, type EnqueueInput, type JobHandler, type JobKind, type JobPayload, type JobQueue, type JobTrigger, SchedulerPlugin, SchedulerPluginContext, SchedulerScope, type StopFn, TriggerScheduleSpec, TriggerScheduleSyncOptions, TriggerScheduler, TriggerSchedulerStartOptions, type WorkerOptions, defineSchedulerPlugin, retryDelayMs };
|