diff --git a/.changeset/25922-app-shell-retire-unreferenced-exports.md b/.changeset/25922-app-shell-retire-unreferenced-exports.md new file mode 100644 index 00000000000..5ab372ef152 --- /dev/null +++ b/.changeset/25922-app-shell-retire-unreferenced-exports.md @@ -0,0 +1,47 @@ +--- +'@object-ui/app-shell': patch +--- + +refactor(app-shell)!: retire the 54 root-entry exports that nothing outside the package names + +`@object-ui/app-shell`'s root entry published 261 names. 57 of them appear in no file of this repository outside `ui/packages/app-shell/` (the measure covers `ui/`, `packages/` and `apps/`); three of those are taken by the package's own README examples and stay (`SignUpOffer`, `RuntimeBranding`, `studioOrgScopePath`). The other 54 leave the entry. Every module that defines them stays, and code inside the package keeps importing them from there; only the package entry stops publishing them. The entry now publishes 209 names (207, plus `InvitationSignUpPrompt` and `isDefaultProductName`, which main added meanwhile). + +Clause-②: yes (narrowing) +Metadata-protocol: none + + + +**BREAKING** (an export retirement), shipped as `patch`: no metadata protocol kind moves. An importer of a retired name gets `TS2305` ("has no exported member") at its import line. + +Migration. A retired type that describes a name the entry still exports is derived from that name; everything else has no replacement on the entry. + +- FROM `UseUrlOverlayOptions` TO `Parameters[1]`. +- FROM `UrlOverlayControls` TO `ReturnType`. +- FROM `SettleSignalState` TO `ReturnType`. +- FROM `AiSurfaceState` TO `ReturnType`. +- FROM `CommandPaletteContextValue` TO `ReturnType`. +- FROM `RecentItemInput` TO `Parameters['addRecentItem']>[0]`. +- FROM `RecentTextItem` TO `Extract`. +- FROM `RecentItemLabelResolver` TO `ReturnType`. +- FROM `DeclaredHomeApp` TO `NonNullable[0]>[number]`. +- FROM `RuntimeFeatures` TO `AppShellRuntimeConfig['features']`. +- FROM `SignUpOfferContext` TO `Parameters[1]`. +- FROM `HydratedUIMessage` TO `ReturnType[number]`. +- FROM `AppComponentRegistryEntry` TO `Parameters[0]`. +- FROM `MetadataPreviewProps` TO `ComponentProps` (`ComponentProps` from `react`). +- FROM `MetadataInspectorProps` TO `ComponentProps`. +- FROM `StudioCanvasPreview` TO `Parameters[1]`. +- FROM `StudioCanvasPreviewProps` TO `ComponentProps[1]>`. +- FROM `StudioDesignSurfaceProps` TO `ComponentProps`. +- FROM `PreviewBadgeProps` TO `ComponentProps`. +- FROM `RedirectWithSplashProps` TO `ComponentProps`. +- FROM `RecordFormPageProps` TO `ComponentProps`. +- FROM `DeclaredActionsBarProps` TO `ComponentProps`. +- FROM `useExpressionContext`, `ExpressionContextValue`, `isIdle`, `ObjectUiGlobal`, `isOverrideOnlyViewer`, `actionAdmittedByOverride`, `bypassedApproverNames`, `toastWithUndo`, `ToastWithUndoOptions`, `getCloudBase`, `getBrandColor`, `isRuntimeConfigInitialised` TO nothing (no replacement on the entry). +- FROM `addNavigationItem`, `removeNavigationItems`, `renameNavigationItems`, `navigationEqual`, `generateNavId` TO nothing (no replacement on the entry). +- FROM `listAppComponents`, `urlSegmentsToComponentRef` TO nothing (no replacement on the entry): `getAppComponent` and `componentRefToUrlSegments` stay. +- FROM `MetadataPageShell`, `listMetadataResources`, `useMetadataTypes`, `useTypesIndex`, `matchesQuery` TO nothing (no replacement on the entry): `getMetadataResource`, `useMetadataClient` and `useGlobalDiagnostics` stay. +- FROM `getStudioCanvasPreview`, `listStudioCanvasPreviewTypes`, `StudioObjectRecordsCanvas` TO nothing (no replacement on the entry): `registerStudioCanvasPreview` stays. +- FROM `useAssistant`, `useRegisterAssistantEditor`, `requestAssistantOpen`, `AssistantEditorContext`, `AssistantEditorField` TO nothing (no replacement on the entry): `assistantBus` stays. + +`ui/docs/app-shell-extraction-guide.md`, the package's architecture guide, is rewritten to describe the package that ships: what each directory holds, the groups of names the entry publishes, its load-time registrations, its dependencies, and its three consumers in this repository. diff --git a/ui/docs/app-shell-extraction-guide.md b/ui/docs/app-shell-extraction-guide.md index 62b9efc0dc6..37cd4ec9c62 100644 --- a/ui/docs/app-shell-extraction-guide.md +++ b/ui/docs/app-shell-extraction-guide.md @@ -1,35 +1,98 @@ -# Console Streamlining - Architecture Guide +# `@object-ui/app-shell` — Architecture Guide ## Overview -This document describes the refactored architecture that enables third-party systems to use ObjectUI components without inheriting the full console infrastructure. - -## New Packages - -### @object-ui/app-shell - -**Purpose**: Minimal application rendering engine - -**Exports**: -- `AppShell` - Basic layout container -- `ObjectView` - Renders object views; it reads `objectName` from the router - (`useParams()`) and takes an `objects` metadata array. For a router-free embed, - use `ObjectView` from `@object-ui/plugin-view` instead - see the examples below. -- `DashboardView` - Renders a dashboard by name. The dashboard renderer itself, - `DashboardRenderer`, is not an app-shell export - it ships from - `@object-ui/plugin-dashboard`, and `DashboardView` renders through it. -- `PageView` - Renders a custom page by name. No package exports a - `PageRenderer`: a page body is dispatched through the component registry on - the schema node's `type` (`page`, `app`, `utility`, `home`, `record`). -- `RecordFormPage` - Renders a full-screen create/edit page. No package exports - a `FormRenderer`; the exported form renderer is `ObjectForm` from - `@object-ui/plugin-form`, which this page delegates to. - -**Dependencies**: `@object-ui/react`, `@object-ui/components`, `@object-ui/fields`, `@object-ui/layout` - -**Bundle Size**: ~50KB - -### @object-ui/providers +This document describes `@object-ui/app-shell` as it ships today, and the two +ways a host uses it: compose the full console from its building blocks, or take +only the layout container and bring your own routing, auth and backend. + +The package started as a minimal rendering engine for third-party hosts. It has +since become the home of the console itself: its routing tree, its auth and +organization pages, Studio, the metadata admin engine, the marketplace and the +AI chat pages all live here, and `apps/console` composes them. The sections +below describe that package, not the original plan. + +## What the package contains + +### `@object-ui/app-shell` + +**Entry**: one root entry, `.` (`src/index.ts`), plus `./styles.css`. There are +no subpath exports. + +**Size** (non-test TypeScript under `src/`): about 211,000 lines in about 600 +files, with about 1,700 test files beside them. By directory: + +| Directory | Lines | What it holds | +|:---|---:|:---| +| `views/metadata-admin` | ~97,000 | The generic metadata admin engine: directory, list, edit, history and diagnostics pages, the schema form, the per-type previews and inspectors, and its own designer string table (`i18n.ts`) | +| `views/studio-design` | ~22,000 | The Studio WYSIWYG design surface, its per-type canvases and the builder landing page | +| `views/` (the rest) | ~27,000 | The inner-SPA views: `ObjectView`, `RecordDetailView`, `RecordFormPage`, `DashboardView`, `PageView`, `ReportView`, search, flows, approvals | +| `console/` | ~22,000 | The console routing tree (`AppContent`, `ConsoleShell`) and its pages: auth, home, organizations, marketplace, AI chat | +| `hooks/`, `layout/`, `utils/`, `providers/`, `chrome/`, `context/`, the rest | ~43,000 | Shell chrome (header, sidebar, command palette, toasts), the metadata, adapter and expression providers, navigation and user-state hooks, runtime configuration and observability | + +**Exports**: the root entry publishes about 200 names (about 35 of them +type-only). They fall into these groups, in the order `src/index.ts` lists +them: + +- **The minimal shell** — `AppShell` (layout container) and its + `MinimalAppShellProps`. +- **Providers and hooks** — `AdapterProvider`, `MetadataProvider`, + `ExpressionProvider`, the settle signal (`useSettleSignal`, `whenIdle`, …), + recent items, favorites, navigation pins and sync, the AI-surface signal. +- **Console building blocks** — `ConsoleShell`, `ConnectedShell`, + `AuthenticatedRoute`, `RequireOrganization`, `SystemRedirect`, + `SetupRedirect`, and the host-app route policy (`resolveHostAppSegment`). +- **Layout chrome and top-level chrome** — `ConsoleLayout`, `AppHeader`, + `UnifiedSidebar`, `ConsolePageHeader`, `CommandPalette`, `ConsoleToaster`, + `ErrorBoundary`, `ThemeProvider`, the unsaved-edits guard. +- **Runtime configuration and observability** — `initRuntimeConfig`, + `getRuntimeConfig` and the branding / stage readers; Sentry wiring. +- **Inner-SPA views** — `ObjectView`, `RecordDetailView`, `RecordFormPage`, + `DashboardView`, `PageView`, `ReportView`, `SearchResultsPage`, + `FlowRunner`. +- **Default pages** — `DefaultAppContent`, `DefaultLoginPage`, + `DefaultRegisterPage`, `DefaultHomePage`, the organization pages, + `MarketplacePage`, `AiChatPage`, with the sign-up decision they share + (`decideSignUpOffer`). +- **Registries** — the app component registry (`registerAppComponent`), the + metadata resource, preview and inspector registries, and the Studio canvas + registry, so a plugin can override a page without forking it. +- **Metadata admin and Studio pages** — `MetadataDirectoryPage`, + `MetadataResourceRouter`, `SchemaForm`, `StudioDesignSurface`, + `BuilderLanding`, `PackagedAutomationPage`. +- **AI assistant bus** — `assistantBus`, connecting the metadata designers to + the chat. + +The [package README](../packages/app-shell/README.md) is the API reference for +these names. + +**Load-time registrations**: importing the entry registers, as a side effect, +the built-in admin components, the console's SDUI widgets (cloud connection, +product blocks, diagnostics), the record blocks (`record:attachments`, +`record:approvals`, `record:approval_decision`), the global search, +notifications, app launcher and nav menu blocks, and the metadata admin +built-ins. The built-in metadata designers load from a deferred chunk on the +first read of a designer registry, not during the entry's evaluation; the +console's first-load budget (`scripts/check-eager-closure-budget.mjs`) is sized +on that. + +**Dependencies**: `@object-ui/react`, `@object-ui/components`, +`@object-ui/fields`, `@object-ui/layout`, `@object-ui/core`, +`@object-ui/types`, `@object-ui/i18n`, `@object-ui/auth`, +`@object-ui/permissions`, `@object-ui/providers`, +`@object-ui/data-objectstack`, `@object-ui/collaboration`, +`@object-ui/plugin-editor`, `@objectstack/spec`, `@objectstack/formula`, +`@objectstack/lint`; the view plugins (`plugin-grid`, `plugin-list`, +`plugin-form`, `plugin-detail`, `plugin-view`, `plugin-dashboard`, +`plugin-calendar`, `plugin-kanban`, `plugin-charts`, `plugin-report`, +`plugin-designer`, `plugin-chatbot`) are peer dependencies. + +**Bundle size**: not one number. A host that imports only `AppShell` still +evaluates the entry and its load-time registrations; the console's eager +closure is measured and budgeted by `scripts/check-eager-closure-budget.mjs`, +not by this page. + +### `@object-ui/providers` **Purpose**: The upload adapter context @@ -44,111 +107,84 @@ Its former `DataSourceProvider`, `MetadataProvider` and `ThemeProvider` retired **Dependencies**: `@object-ui/types` -## Architecture Diagram - -``` -┌─────────────────────────────────────────┐ -│ Third-Party Application │ -│ (Your Custom Console) │ -└────────────────┬────────────────────────┘ - │ - ├── Custom Routing (React Router, Next.js, etc.) - ├── Custom Auth (Your implementation) - ├── Custom API (REST, GraphQL, etc.) - │ -┌────────────────┴────────────────────────┐ -│ @object-ui/app-shell │ -│ - AppShell │ -│ - ObjectView │ -│ - DashboardView │ -│ - PageView │ -│ - RecordFormPage │ -└────────────────┬────────────────────────┘ - │ -┌────────────────┴────────────────────────┐ -│ @object-ui/react │ -│ - SchemaRenderer │ -│ - SchemaRendererProvider (data source) │ -│ - ThemeProvider │ -│ - useActionRunner │ -│ - Component Registry │ -└────────────────┬────────────────────────┘ - │ - ├──────────────┬──────────────┬──────────────┐ - │ │ │ │ -┌────────────────┴──┐ ┌────────┴────┐ ┌──────┴────┐ ┌─────┴──────┐ -│ @object-ui/ │ │ @object-ui/ │ │@object-ui/│ │ Plugins │ -│ components │ │ fields │ │ layout │ │ (optional) │ -│ (Shadcn UI) │ │ (Inputs) │ │ (Layouts) │ │ │ -└───────────────────┘ └─────────────┘ └───────────┘ └────────────┘ -``` +## Who consumes it -## Comparison: Before vs After +Inside this repository three workspace members depend on the package: -### Before (Monolithic Console) +- `apps/console` — the product console. It imports about 75 names from the + root entry, and composes the routing tree mostly through + `DefaultAppContent`, so components such as `ObjectView` and `ConsoleLayout` + reach it through that tree rather than by name. +- [`examples/console-starter`](../examples/console-starter/README.md) — the + minimal full console: `ConsoleShell`, `AuthenticatedRoute`, the `Default*` + pages and `DefaultAppContent`. +- [`examples/byo-backend-console`](../examples/byo-backend-console/README.md) — + the bring-your-own-backend embed. It imports `AppShell` only and renders data + through `@object-ui/plugin-view` and `@object-ui/react`. -``` -apps/console (500KB+) -├── Routing (hardcoded) -├── Auth (ObjectStack only) -├── Data Source (ObjectStack only) -├── Admin Pages (forced) -├── App Management (forced) -└── Object Rendering -``` +A name the root entry exports that nothing outside the package names is retired +from the entry, not kept for a caller that may come: the module that defines it +stays, and in-package code imports it from there. -**Problems**: -- Cannot use without full console -- Tied to ObjectStack backend -- No customization of routing/auth -- Large bundle size - -### After (Modular Architecture) +## Architecture Diagram ``` -@object-ui/app-shell (50KB) -├── Object Rendering -├── Dashboard Rendering -├── Page Rendering -└── Form Rendering - -@object-ui/react -├── SchemaRendererProvider (generic DataSource) -└── ThemeProvider - -Third-Party App -├── Custom Routing -├── Custom Auth -├── Custom API -└── Cherry-picked Components +┌────────────────────────────────────────────────┐ +│ Host │ +│ apps/console · examples/console-starter │ +│ (or your own app — see byo-backend-console) │ +└───────────────────────┬────────────────────────┘ + │ +┌───────────────────────┴────────────────────────┐ +│ @object-ui/app-shell │ +│ - AppShell (minimal layout container) │ +│ - ConsoleShell / DefaultAppContent (routing) │ +│ - Default pages: auth, home, orgs, AI chat │ +│ - Inner-SPA views: ObjectView, RecordDetail… │ +│ - Metadata admin engine + Studio │ +│ - Providers, chrome, registries │ +└───────────────────────┬────────────────────────┘ + │ +┌───────────────────────┴────────────────────────┐ +│ @object-ui/react │ +│ - SchemaRenderer │ +│ - SchemaRendererProvider (data source) │ +│ - ThemeProvider │ +│ - useActionRunner │ +│ - Component Registry │ +└───────────────────────┬────────────────────────┘ + │ + ┌──────────────┬───┴──────────┬──────────────┐ + │ │ │ │ +┌────┴──────┐ ┌─────┴─────┐ ┌──────┴────┐ ┌───────┴──────┐ +│@object-ui/│ │@object-ui/│ │@object-ui/│ │ View plugins │ +│components │ │ fields │ │ layout │ │ (peer deps) │ +└───────────┘ └───────────┘ └───────────┘ └──────────────┘ ``` -**Benefits**: -- Use components independently -- Bring your own backend -- Full customization -- Small bundle size - -## Migration Path +## Two ways to use it -### Phase 1: New Packages (Current) +### The full console -1. Create `@object-ui/app-shell` -2. Create `@object-ui/providers` -3. Create `examples/byo-backend-console` -4. No breaking changes to console +Compose the console's routing tree from the building blocks, as +`examples/console-starter` does: `ConsoleShell` around `AuthenticatedRoute`, +the `Default*` pages, and `DefaultAppContent` for the app routes. This brings +the whole package: its auth flow against the ObjectStack backend, Studio, the +metadata admin pages and the marketplace. -### Phase 2: Extract More Components (Future) +### Bring your own backend -1. Create `@object-ui/console-components` -2. Create `@object-ui/routing` -3. More examples (Next.js, Embedded) +Take `AppShell` for the layout and render data with the view plugins and +`@object-ui/react` against your own `DataSource`, as +`examples/byo-backend-console` and the examples below do. Routing, auth and the +API are yours. The view to embed is `ObjectView` from +`@object-ui/plugin-view`; app-shell's own `ObjectView` reads `objectName` from +the router (`useParams()`) and is meant for the console's route tree. -### Phase 3: Refactor Console (Future) - -1. Console uses new packages internally -2. Reduce console to ~150 lines -3. Console becomes reference implementation +The package's direction — what stays in a product-neutral renderer and what is +console product — is recorded in +[ADR-0060](./adr/0060-product-neutral-renderer.md) and held by +`packages/app-shell/src/__tests__/product-neutral-renderer.ratchet.test.ts`. ## Usage Examples @@ -329,55 +365,23 @@ export const myDataSource: DataSource = { }; ``` -## Testing Strategy - -### Unit Tests - -- Each package has its own test suite -- No cross-package dependencies in tests -- Mock data sources for testing - -### Integration Tests +## Testing -- Test byo-backend-console example end-to-end -- Verify custom data source integration -- Test routing scenarios - -### E2E Tests - -- Separate E2E tests for byo-backend-console -- Verify it works independently of full console +- Each package has its own suite: `pnpm --filter @object-ui/app-shell test` + runs app-shell's, from the `ui/` root (`vitest run --root ../..`). +- The code blocks on this page are type-checked by + `scripts/check-doc-snippet-types.mjs`, and every symbol a published README + imports is checked against the package's built types by + `scripts/check-readme-exports.mjs`. +- `examples/console-starter` carries its own tests under `test/`. ## Documentation -### Package READMEs - -Each package has comprehensive documentation: -- Installation -- Usage examples -- API reference -- Migration guide - -### Examples - -- `examples/byo-backend-console` - Basic integration (~100 lines) -- `examples/nextjs-console` - Next.js integration (TODO) -- `examples/embedded-widget` - Embedded usage (TODO) - -### Guides - -- Architecture Guide (this document) -- Integration Guide -- Migration Guide for console users -- Cookbook for common patterns - -## Success Metrics - -- ✅ Third-party developer can build console in < 1 hour -- ✅ Minimal bundle size < 200KB (vs current 500KB+) -- ✅ Zero ObjectStack dependencies for core rendering -- ⏳ 100% test coverage for extracted packages -- ✅ At least 1 working integration example +- [`@object-ui/app-shell` README](../packages/app-shell/README.md) — the API + reference for the root entry's names. +- [`examples/README.md`](../examples/README.md) — which example to start from. +- [ADR-0060](./adr/0060-product-neutral-renderer.md) — the product-neutral + renderer direction. ## License diff --git a/ui/packages/app-shell/src/chrome/toast-helpers.ts b/ui/packages/app-shell/src/chrome/toast-helpers.ts index 5a61b4dcfb3..c95015c8e99 100644 --- a/ui/packages/app-shell/src/chrome/toast-helpers.ts +++ b/ui/packages/app-shell/src/chrome/toast-helpers.ts @@ -22,7 +22,7 @@ * * Usage: * - * import { toastWithUndo } from '@object-ui/app-shell'; + * import { toastWithUndo } from './chrome/toast-helpers.js'; // from `src/`; not on the package entry * * toastWithUndo('Lead deleted', { * onUndo: () => dataSource.restore('lead', id), diff --git a/ui/packages/app-shell/src/index.ts b/ui/packages/app-shell/src/index.ts index 0ea5a7c538d..0f7ce97b7af 100644 --- a/ui/packages/app-shell/src/index.ts +++ b/ui/packages/app-shell/src/index.ts @@ -11,7 +11,7 @@ export { AppShell } from './components/AppShell.js'; // Providers export { AdapterProvider, useAdapter } from './providers/AdapterProvider.js'; export { MetadataProvider, useMetadata, useMetadataItem } from './providers/MetadataProvider.js'; -export { ExpressionProvider, useExpressionContext, evaluateVisibility } from './providers/ExpressionProvider.js'; +export { ExpressionProvider, evaluateVisibility } from './providers/ExpressionProvider.js'; /** * The `user` normalisation `ExpressionProvider` is fed with — exported so every * console surface that mounts the provider publishes the SAME `current_user` @@ -33,17 +33,13 @@ export { buildExpressionUser } from './providers/expressionUser.js'; // Hooks export { useObjectActions } from './hooks/useObjectActions.js'; export { useUrlOverlay } from './hooks/useUrlOverlay.js'; -export type { UseUrlOverlayOptions, UrlOverlayControls } from './hooks/useUrlOverlay.js'; export { useSettleSignal } from './hooks/useSettleSignal.js'; -export type { SettleSignalState } from './hooks/useSettleSignal.js'; export { getPendingRequests, - isIdle, subscribeSettle, whenIdle, withSettleSignal, installSettleSignalGlobal, - type ObjectUiGlobal, } from './observability/settleSignal.js'; export { useRecentItems } from './hooks/useRecentItems.js'; // From its own module, not the `useRecentItems` shim: it reads the metadata @@ -61,18 +57,11 @@ export type { MetadataTypeStatus, } from './providers/MetadataProvider.js'; -export type { - ExpressionContextValue, -} from './providers/ExpressionProvider.js'; - export type { RecentItem, - RecentItemInput, RecentItemType, RecentNamedItem, - RecentTextItem, } from './hooks/useRecentItems.js'; -export type { RecentItemLabelResolver } from './hooks/useRecentItemLabel.js'; // Console building blocks — compose these in your App.tsx to build the console // routing tree. See examples/console-starter/src/App.tsx for a minimal example. @@ -104,10 +93,7 @@ export { resolveHostAppSegment, appRouteSegment, filterActiveApps } from './util // objectui#5178 — the Approval Center's timeline reads the same `via_override` // verdict the record page's approval panel does. export { - isOverrideOnlyViewer, - actionAdmittedByOverride, isOverrideDecision, - bypassedApproverNames, isViaOverrideRow, } from './utils/index.js'; // objectui#7256 — "where is home". `apps/console`'s `/` redirect layers its @@ -115,7 +101,6 @@ export { // affordances use, so the post-login landing and the top-bar logo cannot name // two different homes. export { HOME_LAUNCHER_PATH, resolveDeclaredHomePath } from './utils/index.js'; -export type { DeclaredHomeApp } from './utils/index.js'; // `a810bb2ae` — ONE read of the ADR-0112 failure envelope, published so a // consumer OUTSIDE this package inherits the pinned rule instead of writing a @@ -137,7 +122,6 @@ export { readEnvelopeFailureText } from './utils/apiErrorEnvelope.js'; // point gates on (FAB, /ai routes, designer "Ask AI"). Server-pushed, no // build-time edition flag. See ./hooks/useAiSurface. export { useAiSurfaceEnabled } from './hooks/useAiSurface.js'; -export type { AiSurfaceState } from './hooks/useAiSurface.js'; // Layout chrome export { @@ -158,7 +142,7 @@ export { // `@object-ui/layout`'s `PageHeader`, a different component. ConsolePageHeader, } from './layout/index.js'; -export type { ActivityItem, PreviewBadgeProps, ConsolePageHeaderProps } from './layout/index.js'; +export type { ActivityItem, ConsolePageHeaderProps } from './layout/index.js'; // Top-level chrome (dialogs, providers, error boundaries) export { @@ -170,9 +154,6 @@ export { presentNotificationToast, RouteFader, RedirectWithSplash, - type RedirectWithSplashProps, - toastWithUndo, - type ToastWithUndoOptions, ErrorBoundary, LoadingScreen, ThemeProvider, @@ -193,19 +174,16 @@ export { initSentry, captureError, setSentryUser, getSentry } from './observabil export { initRuntimeConfig, getRuntimeConfig, - getCloudBase, getProductName, getProductShortName, // The Community-default reading behind the sign-in page's "Powered by // ObjectStack" mark: true until a runtime pushes its own `productName`. isDefaultProductName, getPlatformStage, - getBrandColor, getLogoUrl, getFaviconUrl, getPwaDescription, getPwaThemeColor, - isRuntimeConfigInitialised, // The fail-closed reading of the runtime's client error-reporting sink. // Exported so no consumer has to write its own `?.` chain against the // payload — one loose truthiness dialect is all it takes to re-open @@ -217,7 +195,6 @@ export { } from './runtime-config.js'; export type { AppShellRuntimeConfig, - RuntimeFeatures, RuntimeBranding, RuntimeTelemetry, RuntimeClientErrorReporting, @@ -239,8 +216,6 @@ export { } from './views/index.js'; export type { ConsoleObjectViewProps, - RecordFormPageProps, - DeclaredActionsBarProps, FlowRunnerProps, ScreenFlowState, ScreenSpec, @@ -255,11 +230,6 @@ export { useNavPins, useNavigationSync, NavigationSyncEffect, - addNavigationItem, - removeNavigationItems, - renameNavigationItems, - navigationEqual, - generateNavId, useResponsiveSidebar, useActionModal, useHomePath, @@ -278,7 +248,7 @@ export { useUserStateAdapter, useAttachUserStateAdapters, } from './context/index.js'; -export type { UserDataAdapter, UserStateKind, CommandPaletteContextValue } from './context/index.js'; +export type { UserDataAdapter, UserStateKind } from './context/index.js'; // Default page implementations (consumers can partial-override slots) export { AppContent as DefaultAppContent } from './console/AppContent.js'; @@ -296,7 +266,6 @@ export { needsBootstrapProbe, isInvitationRedirect, type SignUpOffer, - type SignUpOfferContext, } from './console/auth/signUpOffer.js'; export { useBootstrapStatus, type BootstrapStatus } from './console/auth/bootstrapStatus.js'; // The register-first prompt both login pages show a signed-out visitor who @@ -325,7 +294,6 @@ export { ConversationsSidebar } from './console/ai/ConversationsSidebar.js'; export { toUIMessages, aiMessageRowsToServerMessages, - type HydratedUIMessage, type RawAiMessageRow, } from './hooks/useChatConversation.js'; @@ -335,11 +303,8 @@ export { export { registerAppComponent, getAppComponent, - listAppComponents, componentRefToUrlSegments, - urlSegmentsToComponentRef, } from './services/componentRegistry.js'; -export type { AppComponentRegistryEntry } from './services/componentRegistry.js'; // Side-effect import: registers built-in admin components // (metadata:directory, metadata:resource) at module load. import './services/builtinComponents.js'; @@ -444,7 +409,7 @@ deferBuiltinDesigners(() => // entry imports this barrel, so pointing them at the page barrel made that // barrel (and every page, preview and inspector it reaches) eager on every // console page load, past the six `lazy()` declarations `AppContent` writes for -// it. The 11 TYPE-ONLY re-exports below are erased at build and carry no edge; +// it. The 9 TYPE-ONLY re-exports below are erased at build and carry no edge; // they are grouped separately for that reason and not because they are less // public. export { MetadataDirectoryPage } from './views/metadata-admin/DirectoryPage.js'; @@ -454,7 +419,6 @@ export { MetadataResourceEditPage } from './views/metadata-admin/ResourceEditPag export { MetadataResourceHistoryPage } from './views/metadata-admin/ResourceHistoryPage.js'; export { MetadataDiagnosticsPage } from './views/metadata-admin/DiagnosticsPage.js'; export { MetadataQuickFind } from './views/metadata-admin/QuickFind.js'; -export { PageShell as MetadataPageShell } from './views/metadata-admin/PageShell.js'; export { SchemaForm } from './views/metadata-admin/SchemaForm.js'; export { LayeredDiff } from './views/metadata-admin/LayeredDiff.js'; // objectui#7611 — the Setup catalog's URL scope (`?scope=environment`), for a @@ -464,15 +428,11 @@ export { ENVIRONMENT_SCOPE_QUERY } from './views/metadata-admin/catalog-scope.js export { registerMetadataResource, getMetadataResource, - listMetadataResources, resolveResourceConfig, } from './views/metadata-admin/registry.js'; export { useMetadataClient, - useMetadataTypes, - useTypesIndex, useGlobalDiagnostics, - matchesQuery, } from './views/metadata-admin/useMetadata.js'; // objectui#11939 — the `useRegistered*` hooks are the render-time reads of the // two designer registries: a component that reads through them re-renders when @@ -498,12 +458,10 @@ export type { export type { RichMetadataTypeEntry } from './views/metadata-admin/useMetadata.js'; export type { MetadataPreview, - MetadataPreviewProps, MetadataSelection, } from './views/metadata-admin/preview-registry.js'; export type { MetadataInspector, - MetadataInspectorProps, } from './views/metadata-admin/inspector-registry.js'; // The form authoring surface, in ONE declaration per layer: the field // (objectui#5040 / #5542) and the two containers above it (objectui#5596). @@ -521,19 +479,11 @@ export type { // The left AI copilot is an injected `aiSlot`; OSS renders three zones. export { StudioDesignSurface, - type StudioDesignSurfaceProps, } from './views/studio-design/StudioDesignSurface.js'; // Per-type canvas renderers for the Studio design surface. Register an override // (e.g. a custom `object` records surface) without forking StudioDesignSurface. export { registerStudioCanvasPreview, - getStudioCanvasPreview, - listStudioCanvasPreviewTypes, - StudioObjectRecordsCanvas, -} from './views/studio-design/studio-canvas-preview.js'; -export type { - StudioCanvasPreview, - StudioCanvasPreviewProps, } from './views/studio-design/studio-canvas-preview.js'; // The builder's front door: pick/create a writable package → pillar builder. // Standalone at `/studio` and embedded via the `studio:builder` component ref. @@ -556,13 +506,8 @@ export { PackagedAutomationPage } from './views/setup/PackagedAutomationPage.js' // AI assistant bus — connects the metadata designers to the global chat. export { assistantBus, - useAssistant, - useRegisterAssistantEditor, - requestAssistantOpen, } from './assistant/assistantBus.js'; export type { AssistantSnapshot, - AssistantEditorContext, - AssistantEditorField, } from './assistant/assistantBus.js'; export { RemediationOverlay } from './console/RemediationOverlay.js';