@ouispec/cli 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 (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +112 -0
  3. package/dist/analyze.d.ts +282 -0
  4. package/dist/analyze.d.ts.map +1 -0
  5. package/dist/analyze.js +1421 -0
  6. package/dist/analyze.js.map +1 -0
  7. package/dist/assemble.d.ts +50 -0
  8. package/dist/assemble.d.ts.map +1 -0
  9. package/dist/assemble.js +555 -0
  10. package/dist/assemble.js.map +1 -0
  11. package/dist/cli.d.ts +12 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +54 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/config.d.ts +54 -0
  16. package/dist/config.d.ts.map +1 -0
  17. package/dist/config.js +126 -0
  18. package/dist/config.js.map +1 -0
  19. package/dist/contract.d.ts +10 -0
  20. package/dist/contract.d.ts.map +1 -0
  21. package/dist/contract.js +15 -0
  22. package/dist/contract.js.map +1 -0
  23. package/dist/generate.d.ts +49 -0
  24. package/dist/generate.d.ts.map +1 -0
  25. package/dist/generate.js +178 -0
  26. package/dist/generate.js.map +1 -0
  27. package/dist/index.d.ts +9 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +8 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/inputs.d.ts +134 -0
  32. package/dist/inputs.d.ts.map +1 -0
  33. package/dist/inputs.js +705 -0
  34. package/dist/inputs.js.map +1 -0
  35. package/dist/knowledge.d.ts +19 -0
  36. package/dist/knowledge.d.ts.map +1 -0
  37. package/dist/knowledge.js +366 -0
  38. package/dist/knowledge.js.map +1 -0
  39. package/dist/program.d.ts +60 -0
  40. package/dist/program.d.ts.map +1 -0
  41. package/dist/program.js +302 -0
  42. package/dist/program.js.map +1 -0
  43. package/dist/recipes.d.ts +17 -0
  44. package/dist/recipes.d.ts.map +1 -0
  45. package/dist/recipes.js +48 -0
  46. package/dist/recipes.js.map +1 -0
  47. package/dist/tier2.d.ts +74 -0
  48. package/dist/tier2.d.ts.map +1 -0
  49. package/dist/tier2.js +303 -0
  50. package/dist/tier2.js.map +1 -0
  51. package/package.json +62 -0
@@ -0,0 +1,555 @@
1
+ /**
2
+ * The build's surfaces (ADR-0220 §2.4): one per page, one per component shared
3
+ * between pages, one per room, each with its actions, their reach paths and
4
+ * the page's observations — validated as it is put together.
5
+ */
6
+ import { bindingIdProblem, controlVerb, deriveInputSchema, effectProblem, LOCATION_OBSERVATION_ID, MAX_TOOL_NAME_LENGTH, NAVIGATE_ACTION_ID, NAVIGATION_SURFACE_ID, PROBLEMS_OBSERVATION_ID, PROBLEMS_SCHEMA, problemsSchema, ROOM_RUN_COMMAND_ID, ROOM_SET_PROPERTIES_ID, routeMatcher, toolInputProblems, toolName, } from '@ouispec/bindings';
7
+ import { navigateTargets, } from './analyze.js';
8
+ import { humanizeId } from './program.js';
9
+ import { recipeProblems, roomToolName } from './recipes.js';
10
+ const PAGE_STATE_SCHEMA = {
11
+ type: 'object',
12
+ properties: {
13
+ values: { type: 'object', description: "Each field's current value, by binding id" },
14
+ lists: {
15
+ type: 'object',
16
+ description: 'The rows each list-row control is showing, by binding id: their ids (keys) and titles',
17
+ },
18
+ unavailable: {
19
+ type: 'array',
20
+ items: { type: 'string' },
21
+ description: 'Controls that cannot be used right now',
22
+ },
23
+ shown: {
24
+ type: 'array',
25
+ description: 'What the page shows that is not a control, by display: its binding id, heading and facts, each as text by its label',
26
+ },
27
+ },
28
+ };
29
+ export function assemble(pages, nav, api, allRoutes, unboundAllowed) {
30
+ const errors = [];
31
+ const navFor = (route) => nav.find(n => n.route === route);
32
+ // Each binding site, and the pages it is on.
33
+ const sites = new Map();
34
+ const reachOnPage = new Map();
35
+ for (const page of pages) {
36
+ for (const c of page.analysis?.controls ?? []) {
37
+ const entry = sites.get(c.site) ?? { control: c, pages: new Set() };
38
+ entry.pages.add(page.component);
39
+ sites.set(c.site, entry);
40
+ const byPage = reachOnPage.get(c.site) ?? new Map();
41
+ if (!byPage.has(page.component))
42
+ byPage.set(page.component, c.reach);
43
+ reachOnPage.set(c.site, byPage);
44
+ }
45
+ }
46
+ // Binding ids are unique across the build, displays' too.
47
+ const byId = new Map();
48
+ for (const [site, { control }] of sites)
49
+ byId.set(control.binding.id, [...(byId.get(control.binding.id) ?? []), site]);
50
+ const displaySites = new Map();
51
+ for (const page of pages)
52
+ for (const d of page.analysis?.displays ?? [])
53
+ displaySites.set(d.site, d.binding.id);
54
+ for (const [site, id] of displaySites)
55
+ byId.set(id, [...(byId.get(id) ?? []), site]);
56
+ for (const [id, where] of byId) {
57
+ if (where.length > 1) {
58
+ const [file, line] = where[0].split(':');
59
+ errors.push({
60
+ file,
61
+ line: Number(line) || 0,
62
+ message: `Binding id "${id}" is declared in ${where.length} places: ${where.join(', ')}`,
63
+ });
64
+ }
65
+ }
66
+ const routesOf = (component) => pages.find(p => p.component === component)?.routes.map(r => r.path) ?? [];
67
+ const pageTitle = (page) => {
68
+ const fromNav = page.routes.map(r => navFor(r.path)?.label).find(Boolean);
69
+ return fromNav ?? page.analysis?.header.title ?? words(page.component);
70
+ };
71
+ // Surfaces of controls.
72
+ const controlSurfaces = new Map();
73
+ const dialogBindings = new Set();
74
+ const tabBindings = new Set();
75
+ for (const page of pages) {
76
+ for (const d of page.analysis?.dialogs ?? [])
77
+ if (d.binding)
78
+ dialogBindings.add(d.binding);
79
+ for (const c of page.analysis?.controls ?? [])
80
+ if (c.kind === 'tabs')
81
+ tabBindings.add(c.binding.id);
82
+ }
83
+ const sortedSites = [...sites.entries()].sort(([a], [b]) => a.localeCompare(b));
84
+ for (const [, { control, pages: on }] of sortedSites) {
85
+ const shared = on.size > 1;
86
+ const firstPage = pages.find(p => on.has(p.component));
87
+ const own = firstPage.frame ? 'shell' : 'page';
88
+ const surfaceId = shared ? `shared:${control.component}` : `${own}:${firstPage.component}`;
89
+ const surface = controlSurfaces.get(surfaceId) ?? {
90
+ kind: shared ? 'shared' : own,
91
+ title: shared ? words(control.component) : pageTitle(firstPage),
92
+ routes: new Set(),
93
+ actions: [],
94
+ };
95
+ for (const p of on)
96
+ routesOf(p).forEach(r => surface.routes.add(r));
97
+ const action = controlAction(control, firstPage, pageTitle(firstPage), navFor, api, allRoutes, dialogBindings, tabBindings, errors);
98
+ if (action)
99
+ surface.actions.push(action);
100
+ controlSurfaces.set(surfaceId, surface);
101
+ }
102
+ // Unbound controls, where bindings are enforced; and the allowance may only shrink.
103
+ for (const page of pages) {
104
+ const unbound = page.analysis?.unbound ?? [];
105
+ if (unboundAllowed.has(page.component)) {
106
+ if (unbound.length === 0 && page.analysis) {
107
+ errors.push({
108
+ file: 'oui.config.json',
109
+ line: 0,
110
+ message: `${page.component} has every control bound: remove it from "unbound"`,
111
+ });
112
+ }
113
+ continue;
114
+ }
115
+ for (const u of unbound)
116
+ errors.push({ ...u, message: `${u.message} (on ${page.component}, whose bindings are enforced)` });
117
+ }
118
+ for (const page of pages) {
119
+ for (const e of page.analysis?.errors ?? [])
120
+ errors.push(e);
121
+ if (!page.analysis) {
122
+ errors.push({
123
+ file: 'routes',
124
+ line: 0,
125
+ message: `Could not find the component ${page.component} renders for ${page.routes.map(r => r.path).join(', ')}`,
126
+ });
127
+ }
128
+ }
129
+ const uniqueErrors = dedupe(errors);
130
+ // Surfaces, in a stable order.
131
+ const surfaces = [];
132
+ const metas = [];
133
+ const frames = [];
134
+ for (const page of [...pages].sort((a, b) => a.component.localeCompare(b.component))) {
135
+ const kind = page.frame ? 'shell' : 'page';
136
+ const id = `${kind}:${page.component}`;
137
+ const found = controlSurfaces.get(id);
138
+ const description = pageDescription(page, pageTitle(page));
139
+ const observations = [
140
+ { id: 'state', description: stateDescription(found?.actions ?? []), schema: PAGE_STATE_SCHEMA },
141
+ { id: PROBLEMS_OBSERVATION_ID, description: PROBLEMS_SCHEMA.description, schema: PROBLEMS_SCHEMA },
142
+ ];
143
+ surfaces.push({
144
+ id,
145
+ kind,
146
+ title: pageTitle(page),
147
+ description,
148
+ routes: page.routes.map(r => r.path),
149
+ actions: sortActions(found?.actions ?? []),
150
+ observations,
151
+ });
152
+ const navEntry = page.routes.map(r => navFor(r.path)).find(Boolean);
153
+ (page.frame ? frames : metas).push({
154
+ surface: id,
155
+ component: page.component,
156
+ routes: page.routes.map(r => r.path),
157
+ title: pageTitle(page),
158
+ description,
159
+ nav: navEntry ? [navEntry.group, navEntry.label].filter(Boolean).join(' › ') : null,
160
+ rooms: [...(page.analysis?.rooms ?? [])].map(r => `room:${r.catalog.room}`).sort(),
161
+ shown: (page.analysis?.displays ?? [])
162
+ .map(d => ({
163
+ id: d.binding.id,
164
+ title: d.title || humanizeId(d.binding.id),
165
+ description: d.binding.description,
166
+ labels: d.labels,
167
+ reach: d.reach.map(cleanStep),
168
+ }))
169
+ .sort((a, b) => a.id.localeCompare(b.id)),
170
+ shared: [...controlSurfaces.entries()]
171
+ .filter(([sid, s]) => s.kind === 'shared' && page.routes.some(r => s.routes.has(r.path)) && sid !== id)
172
+ .map(([sid]) => sid)
173
+ .sort(),
174
+ sharedReach: Object.fromEntries([...sites.values()]
175
+ .filter(({ pages: on }) => on.size > 1 && on.has(page.component))
176
+ .map(({ control }) => {
177
+ const own = reachOnPage.get(control.site)?.get(page.component) ?? control.reach;
178
+ const route = page.routes[0]?.path ?? '';
179
+ const navEntry = navFor(route);
180
+ const routeStep = {
181
+ kind: 'route',
182
+ path: route,
183
+ title: pageTitle(page),
184
+ ...(navEntry ? { nav: [navEntry.group, navEntry.label].filter(Boolean).join(' › ') } : {}),
185
+ };
186
+ return [toolName(control.binding.id), [routeStep, ...own.map(cleanStep)]];
187
+ })
188
+ .sort(([a], [b]) => a.localeCompare(b))),
189
+ });
190
+ }
191
+ for (const [id, s] of [...controlSurfaces.entries()].sort(([a], [b]) => a.localeCompare(b))) {
192
+ if (s.kind !== 'shared')
193
+ continue;
194
+ surfaces.push({
195
+ id,
196
+ kind: 'shared',
197
+ title: s.title,
198
+ description: `${s.title}, on ${[...s.routes].sort().join(', ')}.`,
199
+ routes: [...s.routes].sort(),
200
+ actions: sortActions(s.actions),
201
+ observations: [{ id: 'state', description: stateDescription(s.actions), schema: PAGE_STATE_SCHEMA }],
202
+ });
203
+ }
204
+ // Rooms.
205
+ const rooms = new Map();
206
+ for (const page of pages) {
207
+ for (const room of page.analysis?.rooms ?? []) {
208
+ const entry = rooms.get(room.catalog.room) ?? { catalog: room, routes: new Set() };
209
+ page.routes.forEach(r => entry.routes.add(r.path));
210
+ rooms.set(room.catalog.room, entry);
211
+ }
212
+ }
213
+ for (const [, { catalog, routes }] of [...rooms.entries()].sort(([a], [b]) => a.localeCompare(b))) {
214
+ surfaces.push(roomSurface(catalog.catalog, [...routes].sort(), api.operations));
215
+ uniqueErrors.push(...catalogProblems(catalog, { api, allRoutes }));
216
+ }
217
+ // Going to a page by its address, from the routes themselves.
218
+ surfaces.push(navigationSurface(pages
219
+ .filter(p => !p.frame)
220
+ .flatMap(p => p.routes.map(r => ({ path: r.path, title: pageTitle(p) })))
221
+ .sort((a, b) => a.path.localeCompare(b.path))));
222
+ // Tool names are unique across the build.
223
+ const names = new Map();
224
+ for (const s of surfaces) {
225
+ for (const a of s.actions) {
226
+ const other = names.get(a.name);
227
+ if (other)
228
+ uniqueErrors.push({
229
+ file: a.declaredIn ?? s.id,
230
+ line: 0,
231
+ message: `Tool name "${a.name}" is used by ${other} and ${a.id}`,
232
+ });
233
+ names.set(a.name, a.id);
234
+ }
235
+ }
236
+ // Every tool's input is one object schema, whatever declared it: a page's
237
+ // binding, a room's catalog, an app's catalog or a generated action. One that
238
+ // is not makes the provider refuse every turn the surface is offered in.
239
+ for (const s of surfaces) {
240
+ for (const a of s.actions) {
241
+ for (const problem of toolInputProblems(a.input)) {
242
+ uniqueErrors.push({ file: a.declaredIn ?? s.id, line: 0, message: `${a.id} (tool ${a.name}): ${problem}` });
243
+ }
244
+ }
245
+ }
246
+ return { surfaces, pages: metas, frames, errors: uniqueErrors };
247
+ }
248
+ /**
249
+ * The surface that goes to any page by its address: one action whose path
250
+ * lists every route with its page's title, and the page the person is on.
251
+ * Generated from the routes, so a page added is a page the PA can go to.
252
+ */
253
+ function navigationSurface(routes) {
254
+ const listed = routes.map(r => `${r.path} (${r.title})`).join(', ');
255
+ return {
256
+ id: NAVIGATION_SURFACE_ID,
257
+ kind: 'navigation',
258
+ title: 'Pages',
259
+ description: 'Every page of the app, by its address, and the page the person is on.',
260
+ routes: routes.map(r => r.path),
261
+ actions: [
262
+ {
263
+ name: toolName(NAVIGATE_ACTION_ID),
264
+ id: NAVIGATE_ACTION_ID,
265
+ source: 'navigation',
266
+ title: 'Go to a page',
267
+ description: 'Go to a page of the app, as following a link to it does. The page’s own tools are offered once it is open.',
268
+ input: {
269
+ type: 'object',
270
+ properties: {
271
+ path: {
272
+ type: 'string',
273
+ description: `The page’s address, with an id in place of each :parameter. The pages: ${listed}.`,
274
+ },
275
+ },
276
+ required: ['path'],
277
+ additionalProperties: false,
278
+ },
279
+ reach: [],
280
+ },
281
+ ],
282
+ observations: [
283
+ {
284
+ id: LOCATION_OBSERVATION_ID,
285
+ description: 'The address of the page the person is on.',
286
+ schema: { type: 'object', properties: { path: { type: 'string' } } },
287
+ },
288
+ {
289
+ id: PROBLEMS_OBSERVATION_ID,
290
+ description: 'What stops the page at this address from opening for the person: access it needs that they do not have, a load that failed. Reported here when the page itself is not open to report it; empty otherwise.',
291
+ schema: PROBLEMS_SCHEMA,
292
+ },
293
+ ],
294
+ };
295
+ }
296
+ function controlAction(c, page, pageTitle, navFor, api, allRoutes, dialogBindings, tabBindings, errors) {
297
+ const at = { file: c.declaredIn, line: c.line };
298
+ const idProblem = bindingIdProblem(c.binding.id);
299
+ if (idProblem) {
300
+ errors.push({ ...at, message: idProblem });
301
+ return null;
302
+ }
303
+ let effect = c.binding.effect;
304
+ if (!effect) {
305
+ const targets = navigateTargets(c.callbacks.map(cb => cb.expr));
306
+ if (targets.length === 1)
307
+ effect = { kind: 'navigate', to: targets[0] };
308
+ }
309
+ for (const problem of effectProblems(effect, { api, allRoutes, containers: new Set([...dialogBindings, ...tabBindings]) }))
310
+ errors.push({ ...at, message: `"${c.binding.id}"${joined(problem)}` });
311
+ const route = page.routes[0]?.path ?? '';
312
+ const navEntry = navFor(route);
313
+ const reach = [
314
+ {
315
+ kind: 'route',
316
+ path: route,
317
+ title: pageTitle,
318
+ ...(navEntry ? { nav: [navEntry.group, navEntry.label].filter(Boolean).join(' › ') } : {}),
319
+ },
320
+ ...c.reach.map(cleanStep),
321
+ ];
322
+ const input = deriveInputSchema(c.kind, c.schemaProps, { itemized: c.itemized });
323
+ return {
324
+ name: toolName(c.binding.id),
325
+ id: c.binding.id,
326
+ source: 'control',
327
+ control: c.kind,
328
+ title: c.title || humanizeId(c.binding.id),
329
+ description: toolDescription(c, effect, reach, api.operations),
330
+ input,
331
+ ...(effect ? { effect } : {}),
332
+ ...(c.binding.destructive ? { destructive: true } : {}),
333
+ ...(c.binding.confirm ? { confirm: true } : {}),
334
+ ...(c.itemized ? { itemized: true } : {}),
335
+ reach,
336
+ declaredIn: c.declaredIn,
337
+ };
338
+ }
339
+ /** A problem after what it is about: `: <shape problem>`, or ` <what it names>`. */
340
+ const joined = (problem) => (problem.startsWith(':') ? problem : ` ${problem}`);
341
+ /**
342
+ * What is wrong with a declared effect: its shape (a problem starting `:`),
343
+ * then what it names that the app does not have.
344
+ */
345
+ function effectProblems(effect, app) {
346
+ if (effect === undefined)
347
+ return [];
348
+ const shape = effectProblem(effect);
349
+ if (shape)
350
+ return [`: ${shape}`];
351
+ if (typeof effect !== 'object')
352
+ return [];
353
+ const problems = [];
354
+ if (effect.kind === 'navigate' && !app.allRoutes.some(r => routeMatcher(r.path).test(effect.to) || r.path === effect.to))
355
+ problems.push(`navigates to ${effect.to}, which is not a route`);
356
+ if (effect.kind === 'open' && app.containers && !app.containers.has(effect.container))
357
+ problems.push(`opens ${effect.container}, which is no bound dialog or tab set`);
358
+ const operation = effect.kind === 'mutate' || effect.kind === 'transaction' ? effect.operation : undefined;
359
+ if (operation !== undefined) {
360
+ if (app.api.spec === null)
361
+ problems.push(`saves through API operation ${operation}, but oui.config.json declares no API ("apiSpec": null)`);
362
+ else if (app.api.readable && !app.api.operations.has(operation))
363
+ problems.push(`names API operation ${operation}, which ${app.api.spec} does not have`);
364
+ }
365
+ return problems;
366
+ }
367
+ /**
368
+ * What an effect adds to a tool's description: where it goes, that the call
369
+ * returns before the work is done, what it saves through, that it is
370
+ * irreversible. Effects that only change the page itself add nothing.
371
+ */
372
+ function effectSentences(effect, api) {
373
+ if (!effect || typeof effect !== 'object')
374
+ return [];
375
+ const through = (operation) => {
376
+ const op = api.get(operation);
377
+ return `${operation}${op ? ` (${op.method} ${op.url}${op.summary ? `: ${op.summary}` : ''})` : ''}`;
378
+ };
379
+ switch (effect.kind) {
380
+ case 'navigate':
381
+ return [`It goes to ${effect.to}.`];
382
+ case 'job':
383
+ return [
384
+ `It starts a job${effect.estimatedDuration ? ` that takes about ${effect.estimatedDuration}` : ''}: ` +
385
+ 'the call returns once the job has started, and the job is done only when its status says complete.',
386
+ ];
387
+ case 'mutate':
388
+ return [`It saves through ${through(effect.operation)}.`];
389
+ case 'transaction':
390
+ return [
391
+ `It is irreversible: it runs only on the person’s approval of this exact call${effect.operation ? `, through ${through(effect.operation)}` : ''}.`,
392
+ ];
393
+ default:
394
+ return [];
395
+ }
396
+ }
397
+ function cleanStep(step) {
398
+ if (step.kind === 'panel')
399
+ return { kind: 'panel', title: step.title, openedBy: [...step.openedBy] };
400
+ if (step.kind !== 'dialog')
401
+ return step;
402
+ return {
403
+ kind: 'dialog',
404
+ title: step.title,
405
+ openedBy: [...step.openedBy],
406
+ ...('binding' in step && step.binding ? { binding: step.binding } : {}),
407
+ };
408
+ }
409
+ function toolDescription(c, effect, reach, api) {
410
+ // Each part is a sentence, so what follows the binding's own description starts a new one.
411
+ const parts = [sentence(`${controlVerb(c.kind)} "${c.title || humanizeId(c.binding.id)}": ${c.binding.description}`)];
412
+ if (c.hint && !c.binding.description.includes(c.hint))
413
+ parts.push(`The field's hint: ${sentence(c.hint)}`);
414
+ if (c.placeholder)
415
+ parts.push(`Its placeholder, an example of what goes in it: "${c.placeholder}".`);
416
+ if (c.itemized)
417
+ parts.push('It is one per row: say which row with `item`.');
418
+ const where = reach.slice(1).map(describeStep).filter(Boolean);
419
+ if (where.length)
420
+ parts.push(`It is ${where.join(', ')}.`);
421
+ parts.push(...effectSentences(effect, api));
422
+ return parts.join(' ');
423
+ }
424
+ /** A text as a sentence: it ends with a full stop unless it already ends a sentence. */
425
+ function sentence(text) {
426
+ return /[.!?…"”)]$/.test(text) ? text : `${text}.`;
427
+ }
428
+ export function describeStep(step) {
429
+ switch (step.kind) {
430
+ case 'route':
431
+ return `on ${step.title} (${step.path})`;
432
+ case 'tab':
433
+ return `on the "${step.title}" tab (select it with ${toolName(step.binding)})`;
434
+ case 'dialog':
435
+ return `in the "${step.title}" dialog${step.openedBy.length ? ` (open it with ${step.openedBy.map(toolName).join(' or ')})` : ''}`;
436
+ case 'menu':
437
+ return `in the ${step.title} menu`;
438
+ case 'panel':
439
+ return `in the ${step.title}${step.openedBy.length ? ` (it shows after ${step.openedBy.map(toolName).join(' or ')})` : ''}`;
440
+ case 'room':
441
+ return step.where;
442
+ }
443
+ }
444
+ function stateDescription(actions) {
445
+ const values = actions.filter(a => !a.itemized && a.control && a.control !== 'button' && a.control !== 'dialog');
446
+ const lists = [...new Set(actions.filter(a => a.itemized).map(a => a.id))];
447
+ const parts = ['What the page shows now.'];
448
+ if (values.length)
449
+ parts.push(`values: ${values.map(a => `${a.id} (${a.title})`).join(', ')}.`);
450
+ if (lists.length)
451
+ parts.push(`lists: the rows on screen for ${lists.join(', ')}, as { key, title }; pass a key or title as \`item\`.`);
452
+ return parts.join(' ');
453
+ }
454
+ function pageDescription(page, title) {
455
+ const subtitles = page.analysis?.header.subtitles ?? [];
456
+ if (subtitles.length)
457
+ return subtitles.join(' ');
458
+ if (page.frame) {
459
+ const where = page.routes.map(r => r.path);
460
+ return `${title}: the app's frame, around ${where.includes('*') ? 'every page' : `the pages at ${where.join(', ')}`}. Its controls are there whatever page is open.`;
461
+ }
462
+ return `The ${title} page (${page.routes.map(r => r.path).join(', ')}).`;
463
+ }
464
+ function sortActions(actions) {
465
+ return [...actions].sort((a, b) => a.name.localeCompare(b.name));
466
+ }
467
+ function dedupe(findings) {
468
+ const seen = new Set();
469
+ return findings.filter(f => {
470
+ const key = `${f.file}:${f.line}:${f.message}`;
471
+ if (seen.has(key))
472
+ return false;
473
+ seen.add(key);
474
+ return true;
475
+ });
476
+ }
477
+ /** `VoicesPage` → `Voices Page`. */
478
+ export function words(name) {
479
+ return (name
480
+ .replace(/([a-z0-9])([A-Z])/g, '$1 $2')
481
+ .replace(/\bPage$/, '')
482
+ .trim() || name);
483
+ }
484
+ // ─── Rooms ───────────────────────────────────────────────────────────────────
485
+ export function roomSurface(catalog, routes, api = new Map()) {
486
+ const where = (control, selection) => ({
487
+ kind: 'room',
488
+ room: catalog.room,
489
+ where: control,
490
+ ...(selection ? { selection } : {}),
491
+ });
492
+ const actions = catalog.actions.map(a => ({
493
+ name: roomToolName(catalog.room, a.id),
494
+ id: `${catalog.room}/action/${a.id}`,
495
+ source: 'room-action',
496
+ title: a.title,
497
+ description: [`${a.title}: ${a.description} (${a.control})`, ...effectSentences(a.effect, api)].join(' '),
498
+ input: a.input,
499
+ effect: a.effect,
500
+ ...(a.destructive ? { destructive: true } : {}),
501
+ reach: [where(a.control)],
502
+ }));
503
+ const observations = catalog.observations.map(o => ({ ...o }));
504
+ if (!observations.some(o => o.id === PROBLEMS_OBSERVATION_ID)) {
505
+ // In the room's own vocabulary when it declares its kinds of problem.
506
+ const schema = problemsSchema(catalog.problems);
507
+ observations.push({ id: PROBLEMS_OBSERVATION_ID, description: schema.description, schema });
508
+ }
509
+ return {
510
+ id: `room:${catalog.room}`,
511
+ kind: 'room',
512
+ title: catalog.title,
513
+ description: catalog.description,
514
+ routes,
515
+ actions: [...actions].sort((a, b) => a.name.localeCompare(b.name)),
516
+ observations,
517
+ };
518
+ }
519
+ /**
520
+ * What a room's catalog must declare for its fields and commands to be
521
+ * reachable, and what its entries' effects and recipes name that the app or
522
+ * the room does not have.
523
+ */
524
+ function catalogProblems({ package: pkg, catalog }, app) {
525
+ const out = [];
526
+ for (const a of catalog.actions) {
527
+ for (const problem of effectProblems(a.effect, app))
528
+ out.push({ file: pkg, line: 0, message: `${catalog.room} action ${a.id}${joined(problem)}` });
529
+ }
530
+ for (const message of recipeProblems(catalog))
531
+ out.push({ file: pkg, line: 0, message });
532
+ const ids = new Set(catalog.actions.map(a => a.id));
533
+ if (catalog.fields.length && !ids.has(ROOM_SET_PROPERTIES_ID)) {
534
+ out.push({
535
+ file: pkg,
536
+ line: 0,
537
+ message: `${catalog.room} declares fields but no "${ROOM_SET_PROPERTIES_ID}" action to set them`,
538
+ });
539
+ }
540
+ if (catalog.commands.some(c => c.status === 'available') && !ids.has(ROOM_RUN_COMMAND_ID)) {
541
+ out.push({
542
+ file: pkg,
543
+ line: 0,
544
+ message: `${catalog.room} declares commands but no "${ROOM_RUN_COMMAND_ID}" action to run them`,
545
+ });
546
+ }
547
+ for (const a of catalog.actions) {
548
+ const name = roomToolName(catalog.room, a.id);
549
+ if (name.length > MAX_TOOL_NAME_LENGTH) {
550
+ out.push({ file: pkg, line: 0, message: `${catalog.room} action ${a.id}: its tool name ${name} is longer than ${MAX_TOOL_NAME_LENGTH}` });
551
+ }
552
+ }
553
+ return out;
554
+ }
555
+ //# sourceMappingURL=assemble.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assemble.js","sourceRoot":"","sources":["../src/assemble.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * oui (also installed as closure-oui) — the assistant's surfaces and knowledge,
4
+ * generated from the UI's code (ADR-0220, ADR-0226).
5
+ *
6
+ * oui generate write <out>/oui-manifest.json and oui-knowledge.json
7
+ * oui generate --check fail if they are stale, or if any declaration is invalid (CI)
8
+ *
9
+ * Options: --config <path> (default ./oui.config.json)
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG"}