@ouispec/bindings 0.0.0-stage → 0.1.1

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 (67) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +18 -2
  3. package/dist/binding.d.ts +46 -0
  4. package/dist/binding.d.ts.map +1 -0
  5. package/dist/binding.js +51 -0
  6. package/dist/binding.js.map +1 -0
  7. package/dist/controls.d.ts +69 -0
  8. package/dist/controls.d.ts.map +1 -0
  9. package/dist/controls.js +334 -0
  10. package/dist/controls.js.map +1 -0
  11. package/dist/effect.d.ts +54 -0
  12. package/dist/effect.d.ts.map +1 -0
  13. package/dist/effect.js +88 -0
  14. package/dist/effect.js.map +1 -0
  15. package/dist/index.d.ts +26 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +25 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/interactive.d.ts +12 -0
  20. package/dist/interactive.d.ts.map +1 -0
  21. package/dist/interactive.js +21 -0
  22. package/dist/interactive.js.map +1 -0
  23. package/dist/jobs.d.ts +54 -0
  24. package/dist/jobs.d.ts.map +1 -0
  25. package/dist/jobs.js +74 -0
  26. package/dist/jobs.js.map +1 -0
  27. package/dist/json-schema.d.ts +36 -0
  28. package/dist/json-schema.d.ts.map +1 -0
  29. package/dist/json-schema.js +196 -0
  30. package/dist/json-schema.js.map +1 -0
  31. package/dist/jsx.d.ts +19 -0
  32. package/dist/jsx.d.ts.map +1 -0
  33. package/dist/jsx.js +2 -0
  34. package/dist/jsx.js.map +1 -0
  35. package/dist/manifest.d.ts +35 -0
  36. package/dist/manifest.d.ts.map +1 -0
  37. package/dist/manifest.js +77 -0
  38. package/dist/manifest.js.map +1 -0
  39. package/dist/oui.d.ts +112 -0
  40. package/dist/oui.d.ts.map +1 -0
  41. package/dist/oui.js +514 -0
  42. package/dist/oui.js.map +1 -0
  43. package/dist/package-declaration.d.ts +24 -0
  44. package/dist/package-declaration.d.ts.map +1 -0
  45. package/dist/package-declaration.js +24 -0
  46. package/dist/package-declaration.js.map +1 -0
  47. package/dist/react.d.ts +74 -0
  48. package/dist/react.d.ts.map +1 -0
  49. package/dist/react.js +179 -0
  50. package/dist/react.js.map +1 -0
  51. package/dist/registry.d.ts +103 -0
  52. package/dist/registry.d.ts.map +1 -0
  53. package/dist/registry.js +146 -0
  54. package/dist/registry.js.map +1 -0
  55. package/dist/room.d.ts +79 -0
  56. package/dist/room.d.ts.map +1 -0
  57. package/dist/room.js +111 -0
  58. package/dist/room.js.map +1 -0
  59. package/dist/tier2-react.d.ts +35 -0
  60. package/dist/tier2-react.d.ts.map +1 -0
  61. package/dist/tier2-react.js +186 -0
  62. package/dist/tier2-react.js.map +1 -0
  63. package/dist/tier2.d.ts +68 -0
  64. package/dist/tier2.d.ts.map +1 -0
  65. package/dist/tier2.js +129 -0
  66. package/dist/tier2.js.map +1 -0
  67. package/package.json +74 -3
package/dist/oui.js ADDED
@@ -0,0 +1,514 @@
1
+ /**
2
+ * The tab's OUI surfaces, built from the build's generated manifest and what
3
+ * is mounted right now (ADR-0220 §2.2, ADR-0209).
4
+ *
5
+ * A turn's UI tools are the intersection of the two: an action the build
6
+ * declares whose control (or room) is on screen. Each action runs the
7
+ * control's own handler, or the room's own entry, so the assistant and the
8
+ * person go through one code path.
9
+ */
10
+ import { defineSurface, } from 'oui-spec/core';
11
+ import { deriveInputSchema, ITEM_PROPERTY, itemSchema, MAX_DESCRIBED_OPTIONS } from './controls.js';
12
+ import { effectKind } from './effect.js';
13
+ import { isNarrowing, validateValue } from './json-schema.js';
14
+ import { isRoutePath, LOCATION_OBSERVATION_ID, NAVIGATION_SURFACE_ID, } from './manifest.js';
15
+ import { PROBLEMS_OBSERVATION_ID } from './room.js';
16
+ /** The id of a page or shared surface's observation of what it shows. */
17
+ export const PAGE_STATE_OBSERVATION_ID = 'state';
18
+ export { createDeclaredJobTracker } from './jobs.js';
19
+ /** How often a started job's outcome is read: a lookup, not a request. */
20
+ export const JOB_POLL_INTERVAL_MS = 1_000;
21
+ /** How long a job may take before its action is reported as not finished. */
22
+ export const DEFAULT_JOB_TIMEOUT_MS = 300_000;
23
+ /**
24
+ * How long a control disabled by its own press is reported busy before it is
25
+ * treated as simply unavailable: long enough for a save or a request, short
26
+ * enough that a control that stays disabled does not stay offered.
27
+ */
28
+ export const BUSY_AFTER_PRESS_MS = 60_000;
29
+ /** Keep the runtime's surfaces equal to what the manifest declares and the page has mounted. Returns a disconnect. */
30
+ export function connectBindings({ registry, runtime, manifest, onDefect, jobs, navigation, }) {
31
+ const navigationSurface = navigation
32
+ ? manifest.surfaces.find(s => s.id === NAVIGATION_SURFACE_ID && s.kind === 'navigation')
33
+ : undefined;
34
+ const byBinding = new Map();
35
+ const roomSurfaces = new Map();
36
+ for (const surface of manifest.surfaces) {
37
+ if (surface.kind === 'room')
38
+ roomSurfaces.set(surface.id.replace(/^room:/, ''), surface);
39
+ for (const action of surface.actions) {
40
+ if (action.source === 'control')
41
+ byBinding.set(action.id, { surface, action });
42
+ }
43
+ }
44
+ const reported = new Set();
45
+ const report = (defect) => {
46
+ const key = JSON.stringify(defect);
47
+ if (reported.has(key))
48
+ return;
49
+ reported.add(key);
50
+ onDefect?.(defect);
51
+ };
52
+ const mounted = new Map();
53
+ // Jobs in flight, by job id: the binding that started each, and when to stop
54
+ // offering it if no outcome ever arrives (the runtime has then reported the
55
+ // action as not finished).
56
+ const inFlight = new Map();
57
+ let connected = true;
58
+ const runs = {
59
+ tracker: jobs,
60
+ started: (bindingId, jobId, timeoutMs) => {
61
+ jobs?.track(jobId);
62
+ if (inFlight.has(jobId))
63
+ return;
64
+ const expiry = setTimeout(() => runs.ended(jobId), timeoutMs + JOB_POLL_INTERVAL_MS);
65
+ inFlight.set(jobId, { bindingId, expiry });
66
+ },
67
+ pressed: () => { },
68
+ busy: () => false,
69
+ ended: jobId => {
70
+ const run = inFlight.get(jobId);
71
+ if (!run)
72
+ return;
73
+ clearTimeout(run.expiry);
74
+ inFlight.delete(jobId);
75
+ // After the runtime has settled the action on this outcome.
76
+ queueMicrotask(() => {
77
+ if (connected)
78
+ rebuild();
79
+ });
80
+ },
81
+ };
82
+ const running = (bindingId) => [...inFlight.values()].some(r => r.bindingId === bindingId);
83
+ // Controls a press has disabled for a moment (a Save button while it saves),
84
+ // by binding id. Reported busy and still offered, not removed: the press
85
+ // worked, and the control comes back when the work is done.
86
+ const busyAfterPress = new Map();
87
+ const clearBusy = (bindingId) => {
88
+ const timer = busyAfterPress.get(bindingId);
89
+ if (timer === undefined)
90
+ return;
91
+ clearTimeout(timer);
92
+ busyAfterPress.delete(bindingId);
93
+ };
94
+ runs.pressed = bindingId => {
95
+ clearBusy(bindingId);
96
+ busyAfterPress.set(bindingId, setTimeout(() => {
97
+ busyAfterPress.delete(bindingId);
98
+ if (connected)
99
+ rebuild();
100
+ }, BUSY_AFTER_PRESS_MS));
101
+ };
102
+ runs.busy = bindingId => busyAfterPress.has(bindingId);
103
+ const rebuild = () => {
104
+ const wanted = new Map();
105
+ const want = (surface) => {
106
+ let entry = wanted.get(surface.id);
107
+ if (!entry)
108
+ wanted.set(surface.id, (entry = { surface, actions: [] }));
109
+ return entry;
110
+ };
111
+ // Controls, grouped by binding id in the order they mounted.
112
+ const groups = new Map();
113
+ for (const reg of registry.controls()) {
114
+ if (!byBinding.has(reg.id)) {
115
+ report({ kind: 'unknown-binding', id: reg.id });
116
+ continue;
117
+ }
118
+ const list = groups.get(reg.id) ?? [];
119
+ list.push(reg);
120
+ groups.set(reg.id, list);
121
+ }
122
+ for (const [id, regs] of groups) {
123
+ const { surface, action } = byBinding.get(id);
124
+ const entry = want(surface);
125
+ const usable = regs.filter(r => !r.disabled);
126
+ // Enabled again: whatever its last press started is done.
127
+ if (usable.length > 0)
128
+ clearBusy(id);
129
+ // A disabled control is not offered, unless a job it started is still
130
+ // running (its action must stay offered for the runtime to follow the job),
131
+ // or its own press disabled it for a moment: it is busy, not gone.
132
+ const offered = usable.length > 0 ? usable : running(id) || runs.busy(id) ? regs : [];
133
+ if (offered.length === 0)
134
+ continue;
135
+ entry.actions.push(controlAction(action, offered, () => registry.controls().filter(r => r.id === id), report, runs));
136
+ }
137
+ // A busy control that left the page is simply gone.
138
+ for (const id of [...busyAfterPress.keys()])
139
+ if (!groups.has(id))
140
+ clearBusy(id);
141
+ // Going to a page by its address: offered whenever the app gives its router.
142
+ if (navigationSurface && navigation) {
143
+ const entry = want(navigationSurface);
144
+ for (const action of navigationSurface.actions) {
145
+ entry.actions.push(navigateAction(action, navigationSurface.routes, navigation));
146
+ }
147
+ }
148
+ // Rooms.
149
+ for (const { registration } of registry.rooms()) {
150
+ const surface = roomSurfaces.get(registration.catalog.room);
151
+ if (!surface) {
152
+ report({ kind: 'unknown-room', room: registration.catalog.room });
153
+ continue;
154
+ }
155
+ const entry = want(surface);
156
+ for (const action of surface.actions) {
157
+ const def = roomAction(action, registration, runs);
158
+ if (def)
159
+ entry.actions.push(def);
160
+ }
161
+ }
162
+ for (const [id, { surface, actions }] of wanted) {
163
+ const fingerprint = JSON.stringify(actions.map(a => [a.id, a.input, a.async ?? false]));
164
+ const current = mounted.get(id);
165
+ if (current && current.fingerprint === fingerprint)
166
+ continue;
167
+ const defined = defineSurface({
168
+ id: surface.id,
169
+ name: surface.title,
170
+ description: surface.description,
171
+ actions,
172
+ observations: surface.observations.map(o => ({
173
+ id: o.id,
174
+ description: o.description,
175
+ schema: o.schema,
176
+ })),
177
+ });
178
+ const handle = runtime.mount(defined, () => null);
179
+ current?.handle.unmount();
180
+ mounted.set(id, { fingerprint, handle, surface });
181
+ }
182
+ for (const [id, current] of mounted) {
183
+ if (!wanted.has(id)) {
184
+ current.handle.unmount();
185
+ mounted.delete(id);
186
+ }
187
+ }
188
+ pushObservations();
189
+ };
190
+ const pushObservations = () => {
191
+ const controls = registry.controls();
192
+ const problems = Object.values(registry.problems()).flat();
193
+ const rooms = registry.rooms();
194
+ const carriesProblems = (surface) => surface.observations.some(o => o.id === PROBLEMS_OBSERVATION_ID);
195
+ // A page reports its problems with its own surface. When no page surface is
196
+ // mounted to carry them (a route an access guard refused, a page that failed
197
+ // before any of its controls mounted), the navigation surface does: it is
198
+ // always there, so a problem that stops the page is never unseen.
199
+ const pageCarries = [...mounted.values()].some(({ surface }) => surface.kind === 'page' && carriesProblems(surface));
200
+ for (const { handle, surface } of mounted.values()) {
201
+ if (surface.kind === 'room') {
202
+ const room = rooms.find(r => `room:${r.registration.catalog.room}` === surface.id);
203
+ if (!room)
204
+ continue;
205
+ for (const o of surface.observations) {
206
+ if (o.id === PROBLEMS_OBSERVATION_ID)
207
+ handle.pushObservation(o.id, room.problems);
208
+ else if (o.id in room.observations)
209
+ handle.pushObservation(o.id, room.observations[o.id]);
210
+ }
211
+ continue;
212
+ }
213
+ if (surface.kind === 'navigation') {
214
+ if (navigation)
215
+ handle.pushObservation(LOCATION_OBSERVATION_ID, { path: navigation.location() });
216
+ if (carriesProblems(surface))
217
+ handle.pushObservation(PROBLEMS_OBSERVATION_ID, pageCarries ? [] : problems);
218
+ continue;
219
+ }
220
+ const mine = controls.filter(c => byBinding.get(c.id)?.surface.id === surface.id);
221
+ // What the page shows but is not a control: reported with the page, where the person reads it.
222
+ const facts = surface.kind === 'page' ? registry.facts() : [];
223
+ handle.pushObservation(PAGE_STATE_OBSERVATION_ID, {
224
+ ...pageState(mine, runs.busy),
225
+ ...(facts.length ? { shown: facts } : {}),
226
+ });
227
+ if (surface.kind === 'page' && surface.observations.some(o => o.id === PROBLEMS_OBSERVATION_ID)) {
228
+ handle.pushObservation(PROBLEMS_OBSERVATION_ID, problems);
229
+ }
230
+ }
231
+ };
232
+ const unsubscribe = registry.subscribe(change => (change === 'structure' ? rebuild() : pushObservations()));
233
+ const unsubscribeLocation = navigationSurface && navigation ? navigation.subscribe(() => pushObservations()) : null;
234
+ rebuild();
235
+ return () => {
236
+ connected = false;
237
+ unsubscribe();
238
+ unsubscribeLocation?.();
239
+ for (const { expiry } of inFlight.values())
240
+ clearTimeout(expiry);
241
+ inFlight.clear();
242
+ for (const timer of busyAfterPress.values())
243
+ clearTimeout(timer);
244
+ busyAfterPress.clear();
245
+ for (const { handle } of mounted.values())
246
+ handle.unmount();
247
+ mounted.clear();
248
+ };
249
+ }
250
+ /**
251
+ * A row's schema as the page state shows it: an enum longer than
252
+ * `MAX_DESCRIBED_OPTIONS` keeps that many values, and the row's current value
253
+ * if it is not among them, and says how many it leaves out. A language picker's
254
+ * hundreds of options would otherwise fill the page state the assistant reads.
255
+ * The row's tool still takes, and validates against, every value.
256
+ */
257
+ export function summarisedSchema(schema, value) {
258
+ const values = schema.enum;
259
+ if (!values || values.length <= MAX_DESCRIBED_OPTIONS)
260
+ return schema;
261
+ const kept = values.slice(0, MAX_DESCRIBED_OPTIONS);
262
+ const current = values.find(v => v === value);
263
+ const shown = current !== undefined && !kept.includes(current) ? [...kept, current] : kept;
264
+ return { ...schema, enum: shown, 'x-enum-omitted': values.length - shown.length };
265
+ }
266
+ /**
267
+ * What a page surface shows: each field's value, each list's rows, what cannot
268
+ * be used right now, and what is busy with its last press (a Save button while
269
+ * it saves: it worked, and it comes back when done). A row that takes a value
270
+ * carries its own schema and value, so rows whose meanings are only known at
271
+ * run time (a model's parameters) are readable without their definitions in the
272
+ * build.
273
+ */
274
+ export function pageState(controls, isBusy = () => false) {
275
+ const values = {};
276
+ const lists = {};
277
+ const unavailable = [];
278
+ const busy = [];
279
+ for (const c of controls) {
280
+ if (c.item) {
281
+ (lists[c.id] ??= []).push({
282
+ key: c.item.key,
283
+ title: c.item.title,
284
+ ...(c.item.description ? { description: c.item.description } : {}),
285
+ ...(c.valueSchema ? { schema: summarisedSchema(c.valueSchema, c.value) } : {}),
286
+ ...(c.value !== undefined ? { value: c.value } : {}),
287
+ });
288
+ }
289
+ else if (c.value !== undefined) {
290
+ values[c.id] = c.value;
291
+ }
292
+ if (c.disabled && !c.item)
293
+ (isBusy(c.id) ? busy : unavailable).push(c.id);
294
+ }
295
+ return { values, lists, unavailable, ...(busy.length ? { busy } : {}) };
296
+ }
297
+ function controlAction(action, regs, current, report, runs) {
298
+ const job = settlement(action);
299
+ const timeoutMs = job?.timeoutMs ?? DEFAULT_JOB_TIMEOUT_MS;
300
+ const declaredValue = action.input.properties?.value ?? null;
301
+ // Each row's live schema must narrow the declared one. The tool offers the
302
+ // rows' common schema; when rows differ (one chip group per category, each
303
+ // with its own options) it offers the declared one, and each row is
304
+ // validated against its own when the action runs.
305
+ const liveSchemas = regs.map(r => r.valueSchema);
306
+ for (const live of liveSchemas) {
307
+ if (declaredValue && live && !isNarrowing(live, declaredValue))
308
+ report({ kind: 'widened-schema', id: action.id });
309
+ }
310
+ const shared = liveSchemas.every(l => JSON.stringify(l) === JSON.stringify(liveSchemas[0]));
311
+ const toolValue = declaredValue && shared && liveSchemas[0] && isNarrowing(liveSchemas[0], declaredValue)
312
+ ? liveSchemas[0]
313
+ : declaredValue;
314
+ const rowValue = (reg) => declaredValue && reg.valueSchema && isNarrowing(reg.valueSchema, declaredValue)
315
+ ? reg.valueSchema
316
+ : declaredValue;
317
+ const items = action.itemized ? regs.filter(r => r.item).map(r => r.item) : undefined;
318
+ const input = action.control
319
+ ? {
320
+ ...deriveInputSchema(action.control, {}, { itemized: action.itemized, items }),
321
+ properties: {
322
+ ...(toolValue ? { value: toolValue } : {}),
323
+ ...(action.itemized ? { [ITEM_PROPERTY]: itemSchema(items) } : {}),
324
+ },
325
+ }
326
+ : action.input;
327
+ return {
328
+ id: action.name,
329
+ description: action.description,
330
+ input: input,
331
+ ...declared(action),
332
+ confirm: action.destructive || action.confirm || undefined,
333
+ ...settlingDefinition(job, timeoutMs, runs),
334
+ handler: async (params) => {
335
+ // Read the registrations when the action runs: the row may have scrolled
336
+ // away or the control unmounted since the tools were offered.
337
+ const now = current();
338
+ if (now.length === 0) {
339
+ return fail('NOT_ON_SCREEN', `"${action.title}" is no longer on the page; read the page state for what it offers now`);
340
+ }
341
+ const reg = pickRegistration(action, params, now);
342
+ if ('error' in reg)
343
+ return reg.error;
344
+ if (reg.registration.disabled) {
345
+ return runs.busy(action.id)
346
+ ? fail('BUSY', `"${reg.registration.title}" is still busy with its last use; it is offered again when that is done`)
347
+ : fail('UNAVAILABLE', `"${reg.registration.title}" cannot be used right now`);
348
+ }
349
+ const valueSchema = rowValue(reg.registration);
350
+ if (valueSchema) {
351
+ const problem = validateValue(valueSchema, params.value);
352
+ if (problem)
353
+ return fail('INVALID_VALUE', `${reg.registration.title}: ${problem}`);
354
+ }
355
+ const result = await reg.registration.run({ value: params.value });
356
+ // A press that started a job is followed through the job; any other that
357
+ // disables its control leaves it busy, not gone.
358
+ if (result.ok && !(job && result.pending))
359
+ runs.pressed(action.id);
360
+ return job ? settlingResult(action.id, result, timeoutMs, runs) : toHandlerResult(result);
361
+ },
362
+ };
363
+ }
364
+ /**
365
+ * How an action whose work outlives the call settles, when it declares so:
366
+ * a `job`, and a `transaction` (modelled on it, ADR-0226 §2.6).
367
+ */
368
+ function settlement(action) {
369
+ const effect = action.effect;
370
+ return effect && typeof effect === 'object' && (effect.kind === 'job' || effect.kind === 'transaction')
371
+ ? effect
372
+ : null;
373
+ }
374
+ /** An action that settles on its job's outcome is asynchronous, polled until the outcome arrives. */
375
+ function settlingDefinition(job, timeoutMs, runs) {
376
+ if (!job)
377
+ return {};
378
+ return {
379
+ async: true,
380
+ ...(job.estimatedDuration ? { estimatedDuration: job.estimatedDuration } : {}),
381
+ polling: jobPolling(timeoutMs, runs),
382
+ };
383
+ }
384
+ /** Started, not done: the runtime settles the action on the job's outcome. */
385
+ function settlingResult(actionId, result, timeoutMs, runs) {
386
+ if (!result.ok)
387
+ return toHandlerResult(result);
388
+ // Tracked now, not at the first poll, so an outcome that arrives first is kept.
389
+ if (result.pending && runs.tracker)
390
+ runs.started(actionId, result.pending.jobId, timeoutMs);
391
+ return { success: true, data: { status: 'started', ...(result.pending ? { jobId: result.pending.jobId } : {}) } };
392
+ }
393
+ /**
394
+ * What the action is called and what it does, as the browser and the agent
395
+ * runtime read them: a `transaction`, and a destructive write, run only on the
396
+ * person's approval of the exact request, which OUI's runtime checks before
397
+ * any handler here runs (ADR-0228).
398
+ */
399
+ function declared(action) {
400
+ return { title: action.title, ...(action.effect ? { effect: effectKind(action.effect) } : {}) };
401
+ }
402
+ /**
403
+ * The runtime's polling for a job: done when the job's outcome arrives, as the
404
+ * outcome says; still running until then; and, past `timeoutMs`, reported by
405
+ * the runtime as not finished (a failure, never a success).
406
+ */
407
+ function jobPolling(timeoutMs, runs) {
408
+ const jobs = runs.tracker;
409
+ return {
410
+ intervalMs: JOB_POLL_INTERVAL_MS,
411
+ maxDurationMs: timeoutMs,
412
+ resolve: async (dispatchResult) => {
413
+ const jobId = dispatchResult?.jobId;
414
+ if (typeof jobId !== 'string' || !jobId || !jobs) {
415
+ return {
416
+ done: true,
417
+ data: {
418
+ status: 'unverified',
419
+ message: 'The work was started, but its completion cannot be observed from the page (no job id to follow), ' +
420
+ 'so it is not known to be done. Check what the page shows before saying it is.',
421
+ },
422
+ };
423
+ }
424
+ jobs.track(jobId);
425
+ const outcome = jobs.outcome(jobId);
426
+ if (!outcome)
427
+ return { done: false, data: { status: 'running', jobId } };
428
+ jobs.forget(jobId);
429
+ runs.ended(jobId);
430
+ return { done: true, data: outcome };
431
+ },
432
+ };
433
+ }
434
+ function pickRegistration(action, params, regs) {
435
+ if (!action.itemized)
436
+ return { registration: regs[regs.length - 1] };
437
+ const ref = typeof params[ITEM_PROPERTY] === 'string' ? params[ITEM_PROPERTY] : '';
438
+ const byKey = regs.find(r => r.item?.key === ref);
439
+ if (byKey)
440
+ return { registration: byKey };
441
+ const byTitle = regs.filter(r => r.item && r.item.title.toLowerCase() === ref.trim().toLowerCase());
442
+ if (byTitle.length === 1)
443
+ return { registration: byTitle[0] };
444
+ const shown = regs
445
+ .slice(0, 30)
446
+ .map(r => `"${r.item?.title}" (${r.item?.key})`)
447
+ .join(', ');
448
+ return {
449
+ error: fail(byTitle.length > 1 ? 'AMBIGUOUS_ITEM' : 'ITEM_NOT_FOUND', byTitle.length > 1
450
+ ? `Several rows are called "${ref}"; give the id instead: ${shown}`
451
+ : `No row "${ref}" is on screen for ${action.title}. On screen: ${shown}`),
452
+ };
453
+ }
454
+ function roomAction(action, registration, runs) {
455
+ if (action.source !== 'room-action')
456
+ return null;
457
+ const entryId = action.id.split('/').pop();
458
+ const entry = registration.catalog.actions.find(a => a.id === entryId);
459
+ if (!entry)
460
+ return null;
461
+ const job = settlement(action);
462
+ const timeoutMs = job?.timeoutMs ?? DEFAULT_JOB_TIMEOUT_MS;
463
+ return {
464
+ id: action.name,
465
+ description: action.description,
466
+ input: action.input,
467
+ ...declared(action),
468
+ confirm: entry.destructive || undefined,
469
+ ...settlingDefinition(job, timeoutMs, runs),
470
+ handler: async (params) => {
471
+ try {
472
+ const result = await registration.run(entry.id, params);
473
+ return job ? settlingResult(action.id, result, timeoutMs, runs) : toHandlerResult(result);
474
+ }
475
+ catch (err) {
476
+ return fail('FAILED', err instanceof Error ? err.message : String(err));
477
+ }
478
+ },
479
+ };
480
+ }
481
+ /**
482
+ * Going to a page: the path must be one of the build's routes, with an id in
483
+ * place of each `:param`, so an invented address is refused rather than
484
+ * landing on the router's fallback.
485
+ */
486
+ function navigateAction(action, routes, navigation) {
487
+ return {
488
+ id: action.name,
489
+ description: action.description,
490
+ input: action.input,
491
+ ...declared(action),
492
+ handler: async (params) => {
493
+ const path = typeof params.path === 'string' ? params.path.trim() : '';
494
+ if (!path.startsWith('/'))
495
+ return fail('INVALID_PATH', 'A page’s address starts with /');
496
+ if (!isRoutePath(routes, path)) {
497
+ return fail('UNKNOWN_ROUTE', `${path} is not a page of this app: the pages are ${routes.join(', ')}`);
498
+ }
499
+ navigation.navigate(path);
500
+ return { success: true, data: { navigatedTo: path } };
501
+ },
502
+ };
503
+ }
504
+ function fail(code, message) {
505
+ return { success: false, error: { code, message } };
506
+ }
507
+ function toHandlerResult(result) {
508
+ if (!result.ok)
509
+ return fail(result.code, result.message);
510
+ // Work that outlives the call is started, not done: say so, so it is never reported finished.
511
+ const data = result.pending ? { ...result.data, status: 'started', jobId: result.pending.jobId } : result.data;
512
+ return { success: true, ...(data ? { data } : {}) };
513
+ }
514
+ //# sourceMappingURL=oui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oui.js","sourceRoot":"","sources":["../src/oui.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,aAAa,GAKd,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACpG,OAAO,EAAE,UAAU,EAAyB,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAmB,MAAM,kBAAkB,CAAC;AAC/E,OAAO,EACL,WAAW,EACX,uBAAuB,EACvB,qBAAqB,GAItB,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,uBAAuB,EAAmB,MAAM,WAAW,CAAC;AAErE,yEAAyE;AACzE,MAAM,CAAC,MAAM,yBAAyB,GAAG,OAAO,CAAC;AAiDjD,OAAO,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AAGrD,0EAA0E;AAC1E,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,CAAC;AAC1C,6EAA6E;AAC7E,MAAM,CAAC,MAAM,sBAAsB,GAAG,OAAO,CAAC;AAmB9C;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAE1C,sHAAsH;AACtH,MAAM,UAAU,eAAe,CAAC,EAC9B,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,IAAI,EACJ,UAAU,GACa;IACvB,MAAM,iBAAiB,GAAG,UAAU;QAClC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,qBAAqB,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC;QACxF,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,SAAS,GAAG,IAAI,GAAG,EAAgE,CAAC;IAC1F,MAAM,YAAY,GAAG,IAAI,GAAG,EAA2B,CAAC;IACxD,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACxC,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM;YAAE,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;QACzF,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACrC,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;gBAAE,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,MAAM,MAAM,GAAG,CAAC,MAAqB,EAAE,EAAE;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACnC,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO;QAC9B,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClB,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,IAAI,GAAG,EAGpB,CAAC;IAEJ,6EAA6E;IAC7E,4EAA4E;IAC5E,2BAA2B;IAC3B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAwE,CAAC;IACjG,IAAI,SAAS,GAAG,IAAI,CAAC;IACrB,MAAM,IAAI,GAAY;QACpB,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;YACvC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YACnB,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;gBAAE,OAAO;YAChC,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,SAAS,GAAG,oBAAoB,CAAC,CAAC;YACrF,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC;QACjB,IAAI,EAAE,GAAG,EAAE,CAAC,KAAK;QACjB,KAAK,EAAE,KAAK,CAAC,EAAE;YACb,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAChC,IAAI,CAAC,GAAG;gBAAE,OAAO;YACjB,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACzB,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvB,4DAA4D;YAC5D,cAAc,CAAC,GAAG,EAAE;gBAClB,IAAI,SAAS;oBAAE,OAAO,EAAE,CAAC;YAC3B,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;IACF,MAAM,OAAO,GAAG,CAAC,SAAiB,EAAE,EAAE,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;IAEnG,6EAA6E;IAC7E,yEAAyE;IACzE,4DAA4D;IAC5D,MAAM,cAAc,GAAG,IAAI,GAAG,EAAyC,CAAC;IACxE,MAAM,SAAS,GAAG,CAAC,SAAiB,EAAE,EAAE;QACtC,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC5C,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO;QAChC,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC,CAAC;IACF,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,EAAE;QACzB,SAAS,CAAC,SAAS,CAAC,CAAC;QACrB,cAAc,CAAC,GAAG,CAChB,SAAS,EACT,UAAU,CAAC,GAAG,EAAE;YACd,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACjC,IAAI,SAAS;gBAAE,OAAO,EAAE,CAAC;QAC3B,CAAC,EAAE,mBAAmB,CAAC,CACxB,CAAC;IACJ,CAAC,CAAC;IACF,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAEvD,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,MAAM,MAAM,GAAG,IAAI,GAAG,EAA2E,CAAC;QAClG,MAAM,IAAI,GAAG,CAAC,OAAwB,EAAE,EAAE;YACxC,IAAI,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACnC,IAAI,CAAC,KAAK;gBAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,KAAK,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;YACvE,OAAO,KAAK,CAAC;QACf,CAAC,CAAC;QAEF,6DAA6D;QAC7D,MAAM,MAAM,GAAG,IAAI,GAAG,EAAiC,CAAC;QACxD,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC;YACtC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gBAC3B,MAAM,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;gBAChD,SAAS;YACX,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;YACtC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACf,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC3B,CAAC;QACD,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,MAAM,EAAE,CAAC;YAChC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC;YAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YAC7C,0DAA0D;YAC1D,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;gBAAE,SAAS,CAAC,EAAE,CAAC,CAAC;YACrC,sEAAsE;YACtE,4EAA4E;YAC5E,mEAAmE;YACnE,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YACtF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YACnC,KAAK,CAAC,OAAO,CAAC,IAAI,CAChB,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CACjG,CAAC;QACJ,CAAC;QAED,oDAAoD;QACpD,KAAK,MAAM,EAAE,IAAI,CAAC,GAAG,cAAc,CAAC,IAAI,EAAE,CAAC;YAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAE,SAAS,CAAC,EAAE,CAAC,CAAC;QAEhF,6EAA6E;QAC7E,IAAI,iBAAiB,IAAI,UAAU,EAAE,CAAC;YACpC,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACtC,KAAK,MAAM,MAAM,IAAI,iBAAiB,CAAC,OAAO,EAAE,CAAC;gBAC/C,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,iBAAiB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;YACnF,CAAC;QACH,CAAC;QAED,SAAS;QACT,KAAK,MAAM,EAAE,YAAY,EAAE,IAAI,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC;YAChD,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC5D,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;gBAClE,SAAS;YACX,CAAC;YACD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5B,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACrC,MAAM,GAAG,GAAG,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;gBACnD,IAAI,GAAG;oBAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;QAED,KAAK,MAAM,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,IAAI,MAAM,EAAE,CAAC;YAChD,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;YACxF,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChC,IAAI,OAAO,IAAI,OAAO,CAAC,WAAW,KAAK,WAAW;gBAAE,SAAS;YAC7D,MAAM,OAAO,GAAG,aAAa,CAAO;gBAClC,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,IAAI,EAAE,OAAO,CAAC,KAAK;gBACnB,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,OAAO;gBACP,YAAY,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBAC3C,EAAE,EAAE,CAAC,CAAC,EAAE;oBACR,WAAW,EAAE,CAAC,CAAC,WAAW;oBAC1B,MAAM,EAAE,CAAC,CAAC,MAAe;iBAC1B,CAAC,CAAC;aACJ,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;YAClD,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;QACpD,CAAC;QACD,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,OAAO,EAAE,CAAC;YACpC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gBACpB,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACzB,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;QACD,gBAAgB,EAAE,CAAC;IACrB,CAAC,CAAC;IAEF,MAAM,gBAAgB,GAAG,GAAG,EAAE;QAC5B,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3D,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;QAC/B,MAAM,eAAe,GAAG,CAAC,OAAwB,EAAE,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,uBAAuB,CAAC,CAAC;QACvH,4EAA4E;QAC5E,6EAA6E;QAC7E,0EAA0E;QAC1E,kEAAkE;QAClE,MAAM,WAAW,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;QACrH,KAAK,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YACnD,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC5B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,OAAO,CAAC,EAAE,CAAC,CAAC;gBACnF,IAAI,CAAC,IAAI;oBAAE,SAAS;gBACpB,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;oBACrC,IAAI,CAAC,CAAC,EAAE,KAAK,uBAAuB;wBAAE,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;yBAC7E,IAAI,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,YAAY;wBAAE,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC5F,CAAC;gBACD,SAAS;YACX,CAAC;YACD,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAClC,IAAI,UAAU;oBAAE,MAAM,CAAC,eAAe,CAAC,uBAAuB,EAAE,EAAE,IAAI,EAAE,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBACjG,IAAI,eAAe,CAAC,OAAO,CAAC;oBAAE,MAAM,CAAC,eAAe,CAAC,uBAAuB,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;gBAC3G,SAAS;YACX,CAAC;YACD,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,CAAC,CAAC;YAClF,+FAA+F;YAC/F,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9D,MAAM,CAAC,eAAe,CAAC,yBAAyB,EAAE;gBAChD,GAAG,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC;gBAC7B,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC1C,CAAC,CAAC;YACH,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,uBAAuB,CAAC,EAAE,CAAC;gBAChG,MAAM,CAAC,eAAe,CAAC,uBAAuB,EAAE,QAAQ,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;IAC5G,MAAM,mBAAmB,GAAG,iBAAiB,IAAI,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACpH,OAAO,EAAE,CAAC;IAEV,OAAO,GAAG,EAAE;QACV,SAAS,GAAG,KAAK,CAAC;QAClB,WAAW,EAAE,CAAC;QACd,mBAAmB,EAAE,EAAE,CAAC;QACxB,KAAK,MAAM,EAAE,MAAM,EAAE,IAAI,QAAQ,CAAC,MAAM,EAAE;YAAE,YAAY,CAAC,MAAM,CAAC,CAAC;QACjE,QAAQ,CAAC,KAAK,EAAE,CAAC;QACjB,KAAK,MAAM,KAAK,IAAI,cAAc,CAAC,MAAM,EAAE;YAAE,YAAY,CAAC,KAAK,CAAC,CAAC;QACjE,cAAc,CAAC,KAAK,EAAE,CAAC;QACvB,KAAK,MAAM,EAAE,MAAM,EAAE,IAAI,OAAO,CAAC,MAAM,EAAE;YAAE,MAAM,CAAC,OAAO,EAAE,CAAC;QAC5D,OAAO,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC,CAAC;AACJ,CAAC;AAcD;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAkB,EAAE,KAAe;IAClE,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC;IAC3B,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,qBAAqB;QAAE,OAAO,MAAM,CAAC;IACrE,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,qBAAqB,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,OAAO,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3F,OAAO,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;AACpF,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,SAAS,CAAC,QAAwC,EAAE,SAAyC,GAAG,EAAE,CAAC,KAAK;IACtH,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,MAAM,KAAK,GAAmC,EAAE,CAAC;IACjD,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;YACX,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC;gBACxB,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG;gBACf,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK;gBACnB,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClE,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC9E,GAAG,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACrD,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACjC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;QACzB,CAAC;QACD,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,IAAI;YAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AAC1E,CAAC;AAED,SAAS,aAAa,CACpB,MAAsB,EACtB,IAAoC,EACpC,OAA6C,EAC7C,MAAkC,EAClC,IAAa;IAEb,MAAM,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IAC/B,MAAM,SAAS,GAAG,GAAG,EAAE,SAAS,IAAI,sBAAsB,CAAC;IAC3D,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,IAAI,IAAI,CAAC;IAC7D,2EAA2E;IAC3E,2EAA2E;IAC3E,oEAAoE;IACpE,kDAAkD;IAClD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IACjD,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,IAAI,aAAa,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,aAAa,CAAC;YAC5D,MAAM,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;IACtD,CAAC;IACD,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5F,MAAM,SAAS,GACb,aAAa,IAAI,MAAM,IAAI,WAAW,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC;QACrF,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;QAChB,CAAC,CAAC,aAAa,CAAC;IACpB,MAAM,QAAQ,GAAG,CAAC,GAAwB,EAAqB,EAAE,CAC/D,aAAa,IAAI,GAAG,CAAC,WAAW,IAAI,WAAW,CAAC,GAAG,CAAC,WAAW,EAAE,aAAa,CAAC;QAC7E,CAAC,CAAC,GAAG,CAAC,WAAW;QACjB,CAAC,CAAC,aAAa,CAAC;IACpB,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACvF,MAAM,KAAK,GAAe,MAAM,CAAC,OAAO;QACtC,CAAC,CAAC;YACE,GAAG,iBAAiB,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC;YAC9E,UAAU,EAAE;gBACV,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1C,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACnE;SACF;QACH,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;IAEjB,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,IAAI;QACf,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,KAAK,EAAE,KAAc;QACrB,GAAG,QAAQ,CAAC,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,OAAO,IAAI,SAAS;QAC1D,GAAG,kBAAkB,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC;QAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,EAAgC,EAAE;YACtD,yEAAyE;YACzE,8DAA8D;YAC9D,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;YACtB,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACrB,OAAO,IAAI,CACT,eAAe,EACf,IAAI,MAAM,CAAC,KAAK,wEAAwE,CACzF,CAAC;YACJ,CAAC;YACD,MAAM,GAAG,GAAG,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;YAClD,IAAI,OAAO,IAAI,GAAG;gBAAE,OAAO,GAAG,CAAC,KAAK,CAAC;YACrC,IAAI,GAAG,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;gBAC9B,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;oBACzB,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,CAAC,YAAY,CAAC,KAAK,0EAA0E,CAAC;oBACpH,CAAC,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,GAAG,CAAC,YAAY,CAAC,KAAK,4BAA4B,CAAC,CAAC;YAClF,CAAC;YACD,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YAC/C,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,OAAO,GAAG,aAAa,CAAC,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;gBACzD,IAAI,OAAO;oBAAE,OAAO,IAAI,CAAC,eAAe,EAAE,GAAG,GAAG,CAAC,YAAY,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC,CAAC;YACrF,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YACnE,yEAAyE;YACzE,iDAAiD;YACjD,IAAI,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC;gBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACnE,OAAO,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC5F,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,UAAU,CAAC,MAAsB;IACxC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC7B,OAAO,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,KAAK,IAAI,MAAM,CAAC,IAAI,KAAK,aAAa,CAAC;QACrG,CAAC,CAAC,MAAM;QACR,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAED,qGAAqG;AACrG,SAAS,kBAAkB,CACzB,GAA0C,EAC1C,SAAiB,EACjB,IAAa;IAEb,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,OAAO;QACL,KAAK,EAAE,IAAI;QACX,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,GAAG,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9E,OAAO,EAAE,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC;KACrC,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,SAAS,cAAc,CAAC,QAAgB,EAAE,MAAkB,EAAE,SAAiB,EAAE,IAAa;IAC5F,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC;IAC/C,gFAAgF;IAChF,IAAI,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO;QAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAC5F,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;AACpH,CAAC;AAED;;;;;GAKG;AACH,SAAS,QAAQ,CAAC,MAAsB;IACtC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AAClG,CAAC;AAED;;;;GAIG;AACH,SAAS,UAAU,CAAC,SAAiB,EAAE,IAAa;IAClD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC;IAC1B,OAAO;QACL,UAAU,EAAE,oBAAoB;QAChC,aAAa,EAAE,SAAS;QACxB,OAAO,EAAE,KAAK,EAAC,cAAc,EAAC,EAAE;YAC9B,MAAM,KAAK,GAAI,cAAyD,EAAE,KAAK,CAAC;YAChF,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;gBACjD,OAAO;oBACL,IAAI,EAAE,IAAI;oBACV,IAAI,EAAE;wBACJ,MAAM,EAAE,YAAY;wBACpB,OAAO,EACL,mGAAmG;4BACnG,+EAA+E;qBAClF;iBACF,CAAC;YACJ,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAClB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACpC,IAAI,CAAC,OAAO;gBAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC;YACzE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACnB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAClB,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QACvC,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CACvB,MAAsB,EACtB,MAA+B,EAC/B,IAAoC;IAEpC,IAAI,CAAC,MAAM,CAAC,QAAQ;QAAE,OAAO,EAAE,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;IACrE,MAAM,GAAG,GAAG,OAAO,MAAM,CAAC,aAAa,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAE,MAAM,CAAC,aAAa,CAAY,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/F,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,KAAK,GAAG,CAAC,CAAC;IAClD,IAAI,KAAK;QAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;IAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IACpG,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9D,MAAM,KAAK,GAAG,IAAI;SACf,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;SACZ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,MAAM,CAAC,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC;SAC/C,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,OAAO;QACL,KAAK,EAAE,IAAI,CACT,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,gBAAgB,EACxD,OAAO,CAAC,MAAM,GAAG,CAAC;YAChB,CAAC,CAAC,4BAA4B,GAAG,2BAA2B,KAAK,EAAE;YACnE,CAAC,CAAC,WAAW,GAAG,sBAAsB,MAAM,CAAC,KAAK,gBAAgB,KAAK,EAAE,CAC5E;KACF,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CACjB,MAAsB,EACtB,YAA8B,EAC9B,IAAa;IAEb,IAAI,MAAM,CAAC,MAAM,KAAK,aAAa;QAAE,OAAO,IAAI,CAAC;IACjD,MAAM,OAAO,GAAG,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAG,CAAC;IAC5C,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;IACvE,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IAC/B,MAAM,SAAS,GAAG,GAAG,EAAE,SAAS,IAAI,sBAAsB,CAAC;IAC3D,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,IAAI;QACf,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,KAAK,EAAE,MAAM,CAAC,KAAc;QAC5B,GAAG,QAAQ,CAAC,MAAM,CAAC;QACnB,OAAO,EAAE,KAAK,CAAC,WAAW,IAAI,SAAS;QACvC,GAAG,kBAAkB,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC;QAC3C,OAAO,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;YACtB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;gBACxD,OAAO,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;YAC5F,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,IAAI,CAAC,QAAQ,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,cAAc,CACrB,MAAsB,EACtB,MAAyB,EACzB,UAAyB;IAEzB,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,IAAI;QACf,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,KAAK,EAAE,MAAM,CAAC,KAAc;QAC5B,GAAG,QAAQ,CAAC,MAAM,CAAC;QACnB,OAAO,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;YACtB,MAAM,IAAI,GAAG,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAC,cAAc,EAAE,gCAAgC,CAAC,CAAC;YACzF,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC;gBAC/B,OAAO,IAAI,CAAC,eAAe,EAAE,GAAG,IAAI,6CAA6C,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACxG,CAAC;YACD,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC1B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC;QACxD,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,IAAI,CAAC,IAAY,EAAE,OAAe;IACzC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC;AACtD,CAAC;AAED,SAAS,eAAe,CAAC,MAAkB;IACzC,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACzD,8FAA8F;IAC9F,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;IAC/G,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AACtD,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Where a package declares its control table and its room catalog: under the
3
+ * neutral `oui` key of its `package.json` (ADR-0226 §2.2 rule 4), or, during
4
+ * the transition, under `closure`. The generator and the conformance kit both
5
+ * read declarations through this, so they agree on which key wins.
6
+ */
7
+ /** A declaration a package makes for the generator. */
8
+ export type AgentDeclarationKey = 'agentControls' | 'agentCatalog';
9
+ /** The keys read, the neutral one first. `closure` is read during the transition only. */
10
+ export declare const AGENT_DECLARATION_SCOPES: readonly ["oui", "closure"];
11
+ export interface AgentDeclaration {
12
+ /** The declared value, when there is one. */
13
+ value?: unknown;
14
+ /** Where it was found: `oui.agentControls` or `closure.agentControls`; empty when nowhere. */
15
+ source: string;
16
+ /** Why the declaration cannot be read: a package declaring both keys. */
17
+ error?: string;
18
+ }
19
+ /**
20
+ * A package's `oui.<key>`, or its `closure.<key>`. Declaring both is an error:
21
+ * which one is read would otherwise be a guess.
22
+ */
23
+ export declare function agentDeclaration(pkg: string, packageJson: Readonly<Record<string, unknown>>, key: AgentDeclarationKey): AgentDeclaration;
24
+ //# sourceMappingURL=package-declaration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-declaration.d.ts","sourceRoot":"","sources":["../src/package-declaration.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,uDAAuD;AACvD,MAAM,MAAM,mBAAmB,GAAG,eAAe,GAAG,cAAc,CAAC;AAEnE,0FAA0F;AAC1F,eAAO,MAAM,wBAAwB,6BAA8B,CAAC;AAEpE,MAAM,WAAW,gBAAgB;IAC/B,6CAA6C;IAC7C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,8FAA8F;IAC9F,MAAM,EAAE,MAAM,CAAC;IACf,yEAAyE;IACzE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,mBAAmB,GAAG,gBAAgB,CAQxI"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Where a package declares its control table and its room catalog: under the
3
+ * neutral `oui` key of its `package.json` (ADR-0226 §2.2 rule 4), or, during
4
+ * the transition, under `closure`. The generator and the conformance kit both
5
+ * read declarations through this, so they agree on which key wins.
6
+ */
7
+ /** The keys read, the neutral one first. `closure` is read during the transition only. */
8
+ export const AGENT_DECLARATION_SCOPES = ['oui', 'closure'];
9
+ /**
10
+ * A package's `oui.<key>`, or its `closure.<key>`. Declaring both is an error:
11
+ * which one is read would otherwise be a guess.
12
+ */
13
+ export function agentDeclaration(pkg, packageJson, key) {
14
+ const oui = packageJson.oui?.[key];
15
+ const closure = packageJson.closure?.[key];
16
+ if (oui !== undefined && closure !== undefined)
17
+ return { source: '', error: `"${pkg}" declares both "oui.${key}" and "closure.${key}": keep "oui"` };
18
+ if (oui !== undefined)
19
+ return { value: oui, source: `oui.${key}` };
20
+ if (closure !== undefined)
21
+ return { value: closure, source: `closure.${key}` };
22
+ return { source: '' };
23
+ }
24
+ //# sourceMappingURL=package-declaration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-declaration.js","sourceRoot":"","sources":["../src/package-declaration.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,0FAA0F;AAC1F,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,KAAK,EAAE,SAAS,CAAU,CAAC;AAWpE;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAW,EAAE,WAA8C,EAAE,GAAwB;IACpH,MAAM,GAAG,GAAI,WAAW,CAAC,GAA2C,EAAE,CAAC,GAAG,CAAC,CAAC;IAC5E,MAAM,OAAO,GAAI,WAAW,CAAC,OAA+C,EAAE,CAAC,GAAG,CAAC,CAAC;IACpF,IAAI,GAAG,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS;QAC5C,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,GAAG,wBAAwB,GAAG,kBAAkB,GAAG,eAAe,EAAE,CAAC;IACvG,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,GAAG,EAAE,EAAE,CAAC;IACnE,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,GAAG,EAAE,EAAE,CAAC;IAC/E,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AACxB,CAAC"}