kadi-harness-runtime 0.1.8

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 (86) hide show
  1. package/README.md +20 -0
  2. package/dist/adapter-loader.d.ts +35 -0
  3. package/dist/adapter-loader.d.ts.map +1 -0
  4. package/dist/adapter-loader.js +109 -0
  5. package/dist/adapter-loader.js.map +1 -0
  6. package/dist/event-bus.d.ts +55 -0
  7. package/dist/event-bus.d.ts.map +1 -0
  8. package/dist/event-bus.js +170 -0
  9. package/dist/event-bus.js.map +1 -0
  10. package/dist/event-normalizer.d.ts +41 -0
  11. package/dist/event-normalizer.d.ts.map +1 -0
  12. package/dist/event-normalizer.js +68 -0
  13. package/dist/event-normalizer.js.map +1 -0
  14. package/dist/gateways/artifacts.d.ts +24 -0
  15. package/dist/gateways/artifacts.d.ts.map +1 -0
  16. package/dist/gateways/artifacts.js +128 -0
  17. package/dist/gateways/artifacts.js.map +1 -0
  18. package/dist/gateways/authorization.d.ts +38 -0
  19. package/dist/gateways/authorization.d.ts.map +1 -0
  20. package/dist/gateways/authorization.js +118 -0
  21. package/dist/gateways/authorization.js.map +1 -0
  22. package/dist/gateways/events.d.ts +31 -0
  23. package/dist/gateways/events.d.ts.map +1 -0
  24. package/dist/gateways/events.js +135 -0
  25. package/dist/gateways/events.js.map +1 -0
  26. package/dist/gateways/redaction.d.ts +2 -0
  27. package/dist/gateways/redaction.d.ts.map +1 -0
  28. package/dist/gateways/redaction.js +2 -0
  29. package/dist/gateways/redaction.js.map +1 -0
  30. package/dist/gateways/sessions.d.ts +27 -0
  31. package/dist/gateways/sessions.d.ts.map +1 -0
  32. package/dist/gateways/sessions.js +167 -0
  33. package/dist/gateways/sessions.js.map +1 -0
  34. package/dist/gateways/tools.d.ts +36 -0
  35. package/dist/gateways/tools.d.ts.map +1 -0
  36. package/dist/gateways/tools.js +135 -0
  37. package/dist/gateways/tools.js.map +1 -0
  38. package/dist/index.d.ts +82 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +27 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/lifecycle.d.ts +23 -0
  43. package/dist/lifecycle.d.ts.map +1 -0
  44. package/dist/lifecycle.js +63 -0
  45. package/dist/lifecycle.js.map +1 -0
  46. package/dist/policy/redaction.d.ts +10 -0
  47. package/dist/policy/redaction.d.ts.map +1 -0
  48. package/dist/policy/redaction.js +48 -0
  49. package/dist/policy/redaction.js.map +1 -0
  50. package/dist/protocol/context-client.d.ts +50 -0
  51. package/dist/protocol/context-client.d.ts.map +1 -0
  52. package/dist/protocol/context-client.js +49 -0
  53. package/dist/protocol/context-client.js.map +1 -0
  54. package/dist/protocol/context-server.d.ts +19 -0
  55. package/dist/protocol/context-server.d.ts.map +1 -0
  56. package/dist/protocol/context-server.js +103 -0
  57. package/dist/protocol/context-server.js.map +1 -0
  58. package/dist/registry.d.ts +42 -0
  59. package/dist/registry.d.ts.map +1 -0
  60. package/dist/registry.js +210 -0
  61. package/dist/registry.js.map +1 -0
  62. package/dist/run-coordinator.d.ts +47 -0
  63. package/dist/run-coordinator.d.ts.map +1 -0
  64. package/dist/run-coordinator.js +241 -0
  65. package/dist/run-coordinator.js.map +1 -0
  66. package/dist/runner/cli.d.ts +18 -0
  67. package/dist/runner/cli.d.ts.map +1 -0
  68. package/dist/runner/cli.js +54 -0
  69. package/dist/runner/cli.js.map +1 -0
  70. package/dist/runner/runner-service.d.ts +88 -0
  71. package/dist/runner/runner-service.d.ts.map +1 -0
  72. package/dist/runner/runner-service.js +138 -0
  73. package/dist/runner/runner-service.js.map +1 -0
  74. package/dist/runtime.d.ts +96 -0
  75. package/dist/runtime.d.ts.map +1 -0
  76. package/dist/runtime.js +330 -0
  77. package/dist/runtime.js.map +1 -0
  78. package/dist/scheduling/request-store.d.ts +71 -0
  79. package/dist/scheduling/request-store.d.ts.map +1 -0
  80. package/dist/scheduling/request-store.js +173 -0
  81. package/dist/scheduling/request-store.js.map +1 -0
  82. package/dist/scheduling/signing.d.ts +57 -0
  83. package/dist/scheduling/signing.d.ts.map +1 -0
  84. package/dist/scheduling/signing.js +142 -0
  85. package/dist/scheduling/signing.js.map +1 -0
  86. package/package.json +47 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-coordinator.d.ts","sourceRoot":"","sources":["../src/run-coordinator.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,eAAe,EAEpB,KAAK,mBAAmB,EAExB,KAAK,cAAc,EACnB,KAAK,YAAY,EAEjB,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,iBAAiB,EACvB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAwB,MAAM,eAAe,CAAC;AAGtE,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,KAAK,GAAG,aAAa,CAAC;AAC1D,MAAM,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE,SAAS,KAAK,MAAM,CAAC;AAEvD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;CAC9B;AAED,MAAM,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,eAAe,KAAK,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;AACrG,MAAM,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAC/F,MAAM,MAAM,gBAAgB,GAAG,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE3E,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,cAAc,EAAE,iBAAiB,CAAC;IAC3C,QAAQ,CAAC,SAAS,CAAC,EAAE,YAAY,CAAC;IAClC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,gBAAgB,CAAC;CACtC;AAED,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,SAAgB,KAAK,EAAE,SAAS,CAAC;gBAEd,KAAK,EAAE,SAAS;CAKpC;AA6FD,qBAAa,cAAc;IAIN,OAAO,CAAC,QAAQ,CAAC,OAAO;IAH3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgC;IACxD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;gBAEL,OAAO,EAAE,qBAAqB;IAYrD,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC;IAwChD,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IAIrD,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAIhD,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwC,GAAG,OAAO,CAAC,IAAI,CAAC;IAevF,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAIlC,KAAK;YAiDL,aAAa;YAwBb,aAAa;YAQb,IAAI;YAOJ,MAAM;YASN,OAAO;YAWP,YAAY;IAI1B,OAAO,CAAC,SAAS;CAYlB;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,IAAI,iBAAiB,CAE5E"}
@@ -0,0 +1,241 @@
1
+ import { CONTRACT_VERSION, RunRequestSchema, RunResultSchema, } from "@kadi.build/kadi-harness-contracts";
2
+ import { AdapterRegistryError } from "./registry.js";
3
+ import { isTerminalStatus, RunLifecycle } from "./lifecycle.js";
4
+ export class RunCoordinatorError extends Error {
5
+ error;
6
+ constructor(error) {
7
+ super(error.message);
8
+ this.name = "RunCoordinatorError";
9
+ this.error = error;
10
+ }
11
+ }
12
+ let generatedId = 0;
13
+ function defaultIdFactory(kind) {
14
+ generatedId += 1;
15
+ return `${kind}-${Date.now().toString(36)}-${generatedId.toString(36)}`;
16
+ }
17
+ function toMessage(error) {
18
+ return error instanceof Error ? error.message : String(error);
19
+ }
20
+ function makeError(code, category, message, details = {}) {
21
+ return {
22
+ code,
23
+ category,
24
+ message,
25
+ retryable: category === "adapter_unavailable" || category === "service_failure",
26
+ details: Object.fromEntries(Object.entries(details).filter(([, value]) => value !== undefined)),
27
+ };
28
+ }
29
+ function validationError(request, issues) {
30
+ return new RunCoordinatorError(makeError("invalid_run_request", "validation", "run request does not satisfy the published contract", {
31
+ requestType: typeof request,
32
+ issues: issues.map((issue) => ({ path: issue.path.map(String).join("."), message: issue.message })),
33
+ }));
34
+ }
35
+ function failureError(code, category, message, cause, details = {}) {
36
+ return makeError(code, category, message, { ...details, cause: toMessage(cause) });
37
+ }
38
+ function terminalStatusFromCancellation(reason) {
39
+ return reason === "timeout" ? "timed_out" : "cancelled";
40
+ }
41
+ function terminalOutcomeFromEvent(event) {
42
+ if (event.type !== "completed" && event.type !== "failed" && event.type !== "cancelled")
43
+ return undefined;
44
+ const output = event.payload?.output;
45
+ return {
46
+ status: event.type,
47
+ output,
48
+ metadata: event.payload,
49
+ };
50
+ }
51
+ function runResultOutcome(result) {
52
+ return {
53
+ status: result.status,
54
+ output: result.output,
55
+ metadata: result.metadata,
56
+ };
57
+ }
58
+ export class RunCoordinator {
59
+ options;
60
+ records = new Map();
61
+ idFactory;
62
+ constructor(options) {
63
+ this.options = options;
64
+ this.idFactory = options.idFactory ?? defaultIdFactory;
65
+ if (options.timeoutMs !== undefined && options.timeoutMs <= 0) {
66
+ throw new RunCoordinatorError(makeError("invalid_timeout", "validation", "timeoutMs must be greater than zero", { timeoutMs: options.timeoutMs }));
67
+ }
68
+ }
69
+ async execute(request) {
70
+ const parsed = RunRequestSchema.safeParse(request);
71
+ if (!parsed.success)
72
+ throw validationError(request, parsed.error.issues);
73
+ const normalizedRequest = parsed.data;
74
+ const resolution = await this.options.registry.resolve(normalizedRequest.adapter, normalizedRequest.capabilities);
75
+ const sessionId = normalizedRequest.session?.id ?? this.idFactory("session");
76
+ const runId = this.idFactory("run");
77
+ const correlationId = this.idFactory("correlation");
78
+ const lifecycle = new RunLifecycle({
79
+ sessionId,
80
+ runId,
81
+ adapterId: resolution.descriptor.identity.id,
82
+ contractVersion: resolution.descriptor.identity.contractVersion || CONTRACT_VERSION,
83
+ });
84
+ let resolveCompletion;
85
+ const completionPromise = new Promise((resolve) => {
86
+ resolveCompletion = resolve;
87
+ });
88
+ const record = {
89
+ request: normalizedRequest,
90
+ lifecycle,
91
+ adapter: resolution.adapter,
92
+ controller: new AbortController(),
93
+ correlationId,
94
+ completion: { promise: completionPromise, resolve: resolveCompletion },
95
+ };
96
+ this.records.set(runId, record);
97
+ if (this.options.timeoutMs !== undefined) {
98
+ record.timeoutHandle = setTimeout(() => {
99
+ void this.cancel(runId, { reason: "timeout", requestedAt: new Date().toISOString() });
100
+ }, this.options.timeoutMs);
101
+ }
102
+ const queuedHandle = lifecycle.handle();
103
+ void this.start(record);
104
+ return queuedHandle;
105
+ }
106
+ async getRun(runId) {
107
+ return this.getRecord(runId).lifecycle.result ?? this.getRecord(runId).lifecycle.handle();
108
+ }
109
+ async waitForResult(runId) {
110
+ return this.getRecord(runId).completion.promise;
111
+ }
112
+ async cancel(runId, request = { reason: "user" }) {
113
+ const record = this.getRecord(runId);
114
+ if (record.lifecycle.result)
115
+ return;
116
+ record.controller.abort(request.message);
117
+ record.cancelPromise ??= this.cancelAdapter(record, request);
118
+ await record.cancelPromise;
119
+ await this.finish(record, {
120
+ status: terminalStatusFromCancellation(request.reason),
121
+ metadata: {
122
+ cancellationReason: request.reason,
123
+ ...(request.message === undefined ? {} : { message: request.message }),
124
+ },
125
+ });
126
+ }
127
+ async close(runId) {
128
+ await this.cancel(runId, { reason: "shutdown", requestedAt: new Date().toISOString() });
129
+ }
130
+ async start(record) {
131
+ if (record.lifecycle.result)
132
+ return;
133
+ record.lifecycle.transition("starting");
134
+ await this.notifyStatus(record);
135
+ try {
136
+ record.context = await this.options.contextFactory({
137
+ request: record.request,
138
+ handle: record.lifecycle.handle(),
139
+ correlationId: record.correlationId,
140
+ adapter: record.adapter.identity,
141
+ signal: record.controller.signal,
142
+ });
143
+ if (record.lifecycle.result)
144
+ return;
145
+ await this.options.registry.initialize(record.request.adapter, record.context, record.request);
146
+ if (record.lifecycle.result)
147
+ return;
148
+ record.lifecycle.transition("running");
149
+ await this.notifyStatus(record);
150
+ record.execution = await record.adapter.run(record.request.input);
151
+ if (record.lifecycle.result)
152
+ return;
153
+ void this.consumeEvents(record, record.execution.events);
154
+ const result = await record.execution.result;
155
+ const parsedResult = RunResultSchema.safeParse(result);
156
+ if (!parsedResult.success) {
157
+ await this.fail(record, failureError("invalid_adapter_result", "harness_failure", "adapter returned a result that violates the published contract", parsedResult.error, { adapterId: record.adapter.identity.id }));
158
+ return;
159
+ }
160
+ await this.finish(record, runResultOutcome(parsedResult.data));
161
+ }
162
+ catch (caught) {
163
+ if (record.lifecycle.result)
164
+ return;
165
+ if (caught instanceof AdapterRegistryError) {
166
+ await this.fail(record, caught.error);
167
+ return;
168
+ }
169
+ await this.fail(record, failureError("adapter_execution_failed", "harness_failure", `adapter '${record.adapter.identity.id}' failed during execution`, caught, { adapterId: record.adapter.identity.id }));
170
+ }
171
+ }
172
+ async consumeEvents(record, events) {
173
+ try {
174
+ for await (const event of events) {
175
+ if (record.lifecycle.result)
176
+ return;
177
+ await this.options.onEvent?.(event, record.lifecycle.handle());
178
+ const outcome = terminalOutcomeFromEvent(event);
179
+ if (outcome) {
180
+ await this.finish(record, outcome);
181
+ return;
182
+ }
183
+ }
184
+ }
185
+ catch (caught) {
186
+ if (!record.lifecycle.result) {
187
+ await this.fail(record, failureError("adapter_event_stream_failed", "harness_failure", `adapter '${record.adapter.identity.id}' event stream failed`, caught, { adapterId: record.adapter.identity.id }));
188
+ }
189
+ }
190
+ }
191
+ async cancelAdapter(record, request) {
192
+ try {
193
+ await record.adapter.cancel(request);
194
+ }
195
+ catch {
196
+ // Cancellation remains authoritative even if native cleanup reports an error.
197
+ }
198
+ }
199
+ async fail(record, kadiError) {
200
+ await this.finish(record, {
201
+ status: "failed",
202
+ metadata: { error: kadiError },
203
+ });
204
+ }
205
+ async finish(record, outcome) {
206
+ if (!record.lifecycle.close(outcome))
207
+ return;
208
+ if (record.timeoutHandle !== undefined)
209
+ clearTimeout(record.timeoutHandle);
210
+ await this.notifyStatus(record);
211
+ await this.cleanup(record);
212
+ const result = record.lifecycle.result;
213
+ if (result)
214
+ record.completion.resolve(result);
215
+ }
216
+ async cleanup(record) {
217
+ record.cleanupPromise ??= (async () => {
218
+ try {
219
+ await record.adapter.close();
220
+ }
221
+ catch {
222
+ // Cleanup is best effort and must not replace the already selected terminal result.
223
+ }
224
+ })();
225
+ await record.cleanupPromise;
226
+ }
227
+ async notifyStatus(record) {
228
+ await this.options.onStatus?.(record.lifecycle.handle());
229
+ }
230
+ getRecord(runId) {
231
+ const record = this.records.get(runId);
232
+ if (!record) {
233
+ throw new RunCoordinatorError(makeError("run_not_found", "validation", `run '${runId}' was not found`, { runId }));
234
+ }
235
+ return record;
236
+ }
237
+ }
238
+ export function isRunTerminal(status) {
239
+ return isTerminalStatus(status);
240
+ }
241
+ //# sourceMappingURL=run-coordinator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-coordinator.js","sourceRoot":"","sources":["../src/run-coordinator.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,GAchB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAmB,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAyB,MAAM,gBAAgB,CAAC;AA0BvF,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAC5B,KAAK,CAAY;IAEjC,YAAmB,KAAgB;QACjC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;QAClC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;CACF;AAqBD,IAAI,WAAW,GAAG,CAAC,CAAC;AAEpB,SAAS,gBAAgB,CAAC,IAAe;IACvC,WAAW,IAAI,CAAC,CAAC;IACjB,OAAO,GAAG,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;AAC1E,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,SAAS,CAChB,IAAY,EACZ,QAA+B,EAC/B,OAAe,EACf,UAAmC,EAAE;IAErC,OAAO;QACL,IAAI;QACJ,QAAQ;QACR,OAAO;QACP,SAAS,EAAE,QAAQ,KAAK,qBAAqB,IAAI,QAAQ,KAAK,iBAAiB;QAC/E,OAAO,EAAE,MAAM,CAAC,WAAW,CACzB,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CACrD;KAChB,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,OAAgB,EAAE,MAA2D;IACpG,OAAO,IAAI,mBAAmB,CAAC,SAAS,CACtC,qBAAqB,EACrB,YAAY,EACZ,qDAAqD,EACrD;QACE,WAAW,EAAE,OAAO,OAAO;QAC3B,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;KACpG,CACF,CAAC,CAAC;AACL,CAAC;AAED,SAAS,YAAY,CACnB,IAAY,EACZ,QAA+B,EAC/B,OAAe,EACf,KAAc,EACd,UAAmC,EAAE;IAErC,OAAO,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AACrF,CAAC;AAED,SAAS,8BAA8B,CAAC,MAAqC;IAC3E,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC;AAC1D,CAAC;AAED,SAAS,wBAAwB,CAAC,KAAmB;IACnD,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW;QAAE,OAAO,SAAS,CAAC;IAC1G,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC;IACrC,OAAO;QACL,MAAM,EAAE,KAAK,CAAC,IAAI;QAClB,MAAM;QACN,QAAQ,EAAE,KAAK,CAAC,OAAO;KACxB,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAiB;IACzC,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;KAC1B,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,cAAc;IAIW;IAHnB,OAAO,GAAG,IAAI,GAAG,EAAqB,CAAC;IACvC,SAAS,CAAe;IAEzC,YAAoC,OAA8B;QAA9B,YAAO,GAAP,OAAO,CAAuB;QAChE,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,gBAAgB,CAAC;QACvD,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,IAAI,OAAO,CAAC,SAAS,IAAI,CAAC,EAAE,CAAC;YAC9D,MAAM,IAAI,mBAAmB,CAAC,SAAS,CACrC,iBAAiB,EACjB,YAAY,EACZ,qCAAqC,EACrC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CACjC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,OAAmB;QACtC,MAAM,MAAM,GAAG,gBAAgB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACnD,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,MAAM,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACzE,MAAM,iBAAiB,GAAG,MAAM,CAAC,IAAI,CAAC;QACtC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CACpD,iBAAiB,CAAC,OAAO,EACzB,iBAAiB,CAAC,YAAY,CAC/B,CAAC;QACF,MAAM,SAAS,GAAG,iBAAiB,CAAC,OAAO,EAAE,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC7E,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACpD,MAAM,SAAS,GAAG,IAAI,YAAY,CAAC;YACjC,SAAS;YACT,KAAK;YACL,SAAS,EAAE,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;YAC5C,eAAe,EAAE,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,eAAe,IAAI,gBAAgB;SACpF,CAAC,CAAC;QACH,IAAI,iBAA+C,CAAC;QACpD,MAAM,iBAAiB,GAAG,IAAI,OAAO,CAAY,CAAC,OAAO,EAAE,EAAE;YAC3D,iBAAiB,GAAG,OAAO,CAAC;QAC9B,CAAC,CAAC,CAAC;QACH,MAAM,MAAM,GAAc;YACxB,OAAO,EAAE,iBAAiB;YAC1B,SAAS;YACT,OAAO,EAAE,UAAU,CAAC,OAAO;YAC3B,UAAU,EAAE,IAAI,eAAe,EAAE;YACjC,aAAa;YACb,UAAU,EAAE,EAAE,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,iBAAiB,EAAE;SACvE,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAChC,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACzC,MAAM,CAAC,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE;gBACrC,KAAK,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;YACxF,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC;QACD,MAAM,YAAY,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;QACxC,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACxB,OAAO,YAAY,CAAC;IACtB,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,KAAa;QAC/B,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;IAC5F,CAAC;IAEM,KAAK,CAAC,aAAa,CAAC,KAAa;QACtC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC;IAClD,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,UAA+B,EAAE,MAAM,EAAE,MAAM,EAAE;QAClF,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM;YAAE,OAAO;QACpC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,CAAC,aAAa,KAAK,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC7D,MAAM,MAAM,CAAC,aAAa,CAAC;QAC3B,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;YACxB,MAAM,EAAE,8BAA8B,CAAC,OAAO,CAAC,MAAM,CAAC;YACtD,QAAQ,EAAE;gBACR,kBAAkB,EAAE,OAAO,CAAC,MAAM;gBAClC,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;aACvE;SACF,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,KAAK,CAAC,KAAa;QAC9B,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAC1F,CAAC;IAEO,KAAK,CAAC,KAAK,CAAC,MAAiB;QACnC,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM;YAAE,OAAO;QACpC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QACxC,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC;gBACjD,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE;gBACjC,aAAa,EAAE,MAAM,CAAC,aAAa;gBACnC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ;gBAChC,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,MAAM;aACjC,CAAC,CAAC;YACH,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM;gBAAE,OAAO;YACpC,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;YAC/F,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM;gBAAE,OAAO;YACpC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YACvC,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAChC,MAAM,CAAC,SAAS,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAClE,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM;gBAAE,OAAO;YACpC,KAAK,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACzD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC;YAC7C,MAAM,YAAY,GAAG,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACvD,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;gBAC1B,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAClC,wBAAwB,EACxB,iBAAiB,EACjB,gEAAgE,EAChE,YAAY,CAAC,KAAK,EAClB,EAAE,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,CAC1C,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YACD,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;QACjE,CAAC;QAAC,OAAO,MAAM,EAAE,CAAC;YAChB,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM;gBAAE,OAAO;YACpC,IAAI,MAAM,YAAY,oBAAoB,EAAE,CAAC;gBAC3C,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;gBACtC,OAAO;YACT,CAAC;YACD,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAClC,0BAA0B,EAC1B,iBAAiB,EACjB,YAAY,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,2BAA2B,EACjE,MAAM,EACN,EAAE,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,CAC1C,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,MAAiB,EAAE,MAAmC;QAChF,IAAI,CAAC;YACH,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBACjC,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM;oBAAE,OAAO;gBACpC,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC/D,MAAM,OAAO,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;gBAChD,IAAI,OAAO,EAAE,CAAC;oBACZ,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;oBACnC,OAAO;gBACT,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;gBAC7B,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAClC,6BAA6B,EAC7B,iBAAiB,EACjB,YAAY,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,uBAAuB,EAC7D,MAAM,EACN,EAAE,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,CAC1C,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,MAAiB,EAAE,OAA4B;QACzE,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,8EAA8E;QAChF,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,IAAI,CAAC,MAAiB,EAAE,SAAoB;QACxD,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;YACxB,MAAM,EAAE,QAAQ;YAChB,QAAQ,EAAE,EAAE,KAAK,EAAE,SAAkC,EAAE;SACxD,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,MAAM,CAAC,MAAiB,EAAE,OAAyB;QAC/D,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC;YAAE,OAAO;QAC7C,IAAI,MAAM,CAAC,aAAa,KAAK,SAAS;YAAE,YAAY,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAC3E,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAChC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC;QACvC,IAAI,MAAM;YAAE,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC;IAEO,KAAK,CAAC,OAAO,CAAC,MAAiB;QACrC,MAAM,CAAC,cAAc,KAAK,CAAC,KAAK,IAAI,EAAE;YACpC,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAC/B,CAAC;YAAC,MAAM,CAAC;gBACP,oFAAoF;YACtF,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;QACL,MAAM,MAAM,CAAC,cAAc,CAAC;IAC9B,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,MAAiB;QAC1C,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3D,CAAC;IAEO,SAAS,CAAC,KAAa;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,mBAAmB,CAAC,SAAS,CACrC,eAAe,EACf,YAAY,EACZ,QAAQ,KAAK,iBAAiB,EAC9B,EAAE,KAAK,EAAE,CACV,CAAC,CAAC;QACL,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAED,MAAM,UAAU,aAAa,CAAC,MAAiB;IAC7C,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env node
2
+ import { RunnerService } from "./runner-service.js";
3
+ import type { SignedScheduledRequest } from "../scheduling/signing.js";
4
+ export interface RunnerCliOptions {
5
+ readonly reference: SignedScheduledRequest;
6
+ }
7
+ export declare function parseRunnerArgs(args: readonly string[]): RunnerCliOptions;
8
+ export interface RunnerCliDependencies {
9
+ readonly runner: Pick<RunnerService, "executeAndWait">;
10
+ }
11
+ export declare function runCli(args: readonly string[], dependencies: RunnerCliDependencies, output?: Pick<Console, "log" | "error">): Promise<number>;
12
+ /**
13
+ * The package is intentionally frontend-neutral. Deployments provide a runner
14
+ * dependency module through KADI_HARNESS_RUNNER_MODULE; this keeps credentials,
15
+ * key stores, registries, and service construction out of the schedule command.
16
+ */
17
+ export declare function main(args?: string[]): Promise<number>;
18
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/runner/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAmB,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAEvE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,SAAS,EAAE,sBAAsB,CAAC;CAC5C;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,gBAAgB,CAUzE;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;CACxD;AAED,wBAAsB,MAAM,CAC1B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,YAAY,EAAE,qBAAqB,EACnC,MAAM,GAAE,IAAI,CAAC,OAAO,EAAE,KAAK,GAAG,OAAO,CAAW,GAC/C,OAAO,CAAC,MAAM,CAAC,CAUjB;AAED;;;;GAIG;AACH,wBAAsB,IAAI,CAAC,IAAI,WAAwB,GAAG,OAAO,CAAC,MAAM,CAAC,CAcxE"}
@@ -0,0 +1,54 @@
1
+ #!/usr/bin/env node
2
+ import { decodeReference } from "./runner-service.js";
3
+ export function parseRunnerArgs(args) {
4
+ const index = args.indexOf("--reference");
5
+ const encoded = index >= 0 ? args[index + 1] : undefined;
6
+ if (typeof encoded !== "string" || encoded.length === 0) {
7
+ throw new Error("missing --reference; pass the opaque signed request emitted by ScheduleGateway");
8
+ }
9
+ if (args.some((arg, position) => position !== index && position !== index + 1 && arg === "--help")) {
10
+ throw new Error("usage: kadi-harness-runner --reference <base64url-envelope>");
11
+ }
12
+ return { reference: decodeReference(encoded) };
13
+ }
14
+ export async function runCli(args, dependencies, output = console) {
15
+ try {
16
+ const options = parseRunnerArgs(args);
17
+ const result = await dependencies.runner.executeAndWait(options.reference);
18
+ output.log(JSON.stringify({ runId: result.runId, sessionId: result.sessionId, status: result.status }));
19
+ return result.status === "completed" ? 0 : 1;
20
+ }
21
+ catch (error) {
22
+ output.error(`kadi-harness-runner failed: ${error instanceof Error ? error.message : String(error)}`);
23
+ return 1;
24
+ }
25
+ }
26
+ /**
27
+ * The package is intentionally frontend-neutral. Deployments provide a runner
28
+ * dependency module through KADI_HARNESS_RUNNER_MODULE; this keeps credentials,
29
+ * key stores, registries, and service construction out of the schedule command.
30
+ */
31
+ export async function main(args = process.argv.slice(2)) {
32
+ const moduleName = process.env.KADI_HARNESS_RUNNER_MODULE;
33
+ if (!moduleName) {
34
+ console.error("kadi-harness-runner: set KADI_HARNESS_RUNNER_MODULE to a module exporting createRunnerService()");
35
+ return 1;
36
+ }
37
+ try {
38
+ const loaded = await import(moduleName);
39
+ if (!loaded.createRunnerService)
40
+ throw new Error("runner module must export createRunnerService()");
41
+ return runCli(args, { runner: await loaded.createRunnerService() });
42
+ }
43
+ catch (error) {
44
+ console.error(`kadi-harness-runner bootstrap failed: ${error instanceof Error ? error.message : String(error)}`);
45
+ return 1;
46
+ }
47
+ }
48
+ if (process.argv[1]?.endsWith("/runner/cli.js") || process.argv[1]?.endsWith("\\runner\\cli.js")) {
49
+ main().then((code) => { process.exitCode = code; }).catch((error) => {
50
+ console.error(`kadi-harness-runner failed: ${error instanceof Error ? error.message : String(error)}`);
51
+ process.exitCode = 1;
52
+ });
53
+ }
54
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/runner/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ import type { JsonObject, PrincipalRef, RunHandle, RunRequest, RunResult, ScheduleCreateRequest, ScheduleReference, ScheduleTrigger } from "@kadi.build/kadi-harness-contracts";
2
+ import { RunCoordinator } from "../run-coordinator.js";
3
+ import { type ReplayGuard, type SignedScheduledRequest, type SigningKeyProvider } from "../scheduling/signing.js";
4
+ import { type ScheduledRequestStore } from "../scheduling/request-store.js";
5
+ export type ScheduleAbilityTrigger = {
6
+ readonly type: "once";
7
+ readonly at: string;
8
+ } | {
9
+ readonly type: "interval";
10
+ readonly every: string;
11
+ } | {
12
+ readonly type: "cron";
13
+ readonly schedule: string;
14
+ } | {
15
+ readonly type: "event";
16
+ readonly channel: string;
17
+ };
18
+ export interface ScheduleTaskDefinition {
19
+ readonly name: string;
20
+ readonly trigger: ScheduleAbilityTrigger;
21
+ readonly command: readonly string[];
22
+ readonly description?: string;
23
+ readonly enabled?: boolean;
24
+ readonly timeout?: string;
25
+ readonly onFailure?: "notify" | "retry" | "disable";
26
+ readonly retryCount?: number;
27
+ readonly retryDelay?: string;
28
+ readonly concurrency?: "skip" | "allow" | "queue";
29
+ readonly owner?: string;
30
+ readonly tags?: readonly string[];
31
+ readonly metadata?: JsonObject;
32
+ }
33
+ /** Minimal boundary implemented by kadi-schedule/schedule-ability clients. */
34
+ export interface ScheduleTaskClient {
35
+ addTask(task: ScheduleTaskDefinition): Promise<{
36
+ readonly name: string;
37
+ readonly trigger?: unknown;
38
+ }>;
39
+ removeTask(name: string): Promise<{
40
+ readonly removed: string;
41
+ }>;
42
+ }
43
+ export interface ScheduleGatewayOptions {
44
+ readonly scheduleClient: ScheduleTaskClient;
45
+ readonly requestStore: ScheduledRequestStore;
46
+ readonly keyProvider: SigningKeyProvider;
47
+ readonly principal: PrincipalRef | (() => PrincipalRef | Promise<PrincipalRef>);
48
+ readonly replayGuard?: ReplayGuard;
49
+ readonly runnerCommand?: string;
50
+ readonly runnerPackage?: string;
51
+ readonly runnerVersion?: string;
52
+ readonly requestTtlMs?: number;
53
+ readonly clock?: () => Date;
54
+ }
55
+ export interface RunnerCoordinator {
56
+ execute(request: RunRequest): Promise<RunHandle>;
57
+ waitForResult(runId: string): Promise<RunResult>;
58
+ }
59
+ export interface RunnerServiceOptions {
60
+ readonly coordinator: RunnerCoordinator | RunCoordinator;
61
+ readonly requestStore: ScheduledRequestStore;
62
+ readonly keyProvider: SigningKeyProvider;
63
+ readonly replayGuard: ReplayGuard;
64
+ readonly audience?: string;
65
+ readonly now?: () => Date;
66
+ }
67
+ export declare function mapScheduleTrigger(trigger: ScheduleTrigger): ScheduleAbilityTrigger;
68
+ /** Creates schedule-ability tasks whose command re-enters the runtime runner. */
69
+ export declare class ScheduleGateway {
70
+ private readonly options;
71
+ constructor(options: ScheduleGatewayOptions);
72
+ create(request: ScheduleCreateRequest): Promise<ScheduleReference>;
73
+ cancel(scheduleId: string): Promise<void>;
74
+ /** RuntimeClient-compatible name for creating a scheduled run. */
75
+ schedule(request: ScheduleCreateRequest): Promise<ScheduleReference>;
76
+ /** RuntimeClient-compatible name for cancelling a scheduled run. */
77
+ unschedule(scheduleId: string): Promise<void>;
78
+ }
79
+ export declare function encodeReference(reference: SignedScheduledRequest): string;
80
+ export declare function decodeReference(encoded: string): SignedScheduledRequest;
81
+ /** Verifies a signed scheduled request and sends it through the shared coordinator. */
82
+ export declare class RunnerService {
83
+ private readonly options;
84
+ constructor(options: RunnerServiceOptions);
85
+ execute(reference: SignedScheduledRequest): Promise<RunHandle>;
86
+ executeAndWait(reference: SignedScheduledRequest): Promise<RunResult>;
87
+ }
88
+ //# sourceMappingURL=runner-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner-service.d.ts","sourceRoot":"","sources":["../../src/runner/runner-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,YAAY,EACZ,SAAS,EACT,UAAU,EACV,SAAS,EACT,qBAAqB,EACrB,iBAAiB,EACjB,eAAe,EAChB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,EACxB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,KAAK,qBAAqB,EAAyB,MAAM,gCAAgC,CAAC;AAEnG,MAAM,MAAM,sBAAsB,GAC9B;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC9C;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACrD;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,sBAAsB,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;IACpD,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;IAClD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC;CAChC;AAED,8EAA8E;AAC9E,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,IAAI,EAAE,sBAAsB,GAAG,OAAO,CAAC;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACtG,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjE;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,cAAc,EAAE,kBAAkB,CAAC;IAC5C,QAAQ,CAAC,YAAY,EAAE,qBAAqB,CAAC;IAC7C,QAAQ,CAAC,WAAW,EAAE,kBAAkB,CAAC;IACzC,QAAQ,CAAC,SAAS,EAAE,YAAY,GAAG,CAAC,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;IAChF,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC;IACnC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IACjD,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;CAClD;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,WAAW,EAAE,iBAAiB,GAAG,cAAc,CAAC;IACzD,QAAQ,CAAC,YAAY,EAAE,qBAAqB,CAAC;IAC7C,QAAQ,CAAC,WAAW,EAAE,kBAAkB,CAAC;IACzC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAC3B;AASD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,eAAe,GAAG,sBAAsB,CAcnF;AAWD,iFAAiF;AACjF,qBAAa,eAAe;IACP,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,sBAAsB;IAEtD,MAAM,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAyDlE,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAItD,kEAAkE;IACrD,QAAQ,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAIjF,oEAAoE;IACvD,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAG3D;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,sBAAsB,GAAG,MAAM,CAEzE;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,sBAAsB,CAQvE;AAED,uFAAuF;AACvF,qBAAa,aAAa;IACL,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,oBAAoB;IAEpD,OAAO,CAAC,SAAS,EAAE,sBAAsB,GAAG,OAAO,CAAC,SAAS,CAAC;IAe9D,cAAc,CAAC,SAAS,EAAE,sBAAsB,GAAG,OAAO,CAAC,SAAS,CAAC;CAInF"}
@@ -0,0 +1,138 @@
1
+ import { createSignedScheduledRequest, RUNNER_AUDIENCE, verifySignedScheduledRequest, } from "../scheduling/signing.js";
2
+ function durationMs(value) {
3
+ if (!Number.isSafeInteger(value) || value <= 0) {
4
+ throw new Error("intervalMs must be a positive integer");
5
+ }
6
+ return `${value}ms`;
7
+ }
8
+ export function mapScheduleTrigger(trigger) {
9
+ switch (trigger.kind) {
10
+ case "once":
11
+ return { type: "once", at: trigger.at };
12
+ case "interval":
13
+ return { type: "interval", every: durationMs(trigger.intervalMs) };
14
+ case "cron":
15
+ if (trigger.timezone) {
16
+ throw new Error("schedule-ability cron triggers do not support timezone in the MVP");
17
+ }
18
+ return { type: "cron", schedule: trigger.expression };
19
+ case "event":
20
+ return { type: "event", channel: trigger.topic };
21
+ }
22
+ }
23
+ function taskName(request, requestRef) {
24
+ const name = request.name?.trim();
25
+ return name || `kadi-harness-${request.adapter.id}-${requestRef.slice(0, 12)}`;
26
+ }
27
+ function resolvePrincipal(value) {
28
+ return Promise.resolve(typeof value === "function" ? value() : value);
29
+ }
30
+ /** Creates schedule-ability tasks whose command re-enters the runtime runner. */
31
+ export class ScheduleGateway {
32
+ options;
33
+ constructor(options) {
34
+ this.options = options;
35
+ }
36
+ async create(request) {
37
+ const principal = await resolvePrincipal(this.options.principal);
38
+ const now = this.options.clock?.() ?? new Date();
39
+ const ttl = this.options.requestTtlMs ?? 24 * 60 * 60 * 1000;
40
+ if (!Number.isSafeInteger(ttl) || ttl <= 0)
41
+ throw new Error("requestTtlMs must be a positive integer");
42
+ const run = {
43
+ adapter: request.adapter,
44
+ input: request.input,
45
+ principal,
46
+ ...(request.idempotencyKey ? { idempotencyKey: request.idempotencyKey } : {}),
47
+ };
48
+ const spec = {
49
+ trigger: request.trigger,
50
+ run,
51
+ idempotencyPrefix: `schedule:${request.idempotencyKey ?? request.name ?? request.adapter.id}`,
52
+ };
53
+ const signed = await createSignedScheduledRequest(this.options.requestStore, this.options.keyProvider, spec, { expiresAt: new Date(now.getTime() + ttl), audience: RUNNER_AUDIENCE });
54
+ const name = taskName(request, signed.reference.requestRef);
55
+ const runnerCommand = this.options.runnerCommand ?? "kadi-harness-runner";
56
+ const runnerPackage = this.options.runnerPackage ?? "kadi-harness-runtime";
57
+ const runnerVersion = this.options.runnerVersion ?? "latest";
58
+ const metadata = {
59
+ kadiHarness: "runtime",
60
+ runnerPackage,
61
+ runnerVersion,
62
+ requestRef: signed.reference.requestRef,
63
+ payloadDigest: signed.reference.payloadDigest,
64
+ keyId: signed.reference.keyId,
65
+ audience: signed.reference.audience,
66
+ createdAt: signed.reference.createdAt,
67
+ expiresAt: signed.reference.expiresAt,
68
+ idempotencyKey: signed.reference.idempotencyKey,
69
+ signature: signed.reference.signature,
70
+ };
71
+ const task = await this.options.scheduleClient.addTask({
72
+ name,
73
+ trigger: mapScheduleTrigger(request.trigger),
74
+ command: [runnerCommand, "--reference", encodeReference(signed.reference)],
75
+ description: "Run a signed KADI harness request through kadi-harness-runtime",
76
+ enabled: true,
77
+ onFailure: spec.retry && spec.retry.count > 0 ? "retry" : "notify",
78
+ retryCount: spec.retry?.count,
79
+ retryDelay: spec.retry?.delay,
80
+ concurrency: spec.concurrency,
81
+ tags: ["kadi", "harness", "runtime"],
82
+ owner: principal.id,
83
+ metadata,
84
+ });
85
+ return { id: task.name, status: "scheduled", metadata };
86
+ }
87
+ async cancel(scheduleId) {
88
+ await this.options.scheduleClient.removeTask(scheduleId);
89
+ }
90
+ /** RuntimeClient-compatible name for creating a scheduled run. */
91
+ async schedule(request) {
92
+ return this.create(request);
93
+ }
94
+ /** RuntimeClient-compatible name for cancelling a scheduled run. */
95
+ async unschedule(scheduleId) {
96
+ return this.cancel(scheduleId);
97
+ }
98
+ }
99
+ export function encodeReference(reference) {
100
+ return Buffer.from(JSON.stringify(reference), "utf8").toString("base64url");
101
+ }
102
+ export function decodeReference(encoded) {
103
+ try {
104
+ const parsed = JSON.parse(Buffer.from(encoded, "base64url").toString("utf8"));
105
+ if (!parsed || typeof parsed !== "object")
106
+ throw new Error("reference must be an object");
107
+ return parsed;
108
+ }
109
+ catch (error) {
110
+ throw new Error(`invalid signed runner reference: ${error instanceof Error ? error.message : String(error)}`);
111
+ }
112
+ }
113
+ /** Verifies a signed scheduled request and sends it through the shared coordinator. */
114
+ export class RunnerService {
115
+ options;
116
+ constructor(options) {
117
+ this.options = options;
118
+ }
119
+ async execute(reference) {
120
+ const stored = await verifySignedScheduledRequest(reference, {
121
+ store: this.options.requestStore,
122
+ keyProvider: this.options.keyProvider,
123
+ replayGuard: this.options.replayGuard,
124
+ audience: this.options.audience ?? RUNNER_AUDIENCE,
125
+ now: this.options.now,
126
+ });
127
+ const request = {
128
+ ...stored.spec.run,
129
+ idempotencyKey: stored.spec.run.idempotencyKey ?? reference.idempotencyKey,
130
+ };
131
+ return this.options.coordinator.execute(request);
132
+ }
133
+ async executeAndWait(reference) {
134
+ const handle = await this.execute(reference);
135
+ return this.options.coordinator.waitForResult(handle.runId);
136
+ }
137
+ }
138
+ //# sourceMappingURL=runner-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner-service.js","sourceRoot":"","sources":["../../src/runner/runner-service.ts"],"names":[],"mappings":"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"}