@hai3/framework 0.4.0-alpha.0 → 0.4.0-alpha.1

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.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/createHAI3.ts","../src/slices/index.ts","../src/slices/headerSlice.ts","../src/slices/footerSlice.ts","../src/slices/menuSlice.ts","../src/slices/sidebarSlice.ts","../src/slices/screenSlice.ts","../src/slices/popupSlice.ts","../src/slices/overlaySlice.ts","../src/slices/tenantSlice.ts","../src/slices/mockSlice.ts","../src/plugins/screensets.ts","../src/plugins/themes.ts","../src/registries/themeRegistry.ts","../src/plugins/layout.ts","../src/plugins/i18n.ts","../src/plugins/effects.ts","../src/effects/mockEffects.ts","../src/plugins/mock.ts","../src/plugins/microfrontends/index.ts","../src/plugins/microfrontends/slice.ts","../src/plugins/microfrontends/effects.ts","../src/plugins/microfrontends/constants.ts","../src/plugins/microfrontends/actions.ts","../src/plugins/microfrontends/base-domains.ts","../src/presets/index.ts","../src/createHAI3App.ts","../src/index.ts","../src/effects/tenantEffects.ts","../src/effects/tenantActions.ts","../src/compat.ts","../src/migration.ts"],"sourcesContent":["/**\n * createHAI3 - App Builder Factory\n *\n * Creates a HAI3 app builder for custom plugin composition.\n * This is the core of the plugin architecture.\n *\n * Framework Layer: L2 (Depends on SDK packages)\n */\n\nimport { getStore, registerSlice } from '@hai3/state';\nimport type { EffectInitializer } from '@hai3/state';\nimport type {\n HAI3Config,\n HAI3Plugin,\n HAI3AppBuilder,\n HAI3App,\n HAI3Actions,\n HAI3Store,\n PluginFactory,\n RegisterableSlice,\n ThemeRegistry,\n} from './types';\nimport { apiRegistry } from '@hai3/api';\n\n// ============================================================================\n// Plugin Resolution\n// ============================================================================\n\n/**\n * Check if value is a plugin factory function\n */\nfunction isPluginFactory(\n value: HAI3Plugin | PluginFactory\n): value is PluginFactory {\n return typeof value === 'function';\n}\n\n/**\n * Resolve plugin - if it's a factory, call it; otherwise return as-is\n */\nfunction resolvePlugin(plugin: HAI3Plugin | PluginFactory): HAI3Plugin {\n return isPluginFactory(plugin) ? plugin() : plugin;\n}\n\n// ============================================================================\n// App Builder Implementation\n// ============================================================================\n\n/**\n * HAI3 App Builder Implementation\n */\nclass HAI3AppBuilderImpl implements HAI3AppBuilder {\n private plugins: HAI3Plugin[] = [];\n private config: HAI3Config;\n\n constructor(config: HAI3Config = {}) {\n this.config = {\n name: 'HAI3 App',\n devMode: false,\n strictMode: false,\n ...config,\n };\n }\n\n /**\n * Add a plugin to the application.\n * Also accepts an array of plugins (for preset support).\n */\n use(plugin: HAI3Plugin | PluginFactory | HAI3Plugin[]): HAI3AppBuilder {\n // Handle arrays (presets return arrays)\n if (Array.isArray(plugin)) {\n plugin.forEach((p) => this.use(p));\n return this;\n }\n\n const resolved = resolvePlugin(plugin);\n\n // Check if plugin already registered\n if (this.plugins.some((p) => p.name === resolved.name)) {\n if (this.config.devMode) {\n console.warn(\n `Plugin \"${resolved.name}\" is already registered. Skipping duplicate.`\n );\n }\n return this;\n }\n\n this.plugins.push(resolved);\n return this;\n }\n\n /**\n * Add multiple plugins at once.\n */\n useAll(plugins: Array<HAI3Plugin | PluginFactory>): HAI3AppBuilder {\n plugins.forEach((plugin) => this.use(plugin));\n return this;\n }\n\n /**\n * Build the application.\n */\n build(): HAI3App {\n // 1. Resolve dependencies and order plugins\n const orderedPlugins = this.resolveDependencies();\n\n // 2. Call onRegister for each plugin\n orderedPlugins.forEach((plugin) => {\n if (plugin.onRegister) {\n plugin.onRegister(this, plugin._configType);\n }\n });\n\n // 3. Aggregate all provides\n const aggregated = this.aggregateProvides(orderedPlugins);\n\n // 4. Create store with aggregated slices\n const store = this.createStoreWithSlices(aggregated.slices);\n\n // 5. Initialize effects\n aggregated.effects.forEach((initEffect) => {\n initEffect(store.dispatch);\n });\n\n // 6. Build the app object\n // Cast actions to HAI3Actions - all plugins have contributed their actions\n // via module augmentation, so the runtime object matches the declared type\n const app: HAI3App = {\n config: this.config,\n store: store as HAI3Store,\n themeRegistry: aggregated.registries.themeRegistry as ThemeRegistry,\n apiRegistry: apiRegistry,\n i18nRegistry: aggregated.registries.i18nRegistry as HAI3App['i18nRegistry'],\n screensetsRegistry: aggregated.registries.screensetsRegistry as HAI3App['screensetsRegistry'],\n actions: aggregated.actions as HAI3Actions,\n destroy: () => this.destroyApp(orderedPlugins, app),\n };\n\n // 7. Call onInit for each plugin\n orderedPlugins.forEach((plugin) => {\n if (plugin.onInit) {\n plugin.onInit(app);\n }\n });\n\n return app;\n }\n\n /**\n * Resolve plugin dependencies using topological sort.\n */\n private resolveDependencies(): HAI3Plugin[] {\n const resolved: HAI3Plugin[] = [];\n const visited = new Set<string>();\n const visiting = new Set<string>();\n\n const visit = (plugin: HAI3Plugin) => {\n if (visited.has(plugin.name)) return;\n\n if (visiting.has(plugin.name)) {\n throw new Error(\n `Circular dependency detected: ${plugin.name} depends on itself or creates a cycle.`\n );\n }\n\n visiting.add(plugin.name);\n\n // Process dependencies first\n if (plugin.dependencies) {\n for (const depName of plugin.dependencies) {\n const dep = this.plugins.find((p) => p.name === depName);\n\n if (!dep) {\n if (this.config.strictMode) {\n throw new Error(\n `Plugin \"${plugin.name}\" requires \"${depName}\" but it is not registered.\\n` +\n `Add the missing plugin: .use(${depName}())`\n );\n } else {\n console.warn(\n `Plugin \"${plugin.name}\" requires \"${depName}\" but it is not registered. ` +\n `Some features may not work correctly.`\n );\n continue;\n }\n }\n\n visit(dep);\n }\n }\n\n visiting.delete(plugin.name);\n visited.add(plugin.name);\n resolved.push(plugin);\n };\n\n this.plugins.forEach(visit);\n return resolved;\n }\n\n /**\n * Aggregate all provides from plugins.\n */\n private aggregateProvides(plugins: HAI3Plugin[]) {\n const registries: Record<string, unknown> = {};\n const slices: RegisterableSlice[] = [];\n const effects: EffectInitializer[] = [];\n // Actions are typed via module augmentation - each plugin declares its actions\n // in HAI3Actions interface. At runtime we merge them all together.\n const actions: Partial<HAI3Actions> = {};\n\n plugins.forEach((plugin) => {\n if (!plugin.provides) return;\n\n // Merge registries\n if (plugin.provides.registries) {\n Object.assign(registries, plugin.provides.registries);\n }\n\n // Collect slices\n if (plugin.provides.slices) {\n slices.push(...plugin.provides.slices);\n }\n\n // Collect effects\n if (plugin.provides.effects) {\n effects.push(...plugin.provides.effects);\n }\n\n // Merge actions (type-safe via HAI3Actions module augmentation)\n if (plugin.provides.actions) {\n Object.assign(actions, plugin.provides.actions);\n }\n });\n\n return { registries, slices, effects, actions };\n }\n\n /**\n * Create store with all aggregated slices.\n *\n * IMPORTANT: This method supports the screenset self-registration pattern.\n * Screensets call registerSlice() as module side effects when imported,\n * which may auto-create a store before createHAI3App() is called.\n *\n * This method:\n * 1. Uses the existing store if one was auto-created by screensets\n * 2. Registers framework slices to the existing store\n * 3. Returns the unified store for HAI3App\n */\n private createStoreWithSlices(slices: RegisterableSlice[]): HAI3Store {\n // Get existing store (may have been created by screenset registerSlice calls)\n // getStore() auto-creates if none exists\n const store = getStore();\n\n // Register framework slices using registerSlice (merges with dynamic slices)\n slices.forEach((slice) => {\n registerSlice(slice);\n });\n\n return store;\n }\n\n /**\n * Destroy the app and cleanup resources.\n */\n private destroyApp(plugins: HAI3Plugin[], app: HAI3App): void {\n // Call onDestroy in reverse order\n [...plugins].reverse().forEach((plugin) => {\n if (plugin.onDestroy) {\n plugin.onDestroy(app);\n }\n });\n }\n}\n\n// ============================================================================\n// Factory Function\n// ============================================================================\n\n/**\n * Create a HAI3 app builder for custom plugin composition.\n *\n * @param config - Optional application configuration\n * @returns App builder for plugin composition\n *\n * @example\n * ```typescript\n * const app = createHAI3()\n * .use(screensets())\n * .use(themes())\n * .build();\n * ```\n */\nexport function createHAI3(config?: HAI3Config): HAI3AppBuilder {\n return new HAI3AppBuilderImpl(config);\n}\n","/**\n * Layout Slices\n *\n * @hai3/framework owns all layout domain slices.\n * These slices manage header, footer, menu, sidebar, screen, popup, and overlay state.\n *\n * State access: Components use `useAppSelector` hook from @hai3/react.\n */\n\nimport { combineReducers, type Reducer } from '@reduxjs/toolkit';\nimport type {\n HeaderState,\n FooterState,\n MenuState,\n SidebarState,\n ScreenState,\n OverlayState,\n} from '../layoutTypes';\n\n// Import slice reducers\nimport headerReducer, { headerSlice, headerActions, setUser, setLoading as setHeaderLoading, clearUser } from './headerSlice';\nimport footerReducer, { footerSlice, footerActions, setFooterVisible, setFooterConfig } from './footerSlice';\nimport menuReducer, {\n menuSlice,\n menuActions,\n toggleMenu,\n setMenuCollapsed,\n setMenuItems,\n setMenuVisible,\n setMenuConfig,\n} from './menuSlice';\nimport sidebarReducer, {\n sidebarSlice,\n sidebarActions,\n toggleSidebar,\n setSidebarCollapsed,\n setSidebarPosition,\n setSidebarTitle,\n setSidebarContent,\n setSidebarVisible,\n setSidebarWidth,\n setSidebarConfig,\n} from './sidebarSlice';\nimport screenReducer, {\n screenSlice,\n screenActions,\n setActiveScreen,\n setScreenLoading,\n navigateTo,\n clearActiveScreen,\n} from './screenSlice';\nimport popupReducer, {\n popupSlice,\n popupActions,\n openPopup,\n closePopup,\n closeTopPopup,\n closeAllPopups,\n type PopupSliceState,\n} from './popupSlice';\nimport overlayReducer, {\n overlaySlice,\n overlayActions,\n showOverlay,\n hideOverlay,\n setOverlayVisible,\n} from './overlaySlice';\nimport tenantReducer, {\n tenantSlice,\n tenantActions,\n setTenant,\n setTenantLoading,\n clearTenant,\n} from './tenantSlice';\nimport mockReducer, {\n mockSlice,\n mockActions,\n setMockEnabled,\n} from './mockSlice';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nexport const LAYOUT_SLICE_NAME = 'layout' as const;\nexport const TENANT_SLICE_NAME = 'app/tenant' as const;\n\n// ============================================================================\n// Combined Layout Reducer\n// ============================================================================\n\n/** Explicit type for layout domain reducers to avoid incorrect dts generation */\nexport interface LayoutDomainReducersType {\n header: Reducer<HeaderState>;\n footer: Reducer<FooterState>;\n menu: Reducer<MenuState>;\n sidebar: Reducer<SidebarState>;\n screen: Reducer<ScreenState>;\n popup: Reducer<PopupSliceState>;\n overlay: Reducer<OverlayState>;\n}\n\nexport const layoutDomainReducers: LayoutDomainReducersType = {\n header: headerReducer,\n footer: footerReducer,\n menu: menuReducer,\n sidebar: sidebarReducer,\n screen: screenReducer,\n popup: popupReducer,\n overlay: overlayReducer,\n};\n\nexport const layoutReducer = combineReducers(layoutDomainReducers);\n\n// ============================================================================\n// Slice Exports\n// ============================================================================\n\nexport {\n // Slices\n headerSlice,\n footerSlice,\n menuSlice,\n sidebarSlice,\n screenSlice,\n popupSlice,\n overlaySlice,\n // Action groups\n headerActions,\n // Individual actions - header\n setUser,\n setHeaderLoading,\n clearUser,\n footerActions,\n menuActions,\n sidebarActions,\n screenActions,\n popupActions,\n overlayActions,\n // Individual actions - footer\n setFooterVisible,\n setFooterConfig,\n // Individual actions - menu\n toggleMenu,\n setMenuCollapsed,\n setMenuItems,\n setMenuVisible,\n setMenuConfig,\n // Individual actions - sidebar\n toggleSidebar,\n setSidebarCollapsed,\n setSidebarPosition,\n setSidebarTitle,\n setSidebarContent,\n setSidebarVisible,\n setSidebarWidth,\n setSidebarConfig,\n // Individual actions - screen\n setActiveScreen,\n setScreenLoading,\n navigateTo,\n clearActiveScreen,\n // Individual actions - popup\n openPopup,\n closePopup,\n closeTopPopup,\n closeAllPopups,\n // Individual actions - overlay\n showOverlay,\n hideOverlay,\n setOverlayVisible,\n // Tenant slice (app-level, not layout)\n tenantSlice,\n tenantActions,\n tenantReducer,\n // Individual actions - tenant\n setTenant,\n setTenantLoading,\n clearTenant,\n // Mock slice (app-level, not layout)\n mockSlice,\n mockActions,\n mockReducer,\n // Individual actions - mock\n setMockEnabled,\n};\n\n// Type exports\nexport type { PopupSliceState };\n","import { createSlice, type ReducerPayload } from '@hai3/state';\nimport type { HeaderState, HeaderUser } from '../layoutTypes';\n\n/**\n * Header slice for managing header state including user info\n */\n\nconst SLICE_KEY = 'layout/header' as const;\n\nconst initialState: HeaderState = {\n user: null,\n loading: false,\n};\n\nconst { slice, setUser, setLoading, clearUser } = createSlice({\n name: SLICE_KEY,\n initialState,\n reducers: {\n setUser: (state: HeaderState, action: ReducerPayload<HeaderUser | null>) => {\n state.user = action.payload;\n state.loading = false;\n },\n setLoading: (state: HeaderState, action: ReducerPayload<boolean>) => {\n state.loading = action.payload;\n },\n clearUser: (state: HeaderState) => {\n state.user = null;\n state.loading = false;\n },\n },\n});\n\nexport const headerSlice = slice;\nexport const headerActions = { setUser, setLoading, clearUser };\n\nexport { setUser, setLoading, clearUser };\n\nexport default slice.reducer;\n","import { createSlice, type ReducerPayload } from '@hai3/state';\nimport type { FooterState } from '../layoutTypes';\n\n/**\n * Footer slice for managing footer configuration\n */\n\nconst SLICE_KEY = 'layout/footer' as const;\n\nconst initialState: FooterState = {\n screensetOptions: [],\n visible: true,\n};\n\nconst { slice, setFooterVisible, setFooterConfig, ...restActions } = createSlice({\n name: SLICE_KEY,\n initialState,\n reducers: {\n setFooterVisible: (state: FooterState, action: ReducerPayload<boolean>) => {\n state.visible = action.payload;\n },\n setFooterConfig: (state: FooterState, action: ReducerPayload<Partial<FooterState>>) => {\n return { ...state, ...action.payload };\n },\n },\n});\n\nexport const footerSlice = slice;\nexport { setFooterVisible, setFooterConfig };\nexport const footerActions = { setFooterVisible, setFooterConfig, ...restActions };\n\nexport default slice.reducer;\n","import { createSlice, type ReducerPayload } from '@hai3/state';\nimport type { MenuItem, MenuState } from '../layoutTypes';\n\n/**\n * Menu slice for managing menu state and configuration\n * MenuItem type is defined in layoutTypes.ts\n */\n\nconst SLICE_KEY = 'layout/menu' as const;\n\nconst initialState: MenuState = {\n collapsed: false,\n items: [],\n visible: true,\n};\n\nconst { slice, toggleMenu, setMenuCollapsed, setMenuItems, setMenuVisible, setMenuConfig } = createSlice({\n name: SLICE_KEY,\n initialState,\n reducers: {\n toggleMenu: (state: MenuState) => {\n state.collapsed = !state.collapsed;\n },\n setMenuCollapsed: (state: MenuState, action: ReducerPayload<boolean>) => {\n state.collapsed = action.payload;\n },\n setMenuItems: (state: MenuState, action: ReducerPayload<MenuItem[]>) => {\n state.items = action.payload;\n },\n setMenuVisible: (state: MenuState, action: ReducerPayload<boolean>) => {\n state.visible = action.payload;\n },\n setMenuConfig: (state: MenuState, action: ReducerPayload<Partial<MenuState>>) => {\n return { ...state, ...action.payload };\n },\n },\n});\n\nexport const menuSlice = slice;\nexport { toggleMenu, setMenuCollapsed, setMenuItems, setMenuVisible, setMenuConfig };\nexport const menuActions = { toggleMenu, setMenuCollapsed, setMenuItems, setMenuVisible, setMenuConfig };\n\nexport default slice.reducer;\n","import { createSlice, type ReducerPayload } from '@hai3/state';\nimport type { SidebarState, SidebarPosition } from '../layoutTypes';\n\n/**\n * Sidebar slice for managing sidebar state and configuration\n */\n\nconst SLICE_KEY = 'layout/sidebar' as const;\n\nconst initialState: SidebarState = {\n collapsed: false,\n position: 'left',\n title: null,\n content: null,\n visible: false,\n width: 256,\n};\n\nconst {\n slice,\n toggleSidebar,\n setSidebarCollapsed,\n setSidebarPosition,\n setSidebarTitle,\n setSidebarContent,\n setSidebarVisible,\n setSidebarWidth,\n setSidebarConfig,\n} = createSlice({\n name: SLICE_KEY,\n initialState,\n reducers: {\n toggleSidebar: (state: SidebarState) => {\n state.collapsed = !state.collapsed;\n },\n setSidebarCollapsed: (state: SidebarState, action: ReducerPayload<boolean>) => {\n state.collapsed = action.payload;\n },\n setSidebarPosition: (state: SidebarState, action: ReducerPayload<SidebarPosition>) => {\n state.position = action.payload;\n },\n setSidebarTitle: (state: SidebarState, action: ReducerPayload<string | null>) => {\n state.title = action.payload;\n },\n setSidebarContent: (state: SidebarState, action: ReducerPayload<unknown>) => {\n state.content = action.payload;\n },\n setSidebarVisible: (state: SidebarState, action: ReducerPayload<boolean>) => {\n state.visible = action.payload;\n },\n setSidebarWidth: (state: SidebarState, action: ReducerPayload<number>) => {\n state.width = action.payload;\n },\n setSidebarConfig: (state: SidebarState, action: ReducerPayload<Partial<SidebarState>>) => {\n return { ...state, ...action.payload };\n },\n },\n});\n\nexport const sidebarSlice = slice;\nexport {\n toggleSidebar,\n setSidebarCollapsed,\n setSidebarPosition,\n setSidebarTitle,\n setSidebarContent,\n setSidebarVisible,\n setSidebarWidth,\n setSidebarConfig,\n};\nexport const sidebarActions = {\n toggleSidebar,\n setSidebarCollapsed,\n setSidebarPosition,\n setSidebarTitle,\n setSidebarContent,\n setSidebarVisible,\n setSidebarWidth,\n setSidebarConfig,\n};\n\nexport default slice.reducer;\n","import { createSlice, type ReducerPayload } from '@hai3/state';\nimport type { ScreenState } from '../layoutTypes';\n\n/**\n * Screen slice for managing screen state\n */\n\nconst SLICE_KEY = 'layout/screen' as const;\n\nconst initialState: ScreenState = {\n activeScreen: null,\n loading: false,\n};\n\nconst { slice, setActiveScreen, setScreenLoading, navigateTo, clearActiveScreen } = createSlice({\n name: SLICE_KEY,\n initialState,\n reducers: {\n setActiveScreen: (state: ScreenState, action: ReducerPayload<string>) => {\n state.activeScreen = action.payload;\n },\n setScreenLoading: (state: ScreenState, action: ReducerPayload<boolean>) => {\n state.loading = action.payload;\n },\n navigateTo: (state: ScreenState, action: ReducerPayload<string>) => {\n state.activeScreen = action.payload;\n },\n clearActiveScreen: (state: ScreenState) => {\n state.activeScreen = null;\n },\n },\n});\n\nexport const screenSlice = slice;\nexport { setActiveScreen, setScreenLoading, navigateTo, clearActiveScreen };\nexport const screenActions = { setActiveScreen, setScreenLoading, navigateTo, clearActiveScreen };\n\nexport default slice.reducer;\n","import { createSlice, type ReducerPayload } from '@hai3/state';\nimport type { PopupState } from '../layoutTypes';\n\n/**\n * Popup slice for managing popup state\n */\n\nconst SLICE_KEY = 'layout/popup' as const;\n\nexport interface PopupSliceState {\n stack: PopupState[];\n}\n\nconst initialState: PopupSliceState = {\n stack: [],\n};\n\nconst { slice, openPopup, closePopup, closeTopPopup, closeAllPopups } = createSlice({\n name: SLICE_KEY,\n initialState,\n reducers: {\n openPopup: (state: PopupSliceState, action: ReducerPayload<Omit<PopupState, 'zIndex'>>) => {\n const zIndex = 1000 + state.stack.length * 10;\n state.stack.push({ ...action.payload, zIndex });\n },\n closePopup: (state: PopupSliceState, action: ReducerPayload<string>) => {\n state.stack = state.stack.filter((popup) => popup.id !== action.payload);\n },\n closeTopPopup: (state: PopupSliceState) => {\n state.stack.pop();\n },\n closeAllPopups: (state: PopupSliceState) => {\n state.stack = [];\n },\n },\n});\n\nexport const popupSlice = slice;\nexport { openPopup, closePopup, closeTopPopup, closeAllPopups };\nexport const popupActions = { openPopup, closePopup, closeTopPopup, closeAllPopups };\n\nexport default slice.reducer;\n","import { createSlice, type ReducerPayload } from '@hai3/state';\nimport type { OverlayState } from '../layoutTypes';\n\n/**\n * Overlay slice for managing overlay state\n */\n\nconst SLICE_KEY = 'layout/overlay' as const;\n\nconst initialState: OverlayState = {\n visible: false,\n};\n\nconst { slice, showOverlay, hideOverlay, setOverlayVisible } = createSlice({\n name: SLICE_KEY,\n initialState,\n reducers: {\n showOverlay: (state: OverlayState) => {\n state.visible = true;\n },\n hideOverlay: (state: OverlayState) => {\n state.visible = false;\n },\n setOverlayVisible: (state: OverlayState, action: ReducerPayload<boolean>) => {\n state.visible = action.payload;\n },\n },\n});\n\nexport const overlaySlice = slice;\nexport { showOverlay, hideOverlay, setOverlayVisible };\nexport const overlayActions = { showOverlay, hideOverlay, setOverlayVisible };\n\nexport default slice.reducer;\n","import { createSlice, type ReducerPayload } from '@hai3/state';\nimport type { TenantState, Tenant } from '../layoutTypes';\n\n/**\n * Tenant slice for managing tenant state\n *\n * This slice is NOT part of the layout domain. It lives at the app level\n * as a separate top-level slice: state['app/tenant']\n *\n * Event-driven: Listen for 'app/tenant/changed' to update tenant\n */\n\nconst SLICE_KEY = 'app/tenant' as const;\n\nconst initialState: TenantState = {\n tenant: null,\n loading: false,\n};\n\nconst { slice, setTenant, setTenantLoading, clearTenant } = createSlice({\n name: SLICE_KEY,\n initialState,\n reducers: {\n setTenant: (state: TenantState, action: ReducerPayload<Tenant | null>) => {\n state.tenant = action.payload;\n state.loading = false;\n },\n setTenantLoading: (state: TenantState, action: ReducerPayload<boolean>) => {\n state.loading = action.payload;\n },\n clearTenant: (state: TenantState) => {\n state.tenant = null;\n state.loading = false;\n },\n },\n});\n\nexport const tenantSlice = slice;\nexport const tenantActions = { setTenant, setTenantLoading, clearTenant };\n\nexport { setTenant, setTenantLoading, clearTenant };\n\nexport default slice.reducer;\n","import { createSlice, type ReducerPayload } from '@hai3/state';\n\n/**\n * Mock slice for managing mock mode state\n *\n * Controls whether mock plugins are active across all API services.\n * Event-driven: Listen for 'mock/toggle' to change mock mode.\n */\n\nconst SLICE_KEY = 'mock' as const;\n\nexport interface MockState {\n enabled: boolean;\n}\n\nconst initialState: MockState = {\n enabled: false,\n};\n\nconst { slice, setMockEnabled } = createSlice({\n name: SLICE_KEY,\n initialState,\n reducers: {\n setMockEnabled: (state: MockState, action: ReducerPayload<boolean>) => {\n state.enabled = action.payload;\n },\n },\n});\n\nexport const mockSlice = slice;\nexport const mockActions = { setMockEnabled };\n\nexport { setMockEnabled };\n\nexport default slice.reducer;\n","/**\n * Screensets Plugin - Provides screenset registry and screen slice\n *\n * This is the minimal plugin for screenset orchestration.\n * It does NOT include navigation actions - those are in the navigation plugin.\n *\n * Framework Layer: L2\n *\n * NOTE: Translations are NOT handled by this plugin. Screensets register\n * their translations directly with i18nRegistry via framework re-exports.\n * This maintains clean separation: @hai3/screensets has zero knowledge of i18n.\n */\n\nimport { screenSlice, screenActions } from '../slices';\nimport type { HAI3Plugin, ScreensetsConfig } from '../types';\n\n/**\n * Screensets plugin factory.\n *\n * @param config - Plugin configuration\n * @returns Screensets plugin\n *\n * @example\n * ```typescript\n * const app = createHAI3()\n * .use(screensets({ autoDiscover: true }))\n * .build();\n * ```\n */\nexport function screensets(_config?: ScreensetsConfig): HAI3Plugin<ScreensetsConfig> {\n return {\n name: 'screensets',\n dependencies: [],\n\n provides: {\n registries: {},\n slices: [screenSlice],\n actions: {\n setActiveScreen: screenActions.navigateTo,\n setScreenLoading: screenActions.setScreenLoading,\n },\n },\n\n onInit() {\n // Auto-discover screensets if configured\n // Note: In Vite apps, this is handled by glob imports in user code\n // Translation wiring is NOT done here.\n // Screensets register translations directly with i18nRegistry.\n // This keeps @hai3/screensets free of i18n dependencies.\n },\n };\n}\n","/**\n * Themes Plugin - Provides theme registry and changeTheme action\n *\n * Framework Layer: L2\n */\n\nimport { eventBus } from '@hai3/state';\nimport { HAI3_SHARED_PROPERTY_THEME } from '@hai3/screensets';\nimport type { HAI3Plugin, ChangeThemePayload, ThemesConfig } from '../types';\nimport { createThemeRegistry } from '../registries/themeRegistry';\n\n// Define theme events for module augmentation\ndeclare module '@hai3/state' {\n interface EventPayloadMap {\n 'theme/changed': ChangeThemePayload;\n }\n}\n\n/**\n * Change theme action.\n * Emits 'theme/changed' event to trigger theme application.\n *\n * @param payload - The theme change payload\n */\nfunction changeTheme(payload: ChangeThemePayload): void {\n eventBus.emit('theme/changed', payload);\n}\n\n/**\n * Themes plugin factory.\n *\n * @param config - Optional themes configuration\n * @returns Themes plugin\n *\n * @example\n * ```typescript\n * import { applyTheme } from '@hai3/uikit';\n *\n * const app = createHAI3()\n * .use(screensets())\n * .use(themes({ applyFn: applyTheme }))\n * .build();\n *\n * app.actions.changeTheme({ themeId: 'dark' });\n * ```\n */\nexport function themes(config?: ThemesConfig): HAI3Plugin {\n // Create a new theme registry instance for this plugin\n const themeRegistry = createThemeRegistry(config);\n\n return {\n name: 'themes',\n dependencies: [],\n\n provides: {\n registries: {\n themeRegistry,\n },\n actions: {\n changeTheme,\n },\n },\n\n onInit(app) {\n // Subscribe to theme changes\n eventBus.on('theme/changed', (payload: ChangeThemePayload) => {\n themeRegistry.apply(payload.themeId);\n try {\n app.screensetsRegistry?.updateSharedProperty(HAI3_SHARED_PROPERTY_THEME, payload.themeId);\n } catch (error) {\n console.error('[HAI3] Failed to propagate theme to MFE domains', error);\n }\n });\n\n // Bootstrap: Apply the first registered theme (or default)\n const themes = themeRegistry.getAll();\n if (themes.length > 0) {\n themeRegistry.apply(themes[0].id);\n }\n },\n };\n}\n","/**\n * Theme Registry - Manages theme registration and application\n *\n * Framework Layer: L2\n */\n\nimport type { ThemeRegistry, ThemeConfig, UikitTheme, ThemeApplyFn, ThemesConfig } from '../types';\n\n/**\n * Create a new theme registry instance.\n *\n * @param config - Optional configuration for the theme registry\n */\nexport function createThemeRegistry(config?: ThemesConfig): ThemeRegistry {\n const themes = new Map<string, ThemeConfig>();\n // Store UIKit themes (e.g., @hai3/uikit themes)\n const uikitThemes = new Map<string, UikitTheme>();\n let currentThemeId: string | null = null;\n // Custom apply function for UIKit themes (passed via constructor injection)\n const customApplyFn: ThemeApplyFn | null = config?.applyFn ?? null;\n\n // Subscription support for React\n const subscribers = new Set<() => void>();\n let version = 0;\n\n /**\n * Notify subscribers of theme change\n */\n function notifySubscribers(): void {\n version++;\n subscribers.forEach((callback) => callback());\n }\n\n /**\n * Apply CSS custom properties from theme to :root\n */\n function applyCSSVariables(config: ThemeConfig): void {\n // Skip if not in browser environment\n if (typeof document === 'undefined') return;\n\n const root = document.documentElement;\n\n // Apply each CSS variable\n Object.entries(config.variables).forEach(([key, value]) => {\n root.style.setProperty(key, value);\n });\n }\n\n return {\n /**\n * Register a theme.\n * Supports both config-based API and UIKit theme API.\n */\n register(configOrId: ThemeConfig | string, uikitTheme?: UikitTheme): void {\n // Handle UIKit theme API: register(id, theme)\n if (typeof configOrId === 'string') {\n const id = configOrId;\n if (!uikitTheme) {\n console.warn(`register() called with ID \"${id}\" but no theme object. Skipping.`);\n return;\n }\n\n if (themes.has(id)) {\n console.warn(`Theme \"${id}\" is already registered. Skipping.`);\n return;\n }\n\n // Store UIKit theme for apply\n uikitThemes.set(id, uikitTheme);\n\n // Create a minimal ThemeConfig for the registry\n // Try to extract name from UIKit theme if it's an object\n let themeName = id;\n if (uikitTheme && typeof uikitTheme === 'object' && 'name' in uikitTheme) {\n const nameValue = (uikitTheme as { name?: unknown }).name;\n if (typeof nameValue === 'string') {\n themeName = nameValue;\n }\n }\n const config: ThemeConfig = {\n id,\n name: themeName,\n variables: {}, // UIKit themes use custom apply function\n };\n\n themes.set(id, config);\n return;\n }\n\n // New API: register(config)\n const config = configOrId;\n\n if (themes.has(config.id)) {\n console.warn(`Theme \"${config.id}\" is already registered. Skipping.`);\n return;\n }\n\n themes.set(config.id, config);\n\n // If this is the default theme and no theme is applied yet, apply it\n if (config.default && currentThemeId === null) {\n this.apply(config.id);\n }\n },\n\n /**\n * Get theme by ID.\n */\n get(id: string): ThemeConfig | undefined {\n return themes.get(id);\n },\n\n /**\n * Get all themes.\n */\n getAll(): ThemeConfig[] {\n return Array.from(themes.values());\n },\n\n /**\n * Apply a theme.\n */\n apply(id: string): void {\n const config = themes.get(id);\n\n if (!config) {\n console.warn(`Theme \"${id}\" not found. Cannot apply.`);\n return;\n }\n\n // Apply CSS variables if theme has them (config-based API)\n if (config.variables && Object.keys(config.variables).length > 0) {\n applyCSSVariables(config);\n }\n\n // Apply UIKit theme using custom apply function\n const uikitTheme = uikitThemes.get(id);\n if (uikitTheme && customApplyFn) {\n customApplyFn(uikitTheme, id);\n }\n\n currentThemeId = id;\n\n // Notify React subscribers of theme change\n notifySubscribers();\n },\n\n /**\n * Get current theme.\n */\n getCurrent(): ThemeConfig | undefined {\n return currentThemeId ? themes.get(currentThemeId) : undefined;\n },\n\n /**\n * Subscribe to theme changes.\n * Returns unsubscribe function.\n */\n subscribe(callback: () => void): () => void {\n subscribers.add(callback);\n return () => {\n subscribers.delete(callback);\n };\n },\n\n /**\n * Get current version number.\n * Used by React for re-rendering.\n */\n getVersion(): number {\n return version;\n },\n };\n}\n","/**\n * Layout Plugin - Provides all layout domain slices and effects\n *\n * Framework Layer: L2\n *\n * NOTE: Layout slices are owned by @hai3/framework (not @hai3/uicore which is deprecated)\n */\n\nimport type { Dispatch, UnknownAction } from '@reduxjs/toolkit';\nimport { eventBus } from '@hai3/state';\nimport type { HAI3Plugin, ShowPopupPayload } from '../types';\nimport {\n headerSlice,\n footerSlice,\n menuSlice,\n sidebarSlice,\n popupSlice,\n overlaySlice,\n footerActions,\n menuActions,\n sidebarActions,\n popupActions,\n overlayActions,\n} from '../slices';\n\n// Define layout events for module augmentation\ndeclare module '@hai3/state' {\n interface EventPayloadMap {\n 'layout/popup/requested': ShowPopupPayload;\n 'layout/popup/hidden': void;\n 'layout/overlay/requested': { id: string };\n 'layout/overlay/hidden': void;\n 'layout/menu/collapsed': { collapsed: boolean };\n 'layout/sidebar/collapsed': { collapsed: boolean };\n }\n}\n\n/**\n * Show popup action.\n */\nfunction showPopup(payload: ShowPopupPayload): void {\n eventBus.emit('layout/popup/requested', payload);\n}\n\n/**\n * Hide popup action.\n */\nfunction hidePopup(): void {\n eventBus.emit('layout/popup/hidden');\n}\n\n/**\n * Show overlay action.\n */\nfunction showOverlay(payload: { id: string }): void {\n eventBus.emit('layout/overlay/requested', payload);\n}\n\n/**\n * Hide overlay action.\n */\nfunction hideOverlay(): void {\n eventBus.emit('layout/overlay/hidden');\n}\n\n/**\n * Toggle menu collapsed action.\n */\nfunction toggleMenuCollapsed(payload: { collapsed: boolean }): void {\n eventBus.emit('layout/menu/collapsed', payload);\n}\n\n/**\n * Toggle sidebar collapsed action.\n */\nfunction toggleSidebarCollapsed(payload: { collapsed: boolean }): void {\n eventBus.emit('layout/sidebar/collapsed', payload);\n}\n\n/**\n * Wrapper for setHeaderVisible - no-op since HeaderState doesn't have visible field.\n * Kept for backward compatibility with HAI3Actions interface.\n */\nfunction setHeaderVisible(_visible: boolean): void {\n // No-op: HeaderState doesn't have visible field\n}\n\n/**\n * Layout plugin factory.\n *\n * @returns Layout plugin\n *\n * @example\n * ```typescript\n * const app = createHAI3()\n * .use(screensets())\n * .use(layout())\n * .build();\n * ```\n */\nexport function layout(): HAI3Plugin {\n\n return {\n name: 'layout',\n dependencies: ['screensets'],\n\n provides: {\n slices: [\n headerSlice,\n footerSlice,\n menuSlice,\n sidebarSlice,\n popupSlice,\n overlaySlice,\n ],\n actions: {\n showPopup,\n hidePopup,\n showOverlay,\n hideOverlay,\n toggleMenuCollapsed,\n toggleSidebarCollapsed,\n // Direct slice actions for backward compatibility\n setHeaderVisible,\n setFooterVisible: footerActions.setFooterVisible,\n setMenuCollapsed: menuActions.setMenuCollapsed,\n setSidebarCollapsed: sidebarActions.setSidebarCollapsed,\n },\n },\n\n onInit(app) {\n const dispatch = app.store.dispatch as Dispatch<UnknownAction>;\n\n // Popup effects\n eventBus.on('layout/popup/requested', (payload: ShowPopupPayload) => {\n dispatch(popupActions.openPopup({\n id: payload.id,\n title: payload.title ?? '',\n component: '', // Payload doesn't include component - this needs review\n }));\n });\n\n eventBus.on('layout/popup/hidden', () => {\n dispatch(popupActions.closeAllPopups());\n });\n\n // Overlay effects\n eventBus.on('layout/overlay/requested', (_payload: { id: string }) => {\n dispatch(overlayActions.showOverlay());\n });\n\n eventBus.on('layout/overlay/hidden', () => {\n dispatch(overlayActions.hideOverlay());\n });\n\n // Menu effects\n eventBus.on('layout/menu/collapsed', (payload: { collapsed: boolean }) => {\n dispatch(menuActions.setMenuCollapsed(payload.collapsed));\n });\n\n // Sidebar effects\n eventBus.on('layout/sidebar/collapsed', (payload: { collapsed: boolean }) => {\n dispatch(sidebarActions.setSidebarCollapsed(payload.collapsed));\n });\n },\n };\n}\n","/**\n * I18n Plugin - Provides i18n registry wiring and setLanguage action\n *\n * Framework Layer: L2\n */\n\nimport { eventBus } from '@hai3/state';\nimport { i18nRegistry as singletonI18nRegistry, Language } from '@hai3/i18n';\nimport { HAI3_SHARED_PROPERTY_LANGUAGE } from '@hai3/screensets';\nimport type { HAI3Plugin, SetLanguagePayload } from '../types';\n\n// Define i18n events for module augmentation\ndeclare module '@hai3/state' {\n interface EventPayloadMap {\n 'i18n/language/changed': SetLanguagePayload;\n }\n}\n\n/**\n * Set language action.\n * Emits 'i18n/language/changed' event to trigger language change.\n *\n * @param payload - The language change payload\n */\nfunction setLanguage(payload: SetLanguagePayload): void {\n eventBus.emit('i18n/language/changed', payload);\n}\n\n/**\n * I18n plugin factory.\n *\n * @returns I18n plugin\n *\n * @example\n * ```typescript\n * const app = createHAI3()\n * .use(i18n())\n * .build();\n *\n * app.actions.setLanguage({ language: 'de' });\n * ```\n */\nexport function i18n(): HAI3Plugin {\n // Use the singleton i18n registry - user translations register to this\n const i18nRegistry = singletonI18nRegistry;\n\n return {\n name: 'i18n',\n dependencies: [],\n\n provides: {\n registries: {\n i18nRegistry,\n },\n actions: {\n setLanguage,\n },\n },\n\n onInit(app) {\n // Language change effect\n eventBus.on('i18n/language/changed', async (payload: SetLanguagePayload) => {\n await i18nRegistry.setLanguage(payload.language as Language);\n try {\n app.screensetsRegistry?.updateSharedProperty(HAI3_SHARED_PROPERTY_LANGUAGE, payload.language);\n } catch (error) {\n console.error('[HAI3] Failed to propagate language to MFE domains', error);\n }\n });\n\n // Bootstrap: Set initial language to trigger translation loading\n // Run async without blocking - translations load in background\n i18nRegistry.setLanguage(Language.English).catch((err: Error) => {\n console.warn('[HAI3] Failed to load initial translations:', err);\n });\n },\n };\n}\n","/**\n * Effects Plugin - Core effect coordination infrastructure\n *\n * Framework Layer: L2\n */\n\nimport type { HAI3Plugin } from '../types';\n\n/**\n * Effects plugin factory.\n *\n * Provides the core effect coordination infrastructure.\n * Other plugins register their effects through this system.\n *\n * @returns Effects plugin\n *\n * @example\n * ```typescript\n * const app = createHAI3()\n * .use(effects())\n * .use(screensets())\n * .build();\n * ```\n */\nexport function effects(): HAI3Plugin {\n return {\n name: 'effects',\n dependencies: [],\n\n onInit() {\n // Effects plugin provides the coordination layer\n // Individual plugins register their own effects in their onInit\n // This plugin ensures effect infrastructure is available\n },\n };\n}\n","/**\n * Mock Effects\n *\n * Listens for mock mode toggle events and manages mock plugin lifecycle.\n * Event-driven architecture: UI emits events, effects handle plugin activation/deactivation.\n */\n\nimport { eventBus, getStore } from '@hai3/state';\nimport { apiRegistry, isMockPlugin, type ApiProtocol, type ApiPluginBase } from '@hai3/api';\nimport { setMockEnabled } from '../slices/mockSlice';\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\n/** Protocol with plugin management (RestProtocol, SseProtocol) */\ninterface ProtocolWithPlugins extends ApiProtocol {\n plugins: {\n add: (plugin: ApiPluginBase) => void;\n remove: (plugin: ApiPluginBase) => void;\n getAll: () => readonly ApiPluginBase[];\n };\n}\n\n/** Type guard to check if protocol has plugin management */\nfunction hasPluginManagement(protocol: ApiProtocol): protocol is ProtocolWithPlugins {\n return 'plugins' in protocol && typeof (protocol as ProtocolWithPlugins).plugins === 'object';\n}\n\n// ============================================================================\n// Event Types\n// ============================================================================\n\n/** Mock event names */\nexport const MockEvents = {\n Toggle: 'mock/toggle',\n} as const;\n\n/** Payload for mock toggle event */\nexport interface MockTogglePayload {\n enabled: boolean;\n}\n\n// ============================================================================\n// Module Augmentation for Type-Safe Events\n// ============================================================================\n\ndeclare module '@hai3/state' {\n interface EventPayloadMap {\n 'mock/toggle': MockTogglePayload;\n }\n}\n\n// ============================================================================\n// Mock Plugin Synchronization\n// ============================================================================\n\n/**\n * Activate or deactivate all mock plugins based on enabled state.\n * Uses isMockPlugin() type guard to identify mock plugins from generic storage.\n */\nfunction syncMockPlugins(enabled: boolean): void {\n // Iterate all registered services\n for (const service of apiRegistry.getAll()) {\n // getPlugins() returns ALL plugins (generic)\n // We filter for mock plugins using the type guard\n const registeredPlugins = service.getPlugins();\n\n for (const [protocol, plugins] of registeredPlugins) {\n // Check if protocol has plugins management (RestProtocol, SseProtocol do)\n if (!hasPluginManagement(protocol)) continue;\n\n for (const plugin of plugins) {\n // Framework filters using type guard - BaseApiService doesn't know about mocks\n if (isMockPlugin(plugin)) {\n if (enabled) {\n // Add plugin to protocol if not already present\n const existingPlugins = protocol.plugins.getAll();\n if (!existingPlugins.includes(plugin)) {\n protocol.plugins.add(plugin);\n }\n } else {\n // Remove plugin from protocol\n protocol.plugins.remove(plugin);\n }\n }\n }\n }\n }\n}\n\n// ============================================================================\n// Effect Registration\n// ============================================================================\n\n/**\n * Initialize mock mode effects\n * Call this once during app bootstrap to start listening for mock toggle events.\n */\nexport function initMockEffects(): () => void {\n const store = getStore();\n\n // Listen to toggle events\n const unsubscribe = eventBus.on(MockEvents.Toggle, (payload) => {\n // Update Redux state\n store.dispatch(setMockEnabled(payload.enabled));\n\n // Sync plugins with new state\n syncMockPlugins(payload.enabled);\n });\n\n // Sync on initialization based on current state\n const currentState = store.getState();\n // Check if mock slice exists and is enabled\n if ('mock' in currentState && currentState.mock && typeof currentState.mock === 'object' && 'enabled' in currentState.mock) {\n syncMockPlugins((currentState.mock as { enabled: boolean }).enabled);\n }\n\n // Return cleanup function\n return () => {\n unsubscribe.unsubscribe();\n };\n}\n\n// ============================================================================\n// Helper Actions (for consuming apps)\n// ============================================================================\n\n/**\n * Toggle mock mode on/off.\n * Emits event that mockEffects handles.\n *\n * @example\n * ```typescript\n * import { toggleMockMode } from '@hai3/framework';\n * toggleMockMode(true); // Enable mock mode\n * toggleMockMode(false); // Disable mock mode\n * ```\n */\nexport function toggleMockMode(enabled: boolean): void {\n eventBus.emit(MockEvents.Toggle, { enabled });\n}\n","/**\n * Mock Plugin - Centralized mock mode control\n *\n * Framework Layer: L2\n *\n * Automatically registers mockSlice and initializes mock effects.\n * Apps don't need to manually call registerSlice(mockSlice) or initMockEffects().\n */\n\nimport type { HAI3Plugin } from '../types';\nimport { mockSlice } from '../slices/mockSlice';\nimport { initMockEffects, toggleMockMode } from '../effects/mockEffects';\n\n// Store cleanup function per plugin instance\nlet cleanup: (() => void) | null = null;\n\n/**\n * Detect if running in development environment.\n * Uses runtime heuristics since framework is pre-built.\n */\nfunction isDevEnvironment(): boolean {\n if (typeof window === 'undefined') return false;\n\n const { hostname } = window.location;\n // localhost, 127.0.0.1, or any .local domain\n return hostname === 'localhost'\n || hostname === '127.0.0.1'\n || hostname.endsWith('.local');\n}\n\n/**\n * Mock plugin configuration\n */\nexport interface MockPluginConfig {\n /**\n * Enable mock mode by default.\n * When true, mock plugins are activated immediately on app init.\n * @default true (enabled in dev mode by default)\n */\n enabledByDefault?: boolean;\n}\n\n/**\n * Mock plugin factory.\n *\n * Provides centralized mock mode control for API services.\n * Automatically registers the mock slice and initializes mock effects.\n * In dev mode, mock mode is enabled by default.\n *\n * @param config - Optional plugin configuration\n * @returns Mock plugin\n *\n * @example\n * ```typescript\n * const app = createHAI3()\n * .use(effects())\n * .use(mock()) // Automatic mock mode support (enabled in dev)\n * .build();\n *\n * // Toggle mock mode via actions\n * app.actions.toggleMockMode(true);\n * ```\n */\nexport function mock(config?: MockPluginConfig): HAI3Plugin {\n return {\n name: 'mock',\n dependencies: ['effects'],\n\n provides: {\n slices: [mockSlice],\n actions: {\n toggleMockMode,\n },\n },\n\n onInit() {\n // Initialize mock effects after store is ready\n cleanup = initMockEffects();\n\n // Determine if mock mode should be enabled by default\n // Auto-detect dev environment (localhost) unless explicitly configured\n const isDev = isDevEnvironment();\n const enabledByDefault = config?.enabledByDefault ?? isDev;\n\n if (enabledByDefault) {\n // Enable mock mode immediately after initialization\n toggleMockMode(true);\n }\n },\n\n onDestroy() {\n // Cleanup event subscriptions\n if (cleanup) {\n cleanup();\n cleanup = null;\n }\n },\n };\n}\n","/**\n * Microfrontends Plugin\n *\n * Enables MFE capabilities in HAI3 applications.\n * This plugin accepts NO configuration parameters.\n * All MFE registration happens dynamically at runtime.\n *\n * @packageDocumentation\n */\n\nimport {\n screensetsRegistryFactory,\n type MfeHandler,\n HAI3_ACTION_MOUNT_EXT,\n HAI3_ACTION_UNMOUNT_EXT,\n} from '@hai3/screensets';\nimport { gtsPlugin } from '@hai3/screensets/plugins/gts';\nimport { getStore } from '@hai3/state';\nimport type { HAI3Plugin } from '../../types';\nimport { mfeSlice, setExtensionMounted, setExtensionUnmounted } from './slice';\nimport { initMfeEffects } from './effects';\nimport {\n loadExtension,\n mountExtension,\n unmountExtension,\n registerExtension,\n unregisterExtension,\n setMfeRegistry,\n} from './actions';\n\n/**\n * Configuration for the microfrontends plugin.\n */\nexport interface MicrofrontendsConfig {\n /**\n * Optional MFE handlers to register with the screensets registry.\n * Handlers enable loading of specific MFE entry types (e.g., MfeEntryMF).\n *\n * If not provided, no handlers are registered. Applications must register\n * handlers manually via screensetsRegistry API.\n */\n mfeHandlers?: MfeHandler[];\n}\n\n/**\n * Microfrontends plugin factory.\n *\n * Enables MFE capabilities in HAI3 applications. Optionally accepts MFE handlers\n * for registration at plugin initialization.\n *\n * **Key Principles:**\n * - Optional mfeHandlers config for handler registration\n * - NO static domain registration - domains are registered at runtime\n * - Builds screensetsRegistry with GTS plugin at plugin initialization\n * - Same TypeSystemPlugin instance is propagated throughout\n * - Integrates MFE lifecycle with Flux data flow (actions, effects, slice)\n *\n * @param config - Optional configuration with mfeHandlers array\n *\n * @example\n * ```typescript\n * import { createHAI3, microfrontends } from '@hai3/framework';\n * import { MfeHandlerMF } from '@hai3/screensets/mfe/handler';\n * import { gtsPlugin } from '@hai3/screensets/plugins/gts';\n *\n * const app = createHAI3()\n * .use(microfrontends({ mfeHandlers: [new MfeHandlerMF(gtsPlugin)] }))\n * .build();\n *\n * // Register domains dynamically at runtime:\n * app.screensetsRegistry.registerDomain(sidebarDomain, containerProvider);\n *\n * // Use MFE actions:\n * app.actions.loadExtension('my.extension.v1');\n * app.actions.mountExtension('my.extension.v1');\n * ```\n */\nexport function microfrontends(config: MicrofrontendsConfig = {}): HAI3Plugin {\n // Build the ScreensetsRegistry instance with GTS plugin and optional handlers\n // This registry handles all MFE lifecycle: domains, extensions, actions, etc.\n // TypeSystemPlugin binding happens here at application wiring level.\n const screensetsRegistry = screensetsRegistryFactory.build({\n typeSystem: gtsPlugin,\n mfeHandlers: config.mfeHandlers,\n });\n\n // Wrap executeActionsChain to intercept mount/unmount completions for store dispatch\n const originalExecuteActionsChain = screensetsRegistry.executeActionsChain.bind(screensetsRegistry);\n screensetsRegistry.executeActionsChain = async (chain) => {\n await originalExecuteActionsChain(chain);\n // After successful execution, dispatch store updates for mount/unmount\n const actionType = chain.action?.type;\n if (actionType === HAI3_ACTION_MOUNT_EXT) {\n const store = getStore();\n const domainId = chain.action!.target;\n const extensionId = chain.action!.payload?.extensionId as string;\n if (domainId && extensionId) {\n store.dispatch(setExtensionMounted({ domainId, extensionId }));\n }\n } else if (actionType === HAI3_ACTION_UNMOUNT_EXT) {\n const store = getStore();\n const domainId = chain.action!.target;\n if (domainId) {\n store.dispatch(setExtensionUnmounted({ domainId }));\n }\n }\n };\n\n // Store cleanup functions in closure (encapsulated per plugin instance)\n let effectsCleanup: (() => void) | null = null;\n\n return {\n name: 'microfrontends',\n dependencies: ['screensets'], // Requires screensets to be initialized\n\n provides: {\n registries: {\n // Expose the MFE-enabled ScreensetsRegistry\n // This registry has registerDomain(), registerExtension(), etc.\n screensetsRegistry,\n },\n slices: [mfeSlice],\n // NOTE: Effects are NOT initialized via provides.effects.\n // They are initialized in onInit to capture cleanup references.\n // The framework calls provides.effects at build step 5, then onInit at step 7.\n // We only initialize effects in onInit to avoid duplicate event listeners.\n actions: {\n loadExtension,\n mountExtension,\n unmountExtension,\n registerExtension,\n unregisterExtension,\n },\n },\n\n onInit(): void {\n // Wire the registry reference into actions module\n setMfeRegistry(screensetsRegistry);\n\n // Initialize effects and store cleanup references\n effectsCleanup = initMfeEffects(screensetsRegistry);\n\n // Plugin is now initialized\n // TypeSystemPlugin: bound to screensetsRegistry\n // MFE handlers: registered via config.mfeHandlers\n // Base domains: NOT pre-registered - registered dynamically at runtime\n // MFE actions: loadExtension, mountExtension, unmountExtension available\n\n // Plugin is now ready\n // Base domains are NOT registered here - they are registered dynamically\n // at runtime via app.screensetsRegistry.registerDomain() or actions\n },\n\n onDestroy(): void {\n // Cleanup event subscriptions\n if (effectsCleanup) {\n effectsCleanup();\n effectsCleanup = null;\n }\n },\n };\n}\n\n// Re-export MFE actions for direct usage\nexport {\n loadExtension,\n mountExtension,\n unmountExtension,\n registerExtension,\n unregisterExtension,\n type RegisterExtensionPayload,\n type UnregisterExtensionPayload,\n} from './actions';\n\n// Re-export MFE slice and selectors\nexport {\n mfeSlice,\n mfeActions,\n selectExtensionState,\n selectRegisteredExtensions,\n selectExtensionError,\n selectMountedExtension,\n setExtensionMounted,\n setExtensionUnmounted,\n type MfeState,\n type ExtensionRegistrationState,\n} from './slice';\n\n// Re-export HAI3 layout domain constants and MfeEvents\nexport {\n HAI3_POPUP_DOMAIN,\n HAI3_SIDEBAR_DOMAIN,\n HAI3_SCREEN_DOMAIN,\n HAI3_OVERLAY_DOMAIN,\n MfeEvents,\n} from './constants';\n\n// Re-export base ExtensionDomain constants\nexport {\n screenDomain,\n sidebarDomain,\n popupDomain,\n overlayDomain,\n} from './base-domains';\n","/**\n * MFE Slice\n *\n * Store slice for managing MFE registration states.\n * Tracks registration state (unregistered, registering, registered, error) and error messages per extension.\n */\n\nimport { createSlice, type ReducerPayload } from '@hai3/state';\n\n// ============================================================================\n// State Types\n// ============================================================================\n\n/** Extension registration state */\nexport type ExtensionRegistrationState = 'unregistered' | 'registering' | 'registered' | 'error';\n\n/** MFE slice state */\nexport interface MfeState {\n registrationStates: Record<string, ExtensionRegistrationState>;\n errors: Record<string, string>;\n /** Tracks which extension is mounted in each domain. Used as a notification signal for React hooks. */\n mountedExtensions: Record<string, string | undefined>;\n}\n\n// ============================================================================\n// Initial State\n// ============================================================================\n\nconst SLICE_KEY = 'mfe' as const;\n\nconst initialState: MfeState = {\n registrationStates: {},\n errors: {},\n mountedExtensions: {},\n};\n\n// ============================================================================\n// Slice Definition\n// ============================================================================\n\nconst { slice, ...actions } = createSlice({\n name: SLICE_KEY,\n initialState,\n reducers: {\n // Registration state reducers\n setExtensionRegistering: (state: MfeState, action: ReducerPayload<{ extensionId: string }>) => {\n state.registrationStates[action.payload.extensionId] = 'registering';\n },\n\n setExtensionRegistered: (state: MfeState, action: ReducerPayload<{ extensionId: string }>) => {\n state.registrationStates[action.payload.extensionId] = 'registered';\n },\n\n setExtensionUnregistered: (state: MfeState, action: ReducerPayload<{ extensionId: string }>) => {\n state.registrationStates[action.payload.extensionId] = 'unregistered';\n },\n\n setExtensionError: (state: MfeState, action: ReducerPayload<{ extensionId: string; error: string }>) => {\n state.registrationStates[action.payload.extensionId] = 'error';\n state.errors[action.payload.extensionId] = action.payload.error;\n },\n\n // Mount state reducers\n setExtensionMounted: (state: MfeState, action: ReducerPayload<{ domainId: string; extensionId: string }>) => {\n state.mountedExtensions[action.payload.domainId] = action.payload.extensionId;\n },\n\n setExtensionUnmounted: (state: MfeState, action: ReducerPayload<{ domainId: string }>) => {\n state.mountedExtensions[action.payload.domainId] = undefined;\n },\n },\n});\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport const mfeSlice = slice;\nexport const mfeActions = actions;\n\n// Individual actions for convenience\nexport const {\n setExtensionRegistering,\n setExtensionRegistered,\n setExtensionUnregistered,\n setExtensionError,\n setExtensionMounted,\n setExtensionUnmounted,\n} = actions;\n\n// ============================================================================\n// Selectors\n// ============================================================================\n\n/**\n * Select extension registration state for an extension.\n * Returns 'unregistered' if extension is not tracked.\n */\nexport function selectExtensionState(state: { mfe: MfeState }, extensionId: string): ExtensionRegistrationState {\n return state.mfe.registrationStates[extensionId] ?? 'unregistered';\n}\n\n/**\n * Select all registered extensions.\n * Returns array of extension IDs with 'registered' state.\n */\nexport function selectRegisteredExtensions(state: { mfe: MfeState }): string[] {\n return Object.entries(state.mfe.registrationStates)\n .filter(([_, regState]) => regState === 'registered')\n .map(([extensionId]) => extensionId);\n}\n\n/**\n * Select extension error for an extension.\n * Returns undefined if no error.\n */\nexport function selectExtensionError(state: { mfe: MfeState }, extensionId: string): string | undefined {\n return state.mfe.errors[extensionId];\n}\n\n/**\n * Select mounted extension for a domain.\n * Returns the extension ID if mounted, undefined otherwise.\n */\nexport function selectMountedExtension(state: { mfe: MfeState }, domainId: string): string | undefined {\n return state.mfe.mountedExtensions[domainId];\n}\n\nexport default slice.reducer;\n","/**\n * MFE Effects\n *\n * Listens for MFE registration events and coordinates with runtime.\n * Handles registerExtension and unregisterExtension events.\n *\n * Registration effects update slice state and delegate to the ScreensetsRegistry\n * for runtime registration operations.\n */\n\nimport { eventBus, getStore } from '@hai3/state';\nimport { MfeEvents } from './constants';\nimport {\n setExtensionRegistering,\n setExtensionRegistered,\n setExtensionUnregistered,\n setExtensionError,\n} from './slice';\nimport type { ScreensetsRegistry } from '@hai3/screensets';\n\n// ============================================================================\n// Effect Initialization\n// ============================================================================\n\n/**\n * Initialize MFE effects.\n * Call this once during app bootstrap to start listening for MFE events.\n *\n * @param screensetsRegistry - MFE-enabled registry from microfrontends plugin\n * @returns Cleanup function to unsubscribe all effects\n */\nexport function initMfeEffects(screensetsRegistry: ScreensetsRegistry): () => void {\n const store = getStore();\n const unsubscribers: Array<{ unsubscribe: () => void }> = [];\n\n // ============================================================================\n // Register Extension Effect\n // ============================================================================\n\n const unsubRegisterExtension = eventBus.on(MfeEvents.RegisterExtensionRequested, async (payload) => {\n const { extension } = payload;\n\n try {\n // Update state: registering\n store.dispatch(setExtensionRegistering({ extensionId: extension.id }));\n\n // Call runtime to register extension\n await screensetsRegistry.registerExtension(extension);\n\n // Update state: registered\n store.dispatch(setExtensionRegistered({ extensionId: extension.id }));\n } catch (error) {\n // Update state: error\n const errorMessage = error instanceof Error ? error.message : 'Unknown registration error';\n store.dispatch(setExtensionError({ extensionId: extension.id, error: errorMessage }));\n }\n });\n unsubscribers.push(unsubRegisterExtension);\n\n // ============================================================================\n // Unregister Extension Effect\n // ============================================================================\n\n const unsubUnregisterExtension = eventBus.on(MfeEvents.UnregisterExtensionRequested, async (payload) => {\n const { extensionId } = payload;\n\n try {\n // Call runtime to unregister extension\n await screensetsRegistry.unregisterExtension(extensionId);\n\n // Update state: unregistered\n store.dispatch(setExtensionUnregistered({ extensionId }));\n } catch (error) {\n // Update state: error\n const errorMessage = error instanceof Error ? error.message : 'Unknown unregistration error';\n store.dispatch(setExtensionError({ extensionId, error: errorMessage }));\n }\n });\n unsubscribers.push(unsubUnregisterExtension);\n\n // ============================================================================\n // Return Cleanup Function\n // ============================================================================\n\n return () => {\n unsubscribers.forEach((unsub) => unsub.unsubscribe());\n };\n}\n","/**\n * HAI3 Layout Domain Constants (Framework L2)\n *\n * Instance IDs for HAI3 base layout domains.\n * These constants live in @hai3/framework because layout domains\n * are runtime configuration owned by the framework layer.\n *\n * @packageDocumentation\n */\n\n// ============================================================================\n// Layout Domain Instance IDs\n// ============================================================================\n\n/**\n * Popup domain instance ID.\n * Extension domain for popup/modal dialogs.\n */\nexport const HAI3_POPUP_DOMAIN = 'gts.hai3.mfes.ext.domain.v1~hai3.screensets.layout.popup.v1';\n\n/**\n * Sidebar domain instance ID.\n * Extension domain for collapsible side panels.\n */\nexport const HAI3_SIDEBAR_DOMAIN = 'gts.hai3.mfes.ext.domain.v1~hai3.screensets.layout.sidebar.v1';\n\n/**\n * Screen domain instance ID.\n * Extension domain for main content area screens.\n */\nexport const HAI3_SCREEN_DOMAIN = 'gts.hai3.mfes.ext.domain.v1~hai3.screensets.layout.screen.v1';\n\n/**\n * Overlay domain instance ID.\n * Extension domain for full-screen overlays.\n */\nexport const HAI3_OVERLAY_DOMAIN = 'gts.hai3.mfes.ext.domain.v1~hai3.screensets.layout.overlay.v1';\n\n// ============================================================================\n// MFE Event Names\n// ============================================================================\n\n/** MFE event names (registration events only) */\nexport const MfeEvents = {\n RegisterExtensionRequested: 'mfe/registerExtensionRequested',\n UnregisterExtensionRequested: 'mfe/unregisterExtensionRequested',\n} as const;\n","/**\n * MFE Actions\n *\n * Action functions for MFE lifecycle and registration operations.\n * Lifecycle actions call executeActionsChain() directly (fire-and-forget).\n * Registration actions emit events that MFE effects handle.\n */\n\nimport { eventBus } from '@hai3/state';\nimport { MfeEvents } from './constants';\nimport {\n HAI3_ACTION_LOAD_EXT,\n HAI3_ACTION_MOUNT_EXT,\n HAI3_ACTION_UNMOUNT_EXT,\n type Extension,\n type ScreensetsRegistry,\n} from '@hai3/screensets';\n\n// ============================================================================\n// Module-Level Registry Reference\n// ============================================================================\n\nlet screensetsRegistry: ScreensetsRegistry | null = null;\n\n/**\n * Set the MFE-enabled ScreensetsRegistry reference.\n * Called during plugin initialization.\n */\nexport function setMfeRegistry(registry: ScreensetsRegistry): void {\n screensetsRegistry = registry;\n}\n\n/**\n * Helper to resolve domain ID for an extension.\n */\nfunction resolveDomainId(extensionId: string): string {\n if (!screensetsRegistry) {\n throw new Error('MFE registry not initialized. Call setMfeRegistry() before using lifecycle actions.');\n }\n const extension = screensetsRegistry.getExtension(extensionId);\n if (!extension) {\n throw new Error(`Extension '${extensionId}' is not registered. Register it before calling lifecycle actions.`);\n }\n return extension.domain;\n}\n\n// ============================================================================\n// Event Payload Types (Registration Events Only)\n// ============================================================================\n\n/** Payload for register extension event */\nexport interface RegisterExtensionPayload {\n extension: Extension;\n}\n\n/** Payload for unregister extension event */\nexport interface UnregisterExtensionPayload {\n extensionId: string;\n}\n\n// ============================================================================\n// Module Augmentation for Type-Safe Events\n// ============================================================================\n\ndeclare module '@hai3/state' {\n interface EventPayloadMap {\n 'mfe/registerExtensionRequested': RegisterExtensionPayload;\n 'mfe/unregisterExtensionRequested': UnregisterExtensionPayload;\n }\n}\n\n// ============================================================================\n// Lifecycle Action Functions\n// ============================================================================\n\n/**\n * Load an MFE extension bundle.\n * Calls executeActionsChain() directly (fire-and-forget).\n *\n * @param extensionId - Extension to load\n *\n * @example\n * ```typescript\n * import { loadExtension } from '@hai3/framework';\n * loadExtension('gts.hai3.mfes.ext.extension.v1~my.extension.v1');\n * ```\n */\nexport function loadExtension(extensionId: string): void {\n const domainId = resolveDomainId(extensionId);\n\n // Call executeActionsChain fire-and-forget (no await)\n screensetsRegistry!.executeActionsChain({\n action: {\n type: HAI3_ACTION_LOAD_EXT,\n target: domainId,\n payload: { extensionId },\n },\n }).catch((error) => {\n console.error(`[MFE] Load failed for ${extensionId}:`, error);\n });\n}\n\n/**\n * Mount an MFE extension.\n * Auto-loads the extension if not already loaded.\n * The container is provided by the domain's ContainerProvider (registered at domain registration time).\n * Calls executeActionsChain() directly (fire-and-forget).\n *\n * @param extensionId - Extension to mount\n *\n * @example\n * ```typescript\n * import { mountExtension } from '@hai3/framework';\n * mountExtension('gts.hai3.mfes.ext.extension.v1~my.extension.v1');\n * ```\n */\nexport function mountExtension(extensionId: string): void {\n const domainId = resolveDomainId(extensionId);\n\n // Call executeActionsChain fire-and-forget (no await)\n screensetsRegistry!.executeActionsChain({\n action: {\n type: HAI3_ACTION_MOUNT_EXT,\n target: domainId,\n payload: { extensionId },\n },\n }).catch((error) => {\n console.error(`[MFE] Mount failed for ${extensionId}:`, error);\n });\n}\n\n/**\n * Unmount an MFE extension from its container.\n * Calls executeActionsChain() directly (fire-and-forget).\n *\n * @param extensionId - Extension to unmount\n *\n * @example\n * ```typescript\n * import { unmountExtension } from '@hai3/framework';\n * unmountExtension('gts.hai3.mfes.ext.extension.v1~my.extension.v1');\n * ```\n */\nexport function unmountExtension(extensionId: string): void {\n const domainId = resolveDomainId(extensionId);\n\n // Call executeActionsChain fire-and-forget (no await)\n screensetsRegistry!.executeActionsChain({\n action: {\n type: HAI3_ACTION_UNMOUNT_EXT,\n target: domainId,\n payload: { extensionId },\n },\n }).catch((error) => {\n console.error(`[MFE] Unmount failed for ${extensionId}:`, error);\n });\n}\n\n/**\n * Register an extension dynamically at runtime.\n * Emits event that MFE effects handle via runtime.registerExtension().\n *\n * @param extension - Extension instance to register\n *\n * @example\n * ```typescript\n * import { registerExtension } from '@hai3/framework';\n * const extension: Extension = {\n * id: 'gts.hai3.mfes.ext.extension.v1~my.extension.v1',\n * domain: 'gts.hai3.mfes.ext.domain.v1~hai3.screensets.layout.sidebar.v1',\n * entry: 'gts.hai3.mfes.mfe.entry.v1~my.entry.v1',\n * };\n * registerExtension(extension);\n * ```\n */\nexport function registerExtension(extension: Extension): void {\n eventBus.emit(MfeEvents.RegisterExtensionRequested, { extension });\n}\n\n/**\n * Unregister an extension dynamically at runtime.\n * Emits event that MFE effects handle via runtime.unregisterExtension().\n *\n * @param extensionId - Extension ID to unregister\n *\n * @example\n * ```typescript\n * import { unregisterExtension } from '@hai3/framework';\n * unregisterExtension('gts.hai3.mfes.ext.extension.v1~my.extension.v1');\n * ```\n */\nexport function unregisterExtension(extensionId: string): void {\n eventBus.emit(MfeEvents.UnregisterExtensionRequested, { extensionId });\n}\n","/**\n * Base ExtensionDomain Constants (Framework L2)\n *\n * Defines the 4 well-known extension domains as constant objects satisfying\n * the ExtensionDomain interface. These constants are used by the host\n * application to register domains via registerDomain() without hand-authoring\n * JSON.\n *\n * Relationship to string constants:\n * - HAI3_SCREEN_DOMAIN, HAI3_SIDEBAR_DOMAIN, etc. (in constants.ts) are\n * domain ID strings used as action targets in executeActionsChain() calls.\n * - screenDomain, sidebarDomain, etc. (here) are full ExtensionDomain objects\n * whose .id fields reference the same domain ID strings.\n * - Consumers use HAI3_SCREEN_DOMAIN for action targets and screenDomain\n * for registerDomain().\n *\n * Domain Action Support Matrix (from mfe-ext-lifecycle-actions.md):\n * - screen: 2 actions (load_ext, mount_ext) -- NO unmount_ext (swap semantics)\n * - sidebar/popup/overlay: 3 actions (load_ext, mount_ext, unmount_ext) -- toggle semantics\n *\n * @packageDocumentation\n */\n\nimport type { ExtensionDomain } from '@hai3/screensets';\nimport {\n HAI3_ACTION_LOAD_EXT,\n HAI3_ACTION_MOUNT_EXT,\n HAI3_ACTION_UNMOUNT_EXT,\n HAI3_SHARED_PROPERTY_THEME,\n HAI3_SHARED_PROPERTY_LANGUAGE,\n HAI3_SCREEN_EXTENSION_TYPE,\n} from '@hai3/screensets';\nimport {\n HAI3_SCREEN_DOMAIN,\n HAI3_SIDEBAR_DOMAIN,\n HAI3_POPUP_DOMAIN,\n HAI3_OVERLAY_DOMAIN,\n} from './constants';\n\n/**\n * Init-only lifecycle stage (1 stage).\n * Used by the screen domain, which is a permanent fixture: always visible,\n * never destroyed during the application lifespan. It is initialized once\n * at app startup and remains alive until the app itself is torn down.\n */\nconst INIT_ONLY_LIFECYCLE_STAGES: readonly string[] = [\n 'gts.hai3.mfes.lifecycle.stage.v1~hai3.mfes.lifecycle.init.v1',\n];\n\n/**\n * Default lifecycle stage instance IDs (4 stages).\n * Used by sidebar, popup, and overlay domains which can be\n * shown/hidden/destroyed during the application lifespan.\n */\nconst DEFAULT_LIFECYCLE_STAGES: readonly string[] = [\n 'gts.hai3.mfes.lifecycle.stage.v1~hai3.mfes.lifecycle.init.v1',\n 'gts.hai3.mfes.lifecycle.stage.v1~hai3.mfes.lifecycle.activated.v1',\n 'gts.hai3.mfes.lifecycle.stage.v1~hai3.mfes.lifecycle.deactivated.v1',\n 'gts.hai3.mfes.lifecycle.stage.v1~hai3.mfes.lifecycle.destroyed.v1',\n];\n\n/**\n * Screen domain constant.\n *\n * Extension domain for main content area screens.\n * Uses swap semantics: mounting a new screen implicitly unmounts the previous one.\n * Actions: load_ext, mount_ext (NO unmount_ext).\n * Extensions must use extension_screen.v1~ derived type (adds presentation metadata).\n *\n * lifecycleStages: [init] only. The screen domain is a permanent fixture --\n * always visible, never destroyed during the application lifespan. Extensions\n * within the screen domain still go through all 4 stages (extensionsLifecycleStages).\n */\nexport const screenDomain: ExtensionDomain = {\n id: HAI3_SCREEN_DOMAIN,\n actions: [HAI3_ACTION_LOAD_EXT, HAI3_ACTION_MOUNT_EXT],\n extensionsActions: [],\n sharedProperties: [HAI3_SHARED_PROPERTY_THEME, HAI3_SHARED_PROPERTY_LANGUAGE],\n defaultActionTimeout: 30000,\n lifecycleStages: [...INIT_ONLY_LIFECYCLE_STAGES],\n extensionsLifecycleStages: [...DEFAULT_LIFECYCLE_STAGES],\n extensionsTypeId: HAI3_SCREEN_EXTENSION_TYPE,\n lifecycle: undefined,\n};\n\n/**\n * Sidebar domain constant.\n *\n * Extension domain for collapsible side panels.\n * Uses toggle semantics: extensions can be explicitly mounted and unmounted.\n * 3 actions: load_ext, mount_ext, unmount_ext.\n */\nexport const sidebarDomain: ExtensionDomain = {\n id: HAI3_SIDEBAR_DOMAIN,\n actions: [HAI3_ACTION_LOAD_EXT, HAI3_ACTION_MOUNT_EXT, HAI3_ACTION_UNMOUNT_EXT],\n extensionsActions: [],\n sharedProperties: [HAI3_SHARED_PROPERTY_THEME, HAI3_SHARED_PROPERTY_LANGUAGE],\n defaultActionTimeout: 30000,\n lifecycleStages: [...DEFAULT_LIFECYCLE_STAGES],\n extensionsLifecycleStages: [...DEFAULT_LIFECYCLE_STAGES],\n lifecycle: undefined,\n};\n\n/**\n * Popup domain constant.\n *\n * Extension domain for popup/modal dialogs.\n * Uses toggle semantics: extensions can be explicitly mounted and unmounted.\n * 3 actions: load_ext, mount_ext, unmount_ext.\n */\nexport const popupDomain: ExtensionDomain = {\n id: HAI3_POPUP_DOMAIN,\n actions: [HAI3_ACTION_LOAD_EXT, HAI3_ACTION_MOUNT_EXT, HAI3_ACTION_UNMOUNT_EXT],\n extensionsActions: [],\n sharedProperties: [HAI3_SHARED_PROPERTY_THEME, HAI3_SHARED_PROPERTY_LANGUAGE],\n defaultActionTimeout: 30000,\n lifecycleStages: [...DEFAULT_LIFECYCLE_STAGES],\n extensionsLifecycleStages: [...DEFAULT_LIFECYCLE_STAGES],\n lifecycle: undefined,\n};\n\n/**\n * Overlay domain constant.\n *\n * Extension domain for full-screen overlays.\n * Uses toggle semantics: extensions can be explicitly mounted and unmounted.\n * 3 actions: load_ext, mount_ext, unmount_ext.\n */\nexport const overlayDomain: ExtensionDomain = {\n id: HAI3_OVERLAY_DOMAIN,\n actions: [HAI3_ACTION_LOAD_EXT, HAI3_ACTION_MOUNT_EXT, HAI3_ACTION_UNMOUNT_EXT],\n extensionsActions: [],\n sharedProperties: [HAI3_SHARED_PROPERTY_THEME, HAI3_SHARED_PROPERTY_LANGUAGE],\n defaultActionTimeout: 30000,\n lifecycleStages: [...DEFAULT_LIFECYCLE_STAGES],\n extensionsLifecycleStages: [...DEFAULT_LIFECYCLE_STAGES],\n lifecycle: undefined,\n};\n","/**\n * Presets - Pre-configured plugin combinations\n *\n * Framework Layer: L2\n */\n\nimport type { HAI3Plugin, Presets, ThemesConfig } from '../types';\nimport { screensets } from '../plugins/screensets';\nimport { themes } from '../plugins/themes';\nimport { layout } from '../plugins/layout';\nimport { i18n } from '../plugins/i18n';\nimport { effects } from '../plugins/effects';\nimport { mock } from '../plugins/mock';\nimport { microfrontends, type MicrofrontendsConfig } from '../plugins/microfrontends';\n\n/**\n * Full preset configuration.\n */\nexport interface FullPresetConfig {\n /** Configuration for themes plugin */\n themes?: ThemesConfig;\n /** Configuration for microfrontends plugin */\n microfrontends?: MicrofrontendsConfig;\n}\n\n/**\n * Full preset - All plugins for the complete HAI3 experience.\n * This is the default for `hai3 create` projects.\n *\n * Includes:\n * - screensets (screenset registry, screen slice)\n * - themes (theme registry, changeTheme action)\n * - layout (all layout domain slices and effects)\n * - i18n (i18n registry, setLanguage action)\n * - effects (effect coordination)\n * - mock (mock mode control for API services)\n * - microfrontends (MFE registry, actions, effects)\n *\n * @param config - Optional preset configuration\n *\n * @example\n * ```typescript\n * import { applyTheme } from '@hai3/uikit';\n * import { MfeHandlerMF } from '@hai3/screensets/mfe/handler';\n * import { gtsPlugin } from '@hai3/screensets/plugins/gts';\n *\n * const app = createHAI3()\n * .use(full({\n * themes: { applyFn: applyTheme },\n * microfrontends: { mfeHandlers: [new MfeHandlerMF(gtsPlugin)] }\n * }))\n * .build();\n * ```\n */\nexport function full(config?: FullPresetConfig): HAI3Plugin[] {\n return [\n effects(),\n screensets({ autoDiscover: true }),\n themes(config?.themes),\n layout(),\n i18n(),\n mock(),\n microfrontends(config?.microfrontends),\n ];\n}\n\n/**\n * Minimal preset - Screensets + themes only.\n * For users who want basic HAI3 patterns without full layout management.\n *\n * Includes:\n * - screensets (screenset registry, screen slice)\n * - themes (theme registry, changeTheme action)\n */\nexport function minimal(): HAI3Plugin[] {\n return [\n screensets({ autoDiscover: true }),\n themes(),\n ];\n}\n\n/**\n * Headless preset - Screensets only.\n * For external platform integration where you only need screenset orchestration.\n * The external platform provides its own menu, header, navigation, etc.\n *\n * Includes:\n * - screensets (screenset registry, screen slice)\n */\nexport function headless(): HAI3Plugin[] {\n return [\n screensets(),\n ];\n}\n\n/**\n * Presets collection\n */\nexport const presets: Presets = {\n full,\n minimal,\n headless,\n};\n","/**\n * createHAI3App - Convenience function for full HAI3 application\n *\n * Creates a fully configured HAI3 application using the full preset.\n *\n * Framework Layer: L2\n */\n\nimport { createHAI3 } from './createHAI3';\nimport { full, type FullPresetConfig } from './presets';\nimport type { HAI3Config, HAI3App } from './types';\n\n/**\n * Combined configuration for createHAI3App.\n * Includes both HAI3 core config and full preset config.\n */\nexport interface HAI3AppConfig extends HAI3Config, FullPresetConfig {}\n\n/**\n * Create a fully configured HAI3 application.\n *\n * This is a convenience function that uses the full preset.\n * For custom plugin composition, use `createHAI3()` instead.\n *\n * @param config - Optional application configuration\n * @returns The built HAI3 application\n *\n * @example\n * ```typescript\n * // Default - uses full() preset\n * const app = createHAI3App();\n *\n * // With theme apply function\n * import { applyTheme } from '@hai3/uikit';\n * const app = createHAI3App({ themes: { applyFn: applyTheme } });\n *\n * // With configuration\n * const app = createHAI3App({ devMode: true });\n * ```\n */\nexport function createHAI3App(config?: HAI3AppConfig): HAI3App {\n return createHAI3(config)\n .useAll(full({\n themes: config?.themes,\n microfrontends: config?.microfrontends,\n }))\n .build();\n}\n","/**\n * @hai3/framework - HAI3 Framework Package\n *\n * This package provides:\n * - Plugin architecture for composable HAI3 applications\n * - Registries for screensets, themes, routes\n * - Presets for common configurations\n * - Re-exports from SDK packages for convenience\n *\n * Framework Layer: L2 (Depends on all SDK packages)\n */\n\n// ============================================================================\n// Core Exports\n// ============================================================================\n\nexport { createHAI3 } from './createHAI3';\nexport { createHAI3App, type HAI3AppConfig } from './createHAI3App';\n\n// ============================================================================\n// Plugin Exports\n// ============================================================================\n\nexport {\n screensets,\n themes,\n layout,\n i18n,\n effects,\n mock,\n microfrontends,\n type MockPluginConfig,\n} from './plugins';\n\n// MFE Plugin Exports\nexport {\n loadExtension,\n mountExtension,\n unmountExtension,\n registerExtension,\n unregisterExtension,\n selectExtensionState,\n selectRegisteredExtensions,\n selectExtensionError,\n HAI3_POPUP_DOMAIN,\n HAI3_SIDEBAR_DOMAIN,\n HAI3_SCREEN_DOMAIN,\n HAI3_OVERLAY_DOMAIN,\n // Base ExtensionDomain constants\n screenDomain,\n sidebarDomain,\n popupDomain,\n overlayDomain,\n} from './plugins';\n\n// MFE Type Constants (re-exported from @hai3/screensets for convenience)\nexport {\n HAI3_SCREEN_EXTENSION_TYPE,\n} from '@hai3/screensets';\n\n// MFE Action Constants (re-exported from @hai3/screensets for convenience)\nexport {\n HAI3_ACTION_LOAD_EXT,\n HAI3_ACTION_MOUNT_EXT,\n HAI3_ACTION_UNMOUNT_EXT,\n} from '@hai3/screensets';\n\n// MFE Shared Property Constants (re-exported from @hai3/screensets for convenience)\nexport {\n HAI3_SHARED_PROPERTY_THEME,\n HAI3_SHARED_PROPERTY_LANGUAGE,\n} from '@hai3/screensets';\n\n// MFE Types (re-exported from @hai3/screensets for convenience)\nexport type {\n ChildMfeBridge,\n ParentMfeBridge,\n Extension,\n ScreenExtension,\n ExtensionPresentation,\n ExtensionDomain,\n ActionsChain,\n Action,\n SharedProperty,\n LifecycleStage,\n LifecycleHook,\n MfeEntryLifecycle,\n MfeEntry,\n MfeEntryMF,\n JSONSchema,\n ValidationError,\n ValidationResult,\n LoadExtPayload,\n MountExtPayload,\n UnmountExtPayload,\n ScreensetsRegistryConfig,\n TypeSystemPlugin,\n} from '@hai3/screensets';\n\n// MFE Abstract Classes (re-exported from @hai3/screensets for convenience)\nexport {\n MfeHandler,\n MfeBridgeFactory,\n ScreensetsRegistry,\n ScreensetsRegistryFactory,\n screensetsRegistryFactory,\n ContainerProvider,\n} from '@hai3/screensets';\n\n// MFE Concrete Implementations (re-exported from @hai3/screensets subpath exports)\nexport { MfeHandlerMF } from '@hai3/screensets/mfe/handler';\nexport { gtsPlugin } from '@hai3/screensets/plugins/gts';\n\n// MFE Utilities (re-exported from @hai3/screensets for convenience)\nexport {\n createShadowRoot,\n injectCssVariables,\n extractGtsPackage,\n} from '@hai3/screensets';\n\n// MFE Plugin Types\nexport type {\n MfeState,\n ExtensionRegistrationState,\n RegisterExtensionPayload,\n UnregisterExtensionPayload,\n MicrofrontendsConfig,\n} from './plugins';\n\n// ============================================================================\n// Preset Exports\n// ============================================================================\n\nexport { presets, full, minimal, headless, type FullPresetConfig } from './presets';\n\n// ============================================================================\n// Registry Exports\n// ============================================================================\n\nexport {\n createThemeRegistry,\n} from './registries';\n\n// ============================================================================\n// Type Exports\n// ============================================================================\n\nexport type {\n HAI3Config,\n HAI3Plugin,\n HAI3AppBuilder,\n HAI3App,\n PluginFactory,\n PluginProvides,\n PluginLifecycle,\n ThemeRegistry,\n ThemeConfig,\n ThemeApplyFn,\n UikitTheme,\n RouterMode,\n Preset,\n Presets,\n ScreensetsConfig,\n ThemesConfig,\n ShowPopupPayload,\n ChangeThemePayload,\n SetLanguagePayload,\n} from './types';\n\n// ============================================================================\n// Re-exports from SDK packages for convenience\n// ============================================================================\n\n// From @hai3/state (unified Flux dataflow pattern)\nexport { eventBus, createStore, getStore, registerSlice, hasSlice, createSlice } from '@hai3/state';\nexport type {\n EventBus,\n ReducerPayload,\n EventPayloadMap,\n EventHandler,\n Subscription,\n RootState,\n AppDispatch,\n SliceObject,\n EffectInitializer,\n} from '@hai3/state';\n\n// Re-export HAI3Store from types (wrapped version)\nexport type { HAI3Store } from './types';\n\n// From @hai3/screensets (contracts only - SDK Layer L1)\nexport { LayoutDomain } from '@hai3/screensets';\n\n// Layout slices (owned by @hai3/framework)\nexport {\n layoutReducer,\n layoutDomainReducers,\n LAYOUT_SLICE_NAME,\n // Tenant slice (app-level, not layout)\n TENANT_SLICE_NAME,\n tenantSlice,\n tenantActions,\n tenantReducer,\n setTenant,\n setTenantLoading,\n clearTenant,\n // Mock slice (app-level, not layout)\n mockSlice,\n mockActions,\n setMockEnabled,\n // Domain slices\n headerSlice,\n footerSlice,\n menuSlice,\n sidebarSlice,\n screenSlice,\n popupSlice,\n overlaySlice,\n // Domain actions\n headerActions,\n footerActions,\n menuActions,\n sidebarActions,\n screenActions,\n popupActions,\n overlayActions,\n // Individual reducer functions - header\n setUser,\n setHeaderLoading,\n clearUser,\n // Individual reducer functions - footer\n setFooterVisible,\n setFooterConfig,\n toggleMenu,\n setMenuCollapsed,\n setMenuItems,\n setMenuVisible,\n setMenuConfig,\n toggleSidebar,\n setSidebarCollapsed,\n setSidebarPosition,\n setSidebarTitle,\n setSidebarContent,\n setSidebarVisible,\n setSidebarWidth,\n setSidebarConfig,\n setActiveScreen,\n setScreenLoading,\n navigateTo,\n clearActiveScreen,\n openPopup,\n closePopup,\n closeTopPopup,\n closeAllPopups,\n showOverlay,\n hideOverlay,\n setOverlayVisible,\n} from './slices';\n\n// PopupSliceState type\nexport type { PopupSliceState } from './slices';\n\n// Layout state types (defined locally to avoid circular deps with uicore/react)\nexport type {\n // App-level types\n Tenant,\n TenantState,\n // Layout domain types\n HeaderUser,\n HeaderState,\n HeaderConfig,\n FooterState,\n FooterConfig,\n MenuItem,\n MenuState,\n SidebarPosition,\n SidebarState,\n ScreenState,\n PopupState,\n PopupConfig,\n OverlayState,\n OverlayConfig,\n LayoutState,\n LayoutDomainState,\n RootStateWithLayout,\n LayoutDomainReducers,\n} from './layoutTypes';\n\n// Mock state type\nexport type { MockState } from './slices/mockSlice';\n\n// Tenant effects and events\nexport {\n initTenantEffects,\n TenantEvents,\n} from './effects/tenantEffects';\nexport type { TenantChangedPayload, TenantClearedPayload } from './effects/tenantEffects';\nexport {\n changeTenant,\n clearTenantAction,\n setTenantLoadingState,\n} from './effects/tenantActions';\n\n// Mock effects and events\nexport {\n initMockEffects,\n toggleMockMode,\n MockEvents,\n} from './effects/mockEffects';\nexport type { MockTogglePayload } from './effects/mockEffects';\n\n// From @hai3/api\nexport {\n apiRegistry,\n BaseApiService,\n RestProtocol,\n SseProtocol,\n // Protocol-specific mock plugins (replaces generic MockPlugin)\n RestMockPlugin,\n SseMockPlugin,\n MockEventSource,\n // Plugin base classes\n ApiPluginBase,\n ApiPlugin,\n ApiProtocol,\n RestPlugin,\n RestPluginWithConfig,\n SsePlugin,\n SsePluginWithConfig,\n // Type guards\n isShortCircuit,\n isRestShortCircuit,\n isSseShortCircuit,\n // Mock plugin identification\n MOCK_PLUGIN,\n isMockPlugin,\n} from '@hai3/api';\nexport type {\n MockMap,\n ApiServiceConfig,\n JsonValue,\n JsonObject,\n JsonPrimitive,\n JsonCompatible,\n SseProtocolConfig,\n RestProtocolConfig,\n // Plugin context types (class-based plugin system)\n ApiRequestContext,\n ApiResponseContext,\n ShortCircuitResponse,\n PluginClass,\n ProtocolClass,\n ProtocolPluginType,\n BasePluginHooks,\n // Protocol-specific types\n RestPluginHooks,\n SsePluginHooks,\n RestRequestContext,\n RestResponseContext,\n ApiPluginErrorContext,\n SseConnectContext,\n EventSourceLike,\n RestShortCircuitResponse,\n SseShortCircuitResponse,\n RestMockConfig,\n SseMockConfig,\n SseMockEvent,\n} from '@hai3/api';\n\n\n// NOTE: AccountsApiService, ACCOUNTS_DOMAIN, and account types (ApiUser, UserRole, etc.)\n// have been moved to CLI templates. They are now generated by `hai3 scaffold layout`\n// and should be imported from user code (e.g., @/layout/api or @/api).\n\n// From @hai3/i18n\nexport { i18nRegistry, I18nRegistryImpl, createI18nRegistry, Language, SUPPORTED_LANGUAGES, getLanguageMetadata, TextDirection, LanguageDisplayMode } from '@hai3/i18n';\nexport type { I18nConfig, TranslationLoader, TranslationMap, TranslationDictionary, LanguageMetadata, I18nRegistry as I18nRegistryType } from '@hai3/i18n';\n\n// Formatters (locale from i18nRegistry.getLanguage())\nexport {\n formatDate,\n formatTime,\n formatDateTime,\n formatRelative,\n formatNumber,\n formatPercent,\n formatCompact,\n formatCurrency,\n compareStrings,\n createCollator,\n type DateFormatStyle,\n type TimeFormatStyle,\n type DateInput,\n} from '@hai3/i18n';\nexport type { Formatters } from '@hai3/i18n';\n\n// Backward compatibility aliases\n// I18nRegistry type (capital I) - alias for consistency with old @hai3/uicore API\nexport { I18nRegistryImpl as I18nRegistry } from '@hai3/i18n';\n\n// Backward compatibility constants\nexport {\n ACCOUNTS_DOMAIN,\n} from './compat';\n\n// ============================================================================\n// Migration Helpers (for @hai3/uicore backward compatibility)\n// ============================================================================\n\nexport {\n createLegacySelector,\n setDeprecationWarnings,\n isDeprecationWarningsEnabled,\n getLayoutDomainState,\n hasLegacyUicoreState,\n hasNewLayoutState,\n STATE_PATH_MAPPING,\n} from './migration';\n\nexport type {\n LegacyUicoreState,\n LegacyRootState,\n Selector,\n} from './migration';\n","/**\n * Tenant Effects\n *\n * Listens for tenant events and updates the tenant slice.\n * Event-driven architecture: consuming apps emit events, effects handle state updates.\n */\n\nimport { eventBus, getStore } from '@hai3/state';\nimport { setTenant, clearTenant } from '../slices/tenantSlice';\nimport type { Tenant } from '../layoutTypes';\n\n// ============================================================================\n// Event Types\n// ============================================================================\n\n/** Tenant event names */\nexport const TenantEvents = {\n Changed: 'app/tenant/changed',\n Cleared: 'app/tenant/cleared',\n} as const;\n\n/** Payload for tenant changed event */\nexport interface TenantChangedPayload {\n tenant: Tenant;\n}\n\n/** Payload for tenant cleared event */\nexport interface TenantClearedPayload {\n // Empty payload\n}\n\n// ============================================================================\n// Module Augmentation for Type-Safe Events\n// ============================================================================\n\ndeclare module '@hai3/state' {\n interface EventPayloadMap {\n 'app/tenant/changed': TenantChangedPayload;\n 'app/tenant/cleared': TenantClearedPayload;\n }\n}\n\n// ============================================================================\n// Effect Registration\n// ============================================================================\n\n/**\n * Initialize tenant effects\n * Call this once during app bootstrap to start listening for tenant events.\n */\nexport function initTenantEffects(): () => void {\n const store = getStore();\n\n // Listen for tenant changed event\n const subChanged = eventBus.on(TenantEvents.Changed, (payload) => {\n store.dispatch(setTenant(payload.tenant));\n });\n\n // Listen for tenant cleared event\n const subCleared = eventBus.on(TenantEvents.Cleared, () => {\n store.dispatch(clearTenant());\n });\n\n // Return cleanup function\n return () => {\n subChanged.unsubscribe();\n subCleared.unsubscribe();\n };\n}\n","/**\n * Tenant Actions\n *\n * Action functions for setting and clearing tenant.\n * These emit events that are consumed by tenantEffects.\n */\n\nimport { eventBus, getStore } from '@hai3/state';\nimport { setTenantLoading } from '../slices/tenantSlice';\nimport { TenantEvents } from './tenantEffects';\nimport type { Tenant } from '../layoutTypes';\n\n/**\n * Set tenant via event bus\n * This is the recommended way for consuming apps to set tenant.\n *\n * @example\n * ```typescript\n * import { changeTenant } from '@hai3/framework';\n * changeTenant({ id: 'tenant-123' });\n * ```\n */\nexport function changeTenant(tenant: Tenant): void {\n eventBus.emit(TenantEvents.Changed, { tenant });\n}\n\n/**\n * Clear tenant via event bus\n */\nexport function clearTenantAction(): void {\n eventBus.emit(TenantEvents.Cleared, {});\n}\n\n/**\n * Set tenant loading state (direct dispatch, for internal use)\n */\nexport function setTenantLoadingState(loading: boolean): void {\n getStore().dispatch(setTenantLoading(loading));\n}\n","/**\n * Backward Compatibility Exports\n *\n * These exports provide backward compatibility with @hai3/uicore API.\n * They are singletons that mirror the old API.\n *\n * NOTE: These are exported for migration convenience but may be deprecated\n * in future major versions. Prefer using the plugin architecture.\n */\n\n// ACCOUNTS_DOMAIN constant for backward compatibility\n// NOTE: AccountsApiService has been moved to CLI templates\n// This constant is kept for legacy code that references it\nexport const ACCOUNTS_DOMAIN = 'accounts' as const;\n\n// ============================================================================\n// Singleton Registries (backward compatibility)\n// ============================================================================\n","/**\n * Migration Helpers - Utilities for migrating from @hai3/uicore\n *\n * These helpers assist users migrating from the deprecated @hai3/uicore package\n * to the new SDK architecture (@hai3/framework, @hai3/screensets, @hai3/react).\n *\n * Framework Layer: L2\n */\n\nimport type { RootStateWithLayout } from './layoutTypes';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Legacy uicore state structure (for reference/backward compat)\n */\nexport interface LegacyUicoreState {\n app: {\n user: unknown | null;\n tenant: unknown | null;\n language: string | null;\n translationsReady: boolean;\n screenTranslationsVersion: number;\n loading: boolean;\n error: string | null;\n useMockApi: boolean;\n };\n layout: {\n theme: string;\n currentScreenset: string;\n selectedScreen: string | null;\n };\n header: Record<string, unknown>;\n footer: {\n screensetOptions: unknown[];\n visible: boolean;\n };\n menu: {\n collapsed: boolean;\n items: unknown[];\n visible: boolean;\n };\n sidebar: {\n collapsed: boolean;\n position: string;\n title: string | null;\n content: unknown;\n visible: boolean;\n };\n screen: {\n activeScreen: string | null;\n loading: boolean;\n };\n popup: {\n stack: unknown[];\n };\n overlay: {\n visible: boolean;\n };\n}\n\n/**\n * Legacy root state with uicore key\n */\nexport interface LegacyRootState {\n uicore: LegacyUicoreState;\n [key: string]: unknown;\n}\n\n/**\n * State accessor function type\n * Note: \"Selector\" terminology avoided (Redux-specific). Use useAppSelector hook for state access.\n */\nexport type Selector<TState, TResult> = (state: TState) => TResult;\n\n// ============================================================================\n// Migration Path Mapping\n// ============================================================================\n\n/**\n * State path mapping from legacy to new structure\n */\nexport const STATE_PATH_MAPPING = {\n // App state (moved to app slice)\n 'uicore.app.user': 'app.user',\n 'uicore.app.tenant': 'app.tenant',\n 'uicore.app.language': 'app.language',\n 'uicore.app.translationsReady': 'app.translationsReady',\n 'uicore.app.loading': 'app.loading',\n 'uicore.app.error': 'app.error',\n 'uicore.app.useMockApi': 'app.useMockApi',\n\n // Layout state (split into domains)\n 'uicore.layout.theme': 'app.theme',\n 'uicore.layout.currentScreenset': 'app.currentScreenset',\n 'uicore.layout.selectedScreen': 'layout.screen.activeScreen',\n\n // Domain states (moved to layout.*)\n 'uicore.header': 'layout.header',\n 'uicore.footer': 'layout.footer',\n 'uicore.menu': 'layout.menu',\n 'uicore.sidebar': 'layout.sidebar',\n 'uicore.screen': 'layout.screen',\n 'uicore.popup': 'layout.popup',\n 'uicore.overlay': 'layout.overlay',\n} as const;\n\n// ============================================================================\n// Legacy Selector Factory\n// ============================================================================\n\nlet deprecationWarningsEnabled = true;\n\n/**\n * Enable or disable deprecation warnings globally\n */\nexport function setDeprecationWarnings(enabled: boolean): void {\n deprecationWarningsEnabled = enabled;\n}\n\n/**\n * Check if deprecation warnings are enabled\n */\nexport function isDeprecationWarningsEnabled(): boolean {\n return deprecationWarningsEnabled;\n}\n\n/**\n * Create a legacy selector that wraps a new selector with deprecation warnings\n *\n * @param legacyPath - The old state path being accessed (for warning message)\n * @param newSelector - The new selector to use\n * @param migrationHint - Hint for how to migrate (optional)\n * @returns A selector that logs a deprecation warning then returns the new value\n *\n * @example\n * ```typescript\n * import { createLegacySelector, selectMenuCollapsed } from '@hai3/framework';\n *\n * // Create a legacy selector\n * const selectMenuCollapsedLegacy = createLegacySelector(\n * 'uicore.menu.collapsed',\n * selectMenuCollapsed,\n * 'Use selectMenuCollapsed from @hai3/framework'\n * );\n *\n * // In component (will show deprecation warning in dev)\n * const collapsed = useSelector(selectMenuCollapsedLegacy);\n * ```\n */\nexport function createLegacySelector<TState, TResult>(\n legacyPath: string,\n newSelector: Selector<TState, TResult>,\n migrationHint?: string\n): Selector<TState, TResult> {\n let hasWarned = false;\n\n return (state: TState): TResult => {\n if (deprecationWarningsEnabled && !hasWarned && process.env.NODE_ENV === 'development') {\n hasWarned = true;\n const newPath = STATE_PATH_MAPPING[legacyPath as keyof typeof STATE_PATH_MAPPING] ?? 'unknown';\n const hint = migrationHint ?? `Use the new state path: ${newPath}`;\n console.warn(\n `[HAI3 Migration] Deprecated selector accessing \"${legacyPath}\". ${hint}`\n );\n }\n return newSelector(state);\n };\n}\n\n// ============================================================================\n// Legacy State Accessors\n// ============================================================================\n\n/**\n * Get layout domain state from the new structure\n * Maps to what was previously `state.uicore.header`, `state.uicore.menu`, etc.\n */\nexport function getLayoutDomainState<K extends keyof RootStateWithLayout['layout']>(\n state: RootStateWithLayout,\n domain: K\n): RootStateWithLayout['layout'][K] {\n return state.layout[domain];\n}\n\n/**\n * Check if a state object has the legacy uicore structure\n */\nexport function hasLegacyUicoreState(state: unknown): state is LegacyRootState {\n return (\n typeof state === 'object' &&\n state !== null &&\n 'uicore' in state &&\n typeof (state as Record<string, unknown>).uicore === 'object'\n );\n}\n\n/**\n * Check if a state object has the new layout structure\n */\nexport function hasNewLayoutState(state: unknown): state is RootStateWithLayout {\n return (\n typeof state === 'object' &&\n state !== null &&\n 'layout' in state &&\n typeof (state as Record<string, unknown>).layout === 'object'\n );\n}\n"],"mappings":"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","names":["effects","actions","slice","createSlice","SLICE_KEY","initialState","slice","slice","createSlice","SLICE_KEY","initialState","slice","slice","createSlice","SLICE_KEY","initialState","slice","slice","createSlice","SLICE_KEY","initialState","slice","slice","createSlice","SLICE_KEY","initialState","slice","slice","createSlice","SLICE_KEY","initialState","slice","slice","createSlice","SLICE_KEY","initialState","slice","slice","createSlice","SLICE_KEY","initialState","slice","slice","themes","config","themes","eventBus","eventBus","showOverlay","hideOverlay","eventBus","i18nRegistry","eventBus","getStore","apiRegistry","apiRegistry","getStore","eventBus","HAI3_ACTION_MOUNT_EXT","HAI3_ACTION_UNMOUNT_EXT","getStore","createSlice","SLICE_KEY","initialState","slice","slice","eventBus","getStore","screensetsRegistry","getStore","eventBus","eventBus","eventBus","HAI3_ACTION_LOAD_EXT","HAI3_ACTION_MOUNT_EXT","HAI3_ACTION_UNMOUNT_EXT","HAI3_SHARED_PROPERTY_THEME","HAI3_SHARED_PROPERTY_LANGUAGE","HAI3_ACTION_LOAD_EXT","HAI3_ACTION_MOUNT_EXT","HAI3_SHARED_PROPERTY_THEME","HAI3_SHARED_PROPERTY_LANGUAGE","HAI3_ACTION_UNMOUNT_EXT","screensetsRegistry","HAI3_ACTION_MOUNT_EXT","getStore","HAI3_ACTION_UNMOUNT_EXT","HAI3_SCREEN_EXTENSION_TYPE","HAI3_ACTION_LOAD_EXT","HAI3_ACTION_MOUNT_EXT","HAI3_ACTION_UNMOUNT_EXT","HAI3_SHARED_PROPERTY_THEME","HAI3_SHARED_PROPERTY_LANGUAGE","screensetsRegistryFactory","gtsPlugin","eventBus","getStore","registerSlice","createSlice","eventBus","getStore","getStore","eventBus","eventBus","getStore","eventBus","getStore","apiRegistry","isMockPlugin","Language","I18nRegistryImpl"]}
1
+ {"version":3,"sources":["../src/createHAI3.ts","../src/slices/index.ts","../src/slices/headerSlice.ts","../src/slices/footerSlice.ts","../src/slices/menuSlice.ts","../src/slices/sidebarSlice.ts","../src/slices/screenSlice.ts","../src/slices/popupSlice.ts","../src/slices/overlaySlice.ts","../src/slices/tenantSlice.ts","../src/slices/mockSlice.ts","../src/plugins/screensets.ts","../src/plugins/themes.ts","../src/registries/themeRegistry.ts","../src/plugins/layout.ts","../src/plugins/i18n.ts","../src/plugins/effects.ts","../src/effects/mockEffects.ts","../src/plugins/mock.ts","../src/plugins/microfrontends/index.ts","../src/plugins/microfrontends/slice.ts","../src/plugins/microfrontends/effects.ts","../src/plugins/microfrontends/constants.ts","../src/plugins/microfrontends/actions.ts","../src/plugins/microfrontends/base-domains.ts","../src/presets/index.ts","../src/createHAI3App.ts","../src/index.ts","../src/effects/tenantEffects.ts","../src/effects/tenantActions.ts","../src/compat.ts","../src/migration.ts"],"sourcesContent":["/**\n * createHAI3 - App Builder Factory\n *\n * Creates a HAI3 app builder for custom plugin composition.\n * This is the core of the plugin architecture.\n *\n * Framework Layer: L2 (Depends on SDK packages)\n */\n\n// @cpt-flow:cpt-hai3-flow-framework-composition-app-bootstrap:p1\n// @cpt-flow:cpt-hai3-flow-framework-composition-plugin-dependency:p1\n// @cpt-algo:cpt-hai3-algo-framework-composition-dep-resolution:p1\n// @cpt-algo:cpt-hai3-algo-framework-composition-provides-aggregation:p1\n// @cpt-state:cpt-hai3-state-framework-composition-builder:p1\n// @cpt-flow:cpt-hai3-flow-framework-composition-teardown:p2\n// @cpt-dod:cpt-hai3-dod-framework-composition-builder:p1\n\nimport { getStore, registerSlice } from '@hai3/state';\nimport type { EffectInitializer } from '@hai3/state';\nimport type {\n HAI3Config,\n HAI3Plugin,\n HAI3AppBuilder,\n HAI3App,\n HAI3Actions,\n HAI3Store,\n PluginFactory,\n RegisterableSlice,\n ThemeRegistry,\n} from './types';\nimport { apiRegistry } from '@hai3/api';\n\n// ============================================================================\n// Plugin Resolution\n// ============================================================================\n\n// @cpt-begin:cpt-hai3-flow-framework-composition-plugin-dependency:p1:inst-1\n/**\n * Check if value is a plugin factory function\n */\nfunction isPluginFactory(\n value: HAI3Plugin | PluginFactory\n): value is PluginFactory {\n return typeof value === 'function';\n}\n\n/**\n * Resolve plugin - if it's a factory, call it; otherwise return as-is\n */\nfunction resolvePlugin(plugin: HAI3Plugin | PluginFactory): HAI3Plugin {\n return isPluginFactory(plugin) ? plugin() : plugin;\n}\n// @cpt-end:cpt-hai3-flow-framework-composition-plugin-dependency:p1:inst-1\n\n// ============================================================================\n// App Builder Implementation\n// ============================================================================\n\n/**\n * HAI3 App Builder Implementation\n */\nclass HAI3AppBuilderImpl implements HAI3AppBuilder {\n private plugins: HAI3Plugin[] = [];\n private config: HAI3Config;\n\n constructor(config: HAI3Config = {}) {\n this.config = {\n name: 'HAI3 App',\n devMode: false,\n strictMode: false,\n ...config,\n };\n }\n\n /**\n * Add a plugin to the application.\n * Also accepts an array of plugins (for preset support).\n */\n // @cpt-begin:cpt-hai3-flow-framework-composition-app-bootstrap:p1:inst-1\n // @cpt-begin:cpt-hai3-state-framework-composition-builder:p1:inst-1\n use(plugin: HAI3Plugin | PluginFactory | HAI3Plugin[]): HAI3AppBuilder {\n // Handle arrays (presets return arrays)\n if (Array.isArray(plugin)) {\n plugin.forEach((p) => this.use(p));\n return this;\n }\n\n const resolved = resolvePlugin(plugin);\n\n // Check if plugin already registered\n if (this.plugins.some((p) => p.name === resolved.name)) {\n if (this.config.devMode) {\n console.warn(\n `Plugin \"${resolved.name}\" is already registered. Skipping duplicate.`\n );\n }\n return this;\n }\n\n this.plugins.push(resolved);\n return this;\n }\n // @cpt-end:cpt-hai3-flow-framework-composition-app-bootstrap:p1:inst-1\n // @cpt-end:cpt-hai3-state-framework-composition-builder:p1:inst-1\n\n /**\n * Add multiple plugins at once.\n */\n useAll(plugins: Array<HAI3Plugin | PluginFactory>): HAI3AppBuilder {\n plugins.forEach((plugin) => this.use(plugin));\n return this;\n }\n\n /**\n * Build the application.\n */\n // @cpt-begin:cpt-hai3-flow-framework-composition-app-bootstrap:p1:inst-2\n // @cpt-begin:cpt-hai3-state-framework-composition-builder:p1:inst-2\n build(): HAI3App {\n // 1. Resolve dependencies and order plugins\n const orderedPlugins = this.resolveDependencies();\n\n // 2. Call onRegister for each plugin\n orderedPlugins.forEach((plugin) => {\n if (plugin.onRegister) {\n plugin.onRegister(this, plugin._configType);\n }\n });\n\n // 3. Aggregate all provides\n const aggregated = this.aggregateProvides(orderedPlugins);\n\n // 4. Create store with aggregated slices\n const store = this.createStoreWithSlices(aggregated.slices);\n\n // 5. Initialize effects\n aggregated.effects.forEach((initEffect) => {\n initEffect(store.dispatch);\n });\n\n // 6. Build the app object\n // Cast actions to HAI3Actions - all plugins have contributed their actions\n // via module augmentation, so the runtime object matches the declared type\n const app: HAI3App = {\n config: this.config,\n store: store as HAI3Store,\n themeRegistry: aggregated.registries.themeRegistry as ThemeRegistry,\n apiRegistry: apiRegistry,\n i18nRegistry: aggregated.registries.i18nRegistry as HAI3App['i18nRegistry'],\n screensetsRegistry: aggregated.registries.screensetsRegistry as HAI3App['screensetsRegistry'],\n actions: aggregated.actions as HAI3Actions,\n destroy: () => this.destroyApp(orderedPlugins, app),\n };\n\n // 7. Call onInit for each plugin\n orderedPlugins.forEach((plugin) => {\n if (plugin.onInit) {\n plugin.onInit(app);\n }\n });\n\n return app;\n }\n // @cpt-end:cpt-hai3-flow-framework-composition-app-bootstrap:p1:inst-2\n // @cpt-end:cpt-hai3-state-framework-composition-builder:p1:inst-2\n\n /**\n * Resolve plugin dependencies using topological sort.\n */\n // @cpt-begin:cpt-hai3-algo-framework-composition-dep-resolution:p1:inst-1\n // @cpt-begin:cpt-hai3-flow-framework-composition-plugin-dependency:p1:inst-2\n private resolveDependencies(): HAI3Plugin[] {\n const resolved: HAI3Plugin[] = [];\n const visited = new Set<string>();\n const visiting = new Set<string>();\n\n const visit = (plugin: HAI3Plugin) => {\n if (visited.has(plugin.name)) return;\n\n if (visiting.has(plugin.name)) {\n throw new Error(\n `Circular dependency detected: ${plugin.name} depends on itself or creates a cycle.`\n );\n }\n\n visiting.add(plugin.name);\n\n // Process dependencies first\n if (plugin.dependencies) {\n for (const depName of plugin.dependencies) {\n const dep = this.plugins.find((p) => p.name === depName);\n\n if (!dep) {\n if (this.config.strictMode) {\n throw new Error(\n `Plugin \"${plugin.name}\" requires \"${depName}\" but it is not registered.\\n` +\n `Add the missing plugin: .use(${depName}())`\n );\n } else {\n console.warn(\n `Plugin \"${plugin.name}\" requires \"${depName}\" but it is not registered. ` +\n `Some features may not work correctly.`\n );\n continue;\n }\n }\n\n visit(dep);\n }\n }\n\n visiting.delete(plugin.name);\n visited.add(plugin.name);\n resolved.push(plugin);\n };\n\n this.plugins.forEach(visit);\n return resolved;\n }\n // @cpt-end:cpt-hai3-algo-framework-composition-dep-resolution:p1:inst-1\n // @cpt-end:cpt-hai3-flow-framework-composition-plugin-dependency:p1:inst-2\n\n /**\n * Aggregate all provides from plugins.\n */\n // @cpt-begin:cpt-hai3-algo-framework-composition-provides-aggregation:p1:inst-1\n private aggregateProvides(plugins: HAI3Plugin[]) {\n const registries: Record<string, unknown> = {};\n const slices: RegisterableSlice[] = [];\n const effects: EffectInitializer[] = [];\n // Actions are typed via module augmentation - each plugin declares its actions\n // in HAI3Actions interface. At runtime we merge them all together.\n const actions: Partial<HAI3Actions> = {};\n\n plugins.forEach((plugin) => {\n if (!plugin.provides) return;\n\n // Merge registries\n if (plugin.provides.registries) {\n Object.assign(registries, plugin.provides.registries);\n }\n\n // Collect slices\n if (plugin.provides.slices) {\n slices.push(...plugin.provides.slices);\n }\n\n // Collect effects\n if (plugin.provides.effects) {\n effects.push(...plugin.provides.effects);\n }\n\n // Merge actions (type-safe via HAI3Actions module augmentation)\n if (plugin.provides.actions) {\n Object.assign(actions, plugin.provides.actions);\n }\n });\n\n return { registries, slices, effects, actions };\n }\n // @cpt-end:cpt-hai3-algo-framework-composition-provides-aggregation:p1:inst-1\n\n /**\n * Create store with all aggregated slices.\n *\n * IMPORTANT: This method supports the screenset self-registration pattern.\n * Screensets call registerSlice() as module side effects when imported,\n * which may auto-create a store before createHAI3App() is called.\n *\n * This method:\n * 1. Uses the existing store if one was auto-created by screensets\n * 2. Registers framework slices to the existing store\n * 3. Returns the unified store for HAI3App\n */\n private createStoreWithSlices(slices: RegisterableSlice[]): HAI3Store {\n // Get existing store (may have been created by screenset registerSlice calls)\n // getStore() auto-creates if none exists\n const store = getStore();\n\n // Register framework slices using registerSlice (merges with dynamic slices)\n slices.forEach((slice) => {\n registerSlice(slice);\n });\n\n return store;\n }\n\n /**\n * Destroy the app and cleanup resources.\n */\n // @cpt-begin:cpt-hai3-flow-framework-composition-teardown:p2:inst-1\n private destroyApp(plugins: HAI3Plugin[], app: HAI3App): void {\n // Call onDestroy in reverse order\n [...plugins].reverse().forEach((plugin) => {\n if (plugin.onDestroy) {\n plugin.onDestroy(app);\n }\n });\n }\n // @cpt-end:cpt-hai3-flow-framework-composition-teardown:p2:inst-1\n}\n\n// ============================================================================\n// Factory Function\n// ============================================================================\n\n/**\n * Create a HAI3 app builder for custom plugin composition.\n *\n * @param config - Optional application configuration\n * @returns App builder for plugin composition\n *\n * @example\n * ```typescript\n * const app = createHAI3()\n * .use(screensets())\n * .use(themes())\n * .build();\n * ```\n */\n// @cpt-begin:cpt-hai3-dod-framework-composition-builder:p1:inst-1\nexport function createHAI3(config?: HAI3Config): HAI3AppBuilder {\n return new HAI3AppBuilderImpl(config);\n}\n// @cpt-end:cpt-hai3-dod-framework-composition-builder:p1:inst-1\n","// @cpt-dod:cpt-hai3-dod-framework-composition-layout:p1\n\n/**\n * Layout Slices\n *\n * @hai3/framework owns all layout domain slices.\n * These slices manage header, footer, menu, sidebar, screen, popup, and overlay state.\n *\n * State access: Components use `useAppSelector` hook from @hai3/react.\n */\n\nimport { combineReducers, type Reducer } from '@reduxjs/toolkit';\nimport type {\n HeaderState,\n FooterState,\n MenuState,\n SidebarState,\n ScreenState,\n OverlayState,\n} from '../layoutTypes';\n\n// Import slice reducers\nimport headerReducer, { headerSlice, headerActions, setUser, setLoading as setHeaderLoading, clearUser } from './headerSlice';\nimport footerReducer, { footerSlice, footerActions, setFooterVisible, setFooterConfig } from './footerSlice';\nimport menuReducer, {\n menuSlice,\n menuActions,\n toggleMenu,\n setMenuCollapsed,\n setMenuItems,\n setMenuVisible,\n setMenuConfig,\n} from './menuSlice';\nimport sidebarReducer, {\n sidebarSlice,\n sidebarActions,\n toggleSidebar,\n setSidebarCollapsed,\n setSidebarPosition,\n setSidebarTitle,\n setSidebarContent,\n setSidebarVisible,\n setSidebarWidth,\n setSidebarConfig,\n} from './sidebarSlice';\nimport screenReducer, {\n screenSlice,\n screenActions,\n setActiveScreen,\n setScreenLoading,\n navigateTo,\n clearActiveScreen,\n} from './screenSlice';\nimport popupReducer, {\n popupSlice,\n popupActions,\n openPopup,\n closePopup,\n closeTopPopup,\n closeAllPopups,\n type PopupSliceState,\n} from './popupSlice';\nimport overlayReducer, {\n overlaySlice,\n overlayActions,\n showOverlay,\n hideOverlay,\n setOverlayVisible,\n} from './overlaySlice';\nimport tenantReducer, {\n tenantSlice,\n tenantActions,\n setTenant,\n setTenantLoading,\n clearTenant,\n} from './tenantSlice';\nimport mockReducer, {\n mockSlice,\n mockActions,\n setMockEnabled,\n} from './mockSlice';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nexport const LAYOUT_SLICE_NAME = 'layout' as const;\nexport const TENANT_SLICE_NAME = 'app/tenant' as const;\n\n// ============================================================================\n// Combined Layout Reducer\n// ============================================================================\n\n/** Explicit type for layout domain reducers to avoid incorrect dts generation */\nexport interface LayoutDomainReducersType {\n header: Reducer<HeaderState>;\n footer: Reducer<FooterState>;\n menu: Reducer<MenuState>;\n sidebar: Reducer<SidebarState>;\n screen: Reducer<ScreenState>;\n popup: Reducer<PopupSliceState>;\n overlay: Reducer<OverlayState>;\n}\n\n// @cpt-begin:cpt-hai3-dod-framework-composition-layout:p1:inst-1\nexport const layoutDomainReducers: LayoutDomainReducersType = {\n header: headerReducer,\n footer: footerReducer,\n menu: menuReducer,\n sidebar: sidebarReducer,\n screen: screenReducer,\n popup: popupReducer,\n overlay: overlayReducer,\n};\n\nexport const layoutReducer = combineReducers(layoutDomainReducers);\n// @cpt-end:cpt-hai3-dod-framework-composition-layout:p1:inst-1\n\n// ============================================================================\n// Slice Exports\n// ============================================================================\n\nexport {\n // Slices\n headerSlice,\n footerSlice,\n menuSlice,\n sidebarSlice,\n screenSlice,\n popupSlice,\n overlaySlice,\n // Action groups\n headerActions,\n // Individual actions - header\n setUser,\n setHeaderLoading,\n clearUser,\n footerActions,\n menuActions,\n sidebarActions,\n screenActions,\n popupActions,\n overlayActions,\n // Individual actions - footer\n setFooterVisible,\n setFooterConfig,\n // Individual actions - menu\n toggleMenu,\n setMenuCollapsed,\n setMenuItems,\n setMenuVisible,\n setMenuConfig,\n // Individual actions - sidebar\n toggleSidebar,\n setSidebarCollapsed,\n setSidebarPosition,\n setSidebarTitle,\n setSidebarContent,\n setSidebarVisible,\n setSidebarWidth,\n setSidebarConfig,\n // Individual actions - screen\n setActiveScreen,\n setScreenLoading,\n navigateTo,\n clearActiveScreen,\n // Individual actions - popup\n openPopup,\n closePopup,\n closeTopPopup,\n closeAllPopups,\n // Individual actions - overlay\n showOverlay,\n hideOverlay,\n setOverlayVisible,\n // Tenant slice (app-level, not layout)\n tenantSlice,\n tenantActions,\n tenantReducer,\n // Individual actions - tenant\n setTenant,\n setTenantLoading,\n clearTenant,\n // Mock slice (app-level, not layout)\n mockSlice,\n mockActions,\n mockReducer,\n // Individual actions - mock\n setMockEnabled,\n};\n\n// Type exports\nexport type { PopupSliceState };\n","import { createSlice, type ReducerPayload } from '@hai3/state';\nimport type { HeaderState, HeaderUser } from '../layoutTypes';\n\n/**\n * Header slice for managing header state including user info\n */\n\nconst SLICE_KEY = 'layout/header' as const;\n\nconst initialState: HeaderState = {\n user: null,\n loading: false,\n};\n\nconst { slice, setUser, setLoading, clearUser } = createSlice({\n name: SLICE_KEY,\n initialState,\n reducers: {\n setUser: (state: HeaderState, action: ReducerPayload<HeaderUser | null>) => {\n state.user = action.payload;\n state.loading = false;\n },\n setLoading: (state: HeaderState, action: ReducerPayload<boolean>) => {\n state.loading = action.payload;\n },\n clearUser: (state: HeaderState) => {\n state.user = null;\n state.loading = false;\n },\n },\n});\n\nexport const headerSlice = slice;\nexport const headerActions = { setUser, setLoading, clearUser };\n\nexport { setUser, setLoading, clearUser };\n\nexport default slice.reducer;\n","import { createSlice, type ReducerPayload } from '@hai3/state';\nimport type { FooterState } from '../layoutTypes';\n\n/**\n * Footer slice for managing footer configuration\n */\n\nconst SLICE_KEY = 'layout/footer' as const;\n\nconst initialState: FooterState = {\n screensetOptions: [],\n visible: true,\n};\n\nconst { slice, setFooterVisible, setFooterConfig, ...restActions } = createSlice({\n name: SLICE_KEY,\n initialState,\n reducers: {\n setFooterVisible: (state: FooterState, action: ReducerPayload<boolean>) => {\n state.visible = action.payload;\n },\n setFooterConfig: (state: FooterState, action: ReducerPayload<Partial<FooterState>>) => {\n return { ...state, ...action.payload };\n },\n },\n});\n\nexport const footerSlice = slice;\nexport { setFooterVisible, setFooterConfig };\nexport const footerActions = { setFooterVisible, setFooterConfig, ...restActions };\n\nexport default slice.reducer;\n","import { createSlice, type ReducerPayload } from '@hai3/state';\nimport type { MenuItem, MenuState } from '../layoutTypes';\n\n/**\n * Menu slice for managing menu state and configuration\n * MenuItem type is defined in layoutTypes.ts\n */\n\nconst SLICE_KEY = 'layout/menu' as const;\n\nconst initialState: MenuState = {\n collapsed: false,\n items: [],\n visible: true,\n};\n\nconst { slice, toggleMenu, setMenuCollapsed, setMenuItems, setMenuVisible, setMenuConfig } = createSlice({\n name: SLICE_KEY,\n initialState,\n reducers: {\n toggleMenu: (state: MenuState) => {\n state.collapsed = !state.collapsed;\n },\n setMenuCollapsed: (state: MenuState, action: ReducerPayload<boolean>) => {\n state.collapsed = action.payload;\n },\n setMenuItems: (state: MenuState, action: ReducerPayload<MenuItem[]>) => {\n state.items = action.payload;\n },\n setMenuVisible: (state: MenuState, action: ReducerPayload<boolean>) => {\n state.visible = action.payload;\n },\n setMenuConfig: (state: MenuState, action: ReducerPayload<Partial<MenuState>>) => {\n return { ...state, ...action.payload };\n },\n },\n});\n\nexport const menuSlice = slice;\nexport { toggleMenu, setMenuCollapsed, setMenuItems, setMenuVisible, setMenuConfig };\nexport const menuActions = { toggleMenu, setMenuCollapsed, setMenuItems, setMenuVisible, setMenuConfig };\n\nexport default slice.reducer;\n","import { createSlice, type ReducerPayload } from '@hai3/state';\nimport type { SidebarState, SidebarPosition } from '../layoutTypes';\n\n/**\n * Sidebar slice for managing sidebar state and configuration\n */\n\nconst SLICE_KEY = 'layout/sidebar' as const;\n\nconst initialState: SidebarState = {\n collapsed: false,\n position: 'left',\n title: null,\n content: null,\n visible: false,\n width: 256,\n};\n\nconst {\n slice,\n toggleSidebar,\n setSidebarCollapsed,\n setSidebarPosition,\n setSidebarTitle,\n setSidebarContent,\n setSidebarVisible,\n setSidebarWidth,\n setSidebarConfig,\n} = createSlice({\n name: SLICE_KEY,\n initialState,\n reducers: {\n toggleSidebar: (state: SidebarState) => {\n state.collapsed = !state.collapsed;\n },\n setSidebarCollapsed: (state: SidebarState, action: ReducerPayload<boolean>) => {\n state.collapsed = action.payload;\n },\n setSidebarPosition: (state: SidebarState, action: ReducerPayload<SidebarPosition>) => {\n state.position = action.payload;\n },\n setSidebarTitle: (state: SidebarState, action: ReducerPayload<string | null>) => {\n state.title = action.payload;\n },\n setSidebarContent: (state: SidebarState, action: ReducerPayload<unknown>) => {\n state.content = action.payload;\n },\n setSidebarVisible: (state: SidebarState, action: ReducerPayload<boolean>) => {\n state.visible = action.payload;\n },\n setSidebarWidth: (state: SidebarState, action: ReducerPayload<number>) => {\n state.width = action.payload;\n },\n setSidebarConfig: (state: SidebarState, action: ReducerPayload<Partial<SidebarState>>) => {\n return { ...state, ...action.payload };\n },\n },\n});\n\nexport const sidebarSlice = slice;\nexport {\n toggleSidebar,\n setSidebarCollapsed,\n setSidebarPosition,\n setSidebarTitle,\n setSidebarContent,\n setSidebarVisible,\n setSidebarWidth,\n setSidebarConfig,\n};\nexport const sidebarActions = {\n toggleSidebar,\n setSidebarCollapsed,\n setSidebarPosition,\n setSidebarTitle,\n setSidebarContent,\n setSidebarVisible,\n setSidebarWidth,\n setSidebarConfig,\n};\n\nexport default slice.reducer;\n","import { createSlice, type ReducerPayload } from '@hai3/state';\nimport type { ScreenState } from '../layoutTypes';\n\n/**\n * Screen slice for managing screen state\n */\n\nconst SLICE_KEY = 'layout/screen' as const;\n\nconst initialState: ScreenState = {\n activeScreen: null,\n loading: false,\n};\n\nconst { slice, setActiveScreen, setScreenLoading, navigateTo, clearActiveScreen } = createSlice({\n name: SLICE_KEY,\n initialState,\n reducers: {\n setActiveScreen: (state: ScreenState, action: ReducerPayload<string>) => {\n state.activeScreen = action.payload;\n },\n setScreenLoading: (state: ScreenState, action: ReducerPayload<boolean>) => {\n state.loading = action.payload;\n },\n navigateTo: (state: ScreenState, action: ReducerPayload<string>) => {\n state.activeScreen = action.payload;\n },\n clearActiveScreen: (state: ScreenState) => {\n state.activeScreen = null;\n },\n },\n});\n\nexport const screenSlice = slice;\nexport { setActiveScreen, setScreenLoading, navigateTo, clearActiveScreen };\nexport const screenActions = { setActiveScreen, setScreenLoading, navigateTo, clearActiveScreen };\n\nexport default slice.reducer;\n","import { createSlice, type ReducerPayload } from '@hai3/state';\nimport type { PopupState } from '../layoutTypes';\n\n/**\n * Popup slice for managing popup state\n */\n\nconst SLICE_KEY = 'layout/popup' as const;\n\nexport interface PopupSliceState {\n stack: PopupState[];\n}\n\nconst initialState: PopupSliceState = {\n stack: [],\n};\n\nconst { slice, openPopup, closePopup, closeTopPopup, closeAllPopups } = createSlice({\n name: SLICE_KEY,\n initialState,\n reducers: {\n openPopup: (state: PopupSliceState, action: ReducerPayload<Omit<PopupState, 'zIndex'>>) => {\n const zIndex = 1000 + state.stack.length * 10;\n state.stack.push({ ...action.payload, zIndex });\n },\n closePopup: (state: PopupSliceState, action: ReducerPayload<string>) => {\n state.stack = state.stack.filter((popup) => popup.id !== action.payload);\n },\n closeTopPopup: (state: PopupSliceState) => {\n state.stack.pop();\n },\n closeAllPopups: (state: PopupSliceState) => {\n state.stack = [];\n },\n },\n});\n\nexport const popupSlice = slice;\nexport { openPopup, closePopup, closeTopPopup, closeAllPopups };\nexport const popupActions = { openPopup, closePopup, closeTopPopup, closeAllPopups };\n\nexport default slice.reducer;\n","import { createSlice, type ReducerPayload } from '@hai3/state';\nimport type { OverlayState } from '../layoutTypes';\n\n/**\n * Overlay slice for managing overlay state\n */\n\nconst SLICE_KEY = 'layout/overlay' as const;\n\nconst initialState: OverlayState = {\n visible: false,\n};\n\nconst { slice, showOverlay, hideOverlay, setOverlayVisible } = createSlice({\n name: SLICE_KEY,\n initialState,\n reducers: {\n showOverlay: (state: OverlayState) => {\n state.visible = true;\n },\n hideOverlay: (state: OverlayState) => {\n state.visible = false;\n },\n setOverlayVisible: (state: OverlayState, action: ReducerPayload<boolean>) => {\n state.visible = action.payload;\n },\n },\n});\n\nexport const overlaySlice = slice;\nexport { showOverlay, hideOverlay, setOverlayVisible };\nexport const overlayActions = { showOverlay, hideOverlay, setOverlayVisible };\n\nexport default slice.reducer;\n","// @cpt-state:cpt-hai3-state-framework-composition-tenant:p1\n// @cpt-dod:cpt-hai3-dod-framework-composition-app-config:p1\nimport { createSlice, type ReducerPayload } from '@hai3/state';\nimport type { TenantState, Tenant } from '../layoutTypes';\n\n/**\n * Tenant slice for managing tenant state\n *\n * This slice is NOT part of the layout domain. It lives at the app level\n * as a separate top-level slice: state['app/tenant']\n *\n * Event-driven: Listen for 'app/tenant/changed' to update tenant\n */\n\nconst SLICE_KEY = 'app/tenant' as const;\n\nconst initialState: TenantState = {\n tenant: null,\n loading: false,\n};\n\n// @cpt-begin:cpt-hai3-state-framework-composition-tenant:p1:inst-1\nconst { slice, setTenant, setTenantLoading, clearTenant } = createSlice({\n name: SLICE_KEY,\n initialState,\n reducers: {\n setTenant: (state: TenantState, action: ReducerPayload<Tenant | null>) => {\n state.tenant = action.payload;\n state.loading = false;\n },\n setTenantLoading: (state: TenantState, action: ReducerPayload<boolean>) => {\n state.loading = action.payload;\n },\n clearTenant: (state: TenantState) => {\n state.tenant = null;\n state.loading = false;\n },\n },\n});\n\n// @cpt-end:cpt-hai3-state-framework-composition-tenant:p1:inst-1\nexport const tenantSlice = slice;\nexport const tenantActions = { setTenant, setTenantLoading, clearTenant };\n\nexport { setTenant, setTenantLoading, clearTenant };\n\nexport default slice.reducer;\n","import { createSlice, type ReducerPayload } from '@hai3/state';\n\n/**\n * Mock slice for managing mock mode state\n *\n * Controls whether mock plugins are active across all API services.\n * Event-driven: Listen for 'mock/toggle' to change mock mode.\n */\n\nconst SLICE_KEY = 'mock' as const;\n\nexport interface MockState {\n enabled: boolean;\n}\n\nconst initialState: MockState = {\n enabled: false,\n};\n\nconst { slice, setMockEnabled } = createSlice({\n name: SLICE_KEY,\n initialState,\n reducers: {\n setMockEnabled: (state: MockState, action: ReducerPayload<boolean>) => {\n state.enabled = action.payload;\n },\n },\n});\n\nexport const mockSlice = slice;\nexport const mockActions = { setMockEnabled };\n\nexport { setMockEnabled };\n\nexport default slice.reducer;\n","// @cpt-flow:cpt-hai3-flow-framework-composition-full-preset:p1\n\n/**\n * Screensets Plugin - Provides screenset registry and screen slice\n *\n * This is the minimal plugin for screenset orchestration.\n * It does NOT include navigation actions - those are in the navigation plugin.\n *\n * Framework Layer: L2\n *\n * NOTE: Translations are NOT handled by this plugin. Screensets register\n * their translations directly with i18nRegistry via framework re-exports.\n * This maintains clean separation: @hai3/screensets has zero knowledge of i18n.\n */\n\nimport { screenSlice, screenActions } from '../slices';\nimport type { HAI3Plugin, ScreensetsConfig } from '../types';\n\n/**\n * Screensets plugin factory.\n *\n * @param config - Plugin configuration\n * @returns Screensets plugin\n *\n * @example\n * ```typescript\n * const app = createHAI3()\n * .use(screensets({ autoDiscover: true }))\n * .build();\n * ```\n */\n// @cpt-begin:cpt-hai3-flow-framework-composition-full-preset:p1:inst-1\nexport function screensets(_config?: ScreensetsConfig): HAI3Plugin<ScreensetsConfig> {\n return {\n name: 'screensets',\n dependencies: [],\n\n provides: {\n registries: {},\n slices: [screenSlice],\n actions: {\n setActiveScreen: screenActions.navigateTo,\n setScreenLoading: screenActions.setScreenLoading,\n },\n },\n\n onInit() {\n // Auto-discover screensets if configured\n // Note: In Vite apps, this is handled by glob imports in user code\n // Translation wiring is NOT done here.\n // Screensets register translations directly with i18nRegistry.\n // This keeps @hai3/screensets free of i18n dependencies.\n },\n };\n}\n// @cpt-end:cpt-hai3-flow-framework-composition-full-preset:p1:inst-1\n","/**\n * Themes Plugin - Provides theme registry and changeTheme action\n *\n * Framework Layer: L2\n */\n\n// @cpt-flow:cpt-hai3-flow-framework-composition-theme-propagation:p1\n// @cpt-flow:cpt-hai3-flow-framework-composition-shared-property-broadcast:p1\n// @cpt-dod:cpt-hai3-dod-framework-composition-propagation:p1\n// @cpt-dod:cpt-hai3-dod-framework-composition-shared-property:p1\n\nimport { eventBus } from '@hai3/state';\nimport { HAI3_SHARED_PROPERTY_THEME } from '@hai3/screensets';\nimport type { HAI3Plugin, ChangeThemePayload, ThemesConfig } from '../types';\nimport { createThemeRegistry } from '../registries/themeRegistry';\n\n// Define theme events for module augmentation\ndeclare module '@hai3/state' {\n interface EventPayloadMap {\n 'theme/changed': ChangeThemePayload;\n }\n}\n\n/**\n * Change theme action.\n * Emits 'theme/changed' event to trigger theme application.\n *\n * @param payload - The theme change payload\n */\n// @cpt-begin:cpt-hai3-flow-framework-composition-theme-propagation:p1:inst-1\nfunction changeTheme(payload: ChangeThemePayload): void {\n eventBus.emit('theme/changed', payload);\n}\n// @cpt-end:cpt-hai3-flow-framework-composition-theme-propagation:p1:inst-1\n\n/**\n * Themes plugin factory.\n *\n * @param config - Optional themes configuration\n * @returns Themes plugin\n *\n * @example\n * ```typescript\n * import { applyTheme } from '@hai3/uikit';\n *\n * const app = createHAI3()\n * .use(screensets())\n * .use(themes({ applyFn: applyTheme }))\n * .build();\n *\n * app.actions.changeTheme({ themeId: 'dark' });\n * ```\n */\nexport function themes(config?: ThemesConfig): HAI3Plugin {\n // Create a new theme registry instance for this plugin\n const themeRegistry = createThemeRegistry(config);\n\n return {\n name: 'themes',\n dependencies: [],\n\n provides: {\n registries: {\n themeRegistry,\n },\n actions: {\n changeTheme,\n },\n },\n\n // @cpt-begin:cpt-hai3-flow-framework-composition-theme-propagation:p1:inst-2\n // @cpt-begin:cpt-hai3-dod-framework-composition-propagation:p1:inst-1\n onInit(app) {\n // Subscribe to theme changes\n eventBus.on('theme/changed', (payload: ChangeThemePayload) => {\n themeRegistry.apply(payload.themeId);\n try {\n app.screensetsRegistry?.updateSharedProperty(HAI3_SHARED_PROPERTY_THEME, payload.themeId);\n } catch (error) {\n console.error('[HAI3] Failed to propagate theme to MFE domains', error);\n }\n });\n\n // Bootstrap: Apply the first registered theme (or default)\n const themes = themeRegistry.getAll();\n if (themes.length > 0) {\n themeRegistry.apply(themes[0].id);\n }\n },\n // @cpt-end:cpt-hai3-flow-framework-composition-theme-propagation:p1:inst-2\n // @cpt-end:cpt-hai3-dod-framework-composition-propagation:p1:inst-1\n };\n}\n","/**\n * Theme Registry - Manages theme registration and application\n *\n * Framework Layer: L2\n */\n\nimport type { ThemeRegistry, ThemeConfig, UikitTheme, ThemeApplyFn, ThemesConfig } from '../types';\n\n/**\n * Create a new theme registry instance.\n *\n * @param config - Optional configuration for the theme registry\n */\nexport function createThemeRegistry(config?: ThemesConfig): ThemeRegistry {\n const themes = new Map<string, ThemeConfig>();\n // Store UIKit themes (e.g., @hai3/uikit themes)\n const uikitThemes = new Map<string, UikitTheme>();\n let currentThemeId: string | null = null;\n // Custom apply function for UIKit themes (passed via constructor injection)\n const customApplyFn: ThemeApplyFn | null = config?.applyFn ?? null;\n\n // Subscription support for React\n const subscribers = new Set<() => void>();\n let version = 0;\n\n /**\n * Notify subscribers of theme change\n */\n function notifySubscribers(): void {\n version++;\n subscribers.forEach((callback) => callback());\n }\n\n /**\n * Apply CSS custom properties from theme to :root\n */\n function applyCSSVariables(config: ThemeConfig): void {\n // Skip if not in browser environment\n if (typeof document === 'undefined') return;\n\n const root = document.documentElement;\n\n // Apply each CSS variable\n Object.entries(config.variables).forEach(([key, value]) => {\n root.style.setProperty(key, value);\n });\n }\n\n return {\n /**\n * Register a theme.\n * Supports both config-based API and UIKit theme API.\n */\n register(configOrId: ThemeConfig | string, uikitTheme?: UikitTheme): void {\n // Handle UIKit theme API: register(id, theme)\n if (typeof configOrId === 'string') {\n const id = configOrId;\n if (!uikitTheme) {\n console.warn(`register() called with ID \"${id}\" but no theme object. Skipping.`);\n return;\n }\n\n if (themes.has(id)) {\n console.warn(`Theme \"${id}\" is already registered. Skipping.`);\n return;\n }\n\n // Store UIKit theme for apply\n uikitThemes.set(id, uikitTheme);\n\n // Create a minimal ThemeConfig for the registry\n // Try to extract name from UIKit theme if it's an object\n let themeName = id;\n if (uikitTheme && typeof uikitTheme === 'object' && 'name' in uikitTheme) {\n const nameValue = (uikitTheme as { name?: unknown }).name;\n if (typeof nameValue === 'string') {\n themeName = nameValue;\n }\n }\n const config: ThemeConfig = {\n id,\n name: themeName,\n variables: {}, // UIKit themes use custom apply function\n };\n\n themes.set(id, config);\n return;\n }\n\n // New API: register(config)\n const config = configOrId;\n\n if (themes.has(config.id)) {\n console.warn(`Theme \"${config.id}\" is already registered. Skipping.`);\n return;\n }\n\n themes.set(config.id, config);\n\n // If this is the default theme and no theme is applied yet, apply it\n if (config.default && currentThemeId === null) {\n this.apply(config.id);\n }\n },\n\n /**\n * Get theme by ID.\n */\n get(id: string): ThemeConfig | undefined {\n return themes.get(id);\n },\n\n /**\n * Get all themes.\n */\n getAll(): ThemeConfig[] {\n return Array.from(themes.values());\n },\n\n /**\n * Apply a theme.\n */\n apply(id: string): void {\n const config = themes.get(id);\n\n if (!config) {\n console.warn(`Theme \"${id}\" not found. Cannot apply.`);\n return;\n }\n\n // Apply CSS variables if theme has them (config-based API)\n if (config.variables && Object.keys(config.variables).length > 0) {\n applyCSSVariables(config);\n }\n\n // Apply UIKit theme using custom apply function\n const uikitTheme = uikitThemes.get(id);\n if (uikitTheme && customApplyFn) {\n customApplyFn(uikitTheme, id);\n }\n\n currentThemeId = id;\n\n // Notify React subscribers of theme change\n notifySubscribers();\n },\n\n /**\n * Get current theme.\n */\n getCurrent(): ThemeConfig | undefined {\n return currentThemeId ? themes.get(currentThemeId) : undefined;\n },\n\n /**\n * Subscribe to theme changes.\n * Returns unsubscribe function.\n */\n subscribe(callback: () => void): () => void {\n subscribers.add(callback);\n return () => {\n subscribers.delete(callback);\n };\n },\n\n /**\n * Get current version number.\n * Used by React for re-rendering.\n */\n getVersion(): number {\n return version;\n },\n };\n}\n","/**\n * Layout Plugin - Provides all layout domain slices and effects\n *\n * Framework Layer: L2\n *\n * NOTE: Layout slices are owned by @hai3/framework (not @hai3/uicore which is deprecated)\n */\n\n// @cpt-dod:cpt-hai3-dod-framework-composition-layout:p1\n// @cpt-flow:cpt-hai3-flow-framework-composition-app-config:p1\n\nimport type { Dispatch, UnknownAction } from '@reduxjs/toolkit';\nimport { eventBus } from '@hai3/state';\nimport type { HAI3Plugin, ShowPopupPayload } from '../types';\nimport {\n headerSlice,\n footerSlice,\n menuSlice,\n sidebarSlice,\n popupSlice,\n overlaySlice,\n footerActions,\n menuActions,\n sidebarActions,\n popupActions,\n overlayActions,\n} from '../slices';\n\n// Define layout events for module augmentation\ndeclare module '@hai3/state' {\n interface EventPayloadMap {\n 'layout/popup/requested': ShowPopupPayload;\n 'layout/popup/hidden': void;\n 'layout/overlay/requested': { id: string };\n 'layout/overlay/hidden': void;\n 'layout/menu/collapsed': { collapsed: boolean };\n 'layout/sidebar/collapsed': { collapsed: boolean };\n }\n}\n\n/**\n * Show popup action.\n */\nfunction showPopup(payload: ShowPopupPayload): void {\n eventBus.emit('layout/popup/requested', payload);\n}\n\n/**\n * Hide popup action.\n */\nfunction hidePopup(): void {\n eventBus.emit('layout/popup/hidden');\n}\n\n/**\n * Show overlay action.\n */\nfunction showOverlay(payload: { id: string }): void {\n eventBus.emit('layout/overlay/requested', payload);\n}\n\n/**\n * Hide overlay action.\n */\nfunction hideOverlay(): void {\n eventBus.emit('layout/overlay/hidden');\n}\n\n/**\n * Toggle menu collapsed action.\n */\nfunction toggleMenuCollapsed(payload: { collapsed: boolean }): void {\n eventBus.emit('layout/menu/collapsed', payload);\n}\n\n/**\n * Toggle sidebar collapsed action.\n */\nfunction toggleSidebarCollapsed(payload: { collapsed: boolean }): void {\n eventBus.emit('layout/sidebar/collapsed', payload);\n}\n\n/**\n * Wrapper for setHeaderVisible - no-op since HeaderState doesn't have visible field.\n * Kept for backward compatibility with HAI3Actions interface.\n */\nfunction setHeaderVisible(_visible: boolean): void {\n // No-op: HeaderState doesn't have visible field\n}\n\n/**\n * Layout plugin factory.\n *\n * @returns Layout plugin\n *\n * @example\n * ```typescript\n * const app = createHAI3()\n * .use(screensets())\n * .use(layout())\n * .build();\n * ```\n */\n// @cpt-begin:cpt-hai3-dod-framework-composition-layout:p1:inst-1\nexport function layout(): HAI3Plugin {\n\n return {\n name: 'layout',\n dependencies: ['screensets'],\n\n provides: {\n slices: [\n headerSlice,\n footerSlice,\n menuSlice,\n sidebarSlice,\n popupSlice,\n overlaySlice,\n ],\n actions: {\n showPopup,\n hidePopup,\n showOverlay,\n hideOverlay,\n toggleMenuCollapsed,\n toggleSidebarCollapsed,\n // Direct slice actions for backward compatibility\n setHeaderVisible,\n setFooterVisible: footerActions.setFooterVisible,\n setMenuCollapsed: menuActions.setMenuCollapsed,\n setSidebarCollapsed: sidebarActions.setSidebarCollapsed,\n },\n },\n\n onInit(app) {\n const dispatch = app.store.dispatch as Dispatch<UnknownAction>;\n\n // Popup effects\n eventBus.on('layout/popup/requested', (payload: ShowPopupPayload) => {\n dispatch(popupActions.openPopup({\n id: payload.id,\n title: payload.title ?? '',\n component: '', // Payload doesn't include component - this needs review\n }));\n });\n\n eventBus.on('layout/popup/hidden', () => {\n dispatch(popupActions.closeAllPopups());\n });\n\n // Overlay effects\n eventBus.on('layout/overlay/requested', (_payload: { id: string }) => {\n dispatch(overlayActions.showOverlay());\n });\n\n eventBus.on('layout/overlay/hidden', () => {\n dispatch(overlayActions.hideOverlay());\n });\n\n // Menu effects\n eventBus.on('layout/menu/collapsed', (payload: { collapsed: boolean }) => {\n dispatch(menuActions.setMenuCollapsed(payload.collapsed));\n });\n\n // Sidebar effects\n eventBus.on('layout/sidebar/collapsed', (payload: { collapsed: boolean }) => {\n dispatch(sidebarActions.setSidebarCollapsed(payload.collapsed));\n });\n },\n };\n}\n// @cpt-end:cpt-hai3-dod-framework-composition-layout:p1:inst-1\n","/**\n * I18n Plugin - Provides i18n registry wiring and setLanguage action\n *\n * Framework Layer: L2\n */\n\n// @cpt-flow:cpt-hai3-flow-framework-composition-i18n-propagation:p1\n// @cpt-flow:cpt-hai3-flow-framework-composition-shared-property-broadcast:p1\n// @cpt-dod:cpt-hai3-dod-framework-composition-propagation:p1\n// @cpt-dod:cpt-hai3-dod-framework-composition-shared-property:p1\n\nimport { eventBus } from '@hai3/state';\nimport { i18nRegistry as singletonI18nRegistry, Language } from '@hai3/i18n';\nimport { HAI3_SHARED_PROPERTY_LANGUAGE } from '@hai3/screensets';\nimport type { HAI3Plugin, SetLanguagePayload } from '../types';\n\n// Define i18n events for module augmentation\ndeclare module '@hai3/state' {\n interface EventPayloadMap {\n 'i18n/language/changed': SetLanguagePayload;\n }\n}\n\n/**\n * Set language action.\n * Emits 'i18n/language/changed' event to trigger language change.\n *\n * @param payload - The language change payload\n */\n// @cpt-begin:cpt-hai3-flow-framework-composition-i18n-propagation:p1:inst-1\nfunction setLanguage(payload: SetLanguagePayload): void {\n eventBus.emit('i18n/language/changed', payload);\n}\n// @cpt-end:cpt-hai3-flow-framework-composition-i18n-propagation:p1:inst-1\n\n/**\n * I18n plugin factory.\n *\n * @returns I18n plugin\n *\n * @example\n * ```typescript\n * const app = createHAI3()\n * .use(i18n())\n * .build();\n *\n * app.actions.setLanguage({ language: 'de' });\n * ```\n */\nexport function i18n(): HAI3Plugin {\n // Use the singleton i18n registry - user translations register to this\n const i18nRegistry = singletonI18nRegistry;\n\n return {\n name: 'i18n',\n dependencies: [],\n\n provides: {\n registries: {\n i18nRegistry,\n },\n actions: {\n setLanguage,\n },\n },\n\n // @cpt-begin:cpt-hai3-flow-framework-composition-i18n-propagation:p1:inst-2\n // @cpt-begin:cpt-hai3-dod-framework-composition-propagation:p1:inst-2\n onInit(app) {\n // Language change effect\n eventBus.on('i18n/language/changed', async (payload: SetLanguagePayload) => {\n await i18nRegistry.setLanguage(payload.language as Language);\n try {\n app.screensetsRegistry?.updateSharedProperty(HAI3_SHARED_PROPERTY_LANGUAGE, payload.language);\n } catch (error) {\n console.error('[HAI3] Failed to propagate language to MFE domains', error);\n }\n });\n\n // Bootstrap: Set initial language to trigger translation loading\n // Run async without blocking - translations load in background\n i18nRegistry.setLanguage(Language.English).catch((err: Error) => {\n console.warn('[HAI3] Failed to load initial translations:', err);\n });\n },\n // @cpt-end:cpt-hai3-flow-framework-composition-i18n-propagation:p1:inst-2\n // @cpt-end:cpt-hai3-dod-framework-composition-propagation:p1:inst-2\n };\n}\n","// @cpt-flow:cpt-hai3-flow-framework-composition-full-preset:p1\n\n/**\n * Effects Plugin - Core effect coordination infrastructure\n *\n * Framework Layer: L2\n */\n\nimport type { HAI3Plugin } from '../types';\n\n/**\n * Effects plugin factory.\n *\n * Provides the core effect coordination infrastructure.\n * Other plugins register their effects through this system.\n *\n * @returns Effects plugin\n *\n * @example\n * ```typescript\n * const app = createHAI3()\n * .use(effects())\n * .use(screensets())\n * .build();\n * ```\n */\n// @cpt-begin:cpt-hai3-flow-framework-composition-full-preset:p1:inst-1\nexport function effects(): HAI3Plugin {\n return {\n name: 'effects',\n dependencies: [],\n\n onInit() {\n // Effects plugin provides the coordination layer\n // Individual plugins register their own effects in their onInit\n // This plugin ensures effect infrastructure is available\n },\n };\n}\n// @cpt-end:cpt-hai3-flow-framework-composition-full-preset:p1:inst-1\n","/**\n * Mock Effects\n *\n * Listens for mock mode toggle events and manages mock plugin lifecycle.\n * Event-driven architecture: UI emits events, effects handle plugin activation/deactivation.\n */\n\n// @cpt-algo:cpt-hai3-algo-framework-composition-mock-toggle:p2\n\nimport { eventBus, getStore } from '@hai3/state';\nimport { apiRegistry, isMockPlugin, type ApiProtocol, type ApiPluginBase } from '@hai3/api';\nimport { setMockEnabled } from '../slices/mockSlice';\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\n/** Protocol with plugin management (RestProtocol, SseProtocol) */\ninterface ProtocolWithPlugins extends ApiProtocol {\n plugins: {\n add: (plugin: ApiPluginBase) => void;\n remove: (plugin: ApiPluginBase) => void;\n getAll: () => readonly ApiPluginBase[];\n };\n}\n\n/** Type guard to check if protocol has plugin management */\nfunction hasPluginManagement(protocol: ApiProtocol): protocol is ProtocolWithPlugins {\n return 'plugins' in protocol && typeof (protocol as ProtocolWithPlugins).plugins === 'object';\n}\n\n// ============================================================================\n// Event Types\n// ============================================================================\n\n/** Mock event names */\nexport const MockEvents = {\n Toggle: 'mock/toggle',\n} as const;\n\n/** Payload for mock toggle event */\nexport interface MockTogglePayload {\n enabled: boolean;\n}\n\n// ============================================================================\n// Module Augmentation for Type-Safe Events\n// ============================================================================\n\ndeclare module '@hai3/state' {\n interface EventPayloadMap {\n 'mock/toggle': MockTogglePayload;\n }\n}\n\n// ============================================================================\n// Mock Plugin Synchronization\n// ============================================================================\n\n/**\n * Activate or deactivate all mock plugins based on enabled state.\n * Uses isMockPlugin() type guard to identify mock plugins from generic storage.\n */\nfunction syncMockPlugins(enabled: boolean): void {\n // Iterate all registered services\n for (const service of apiRegistry.getAll()) {\n // getPlugins() returns ALL plugins (generic)\n // We filter for mock plugins using the type guard\n const registeredPlugins = service.getPlugins();\n\n for (const [protocol, plugins] of registeredPlugins) {\n // Check if protocol has plugins management (RestProtocol, SseProtocol do)\n if (!hasPluginManagement(protocol)) continue;\n\n for (const plugin of plugins) {\n // Framework filters using type guard - BaseApiService doesn't know about mocks\n if (isMockPlugin(plugin)) {\n if (enabled) {\n // Add plugin to protocol if not already present\n const existingPlugins = protocol.plugins.getAll();\n if (!existingPlugins.includes(plugin)) {\n protocol.plugins.add(plugin);\n }\n } else {\n // Remove plugin from protocol\n protocol.plugins.remove(plugin);\n }\n }\n }\n }\n }\n}\n\n// ============================================================================\n// Effect Registration\n// ============================================================================\n\n/**\n * Initialize mock mode effects\n * Call this once during app bootstrap to start listening for mock toggle events.\n */\n// @cpt-begin:cpt-hai3-algo-framework-composition-mock-toggle:p2:inst-1\nexport function initMockEffects(): () => void {\n const store = getStore();\n\n // Listen to toggle events\n const unsubscribe = eventBus.on(MockEvents.Toggle, (payload) => {\n // Update Redux state\n store.dispatch(setMockEnabled(payload.enabled));\n\n // Sync plugins with new state\n syncMockPlugins(payload.enabled);\n });\n\n // Sync on initialization based on current state\n const currentState = store.getState();\n // Check if mock slice exists and is enabled\n if ('mock' in currentState && currentState.mock && typeof currentState.mock === 'object' && 'enabled' in currentState.mock) {\n syncMockPlugins((currentState.mock as { enabled: boolean }).enabled);\n }\n\n // Return cleanup function\n return () => {\n unsubscribe.unsubscribe();\n };\n}\n// @cpt-end:cpt-hai3-algo-framework-composition-mock-toggle:p2:inst-1\n\n// ============================================================================\n// Helper Actions (for consuming apps)\n// ============================================================================\n\n/**\n * Toggle mock mode on/off.\n * Emits event that mockEffects handles.\n *\n * @example\n * ```typescript\n * import { toggleMockMode } from '@hai3/framework';\n * toggleMockMode(true); // Enable mock mode\n * toggleMockMode(false); // Disable mock mode\n * ```\n */\n// @cpt-begin:cpt-hai3-algo-framework-composition-mock-toggle:p2:inst-2\nexport function toggleMockMode(enabled: boolean): void {\n eventBus.emit(MockEvents.Toggle, { enabled });\n}\n// @cpt-end:cpt-hai3-algo-framework-composition-mock-toggle:p2:inst-2\n","// @cpt-algo:cpt-hai3-algo-framework-composition-mock-toggle:p2\n\n/**\n * Mock Plugin - Centralized mock mode control\n *\n * Framework Layer: L2\n *\n * Automatically registers mockSlice and initializes mock effects.\n * Apps don't need to manually call registerSlice(mockSlice) or initMockEffects().\n */\n\nimport type { HAI3Plugin } from '../types';\nimport { mockSlice } from '../slices/mockSlice';\nimport { initMockEffects, toggleMockMode } from '../effects/mockEffects';\n\n// Store cleanup function per plugin instance\nlet cleanup: (() => void) | null = null;\n\n/**\n * Detect if running in development environment.\n * Uses runtime heuristics since framework is pre-built.\n */\nfunction isDevEnvironment(): boolean {\n if (typeof window === 'undefined') return false;\n\n const { hostname } = window.location;\n // localhost, 127.0.0.1, or any .local domain\n return hostname === 'localhost'\n || hostname === '127.0.0.1'\n || hostname.endsWith('.local');\n}\n\n/**\n * Mock plugin configuration\n */\nexport interface MockPluginConfig {\n /**\n * Enable mock mode by default.\n * When true, mock plugins are activated immediately on app init.\n * @default true (enabled in dev mode by default)\n */\n enabledByDefault?: boolean;\n}\n\n/**\n * Mock plugin factory.\n *\n * Provides centralized mock mode control for API services.\n * Automatically registers the mock slice and initializes mock effects.\n * In dev mode, mock mode is enabled by default.\n *\n * @param config - Optional plugin configuration\n * @returns Mock plugin\n *\n * @example\n * ```typescript\n * const app = createHAI3()\n * .use(effects())\n * .use(mock()) // Automatic mock mode support (enabled in dev)\n * .build();\n *\n * // Toggle mock mode via actions\n * app.actions.toggleMockMode(true);\n * ```\n */\n// @cpt-begin:cpt-hai3-algo-framework-composition-mock-toggle:p2:inst-1\nexport function mock(config?: MockPluginConfig): HAI3Plugin {\n return {\n name: 'mock',\n dependencies: ['effects'],\n\n provides: {\n slices: [mockSlice],\n actions: {\n toggleMockMode,\n },\n },\n\n onInit() {\n // Initialize mock effects after store is ready\n cleanup = initMockEffects();\n\n // Determine if mock mode should be enabled by default\n // Auto-detect dev environment (localhost) unless explicitly configured\n const isDev = isDevEnvironment();\n const enabledByDefault = config?.enabledByDefault ?? isDev;\n\n if (enabledByDefault) {\n // Enable mock mode immediately after initialization\n toggleMockMode(true);\n }\n },\n\n onDestroy() {\n // Cleanup event subscriptions\n if (cleanup) {\n cleanup();\n cleanup = null;\n }\n },\n };\n}\n// @cpt-end:cpt-hai3-algo-framework-composition-mock-toggle:p2:inst-1\n","/**\n * Microfrontends Plugin\n *\n * Enables MFE capabilities in HAI3 applications.\n * This plugin accepts NO configuration parameters.\n * All MFE registration happens dynamically at runtime.\n *\n * @packageDocumentation\n */\n\n// @cpt-flow:cpt-hai3-flow-framework-composition-mfe-lifecycle:p1\n// @cpt-flow:cpt-hai3-flow-framework-composition-shared-property-broadcast:p1\n// @cpt-algo:cpt-hai3-algo-framework-composition-gts-validation:p1\n// @cpt-state:cpt-hai3-state-framework-composition-mfe-mount:p1\n// @cpt-dod:cpt-hai3-dod-framework-composition-mfe-plugin:p1\n// @cpt-dod:cpt-hai3-dod-framework-composition-shared-property:p1\n\nimport {\n screensetsRegistryFactory,\n type MfeHandler,\n type TypeSystemPlugin,\n HAI3_ACTION_MOUNT_EXT,\n HAI3_ACTION_UNMOUNT_EXT,\n} from '@hai3/screensets';\nimport { getStore } from '@hai3/state';\nimport type { HAI3Plugin } from '../../types';\nimport { mfeSlice, setExtensionMounted, setExtensionUnmounted } from './slice';\nimport { initMfeEffects } from './effects';\nimport {\n loadExtension,\n mountExtension,\n unmountExtension,\n registerExtension,\n unregisterExtension,\n setMfeRegistry,\n} from './actions';\n\n/**\n * Configuration for the microfrontends plugin.\n */\nexport interface MicrofrontendsConfig {\n /**\n * Type system plugin for entity validation.\n * The registry uses this for domain, extension, and handler type validation.\n */\n typeSystem: TypeSystemPlugin;\n\n /**\n * Optional MFE handlers to register with the screensets registry.\n * Handlers enable loading of specific MFE entry types (e.g., MfeEntryMF).\n *\n * If not provided, no handlers are registered. Applications must register\n * handlers manually via screensetsRegistry API.\n */\n mfeHandlers?: MfeHandler[];\n}\n\n/**\n * Microfrontends plugin factory.\n *\n * Enables MFE capabilities in HAI3 applications. Optionally accepts MFE handlers\n * for registration at plugin initialization.\n *\n * **Key Principles:**\n * - Optional mfeHandlers config for handler registration\n * - NO static domain registration - domains are registered at runtime\n * - Builds screensetsRegistry with provided TypeSystemPlugin at plugin initialization\n * - Same TypeSystemPlugin instance is propagated throughout\n * - Integrates MFE lifecycle with Flux data flow (actions, effects, slice)\n *\n * @param config - Optional configuration with mfeHandlers array\n *\n * @example\n * ```typescript\n * import { createHAI3, microfrontends } from '@hai3/framework';\n * import { MfeHandlerMF, HAI3_MFE_ENTRY_MF } from '@hai3/screensets/mfe/handler';\n * import { gtsPlugin } from '@hai3/screensets/plugins/gts';\n *\n * const app = createHAI3()\n * .use(microfrontends({\n * typeSystem: gtsPlugin,\n * mfeHandlers: [new MfeHandlerMF(HAI3_MFE_ENTRY_MF)],\n * }))\n * .build();\n *\n * // Register domains dynamically at runtime:\n * app.screensetsRegistry.registerDomain(sidebarDomain, containerProvider);\n *\n * // Use MFE actions:\n * app.actions.loadExtension('my.extension.v1');\n * app.actions.mountExtension('my.extension.v1');\n * ```\n */\n// @cpt-begin:cpt-hai3-flow-framework-composition-mfe-lifecycle:p1:inst-1\n// @cpt-begin:cpt-hai3-state-framework-composition-mfe-mount:p1:inst-1\n// @cpt-begin:cpt-hai3-dod-framework-composition-mfe-plugin:p1:inst-1\nexport function microfrontends(config: MicrofrontendsConfig): HAI3Plugin {\n // Build the ScreensetsRegistry instance with provided TypeSystemPlugin and optional handlers\n // This registry handles all MFE lifecycle: domains, extensions, actions, etc.\n // TypeSystemPlugin binding happens here at application wiring level.\n const screensetsRegistry = screensetsRegistryFactory.build({\n typeSystem: config.typeSystem,\n mfeHandlers: config.mfeHandlers,\n });\n\n // Wrap executeActionsChain to intercept mount/unmount completions for store dispatch\n const originalExecuteActionsChain = screensetsRegistry.executeActionsChain.bind(screensetsRegistry);\n screensetsRegistry.executeActionsChain = async (chain) => {\n await originalExecuteActionsChain(chain);\n // After successful execution, dispatch store updates for mount/unmount\n const actionType = chain.action?.type;\n if (actionType === HAI3_ACTION_MOUNT_EXT) {\n const store = getStore();\n const domainId = chain.action!.target;\n const extensionId = chain.action!.payload?.extensionId as string;\n if (domainId && extensionId) {\n store.dispatch(setExtensionMounted({ domainId, extensionId }));\n }\n } else if (actionType === HAI3_ACTION_UNMOUNT_EXT) {\n const store = getStore();\n const domainId = chain.action!.target;\n if (domainId) {\n store.dispatch(setExtensionUnmounted({ domainId }));\n }\n }\n };\n\n // Store cleanup functions in closure (encapsulated per plugin instance)\n let effectsCleanup: (() => void) | null = null;\n\n return {\n name: 'microfrontends',\n dependencies: ['screensets'], // Requires screensets to be initialized\n\n provides: {\n registries: {\n // Expose the MFE-enabled ScreensetsRegistry\n // This registry has registerDomain(), registerExtension(), etc.\n screensetsRegistry,\n },\n slices: [mfeSlice],\n // NOTE: Effects are NOT initialized via provides.effects.\n // They are initialized in onInit to capture cleanup references.\n // The framework calls provides.effects at build step 5, then onInit at step 7.\n // We only initialize effects in onInit to avoid duplicate event listeners.\n actions: {\n loadExtension,\n mountExtension,\n unmountExtension,\n registerExtension,\n unregisterExtension,\n },\n },\n\n onInit(): void {\n // Wire the registry reference into actions module\n setMfeRegistry(screensetsRegistry);\n\n // Initialize effects and store cleanup references\n effectsCleanup = initMfeEffects(screensetsRegistry);\n\n // Plugin is now initialized\n // TypeSystemPlugin: bound to screensetsRegistry\n // MFE handlers: registered via config.mfeHandlers\n // Base domains: NOT pre-registered - registered dynamically at runtime\n // MFE actions: loadExtension, mountExtension, unmountExtension available\n\n // Plugin is now ready\n // Base domains are NOT registered here - they are registered dynamically\n // at runtime via app.screensetsRegistry.registerDomain() or actions\n },\n\n onDestroy(): void {\n // Cleanup event subscriptions\n if (effectsCleanup) {\n effectsCleanup();\n effectsCleanup = null;\n }\n },\n };\n}\n// @cpt-end:cpt-hai3-flow-framework-composition-mfe-lifecycle:p1:inst-1\n// @cpt-end:cpt-hai3-state-framework-composition-mfe-mount:p1:inst-1\n// @cpt-end:cpt-hai3-dod-framework-composition-mfe-plugin:p1:inst-1\n\n// Re-export MFE actions for direct usage\nexport {\n loadExtension,\n mountExtension,\n unmountExtension,\n registerExtension,\n unregisterExtension,\n type RegisterExtensionPayload,\n type UnregisterExtensionPayload,\n} from './actions';\n\n// Re-export MFE slice and selectors\nexport {\n mfeSlice,\n mfeActions,\n selectExtensionState,\n selectRegisteredExtensions,\n selectExtensionError,\n selectMountedExtension,\n setExtensionMounted,\n setExtensionUnmounted,\n type MfeState,\n type ExtensionRegistrationState,\n} from './slice';\n\n// Re-export HAI3 layout domain constants and MfeEvents\nexport {\n HAI3_POPUP_DOMAIN,\n HAI3_SIDEBAR_DOMAIN,\n HAI3_SCREEN_DOMAIN,\n HAI3_OVERLAY_DOMAIN,\n MfeEvents,\n} from './constants';\n\n// Re-export base ExtensionDomain constants\nexport {\n screenDomain,\n sidebarDomain,\n popupDomain,\n overlayDomain,\n} from './base-domains';\n","/**\n * MFE Slice\n *\n * Store slice for managing MFE registration states.\n * Tracks registration state (unregistered, registering, registered, error) and error messages per extension.\n */\n\n// @cpt-state:cpt-hai3-state-framework-composition-mfe-registration:p1\n// @cpt-state:cpt-hai3-state-framework-composition-mfe-mount:p1\n// @cpt-dod:cpt-hai3-dod-framework-composition-mfe-plugin:p1\n\nimport { createSlice, type ReducerPayload } from '@hai3/state';\n\n// ============================================================================\n// State Types\n// ============================================================================\n\n/** Extension registration state */\nexport type ExtensionRegistrationState = 'unregistered' | 'registering' | 'registered' | 'error';\n\n/** MFE slice state */\nexport interface MfeState {\n registrationStates: Record<string, ExtensionRegistrationState>;\n errors: Record<string, string>;\n /** Tracks which extension is mounted in each domain. Used as a notification signal for React hooks. */\n mountedExtensions: Record<string, string | undefined>;\n}\n\n// ============================================================================\n// Initial State\n// ============================================================================\n\nconst SLICE_KEY = 'mfe' as const;\n\nconst initialState: MfeState = {\n registrationStates: {},\n errors: {},\n mountedExtensions: {},\n};\n\n// ============================================================================\n// Slice Definition\n// ============================================================================\n\n// @cpt-begin:cpt-hai3-state-framework-composition-mfe-registration:p1:inst-1\n// @cpt-begin:cpt-hai3-state-framework-composition-mfe-mount:p1:inst-1\nconst { slice, ...actions } = createSlice({\n name: SLICE_KEY,\n initialState,\n reducers: {\n // Registration state reducers\n setExtensionRegistering: (state: MfeState, action: ReducerPayload<{ extensionId: string }>) => {\n state.registrationStates[action.payload.extensionId] = 'registering';\n },\n\n setExtensionRegistered: (state: MfeState, action: ReducerPayload<{ extensionId: string }>) => {\n state.registrationStates[action.payload.extensionId] = 'registered';\n },\n\n setExtensionUnregistered: (state: MfeState, action: ReducerPayload<{ extensionId: string }>) => {\n state.registrationStates[action.payload.extensionId] = 'unregistered';\n },\n\n setExtensionError: (state: MfeState, action: ReducerPayload<{ extensionId: string; error: string }>) => {\n state.registrationStates[action.payload.extensionId] = 'error';\n state.errors[action.payload.extensionId] = action.payload.error;\n },\n\n // Mount state reducers\n setExtensionMounted: (state: MfeState, action: ReducerPayload<{ domainId: string; extensionId: string }>) => {\n state.mountedExtensions[action.payload.domainId] = action.payload.extensionId;\n },\n\n setExtensionUnmounted: (state: MfeState, action: ReducerPayload<{ domainId: string }>) => {\n state.mountedExtensions[action.payload.domainId] = undefined;\n },\n },\n});\n// @cpt-end:cpt-hai3-state-framework-composition-mfe-registration:p1:inst-1\n// @cpt-end:cpt-hai3-state-framework-composition-mfe-mount:p1:inst-1\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport const mfeSlice = slice;\nexport const mfeActions = actions;\n\n// Individual actions for convenience\nexport const {\n setExtensionRegistering,\n setExtensionRegistered,\n setExtensionUnregistered,\n setExtensionError,\n setExtensionMounted,\n setExtensionUnmounted,\n} = actions;\n\n// ============================================================================\n// Selectors\n// ============================================================================\n\n/**\n * Select extension registration state for an extension.\n * Returns 'unregistered' if extension is not tracked.\n */\nexport function selectExtensionState(state: { mfe: MfeState }, extensionId: string): ExtensionRegistrationState {\n return state.mfe.registrationStates[extensionId] ?? 'unregistered';\n}\n\n/**\n * Select all registered extensions.\n * Returns array of extension IDs with 'registered' state.\n */\nexport function selectRegisteredExtensions(state: { mfe: MfeState }): string[] {\n return Object.entries(state.mfe.registrationStates)\n .filter(([_, regState]) => regState === 'registered')\n .map(([extensionId]) => extensionId);\n}\n\n/**\n * Select extension error for an extension.\n * Returns undefined if no error.\n */\nexport function selectExtensionError(state: { mfe: MfeState }, extensionId: string): string | undefined {\n return state.mfe.errors[extensionId];\n}\n\n/**\n * Select mounted extension for a domain.\n * Returns the extension ID if mounted, undefined otherwise.\n */\nexport function selectMountedExtension(state: { mfe: MfeState }, domainId: string): string | undefined {\n return state.mfe.mountedExtensions[domainId];\n}\n\nexport default slice.reducer;\n","/**\n * MFE Effects\n *\n * Listens for MFE registration events and coordinates with runtime.\n * Handles registerExtension and unregisterExtension events.\n *\n * Registration effects update slice state and delegate to the ScreensetsRegistry\n * for runtime registration operations.\n */\n\n// @cpt-flow:cpt-hai3-flow-framework-composition-mfe-registration:p1\n// @cpt-state:cpt-hai3-state-framework-composition-mfe-registration:p1\n// @cpt-flow:cpt-hai3-flow-framework-composition-teardown:p2\n// @cpt-dod:cpt-hai3-dod-framework-composition-mfe-plugin:p1\n\nimport { eventBus, getStore } from '@hai3/state';\nimport { MfeEvents } from './constants';\nimport {\n setExtensionRegistering,\n setExtensionRegistered,\n setExtensionUnregistered,\n setExtensionError,\n} from './slice';\nimport type { ScreensetsRegistry } from '@hai3/screensets';\n\n// ============================================================================\n// Effect Initialization\n// ============================================================================\n\n/**\n * Initialize MFE effects.\n * Call this once during app bootstrap to start listening for MFE events.\n *\n * @param screensetsRegistry - MFE-enabled registry from microfrontends plugin\n * @returns Cleanup function to unsubscribe all effects\n */\n// @cpt-begin:cpt-hai3-flow-framework-composition-mfe-registration:p1:inst-1\n// @cpt-begin:cpt-hai3-state-framework-composition-mfe-registration:p1:inst-1\n// @cpt-begin:cpt-hai3-flow-framework-composition-teardown:p2:inst-2\nexport function initMfeEffects(screensetsRegistry: ScreensetsRegistry): () => void {\n const store = getStore();\n const unsubscribers: Array<{ unsubscribe: () => void }> = [];\n\n // ============================================================================\n // Register Extension Effect\n // ============================================================================\n\n const unsubRegisterExtension = eventBus.on(MfeEvents.RegisterExtensionRequested, async (payload) => {\n const { extension } = payload;\n\n try {\n // Update state: registering\n store.dispatch(setExtensionRegistering({ extensionId: extension.id }));\n\n // Call runtime to register extension\n await screensetsRegistry.registerExtension(extension);\n\n // Update state: registered\n store.dispatch(setExtensionRegistered({ extensionId: extension.id }));\n } catch (error) {\n // Update state: error\n const errorMessage = error instanceof Error ? error.message : 'Unknown registration error';\n store.dispatch(setExtensionError({ extensionId: extension.id, error: errorMessage }));\n }\n });\n unsubscribers.push(unsubRegisterExtension);\n\n // ============================================================================\n // Unregister Extension Effect\n // ============================================================================\n\n const unsubUnregisterExtension = eventBus.on(MfeEvents.UnregisterExtensionRequested, async (payload) => {\n const { extensionId } = payload;\n\n try {\n // Call runtime to unregister extension\n await screensetsRegistry.unregisterExtension(extensionId);\n\n // Update state: unregistered\n store.dispatch(setExtensionUnregistered({ extensionId }));\n } catch (error) {\n // Update state: error\n const errorMessage = error instanceof Error ? error.message : 'Unknown unregistration error';\n store.dispatch(setExtensionError({ extensionId, error: errorMessage }));\n }\n });\n unsubscribers.push(unsubUnregisterExtension);\n\n // ============================================================================\n // Return Cleanup Function\n // ============================================================================\n\n return () => {\n unsubscribers.forEach((unsub) => unsub.unsubscribe());\n };\n}\n// @cpt-end:cpt-hai3-flow-framework-composition-mfe-registration:p1:inst-1\n// @cpt-end:cpt-hai3-state-framework-composition-mfe-registration:p1:inst-1\n// @cpt-end:cpt-hai3-flow-framework-composition-teardown:p2:inst-2\n","/**\n * HAI3 Layout Domain Constants (Framework L2)\n *\n * Instance IDs for HAI3 base layout domains.\n * These constants live in @hai3/framework because layout domains\n * are runtime configuration owned by the framework layer.\n *\n * @packageDocumentation\n */\n\n// ============================================================================\n// Layout Domain Instance IDs\n// ============================================================================\n\n/**\n * Popup domain instance ID.\n * Extension domain for popup/modal dialogs.\n */\nexport const HAI3_POPUP_DOMAIN = 'gts.hai3.mfes.ext.domain.v1~hai3.screensets.layout.popup.v1';\n\n/**\n * Sidebar domain instance ID.\n * Extension domain for collapsible side panels.\n */\nexport const HAI3_SIDEBAR_DOMAIN = 'gts.hai3.mfes.ext.domain.v1~hai3.screensets.layout.sidebar.v1';\n\n/**\n * Screen domain instance ID.\n * Extension domain for main content area screens.\n */\nexport const HAI3_SCREEN_DOMAIN = 'gts.hai3.mfes.ext.domain.v1~hai3.screensets.layout.screen.v1';\n\n/**\n * Overlay domain instance ID.\n * Extension domain for full-screen overlays.\n */\nexport const HAI3_OVERLAY_DOMAIN = 'gts.hai3.mfes.ext.domain.v1~hai3.screensets.layout.overlay.v1';\n\n// ============================================================================\n// MFE Event Names\n// ============================================================================\n\n/** MFE event names (registration events only) */\nexport const MfeEvents = {\n RegisterExtensionRequested: 'mfe/registerExtensionRequested',\n UnregisterExtensionRequested: 'mfe/unregisterExtensionRequested',\n} as const;\n","/**\n * MFE Actions\n *\n * Action functions for MFE lifecycle and registration operations.\n * Lifecycle actions call executeActionsChain() directly (fire-and-forget).\n * Registration actions emit events that MFE effects handle.\n */\n\n// @cpt-flow:cpt-hai3-flow-framework-composition-mfe-lifecycle:p1\n// @cpt-flow:cpt-hai3-flow-framework-composition-mfe-registration:p1\n// @cpt-dod:cpt-hai3-dod-framework-composition-mfe-plugin:p1\n\nimport { eventBus } from '@hai3/state';\nimport { MfeEvents } from './constants';\nimport {\n HAI3_ACTION_LOAD_EXT,\n HAI3_ACTION_MOUNT_EXT,\n HAI3_ACTION_UNMOUNT_EXT,\n type Extension,\n type ScreensetsRegistry,\n} from '@hai3/screensets';\n\n// ============================================================================\n// Module-Level Registry Reference\n// ============================================================================\n\nlet screensetsRegistry: ScreensetsRegistry | null = null;\n\n/**\n * Set the MFE-enabled ScreensetsRegistry reference.\n * Called during plugin initialization.\n */\nexport function setMfeRegistry(registry: ScreensetsRegistry): void {\n screensetsRegistry = registry;\n}\n\n/**\n * Helper to resolve domain ID for an extension.\n */\nfunction resolveDomainId(extensionId: string): string {\n if (!screensetsRegistry) {\n throw new Error('MFE registry not initialized. Call setMfeRegistry() before using lifecycle actions.');\n }\n const extension = screensetsRegistry.getExtension(extensionId);\n if (!extension) {\n throw new Error(`Extension '${extensionId}' is not registered. Register it before calling lifecycle actions.`);\n }\n return extension.domain;\n}\n\n// ============================================================================\n// Event Payload Types (Registration Events Only)\n// ============================================================================\n\n/** Payload for register extension event */\nexport interface RegisterExtensionPayload {\n extension: Extension;\n}\n\n/** Payload for unregister extension event */\nexport interface UnregisterExtensionPayload {\n extensionId: string;\n}\n\n// ============================================================================\n// Module Augmentation for Type-Safe Events\n// ============================================================================\n\ndeclare module '@hai3/state' {\n interface EventPayloadMap {\n 'mfe/registerExtensionRequested': RegisterExtensionPayload;\n 'mfe/unregisterExtensionRequested': UnregisterExtensionPayload;\n }\n}\n\n// ============================================================================\n// Lifecycle Action Functions\n// ============================================================================\n\n/**\n * Load an MFE extension bundle.\n * Calls executeActionsChain() directly (fire-and-forget).\n *\n * @param extensionId - Extension to load\n *\n * @example\n * ```typescript\n * import { loadExtension } from '@hai3/framework';\n * loadExtension('gts.hai3.mfes.ext.extension.v1~my.extension.v1');\n * ```\n */\n// @cpt-begin:cpt-hai3-flow-framework-composition-mfe-lifecycle:p1:inst-1\nexport function loadExtension(extensionId: string): void {\n const domainId = resolveDomainId(extensionId);\n\n // Call executeActionsChain fire-and-forget (no await)\n screensetsRegistry!.executeActionsChain({\n action: {\n type: HAI3_ACTION_LOAD_EXT,\n target: domainId,\n payload: { extensionId },\n },\n }).catch((error) => {\n console.error(`[MFE] Load failed for ${extensionId}:`, error);\n });\n}\n// @cpt-end:cpt-hai3-flow-framework-composition-mfe-lifecycle:p1:inst-1\n\n/**\n * Mount an MFE extension.\n * Auto-loads the extension if not already loaded.\n * The container is provided by the domain's ContainerProvider (registered at domain registration time).\n * Calls executeActionsChain() directly (fire-and-forget).\n *\n * @param extensionId - Extension to mount\n *\n * @example\n * ```typescript\n * import { mountExtension } from '@hai3/framework';\n * mountExtension('gts.hai3.mfes.ext.extension.v1~my.extension.v1');\n * ```\n */\n// @cpt-begin:cpt-hai3-flow-framework-composition-mfe-lifecycle:p1:inst-2\nexport function mountExtension(extensionId: string): void {\n const domainId = resolveDomainId(extensionId);\n\n // Call executeActionsChain fire-and-forget (no await)\n screensetsRegistry!.executeActionsChain({\n action: {\n type: HAI3_ACTION_MOUNT_EXT,\n target: domainId,\n payload: { extensionId },\n },\n }).catch((error) => {\n console.error(`[MFE] Mount failed for ${extensionId}:`, error);\n });\n}\n// @cpt-end:cpt-hai3-flow-framework-composition-mfe-lifecycle:p1:inst-2\n\n/**\n * Unmount an MFE extension from its container.\n * Calls executeActionsChain() directly (fire-and-forget).\n *\n * @param extensionId - Extension to unmount\n *\n * @example\n * ```typescript\n * import { unmountExtension } from '@hai3/framework';\n * unmountExtension('gts.hai3.mfes.ext.extension.v1~my.extension.v1');\n * ```\n */\n// @cpt-begin:cpt-hai3-flow-framework-composition-mfe-lifecycle:p1:inst-3\nexport function unmountExtension(extensionId: string): void {\n const domainId = resolveDomainId(extensionId);\n\n // Call executeActionsChain fire-and-forget (no await)\n screensetsRegistry!.executeActionsChain({\n action: {\n type: HAI3_ACTION_UNMOUNT_EXT,\n target: domainId,\n payload: { extensionId },\n },\n }).catch((error) => {\n console.error(`[MFE] Unmount failed for ${extensionId}:`, error);\n });\n}\n// @cpt-end:cpt-hai3-flow-framework-composition-mfe-lifecycle:p1:inst-3\n\n/**\n * Register an extension dynamically at runtime.\n * Emits event that MFE effects handle via runtime.registerExtension().\n *\n * @param extension - Extension instance to register\n *\n * @example\n * ```typescript\n * import { registerExtension } from '@hai3/framework';\n * const extension: Extension = {\n * id: 'gts.hai3.mfes.ext.extension.v1~my.extension.v1',\n * domain: 'gts.hai3.mfes.ext.domain.v1~hai3.screensets.layout.sidebar.v1',\n * entry: 'gts.hai3.mfes.mfe.entry.v1~my.entry.v1',\n * };\n * registerExtension(extension);\n * ```\n */\n// @cpt-begin:cpt-hai3-flow-framework-composition-mfe-registration:p1:inst-1\nexport function registerExtension(extension: Extension): void {\n eventBus.emit(MfeEvents.RegisterExtensionRequested, { extension });\n}\n// @cpt-end:cpt-hai3-flow-framework-composition-mfe-registration:p1:inst-1\n\n/**\n * Unregister an extension dynamically at runtime.\n * Emits event that MFE effects handle via runtime.unregisterExtension().\n *\n * @param extensionId - Extension ID to unregister\n *\n * @example\n * ```typescript\n * import { unregisterExtension } from '@hai3/framework';\n * unregisterExtension('gts.hai3.mfes.ext.extension.v1~my.extension.v1');\n * ```\n */\nexport function unregisterExtension(extensionId: string): void {\n eventBus.emit(MfeEvents.UnregisterExtensionRequested, { extensionId });\n}\n","// @cpt-dod:cpt-hai3-dod-framework-composition-mfe-plugin:p1\n\n/**\n * Base ExtensionDomain Constants (Framework L2)\n *\n * Defines the 4 well-known extension domains as constant objects satisfying\n * the ExtensionDomain interface. These constants are used by the host\n * application to register domains via registerDomain() without hand-authoring\n * JSON.\n *\n * Relationship to string constants:\n * - HAI3_SCREEN_DOMAIN, HAI3_SIDEBAR_DOMAIN, etc. (in constants.ts) are\n * domain ID strings used as action targets in executeActionsChain() calls.\n * - screenDomain, sidebarDomain, etc. (here) are full ExtensionDomain objects\n * whose .id fields reference the same domain ID strings.\n * - Consumers use HAI3_SCREEN_DOMAIN for action targets and screenDomain\n * for registerDomain().\n *\n * Domain Action Support Matrix (from mfe-ext-lifecycle-actions.md):\n * - screen: 2 actions (load_ext, mount_ext) -- NO unmount_ext (swap semantics)\n * - sidebar/popup/overlay: 3 actions (load_ext, mount_ext, unmount_ext) -- toggle semantics\n *\n * @packageDocumentation\n */\n\nimport type { ExtensionDomain } from '@hai3/screensets';\nimport {\n HAI3_ACTION_LOAD_EXT,\n HAI3_ACTION_MOUNT_EXT,\n HAI3_ACTION_UNMOUNT_EXT,\n HAI3_SHARED_PROPERTY_THEME,\n HAI3_SHARED_PROPERTY_LANGUAGE,\n HAI3_SCREEN_EXTENSION_TYPE,\n} from '@hai3/screensets';\nimport {\n HAI3_SCREEN_DOMAIN,\n HAI3_SIDEBAR_DOMAIN,\n HAI3_POPUP_DOMAIN,\n HAI3_OVERLAY_DOMAIN,\n} from './constants';\n\n/**\n * Init-only lifecycle stage (1 stage).\n * Used by the screen domain, which is a permanent fixture: always visible,\n * never destroyed during the application lifespan. It is initialized once\n * at app startup and remains alive until the app itself is torn down.\n */\nconst INIT_ONLY_LIFECYCLE_STAGES: readonly string[] = [\n 'gts.hai3.mfes.lifecycle.stage.v1~hai3.mfes.lifecycle.init.v1',\n];\n\n/**\n * Default lifecycle stage instance IDs (4 stages).\n * Used by sidebar, popup, and overlay domains which can be\n * shown/hidden/destroyed during the application lifespan.\n */\nconst DEFAULT_LIFECYCLE_STAGES: readonly string[] = [\n 'gts.hai3.mfes.lifecycle.stage.v1~hai3.mfes.lifecycle.init.v1',\n 'gts.hai3.mfes.lifecycle.stage.v1~hai3.mfes.lifecycle.activated.v1',\n 'gts.hai3.mfes.lifecycle.stage.v1~hai3.mfes.lifecycle.deactivated.v1',\n 'gts.hai3.mfes.lifecycle.stage.v1~hai3.mfes.lifecycle.destroyed.v1',\n];\n\n/**\n * Screen domain constant.\n *\n * Extension domain for main content area screens.\n * Uses swap semantics: mounting a new screen implicitly unmounts the previous one.\n * Actions: load_ext, mount_ext (NO unmount_ext).\n * Extensions must use extension_screen.v1~ derived type (adds presentation metadata).\n *\n * lifecycleStages: [init] only. The screen domain is a permanent fixture --\n * always visible, never destroyed during the application lifespan. Extensions\n * within the screen domain still go through all 4 stages (extensionsLifecycleStages).\n */\n// @cpt-begin:cpt-hai3-dod-framework-composition-mfe-plugin:p1:inst-1\nexport const screenDomain: ExtensionDomain = {\n id: HAI3_SCREEN_DOMAIN,\n actions: [HAI3_ACTION_LOAD_EXT, HAI3_ACTION_MOUNT_EXT],\n extensionsActions: [],\n sharedProperties: [HAI3_SHARED_PROPERTY_THEME, HAI3_SHARED_PROPERTY_LANGUAGE],\n defaultActionTimeout: 30000,\n lifecycleStages: [...INIT_ONLY_LIFECYCLE_STAGES],\n extensionsLifecycleStages: [...DEFAULT_LIFECYCLE_STAGES],\n extensionsTypeId: HAI3_SCREEN_EXTENSION_TYPE,\n lifecycle: undefined,\n};\n\n/**\n * Sidebar domain constant.\n *\n * Extension domain for collapsible side panels.\n * Uses toggle semantics: extensions can be explicitly mounted and unmounted.\n * 3 actions: load_ext, mount_ext, unmount_ext.\n */\nexport const sidebarDomain: ExtensionDomain = {\n id: HAI3_SIDEBAR_DOMAIN,\n actions: [HAI3_ACTION_LOAD_EXT, HAI3_ACTION_MOUNT_EXT, HAI3_ACTION_UNMOUNT_EXT],\n extensionsActions: [],\n sharedProperties: [HAI3_SHARED_PROPERTY_THEME, HAI3_SHARED_PROPERTY_LANGUAGE],\n defaultActionTimeout: 30000,\n lifecycleStages: [...DEFAULT_LIFECYCLE_STAGES],\n extensionsLifecycleStages: [...DEFAULT_LIFECYCLE_STAGES],\n lifecycle: undefined,\n};\n\n/**\n * Popup domain constant.\n *\n * Extension domain for popup/modal dialogs.\n * Uses toggle semantics: extensions can be explicitly mounted and unmounted.\n * 3 actions: load_ext, mount_ext, unmount_ext.\n */\nexport const popupDomain: ExtensionDomain = {\n id: HAI3_POPUP_DOMAIN,\n actions: [HAI3_ACTION_LOAD_EXT, HAI3_ACTION_MOUNT_EXT, HAI3_ACTION_UNMOUNT_EXT],\n extensionsActions: [],\n sharedProperties: [HAI3_SHARED_PROPERTY_THEME, HAI3_SHARED_PROPERTY_LANGUAGE],\n defaultActionTimeout: 30000,\n lifecycleStages: [...DEFAULT_LIFECYCLE_STAGES],\n extensionsLifecycleStages: [...DEFAULT_LIFECYCLE_STAGES],\n lifecycle: undefined,\n};\n\n/**\n * Overlay domain constant.\n *\n * Extension domain for full-screen overlays.\n * Uses toggle semantics: extensions can be explicitly mounted and unmounted.\n * 3 actions: load_ext, mount_ext, unmount_ext.\n */\nexport const overlayDomain: ExtensionDomain = {\n id: HAI3_OVERLAY_DOMAIN,\n actions: [HAI3_ACTION_LOAD_EXT, HAI3_ACTION_MOUNT_EXT, HAI3_ACTION_UNMOUNT_EXT],\n extensionsActions: [],\n sharedProperties: [HAI3_SHARED_PROPERTY_THEME, HAI3_SHARED_PROPERTY_LANGUAGE],\n defaultActionTimeout: 30000,\n lifecycleStages: [...DEFAULT_LIFECYCLE_STAGES],\n extensionsLifecycleStages: [...DEFAULT_LIFECYCLE_STAGES],\n lifecycle: undefined,\n};\n// @cpt-end:cpt-hai3-dod-framework-composition-mfe-plugin:p1:inst-1\n","/**\n * Presets - Pre-configured plugin combinations\n *\n * Framework Layer: L2\n */\n\n// @cpt-flow:cpt-hai3-flow-framework-composition-full-preset:p1\n// @cpt-dod:cpt-hai3-dod-framework-composition-presets:p1\n\nimport type { HAI3Plugin, Presets, ThemesConfig } from '../types';\nimport { screensets } from '../plugins/screensets';\nimport { themes } from '../plugins/themes';\nimport { layout } from '../plugins/layout';\nimport { i18n } from '../plugins/i18n';\nimport { effects } from '../plugins/effects';\nimport { mock } from '../plugins/mock';\nimport { microfrontends, type MicrofrontendsConfig } from '../plugins/microfrontends';\n\n/**\n * Full preset configuration.\n */\nexport interface FullPresetConfig {\n /** Configuration for themes plugin */\n themes?: ThemesConfig;\n /** Configuration for microfrontends plugin */\n microfrontends?: MicrofrontendsConfig;\n}\n\n/**\n * Full preset - All plugins for the complete HAI3 experience.\n * This is the default for `hai3 create` projects.\n *\n * Includes:\n * - screensets (screenset registry, screen slice)\n * - themes (theme registry, changeTheme action)\n * - layout (all layout domain slices and effects)\n * - i18n (i18n registry, setLanguage action)\n * - effects (effect coordination)\n * - mock (mock mode control for API services)\n * - microfrontends (MFE registry, actions, effects)\n *\n * @param config - Optional preset configuration\n *\n * @example\n * ```typescript\n * import { applyTheme } from '@hai3/uikit';\n * import { MfeHandlerMF, HAI3_MFE_ENTRY_MF } from '@hai3/screensets/mfe/handler';\n * import { gtsPlugin } from '@hai3/screensets/plugins/gts';\n *\n * const app = createHAI3()\n * .use(full({\n * themes: { applyFn: applyTheme },\n * microfrontends: { typeSystem: gtsPlugin, mfeHandlers: [new MfeHandlerMF(HAI3_MFE_ENTRY_MF)] }\n * }))\n * .build();\n * ```\n */\n// @cpt-begin:cpt-hai3-flow-framework-composition-full-preset:p1:inst-1\n// @cpt-begin:cpt-hai3-dod-framework-composition-presets:p1:inst-1\nexport function full(config?: FullPresetConfig): HAI3Plugin[] {\n const plugins: HAI3Plugin[] = [\n effects(),\n screensets({ autoDiscover: true }),\n themes(config?.themes),\n layout(),\n i18n(),\n mock(),\n ];\n if (config?.microfrontends) {\n plugins.push(microfrontends(config.microfrontends));\n }\n return plugins;\n}\n// @cpt-end:cpt-hai3-flow-framework-composition-full-preset:p1:inst-1\n\n/**\n * Minimal preset - Screensets + themes only.\n * For users who want basic HAI3 patterns without full layout management.\n *\n * Includes:\n * - screensets (screenset registry, screen slice)\n * - themes (theme registry, changeTheme action)\n */\nexport function minimal(): HAI3Plugin[] {\n return [\n screensets({ autoDiscover: true }),\n themes(),\n ];\n}\n// @cpt-end:cpt-hai3-dod-framework-composition-presets:p1:inst-1\n\n/**\n * Headless preset - Screensets only.\n * For external platform integration where you only need screenset orchestration.\n * The external platform provides its own menu, header, navigation, etc.\n *\n * Includes:\n * - screensets (screenset registry, screen slice)\n */\nexport function headless(): HAI3Plugin[] {\n return [\n screensets(),\n ];\n}\n\n/**\n * Presets collection\n */\nexport const presets: Presets = {\n full,\n minimal,\n headless,\n};\n","/**\n * createHAI3App - Convenience function for full HAI3 application\n *\n * Creates a fully configured HAI3 application using the full preset.\n *\n * Framework Layer: L2\n */\n\n// @cpt-flow:cpt-hai3-flow-framework-composition-full-preset:p1\n// @cpt-dod:cpt-hai3-dod-framework-composition-builder:p1\n\nimport { createHAI3 } from './createHAI3';\nimport { full, type FullPresetConfig } from './presets';\nimport type { HAI3Config, HAI3App } from './types';\n\n/**\n * Combined configuration for createHAI3App.\n * Includes both HAI3 core config and full preset config.\n */\nexport interface HAI3AppConfig extends HAI3Config, FullPresetConfig {}\n\n/**\n * Create a fully configured HAI3 application.\n *\n * This is a convenience function that uses the full preset.\n * For custom plugin composition, use `createHAI3()` instead.\n *\n * @param config - Optional application configuration\n * @returns The built HAI3 application\n *\n * @example\n * ```typescript\n * // Default - uses full() preset\n * const app = createHAI3App();\n *\n * // With theme apply function\n * import { applyTheme } from '@hai3/uikit';\n * const app = createHAI3App({ themes: { applyFn: applyTheme } });\n *\n * // With configuration\n * const app = createHAI3App({ devMode: true });\n * ```\n */\n// @cpt-begin:cpt-hai3-flow-framework-composition-full-preset:p1:inst-1\nexport function createHAI3App(config?: HAI3AppConfig): HAI3App {\n return createHAI3(config)\n .useAll(full({\n themes: config?.themes,\n microfrontends: config?.microfrontends,\n }))\n .build();\n}\n// @cpt-end:cpt-hai3-flow-framework-composition-full-preset:p1:inst-1\n","/**\n * @hai3/framework - HAI3 Framework Package\n *\n * This package provides:\n * - Plugin architecture for composable HAI3 applications\n * - Registries for screensets, themes, routes\n * - Presets for common configurations\n * - Re-exports from SDK packages for convenience\n *\n * Framework Layer: L2 (Depends on all SDK packages)\n */\n\n// @cpt-dod:cpt-hai3-dod-framework-composition-reexports:p1\n\n// ============================================================================\n// Core Exports\n// ============================================================================\n\nexport { createHAI3 } from './createHAI3';\nexport { createHAI3App, type HAI3AppConfig } from './createHAI3App';\n\n// ============================================================================\n// Plugin Exports\n// ============================================================================\n\nexport {\n screensets,\n themes,\n layout,\n i18n,\n effects,\n mock,\n microfrontends,\n type MockPluginConfig,\n} from './plugins';\n\n// MFE Plugin Exports\nexport {\n loadExtension,\n mountExtension,\n unmountExtension,\n registerExtension,\n unregisterExtension,\n selectExtensionState,\n selectRegisteredExtensions,\n selectExtensionError,\n HAI3_POPUP_DOMAIN,\n HAI3_SIDEBAR_DOMAIN,\n HAI3_SCREEN_DOMAIN,\n HAI3_OVERLAY_DOMAIN,\n // Base ExtensionDomain constants\n screenDomain,\n sidebarDomain,\n popupDomain,\n overlayDomain,\n} from './plugins';\n\n// MFE Type Constants (re-exported from @hai3/screensets for convenience)\nexport {\n HAI3_SCREEN_EXTENSION_TYPE,\n HAI3_MFE_ENTRY_MF,\n} from '@hai3/screensets';\n\n// MFE Action Constants (re-exported from @hai3/screensets for convenience)\nexport {\n HAI3_ACTION_LOAD_EXT,\n HAI3_ACTION_MOUNT_EXT,\n HAI3_ACTION_UNMOUNT_EXT,\n} from '@hai3/screensets';\n\n// MFE Shared Property Constants (re-exported from @hai3/screensets for convenience)\nexport {\n HAI3_SHARED_PROPERTY_THEME,\n HAI3_SHARED_PROPERTY_LANGUAGE,\n} from '@hai3/screensets';\n\n// MFE Types (re-exported from @hai3/screensets for convenience)\nexport type {\n ChildMfeBridge,\n ParentMfeBridge,\n Extension,\n ScreenExtension,\n ExtensionPresentation,\n ExtensionDomain,\n ActionsChain,\n Action,\n SharedProperty,\n LifecycleStage,\n LifecycleHook,\n MfeEntryLifecycle,\n MfeEntry,\n MfeEntryMF,\n JSONSchema,\n ValidationError,\n ValidationResult,\n LoadExtPayload,\n MountExtPayload,\n UnmountExtPayload,\n ScreensetsRegistryConfig,\n TypeSystemPlugin,\n} from '@hai3/screensets';\n\n// MFE Abstract Classes (re-exported from @hai3/screensets for convenience)\nexport {\n MfeHandler,\n MfeBridgeFactory,\n ScreensetsRegistry,\n ScreensetsRegistryFactory,\n screensetsRegistryFactory,\n ContainerProvider,\n} from '@hai3/screensets';\n\n// MFE Concrete Implementations (re-exported from @hai3/screensets subpath exports)\nexport { MfeHandlerMF } from '@hai3/screensets/mfe/handler';\nexport { gtsPlugin } from '@hai3/screensets/plugins/gts';\n\n// MFE Utilities (re-exported from @hai3/screensets for convenience)\nexport {\n createShadowRoot,\n injectCssVariables,\n extractGtsPackage,\n} from '@hai3/screensets';\n\n// MFE Plugin Types\nexport type {\n MfeState,\n ExtensionRegistrationState,\n RegisterExtensionPayload,\n UnregisterExtensionPayload,\n MicrofrontendsConfig,\n} from './plugins';\n\n// ============================================================================\n// Preset Exports\n// ============================================================================\n\nexport { presets, full, minimal, headless, type FullPresetConfig } from './presets';\n\n// ============================================================================\n// Registry Exports\n// ============================================================================\n\nexport {\n createThemeRegistry,\n} from './registries';\n\n// ============================================================================\n// Type Exports\n// ============================================================================\n\nexport type {\n HAI3Config,\n HAI3Plugin,\n HAI3AppBuilder,\n HAI3App,\n PluginFactory,\n PluginProvides,\n PluginLifecycle,\n ThemeRegistry,\n ThemeConfig,\n ThemeApplyFn,\n UikitTheme,\n RouterMode,\n Preset,\n Presets,\n ScreensetsConfig,\n ThemesConfig,\n ShowPopupPayload,\n ChangeThemePayload,\n SetLanguagePayload,\n} from './types';\n\n// ============================================================================\n// Re-exports from SDK packages for convenience\n// ============================================================================\n\n// From @hai3/state (unified Flux dataflow pattern)\nexport { eventBus, createStore, getStore, registerSlice, hasSlice, createSlice } from '@hai3/state';\nexport type {\n EventBus,\n ReducerPayload,\n EventPayloadMap,\n EventHandler,\n Subscription,\n RootState,\n AppDispatch,\n SliceObject,\n EffectInitializer,\n} from '@hai3/state';\n\n// Re-export HAI3Store from types (wrapped version)\nexport type { HAI3Store } from './types';\n\n// From @hai3/screensets (contracts only - SDK Layer L1)\nexport { LayoutDomain } from '@hai3/screensets';\n\n// Layout slices (owned by @hai3/framework)\nexport {\n layoutReducer,\n layoutDomainReducers,\n LAYOUT_SLICE_NAME,\n // Tenant slice (app-level, not layout)\n TENANT_SLICE_NAME,\n tenantSlice,\n tenantActions,\n tenantReducer,\n setTenant,\n setTenantLoading,\n clearTenant,\n // Mock slice (app-level, not layout)\n mockSlice,\n mockActions,\n setMockEnabled,\n // Domain slices\n headerSlice,\n footerSlice,\n menuSlice,\n sidebarSlice,\n screenSlice,\n popupSlice,\n overlaySlice,\n // Domain actions\n headerActions,\n footerActions,\n menuActions,\n sidebarActions,\n screenActions,\n popupActions,\n overlayActions,\n // Individual reducer functions - header\n setUser,\n setHeaderLoading,\n clearUser,\n // Individual reducer functions - footer\n setFooterVisible,\n setFooterConfig,\n toggleMenu,\n setMenuCollapsed,\n setMenuItems,\n setMenuVisible,\n setMenuConfig,\n toggleSidebar,\n setSidebarCollapsed,\n setSidebarPosition,\n setSidebarTitle,\n setSidebarContent,\n setSidebarVisible,\n setSidebarWidth,\n setSidebarConfig,\n setActiveScreen,\n setScreenLoading,\n navigateTo,\n clearActiveScreen,\n openPopup,\n closePopup,\n closeTopPopup,\n closeAllPopups,\n showOverlay,\n hideOverlay,\n setOverlayVisible,\n} from './slices';\n\n// PopupSliceState type\nexport type { PopupSliceState } from './slices';\n\n// Layout state types (defined locally to avoid circular deps with uicore/react)\nexport type {\n // App-level types\n Tenant,\n TenantState,\n // Layout domain types\n HeaderUser,\n HeaderState,\n HeaderConfig,\n FooterState,\n FooterConfig,\n MenuItem,\n MenuState,\n SidebarPosition,\n SidebarState,\n ScreenState,\n PopupState,\n PopupConfig,\n OverlayState,\n OverlayConfig,\n LayoutState,\n LayoutDomainState,\n RootStateWithLayout,\n LayoutDomainReducers,\n} from './layoutTypes';\n\n// Mock state type\nexport type { MockState } from './slices/mockSlice';\n\n// Tenant effects and events\nexport {\n initTenantEffects,\n TenantEvents,\n} from './effects/tenantEffects';\nexport type { TenantChangedPayload, TenantClearedPayload } from './effects/tenantEffects';\nexport {\n changeTenant,\n clearTenantAction,\n setTenantLoadingState,\n} from './effects/tenantActions';\n\n// Mock effects and events\nexport {\n initMockEffects,\n toggleMockMode,\n MockEvents,\n} from './effects/mockEffects';\nexport type { MockTogglePayload } from './effects/mockEffects';\n\n// From @hai3/api\nexport {\n apiRegistry,\n BaseApiService,\n RestProtocol,\n SseProtocol,\n // Protocol-specific mock plugins (replaces generic MockPlugin)\n RestMockPlugin,\n SseMockPlugin,\n MockEventSource,\n // Plugin base classes\n ApiPluginBase,\n ApiPlugin,\n ApiProtocol,\n RestPlugin,\n RestPluginWithConfig,\n SsePlugin,\n SsePluginWithConfig,\n // Type guards\n isShortCircuit,\n isRestShortCircuit,\n isSseShortCircuit,\n // Mock plugin identification\n MOCK_PLUGIN,\n isMockPlugin,\n} from '@hai3/api';\nexport type {\n MockMap,\n ApiServiceConfig,\n JsonValue,\n JsonObject,\n JsonPrimitive,\n JsonCompatible,\n SseProtocolConfig,\n RestProtocolConfig,\n // Plugin context types (class-based plugin system)\n ApiRequestContext,\n ApiResponseContext,\n ShortCircuitResponse,\n PluginClass,\n ProtocolClass,\n ProtocolPluginType,\n BasePluginHooks,\n // Protocol-specific types\n RestPluginHooks,\n SsePluginHooks,\n RestRequestContext,\n RestResponseContext,\n ApiPluginErrorContext,\n SseConnectContext,\n EventSourceLike,\n RestShortCircuitResponse,\n SseShortCircuitResponse,\n RestMockConfig,\n SseMockConfig,\n SseMockEvent,\n} from '@hai3/api';\n\n\n// NOTE: AccountsApiService, ACCOUNTS_DOMAIN, and account types (ApiUser, UserRole, etc.)\n// have been moved to CLI templates. They are now generated by `hai3 scaffold layout`\n// and should be imported from user code (e.g., @/layout/api or @/api).\n\n// From @hai3/i18n\nexport { i18nRegistry, I18nRegistryImpl, createI18nRegistry, Language, SUPPORTED_LANGUAGES, getLanguageMetadata, TextDirection, LanguageDisplayMode } from '@hai3/i18n';\nexport type { I18nConfig, TranslationLoader, TranslationMap, TranslationDictionary, LanguageMetadata, I18nRegistry as I18nRegistryType } from '@hai3/i18n';\n\n// Formatters (locale from i18nRegistry.getLanguage())\nexport {\n formatDate,\n formatTime,\n formatDateTime,\n formatRelative,\n formatNumber,\n formatPercent,\n formatCompact,\n formatCurrency,\n compareStrings,\n createCollator,\n type DateFormatStyle,\n type TimeFormatStyle,\n type DateInput,\n} from '@hai3/i18n';\nexport type { Formatters } from '@hai3/i18n';\n\n// Backward compatibility aliases\n// I18nRegistry type (capital I) - alias for consistency with old @hai3/uicore API\nexport { I18nRegistryImpl as I18nRegistry } from '@hai3/i18n';\n\n// Backward compatibility constants\nexport {\n ACCOUNTS_DOMAIN,\n} from './compat';\n\n// ============================================================================\n// Migration Helpers (for @hai3/uicore backward compatibility)\n// ============================================================================\n\nexport {\n createLegacySelector,\n setDeprecationWarnings,\n isDeprecationWarningsEnabled,\n getLayoutDomainState,\n hasLegacyUicoreState,\n hasNewLayoutState,\n STATE_PATH_MAPPING,\n} from './migration';\n\nexport type {\n LegacyUicoreState,\n LegacyRootState,\n Selector,\n} from './migration';\n","/**\n * Tenant Effects\n *\n * Listens for tenant events and updates the tenant slice.\n * Event-driven architecture: consuming apps emit events, effects handle state updates.\n */\n\n// @cpt-flow:cpt-hai3-flow-framework-composition-app-config:p1\n// @cpt-state:cpt-hai3-state-framework-composition-tenant:p1\n// @cpt-dod:cpt-hai3-dod-framework-composition-app-config:p1\n\nimport { eventBus, getStore } from '@hai3/state';\nimport { setTenant, clearTenant } from '../slices/tenantSlice';\nimport type { Tenant } from '../layoutTypes';\n\n// ============================================================================\n// Event Types\n// ============================================================================\n\n/** Tenant event names */\nexport const TenantEvents = {\n Changed: 'app/tenant/changed',\n Cleared: 'app/tenant/cleared',\n} as const;\n\n/** Payload for tenant changed event */\nexport interface TenantChangedPayload {\n tenant: Tenant;\n}\n\n/** Payload for tenant cleared event */\nexport interface TenantClearedPayload {\n // Empty payload\n}\n\n// ============================================================================\n// Module Augmentation for Type-Safe Events\n// ============================================================================\n\ndeclare module '@hai3/state' {\n interface EventPayloadMap {\n 'app/tenant/changed': TenantChangedPayload;\n 'app/tenant/cleared': TenantClearedPayload;\n }\n}\n\n// ============================================================================\n// Effect Registration\n// ============================================================================\n\n/**\n * Initialize tenant effects\n * Call this once during app bootstrap to start listening for tenant events.\n */\n// @cpt-begin:cpt-hai3-flow-framework-composition-app-config:p1:inst-1\n// @cpt-begin:cpt-hai3-state-framework-composition-tenant:p1:inst-2\nexport function initTenantEffects(): () => void {\n const store = getStore();\n\n // Listen for tenant changed event\n const subChanged = eventBus.on(TenantEvents.Changed, (payload) => {\n store.dispatch(setTenant(payload.tenant));\n });\n\n // Listen for tenant cleared event\n const subCleared = eventBus.on(TenantEvents.Cleared, () => {\n store.dispatch(clearTenant());\n });\n\n // Return cleanup function\n return () => {\n subChanged.unsubscribe();\n subCleared.unsubscribe();\n };\n}\n// @cpt-end:cpt-hai3-flow-framework-composition-app-config:p1:inst-1\n// @cpt-end:cpt-hai3-state-framework-composition-tenant:p1:inst-2\n","// @cpt-flow:cpt-hai3-flow-framework-composition-app-config:p1\n\n/**\n * Tenant Actions\n *\n * Action functions for setting and clearing tenant.\n * These emit events that are consumed by tenantEffects.\n */\n\nimport { eventBus, getStore } from '@hai3/state';\nimport { setTenantLoading } from '../slices/tenantSlice';\nimport { TenantEvents } from './tenantEffects';\nimport type { Tenant } from '../layoutTypes';\n\n/**\n * Set tenant via event bus\n * This is the recommended way for consuming apps to set tenant.\n *\n * @example\n * ```typescript\n * import { changeTenant } from '@hai3/framework';\n * changeTenant({ id: 'tenant-123' });\n * ```\n */\n// @cpt-begin:cpt-hai3-flow-framework-composition-app-config:p1:inst-1\nexport function changeTenant(tenant: Tenant): void {\n eventBus.emit(TenantEvents.Changed, { tenant });\n}\n\n/**\n * Clear tenant via event bus\n */\nexport function clearTenantAction(): void {\n eventBus.emit(TenantEvents.Cleared, {});\n}\n\n/**\n * Set tenant loading state (direct dispatch, for internal use)\n */\nexport function setTenantLoadingState(loading: boolean): void {\n getStore().dispatch(setTenantLoading(loading));\n}\n// @cpt-end:cpt-hai3-flow-framework-composition-app-config:p1:inst-1\n","/**\n * Backward Compatibility Exports\n *\n * These exports provide backward compatibility with @hai3/uicore API.\n * They are singletons that mirror the old API.\n *\n * NOTE: These are exported for migration convenience but may be deprecated\n * in future major versions. Prefer using the plugin architecture.\n */\n\n// ACCOUNTS_DOMAIN constant for backward compatibility\n// NOTE: AccountsApiService has been moved to CLI templates\n// This constant is kept for legacy code that references it\nexport const ACCOUNTS_DOMAIN = 'accounts' as const;\n\n// ============================================================================\n// Singleton Registries (backward compatibility)\n// ============================================================================\n","/**\n * Migration Helpers - Utilities for migrating from @hai3/uicore\n *\n * These helpers assist users migrating from the deprecated @hai3/uicore package\n * to the new SDK architecture (@hai3/framework, @hai3/screensets, @hai3/react).\n *\n * Framework Layer: L2\n */\n\nimport type { RootStateWithLayout } from './layoutTypes';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Legacy uicore state structure (for reference/backward compat)\n */\nexport interface LegacyUicoreState {\n app: {\n user: unknown | null;\n tenant: unknown | null;\n language: string | null;\n translationsReady: boolean;\n screenTranslationsVersion: number;\n loading: boolean;\n error: string | null;\n useMockApi: boolean;\n };\n layout: {\n theme: string;\n currentScreenset: string;\n selectedScreen: string | null;\n };\n header: Record<string, unknown>;\n footer: {\n screensetOptions: unknown[];\n visible: boolean;\n };\n menu: {\n collapsed: boolean;\n items: unknown[];\n visible: boolean;\n };\n sidebar: {\n collapsed: boolean;\n position: string;\n title: string | null;\n content: unknown;\n visible: boolean;\n };\n screen: {\n activeScreen: string | null;\n loading: boolean;\n };\n popup: {\n stack: unknown[];\n };\n overlay: {\n visible: boolean;\n };\n}\n\n/**\n * Legacy root state with uicore key\n */\nexport interface LegacyRootState {\n uicore: LegacyUicoreState;\n [key: string]: unknown;\n}\n\n/**\n * State accessor function type\n * Note: \"Selector\" terminology avoided (Redux-specific). Use useAppSelector hook for state access.\n */\nexport type Selector<TState, TResult> = (state: TState) => TResult;\n\n// ============================================================================\n// Migration Path Mapping\n// ============================================================================\n\n/**\n * State path mapping from legacy to new structure\n */\nexport const STATE_PATH_MAPPING = {\n // App state (moved to app slice)\n 'uicore.app.user': 'app.user',\n 'uicore.app.tenant': 'app.tenant',\n 'uicore.app.language': 'app.language',\n 'uicore.app.translationsReady': 'app.translationsReady',\n 'uicore.app.loading': 'app.loading',\n 'uicore.app.error': 'app.error',\n 'uicore.app.useMockApi': 'app.useMockApi',\n\n // Layout state (split into domains)\n 'uicore.layout.theme': 'app.theme',\n 'uicore.layout.currentScreenset': 'app.currentScreenset',\n 'uicore.layout.selectedScreen': 'layout.screen.activeScreen',\n\n // Domain states (moved to layout.*)\n 'uicore.header': 'layout.header',\n 'uicore.footer': 'layout.footer',\n 'uicore.menu': 'layout.menu',\n 'uicore.sidebar': 'layout.sidebar',\n 'uicore.screen': 'layout.screen',\n 'uicore.popup': 'layout.popup',\n 'uicore.overlay': 'layout.overlay',\n} as const;\n\n// ============================================================================\n// Legacy Selector Factory\n// ============================================================================\n\nlet deprecationWarningsEnabled = true;\n\n/**\n * Enable or disable deprecation warnings globally\n */\nexport function setDeprecationWarnings(enabled: boolean): void {\n deprecationWarningsEnabled = enabled;\n}\n\n/**\n * Check if deprecation warnings are enabled\n */\nexport function isDeprecationWarningsEnabled(): boolean {\n return deprecationWarningsEnabled;\n}\n\n/**\n * Create a legacy selector that wraps a new selector with deprecation warnings\n *\n * @param legacyPath - The old state path being accessed (for warning message)\n * @param newSelector - The new selector to use\n * @param migrationHint - Hint for how to migrate (optional)\n * @returns A selector that logs a deprecation warning then returns the new value\n *\n * @example\n * ```typescript\n * import { createLegacySelector, selectMenuCollapsed } from '@hai3/framework';\n *\n * // Create a legacy selector\n * const selectMenuCollapsedLegacy = createLegacySelector(\n * 'uicore.menu.collapsed',\n * selectMenuCollapsed,\n * 'Use selectMenuCollapsed from @hai3/framework'\n * );\n *\n * // In component (will show deprecation warning in dev)\n * const collapsed = useSelector(selectMenuCollapsedLegacy);\n * ```\n */\nexport function createLegacySelector<TState, TResult>(\n legacyPath: string,\n newSelector: Selector<TState, TResult>,\n migrationHint?: string\n): Selector<TState, TResult> {\n let hasWarned = false;\n\n return (state: TState): TResult => {\n if (deprecationWarningsEnabled && !hasWarned && process.env.NODE_ENV === 'development') {\n hasWarned = true;\n const newPath = STATE_PATH_MAPPING[legacyPath as keyof typeof STATE_PATH_MAPPING] ?? 'unknown';\n const hint = migrationHint ?? `Use the new state path: ${newPath}`;\n console.warn(\n `[HAI3 Migration] Deprecated selector accessing \"${legacyPath}\". ${hint}`\n );\n }\n return newSelector(state);\n };\n}\n\n// ============================================================================\n// Legacy State Accessors\n// ============================================================================\n\n/**\n * Get layout domain state from the new structure\n * Maps to what was previously `state.uicore.header`, `state.uicore.menu`, etc.\n */\nexport function getLayoutDomainState<K extends keyof RootStateWithLayout['layout']>(\n state: RootStateWithLayout,\n domain: K\n): RootStateWithLayout['layout'][K] {\n return state.layout[domain];\n}\n\n/**\n * Check if a state object has the legacy uicore structure\n */\nexport function hasLegacyUicoreState(state: unknown): state is LegacyRootState {\n return (\n typeof state === 'object' &&\n state !== null &&\n 'uicore' in state &&\n typeof (state as Record<string, unknown>).uicore === 'object'\n );\n}\n\n/**\n * Check if a state object has the new layout structure\n */\nexport function hasNewLayoutState(state: unknown): state is RootStateWithLayout {\n return (\n typeof state === 'object' &&\n state !== null &&\n 'layout' in state &&\n typeof (state as Record<string, unknown>).layout === 'object'\n );\n}\n"],"mappings":"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","names":["effects","actions","slice","createSlice","SLICE_KEY","initialState","slice","slice","createSlice","SLICE_KEY","initialState","slice","slice","createSlice","SLICE_KEY","initialState","slice","slice","createSlice","SLICE_KEY","initialState","slice","slice","createSlice","SLICE_KEY","initialState","slice","slice","createSlice","SLICE_KEY","initialState","slice","slice","createSlice","SLICE_KEY","initialState","slice","slice","createSlice","SLICE_KEY","initialState","slice","slice","themes","config","themes","eventBus","eventBus","showOverlay","hideOverlay","eventBus","i18nRegistry","eventBus","getStore","apiRegistry","apiRegistry","getStore","eventBus","HAI3_ACTION_MOUNT_EXT","HAI3_ACTION_UNMOUNT_EXT","getStore","createSlice","SLICE_KEY","initialState","slice","slice","eventBus","getStore","screensetsRegistry","getStore","eventBus","eventBus","eventBus","HAI3_ACTION_LOAD_EXT","HAI3_ACTION_MOUNT_EXT","HAI3_ACTION_UNMOUNT_EXT","HAI3_SHARED_PROPERTY_THEME","HAI3_SHARED_PROPERTY_LANGUAGE","HAI3_ACTION_LOAD_EXT","HAI3_ACTION_MOUNT_EXT","HAI3_SHARED_PROPERTY_THEME","HAI3_SHARED_PROPERTY_LANGUAGE","HAI3_ACTION_UNMOUNT_EXT","screensetsRegistry","HAI3_ACTION_MOUNT_EXT","getStore","HAI3_ACTION_UNMOUNT_EXT","HAI3_SCREEN_EXTENSION_TYPE","HAI3_ACTION_LOAD_EXT","HAI3_ACTION_MOUNT_EXT","HAI3_ACTION_UNMOUNT_EXT","HAI3_SHARED_PROPERTY_THEME","HAI3_SHARED_PROPERTY_LANGUAGE","screensetsRegistryFactory","eventBus","getStore","registerSlice","createSlice","eventBus","getStore","getStore","eventBus","eventBus","getStore","eventBus","getStore","apiRegistry","isMockPlugin","Language","I18nRegistryImpl"]}