Four purely-additive seams that let build-time tooling extend host behaviour without forking files: * `src/access.extensions.ts` — identity `applyAccessExtensions` (mirrors `config/routes.extensions.ts`). `src/access.ts` runs the resolved predicate object through it. Adds two new predicates, `canSeeOrgAdmin` and `canManageCurrentOrg`, alongside the existing `canSeeAdmin`. Resources, Models children, Cluster Management, and Resources/Backends are retagged from `canSeeAdmin` to `canSeeOrgAdmin`. Users and Dashboard stay strict. * `src/request.extensions.ts` — identity-empty `extraRequestInterceptors`. `src/request-config.tsx` spreads it into the existing `requestInterceptors` list so extensions can inject context-aware headers without forking the request config. * Users page action column — renders `getGPUStackPlugin()?.components?.UserRowActions` next to the existing DropdownButtons inside a Space when a plugin component is registered. If absent, the cell renders exactly as before. * `src/components/plugin-extra-fields.tsx` — generic component-slot helper. Renders `pluginManager.components.<name>` if registered, forwarding a `context` payload. Used by create/edit forms to let plugins inject extra `Form.Item` fields. Mounted in the relevant create forms — API Keys, Cloud Credentials, Clusters, Model Routes, Model Providers, and Inference Backends — under the slot name `CreateOrgScopeField`. Resources whose org is implicit from a parent (Models / Workers / Benchmarks / Worker Pools / Model Files inherit from the chosen Cluster) deliberately don't mount the slot.
16 lines
681 B
TypeScript
16 lines
681 B
TypeScript
// Identity hook for build-time request-interceptor extensions. Tooling
|
|
// may overwrite this file to inject extra interceptors (e.g. context
|
|
// headers); the original is restored on cleanup. Mirrors
|
|
// `src/access.extensions.ts` and `config/routes.extensions.ts`.
|
|
//
|
|
// Each interceptor follows the umi/max signature: it receives
|
|
// `(url, options)` and returns `{ url, options }` — typed loosely
|
|
// here so this file has no dependency on the framework's exact
|
|
// option types.
|
|
export type RequestInterceptor = (
|
|
url: string,
|
|
options: Record<string, any>
|
|
) => { url: string; options: Record<string, any> };
|
|
|
|
export const extraRequestInterceptors: RequestInterceptor[] = [];
|