@workser/runtime 0.0.0-stage → 0.1.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.
Files changed (64) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +71 -2
  3. package/dist/cjs/client/follow.js +103 -0
  4. package/dist/cjs/client/index.js +6 -0
  5. package/dist/cjs/contract/actions.js +223 -0
  6. package/dist/cjs/contract/catalog.js +335 -0
  7. package/dist/cjs/contract/index.js +20 -0
  8. package/dist/cjs/contract/ordered-feed.js +94 -0
  9. package/dist/cjs/contract/types.js +9 -0
  10. package/dist/cjs/engine/engine.js +2 -0
  11. package/dist/cjs/index.js +27 -0
  12. package/dist/cjs/internal/async-queue.js +56 -0
  13. package/dist/cjs/internal/sse.js +170 -0
  14. package/dist/cjs/package.json +1 -0
  15. package/dist/cjs/place/place.js +2 -0
  16. package/dist/cjs/runner/index.js +6 -0
  17. package/dist/cjs/runner/journal.js +82 -0
  18. package/dist/cjs/runner/runner-client.js +477 -0
  19. package/dist/client/follow.d.ts +45 -0
  20. package/dist/client/follow.js +100 -0
  21. package/dist/client/follow.js.map +1 -0
  22. package/dist/client/index.d.ts +1 -0
  23. package/dist/client/index.js +2 -0
  24. package/dist/client/index.js.map +1 -0
  25. package/dist/contract/actions.d.ts +73 -0
  26. package/dist/contract/actions.js +217 -0
  27. package/dist/contract/actions.js.map +1 -0
  28. package/dist/contract/catalog.d.ts +97 -0
  29. package/dist/contract/catalog.js +328 -0
  30. package/dist/contract/catalog.js.map +1 -0
  31. package/dist/contract/index.d.ts +4 -0
  32. package/dist/contract/index.js +5 -0
  33. package/dist/contract/index.js.map +1 -0
  34. package/dist/contract/ordered-feed.d.ts +56 -0
  35. package/dist/contract/ordered-feed.js +91 -0
  36. package/dist/contract/ordered-feed.js.map +1 -0
  37. package/dist/contract/types.d.ts +311 -0
  38. package/dist/contract/types.js +9 -0
  39. package/dist/contract/types.js.map +1 -0
  40. package/dist/engine/engine.d.ts +39 -0
  41. package/dist/engine/engine.js +2 -0
  42. package/dist/engine/engine.js.map +1 -0
  43. package/dist/index.d.ts +10 -0
  44. package/dist/index.js +9 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/internal/async-queue.d.ts +14 -0
  47. package/dist/internal/async-queue.js +53 -0
  48. package/dist/internal/async-queue.js.map +1 -0
  49. package/dist/internal/sse.d.ts +57 -0
  50. package/dist/internal/sse.js +164 -0
  51. package/dist/internal/sse.js.map +1 -0
  52. package/dist/place/place.d.ts +81 -0
  53. package/dist/place/place.js +2 -0
  54. package/dist/place/place.js.map +1 -0
  55. package/dist/runner/index.d.ts +2 -0
  56. package/dist/runner/index.js +2 -0
  57. package/dist/runner/index.js.map +1 -0
  58. package/dist/runner/journal.d.ts +32 -0
  59. package/dist/runner/journal.js +79 -0
  60. package/dist/runner/journal.js.map +1 -0
  61. package/dist/runner/runner-client.d.ts +185 -0
  62. package/dist/runner/runner-client.js +473 -0
  63. package/dist/runner/runner-client.js.map +1 -0
  64. package/package.json +30 -4
@@ -0,0 +1,473 @@
1
+ import { MAX_EVENT_BATCH, TERMINAL_EVENT_TYPES, checkRunnerEvent, } from '../contract/catalog.js';
2
+ import { connectSse, sleep } from '../internal/sse.js';
3
+ export class RunnerError extends Error {
4
+ status;
5
+ code;
6
+ constructor(message, status, code) {
7
+ super(message);
8
+ this.status = status;
9
+ this.code = code;
10
+ this.name = 'RunnerError';
11
+ }
12
+ }
13
+ /** Events that go out at once instead of waiting for the next batch. */
14
+ function isUrgent(type) {
15
+ return type.startsWith('run.') || type === 'check.result' || type === 'preview.ready';
16
+ }
17
+ /**
18
+ * Everything a Workser runner does for its run (runner protocol v1):
19
+ *
20
+ * const runner = new RunnerClient({ baseUrl, runId, token });
21
+ * const brief = await runner.start(); // brief + heartbeat
22
+ * runner.commands((cmd) => …); // stop, answers, decisions
23
+ * runner.emit('run.started', { engine: 'opencode' });
24
+ * runner.emit('step.started', { step_id: 's1', title: 'Run tests' });
25
+ * await runner.finish('run.completed', { summary: 'Done.' });
26
+ *
27
+ * Events are numbered by the client, from the run's cursor, in the order they
28
+ * are emitted, and sent in batches. A resend is safe (core-api drops copies);
29
+ * a gap is answered with where to resend from, and the client does.
30
+ */
31
+ export class RunnerClient {
32
+ options;
33
+ baseUrl;
34
+ fetchFn;
35
+ flushMs;
36
+ heartbeatMs;
37
+ token;
38
+ nextSeq = null;
39
+ pending = [];
40
+ flushTimer = null;
41
+ flushing = null;
42
+ heartbeatTimer = null;
43
+ abort = new AbortController();
44
+ lastCommandPos;
45
+ closed = false;
46
+ journal = null;
47
+ constructor(options) {
48
+ this.options = options;
49
+ this.baseUrl = options.baseUrl.replace(/\/+$/, '');
50
+ this.fetchFn = options.fetch ?? ((input, init) => fetch(input, init));
51
+ this.flushMs = options.flushMs ?? 150;
52
+ this.heartbeatMs = options.heartbeatMs ?? 10_000;
53
+ this.token = options.token;
54
+ }
55
+ get runId() {
56
+ return this.options.runId;
57
+ }
58
+ /** The brief, and where to continue numbering. */
59
+ async brief() {
60
+ const brief = await this.request('GET', '');
61
+ if (this.nextSeq === null) {
62
+ this.nextSeq = brief.cursors.runner_seq + 1;
63
+ await this.recover();
64
+ }
65
+ return brief;
66
+ }
67
+ /**
68
+ * Pick up what an earlier process emitted but never got accepted. They go
69
+ * first, with their own seqs; new events continue after the highest.
70
+ */
71
+ async recover() {
72
+ if (this.journal)
73
+ return;
74
+ if (this.options.journal)
75
+ this.journal = this.options.journal;
76
+ else if (this.options.journalPath) {
77
+ const { EventJournal } = await import('./journal.js');
78
+ this.journal = await EventJournal.open(this.options.journalPath);
79
+ }
80
+ else
81
+ return;
82
+ const saved = await this.journal.load();
83
+ if (!saved.length)
84
+ return;
85
+ this.pending = [...saved, ...this.pending];
86
+ const top = saved[saved.length - 1].seq;
87
+ if (this.nextSeq === null || top >= this.nextSeq)
88
+ this.nextSeq = top + 1;
89
+ void this.flush();
90
+ }
91
+ /** Events still waiting to be accepted (a copy). */
92
+ get unsent() {
93
+ return this.pending.length;
94
+ }
95
+ /** Read the brief and start heartbeating. */
96
+ async start() {
97
+ const brief = await this.brief();
98
+ this.startHeartbeat();
99
+ return brief;
100
+ }
101
+ /**
102
+ * Queue one event. Checked against the catalog now, so a mistake throws
103
+ * here, in the runner's own code, not later in a batch.
104
+ */
105
+ emit(type, data = {}) {
106
+ if (this.closed)
107
+ throw new RunnerError('This runner is closed.');
108
+ if (this.nextSeq === null) {
109
+ throw new RunnerError('Call start() or brief() before emitting events.');
110
+ }
111
+ const event = { event_id: newEventId(), seq: this.nextSeq, type, data };
112
+ const check = checkRunnerEvent(event);
113
+ if (!check.ok)
114
+ throw new RunnerError(check.reason ?? 'Invalid event.');
115
+ this.nextSeq += 1;
116
+ this.pending.push(event);
117
+ this.journal?.append(event);
118
+ if (isUrgent(type))
119
+ void this.flush();
120
+ else
121
+ this.scheduleFlush();
122
+ }
123
+ /** Send everything queued. Resolves when core-api has it (or it was given up on). */
124
+ flush() {
125
+ if (this.flushTimer) {
126
+ clearTimeout(this.flushTimer);
127
+ this.flushTimer = null;
128
+ }
129
+ if (!this.flushing) {
130
+ this.flushing = this.drain().finally(() => {
131
+ this.flushing = null;
132
+ });
133
+ }
134
+ return this.flushing;
135
+ }
136
+ /**
137
+ * Listen for commands. Resumes after the last one seen; on the first
138
+ * connect core-api starts at the oldest command not yet acked. Acks each
139
+ * command after `handler` resolves, unless `autoAck` is false.
140
+ */
141
+ commands(handler, options = {}) {
142
+ const autoAck = options.autoAck ?? true;
143
+ let chain = Promise.resolve();
144
+ return connectSse({
145
+ fetch: this.fetchFn,
146
+ signal: this.abort.signal,
147
+ url: () => `${this.url('/commands')}${this.lastCommandPos !== undefined ? `?after=${this.lastCommandPos}` : ''}`,
148
+ headers: () => ({ Authorization: `Bearer ${this.token}` }),
149
+ onMessage: (message) => {
150
+ if (message.event === 'heartbeat')
151
+ return;
152
+ let command;
153
+ try {
154
+ command = JSON.parse(message.data);
155
+ }
156
+ catch {
157
+ return;
158
+ }
159
+ if (typeof command.pos !== 'number')
160
+ return;
161
+ if (this.lastCommandPos !== undefined && command.pos <= this.lastCommandPos)
162
+ return;
163
+ this.lastCommandPos = command.pos;
164
+ // One at a time, in order: a stop must not overtake the answer before it.
165
+ chain = chain.then(async () => {
166
+ try {
167
+ await handler(command);
168
+ if (autoAck)
169
+ await this.ack(command.pos);
170
+ }
171
+ catch (error) {
172
+ this.report(new RunnerError(`Command ${command.pos} failed: ${error?.message}`));
173
+ }
174
+ });
175
+ },
176
+ onError: (error) => {
177
+ this.report(new RunnerError(`Command stream dropped: ${error?.message ?? String(error)}`, error?.status));
178
+ },
179
+ });
180
+ }
181
+ /** Mark a command done. */
182
+ async ack(pos) {
183
+ const result = await this.request('POST', `/commands/${pos}/ack`);
184
+ return result.acked;
185
+ }
186
+ /** Ask the owner. The answer arrives through `commands()`. */
187
+ async ask(ask) {
188
+ // Anything the owner should see before deciding must already be on the
189
+ // record, so send what's queued first.
190
+ await this.flush();
191
+ return this.request('POST', '/asks', ask);
192
+ }
193
+ /**
194
+ * Put a file in the project's store: get an upload slot, PUT the bytes
195
+ * straight to storage, register it. Returns the stored file (its version
196
+ * counts up per name in the project). Large output belongs here, not in an
197
+ * event.
198
+ *
199
+ * `supersedes`: when another run wrote the current version of this name,
200
+ * name that version to replace it (otherwise core-api answers 409 — one
201
+ * writer per file at a time).
202
+ */
203
+ async uploadFile(name, bytes, options = {}) {
204
+ const mime = options.mime ?? 'application/octet-stream';
205
+ const body = typeof bytes === 'string' ? new TextEncoder().encode(bytes) : bytes;
206
+ const size = body instanceof Uint8Array ? body.byteLength
207
+ : body instanceof ArrayBuffer ? body.byteLength
208
+ : typeof Blob !== 'undefined' && body instanceof Blob ? body.size
209
+ : undefined;
210
+ const grant = await this.request('POST', '/artifacts/uploads', {
211
+ name,
212
+ mime_type: mime,
213
+ ...(size !== undefined ? { size_bytes: size } : {}),
214
+ });
215
+ const streamed = typeof ReadableStream !== 'undefined' && body instanceof ReadableStream;
216
+ const put = {
217
+ method: 'PUT',
218
+ headers: { 'Content-Type': mime },
219
+ body: body,
220
+ ...(streamed ? { duplex: 'half' } : {}),
221
+ };
222
+ const uploaded = await this.fetchFn(grant.upload_url, put);
223
+ if (!uploaded.ok) {
224
+ throw new RunnerError(`Storage refused the upload (${uploaded.status}).`, uploaded.status);
225
+ }
226
+ const sha256 = body instanceof Uint8Array || body instanceof ArrayBuffer ? await sha256Hex(body) : undefined;
227
+ return this.registerArtifact({
228
+ name,
229
+ storage_key: grant.storage_key,
230
+ kind: options.kind ?? 'file',
231
+ mime_type: mime,
232
+ ...(size !== undefined ? { size_bytes: size } : {}),
233
+ ...(sha256 ? { sha256 } : {}),
234
+ ...(options.supersedes ? { supersedes: options.supersedes } : {}),
235
+ ...(options.description ? { description: options.description } : {}),
236
+ });
237
+ }
238
+ /** Register a file already PUT to an upload slot from `uploadFile`. */
239
+ registerArtifact(file) {
240
+ return this.request('POST', '/artifacts', file);
241
+ }
242
+ /** A file in this run's project, with a short-lived download URL. */
243
+ getArtifact(artifactId) {
244
+ return this.request('GET', `/artifacts/${encodeURIComponent(artifactId)}`);
245
+ }
246
+ /**
247
+ * Ask for a sub-job (plan Phase 3). core-api checks it (same project,
248
+ * depth, budget, no loops) and makes the child run; when the child ends,
249
+ * this run gets a `resume` command carrying the `HandoffResult`.
250
+ */
251
+ async handoff(handoff) {
252
+ await this.flush();
253
+ return this.request('POST', '/handoffs', handoff);
254
+ }
255
+ /** Where a sub-job this run asked for has got to. */
256
+ handoffStatus(childRunId) {
257
+ return this.request('GET', `/handoffs/${encodeURIComponent(childRunId)}`);
258
+ }
259
+ /** The tools this run may call (Workser's and the project's connected apps). */
260
+ listTools() {
261
+ return this.request('GET', '/tools');
262
+ }
263
+ /**
264
+ * Call one tool by name. A side effect or a big spend comes back
265
+ * `approval_required` first; call again with the approval id once the
266
+ * owner has said yes (it arrives as an `approval` command).
267
+ */
268
+ async callTool(name, call = {}) {
269
+ await this.flush();
270
+ return this.request('POST', `/tools/${encodeURIComponent(name)}`, call);
271
+ }
272
+ /** Tell core-api this runner is alive. */
273
+ heartbeat() {
274
+ return this.request('POST', '/heartbeat');
275
+ }
276
+ /**
277
+ * The token this client holds now — after `rotateToken`, the new one. For
278
+ * the runner to hand the same key to its engine; never log it.
279
+ */
280
+ get currentToken() {
281
+ return this.token;
282
+ }
283
+ /** Swap to a fresh token for a long job. The old one stops working. */
284
+ async rotateToken() {
285
+ const result = await this.request('POST', '/token/rotate');
286
+ this.token = result.token;
287
+ return result.expires_at;
288
+ }
289
+ /** End the run: send the terminal event, flush, stop. */
290
+ async finish(type, data = {}, options = {}) {
291
+ this.emit(type, data);
292
+ await this.close(options);
293
+ }
294
+ /**
295
+ * Flush what's queued (waiting at most `timeoutMs` — a runner that can't
296
+ * reach core-api must still be able to exit), then stop heartbeats and the
297
+ * command stream.
298
+ */
299
+ async close(options = {}) {
300
+ if (this.closed)
301
+ return;
302
+ const give = new AbortController();
303
+ await Promise.race([this.flush(), sleep(options.timeoutMs ?? 30_000, give.signal)]);
304
+ give.abort(); // don't keep the process alive for the rest of the wait
305
+ this.closed = true;
306
+ if (this.heartbeatTimer)
307
+ clearInterval(this.heartbeatTimer);
308
+ this.heartbeatTimer = null;
309
+ this.abort.abort();
310
+ }
311
+ // ---------------------------------------------------------------------------
312
+ scheduleFlush() {
313
+ if (this.flushTimer || this.flushing)
314
+ return;
315
+ this.flushTimer = setTimeout(() => {
316
+ this.flushTimer = null;
317
+ void this.flush();
318
+ }, this.flushMs);
319
+ }
320
+ startHeartbeat() {
321
+ if (this.heartbeatTimer)
322
+ return;
323
+ this.heartbeatTimer = setInterval(() => {
324
+ this.heartbeat()
325
+ .then((beat) => {
326
+ if (beat.status && ['COMPLETED', 'FAILED', 'CANCELLED'].includes(beat.status)) {
327
+ // The run ended elsewhere (stopped from a screen, closed by the
328
+ // reaper). Nothing more this runner sends will count.
329
+ if (this.heartbeatTimer)
330
+ clearInterval(this.heartbeatTimer);
331
+ this.heartbeatTimer = null;
332
+ }
333
+ })
334
+ .catch((error) => this.report(asRunnerError(error)));
335
+ }, this.heartbeatMs);
336
+ this.heartbeatTimer.unref?.();
337
+ }
338
+ async drain() {
339
+ let delay = 250;
340
+ let renumbered = 0;
341
+ while (this.pending.length) {
342
+ const batch = this.pending.slice(0, MAX_EVENT_BATCH);
343
+ try {
344
+ // On disk before it is on the wire: a kill mid-send loses nothing.
345
+ await this.journal?.sync();
346
+ await this.request('POST', '/events', { events: batch });
347
+ this.pending.splice(0, batch.length);
348
+ this.rewriteJournal(this.pending);
349
+ delay = 250;
350
+ renumbered = 0;
351
+ }
352
+ catch (error) {
353
+ const failure = asRunnerError(error);
354
+ const expected = failure.expected;
355
+ if (failure.status === 409 && typeof expected === 'number' && renumbered < 3) {
356
+ this.realign(expected);
357
+ renumbered += 1;
358
+ continue;
359
+ }
360
+ if (failure.status === 401 || failure.status === 403) {
361
+ // The token is gone (run ended, rotated elsewhere). Stop trying.
362
+ this.report(failure);
363
+ this.pending = [];
364
+ this.rewriteJournal([]);
365
+ return;
366
+ }
367
+ if (failure.status === 400) {
368
+ // A malformed batch would block every later event. Drop it, say so.
369
+ this.report(failure);
370
+ this.pending.splice(0, batch.length);
371
+ this.rewriteJournal(this.pending);
372
+ continue;
373
+ }
374
+ this.report(failure);
375
+ if (this.closed)
376
+ return;
377
+ await sleep(delay);
378
+ delay = Math.min(delay * 2, 10_000);
379
+ }
380
+ }
381
+ }
382
+ /**
383
+ * core-api says the next seq it expects is `expected`, and that our batch
384
+ * was NOT stored (a gap, or seqs another writer already used). Batches are
385
+ * all-or-nothing and an identical resend is accepted as a duplicate, so a
386
+ * 409 never means "some of yours are stored": nothing we hold is dropped.
387
+ * Everything is renumbered from `expected`.
388
+ *
389
+ * It used to drop events below `expected` as "already stored". After a
390
+ * restart with a stale brief, those were the new runner's own events, never
391
+ * stored — `run.started` was lost that way (Phase 6 chaos test).
392
+ */
393
+ realign(expected) {
394
+ let seq = expected;
395
+ for (const one of this.pending)
396
+ one.seq = seq++;
397
+ this.nextSeq = seq;
398
+ this.rewriteJournal(this.pending);
399
+ }
400
+ /** A journal of the caller's own may be async: its failure never stops the sends. */
401
+ rewriteJournal(events) {
402
+ try {
403
+ const done = this.journal?.rewrite(events.slice());
404
+ if (done && typeof done.catch === 'function') {
405
+ done.catch((error) => this.report(asRunnerError(error)));
406
+ }
407
+ }
408
+ catch (error) {
409
+ this.report(asRunnerError(error));
410
+ }
411
+ }
412
+ url(path) {
413
+ return `${this.baseUrl}/v1/runner/runs/${encodeURIComponent(this.options.runId)}${path}`;
414
+ }
415
+ async request(method, path, body) {
416
+ const init = {
417
+ method,
418
+ headers: {
419
+ Authorization: `Bearer ${this.token}`,
420
+ ...(body !== undefined ? { 'Content-Type': 'application/json' } : {}),
421
+ },
422
+ };
423
+ if (body !== undefined)
424
+ init.body = JSON.stringify(body);
425
+ const response = await this.fetchFn(this.url(path), init);
426
+ const text = await response.text();
427
+ const parsed = text ? safeJson(text) : null;
428
+ if (!response.ok) {
429
+ const error = parsed?.error;
430
+ const message = error?.message ??
431
+ parsed?.message ??
432
+ `core-api answered ${response.status}.`;
433
+ const failure = new RunnerError(message, response.status, error?.code);
434
+ if (typeof error?.expected === 'number')
435
+ failure.expected = error.expected;
436
+ throw failure;
437
+ }
438
+ return parsed;
439
+ }
440
+ report(error) {
441
+ this.options.onError?.(error);
442
+ }
443
+ }
444
+ function asRunnerError(error) {
445
+ if (error instanceof RunnerError)
446
+ return error;
447
+ return new RunnerError(error?.message ?? String(error));
448
+ }
449
+ function safeJson(text) {
450
+ try {
451
+ return JSON.parse(text);
452
+ }
453
+ catch {
454
+ return { message: text.slice(0, 500) };
455
+ }
456
+ }
457
+ /** ≤ 40 characters, unique per run. */
458
+ function newEventId() {
459
+ const cryptoApi = globalThis.crypto;
460
+ if (cryptoApi?.randomUUID)
461
+ return cryptoApi.randomUUID();
462
+ return `ev-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 12)}`;
463
+ }
464
+ export { TERMINAL_EVENT_TYPES };
465
+ /** Hex SHA-256 where Web Crypto exists (Node 19+, browsers); else undefined. */
466
+ async function sha256Hex(bytes) {
467
+ const subtle = globalThis.crypto?.subtle;
468
+ if (!subtle)
469
+ return undefined;
470
+ const digest = await subtle.digest('SHA-256', bytes);
471
+ return Array.from(new Uint8Array(digest), (b) => b.toString(16).padStart(2, '0')).join('');
472
+ }
473
+ //# sourceMappingURL=runner-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner-client.js","sourceRoot":"","sources":["../../src/runner/runner-client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,gBAAgB,GAEjB,MAAM,wBAAwB,CAAC;AAmBhC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAkB,MAAM,oBAAoB,CAAC;AAwCvE,MAAM,OAAO,WAAY,SAAQ,KAAK;IAGzB;IACA;IAHX,YACE,OAAe,EACN,MAAe,EACf,IAAa;QAEtB,KAAK,CAAC,OAAO,CAAC,CAAC;QAHN,WAAM,GAAN,MAAM,CAAS;QACf,SAAI,GAAJ,IAAI,CAAS;QAGtB,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF;AAMD,wEAAwE;AACxE,SAAS,QAAQ,CAAC,IAAY;IAC5B,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,IAAI,KAAK,cAAc,IAAI,IAAI,KAAK,eAAe,CAAC;AACxF,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAO,YAAY;IAgBM;IAfZ,OAAO,CAAS;IAChB,OAAO,CAAY;IACnB,OAAO,CAAS;IAChB,WAAW,CAAS;IAC7B,KAAK,CAAS;IACd,OAAO,GAAkB,IAAI,CAAC;IAC9B,OAAO,GAAc,EAAE,CAAC;IACxB,UAAU,GAAyC,IAAI,CAAC;IACxD,QAAQ,GAAyB,IAAI,CAAC;IACtC,cAAc,GAA0C,IAAI,CAAC;IACpD,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;IACvC,cAAc,CAAqB;IACnC,MAAM,GAAG,KAAK,CAAC;IACf,OAAO,GAAsB,IAAI,CAAC;IAE1C,YAA6B,OAA4B;QAA5B,YAAO,GAAP,OAAO,CAAqB;QACvD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACnD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;QACtE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,GAAG,CAAC;QACtC,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,MAAM,CAAC;QACjD,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC7B,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;IAC5B,CAAC;IAED,kDAAkD;IAClD,KAAK,CAAC,KAAK;QACT,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAW,KAAK,EAAE,EAAE,CAAC,CAAC;QACtD,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YAC1B,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,GAAG,CAAC,CAAC;YAC5C,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACvB,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,OAAO;QACnB,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO;YAAE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;aACzD,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YAClC,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;YACtD,IAAI,CAAC,OAAO,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACnE,CAAC;;YAAM,OAAO;QACd,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QACxC,IAAI,CAAC,KAAK,CAAC,MAAM;YAAE,OAAO;QAC1B,IAAI,CAAC,OAAO,GAAG,CAAC,GAAG,KAAK,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,GAAG,CAAC;QACzC,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,OAAO,GAAG,GAAG,GAAG,CAAC,CAAC;QACzE,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC;IAED,oDAAoD;IACpD,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,6CAA6C;IAC7C,KAAK,CAAC,KAAK;QACT,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACjC,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;OAGG;IACH,IAAI,CAAC,IAAY,EAAE,OAAgC,EAAE;QACnD,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,WAAW,CAAC,wBAAwB,CAAC,CAAC;QACjE,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YAC1B,MAAM,IAAI,WAAW,CAAC,iDAAiD,CAAC,CAAC;QAC3E,CAAC;QACD,MAAM,KAAK,GAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACjF,MAAM,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC,EAAE;YAAE,MAAM,IAAI,WAAW,CAAC,KAAK,CAAC,MAAM,IAAI,gBAAgB,CAAC,CAAC;QACvE,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;QAClB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAI,QAAQ,CAAC,IAAI,CAAC;YAAE,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;;YACjC,IAAI,CAAC,aAAa,EAAE,CAAC;IAC5B,CAAC;IAED,qFAAqF;IACrF,KAAK;QACH,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC9B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;gBACxC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YACvB,CAAC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED;;;;OAIG;IACH,QAAQ,CACN,OAAyD,EACzD,UAAiC,EAAE;QAEnC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC;QACxC,IAAI,KAAK,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;QAC7C,OAAO,UAAU,CAAC;YAChB,KAAK,EAAE,IAAI,CAAC,OAAO;YACnB,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;YACzB,GAAG,EAAE,GAAG,EAAE,CACR,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;YACvG,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;YAC1D,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE;gBACrB,IAAI,OAAO,CAAC,KAAK,KAAK,WAAW;oBAAE,OAAO;gBAC1C,IAAI,OAAsB,CAAC;gBAC3B,IAAI,CAAC;oBACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAkB,CAAC;gBACtD,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO;gBACT,CAAC;gBACD,IAAI,OAAO,OAAO,CAAC,GAAG,KAAK,QAAQ;oBAAE,OAAO;gBAC5C,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,IAAI,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,cAAc;oBAAE,OAAO;gBACpF,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC;gBAClC,0EAA0E;gBAC1E,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;oBAC5B,IAAI,CAAC;wBACH,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;wBACvB,IAAI,OAAO;4BAAE,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;oBAC3C,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,IAAI,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,WAAW,OAAO,CAAC,GAAG,YAAa,KAAe,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;oBAC9F,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;YACD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;gBACjB,IAAI,CAAC,MAAM,CACT,IAAI,WAAW,CACb,2BAA4B,KAAe,EAAE,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,EACtE,KAA6B,EAAE,MAAM,CACvC,CACF,CAAC;YACJ,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAED,2BAA2B;IAC3B,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAqB,MAAM,EAAE,aAAa,GAAG,MAAM,CAAC,CAAC;QACtF,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB,CAAC;IAED,8DAA8D;IAC9D,KAAK,CAAC,GAAG,CAAC,GAAQ;QAChB,uEAAuE;QACvE,uCAAuC;QACvC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC,OAAO,CAAY,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;IACvD,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,UAAU,CACd,IAAY,EACZ,KAA4E,EAC5E,UAKI,EAAE;QAEN,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,0BAA0B,CAAC;QACxD,MAAM,IAAI,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACjF,MAAM,IAAI,GACR,IAAI,YAAY,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU;YAC5C,CAAC,CAAC,IAAI,YAAY,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU;gBAC/C,CAAC,CAAC,OAAO,IAAI,KAAK,WAAW,IAAI,IAAI,YAAY,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI;oBACjE,CAAC,CAAC,SAAS,CAAC;QACd,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAc,MAAM,EAAE,oBAAoB,EAAE;YAC1E,IAAI;YACJ,SAAS,EAAE,IAAI;YACf,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACpD,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,OAAO,cAAc,KAAK,WAAW,IAAI,IAAI,YAAY,cAAc,CAAC;QACzF,MAAM,GAAG,GAAsC;YAC7C,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE;YACjC,IAAI,EAAE,IAAgB;YACtB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACjD,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QAC3D,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,WAAW,CAAC,+BAA+B,QAAQ,CAAC,MAAM,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC7F,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,YAAY,UAAU,IAAI,IAAI,YAAY,WAAW,CAAC,CAAC,CAAC,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC7G,OAAO,IAAI,CAAC,gBAAgB,CAAC;YAC3B,IAAI;YACJ,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,MAAM;YAC5B,SAAS,EAAE,IAAI;YACf,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnD,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7B,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjE,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACrE,CAAC,CAAC;IACL,CAAC;IAED,uEAAuE;IACvE,gBAAgB,CAAC,IAAsB;QACrC,OAAO,IAAI,CAAC,OAAO,CAAc,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;IAC/D,CAAC;IAED,qEAAqE;IACrE,WAAW,CAAC,UAAkB;QAC5B,OAAO,IAAI,CAAC,OAAO,CAAc,KAAK,EAAE,cAAc,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IAC1F,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,OAAO,CAAC,OAAgB;QAC5B,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC,OAAO,CAAiB,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IACpE,CAAC;IAED,qDAAqD;IACrD,aAAa,CAAC,UAAkB;QAC9B,OAAO,IAAI,CAAC,OAAO,CAAgB,KAAK,EAAE,aAAa,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IAC3F,CAAC;IAED,gFAAgF;IAChF,SAAS;QACP,OAAO,IAAI,CAAC,OAAO,CAAiB,KAAK,EAAE,QAAQ,CAAC,CAAC;IACvD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,QAAQ,CAAC,IAAY,EAAE,OAAiB,EAAE;QAC9C,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC,OAAO,CAAiB,MAAM,EAAE,UAAU,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAC1F,CAAC;IAED,0CAA0C;IAC1C,SAAS;QACP,OAAO,IAAI,CAAC,OAAO,CAAkB,MAAM,EAAE,YAAY,CAAC,CAAC;IAC7D,CAAC;IAED;;;OAGG;IACH,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,uEAAuE;IACvE,KAAK,CAAC,WAAW;QACf,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAwC,MAAM,EAAE,eAAe,CAAC,CAAC;QAClG,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC1B,OAAO,MAAM,CAAC,UAAU,CAAC;IAC3B,CAAC;IAED,yDAAyD;IACzD,KAAK,CAAC,MAAM,CACV,IAAsD,EACtD,OAAgC,EAAE,EAClC,UAAkC,EAAE;QAEpC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACtB,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAK,CAAC,UAAkC,EAAE;QAC9C,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,MAAM,IAAI,GAAG,IAAI,eAAe,EAAE,CAAC;QACnC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS,IAAI,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACpF,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,wDAAwD;QACtE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,IAAI,CAAC,cAAc;YAAE,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC5D,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED,8EAA8E;IAEtE,aAAa;QACnB,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC7C,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,GAAG,EAAE;YAChC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YACvB,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;QACpB,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACnB,CAAC;IAEO,cAAc;QACpB,IAAI,IAAI,CAAC,cAAc;YAAE,OAAO;QAChC,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;YACrC,IAAI,CAAC,SAAS,EAAE;iBACb,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;gBACb,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC9E,gEAAgE;oBAChE,sDAAsD;oBACtD,IAAI,IAAI,CAAC,cAAc;wBAAE,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;oBAC5D,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;gBAC7B,CAAC;YACH,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACzD,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACpB,IAAI,CAAC,cAAyC,CAAC,KAAK,EAAE,EAAE,CAAC;IAC5D,CAAC;IAEO,KAAK,CAAC,KAAK;QACjB,IAAI,KAAK,GAAG,GAAG,CAAC;QAChB,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;YACrD,IAAI,CAAC;gBACH,mEAAmE;gBACnE,MAAM,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;gBAC3B,MAAM,IAAI,CAAC,OAAO,CAAoB,MAAM,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC5E,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;gBACrC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAClC,KAAK,GAAG,GAAG,CAAC;gBACZ,UAAU,GAAG,CAAC,CAAC;YACjB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;gBACrC,MAAM,QAAQ,GAAI,OAA+C,CAAC,QAAQ,CAAC;gBAC3E,IAAI,OAAO,CAAC,MAAM,KAAK,GAAG,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;oBAC7E,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;oBACvB,UAAU,IAAI,CAAC,CAAC;oBAChB,SAAS;gBACX,CAAC;gBACD,IAAI,OAAO,CAAC,MAAM,KAAK,GAAG,IAAI,OAAO,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;oBACrD,iEAAiE;oBACjE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;oBACrB,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;oBAClB,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;oBACxB,OAAO;gBACT,CAAC;gBACD,IAAI,OAAO,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;oBAC3B,oEAAoE;oBACpE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;oBACrB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;oBACrC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBAClC,SAAS;gBACX,CAAC;gBACD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBACrB,IAAI,IAAI,CAAC,MAAM;oBAAE,OAAO;gBACxB,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;gBACnB,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;;;;;;;OAUG;IACK,OAAO,CAAC,QAAgB;QAC9B,IAAI,GAAG,GAAG,QAAQ,CAAC;QACnB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,OAAO;YAAE,GAAG,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC;QAChD,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;QACnB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IAED,qFAAqF;IAC7E,cAAc,CAAC,MAAiB;QACtC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YACnD,IAAI,IAAI,IAAI,OAAQ,IAAsB,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;gBAC/D,IAAsB,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC9E,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAEO,GAAG,CAAC,IAAY;QACtB,OAAO,GAAG,IAAI,CAAC,OAAO,mBAAmB,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,CAAC;IAC3F,CAAC;IAEO,KAAK,CAAC,OAAO,CAAI,MAAc,EAAE,IAAY,EAAE,IAAc;QACnE,MAAM,IAAI,GAAgB;YACxB,MAAM;YACN,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE;gBACrC,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACtE;SACF,CAAC;QACF,IAAI,IAAI,KAAK,SAAS;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;QAC1D,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC5C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,KAAK,GAAI,MAAoF,EAAE,KAAK,CAAC;YAC3G,MAAM,OAAO,GACX,KAAK,EAAE,OAAO;gBACb,MAAsC,EAAE,OAAO;gBAChD,qBAAqB,QAAQ,CAAC,MAAM,GAAG,CAAC;YAC1C,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAEpE,CAAC;YACF,IAAI,OAAO,KAAK,EAAE,QAAQ,KAAK,QAAQ;gBAAE,OAAO,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;YAC3E,MAAM,OAAO,CAAC;QAChB,CAAC;QACD,OAAO,MAAW,CAAC;IACrB,CAAC;IAEO,MAAM,CAAC,KAAkB;QAC/B,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;CACF;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,KAAK,YAAY,WAAW;QAAE,OAAO,KAAK,CAAC;IAC/C,OAAO,IAAI,WAAW,CAAE,KAAe,EAAE,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;IACzC,CAAC;AACH,CAAC;AAED,uCAAuC;AACvC,SAAS,UAAU;IACjB,MAAM,SAAS,GAAI,UAAyD,CAAC,MAAM,CAAC;IACpF,IAAI,SAAS,EAAE,UAAU;QAAE,OAAO,SAAS,CAAC,UAAU,EAAE,CAAC;IACzD,OAAO,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;AACpF,CAAC;AAED,OAAO,EAAE,oBAAoB,EAAE,CAAC;AAEhC,gFAAgF;AAChF,KAAK,UAAU,SAAS,CAAC,KAA+B;IACtD,MAAM,MAAM,GAAI,UAAiH,CAAC,MAAM,EAAE,MAAM,CAAC;IACjJ,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACrD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC7F,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,32 @@
1
1
  {
2
2
  "name": "@workser/runtime",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.0",
4
+ "description": "The Workser run contract: event catalog, runner client, run and project streams, and the Place and Engine interfaces every Workser runner, screen and service speaks.",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "main": "./dist/cjs/index.js",
8
+ "module": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "exports": {
11
+ ".": { "types": "./dist/index.d.ts", "import": "./dist/index.js", "require": "./dist/cjs/index.js" },
12
+ "./contract": { "types": "./dist/contract/index.d.ts", "import": "./dist/contract/index.js", "require": "./dist/cjs/contract/index.js" },
13
+ "./runner": { "types": "./dist/runner/index.d.ts", "import": "./dist/runner/index.js", "require": "./dist/cjs/runner/index.js" },
14
+ "./client": { "types": "./dist/client/index.d.ts", "import": "./dist/client/index.js", "require": "./dist/cjs/client/index.js" }
15
+ },
16
+ "files": ["dist", "README.md", "LICENSE"],
17
+ "engines": { "node": ">=18" },
18
+ "sideEffects": false,
19
+ "scripts": {
20
+ "build": "rm -rf dist && tsc -p tsconfig.build.json && tsc -p tsconfig.cjs.json && node scripts/mark-cjs.mjs",
21
+ "typecheck": "tsc --noEmit",
22
+ "test": "rm -rf .test-build && tsc -p tsconfig.json --outDir .test-build && node --test .test-build/test/*.test.js",
23
+ "sync:core-api": "node scripts/sync-core-api.mjs",
24
+ "prepublishOnly": "npm run typecheck && npm run test && npm run build"
25
+ },
26
+ "keywords": ["workser", "ai-agent", "runner", "sse", "sdk"],
27
+ "devDependencies": {
28
+ "@types/node": "^20.19.43",
29
+ "typescript": "^5.9.3"
30
+ },
31
+ "publishConfig": { "access": "public" }
32
+ }