@cobaltcore-dev/aurora 2.1.1 → 2.2.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 (173) hide show
  1. package/README.md +31 -25
  2. package/dist/client/AuroraApp.d.ts +9 -2
  3. package/dist/client/context/AppConfigContext.d.ts +44 -0
  4. package/dist/client/index.d.ts +2 -0
  5. package/dist/client/index.js +41221 -845
  6. package/dist/client/index.js.map +1 -1
  7. package/dist/client/trpcClient.d.ts +314 -0
  8. package/dist/client/utils/appConfigGating.d.ts +21 -0
  9. package/dist/server/index.d.ts +694 -3
  10. package/dist/server/index.js +1748 -722
  11. package/package.json +3 -3
  12. package/dist/client/AuthProvider-CVSAwW9f.mjs +0 -83
  13. package/dist/client/AuthProvider-CVSAwW9f.mjs.map +0 -1
  14. package/dist/client/ContentHeader-fKKZVu-o.mjs +0 -116
  15. package/dist/client/ContentHeader-fKKZVu-o.mjs.map +0 -1
  16. package/dist/client/DeleteFlavorModal-C4nAi7gY.mjs +0 -724
  17. package/dist/client/DeleteFlavorModal-C4nAi7gY.mjs.map +0 -1
  18. package/dist/client/DynamicBreadcrumbContext-CVcUQFou.mjs +0 -26
  19. package/dist/client/DynamicBreadcrumbContext-CVcUQFou.mjs.map +0 -1
  20. package/dist/client/FiltersInput-Becwxo_J.mjs +0 -85
  21. package/dist/client/FiltersInput-Becwxo_J.mjs.map +0 -1
  22. package/dist/client/FloatingIpActionModals-Cq10WljB.mjs +0 -466
  23. package/dist/client/FloatingIpActionModals-Cq10WljB.mjs.map +0 -1
  24. package/dist/client/RouteIdLevelDefaultError-DPF_x2tG.mjs +0 -26
  25. package/dist/client/RouteIdLevelDefaultError-DPF_x2tG.mjs.map +0 -1
  26. package/dist/client/Slot-CWb612-_.mjs +0 -28
  27. package/dist/client/Slot-CWb612-_.mjs.map +0 -1
  28. package/dist/client/SortInput-4g7nSTHW.mjs +0 -34
  29. package/dist/client/SortInput-4g7nSTHW.mjs.map +0 -1
  30. package/dist/client/StorageNotFound-B-zVinVD.mjs +0 -30
  31. package/dist/client/StorageNotFound-B-zVinVD.mjs.map +0 -1
  32. package/dist/client/TwoColumnDescriptionList-DKS42RKa.mjs +0 -28
  33. package/dist/client/TwoColumnDescriptionList-DKS42RKa.mjs.map +0 -1
  34. package/dist/client/_-CAsCx-Ay.mjs +0 -6
  35. package/dist/client/_-CAsCx-Ay.mjs.map +0 -1
  36. package/dist/client/_auth-SrDjHL6j.mjs +0 -12
  37. package/dist/client/_auth-SrDjHL6j.mjs.map +0 -1
  38. package/dist/client/_flavorId-BPvssEzn.mjs +0 -277
  39. package/dist/client/_flavorId-BPvssEzn.mjs.map +0 -1
  40. package/dist/client/_flavorId-CFUBcU-l.mjs +0 -27
  41. package/dist/client/_flavorId-CFUBcU-l.mjs.map +0 -1
  42. package/dist/client/_flavorId-CZcIp0Ih.mjs +0 -22
  43. package/dist/client/_flavorId-CZcIp0Ih.mjs.map +0 -1
  44. package/dist/client/_floatingIpId-B8r64AL9.mjs +0 -196
  45. package/dist/client/_floatingIpId-B8r64AL9.mjs.map +0 -1
  46. package/dist/client/_floatingIpId-lEobpOER.mjs +0 -26
  47. package/dist/client/_floatingIpId-lEobpOER.mjs.map +0 -1
  48. package/dist/client/_imageId-BAezmV0Y.mjs +0 -526
  49. package/dist/client/_imageId-BAezmV0Y.mjs.map +0 -1
  50. package/dist/client/_imageId-D-jqz3e3.mjs +0 -40
  51. package/dist/client/_imageId-D-jqz3e3.mjs.map +0 -1
  52. package/dist/client/_imageId-gMdrdnVt.mjs +0 -22
  53. package/dist/client/_imageId-gMdrdnVt.mjs.map +0 -1
  54. package/dist/client/_projectId-BYccdAtX.mjs +0 -77
  55. package/dist/client/_projectId-BYccdAtX.mjs.map +0 -1
  56. package/dist/client/_projectId-CBjZC1tv.mjs +0 -283
  57. package/dist/client/_projectId-CBjZC1tv.mjs.map +0 -1
  58. package/dist/client/_projectId-CLEa1zgw.mjs +0 -30
  59. package/dist/client/_projectId-CLEa1zgw.mjs.map +0 -1
  60. package/dist/client/_projectId-D3VOH5lN.mjs +0 -94
  61. package/dist/client/_projectId-D3VOH5lN.mjs.map +0 -1
  62. package/dist/client/_securityGroupId-BwgZnoiR.mjs +0 -29
  63. package/dist/client/_securityGroupId-BwgZnoiR.mjs.map +0 -1
  64. package/dist/client/_securityGroupId-Cz2NUHdB.mjs +0 -1819
  65. package/dist/client/_securityGroupId-Cz2NUHdB.mjs.map +0 -1
  66. package/dist/client/_serviceType-DS8DxsrP.mjs +0 -20
  67. package/dist/client/_serviceType-DS8DxsrP.mjs.map +0 -1
  68. package/dist/client/_serviceType-M8d9rOT6.mjs +0 -6
  69. package/dist/client/_serviceType-M8d9rOT6.mjs.map +0 -1
  70. package/dist/client/_storageType-BNpP1A2N.mjs +0 -13
  71. package/dist/client/_storageType-BNpP1A2N.mjs.map +0 -1
  72. package/dist/client/_storageType-BxSGKhAI.mjs +0 -15
  73. package/dist/client/_storageType-BxSGKhAI.mjs.map +0 -1
  74. package/dist/client/_storageType-DZYCmiLt.mjs +0 -30
  75. package/dist/client/_storageType-DZYCmiLt.mjs.map +0 -1
  76. package/dist/client/_storageType-UqAMP-8d.mjs +0 -859
  77. package/dist/client/_storageType-UqAMP-8d.mjs.map +0 -1
  78. package/dist/client/_storageType-u51_7OwJ.mjs +0 -7
  79. package/dist/client/_storageType-u51_7OwJ.mjs.map +0 -1
  80. package/dist/client/about-BmQTyLWc.mjs +0 -92
  81. package/dist/client/about-BmQTyLWc.mjs.map +0 -1
  82. package/dist/client/assets/__mocks__/svgMock.d.ts +0 -3
  83. package/dist/client/aurora-CIml-f2f.mjs +0 -19
  84. package/dist/client/aurora-CIml-f2f.mjs.map +0 -1
  85. package/dist/client/build-WuxXRAqf.mjs +0 -14530
  86. package/dist/client/build-WuxXRAqf.mjs.map +0 -1
  87. package/dist/client/cn-DM4Cy3jv.mjs +0 -10
  88. package/dist/client/cn-DM4Cy3jv.mjs.map +0 -1
  89. package/dist/client/flavors-CJVSNz6R.mjs +0 -15
  90. package/dist/client/flavors-CJVSNz6R.mjs.map +0 -1
  91. package/dist/client/flavors-CflJDIEH.mjs +0 -667
  92. package/dist/client/flavors-CflJDIEH.mjs.map +0 -1
  93. package/dist/client/flavors-DWMZ6TuJ.mjs +0 -8
  94. package/dist/client/flavors-DWMZ6TuJ.mjs.map +0 -1
  95. package/dist/client/floatingips-Cz9k80cc.mjs +0 -8
  96. package/dist/client/floatingips-Cz9k80cc.mjs.map +0 -1
  97. package/dist/client/floatingips-DXnRlLvV.mjs +0 -551
  98. package/dist/client/floatingips-DXnRlLvV.mjs.map +0 -1
  99. package/dist/client/floatingips-HRbuLxiN.mjs +0 -22
  100. package/dist/client/floatingips-HRbuLxiN.mjs.map +0 -1
  101. package/dist/client/floatingips-nN1kQmsu.mjs +0 -14
  102. package/dist/client/floatingips-nN1kQmsu.mjs.map +0 -1
  103. package/dist/client/formatBytes-CZv_XyCY.mjs +0 -38
  104. package/dist/client/formatBytes-CZv_XyCY.mjs.map +0 -1
  105. package/dist/client/helpers-1PpYf-fC.mjs +0 -6
  106. package/dist/client/helpers-1PpYf-fC.mjs.map +0 -1
  107. package/dist/client/hooks-D0yKIumu.mjs +0 -22
  108. package/dist/client/hooks-D0yKIumu.mjs.map +0 -1
  109. package/dist/client/imageHelpers-DBhL2ebL.mjs +0 -1272
  110. package/dist/client/imageHelpers-DBhL2ebL.mjs.map +0 -1
  111. package/dist/client/images-BsylWUiH.mjs +0 -2011
  112. package/dist/client/images-BsylWUiH.mjs.map +0 -1
  113. package/dist/client/images-NBf2bV43.mjs +0 -8
  114. package/dist/client/images-NBf2bV43.mjs.map +0 -1
  115. package/dist/client/images-zQq1nSVv.mjs +0 -15
  116. package/dist/client/images-zQq1nSVv.mjs.map +0 -1
  117. package/dist/client/md-kvaGCNAK.mjs +0 -336
  118. package/dist/client/md-kvaGCNAK.mjs.map +0 -1
  119. package/dist/client/network-DuZm76BZ.mjs +0 -8
  120. package/dist/client/network-DuZm76BZ.mjs.map +0 -1
  121. package/dist/client/objects-BudUAfWY.mjs +0 -12909
  122. package/dist/client/objects-BudUAfWY.mjs.map +0 -1
  123. package/dist/client/objects-Dc7sKUr8.mjs +0 -67
  124. package/dist/client/objects-Dc7sKUr8.mjs.map +0 -1
  125. package/dist/client/objects-Dw7oeTq2.mjs +0 -80
  126. package/dist/client/objects-Dw7oeTq2.mjs.map +0 -1
  127. package/dist/client/objects-_g7nGIn5.mjs +0 -25
  128. package/dist/client/objects-_g7nGIn5.mjs.map +0 -1
  129. package/dist/client/objects-eBxvY6_n.mjs +0 -78
  130. package/dist/client/objects-eBxvY6_n.mjs.map +0 -1
  131. package/dist/client/projects-yiK0HGSA.mjs +0 -7
  132. package/dist/client/projects-yiK0HGSA.mjs.map +0 -1
  133. package/dist/client/routeInfo-DP3v74Wg.mjs +0 -19
  134. package/dist/client/routeInfo-DP3v74Wg.mjs.map +0 -1
  135. package/dist/client/routes-CJj7SR_K.mjs +0 -10
  136. package/dist/client/routes-CJj7SR_K.mjs.map +0 -1
  137. package/dist/client/routes-xofA3ksU.mjs +0 -110
  138. package/dist/client/routes-xofA3ksU.mjs.map +0 -1
  139. package/dist/client/securitygroups-CSmsBzUb.mjs +0 -581
  140. package/dist/client/securitygroups-CSmsBzUb.mjs.map +0 -1
  141. package/dist/client/securitygroups-CtKne8UQ.mjs +0 -8
  142. package/dist/client/securitygroups-CtKne8UQ.mjs.map +0 -1
  143. package/dist/client/securitygroups-T7kaNFEp.mjs +0 -15
  144. package/dist/client/securitygroups-T7kaNFEp.mjs.map +0 -1
  145. package/dist/client/securitygroups-WLB1_IM6.mjs +0 -22
  146. package/dist/client/securitygroups-WLB1_IM6.mjs.map +0 -1
  147. package/dist/client/securitygroups-o0IXZM6S.mjs +0 -14
  148. package/dist/client/securitygroups-o0IXZM6S.mjs.map +0 -1
  149. package/dist/client/serviceCatalog-B3lKWC9V.mjs +0 -6
  150. package/dist/client/serviceCatalog-B3lKWC9V.mjs.map +0 -1
  151. package/dist/client/services-D1PbooD1.mjs +0 -6
  152. package/dist/client/services-D1PbooD1.mjs.map +0 -1
  153. package/dist/client/services-DEMVtFyn.mjs +0 -9
  154. package/dist/client/services-DEMVtFyn.mjs.map +0 -1
  155. package/dist/client/storageProviders-CJ5rOh13.mjs +0 -15
  156. package/dist/client/storageProviders-CJ5rOh13.mjs.map +0 -1
  157. package/dist/client/trpcClient-D7gpR7YG.mjs +0 -71
  158. package/dist/client/trpcClient-D7gpR7YG.mjs.map +0 -1
  159. package/dist/client/useBreadcrumbs-ha3IlaxX.mjs +0 -54
  160. package/dist/client/useBreadcrumbs-ha3IlaxX.mjs.map +0 -1
  161. package/dist/client/useErrorTranslation-Dc0eE8Zt.mjs +0 -83
  162. package/dist/client/useErrorTranslation-Dc0eE8Zt.mjs.map +0 -1
  163. package/dist/client/useModal-DCs1OJh7.mjs +0 -12
  164. package/dist/client/useModal-DCs1OJh7.mjs.map +0 -1
  165. package/dist/client/useModalTracking-BYd37pXm.mjs +0 -37
  166. package/dist/client/useModalTracking-BYd37pXm.mjs.map +0 -1
  167. package/dist/client/useProjectId-DBc5lpoU.mjs +0 -11
  168. package/dist/client/useProjectId-DBc5lpoU.mjs.map +0 -1
  169. package/dist/client/useSecurityGroupPermissions--hK4aR8Y.mjs +0 -294
  170. package/dist/client/useSecurityGroupPermissions--hK4aR8Y.mjs.map +0 -1
  171. package/dist/client/useSetBreadcrumb-tn7lBaQV.mjs +0 -19
  172. package/dist/client/useSetBreadcrumb-tn7lBaQV.mjs.map +0 -1
  173. package/dist/client/utils/trpcErrors.d.ts +0 -13
@@ -2,13 +2,13 @@ import * as fastify from 'fastify';
2
2
  import { FastifyInstance, FastifyRequest, FastifyReply } from 'fastify';
3
3
  import * as _trpc_server from '@trpc/server';
4
4
  import { AnyRouter } from '@trpc/server';
5
+ import * as zod from 'zod';
6
+ import { z, ZodTypeAny, output } from 'zod';
5
7
  import * as _cobaltcore_dev_signal_openstack from '@cobaltcore-dev/signal-openstack';
6
8
  import { SignalOpenstackSessionType } from '@cobaltcore-dev/signal-openstack';
7
9
  import * as _cobaltcore_dev_signal_openstack_dist_types_client from '@cobaltcore-dev/signal-openstack/dist/types/client';
8
10
  import * as fastify_types_type_provider from 'fastify/types/type-provider';
9
11
  import * as http from 'http';
10
- import * as zod from 'zod';
11
- import { z, ZodTypeAny, output } from 'zod';
12
12
  import * as _trpc_server_http from '@trpc/server/http';
13
13
 
14
14
  declare module "fastify" {
@@ -17,6 +17,133 @@ declare module "fastify" {
17
17
  }
18
18
  }
19
19
 
20
+ /**
21
+ * Canonical list of the UI extension points a consumer can register components for.
22
+ *
23
+ * Declared as a runtime array (rather than a bare type) so it can drive both the
24
+ * {@link SlotName} type and runtime validation (see `auroraAppConfigSchema`). Kept in this
25
+ * JSX-free module so the server build can consume it; a compile-time guard in
26
+ * `client/AuroraApp.tsx` keeps it in lockstep with the keys of the `Slots` type.
27
+ */
28
+ declare const SLOT_NAMES: readonly ["logo", "login", "pageFooter", "sideNavBanner", "serviceBadge", "servicePageActions", "projectsBanner", "serviceBanner"];
29
+ /** Names of the UI extension points a consumer can register components for. */
30
+ type SlotName = (typeof SLOT_NAMES)[number];
31
+ /**
32
+ * An open, consumer-typed bag of flags/values. Aurora never introspects its contents.
33
+ * Consumers narrow this via the generic parameters on {@link AuroraAppConfig}.
34
+ */
35
+ type FeatureBag = Record<string, unknown>;
36
+ /**
37
+ * Per-slot runtime data bag, e.g. `{ text: "Maintenance tonight" }` for a banner slot.
38
+ * Carried in {@link AppConfigBase.slotSettings}; it never affects whether a slot renders.
39
+ */
40
+ type SlotConfigEntry = Record<string, unknown>;
41
+ /**
42
+ * Map of service key to that service's settings bag. Supplied by the consumer via the
43
+ * `TServices` generic to get precise, typo-checked per-service settings. Each entry is the
44
+ * settings object itself (a flat bag), symmetric with {@link SlotConfigEntry}.
45
+ */
46
+ type ServiceFeatureMap = Record<string, FeatureBag>;
47
+ /**
48
+ * Visibility rule for one dimension (services or slots). The base layer declares the
49
+ * posture explicitly:
50
+ * - `allowlist`: nothing shows unless its key is in `allow`.
51
+ * - `denylist`: everything shows unless its key is in `deny`.
52
+ *
53
+ * Omit the rule entirely for default-open (every service/slot shows). Because posture is a
54
+ * discriminated union on `mode`, only the list that posture makes meaningful is accepted,
55
+ * so an `allow` and a `deny` list can never be present at the same time. Switching posture
56
+ * is a one-field edit: change `mode` and rename the list.
57
+ */
58
+ type Visibility<TKey extends string = string> = {
59
+ mode: "allowlist";
60
+ allow: TKey[];
61
+ } | {
62
+ mode: "denylist";
63
+ deny: TKey[];
64
+ };
65
+ /**
66
+ * Membership change a domain override applies on top of the base layer's visibility.
67
+ * `enable` makes a key visible for the domain, `disable` hides it, regardless of the base
68
+ * posture. Overrides carry no `mode`, so they can never flip the posture the base pinned.
69
+ * When a key is in both, `disable` wins.
70
+ */
71
+ interface VisibilityDelta<TKey extends string = string> {
72
+ enable?: TKey[];
73
+ disable?: TKey[];
74
+ }
75
+ /**
76
+ * The base configuration layer. The resolved result shares this shape (overrides folded in
77
+ * and stripped out). Visibility and settings are independent axes: `services`/`slots` decide
78
+ * what renders, while `serviceSettings`/`slotSettings`/`features` carry data and never gate.
79
+ */
80
+ interface AppConfigBase<TServices extends ServiceFeatureMap = ServiceFeatureMap, TFeatures extends FeatureBag = FeatureBag> {
81
+ /** Which services render. Omit for default-open (all catalog services). */
82
+ services?: Visibility<Extract<keyof TServices, string>>;
83
+ /** Which slots render. Omit for default-open (all registered slots). */
84
+ slots?: Visibility<SlotName>;
85
+ /** Per-service settings bags, independent of visibility. Deep-merged across overrides. */
86
+ serviceSettings?: {
87
+ [K in keyof TServices]?: TServices[K];
88
+ };
89
+ /** Per-slot data bags (e.g. banner text), independent of visibility. Deep-merged across overrides. */
90
+ slotSettings?: Partial<Record<SlotName, SlotConfigEntry>>;
91
+ /** App-wide, consumer-typed feature flags. Deep-merged across overrides. */
92
+ features?: TFeatures;
93
+ }
94
+ /** A base layer applies to every domain; an override applies only to matching domains. */
95
+ interface DomainOverride<TServices extends ServiceFeatureMap = ServiceFeatureMap, TFeatures extends FeatureBag = FeatureBag> {
96
+ /** Human-readable label. Used only for logging and debugging. */
97
+ name?: string;
98
+ /**
99
+ * Matched against the user's home domain name. A string is compiled to a RegExp;
100
+ * a RegExp literal is preferred because it is validated at compile time.
101
+ */
102
+ domain: string | RegExp;
103
+ /** Enable/disable services for this domain. Cannot change the base posture. */
104
+ services?: VisibilityDelta<Extract<keyof TServices, string>>;
105
+ /** Enable/disable slots for this domain. Cannot change the base posture. */
106
+ slots?: VisibilityDelta<SlotName>;
107
+ serviceSettings?: {
108
+ [K in keyof TServices]?: TServices[K];
109
+ };
110
+ slotSettings?: Partial<Record<SlotName, SlotConfigEntry>>;
111
+ features?: TFeatures;
112
+ }
113
+ /**
114
+ * The full domain configuration a consumer passes to `createServer`.
115
+ *
116
+ * The top-level fields form the base layer that applies to every domain. `overrides` are
117
+ * applied on top for domains whose name matches, in array order, with later matches winning.
118
+ * `services`/`slots` fold each override's enable/disable deltas onto the base-pinned posture;
119
+ * `serviceSettings`/`slotSettings`/`features` deep-merge per key.
120
+ *
121
+ * Everything is optional: with no config at all, the resolved result is empty and Aurora
122
+ * behaves in its default-open state (all implemented services, all registered slots).
123
+ *
124
+ * @example
125
+ * ```ts
126
+ * const config: AuroraAppConfig = {
127
+ * services: { mode: "allowlist", allow: ["ceph-containers", "images"] },
128
+ * slots: { mode: "denylist", deny: ["projectsBanner"] },
129
+ * serviceSettings: { images: { showAdvancedOptions: true } },
130
+ * features: { termsAndConditionsUrl: "https://example.com/terms" },
131
+ * overrides: [
132
+ * { name: "acme", domain: /^acme-/, services: { enable: ["flavors"], disable: ["images"] } },
133
+ * ],
134
+ * }
135
+ * ```
136
+ */
137
+ interface AuroraAppConfig<TServices extends ServiceFeatureMap = ServiceFeatureMap, TFeatures extends FeatureBag = FeatureBag> extends AppConfigBase<TServices, TFeatures> {
138
+ overrides?: DomainOverride<TServices, TFeatures>[];
139
+ }
140
+ /**
141
+ * The merged result for a single domain: a base layer with the overrides already applied and
142
+ * stripped out. This is what the BFF returns to the client and what custom BFF procedures
143
+ * read from `ctx.appConfig`. It never contains `overrides` or a RegExp, so it is wire-safe.
144
+ */
145
+ type ResolvedAppConfig<TServices extends ServiceFeatureMap = ServiceFeatureMap, TFeatures extends FeatureBag = FeatureBag> = AppConfigBase<TServices, TFeatures>;
146
+
20
147
  interface AuroraServerConfig {
21
148
  bffEndpoint?: string;
22
149
  viteRoot?: string;
@@ -85,10 +212,128 @@ interface AuroraServerConfig {
85
212
  * ```
86
213
  */
87
214
  routers?: AnyRouter[];
215
+ /**
216
+ * Optional per-domain configuration. When provided, the BFF resolves it for the
217
+ * logged-in user's home domain and exposes the merged result via the `appConfig.get`
218
+ * procedure and on `ctx.appConfig` for custom procedures. When omitted, Aurora stays
219
+ * in its default-open state (all implemented services, all registered slots).
220
+ */
221
+ appConfig?: AuroraAppConfig;
88
222
  }
89
223
 
90
224
  declare function createServer(config: AuroraServerConfig): Promise<FastifyInstance>;
91
225
 
226
+ /**
227
+ * Resolve a consumer's domain configuration for one domain.
228
+ *
229
+ * Starts from the base layer (the config's top-level fields), then applies every override
230
+ * whose `domain` matches `domainName`, in array order. For each override: `services` and
231
+ * `slots` deltas fold onto the base-pinned posture (see {@link foldVisibility}); and
232
+ * `serviceSettings`, `slotSettings`, `features` deep-merge per key. When `domainName` is
233
+ * undefined (e.g. an unauthenticated request, where no domain is known yet) no override
234
+ * matches and only the base layer is returned.
235
+ *
236
+ * The returned object never contains `overrides` or any RegExp, so it is safe to send over
237
+ * the wire to the client.
238
+ */
239
+ declare function resolveAppConfig<TServices extends ServiceFeatureMap = ServiceFeatureMap, TFeatures extends FeatureBag = FeatureBag>(config: AuroraAppConfig<TServices, TFeatures>, domainName?: string): ResolvedAppConfig<TServices, TFeatures>;
240
+
241
+ /**
242
+ * Builds a Zod schema for the {@link AuroraAppConfig} envelope, for validating configuration
243
+ * loaded at runtime from an external source (e.g. a Kubernetes ConfigMap mounted as YAML).
244
+ *
245
+ * The envelope (service/slot visibility, settings maps, overrides, domain matchers) is owned
246
+ * and validated by Aurora. The consumer-specific `features` bag is validated by the schema
247
+ * passed in `featuresSchema`; when omitted it is accepted as an open record. Per-service
248
+ * `features` are always accepted as an open record (consumers validate those themselves).
249
+ *
250
+ * Visibility is a discriminated union on `mode`, so `allowlist` accepts only an `allow` list
251
+ * and `denylist` only a `deny` list; the two can never coexist. `domain` is validated as a
252
+ * string (YAML cannot express a RegExp) and checked to be a compilable regular expression.
253
+ * Unknown keys are rejected so a typo in a ConfigMap fails fast at boot.
254
+ *
255
+ * @example
256
+ * ```ts
257
+ * const sciFeatures = z.object({ termsAndConditionsUrl: z.string().optional() })
258
+ * const schema = auroraAppConfigSchema(sciFeatures)
259
+ * const appConfig = schema.parse(parsedYaml)
260
+ * ```
261
+ */
262
+ declare function auroraAppConfigSchema(featuresSchema?: z.ZodType): z.ZodObject<{
263
+ overrides: z.ZodOptional<z.ZodArray<z.ZodObject<{
264
+ name: z.ZodOptional<z.ZodString>;
265
+ domain: z.ZodString;
266
+ services: z.ZodOptional<z.ZodObject<{
267
+ enable: z.ZodOptional<z.ZodArray<z.ZodString>>;
268
+ disable: z.ZodOptional<z.ZodArray<z.ZodString>>;
269
+ }, z.core.$strict>>;
270
+ slots: z.ZodOptional<z.ZodObject<{
271
+ enable: z.ZodOptional<z.ZodArray<z.ZodEnum<{
272
+ logo: "logo";
273
+ login: "login";
274
+ pageFooter: "pageFooter";
275
+ sideNavBanner: "sideNavBanner";
276
+ serviceBadge: "serviceBadge";
277
+ servicePageActions: "servicePageActions";
278
+ projectsBanner: "projectsBanner";
279
+ serviceBanner: "serviceBanner";
280
+ }>>>;
281
+ disable: z.ZodOptional<z.ZodArray<z.ZodEnum<{
282
+ logo: "logo";
283
+ login: "login";
284
+ pageFooter: "pageFooter";
285
+ sideNavBanner: "sideNavBanner";
286
+ serviceBadge: "serviceBadge";
287
+ servicePageActions: "servicePageActions";
288
+ projectsBanner: "projectsBanner";
289
+ serviceBanner: "serviceBanner";
290
+ }>>>;
291
+ }, z.core.$strict>>;
292
+ serviceSettings: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
293
+ slotSettings: z.ZodOptional<z.ZodObject<{
294
+ [x: string]: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
295
+ }, z.core.$strict>>;
296
+ features: z.ZodOptional<z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
297
+ }, z.core.$strict>>>;
298
+ services: z.ZodOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
299
+ mode: z.ZodLiteral<"allowlist">;
300
+ allow: z.ZodArray<z.ZodString>;
301
+ }, z.core.$strict>, z.ZodObject<{
302
+ mode: z.ZodLiteral<"denylist">;
303
+ deny: z.ZodArray<z.ZodString>;
304
+ }, z.core.$strict>], "mode">>;
305
+ slots: z.ZodOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
306
+ mode: z.ZodLiteral<"allowlist">;
307
+ allow: z.ZodArray<z.ZodEnum<{
308
+ logo: "logo";
309
+ login: "login";
310
+ pageFooter: "pageFooter";
311
+ sideNavBanner: "sideNavBanner";
312
+ serviceBadge: "serviceBadge";
313
+ servicePageActions: "servicePageActions";
314
+ projectsBanner: "projectsBanner";
315
+ serviceBanner: "serviceBanner";
316
+ }>>;
317
+ }, z.core.$strict>, z.ZodObject<{
318
+ mode: z.ZodLiteral<"denylist">;
319
+ deny: z.ZodArray<z.ZodEnum<{
320
+ logo: "logo";
321
+ login: "login";
322
+ pageFooter: "pageFooter";
323
+ sideNavBanner: "sideNavBanner";
324
+ serviceBadge: "serviceBadge";
325
+ servicePageActions: "servicePageActions";
326
+ projectsBanner: "projectsBanner";
327
+ serviceBanner: "serviceBanner";
328
+ }>>;
329
+ }, z.core.$strict>], "mode">>;
330
+ serviceSettings: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
331
+ slotSettings: z.ZodOptional<z.ZodObject<{
332
+ [x: string]: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
333
+ }, z.core.$strict>>;
334
+ features: z.ZodOptional<z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
335
+ }, z.core.$strict>;
336
+
92
337
  interface AuroraContext {
93
338
  validateSession: () => boolean;
94
339
  openstack?: Awaited<SignalOpenstackSessionType>;
@@ -113,6 +358,12 @@ interface AuroraPortalContext extends AuroraContext {
113
358
  cephRegion?: string;
114
359
  /** Parsed list of image metadata keys excluded from the UI */
115
360
  imageMetadataExcludedProperties: string[];
361
+ /**
362
+ * Per-domain configuration resolved for the current user's home domain. Undefined when
363
+ * the consumer supplied no `appConfig`. For unauthenticated requests this holds the
364
+ * base layer only (no domain is known yet).
365
+ */
366
+ appConfig?: ResolvedAppConfig;
116
367
  createSession: (params: {
117
368
  user: string;
118
369
  password: string;
@@ -148,6 +399,7 @@ declare const protectedProcedure: _trpc_server.TRPCProcedureBuilder<AuroraPortal
148
399
  }) => Promise<Awaited<_cobaltcore_dev_signal_openstack.SignalOpenstackSessionType | null>>;
149
400
  identityEndpoint: string;
150
401
  cephRegion: string | undefined;
402
+ appConfig: ResolvedAppConfig | undefined;
151
403
  terminateSession: () => Promise<void>;
152
404
  validateSession: () => boolean;
153
405
  openstack: {
@@ -322,6 +574,7 @@ declare const projectScopedProcedure: _trpc_server.TRPCProcedureBuilder<AuroraPo
322
574
  }) => Promise<Awaited<_cobaltcore_dev_signal_openstack.SignalOpenstackSessionType | null>>;
323
575
  identityEndpoint: string;
324
576
  cephRegion: string | undefined;
577
+ appConfig: ResolvedAppConfig | undefined;
325
578
  terminateSession: () => Promise<void>;
326
579
  validateSession: () => boolean;
327
580
  openstack: {
@@ -498,6 +751,7 @@ declare const domainScopedProcedure: _trpc_server.TRPCProcedureBuilder<AuroraPor
498
751
  }) => Promise<Awaited<_cobaltcore_dev_signal_openstack.SignalOpenstackSessionType | null>>;
499
752
  identityEndpoint: string;
500
753
  cephRegion: string | undefined;
754
+ appConfig: ResolvedAppConfig | undefined;
501
755
  terminateSession: () => Promise<void>;
502
756
  validateSession: () => boolean;
503
757
  openstack: {
@@ -653,12 +907,148 @@ interface ListVersionsOutput {
653
907
  maxKeys?: number;
654
908
  }
655
909
 
910
+ declare const ExternalFixedIpSchema: z.ZodObject<{
911
+ subnet_id: z.ZodString;
912
+ ip_address: z.ZodString;
913
+ }, z.core.$strip>;
914
+ declare const ExternalGatewayInfoSchema: z.ZodObject<{
915
+ network_id: z.ZodString;
916
+ enable_snat: z.ZodOptional<z.ZodBoolean>;
917
+ external_fixed_ips: z.ZodOptional<z.ZodArray<z.ZodObject<{
918
+ subnet_id: z.ZodString;
919
+ ip_address: z.ZodString;
920
+ }, z.core.$strip>>>;
921
+ qos_policy_id: z.ZodOptional<z.ZodNullable<z.ZodString>>;
922
+ }, z.core.$strip>;
923
+ declare const RouterSchema: z.ZodObject<{
924
+ id: z.ZodString;
925
+ name: z.ZodDefault<z.ZodString>;
926
+ description: z.ZodDefault<z.ZodOptional<z.ZodString>>;
927
+ status: z.ZodString;
928
+ admin_state_up: z.ZodBoolean;
929
+ external_gateway_info: z.ZodOptional<z.ZodNullable<z.ZodObject<{
930
+ network_id: z.ZodString;
931
+ enable_snat: z.ZodOptional<z.ZodBoolean>;
932
+ external_fixed_ips: z.ZodOptional<z.ZodArray<z.ZodObject<{
933
+ subnet_id: z.ZodString;
934
+ ip_address: z.ZodString;
935
+ }, z.core.$strip>>>;
936
+ qos_policy_id: z.ZodOptional<z.ZodNullable<z.ZodString>>;
937
+ }, z.core.$strip>>>;
938
+ routes: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodObject<{
939
+ destination: z.ZodString;
940
+ nexthop: z.ZodString;
941
+ }, z.core.$strip>>>>;
942
+ distributed: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
943
+ ha: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
944
+ enable_ndp_proxy: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
945
+ enable_default_route_bfd: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
946
+ enable_default_route_ecmp: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
947
+ availability_zone_hints: z.ZodOptional<z.ZodArray<z.ZodString>>;
948
+ availability_zones: z.ZodOptional<z.ZodArray<z.ZodString>>;
949
+ flavor_id: z.ZodOptional<z.ZodNullable<z.ZodString>>;
950
+ project_id: z.ZodString;
951
+ tenant_id: z.ZodOptional<z.ZodString>;
952
+ revision_number: z.ZodOptional<z.ZodNumber>;
953
+ tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
954
+ created_at: z.ZodOptional<z.core.$ZodBranded<z.ZodString, "ISO8601Timestamp", "out">>;
955
+ updated_at: z.ZodOptional<z.core.$ZodBranded<z.ZodString, "ISO8601Timestamp", "out">>;
956
+ }, z.core.$strip>;
957
+ declare const RouterPortSchema: z.ZodObject<{
958
+ id: z.ZodString;
959
+ name: z.ZodDefault<z.ZodOptional<z.ZodString>>;
960
+ network_id: z.ZodString;
961
+ device_owner: z.ZodString;
962
+ status: z.ZodEnum<{
963
+ DOWN: "DOWN";
964
+ ACTIVE: "ACTIVE";
965
+ BUILD: "BUILD";
966
+ ERROR: "ERROR";
967
+ }>;
968
+ admin_state_up: z.ZodOptional<z.ZodBoolean>;
969
+ mac_address: z.ZodOptional<z.ZodString>;
970
+ fixed_ips: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodObject<{
971
+ subnet_id: z.ZodString;
972
+ ip_address: z.ZodString;
973
+ }, z.core.$strip>>>>;
974
+ }, z.core.$strip>;
975
+ type Router = z.infer<typeof RouterSchema>;
976
+ type ExternalGatewayInfo = z.infer<typeof ExternalGatewayInfoSchema>;
977
+ type RouterPort = z.infer<typeof RouterPortSchema>;
978
+ type ExternalFixedIp = z.infer<typeof ExternalFixedIpSchema>;
979
+ /**
980
+ * Router as returned by `list`: the external gateway is enriched with the external network name
981
+ * and the subnet names of its fixed IPs, and the router's private networks are added.
982
+ * Names are undefined when they can't be resolved.
983
+ */
984
+ type RouterListItem = Omit<Router, "external_gateway_info"> & {
985
+ external_gateway_info?: (Omit<ExternalGatewayInfo, "external_fixed_ips"> & {
986
+ network_name?: string;
987
+ external_fixed_ips?: Array<ExternalFixedIp & {
988
+ subnet_name?: string;
989
+ }>;
990
+ }) | null;
991
+ /**
992
+ * Internal (private) networks the router is attached to via interfaces, deduplicated.
993
+ * `[]` = no interfaces, `undefined` = interfaces could not be resolved.
994
+ */
995
+ private_networks?: RouterPrivateNetwork[];
996
+ };
997
+ /** Router as returned by `getById`: external gateway enriched with network and subnet names. */
998
+ type RouterDetails = Omit<RouterListItem, "private_networks">;
999
+ /** A private network attached to a router via an interface port. */
1000
+ interface RouterPrivateNetwork {
1001
+ network_id: string;
1002
+ network_name?: string;
1003
+ }
1004
+ /** Router interface as returned to the UI: a port enriched with network name and subnet name/CIDR */
1005
+ interface RouterInterface {
1006
+ port_id: string;
1007
+ port_name: string;
1008
+ network_id: string;
1009
+ /** Undefined when the network name can't be resolved */
1010
+ network_name?: string;
1011
+ device_owner: string;
1012
+ status: RouterPort["status"];
1013
+ admin_state_up?: boolean;
1014
+ mac_address?: string;
1015
+ fixed_ips: Array<{
1016
+ subnet_id: string;
1017
+ subnet_name?: string;
1018
+ subnet_cidr?: string;
1019
+ ip_address: string;
1020
+ }>;
1021
+ }
1022
+ /** Which router-related Neutron extensions are enabled — drives conditional UI sections */
1023
+ interface RouterExtensionFlags {
1024
+ dvr: boolean;
1025
+ l3Ha: boolean;
1026
+ extraRoute: boolean;
1027
+ extGwMode: boolean;
1028
+ ndpProxy: boolean;
1029
+ externalGatewayMultihoming: boolean;
1030
+ availabilityZone: boolean;
1031
+ }
1032
+
656
1033
  declare const buildBaseRouter: (policyDir: string) => _trpc_server.TRPCBuiltRouter<{
657
1034
  ctx: AuroraPortalContext;
658
1035
  meta: object;
659
1036
  errorShape: _trpc_server.TRPCDefaultErrorShape;
660
1037
  transformer: false;
661
1038
  }, _trpc_server.TRPCDecorateCreateRouterOptions<{
1039
+ appConfig: _trpc_server.TRPCBuiltRouter<{
1040
+ ctx: AuroraPortalContext;
1041
+ meta: object;
1042
+ errorShape: _trpc_server.TRPCDefaultErrorShape;
1043
+ transformer: false;
1044
+ }, _trpc_server.TRPCDecorateCreateRouterOptions<{
1045
+ get: _trpc_server.TRPCQueryProcedure<{
1046
+ input: void;
1047
+ output: ResolvedAppConfig;
1048
+ meta: object;
1049
+ }>;
1050
+ }>>;
1051
+ }> & _trpc_server.TRPCDecorateCreateRouterOptions<{
662
1052
  network: _trpc_server.TRPCBuiltRouter<{
663
1053
  ctx: AuroraPortalContext;
664
1054
  meta: object;
@@ -1237,6 +1627,292 @@ declare const buildBaseRouter: (policyDir: string) => _trpc_server.TRPCBuiltRout
1237
1627
  meta: object;
1238
1628
  }>;
1239
1629
  };
1630
+ routers: {
1631
+ list: _trpc_server.TRPCQueryProcedure<{
1632
+ input: {
1633
+ project_id: string;
1634
+ name?: string | undefined;
1635
+ description?: string | undefined;
1636
+ admin_state_up?: boolean | undefined;
1637
+ sort_key?: "id" | "name" | "project_id" | "status" | "tenant_id" | "admin_state_up" | "flavor_id" | undefined;
1638
+ sort_dir?: "asc" | "desc" | undefined;
1639
+ tags?: string | undefined;
1640
+ tags_any?: string | undefined;
1641
+ not_tags?: string | undefined;
1642
+ not_tags_any?: string | undefined;
1643
+ searchTerm?: string | undefined;
1644
+ status?: string | undefined;
1645
+ has_gateway?: boolean | undefined;
1646
+ };
1647
+ output: RouterListItem[];
1648
+ meta: object;
1649
+ }>;
1650
+ getById: _trpc_server.TRPCQueryProcedure<{
1651
+ input: {
1652
+ project_id: string;
1653
+ router_id: string;
1654
+ };
1655
+ output: RouterDetails;
1656
+ meta: object;
1657
+ }>;
1658
+ create: _trpc_server.TRPCMutationProcedure<{
1659
+ input: {
1660
+ project_id: string;
1661
+ name: string;
1662
+ description?: string | undefined;
1663
+ admin_state_up?: boolean | undefined;
1664
+ external_gateway_info?: {
1665
+ network_id: string;
1666
+ enable_snat?: boolean | undefined;
1667
+ external_fixed_ips?: {
1668
+ subnet_id?: string | undefined;
1669
+ ip_address?: string | undefined;
1670
+ }[] | undefined;
1671
+ } | undefined;
1672
+ distributed?: boolean | undefined;
1673
+ ha?: boolean | undefined;
1674
+ availability_zone_hints?: string[] | undefined;
1675
+ enable_ndp_proxy?: boolean | undefined;
1676
+ };
1677
+ output: {
1678
+ id: string;
1679
+ name: string;
1680
+ description: string;
1681
+ status: string;
1682
+ admin_state_up: boolean;
1683
+ routes: {
1684
+ destination: string;
1685
+ nexthop: string;
1686
+ }[];
1687
+ project_id: string;
1688
+ external_gateway_info?: {
1689
+ network_id: string;
1690
+ enable_snat?: boolean | undefined;
1691
+ external_fixed_ips?: {
1692
+ subnet_id: string;
1693
+ ip_address: string;
1694
+ }[] | undefined;
1695
+ qos_policy_id?: string | null | undefined;
1696
+ } | null | undefined;
1697
+ distributed?: boolean | null | undefined;
1698
+ ha?: boolean | null | undefined;
1699
+ enable_ndp_proxy?: boolean | null | undefined;
1700
+ enable_default_route_bfd?: boolean | null | undefined;
1701
+ enable_default_route_ecmp?: boolean | null | undefined;
1702
+ availability_zone_hints?: string[] | undefined;
1703
+ availability_zones?: string[] | undefined;
1704
+ flavor_id?: string | null | undefined;
1705
+ tenant_id?: string | undefined;
1706
+ revision_number?: number | undefined;
1707
+ tags?: string[] | undefined;
1708
+ created_at?: (string & zod.$brand<"ISO8601Timestamp">) | undefined;
1709
+ updated_at?: (string & zod.$brand<"ISO8601Timestamp">) | undefined;
1710
+ };
1711
+ meta: object;
1712
+ }>;
1713
+ update: _trpc_server.TRPCMutationProcedure<{
1714
+ input: {
1715
+ project_id: string;
1716
+ router_id: string;
1717
+ name?: string | undefined;
1718
+ description?: string | undefined;
1719
+ admin_state_up?: boolean | undefined;
1720
+ routes?: {
1721
+ destination: string;
1722
+ nexthop: string;
1723
+ }[] | undefined;
1724
+ distributed?: boolean | undefined;
1725
+ ha?: boolean | undefined;
1726
+ enable_ndp_proxy?: boolean | undefined;
1727
+ };
1728
+ output: {
1729
+ id: string;
1730
+ name: string;
1731
+ description: string;
1732
+ status: string;
1733
+ admin_state_up: boolean;
1734
+ routes: {
1735
+ destination: string;
1736
+ nexthop: string;
1737
+ }[];
1738
+ project_id: string;
1739
+ external_gateway_info?: {
1740
+ network_id: string;
1741
+ enable_snat?: boolean | undefined;
1742
+ external_fixed_ips?: {
1743
+ subnet_id: string;
1744
+ ip_address: string;
1745
+ }[] | undefined;
1746
+ qos_policy_id?: string | null | undefined;
1747
+ } | null | undefined;
1748
+ distributed?: boolean | null | undefined;
1749
+ ha?: boolean | null | undefined;
1750
+ enable_ndp_proxy?: boolean | null | undefined;
1751
+ enable_default_route_bfd?: boolean | null | undefined;
1752
+ enable_default_route_ecmp?: boolean | null | undefined;
1753
+ availability_zone_hints?: string[] | undefined;
1754
+ availability_zones?: string[] | undefined;
1755
+ flavor_id?: string | null | undefined;
1756
+ tenant_id?: string | undefined;
1757
+ revision_number?: number | undefined;
1758
+ tags?: string[] | undefined;
1759
+ created_at?: (string & zod.$brand<"ISO8601Timestamp">) | undefined;
1760
+ updated_at?: (string & zod.$brand<"ISO8601Timestamp">) | undefined;
1761
+ };
1762
+ meta: object;
1763
+ }>;
1764
+ setGateway: _trpc_server.TRPCMutationProcedure<{
1765
+ input: {
1766
+ project_id: string;
1767
+ router_id: string;
1768
+ external_gateway_info: {
1769
+ network_id: string;
1770
+ enable_snat?: boolean | undefined;
1771
+ external_fixed_ips?: {
1772
+ subnet_id?: string | undefined;
1773
+ ip_address?: string | undefined;
1774
+ }[] | undefined;
1775
+ };
1776
+ };
1777
+ output: {
1778
+ id: string;
1779
+ name: string;
1780
+ description: string;
1781
+ status: string;
1782
+ admin_state_up: boolean;
1783
+ routes: {
1784
+ destination: string;
1785
+ nexthop: string;
1786
+ }[];
1787
+ project_id: string;
1788
+ external_gateway_info?: {
1789
+ network_id: string;
1790
+ enable_snat?: boolean | undefined;
1791
+ external_fixed_ips?: {
1792
+ subnet_id: string;
1793
+ ip_address: string;
1794
+ }[] | undefined;
1795
+ qos_policy_id?: string | null | undefined;
1796
+ } | null | undefined;
1797
+ distributed?: boolean | null | undefined;
1798
+ ha?: boolean | null | undefined;
1799
+ enable_ndp_proxy?: boolean | null | undefined;
1800
+ enable_default_route_bfd?: boolean | null | undefined;
1801
+ enable_default_route_ecmp?: boolean | null | undefined;
1802
+ availability_zone_hints?: string[] | undefined;
1803
+ availability_zones?: string[] | undefined;
1804
+ flavor_id?: string | null | undefined;
1805
+ tenant_id?: string | undefined;
1806
+ revision_number?: number | undefined;
1807
+ tags?: string[] | undefined;
1808
+ created_at?: (string & zod.$brand<"ISO8601Timestamp">) | undefined;
1809
+ updated_at?: (string & zod.$brand<"ISO8601Timestamp">) | undefined;
1810
+ };
1811
+ meta: object;
1812
+ }>;
1813
+ clearGateway: _trpc_server.TRPCMutationProcedure<{
1814
+ input: {
1815
+ project_id: string;
1816
+ router_id: string;
1817
+ };
1818
+ output: {
1819
+ id: string;
1820
+ name: string;
1821
+ description: string;
1822
+ status: string;
1823
+ admin_state_up: boolean;
1824
+ routes: {
1825
+ destination: string;
1826
+ nexthop: string;
1827
+ }[];
1828
+ project_id: string;
1829
+ external_gateway_info?: {
1830
+ network_id: string;
1831
+ enable_snat?: boolean | undefined;
1832
+ external_fixed_ips?: {
1833
+ subnet_id: string;
1834
+ ip_address: string;
1835
+ }[] | undefined;
1836
+ qos_policy_id?: string | null | undefined;
1837
+ } | null | undefined;
1838
+ distributed?: boolean | null | undefined;
1839
+ ha?: boolean | null | undefined;
1840
+ enable_ndp_proxy?: boolean | null | undefined;
1841
+ enable_default_route_bfd?: boolean | null | undefined;
1842
+ enable_default_route_ecmp?: boolean | null | undefined;
1843
+ availability_zone_hints?: string[] | undefined;
1844
+ availability_zones?: string[] | undefined;
1845
+ flavor_id?: string | null | undefined;
1846
+ tenant_id?: string | undefined;
1847
+ revision_number?: number | undefined;
1848
+ tags?: string[] | undefined;
1849
+ created_at?: (string & zod.$brand<"ISO8601Timestamp">) | undefined;
1850
+ updated_at?: (string & zod.$brand<"ISO8601Timestamp">) | undefined;
1851
+ };
1852
+ meta: object;
1853
+ }>;
1854
+ addInterface: _trpc_server.TRPCMutationProcedure<{
1855
+ input: {
1856
+ project_id: string;
1857
+ router_id: string;
1858
+ subnet_id?: string | undefined;
1859
+ port_id?: string | undefined;
1860
+ };
1861
+ output: {
1862
+ id: string;
1863
+ port_id: string;
1864
+ subnet_id?: string | undefined;
1865
+ subnet_ids?: string[] | undefined;
1866
+ network_id?: string | undefined;
1867
+ project_id?: string | undefined;
1868
+ tenant_id?: string | undefined;
1869
+ tags?: string[] | undefined;
1870
+ };
1871
+ meta: object;
1872
+ }>;
1873
+ removeInterface: _trpc_server.TRPCMutationProcedure<{
1874
+ input: {
1875
+ project_id: string;
1876
+ router_id: string;
1877
+ subnet_id?: string | undefined;
1878
+ port_id?: string | undefined;
1879
+ };
1880
+ output: {
1881
+ id: string;
1882
+ port_id: string;
1883
+ subnet_id?: string | undefined;
1884
+ subnet_ids?: string[] | undefined;
1885
+ network_id?: string | undefined;
1886
+ project_id?: string | undefined;
1887
+ tenant_id?: string | undefined;
1888
+ tags?: string[] | undefined;
1889
+ };
1890
+ meta: object;
1891
+ }>;
1892
+ delete: _trpc_server.TRPCMutationProcedure<{
1893
+ input: {
1894
+ project_id: string;
1895
+ router_id: string;
1896
+ };
1897
+ output: boolean;
1898
+ meta: object;
1899
+ }>;
1900
+ listInterfaces: _trpc_server.TRPCQueryProcedure<{
1901
+ input: {
1902
+ project_id: string;
1903
+ router_id: string;
1904
+ };
1905
+ output: RouterInterface[];
1906
+ meta: object;
1907
+ }>;
1908
+ listExtensions: _trpc_server.TRPCQueryProcedure<{
1909
+ input: {
1910
+ project_id: string;
1911
+ };
1912
+ output: RouterExtensionFlags;
1913
+ meta: object;
1914
+ }>;
1915
+ };
1240
1916
  }>>;
1241
1917
  }> & _trpc_server.TRPCDecorateCreateRouterOptions<{
1242
1918
  project: _trpc_server.TRPCBuiltRouter<{
@@ -1877,6 +2553,19 @@ declare const buildBaseRouter: (policyDir: string) => _trpc_server.TRPCBuiltRout
1877
2553
  input: {
1878
2554
  project_id: string;
1879
2555
  };
2556
+ output: {
2557
+ id: string;
2558
+ access: string;
2559
+ user_id: string;
2560
+ project_id: string;
2561
+ };
2562
+ meta: object;
2563
+ }>;
2564
+ reveal: _trpc_server.TRPCMutationProcedure<{
2565
+ input: {
2566
+ project_id: string;
2567
+ credentialId: string;
2568
+ };
1880
2569
  output: {
1881
2570
  id: string;
1882
2571
  access: string;
@@ -1909,6 +2598,8 @@ declare const buildBaseRouter: (policyDir: string) => _trpc_server.TRPCBuiltRout
1909
2598
  };
1910
2599
  output: {
1911
2600
  hasCredentials: boolean;
2601
+ endpoint: string;
2602
+ region: string;
1912
2603
  };
1913
2604
  meta: object;
1914
2605
  }>;
@@ -3736,4 +4427,4 @@ declare function validateOpenstackService(service: unknown, serviceName: string)
3736
4427
  */
3737
4428
  declare const parseOrThrow: <S extends ZodTypeAny>(schema: S, data: unknown, context: string) => output<S>;
3738
4429
 
3739
- export { type AuroraRouter, type AuroraRouterWithCustom, type AuroraServerConfig, auroraRouter, createServer, domainScopedInputSchema, domainScopedProcedure, parseOrThrow, projectScopedInputSchema, projectScopedProcedure, protectedProcedure, publicProcedure, validateOpenstackService };
4430
+ export { type AppConfigBase, type AuroraAppConfig, type AuroraRouter, type AuroraRouterWithCustom, type AuroraServerConfig, type DomainOverride, type FeatureBag, type ResolvedAppConfig, SLOT_NAMES, type ServiceFeatureMap, type SlotConfigEntry, type SlotName, type Visibility, type VisibilityDelta, auroraAppConfigSchema, auroraRouter, createServer, domainScopedInputSchema, domainScopedProcedure, parseOrThrow, projectScopedInputSchema, projectScopedProcedure, protectedProcedure, publicProcedure, resolveAppConfig, validateOpenstackService };