@aglyn/aglyn 1.0.0-beta.230 → 1.0.0-beta.232

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 (150) hide show
  1. package/package.json +11 -11
  2. package/src/lib/app-utils/account-acquisition.d.ts +15 -2
  3. package/src/lib/app-utils/account-acquisition.js +20 -1
  4. package/src/lib/app-utils/account-acquisition.js.map +1 -1
  5. package/src/lib/app-utils/artifact-list-queries.d.ts +35 -0
  6. package/src/lib/app-utils/artifact-list-queries.js +203 -0
  7. package/src/lib/app-utils/artifact-list-queries.js.map +1 -0
  8. package/src/lib/app-utils/business-profile.d.ts +171 -0
  9. package/src/lib/app-utils/business-profile.js +277 -0
  10. package/src/lib/app-utils/business-profile.js.map +1 -0
  11. package/src/lib/app-utils/child-contract.d.ts +4 -1
  12. package/src/lib/app-utils/child-contract.js +5 -2
  13. package/src/lib/app-utils/child-contract.js.map +1 -1
  14. package/src/lib/app-utils/console-routes.d.ts +5 -0
  15. package/src/lib/app-utils/console-routes.js +1 -0
  16. package/src/lib/app-utils/console-routes.js.map +1 -1
  17. package/src/lib/app-utils/content-schema-type.d.ts +9 -0
  18. package/src/lib/app-utils/content-schema-type.js +4 -0
  19. package/src/lib/app-utils/content-schema-type.js.map +1 -1
  20. package/src/lib/app-utils/crm.d.ts +14 -1
  21. package/src/lib/app-utils/crm.js +19 -2
  22. package/src/lib/app-utils/crm.js.map +1 -1
  23. package/src/lib/app-utils/docs-help.generated.d.ts +119 -5
  24. package/src/lib/app-utils/docs-help.generated.js +290 -2
  25. package/src/lib/app-utils/docs-help.generated.js.map +1 -1
  26. package/src/lib/app-utils/docs-index.generated.js +697 -32
  27. package/src/lib/app-utils/docs-index.generated.js.map +1 -1
  28. package/src/lib/app-utils/entry-list-declaration.d.ts +33 -0
  29. package/src/lib/app-utils/entry-list-declaration.js +172 -0
  30. package/src/lib/app-utils/entry-list-declaration.js.map +1 -0
  31. package/src/lib/app-utils/first-version-seed.d.ts +19 -0
  32. package/src/lib/app-utils/first-version-seed.js +53 -0
  33. package/src/lib/app-utils/first-version-seed.js.map +1 -0
  34. package/src/lib/app-utils/host-status.d.ts +85 -0
  35. package/src/lib/app-utils/host-status.js +115 -0
  36. package/src/lib/app-utils/host-status.js.map +1 -0
  37. package/src/lib/app-utils/local-business.d.ts +8 -0
  38. package/src/lib/app-utils/local-business.js +4 -0
  39. package/src/lib/app-utils/local-business.js.map +1 -1
  40. package/src/lib/app-utils/lockdown.js +1 -1
  41. package/src/lib/app-utils/lockdown.js.map +1 -1
  42. package/src/lib/app-utils/media-filter.d.ts +136 -0
  43. package/src/lib/app-utils/media-filter.js +400 -0
  44. package/src/lib/app-utils/media-filter.js.map +1 -0
  45. package/src/lib/app-utils/mobile-push.d.ts +98 -0
  46. package/src/lib/app-utils/mobile-push.js +97 -0
  47. package/src/lib/app-utils/mobile-push.js.map +1 -0
  48. package/src/lib/app-utils/notification-push.d.ts +38 -0
  49. package/src/lib/app-utils/notification-push.js +54 -0
  50. package/src/lib/app-utils/notification-push.js.map +1 -0
  51. package/src/lib/app-utils/notifications.d.ts +7 -0
  52. package/src/lib/app-utils/notifications.js.map +1 -1
  53. package/src/lib/app-utils/organizations.js +5 -2
  54. package/src/lib/app-utils/organizations.js.map +1 -1
  55. package/src/lib/app-utils/page-markdown.js +3 -0
  56. package/src/lib/app-utils/page-markdown.js.map +1 -1
  57. package/src/lib/app-utils/plugin-host-events.generated.d.ts +1 -1
  58. package/src/lib/app-utils/plugin-host-events.generated.js +149 -0
  59. package/src/lib/app-utils/plugin-host-events.generated.js.map +1 -1
  60. package/src/lib/app-utils/plugin-release-flags.generated.d.ts +1 -1
  61. package/src/lib/app-utils/plugin-release-flags.generated.js +7 -0
  62. package/src/lib/app-utils/plugin-release-flags.generated.js.map +1 -1
  63. package/src/lib/app-utils/realm-host-surface.generated.js +3 -0
  64. package/src/lib/app-utils/realm-host-surface.generated.js.map +1 -1
  65. package/src/lib/app-utils/release-flags.js +6 -2
  66. package/src/lib/app-utils/release-flags.js.map +1 -1
  67. package/src/lib/app-utils/scope-tokens.d.ts +16 -1
  68. package/src/lib/app-utils/scope-tokens.js +15 -1
  69. package/src/lib/app-utils/scope-tokens.js.map +1 -1
  70. package/src/lib/app-utils/site-list-query.d.ts +47 -0
  71. package/src/lib/app-utils/site-list-query.js +142 -0
  72. package/src/lib/app-utils/site-list-query.js.map +1 -0
  73. package/src/lib/app-utils/site-wide-outbox.d.ts +95 -0
  74. package/src/lib/app-utils/site-wide-outbox.js +117 -0
  75. package/src/lib/app-utils/site-wide-outbox.js.map +1 -0
  76. package/src/lib/app-utils/transfer-launcher-context.d.ts +6 -0
  77. package/src/lib/app-utils/transfer-launcher-context.js.map +1 -1
  78. package/src/lib/app-utils/upload-inspection.js +7 -0
  79. package/src/lib/app-utils/upload-inspection.js.map +1 -1
  80. package/src/lib/app-utils/webhook-delivery.js +4 -1
  81. package/src/lib/app-utils/webhook-delivery.js.map +1 -1
  82. package/src/lib/foundation/definitions/org-billing.types.d.ts +8 -0
  83. package/src/lib/foundation/definitions/org-billing.types.js.map +1 -1
  84. package/src/lib/foundation/definitions/organization.types.d.ts +18 -7
  85. package/src/lib/foundation/definitions/organization.types.js.map +1 -1
  86. package/src/lib/foundation/definitions/write-deny-coverage.util.d.ts +4 -1
  87. package/src/lib/foundation/definitions/write-deny-coverage.util.js +12 -2
  88. package/src/lib/foundation/definitions/write-deny-coverage.util.js.map +1 -1
  89. package/src/lib/plugin-manager/enabled-plugins.js +4 -2
  90. package/src/lib/plugin-manager/enabled-plugins.js.map +1 -1
  91. package/src/lib/plugin-manager/feature-plugins.d.ts +107 -0
  92. package/src/lib/plugin-manager/feature-plugins.js +52 -0
  93. package/src/lib/plugin-manager/feature-plugins.js.map +1 -1
  94. package/src/lib/plugin-manager/first-party-plugins.generated.js +326 -2
  95. package/src/lib/plugin-manager/first-party-plugins.generated.js.map +1 -1
  96. package/src/lib/plugin-manager/plugin-channel-orders.d.ts +262 -0
  97. package/src/lib/plugin-manager/plugin-channel-orders.js +32 -0
  98. package/src/lib/plugin-manager/plugin-channel-orders.js.map +1 -0
  99. package/src/lib/plugin-manager/plugin-checkout-extras.d.ts +168 -0
  100. package/src/lib/plugin-manager/plugin-checkout-extras.js +172 -0
  101. package/src/lib/plugin-manager/plugin-checkout-extras.js.map +1 -0
  102. package/src/lib/plugin-manager/plugin-contributions.d.ts +7 -0
  103. package/src/lib/plugin-manager/plugin-contributions.js +1 -1
  104. package/src/lib/plugin-manager/plugin-contributions.js.map +1 -1
  105. package/src/lib/plugin-manager/plugin-domain-events.d.ts +138 -0
  106. package/src/lib/plugin-manager/plugin-domain-events.js +148 -0
  107. package/src/lib/plugin-manager/plugin-domain-events.js.map +1 -0
  108. package/src/lib/plugin-manager/plugin-events.d.ts +30 -0
  109. package/src/lib/plugin-manager/plugin-events.js +4 -0
  110. package/src/lib/plugin-manager/plugin-events.js.map +1 -1
  111. package/src/lib/plugin-manager/plugin-fulfillment-providers.d.ts +101 -0
  112. package/src/lib/plugin-manager/plugin-fulfillment-providers.js +83 -0
  113. package/src/lib/plugin-manager/plugin-fulfillment-providers.js.map +1 -0
  114. package/src/lib/plugin-manager/plugin-permissions.js +21 -5
  115. package/src/lib/plugin-manager/plugin-permissions.js.map +1 -1
  116. package/src/lib/plugin-manager/plugin-person-records.d.ts +90 -0
  117. package/src/lib/plugin-manager/plugin-person-records.js +26 -0
  118. package/src/lib/plugin-manager/plugin-person-records.js.map +1 -1
  119. package/src/lib/plugin-manager/plugin-product-catalog.d.ts +209 -0
  120. package/src/lib/plugin-manager/plugin-product-catalog.js +43 -0
  121. package/src/lib/plugin-manager/plugin-product-catalog.js.map +1 -0
  122. package/src/lib/plugin-manager/plugin-product-writer.d.ts +166 -0
  123. package/src/lib/plugin-manager/plugin-product-writer.js +31 -0
  124. package/src/lib/plugin-manager/plugin-product-writer.js.map +1 -0
  125. package/src/lib/plugin-manager/plugin-shipment-records.d.ts +210 -0
  126. package/src/lib/plugin-manager/plugin-shipment-records.js +63 -0
  127. package/src/lib/plugin-manager/plugin-shipment-records.js.map +1 -0
  128. package/src/lib/plugin-manager/plugin-shipping-rates.d.ts +151 -0
  129. package/src/lib/plugin-manager/plugin-shipping-rates.js +62 -0
  130. package/src/lib/plugin-manager/plugin-shipping-rates.js.map +1 -0
  131. package/src/lib/plugin-manager/plugin-sms-messaging.d.ts +103 -0
  132. package/src/lib/plugin-manager/plugin-sms-messaging.js +39 -0
  133. package/src/lib/plugin-manager/plugin-sms-messaging.js.map +1 -0
  134. package/src/lib/plugin-manager/plugin-stock-levels.d.ts +81 -0
  135. package/src/lib/plugin-manager/plugin-stock-levels.js +32 -0
  136. package/src/lib/plugin-manager/plugin-stock-levels.js.map +1 -0
  137. package/src/lib/plugin-manager/plugin-tax-profile.d.ts +154 -0
  138. package/src/lib/plugin-manager/plugin-tax-profile.js +56 -0
  139. package/src/lib/plugin-manager/plugin-tax-profile.js.map +1 -1
  140. package/src/lib/plugin-manager/plugin-theme-font-catalog.d.ts +59 -0
  141. package/src/lib/plugin-manager/plugin-theme-font-catalog.js +40 -0
  142. package/src/lib/plugin-manager/plugin-theme-font-catalog.js.map +1 -0
  143. package/src/lib/plugin-manager/plugin-theme-presets.d.ts +40 -0
  144. package/src/lib/plugin-manager/plugin-theme-presets.js +44 -0
  145. package/src/lib/plugin-manager/plugin-theme-presets.js.map +1 -0
  146. package/src/lib/plugin-manager/plugin-tracking-pages.d.ts +55 -0
  147. package/src/lib/plugin-manager/plugin-tracking-pages.js +76 -0
  148. package/src/lib/plugin-manager/plugin-tracking-pages.js.map +1 -0
  149. package/src/lib/plugin-manager/realm-host-aglyn.generated.js +3 -0
  150. package/src/lib/plugin-manager/realm-host-aglyn.generated.js.map +1 -1
@@ -743,6 +743,18 @@ export declare const CONSOLE_WIDGET_SLOTS: {
743
743
  * widget.
744
744
  */
745
745
  readonly hostTheme: "hostTheme";
746
+ /**
747
+ * Inside the theme editor's Typography card (AGL-3656): the control that
748
+ * chooses the site's fonts. Props: {@link ConsoleThemeEditorFontsZoneProps}
749
+ * — the site, the editor's draft, and `updateDraft`, which changes the
750
+ * draft as any of the editor's own controls does.
751
+ *
752
+ * A widget here edits the draft and never writes: the editor's Save keeps
753
+ * the change and Discard drops it, with the preview beside it following
754
+ * every step. With no widget the editor offers its own short list of
755
+ * fonts, so a workspace without a fonts plugin can still choose one.
756
+ */
757
+ readonly themeEditorFonts: "themeEditorFonts";
746
758
  /**
747
759
  * The staff overview, among its platform-wide cards (AGL-3080). No props:
748
760
  * the overview is about the platform, not one org, so a widget here reads
@@ -901,6 +913,15 @@ export declare const CONSOLE_WIDGET_SLOTS: {
901
913
  * them; nothing a widget proposes reaches the published site before that.
902
914
  */
903
915
  readonly hostSeo: "hostSeo";
916
+ /**
917
+ * The host setup Business profile section, under the site's profile and
918
+ * the facts read from its settings (AGL-3661). Props:
919
+ * {@link ConsoleHostBusinessProfileZoneProps}. What a plugin keeps ABOUT the
920
+ * business — the preferences an AI plugin learned from the owner's edits —
921
+ * shown where the owner reads and corrects the profile itself. A widget
922
+ * here writes only its own records.
923
+ */
924
+ readonly hostBusinessProfile: "hostBusinessProfile";
904
925
  /** {@link ConsoleRecordInsightsZoneProps} */
905
926
  readonly recordInsights: "recordInsights";
906
927
  /** {@link ConsoleRecordEmailZoneProps} */
@@ -1020,6 +1041,16 @@ export interface ConsoleHostScreenRowZoneProps {
1020
1041
  /** The page's `kind` as stored. */
1021
1042
  screenKind?: string;
1022
1043
  }
1044
+ /** What the `hostBusinessProfile` zone hands each widget (AGL-3661). */
1045
+ export interface ConsoleHostBusinessProfileZoneProps {
1046
+ hostId: string;
1047
+ /** The org the page names; `undefined` while it resolves. */
1048
+ orgId: string | undefined;
1049
+ /** Path slug for building `/[orgSlug]/…` links. */
1050
+ orgSlug: string;
1051
+ /** The site's subdomain, which is what a console URL names a site by. */
1052
+ host: string | null;
1053
+ }
1023
1054
  /** What the `hostScreens` zone hands each widget (AGL-2907). */
1024
1055
  export interface ConsoleHostScreensZoneProps {
1025
1056
  hostId: string;
@@ -1331,6 +1362,18 @@ export interface ConsoleHostThemeZoneProps {
1331
1362
  */
1332
1363
  proposeDraft: (theme: HostTheme, key: string) => void;
1333
1364
  }
1365
+ /** What the `themeEditorFonts` zone hands each widget (AGL-3656). */
1366
+ export interface ConsoleThemeEditorFontsZoneProps {
1367
+ /** The site whose theme is being edited; `null` on an editor that names none. */
1368
+ hostId: string | null;
1369
+ /** The editor's draft: the saved theme with every unsaved edit on it. */
1370
+ draft: HostTheme;
1371
+ /**
1372
+ * Changes the draft. The updater gets the draft as it is when the change
1373
+ * applies, so two edits in one tick both land.
1374
+ */
1375
+ updateDraft: (updater: (draft: HostTheme) => HostTheme) => void;
1376
+ }
1334
1377
  /**
1335
1378
  * The zones on the STAFF pages (AGL-2939): the staff overview, the staff org
1336
1379
  * page, its detail zone, and the staff user page.
@@ -1763,6 +1806,46 @@ export interface ConsoleStaffPage {
1763
1806
  ownsSubtree?: boolean;
1764
1807
  Component: ComponentType<ConsoleStaffPageProps>;
1765
1808
  }
1809
+ /** What the console's generic public route hands a public page. */
1810
+ export interface ConsolePublicPageProps {
1811
+ /** The plugin that registered the page, the URL's first segment after `/kiosk`. */
1812
+ pluginId: PluginId;
1813
+ /** The page's own path, as it registered it (`/display`). */
1814
+ path: string;
1815
+ }
1816
+ /**
1817
+ * A full-screen console page that needs NO staff session (AGL-3608): served
1818
+ * at `/kiosk/{pluginId}{path}` by the console's generic public route, outside
1819
+ * the workspace shell, with only the console theme around it.
1820
+ *
1821
+ * The case is a device a business sets down in front of the public — a
1822
+ * screen facing a customer, a sign-in tablet at a front desk — which is
1823
+ * nobody's console session and must never become one. The shell draws no
1824
+ * nav, no workspace, no org switcher and no plugin providers here, and the
1825
+ * route loads this one plugin's console bundle and nothing else.
1826
+ *
1827
+ * Neither the extension's `featureFlag` nor its `permission` applies: there is
1828
+ * no member to ask. The page proves itself to its own API routes — a pairing
1829
+ * code exchanged for a device token, say — and every read it makes must be
1830
+ * refused server-side without that proof. Treat everything the page renders
1831
+ * as visible to whoever is standing in front of the device.
1832
+ *
1833
+ * The plugin also declares each path in its manifest as
1834
+ * `contributes.console.publicRoutes`, which is what lets the route load the
1835
+ * bundle only for a path that exists. First-party plugins only: the route
1836
+ * reads the console's generated manifest, never a marketplace install.
1837
+ */
1838
+ export interface ConsolePublicPage {
1839
+ /**
1840
+ * The path beneath `/kiosk/{pluginId}`, with its leading slash
1841
+ * (`/display`). Matched exactly. It is in URLs saved on devices — treat it
1842
+ * as persisted.
1843
+ */
1844
+ path: string;
1845
+ /** The browser tab's title, which is also what a home-screen shortcut shows. */
1846
+ title: string;
1847
+ Component: ComponentType<ConsolePublicPageProps>;
1848
+ }
1766
1849
  export interface ConsoleExtension {
1767
1850
  pluginId: PluginId;
1768
1851
  displayName: string;
@@ -1848,6 +1931,12 @@ export interface ConsoleExtension {
1848
1931
  * Neither `featureFlag` nor `permission` applies to them.
1849
1932
  */
1850
1933
  staffPages?: readonly ConsoleStaffPage[];
1934
+ /**
1935
+ * Full-screen pages that need no staff session (AGL-3608) — see
1936
+ * {@link ConsolePublicPage}. Neither `featureFlag` nor `permission` applies
1937
+ * to them.
1938
+ */
1939
+ publicPages?: readonly ConsolePublicPage[];
1851
1940
  /**
1852
1941
  * App-level providers the shell mounts around every console page
1853
1942
  * (AGL-419) — e.g. the marketplace plugin's AI-assist provider.
@@ -1973,6 +2062,24 @@ export declare function listConsoleStaffPages(enabledPluginIds?: readonly Plugin
1973
2062
  * symptom — the same rule {@link resolveConsolePluginPage} applies to paths.
1974
2063
  */
1975
2064
  export declare function resolveConsoleStaffPage(id: string, enabledPluginIds?: readonly PluginId[]): ConsoleStaffPageEntry | undefined;
2065
+ /** A public page flattened with its owning extension's id. */
2066
+ export interface ConsolePublicPageEntry extends ConsolePublicPage {
2067
+ pluginId: PluginId;
2068
+ }
2069
+ /** `pos-display`, `/pos-display/` and `/pos-display` all name `/pos-display`. */
2070
+ export declare function normalizeConsolePublicPath(path: string): string;
2071
+ /** Every registered public page, in registration order. */
2072
+ export declare function listConsolePublicPages(enabledPluginIds?: readonly PluginId[]): ConsolePublicPageEntry[];
2073
+ /**
2074
+ * The public page at `/kiosk/{pluginId}{path}` (AGL-3608), or `undefined`.
2075
+ *
2076
+ * Scoped to the ONE plugin the URL names, because the registry is a
2077
+ * session-wide union (AGL-758): a device that once loaded another plugin
2078
+ * must not have that plugin answer a path in this one's namespace. Two
2079
+ * extensions of the same plugin claiming one path resolve to nothing and
2080
+ * say so, the rule {@link resolveConsoleStaffPage} applies to ids.
2081
+ */
2082
+ export declare function resolveConsolePublicPage(pluginId: PluginId, path: string): ConsolePublicPageEntry | undefined;
1976
2083
  /** Widgets registered for a slot, across every extension (AGL-419). */
1977
2084
  export declare function listConsoleWidgets(slot: string, enabledPluginIds?: readonly PluginId[]): Array<{
1978
2085
  extension: ConsoleExtension;
@@ -279,6 +279,17 @@ import { _ as _extends } from "@swc/helpers/_/_extends";
279
279
  * widget.
280
280
  */ hostTheme: 'hostTheme',
281
281
  /**
282
+ * Inside the theme editor's Typography card (AGL-3656): the control that
283
+ * chooses the site's fonts. Props: {@link ConsoleThemeEditorFontsZoneProps}
284
+ * — the site, the editor's draft, and `updateDraft`, which changes the
285
+ * draft as any of the editor's own controls does.
286
+ *
287
+ * A widget here edits the draft and never writes: the editor's Save keeps
288
+ * the change and Discard drops it, with the preview beside it following
289
+ * every step. With no widget the editor offers its own short list of
290
+ * fonts, so a workspace without a fonts plugin can still choose one.
291
+ */ themeEditorFonts: 'themeEditorFonts',
292
+ /**
282
293
  * The staff overview, among its platform-wide cards (AGL-3080). No props:
283
294
  * the overview is about the platform, not one org, so a widget here reads
284
295
  * what its plugin holds across every workspace through its own staff
@@ -417,6 +428,14 @@ import { _ as _extends } from "@swc/helpers/_/_extends";
417
428
  * which puts values in the form as unsaved edits. The form's Update stores
418
429
  * them; nothing a widget proposes reaches the published site before that.
419
430
  */ hostSeo: 'hostSeo',
431
+ /**
432
+ * The host setup Business profile section, under the site's profile and
433
+ * the facts read from its settings (AGL-3661). Props:
434
+ * {@link ConsoleHostBusinessProfileZoneProps}. What a plugin keeps ABOUT the
435
+ * business — the preferences an AI plugin learned from the owner's edits —
436
+ * shown where the owner reads and corrects the profile itself. A widget
437
+ * here writes only its own records.
438
+ */ hostBusinessProfile: 'hostBusinessProfile',
420
439
  /** {@link ConsoleRecordInsightsZoneProps} */ recordInsights: 'recordInsights',
421
440
  /** {@link ConsoleRecordEmailZoneProps} */ recordEmail: 'recordEmail',
422
441
  /** {@link ConsoleImportMappingZoneProps} */ importMapping: 'importMapping',
@@ -763,6 +782,39 @@ function matchNavItemHref(navItem, itemHref, href) {
763
782
  }
764
783
  return matches[0];
765
784
  }
785
+ /** `pos-display`, `/pos-display/` and `/pos-display` all name `/pos-display`. */ export function normalizeConsolePublicPath(path) {
786
+ return `/${String(path != null ? path : '').split('/').filter(Boolean).join('/')}`;
787
+ }
788
+ /** Every registered public page, in registration order. */ export function listConsolePublicPages(enabledPluginIds) {
789
+ return listConsoleExtensions(enabledPluginIds).flatMap((extension)=>{
790
+ var _extension_publicPages;
791
+ return ((_extension_publicPages = extension.publicPages) != null ? _extension_publicPages : []).map((page)=>_extends({}, page, {
792
+ path: normalizeConsolePublicPath(page.path),
793
+ pluginId: extension.pluginId
794
+ }));
795
+ });
796
+ }
797
+ /**
798
+ * The public page at `/kiosk/{pluginId}{path}` (AGL-3608), or `undefined`.
799
+ *
800
+ * Scoped to the ONE plugin the URL names, because the registry is a
801
+ * session-wide union (AGL-758): a device that once loaded another plugin
802
+ * must not have that plugin answer a path in this one's namespace. Two
803
+ * extensions of the same plugin claiming one path resolve to nothing and
804
+ * say so, the rule {@link resolveConsoleStaffPage} applies to ids.
805
+ */ export function resolveConsolePublicPage(pluginId, path) {
806
+ if (!pluginId) return undefined;
807
+ const wanted = normalizeConsolePublicPath(path);
808
+ if (wanted === '/') return undefined;
809
+ const matches = listConsolePublicPages([
810
+ pluginId
811
+ ]).filter((page)=>page.path === wanted);
812
+ if (matches.length > 1) {
813
+ console.error(`[aglyn] public page "/kiosk/${pluginId}${wanted}" is registered more ` + 'than once; refusing to guess which one to serve.');
814
+ return undefined;
815
+ }
816
+ return matches[0];
817
+ }
766
818
  /** Widgets registered for a slot, across every extension (AGL-419). */ export function listConsoleWidgets(slot, enabledPluginIds) {
767
819
  const out = [];
768
820
  for (const extension of listConsoleExtensions(enabledPluginIds)){