@polpo-ai/core 0.15.45 → 0.15.47

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.
Files changed (65) hide show
  1. package/dist/index.d.ts +1 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +2 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/mission-executor.d.ts +8 -2
  6. package/dist/mission-executor.d.ts.map +1 -1
  7. package/dist/mission-executor.js.map +1 -1
  8. package/dist/orchestrator-engine.d.ts +4 -0
  9. package/dist/orchestrator-engine.d.ts.map +1 -1
  10. package/dist/orchestrator-engine.js.map +1 -1
  11. package/dist/scheduling/dispatcher.d.ts +45 -0
  12. package/dist/scheduling/dispatcher.d.ts.map +1 -0
  13. package/dist/scheduling/dispatcher.js +201 -0
  14. package/dist/scheduling/dispatcher.js.map +1 -0
  15. package/dist/scheduling/dispatcher.test.d.ts +2 -0
  16. package/dist/scheduling/dispatcher.test.d.ts.map +1 -0
  17. package/dist/scheduling/dispatcher.test.js +378 -0
  18. package/dist/scheduling/dispatcher.test.js.map +1 -0
  19. package/dist/scheduling/driver.d.ts +20 -0
  20. package/dist/scheduling/driver.d.ts.map +1 -0
  21. package/dist/scheduling/driver.js +2 -0
  22. package/dist/scheduling/driver.js.map +1 -0
  23. package/dist/scheduling/index.d.ts +9 -0
  24. package/dist/scheduling/index.d.ts.map +1 -0
  25. package/dist/scheduling/index.js +8 -0
  26. package/dist/scheduling/index.js.map +1 -0
  27. package/dist/scheduling/occurrence.d.ts +17 -0
  28. package/dist/scheduling/occurrence.d.ts.map +1 -0
  29. package/dist/scheduling/occurrence.js +164 -0
  30. package/dist/scheduling/occurrence.js.map +1 -0
  31. package/dist/scheduling/occurrence.test.d.ts +2 -0
  32. package/dist/scheduling/occurrence.test.d.ts.map +1 -0
  33. package/dist/scheduling/occurrence.test.js +148 -0
  34. package/dist/scheduling/occurrence.test.js.map +1 -0
  35. package/dist/scheduling/state-machine.d.ts +10 -0
  36. package/dist/scheduling/state-machine.d.ts.map +1 -0
  37. package/dist/scheduling/state-machine.js +36 -0
  38. package/dist/scheduling/state-machine.js.map +1 -0
  39. package/dist/scheduling/state-machine.test.d.ts +2 -0
  40. package/dist/scheduling/state-machine.test.d.ts.map +1 -0
  41. package/dist/scheduling/state-machine.test.js +77 -0
  42. package/dist/scheduling/state-machine.test.js.map +1 -0
  43. package/dist/scheduling/store.d.ts +100 -0
  44. package/dist/scheduling/store.d.ts.map +1 -0
  45. package/dist/scheduling/store.js +635 -0
  46. package/dist/scheduling/store.js.map +1 -0
  47. package/dist/scheduling/store.test.d.ts +2 -0
  48. package/dist/scheduling/store.test.d.ts.map +1 -0
  49. package/dist/scheduling/store.test.js +462 -0
  50. package/dist/scheduling/store.test.js.map +1 -0
  51. package/dist/scheduling/types.d.ts +195 -0
  52. package/dist/scheduling/types.d.ts.map +1 -0
  53. package/dist/scheduling/types.js +2 -0
  54. package/dist/scheduling/types.js.map +1 -0
  55. package/dist/scheduling/validation.d.ts +28 -0
  56. package/dist/scheduling/validation.d.ts.map +1 -0
  57. package/dist/scheduling/validation.js +614 -0
  58. package/dist/scheduling/validation.js.map +1 -0
  59. package/dist/scheduling/validation.test.d.ts +2 -0
  60. package/dist/scheduling/validation.test.d.ts.map +1 -0
  61. package/dist/scheduling/validation.test.js +576 -0
  62. package/dist/scheduling/validation.test.js.map +1 -0
  63. package/dist/types/mission.d.ts +13 -3
  64. package/dist/types/mission.d.ts.map +1 -1
  65. package/package.json +6 -1
@@ -0,0 +1,201 @@
1
+ import { normalizeScheduleInvocation, normalizeScheduleMetadata, } from "./validation.js";
2
+ export class ScheduleDispatchError extends Error {
3
+ code;
4
+ retryable;
5
+ constructor(code, message, retryable, options) {
6
+ super(message, options);
7
+ this.code = code;
8
+ this.retryable = retryable;
9
+ this.name = "ScheduleDispatchError";
10
+ }
11
+ }
12
+ /**
13
+ * Validates and routes schedule invocations to host-provided surface handlers.
14
+ *
15
+ * This class deliberately does not implement agent, task, channel, webhook, or
16
+ * mission behavior. Hosts inject their existing direct-invocation paths.
17
+ */
18
+ export class InjectedScheduleDispatcher {
19
+ handlers;
20
+ constructor(handlers) {
21
+ this.handlers = handlers;
22
+ if (!handlers || typeof handlers !== "object" || Array.isArray(handlers)) {
23
+ throw new ScheduleDispatchError("INVALID_CONTEXT", "Schedule dispatcher requires a handler map", false);
24
+ }
25
+ }
26
+ async dispatch(run, schedule, options = {}) {
27
+ validateContext(run, schedule);
28
+ const signal = options.signal ?? new AbortController().signal;
29
+ assertNotAborted(signal);
30
+ let invocation;
31
+ try {
32
+ invocation = normalizeScheduleInvocation(schedule.invocation);
33
+ }
34
+ catch (cause) {
35
+ throw new ScheduleDispatchError("INVALID_INVOCATION", `Schedule "${schedule.id}" has an invalid invocation: ${errorMessage(cause)}`, false, { cause });
36
+ }
37
+ const context = { schedule, run, invocation, signal };
38
+ let rawResult;
39
+ switch (invocation.surface) {
40
+ case "agent":
41
+ rawResult = await requireHandler(this.handlers.agent, invocation.surface)({ ...context, invocation });
42
+ break;
43
+ case "task":
44
+ rawResult = await requireHandler(this.handlers.task, invocation.surface)({ ...context, invocation });
45
+ break;
46
+ case "channel":
47
+ rawResult = await requireHandler(this.handlers.channel, invocation.surface)({ ...context, invocation });
48
+ break;
49
+ case "webhook":
50
+ rawResult = await requireHandler(this.handlers.webhook, invocation.surface)({ ...context, invocation });
51
+ break;
52
+ case "legacy_mission":
53
+ rawResult = await requireHandler(this.handlers.legacyMission, invocation.surface)({ ...context, invocation });
54
+ break;
55
+ }
56
+ assertNotAborted(signal);
57
+ try {
58
+ return normalizeDispatchResult(rawResult, invocation.surface);
59
+ }
60
+ catch (cause) {
61
+ if (cause instanceof ScheduleDispatchError)
62
+ throw cause;
63
+ throw new ScheduleDispatchError("INVALID_RESULT", `Schedule "${schedule.id}" handler returned an invalid result: ${errorMessage(cause)}`, false, { cause });
64
+ }
65
+ }
66
+ }
67
+ function validateContext(run, schedule) {
68
+ if (!run || !schedule || run.scheduleId !== schedule.id) {
69
+ throw new ScheduleDispatchError("INVALID_CONTEXT", "Schedule run and schedule do not refer to the same schedule", false);
70
+ }
71
+ if (run.status !== "running") {
72
+ throw new ScheduleDispatchError("INVALID_CONTEXT", `Schedule run "${run.id}" must be running before dispatch`, false);
73
+ }
74
+ if (schedule.status !== "active") {
75
+ throw new ScheduleDispatchError("INVALID_CONTEXT", `Schedule "${schedule.id}" must be active before dispatch`, false);
76
+ }
77
+ }
78
+ function requireHandler(handler, surface) {
79
+ if (typeof handler !== "function") {
80
+ throw new ScheduleDispatchError("HANDLER_UNAVAILABLE", `No schedule handler is configured for surface "${surface}"`, false);
81
+ }
82
+ return handler;
83
+ }
84
+ function assertNotAborted(signal) {
85
+ if (!signal.aborted)
86
+ return;
87
+ throw new ScheduleDispatchError("ABORTED", "Schedule dispatch was aborted", true, signal.reason === undefined ? undefined : { cause: signal.reason });
88
+ }
89
+ function normalizeDispatchResult(value, surface) {
90
+ const result = record(value, "Schedule dispatch result");
91
+ assertKnownKeys(result, ["status", "references", "result", "error"], "Schedule dispatch result");
92
+ if (result.status !== "succeeded"
93
+ && result.status !== "failed"
94
+ && result.status !== "skipped"
95
+ && result.status !== "cancelled") {
96
+ throw new Error("Schedule dispatch result status must be succeeded, failed, skipped, or cancelled");
97
+ }
98
+ const references = normalizeReferences(result.references);
99
+ if (result.status === "succeeded") {
100
+ assertSuccessfulReferences(surface, references);
101
+ if (result.error !== undefined) {
102
+ throw new Error("A successful schedule dispatch result cannot include an error");
103
+ }
104
+ }
105
+ if (result.status === "failed" && result.error === undefined) {
106
+ throw new Error("A failed schedule dispatch result requires an error");
107
+ }
108
+ return {
109
+ status: result.status,
110
+ references,
111
+ ...(result.result === undefined
112
+ ? {}
113
+ : {
114
+ result: normalizeScheduleMetadata(result.result, "Schedule dispatch result metadata"),
115
+ }),
116
+ ...(result.error === undefined
117
+ ? {}
118
+ : { error: normalizeDispatchError(result.error) }),
119
+ };
120
+ }
121
+ function normalizeReferences(value) {
122
+ const references = record(value, "Schedule dispatch references");
123
+ const keys = [
124
+ "runtimeId",
125
+ "taskId",
126
+ "loopRunId",
127
+ "sessionId",
128
+ "channelEventId",
129
+ "providerDeliveryId",
130
+ ];
131
+ assertKnownKeys(references, keys, "Schedule dispatch references");
132
+ const normalized = {};
133
+ for (const key of keys) {
134
+ if (references[key] !== undefined) {
135
+ normalized[key] = nonEmptyString(references[key], `Schedule dispatch reference ${key}`);
136
+ }
137
+ }
138
+ return normalized;
139
+ }
140
+ function assertSuccessfulReferences(surface, references) {
141
+ const valid = (() => {
142
+ switch (surface) {
143
+ case "agent":
144
+ return Boolean(references.runtimeId || references.loopRunId);
145
+ case "task":
146
+ return Boolean(references.taskId);
147
+ case "channel":
148
+ return Boolean(references.channelEventId || references.providerDeliveryId);
149
+ case "webhook":
150
+ return Boolean(references.providerDeliveryId);
151
+ case "legacy_mission":
152
+ return true;
153
+ }
154
+ })();
155
+ if (!valid) {
156
+ throw new Error(`A successful "${surface}" dispatch result is missing its durable reference`);
157
+ }
158
+ }
159
+ function normalizeDispatchError(value) {
160
+ const error = record(value, "Schedule dispatch error");
161
+ assertKnownKeys(error, ["code", "message", "retryable", "metadata"], "Schedule dispatch error");
162
+ if (typeof error.retryable !== "boolean") {
163
+ throw new Error("Schedule dispatch error retryable must be a boolean");
164
+ }
165
+ return {
166
+ code: nonEmptyString(error.code, "Schedule dispatch error code"),
167
+ message: nonEmptyString(error.message, "Schedule dispatch error message"),
168
+ retryable: error.retryable,
169
+ ...(error.metadata === undefined
170
+ ? {}
171
+ : {
172
+ metadata: normalizeScheduleMetadata(error.metadata, "Schedule dispatch error metadata"),
173
+ }),
174
+ };
175
+ }
176
+ function record(value, label) {
177
+ if (!value
178
+ || typeof value !== "object"
179
+ || Array.isArray(value)
180
+ || Object.getPrototypeOf(value) !== Object.prototype) {
181
+ throw new Error(`${label} must be a plain object`);
182
+ }
183
+ return value;
184
+ }
185
+ function assertKnownKeys(value, allowed, label) {
186
+ const known = new Set(allowed);
187
+ const unknown = Object.keys(value).filter((key) => !known.has(key));
188
+ if (unknown.length > 0) {
189
+ throw new Error(`${label} contains unknown field "${unknown[0]}"`);
190
+ }
191
+ }
192
+ function nonEmptyString(value, label) {
193
+ if (typeof value !== "string" || value.trim().length === 0) {
194
+ throw new Error(`${label} must be a non-empty string`);
195
+ }
196
+ return value.trim();
197
+ }
198
+ function errorMessage(error) {
199
+ return error instanceof Error ? error.message : String(error);
200
+ }
201
+ //# sourceMappingURL=dispatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatcher.js","sourceRoot":"","sources":["../../src/scheduling/dispatcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=dispatcher.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatcher.test.d.ts","sourceRoot":"","sources":["../../src/scheduling/dispatcher.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,378 @@
1
+ import { describe, expect, it, vi } from "vitest";
2
+ import { InjectedScheduleDispatcher, ScheduleDispatchError, } from "./index.js";
3
+ function schedule(invocation = {
4
+ surface: "agent",
5
+ agentName: "assistant",
6
+ input: { prompt: "Prepare the report" },
7
+ session: {
8
+ mode: "reuse",
9
+ sessionId: "session-1",
10
+ userId: "user-1",
11
+ },
12
+ execution: {
13
+ loop: "research",
14
+ model: "openai/gpt-5",
15
+ sandbox: { isolation: "fresh" },
16
+ guardrails: { mode: "strict" },
17
+ metadata: { source: "schedule" },
18
+ },
19
+ }) {
20
+ return {
21
+ id: "schedule-1",
22
+ timing: {
23
+ kind: "cron",
24
+ expression: "0 9 * * *",
25
+ timezone: "Europe/Rome",
26
+ },
27
+ invocation,
28
+ status: "active",
29
+ policy: {
30
+ catchUp: "skip",
31
+ misfireGraceSeconds: 300,
32
+ maxConcurrency: 1,
33
+ },
34
+ metadata: {},
35
+ createdAt: "2026-07-28T08:00:00.000Z",
36
+ updatedAt: "2026-07-28T08:00:00.000Z",
37
+ revision: 1,
38
+ };
39
+ }
40
+ function run(overrides = {}) {
41
+ return {
42
+ id: "schedule-run-1",
43
+ scheduleId: "schedule-1",
44
+ occurrenceAt: "2026-07-28T09:00:00.000Z",
45
+ triggerId: "trigger-1",
46
+ idempotencyKey: "schedule:schedule-1:2026-07-28T09:00:00.000Z",
47
+ status: "running",
48
+ attempts: 1,
49
+ references: {},
50
+ createdAt: "2026-07-28T09:00:00.000Z",
51
+ updatedAt: "2026-07-28T09:00:01.000Z",
52
+ startedAt: "2026-07-28T09:00:01.000Z",
53
+ ...overrides,
54
+ };
55
+ }
56
+ describe("InjectedScheduleDispatcher", () => {
57
+ it("dispatches an agent invocation with normalized execution context", async () => {
58
+ const agent = vi.fn(async () => ({
59
+ status: "succeeded",
60
+ references: {
61
+ runtimeId: "runtime-1",
62
+ sessionId: "session-1",
63
+ loopRunId: "loop-run-1",
64
+ },
65
+ result: { answer: "ready" },
66
+ }));
67
+ const dispatcher = new InjectedScheduleDispatcher({ agent });
68
+ const controller = new AbortController();
69
+ await expect(dispatcher.dispatch(run(), schedule(), {
70
+ signal: controller.signal,
71
+ })).resolves.toEqual({
72
+ status: "succeeded",
73
+ references: {
74
+ runtimeId: "runtime-1",
75
+ sessionId: "session-1",
76
+ loopRunId: "loop-run-1",
77
+ },
78
+ result: { answer: "ready" },
79
+ });
80
+ expect(agent).toHaveBeenCalledTimes(1);
81
+ expect(agent).toHaveBeenCalledWith(expect.objectContaining({
82
+ schedule: expect.objectContaining({ id: "schedule-1" }),
83
+ run: expect.objectContaining({
84
+ id: "schedule-run-1",
85
+ idempotencyKey: "schedule:schedule-1:2026-07-28T09:00:00.000Z",
86
+ }),
87
+ invocation: expect.objectContaining({
88
+ surface: "agent",
89
+ agentName: "assistant",
90
+ input: { prompt: "Prepare the report" },
91
+ execution: expect.objectContaining({
92
+ loop: "research",
93
+ model: "openai/gpt-5",
94
+ sandbox: { isolation: "fresh" },
95
+ }),
96
+ }),
97
+ signal: controller.signal,
98
+ }));
99
+ });
100
+ it.each([
101
+ {
102
+ surface: "task",
103
+ invocation: {
104
+ surface: "task",
105
+ agentName: "worker",
106
+ title: "Nightly import",
107
+ prompt: "Import records",
108
+ userId: "external-user-1",
109
+ execution: { loop: "import" },
110
+ },
111
+ result: {
112
+ status: "succeeded",
113
+ references: { taskId: "task-1" },
114
+ },
115
+ },
116
+ {
117
+ surface: "channel",
118
+ invocation: {
119
+ surface: "channel",
120
+ channelId: "channel-1",
121
+ routeId: "route-1",
122
+ externalThreadId: "thread-1",
123
+ mode: "send",
124
+ text: "Daily report ready",
125
+ },
126
+ result: {
127
+ status: "succeeded",
128
+ references: { providerDeliveryId: "delivery-1" },
129
+ },
130
+ },
131
+ {
132
+ surface: "webhook",
133
+ invocation: {
134
+ surface: "webhook",
135
+ webhookId: "webhook-1",
136
+ payload: { reportId: "report-1" },
137
+ },
138
+ result: {
139
+ status: "succeeded",
140
+ references: { providerDeliveryId: "delivery-1" },
141
+ },
142
+ },
143
+ {
144
+ surface: "legacy_mission",
145
+ invocation: {
146
+ surface: "legacy_mission",
147
+ missionId: "mission-1",
148
+ },
149
+ result: {
150
+ status: "succeeded",
151
+ references: {},
152
+ result: { missionId: "mission-1" },
153
+ },
154
+ },
155
+ ])("dispatches $surface through only its injected handler", async ({ surface, invocation, result }) => {
156
+ const selected = vi.fn(async () => result);
157
+ const unexpected = vi.fn();
158
+ const handlers = {
159
+ agent: unexpected,
160
+ task: unexpected,
161
+ channel: unexpected,
162
+ webhook: unexpected,
163
+ legacyMission: unexpected,
164
+ [surface === "legacy_mission" ? "legacyMission" : surface]: selected,
165
+ };
166
+ const dispatcher = new InjectedScheduleDispatcher(handlers);
167
+ await expect(dispatcher.dispatch(run(), schedule(invocation))).resolves.toEqual(result);
168
+ expect(selected).toHaveBeenCalledTimes(1);
169
+ expect(selected).toHaveBeenCalledWith(expect.objectContaining({
170
+ invocation: expect.objectContaining({ surface }),
171
+ }));
172
+ expect(unexpected).not.toHaveBeenCalled();
173
+ });
174
+ it("fails closed when the required surface handler is unavailable", async () => {
175
+ const dispatcher = new InjectedScheduleDispatcher({});
176
+ await expect(dispatcher.dispatch(run(), schedule())).rejects.toMatchObject({
177
+ name: "ScheduleDispatchError",
178
+ code: "HANDLER_UNAVAILABLE",
179
+ retryable: false,
180
+ });
181
+ });
182
+ it.each([
183
+ {
184
+ label: "schedule mismatch",
185
+ currentRun: run({ scheduleId: "another-schedule" }),
186
+ currentSchedule: schedule(),
187
+ code: "INVALID_CONTEXT",
188
+ },
189
+ {
190
+ label: "non-running run",
191
+ currentRun: run({ status: "claimed" }),
192
+ currentSchedule: schedule(),
193
+ code: "INVALID_CONTEXT",
194
+ },
195
+ {
196
+ label: "paused schedule",
197
+ currentRun: run(),
198
+ currentSchedule: { ...schedule(), status: "paused" },
199
+ code: "INVALID_CONTEXT",
200
+ },
201
+ ])("rejects $label before invoking a handler", async ({ currentRun, currentSchedule, code, }) => {
202
+ const agent = vi.fn();
203
+ const dispatcher = new InjectedScheduleDispatcher({ agent });
204
+ await expect(dispatcher.dispatch(currentRun, currentSchedule)).rejects.toMatchObject({ code });
205
+ expect(agent).not.toHaveBeenCalled();
206
+ });
207
+ it("revalidates persisted invocation data before invoking a handler", async () => {
208
+ const agent = vi.fn();
209
+ const dispatcher = new InjectedScheduleDispatcher({ agent });
210
+ const malformed = schedule();
211
+ malformed.invocation = {
212
+ surface: "agent",
213
+ agentName: "",
214
+ input: { prompt: "" },
215
+ };
216
+ await expect(dispatcher.dispatch(run(), malformed)).rejects.toMatchObject({
217
+ code: "INVALID_INVOCATION",
218
+ retryable: false,
219
+ });
220
+ expect(agent).not.toHaveBeenCalled();
221
+ });
222
+ it("requires durable references for successful surface outcomes", async () => {
223
+ const cases = [
224
+ {
225
+ invocation: schedule().invocation,
226
+ handlers: {
227
+ agent: async () => ({ status: "succeeded", references: {} }),
228
+ },
229
+ },
230
+ {
231
+ invocation: {
232
+ surface: "task",
233
+ agentName: "worker",
234
+ title: "Task",
235
+ prompt: "Run task",
236
+ },
237
+ handlers: {
238
+ task: async () => ({ status: "succeeded", references: {} }),
239
+ },
240
+ },
241
+ {
242
+ invocation: {
243
+ surface: "channel",
244
+ channelId: "channel-1",
245
+ mode: "send",
246
+ text: "Hello",
247
+ },
248
+ handlers: {
249
+ channel: async () => ({ status: "succeeded", references: {} }),
250
+ },
251
+ },
252
+ {
253
+ invocation: {
254
+ surface: "webhook",
255
+ webhookId: "webhook-1",
256
+ },
257
+ handlers: {
258
+ webhook: async () => ({ status: "succeeded", references: {} }),
259
+ },
260
+ },
261
+ ];
262
+ for (const testCase of cases) {
263
+ const dispatcher = new InjectedScheduleDispatcher(testCase.handlers);
264
+ await expect(dispatcher.dispatch(run(), schedule(testCase.invocation))).rejects.toMatchObject({
265
+ code: "INVALID_RESULT",
266
+ retryable: false,
267
+ });
268
+ }
269
+ });
270
+ it.each([
271
+ {
272
+ label: "unknown result field",
273
+ result: {
274
+ status: "succeeded",
275
+ references: { runtimeId: "runtime-1" },
276
+ unexpected: true,
277
+ },
278
+ },
279
+ {
280
+ label: "unknown reference",
281
+ result: {
282
+ status: "succeeded",
283
+ references: { runtimeId: "runtime-1", otherId: "other-1" },
284
+ },
285
+ },
286
+ {
287
+ label: "failed result without error",
288
+ result: {
289
+ status: "failed",
290
+ references: {},
291
+ },
292
+ },
293
+ {
294
+ label: "successful result with error",
295
+ result: {
296
+ status: "succeeded",
297
+ references: { runtimeId: "runtime-1" },
298
+ error: {
299
+ code: "UNEXPECTED",
300
+ message: "Should not exist",
301
+ retryable: false,
302
+ },
303
+ },
304
+ },
305
+ {
306
+ label: "non-JSON result metadata",
307
+ result: {
308
+ status: "succeeded",
309
+ references: { runtimeId: "runtime-1" },
310
+ result: { invalid: undefined },
311
+ },
312
+ },
313
+ ])("rejects malformed handler result: $label", async ({ result }) => {
314
+ const dispatcher = new InjectedScheduleDispatcher({
315
+ agent: async () => result,
316
+ });
317
+ await expect(dispatcher.dispatch(run(), schedule())).rejects.toMatchObject({
318
+ code: "INVALID_RESULT",
319
+ retryable: false,
320
+ });
321
+ });
322
+ it("normalizes a failed terminal result with bounded error metadata", async () => {
323
+ const dispatcher = new InjectedScheduleDispatcher({
324
+ agent: async () => ({
325
+ status: "failed",
326
+ references: {},
327
+ error: {
328
+ code: " MODEL_REJECTED ",
329
+ message: " Request rejected ",
330
+ retryable: false,
331
+ metadata: { policy: "strict" },
332
+ },
333
+ }),
334
+ });
335
+ await expect(dispatcher.dispatch(run(), schedule())).resolves.toEqual({
336
+ status: "failed",
337
+ references: {},
338
+ error: {
339
+ code: "MODEL_REJECTED",
340
+ message: "Request rejected",
341
+ retryable: false,
342
+ metadata: { policy: "strict" },
343
+ },
344
+ });
345
+ });
346
+ it("does not swallow errors thrown by a surface adapter", async () => {
347
+ const providerError = new Error("Provider unavailable");
348
+ const dispatcher = new InjectedScheduleDispatcher({
349
+ webhook: async () => {
350
+ throw providerError;
351
+ },
352
+ });
353
+ await expect(dispatcher.dispatch(run(), schedule({ surface: "webhook", webhookId: "webhook-1" }))).rejects.toBe(providerError);
354
+ });
355
+ it("does not invoke a handler when dispatch is already aborted", async () => {
356
+ const agent = vi.fn();
357
+ const dispatcher = new InjectedScheduleDispatcher({ agent });
358
+ const controller = new AbortController();
359
+ controller.abort("lease lost");
360
+ await expect(dispatcher.dispatch(run(), schedule(), {
361
+ signal: controller.signal,
362
+ })).rejects.toMatchObject({
363
+ code: "ABORTED",
364
+ retryable: true,
365
+ });
366
+ expect(agent).not.toHaveBeenCalled();
367
+ });
368
+ it("exposes stable error fields", () => {
369
+ const error = new ScheduleDispatchError("INVALID_RESULT", "Invalid result", false);
370
+ expect(error).toMatchObject({
371
+ name: "ScheduleDispatchError",
372
+ code: "INVALID_RESULT",
373
+ message: "Invalid result",
374
+ retryable: false,
375
+ });
376
+ });
377
+ });
378
+ //# sourceMappingURL=dispatcher.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatcher.test.js","sourceRoot":"","sources":["../../src/scheduling/dispatcher.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { Schedule, ScheduleDriverRegistration } from "./types.js";
2
+ export type ScheduleDriverLifecycleResult = ScheduleDriverRegistration | void;
3
+ /**
4
+ * Delivery-provider lifecycle for a persisted schedule.
5
+ *
6
+ * Implementations register delivery only. A provider callback still has to
7
+ * create and claim a durable ScheduleRun before any invocation is dispatched.
8
+ *
9
+ * Lifecycle methods may return an updated registration when the provider
10
+ * resource changes as part of the operation. Drivers that keep the same
11
+ * provider resource can continue returning void.
12
+ */
13
+ export interface ScheduleDriver {
14
+ register(schedule: Schedule): Promise<ScheduleDriverRegistration>;
15
+ update(schedule: Schedule): Promise<ScheduleDriverRegistration>;
16
+ pause(schedule: Schedule): Promise<ScheduleDriverLifecycleResult>;
17
+ resume(schedule: Schedule): Promise<ScheduleDriverLifecycleResult>;
18
+ delete(schedule: Schedule): Promise<ScheduleDriverLifecycleResult>;
19
+ }
20
+ //# sourceMappingURL=driver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../../src/scheduling/driver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EACR,0BAA0B,EAC3B,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,6BAA6B,GACrC,0BAA0B,GAC1B,IAAI,CAAC;AAET;;;;;;;;;GASG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAAC;IAClE,MAAM,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAAC;IAChE,KAAK,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,6BAA6B,CAAC,CAAC;IAClE,MAAM,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,6BAA6B,CAAC,CAAC;IACnE,MAAM,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,6BAA6B,CAAC,CAAC;CACpE"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=driver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"driver.js","sourceRoot":"","sources":["../../src/scheduling/driver.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
1
+ export * from "./types.js";
2
+ export * from "./store.js";
3
+ export * from "./state-machine.js";
4
+ export * from "./driver.js";
5
+ export * from "./dispatcher.js";
6
+ export * from "./occurrence.js";
7
+ export { SCHEDULE_LIMITS, normalizeCreateScheduleInput, normalizeCronExpression, normalizeScheduleInvocation, normalizeScheduleMetadata, normalizeScheduleTiming, normalizeUpdateScheduleInput, translateLegacyMissionSchedule, } from "./validation.js";
8
+ export type { NormalizeScheduleOptions, TranslateLegacyScheduleOptions, } from "./validation.js";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scheduling/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,OAAO,EACL,eAAe,EACf,4BAA4B,EAC5B,uBAAuB,EACvB,2BAA2B,EAC3B,yBAAyB,EACzB,uBAAuB,EACvB,4BAA4B,EAC5B,8BAA8B,GAC/B,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,wBAAwB,EACxB,8BAA8B,GAC/B,MAAM,iBAAiB,CAAC"}