Files
Ekklesia/surfaces/shell/src/index.ts
T
ekklesiaandClaude Opus 5.5 cd0287537e
CI / verify (pull_request) Successful in 1m10s
CI / infrastructure-smoke (pull_request) Successful in 34s
CI / package-release (pull_request) Successful in 50s
CI / migration-smoke (pull_request) Successful in 2m26s
CI / image-build (pull_request) Successful in 1m12s
CI / deploy-smoke (same-origin) (pull_request) Successful in 42s
CI / package-publication (pull_request) Successful in 54s
CI / deploy-smoke (split) (pull_request) Successful in 3m17s
Add the account area and account-synced Appearance preferences
Stage 1 PR 6 (ADR 0062). /account shows who is signed in; /account/appearance
chooses System, Light, or Dark and reduced motion (System, Reduce, Allow).

- Core: ekklesia_core_user_preference, one typed, CHECK-constrained,
  nullable column per preference (null = never chosen), migration
  0008_user_preferences (additive), @ekklesia/core/account store, and the
  authenticated-baseline permission core.account.self.manage.
- API: GET /api/v1/account (name, email, preferences) and partial
  PATCH /api/v1/account/preferences, self-only by construction: no user id
  is accepted anywhere; trusted Origin and body limit on the mutation.
- Shell: the account control shows name, email, and initials (never the
  unvetted image URL) and offers Account, Appearance, Sign out; native
  radio groups apply a choice at once through the ADR 0060 controller and
  save it; the server's answer wins and a failed save reverts.
- First paint: a classic, same-origin, render-blocking appearance.js in
  <head> applies a two-word localStorage cache before paint (no inline
  script, CSP unchanged). The account replaces the cache on every load,
  sign-out clears it, and other tabs follow via the storage event.
- Deploy smoke: real-Chromium checks for light/dark, OS emulation,
  overrides, reload persistence, pre-paint, Shadow DOM modules, reduced
  motion, the display staying light, and phone width; the browser
  container gets a 512 MiB /dev/shm so a long session no longer fails
  requests with ERR_INSUFFICIENT_RESOURCES.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 23:56:50 -05:00

60 lines
1.9 KiB
TypeScript

/**
* The framework-free half of the Ekklesia shell: how it talks to the platform and how it builds a
* module UI host context. Deliberately the only public surface of this package.
*
* The React shell itself (`src/browser/`) is not exported. It is an application, bundled straight to
* a browser artifact by this package's own build; exporting components would invite another package
* to depend on Ekklesia's shell internals, which is exactly the coupling the surface boundary
* exists to prevent. What *is* exported is the protocol — validated wire parsing, context
* construction, module API resolution — so the end-to-end test can drive the real host code against
* a real server instead of a reimplementation of it.
*/
export {
bootstrapHost,
bootstrapDisplayHost,
type DashboardNavigation,
type DashboardSettings,
type DashboardSettingsModule,
type DashboardNavigationEntry,
type DashboardNavigationGroup,
type DisplayHostBootstrap,
type EkklesiaHostConfig,
type HostAccount,
type HostAccountPreferences,
type HostBootstrap,
type HostEventSourceFactory,
type HostEventSourceOptions,
type HostModuleDisplayResponse,
type HostModuleUiDescriptor,
HostProtocolError,
type HostProtocolErrorCode,
loadDashboardNavigation,
loadDashboardSettings,
loadHostAccount,
loadHostPrincipal,
loadModuleDisplay,
moduleDisplayDescriptorPath,
parseDashboardNavigation,
parseDashboardSettings,
parseDisplayRoute,
parseHostAccount,
parseHostAccountPreferences,
parseHostModuleDisplay,
parseHostPrincipal,
resolveApiOrigin,
resolveApiUrl,
saveHostAccountPreferences,
} from "./host-protocol.js";
export {
type CreateModuleUiContextOptions,
createModuleUiContext,
moduleUiSourceUrl,
} from "./module-context.js";
export {
HostAuthError,
type HostAuthErrorCode,
type HostSignInCredentials,
signInWithEmail,
signOutHost,
} from "./auth-protocol.js";